; ;================================================================================================== ; ASCI DRIVER (Z180 SERIAL PORTS) ;================================================================================================== ; ; CHARACTER DEVICE DRIVER ENTRY ; A: RESULT (OUT), CF=ERR ; B: FUNCTION (IN) ; C: CHARACTER (IN/OUT) ; E: DEVICE/UNIT (IN) ; ; ASCI_DISPATCH: LD A,C ; GET DEVICE/UNIT AND $0F ; ISOLATE UNIT JP Z,ASCI0 DEC A JP Z,ASCI1 CALL PANIC ; ASCI0: LD A,B ; GET REQUESTED FUNCTION AND $0F ; ISOLATE SUB-FUNCTION JP Z,ASCI0_IN DEC A JP Z,ASCI0_OUT DEC A JP Z,ASCI0_IST DEC A JP Z,ASCI0_OST CALL PANIC ; ; ; ASCI_INIT: ; ASCI0 PRTS("ASCI0: IO=0x$") LD A,CPU_TDR0 CALL PRTHEXBYTE CALL PC_COMMA LD A,CPU_RDR0 CALL PRTHEXBYTE PRTS(" BAUD=$") LD HL,ASCI0BAUD / 10 CALL PRTDEC PRTC('0') LD A,66H OUT0 (CPU_ASEXT0),A LD A,64H OUT0 (CPU_CNTLA0),A LD A,Z180_CNTLB0 OUT0 (CPU_CNTLB0),A ; ASCI1 CALL NEWLINE PRTS("ASCI1: IO=0x$") LD A,CPU_TDR1 CALL PRTHEXBYTE CALL PC_COMMA LD A,CPU_RDR1 CALL PRTHEXBYTE PRTS(" BAUD=$") LD HL,ASCI1BAUD / 10 CALL PRTDEC PRTC('0') LD A,66H OUT0 (CPU_ASEXT1),A LD A,64H OUT0 (CPU_CNTLA1),A LD A,Z180_CNTLB1 OUT0 (CPU_CNTLB1),A RET ; ; ; ASCI0_IN: CALL ASCI0_IST OR A JR Z,ASCI0_IN IN0 A,(CPU_RDR0) ; READ THE CHAR FROM THE ASCI LD E,A RET ; ; ; ASCI0_IST: ; CHECK FOR ERROR FLAGS IN0 A,(CPU_STAT0) AND 70H ; PARITY, FRAMING, OR OVERRUN ERROR JR Z,ASCI0_IST1 ; ALL IS WELL, CHECK FOR DATA ; CLEAR ERROR(S) OR NOTHING FURTHER CAN BE RECEIVED!!! IN0 A,(CPU_CNTLA0) RES 3,A ; CLEAR EFR (ERROR FLAG RESET) OUT0 (CPU_CNTLA0),A ASCI0_IST1: ; CHECK FOR STAT0.RDRF (DATA READY) IN0 A,(CPU_STAT0) ; READ LINE STATUS REGISTER AND $80 ; TEST IF DATA IN RECEIVE BUFFER JP Z,CIO_IDLE ; DO IDLE PROCESSING AND RETURN XOR A INC A ; SIGNAL CHAR READY, A = 1 RET ; ; ; ASCI0_OUT: CALL ASCI0_OST OR A JR Z,ASCI0_OUT LD A,E OUT0 (CPU_TDR0),A RET ; ASCI0_OST: IN0 A,(CPU_STAT0) AND $02 JP Z,CIO_IDLE ; DO IDLE PROCESSING AND RETURN XOR A INC A ; SIGNAL BUFFER EMPTY, A = 1 RET ; ; ; ASCI1: LD A,B ; GET REQUESTED FUNCTION AND $0F ; ISOLATE SUB-FUNCTION JR Z,ASCI0_IN DEC A JR Z,ASCI0_OUT DEC A JR Z,ASCI0_IST DEC A JR Z,ASCI0_OST CALL PANIC ; ; ; ASCI1_IN: CALL ASCI1_IST OR A JR Z,ASCI1_IN IN0 A,(CPU_RDR1) ; READ THE CHAR FROM THE ASCI LD E,A RET ; ; ; ASCI1_IST: ; CHECK FOR ERROR FLAGS IN0 A,(CPU_STAT1) AND 70H ; PARITY, FRAMING, OR OVERRUN ERROR JR Z,ASCI1_IST1 ; ALL IS WELL, CHECK FOR DATA ; CLEAR ERROR(S) OR NOTHING FURTHER CAN BE RECEIVED!!! IN0 A,(CPU_CNTLA1) RES 3,A ; CLEAR EFR (ERROR FLAG RESET) OUT0 (CPU_CNTLA1),A ASCI1_IST1: ; CHECK FOR STAT0.RDRF (DATA READY) IN0 A,(CPU_STAT1) ; READ LINE STATUS REGISTER AND $80 ; TEST IF DATA IN RECEIVE BUFFER JP Z,CIO_IDLE ; DO IDLE PROCESSING AND RETURN XOR A INC A ; SIGNAL CHAR READY, A = 1 RET ; ; ; ASCI1_OUT: CALL ASCI1_OST OR A JR Z,ASCI1_OUT LD A,E OUT0 (CPU_TDR1),A RET ; ASCI1_OST: IN0 A,(CPU_STAT1) AND $02 JR Z,ASCI1_OST JP Z,CIO_IDLE ; DO IDLE PROCESSING AND RETURN XOR A INC A ; SIGNAL BUFFER EMPTY, A = 1 RET