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.
 
 
 
 
 
 

154 lines
3.3 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. 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