From 398dec28e9a9fe9469104d6933e2092874fe8764 Mon Sep 17 00:00:00 2001 From: b1ackmai1er <39449559+b1ackmai1er@users.noreply.github.com> Date: Sun, 29 Jul 2018 17:34:20 +0800 Subject: [PATCH] Add basic support for configurable port and baud --- Source/HBIOS/sio.asm | 423 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 411 insertions(+), 12 deletions(-) diff --git a/Source/HBIOS/sio.asm b/Source/HBIOS/sio.asm index 842b54b7..75ccdaf3 100644 --- a/Source/HBIOS/sio.asm +++ b/Source/HBIOS/sio.asm @@ -10,26 +10,421 @@ ; F E D C B A 9 8 7 6 5 4 3 2 1 0 ; -- MSB (D REGISTER) -- -- LSB (E REGISTER) -- ; -SIO_DEBUG .EQU FALSE ; SIO_NONE .EQU 0 SIO_SIO .EQU 1 ; #IF (SIOMODE == SIOMODE_RC) -SIOA_CMD .EQU $80 -SIOA_DAT .EQU $81 -SIOB_CMD .EQU $82 -SIOB_DAT .EQU $83 +SIOA_CMD .EQU SIOBASE + $00 ;PS +SIOA_DAT .EQU SIOBASE + $01 ;PS +SIOB_CMD .EQU SIOBASE + $02 ;PS +SIOB_DAT .EQU SIOBASE + $03 ;PS +SIO_WR4 .EQU $C4 ;PS CLK/64=115200 BAUD, NO PARITY, 1 STOP BIT ; 11000100 11=*64 00=8bit sync character 01=1 stop bit 0 = parity even/odd 0=parity disabled #ENDIF ; #IF (SIOMODE == SIOMODE_SMB) -SIOA_CMD .EQU $82 -SIOA_DAT .EQU $80 -SIOB_CMD .EQU $83 -SIOB_DAT .EQU $81 +SIOA_CMD .EQU SIOBASE + $02 ;PS +SIOA_DAT .EQU SIOBASE + $00 ;PS +SIOB_CMD .EQU SIOBASE + $03 ;PS +SIOB_WR4 .EQU SIOBASE + $01 ;PS +SIO_CFG .EQU $C4 ;PS CLK/64=115200 BAUD, NO PARITY, 1 STOP BIT ; 11000100 11=*64 00=8bit sync character 01=1 stop bit 0 = parity even/odd 0=parity disabled #ENDIF ; +#IF (SIOMODE == SIOMODE_ZP) ;PS +SIOA_CMD .EQU SIOBASE + $06 ;PS +SIOA_DAT .EQU SIOBASE + $04 ;PS +SIOB_CMD .EQU SIOBASE + $07 ;PS +SIOB_DAT .EQU SIOBASE + $05 ;PS +SIO_WR4 .EQU $44 ;PS CLK/16=38400 BAUD, NO PARITY, 1 STOP BIT ; PS 01000100 10=*16 00=8bit sync character 01=1 stop bit 0 = parity even/odd 0=parity disabled +#ENDIF ;PS ; + +#IF (DEFSIOCLK/DEFSIODIV/1 == 75) +SIOBAUD1 .EQU 0 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/1 == 150) +SIOBAUD1 .EQU 1 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/1 == 300) +SIOBAUD1 .EQU 2 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/1 == 600) +SIOBAUD1 .EQU 3 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/1 == 1200) +SIOBAUD1 .EQU 4 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/1 == 2400) +SIOBAUD1 .EQU 5 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/1 == 4800) +SIOBAUD1 .EQU 6 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/1 == 9600) +SIOBAUD1 .EQU 7 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/1 == 19200) +SIOBAUD1 .EQU 8 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/1 == 38400) +SIOBAUD1 .EQU 9 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/1 == 76800) +SIOBAUD1 .EQU 10 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/1 == 153600) +SIOBAUD1 .EQU 11 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/1 == 307200) +SIOBAUD1 .EQU 12 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/1 == 614400) +SIOBAUD1 .EQU 13 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/1 =1228800) +SIOBAUD1 .EQU 14 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/1 =2457600) +SIOBAUD1 .EQU 15 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/1 == 225) +SIOBAUD1 .EQU 16 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/1 == 450) +SIOBAUD1 .EQU 17 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/1 == 900) +SIOBAUD1 .EQU 18 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/1 == 1800) +SIOBAUD1 .EQU 19 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/1 == 3600) +SIOBAUD1 .EQU 20 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/1 == 7200) +SIOBAUD1 .EQU 21 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/1 == 14400) +SIOBAUD1 .EQU 22 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/1 == 28800) +SIOBAUD1 .EQU 23 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/1 == 57600) +SIOBAUD1 .EQU 24 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/1 == 115200) +SIOBAUD1 .EQU 25 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/1 == 230400) +SIOBAUD1 .EQU 26 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/1 == 921600) +SIOBAUD1 .EQU 28 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/1 =1843200) +SIOBAUD1 .EQU 29 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/1 =3686400) +SIOBAUD1 .EQU 30 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/1 =7372800) +SIOBAUD1 .EQU 31 +#ENDIF + + +#IF (DEFSIOCLK/DEFSIODIV/16 == 75) +SIOBAUD1 .EQU 0 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/16 == 150) +SIOBAUD2 .EQU 1 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/16 == 300) +SIOBAUD2 .EQU 2 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/16 == 600) +SIOBAUD2 .EQU 3 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/16 == 1200) +SIOBAUD2 .EQU 4 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/16 == 2400) +SIOBAUD2 .EQU 5 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/16 == 4800) +SIOBAUD2 .EQU 6 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/16 == 9600) +SIOBAUD2 .EQU 7 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/16 == 19200) +SIOBAUD2 .EQU 8 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/16 == 38400) +SIOBAUD2 .EQU 9 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/16 == 76800) +SIOBAUD2 .EQU 10 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/16 == 153600) +SIOBAUD2 .EQU 11 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/16 == 307200) +SIOBAUD2 .EQU 12 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/16 == 614400) +SIOBAUD2 .EQU 13 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/16 =1228800) +SIOBAUD2 .EQU 14 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/16 =2457600) +SIOBAUD2 .EQU 15 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/16 == 225) +SIOBAUD2 .EQU 16 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/16 == 450) +SIOBAUD2 .EQU 17 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/16 == 900) +SIOBAUD2 .EQU 18 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/16 == 1800) +SIOBAUD2 .EQU 19 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/16 == 3600) +SIOBAUD2 .EQU 20 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/16 == 7200) +SIOBAUD2 .EQU 21 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/16 == 14400) +SIOBAUD2 .EQU 22 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/16 == 28800) +SIOBAUD2 .EQU 23 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/16 == 57600) +SIOBAUD2 .EQU 24 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/16 == 115200) +SIOBAUD2 .EQU 25 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/16 == 230400) +SIOBAUD2 .EQU 26 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/16 == 460800) +SIOBAUD2 .EQU 27 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/16 == 921600) +SIOBAUD2 .EQU 28 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/16 ==1843200) +SIOBAUD2 .EQU 29 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/16 ==3686400) +SIOBAUD2 .EQU 30 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/16 ==7372800) +SIOBAUD2 .EQU 31 +#ENDIF + +#IF (DEFSIOCLK/DEFSIODIV/32== 75) +SIOBAUD3 .EQU 0 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/32== 150) +SIOBAUD3 .EQU 1 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/32== 300) +SIOBAUD3 .EQU 2 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/32== 600) +SIOBAUD3 .EQU 3 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/32== 1200) +SIOBAUD3 .EQU 4 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/32== 2400) +SIOBAUD3 .EQU 5 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/32== 4800) +SIOBAUD3 .EQU 6 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/32== 9600) +SIOBAUD3 .EQU 7 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/32== 19200) +SIOBAUD3 .EQU 8 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/32== 38400) +SIOBAUD3 .EQU 9 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/32== 76800) +SIOBAUD3 .EQU 10 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/32== 153600) +SIOBAUD3 .EQU 11 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/32== 307200) +SIOBAUD3 .EQU 12 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/32== 614400) +SIOBAUD3 .EQU 13 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/32==1228800) +SIOBAUD3 .EQU 14 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/32==2457600) +SIOBAUD3 .EQU 15 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/32== 225) +SIOBAUD3 .EQU 16 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/32== 450) +SIOBAUD3 .EQU 17 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/32== 900) +SIOBAUD3 .EQU 18 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/32== 1800) +SIOBAUD3 .EQU 19 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/32== 3600) +SIOBAUD3 .EQU 20 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/32== 7200) +SIOBAUD3 .EQU 21 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/32== 14400) +SIOBAUD3 .EQU 22 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/32== 28800) +SIOBAUD3 .EQU 23 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/32== 57600) +SIOBAUD3 .EQU 24 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/32= 115200) +SIOBAUD3 .EQU 25 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/32= 230400) +SIOBAUD3 .EQU 26 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/32== 460800) +SIOBAUD3 .EQU 27 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/32== 921600) +SIOBAUD3 .EQU 28 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/32==1843200) +SIOBAUD3 .EQU 29 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/32==3686400) +SIOBAUD3 .EQU 30 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/32==7372800) +SIOBAUD3 .EQU 31 +#ENDIF + +#IF (DEFSIOCLK/DEFSIODIV/64== 75) +SIOBAUD4 .EQU 0 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/64== 150) +SIOBAUD4 .EQU 1 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/64== 300) +SIOBAUD4 .EQU 2 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/64== 600) +SIOBAUD4 .EQU 3 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/64== 1200) +SIOBAUD4 .EQU 4 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/64== 2400) +SIOBAUD4 .EQU 5 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/64== 4800) +SIOBAUD4 .EQU 6 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/64== 9600) +SIOBAUD4 .EQU 7 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/64== 19200) +SIOBAUD4 .EQU 8 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/64== 38400) +SIOBAUD4 .EQU 9 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/64== 76800) +SIOBAUD4 .EQU 10 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/64== 153600) +SIOBAUD4 .EQU 11 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/64== 307200) +SIOBAUD4 .EQU 12 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/64== 614400) +SIOBAUD4 .EQU 13 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/64==1228800) +SIOBAUD4 .EQU 14 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/64==2457600) +SIOBAUD4 .EQU 15 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/64== 225) +SIOBAUD4 .EQU 16 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/64== 450) +SIOBAUD4 .EQU 17 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/64== 900) +SIOBAUD4 .EQU 18 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/64== 1800) +SIOBAUD4 .EQU 19 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/64== 3600) +SIOBAUD4 .EQU 20 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/64== 7200) +SIOBAUD4 .EQU 21 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/64== 14400) +SIOBAUD4 .EQU 22 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/64== 28800) +SIOBAUD4 .EQU 23 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/64== 57600) +SIOBAUD4 .EQU 24 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/64== 115200) +SIOBAUD4 .EQU 25 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/64== 230400) +SIOBAUD4 .EQU 26 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/64== 460800) +SIOBAUD4 .EQU 27 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/64== 921600) +SIOBAUD4 .EQU 28 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/64==1843200) +SIOBAUD4 .EQU 29 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/64==3686400) +SIOBAUD4 .EQU 30 +#ENDIF +#IF (DEFSIOCLK/DEFSIODIV/64==7372800) +SIOBAUD4 .EQU 31 +#ENDIF + ; SIO_PREINIT: ; @@ -314,6 +709,10 @@ SIO_OUT: #IF (SIOMODE == SIOMODE_SMB) DEC C ; DECREMENT CMD PORT TWICE TO GET DATA PORT DEC C +#ENDIF +#IF (SIOMODE == SIOMODE_ZP) + DEC C ; DECREMENT CMD PORT TWICE TO GET DATA PORT + DEC C #ENDIF OUT (C),E ; SEND CHAR FROM E XOR A ; SIGNAL SUCCESS @@ -393,7 +792,7 @@ SIO_INITDEV: ; SIO_INITVALS: .DB $00, $18 ; WR0: CHANNEL RESET - .DB $04, $C4 ; WR4: CLK/64=115200 BAUD, NO PARITY, 1 STOP BIT + .DB $04, $SIO_WR4 ; WR4: CLK BAUD PARITY STOP BIT ; PST .DB $01, $18 ; WR1: INTERRUPT ON ALL RECEIVE CHARACTERS .DB $02, IVT_SER0 ; WR2: INTERRUPT VECTOR OFFSET .DB $03, $C1 ; WR3: 8 BIT RCV, RX ENABLE @@ -508,7 +907,7 @@ SIO_CFG: .DB 0 ; SIO TYPE (SET DURING INIT) .DB 0 ; SIO CHANNEL (A) .DB SIOA_CMD ; BASE PORT (CMD PORT) - .DW DEFSERCFG ; LINE CONFIGURATION + .DW DEFSIOACFG ; LINE CONFIGURATION .DW SIOA_RCVBUF ; POINTER TO RCV BUFFER STRUCT ; ; SIO/2 CHANNEL B @@ -516,7 +915,7 @@ SIO_CFG: .DB 0 ; SIO TYPE (SET DURING INIT) .DB 1 ; SIO CHANNEL (B) .DB SIOB_CMD ; BASE PORT (CMD PORT) - .DW DEFSERCFG ; LINE CONFIGURATION + .DW DEFSIOBCFG ; LINE CONFIGURATION .DW SIOB_RCVBUF ; POINTER TO RCV BUFFER STRUCT ; SIO_CNT .EQU ($ - SIO_CFG) / 8