mirror of https://github.com/wwarthen/RomWBW.git
committed by
GitHub
12 changed files with 1071 additions and 504 deletions
File diff suppressed because it is too large
@ -0,0 +1,181 @@ |
|||
;================================================================================================== |
|||
; ECB USB-FIFO DRIVER FOR WILL SOWERBUTTS ADAFRUIT BASED FT232H ECB-FIFO BOARD |
|||
; REFER https://www.retrobrewcomputers.org/doku.php?id=boards:ecb:usb-fifo:start |
|||
; PHIL SUMMERS (b1ackmai1er) |
|||
;================================================================================================== |
|||
; |
|||
; BASE PORT IS SET IN PLT_SBC.INC |
|||
; INTERRUPTS ARE NOT USED. |
|||
; ONLY ONE BOARD SUPPORTED. |
|||
; |
|||
; HBIOS CALLS: |
|||
; |
|||
; UF_PREINIT SETUP THE DISPATCH TABLE ENTRY AND INITIALIZE HARDWARE |
|||
; UF_INIT ANNOUNCE DEVICE DESCRIPTION AND PORT |
|||
; |
|||
FIFO_DATA .EQU (FIFO_BASE+0) ; READ/WRITE DATA |
|||
FIFO_STATUS .EQU (FIFO_BASE+1) ; READ/WRITE STATUS |
|||
FIFO_SEND_IMM .EQU (FIFO_BASE+2) ; WRITE PORT TO FORCE BUFFER FLUSH |
|||
FIFO_BUFFER .EQU FALSE ; OPTION TO BUFFER OUTPUT FOR 17ms |
|||
; |
|||
UF_USB_ACTIVE .DB 0 ; USB CABLE CONNECTED STATUS FLAG |
|||
; |
|||
; DEVICE DESCRIPTION TABLE |
|||
; |
|||
UF_CFG: .DW SER_9600_8N1 ; DUMMY CONFIGURATION |
|||
; |
|||
; SETUP THE DISPATCH TABLE ENTRY AND INITIALIZE HARDWARE |
|||
; |
|||
UF_PREINIT: |
|||
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 |
|||
LD (UF_USB_ACTIVE),A ; SAVE USB CONNECTION STATUS |
|||
POP DE ; GET ENTRY ADDRESS BACK, BUT PUT IN DE |
|||
; JR Z,UF_FAIL ; EXIT IF NO USB CONNECTION |
|||
LD BC,UF_FNTBL ; BC := FUNCTION TABLE ADDRESS |
|||
CALL CIO_ADDENT ; ADD ENTRY IF FOUND, BC:DE |
|||
XOR A ; SIGNAL SUCCESS |
|||
UF_FAIL: |
|||
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 |
|||
; |
|||
; ANNOUNCE DEVICE DESCRIPTION AND PORT |
|||
; |
|||
UF_INIT: |
|||
CALL NEWLINE ; PRINT DEVICE |
|||
PRTS("USB-FIFO: $") |
|||
PRTS("IO=0x$") |
|||
LD A,FIFO_BASE ; PRINT PORT |
|||
CALL PRTHEXBYTE |
|||
LD A,(UF_USB_ACTIVE) ; PRINT CABLE STATUS |
|||
OR A |
|||
RET NZ |
|||
PRTS(" No Cable$") |
|||
RET |
|||
; |
|||
; INPUT A CHARACTER AND RETURN IT IN E |
|||
; |
|||
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 ; WRITE TO FIFO |
|||
#IF (FIFO_BUFFER) |
|||
OUT (FIFO_SEND_IMM),A ; SEND IMMEDIATE |
|||
#ENDIF |
|||
XOR A ; SIGNAL SUCCESS |
|||
RET |
|||
; |
|||
; INPUT STATUS - CAN WE SEND A CHARACTER |
|||
; |
|||
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 VALIDATED BUT IT IS NOT 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. WE ALWAYS RESAVE AT END |
|||
LD E,(IY+0) ; LOW BYTE |
|||
LD D,(IY+1) ; HIGH BYTE |
|||
; |
|||
UF_INITDEV1: |
|||
XOR A ; INTERRUPTS OFF |
|||
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 APPEAR AS 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, ALWAYS 0 |
|||
LD C,A ; C := DEVICE TYPE, 0x00 IS RS-232 |
|||
RET |
|||
; |
|||
; USB-FIFO DETECTION ROUTINE |
|||
; |
|||
UF_DETECT: |
|||
IN A,(FIFO_STATUS) |
|||
AND 10000001B |
|||
SUB 10000001B ; A=0 CABLE DISCONNECTED |
|||
RET Z |
|||
LD A,1 ; A=1 CABLE CONNECTED |
|||
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 USB-FIFO FUNCTION TABLE ***\n" |
|||
#ENDIF |
|||
; |
|||
Loading…
Reference in new issue