mirror of https://github.com/wwarthen/RomWBW.git
3 changed files with 183 additions and 1 deletions
@ -0,0 +1,178 @@ |
|||||
|
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 |
||||
|
; |
||||
Loading…
Reference in new issue