; ;================================================================================================== ; 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