mirror of https://github.com/wwarthen/RomWBW.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
178 lines
3.7 KiB
178 lines
3.7 KiB
FIFO_DATA .EQU (FIFO_BASE+0)
|
|
FIFO_STATUS .EQU (FIFO_BASE+1)
|
|
FIFO_SEND_IMM .EQU (FIFO_BASE+2)
|
|
;
|
|
;==================================================================================================
|
|
;
|
|
UF_PREINIT:
|
|
;
|
|
; SETUP THE DISPATCH TABLE ENTRY
|
|
;
|
|
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
|
|
POP DE ; GET ENTRY ADDRESS BACK, BUT PUT IN DE
|
|
LD BC,UF_FNTBL ; BC := FUNCTION TABLE ADDRESS
|
|
CALL CIO_ADDENT ; ADD ENTRY IF FOUND, BC:DE
|
|
XOR A ; SIGNAL SUCCESS
|
|
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
|
|
;
|
|
;
|
|
;
|
|
UF_INIT:
|
|
LD HL,UF_CFG ; POINT TO START OF CFG TABLE
|
|
PUSH HL ; COPY CFG DATA PTR
|
|
POP IY ; ... TO IY
|
|
;
|
|
LD A,1 ; SET TYPE
|
|
OR A ; SET FLAGS
|
|
CALL NZ,UF_PRTCFG ; PRINT IF NOT ZERO
|
|
;
|
|
XOR A ; SIGNAL SUCCESS
|
|
RET ; DONE
|
|
;
|
|
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
|
|
XOR A ; SIGNAL SUCCESS
|
|
RET
|
|
;
|
|
; INPUT STATUS - CAN WE SEND A CHARACTERV
|
|
;
|
|
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 VAIDATED BUT IT IS 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 PSW BECAUSE WE ALWAYS RESAVE AT END
|
|
LD E,(IY+0) ; LOW BYTE
|
|
LD D,(IY+1) ; HIGH BYTE
|
|
;
|
|
UF_INITDEV1:
|
|
XOR A ; INTERRUPTS OFF
|
|
OR 00110000B
|
|
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 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_SIO ; D := DEVICE TYPE
|
|
XOR A ; SIGNAL SUCCESS
|
|
LD E,A ; E := PHYSICAL UNIT
|
|
LD C,A ; C := DEVICE TYPE, 0x00 IS RS-232
|
|
RET
|
|
;
|
|
; USB-FIFO DETECTION ROUTINE
|
|
;
|
|
UF_DETECT:
|
|
LD A,1 ; 0 = NONE
|
|
RET
|
|
;
|
|
; ANNOUNCE DEVICE DESCRIPTION AND PORT
|
|
;
|
|
UF_PRTCFG:
|
|
CALL NEWLINE
|
|
PRTS("USB-FIFO: IO=0x$") ; PRINT DEVICE
|
|
|
|
LD A,FIFO_BASE
|
|
CALL PRTHEXBYTE ; PRINT PORT
|
|
;
|
|
XOR A
|
|
RET
|
|
;
|
|
; 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 SIO FUNCTION TABLE ***\n"
|
|
#ENDIF
|
|
;
|
|
; DEVICE DESCRIPTION
|
|
;
|
|
UF_TYPE_MAP:
|
|
.DW UF_STR_NONE
|
|
.DW UF_STR_UF
|
|
|
|
UF_STR_NONE .DB "<NOT PRESENT>$"
|
|
UF_STR_UF .DB "USB-FIFO$"
|
|
;
|
|
; DEVICE DESCRIPTION TABLE
|
|
;
|
|
UF_CFG: .DW DEFSIOACFG ; LINE CONFIGURATION
|
|
;
|
|
|