From 9e5a1ea41ba4cca289ba0e7ac9f717bc7e2ec7d1 Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Tue, 19 Apr 2016 15:06:06 -0700 Subject: [PATCH] UART Config Changes --- Source/HBIOS/API.txt | 25 +- Source/HBIOS/Config/plt_mk4.asm | 15 +- Source/HBIOS/Config/plt_n8.asm | 3 +- Source/HBIOS/Config/plt_sbc.asm | 24 +- Source/HBIOS/Config/plt_zeta.asm | 6 +- Source/HBIOS/Config/zeta2_std.asm | 2 +- Source/HBIOS/encode.asm | 19 +- Source/HBIOS/hbios.asm | 52 ++- Source/HBIOS/std.asm | 48 ++- Source/HBIOS/uart.asm | 541 +++++++++++++++--------------- 10 files changed, 410 insertions(+), 325 deletions(-) diff --git a/Source/HBIOS/API.txt b/Source/HBIOS/API.txt index 54020aca..20c45dc4 100644 --- a/Source/HBIOS/API.txt +++ b/Source/HBIOS/API.txt @@ -123,6 +123,29 @@ INIT ($04): DE=Line Characteristics L=Terminal Type? + Setup Parameter Word: + _______________________________ _______________________________ + | | | encoded || | | | | | + | |rts| Baud Rate ||dtr|xon| parity |stp| 8/7/6 | + |_______|___|___|_______________||___|___|___________|___|_______| + 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 + D register E register + + _______________________________ _______________________________ + | | | || | | | | | + | 0 0 |AFE|LP OT2 OT1 RTS DTR||DLB|BRK|STK EPS PEN|STB| WLS | + |_______|___|___________________||___|___|___________|___|_______| + 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 + -- MCR -- -- LCR -- + + _______________________________ _______________________________ + | | re| te|~rs| er|8/7 pe stp|| | | | | | | + | 0 | 1 | 1 | 0 | 0 | m2 m1 m0|| 0 | 0 | ps|peo| dr| SSS | + |___|___|___|___|___|___________||___|___|___|___|___|___________| + 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 + CNTLA0 CNTLB0 + + QUERY ($05) BC=Function/Unit A=Result DE=Line Characteristics (Baud, Flow Control, etc.) @@ -134,7 +157,7 @@ DEVICE ($06): E=Device Number C=Device Attributes - Disk Device Attributes Byte: + Serial Device Attributes Byte: 7: 0=RS-232, 1=Terminal If Terminal, 3-0 is attached Video Unit # diff --git a/Source/HBIOS/Config/plt_mk4.asm b/Source/HBIOS/Config/plt_mk4.asm index 1ea07ca9..061f509b 100644 --- a/Source/HBIOS/Config/plt_mk4.asm +++ b/Source/HBIOS/Config/plt_mk4.asm @@ -7,7 +7,8 @@ ; CPUOSC .EQU 18432000 ; CPU OSC FREQ RAMSIZE .EQU 512 ; SIZE OF RAM IN KB, MUST MATCH YOUR HARDWARE!!! -CONBAUD .EQU 38400 ; DEFAULT BAUDRATE USED BELOW +CONBAUD .EQU 38400 ; CONSOLE BAUDRATE AT STARTUP +DEFSERCFG .EQU SER_38400_8N1 ; DEFAULT SERIAL LINE CONFIG (SHOULD MATCH ABOVE) ; CRTACT .EQU FALSE ; CRT ACTIVATION AT STARTUP VDAEMU .EQU EMUTYP_ANSI ; DEFAULT VDA EMULATION (EMUTYP_TTY, EMUTYP_ANSI, ...) @@ -22,17 +23,13 @@ UARTENABLE .EQU TRUE ; TRUE FOR UART SUPPORT (ALMOST ALWAYS WANT THIS TO BE TRU UARTOSC .EQU 1843200 ; UART OSC FREQUENCY UARTCNT .EQU 4 ; NUMBER OF UARTS UART0IOB .EQU $C0 ; IOBASE (4UART PORT A) -UART0BAUD .EQU CONBAUD ; BAUDRATE -UART0FEAT .EQU UF_FIFO ; FEATURE FLAGS: UF_FIFO | UF_AFC +UART0CFG .EQU DEFSERCFG ; CONFIG (BAUDRATE, DATA BITS, PARITY, STOP BITS, ETC.) UART1IOB .EQU $C8 ; IOBASE (4UART PORT B) -UART1BAUD .EQU CONBAUD ; BAUDRATE -UART1FEAT .EQU UF_FIFO ; FEATURE FLAGS: UF_FIFO | UF_AFC +UART1CFG .EQU DEFSERCFG ; CONFIG (BAUDRATE, DATA BITS, PARITY, STOP BITS, ETC.) UART2IOB .EQU $D0 ; IOBASE (4UART PORT C) -UART2BAUD .EQU CONBAUD ; BAUDRATE -UART2FEAT .EQU UF_FIFO ; FEATURE FLAGS: UF_FIFO | UF_AFC +UART2CFG .EQU DEFSERCFG ; CONFIG (BAUDRATE, DATA BITS, PARITY, STOP BITS, ETC.) UART3IOB .EQU $D8 ; IOBASE (4UART PORT D) -UART3BAUD .EQU CONBAUD ; BAUDRATE -UART3FEAT .EQU UF_FIFO ; FEATURE FLAGS: UF_FIFO | UF_AFC +UART3CFG .EQU DEFSERCFG ; CONFIG (BAUDRATE, DATA BITS, PARITY, STOP BITS, ETC.) ; ASCIENABLE .EQU TRUE ; TRUE FOR Z180 ASCI SUPPORT ASCI0BAUD .EQU CONBAUD ; ASCI0 BAUDRATE (IMPLEMENTED BY Z180_ASCIB0) diff --git a/Source/HBIOS/Config/plt_n8.asm b/Source/HBIOS/Config/plt_n8.asm index 8b7870e5..b76ddf02 100644 --- a/Source/HBIOS/Config/plt_n8.asm +++ b/Source/HBIOS/Config/plt_n8.asm @@ -7,7 +7,8 @@ ; CPUOSC .EQU 18432000 ; CPU OSC FREQ RAMSIZE .EQU 512 ; SIZE OF RAM IN KB, MUST MATCH YOUR HARDWARE!!! -CONBAUD .EQU 38400 ; DEFAULT BAUDRATE USED BELOW +CONBAUD .EQU 38400 ; CONSOLE BAUDRATE AT STARTUP +DEFSERCFG .EQU SER_38400_8N1 ; DEFAULT SERIAL LINE CONFIG (SHOULD MATCH ABOVE) ; CRTACT .EQU FALSE ; CRT ACTIVATION AT STARTUP VDAEMU .EQU EMUTYP_ANSI ; DEFAULT VDA EMULATION (EMUTYP_TTY, EMUTYP_ANSI, ...) diff --git a/Source/HBIOS/Config/plt_sbc.asm b/Source/HBIOS/Config/plt_sbc.asm index ad24cb7c..a2eda248 100644 --- a/Source/HBIOS/Config/plt_sbc.asm +++ b/Source/HBIOS/Config/plt_sbc.asm @@ -7,7 +7,8 @@ ; CPUOSC .EQU 8000000 ; CPU OSC FREQ RAMSIZE .EQU 512 ; SIZE OF RAM IN KB, MUST MATCH YOUR HARDWARE!!! -CONBAUD .EQU 38400 ; DEFAULT BAUDRATE USED BELOW +CONBAUD .EQU 38400 ; CONSOLE BAUDRATE AT STARTUP +DEFSERCFG .EQU SER_38400_8N1 ; DEFAULT SERIAL LINE CONFIG (SHOULD MATCH ABOVE) ; CRTACT .EQU FALSE ; CRT ACTIVATION AT STARTUP VDAEMU .EQU EMUTYP_ANSI ; DEFAULT VDA EMULATION (EMUTYP_TTY, EMUTYP_ANSI, ...) @@ -22,26 +23,19 @@ UARTENABLE .EQU TRUE ; TRUE FOR UART SUPPORT (ALMOST ALWAYS WANT THIS TO BE TRU UARTOSC .EQU 1843200 ; UART OSC FREQUENCY UARTCNT .EQU 7 ; NUMBER OF UARTS UART0IOB .EQU $68 ; IOBASE (SBC ONBOARD UART) -UART0BAUD .EQU CONBAUD ; BAUDRATE -UART0FEAT .EQU UF_FIFO ; FEATURE FLAGS: UF_FIFO | UF_AFC +UART0CFG .EQU DEFSERCFG ; CONFIG (BAUDRATE, DATA BITS, PARITY, STOP BITS, ETC.) UART1IOB .EQU $80 ; IOBASE (CASSETTE INTERFACE) -UART1BAUD .EQU CONBAUD ; BAUDRATE -UART1FEAT .EQU UF_FIFO ; FEATURE FLAGS: UF_FIFO | UF_AFC +UART1CFG .EQU SER_300_8N1 ; CONFIG (BAUDRATE, DATA BITS, PARITY, STOP BITS, ETC.) UART2IOB .EQU $48 ; IOBASE (MF/PIC) -UART2BAUD .EQU CONBAUD ; BAUDRATE -UART2FEAT .EQU UF_FIFO ; FEATURE FLAGS: UF_FIFO | UF_AFC +UART2CFG .EQU DEFSERCFG ; CONFIG (BAUDRATE, DATA BITS, PARITY, STOP BITS, ETC.) UART3IOB .EQU $C0 ; IOBASE (4UART PORT A) -UART3BAUD .EQU CONBAUD ; BAUDRATE -UART3FEAT .EQU UF_FIFO ; FEATURE FLAGS: UF_FIFO | UF_AFC +UART3CFG .EQU DEFSERCFG ; CONFIG (BAUDRATE, DATA BITS, PARITY, STOP BITS, ETC.) UART4IOB .EQU $C8 ; IOBASE (4UART PORT B) -UART4BAUD .EQU CONBAUD ; BAUDRATE -UART4FEAT .EQU UF_FIFO ; FEATURE FLAGS: UF_FIFO | UF_AFC +UART4CFG .EQU DEFSERCFG ; CONFIG (BAUDRATE, DATA BITS, PARITY, STOP BITS, ETC.) UART5IOB .EQU $D0 ; IOBASE (4UART PORT C) -UART5BAUD .EQU CONBAUD ; BAUDRATE -UART5FEAT .EQU UF_FIFO ; FEATURE FLAGS: UF_FIFO | UF_AFC +UART5CFG .EQU DEFSERCFG ; CONFIG (BAUDRATE, DATA BITS, PARITY, STOP BITS, ETC.) UART6IOB .EQU $D8 ; IOBASE (4UART PORT D) -UART6BAUD .EQU CONBAUD ; BAUDRATE -UART6FEAT .EQU UF_FIFO ; FEATURE FLAGS: UF_FIFO | UF_AFC +UART6CFG .EQU DEFSERCFG ; CONFIG (BAUDRATE, DATA BITS, PARITY, STOP BITS, ETC.) ; ASCIENABLE .EQU FALSE ; TRUE FOR Z180 ASCI SUPPORT ; diff --git a/Source/HBIOS/Config/plt_zeta.asm b/Source/HBIOS/Config/plt_zeta.asm index 17061353..3329903d 100644 --- a/Source/HBIOS/Config/plt_zeta.asm +++ b/Source/HBIOS/Config/plt_zeta.asm @@ -7,7 +7,8 @@ ; CPUOSC .EQU 20000000 ; CPU OSC FREQ RAMSIZE .EQU 512 ; SIZE OF RAM IN KB, MUST MATCH YOUR HARDWARE!!! -CONBAUD .EQU 38400 ; DEFAULT BAUDRATE USED BELOW +CONBAUD .EQU 38400 ; CONSOLE BAUDRATE AT STARTUP +DEFSERCFG .EQU SER_38400_8N1 ; DEFAULT SERIAL LINE CONFIG (SHOULD MATCH ABOVE) ; CRTACT .EQU FALSE ; CRT ACTIVATION AT STARTUP VDAEMU .EQU EMUTYP_ANSI ; DEFAULT VDA EMULATION (EMUTYP_TTY, EMUTYP_ANSI, ...) @@ -22,8 +23,7 @@ UARTENABLE .EQU TRUE ; TRUE FOR UART SUPPORT (ALMOST ALWAYS WANT THIS TO BE TRU UARTOSC .EQU 1843200 ; UART OSC FREQUENCY UARTCNT .EQU 1 ; NUMBER OF UARTS UART0IOB .EQU $68 ; IOBASE (SBC ONBOARD UART) -UART0BAUD .EQU CONBAUD ; BAUDRATE -UART0FEAT .EQU UF_FIFO ; FEATURE FLAGS: UF_FIFO | UF_AFC +UART0CFG .EQU DEFSERCFG ; CONFIG (BAUDRATE, DATA BITS, PARITY, STOP BITS, ETC.) ; ASCIENABLE .EQU FALSE ; TRUE FOR Z180 ASCI SUPPORT ; diff --git a/Source/HBIOS/Config/zeta2_std.asm b/Source/HBIOS/Config/zeta2_std.asm index bde16496..b39646b2 100644 --- a/Source/HBIOS/Config/zeta2_std.asm +++ b/Source/HBIOS/Config/zeta2_std.asm @@ -2,4 +2,4 @@ ;================================================================================================== ; ZETA2 STANDARD CONFIGURATION ;================================================================================================== -; \ No newline at end of file +; diff --git a/Source/HBIOS/encode.asm b/Source/HBIOS/encode.asm index ebae4841..b8100921 100644 --- a/Source/HBIOS/encode.asm +++ b/Source/HBIOS/encode.asm @@ -85,8 +85,8 @@ DECODE9: ; ENCODE: ; *** MAKE SURE INCOMING VALUE IS NOT ZERO??? - CALL ENCODE6 ; TEST DE:HL FOR ZERO - JR Z,ENCODE4 ; IF NOT ZERO, GO TO FAILURE + CALL ENCODE5 ; TEST DE:HL FOR ZERO + JR Z,ENCODE4 ; IF ZERO, FAILURE RETURN ; APPLY ENCODING DIVISOR CALL DIV32X8 ; DE:HL / C (REMAINDER IN A) OR A ; SET FLAGS TO TEST FOR ZERO @@ -118,20 +118,13 @@ ENCODE3: ENCODE4: OR $FF ; SIGNAL ERROR RET ; AND DONE -ENCODE5: - CALL ENCODE6 ; TEST FOR ZERO - RET NZ ; ERROR IF DE:HL NOT ZERO NOW - ; RETURN SUCCESS W/ VALUE IN C - XOR A ; SIGNAL SUCCESS - RET ; AND DONE ; -ENCODE6: - ; SUBROUTINE TO TEST DE:HL FOR ZERO (SETS ZF, CLOBBERS A) +ENCODE5: + ; TEST DE:HL FOR ZERO (SETS ZF, CLOBBERS A) LD A,H OR L - RET NZ - LD A,D + OR D OR E - RET + RET ; RET W/ Z SET IF SUCCESSFUL ; ENCODE_TMP .FILL 4,0 ; TEMP DWORD VALUE diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index bbee510b..14c73dff 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -2262,11 +2262,52 @@ PS_PRTSC: AND E INC A ; SET Z IF DE == $FF JP Z,PS_PRTNUL ; $FF == NO CONFIG DEFINED - LD BC,HB_BCDTMP ; POINT TO TEMP BCD +; + ; PRINT BAUD RATE + PUSH DE ; PRESERVE DE + LD A,D + AND $1F ; ISOLATE ENCODED BAUD RATE + LD L,A ; PUT IN L + LD H,0 ; H IS ALWAYS ZERO + LD DE,75 ; BAUD RATE DECODE CONSTANT + CALL DECODE ; DE:HL := BAUD RATE + LD BC,HB_BCDTMP ; POINT TO TEMP BCD BUF CALL BIN2BCD ; CONVERT TO BCD - CALL PRTBCD ; AND PRINT IT - CALL PC_COMMA - PRTS(" 8N1$") + CALL PRTBCD ; AND PRINT IN DECIMAL + POP DE ; RESTORE DE +; + ; PRINT DATA BITS + PUSH DE ; PRESERVE DE + CALL PC_COMMA ; FORMATTING + LD A,E ; GET CONFIG BYTE + AND $03 ; ISOLATE DATA BITS VALUE + ADD A,'5' ; CONVERT TO CHARACTER + CALL COUT ; AND PRINT + POP DE ; RESTORE DE +; + ; PRINT PARITY + PUSH DE ; PRESERVE DE + CALL PC_COMMA ; FORMATTING + LD A,E ; GET CONFIG BYTE + RLCA ; SHIFT RELEVANT BITS + RLCA ; ... + RLCA ; ... + AND $07 ; AND ISOLATE DATA BITS VALUE + LD HL,PS_STPARMAP ; CHARACTER LOOKUP TABLE + CALL ADDHLA ; APPLY OFFSET + LD A,(HL) ; GET CHARACTER + CALL COUT ; AND PRINT + POP DE ; RESTORE DE +; + ; PRINT STOP BITS + CALL PC_COMMA ; FORMATTING + LD A,E ; GET CONFIG BYTE + RLCA ; SHIFT RELEVANT BITS + RLCA ; ... + AND $01 ; AND ISOLATE DATA BITS VALUE + ADD A,'1' ; MAKE IT A CHARACTER + CALL COUT ; AND PRINT +; RET ; PS_PRTSC1: @@ -2467,6 +2508,9 @@ PS_SDPPPCON .TEXT "PPPCON$" ; PS_STRS232 .TEXT "RS-232$" PS_STTERM .TEXT "Terminal$" +; +PS_STPARMAP .DB "NONENMNS" + ; ; SERIAL TYPE STRINGS ; diff --git a/Source/HBIOS/std.asm b/Source/HBIOS/std.asm index 33c2f4ec..977b73e7 100644 --- a/Source/HBIOS/std.asm +++ b/Source/HBIOS/std.asm @@ -105,10 +105,50 @@ SDMODE_UART .EQU 5 ; SD INTERFACE VIA UART SDMODE_DSD .EQU 6 ; DUAL SD SDMODE_MK4 .EQU 7 ; MARK IV ; -; UART FEATURE FLAGS -; -UF_FIFO .EQU $01 ; BIT 0 IS FIFO ENABLE -UF_AFC .EQU $02 ; BIT 1 IS AUTO FLOW CONTROL ENABLE +; SERIAL DEVICE CONFIGURATION CONSTANTS +; +SER_DATA5 .EQU 0 << 0 +SER_DATA6 .EQU 1 << 0 +SER_DATA7 .EQU 2 << 0 +SER_DATA8 .EQU 3 << 0 +; +SER_PARNONE .EQU 0 << 3 +SER_PARODD .EQU 1 << 3 +SER_PAREVEN .EQU 3 << 3 +SER_PARMARK .EQU 5 << 3 +SER_PARSPACE .EQU 7 << 3 +; +SER_STOP1 .EQU 0 << 2 +SER_STOP2 .EQU 1 << 2 +; +SER_BAUD300 .EQU $02 << 8 +SER_BAUD600 .EQU $03 << 8 +SER_BAUD1200 .EQU $04 << 8 +SER_BAUD2400 .EQU $05 << 8 +SER_BAUD4800 .EQU $06 << 8 +SER_BAUD9600 .EQU $07 << 8 +SER_BAUD19200 .EQU $08 << 8 +SER_BAUD38400 .EQU $09 << 8 +SER_BAUD76800 .EQU $0A << 8 +SER_BAUD115200 .EQU $19 << 8 +; +SER_XON .EQU 1 << 6 +SER_DTR .EQU 1 << 7 +SER_RTS .EQU 1 << 13 +; +SER_300_8N1 .EQU SER_BAUD300 | SER_DATA8 | SER_PARNONE | SER_STOP1 +SER_600_8N1 .EQU SER_BAUD600 | SER_DATA8 | SER_PARNONE | SER_STOP1 +SER_1200_8N1 .EQU SER_BAUD1200 | SER_DATA8 | SER_PARNONE | SER_STOP1 +SER_2400_8N1 .EQU SER_BAUD2400 | SER_DATA8 | SER_PARNONE | SER_STOP1 +SER_4800_8N1 .EQU SER_BAUD4800 | SER_DATA8 | SER_PARNONE | SER_STOP1 +SER_9600_8N1 .EQU SER_BAUD9600 | SER_DATA8 | SER_PARNONE | SER_STOP1 +SER_19200_8N1 .EQU SER_BAUD19200 | SER_DATA8 | SER_PARNONE | SER_STOP1 +SER_38400_8N1 .EQU SER_BAUD38400 | SER_DATA8 | SER_PARNONE | SER_STOP1 +SER_76800_8N1 .EQU SER_BAUD76800 | SER_DATA8 | SER_PARNONE | SER_STOP1 +SER_115200_8N1 .EQU SER_BAUD115200 | SER_DATA8 | SER_PARNONE | SER_STOP1 +; +;UF_FIFO .EQU $01 ; BIT 0 IS FIFO ENABLE +;UF_AFC .EQU $02 ; BIT 1 IS AUTO FLOW CONTROL ENABLE ; #INCLUDE "build.inc" ; INCLUDE USER CONFIG, ADD VARIANT, TIMESTAMP, & ROMSIZE ; diff --git a/Source/HBIOS/uart.asm b/Source/HBIOS/uart.asm index 609194dd..93a009f0 100644 --- a/Source/HBIOS/uart.asm +++ b/Source/HBIOS/uart.asm @@ -3,8 +3,26 @@ ; UART DRIVER (SERIAL PORT) ;================================================================================================== ; +; Setup Parameter Word: +; _______________________________ _______________________________ +; | | | encoded || | | | | | +; | |rts| Baud Rate ||dtr|xon| parity |stp| 8/7/6 | +; |_______|___|___|_______________||___|___|___________|___|_______| +; 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +; D register E register +; +; _______________________________ _______________________________ +; | | | || | | | | | +; | 0 0 |AFE|LP OT2 OT1 RTS DTR||DLB|BRK|STK EPS PEN|STB| WLS | +; |_______|___|___________________||___|___|___________|___|_______| +; 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +; -- MCR -- -- LCR -- +; +; UART_DEBUG .EQU FALSE ; +UART_DEFCFG .EQU %0010100110000011 +; UART_NONE .EQU 0 ; UNKNOWN OR NOT PRESENT UART_8250 .EQU 1 UART_16450 .EQU 2 @@ -63,30 +81,59 @@ UART_INIT0: LD HL,UART_CFG ; POINT TO START OF CFG TABLE CALL ADDHLA ; HL := ENTRY ADDRESS PUSH HL ; SAVE IT - CALL UART_INIT1 ; DO HARDWARE INIT FOR CURRENT UART + PUSH HL ; COPY CFG DATA PTR + POP IY ; ... TO IY + CALL UART_INITP ; HAND OFF TO GENERIC INIT CODE POP DE ; GET ENTRY ADDRESS BACK, BUT PUT IN DE POP BC ; RESTORE LOOP CONTROL - - LD A,(UART_TYPE) ; GET THE UART TYPE DETECTED +; + LD A,(IY + 1) ; GET THE UART TYPE DETECTED OR A ; SET FLAGS - JR Z,UART_INIT00 ; SKIP IT IF NOTHING FOUND - + JR Z,UART_INIT1 ; SKIP IT IF NOTHING FOUND +; PUSH BC ; SAVE LOOP CONTROL LD BC,UART_DISPATCH ; BC := DISPATCH ADDRESS CALL NZ,CIO_ADDENT ; ADD ENTRY IF UART FOUND, BC:DE POP BC ; RESTORE LOOP CONTROL - -UART_INIT00: +; +UART_INIT1: INC C ; NEXT PHYSICAL UNIT DJNZ UART_INIT0 ; LOOP UNTIL DONE XOR A ; SIGNAL SUCCESS RET ; AND RETURN ; -UART_INIT1: - PUSH HL ; COPY CFG DATA PTR - POP IY ; ... TO IY +; UART INITIALIZATION ROUTINE ; - JP UART_INITP ; HAND OFF TO GENERIC INIT CODE +UART_INITP: + ; WAIT FOR ANY IN-FLIGHT DATA TO BE SENT + LD B,0 ; LOOP TIMEOUT COUNTER +UART_INITP1: + UART_INP(UART_LSR) ; GET LINE STATUS REGISTER + BIT 6,A ; TEST BIT 6 (TRANSMITTER EMPTY) + JR NZ,UART_INITP2 ; EMPTY, CONTINUE + LD DE,100 ; DELAY 100 * 16US + CALL VDELAY ; NORMALIZE TIMEOUT TO CPU SPEED + DJNZ UART_INITP1 ; KEEP CHECKING UNTIL TIMEOUT + +UART_INITP2: + ; DETECT THE UART TYPE + CALL UART_DETECT ; DETERMINE UART TYPE + LD (IY + 1),A ; ALSO SAVE IN CONFIG TABLE + OR A ; SET FLAGS + RET Z ; ABORT IF NOTHING THERE + + ; UPDATE WORKING UART DEVICE NUM + LD HL,UART_DEV ; POINT TO CURRENT UART DEVICE NUM + LD A,(HL) ; PUT IN ACCUM + INC (HL) ; INCREMENT IT (FOR NEXT LOOP) + LD (IY),A ; UDPATE UNIT NUM + + ; SET DEFAULT CONFIG + LD DE,-1 ; LEAVE CONFIG ALONE + CALL UART_INITDEV ; IMPLEMENT IT + + ; DISPLAY UART CONFIG AND RETURN + JP UART_PRTCFG ; ; ; @@ -119,7 +166,7 @@ UART_FTBL: UART_IN: CALL UART_IST ; RECEIVED CHAR READY? JR Z,UART_IN ; LOOP IF NOT - LD C,(IY + 1) ; C := BASE UART PORT (WHICH IS ALSO RBR REG) + LD C,(IY + 2) ; C := BASE UART PORT (WHICH IS ALSO RBR REG) IN E,(C) ; CHAR READ TO E XOR A ; SIGNAL SUCCESS RET ; AND DONE @@ -129,7 +176,7 @@ UART_IN: UART_OUT: CALL UART_OST ; READY FOR CHAR? JR Z,UART_OUT ; LOOP IF NOT - LD C,(IY + 1) ; C := BASE UART PORT (WHICH IS ALSO THR REG) + LD C,(IY + 2) ; C := BASE UART PORT (WHICH IS ALSO THR REG) OUT (C),E ; SEND CHAR FROM E XOR A ; SIGNAL SUCCESS RET @@ -137,7 +184,7 @@ UART_OUT: ; ; UART_IST: - LD C,(IY + 2) ; C := LINE STATUS REG (LSR) + LD C,(IY + 3) ; C := LINE STATUS REG (LSR) IN A,(C) ; GET STATUS AND $01 ; ISOLATE BIT 0 (RECEIVE DATA READY) JP Z,CIO_IDLE ; NOT READY, RETURN VIA IDLE PROCESSING @@ -148,7 +195,7 @@ UART_IST: ; ; UART_OST: - LD C,(IY + 2) ; C := LINE STATUS REG (LSR) + LD C,(IY + 3) ; C := LINE STATUS REG (LSR) IN A,(C) ; GET STATUS AND $20 ; ISOLATE BIT 5 () JP Z,CIO_IDLE ; NOT READY, RETURN VIA IDLE PROCESSING @@ -159,142 +206,69 @@ UART_OST: ; ; UART_INITDEV: - XOR A ; NOT IMPLEMENTED!!! - RET -; -; -; -UART_QUERY: - PUSH IY ; COPY CFG ENTRY POINTER (IY) - POP HL ; ... TO HL - LD A,4 ; OFFSET OF BAUD RATE IS 4 - CALL ADDHLA ; BUMP HL TO START OF BAUD RATE DWORD - CALL LD32 ; LOAD IT - XOR A ; SIGNAL SUCCESS - RET ; DONE -; -; -; -UART_DEVICE: - LD D,CIODEV_UART ; D := DEVICE TYPE - LD E,C ; E := PHYSICAL UNIT - XOR A ; SIGNAL SUCCESS - RET -; -; UART INITIALIZATION ROUTINE -; -UART_INITP: - ; WAIT FOR ANY IN-FLIGHT DATA TO BE SENT - LD B,0 ; LOOP TIMEOUT COUNTER -UART_INITP00: - UART_INP(UART_LSR) ; GET LINE STATUS REGISTER - BIT 6,A ; TEST BIT 6 (TRANSMITTER EMPTY) - JR NZ,UART_INITP0 ; EMPTY, CONTINUE - LD DE,100 ; DELAY 100 * 16US - CALL VDELAY ; NORMALIZE TIMEOUT TO CPU SPEED - DJNZ UART_INITP00 ; KEEP CHECKING UNTIL TIMEOUT - -UART_INITP0: - ; DETECT THE UART TYPE - CALL UART_DETECT ; DETERMINE UART TYPE - LD (UART_TYPE),A ; SAVE TYPE - OR A ; SET FLAGS - RET Z ; ABORT IF NOTHING THERE - - ; UPDATE WORKING UART DEVICE NUM - LD HL,UART_DEV ; POINT TO CURRENT UART DEVICE NUM - LD A,(HL) ; PUT IN ACCUM - INC (HL) ; INCREMENT IT (FOR NEXT LOOP) - LD (IY),A ; UDPATE UNIT NUM - - ; SETUP FOR GENERIC INIT ROUTINE - LD A,(IY + 3) ; GET FEATURES BYTE - LD (UART_FUNC),A ; SAVE IT - - ; RESET FEATURE BITS - LD HL,UART_FEAT ; HL POINTS TO FEATURE FLAGS BYTE - XOR A ; RESET ALL FEATURES - LD (HL),A ; SAVE IT - + ; TEST FOR -1 WHICH MEANS USE CURRENT CONFIG (JUST REINIT) + LD A,D + AND E + INC A + JR Z,UART_INITDEV1 ; IF DE == -1, BYPASS UPDATE +; + ; UDPATE CONFIG BYTES + LD (IY + 4),E ; SAVE LOW WORD + LD (IY + 5),D ; SAVE HI WORD +; +UART_INITDEV1: ; START OF UART INITIALIZATION, SET BAUD RATE - LD A,80H - UART_OUTP(UART_LCR) ; DLAB ON CALL UART_COMPDIV ; COMPUTE DIVISOR TO BC + LD A,80H ; DLAB IS BIT 7 OF LCR + UART_OUTP(UART_LCR) ; DLAB ON LD A,B UART_OUTP(UART_DLM) ; SET DIVISOR (MS) LD A,C UART_OUTP(UART_DLL) ; SET DIVISOR (LS) - - ; SET LCR TO DEFAULT +; + ; SETUP FCR (DLAB MUST STILL BE ON FOR ACCESS TO BIT 5) + LD A,%00100111 ; FIFO ENABLE & RESET, 64 BYTE FIFO ENABLE ON 750+ + UART_OUTP(UART_FCR) ; DO IT +; + ; SETUP LCR TO DEFAULT (DLAB IS CLEARED) LD A,$03 ; DLAB OFF, 8 DATA, 1 STOP, NO PARITY UART_OUTP(UART_LCR) ; SAVE IT - - ; SET MCR TO DEFAULT - LD A,$03 ; DTR + RTS +; + ; SETUP MCR FROM FIRST CONFIG BYTE + LD A,(IY + 5) ; GET CONFIG BYTE + AND ~$1F ; REMOVE ENCODED BAUD RATE BITS + OR $03 ; FORCE RTS & DTR UART_OUTP(UART_MCR) ; SAVE IT - - LD A,(UART_TYPE) ; GET UART TYPE - CP UART_16550A ; 16550A OR BETTER? - JP C,UART_INITP1 ; NOPE, SKIP FIFO & AFC FEATURES - - LD B,0 ; START BY ASSUMING NO FIFOS, FCR=0 - LD A,(UART_FUNC) ; LOAD FIFO ENABLE REQUEST VALUE - BIT UART_FIFO,A ; TEST FOR FIFO REQUESTED - JR Z,UART_FIFO1 ; NOPE - LD B,$07 ; VALUE TO ENABLE AND RESET FIFOS - LD HL,UART_FEAT ; HL POINTS TO FEATURE FLAGS BYTE - SET UART_FIFO,(HL) ; RECORD FEATURE ENABLED -UART_FIFO1: - LD A,B ; MOVE VALUE TO A - UART_OUTP(UART_FCR) ; DO IT - - LD A,(UART_TYPE) ; GET UART TYPE - CP UART_16550C ; 16550C OR BETTER? - JR C,UART_INITP1 ; NOPE, SKIP AFC FEATURES - - ; BRANCH BASED ON TYPE AFC CONFIGURATION (EFR OR MCR) - LD A,(UART_TYPE) ; GET UART TYPE +; + ; SPECIAL HANDLING FOR AFC ON UARTS WITH EFR REGISTER + BIT 5,A ; IS FLOW CONTOL REQUESTED? + JR Z,UART_INITDEV3 ; NOPE, SKIP AHEAD +; + ; TEST FOR EFR CAPABLE CHIPS + LD A,(IY + 1) ; GET UART TYPE CP UART_16650 ; 16650? - JR Z,UART_AFC2 ; USE EFR REGISTER - CP UART_16850 ; 16750? - JR Z,UART_AFC2 ; USE EFR REGISTER - - ; SET AFC VIA MCR - LD B,$03 ; START WITH DEFAULT MCR - LD A,(UART_FUNC) ; LOAD AFC ENABLE REQUEST VALUE - BIT UART_AFC,A ; TEST FOR AFC REQUESTED - JR Z,UART_AFC1 ; NOPE - SET 5,B ; SET MCR BIT TO ENABLE AFC - LD HL,UART_FEAT ; HL POINTS TO FEATURE FLAGS BYTE - SET UART_AFC,(HL) ; RECORD FEATURE ENABLED -UART_AFC1: - LD A,B ; MOVE VALUE TO Ar - UART_OUTP(UART_MCR) ; SET AFC VALUE VIA MCR - JR UART_INITP1 ; AND CONTINUE - -UART_AFC2: ; SET AFC VIA EFR + JR Z,UART_INITDEV2 ; USE EFR REGISTER + CP UART_16850 ; 16850? + JR Z,UART_INITDEV2 ; USE EFR REGISTER + JR UART_INITDEV3 ; NO EFT, SKIP AHEAD +; +UART_INITDEV2: + ; WE HAVE AN EFR CAPABLE CHIP, SET AUTOFLOW + UART_INP(UART_LCR) ; GET CURRENT LCR VALUE + PUSH AF ; SAVE IT LD A,$BF ; VALUE TO ACCESS EFR UART_OUTP(UART_LCR) ; SET VALUE IN LCR - - LD B,0 ; ASSUME AFC OFF, EFR=0 - LD A,(UART_FUNC) ; LOAD AFC ENABLE REQUEST VALUE - BIT UART_AFC,A ; TEST FOR AFC REQUESTED - JR Z,UART_AFC3 ; NOPE - LD B,$C0 ; ENABLE CTS/RTS FLOW CONTROL - LD HL,UART_FEAT ; HL POINTS TO FEATURE FLAGS BYTE - SET UART_AFC,(HL) ; RECORD FEATURE ENABLED -UART_AFC3: - LD A,B ; MOVE VALUE TO A + LD A,$C0 ; ENABLE CTS/RTS FLOW CONTROL UART_OUTP(UART_EFR) ; SAVE IT - LD A,$03 ; NORMAL LCR VALUE - UART_OUTP(UART_LCR) ; SAVE IT - -UART_INITP1: + POP AF ; RECOVER ORIGINAL LCR VALUE + UART_OUTP(UART_LCR) ; AND SAVE IT +; +UART_INITDEV3: #IF (UART_DEBUG) PRTS(" [$") ; DEBUG: DUMP UART TYPE - LD A,(UART_TYPE) + LD A,(IY + 1) CALL PRTHEXBYTE ; DEBUG: DUMP IIR @@ -313,11 +287,14 @@ UART_INITP1: CALL PRTHEXBYTE ; DEBUG: DUMP EFR + UART_INP(UART_LCR) + PUSH AF LD A,$BF UART_OUTP(UART_LCR) UART_INP(UART_EFR) - PUSH AF - LD A,$03 + LD H,A + EX (SP),HL + LD A,H UART_OUTP(UART_LCR) POP AF CALL PC_SPACE @@ -325,65 +302,25 @@ UART_INITP1: PRTC(']') #ENDIF - - ; ANNOUNCE PORT - CALL NEWLINE ; FORMATTING - PRTS("UART$") ; FORMATTING - LD A,(IY) ; DEVICE NUM - CALL PRTDECB ; PRINT DEVICE NUM - PRTS(": IO=0x$") ; FORMATTING - LD A,(IY + 1) ; GET BASE PORT - CALL PRTHEXBYTE ; PRINT BASE PORT - ; PRINT THE UART TYPE - LD A,(UART_TYPE) - RLCA - LD HL,UART_TYPE_MAP - LD D,0 - LD E,A - ADD HL,DE ; HL NOW POINTS TO MAP ENTRY - LD A,(HL) - INC HL - LD D,(HL) - LD E,A ; HL NOW POINTS TO STRING - CALL PC_SPACE - CALL WRITESTR ; PRINT THE STRING + XOR A ; NOT IMPLEMENTED!!! + RET ; - ; ALL DONE IF NO UART WAS DETECTED - LD A,(UART_TYPE) - OR A - JR Z,UART_INITP3 ; - ; PRINT BAUD RATE - PRTS(" BAUD=$") -; CALL PRTDEC - - ; BAUD RATE -> DE:HL - PUSH IY ; DATA PTR - POP HL ; ... TO HL - INC HL - INC HL - INC HL - INC HL - CALL LD32 ; BAUD RATE -> DE:HL - LD BC,UART_INITBUF - CALL BIN2BCD - CALL PRTBCD -; - ; PRINT FEATURES ENABLED - LD A,(UART_FEAT) - BIT UART_FIFO,A - JR Z,UART_INITP2 - PRTS(" FIFO$") -UART_INITP2: - BIT UART_AFC,A - JR Z,UART_INITP3 - PRTS(" AFC$") -UART_INITP3: ; - RET +UART_QUERY: + LD E,(IY + 4) ; FIRST CONFIG BYTE TO E + LD D,(IY + 5) ; SECOND CONFIG BYTE TO D + XOR A ; SIGNAL SUCCESS + RET ; DONE +; ; -UART_INITBUF .FILL 5,0 ; WORKING BUFFER FOR BCD NUMBER +; +UART_DEVICE: + LD D,CIODEV_UART ; D := DEVICE TYPE + LD E,C ; E := PHYSICAL UNIT + XOR A ; SIGNAL SUCCESS + RET ; ; UART DETECTION ROUTINE ; @@ -452,10 +389,10 @@ UART_DETECT2: ; PICK BETWEEN 16550A/C JR UART_DETECT_16550C ; IS SET, SO 16550C ; UART_DETECT_NONE: - LD A,(IY + 1) - CP $68 + LD A,(IY + 2) ; BASE IO PORT + CP $68 ; IS THIS PRIMARY SBC PORT? JR Z,UART_DETECT_8250 ; SPECIAL CASE FOR PRIMARY UART! - LD A,UART_NONE + LD A,UART_NONE ; IF SO, TREAT AS 8250 NO MATTER WHAT RET ; UART_DETECT_8250: @@ -493,51 +430,108 @@ UART_DETECT_16850: ; COMPUTE DIVISOR TO BC ; UART_COMPDIV: - ; SETUP DE:HL WITH OSC FREQUENCY - ;LD DE,(UART_OSCHI) - ;LD HL,(UART_OSCLO) - LD DE,UARTOSC >> 16 ; GET HI WORD OF UART OSC FREQ - LD HL,UARTOSC & $FFFF ; GET LO WORD OF UART OSC FREQ - ; DIVIDE OSC FREQ BY PRESCALE FACTOR OF 16 - LD B,4 ; 4 ITERATIONS -UART_COMPDIV1: - SRL D - RR E - RR H - RR L - DJNZ UART_COMPDIV1 - ; CONVERT FROM DE:HL -> A:HL (THROW AWAY HIGH BYTE) - LD A,E - PUSH AF - PUSH HL - ; SETUP C:DE WITH TARGET BAUD RATE - ;LD BC,(UART_BAUDHI) - ;LD DE,(UART_BAUDLO) - PUSH IY - POP HL - INC HL - INC HL - INC HL - INC HL - CALL LD32 - PUSH DE - POP BC - EX DE,HL - ; RECOVER OSC FREQ IN A:HL - POP HL - POP AF - ; DIVIDE OSC FREQ AND BAUD BY 2 UNTIL FREQ FITS IN 16 BITS -UART_COMPDIV2: - SRL A - RR H - RR L - SRL C - RR D - RR E - OR A - JR NZ,UART_COMPDIV2 - ; DIVIDE ADJUSTED VALUES (OSC FREQ / BAUD RATE) - CALL DIV16 + ; WE WANT TO DETERMINE A DIVISOR FOR THE UART CLOCK + ; THAT RESULTS IN THE DESIRED BAUD RATE. + ; BAUD RATE = UART CLK / DIVISOR, OR TO SOLVE FOR DIVISOR + ; DIVISOR = UART CLK / BAUDRATE. + ; THE UART CLOCK IS THE UART OSC PRESCALED BY 16. ALSO, WE CAN + ; TAKE ADVANTAGE OF ENCODED BAUD RATES ALWAYS BEING A FACTOR OF 75. + ; SO, WE CAN USE (UART OSC / 16 / 75) / (BAUDRATE / 75) +; + ; FIRST WE DECODE THE BAUDRATE, BUT WE USE A CONSTANT OF 1 INSTEAD + ; OF THE NORMAL 75. THIS PRODUCES (BAUDRATE / 75). +; + LD A,(IY + 5) ; GET SECOND CONFIG BYTE + AND $1F ; ISOLATE ENCODED BAUD RATE + LD L,A ; PUT IN L + LD H,0 ; H IS ALWAYS ZERO + LD DE,1 ; USE 1 FOR ENCODING CONSTANT + CALL DECODE ; DE:HL := BAUD RATE, ERRORS IGNORED + EX DE,HL ; DE := (BAUDRATE / 75), DISCARD HL + LD HL,UARTOSC / 16 / 75 ; HL := (UART OSC / 16 / 75) + JP DIV16 ; BC := HL/DE == DIVISOR AND RETURN +; +; +; +UART_PRTCFG: + ; ANNOUNCE PORT + CALL NEWLINE ; FORMATTING + PRTS("UART$") ; FORMATTING + LD A,(IY) ; DEVICE NUM + CALL PRTDECB ; PRINT DEVICE NUM + PRTS(": IO=0x$") ; FORMATTING + LD A,(IY + 2) ; GET BASE PORT + CALL PRTHEXBYTE ; PRINT BASE PORT + + ; PRINT THE UART TYPE + CALL PC_SPACE ; FORMATTING + LD A,(IY + 1) ; GET UART TYPE BYTE + RLCA ; MAKE IT A WORD OFFSET + LD HL,UART_TYPE_MAP ; POINT HL TO TYPE MAP TABLE + CALL ADDHLA ; HL := ENTRY + LD E,(HL) ; DEREFERENCE + INC HL ; ... + LD D,(HL) ; ... TO GET STRING POINTER + CALL WRITESTR ; PRINT IT +; + ; ALL DONE IF NO UART WAS DETECTED + LD A,(IY + 1) ; GET UART TYPE BYTE + OR A ; SET FLAGS + RET Z ; IF ZERO, NOT PRESENT +; + ; PRINT BAUD RATE + CALL PC_SPACE + LD A,(IY + 5) ; GET SECOND CONFIG BYTE + AND $1F ; ISOLATE ENCODED BAUD RATE + LD L,A ; PUT IN L + LD H,0 ; H IS ALWAYS ZERO + LD DE,75 ; BAUD RATE DECODE CONSTANT + CALL DECODE ; DE:HL := BAUD RATE + LD BC,HB_BCDTMP ; POINT TO TEMP BCD BUF + CALL BIN2BCD ; CONVERT TO BCD + CALL PRTBCD ; AND PRINT IN DECIMAL +; + ; PRINT DATA BITS + CALL PC_COMMA ; FORMATTING + LD A,(IY + 4) ; GET CONFIG BYTE + AND $03 ; ISOLATE DATA BITS VALUE + ADD A,'5' ; CONVERT TO CHARACTER + CALL COUT ; AND PRINT +; + ; PRINT PARITY + CALL PC_COMMA ; FORMATTING + LD A,(IY + 4) ; GET CONFIG BYTE + RLCA ; SHIFT RELEVANT BITS + RLCA ; ... + RLCA ; ... + AND $07 ; AND ISOLATE DATA BITS VALUE + LD HL,UART_PAR_MAP ; CHARACTER LOOKUP TABLE + CALL ADDHLA ; APPLY OFFSET + LD A,(HL) ; GET CHARACTER + CALL COUT ; AND PRINT +; + ; PRINT STOP BITS + CALL PC_COMMA ; FORMATTING + LD A,(IY + 4) ; GET CONFIG BYTE + RLCA ; SHIFT RELEVANT BITS + RLCA ; ... + AND $01 ; AND ISOLATE DATA BITS VALUE + ADD A,'1' ; MAKE IT A CHARACTER + CALL COUT ; AND PRINT +; +;; +; ; PRINT FEATURES ENABLED +; LD A,(UART_FEAT) +; BIT UART_FIFO,A +; JR Z,UART_INITP2 +; PRTS(" FIFO$") +;UART_INITP2: +; BIT UART_AFC,A +; JR Z,UART_INITP3 +; PRTS(" AFC$") +;UART_INITP3: +; + XOR A RET ; ; ROUTINES TO READ/WRITE PORTS INDIRECTLY @@ -547,7 +541,7 @@ UART_COMPDIV2: UART_INP_IMP: EX (SP),HL ; SWAP HL AND TOS PUSH BC ; PRESERVE BC - LD A,(IY + 1) ; GET UART IO BASE PORT + LD A,(IY + 2) ; GET UART IO BASE PORT OR (HL) ; OR IN REGISTER ID BITS LD C,A ; C := PORT IN A,(C) ; READ PORT INTO A @@ -562,7 +556,7 @@ UART_OUTP_IMP: EX (SP),HL ; SWAP HL AND TOS PUSH BC ; PRESERVE BC LD B,A ; PUT VALUE TO WRITE IN B - LD A,(IY + 1) ; GET UART IO BASE PORT + LD A,(IY + 2) ; GET UART IO BASE PORT OR (HL) ; OR IN REGISTER ID BITS LD C,A ; C := PORT OUT (C),B ; WRITE VALUE TO PORT @@ -594,11 +588,10 @@ UART_STR_16650 .DB "16650$" UART_STR_16750 .DB "16750$" UART_STR_16850 .DB "16850$" ; +UART_PAR_MAP .DB "NONENMNS" +; ; WORKING VARIABLES ; -UART_TYPE .DB 0 ; UART TYPE DISCOVERED -UART_FUNC .DB 0 ; UART FUNCTIONS REQUESTED -UART_FEAT .DB 0 ; UART FEATURES DISCOVERED UART_DEV .DB 0 ; DEVICE NUM USED DURING INIT ; ; UART PORT TABLE @@ -606,65 +599,65 @@ UART_DEV .DB 0 ; DEVICE NUM USED DURING INIT UART_CFG: #IF (UARTCNT >= 1) .DB 0 ; DEVICE NUMBER (UPDATED DURING INIT) + .DB 0 ; UART TYPE .DB UART0IOB ; IO PORT BASE (RBR, THR) .DB UART0IOB + UART_LSR ; LINE STATUS PORT (LSR) - .DB UART0FEAT - .DW UART0BAUD & $FFFF - .DW UART0BAUD >> 16 + .DW UART0CFG ; LINE CONFIGURATION + .FILL 2,$FF ; FILLER #ENDIF #IF (UARTCNT >= 2) .DB 0 ; DEVICE NUMBER (UPDATED DURING INIT) - .DB UART1IOB ; IO PORT BASE + .DB 0 ; UART TYPE + .DB UART1IOB ; IO PORT BASE (RBR, THR) .DB UART1IOB + UART_LSR ; LINE STATUS PORT (LSR) - .DB UART1FEAT - .DW UART1BAUD & $FFFF - .DW UART1BAUD >> 16 + .DW UART1CFG ; LINE CONFIGURATION + .FILL 2,$FF ; FILLER #ENDIF #IF (UARTCNT >= 3) .DB 0 ; DEVICE NUMBER (UPDATED DURING INIT) - .DB UART2IOB ; IO PORT BASE + .DB 0 ; UART TYPE + .DB UART2IOB ; IO PORT BASE (RBR, THR) .DB UART2IOB + UART_LSR ; LINE STATUS PORT (LSR) - .DB UART2FEAT - .DW UART2BAUD & $FFFF - .DW UART2BAUD >> 16 + .DW UART2CFG ; LINE CONFIGURATION + .FILL 2,$FF ; FILLER #ENDIF #IF (UARTCNT >= 4) .DB 0 ; DEVICE NUMBER (UPDATED DURING INIT) - .DB UART3IOB ; IO PORT BASE + .DB 0 ; UART TYPE + .DB UART3IOB ; IO PORT BASE (RBR, THR) .DB UART3IOB + UART_LSR ; LINE STATUS PORT (LSR) - .DB UART3FEAT - .DW UART3BAUD & $FFFF - .DW UART3BAUD >> 16 + .DW UART3CFG ; LINE CONFIGURATION + .FILL 2,$FF ; FILLER #ENDIF #IF (UARTCNT >= 5) .DB 0 ; DEVICE NUMBER (UPDATED DURING INIT) - .DB UART4IOB ; IO PORT BASE + .DB 0 ; UART TYPE + .DB UART4IOB ; IO PORT BASE (RBR, THR) .DB UART4IOB + UART_LSR ; LINE STATUS PORT (LSR) - .DB UART4FEAT - .DW UART4BAUD & $FFFF - .DW UART4BAUD >> 16 + .DW UART4CFG ; LINE CONFIGURATION + .FILL 2,$FF ; FILLER #ENDIF #IF (UARTCNT >= 6) .DB 0 ; DEVICE NUMBER (UPDATED DURING INIT) - .DB UART5IOB ; IO PORT BASE + .DB 0 ; UART TYPE + .DB UART5IOB ; IO PORT BASE (RBR, THR) .DB UART5IOB + UART_LSR ; LINE STATUS PORT (LSR) - .DB UART5FEAT - .DW UART5BAUD & $FFFF - .DW UART5BAUD >> 16 + .DW UART5CFG ; LINE CONFIGURATION + .FILL 2,$FF ; FILLER #ENDIF #IF (UARTCNT >= 7) .DB 0 ; DEVICE NUMBER (UPDATED DURING INIT) - .DB UART6IOB ; IO PORT BASE + .DB 0 ; UART TYPE + .DB UART6IOB ; IO PORT BASE (RBR, THR) .DB UART6IOB + UART_LSR ; LINE STATUS PORT (LSR) - .DB UART6FEAT - .DW UART6BAUD & $FFFF - .DW UART6BAUD >> 16 + .DW UART6CFG ; LINE CONFIGURATION + .FILL 2,$FF ; FILLER #ENDIF #IF (UARTCNT >= 8) .DB 0 ; DEVICE NUMBER (UPDATED DURING INIT) - .DB UART7IOB ; IO PORT BASE + .DB 0 ; UART TYPE + .DB UART7IOB ; IO PORT BASE (RBR, THR) .DB UART7IOB + UART_LSR ; LINE STATUS PORT (LSR) - .DB UART7FEAT - .DW UART7BAUD & $FFFF - .DW UART7BAUD >> 16 + .DW UART7CFG ; LINE CONFIGURATION + .FILL 2,$FF ; FILLER #ENDIF