Browse Source

Merge pull request #38 from b1ackmai1er/master

usb-fifo driver et al
pull/48/head
Wayne Warthen 7 years ago
committed by GitHub
parent
commit
d589a215ad
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 3
      Source/HBIOS/cfg_ezz80.asm
  2. 3
      Source/HBIOS/cfg_mk4.asm
  3. 3
      Source/HBIOS/cfg_n8.asm
  4. 3
      Source/HBIOS/cfg_rcz180.asm
  5. 3
      Source/HBIOS/cfg_rcz80.asm
  6. 3
      Source/HBIOS/cfg_sbc.asm
  7. 3
      Source/HBIOS/cfg_zeta.asm
  8. 126
      Source/HBIOS/hbios.asm
  9. 1234
      Source/HBIOS/pio.asm
  10. 5
      Source/HBIOS/plt_sbc.inc
  11. 8
      Source/HBIOS/std.asm
  12. 181
      Source/HBIOS/usbfifo.asm

3
Source/HBIOS/cfg_ezz80.asm

@ -97,3 +97,6 @@ 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

3
Source/HBIOS/cfg_mk4.asm

@ -110,3 +110,6 @@ Z180_IOWAIT .EQU 1 ; ADD (0-3) I/O WAIT STATES ABOVE 1 W/S BUILT-IN
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

3
Source/HBIOS/cfg_n8.asm

@ -99,3 +99,6 @@ Z180_IOWAIT .EQU 3 ; ADD (0-3) I/O WAIT STATES ABOVE 1 W/S BUILT-IN
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

3
Source/HBIOS/cfg_rcz180.asm

@ -103,3 +103,6 @@ Z180_IOWAIT .EQU 1 ; ADD (0-3) I/O WAIT STATES ABOVE 1 W/S BUILT-IN
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

3
Source/HBIOS/cfg_rcz80.asm

@ -97,3 +97,6 @@ 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

3
Source/HBIOS/cfg_sbc.asm

@ -109,3 +109,6 @@ 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

3
Source/HBIOS/cfg_zeta.asm

@ -82,3 +82,6 @@ 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

126
Source/HBIOS/hbios.asm

@ -1044,9 +1044,6 @@ HB_CPU1:
CALL FILL ; DO IT
;
DIAG(%00111111)
;
; PRE-CONSOLE INITIALIZATION
;
#IF 0
;
; TEST DEBUG ***************************************************************************************
@ -1058,21 +1055,28 @@ HB_CPU1:
;
#ENDIF
;
#IF (ASCIENABLE)
CALL ASCI_PREINIT
#ENDIF
#IF (UARTENABLE)
CALL UART_PREINIT
#ENDIF
#IF (SIOENABLE)
CALL SIO_PREINIT
#ENDIF
#IF (ACIAENABLE)
CALL ACIA_PREINIT
#ENDIF
#IF (PIO_4P | PIO_ZP)
CALL PIO_PREINIT
#ENDIF
; PRE-CONSOLE INITIALIZATION
;
LD A,FORCECON ; CALCULATE PRE-INIT TABLE
RLCA ; ENTRY THAT WE WANT TO
LD DE,(PC_INITTBL) ; EXECUTE FIRST
LD HL,PC_INITTBL
PUSH HL
PUSH DE
PUSH HL
CALL ADDHLA
POP DE ; PLACE IT AT THE TOP OF THE
PUSH HL ; TABLE BY SWAPPING IT
LDI ; WITH THE FIRST (DUMMY)
LDI ; ENTRY
POP HL
POP DE
LD (HL),D
INC HL
LD (HL),E
LD B,PC_INITTBLLEN
POP DE
CALL CALLLIST ; PROCESS THE PRE-INIT CALL TABLE
;
#IF 0
;
@ -1437,19 +1441,7 @@ HB_PCPU:
CALL NEWLINE
LD B,HB_INITTBLLEN
LD DE,HB_INITTBL
INITSYS1:
LD A,(DE)
LD L,A
INC DE
LD A,(DE)
LD H,A
INC DE
PUSH DE
PUSH BC
CALL JPHL
POP BC
POP DE
DJNZ INITSYS1
CALL CALLLIST
;
; RECORD HEAP CURB AT THE CURRENT VALUE OF HEAP TOP. HEAP CURB
; MARKS THE POINT IN THE HEAP AFTER WHICH MEMORY IS RELEASED
@ -1532,6 +1524,50 @@ INITSYS3:
;
RET
;
; CALL A LIST OF ROUTINES POINTED TO BY DE OF LENGTH B.
;
CALLLIST:
LD A,(DE)
LD L,A
INC DE
LD A,(DE)
LD H,A
INC DE
PUSH DE
PUSH BC
CALL JPHL
POP BC
POP DE
DJNZ CALLLIST
CALLDUMMY:
RET
;
;==================================================================================================
; TABLE OF PRE-CONSOLE INITIALIZATION ENTRY POINTS
;==================================================================================================
PC_INITTBL:
.DW CALLDUMMY ; RESERVED FOR FORCING PRIMARY CONSOLE
#IF (ASCIENABLE)
.DW ASCI_PREINIT
#ENDIF
#IF (UARTENABLE)
.DW UART_PREINIT
#ENDIF
#IF (SIOENABLE)
.DW SIO_PREINIT
#ENDIF
#IF (ACIAENABLE)
.DW ACIA_PREINIT
#ENDIF
#IF (PIO_4P | PIO_ZP)
.DW PIO_PREINIT
#ENDIF
#IF (UFENABLE)
.DW UF_PREINIT
#ENDIF
PC_INITTBLLEN .EQU (($ - PC_INITTBL) / 2)
;==================================================================================================
; TABLE OF INITIALIZATION ENTRY POINTS
;==================================================================================================
@ -1609,6 +1645,9 @@ HB_INITTBL:
#IF (PIO_4P | PIO_ZP)
.DW PIO_INIT
#ENDIF
#IF (UFENABLE)
.DW UF_INIT
#ENDIF
;
HB_INITTBLLEN .EQU (($ - HB_INITTBL) / 2)
;
@ -2702,7 +2741,7 @@ SIZ_MD .EQU $ - ORG_MD
.ECHO SIZ_MD
.ECHO " bytes.\n"
#ENDIF
;
#IF (FDENABLE)
ORG_FD .EQU $
#INCLUDE "fd.asm"
@ -2711,7 +2750,7 @@ SIZ_FD .EQU $ - ORG_FD
.ECHO SIZ_FD
.ECHO " bytes.\n"
#ENDIF
;
#IF (RFENABLE)
ORG_RF .EQU $
#INCLUDE "rf.asm"
@ -2720,7 +2759,7 @@ SIZ_RF .EQU $ - ORG_RF
.ECHO SIZ_RF
.ECHO " bytes.\n"
#ENDIF
;
#IF (IDEENABLE)
ORG_IDE .EQU $
#INCLUDE "ide.asm"
@ -2729,7 +2768,7 @@ SIZ_IDE .EQU $ - ORG_IDE
.ECHO SIZ_IDE
.ECHO " bytes.\n"
#ENDIF
;
#IF (PPIDEENABLE)
ORG_PPIDE .EQU $
#INCLUDE "ppide.asm"
@ -2738,7 +2777,7 @@ SIZ_PPIDE .EQU $ - ORG_PPIDE
.ECHO SIZ_PPIDE
.ECHO " bytes.\n"
#ENDIF
;
#IF (SDENABLE)
ORG_SD .EQU $
#INCLUDE "sd.asm"
@ -2747,7 +2786,7 @@ SIZ_SD .EQU $ - ORG_SD
.ECHO SIZ_SD
.ECHO " bytes.\n"
#ENDIF
;
#IF (HDSKENABLE)
ORG_HDSK .EQU $
#INCLUDE "hdsk.asm"
@ -2756,7 +2795,7 @@ SIZ_HDSK .EQU $ - ORG_HDSK
.ECHO SIZ_HDSK
.ECHO " bytes.\n"
#ENDIF
;
#IF (TERMENABLE)
ORG_TERM .EQU $
#INCLUDE "term.asm"
@ -2783,6 +2822,7 @@ SIZ_AY .EQU $ - ORG_AY
.ECHO SIZ_AY
.ECHO " bytes.\n"
#ENDIF
;
#IF (PIO_4P | PIO_ZP | PPI_SBC)
ORG_PIO .EQU $
#INCLUDE "pio.asm"
@ -2791,7 +2831,15 @@ SIZ_PIO .EQU $ - ORG_PIO
.ECHO SIZ_PIO
.ECHO " bytes.\n"
#ENDIF
;
#IF (UFENABLE)
ORG_UF .EQU $
#INCLUDE "usbfifo.asm"
SIZ_UF .EQU $ - ORG_UF
.ECHO "USB-FIFO occupies "
.ECHO SIZ_UF
.ECHO " bytes.\n"
#ENDIF
;
#DEFINE USEDELAY
#INCLUDE "util.asm"

1234
Source/HBIOS/pio.asm

File diff suppressed because it is too large

5
Source/HBIOS/plt_sbc.inc

@ -20,4 +20,7 @@ MPGENA .EQU SBC_BASE + $1C ; PAGING ENABLE REGISTER - BIT 0 = 1 (WRITE ONLY)
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
PIOZBASE .EQU $88 ; 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

8
Source/HBIOS/std.asm

@ -269,6 +269,14 @@ IVT_PIO3 .EQU 24
IVT_SER2 .EQU 26
IVT_SER3 .EQU 28
;
;
; DEVICE DRIVER TO BE INITIALIZED FIRST. FIRST CIO DRIVER, UNIT 0 INITIALIZED BECOMES PRIMARY CONSOLE.
; IS AN INDEX INTO THE ENABLED INITIALIZATION DRIVER LIST i.e. ASCI, UART, SIO, ACIA, PIO, UF ETC.
; EXAMPLE: IF ONLY UART, SIO AND PIO ARE ENABLE AND THE SIO IS DESIRED AS THE PRIMARY CONSOLE,
; SET FORCECON TO 2 IN YOUR CUSTOM CONFIGURATION FILE i.e. "FORCECON: .SET 2"
;
FORCECON .EQU 0 ; DEFAULT IS TO FOLLOW NORMAL SEQUENCE
;
#INCLUDE "build.inc" ; INCLUDE USER CONFIG, ADD VARIANT, TIMESTAMP, & ROMSIZE
;
#IF ((PLATFORM == PLT_N8) | (PLATFORM == PLT_MK4) | (PLATFORM == PLT_RCZ180))

181
Source/HBIOS/usbfifo.asm

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