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.
 
 
 
 
 
 

114 lines
2.3 KiB

;
;==================================================================================================
; UART DRIVER (SERIAL PORT)
;==================================================================================================
;
UART0_DIV .EQU (1843200 / (16 * BAUDRATE))
;
; CHARACTER DEVICE DRIVER ENTRY
; A: RESULT (OUT), CF=ERR
; B: FUNCTION (IN)
; C: CHARACTER (IN/OUT)
; E: DEVICE/UNIT (IN)
;
;
UART_DISPATCH:
LD A,B ; GET REQUESTED FUNCTION
AND $0F ; ISOLATE SUB-FUNCTION
JP Z,UART0_IN
DEC A
JP Z,UART0_OUT
DEC A
JP Z,UART0_IST
DEC A
JP Z,UART0_OST
CALL PANIC
;
;
;
UART_INIT:
PRTS("UART0: IO=0x$")
LD A,SIO_BASE
CALL PRTHEXBYTE
PRTS(" BAUD=$")
LD HL,BAUDRATE / 10
CALL PRTDEC
PRTC('0')
LD A,80H
OUT (SIO_LCR),A ; DLAB ON
LD A,UART0_DIV
OUT (SIO_DLL),A ; SET DIVISOR (LS)
LD A,00H
OUT (SIO_DLM),A ; SET DIVISOR (MS)
LD B,03H ; B = DEFAULT SETTING FOR MCR (DTR + RTS)
#IF (UARTAFC)
PRTS(" AFC$")
LD A,$55 ; TEST VALUE
OUT (SIO_SCR),A ; SET SCRATCH REG TO TEST VALUE
LD A,0BFH
OUT (SIO_LCR),A ; SET LCR=$BF TO ATTEMPT TO ACCESS EFR
IN A,(SIO_SCR) ; READ SCRATCH REGISTER
CP $55 ; IF $55, NO EFR
JR NZ,UART_AFC1 ; NZ, HAVE EFR, DO IT
SET 5,B ; ENABLE AUTO FLOW CONTROL
JR UART_AFC2
UART_AFC1:
LD A,0C0H ; ENABLE CTS/RTS FLOW CONTROL
OUT (SIO_EFR),A ; SAVE IT
UART_AFC2:
#ENDIF
LD A,03H
OUT (SIO_LCR),A ; DLAB OFF, 8 DATA, 1 STOP, NO PARITY
LD A,B ; LOAD MCR VALUE TO SET
OUT (SIO_MCR),A ; SAVE IT
#IF (UARTFIFO)
; LD A,07H ; ENABLE AND RESET FIFOS
LD A,01H ; ENABLE AND RESET FIFOS
OUT (SIO_FCR),A ; ENABLE FIFOS
PRTS(" FIFO$")
#ENDIF
RET
;
;
;
UART0_IN:
CALL UART0_IST
OR A
JR Z,UART0_IN
IN A,(SIO_RBR) ; READ THE CHAR FROM THE UART
LD E,A
RET
;
;
;
UART0_IST:
IN A,(SIO_LSR) ; READ LINE STATUS REGISTER
AND $01 ; 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
;
;
;
UART0_OUT:
CALL UART0_OST
OR A
JR Z,UART0_OUT
LD A,E
OUT (SIO_THR),A ; THEN WRITE THE CHAR TO UART
RET
;
UART0_OST:
IN A,(SIO_LSR) ; READ LINE STATUS REGISTER
AND $20
JP Z,CIO_IDLE ; DO IDLE PROCESSING AND RETURN
XOR A
INC A ; SIGNAL BUFFER EMPTY, A = 1
RET