diff --git a/Source/HBIOS/cfg_sbc.asm b/Source/HBIOS/cfg_sbc.asm index 3fcc40d3..63f3a32f 100644 --- a/Source/HBIOS/cfg_sbc.asm +++ b/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 diff --git a/Source/HBIOS/plt_sbc.inc b/Source/HBIOS/plt_sbc.inc index d64bc4fa..7ca70514 100644 --- a/Source/HBIOS/plt_sbc.inc +++ b/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 \ No newline at end of file +PIO4BASE .EQU $90 ; ECB-4PIO DEFAULT PIO DEFAULT +; +FIFO_BASE .EQU $0C ; ECB USB-FIFO DEFAULT PORT diff --git a/Source/HBIOS/usbfifo.asm b/Source/HBIOS/usbfifo.asm new file mode 100644 index 00000000..8b935b8e --- /dev/null +++ b/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 "$" +UF_STR_UF .DB "USB-FIFO$" +; +; DEVICE DESCRIPTION TABLE +; +UF_CFG: .DW DEFSIOACFG ; LINE CONFIGURATION +;