Added QTERM
This commit is contained in:
parent
baaf97e075
commit
78f55e6032
@ -1,3 +1,6 @@
|
|||||||
# rc2014-tools
|
# rc2014-tools
|
||||||
|
|
||||||
Utilities and programs adapted for use on my RC2014 CP/M microcomputer
|
Utilities and programs adapted for use on my RC2014 CP/M microcomputer
|
||||||
|
|
||||||
|
* [QTerm](qterm/) - a terminal program
|
||||||
|
|
||||||
|
65
qterm/README.md
Normal file
65
qterm/README.md
Normal 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
170
qterm/qt-rc82.z
Normal 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
170
qterm/qt-rc84.z
Normal 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
BIN
qterm/qterm43f.lbr
Normal file
Binary file not shown.
BIN
qterm/qterm82.com
Normal file
BIN
qterm/qterm82.com
Normal file
Binary file not shown.
BIN
qterm/qterm84.com
Normal file
BIN
qterm/qterm84.com
Normal file
Binary file not shown.
Loading…
Reference in New Issue
Block a user