; ;================================================================================================== ; S100 TRION SERIAL DRIVER ;================================================================================================== ; ; THIS SERIAL DRIVER SUPPORTS THE SERIAL INTERFACE OF THE TRION 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