mirror of https://github.com/wwarthen/RomWBW.git
37 changed files with 559 additions and 53 deletions
@ -0,0 +1,154 @@ |
|||
; |
|||
;================================================================================================== |
|||
; PLD-USB SERIAL DRIVER |
|||
;================================================================================================== |
|||
; |
|||
; THIS SERIAL DRIVER SUPPORTS THE DLP-USB DEVICE ON THE S100 SERIAL-IO |
|||
; BOARD. THE STATUS PORT IS ACTUALLY BITS 6-7 OF PORT C OF THE 8255. IT IS ASSUMED |
|||
; THAT THE 8255 IS ALREADY PROGRAMMED AS NEEDED. |
|||
; |
|||
; TODO: |
|||
; |
|||
PLDSER_STAT .EQU $AA |
|||
PLDSER_DATA .EQU $AC |
|||
; |
|||
DEVECHO "PLDSER: IO=" |
|||
DEVECHO PLDSER_DATA |
|||
DEVECHO "\n" |
|||
; |
|||
; |
|||
; |
|||
PLDSER_PREINIT: |
|||
; |
|||
; TEST FOR PRESENCE |
|||
; |
|||
XOR A ; CLEAR ACCUM |
|||
LD (PLDSER_PRESENT),A ; PRESET TO NOT PRESENT |
|||
CALL PLDSER_DETECT ; CHECK FOR HARDWARE, Z=PRESENT |
|||
RET NZ ; ABORT IF NOT PRESENT |
|||
OR $FF ; PRESENT FLAG |
|||
LD (PLDSER_PRESENT),A ; STORE IT |
|||
; |
|||
; ADD OURSELVES TO CIO DISPATCH TABLE |
|||
; |
|||
LD D,0 ; PHYSICAL UNIT IS ZERO |
|||
LD E,CIODEV_PLDSER ; DEVICE TYPE |
|||
LD BC,PLDSER_FNTBL ; BC := FUNCTION TABLE ADDRESS |
|||
CALL CIO_ADDENT ; ADD ENTRY, A := UNIT ASSIGNED |
|||
; |
|||
XOR A |
|||
RET |
|||
; |
|||
; |
|||
; |
|||
PLDSER_INIT: |
|||
LD A,(PLDSER_PRESENT) ; PRESENT FLAG |
|||
OR A ; SET FLAGS |
|||
RET Z ; ABORT IF NOT PRESENT |
|||
CALL NEWLINE |
|||
PRTS("PLDSER:$") |
|||
PRTS(" IO=0x$") ; FORMATTING |
|||
LD A,PLDSER_DATA |
|||
CALL PRTHEXBYTE |
|||
; |
|||
XOR A ; SIGNAL SUCCESS |
|||
RET |
|||
; |
|||
; DRIVER FUNCTION TABLE |
|||
; |
|||
PLDSER_FNTBL: |
|||
.DW PLDSER_IN |
|||
.DW PLDSER_OUT |
|||
.DW PLDSER_IST |
|||
.DW PLDSER_OST |
|||
.DW PLDSER_INITDEV |
|||
.DW PLDSER_QUERY |
|||
.DW PLDSER_DEVICE |
|||
#IF (($ - PLDSER_FNTBL) != (CIO_FNCNT * 2)) |
|||
.ECHO "*** INVALID PLDSER FUNCTION TABLE ***\n" |
|||
#ENDIF |
|||
; |
|||
; |
|||
; |
|||
PLDSER_IN: |
|||
CALL PLDSER_IST ; CHECK FOR CHAR PENDING |
|||
JR Z,PLDSER_IN ; WAIT FOR IT IF NECESSARY |
|||
IN A,(PLDSER_DATA) ; READ THE CHAR |
|||
LD E,A |
|||
RET |
|||
; |
|||
; |
|||
; |
|||
PLDSER_IST: |
|||
IN A,(PLDSER_STAT) ; READ LINE STATUS REGISTER |
|||
CPL |
|||
AND %10000000 ; ISOLATE DATA READY |
|||
JP Z,CIO_IDLE ; RETURN VIA IDLE PROCESSING |
|||
OR $FF ; SET A=$FF TO SIGNAL READY |
|||
RET ; RETURN |
|||
; |
|||
; |
|||
; |
|||
PLDSER_OUT: |
|||
CALL PLDSER_OST ; CHECK FOR OUTPUT READY |
|||
JR Z,PLDSER_OUT ; WAIT IF NECESSARY |
|||
LD A,E ; RECOVER THE CHAR TO WRITE |
|||
OUT (PLDSER_DATA),A ; WRITE THE CHAR |
|||
RET |
|||
; |
|||
; |
|||
; |
|||
PLDSER_OST: |
|||
IN A,(PLDSER_STAT) ; READ LINE STATUS REGISTER |
|||
CPL |
|||
AND %01000000 ; ISOLATE OUTPUT RDY |
|||
JP Z,CIO_IDLE ; RETURN VIA IDLE PROCESSING |
|||
OR $FF ; SET A=$FF TO SIGNAL READY |
|||
RET ; RETURN |
|||
; |
|||
; |
|||
; |
|||
PLDSER_INITDEV: |
|||
SYSCHKERR(ERR_NOTIMPL) |
|||
RET |
|||
; |
|||
; |
|||
; |
|||
PLDSER_QUERY: |
|||
LD DE,PLDSERCFG |
|||
XOR A |
|||
RET |
|||
; |
|||
; |
|||
; |
|||
PLDSER_DEVICE: |
|||
LD D,CIODEV_PLDSER ; D := DEVICE TYPE |
|||
LD E,0 ; E := DEVICE NUM, ALWAYS 0 |
|||
LD C,$00 ; C := DEVICE TYPE, 0x00 IS RS-232 |
|||
LD H,0 ; H := 0, DRIVER HAS NO MODES |
|||
LD L,PLDSER_DATA ; L := BASE I/O ADDRESS |
|||
XOR A ; SIGNAL SUCCESS |
|||
RET |
|||
; |
|||
; TEST FOR HARDWARE PRESENCE BY CHECKING THE STATUS PORT. IF IT IS |
|||
; $FF, WE ASSUME NOT PRESENT. THEN READ PORT A DIFFERENT WAY. IF |
|||
; PRESENT PORT SHOULD HAVE SAME VALUE. |
|||
; |
|||
; THIS COULD BE SIGNIFICANTLY IMPROVED. |
|||
; |
|||
; |
|||
PLDSER_DETECT: |
|||
IN A,(PLDSER_STAT) ; GET DATA PORT VALUE DIRECTLY |
|||
CP $FF ; CHECK FOR $FF |
|||
JR NZ,PLDSER_DETECT1 ; IF NOT $FF, MAY BE ACTIVE, CONTINUE |
|||
OR A ; SWITCH ZF BACK TO NZ |
|||
RET ; DONE |
|||
PLDSER_DETECT1: |
|||
LD C,PLDSER_STAT ; PORT ADR TO C |
|||
IN B,(C) ; GET DATA PORT VALUE VIA (C) |
|||
CP B ; COMPARE, EQUAL IMPLIES ACTIVE PORT |
|||
RET |
|||
; |
|||
; |
|||
; |
|||
PLDSER_PRESENT .DB 0 ; FLAG FOR HARDWARE PRESENT |
|||
@ -0,0 +1,116 @@ |
|||
; |
|||
;================================================================================================== |
|||
; S100 Z80 FPGA T35 SERIAL DRIVER |
|||
;================================================================================================== |
|||
; |
|||
; THIS SERIAL DRIVER SUPPORTS THE SERIAL INTERFACE OF THE T35 FPGA. |
|||
; |
|||
; TODO: |
|||
; |
|||
TSER_STAT .EQU $34 |
|||
TSER_DATA .EQU $35 |
|||
; |
|||
DEVECHO "TSER: IO=" |
|||
DEVECHO TSER_DATA |
|||
DEVECHO "\n" |
|||
; |
|||
; |
|||
; |
|||
TSER_PREINIT: |
|||
; |
|||
; ADD OURSELVES TO CIO DISPATCH TABLE |
|||
; |
|||
LD D,0 ; PHYSICAL UNIT IS ZERO |
|||
LD E,CIODEV_TSER ; DEVICE TYPE |
|||
LD BC,TSER_FNTBL ; BC := FUNCTION TABLE ADDRESS |
|||
CALL CIO_ADDENT ; ADD ENTRY, A := UNIT ASSIGNED |
|||
; |
|||
XOR A |
|||
RET |
|||
; |
|||
; |
|||
; |
|||
TSER_INIT: |
|||
CALL NEWLINE |
|||
PRTS("TSER:$") |
|||
PRTS(" IO=0x$") ; FORMATTING |
|||
LD A,TSER_DATA |
|||
CALL PRTHEXBYTE |
|||
; |
|||
XOR A ; SIGNAL SUCCESS |
|||
RET |
|||
; |
|||
; DRIVER FUNCTION TABLE |
|||
; |
|||
TSER_FNTBL: |
|||
.DW TSER_IN |
|||
.DW TSER_OUT |
|||
.DW TSER_IST |
|||
.DW TSER_OST |
|||
.DW TSER_INITDEV |
|||
.DW TSER_QUERY |
|||
.DW TSER_DEVICE |
|||
#IF (($ - TSER_FNTBL) != (CIO_FNCNT * 2)) |
|||
.ECHO "*** INVALID TSER FUNCTION TABLE ***\n" |
|||
#ENDIF |
|||
; |
|||
; |
|||
; |
|||
TSER_IN: |
|||
CALL TSER_IST ; CHECK FOR CHAR PENDING |
|||
JR Z,TSER_IN ; WAIT FOR IT IF NECESSARY |
|||
IN A,(TSER_DATA) ; READ THE CHAR |
|||
LD E,A |
|||
RET |
|||
; |
|||
; |
|||
; |
|||
TSER_IST: |
|||
IN A,(TSER_STAT) ; READ LINE STATUS REGISTER |
|||
AND %00000001 ; ISOLATE DATA READY |
|||
JP Z,CIO_IDLE ; RETURN VIA IDLE PROCESSING |
|||
OR $FF ; SET A=$FF TO SIGNAL READY |
|||
RET ; RETURN |
|||
; |
|||
; |
|||
; |
|||
TSER_OUT: |
|||
CALL TSER_OST ; CHECK FOR OUTPUT READY |
|||
JR Z,TSER_OUT ; WAIT IF NECESSARY |
|||
LD A,E ; RECOVER THE CHAR TO WRITE |
|||
OUT (TSER_DATA),A ; WRITE THE CHAR |
|||
RET |
|||
; |
|||
; |
|||
; |
|||
TSER_OST: |
|||
IN A,(TSER_STAT) ; READ LINE STATUS REGISTER |
|||
CPL |
|||
AND %00000010 ; ISOLATE OUTPUT RDY |
|||
JP Z,CIO_IDLE ; RETURN VIA IDLE PROCESSING |
|||
OR $FF ; SET A=$FF TO SIGNAL READY |
|||
RET ; RETURN |
|||
; |
|||
; |
|||
; |
|||
TSER_INITDEV: |
|||
SYSCHKERR(ERR_NOTIMPL) |
|||
RET |
|||
; |
|||
; |
|||
; |
|||
TSER_QUERY: |
|||
LD DE,TSERCFG |
|||
XOR A |
|||
RET |
|||
; |
|||
; |
|||
; |
|||
TSER_DEVICE: |
|||
LD D,CIODEV_TSER ; D := DEVICE TYPE |
|||
LD E,0 ; E := DEVICE NUM, ALWAYS 0 |
|||
LD C,$00 ; C := DEVICE TYPE, 0x00 IS RS-232 |
|||
LD H,0 ; H := 0, DRIVER HAS NO MODES |
|||
LD L,TSER_DATA ; L := BASE I/O ADDRESS |
|||
XOR A ; SIGNAL SUCCESS |
|||
RET |
|||
Loading…
Reference in new issue