1
0

Added QTERM

This commit is contained in:
Anna Christina Naß 2019-10-01 20:58:48 +02:00
parent baaf97e075
commit 78f55e6032
7 changed files with 409 additions and 1 deletions

View File

@ -1,3 +1,6 @@
# rc2014-tools
Utilities and programs adapted for use on my RC2014 CP/M microcomputer
* [QTerm](qterm/) - a terminal program

65
qterm/README.md Normal file
View File

@ -0,0 +1,65 @@
# QTERM
QTERM is a terminal program which provides the following:
* Capture of text files
* Send text files to remote
* Xmodem / Modem7 / Ymodem protocol transfer
* Kermit protocol transfer
* VT100 emulation
* Split screen mode to separate typed and received text
* Script mechanism for automatic dialing and automation of other operations
* Transfer of text to printer
* Full user area support
(c) David Goodenough
It also has a huge advantage (at least for me, Anna) over KERMIT: It does not strip the 8th bit from received characters, so using a VT100 ANSI compatible terminal, you can just log into Telnet BBSes and see the full glory of ANSI/ASCII BBS graphics :)
## RC2014 patch
The RC2014 patch is created by Anna Christina Naß.
It is based on the IMSAI8080 patch by Udo Munk, the SIO initialization code by Steve Cousins and the XMODEM patch for RomWBW by Wayne Warthen.
At the moment, the patches provided here are tested on a RC2014 running RomWBW and using 2x SC104 serial ports (SIO/2).
If you start from QTERM43F.LBR, the patches are applied using `ZSM` and `ZPATCH`, which are included in `QTERM84F.LBR`.
To assemble the patch, use:
ZSM QT-RCxx.Z
This creates QT-RCxx.O, which then has to be applied to the .COM file:
ZPATCH QTERM43F QT-RCxx
Now QTERM43F.COM has the patch applied and should be ready to use.
## Using
The patches (and the final .COM files provided here) work either with the second serial port on a SIO/2 card (base address 0x82) or on the first serial port on a second SIO/2 card (base address 0x84) - hence the naming of the files.
So for a RC2014 with one SIO/2 card, `QTERM82.COM` (and the patch file `QT-RC82.Z`) should work.
The escape key is `^Y`, so to get help, just press `^Y` and `?` in sequence.
## Details
When started, the patch initializes the serial port and it should "just work".
When exiting QTERM, the "uninitialization" routine is running, which calls the RomWBW function for "Reset with current settings".
I don't know (yet) what will happen on a RC2014 with the default ROM or with SCM.
If you have problems, you can change the patch file:
In the part:
.org 0x0273 ;exit subroutine
exit: jp uninit
change the `exit:` line into:
exit: ret
so the un-initialization routine won't be called.
You can then also remove the `uninit:` routine at the bottom of the code.
But then, other programs that will use the same serial port (e.g. KERMIT) won't run correctly until you reboot your system.

170
qterm/qt-rc82.z Normal file
View File

@ -0,0 +1,170 @@
; QT2014.Z - QTerm patch for RC2014 with VT 100 terminal
;
; September 2019, Anna Christina Nass
; based on IMSAI8080 patch: September 2019, Udo Munk
;
.var SIOC 0x82 ;sio control port (2nd port)
.var SIOD 0x83 ;sio data port (2nd port)
.var SDEV 1 ;RomWBW device number
;.var SIOC 0x84 ;sio control port (3rd port)
;.var SIOD 0x85 ;sio data port (3rd port)
;.var SDEV 2 ;RomWBW device number
.var RXRDY 1 ;receiver ready
.var TXRDY 4 ;transmitter ready
.org 0x0110 ; modem input status
modist: in a,(SIOC)
and RXRDY
ret
.org 0x0120 ; modem input
modin: in a,(SIOD)
ret
.org 0x0130 ; modem output status
modost: in a,(SIOC)
and TXRDY
ret
.org 0x0140 ; modem output
modout: out (SIOD),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 <return>
.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 'RC2014 SIO/2 - 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[2m\0' ;bright
.org 0x0238
dims: db '\e[1m\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
init: ld hl,SIOINI
ld B,9
ld C,SIOC
otir
ret
SIOINI: db 0b00011000 ; Wr0 Channel reset
db 0b00010100 ; Wr0 Pointer R4 + reset ex st int
db 0b11000100 ; Wr4 /64, async mode, no parity
db 0b00000011 ; Wr0 Pointer R3
db 0b11000001 ; Wr3 Receive enable, 8 bit
db 0b00000101 ; Wr0 Pointer R5
db 0b11101010 ; Wr5 Transmit enable, 8 bit, flow ctrl
db 0b00010001 ; Wr0 Pointer R1 + reset ex st int
db 0b00000000 ; Wr1 No Tx interrupts
uninit: ld B,4 ; HBIOS CIOINIT function 0x04
ld C,SDEV ; device number (0,1,2,3)
ld DE,-1 ; "Reset with current settings"
rst 8 ; do it
ret ; not initialized, so no un-initialize


170
qterm/qt-rc84.z Normal file
View File

@ -0,0 +1,170 @@
; QT2014.Z - QTerm patch for RC2014 with VT 100 terminal
;
; September 2019, Anna Christina Nass
; based on IMSAI8080 patch: September 2019, Udo Munk
;
;.var SIOC 0x82 ;sio control port (2nd port)
;.var SIOD 0x83 ;sio data port (2nd port)
;.var SDEV 1 ;RomWBW device number
.var SIOC 0x84 ;sio control port (3rd port)
.var SIOD 0x85 ;sio data port (3rd port)
.var SDEV 2 ;RomWBW device number
.var RXRDY 1 ;receiver ready
.var TXRDY 4 ;transmitter ready
.org 0x0110 ; modem input status
modist: in a,(SIOC)
and RXRDY
ret
.org 0x0120 ; modem input
modin: in a,(SIOD)
ret
.org 0x0130 ; modem output status
modost: in a,(SIOC)
and TXRDY
ret
.org 0x0140 ; modem output
modout: out (SIOD),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 <return>
.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 'RC2014 SIO/2 - 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[2m\0' ;bright
.org 0x0238
dims: db '\e[1m\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
init: ld hl,SIOINI
ld B,9
ld C,SIOC
otir
ret
SIOINI: db 0b00011000 ; Wr0 Channel reset
db 0b00010100 ; Wr0 Pointer R4 + reset ex st int
db 0b11000100 ; Wr4 /64, async mode, no parity
db 0b00000011 ; Wr0 Pointer R3
db 0b11000001 ; Wr3 Receive enable, 8 bit
db 0b00000101 ; Wr0 Pointer R5
db 0b11101010 ; Wr5 Transmit enable, 8 bit, flow ctrl
db 0b00010001 ; Wr0 Pointer R1 + reset ex st int
db 0b00000000 ; Wr1 No Tx interrupts
uninit: ld B,4 ; HBIOS CIOINIT function 0x04
ld C,SDEV ; device number (0,1,2,3)
ld DE,-1 ; "Reset with current settings"
rst 8 ; do it
ret ; not initialized, so no un-initialize


BIN
qterm/qterm43f.lbr Normal file

Binary file not shown.

BIN
qterm/qterm82.com Normal file

Binary file not shown.

BIN
qterm/qterm84.com Normal file

Binary file not shown.