From bad966dfcf390655072c00a2930bc9ec4a45a044 Mon Sep 17 00:00:00 2001 From: acn Date: Mon, 14 Sep 2020 14:25:38 +0200 Subject: [PATCH] Added HBIOS patch and binaries --- README.md | 20 ++++++ qt-hb_1.z | 176 ++++++++++++++++++++++++++++++++++++++++++++++++++++ qt-hb_2.z | 176 ++++++++++++++++++++++++++++++++++++++++++++++++++++ qtermh1.com | Bin 0 -> 17664 bytes qtermh2.com | Bin 0 -> 17664 bytes 5 files changed, 372 insertions(+) create mode 100644 qt-hb_1.z create mode 100644 qt-hb_2.z create mode 100644 qtermh1.com create mode 100644 qtermh2.com diff --git a/README.md b/README.md index fd1ef98..24d4eac 100644 --- a/README.md +++ b/README.md @@ -57,6 +57,26 @@ Direct download: The patch file is ```QT-CPM3.Z```. +### RomWBW HBIOS patch + +This patch has been provided by Paul Wrightson. + +It uses direct RomWBW HBIOS calls for talking to the serial port, so it is also independant of the type of serial chip. + +The patch ```QT-HB_1.Z``` uses RomWBW device 1 (ie. the second serial port), the patch ```QT-HB_2.Z``` uses device 2 (third serial port). +So this should be equivalent to the ```QTERM82.COM``` and ```QTERM84.COM``` versions for SIO/2. + +If another serial device needs to be used, just change the variable ```DEVICE``` at the beginning of the patch file and assemble it as shown below. + +As this uses the RomWBW drivers, RTS/CTS signals should also be used automatically. + +Using this QTERM version, it should be possible to use other serial chips than SIO/2 on CP/M 2.2, as long as RomWBW is used. + +Direct download: + +* [QTERMH1.COM](qtermh1.com) - RomWBW device 1 +* [QTERMH2.COM](qtermh2.com) - RomWBW device 2 + ## Technical details ### Files diff --git a/qt-hb_1.z b/qt-hb_1.z new file mode 100644 index 0000000..fa3b9f2 --- /dev/null +++ b/qt-hb_1.z @@ -0,0 +1,176 @@ +; QTROMWBW.Z - QTerm patch for RC2014 and RomWBW with VT 100 terminal +; +; July 2020, Paul Wrightson. Convert to use ROMWBW API +; September 2019, Anna Christina Nass +; based on IMSAI8080 patch: September 2019, Udo Munk +; + +.var DEVICE 0x01 ; HBIOS device to use +.var CIOIN 0x00 +.var CIOOUT 0x01 +.var CIOIST 0x02 +.var CIOOST 0x03 +.var CIOINIT 0x04 + +.org 0x0110 ; modem input status +modist: ld B,CIOIST ; HBIOS CIOOUT function + ld HL,device + ld C,(HL) ; device number (0,1,2,3) + rst 8 ; do it, result in A + ret + +.org 0x0120 ; modem input +modin: ld B,CIOIN ; HBIOS CIOIN function + ld HL,device + ld C,(HL) ; device number (0,1,2,3) + rst 8 ; do it, result in E, status in A + ld A,E ; put received char in A + ret + +.org 0x0130 ; modem output status +modost: ld B,CIOOST ; HBIOS CIOOUT function + ld HL,device + ld C,(HL) ; device number (0,1,2,3) + rst 8 ; do it, result in A + ret + +.org 0x0140 ; modem output +modout: ld B,CIOOUT ; HBIOS CIOOUT function + ld HL,device + ld C,(HL) ; device number (0,1,2,3) + ld E,A ; put char in E + rst 8 ; do it, result in A + ret + +.org 0x0150 ; start break +sbreak: ret + +.org 0x0160 ; stop break +ebreak: ret + +.org 0x0170 ; drop DTR +dtroff: ret + db 0x0c ;length of modem hang up string + db 0xfe,0xfe ;two delays + db 0x2b,0x2b,0x2b ;+++ + db 0xfe,0xfe ;two delays + db 'ATH0',0x0d ;ATH0 + +.org 0x0180 ; restore DTR +dtron: ret + +.org 0x0190 ; set baud rate +setbd: ret + +.org 0x01a0 ; baud rate table +baudtb: + db 0,0,0,0,0,0,0,0 + db 0,0,0,0,0,0,0,0 + +.org 0x01b0 ; set communication mode +setmod: ret + +.org 0x01c0 ; communication mode table +modetb: + db 0,0,0,0,0,0,0,0 + db 0,0,0,0 + +.org 0x01cc +resrvd: db 0 ; reserved for later use + +.org 0x01cd ; protocol transfer size +xfersz: db 8 + +.org 0x01ce ; processor speed +speed: db 8 ; cpu speed in Mhz; + +.org 0x01cf ; escape character +escape: db 0x19 ; 0x19: ^Y + +.org 0x01d0 ; signon message +signon: db 'RomWBW HBIOS - VT100\0' + +.org 0x01f0 ; clear screen +clrs: db '\e[2J' + db '\e[1;1H\0' + +.var scrout 0x0109 ; print character in C +.var decout 0x010c ; print string of value in HL + +.org 0x0200 ; moveto routine +moveto: push HL + ld C,'\e' + call scrout + ld C,'[' + call scrout + pop HL + push HL + ld L,H + ld H,00 + inc L + call decout + ld C,';' + call scrout + pop HL + ld H,00 + inc L + call decout + ld C,'H' + jp scrout + +.org 0x022f +tcbits: db 0b11000011 ;terminal capabilities + +.org 0x0230 +;brites: db '\e[1m\0' ;bright +brites: db '\0' ;bright + +.org 0x0238 +;dims: db '\e[0m\0' ;dim +dims: db '\0' ;dim + +.org 0x0240 +dlstr: db '\0' ;delete line + +.org 0x0248 +ilstr: db '\0' ;insert line + +.org 0x0250 +dcstr: db '\0' ;Delete character + +.org 0x0258 +icstr: db '\0' ;Insert character + +.org 0x0260 +ceol: db '\e[K\0' ;Clear to end of line + +.org 0x0268 +ceos: db '\e[J\0' ;Clear to end of screen + +.org 0x0270 ;entry subroutine +entry: jp init + +.org 0x0273 ;exit subroutine +exit: jp uninit + +.org 0x0276 ;user subroutine +user: ret + +.org 0x0279 ;keyboard map subroutine +kbmap: ret + +.org 0x0280 ; user patch area +; PUT RomWBW UNIT # here +device: db DEVICE + +; INITIALIZE RomWBW SERIAL DEVICE +init: ; ret ; Initialize. fall through to re-initialize. + +; RE-INITIALIZE RomWBW SERIAL DEVICE +uninit: ld B,CIOINIT ; HBIOS CIOINIT function + ld HL,device + ld C,(HL) ; device number (0,1,2,3) + ld DE,-1 ; "Reset with current settings" + rst 8 ; do it + ret ; not initialized, so no un-initialize + diff --git a/qt-hb_2.z b/qt-hb_2.z new file mode 100644 index 0000000..5732d88 --- /dev/null +++ b/qt-hb_2.z @@ -0,0 +1,176 @@ +; QTROMWBW.Z - QTerm patch for RC2014 and RomWBW with VT 100 terminal +; +; July 2020, Paul Wrightson. Convert to use ROMWBW API +; September 2019, Anna Christina Nass +; based on IMSAI8080 patch: September 2019, Udo Munk +; + +.var DEVICE 0x02 ; HBIOS device to use +.var CIOIN 0x00 +.var CIOOUT 0x01 +.var CIOIST 0x02 +.var CIOOST 0x03 +.var CIOINIT 0x04 + +.org 0x0110 ; modem input status +modist: ld B,CIOIST ; HBIOS CIOOUT function + ld HL,device + ld C,(HL) ; device number (0,1,2,3) + rst 8 ; do it, result in A + ret + +.org 0x0120 ; modem input +modin: ld B,CIOIN ; HBIOS CIOIN function + ld HL,device + ld C,(HL) ; device number (0,1,2,3) + rst 8 ; do it, result in E, status in A + ld A,E ; put received char in A + ret + +.org 0x0130 ; modem output status +modost: ld B,CIOOST ; HBIOS CIOOUT function + ld HL,device + ld C,(HL) ; device number (0,1,2,3) + rst 8 ; do it, result in A + ret + +.org 0x0140 ; modem output +modout: ld B,CIOOUT ; HBIOS CIOOUT function + ld HL,device + ld C,(HL) ; device number (0,1,2,3) + ld E,A ; put char in E + rst 8 ; do it, result in A + ret + +.org 0x0150 ; start break +sbreak: ret + +.org 0x0160 ; stop break +ebreak: ret + +.org 0x0170 ; drop DTR +dtroff: ret + db 0x0c ;length of modem hang up string + db 0xfe,0xfe ;two delays + db 0x2b,0x2b,0x2b ;+++ + db 0xfe,0xfe ;two delays + db 'ATH0',0x0d ;ATH0 + +.org 0x0180 ; restore DTR +dtron: ret + +.org 0x0190 ; set baud rate +setbd: ret + +.org 0x01a0 ; baud rate table +baudtb: + db 0,0,0,0,0,0,0,0 + db 0,0,0,0,0,0,0,0 + +.org 0x01b0 ; set communication mode +setmod: ret + +.org 0x01c0 ; communication mode table +modetb: + db 0,0,0,0,0,0,0,0 + db 0,0,0,0 + +.org 0x01cc +resrvd: db 0 ; reserved for later use + +.org 0x01cd ; protocol transfer size +xfersz: db 8 + +.org 0x01ce ; processor speed +speed: db 8 ; cpu speed in Mhz; + +.org 0x01cf ; escape character +escape: db 0x19 ; 0x19: ^Y + +.org 0x01d0 ; signon message +signon: db 'RomWBW HBIOS - VT100\0' + +.org 0x01f0 ; clear screen +clrs: db '\e[2J' + db '\e[1;1H\0' + +.var scrout 0x0109 ; print character in C +.var decout 0x010c ; print string of value in HL + +.org 0x0200 ; moveto routine +moveto: push HL + ld C,'\e' + call scrout + ld C,'[' + call scrout + pop HL + push HL + ld L,H + ld H,00 + inc L + call decout + ld C,';' + call scrout + pop HL + ld H,00 + inc L + call decout + ld C,'H' + jp scrout + +.org 0x022f +tcbits: db 0b11000011 ;terminal capabilities + +.org 0x0230 +;brites: db '\e[1m\0' ;bright +brites: db '\0' ;bright + +.org 0x0238 +;dims: db '\e[0m\0' ;dim +dims: db '\0' ;dim + +.org 0x0240 +dlstr: db '\0' ;delete line + +.org 0x0248 +ilstr: db '\0' ;insert line + +.org 0x0250 +dcstr: db '\0' ;Delete character + +.org 0x0258 +icstr: db '\0' ;Insert character + +.org 0x0260 +ceol: db '\e[K\0' ;Clear to end of line + +.org 0x0268 +ceos: db '\e[J\0' ;Clear to end of screen + +.org 0x0270 ;entry subroutine +entry: jp init + +.org 0x0273 ;exit subroutine +exit: jp uninit + +.org 0x0276 ;user subroutine +user: ret + +.org 0x0279 ;keyboard map subroutine +kbmap: ret + +.org 0x0280 ; user patch area +; PUT RomWBW UNIT # here +device: db DEVICE + +; INITIALIZE RomWBW SERIAL DEVICE +init: ; ret ; Initialize. fall through to re-initialize. + +; RE-INITIALIZE RomWBW SERIAL DEVICE +uninit: ld B,CIOINIT ; HBIOS CIOINIT function + ld HL,device + ld C,(HL) ; device number (0,1,2,3) + ld DE,-1 ; "Reset with current settings" + rst 8 ; do it + ret ; not initialized, so no un-initialize + diff --git a/qtermh1.com b/qtermh1.com new file mode 100644 index 0000000000000000000000000000000000000000..71136b9d74ea5eb30ca2fef3519fd424fc45b927 GIT binary patch literal 17664 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