Files
RomWBW/Source/HBIOS/uf.asm
b1ackmai1er b75153d263 ECB Cassette and Recovery Mode change
Create an equate for changing baud rate through custom config rather than the driver.  Add recovermode mode option to use Ring indicator line.
2020-01-28 18:09:30 +08:00

183 lines
4.6 KiB
NASM

;==================================================================================================
; ECB USB-FIFO DRIVER FOR WILL SOWERBUTTS ADAFRUIT BASED FT232H ECB-FIFO BOARD
; REFER https://www.retrobrewcomputers.org/doku.php?id=boards:ecb:usb-fifo:start
; PHIL SUMMERS (b1ackmai1er)
;==================================================================================================
;
; BASE PORT IS SET IN CFG_SBC.INC
; INTERRUPTS ARE NOT USED.
; ONLY ONE BOARD SUPPORTED.
;
; HBIOS CALLS:
;
; UF_PREINIT SETUP THE DISPATCH TABLE ENTRY AND INITIALIZE HARDWARE
; UF_INIT ANNOUNCE DEVICE DESCRIPTION AND PORT
;
FIFO_DATA .EQU (UFBASE+0) ; READ/WRITE DATA
FIFO_STATUS .EQU (UFBASE+1) ; READ/WRITE STATUS
FIFO_SEND_IMM .EQU (UFBASE+2) ; WRITE PORT TO FORCE BUFFER FLUSH
FIFO_BUFFER .EQU FALSE ; OPTION TO BUFFER OUTPUT FOR 17ms
;
UF_USB_ACTIVE .DB 0 ; USB CABLE CONNECTED STATUS FLAG
;
; DEVICE DESCRIPTION TABLE
;
UF_CFG: .DW SER_9600_8N1 ; DUMMY CONFIGURATION
;
; SETUP THE DISPATCH TABLE ENTRY AND INITIALIZE HARDWARE
;
UF_PREINIT:
LD HL,UF_CFG ; POINT TO START OF CFG TABLE
PUSH HL ; COPY CFG DATA PTR
PUSH HL
POP IY ; ... TO IY
CALL UF_INITUNIT ; HAND OFF TO GENERIC INIT CODE
LD (UF_USB_ACTIVE),A ; SAVE USB CONNECTION STATUS
POP DE ; GET ENTRY ADDRESS BACK, BUT PUT IN DE
; JR Z,UF_FAIL ; EXIT IF NO USB CONNECTION
LD BC,UF_FNTBL ; BC := FUNCTION TABLE ADDRESS
CALL CIO_ADDENT ; ADD ENTRY IF FOUND, BC:DE
XOR A ; SIGNAL SUCCESS
UF_FAIL:
RET ; AND RETURN
;
; INITIALIZATION ROUTINE
;
UF_INITUNIT:
CALL UF_DETECT ; DETERMINE TYPE
OR A ; SET FLAGS
RET Z ; ABORT IF NOTHING THERE
; SET DEFAULT CONFIG
LD DE,-1 ; LEAVE CONFIG ALONE
JR UF_INITDEV ; IMPLEMENT IT AND RETURN
;
; ANNOUNCE DEVICE DESCRIPTION AND PORT
;
UF_INIT:
CALL NEWLINE ; PRINT DEVICE
CALL PRTSTRD
.TEXT "USB-FIFO: IO=0x$")
LD A,UFBASE ; PRINT PORT
CALL PRTHEXBYTE
LD A,(UF_USB_ACTIVE) ; PRINT CONNECTION STATUS
OR A ; REQUIRES TERMINAL PROGRAM
RET NZ ; TO HAVE INITIALIZED PORT
CALL PRTSTRD ; ON PC SIDE.
.TEXT " No connection$"
RET
;
; INPUT A CHARACTER AND RETURN IT IN E
;
UF_IN:
CALL UF_IST ; CHAR WAITING?
JR Z,UF_IN ; LOOP IF NOT
LD C,FIFO_DATA ; C := INPUT PORT
IN E,(C) ; GET CHAR
XOR A ; SIGNAL SUCCESS
RET
;
; OUTPUT THE CHARACTER IN E
;
UF_OUT:
CALL UF_OST ; READY FOR CHAR?
JR Z,UF_OUT ; LOOP IF NOT
LD C,FIFO_DATA
OUT (C),E ; WRITE TO FIFO
#IF (FIFO_BUFFER)
OUT (FIFO_SEND_IMM),A ; SEND IMMEDIATE
#ENDIF
XOR A ; SIGNAL SUCCESS
RET
;
; INPUT STATUS - CAN WE SEND A CHARACTER
;
UF_IST:
IN A,(FIFO_STATUS) ; IS THE QUEUE EMPTY?
RLCA
CPL
AND 00000001B
RET
;
; OUTPUT STATUS - CAN WE OUTPUT A CHARACTER
;
UF_OST:
IN A,(FIFO_STATUS) ; IS THE SEND BUFFER FULL?
CPL
AND 00000001B
RET
;
; INITIALIZATION THE SETUP PARAMETER WORD AND INITIALIZE DEVICE
; SAVE NEW SPW IF NOT A RE-INIT. ALWAYS INITIALIZE DEVICE.
; SPW IS NOT VALIDATED BUT IT IS NOT USED FOR ANYTHING.
;
UF_INITDEV:
;
; TEST FOR -1 WHICH MEANS USE CURRENT CONFIG (JUST REINIT)
LD A,D ; TEST DE FOR
AND E ; ... VALUE OF -1
INC A ; ... SO Z SET IF -1
JR NZ,UF_INITDEV1 ; IF DE == -1, REINIT CURRENT CONFIG
;
; GET CURRENT SPW. WE ALWAYS RESAVE AT END
LD E,(IY+0) ; LOW BYTE
LD D,(IY+1) ; HIGH BYTE
;
UF_INITDEV1:
XOR A ; INTERRUPTS OFF
OUT (FIFO_STATUS),A
;
UF_FLUSH:
IN A,(FIFO_STATUS) ; IS THERE ANY DATA
RLCA ; IN THE BUFFER ?
JR C,UFBUFEMPTY ; EXIT IF EMPTY
;
IN A,(FIFO_DATA) ; CLEAR BUFFER BY READING
JR UF_FLUSH ; ALL THE DATA
UFBUFEMPTY:
LD (IY+0),E ; SAVE LOW WORD
LD (IY+1),D ; SAVE HI WORD
RET ; NZ STATUS HERE INDICATES FAIL.
;
; USB-FIFO WILL APPEAR AS A SERIAL DEVICE AT DEFAULT SERIAL MODE
;
UF_QUERY:
LD E,(IY+0) ; FIRST CONFIG BYTE TO E
LD D,(IY+1) ; SECOND CONFIG BYTE TO D
XOR A ; SIGNAL SUCCESS
RET ; DONE
;
; USB-FIFO WILL APPEAR AS A SERIAL DEVICE
;
UF_DEVICE:
LD D,CIODEV_UF ; D := DEVICE TYPE
XOR A ; SIGNAL SUCCESS
LD E,A ; E := PHYSICAL UNIT, ALWAYS 0
LD C,A ; C := DEVICE TYPE, 0x00 IS RS-232
RET
;
; USB-FIFO DETECTION ROUTINE
;
UF_DETECT:
IN A,(FIFO_STATUS)
AND 10000001B
SUB 10000001B ; A=0 CABLE DISCONNECTED
RET Z ; OR PC PORT CLOSED
LD A,1 ; A=1 CABLE CONNECTED
RET ; AND PC PORT OPEN
;
; DRIVER FUNCTION TABLE
;
UF_FNTBL:
.DW UF_IN
.DW UF_OUT
.DW UF_IST
.DW UF_OST
.DW UF_INITDEV
.DW UF_QUERY
.DW UF_DEVICE
#IF (($ - UF_FNTBL) != (CIO_FNCNT * 2))
.ECHO "*** INVALID USB-FIFO FUNCTION TABLE ***\n"
#ENDIF
;