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