Moved to other repository
This commit is contained in:
parent
9698fc979e
commit
d8182b4ee0
@ -1,120 +0,0 @@
|
||||
QTERM v4.3f - Recompile of 43e including 2 files from QT43EFIX.LBR
|
||||
|
||||
QTERM V4.3e is dedicated to the memory of Irv Hoff - a programmer who was
|
||||
a constant insipration while I was developing QTERM. Let us never forget
|
||||
the work he did for the CP/M community.
|
||||
|
||||
|
||||
Files included in QTERM43F.LBR: (QTERM43E.LBR)
|
||||
|
||||
!README.1YT You are
|
||||
QTCHAT.DYC QTERM chat scripts documentation
|
||||
*QTERM.CYM QTERM, unpatched
|
||||
QTERM.DYC QTERM documentation
|
||||
QTERM.FOR Quick description of what QTERM can do for you
|
||||
QTERM.PYT Patch information for QTERM
|
||||
*QT-PATCH.ZY Patch area source, to provide a basis to work with
|
||||
WHATS.NYW Upgrade list of what's changed since V4.2g
|
||||
|
||||
(* files not included in this LBR)
|
||||
|
||||
Additional files here:
|
||||
***************************************************************************
|
||||
Adam files:
|
||||
-QT-ADAM.4YF Notes on the Adam files here and using DDTZ
|
||||
QTERM43F.CYM Qterm patched for the ADAM with an 80 col display
|
||||
(use for replacement of the unpatched version)
|
||||
QT42G-AD.PYT Adam specific patch for Qterm 4.2g (usable on 4.3f)
|
||||
QT-ADAM.ZY Adam 80 Col patch for Televideo for ZSM/ZPATCH
|
||||
QT-ADM40.ZY Adam 40 Col patch for ZSM/ZPATCH
|
||||
|
||||
-README.FYX Fix for 43E to 43F
|
||||
QTZP.DYC Documentation on using ZSM and ZPATCH
|
||||
ZSM.CYM Z80 assembler for .Z files
|
||||
ZPATCH.CYM Hot Patcher for .Z/.O files
|
||||
DDTZDDT.CYM DDTZ patched for DDT compatible commands
|
||||
|
||||
I apologise to David Goodenough for changing his -README and LBR listing
|
||||
and hope he approves of the changes.. since this is for the ADAM CP/M LIB
|
||||
on CompuServe and ADAM users. Rob Friedman
|
||||
6/9/91
|
||||
Sysop ADAM CP/M
|
||||
CompuServe Computer Club
|
||||
|
||||
Note: files listed in the normal 43E not here are *'d. Also, This
|
||||
set of files includes notes from the 43E-FIX Library as well as
|
||||
some info. This file is set up as 43F.
|
||||
**************************************************************************
|
||||
|
||||
|
||||
Patch info for making QTERM work on your system is included in QTERM.PAT.
|
||||
As provided, QTERM will work on a Televideo 803 (or a TPC-1), because
|
||||
that's what I developed it on. Note that not all the patches are
|
||||
necessary, but the more optional ones you get going, the more features
|
||||
QTERM will have. QTERM.PAT also includes a reference to a "1K patch
|
||||
overlay". I'm trying to collect as many of these as possible, so if you
|
||||
can, try to get yours back to me, with a memo telling which computer it
|
||||
works on, and which of the optional patches you have included.
|
||||
|
||||
|
||||
The .?Y? files are made with the new LZH compression method, this typically
|
||||
produces files 10 to 15 to 20 % smaller than CRUNCH. EXL.COM (in EXL.LBR)
|
||||
is one tool that will decompress these, or CRLZH11.LBR is the original
|
||||
.LBR for LZH compression.
|
||||
|
||||
|
||||
For those that are interested, the name actually arose because in mid 1985
|
||||
I needed a terminal program for my CP/M machine (A Televideo 803) and
|
||||
put a quick 1/2K program together in under an hour. This program has been
|
||||
growing ever since, but the name Q(uick) TERM(inal) program remains.
|
||||
|
||||
|
||||
I give thanks to Dave Goodman, Tom Bopp, Larry Moore, Dave Presberg, Andy
|
||||
Meyer, David Douthitt, Mitch Mitchell and Jim Bianchi for all their help
|
||||
in debugging and beta testing QTERM, and to all the other people who have
|
||||
sent in patches and suggestions. I'd never have got it anything like
|
||||
working and as full featured without all your help.
|
||||
|
||||
|
||||
Credit is also due the unknown author of the UNIX Kermit implementation
|
||||
that I used for the basis of the Kermit code here, and to Steve Grandi
|
||||
who wrote the Xmodem program in C that provided the basis for the Xmodem
|
||||
code in QTERM.
|
||||
|
||||
|
||||
If you need to get hold of me for any reason (need help with patches, or
|
||||
a patch file to send my way), I can be reaced at:
|
||||
|
||||
UUCP: .....!wet!pallio!dg
|
||||
Internet: dg%pallio.uucp@cs.sfsu.edu
|
||||
GEnie: D.GOODENOUGH
|
||||
Q-Link: Delta G
|
||||
BBS's: DAVID GOODENOUGH on all of them
|
||||
(617) 965-7046
|
||||
(707) 539-1283
|
||||
(415) 654-3798
|
||||
(415) 755-2030
|
||||
|
||||
Or log into wet.UUCP at (415) 864-0954, and send me E-mail as dg once
|
||||
you get set up.
|
||||
|
||||
|
||||
David Goodenough (5-3-91)
|
||||
|
||||
|
||||
A few notes:
|
||||
|
||||
Take a look in WHATS.NEW to see what has changed since V4.2g
|
||||
|
||||
QTERM V4.2 style patches will still work with QTERM V4.3e
|
||||
|
||||
VT100.TC got dropped since it's no longer needed - see WHATS.NEW for details
|
||||
|
||||
Since I've had several requests over the years to release the source, it
|
||||
has been released. Modify it if you want, but please check back
|
||||
with me before you release a version, and let me know what changes
|
||||
you made, if they're useful I may put them into the next version.
|
||||
As a side note to this, if you come across a version, and you are
|
||||
not sure if it's been modified, check with me and I can give you
|
||||
the correct CRCK values for the original V4.3e.
|
||||
|
@ -1,4 +0,0 @@
|
||||
The files with the extension .?Y? are LZH Encoded. The program
|
||||
UNCRLZH v2.0 or LT30 (or later version of these programs) are
|
||||
required to decode them.
|
||||
|
@ -1,73 +0,0 @@
|
||||
|
||||
NOTES ON ADAM VERSION
|
||||
|
||||
Included here is the Qterm 4.3f for the Adam with an
|
||||
80 col. display and an external modem. I have used
|
||||
the codes for my TeleVideo 925 terminal, as they are
|
||||
similar to the ADM3A that a lot of you use. To change
|
||||
the screen codes is a simple matter. Use SPZ <SuperZap>
|
||||
on a COPY of the program, and go to the 3rd page <hit
|
||||
N twice>. You will see a grouping of ESCape codes <1B
|
||||
28, 1B 29, etc>. Using the Qterm.Pat as a guide, plug
|
||||
in your screen codes in those 8 positions <though you
|
||||
should try what I have here.. as it does work on a LOT
|
||||
of terminals. Exit with the ^Z and the Z command, and
|
||||
it should work. This version will also use the
|
||||
/QTERM.LBR for reading the script files, so that should
|
||||
save a lot of space.
|
||||
|
||||
See the file QT43F-AD.COM as the replacement for the
|
||||
unpatched QTERM.COM here. <If you are using this for a
|
||||
non-adam computer, just use your own patch instead>
|
||||
Also included is the QT42-AD.PAT for using DDT or DDTZ
|
||||
to install your own Qterm. See the QTERM.PAT for
|
||||
installing with DDT. For DDTZDDT <which is needed for
|
||||
TDOS> use the I command, and the R command. DDTZDDT
|
||||
is DDTZ patched to use DDT commands. It is included here.
|
||||
|
||||
Also, I've included the QT-ADAM.Z and the QT-ADM40.Z
|
||||
ZSM/ZPATCH files. Be aware that the patches for 42G work
|
||||
on 43F. Both are by QTERM author Dave Goodenough. The
|
||||
QT-ADAM.Z is set up for a Televideo screen, so you will
|
||||
have to edit it for the proper escape codes for your
|
||||
own screen. QT-ADM40.Z is set up for a standard 40-col
|
||||
under TDOS. See the QTZP.DOC for usage of ZSM and ZPATCH
|
||||
|
||||
Rob Friedman
|
||||
Sysop ADAM CP/M
|
||||
CompuServe Computer Club Forum
|
||||
3-25-90
|
||||
|
||||
I can be reached nightly on Compuserve's Computer Club forum
|
||||
with the User I.D. 76702,417
|
||||
|
||||
|
||||
Additional files here:
|
||||
***************************************************************************
|
||||
Adam files:
|
||||
-QT-ADAM.4YF Notes on the Adam files here and using DDTZ
|
||||
QTERM43F.CYM Qterm patched for the ADAM with an 80 col display
|
||||
(use for replacement of the unpatched version)
|
||||
QT42G-AD.PYT Adam specific patch for Qterm 4.2g (usable on 4.3f)
|
||||
QT-ADAM.ZY Adam 80 Col patch for Televideo for ZSM/ZPATCH
|
||||
QT-ADM40.ZY Adam 40 Col patch for ZSM/ZPATCH
|
||||
|
||||
-README.FYX Fix for 43E to 43F
|
||||
QTZP.DYC Documentation on using ZSM and ZPATCH
|
||||
ZSM.CYM Z80 assembler for .Z files
|
||||
ZPATCH.CYM Hot Patcher for .Z/.O files
|
||||
DDTZDDT.CYM DDTZ patched for DDT compatible commands
|
||||
|
||||
I apologise to David Goodenough for changing his -README and LBR listing
|
||||
and hope he approves of the changes.. since this is for the ADAM CP/M LIB
|
||||
on CompuServe and ADAM users. Rob Friedman
|
||||
6/9/91
|
||||
Sysop ADAM CP/M
|
||||
CompuServe Computer Club
|
||||
|
||||
Note: files listed in the normal 43E not here are *'d. Also, This
|
||||
set of files includes notes from the 43E-FIX Library as well as
|
||||
some info. This file is set up as 43F.
|
||||
**************************************************************************
|
||||
|
||||
|
@ -1,33 +0,0 @@
|
||||
[-READ.ME Mike Freeman 12-May-1991]
|
||||
This file contains two patches, QT43EFX1.Z and QT43EFX2.Z, each of which
|
||||
fixes a bug in QTERM.COM Version 43E (from QTERM43E.LBR) which caused sends
|
||||
using True Ymodem protocol to fail. QT43EFX1.Z was suggested by QTERM's
|
||||
author, David Goodenough and will, when patched over v43E of QTERM.COM,
|
||||
correct the bug. MODEM7 batch transfers will no longer work. QT43EFX2.Z,
|
||||
when patched over v43E of QTERM.COM will correct the same bug and allow
|
||||
MODEM7 batch transfers to work. It uses a small fraction of QTERM's patch
|
||||
area (from 0x04e0 to 0x04e7, inclusive). Thus, those who have QTERM patches
|
||||
which extend into this region should use QT43EFX1.Z instead. Also included
|
||||
in this archive is a corrected version of the appropriate QTERM source
|
||||
module, SEND.Z. This is being done with the permission of QTERM's author,
|
||||
David Goodenough. QTERM's version parameter "include-file", VERSION.I, is
|
||||
also included with the revision level bumped to "F". This is in line with
|
||||
Mr. Goodenough's wishes. Happy patching!
|
||||
-- Mike Freeman K7UIJ --
|
||||
[End of -READ.ME]
|
||||
|
||||
Addition by D. Goodenough, 5/22/91
|
||||
|
||||
QT43EFX2.Z as provided by Mike Freeman needed a little work: ZPATCH gets
|
||||
confused if .org's in a ZSM source file go backwards. This means that I
|
||||
had to put the low code (0x04e0) first. It'll work now.
|
||||
|
||||
Addition by R. Friedman, 6/9/91
|
||||
|
||||
I've renamed this little file -README.FIX and included it in a
|
||||
new LBR called QTERM43F. I used the newer source modules from
|
||||
Mike Freeman's FIX.LBR and the Qterm 43E source code from Dave
|
||||
Goodenough's source LBR, and recompiled it to make 43F. Hence, no
|
||||
need for the Fix.Z. So.. it is all better and running like a top!
|
||||
|
||||
|
Binary file not shown.
@ -1,253 +0,0 @@
|
||||
; QT-ADAM.Z - QTERM patch area for the Coleco ADAM
|
||||
;
|
||||
; Version 1.0
|
||||
|
||||
.var no 0 ; false value
|
||||
.var yes 0xff ; true value
|
||||
|
||||
.var datap 0x44
|
||||
.var statp 0x45
|
||||
.var baudp 0x46
|
||||
.var ctrlp 0x47
|
||||
|
||||
.var rxrdy 2
|
||||
.var txrdy 1
|
||||
|
||||
.var break 0x3f
|
||||
.var dtr 0x3d
|
||||
.var norm 0x37
|
||||
|
||||
.org 0x0110 ; modem input status
|
||||
modist: in a,(statp)
|
||||
and rxrdy
|
||||
ret
|
||||
|
||||
.org 0x0120 ; modem input
|
||||
modin: in a,(datap)
|
||||
ret
|
||||
|
||||
.org 0x0130 ; modem output status
|
||||
modost: in a,(statp)
|
||||
and txrdy
|
||||
ret
|
||||
|
||||
.org 0x0140 ; modem output
|
||||
modout: out (datap),a
|
||||
ret
|
||||
|
||||
.org 0x0150
|
||||
sbreak: ld a,break
|
||||
out (ctrlp),a
|
||||
ret
|
||||
|
||||
.org 0x0160
|
||||
ebreak: ld a,norm
|
||||
out (ctrlp),a
|
||||
ret
|
||||
|
||||
.org 0x0170
|
||||
dtroff: ld a,dtr
|
||||
out (ctrlp),a
|
||||
ret
|
||||
|
||||
.org 0x0180
|
||||
dtron: ld a,norm
|
||||
out (ctrlp),a
|
||||
ret
|
||||
|
||||
.org 0x0190
|
||||
setbd: jp finbd
|
||||
|
||||
; The Baud Rate Table has entries from 38400 baud down to 300 baud.
|
||||
; There are 2 bytes per entry. The second byte determines if the entry is
|
||||
; enabled or disabled (ffh=enabled; 00=disabled). The first byte is passed
|
||||
; as the A value to the setbd subroutine.
|
||||
|
||||
.org 0x01a0
|
||||
baudtb:
|
||||
b38400: db 0,no ; 38400
|
||||
b19200: db 0x3f,yes ; 19200
|
||||
b9600: db 0x3e,yes ; 9600
|
||||
b4800: db 0x3c,yes ; 4800
|
||||
b2400: db 0x3a,yes ; 2400
|
||||
b1200: db 0x37,yes ; 1200
|
||||
b600: db 0x36,yes ; 600
|
||||
b300: db 0x35,yes ; 300
|
||||
|
||||
.org 0x01b0
|
||||
setmod: jp finmod
|
||||
|
||||
; Communication Mode Table.
|
||||
|
||||
.org 0x01c0 ; communication mode table
|
||||
modetb:
|
||||
n17: db 0x4a
|
||||
n18: db 0x4e
|
||||
n27: db 0xca
|
||||
n28: db 0xce
|
||||
e17: db 0x7a
|
||||
e18: db 0x7e
|
||||
e27: db 0xfa
|
||||
e28: db 0xfe
|
||||
o17: db 0x5a
|
||||
o18: db 0x5e
|
||||
o27: db 0xda
|
||||
o28: db 0xde
|
||||
|
||||
.org 0x01cc
|
||||
resrvd: db 0 ; reserved for later use
|
||||
|
||||
.org 0x01cd ; protocol transfer size
|
||||
xfersz: db 8 ; number of K to read/write during file xfers
|
||||
; Must be 1 / 2 / 4 / 8. Best left as 8 unless
|
||||
; disk is verrrrry slow. Drop to smaller value
|
||||
; if too many timeouts occur during "protocol"
|
||||
; file transfers (xmodem or kermit).
|
||||
|
||||
.org 0x01ce ; processor speed
|
||||
speed: db 4 ; cpu speed in Mhz;
|
||||
|
||||
.org 0x01cf ; escape character
|
||||
escape: db '\e'
|
||||
|
||||
.org 0x01d0 ; signon message
|
||||
signon: db 'Adam w/80col & RS232\0'
|
||||
|
||||
|
||||
.org 0x01f0 ; clear screen
|
||||
clrs: db 'z' & 0x1f, 0 ; clear screen string is Control-Z
|
||||
|
||||
.var scrout 0x0109 ; (a routine to print to CON: the
|
||||
; character in C)
|
||||
.var decout 0x010c ; (a routine to print to CON: a decimal value
|
||||
; in HL. Is available for VT100 and the like.)
|
||||
|
||||
.org 0x0200 ; moveto routine
|
||||
moveto: push hl ; save row,col
|
||||
ld c,'\e' ; send escape
|
||||
call scrout
|
||||
ld c,'=' ; send =
|
||||
call scrout
|
||||
pop hl ; get row,col
|
||||
ld de,0x2020 ; add offset
|
||||
add hl,de
|
||||
push hl ; and save
|
||||
ld c,h ; send row+offset
|
||||
call scrout
|
||||
pop bc ; get col+offset
|
||||
jp scrout ; send
|
||||
|
||||
; Terminal Capability Bits. The eight bits stand for each of the following
|
||||
; strings. They count from 01h=bright to 80h=clear-to-end-of-screen.
|
||||
|
||||
.var b_brit 0b00000001 ; 0: bright -- NOT mandatory
|
||||
.var b_dim 0b00000010 ; 1: dim -- NOT mandatory
|
||||
.var b_ldel 0b00000100 ; 2: delete line -- important
|
||||
.var b_lins 0b00001000 ; 3: insert line -- important
|
||||
.var b_cdel 0b00010000 ; 4: delete character -- unused by QTERM
|
||||
.var b_cins 0b00100000 ; 5: insert character -- unused by QTERM
|
||||
.var b_ceol 0b01000000 ; 6: clear to end-of-line -- important
|
||||
.var b_ceos 0b10000000 ; 7: clear to end-of-screen-- important
|
||||
|
||||
.org 0x022f ; terminal capability bit map
|
||||
tcbits: db 0xff ; ff = support all bits
|
||||
|
||||
.org 0x0230
|
||||
brites: db '\e(\0' ;bright
|
||||
|
||||
.org 0x0238
|
||||
dims: db '\e)\0' ;dim
|
||||
|
||||
.org 0x0240
|
||||
dlstr: db '\eR\0' ;delete line
|
||||
|
||||
.org 0x0248
|
||||
ilstr: db '\eE\0' ;insert line
|
||||
|
||||
.org 0x0250
|
||||
dcstr: db '\eW\0' ;Delete character
|
||||
|
||||
.org 0x0258
|
||||
icstr: db '\eQ\0' ;Insert character
|
||||
|
||||
.org 0x0260
|
||||
ceol: db '\eT\0' ;Clear to end of line
|
||||
|
||||
.org 0x0268
|
||||
ceos: db '\eY\0' ;Clear to end of screen
|
||||
|
||||
; Entry and Exit hooks. These are provided to perform custom initialisation
|
||||
; on startup and on exit from QTERM. They are invoked before any use is made
|
||||
; of the screen or the port hardware.
|
||||
|
||||
.org 0x0270
|
||||
entry: jp do_ent ; entry hook (270h .. 272h)
|
||||
|
||||
.org 0x0273
|
||||
exit: jp do_exit ; exit hook (273h .. 275h)
|
||||
|
||||
.org 0x0276
|
||||
user: ret ; user subroutine (276h .. 278h)
|
||||
|
||||
.org 0x0279
|
||||
kbmap: ret ; keyboard map (279h .. 27bh)
|
||||
|
||||
.var ilprmt 0x027c ; entry to in line prompt subroutine.
|
||||
|
||||
; Extra patch area if needed. 280h .. 4ffh
|
||||
|
||||
.org 0x0280
|
||||
|
||||
finbd:
|
||||
ld b,a
|
||||
in a,(baudp)
|
||||
ld c,a
|
||||
in a,(baudp)
|
||||
ld a,0x22
|
||||
out (ctrlp),a
|
||||
ld a,c
|
||||
out (baudp),a
|
||||
ld a,b
|
||||
out (baudp),a
|
||||
ld a,0x27
|
||||
out (ctrlp),a
|
||||
ret
|
||||
|
||||
finmod:
|
||||
ld b,a
|
||||
in a,(baudp)
|
||||
in a,(baudp)
|
||||
ld c,a
|
||||
ld a,0x22
|
||||
out (ctrlp),a
|
||||
ld a,b
|
||||
out (baudp),a
|
||||
ld a,c
|
||||
out (baudp),a
|
||||
ld a,0x27
|
||||
out (ctrlp),a
|
||||
ret
|
||||
|
||||
do_ent:
|
||||
ld e,0x19
|
||||
ld c,2
|
||||
call 5
|
||||
in a,(baudp)
|
||||
ld b,a
|
||||
in a,(baudp)
|
||||
ld a,b
|
||||
or a
|
||||
ret nz
|
||||
ld a,(n18)
|
||||
call setmod
|
||||
ld a,(b2400)
|
||||
call setbd
|
||||
ret
|
||||
|
||||
do_exit:
|
||||
ld e,0x19
|
||||
ld c,2
|
||||
call 5
|
||||
ret
|
||||
|
||||
|
@ -1,251 +0,0 @@
|
||||
; QT-ADM40.Z - QTERM patch for the Coleco ADAM, w/ 40 columns
|
||||
|
||||
.var no 0
|
||||
.var yes ! no
|
||||
|
||||
.var datap 0x44 ; data port (in/out)
|
||||
.var statp 0x45 ; status port (in)
|
||||
.var contlp 0x47 ; control port (out)
|
||||
.var baudrp 0x46 ; baud rate port (out)
|
||||
.var inmsk 2 ; 8251 RxRDY
|
||||
.var outmsk 1 ; 8251 TxRDY
|
||||
.var chipset 0x37 ; 8251 RTS,ER,RxE,DTR,TxEN
|
||||
.var chipoff 0x35 ; 8251 RTS,ER,RxE,TxEN (no dtr)
|
||||
.var break chipset | 8 ; chipset OR send break
|
||||
.var freeze 0x22
|
||||
.var reset 0x27
|
||||
|
||||
; Misc variables
|
||||
|
||||
.var scrout 0x0109 ; output char in <C> (QTERM)
|
||||
.var decout 0x010c ; output decimal value in <HL> (QTERM)
|
||||
|
||||
; Modem input status. 110h-11fh.
|
||||
|
||||
.org 0x0110
|
||||
istat: in a,(statp)
|
||||
and inmsk
|
||||
ret
|
||||
|
||||
; Read modem character. 120h-12fh.
|
||||
|
||||
.org 0x0120
|
||||
idata: in a,(datap)
|
||||
ret
|
||||
|
||||
; Modem output status. 130h-13fh.
|
||||
|
||||
.org 0x0130
|
||||
ostat: in a,(statp)
|
||||
and outmsk
|
||||
ret
|
||||
|
||||
; Write modem character. 140h-14fh.
|
||||
|
||||
.org 0x0140
|
||||
odata: out (datap),a
|
||||
ret
|
||||
|
||||
; Break. Start break 150h-15fh; end break 160-16fh.
|
||||
|
||||
.org 0x0150
|
||||
brkon: ld a,break
|
||||
out (contlp),a
|
||||
ret
|
||||
|
||||
.org 0x0160
|
||||
brkoff: ld a,chipset
|
||||
out (contlp),a
|
||||
ret
|
||||
|
||||
; Dtr. Drop dtr 170h-17fh; restore dtr 180h-18fh.
|
||||
|
||||
.org 0x0170
|
||||
dtroff: ld a,chipoff
|
||||
out (contlp),a
|
||||
ret
|
||||
|
||||
.org 0x0180
|
||||
dtron: ld a,chipset
|
||||
out (contlp),a
|
||||
ret
|
||||
|
||||
; Baud rate. Routine 190h-19fh; table 1a0h-1afh.
|
||||
|
||||
.org 0x0190
|
||||
brset:
|
||||
jp finbd
|
||||
|
||||
.org 0x01a0
|
||||
brtbl:
|
||||
b38400: db 0,no ; 38400
|
||||
b19200: db 0x3f,yes ; 19200
|
||||
b9600: db 0x3e,yes ; 9600
|
||||
b4800: db 0x3c,yes ; 4800
|
||||
b2400: db 0x3a,yes ; 2400
|
||||
b1200: db 0x37,yes ; 1200
|
||||
b600: db 0x36,yes ; 600
|
||||
b300: db 0x35,yes ; 300
|
||||
|
||||
; Mode. Routine 1b0h-1bfh.
|
||||
|
||||
.org 0x01b0
|
||||
modset: jp finmod
|
||||
|
||||
; Mode. Table 1c0h-1cbh. 8251 mode byte, sets stop bits, parity,
|
||||
|
||||
.org 0x01c0
|
||||
modtbl:
|
||||
n71: db 0b01001010 ; 7n1 ; this table must be
|
||||
n81: db 0b01001110 ; 8n1 ; exactly 12 bytes long
|
||||
n72: db 0b11001010 ; 7n2
|
||||
n82: db 0b11001110 ; 8n2
|
||||
e71: db 0b01111010 ; 7e1
|
||||
e81: db 0b01111110 ; 8e1
|
||||
e72: db 0b11111010 ; 7e2
|
||||
e82: db 0b11111110 ; 8e2
|
||||
o71: db 0b01011010 ; 7o1
|
||||
o81: db 0b01011110 ; 8o1
|
||||
o72: db 0b11011010 ; 7o2
|
||||
o82: db 0b11011110 ; 8o2
|
||||
|
||||
; Miscellaneous one byte values.
|
||||
|
||||
.org 0x01cc
|
||||
db 0 ; reserved for future use
|
||||
|
||||
.org 0x01cd
|
||||
db 8 ; 1cdh - size of xfer buffer
|
||||
|
||||
.org 0x01ce
|
||||
db 4 ; 1ceh - cpu clock speed
|
||||
|
||||
.org 0x01cf
|
||||
db '\e' ; 1cfh - escape character
|
||||
|
||||
; Signon message. 1d0h-1efh
|
||||
|
||||
.org 0x01d0
|
||||
db '\ex9\nColeco ADAM 40 Col W/-RS232\0'
|
||||
|
||||
; Clear screen string
|
||||
|
||||
.org 0x01f0
|
||||
db 'z' & 0x1f, 0
|
||||
|
||||
; Moveto - move the cursor
|
||||
|
||||
.org 0x0200
|
||||
moveto: push hl ; save row,col
|
||||
ld c,'\e' ; send escape
|
||||
call scrout
|
||||
ld c,'=' ; send =
|
||||
call scrout
|
||||
pop hl ; get row,col
|
||||
ld de,0x2020 ; add offset
|
||||
add hl,de
|
||||
push hl ; and save
|
||||
ld c,h ; send row+offset
|
||||
call scrout
|
||||
pop bc ; get col+offset
|
||||
jp scrout ; send
|
||||
|
||||
; tcbits - what terminal capabilities are present
|
||||
|
||||
.org 0x022f
|
||||
db 0xff
|
||||
|
||||
.org 0x0230
|
||||
db '\eq\0'
|
||||
|
||||
.org 0x0238
|
||||
db '\ep\0'
|
||||
|
||||
.org 0x0240
|
||||
db '\eM\0'
|
||||
|
||||
.org 0x0248
|
||||
db '\eL\0'
|
||||
|
||||
.org 0x0250
|
||||
db 0x97,0
|
||||
|
||||
.org 0x0258
|
||||
db 0x94,0
|
||||
|
||||
.org 0x0260
|
||||
db '\eK\0'
|
||||
|
||||
.org 0x0268
|
||||
db '\eJ\0'
|
||||
|
||||
.org 0x0270
|
||||
jp entry
|
||||
|
||||
.org 0x0273
|
||||
jp exit
|
||||
|
||||
.org 0x0276
|
||||
ret
|
||||
|
||||
.org 0x0279
|
||||
ret
|
||||
|
||||
.org 0x0280
|
||||
finbd:
|
||||
ld b,a
|
||||
in a,(baudrp)
|
||||
ld c,a
|
||||
in a,(baudrp)
|
||||
ld a,freeze
|
||||
out (contlp),a
|
||||
ld a,c
|
||||
out (baudrp),a
|
||||
ld a,b
|
||||
out (baudrp),a
|
||||
ld a,reset
|
||||
out (contlp),a
|
||||
ret
|
||||
|
||||
finmod:
|
||||
ld b,a
|
||||
in a,(baudrp)
|
||||
in a,(baudrp)
|
||||
ld c,a
|
||||
ld a,freeze
|
||||
out (contlp),a
|
||||
ld a,b
|
||||
out (baudrp),a
|
||||
ld a,c
|
||||
out (baudrp),a
|
||||
ld a,reset
|
||||
out (contlp),a
|
||||
ret
|
||||
|
||||
entry:
|
||||
ld e,0x1a
|
||||
ld c,2
|
||||
call 5
|
||||
in a,(baudrp)
|
||||
ld b,a
|
||||
in a,(baudrp)
|
||||
ld a,b
|
||||
or a
|
||||
ret nz
|
||||
ld a,0x4e
|
||||
call 0x01b0
|
||||
ld a,0x37
|
||||
call 0x0190
|
||||
ret
|
||||
|
||||
exit:
|
||||
ld e,0x19
|
||||
ld c,2
|
||||
call 5
|
||||
ld c,9
|
||||
ld de,exitstr
|
||||
jp 5
|
||||
|
||||
exitstr:
|
||||
db 'z' & 0x1f, '\ey9$'
|
||||
|
Binary file not shown.
@ -1,650 +0,0 @@
|
||||
QTERM chat scripts
|
||||
==================
|
||||
|
||||
A chat script is a means for getting QTERM to automatically send and
|
||||
receive text, this can be used to auto-dial, connect to remote systems,
|
||||
log in to them, and do whatever else is wanted. In addition, chat scripts
|
||||
have a number of commands available, to do such things as protocol sends
|
||||
and receives, transfer of text files, and many other things.
|
||||
|
||||
There are two ways of invoking a chat script. Firstly when QTERM is
|
||||
executed from CP/M, a chat script and parameters can be provided there:
|
||||
|
||||
A>QTERM SCRIPT 1200
|
||||
|
||||
would be an example, alternatively the ^\ X command will prompt for a
|
||||
filename, the response can be exactly the same:
|
||||
|
||||
Filename: SCRIPT 1200
|
||||
|
||||
will have the same effect.
|
||||
|
||||
QTERM will look in several places to try to find the script. The first
|
||||
thing it will do is to take the filename as given (subject to the
|
||||
current default drive/user, which may have been changed by the !n or
|
||||
^\ N commands). If this is not successful, QTERM then searches the
|
||||
drive/user area that was active when it first started. It should be
|
||||
noted that if the entry subroutine includes BDOS calls to change either
|
||||
the drive or user, then the values rememberd by QTERM will be those on
|
||||
return from the entry subroutine. This provides a mechanism for setting
|
||||
up a default script area, a place where QTERM will always try to find
|
||||
scripts. In addition, if it can't find the script as a file in the
|
||||
default script area, QTERM will look for a .LBR file /QTERM.LBR and
|
||||
see if this library contains the script. The reason behind this is that
|
||||
scripts tend be fairly small, and it is far more efficient to keep them
|
||||
all together in one .LBR, since this saves disk space. It goes without
|
||||
saying that QTERM cannot deal with squeezed or crunched scripts, they
|
||||
must be saved in the .LBR as uncompressed ASCII text files.
|
||||
|
||||
When a chat script is running it can be terminated prematurely by typing
|
||||
^X on the keyboard: this will return to normal terminal mode.
|
||||
|
||||
There are two types of lines in a chat script: send/expect lines, and
|
||||
command lines. Command lines are always started with a '!' character,
|
||||
any other character starts a send/expect line.
|
||||
|
||||
Looking first at send/expect lines, they can contain up to six fields,
|
||||
and the first two must be provided, even if they are empty. An example
|
||||
of such a line is:
|
||||
|
||||
-AT\r-OK\r\n-3-2-3-0-
|
||||
|
||||
In this example the '-' (first character) is the delimiter used to
|
||||
separate fields. Any character can be used except for '!', but whatever
|
||||
character is chosen cannot appear in the strings. Also note that
|
||||
chosing a delimiter from the characters above 'z' in the ASCII character
|
||||
set (i.e. '{', '|', '}', and '~') has a special effect, which is explained
|
||||
below. Taking the fields in order they are SEND, EXPECT, TIME, TRIES,
|
||||
SUCCESS, and FAIL. SEND is a string that is transmitted by QTERM, so in
|
||||
the example above QTERM would transmit 'AT<carriage return>'. As was noted
|
||||
above, delimiters above 'z' have a special effect: they cause the SEND
|
||||
string to be written out slowly: there is a tenth of a second delay
|
||||
after each character. EXPECT is a string that QTERM is looking for in
|
||||
response to it's SEND string: so in the above example, QTERM would be
|
||||
looking for the 'OK<carriage return><linefeed>' that a Hayes compatible
|
||||
modem would respond with, when presented with 'AT<return>'.
|
||||
|
||||
The remining four fields are all decimal numbers, and can be omitted
|
||||
as QTERM will provide default values. TIME is the number of seconds
|
||||
to wait before assuming failure, if not given it defaults to 15. TRIES
|
||||
is the number of times to retry on failure, so taking our first example,
|
||||
TRIES is 2. If QTERM matched the EXPECT string on the first sending of
|
||||
SEND, all is well, but on the first failure it would resend the SEND string
|
||||
and look for the EXPECT string a second time. If it failed on this second
|
||||
attempt, only then would it consider this line to have failed. SUCCESS
|
||||
specifies the line number to transfer to in the chat script if it matched
|
||||
the EXPECT string. The default for this is the line following the current
|
||||
line. FAIL is the line to transfer to if the EXPECT string is not
|
||||
matched. This can be a line in the chat script, or as shown above 0 is
|
||||
allowed, which terminates the script immediately.
|
||||
|
||||
In the example above, the success and fail values are given as simple
|
||||
line numbers, it is also possible to use labels in chat scripts, see !:
|
||||
below for an explanation of how to define a label. If a label is being
|
||||
used, the line might look like this:
|
||||
|
||||
-ATDT5551234\r-CONNECT-30--`connect-`fail-
|
||||
|
||||
In this case, the `connect and `fail are label usages, and cause transfer
|
||||
to wherever the corresponding label is. Label useage is introduced with the
|
||||
backquote character `, which must be followed by the label itself, with no
|
||||
intervening white space: -` connect- will not work. Using an undefined label
|
||||
does not directly cause an error, but the substitution of the non-existant
|
||||
label will usually create a line that cannot be parsed, thus flagging the
|
||||
error.
|
||||
|
||||
In another example, if the first line were:
|
||||
|
||||
-AT\r-OK\r\n--5-
|
||||
|
||||
since TIME is empty, it defaults to 15, but as TRIES is 5, this line
|
||||
would try five times before giving up. Note also from this example
|
||||
that there are two ways of causing QTERM to default a value: an empty
|
||||
field (TIME) or end of the string (SUCCESS and FAIL). Note that the
|
||||
closing '-' after the 5 for TRIES is necessary. On the basis of this,
|
||||
the absulute minimum line is:
|
||||
|
||||
-send-expect-
|
||||
|
||||
This uses all four defaults: 15 seconds timeout, 1 try, success goes to
|
||||
the next line, failure terminates the script. The idea behind these
|
||||
defaults is that a collection of simple send/expect lines like the above
|
||||
allow a "conversation" to be held with the remote system.
|
||||
|
||||
It is possible that either of SEND or EXPECT can be empty: an empty SEND
|
||||
causes nothing to be sent, but the EXPECT must be matched to continue;
|
||||
an empty EXPECT automatically matches. Note that if both are empty then
|
||||
the chat script will terminate when it reaches that line, so a line like:
|
||||
|
||||
---
|
||||
|
||||
will serve as a means to terminate a chat script, returning to terminal
|
||||
mode.
|
||||
|
||||
Command lines in chat scripts start with '!', and following the '!' is
|
||||
a command letter. If input is needed (e.g. for a '!b' or '!s' line)
|
||||
it should be placed after the command letter:
|
||||
|
||||
!b 1200 8n1 -5 30 500 +\x13\x11
|
||||
|
||||
As is shown in the above example, spaces are permitted after the command
|
||||
letter, but not before.
|
||||
|
||||
Several of the ! commands correspond to ^\ commands available from terminal
|
||||
mode: the !b above would set the baud rate etc., just like the corresponding
|
||||
^\ B command would.
|
||||
|
||||
Commands available in this group are:
|
||||
|
||||
!, hangup
|
||||
!. break
|
||||
!B set baud rate
|
||||
!E set local echo
|
||||
!H set half duplex
|
||||
!J toggle junking of control characters
|
||||
!L set linefeed send for 'P'
|
||||
!M set bit 7 mask
|
||||
!N select new drive/user
|
||||
!O toggle output to the printer
|
||||
!V toggle VT100 emulation
|
||||
!W toggle split window mode
|
||||
!K program function key
|
||||
!P print file to remote
|
||||
!U invoke user function
|
||||
!R protocol receive
|
||||
!S protocol send
|
||||
!C open catch file
|
||||
!Y put catch file on hold
|
||||
!Z close catch file
|
||||
!X activate chat script
|
||||
!Q exit QTERM
|
||||
|
||||
Note also that the toggles ('!E', '!H', '!J', '!L', '!M', '!O', '!V' and '!W')
|
||||
behave a little differently. Since the state of these toggles is not defined
|
||||
when a chat script starts, with one exception (!W) there are three ways of
|
||||
invoking these. Using '!H' as an example:
|
||||
|
||||
!h
|
||||
|
||||
behaves as would an <escape> 'H' in normal operation, i.e. it toggles
|
||||
the half duplex switch. However, if the following is given:
|
||||
|
||||
!h 1
|
||||
|
||||
the trailing '1' forces half duplex to be enabled, irrespective of
|
||||
it's original state, and:
|
||||
|
||||
!h 0
|
||||
|
||||
guarantees to turn half duplex off. The other toggles work in the same
|
||||
manner: a trailing '0' always disables, and a trailing '1' always
|
||||
enables. !W is a little different, in that there are three possibilities:
|
||||
window mode off, window mode on with big receive, and on with small. Also
|
||||
allowing a pure toggle could have undefined results, since if window mode
|
||||
were toggled on, there would be no indication what size was wanted. As
|
||||
a result of this, there are three forms for the !W command in a script:
|
||||
|
||||
!w 0
|
||||
|
||||
forces window mode off,
|
||||
|
||||
!w b
|
||||
|
||||
forces it on with a big receive window, and:
|
||||
|
||||
!w s
|
||||
|
||||
forces it on, but with a small window. With all these toggles (!h etc. and
|
||||
!w) the options above are guaranteed, using any other option letters will
|
||||
have undefined results.
|
||||
|
||||
The 'X' command to activate a chat script can be used to chain scripts
|
||||
together: when an 'X' is encountered the specified chat script is
|
||||
invoked, however the current script is lost: it is overwritten by the
|
||||
new one.
|
||||
|
||||
There are other commands that are not normally available are as follows:
|
||||
|
||||
|
||||
!: - Define a label. Label usage was described above: the '`' character
|
||||
introduces a label usage. NOTE that this is the BACKQUOTE character, not
|
||||
the usual single quote character. To define a label, simply include a
|
||||
line of the form:
|
||||
|
||||
!: connect
|
||||
|
||||
in the script. A few comments may make labels easier to use, firstly
|
||||
they cannot be longer than seven characters, and where they are defined
|
||||
there should be no trailing blanks. When a label is used, it is done by
|
||||
means of a simple text substitution: after seeing a '`' character, QTERM
|
||||
tries to match the following text with a label in the script, and it
|
||||
stops at the first match. So if you have two labels one of which is a
|
||||
prefix of the other, the results can be unpredictable. As a byproduct
|
||||
of this, undefined labels do not generate an error (they just become
|
||||
line zero), but the text substitution doesn't remove the label, so the
|
||||
resulting line usually generates an error. In the event that a '`'
|
||||
character is needed as part of a send or expect string, it can be
|
||||
escaped by preceeding it with a $, so the line:
|
||||
|
||||
.send.exp$`ect.
|
||||
|
||||
will look for exp`ect, whereas:
|
||||
|
||||
.send.exp`ect.
|
||||
|
||||
will not work, it would try to look for and substitute the label 'ect'.
|
||||
Since '$' is used to escape '`', it must also be used to escape itself,
|
||||
so to match the string XXX$YYY, the script line would need to be:
|
||||
|
||||
.send.XXX$$YYY.
|
||||
|
||||
Labels should always be used to transfer control in a script: when a
|
||||
script is being read in, comments and blank lines are stripped very
|
||||
early in the process. This means that a given line in the script file
|
||||
may have a different line number as far as QTERM is concerned. Labels
|
||||
bypass this problem, so their usage is highly recommended.
|
||||
|
||||
|
||||
The commands !@ and !# can be used for variable manipulation. Their
|
||||
main purpose is to prevent infinite loops in chat scripts. In the
|
||||
following example:
|
||||
|
||||
!: reset
|
||||
.AT\r.OK\r\n.5.5.
|
||||
.ATDT5551212\r.CONNECT.30..`connect.`reset.
|
||||
!: connect
|
||||
. ........
|
||||
|
||||
if the system being called is off line and not answering, QTERM will
|
||||
loop here for ever. The !@ and !# provide the ability to keep count and
|
||||
terminate the loop after some specified number of tries.
|
||||
|
||||
!@ var term +/- term
|
||||
|
||||
is the form of an @ line. var is a single letter variable (there are 26
|
||||
available: a through z), and term is either a number or a variable. This
|
||||
is very simplistic, in that two terms must be present: to set a variable
|
||||
simply say something like:
|
||||
|
||||
!@ a 5 + 0
|
||||
|
||||
the operator can be either + or - and they act as you would expect. so:
|
||||
|
||||
!@ a a - 1
|
||||
|
||||
will subtract 1 from a, or:
|
||||
|
||||
!@ a a + b
|
||||
|
||||
will add b to a, etc. etc. Note that variables are recognised in either
|
||||
upper or lower case:
|
||||
|
||||
!@ A a + B
|
||||
|
||||
would have exactly the same effect as the line above. Note that these are
|
||||
single bytes, so there is some risk of working with values above 255.
|
||||
|
||||
!# tests variables: the general syntax is:
|
||||
|
||||
!# var operator term line
|
||||
|
||||
where var is a variable letter, term is a variable or a number, and the
|
||||
operator can be '=' to test for equality, '#' to test for inequality, '<'
|
||||
to check for less than and '>' to test for greater than. line is simply
|
||||
the line number in the script to go to is the test succedes. Note that this
|
||||
also provides a goto capability:
|
||||
|
||||
!# a = a `doit
|
||||
|
||||
will always go to doit, since a is always equal to itself.
|
||||
|
||||
All variables are initialized to zero when the first script in a series is
|
||||
invoked, but values are retained when a !x command chains from one script
|
||||
to another.
|
||||
|
||||
|
||||
In addition to !@ and !# which set and test numeric variables, there are two
|
||||
corresponding commands which set and test string variables. !$ and !% will
|
||||
set and test strings. A line like:
|
||||
|
||||
!$ a This is a string
|
||||
|
||||
will put 'This is a string' into string variable a. Note that when a script
|
||||
is started, or chained to with a !x command, the first nine parameters
|
||||
become strings $1 through $9. These can be assigned to only if they are not
|
||||
set when the script is invoked. The reason behind this is that if the
|
||||
command line parameters are set with default values at the top of the script,
|
||||
then missing parameters can be dealt with. An example might be a script
|
||||
where the first parameter provides the baud rate, if it's invoked as:
|
||||
|
||||
SCRIPT 1200
|
||||
|
||||
then $1 will contain '1200', however if the following line appears in the
|
||||
script:
|
||||
|
||||
!$ 1 2400
|
||||
|
||||
this will not disturb the 1200 in the case above, however if the script
|
||||
is invoked with no parameters, then $1 will be empty initially, and the
|
||||
assignment will put 2400 into it. String variables are used simply by
|
||||
naming them, so to use $1 in this case, a line like:
|
||||
|
||||
!b $1 8n1
|
||||
|
||||
would set the baud rate as needed. In a similar manner, numeric variables
|
||||
can be used simply by naming them:
|
||||
|
||||
-Send @a\r-expect-
|
||||
|
||||
would have the @a expanded to whatever the current value in variable a is.
|
||||
|
||||
As is done with labels, $a string use and @a variable use is handled by
|
||||
simple text substitution, so a little care will make their use easier.
|
||||
As was described above, '$' is used to escape '`' characters in strings,
|
||||
it is also used to escape itself, and it can also be used to escape an
|
||||
'@' character in a string. So, to actually place a '$' character in a
|
||||
string say '$$', so that:
|
||||
|
||||
.send.exp$$ect.
|
||||
|
||||
would look for the string 'exp$ect'. There are only three things that
|
||||
can follow a '$' sign: either '$' or '`' for escaping purposes,
|
||||
and '1' through '9' and 'a' through 'z' for string substitution.
|
||||
Placing any other character after a '$' will have an undefined result.
|
||||
|
||||
To test a string variable the !% line can be used: there are three forms
|
||||
this line takes:
|
||||
|
||||
!% = .string1.string2. `label
|
||||
!% _ .string1.string2. `label
|
||||
!% # .string1.string2. `label
|
||||
|
||||
The first one will jump to label if the two strings are equal, so to test
|
||||
a string, a line like:
|
||||
|
||||
!% = .$a.exit. `doexit
|
||||
|
||||
would jump to label doexit if string variable a contained 'exit'. The second
|
||||
case is identical, except that the test is done ignoring case, so if _ were
|
||||
used instead of = in the example above, 'exit', 'Exit', 'EXIT', and 'eXiT'
|
||||
would all test as equal. The last case jumps to the label if the two strings
|
||||
are different.
|
||||
|
||||
|
||||
Two commands exist to manipulate the appearance of chat scripts:
|
||||
|
||||
!> This is a line of text\r\n
|
||||
|
||||
!> simply prints the text, after processing '\' escapes. Note that
|
||||
leading and trailing spaces are ignored, so the above case would start
|
||||
with the 'T' of 'This'. In order to start or end with a with a space,
|
||||
\x20 can be used.
|
||||
|
||||
!&
|
||||
|
||||
This command is actually three different commands rolled into one:
|
||||
!& o manipulates the echoing of characters received from the modem
|
||||
while the script is running:
|
||||
|
||||
!& o 1
|
||||
|
||||
forces modem echo on,
|
||||
|
||||
!& o 0
|
||||
|
||||
forces it off, and:
|
||||
|
||||
!& o
|
||||
|
||||
simply switches state. In the same manner, !& m controls printout of
|
||||
the 'Match: OK' messages that are printed when QTERM matches the expect
|
||||
string in a send/expect line, and the 'Fail' and 'Retry' messages as
|
||||
well. These two are initially on when a script starts, the third case
|
||||
is !% l which controls printout of 'Looking for: ' messages. When this
|
||||
option is turned on, these messages are printed when QTERM starts
|
||||
looking for the expect string.
|
||||
|
||||
|
||||
As a complement to !>, the !< command can be used to take keyboard input,
|
||||
and make decisions based on what happens. This includes two subcommands
|
||||
altogether:
|
||||
|
||||
!< - variable
|
||||
|
||||
The '-' causes QTERM to prompt for a line of input using CP/M's BDOS
|
||||
buffered command. The line is then in the named variable, and can later
|
||||
be tested with !% lines.
|
||||
|
||||
This allows for such things as multiple choice:
|
||||
|
||||
!> \r\nSelect system to call\r\n
|
||||
!> 1. System 1 ..... \r\n
|
||||
!> 2. System 2 ..... \r\n
|
||||
!> 3. System 3 ..... \r\n
|
||||
!: prompt
|
||||
!> Enter 1, 2 or 3:\x20
|
||||
!< - a
|
||||
!% = .$a.1. `sys1
|
||||
!% = .$a.2. `sys2
|
||||
!% = .$s.3. `sys3
|
||||
!> Error, invalid input\r\n
|
||||
!# a = a `prompt
|
||||
|
||||
Where the first 4 lines print a menu, the next line defines a label. Then
|
||||
comes a prompt, followed by an input command. After this, the line is
|
||||
checked against 1, 2 and 3, and a jump is made to the appropriate label.
|
||||
If there is no match an error message is printed, and the !# a = a line
|
||||
is used as a goto, since a is always equal to a.
|
||||
|
||||
In a similar manner, '!< . a' will provide a "hot key" input - this reads
|
||||
a single keystroke from the keyboard, and saves the numeric value of the
|
||||
key pressed in the named variable, where it can be tested with a !# line.
|
||||
|
||||
|
||||
The ![ command provides a similar function to the !< command, but it
|
||||
works on text coming from the modem. There are several different
|
||||
sub-commands available:
|
||||
|
||||
![ -
|
||||
|
||||
reads text from the modem. In this instance there are two ways that
|
||||
reading can end:
|
||||
|
||||
![ - 15
|
||||
|
||||
would simply read text for 15 seconds. This numeric timeout must be
|
||||
provided, but in addition up to four extra strings can be provided:
|
||||
|
||||
![ - 5 .string1.string2.string3.string4.
|
||||
|
||||
in which case input will terminate when 5 seconds have elapsed, or one
|
||||
of the four strings is read. In this line, the '.' following the 5 is a
|
||||
delimiter, this serves to separate the strings exactly like the delimiter
|
||||
in a send / expect line. Not all four strings need to be there:
|
||||
|
||||
![ - 5 .OK.ERROR.
|
||||
|
||||
is acceptable, but the trailing delimiter must be there after the last
|
||||
string. In addition to scanning for the four lines, QTERM keeps the last
|
||||
sixty-four characters seen in a buffer, these can then be inspected with
|
||||
![ =, ![ +, and ![ _ lines.
|
||||
|
||||
![ : 20
|
||||
|
||||
watches the data arriving from the modem, and only stops when 20 seconds
|
||||
of silence are detected. This can prove useful when !C has opened a file,
|
||||
and you want to capture the incoming text until a period of silence.
|
||||
In addition, the last 64 characters are saved, just like with ![ - and
|
||||
they can be tested with the same three commands.
|
||||
|
||||
The three commands that test are:
|
||||
|
||||
![ = string `label
|
||||
![ + string `label
|
||||
![ _ string `label
|
||||
|
||||
These are all very similar in that they all jump to label if the string is
|
||||
found in the "last 64 character buffer", however the exact nature of the
|
||||
test varies. Also note that during the search for the expect string in a
|
||||
normal send/expect line, the last 64 characters seen are also saved in
|
||||
this buffer, and can be tested using these commands.
|
||||
|
||||
![ = string `label
|
||||
|
||||
searches the saved text for the string, which in this case can include
|
||||
\ escapes. If string occured anwhere in the last 64 characters, control
|
||||
goes to label. ![ + looks exactly the same, but the difference is whether
|
||||
the test is done on seven or eight bit data: ![ = just compares the least
|
||||
significant seven bits, ignoring the parity bit, whereas ![ + compares
|
||||
all eight. Note also that the strings provided in the ![ - line are only
|
||||
checked in seven bit mode. ![ _ also does a seven bit test, but in addition
|
||||
it ignores case.
|
||||
|
||||
Since spaces are used as the delimiter on a ![ = line, it is necessary to
|
||||
escape a space: to match the 'CONNECT 1200' string that might be received
|
||||
from a modem, it would be necessary to do something like this:
|
||||
|
||||
![ = CONNECT\x201200 `con1200
|
||||
|
||||
where the \x20 is an encoded space. Consult QTERM.DOC for a discourse on
|
||||
\ escapes in strings.
|
||||
|
||||
Finally:
|
||||
|
||||
![ ^ a XY
|
||||
|
||||
allows a string to be extracted from the 64 character buffer and copied
|
||||
into a variable. a is the variable name in this case (only letter variables
|
||||
are allowed), and XY are two characters that delimit the string. If they
|
||||
are left off, they both default to zero (NUL character, not '0' which is
|
||||
ascii 0x30), which matches any white space. X and Y can be \ escapes, and
|
||||
note that \0 (i.e. a NUL) has the special effect mentioned. The exact
|
||||
algorithm used to determine the text to be saved is:
|
||||
|
||||
1. Scan backwards from the end of the buffer (last characters received), till
|
||||
a 'Y' is seen, then skip over any adjacent duplicates. Then scan back to the
|
||||
next 'X', and take all characters between, not including the X or Y. So if
|
||||
the tail of the buffer holds:
|
||||
|
||||
..... YYY XXThis is a stringYY hello X world X
|
||||
|
||||
the string that would be extracted is 'This is a string'. As always, a little
|
||||
care and attention will help in chosing the correct way of getting a buffer
|
||||
of 64 characters, and then some care in chosing the delimiters will ensure
|
||||
the correct string is extracted into the variable.
|
||||
|
||||
|
||||
The !~ command has been added for rudimentary file manipulation
|
||||
during chat script operation. Four options exist:
|
||||
|
||||
!~ - file
|
||||
|
||||
will erase a file. Note that QTERM will silently ignore this command
|
||||
if the file doesn't exist, or if it is write protected. As with all
|
||||
filenames, a drive/user can be given:
|
||||
|
||||
!~ - d15:foo.bar
|
||||
|
||||
does like you'd expect.
|
||||
|
||||
!~ = newname = oldname
|
||||
|
||||
renames a file: note that if a drive/user is given on oldname, it will
|
||||
be ignored: newname completely defines where the action will happen.
|
||||
This will fail silently if newname already exists, or if old name doesn't,
|
||||
or if oldname does exist but is write protected.
|
||||
|
||||
!~ + newname = oldname
|
||||
|
||||
copies a file. In this case a file can be copied to a different
|
||||
drive / user, so if needed a drive / user spec should be attached to
|
||||
oldname. This will fail silently if newname exists or if oldname doesn't.
|
||||
These can be used to good effect when QTERM is sending text files as
|
||||
messages to a BBS, after sending the file with a !P command, a !~ - will
|
||||
erase it, or files can be erased after uploading, or a file might be
|
||||
renamed after a batch download.
|
||||
|
||||
The last options don't change any files, but allow QTERM to conditionally
|
||||
alter script execution depending on whether a file exists or not:
|
||||
|
||||
!~ Y filename line
|
||||
!~ N filename line
|
||||
|
||||
This simply transfers control to line if filename exists. As always line can
|
||||
be a label. If needed, filename can be a wildcard:
|
||||
|
||||
!~ Y A17:*.TXT `sendtxt
|
||||
|
||||
will go to label sendtxt only if there are any files on A17: matching the
|
||||
*.TXT wildcard.
|
||||
|
||||
|
||||
Two commands exist to allow strings to be saved during a script run, for
|
||||
possible reloading during a later script run. The commands are:
|
||||
|
||||
!( r a 7
|
||||
|
||||
to read, and:
|
||||
|
||||
!( w b 3
|
||||
|
||||
to write. The r or w specifies read or write, following this is a single
|
||||
letter that tells which string variable to read or write, and finally a
|
||||
file position to use. QTERM uses the file /QTERM.STR in the default chat
|
||||
drive/user area as the file that holds thee saved strings, the last parameter
|
||||
specifies which record will be used. '0' uses the first record, and up to a
|
||||
certain point, the file can be made as large as is needed: ten records
|
||||
would provide '0' through '9', however the file can be made larger to hold
|
||||
records 'A' through 'Z', or even 'a' through 'z' if needed. To create a
|
||||
record with a given index, simply use the !( w command to write to it,
|
||||
so if a file containing just ten empty is desired, the following ten line
|
||||
script would create it:
|
||||
|
||||
!( a 0
|
||||
!( a 1
|
||||
!( a 2
|
||||
!( a 3
|
||||
!( a 4
|
||||
!( a 5
|
||||
!( a 6
|
||||
!( a 7
|
||||
!( a 8
|
||||
!( a 9
|
||||
|
||||
This would set all the saved strings to empty, since string a will be
|
||||
initially empty when the script starts. Note that while QTERM can add
|
||||
records to an already existing file, the file must exist in order for
|
||||
QTERM to access it. Several means exist for creating it:
|
||||
|
||||
A>SAVE 0 /QTERM.STR
|
||||
|
||||
under CP/M 2.2 will work, or using a text editor to create an empty
|
||||
file, or even using the <ESCAPE> C command under QTERM to open a catch
|
||||
file, and then immediately closing it with an <ESCAPE> Z command.
|
||||
|
||||
This function can be used to good effect when a script is used to
|
||||
call a BBS, and you want to use a catch file to capture new messages.
|
||||
If the BBS can't do this for you, then the ![ - and ![ : lines can
|
||||
be used to catch the high message number in the 64 character buffer,
|
||||
then the ![ ^ line can be used to pluck it out into a string, from
|
||||
where it can be saved in the file. Then next time the script is
|
||||
running, it can read the previous high message number back into a
|
||||
string, and use it in a line line:
|
||||
|
||||
.read new $a\r..
|
||||
|
||||
to send it back to the BBS as the first message number required.
|
||||
|
||||
|
||||
As a final note, any other command character is silently ignored,
|
||||
this can be put to use to introduce comments. At this stage, !; is
|
||||
not in use, and this is the official comment entry, it is guaranteed
|
||||
that !; will never be used for a command line function in a QTERM
|
||||
chat script. Further, when a script is being read in by QTERM, blank
|
||||
lines and lines starting with !; are discarded fairly early. This has
|
||||
two side effects, it means that comments can be used freely without
|
||||
using up any of the 4K space available for saving scripts, but it
|
||||
also means that line numbers should not be used in scripts as the
|
||||
targets of jumps (i.e. the last two fields of a send / expect line)
|
||||
since the target line number may well change. Use labels instead.
|
||||
|
@ -1,457 +0,0 @@
|
||||
QTERM
|
||||
=====
|
||||
|
||||
If QTERM is invoked with no arguments, it starts up, and after signing
|
||||
on, you are immediately connected with the modem. If an argument file
|
||||
is provided, then it is assumed to be a chat script (see 'X'), and the
|
||||
chat script is immediately activated. With this file as with all others
|
||||
that can be entered, user numbers can be included in the filespecification:
|
||||
B3:CHAT.XYZ will look for the file in user area 3 on drive B: Either the
|
||||
drive or the user alone can be given: A:FOO.FOO and 7:BAZ.BAR are both
|
||||
acceptable, anything not given defaults to the current values. On
|
||||
completion of the chat script, command passes to normal connected
|
||||
operation. All special actions are initiated by typing the escape
|
||||
character, what happens next is determined by the next character typed.
|
||||
Note that while all letters here are shown in upper case, lower case works
|
||||
equally well: so <escape> b also activates the code to set the baud rate.
|
||||
As delivered, the escape character is set to control backslash, however it
|
||||
can be changed by patching QTERM: see QTERM.PAT for details, so to print
|
||||
help type '^\' '?', etc. In all the descriptions that follow, references to
|
||||
the escape character refer to this (i.e. '^\' and not the ESC key - '^[')
|
||||
|
||||
At several places in QTERM it is necessary to be able to encode control
|
||||
characters and other "non-printing" characters in a visible mode, to
|
||||
do this a special escape mechanism is used. To start one of these escape
|
||||
sequences a backslash '\' is used, followed by one or more characters to
|
||||
define the desired character. The following are provided: '\r' carriage
|
||||
return (0x0d), '\n' linefeed (0x0a), '\t' tab (0x09), '\b' backspace
|
||||
(0x08), '\e' escape (0x1b), '\k' break, and '\d' delay. '\k' causes a
|
||||
break to be sent if this string is subsequently sent to the modem (as in
|
||||
a chat script), and '\d' causes a delay of one second when used in a
|
||||
chat script. In addition a backslash can be followed by up to three
|
||||
octal digits to send the character with that representation: so '\177'
|
||||
would send a delete, and '\003' or '\3' would send a control C; this can
|
||||
also be done for hexadecimal representations: in this case '\x' is the
|
||||
leadin, and it is followed by up to two hexadecimal digits: so '\x7f'
|
||||
would again send a delete, and '\xd' could be used in place of '\r' to
|
||||
send a carriage return. The rule for determining how many characters are
|
||||
used when scanning an octal or hex number is as follows: octal has a
|
||||
maximum of three, hex a maximum of two (not including the \ or \x
|
||||
respectively): use at most that many characters, or stop early if an
|
||||
inappropriate character is encountered.
|
||||
|
||||
Retyping the escape character (i.e. typing it twice) sends a single copy
|
||||
of the escape character to the remote system.
|
||||
|
||||
Other characters and what they do are:
|
||||
|
||||
? - Print help - QTERM provides a brief synopsis of the available commands.
|
||||
|
||||
|
||||
. - Send a break - If QTERM has been patched to do it, this will transmit
|
||||
a 3/10th second break.
|
||||
|
||||
|
||||
, - Hang up modem - This is done by deactivating DTR for a short time, which
|
||||
causes most modems to hang up. Again QTERM has to be patched to do this.
|
||||
Alternatively, if your modem doesn't respond to DTR, it is possible to
|
||||
have QTERM transmit a string to cause a hangup: for example the:
|
||||
|
||||
'<delay> +++ <delay> ATH0'
|
||||
|
||||
as required by a HAYES compatible modem. See the patch documentatin for
|
||||
details.
|
||||
|
||||
|
||||
B - Change baud rate and mode - This will first prompt you, your response
|
||||
must look like the following:
|
||||
|
||||
nnnn
|
||||
nnnn mmm
|
||||
* mmm
|
||||
nnnn mmm -3 20 500 +AB
|
||||
|
||||
where 'nnnn' is a number specifying the baud rate. Up to eight options
|
||||
are available: 300 600 1200 2400 4800 9600 19200 and 38400, although not
|
||||
all of these may be enabled. 'mmm' is a byte format specifier made up
|
||||
of three characters. The first must be '7 ' or '8' to specify the number
|
||||
of data bits; the second 'E', 'O', or 'N' for even, odd, or no parity;
|
||||
and the third '1' or '2' for the number of stop bits. The * in the third
|
||||
example is used as a place holder when the mode is to be changed, but
|
||||
not the baud rate. So, for example: '1200' would change to 1200 baud
|
||||
leaving the mode as is; '300 8n1' would switch to 300 baud, and select
|
||||
8 data bits, no parity, and 1 stop bit; and '* 7E2' would change the
|
||||
format to 7 data bits, even parity, and 2 stop bits, while leaving the
|
||||
baud rate alone. Two other options can be added to this line: the '-'
|
||||
option is a way of specifying three delays that can be set, and the '+'
|
||||
option can set the characters used to enable and disable character
|
||||
transmission from the remote system.
|
||||
|
||||
If both the '-' and '+' options are used, then the '+' must follow the '-'
|
||||
(as above in the example).
|
||||
|
||||
The '+' option changes the characters that QTERM will use for flow
|
||||
control. When a system is sending text to QTERM, which is being saved
|
||||
in a file, QTERM needs to be able to stop the remote system from
|
||||
sending when it writes to disk. Most of the time ^S and ^Q are
|
||||
recognised, but for the few systems that use other characters, this
|
||||
option allows them to be changed. Following the '+' should be exactly two
|
||||
characters ('A' and 'B' in the example), the first becomes the "stop"
|
||||
character, and the second the "start" character. These characters can
|
||||
be '\' escapes if needed.
|
||||
|
||||
If the '-' option is used, it should be followed by up to three numbers.
|
||||
The first is a delay in seconds after the "stop" character is sent.
|
||||
Since some systems take longer to respond to the "stop" character than
|
||||
others, the delay time can be changed. QTERM starts up with one second
|
||||
of delay, but by specifying -3 or -6 or whatever, this delay can be
|
||||
changed. -0 is possible, but not recommended unless your remote system
|
||||
responds instantly. The second number is a delay in milliseconds between
|
||||
character sends in 'P' transmits (see below). Note that this time is
|
||||
the time between the start of each character transmission, rather than
|
||||
a time between the end of one and the start of the next. So if this
|
||||
delay was set to 15 milliseconds at 1200 BPS, where each character
|
||||
takes about 8 milliseconds to transmit, there would be 8 milliseconds
|
||||
spent sending the character, and then 7 milliseconds of idle time: the
|
||||
total being 15. As an addition to this, if a non-numeric character
|
||||
precedes the number (as in .20), "echo-check" pacing will be used for
|
||||
printable characters. What that means is that when a printable character
|
||||
is sent, i.e. between space: ' ' (20H) and tilde '~' (07EH) inclusive,
|
||||
the next will be sent either when the delay runs out, or when a copy of
|
||||
the sent character is seen returning from the remote system. This can be
|
||||
useful when the delay would normally need fine tuning for maximum
|
||||
performance, by using "echo-check" pacing the throughput becomes close
|
||||
to optimal. The third number is the delay at the end of a line in 'P'
|
||||
transmission: this is also a count of milliseconds, and this delay occurs
|
||||
after transmission of a carriage return. As with the character delay, a
|
||||
non-numeric character can precede the number, this is a "new-line prompt"
|
||||
character that will terminate the wait early. So if 'P' transmission
|
||||
is being used to upload text to a BBS that prompts for each line with
|
||||
a string like ' 23:', then by giving the number as :300, that would
|
||||
provide a 300 millisecond delay, but when a ':' was seen after sending
|
||||
a new line, transmission would begin again immediately. So, in that
|
||||
case, a string like:
|
||||
|
||||
-2 .20 :300
|
||||
|
||||
would get close to optimal throughput for 'P' transmission. Note that it
|
||||
is possible to selectively set these values: if a '*' is entered as a place
|
||||
holder then the delay value for that position will not be changed, i.e.
|
||||
|
||||
-* 20
|
||||
|
||||
would leave the stop delay alone, set the character delay to 20
|
||||
milliseconds, and leave the end of line delay alone.
|
||||
|
||||
Although QTERM always claims to have made the changes to the baud rate
|
||||
and communication mode, they will only happen if the necessary patches
|
||||
are applied. Note that for the second character of the mode specifier,
|
||||
both lower and upper case are accepted.
|
||||
|
||||
|
||||
C - Open an input catch file - This prompts for a filename, and then opens
|
||||
that file for output. All subsequent data received up the line from the
|
||||
modem port will be written to the file.
|
||||
|
||||
|
||||
Y - Put catch file on hold - This keeps the output file open, but temporarily
|
||||
disables transfer of data. A second <escape> 'Y' will re-enable capture
|
||||
of data.
|
||||
|
||||
|
||||
Z - Close a catch file - This closes the output file, and disables data
|
||||
capture until another catch file is opened.
|
||||
|
||||
|
||||
D - Display local directory - This prompts for a single CP/M wildcard
|
||||
file specificier, and then lists all files that match. Note that an
|
||||
empty filename is assumed to be '*.*'. When the files are being printed,
|
||||
QTERM will stop after each screenful (23 lines), hitting return will
|
||||
print a single line, any other key will print a full page.
|
||||
|
||||
|
||||
E - Toggle remote echo - This toggles echo to the remote system. This will
|
||||
most likely be used when the remote system is a terminal or another
|
||||
computer running a terminal program. It causes all characters received
|
||||
from the modem to be re-transmitted back to the modem, creating the
|
||||
impression that the far end is running in half duplex mode. Caution
|
||||
should be used to make sure that you don't set up an 'infinite loop'
|
||||
where the remote system is also echoing: because then the first
|
||||
character that returns will be sent out again by QTERM, to be returned
|
||||
by the remote, to be sent out again by QTERM .....
|
||||
|
||||
|
||||
H - Toggle half duplex - This simply causes all keyboard input to be
|
||||
echoed to the screen.
|
||||
|
||||
|
||||
I - Print status information - This prints a summary of QTERM's current
|
||||
state, showing the state of the various toggles, delays, what the
|
||||
current drive and user are, etc.
|
||||
|
||||
|
||||
J - Junk control characters - This causes QTERM to discard all control
|
||||
characters received from the remote system that are not considered
|
||||
important. Important control characters are: carriage return (0x0d);
|
||||
linefeed (0x0a); backspace (0x08); and tab (0x09). In this mode, if
|
||||
the remote system is sending characters with the MSB set, and bit 7
|
||||
masking is not enabled (see 'M'), then all characters with bit 7 set
|
||||
will also be discarded.
|
||||
|
||||
|
||||
L - Toggle linefeed transmit for 'P' - When 'P' is used to send a file
|
||||
to a remote system, it normally transmits all useful characters: i.e.
|
||||
all printable ascii characters from ' ' to '~', tabs, and carriage
|
||||
returns. This toggle ensables the transmission of line feeds, for
|
||||
cases where it is needed. Note that when QTERM starts, this is off,
|
||||
i.e. the default is not to transmit linefeeds.
|
||||
|
||||
|
||||
M - Toggle bit 7 mask - When this is enabled, all characters received from
|
||||
the remote have the most significant bit stripped. This may be useful
|
||||
when QTERM is running in 8n1 mode, but the remote is transmitting in
|
||||
7e1 mode - the top bit will contain parity, and this strips it off.
|
||||
|
||||
|
||||
N - New default drive and user. This will prompt, and allow entry of a drive
|
||||
user specification (i.e 'A7:' or 'B14:' or 'C:' or '9:'), this then
|
||||
becomes the default for all file operations. Note that it is possible
|
||||
to user the CP/M BDOS functions to set drive and user during the entry
|
||||
hook code (see QTERM.PAT), so if the entry code selects D2:, and all
|
||||
scripts are on D2: just entering QTERM SCRIPT at the CCP prompt would
|
||||
find SCRIPT on D2:. Also note that after the entry hook code, QTERM makes
|
||||
a note of where it is (i.e. in the above case D2: ) When a chat script
|
||||
is invoked with the 'X' command, QTERM will first look at the drive
|
||||
given, or on the default if no drive is specified. If that fails, then
|
||||
QTERM will take a second look in the drive/user area as saved after the
|
||||
entry hook. The rationale behind this is to place all chat scripts in
|
||||
one place: these can subsequently move the default around (see the '!'
|
||||
section of chat scripts), or 'N' commands can be used to move around.
|
||||
However it does not matter what the current default drive/user is, QTERM
|
||||
can always find the scripts by lookng back at the area it noted.
|
||||
|
||||
|
||||
O - Toggle output to the printer - This simply toggles a switch that causes
|
||||
all data received to be transmitted to the printer.
|
||||
|
||||
|
||||
P - Print a file to remote - This prompts for a filename, and then transmits
|
||||
that file to the remote system. While this transfer is in progress, the
|
||||
keyboard is ignored, except that typing control 'X' will cancel the
|
||||
transfer. Note that the 'L' command may come in useful with this command,
|
||||
check how your remote system behaves.
|
||||
|
||||
|
||||
T - Type a local file - This also prompts for a filename, and then prints that
|
||||
file to the screen locally. While this is in progress, a control 'X' will
|
||||
cancel it, Output can also be paused by typing control 'S', which will
|
||||
halt until another character is typed. If this character is control 'X'
|
||||
the output will be aborted, any other continues the printout.
|
||||
|
||||
|
||||
U - Invoke user function - QTERM can be patched to include a user defined
|
||||
function, this is the command to call it. This subroutine can be used for
|
||||
any purpose required, for example keyboard mapping can be enabled, or some
|
||||
special screen sequence can be printed, or whatever is needed. The patch
|
||||
documentation provides information on how to patch this into QTERM, and
|
||||
also explains how it is possible to prompt for information from within
|
||||
this subroutine.
|
||||
|
||||
|
||||
V - Toggle VT100 emulation - This function requires the following screen
|
||||
abilities be specified for full operation (see QTERM.PAT for details):
|
||||
clear to end of line, clear to end of screen, insert and delete line.
|
||||
If only the first two are available (partial screen clears), then all
|
||||
functions will work, except for reverse index (scroll backwards), and
|
||||
scrolling regions. Note that the VT100 emulation is as complete as it
|
||||
can be, however the alternate character sets are not recognised, and all
|
||||
the display attribute commands are mapped to the single highlight mode
|
||||
encoded in the patch area. Also note that QTERM does not check if a
|
||||
screen capability is present, so if insert and delete line are missing,
|
||||
QTERM will still try to emulate a scrolling region, probably causing
|
||||
somewhat confusing output. As a final comment, (especially for people
|
||||
without interrupt drivers), try to set the delays after the special
|
||||
functions as big as you can: to do some operations (like odd things
|
||||
with scrolling regions, and some of the partial screen clears) require
|
||||
sending a collection of screen codes that'd probably make you lose your
|
||||
lunch if you saw them. In particular, ^[[1J - clear from start of screen
|
||||
to current position will take forever if you're at the bottom of the
|
||||
screen or towards the right margin. Caveat Emptor!
|
||||
|
||||
|
||||
W - Toggle split window mode - This requires either the insert line and
|
||||
delete line screen abilities be specified, or it can also function with
|
||||
just clear to end of line. (see QTERM.PAT for details). It puts QTERM
|
||||
into a mode where send and receive text are shown in two separate windows.
|
||||
This can be useful when using QTERM to communicate with another communication
|
||||
program running in terminal mode, because it keeps what is typed on the
|
||||
keyboard separate from what is received from the remote system. After
|
||||
selecting window mode, QTERM prompts for window size: there are two options,
|
||||
'b' or 's' (big or small). This refers to the receive window: when small, the
|
||||
screen is split exactly in half: 11 lines for both send and receive. Big mode
|
||||
makes the receive window 18 lines deep, the send window is only 4 lines: this
|
||||
will be useful when far more text is being received than is being sent.
|
||||
|
||||
|
||||
R - Receive a file using protocol - This option prompts for a mode and
|
||||
optional receive file information. Xmodem and Kermit are both supported.
|
||||
Respond with 'k' to go into Kermit receive, or 'x' to go into Xmodem
|
||||
receive. Normally files are received on the current default drive,
|
||||
however by entering a drive or a user (e.g. 'k b7:') files will be
|
||||
received in the specified location. In addition, if Xmodem is not
|
||||
being used in batch mode, a filename can be given here. Non-batch
|
||||
Xmodem has a default filename, this can be used to override it. Note
|
||||
that a space MUST be present between the k or the x and the
|
||||
filename / drive specification for proper operation. While the transfer
|
||||
is in progress, a control 'X' will abort it.
|
||||
|
||||
Options can be given by adding them right after the 'k' or 'x' protocol
|
||||
specifier, before the space that precedes the filename. Some options are
|
||||
applicable to both protocols:
|
||||
|
||||
'a': Normally QTERM is silent, however if this option is given, QTERM
|
||||
will alert on termination of transfer by ringing the terminal bell.
|
||||
|
||||
'q': QTERM normally keeps the screen active, displaying the status of
|
||||
a transfer, however by using one or two 'q' characters, the amount of
|
||||
output can be reduced. A single 'q' just turns off the packet count
|
||||
and the data transfer count (how many K have been received), whereas
|
||||
two 'q's turn off everything.
|
||||
|
||||
Xmodem only has one receive option:
|
||||
|
||||
'c': Xmodem starts by trying CRC mode, and will switch automatically
|
||||
to Checksum if CRC fails. However some very naive implementations will
|
||||
work better if QTERM starts in checksum mode, this option causes QTERM
|
||||
to do so. Note that information for Xmodem 1K, Ymodem, Modem7 batch etc.
|
||||
need not be given for a receive (in fact QTERM ignores any such options
|
||||
on an Xmodem receive), instead QTERM determines what the transfer type is
|
||||
by inspecting the data received from the remote, and it then acts as
|
||||
appropriate.
|
||||
|
||||
Kermit receive recognises the following options:
|
||||
|
||||
'b': binary file transfer - by default QTERM treats files as text files
|
||||
when doing a Kermit transfer, this causes files to received as binary,
|
||||
useful when transferring an executable program.
|
||||
|
||||
'8': try full 8 bit data transfer - normally QTERM tries to negotiate the
|
||||
use of 8th bit prefixing with the remote, however if both ends can handle
|
||||
8 bit transfers, this considerably improves throughput.
|
||||
|
||||
'x': use extended packet size - if not given QTERM will use the standard
|
||||
maximum packet size (about 90 characters), this allows the packet size to
|
||||
increase to about 1K, thereby providing a performance boost.
|
||||
|
||||
'g': request files from a server - a typical use might be:
|
||||
|
||||
kg a3:*.txt
|
||||
|
||||
This will request a server to send all files that match *.txt, and they will
|
||||
be received on a3:
|
||||
|
||||
|
||||
S - Send a file using protocol - This also prompts, the response should be
|
||||
'k filelist ....' or 'x filelist ....' where 'filelist ....' is a list
|
||||
of CP/M filespecifiers: wildcards are permitted. Single filespecifiers
|
||||
are separated from one another by spaces, and as with receive, there must
|
||||
be a space between the 'x' / 'k' / options, and the first filespecifier.
|
||||
As with receive, a control 'X' will abort the transfer.
|
||||
|
||||
Options are given right after the 'x' or 'k', the following are available:
|
||||
|
||||
'a' and 'q' work for both Xmodem and Kermit, and in the same manner as in
|
||||
a receive.
|
||||
|
||||
Xmodem takes these options:
|
||||
|
||||
'b': use Xmodem batch (AKA Modem7 batch mode)
|
||||
|
||||
'y': use Ymodem batch mode
|
||||
|
||||
'k': use 1K packets.
|
||||
|
||||
So 'xyk a12:*.com' would send all .COM files on drive A:, user area 12,
|
||||
using Ymodem batch mode and 1K packets. To match names to various
|
||||
combinations: xyk will give true Ymodem (known sometimes as ymodem batch),
|
||||
xk gives Xmodem 1K (sometimes incorrectly called ymodem), xy gives Ymodem
|
||||
batch, but forces 128 byte packets, xbk will use Modem7 batch mode, but with
|
||||
1K packets.
|
||||
|
||||
For Kermit, the options available are:
|
||||
|
||||
'b': Kermit usually sends files in text mode, i.e. 0x1a is taken as
|
||||
end of file. If you want to transfer a binary file, specify the mode as
|
||||
'kb filename.com'.
|
||||
|
||||
'2': when Kermit is sending data, it will ask for type 3 block checks
|
||||
during the Send-Init negotiation. Unfortunately, the only fall back from
|
||||
a type 3 request is to type 1 (i.e. if the receiver does not agree to use
|
||||
type 3). This means that if QTERM is trying to send to a system that can
|
||||
do type 1 and type 2, but not type 3 checks, it'll be limited to type 1.
|
||||
However, if the '2' option is used, Kermit will attempt to negotiate type 2
|
||||
block checks, thus allowing it to communicate with a remote using type 2
|
||||
checks. It should be noted that this is only useful when sending: when
|
||||
receiving Kermit data, QTERM will see the remote's Send-Init request first,
|
||||
and will agree to whatever the remote asks for.
|
||||
|
||||
'8': this will cause QTERM to send data with the high bit set as is, on the
|
||||
assumption that the data channel can transfer full 8 bit data. Use this only
|
||||
if the remote Kermit can also handle 8 bit transfers. If the '8' option is
|
||||
not given QTERM will try to negotiate high bit prefixing to send 8 bit data.
|
||||
|
||||
'x': allow extended packets, this is the same as for receive.
|
||||
|
||||
The last two send options are used to issue server requests:
|
||||
|
||||
'f': finish the server,
|
||||
|
||||
'l': finish server operations and logoff.
|
||||
|
||||
These two do not need filename, and they should not be used with any other
|
||||
options, i.e. the response to the 'Mode?' prompt from QTERM should simply
|
||||
be 'kf' or 'kl'.
|
||||
|
||||
|
||||
K - Program a function key - This prompts for a key number and a string
|
||||
to be loaded under that key. The first character entered may be an
|
||||
's' to specify the string should be sent slowly. Normally function
|
||||
key strings are transmitted at full speed, however the 's' creates
|
||||
a tenth second delay between characters. Following the 's' (if given)
|
||||
or as the first character if no 's' is given, must be a digit between
|
||||
'0' and '9': this specifies the key number. Finally comes the string
|
||||
that will be loaded under the key. Maximum string length is 14
|
||||
characters, longer strings are truncated. Backslash escape sequences
|
||||
are permitted, see the description in the section on chat scripts
|
||||
for a full explanation of what is available. As a few examples:
|
||||
|
||||
s2hello\r
|
||||
|
||||
would program function key 2 to send 'hello <cr>' slowly, and:
|
||||
|
||||
3userid = 17\e
|
||||
|
||||
would program function key 3 to send 'userid = 17 <esc>' at full speed.
|
||||
|
||||
|
||||
0-9 - Send function key string - After <escape> 'K' has been used to load
|
||||
strings into the function keys, <escape> '0' etc. will activate the
|
||||
function key, causing the string it contains to be sent. Note that if a
|
||||
function key string contains the QTERM <escape> character, it will not
|
||||
invoke the function in question. So loading \x1c,\x1cq
|
||||
(<escape> , <escape> q) under a key cannot be used to provide a
|
||||
"hangup and exit" from QTERM.
|
||||
|
||||
|
||||
X - Activate a chat script - This prompts for a filename, then it reads
|
||||
the file, and does the chat script given. Following the filename can be
|
||||
parameters for use in the script, much as SUBMIT.COM allows parameters
|
||||
to be passed to a .SUB file. If a chat script is given to QTERM as a
|
||||
command line argument when it is invoked from the CCP, then the following
|
||||
command line arguments will become the parameters to the chat script.
|
||||
|
||||
A chat script is a means for getting QTERM to automatically send and
|
||||
receive text, this can be used to auto-dial, connect to remote systems,
|
||||
log in to them, and do whatever else is wanted. A companion file
|
||||
QTCHAT.DOC explains the workings of chat scripts.
|
||||
|
@ -1,13 +0,0 @@
|
||||
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
|
||||
|
@ -1,333 +0,0 @@
|
||||
Patching QTERM for your system.
|
||||
|
||||
This explains the patches in QTERM, and can be used to patch QTERM
|
||||
directly (it is written as if being used in that manner), however
|
||||
it also provides an explanation of the subroutines that would be
|
||||
needed if a QT-?????.Z patch source were to be written, based on the
|
||||
template QT-PATCH.Z provided.
|
||||
|
||||
The first thing to do is to back QTERM up, and then invoke DDT, SID, ZSID,
|
||||
Z8E, or whatever your local patch utility is, in the following way:
|
||||
|
||||
A>DDT QTERM.COM
|
||||
|
||||
DDT (etc.) will read in QTERM, and then prompt. The following is a list of
|
||||
patch areas where QTERM should be changed to reflect your system. Some of
|
||||
these are mandatory (i.e. QTERM won't work without them), whereas others
|
||||
can be changed to null subroutines or empty data without preventing QTERM
|
||||
from working, it just won't have all the features available.
|
||||
|
||||
|
||||
1. Modem input status: 0110 - 011F
|
||||
|
||||
QTERM calls here to check modem input status. Return with the zero flag
|
||||
set if no character is available, or with the zero flag clear if a char
|
||||
is available. Generally this can be an input from the usart / sio / dart
|
||||
status port followed by an 'and'.
|
||||
|
||||
2. Read modem character: 0120 - 012F
|
||||
|
||||
This gets a character from the modem input port once the input status has
|
||||
decided it's there. Return the character in the a register. Generally this
|
||||
can be an input from the usart / sio / dart data port.
|
||||
|
||||
3. Modem output status: 0130 - 013F
|
||||
|
||||
Check if the modem output port can accept another character. Return with the
|
||||
zero flag set if the output port can't receive a character, or with the zero
|
||||
flag clear if the output port is ready. Generally this can be an input from
|
||||
the usart / sio / dart status port followed by an 'and'.
|
||||
|
||||
4. Write modem character: 0140 - 014F
|
||||
|
||||
Send the character in the a register to the modem output port. This will only
|
||||
be called after the output status routine has returned a non-zero status.
|
||||
Generally this can be an output to the usart / sio / dart data port.
|
||||
|
||||
These first four patches are all necessary for QTERM to work. The next few
|
||||
are not necessary, but they will be useful.
|
||||
|
||||
5. Start break: 0150 - 015F
|
||||
End break: 0160 - 016F
|
||||
|
||||
The start break subroutine at 0150 should initiate a break condition on
|
||||
the modem output line, and 0160 should clear the break condition. If these
|
||||
are to be omitted, then just put return (C9) instructions at 0150 and 0160.
|
||||
Note that the Start Break routine need not check that the transmit buffer
|
||||
is empty, since there will always be a 1/10th. second delay after the last
|
||||
character is sent, before calling this subroutine.
|
||||
|
||||
6. Drop DTR: 0170 - 017F
|
||||
Restore DTR: 0180 - 018F
|
||||
|
||||
The drop DTR subroutine causes DTR to be made inactive, and restore DTR
|
||||
returns DTR to an active state. If your modem does not respond to DTR, but
|
||||
can be made to hang up by sending a string, then put a return (C9) at 0170.
|
||||
Use the space from 0171 to 018F to contain the string, with the following
|
||||
notes: at 0171 should be the length of the string, to transmit a break,
|
||||
use an 0FFH byte, to cause a two second delay use an 0FEH byte. Hence the
|
||||
following could be used to hang up a Hayes compatible:
|
||||
|
||||
0C FE FE 2B 2B 2B FE FE 41 54 48 30 0D
|
||||
|
||||
0C - length: 12 bytes follow
|
||||
FE - delay (twice)
|
||||
2B - '+' sent three times
|
||||
FE - delay (twice)
|
||||
41 54 48 30 0D - ATH0 <return>
|
||||
|
||||
If neither DTR nor a string is to be used, then place a return (C9) at
|
||||
0180 and 0171, and a nop (00) at 0170. The string is used only if a C9
|
||||
is found at 0170, so by placing the C9 at 0171 the string print is
|
||||
inhibited.
|
||||
|
||||
7. Baud rate setting: 0190 - 019F
|
||||
Baud rate table: 01A0 - 01AF
|
||||
|
||||
These two patch areas work together to allow QTERM to change the baud rate
|
||||
of the modem port. The baud rate table holds pairs of bytes for setting the
|
||||
baud rate to eight different values: 38400, 19200, 9600, 4800, 2400, 1200,
|
||||
600 and 300, in that order. In these pairs, the first byte will be passed
|
||||
to the subroutine at 0190, and the second byte is used to enable that baud
|
||||
rate: an 0FFH in the second byte enables the rate, and a zero disables.
|
||||
So if your system only went up to 9600, (using a value of 1 to get 9600)
|
||||
the first six bytes in the table would be:
|
||||
|
||||
00 00 no value for 38400: disable by the 00
|
||||
00 00 no value for 19200: disable by the 00
|
||||
01 FF 01 is the value for 9600: enable by the FF
|
||||
|
||||
In all cases of enabled baud rates, the subroutine at 0190 gets the
|
||||
appropriate value in the a register and should use it to set the baud rate.
|
||||
If this is to be omitted, then just put a return (C9) instruction at 0190,
|
||||
and fill the table from 01A0 to 01AF with 00's.
|
||||
|
||||
8. Communication mode setting: 01B0 - 01BF
|
||||
Communication mode table: 01C0 - 01CB
|
||||
|
||||
These two patch areas work together to allow QTERM to change the
|
||||
communications format of the modem port. The mode table holds bytes for
|
||||
setting 12 different formats, selecting number of data bits (7 or 8)
|
||||
parity (odd, even, or none) and number of stop bits (1 or 2). In order
|
||||
the 12 values are for 7n1, 8n1, 7n2, 8n2, 7e1, 8e1, 7e2, 8e2, 7o1, 8o1,
|
||||
7o2, and 8o2. The subroutine at 01B0 gets one of these values in the a
|
||||
register and should use it to set the communications mode. If this is to
|
||||
be omitted, then just put a return (C9) instruction at 01B0.
|
||||
|
||||
9. Reserved for later use: 01CC
|
||||
|
||||
This byte is reserved for later expansion, and should not be used.
|
||||
|
||||
10. Protocol transfer size: 01CD
|
||||
|
||||
During protocol transfers, disk reads and writes take place every 8K. This
|
||||
is normally possible without causing a timeout, and reduces disk access to
|
||||
a minimum. However if your disk is slow, you can drop this to 4, 2 or even
|
||||
1 to reduce the size of transfer, and hence prevent timeouts.
|
||||
|
||||
11. Processor speed: 01CE
|
||||
|
||||
This is the speed in Mhz that your Z80 runs at: 4, 6 or whatever. For
|
||||
a 2.5Mhz cpu, use 3.
|
||||
|
||||
12. Escape character: 01CF
|
||||
|
||||
All special functions of QTERM are activated by the use of escape sequences.
|
||||
At 01CF is the byte used for the escape character (the default is ^\). Any
|
||||
byte can be used, but a little used value is best selected, also using a
|
||||
printable character (' ' thru '~') may have undesirable results. Note that to
|
||||
transmit the escape value itself, just type it twice.
|
||||
|
||||
These previous three are necessary.
|
||||
|
||||
13. Signon message: 01D0 - 01EF
|
||||
|
||||
This must be a string that identifies your system / terminal. It must be
|
||||
present, and is printed when QTERM first starts. It should be composed of
|
||||
printable characters, and terminated by a zero byte.
|
||||
|
||||
14. Clear screen: 01F0 - 01FF
|
||||
|
||||
This must be a string that clears the terminal screen, and leaves the
|
||||
cursor in the top left hand corner. This should also be terminated by a
|
||||
zero byte.
|
||||
|
||||
15. Moveto: 0200 - 022E
|
||||
|
||||
QTERM requires the ability to move the cursor around the screen. It calls
|
||||
this subroutine with the required coordinates in hl: where h is the row,
|
||||
and l the column to move to. The top left hand corner of the screen is 0,0;
|
||||
and the bottom right corner is 23,79. This subroutine will have to do
|
||||
terminal output: at 0109H is a routine that prints a character in the c
|
||||
register, and at 010CH is a routine to print a decimal number in hl (mainly
|
||||
for the use of vt100 and vt220 compatibles). Note that the above two
|
||||
subroutines may destroy all registers, so appropriate action should be
|
||||
taken if needed.
|
||||
|
||||
16. Teminal capability bit map: 022F
|
||||
|
||||
This byte contains one bit set for each of the following terminal
|
||||
capabilities:
|
||||
|
||||
bit 0: (01H) end highlight mode
|
||||
bit 1: (02H) start highlight mode
|
||||
bit 2: (04H) delete line
|
||||
bit 3: (08H) insert line
|
||||
bit 4: (10H) delete character
|
||||
bit 5: (20H) insert character
|
||||
bit 6: (40H) clear to end of line
|
||||
bit 7: (80H) clear to end of screen
|
||||
|
||||
17. Terminal capability strings: 0230 - 026F
|
||||
|
||||
In this area are eight strings, each of which can be at most seven characters
|
||||
long. They are the strings to be printed to perform the terminal capabilities
|
||||
mentioned above. Each one of them should be terminated by a zero byte. Hence
|
||||
at 0230 is the string for end highlight, at 0238 is the string for start
|
||||
highlight, etc., with 0268 being the string for clear to end of screen.
|
||||
Programs that use these will check the terminal capability bitmap at 022F
|
||||
before using them, to determine if they are available.
|
||||
|
||||
18. Entry subroutine: 0270 - 0272
|
||||
|
||||
Upon entry to QTERM, this subroutine will be called. If it is not needed
|
||||
then a return instruction (0C9H) should be placed at 0270, otherwise there
|
||||
is enough space to put in a jump to code that is to be executed when QTERM
|
||||
starts. This can be used for several purposes: if custom initialisation is
|
||||
needed to enable communications, or select a particular baud rate, or
|
||||
whatever, this can be done here. In addition, if all chat scripts and disk
|
||||
access is to be done on a specific drive, then by using the CP/M BDOS
|
||||
functions to set drive (and set user if desired), QTERM can be made to
|
||||
automatically be in the correct place to find scripts. This is explained
|
||||
in QTCHAT.DOC
|
||||
|
||||
19. Exit subroutine: 0273 - 0275
|
||||
|
||||
After an <Escape> Q has been issued to exit QTERM, this subroutine will
|
||||
be called immediately before exiting back to CP/M. As with the entry
|
||||
subroutine, if not needed, a return instruction (0C9H) should be placed at
|
||||
0273H, otherwise any termination code can be added.
|
||||
|
||||
20. User subroutine: 0276 - 0278
|
||||
|
||||
The <Escape> U command from terminal mode, and !U in chat scripts cause
|
||||
a call to this location. This can be used to do whatever is wanted,
|
||||
enabling special features, selecting different ports for communication
|
||||
whatever. Note that at 027C is a jump to ilprmt: an inline prompt
|
||||
subroutine. If the user subroutine is invoked from terminal mode, then
|
||||
calling this subroutine will prompt, and read a line of text into the
|
||||
buffer at 0080, it is terminated with a zero byte. If invoked with a !u
|
||||
from a chat script, then the remaining text on the line will be moved
|
||||
to the buffer, creating the impression it had just come from the
|
||||
keyboard. Following the call to ilprmt should be a prompt message,
|
||||
terminated by a null byte. NOTE: if no prompt is required, then two zero
|
||||
bytes are needed.
|
||||
|
||||
call ilprmt
|
||||
db 'Prompt message\0'
|
||||
|
||||
call ilprmt
|
||||
db 0,0
|
||||
|
||||
are examples. This subroutine should only be called once per invocation of
|
||||
the user subroutine, since a second call when used in a chat script may
|
||||
have unpredictable results.
|
||||
|
||||
21. Keyboard map: 0279 - 027B
|
||||
|
||||
All keystrokes read from the keyboard are passed through the keyboard map
|
||||
subroutine, so that actions like mapping arrow keys to VT100 escape
|
||||
sequences can be performed. When this is called, the value of the key
|
||||
just pressed is in the a register, and the b register is zero. On exit
|
||||
the value in b determines what action is to be taken. If b is zero, then
|
||||
the value passed on to QTERM is whatever vaule is in the a register, so
|
||||
that placing a 'RET' instruction at 0279H causes no effect at all. If b
|
||||
contains 1, then QTERM will assume that the keyboard map routine "swallowed"
|
||||
the character, and instead of passing it on, QTERM immediately polls the
|
||||
keyboard for another character. If b contains 2, then QTERM takes this
|
||||
to mean that the keyboard map routine wishes to output another character
|
||||
without further input from the keyboard. In this case, QTERM passes the
|
||||
current value in a along, then calls straight into the keyboard map routine
|
||||
again, without polling the keyboard. To provide some examples:
|
||||
|
||||
A. Assume that your system has some function keys that send the following
|
||||
strings:
|
||||
|
||||
^A 1, ^A 2, ^A 3, ^A 4,
|
||||
|
||||
and you wish to map those keys to ^H ^J ^K and ^L, with ^A followed by
|
||||
any other character being mapped to just the second character. The
|
||||
keyboard map would start by looking for ^A, if it saw any other character,
|
||||
it would return it unchanged with b equal to zero. On getting a ^A, it
|
||||
wants to see the next character from the keyboard without sending anything
|
||||
on, so it sets b to 1, and is at liberty to return any value in a. QTERM
|
||||
immediately gets the next key value, and passes it to the keyboard map. If
|
||||
it's one of 1, 2, 3, or 4, then the keyboard map sets a to ^H, ^J, ^K, or
|
||||
^L as appropriate, and returns with zero in b, otherwise it simply returns
|
||||
the value in a, again with b holding zero.
|
||||
|
||||
B. Assume you want to do the reverse mapping: ^H ^J ^K and ^L to ^A 1, ^A 2
|
||||
etc. Here, the keyboard map is looking for ^H ^J etc., passing all other
|
||||
characters unchanged, with b zero. Assume it sees a ^H, which is to be
|
||||
mapped to ^A 1. It sets b to 2 (to say that there is more to come) and
|
||||
returns a ^A in the a register. QTERM will pass the ^A on, and then call
|
||||
te map again, at which point it would return 1, with b set to zero this
|
||||
time: this is because there are no more characters to be sent.
|
||||
|
||||
C. In the most complex case, assume that ^E followed by any other character
|
||||
is to be mapped to two copies of the character, followed by ^A. In this
|
||||
case, all characters save ^E are passed unchanged, with zero in b. When a
|
||||
^E is detected, b is returned with 1, to say that the ^E was swallowed,
|
||||
and when the next character is passed to the map, it should be saved, but
|
||||
also returned, however b should be 2. QTERM will process the character,
|
||||
then since b was 2, it will call the map subroutine. The map routine
|
||||
returns the character again, with b set to 2 a second time. On the third
|
||||
call to the map routine, it should return the terminating ^A, with b equal
|
||||
to zero to say all the work is done.
|
||||
|
||||
22. ILPRMT subroutine jump: 027C - 027E
|
||||
|
||||
These three bytes are reserved to hold a jump to the in line prompt
|
||||
subroutine, and should not be overwritten by the patch.
|
||||
|
||||
23. Patch area: 0280 - 04FF
|
||||
|
||||
Since the area provided for the above patches is limited, it may be necessary
|
||||
to use more space. The block of memory from 0280 to 04FF is set aside for
|
||||
custom patches, this can be used if the individual spaces are not big enough.
|
||||
|
||||
|
||||
Once all the patches have been made, exit the patch program (usually by
|
||||
typing ^C), and finish up by saving a new copy of QTERM:
|
||||
|
||||
A>SAVE 69 QTERMNEW.COM
|
||||
|
||||
In addition, the patch area only can be saved as follows:
|
||||
|
||||
A>SAVE 4 QTERMPAT.XXX
|
||||
|
||||
Which will create a 1K file containing all the patches needed to make this
|
||||
particular version of QTERM work. By doing this, when a new release of QTERM
|
||||
needs to be patched, all that is necessary is to read in the new unpatched
|
||||
version with DDT or whatever, then overlay the patch area. This is typically
|
||||
done by typing:
|
||||
|
||||
IQTERMPAT.XXX
|
||||
|
||||
to DDT, SID, ZSID etc. to set up the command line to read QTERMPAT.XXX, then
|
||||
follow this with a:
|
||||
|
||||
R
|
||||
|
||||
to read it. This should overlay the saved patch area on the new version,
|
||||
hence doing all the patches at once. Then exit DDT with ^C, and do the
|
||||
first save shown above to save the new working version.
|
||||
|
||||
|
||||
NOTE: With V4.2 and later, the patch area has grown yet again, so again the
|
||||
overlaying of earlier patches will not work. By and large, overlaying patches
|
||||
in this manner is not recommended, it is far easier to work with the patch
|
||||
sources available, applying them with ZSM and ZPATCH as needed. However, the
|
||||
V4.3 patch area is the same as the V4.2 patch area, so no changes are needed
|
||||
to convert from V4.2 to V4.3
|
||||
|
Binary file not shown.
@ -1,16 +0,0 @@
|
||||
These two files: ZSM and ZPATCH are needed to apply QTERM patches (such
|
||||
as QT-ALB.ZY etc.). To apply a patch to QTERM enter:
|
||||
|
||||
A>ZSM QT-ALB.Z
|
||||
|
||||
which will create QT-ALB.O. Then enter:
|
||||
|
||||
A>ZPATCH QTERM.COM QT-ALB.O
|
||||
|
||||
which applies the patch to QTERM. This can be used with other programs,
|
||||
WANDERER, ROGUE, and several programs in the UUCP21B.LBR library will
|
||||
need this done to them.
|
||||
|
||||
To decompress the two programs in here, EXL.LBR or CRLZH11.LBR will both
|
||||
provide tools to do the job.
|
||||
|
@ -1,74 +0,0 @@
|
||||
What's new in QTERM for V4.3 - in no particular order:
|
||||
|
||||
^\ P sends have some more sophisticated flow control, for both individual
|
||||
character transmission, and line breaks, based on echo of characters
|
||||
back from the remote system.
|
||||
|
||||
When QTERM is in local echo mode <cr> characters receivced are expanded to
|
||||
<cr> / <lf> pairs, and if half duplex or split screen is invoked as well
|
||||
as local echo, locally typed <cr>'s also get expanded in the same manner.
|
||||
This makes local echo a bit more useful since it means that neither the
|
||||
local user nor someone talking remotely will need to add a <lf> after
|
||||
their <cr>'s - QTERM does it as needed.
|
||||
|
||||
'q' option to make protocol transfers quiet
|
||||
|
||||
'c' option to get Xmodem receive to start in Checksum mode
|
||||
|
||||
Major overhaul of Kermit - the bugs in the 4.2g implementation have been
|
||||
fixed, and several extensions added: extended block checks, long packets,
|
||||
and server operation.
|
||||
|
||||
!% m and !% o have become !& m and !& o, and a third option has been added:
|
||||
!& l to turn on and off "Looking for" logging. m and o are initially on,
|
||||
and l is off: !& l 0 forces it off, !& m 1 forces it on, and !& o switches
|
||||
to the other state.
|
||||
|
||||
!@ and !# (numeric variable manipulation) have gained two counterparts:
|
||||
!$ and !% to set and test string variables (these include the parameters
|
||||
of the script)
|
||||
|
||||
It is now possible to "type" through a waiting script: while a script is
|
||||
waiting for a match in a normal /send/expect/ line, or a ![ - or ![ :
|
||||
line, characters typed at the keyboard are sent to the modem, and two
|
||||
^\ escapes are recognised: ^\ . to send a break, and ^\ , to hang up.
|
||||
|
||||
When expect string is matching (or not) in a .send.expect. line,
|
||||
the last 64 characters received from the modem are kept in the buffer
|
||||
used by the ![ - command, so that tests can be made later with ![ =
|
||||
(etc.) commands, this buffer is also used by the ![ : "wait for silence"
|
||||
command.
|
||||
|
||||
!< - and !< . (read buffered from keyboard and read single character from
|
||||
keyboard) now take a variable name (i.e. a single letter). For !< -, the
|
||||
letter is the target string variable that will receive the input text,
|
||||
for !< . the numeric variable receives the value of the character typed.
|
||||
This means that !< = and !< , are no longer needed: !% and !# will permit
|
||||
testing keyboard input.
|
||||
|
||||
Strings and variables can be used in lines: giving $a anywhere in a script
|
||||
line gets substituted by string variable a (and $1 becomes the first
|
||||
parameter to the script), similarly @a anywhere on a script line gets
|
||||
replaced by the numeric value of variable a.
|
||||
|
||||
The VT100 emulation code has been almost totally re-written, and does a
|
||||
far better job than the 4.2 code. There are limits - double size characters
|
||||
can't be done, nor can alternate character sets, and some operations will
|
||||
take a long time (i.e. set up lots of delay). However, the special VT100.TC
|
||||
termcap file is no longer needed, since a standard VT100 termcap will
|
||||
suffice. However read QTERM.DOC for comments on how it behaves when certain
|
||||
screen codes are missing
|
||||
|
||||
!~ ? to test the existance of a file has been split into two commands:
|
||||
!~ Y filename `label jumps if the file does exist, and !~ N filename `label
|
||||
jumps if the file doesn't exist - The second is most useful in a script
|
||||
when you only want to do something if a file exists (e.g. upload it, ^\ P
|
||||
it or whatever), that way !~ N allows a jump over the code if the file is
|
||||
not there.
|
||||
|
||||
The ^\ D code has stopped using the BIOS to read the directory, instead
|
||||
it uses BDOS calls 17 and 18. The bad news is that the statistics line
|
||||
is not shown (maybe something will be put in for the next version), however
|
||||
the good news is that it will work under CP/M 3.0, and also this change
|
||||
has reduced QTERM's memory requirement by about 5 to 6 K.
|
||||
|
Binary file not shown.
Binary file not shown.
155
qterm/qt-cpm3.z
155
qterm/qt-cpm3.z
@ -1,155 +0,0 @@
|
||||
; QT-CPM3.Z - QTerm patch for CP/M 3 AUX: device
|
||||
;
|
||||
; August 2020, Anna Christina Nass
|
||||
;
|
||||
.var BDOS 5
|
||||
|
||||
.var RDY 0xF0
|
||||
|
||||
.org 0x0110 ; modem input status
|
||||
; ZERO flag if no char is available
|
||||
modist: ld c, 7
|
||||
call BDOS
|
||||
and RDY
|
||||
ret
|
||||
|
||||
.org 0x0120 ; modem input
|
||||
modin: ld c, 3
|
||||
call BDOS
|
||||
ret
|
||||
|
||||
.org 0x0130 ; modem output status
|
||||
; ZERO flag if output is busy
|
||||
modost: ld c, 8
|
||||
call BDOS
|
||||
and RDY
|
||||
ret
|
||||
|
||||
.org 0x0140 ; modem output
|
||||
modout: ld e, a
|
||||
ld c, 4
|
||||
call BDOS
|
||||
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 'CP/M 3 by @acn128\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 0b00000011 ;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
|
||||
init: ret
|
||||
uninit: ret
|
||||
|
||||
|
172
qterm/qt-rc82.z
172
qterm/qt-rc82.z
@ -1,172 +0,0 @@
|
||||
; 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[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
|
||||
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
|
||||
|
||||
|
172
qterm/qt-rc84.z
172
qterm/qt-rc84.z
@ -1,172 +0,0 @@
|
||||
; 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[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
|
||||
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
|
||||
|
||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading…
Reference in New Issue
Block a user