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