From 3809be0d36652f0e0ca084450c8fa5dfb24ad495 Mon Sep 17 00:00:00 2001 From: acn Date: Tue, 8 Sep 2020 09:46:40 +0200 Subject: [PATCH] Moved to new repository --- README.md | 102 +++++++ files/!README.1ST | 120 +++++++++ files/--READ.1ST | 4 + files/-QT-ADAM.43F | 73 +++++ files/-README.FIX | 33 +++ files/DDTZDDT.COM | Bin 0 -> 7424 bytes files/QT-ADAM.Z | 253 ++++++++++++++++++ files/QT-ADM40.Z | 251 +++++++++++++++++ files/QT42G-AD.PAT | Bin 0 -> 1024 bytes files/QTCHAT.DOC | 650 +++++++++++++++++++++++++++++++++++++++++++++ files/QTERM.DOC | 457 +++++++++++++++++++++++++++++++ files/QTERM.FOR | 13 + files/QTERM.PAT | 333 +++++++++++++++++++++++ files/QTERM43F.COM | Bin 0 -> 17664 bytes files/QTZP.DOC | 16 ++ files/WHATS.NEW | 74 ++++++ files/ZPATCH.COM | Bin 0 -> 3072 bytes files/ZSM.COM | Bin 0 -> 14976 bytes qt-cpm3.z | 155 +++++++++++ qt-rc82.z | 172 ++++++++++++ qt-rc84.z | 172 ++++++++++++ qterm43f.lbr | Bin 0 -> 74496 bytes qterm82.com | Bin 0 -> 17664 bytes qterm84.com | Bin 0 -> 17664 bytes qtermc3.com | Bin 0 -> 17664 bytes 25 files changed, 2878 insertions(+) create mode 100644 README.md create mode 100644 files/!README.1ST create mode 100644 files/--READ.1ST create mode 100644 files/-QT-ADAM.43F create mode 100644 files/-README.FIX create mode 100644 files/DDTZDDT.COM create mode 100644 files/QT-ADAM.Z create mode 100644 files/QT-ADM40.Z create mode 100644 files/QT42G-AD.PAT create mode 100644 files/QTCHAT.DOC create mode 100644 files/QTERM.DOC create mode 100644 files/QTERM.FOR create mode 100644 files/QTERM.PAT create mode 100644 files/QTERM43F.COM create mode 100644 files/QTZP.DOC create mode 100644 files/WHATS.NEW create mode 100644 files/ZPATCH.COM create mode 100644 files/ZSM.COM create mode 100644 qt-cpm3.z create mode 100644 qt-rc82.z create mode 100644 qt-rc84.z create mode 100644 qterm43f.lbr create mode 100644 qterm82.com create mode 100644 qterm84.com create mode 100644 qtermc3.com diff --git a/README.md b/README.md new file mode 100644 index 0000000..0b72563 --- /dev/null +++ b/README.md @@ -0,0 +1,102 @@ +# QTERM + +QTERM is a terminal program which provides the following: + +* Capture of text files +* Send text files to remote +* Xmodem / Modem7 / Ymodem protocol transfer +* Kermit protocol transfer +* VT100 emulation +* Split screen mode to separate typed and received text +* Script mechanism for automatic dialing and automation of other operations +* Transfer of text to printer +* Full user area support + +(c) David Goodenough + +It also has a huge advantage (at least for me, Anna) over KERMIT: It does not strip the 8th bit from received characters, so using a VT100 ANSI compatible terminal, you can just log into Telnet BBSes and see the full glory of ANSI/ASCII BBS graphics :) + +QTERM uses patch files to adapt to the various CP/M implementations and hardware variations. + +On this page, I provide several patches that can be used on "modern" CP/M systems like the RC2014 or SC126. + +Unless otherwise noted, the patches were created by Anna Christina Naß and are based the IMSAI8080 patch by Udo Munk, the SIO initialization code by Steve Cousins and the XMODEM patch for RomWBW by Wayne Warthen. + +## Common setting + +The escape key is `^Y`, so to get help, just press `^Y` and `?` in sequence. + +# The patches and binaries + +## SIO/2 patch + +This patch allows the use of QTERM on a RC2014 using a SIO/2 serial port. + +At the moment, the patches provided here are tested on a RC2014 running RomWBW and using 2x SC104 serial ports (SIO/2). + +The patch ```QT-RC82.Z``` uses the second serial port of the first SIO/2 port (base address 0x82) while ```QT-RC84.Z``` uses the first serial port of a second SIO/2 (0x84). + +Direct download of binary: +* [QTERM82.COM](QTERM82.COM) +* [QTERM84.COM](QTERM84.COM) + +The patch calls a RomWBW HBIOS routine to reset the SIO/2 after exiting, so I don't know what happens when using it without RomWBW. + +## CP/M 3 patch + +This patch uses CP/M 3 BDOS calls to send and receive data from the serial port, so it is independant of the hardware as long as the BIOS provides an interface for CP/M. + +To use it, make sure the desired serial port is mapped to ```AUX:``` by using ```DEVICE.COM```. + +In a standard RomWBW system, the second serial port is mapped automatically to ```AUX```, so no remapping is neccessary. + +This makes using QTERM on an SC126 (Z180 ASCI serial port) possible, but also works on an RC2014 with a SIO/2 port. + +Direct download: +* [QTERMC3.COM](QTERMC3.COM) + +The patch file is ```QT-CPM3.Z```. + +# Technical details + +## Files + +The file [QTERM43F.LBR](QTERM43F.LBR) is the original QTerm distribution file. + +The directory [files/](files/) contains all files from the .LBR file. There, the documentation for QTerm, [QTERM.DOC](files/QTERM.DOC) can be found. + +## Applying a patch + +The patches are applied using ```ZSM``` and ```ZPATCH```, which are included in the QTerm distribution (```QTERM43F.LBR```). + +To assemble the patch, use: + + ZSM QT-xxxx.Z + +This creates QT-xxxx.O, which then has to be applied to the .COM file: + + ZPATCH QTERM43F QT-xxxx + +Now QTERM43F.COM has the patch applied and should be ready to use. + +## Details for the SIO/2 patch + +When started, the patch initializes the serial port and it should "just work". + +When exiting QTERM, the "uninitialization" routine is running, which calls the RomWBW function for "Reset with current settings". + +I don't know (yet) what will happen on a RC2014 with the default ROM or with SCM. +If you have problems, you can change the patch file: +In the part: + + .org 0x0273 ;exit subroutine + exit: jp uninit + +change the `exit:` line into: + exit: ret + +so the un-initialization routine won't be called. +You can then also remove the `uninit:` routine at the bottom of the code. + +But then, other programs that will use the same serial port (e.g. KERMIT) won't run correctly until you reboot your system. + diff --git a/files/!README.1ST b/files/!README.1ST new file mode 100644 index 0000000..779854c --- /dev/null +++ b/files/!README.1ST @@ -0,0 +1,120 @@ +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. + \ No newline at end of file diff --git a/files/--READ.1ST b/files/--READ.1ST new file mode 100644 index 0000000..2f3ab3e --- /dev/null +++ b/files/--READ.1ST @@ -0,0 +1,4 @@ +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. + \ No newline at end of file diff --git a/files/-QT-ADAM.43F b/files/-QT-ADAM.43F new file mode 100644 index 0000000..6e2bed2 --- /dev/null +++ b/files/-QT-ADAM.43F @@ -0,0 +1,73 @@ + +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 +on a COPY of the program, and go to the 3rd page . 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 +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 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. +************************************************************************** + + \ No newline at end of file diff --git a/files/-README.FIX b/files/-README.FIX new file mode 100644 index 0000000..ef970e2 --- /dev/null +++ b/files/-README.FIX @@ -0,0 +1,33 @@ + [-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! + + \ No newline at end of file diff --git a/files/DDTZDDT.COM b/files/DDTZDDT.COM new file mode 100644 index 0000000000000000000000000000000000000000..0aec1590fcf59e4775ed11632dd601e4865d1f21 GIT binary patch literal 7424 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 (QTERM) +.var decout 0x010c ; output decimal value in (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$' + \ No newline at end of file diff --git a/files/QT42G-AD.PAT b/files/QT42G-AD.PAT new file mode 100644 index 0000000000000000000000000000000000000000..72341dd43d72cd85bfd9d57066cbc76b62d58987 GIT binary patch literal 1024 zcmX@i#(J2I;V>t|VIGFV46F>dU7s0$*hpFvVyqOJ=}-Bj&vG*I*#e1&PixK!Gd-+5rr>{=lMziF zl>1*=1HyutCmjUkyF%%3C>;o;L!fjdgg$(L>F@(k2m{e!W>yCG+iw21-RzVuyH{Rz ztGMiDr;ZvvKzX1FkUUTls03YJPLhx5EHK*KfC?+NAF%T~yMfWp{Okl+BthkoqXgoR LQF1f{fFS??Jl$fm literal 0 HcmV?d00001 diff --git a/files/QTCHAT.DOC b/files/QTCHAT.DOC new file mode 100644 index 0000000..d4668fc --- /dev/null +++ b/files/QTCHAT.DOC @@ -0,0 +1,650 @@ +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'. 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' that a Hayes compatible +modem would respond with, when presented with 'AT'. + +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 '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 C command under QTERM to open a catch +file, and then immediately closing it with an 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. + \ No newline at end of file diff --git a/files/QTERM.DOC b/files/QTERM.DOC new file mode 100644 index 0000000..e1ab283 --- /dev/null +++ b/files/QTERM.DOC @@ -0,0 +1,457 @@ +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 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: + + ' +++ 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 '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 ' slowly, and: + + 3userid = 17\e + +would program function key 3 to send 'userid = 17 ' at full speed. + + +0-9 - Send function key string - After 'K' has been used to load +strings into the function keys, '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 character, it will not +invoke the function in question. So loading \x1c,\x1cq +( , 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. + \ No newline at end of file diff --git a/files/QTERM.FOR b/files/QTERM.FOR new file mode 100644 index 0000000..f522933 --- /dev/null +++ b/files/QTERM.FOR @@ -0,0 +1,13 @@ +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 + \ No newline at end of file diff --git a/files/QTERM.PAT b/files/QTERM.PAT new file mode 100644 index 0000000..8972463 --- /dev/null +++ b/files/QTERM.PAT @@ -0,0 +1,333 @@ +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 + +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 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 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 + \ No newline at end of file diff --git a/files/QTERM43F.COM b/files/QTERM43F.COM new file mode 100644 index 0000000000000000000000000000000000000000..a4e93349604dc9b77d6538d40e16cd87b9d8af42 GIT binary patch literal 17664 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 literal 0 HcmV?d00001 diff --git a/files/QTZP.DOC b/files/QTZP.DOC new file mode 100644 index 0000000..2785a42 --- /dev/null +++ b/files/QTZP.DOC @@ -0,0 +1,16 @@ +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. + \ No newline at end of file diff --git a/files/WHATS.NEW b/files/WHATS.NEW new file mode 100644 index 0000000..068530d --- /dev/null +++ b/files/WHATS.NEW @@ -0,0 +1,74 @@ +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 characters receivced are expanded to + / pairs, and if half duplex or split screen is invoked as well +as local echo, locally typed '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 after +their '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. + \ No newline at end of file diff --git a/files/ZPATCH.COM b/files/ZPATCH.COM new file mode 100644 index 0000000000000000000000000000000000000000..291a9b07b2011a537f567fd38ea8c36364206168 GIT binary patch literal 3072 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 w-CPf|;#)U#;k literal 0 HcmV?d00001 diff --git a/qt-cpm3.z b/qt-cpm3.z new file mode 100644 index 0000000..4bedb05 --- /dev/null +++ b/qt-cpm3.z @@ -0,0 +1,155 @@ +; 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 + +.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 + + \ No newline at end of file diff --git a/qt-rc82.z b/qt-rc82.z new file mode 100644 index 0000000..8c731b5 --- /dev/null +++ b/qt-rc82.z @@ -0,0 +1,172 @@ +; 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 + +.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 + + diff --git a/qt-rc84.z b/qt-rc84.z new file mode 100644 index 0000000..d7f7d10 --- /dev/null +++ b/qt-rc84.z @@ -0,0 +1,172 @@ +; 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 + +.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 + + diff --git a/qterm43f.lbr b/qterm43f.lbr new file mode 100644 index 0000000000000000000000000000000000000000..feab3feb32079f5e470dc8269617655897b6acbc GIT binary patch literal 74496 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≻F^}MEwGB$dty^boF-ISAwmUUH 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 literal 0 HcmV?d00001 diff --git a/qterm84.com b/qterm84.com new file mode 100644 index 0000000000000000000000000000000000000000..c80e568be7036253b220363442a29e072ee6613a GIT binary patch literal 17664 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 PzN-FM{fYWh^=JPZ_+=Hp literal 0 HcmV?d00001 diff --git a/qtermc3.com b/qtermc3.com new file mode 100644 index 0000000000000000000000000000000000000000..6c92e126da2b2afb7b4fa1192be6c56f022021bf GIT binary patch literal 17664 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 literal 0 HcmV?d00001