mirror of https://github.com/wwarthen/RomWBW.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
176 lines
4.1 KiB
176 lines
4.1 KiB
;
|
|
;==================================================================================================
|
|
; 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.
|
|
;
|
|
; STATUS BITS: IDLE
|
|
; 7: 0=CHAR PENDING 1
|
|
; 6: 0=XMIT HOLDING REGISTER EMPTY 0
|
|
; 5-0: UNDEFINED
|
|
;
|
|
; TODO:
|
|
;
|
|
PLDSER_PPI_BASE .EQU $A8
|
|
;
|
|
PLDSER_PPIA .EQU PLDSER_PPI_BASE + 0
|
|
PLDSER_PPIB .EQU PLDSER_PPI_BASE + 1
|
|
PLDSER_PPIC .EQU PLDSER_PPI_BASE + 2
|
|
PLDSER_PPICTL .EQU PLDSER_PPI_BASE + 3
|
|
;
|
|
PLDSER_STAT .EQU PLDSER_PPIC
|
|
PLDSER_DATA .EQU PLDSER_PPI_BASE + 4
|
|
;
|
|
; ACCORDING TO THE S100 SERIAL-IO BOARD CONVENTIONS, THE PPI IS
|
|
; CONFIGURED FOR MODE 0 WITH A=INPUT, B=OUTPUT, C0-3=OUTPUT,
|
|
; C4-7=INPUT
|
|
;
|
|
PLDSER_PPICFG .EQU %10011000
|
|
;
|
|
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
|
|
;
|
|
CALL PLDSER_INITDEV
|
|
;
|
|
; 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:
|
|
; INIT THE PPI. THE PLD ADAPTER ITSELF HAS NO
|
|
; CONFIGURATION CAPABILITIES.
|
|
LD A,PLDSER_PPICFG ; CONFIG 8255 PORTS: B=OUTPUT
|
|
OUT (PLDSER_PPICTL),A ; WRITE CONTROL WORD
|
|
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. THE PLD ADAPTER STATUS IS EXPOSED THROUGH
|
|
; AN 8255 PPI. DETECTING THE PLD ITSELF IS BASICALLY IMPOSSIBLE GIVEN
|
|
; THERE ARE ONLY TWO STATUS BITS WITH VALUES THAT SHOULD NOT BE ASSUMED.
|
|
; SO, HERE WE JSUT CHECK FOR THE EXISTENCE OF THE PPI ITSELF WHICH IS
|
|
; USED TO INFER THE EXCISTENCE OF THE PLD ADAPTER.
|
|
;
|
|
PLDSER_DETECT:
|
|
;
|
|
; WE SETUP THE PPI TO WRITE, THEN WRITE A TEST VALUE
|
|
; TO PORT B, THEN READ IT BACK. IF THE PPI IS THERE
|
|
; THEN THE BUS HOLD CIRCUITRY WILL READ BACK THE TEST VALUE.
|
|
LD A,PLDSER_PPICFG ; CONFIG 8255 PORTS: B=OUTPUT
|
|
OUT (PLDSER_PPICTL),A ; WRITE CONTROL WORD
|
|
LD A,$A5 ; TEST VALUE
|
|
OUT (PLDSER_PPIB),A ; WRITE IT
|
|
IN A,(PLDSER_PPIB) ; READ IT
|
|
CP $A5
|
|
RET
|
|
;
|
|
;
|
|
;
|
|
PLDSER_PRESENT .DB 0 ; FLAG FOR HARDWARE PRESENT
|