mirror of https://github.com/wwarthen/RomWBW.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
113 lines
2.2 KiB
113 lines
2.2 KiB
;
|
|
;==================================================================================================
|
|
; 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
|
|
|
|
; call.IL $01FFxx WHERE xx IS r*4
|
|
#DEFINE FIRMWARE_FN(r) .DB $5B,$CD \ .DW ($FF00+(r*4)) \ .DB $01
|
|
|
|
EZUART_PREINIT:
|
|
FIRMWARE_FN(0)
|
|
LD BC, EZUART_FNTBL
|
|
LD DE, EZUART_CFG
|
|
CALL CIO_ADDENT
|
|
LD (EZUART_ID), A
|
|
|
|
FIRMWARE_FN(0)
|
|
|
|
XOR A
|
|
RET
|
|
|
|
EZUART_INIT:
|
|
FIRMWARE_FN(1)
|
|
|
|
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"
|
|
|