Browse Source

Add usb-fifo driver

pull/38/head
b1ackmai1er 7 years ago
parent
commit
32bdecb828
  1. 2
      Source/HBIOS/cfg_sbc.asm
  2. 4
      Source/HBIOS/plt_sbc.inc
  3. 178
      Source/HBIOS/usbfifo.asm

2
Source/HBIOS/cfg_sbc.asm

@ -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

4
Source/HBIOS/plt_sbc.inc

@ -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

@ -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…
Cancel
Save