mirror of
https://github.com/wwarthen/RomWBW.git
synced 2026-02-06 22:43:15 -06:00
Add usb-fifo driver
This commit is contained in:
@@ -101,3 +101,5 @@ BOOT_DEFAULT .EQU 'Z' ; SELECTION TO INVOKE AT TIMEOUT
|
||||
PIO_4P .EQU FALSE ; TRUE FOR ECB-4PIO PIO SUPPORT
|
||||
PIO_ZP .EQU FALSE ; TRUE FOR ECB-ZILOG PERIPHERALS BOARD
|
||||
PPI_SBC .EQU FALSE ; TRUE FOR SBC V2 8255 (IF NOT BEING USED FOR PPIDE)
|
||||
;
|
||||
UFENABLE .EQU FALSE ; TRUE FOR ECB USB-FIFO SUPPORT
|
||||
|
||||
@@ -21,4 +21,6 @@ RTC .EQU SBC_BASE + $10 ; ADDRESS OF RTC LATCH AND INPUT PORT
|
||||
PPIBASE .EQU SBC_BASE + $00 ; PPI 82C55 I/O IS DECODED TO PORT 60-67
|
||||
SIOBASE .EQU $B0 ; ZILOG PERIPHERALS DEFAULT
|
||||
PIOZBASE .EQU SIOBASE+8 ; ZILOG PERIPHERALS DEFAULT PIO DEFAULT
|
||||
PIO4BASE .EQU $90 ; ECB-4PIO DEFAULT PIO DEFAULT
|
||||
PIO4BASE .EQU $90 ; ECB-4PIO DEFAULT PIO DEFAULT
|
||||
;
|
||||
FIFO_BASE .EQU $0C ; ECB USB-FIFO DEFAULT PORT
|
||||
|
||||
178
Source/HBIOS/usbfifo.asm
Normal file
178
Source/HBIOS/usbfifo.asm
Normal file
@@ -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
|
||||
;
|
||||
Reference in New Issue
Block a user