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

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
;