From 0a2654a7618297508f03af28ed9eb2331eb4ec60 Mon Sep 17 00:00:00 2001 From: b1ackmai1er <39449559+b1ackmai1er@users.noreply.github.com> Date: Sun, 29 Jul 2018 14:33:56 +0800 Subject: [PATCH 01/14] Add definable base address for SIO --- Source/HBIOS/plt_rc.inc | 1 + 1 file changed, 1 insertion(+) diff --git a/Source/HBIOS/plt_rc.inc b/Source/HBIOS/plt_rc.inc index b9b1764e..6ca2d4b6 100644 --- a/Source/HBIOS/plt_rc.inc +++ b/Source/HBIOS/plt_rc.inc @@ -8,3 +8,4 @@ MPGSEL_3 .EQU $7B ; BANK_3 PAGE SELECT REGISTER (WRITE ONLY) MPGENA .EQU $7C ; PAGING ENABLE REGISTER - BIT 0 = 1 (WRITE ONLY) ; RTC .EQU $C0 ; RTC PORT address +ZSIOBASE .EQU $80 ; RC OR SMB SIO DEFAULT From 490e3e49f8ef5ccc6ba8da11b360b8815ecc4485 Mon Sep 17 00:00:00 2001 From: b1ackmai1er <39449559+b1ackmai1er@users.noreply.github.com> Date: Sun, 29 Jul 2018 14:48:01 +0800 Subject: [PATCH 02/14] Add definable base address for SIO --- Source/HBIOS/plt_sbc.inc | 1 + 1 file changed, 1 insertion(+) diff --git a/Source/HBIOS/plt_sbc.inc b/Source/HBIOS/plt_sbc.inc index e74806a2..d0795108 100644 --- a/Source/HBIOS/plt_sbc.inc +++ b/Source/HBIOS/plt_sbc.inc @@ -19,3 +19,4 @@ MPGENA .EQU SBC_BASE + $1C ; PAGING ENABLE REGISTER - BIT 0 = 1 (WRITE ONLY) ; RTC .EQU SBC_BASE + $10 ; ADDRESS OF RTC LATCH AND INPUT PORT PPIBASE .EQU SBC_BASE + $00 ; PPI 82C55 I/O IS DECODED TO PORT 60-67 +SIOBASE .EQU $B0 ; ZILOG PERIPHERALS DEFAULT ;PS From d93a85c1d459fc049ab05e20a9c3a6589dc5451a Mon Sep 17 00:00:00 2001 From: b1ackmai1er <39449559+b1ackmai1er@users.noreply.github.com> Date: Sun, 29 Jul 2018 15:05:56 +0800 Subject: [PATCH 03/14] Add equated for configurable SIO platform and and missing serial baud rate equates --- Source/HBIOS/std.asm | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/Source/HBIOS/std.asm b/Source/HBIOS/std.asm index 96cd946a..e2e497d5 100644 --- a/Source/HBIOS/std.asm +++ b/Source/HBIOS/std.asm @@ -139,6 +139,8 @@ SER_STOP2 .EQU 1 << 2 ; SERIAL BAUD RATES ENCODED AS V = 75 * 2^X * 3^Y ; AND STORED AS 5 BITS: YXXXX ; +SER_BAUD75 .EQU $00 << 8 ;PS +SER_BAUD150 .EQU $01 << 8 ;PS SER_BAUD300 .EQU $02 << 8 SER_BAUD600 .EQU $03 << 8 SER_BAUD1200 .EQU $04 << 8 @@ -148,14 +150,35 @@ SER_BAUD9600 .EQU $07 << 8 SER_BAUD19200 .EQU $08 << 8 SER_BAUD38400 .EQU $09 << 8 SER_BAUD76800 .EQU $0A << 8 +SER_BAUD153600 .EQU $0B << 8 ;PS +SER_BAUD307200 .EQU $0C << 8 ;PS +SER_BAUD614400 .EQU $0D << 8 ;PS +SER_BAUD1228800 .EQU $0E << 8 ;PS +SER_BAUD2457600 .EQU $0F << 8 ;PS +SER_BAUD225 .EQU $10 << 8 ;PS +SER_BAUD450 .EQU $11 << 8 ;PS +SER_BAUD900 .EQU $12 << 8 ;PS +SER_BAUD1800 .EQU $13 << 8 ;PS +SER_BAUD3600 .EQU $14 << 8 ;PS +SER_BAUD7200 .EQU $15 << 8 ;PS +SER_BAUD14400 .EQU $16 << 8 ;PS +SER_BAUD28800 .EQU $17 << 8 ;PS +SER_BAUD57600 .EQU $18 << 8 ;PS + SER_BAUD115200 .EQU $19 << 8 SER_BAUD230400 .EQU $1A << 8 SER_BAUD460800 .EQU $1B << 8 +SER_BAUD921600 .EQU $1C << 8 ;PS +SER_BAUD1843200 .EQU $1D << 8 ;PS +SER_BAUD3686400 .EQU $1E << 8 ;PS +SER_BAUD7372800 .EQU $1F << 8 ;PS ; SER_XON .EQU 1 << 6 SER_DTR .EQU 1 << 7 SER_RTS .EQU 1 << 13 ; +SER_75_8N1 .EQU SER_BAUD75 | SER_DATA8 | SER_PARNONE | SER_STOP1 ;PS +SER_150_8N1 .EQU SER_BAUD150 | SER_DATA8 | SER_PARNONE | SER_STOP1 ;PS 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 @@ -165,9 +188,27 @@ 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_153600_8N1 .EQU SER_BAUD153600 | SER_DATA8 | SER_PARNONE | SER_STOP1 ;PS +SER_307200_8N1 .EQU SER_BAUD307200 | SER_DATA8 | SER_PARNONE | SER_STOP1 ;PS +SER_614400_8N1 .EQU SER_BAUD614400 | SER_DATA8 | SER_PARNONE | SER_STOP1 ;PS +SER_1228800_8N1 .EQU SER_BAUD1228800 | SER_DATA8 | SER_PARNONE | SER_STOP1 ;PS +SER_2457600_8N1 .EQU SER_BAUD2457600 | SER_DATA8 | SER_PARNONE | SER_STOP1 ;PS +SER_225_8N1 .EQU SER_BAUD225 | SER_DATA8 | SER_PARNONE | SER_STOP1 ;PS +SER_450_8N1 .EQU SER_BAUD450 | SER_DATA8 | SER_PARNONE | SER_STOP1 ;PS +SER_900_8N1 .EQU SER_BAUD900 | SER_DATA8 | SER_PARNONE | SER_STOP1 ;PS +SER_1800_8N1 .EQU SER_BAUD1800 | SER_DATA8 | SER_PARNONE | SER_STOP1 ;PS +SER_3600_8N1 .EQU SER_BAUD3600 | SER_DATA8 | SER_PARNONE | SER_STOP1 ;PS +SER_7200_8N1 .EQU SER_BAUD7200 | SER_DATA8 | SER_PARNONE | SER_STOP1 ;PS +SER_14400_8N1 .EQU SER_BAUD14400 | SER_DATA8 | SER_PARNONE | SER_STOP1 ;PS +SER_28800_8N1 .EQU SER_BAUD28800 | SER_DATA8 | SER_PARNONE | SER_STOP1 ;PS +SER_57600_8N1 .EQU SER_BAUD57600 | SER_DATA8 | SER_PARNONE | SER_STOP1 ;PS SER_115200_8N1 .EQU SER_BAUD115200 | SER_DATA8 | SER_PARNONE | SER_STOP1 SER_230400_8N1 .EQU SER_BAUD230400 | SER_DATA8 | SER_PARNONE | SER_STOP1 SER_460800_8N1 .EQU SER_BAUD460800 | SER_DATA8 | SER_PARNONE | SER_STOP1 +SER_921600_8N1 .EQU SER_BAUD921600 | SER_DATA8 | SER_PARNONE | SER_STOP1 ;PS +SER_1843200_8N1 .EQU SER_BAUD1843200 | SER_DATA8 | SER_PARNONE | SER_STOP1 ;PS +SER_3686400_8N1 .EQU SER_BAUD3686400 | SER_DATA8 | SER_PARNONE | SER_STOP1 ;PS +SER_7372800_8N1 .EQU SER_BAUD7372800 | SER_DATA8 | SER_PARNONE | SER_STOP1 ;PS ; ; INTERRUPT VECTOR TABLE ENTRY OFFSETS (Z180 COMPATIBLE) ; From 0010dc8c819bca10f344efa3dda784b8439e4950 Mon Sep 17 00:00:00 2001 From: b1ackmai1er <39449559+b1ackmai1er@users.noreply.github.com> Date: Sun, 29 Jul 2018 15:46:46 +0800 Subject: [PATCH 04/14] Add Config defaults for multiplatform SIO --- Source/HBIOS/cfg_rc.asm | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/Source/HBIOS/cfg_rc.asm b/Source/HBIOS/cfg_rc.asm index 148a3f42..5ceec867 100644 --- a/Source/HBIOS/cfg_rc.asm +++ b/Source/HBIOS/cfg_rc.asm @@ -23,10 +23,16 @@ DSRTCMODE .EQU DSRTCMODE_STD ; DSRTCMODE_STD, DSRTCMODE_MFPIC ASCIENABLE .EQU FALSE ; TRUE FOR Z180 ASCI SUPPORT UARTENABLE .EQU FALSE ; TRUE FOR UART SUPPORT (ALMOST ALWAYS WANT THIS TO BE TRUE) UARTOSC .EQU 1843200 ; UART OSC FREQUENCY -SIOENABLE .EQU TRUE ; TRUE FOR ZILOG SIO/2 SUPPORT -SIOMODE .EQU SIOMODE_RC ; SIOMODE_RC, SIOMODE_SMB ACIAENABLE .EQU TRUE ; TRUE FOR MOTOROLA 6850 ACIA SUPPORT ; +SIOENABLE .EQU TRUE ; TRUE FOR ZILOG SIO SUPPORT ;PS +SIOMODE .EQU SIOMODE_RC ; SIOMODE_RC, SIOMODE_SMB, SIOMODE_ZP ;PS +DEFSIOACFG .EQU DEFSERCFG ; DEFAULT SERIAL LINE CONFIG ;PS +DEFSIOBCFG .EQU DEFSERCFG ; DEFAULT SERIAL LINE CONFIG ;PS +DEFSIODIV .EQU 1 ; 1=RC2014/SMB, 2/4/8/16/32/64/128/256=ZP depending on jumper X5 ;PS +DEFSIOCLK .EQU CPUOSC ; 2457600/4915200=ZP,7372800=RC/SMB - SIO FIXED OSC FREQUENCY ;PS +SIODEBUG .EQU FALSE ;PS +; VDUENABLE .EQU FALSE ; TRUE FOR VDU BOARD SUPPORT CVDUENABLE .EQU FALSE ; TRUE FOR CVDU BOARD SUPPORT NECENABLE .EQU FALSE ; TRUE FOR uPD7220 BOARD SUPPORT From 6d7ac7a06c95fe98e7765df74371b4e1a6ce6c0d Mon Sep 17 00:00:00 2001 From: b1ackmai1er <39449559+b1ackmai1er@users.noreply.github.com> Date: Sun, 29 Jul 2018 16:23:56 +0800 Subject: [PATCH 05/14] Add Config defaults for multiplatform SIO --- Source/HBIOS/cfg_sbc.asm | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/Source/HBIOS/cfg_sbc.asm b/Source/HBIOS/cfg_sbc.asm index 2e0750fa..ad320eed 100644 --- a/Source/HBIOS/cfg_sbc.asm +++ b/Source/HBIOS/cfg_sbc.asm @@ -8,7 +8,7 @@ CPUOSC .EQU 8000000 ; CPU OSC FREQ RAMSIZE .EQU 512 ; SIZE OF RAM IN KB, MUST MATCH YOUR HARDWARE!!! DEFSERCFG .EQU SER_38400_8N1 ; DEFAULT SERIAL LINE CONFIG (SHOULD MATCH ABOVE) -INTMODE .EQU 0 ; 0=NONE, 1=INT MODE 1, 2=INT MODE 2 +INTMODE .EQU 1 ; 0=NONE, 1=INT MODE 1, 2=INT MODE 2 ; CRTACT .EQU FALSE ; CRT ACTIVATION AT STARTUP VDAEMU .EQU EMUTYP_ANSI ; DEFAULT VDA EMULATION (EMUTYP_TTY, EMUTYP_ANSI, ...) @@ -23,10 +23,16 @@ DSRTCMODE .EQU DSRTCMODE_STD ; DSRTCMODE_STD, DSRTCMODE_MFPIC ASCIENABLE .EQU FALSE ; TRUE FOR Z180 ASCI SUPPORT UARTENABLE .EQU TRUE ; TRUE FOR UART SUPPORT (ALMOST ALWAYS WANT THIS TO BE TRUE) UARTOSC .EQU 1843200 ; UART OSC FREQUENCY -SIOENABLE .EQU FALSE ; TRUE FOR ZILOG SIO/2 SUPPORT -SIOMODE .EQU SIOMODE_RC ; SIOMODE_RC, SIOMODE_SMB ACIAENABLE .EQU FALSE ; TRUE FOR MOTOROLA 6850 ACIA SUPPORT ; +SIOENABLE .EQU TRUE ; TRUE FOR ZILOG SIO SUPPORT ;PS +SIOMODE .EQU SIOMODE_ZP ; SIOMODE_RC, SIOMODE_SMB, SIOMODE_ZP ;PS +DEFSIOACFG .EQU SER_9600_8N1 ; DEFAULT SERIAL LINE CONFIG ;PS +DEFSIOBCFG .EQU SER_9600_8N1 ; DEFAULT SERIAL LINE CONFIG ;PS +DEFSIODIV .EQU 8 ; 1=RC2014, SMB, 2/4/8/16/32/64/128/256 for ZP depending on jumper X5 ;PS +DEFSIOCLK .EQU 4915200 ; 2457600/4915200=ZP,7372800=RC/SMB - SIO FIXED OSC FREQUENCY ;PS +SIODEBUG .EQU TRUE ;PS +; VDUENABLE .EQU FALSE ; TRUE FOR VDU BOARD SUPPORT CVDUENABLE .EQU FALSE ; TRUE FOR CVDU BOARD SUPPORT NECENABLE .EQU FALSE ; TRUE FOR uPD7220 BOARD SUPPORT From f1448fde6ecc541cf62150d3ee615a2e033c4bc3 Mon Sep 17 00:00:00 2001 From: b1ackmai1er <39449559+b1ackmai1er@users.noreply.github.com> Date: Sun, 29 Jul 2018 17:12:04 +0800 Subject: [PATCH 06/14] Add basic support for configurable port and baud --- sio.asm | 921 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 921 insertions(+) create mode 100644 sio.asm diff --git a/sio.asm b/sio.asm new file mode 100644 index 00000000..75ccdaf3 --- /dev/null +++ b/sio.asm @@ -0,0 +1,921 @@ +; +;================================================================================================== +; SIO DRIVER (SERIAL PORT) +;================================================================================================== +; +; SETUP PARAMETER WORD: +; +-------+---+-------------------+ +---+---+-----------+---+-------+ +; | |RTS| ENCODED BAUD RATE | |DTR|XON| PARITY |STP| 8/7/6 | +; +-------+---+---+---------------+ ----+---+-----------+---+-------+ +; F E D C B A 9 8 7 6 5 4 3 2 1 0 +; -- MSB (D REGISTER) -- -- LSB (E REGISTER) -- +; +; +SIO_NONE .EQU 0 +SIO_SIO .EQU 1 +; +#IF (SIOMODE == SIOMODE_RC) +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 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: +; +; SETUP THE DISPATCH TABLE ENTRIES +; + LD B,SIO_CNT ; LOOP CONTROL + LD C,0 ; PHYSICAL UNIT INDEX + XOR A ; ZERO TO ACCUM + LD (SIO_DEV),A ; CURRENT DEVICE NUMBER +SIO_PREINIT0: + PUSH BC ; SAVE LOOP CONTROL + LD A,C ; PHYSICAL UNIT TO A + RLCA ; MULTIPLY BY CFG TABLE ENTRY SIZE (8 BYTES) + RLCA ; ... + RLCA ; ... TO GET OFFSET INTO CFG TABLE + LD HL,SIO_CFG ; POINT TO START OF CFG TABLE + CALL ADDHLA ; HL := ENTRY ADDRESS + PUSH HL ; SAVE IT + PUSH HL ; COPY CFG DATA PTR + POP IY ; ... TO IY + CALL SIO_INITUNIT ; HAND OFF TO GENERIC INIT CODE + POP DE ; GET ENTRY ADDRESS BACK, BUT PUT IN DE + POP BC ; RESTORE LOOP CONTROL +; + LD A,(IY + 1) ; GET THE SIO TYPE DETECTED + OR A ; SET FLAGS + JR Z,SIO_PREINIT2 ; SKIP IT IF NOTHING FOUND +; + PUSH BC ; SAVE LOOP CONTROL + LD BC,SIO_FNTBL ; BC := FUNCTION TABLE ADDRESS + CALL NZ,CIO_ADDENT ; ADD ENTRY IF SIO FOUND, BC:DE + POP BC ; RESTORE LOOP CONTROL +; +SIO_PREINIT2: + INC C ; NEXT PHYSICAL UNIT + DJNZ SIO_PREINIT0 ; LOOP UNTIL DONE +; +#IF (INTMODE == 1) + ; ADD IM1 INT CALL LIST ENTRY IF APPROPRIATE + LD A,(SIO_DEV) ; GET NEXT DEVICE NUM + OR A ; SET FLAGS + JR Z,SIO_PREINIT3 ; IF ZERO, NO SIO DEVICES + LD HL,SIO_INT ; GET INT VECTOR + CALL HB_ADDIM1 ; ADD TO IM1 CALL LIST +#ENDIF +; +#IF (INTMODE == 2) + ; SETUP SIO INTERRUPT VECTOR IN IVT + LD HL,INT_SIO + LD (HBX_IVT + IVT_SER0),HL +#ENDIF +; +SIO_PREINIT3: + XOR A ; SIGNAL SUCCESS + RET ; AND RETURN +; +; SIO INITIALIZATION ROUTINE +; +SIO_INITUNIT: + CALL SIO_DETECT ; DETERMINE SIO TYPE + LD (IY + 1),A ; SAVE IN CONFIG TABLE + OR A ; SET FLAGS + RET Z ; ABORT IF NOTHING THERE + + ; UPDATE WORKING SIO DEVICE NUM + LD HL,SIO_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 + JP SIO_INITDEV ; IMPLEMENT IT AND RETURN +; +; +; +SIO_INIT: + LD B,SIO_CNT ; COUNT OF POSSIBLE SIO UNITS + LD C,0 ; INDEX INTO SIO CONFIG TABLE +SIO_INIT1: + PUSH BC ; SAVE LOOP CONTROL + + LD A,C ; PHYSICAL UNIT TO A + RLCA ; MULTIPLY BY CFG TABLE ENTRY SIZE (8 BYTES) + RLCA ; ... + RLCA ; ... TO GET OFFSET INTO CFG TABLE + LD HL,SIO_CFG ; POINT TO START OF CFG TABLE + CALL ADDHLA ; HL := ENTRY ADDRESS + PUSH HL ; COPY CFG DATA PTR + POP IY ; ... TO IY + + LD A,(IY + 1) ; GET SIO TYPE + OR A ; SET FLAGS + CALL NZ,SIO_PRTCFG ; PRINT IF NOT ZERO + + POP BC ; RESTORE LOOP CONTROL + INC C ; NEXT UNIT + DJNZ SIO_INIT1 ; LOOP TILL DONE +; + XOR A ; SIGNAL SUCCESS + RET ; DONE +; +; INTERRUPT HANDLER +; +SIO_INT: +SIOA_INT: + ; CHECK FOR RECEIVE PENDING ON CHANNEL A + XOR A ; A := 0 + OUT (SIOA_CMD),A ; ADDRESS RD0 + IN A,(SIOA_CMD) ; GET RD0 + AND $01 ; ISOLATE RECEIVE READY BIT + JR Z,SIOB_INT ; CHECK CHANNEL B +; +SIOA_INT00: + ; HANDLE CHANNEL A + IN A,(SIOA_DAT) ; READ PORT + LD E,A ; SAVE BYTE READ + LD A,(SIOA_CNT) ; GET CURRENT BUFFER USED COUNT + CP SIOA_BUFSZ ; COMPARE TO BUFFER SIZE + RET Z ; BAIL OUT IF BUFFER FULL, RCV BYTE DISCARDED + INC A ; INCREMENT THE COUNT + LD (SIOA_CNT),A ; AND SAVE IT + CP SIOA_BUFSZ - 5 ; BUFFER GETTING FULL? + JR NZ,SIOA_INT0 ; IF NOT, BYPASS CLEARING RTS + LD A,5 ; RTS IS IN WR5 + OUT (SIOA_CMD),A ; ADDRESS WR5 + LD A,$E8 ; VALUE TO CLEAR RTS + OUT (SIOA_CMD),A ; DO IT +SIOA_INT0: + LD HL,(SIOA_HD) ; GET HEAD POINTER + LD A,L ; GET LOW BYTE + CP SIOA_BUFEND & $FF ; PAST END? + JR NZ,SIOA_INT1 ; IF NOT, BYPASS POINTER RESET + LD HL,SIOA_BUF ; ... OTHERWISE, RESET TO START OF BUFFER +SIOA_INT1: + LD A,E ; RECOVER BYTE READ + LD (HL),A ; SAVE RECEIVED BYTE TO HEAD POSITION + INC HL ; INCREMENT HEAD POINTER + LD (SIOA_HD),HL ; SAVE IT +; + ; CHECK FOR MORE PENDING... + XOR A ; A := 0 + OUT (SIOA_CMD),A ; ADDRESS RD0 + IN A,(SIOA_CMD) ; GET RD0 + RRA ; READY BIT TO CF + JR C,SIOA_INT00 ; IF SET, DO SOME MORE + OR $FF ; NZ SET TO INDICATE INT HANDLED + RET ; AND RETURN +; +SIOB_INT: + ; CHECK FOR RECEIVE PENDING ON CHANNEL B + XOR A ; A := 0 + OUT (SIOB_CMD),A ; ADDRESS RD0 + IN A,(SIOB_CMD) ; GET RD0 + AND $01 ; ISOLATE RECEIVE READY BIT + RET Z ; IF NOT, RETURN WITH Z SET +; +SIOB_INT00: + ; HANDLE CHANNEL B + IN A,(SIOB_DAT) ; READ PORT + LD E,A ; SAVE BYTE READ + LD A,(SIOB_CNT) ; GET CURRENT BUFFER USED COUNT + CP SIOB_BUFSZ ; COMPARE TO BUFFER SIZE + RET Z ; BAIL OUT IF BUFFER FULL, RCV BYTE DISCARDED + INC A ; INCREMENT THE COUNT + LD (SIOB_CNT),A ; AND SAVE IT + CP SIOB_BUFSZ - 5 ; BUFFER GETTING FULL? + JR NZ,SIOB_INT0 ; IF NOT, BYPASS CLEARING RTS + LD A,5 ; RTS IS IN WR5 + OUT (SIOB_CMD),A ; ADDRESS WR5 + LD A,$E8 ; VALUE TO CLEAR RTS + OUT (SIOB_CMD),A ; DO IT +SIOB_INT0: + LD HL,(SIOB_HD) ; GET HEAD POINTER + LD A,L ; GET LOW BYTE + CP SIOB_BUFEND & $FF ; PAST END? + JR NZ,SIOB_INT1 ; IF NOT, BYPASS POINTER RESET + LD HL,SIOB_BUF ; ... OTHERWISE, RESET TO START OF BUFFER +SIOB_INT1: + LD A,E ; RECOVER BYTE READ + LD (HL),A ; SAVE RECEIVED BYTE TO HEAD POSITION + INC HL ; INCREMENT HEAD POINTER + LD (SIOB_HD),HL ; SAVE IT +; + ; CHECK FOR MORE PENDING... + XOR A ; A := 0 + OUT (SIOB_CMD),A ; ADDRESS RD0 + IN A,(SIOB_CMD) ; GET RD0 + RRA ; READY BIT TO CF + JR C,SIOB_INT00 ; IF SET, DO SOME MORE + OR $FF ; NZ SET TO INDICATE INT HANDLED + RET ; AND RETURN +; +; DRIVER FUNCTION TABLE +; +SIO_FNTBL: + .DW SIO_IN + .DW SIO_OUT + .DW SIO_IST + .DW SIO_OST + .DW SIO_INITDEV + .DW SIO_QUERY + .DW SIO_DEVICE +#IF (($ - SIO_FNTBL) != (CIO_FNCNT * 2)) + .ECHO "*** INVALID SIO FUNCTION TABLE ***\n" +#ENDIF +; +; +; +SIO_IN: + LD A,(IY + 2) ; GET CHANNEL + OR A ; SET FLAGS + JR Z,SIOA_IN ; HANDLE CHANNEL A + DEC A ; TEST FOR NEXT DEVICE + JR Z,SIOB_IN ; HANDLE CHANNEL B + CALL PANIC ; ELSE FATAL ERROR + RET ; ... AND RETURN +; +SIOA_IN: + CALL SIOA_IST ; RECEIVED CHAR READY? + JR Z,SIOA_IN ; LOOP TILL WE HAVE SOMETHING IN BUFFER + HB_DI ; AVOID COLLISION WITH INT HANDLER + LD A,(SIOA_CNT) ; GET COUNT + DEC A ; DECREMENT COUNT + LD (SIOA_CNT),A ; SAVE SAVE IT + CP 5 ; BUFFER LOW THRESHOLD + JR NZ,SIOA_IN0 ; IF NOT, BYPASS SETTING RTS + LD A,5 ; RTS IS IN WR5 + OUT (SIOA_CMD),A ; ADDRESS WR5 + LD A,$EA ; VALUE TO SET RTS + OUT (SIOA_CMD),A ; DO IT +SIOA_IN0: + LD HL,(SIOA_TL) ; GET BUFFER TAIL POINTER + LD E,(HL) ; GET BYTE + INC HL ; BUMP TAIL POINTER + LD A,L ; GET LOW BYTE + CP SIOA_BUFEND & $FF ; PAST END? + JR NZ,SIOA_IN1 ; IF NOT, BYPASS POINTER RESET + LD HL,SIOA_BUF ; ... OTHERWISE, RESET TO START OF BUFFER +SIOA_IN1: + LD (SIOA_TL),HL ; SAVE UPDATED TAIL POINTER + HB_EI ; INTERRUPTS OK AGAIN + XOR A ; SIGNAL SUCCESS + RET ; AND DONE +; +SIOB_IN: + CALL SIOB_IST ; RECEIVED CHAR READY? + JR Z,SIOB_IN ; LOOP TILL WE HAVE SOMETHING IN BUFFER + HB_DI ; AVOID COLLISION WITH INT HANDLER + LD A,(SIOB_CNT) ; GET COUNT + DEC A ; DECREMENT COUNT + LD (SIOB_CNT),A ; SAVE SAVE IT + CP 5 ; BUFFER LOW THRESHOLD + JR NZ,SIOB_IN0 ; IF NOT, BYPASS SETTING RTS + LD A,5 ; RTS IS IN WR5 + OUT (SIOB_CMD),A ; ADDRESS WR5 + LD A,$EA ; VALUE TO SET RTS + OUT (SIOB_CMD),A ; DO IT +SIOB_IN0: + LD HL,(SIOB_TL) ; GET BUFFER TAIL POINTER + LD E,(HL) ; GET BYTE + INC HL ; BUMP TAIL POINTER + LD A,L ; GET LOW BYTE + CP SIOB_BUFEND & $FF ; PAST END? + JR NZ,SIOB_IN1 ; IF NOT, BYPASS POINTER RESET + LD HL,SIOB_BUF ; ... OTHERWISE, RESET TO START OF BUFFER +SIOB_IN1: + LD (SIOB_TL),HL ; SAVE UPDATED TAIL POINTER + HB_EI ; INTERRUPTS OK AGAIN + XOR A ; SIGNAL SUCCESS + RET ; AND DONE +; +; +; +SIO_OUT: + CALL SIO_OST ; READY FOR CHAR? + JR Z,SIO_OUT ; LOOP IF NOT + LD C,(IY + 3) ; C := SIO CMD PORT +#IF (SIOMODE == SIOMODE_RC) + INC C ; BUMP TO DATA PORT +#ENDIF +#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 + RET +; +; +; +SIO_IST: + LD A,(IY + 2) ; GET CHANNEL + OR A ; SET FLAGS + JR Z,SIOA_IST ; HANDLE CHANNEL A + DEC A ; TEST FOR NEXT DEVICE + JR Z,SIOB_IST ; HANDLE CHANNEL B + CALL PANIC ; ELSE FATAL ERROR + RET ; ... AND RETURN +; +SIOA_IST: + LD A,(SIOA_CNT) ; GET BUFFER UTILIZATION COUNT + OR A ; SET FLAGS + JP Z,CIO_IDLE ; NOT READY, RETURN VIA IDLE PROCESSING + RET ; AND DONE +; +SIOB_IST: + LD A,(SIOB_CNT) ; GET BUFFER UTILIZATION COUNT + OR A ; SET FLAGS + JP Z,CIO_IDLE ; NOT READY, RETURN VIA IDLE PROCESSING + RET ; DONE +; +; +; +SIO_OST: + LD C,(IY + 3) ; CMD PORT + XOR A ; WR0 + OUT (C),A ; DO IT + IN A,(C) ; GET STATUS + AND $04 ; ISOLATE BIT 2 (TX EMPTY) + JP Z,CIO_IDLE ; NOT READY, RETURN VIA IDLE PROCESSING + XOR A ; ZERO ACCUM + INC A ; ACCUM := 1 TO SIGNAL 1 BUFFER POSITION + RET ; DONE +; +; +; +SIO_INITDEV: + HB_DI ; AVOID CONFLICTS +; + ; PROGRAM THE SIO/2 CHIP CHANNEL + LD C,(IY + 3) ; COMMAND PORT + LD HL,SIO_INITVALS ; POINT TO INIT VALUES + LD B,SIO_INITLEN ; COUNT OF BYTES TO WRITE + OTIR ; WRITE ALL VALUES +; + ; RESET THE RECEIVE BUFFER + LD E,(IY + 6) + LD D,(IY + 7) ; DE := _CNT + XOR A ; A := 0 + LD (DE),A ; _CNT = 0 + INC DE ; DE := ADR OF _HD + PUSH DE ; SAVE IT + INC DE + INC DE + INC DE + INC DE ; DE := ADR OF _BUF + POP HL ; HL := ADR OF _HD + LD (HL),E + INC HL + LD (HL),D ; _HD := _BUF + INC HL + LD (HL),E + INC HL + LD (HL),D ; _TL := _BUF +; + HB_EI ; READY FOR INTS AGAIN + XOR A ; SIGNAL SUCCESS + RET ; RETURN +; +; +SIO_INITVALS: + .DB $00, $18 ; WR0: CHANNEL RESET + .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 + .DB $05, $EA ; WR5: DTR, 8 BITS SEND, TX ENABLE, RTS +SIO_INITLEN .EQU $ - SIO_INITVALS +; +; +; +SIO_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 +; +; +; +SIO_DEVICE: + LD D,CIODEV_SIO ; D := DEVICE TYPE + LD E,(IY) ; E := PHYSICAL UNIT + XOR A ; SIGNAL SUCCESS + RET +; +; SIO DETECTION ROUTINE +; +SIO_DETECT: + LD C,(IY + 3) ; COMMAND PORT + XOR A + OUT (C),A ; ACCESS RD0 + IN A,(C) ; GET RD0 VALUE + LD B,A ; SAVE IT + LD A,1 + OUT (C),A ; ACCESS RD1 + IN A,(C) ; GET RD1 VALUE + CP B ; COMPARE + LD A,SIO_NONE ; ASSUME NOTHING THERE + RET Z ; RD0=RD1 MEANS NOTHING THERE + LD A,SIO_SIO ; GUESS WE HAVE A VALID SIO HERE + RET ; DONE +; +; +; +SIO_PRTCFG: + ; ANNOUNCE PORT + CALL NEWLINE ; FORMATTING + PRTS("SIO$") ; FORMATTING + LD A,(IY) ; DEVICE NUM + CALL PRTDECB ; PRINT DEVICE NUM + PRTS(": IO=0x$") ; FORMATTING + LD A,(IY + 3) ; GET BASE PORT + CALL PRTHEXBYTE ; PRINT BASE PORT + + ; PRINT THE SIO TYPE + CALL PC_SPACE ; FORMATTING + LD A,(IY + 1) ; GET SIO TYPE BYTE + RLCA ; MAKE IT A WORD OFFSET + LD HL,SIO_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 SIO WAS DETECTED + LD A,(IY + 1) ; GET SIO TYPE BYTE + OR A ; SET FLAGS + RET Z ; IF ZERO, NOT PRESENT +; + PRTS(" MODE=$") ; FORMATTING + LD E,(IY + 4) ; LOAD CONFIG + LD D,(IY + 5) ; ... WORD TO DE + CALL PS_PRTSC0 ; PRINT CONFIG +; + XOR A + RET +; +; +; +SIO_TYPE_MAP: + .DW SIO_STR_NONE + .DW SIO_STR_SIO + +SIO_STR_NONE .DB "$" +SIO_STR_SIO .DB "SIO$" +; +; WORKING VARIABLES +; +SIO_DEV .DB 0 ; DEVICE NUM USED DURING INIT +; +; CHANNEL A RECEIVE BUFFER +SIOA_RCVBUF: +SIOA_CNT .DB 0 ; CHARACTERS IN RING BUFFER +SIOA_HD .DW SIOA_BUF ; BUFFER HEAD POINTER +SIOA_TL .DW SIOA_BUF ; BUFFER TAIL POINTER +SIOA_BUF .FILL 32,0 ; RECEIVE RING BUFFER +SIOA_BUFEND .EQU $ ; END OF BUFFER +SIOA_BUFSZ .EQU $ - SIOA_BUF ; SIZE OF RING BUFFER +; +; CHANNEL B RECEIVE BUFFER +SIOB_RCVBUF: +SIOB_CNT .DB 0 ; CHARACTERS IN RING BUFFER +SIOB_HD .DW SIOB_BUF ; BUFFER HEAD POINTER +SIOB_TL .DW SIOB_BUF ; BUFFER TAIL POINTER +SIOB_BUF .FILL 32,0 ; RECEIVE RING BUFFER +SIOB_BUFEND .EQU $ ; END OF BUFFER +SIOB_BUFSZ .EQU $ - SIOB_BUF ; SIZE OF RING BUFFER +; +; SIO PORT TABLE +; +SIO_CFG: + ; SIO/2 CHANNEL A + .DB 0 ; DEVICE NUMBER (SET DURING INIT) + .DB 0 ; SIO TYPE (SET DURING INIT) + .DB 0 ; SIO CHANNEL (A) + .DB SIOA_CMD ; BASE PORT (CMD PORT) + .DW DEFSIOACFG ; LINE CONFIGURATION + .DW SIOA_RCVBUF ; POINTER TO RCV BUFFER STRUCT +; + ; SIO/2 CHANNEL B + .DB 0 ; DEVICE NUMBER (SET DURING INIT) + .DB 0 ; SIO TYPE (SET DURING INIT) + .DB 1 ; SIO CHANNEL (B) + .DB SIOB_CMD ; BASE PORT (CMD PORT) + .DW DEFSIOBCFG ; LINE CONFIGURATION + .DW SIOB_RCVBUF ; POINTER TO RCV BUFFER STRUCT +; +SIO_CNT .EQU ($ - SIO_CFG) / 8 From 0e8b6aecb7de95428f8fe4c1830a340c4ceaa687 Mon Sep 17 00:00:00 2001 From: b1ackmai1er <39449559+b1ackmai1er@users.noreply.github.com> Date: Sun, 29 Jul 2018 17:31:27 +0800 Subject: [PATCH 08/14] Delete sio.asm --- sio.asm | 921 -------------------------------------------------------- 1 file changed, 921 deletions(-) delete mode 100644 sio.asm diff --git a/sio.asm b/sio.asm deleted file mode 100644 index 75ccdaf3..00000000 --- a/sio.asm +++ /dev/null @@ -1,921 +0,0 @@ -; -;================================================================================================== -; SIO DRIVER (SERIAL PORT) -;================================================================================================== -; -; SETUP PARAMETER WORD: -; +-------+---+-------------------+ +---+---+-----------+---+-------+ -; | |RTS| ENCODED BAUD RATE | |DTR|XON| PARITY |STP| 8/7/6 | -; +-------+---+---+---------------+ ----+---+-----------+---+-------+ -; F E D C B A 9 8 7 6 5 4 3 2 1 0 -; -- MSB (D REGISTER) -- -- LSB (E REGISTER) -- -; -; -SIO_NONE .EQU 0 -SIO_SIO .EQU 1 -; -#IF (SIOMODE == SIOMODE_RC) -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 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: -; -; SETUP THE DISPATCH TABLE ENTRIES -; - LD B,SIO_CNT ; LOOP CONTROL - LD C,0 ; PHYSICAL UNIT INDEX - XOR A ; ZERO TO ACCUM - LD (SIO_DEV),A ; CURRENT DEVICE NUMBER -SIO_PREINIT0: - PUSH BC ; SAVE LOOP CONTROL - LD A,C ; PHYSICAL UNIT TO A - RLCA ; MULTIPLY BY CFG TABLE ENTRY SIZE (8 BYTES) - RLCA ; ... - RLCA ; ... TO GET OFFSET INTO CFG TABLE - LD HL,SIO_CFG ; POINT TO START OF CFG TABLE - CALL ADDHLA ; HL := ENTRY ADDRESS - PUSH HL ; SAVE IT - PUSH HL ; COPY CFG DATA PTR - POP IY ; ... TO IY - CALL SIO_INITUNIT ; HAND OFF TO GENERIC INIT CODE - POP DE ; GET ENTRY ADDRESS BACK, BUT PUT IN DE - POP BC ; RESTORE LOOP CONTROL -; - LD A,(IY + 1) ; GET THE SIO TYPE DETECTED - OR A ; SET FLAGS - JR Z,SIO_PREINIT2 ; SKIP IT IF NOTHING FOUND -; - PUSH BC ; SAVE LOOP CONTROL - LD BC,SIO_FNTBL ; BC := FUNCTION TABLE ADDRESS - CALL NZ,CIO_ADDENT ; ADD ENTRY IF SIO FOUND, BC:DE - POP BC ; RESTORE LOOP CONTROL -; -SIO_PREINIT2: - INC C ; NEXT PHYSICAL UNIT - DJNZ SIO_PREINIT0 ; LOOP UNTIL DONE -; -#IF (INTMODE == 1) - ; ADD IM1 INT CALL LIST ENTRY IF APPROPRIATE - LD A,(SIO_DEV) ; GET NEXT DEVICE NUM - OR A ; SET FLAGS - JR Z,SIO_PREINIT3 ; IF ZERO, NO SIO DEVICES - LD HL,SIO_INT ; GET INT VECTOR - CALL HB_ADDIM1 ; ADD TO IM1 CALL LIST -#ENDIF -; -#IF (INTMODE == 2) - ; SETUP SIO INTERRUPT VECTOR IN IVT - LD HL,INT_SIO - LD (HBX_IVT + IVT_SER0),HL -#ENDIF -; -SIO_PREINIT3: - XOR A ; SIGNAL SUCCESS - RET ; AND RETURN -; -; SIO INITIALIZATION ROUTINE -; -SIO_INITUNIT: - CALL SIO_DETECT ; DETERMINE SIO TYPE - LD (IY + 1),A ; SAVE IN CONFIG TABLE - OR A ; SET FLAGS - RET Z ; ABORT IF NOTHING THERE - - ; UPDATE WORKING SIO DEVICE NUM - LD HL,SIO_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 - JP SIO_INITDEV ; IMPLEMENT IT AND RETURN -; -; -; -SIO_INIT: - LD B,SIO_CNT ; COUNT OF POSSIBLE SIO UNITS - LD C,0 ; INDEX INTO SIO CONFIG TABLE -SIO_INIT1: - PUSH BC ; SAVE LOOP CONTROL - - LD A,C ; PHYSICAL UNIT TO A - RLCA ; MULTIPLY BY CFG TABLE ENTRY SIZE (8 BYTES) - RLCA ; ... - RLCA ; ... TO GET OFFSET INTO CFG TABLE - LD HL,SIO_CFG ; POINT TO START OF CFG TABLE - CALL ADDHLA ; HL := ENTRY ADDRESS - PUSH HL ; COPY CFG DATA PTR - POP IY ; ... TO IY - - LD A,(IY + 1) ; GET SIO TYPE - OR A ; SET FLAGS - CALL NZ,SIO_PRTCFG ; PRINT IF NOT ZERO - - POP BC ; RESTORE LOOP CONTROL - INC C ; NEXT UNIT - DJNZ SIO_INIT1 ; LOOP TILL DONE -; - XOR A ; SIGNAL SUCCESS - RET ; DONE -; -; INTERRUPT HANDLER -; -SIO_INT: -SIOA_INT: - ; CHECK FOR RECEIVE PENDING ON CHANNEL A - XOR A ; A := 0 - OUT (SIOA_CMD),A ; ADDRESS RD0 - IN A,(SIOA_CMD) ; GET RD0 - AND $01 ; ISOLATE RECEIVE READY BIT - JR Z,SIOB_INT ; CHECK CHANNEL B -; -SIOA_INT00: - ; HANDLE CHANNEL A - IN A,(SIOA_DAT) ; READ PORT - LD E,A ; SAVE BYTE READ - LD A,(SIOA_CNT) ; GET CURRENT BUFFER USED COUNT - CP SIOA_BUFSZ ; COMPARE TO BUFFER SIZE - RET Z ; BAIL OUT IF BUFFER FULL, RCV BYTE DISCARDED - INC A ; INCREMENT THE COUNT - LD (SIOA_CNT),A ; AND SAVE IT - CP SIOA_BUFSZ - 5 ; BUFFER GETTING FULL? - JR NZ,SIOA_INT0 ; IF NOT, BYPASS CLEARING RTS - LD A,5 ; RTS IS IN WR5 - OUT (SIOA_CMD),A ; ADDRESS WR5 - LD A,$E8 ; VALUE TO CLEAR RTS - OUT (SIOA_CMD),A ; DO IT -SIOA_INT0: - LD HL,(SIOA_HD) ; GET HEAD POINTER - LD A,L ; GET LOW BYTE - CP SIOA_BUFEND & $FF ; PAST END? - JR NZ,SIOA_INT1 ; IF NOT, BYPASS POINTER RESET - LD HL,SIOA_BUF ; ... OTHERWISE, RESET TO START OF BUFFER -SIOA_INT1: - LD A,E ; RECOVER BYTE READ - LD (HL),A ; SAVE RECEIVED BYTE TO HEAD POSITION - INC HL ; INCREMENT HEAD POINTER - LD (SIOA_HD),HL ; SAVE IT -; - ; CHECK FOR MORE PENDING... - XOR A ; A := 0 - OUT (SIOA_CMD),A ; ADDRESS RD0 - IN A,(SIOA_CMD) ; GET RD0 - RRA ; READY BIT TO CF - JR C,SIOA_INT00 ; IF SET, DO SOME MORE - OR $FF ; NZ SET TO INDICATE INT HANDLED - RET ; AND RETURN -; -SIOB_INT: - ; CHECK FOR RECEIVE PENDING ON CHANNEL B - XOR A ; A := 0 - OUT (SIOB_CMD),A ; ADDRESS RD0 - IN A,(SIOB_CMD) ; GET RD0 - AND $01 ; ISOLATE RECEIVE READY BIT - RET Z ; IF NOT, RETURN WITH Z SET -; -SIOB_INT00: - ; HANDLE CHANNEL B - IN A,(SIOB_DAT) ; READ PORT - LD E,A ; SAVE BYTE READ - LD A,(SIOB_CNT) ; GET CURRENT BUFFER USED COUNT - CP SIOB_BUFSZ ; COMPARE TO BUFFER SIZE - RET Z ; BAIL OUT IF BUFFER FULL, RCV BYTE DISCARDED - INC A ; INCREMENT THE COUNT - LD (SIOB_CNT),A ; AND SAVE IT - CP SIOB_BUFSZ - 5 ; BUFFER GETTING FULL? - JR NZ,SIOB_INT0 ; IF NOT, BYPASS CLEARING RTS - LD A,5 ; RTS IS IN WR5 - OUT (SIOB_CMD),A ; ADDRESS WR5 - LD A,$E8 ; VALUE TO CLEAR RTS - OUT (SIOB_CMD),A ; DO IT -SIOB_INT0: - LD HL,(SIOB_HD) ; GET HEAD POINTER - LD A,L ; GET LOW BYTE - CP SIOB_BUFEND & $FF ; PAST END? - JR NZ,SIOB_INT1 ; IF NOT, BYPASS POINTER RESET - LD HL,SIOB_BUF ; ... OTHERWISE, RESET TO START OF BUFFER -SIOB_INT1: - LD A,E ; RECOVER BYTE READ - LD (HL),A ; SAVE RECEIVED BYTE TO HEAD POSITION - INC HL ; INCREMENT HEAD POINTER - LD (SIOB_HD),HL ; SAVE IT -; - ; CHECK FOR MORE PENDING... - XOR A ; A := 0 - OUT (SIOB_CMD),A ; ADDRESS RD0 - IN A,(SIOB_CMD) ; GET RD0 - RRA ; READY BIT TO CF - JR C,SIOB_INT00 ; IF SET, DO SOME MORE - OR $FF ; NZ SET TO INDICATE INT HANDLED - RET ; AND RETURN -; -; DRIVER FUNCTION TABLE -; -SIO_FNTBL: - .DW SIO_IN - .DW SIO_OUT - .DW SIO_IST - .DW SIO_OST - .DW SIO_INITDEV - .DW SIO_QUERY - .DW SIO_DEVICE -#IF (($ - SIO_FNTBL) != (CIO_FNCNT * 2)) - .ECHO "*** INVALID SIO FUNCTION TABLE ***\n" -#ENDIF -; -; -; -SIO_IN: - LD A,(IY + 2) ; GET CHANNEL - OR A ; SET FLAGS - JR Z,SIOA_IN ; HANDLE CHANNEL A - DEC A ; TEST FOR NEXT DEVICE - JR Z,SIOB_IN ; HANDLE CHANNEL B - CALL PANIC ; ELSE FATAL ERROR - RET ; ... AND RETURN -; -SIOA_IN: - CALL SIOA_IST ; RECEIVED CHAR READY? - JR Z,SIOA_IN ; LOOP TILL WE HAVE SOMETHING IN BUFFER - HB_DI ; AVOID COLLISION WITH INT HANDLER - LD A,(SIOA_CNT) ; GET COUNT - DEC A ; DECREMENT COUNT - LD (SIOA_CNT),A ; SAVE SAVE IT - CP 5 ; BUFFER LOW THRESHOLD - JR NZ,SIOA_IN0 ; IF NOT, BYPASS SETTING RTS - LD A,5 ; RTS IS IN WR5 - OUT (SIOA_CMD),A ; ADDRESS WR5 - LD A,$EA ; VALUE TO SET RTS - OUT (SIOA_CMD),A ; DO IT -SIOA_IN0: - LD HL,(SIOA_TL) ; GET BUFFER TAIL POINTER - LD E,(HL) ; GET BYTE - INC HL ; BUMP TAIL POINTER - LD A,L ; GET LOW BYTE - CP SIOA_BUFEND & $FF ; PAST END? - JR NZ,SIOA_IN1 ; IF NOT, BYPASS POINTER RESET - LD HL,SIOA_BUF ; ... OTHERWISE, RESET TO START OF BUFFER -SIOA_IN1: - LD (SIOA_TL),HL ; SAVE UPDATED TAIL POINTER - HB_EI ; INTERRUPTS OK AGAIN - XOR A ; SIGNAL SUCCESS - RET ; AND DONE -; -SIOB_IN: - CALL SIOB_IST ; RECEIVED CHAR READY? - JR Z,SIOB_IN ; LOOP TILL WE HAVE SOMETHING IN BUFFER - HB_DI ; AVOID COLLISION WITH INT HANDLER - LD A,(SIOB_CNT) ; GET COUNT - DEC A ; DECREMENT COUNT - LD (SIOB_CNT),A ; SAVE SAVE IT - CP 5 ; BUFFER LOW THRESHOLD - JR NZ,SIOB_IN0 ; IF NOT, BYPASS SETTING RTS - LD A,5 ; RTS IS IN WR5 - OUT (SIOB_CMD),A ; ADDRESS WR5 - LD A,$EA ; VALUE TO SET RTS - OUT (SIOB_CMD),A ; DO IT -SIOB_IN0: - LD HL,(SIOB_TL) ; GET BUFFER TAIL POINTER - LD E,(HL) ; GET BYTE - INC HL ; BUMP TAIL POINTER - LD A,L ; GET LOW BYTE - CP SIOB_BUFEND & $FF ; PAST END? - JR NZ,SIOB_IN1 ; IF NOT, BYPASS POINTER RESET - LD HL,SIOB_BUF ; ... OTHERWISE, RESET TO START OF BUFFER -SIOB_IN1: - LD (SIOB_TL),HL ; SAVE UPDATED TAIL POINTER - HB_EI ; INTERRUPTS OK AGAIN - XOR A ; SIGNAL SUCCESS - RET ; AND DONE -; -; -; -SIO_OUT: - CALL SIO_OST ; READY FOR CHAR? - JR Z,SIO_OUT ; LOOP IF NOT - LD C,(IY + 3) ; C := SIO CMD PORT -#IF (SIOMODE == SIOMODE_RC) - INC C ; BUMP TO DATA PORT -#ENDIF -#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 - RET -; -; -; -SIO_IST: - LD A,(IY + 2) ; GET CHANNEL - OR A ; SET FLAGS - JR Z,SIOA_IST ; HANDLE CHANNEL A - DEC A ; TEST FOR NEXT DEVICE - JR Z,SIOB_IST ; HANDLE CHANNEL B - CALL PANIC ; ELSE FATAL ERROR - RET ; ... AND RETURN -; -SIOA_IST: - LD A,(SIOA_CNT) ; GET BUFFER UTILIZATION COUNT - OR A ; SET FLAGS - JP Z,CIO_IDLE ; NOT READY, RETURN VIA IDLE PROCESSING - RET ; AND DONE -; -SIOB_IST: - LD A,(SIOB_CNT) ; GET BUFFER UTILIZATION COUNT - OR A ; SET FLAGS - JP Z,CIO_IDLE ; NOT READY, RETURN VIA IDLE PROCESSING - RET ; DONE -; -; -; -SIO_OST: - LD C,(IY + 3) ; CMD PORT - XOR A ; WR0 - OUT (C),A ; DO IT - IN A,(C) ; GET STATUS - AND $04 ; ISOLATE BIT 2 (TX EMPTY) - JP Z,CIO_IDLE ; NOT READY, RETURN VIA IDLE PROCESSING - XOR A ; ZERO ACCUM - INC A ; ACCUM := 1 TO SIGNAL 1 BUFFER POSITION - RET ; DONE -; -; -; -SIO_INITDEV: - HB_DI ; AVOID CONFLICTS -; - ; PROGRAM THE SIO/2 CHIP CHANNEL - LD C,(IY + 3) ; COMMAND PORT - LD HL,SIO_INITVALS ; POINT TO INIT VALUES - LD B,SIO_INITLEN ; COUNT OF BYTES TO WRITE - OTIR ; WRITE ALL VALUES -; - ; RESET THE RECEIVE BUFFER - LD E,(IY + 6) - LD D,(IY + 7) ; DE := _CNT - XOR A ; A := 0 - LD (DE),A ; _CNT = 0 - INC DE ; DE := ADR OF _HD - PUSH DE ; SAVE IT - INC DE - INC DE - INC DE - INC DE ; DE := ADR OF _BUF - POP HL ; HL := ADR OF _HD - LD (HL),E - INC HL - LD (HL),D ; _HD := _BUF - INC HL - LD (HL),E - INC HL - LD (HL),D ; _TL := _BUF -; - HB_EI ; READY FOR INTS AGAIN - XOR A ; SIGNAL SUCCESS - RET ; RETURN -; -; -SIO_INITVALS: - .DB $00, $18 ; WR0: CHANNEL RESET - .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 - .DB $05, $EA ; WR5: DTR, 8 BITS SEND, TX ENABLE, RTS -SIO_INITLEN .EQU $ - SIO_INITVALS -; -; -; -SIO_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 -; -; -; -SIO_DEVICE: - LD D,CIODEV_SIO ; D := DEVICE TYPE - LD E,(IY) ; E := PHYSICAL UNIT - XOR A ; SIGNAL SUCCESS - RET -; -; SIO DETECTION ROUTINE -; -SIO_DETECT: - LD C,(IY + 3) ; COMMAND PORT - XOR A - OUT (C),A ; ACCESS RD0 - IN A,(C) ; GET RD0 VALUE - LD B,A ; SAVE IT - LD A,1 - OUT (C),A ; ACCESS RD1 - IN A,(C) ; GET RD1 VALUE - CP B ; COMPARE - LD A,SIO_NONE ; ASSUME NOTHING THERE - RET Z ; RD0=RD1 MEANS NOTHING THERE - LD A,SIO_SIO ; GUESS WE HAVE A VALID SIO HERE - RET ; DONE -; -; -; -SIO_PRTCFG: - ; ANNOUNCE PORT - CALL NEWLINE ; FORMATTING - PRTS("SIO$") ; FORMATTING - LD A,(IY) ; DEVICE NUM - CALL PRTDECB ; PRINT DEVICE NUM - PRTS(": IO=0x$") ; FORMATTING - LD A,(IY + 3) ; GET BASE PORT - CALL PRTHEXBYTE ; PRINT BASE PORT - - ; PRINT THE SIO TYPE - CALL PC_SPACE ; FORMATTING - LD A,(IY + 1) ; GET SIO TYPE BYTE - RLCA ; MAKE IT A WORD OFFSET - LD HL,SIO_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 SIO WAS DETECTED - LD A,(IY + 1) ; GET SIO TYPE BYTE - OR A ; SET FLAGS - RET Z ; IF ZERO, NOT PRESENT -; - PRTS(" MODE=$") ; FORMATTING - LD E,(IY + 4) ; LOAD CONFIG - LD D,(IY + 5) ; ... WORD TO DE - CALL PS_PRTSC0 ; PRINT CONFIG -; - XOR A - RET -; -; -; -SIO_TYPE_MAP: - .DW SIO_STR_NONE - .DW SIO_STR_SIO - -SIO_STR_NONE .DB "$" -SIO_STR_SIO .DB "SIO$" -; -; WORKING VARIABLES -; -SIO_DEV .DB 0 ; DEVICE NUM USED DURING INIT -; -; CHANNEL A RECEIVE BUFFER -SIOA_RCVBUF: -SIOA_CNT .DB 0 ; CHARACTERS IN RING BUFFER -SIOA_HD .DW SIOA_BUF ; BUFFER HEAD POINTER -SIOA_TL .DW SIOA_BUF ; BUFFER TAIL POINTER -SIOA_BUF .FILL 32,0 ; RECEIVE RING BUFFER -SIOA_BUFEND .EQU $ ; END OF BUFFER -SIOA_BUFSZ .EQU $ - SIOA_BUF ; SIZE OF RING BUFFER -; -; CHANNEL B RECEIVE BUFFER -SIOB_RCVBUF: -SIOB_CNT .DB 0 ; CHARACTERS IN RING BUFFER -SIOB_HD .DW SIOB_BUF ; BUFFER HEAD POINTER -SIOB_TL .DW SIOB_BUF ; BUFFER TAIL POINTER -SIOB_BUF .FILL 32,0 ; RECEIVE RING BUFFER -SIOB_BUFEND .EQU $ ; END OF BUFFER -SIOB_BUFSZ .EQU $ - SIOB_BUF ; SIZE OF RING BUFFER -; -; SIO PORT TABLE -; -SIO_CFG: - ; SIO/2 CHANNEL A - .DB 0 ; DEVICE NUMBER (SET DURING INIT) - .DB 0 ; SIO TYPE (SET DURING INIT) - .DB 0 ; SIO CHANNEL (A) - .DB SIOA_CMD ; BASE PORT (CMD PORT) - .DW DEFSIOACFG ; LINE CONFIGURATION - .DW SIOA_RCVBUF ; POINTER TO RCV BUFFER STRUCT -; - ; SIO/2 CHANNEL B - .DB 0 ; DEVICE NUMBER (SET DURING INIT) - .DB 0 ; SIO TYPE (SET DURING INIT) - .DB 1 ; SIO CHANNEL (B) - .DB SIOB_CMD ; BASE PORT (CMD PORT) - .DW DEFSIOBCFG ; LINE CONFIGURATION - .DW SIOB_RCVBUF ; POINTER TO RCV BUFFER STRUCT -; -SIO_CNT .EQU ($ - SIO_CFG) / 8 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 09/14] 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 From 206b3ffcd240ec0b0f9a919c190287a731a3d482 Mon Sep 17 00:00:00 2001 From: b1ackmai1er <39449559+b1ackmai1er@users.noreply.github.com> Date: Sun, 29 Jul 2018 23:09:58 +0800 Subject: [PATCH 10/14] Add configurable baud rate through mode.com --- Source/HBIOS/sio.asm | 79 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) diff --git a/Source/HBIOS/sio.asm b/Source/HBIOS/sio.asm index 75ccdaf3..84ce75ff 100644 --- a/Source/HBIOS/sio.asm +++ b/Source/HBIOS/sio.asm @@ -757,6 +757,32 @@ SIO_OST: ; ; SIO_INITDEV: +; + ; TEST FOR -1 WHICH MEANS USE CURRENT CONFIG (JUST REINIT) ; PS + LD A,D ; TEST DE FOR ; PS + AND E ; ... VALUE OF -1 ; PS + INC A ; ... SO Z SET IF -1 ; PS + JR NZ,SIO_INITDEV1 ; IF DE == -1, REINIT CURRENT CONFIG ; PS +; + ; LOAD EXISTING CONFIG TO REINIT ;PS + LD E,(IY + 4) ; LOW BYTE ;PS + LD D,(IY + 5) ; HIGH BYTE ;PS + +; CHANGE INIT TABLE +; +SIO_INITDEV1: + ; DETERMINE DIVISOR + PUSH DE ; SAVE CONFIG + CALL SIO_COMPDIV ; COMPUTE DIVISOR TO BC + POP DE ; RESTORE CONFIG + RET NZ ; ABORT IF COMPDIV FAILS! +; + ; GOT A DIVISOR, COMMIT NEW CONFIG + LD (IY + 4),E ; SAVE LOW WORD + LD (IY + 5),D ; SAVE HI WORD + +; *** PUT CODE IN HERE TO UPDATE SIO PROGRAMMING TABLE BEFORE IT IS PROGRAMMED. + HB_DI ; AVOID CONFLICTS ; ; PROGRAM THE SIO/2 CHIP CHANNEL @@ -834,6 +860,59 @@ SIO_DETECT: ; ; ; +SIO_COMPDIV: + ; WE WANT TO DETERMINE A DIVISOR FOR THE UART CLOCK ; PS FROM UART.ASM + ; THAT RESULTS IN THE DESIRED BAUD RATE. +; + LD A,D ; GET CONFIG MSB + AND $1F ; ISOLATE ENCODED BAUD RATE + +#IF (SIODEBUG) + PUSH AF + PRTS(" ENCODE[$") + CALL PRTHEXBYTE + PRTC(']') + POP AF +#ENDIF + + CP SIOBAUD1 + LD E,$04 ; /1 N,8,1 + JR Z,BREX + CP SIOBAUD2 + LD E,$44 ; /16 N,8,1 + JR Z,BREX + CP SIOBAUD3 + LD E,$84 ; /32 N,8,1 + JR Z,BREX + CP SIOBAUD4 + LD E,$C4 ; /64 N,8,1 + JR Z,BREX ; RET NZ + +#IF (SIODEBUG) + PUSH AF + PRTS(" BR FAIL[$" + CALL PRTHEXBYTE + PRTC(']' + POP AF +#ENDIF + + RET ; NZ stus here indicating fail. + +BREX: ; Z status here indicating success + LD A,E + LD DE,SIO_INITVALS+3 + LD (DE),A + +#IF (SIODEBUG) + PUSH AF + PRTS(" MODE[$") + CALL PRTHEXBYTE + PRTC(']') + POP AF + +#ENDIF + + RET SIO_PRTCFG: ; ANNOUNCE PORT CALL NEWLINE ; FORMATTING From 1b565de9ce1e70ad89b5f27aa633937529132ebf Mon Sep 17 00:00:00 2001 From: b1ackmai1er <39449559+b1ackmai1er@users.noreply.github.com> Date: Mon, 30 Jul 2018 18:28:01 +0800 Subject: [PATCH 12/14] Fix incorrect equate causing RC build failure --- Source/HBIOS/plt_rc.inc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/HBIOS/plt_rc.inc b/Source/HBIOS/plt_rc.inc index 6ca2d4b6..49bd0aa1 100644 --- a/Source/HBIOS/plt_rc.inc +++ b/Source/HBIOS/plt_rc.inc @@ -8,4 +8,4 @@ MPGSEL_3 .EQU $7B ; BANK_3 PAGE SELECT REGISTER (WRITE ONLY) MPGENA .EQU $7C ; PAGING ENABLE REGISTER - BIT 0 = 1 (WRITE ONLY) ; RTC .EQU $C0 ; RTC PORT address -ZSIOBASE .EQU $80 ; RC OR SMB SIO DEFAULT +SIOBASE .EQU $80 ; RC OR SMB SIO DEFAULT From d0ee99fff291df681599e76688243518cc32def7 Mon Sep 17 00:00:00 2001 From: b1ackmai1er <39449559+b1ackmai1er@users.noreply.github.com> Date: Mon, 30 Jul 2018 23:14:15 +0800 Subject: [PATCH 13/14] Inline the serial format code and add stop bit setting --- Source/HBIOS/sio.asm | 140 ++++++++++++++++++++++--------------------- 1 file changed, 71 insertions(+), 69 deletions(-) diff --git a/Source/HBIOS/sio.asm b/Source/HBIOS/sio.asm index 84ce75ff..e1ca02b8 100644 --- a/Source/HBIOS/sio.asm +++ b/Source/HBIOS/sio.asm @@ -19,7 +19,6 @@ 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) @@ -27,7 +26,6 @@ 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 @@ -35,7 +33,6 @@ 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 ; @@ -493,7 +490,7 @@ SIO_INITUNIT: LD HL,SIO_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 + LD (IY),A ; UPDATE UNIT NUM ; SET DEFAULT CONFIG LD DE,-1 ; LEAVE CONFIG ALONE @@ -771,21 +768,79 @@ SIO_INITDEV: ; CHANGE INIT TABLE ; SIO_INITDEV1: - ; DETERMINE DIVISOR - PUSH DE ; SAVE CONFIG - CALL SIO_COMPDIV ; COMPUTE DIVISOR TO BC - POP DE ; RESTORE CONFIG - RET NZ ; ABORT IF COMPDIV FAILS! + PUSH DE ; SAVE CONFIG + + LD A,D ; GET CONFIG MSB + AND $1F ; ISOLATE ENCODED BAUD RATE + +#IF (SIODEBUG) + PUSH AF + PRTS(" ENCODE[$") + CALL PRTHEXBYTE + PRTC(']') + POP AF +#ENDIF + + CP SIOBAUD1 ; We set the divider and the lower bit (d2) of the baud rate here + LD D,$04 ; /1 N,8,1 + JR Z,BROK + CP SIOBAUD2 + LD D,$44 ; /16 N,8,1 + JR Z,BROK + CP SIOBAUD3 + LD D,$84 ; /32 N,8,1 + JR Z,BROK + CP SIOBAUD4 + LD D,$C4 ; /64 N,8,1 + JR Z,BROK ; RET NZ + +#IF (SIODEBUG) + PUSH AF + PRTS(" BR FAIL[$") + CALL PRTHEXBYTE + PRTC(']') + POP AF +#ENDIF ; - ; GOT A DIVISOR, COMMIT NEW CONFIG +EXITINIT: + POP DE + RET ; NZ status here indicating fail / invalid baud rate. + +BROK: + LD A,E + AND $E0 + JR NZ,EXITINIT ; NZ status here indicates dtr, xon, parity mark or space so return + + LD A,E ; set stop bit (d3) and add divider + AND $04 + RLA + OR D ; carry gets reset here + + +; LD A,E ; get the parity bits +; SRL A ; move them to bottom two bits +; SRL A ; we know top bits are zero from previous test +; SRL A ; add stop bits +; OR D + + LD DE,SIO_INITVALS+3 + LD (DE),A + +#IF (SIODEBUG) + PUSH AF + PRTS(" MODE[$") + CALL PRTHEXBYTE + PRTC(']') + POP AF +#ENDIF + + POP DE ; RESTORE CONFIG LD (IY + 4),E ; SAVE LOW WORD LD (IY + 5),D ; SAVE HI WORD -; *** PUT CODE IN HERE TO UPDATE SIO PROGRAMMING TABLE BEFORE IT IS PROGRAMMED. - HB_DI ; AVOID CONFLICTS ; - ; PROGRAM THE SIO/2 CHIP CHANNEL + ; PROGRAM THE SIO CHIP CHANNEL LD C,(IY + 3) ; COMMAND PORT LD HL,SIO_INITVALS ; POINT TO INIT VALUES LD B,SIO_INITLEN ; COUNT OF BYTES TO WRITE @@ -818,7 +873,7 @@ SIO_INITDEV1: ; SIO_INITVALS: .DB $00, $18 ; WR0: CHANNEL RESET - .DB $04, $SIO_WR4 ; WR4: CLK BAUD PARITY STOP BIT ; PST + .DB $04, $00 ; 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 @@ -860,59 +915,6 @@ SIO_DETECT: ; ; ; -SIO_COMPDIV: - ; WE WANT TO DETERMINE A DIVISOR FOR THE UART CLOCK ; PS FROM UART.ASM - ; THAT RESULTS IN THE DESIRED BAUD RATE. -; - LD A,D ; GET CONFIG MSB - AND $1F ; ISOLATE ENCODED BAUD RATE - -#IF (SIODEBUG) - PUSH AF - PRTS(" ENCODE[$") - CALL PRTHEXBYTE - PRTC(']') - POP AF -#ENDIF - - CP SIOBAUD1 - LD E,$04 ; /1 N,8,1 - JR Z,BREX - CP SIOBAUD2 - LD E,$44 ; /16 N,8,1 - JR Z,BREX - CP SIOBAUD3 - LD E,$84 ; /32 N,8,1 - JR Z,BREX - CP SIOBAUD4 - LD E,$C4 ; /64 N,8,1 - JR Z,BREX ; RET NZ - -#IF (SIODEBUG) - PUSH AF - PRTS(" BR FAIL[$" - CALL PRTHEXBYTE - PRTC(']' - POP AF -#ENDIF - - RET ; NZ stus here indicating fail. - -BREX: ; Z status here indicating success - LD A,E - LD DE,SIO_INITVALS+3 - LD (DE),A - -#IF (SIODEBUG) - PUSH AF - PRTS(" MODE[$") - CALL PRTHEXBYTE - PRTC(']') - POP AF - -#ENDIF - - RET SIO_PRTCFG: ; ANNOUNCE PORT CALL NEWLINE ; FORMATTING @@ -981,7 +983,7 @@ SIOB_BUFSZ .EQU $ - SIOB_BUF ; SIZE OF RING BUFFER ; SIO PORT TABLE ; SIO_CFG: - ; SIO/2 CHANNEL A + ; SIO CHANNEL A .DB 0 ; DEVICE NUMBER (SET DURING INIT) .DB 0 ; SIO TYPE (SET DURING INIT) .DB 0 ; SIO CHANNEL (A) @@ -989,7 +991,7 @@ SIO_CFG: .DW DEFSIOACFG ; LINE CONFIGURATION .DW SIOA_RCVBUF ; POINTER TO RCV BUFFER STRUCT ; - ; SIO/2 CHANNEL B + ; SIO CHANNEL B .DB 0 ; DEVICE NUMBER (SET DURING INIT) .DB 0 ; SIO TYPE (SET DURING INIT) .DB 1 ; SIO CHANNEL (B) From e768dc2d5f56455382c59370ed6c290322b7cd21 Mon Sep 17 00:00:00 2001 From: b1ackmai1er <39449559+b1ackmai1er@users.noreply.github.com> Date: Tue, 31 Jul 2018 23:24:40 +0800 Subject: [PATCH 14/14] Add data bit setting support --- Source/HBIOS/sio.asm | 80 +++++++++++++++++++++++++++++++++++++++----- 1 file changed, 71 insertions(+), 9 deletions(-) diff --git a/Source/HBIOS/sio.asm b/Source/HBIOS/sio.asm index e1ca02b8..bf26c114 100644 --- a/Source/HBIOS/sio.asm +++ b/Source/HBIOS/sio.asm @@ -815,16 +815,17 @@ BROK: AND $04 RLA OR D ; carry gets reset here + LD D,A -; LD A,E ; get the parity bits -; SRL A ; move them to bottom two bits -; SRL A ; we know top bits are zero from previous test -; SRL A ; add stop bits -; OR D - - LD DE,SIO_INITVALS+3 - LD (DE),A + LD A,E ; get the parity bits + SRL A ; move them to bottom two bits + SRL A ; we know top bits are zero from previous test + SRL A ; add stop bits + OR D ; carry = 0 + + LD BC,SIO_INITVALS+3 + LD (BC),A #IF (SIODEBUG) PUSH AF @@ -832,9 +833,70 @@ BROK: CALL PRTHEXBYTE PRTC(']') POP AF +#ENDIF + +; THE # DATA BITS NEED TO BE CONVERTED FROM THE +; ROMWBW REPRESENTATION TO THE SIO XILOG CODING + +; XOR A +; RR E ; d0 of bits into carry +; RR A ; d0 into msb +; RR E ; d1 of bits into carry +; RR A ; d1 into msb +;; SCF ; 1 into msb +; RR A +; OR $8a + + LD A,E + + #IF (SIODEBUG) + PUSH AF + PRTS(" BITS[$") + CALL PRTHEXBYTE + PRTC(']') + POP AF +#ENDIF + ; 112233445566d1d0 CC + RRA ; CC112233445566d1 d0 + RRA ; d0CC112233445566 d1 + RRA ; d1d0CC1122334455 66 + LD D,A + RRA ; 66d1d0CC11223344 55 + AND $60 ; 0011110000000000 00 + OR $8a +; +; SET TRANSMIT DATA BITS WR5 +; + LD BC,SIO_INITVALS+11 + LD (BC),A + +#IF (SIODEBUG) + PUSH AF + PRTS(" TXDATA[$") + CALL PRTHEXBYTE + PRTC(']') + POP AF +#ENDIF +; +; SET RECEIVE DATA BITS WR3 +; + LD A,D + AND $C0 + OR $01 + + LD BC,SIO_INITVALS+9 + LD (BC),A + +#IF (SIODEBUG) + PUSH AF + PRTS(" RXDATA[$") + CALL PRTHEXBYTE + PRTC(']') + POP AF #ENDIF POP DE ; RESTORE CONFIG + LD (IY + 4),E ; SAVE LOW WORD LD (IY + 5),D ; SAVE HI WORD @@ -877,7 +939,7 @@ SIO_INITVALS: .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 - .DB $05, $EA ; WR5: DTR, 8 BITS SEND, TX ENABLE, RTS + .DB $05, $EA ; WR5: DTR, 8 BITS SEND, TX ENABLE, RTS 1 11 0 1 0 1 0 (1=DTR,11=8bits,0=sendbreak,1=TxEnable,0=sdlc,1=RTS,0=txcrc) SIO_INITLEN .EQU $ - SIO_INITVALS ; ;