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