; CHIBI PC-09 Prototype #1 Boot ROM -- Serial Driver ; Copyright (c) 2024-2025 Amber Zeller, Gale Faraday ; Licensed under MIT INCLUDE "hardware.inc" ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; Serial UART Driver ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SECTION SERIAL EXPORT INITUART EXPORT POUTCHAR EXPORT POUTZSTR ; Initializes the UART with LCR settings and a BAUD rate from DIVISORS. ; ACCA: Index of the divsor to use in DIVISORS ; ACCB: Settings for LCR INITUART pshs b ; Preserve LCR while we set up divisors ldx #DIVISORS ; Get DIVISORS base addr asla ; Shift left to *2 the index in order to iter over words. ldd a,x ; Get divisor into D sta UART_DLM ; Write divisor MSB stb UART_DLL ; Write divisor LSB puls b stb UART_LCR ; Write LCR lda #(UARTF_FCR_FE|UARTF_FCR_RFR|UARTF_FCR_XFR) ; FIFO disable and clear sta UART_FCR clra sta UART_IER ; Polled mode sta UART_MCR ; Reset DTR, RTS rts ; UART baud rate divisors DIVISORS fdb $0900 ; 50 baud fdb $0600 ; 75 baud fdb $0417 ; 110 baud fdb $0359 ; 134.5 baud fdb $0300 ; 150 baud fdb $0180 ; 300 baud fdb $00C0 ; 600 baud fdb $0060 ; 1200 baud fdb $0040 ; 1800 baud fdb $0030 ; 2400 baud fdb $0020 ; 3600 baud fdb $0018 ; 4800 baud fdb $0010 ; 7200 baud fdb $000C ; 9600 baud fdb $0006 ; 19200 baud ; Prints a character in polled non-FIFO mode (INITUART state). ; ACCA: char to write POUTCHAR pshs a ; Preserve char NOTREADY@ lda UART_LSR ; Wait until LSR.THRE == 1 then write char bita #UARTF_LSR_THRE beq NOTREADY@ puls a ; Restore char sta UART_THR ; Write char rts ; Prints a null terminated string in polled non-FIFO mode (INITUART state). ; X: start of zstring POUTZSTR pshs a,b ; Preserve A and B NEXTC@ ldb ,x+ ; Get next char from X and increment X for next time cmpb #$00 ; Make sure that we aren't at a terminator beq END@ NOTREADY@ lda UART_LSR ; Wait until LSR.THRE == 1 then write char bita #UARTF_LSR_THRE beq NOTREADY@ stb UART_THR ; Write char bra NEXTC@ ; Iter to next char END@ puls b,a ; Restore A and B rts ; Reads a char in polled mode non-FIFO mode (INITUART state). ; A: Filled with char from RX buffer or NUL ($00) if no char is ready ; B: Filled with LSR status codes masked with $9F PINCHAR ldb UART_LSR ; See if a char is ready ; Mask of possible UART error codes | data ready flag ($9F) andb #(UARTF_LSR_DR|UARTF_LSR_OE|UARTF_LSR_PE|UARTF_LSR_FE|UARTF_LSR_BI|UARTF_LSR_FIFO) bitb #UARTF_LSR_DR ; Check for char beq NOCHAR@ lda UART_RBR ; Pull char from RX buffer rts NOCHAR@ clra ; Fill A with '\0'. rts