; ;================================================================================================== ; eZ80 UART DRIVER (SERIAL PORT) ;================================================================================================== ; UART0_LSR .EQU $C5 UART0_THR .EQU $C0 UART0_RBR .EQU $C0 LSR_THRE .EQU $20 LSR_DR .EQU $01 #DEFINE IN0_A(p) .DB $ED,$38,p #DEFINE IN0_B(p) .DB $ED,$00,p #DEFINE IN0_C(p) .DB $ED,$08,p #DEFINE IN0_D(p) .DB $ED,$10,p #DEFINE IN0_E(p) .DB $ED,$18,p #DEFINE IN0_H(p) .DB $ED,$20,p #DEFINE IN0_L(p) .DB $ED,$28,p #DEFINE OUT0_A(p) .DB $ED,$39,p #DEFINE OUT0_B(p) .DB $ED,$01,p #DEFINE OUT0_C(p) .DB $ED,$09,p #DEFINE OUT0_D(p) .DB $ED,$11,p #DEFINE OUT0_E(p) .DB $ED,$19,p #DEFINE OUT0_H(p) .DB $ED,$21,p #DEFINE OUT0_L(p) .DB $ED,$29,p EZUART_PREINIT: LD BC, EZUART_FNTBL LD DE, EZUART_CFG CALL CIO_ADDENT LD (EZUART_ID), A XOR A RET EZUART_INIT: XOR A RET ; RETRIEVE THE NEXT CHARACTER FROM THE UART AND RETURN IN E EZUART_IN: IN0_A (UART0_LSR) ; CHECK FOR RX READY AND LSR_DR JR Z, EZUART_IN IN0_E (UART0_RBR) ; GET THE CHAR XOR A ; SIGNAL SUCCESS RET ; OUT CHAR IN E EZUART_OUT: IN0_A (UART0_LSR) ; WAIT FOR TX READY AND LSR_THRE JR Z, EZUART_OUT OUT0_E (UART0_THR) ; SEND THE CHAR XOR A ; SIGNAL SUCCESS RET EZUART_IST: IN0_A (UART0_LSR) ; CHECK FOR RX READY AND LSR_DR RET EZUART_OST: IN0_A (UART0_LSR) ; WAIT FOR TX READY AND LSR_THRE RET Z LD A, 1 RET EZUART_INITDEV: EZUART_QUERY: LD A, 0 ; NOT IMPLEMENTED ERROR RET EZUART_DEVICE: LD D, CIODEV_EZ80UART ; D := DEVICE TYPE LD E, (IY) ; E := PHYSICAL UNIT LD C, 0 ; C := DEVICE TYPE, 0x00 IS RS-232 LD HL, 0 ; H := MODE, L := BASE I/O ADDRESS XOR A ; SIGNAL SUCCESS RET EZUART_CFG: EZUART_ID: .DB 0 EZUART_FNTBL: .DW EZUART_IN .DW EZUART_OUT .DW EZUART_IST .DW EZUART_OST .DW EZUART_INITDEV .DW EZUART_QUERY .DW EZUART_DEVICE #IF (($ - EZUART_FNTBL) != (CIO_FNCNT * 2)) .ECHO "*** INVALID EZUART FUNCTION TABLE ***\n"