]> cloudbase.mooo.com Git - kermit-80.git/commitdiff
Import of "Kermit 80 for CP/M-80 and CP/M-85" from http://www.columbia.edu/kermit... original-source
authorLeo C <erbl259-lmu@yahoo.de>
Fri, 4 Dec 2015 19:51:23 +0000 (20:51 +0100)
committerLeo C <erbl259-lmu@yahoo.de>
Fri, 4 Dec 2015 19:51:23 +0000 (20:51 +0100)
132 files changed:
cpaaaa.txt [new file with mode: 0644]
cpk409.ann [new file with mode: 0644]
cpk411.ann [new file with mode: 0644]
cpkerm.bw2 [new file with mode: 0644]
cpkerm.bw3 [new file with mode: 0644]
cpkerm.bw4 [new file with mode: 0644]
cpkerm.bwr [new file with mode: 0644]
cpkerm.mss [new file with mode: 0644]
cpkerm.pdf [new file with mode: 0644]
cpkerm.ps [new file with mode: 0644]
cpkerm.txt [new file with mode: 0644]
cpkfet.ddt [new file with mode: 0644]
cpkfet.msg [new file with mode: 0644]
cpkhdr.mss [new file with mode: 0644]
cpkhex.bas [new file with mode: 0644]
cpscmd.asm [new file with mode: 0644]
cpscom.asm [new file with mode: 0644]
cpscpm.asm [new file with mode: 0644]
cpsdat.asm [new file with mode: 0644]
cpsdef.asm [new file with mode: 0644]
cpsker.asm [new file with mode: 0644]
cpsker.hex [new file with mode: 0644]
cpsmit.asm [new file with mode: 0644]
cpspk1.asm [new file with mode: 0644]
cpspk2.asm [new file with mode: 0644]
cpsrem.asm [new file with mode: 0644]
cpsser.asm [new file with mode: 0644]
cpstt.asm [new file with mode: 0644]
cpsutl.asm [new file with mode: 0644]
cpswld.asm [new file with mode: 0644]
cpva65.hex [new file with mode: 0644]
cpvacc.hex [new file with mode: 0644]
cpvadv.hex [new file with mode: 0644]
cpvamp.hex [new file with mode: 0644]
cpvapl.hex [new file with mode: 0644]
cpvapm.hex [new file with mode: 0644]
cpvbb2.hex [new file with mode: 0644]
cpvbbc.hex [new file with mode: 0644]
cpvbee.hex [new file with mode: 0644]
cpvbns.hex [new file with mode: 0644]
cpvbra.hex [new file with mode: 0644]
cpvbrm.hex [new file with mode: 0644]
cpvca2.hex [new file with mode: 0644]
cpvca3.hex [new file with mode: 0644]
cpvci3.hex [new file with mode: 0644]
cpvcif.hex [new file with mode: 0644]
cpvcom.hex [new file with mode: 0644]
cpvcp3.hex [new file with mode: 0644]
cpvcpc.hex [new file with mode: 0644]
cpvcps.hex [new file with mode: 0644]
cpvcpt.hex [new file with mode: 0644]
cpvcro.hex [new file with mode: 0644]
cpvdel.hex [new file with mode: 0644]
cpvdis.hex [new file with mode: 0644]
cpvdm2.hex [new file with mode: 0644]
cpvdmv.hex [new file with mode: 0644]
cpvgen.hex [new file with mode: 0644]
cpvgni.hex [new file with mode: 0644]
cpvh89.hex [new file with mode: 0644]
cpvh8q.hex [new file with mode: 0644]
cpvhor.hex [new file with mode: 0644]
cpvhp1.hex [new file with mode: 0644]
cpvhp1.txt [new file with mode: 0644]
cpvkpr.hex [new file with mode: 0644]
cpvlbo.hex [new file with mode: 0644]
cpvmdi.hex [new file with mode: 0644]
cpvmik.hex [new file with mode: 0644]
cpvmm.hex [new file with mode: 0644]
cpvmrl.hex [new file with mode: 0644]
cpvns.hex [new file with mode: 0644]
cpvosb.hex [new file with mode: 0644]
cpvosi.hex [new file with mode: 0644]
cpvpci.hex [new file with mode: 0644]
cpvpcw.hex [new file with mode: 0644]
cpvpro.hex [new file with mode: 0644]
cpvpx8.hex [new file with mode: 0644]
cpvpx8.hlp [new file with mode: 0644]
cpvrmf.hex [new file with mode: 0644]
cpvrmm.hex [new file with mode: 0644]
cpvrob.hex [new file with mode: 0644]
cpvsan.hex [new file with mode: 0644]
cpvsb6.hex [new file with mode: 0644]
cpvsb9.hex [new file with mode: 0644]
cpvscn.hex [new file with mode: 0644]
cpvtel.hex [new file with mode: 0644]
cpvtet.hex [new file with mode: 0644]
cpvtlb.hex [new file with mode: 0644]
cpvtm4.hex [new file with mode: 0644]
cpvtpt.hex [new file with mode: 0644]
cpvtrc.hex [new file with mode: 0644]
cpvud.hex [new file with mode: 0644]
cpvusm.hex [new file with mode: 0644]
cpvvec.hex [new file with mode: 0644]
cpvxer.hex [new file with mode: 0644]
cpvz00.hex [new file with mode: 0644]
cpvz80.hex [new file with mode: 0644]
cpxapp.asm [new file with mode: 0644]
cpxbbi.asm [new file with mode: 0644]
cpxbee.asm [new file with mode: 0644]
cpxcif.asm [new file with mode: 0644]
cpxcom.asm [new file with mode: 0644]
cpxgni.asm [new file with mode: 0644]
cpxhea.asm [new file with mode: 0644]
cpxlnk.asm [new file with mode: 0644]
cpxmrl.asm [new file with mode: 0644]
cpxnor.asm [new file with mode: 0644]
cpxpcw.asm [new file with mode: 0644]
cpxpro.asm [new file with mode: 0644]
cpxsb.asm [new file with mode: 0644]
cpxswt.asm [new file with mode: 0644]
cpxsy2.asm [new file with mode: 0644]
cpxsyo.asm [new file with mode: 0644]
cpxsys.asm [new file with mode: 0644]
cpxtm4.asm [new file with mode: 0644]
cpxtor.asm [new file with mode: 0644]
cpxtyp.asm [new file with mode: 0644]
cpxvdu.asm [new file with mode: 0644]
cpxz80.asm [new file with mode: 0644]
cpzspa.txt [new file with mode: 0644]
lasm.hex [new file with mode: 0644]
lasm.txt [new file with mode: 0644]
m80unv.mac [new file with mode: 0644]
m80v6.doc [new file with mode: 0644]
m80v7.doc [new file with mode: 0644]
m80v7.msg [new file with mode: 0644]
mac80.cmd [new file with mode: 0644]
mac80.doc [new file with mode: 0644]
mac80.mac [new file with mode: 0644]
mac80a.mac [new file with mode: 0644]
mload.asm [new file with mode: 0644]
mload.hex [new file with mode: 0644]
mload.txt [new file with mode: 0644]

diff --git a/cpaaaa.txt b/cpaaaa.txt
new file mode 100644 (file)
index 0000000..2d48bc4
--- /dev/null
@@ -0,0 +1,195 @@
+CPAAAA.HLP                                               23 April 1991
+
+
+Version 4.11 of Kermit-80 is a development of the previous release 4.09,
+changed to add more features.  Much of the system-dependent code is as it
+was in Version 4.09. The names of the files for Version 4.11 follow a fixed
+convention. They all have the form
+
+     CPaxxx.bbb
+
+In these names:
+
+     "a" is one of
+
+          A for general information
+          K for documentation and beware files
+          S for system independent files
+          X for system-dependent source files
+          V for system-dependent hex files
+
+     "xxx" is used to identify unique files used
+
+     "bbb" is the file extention, usually one of:
+
+          ASM for source files
+          HEX for  pre-assembled modules or completeprograms  (eg 
+               LASM.HEX is the assembler)
+          HLP for help files
+          BWR for beware files
+          ANN for notes
+          TXT for pure text files
+          DOC as for TXT
+          MSS SCRIBE sources files (for document files.)
+
+CPKFET.* is a bootstrapping procedure that can be used if you have no other
+way to download the new files.
+
+Version 4.11 may be assembled and linked with LASM and MLOAD, respectively,
+or it may be assembled with the M80 assembler.
+
+It is also possible to assemble the source files on an IBM PC or clone using
+the Z80MU CP/M V2.2 and Z80 emulator, itself running the LASM or M80
+assembler.  (Using Z80MU is very useful if your target systems does not have
+enough disk space for all the source files.)
+
+CP/M Kermit Version 4.11 is built from the sources in the same manner as was
+CP/M Kermit Version 4.09.  LASM and MLOAD may be found in the Kermit
+distribution.
+
+The M80 assembler is a Microsoft product, and you have to pay good money for
+it.
+
+**Note** The overlay address has been moved to 7000H to make room for the
+added code in this version of CP/M Kermit.
+
+Currently, the code for a number of systems has been upgraded from version
+4.09.  The particular system is indicated in filenames by the "xxx" part:
+codes currently in use are:
+
+APP  Apple II with Z80 card
+          - with Micromodem in slot 2
+          - with 6551 and 6850 UARTs
+          - with CP Multifunction card
+
+BBI  Kaypro, Bigboard, Xerox 820 and Ampro Little Board systems
+
+CIF  Cifer 1886 using the VL:  or AL ports as TTY:Line. (Use &set 
+     to  set ttyi:  and ttyo:  to the VL:  or AL:port)  Choice of 
+     CP/M V2.2 or 3.0 ("PLUS")
+
+HEA  Heath systms (Heath 8 with quad IO interface board)
+     Telcon ZORBA
+
+PCW  Amstrad PCW 8256 and 8152 as well as CP/M-plus on CPC 6128
+
+NOR  Northstar Advantage
+     Northstar Horizon (Several: labels in CPXTYP are:
+          BASICNS
+          NORTHS
+          HORIZON
+     Comart  Communicator.  This  is included as it  is  somewhat 
+     similar to the Northstar Horizon.
+
+TOR  Superbrain  (Main and Aux port versions..  assumes MicroMods 
+     add-ons)
+     Torch systems (runs ok on Unicorn-5 under CP/M)
+     Ithaca Intersystems series machines using the VIO card. (PCI 
+     2651 USARTS)
+     NCR DecisionMate V systems
+
+as well as another half dozen single system only family files.  The total
+list of systems supported so far is:
+
+
+System supported in CP/M-80 Kermit V4.11 (and growing!)
+Label   .HEX File   For system
+============================================================================
+ACCESS  CPVACC       Access Matrix
+ADVANT  CPVADV       Northstar Advantage
+AMPRO  CPVAMP       Ampro Little Board (terminal required)
+AP6551  CPVAPL       Apple II, Z80 Softcard, 6551 ACIA in serial Interface
+AP6850  CPVA65       Apple II, Z80 Softcard, 6850 ACIA in Serial Interface
+APMMDM  CPVAPM       Apple II, Z80 Softcard, Micromodem II in slot 2
+APCPS   CPVCPS       Apple II, Z80 Softcard, with CPS multifunction card
+BASICNS CPVBNS       Northstar Horizon (terminal required)
+BBC     CPVBBC       Acorn "BBC" computer with Acorn Z80 second processor
+BBII    CPVBB2       BigBoard II (terminal required)
+MBEE   CPVBEE       Microbee Systems Ltd Microbee (56K, 64K, 128K & 256K)
+BRAINM  CPVBRM       Intertec Superbrain using the main port
+BRAINA  CPVBRA       Intertec Superbrain using the Aux port
+CIFER2  CPVCIF       Cifer 1886 using the VL: Serial port and CP/M V2.2
+CIFER3  CPVCI3       Cifer 1886 using the VL: Serial port and CP/M V3.0
+CIFER2  CPVCA2       Cifer 1886 using the AUX: Serial port and CP/M V2.2
+CIFER3  CPVCA3       Cifer 1886 using the AUX: Serial port and CP/M V3.0
+CMEMCO  CPVCRO       Cromemco with TU-ART card. Terminal required)
+COMART  CPVCOM       Comart Communicator (terminal required)
+COMPRO  CPVPRO       Compupro with Interfacer 4 (or 3).  Terminal required.
+CPC     CPVCPC       Amstrad CPC 664 and 6128 and CP/M 3
+CPM3    CPVCP3       "Generic": CP/M 3.0 (CP/M Plus) systems (terminal req'd)
+CPT85XX CPVCPT       CPT-85xx wordprocessor with CP/M
+DELPHI  CPVDEL       Digicomp Delphi 100 (terminal required)
+DISC    CPVDIS       Action Computer Enterprises "Discovery" (terminal req'd)
+DMII    CPVDM2       DECmate II with CP/M option
+GENER   CPVGEN       "Generic": CPM 2.2 systems with IOBYTE (terminal req'd)
+GENIE   CPVGNI       Video Genie
+H8QUAD  CPVH8Q       Heath-8 with Quad 8 i/o board
+HEATH   CPVH89       Heath/Zenith H89
+HORIZON CPVHOR       Northstar Horizon (terminal required)
+HP125  CPVHP1       Hewlett-Packard HP-125 Business Assistant
+KPII    CPVKPR       Kaypro-II (and 4; probably supports all Kaypro systems)
+LOBO    CPVLBO       Lobo Max-80
+M2215   CPVMRL       British Telecom Merlin/Rair Black Box (terminal required)
+MDI     CPVMDI       Morrow Decision I (terminal required)
+MIKKO   CPVMIK       MikroMikko
+MMATE   CPVMM        PMC 101 Micromate (terminal required)
+MMDI    CPVUD        Morrow Micro Decision I (terminal required)
+NCRDMV  CPVDMV       NCR Decision Mate V.  (Terminal required?)
+NORTHS  CPVNS        Northstar Horizon with HSIO-4 card (terminal req'd)
+OSBRN1  CPVOSB       Osborne 1
+OSI     CPVOSI       Ohio Scientific
+PCI2651 CPVPCI       Ithaca Intersystems with VI0 card (terminal required)
+PCW     CPVPCW       Amstrad PCW 8256/8512 with serial interface
+PX8     CPVPX8       Epson PX-8
+RM380ZM CPVRMM       Research Machines 380Z with MDS (5.25" discs)
+RM380ZF CPVRMF       Research Machines 380Z with FDS (8" discs)
+ROBIN   CPVROB       DEC VT180
+S1008   CPVUSM       US Microsales S-100-8 (terminal required)
+SANYO   CPVSAN       Sanyo MBC-1100
+SB6     CPVSB6       Micromint SB-180 with 6Mhz CPU (terminal required)
+SB9     CPVSB9       Micromint SB-180 with 9Mhz CPU (terminal required)
+SCNTPR  CPVSCN       Screentyper
+TELCON  CPVTEL       TELCON Zorba portable
+TELETEK CPVTET       Teletek Systemaster (terminal required)
+TORCH   CPVTRC       Torch computers BBC-B with Z80 second processors
+TRS80LB CPVTLB       TRS-80 model II with Lifeboat 2.25C CP/M Display
+TRS80PT CPVTPT       TRS-80 model II with Pickles + Trout CP/M Display
+TRSM4   CPVTM4       TRS-80 model IV
+VECTOR  CPVVEC       Vector Graphics
+XER820  CPVXER       Xerox 820
+Z100    CPVZ00       Z-100 under CP/M-85
+Z80MU   CPVZ80       Z80MU development system on a PC
+
+
+Terminals supported in CP/M-80 Kermit V4.11 (and growing!)
+Label        Terminal
+========================================================================
+CRT          Does not do cursor addressing
+ADM3A        Lear Seigler ADM 3A
+ADM22        Lear Seigler ADM 22
+AM230        Ampro 230
+H1500        Hazeltine 1500
+SMRTVD       Netronics Smartvid
+SOROQ        Soroq IQ-120
+TVI912       Televideo 912
+TVI925       Televideo 925 or Freedom 100
+VT52         Dec VT52 or equivalent (H19)
+VT100        Dec VT100 or equivalent
+WYSE         Wyse 100
+
+More systems and families are always coming in, so this list and the source
+files are all likely to change sometime in the near future.
+
+Any comment, suggestions etc send them in.  I will not guarentee that your
+suggestions will be implemented, but maybe....
+
+Cheers ES 73's/88's, Mike Freeman K7UIJ
+Bonneville Power Administration
+P.O. Box 491
+Vancouver, WA 98666
+(206)690-2307
+301 N.E. 107th Street
+Vancouver, WA 98685 USA
+(206)574-8221
+
+E-Mail:  freeman@watsun.cc.columbia.edu on Internet
diff --git a/cpk409.ann b/cpk409.ann
new file mode 100644 (file)
index 0000000..4c9def0
--- /dev/null
@@ -0,0 +1,354 @@
+Following is the announcement of CP/M-80 Kermit version 4.09, the first
+new release of CP/M Kermit since 4.05 since February 1985.
+
+Kermit files may be obtained over networks and by mail order.  On the
+Internetwork, use FTP to log in to host CU20B, CU20B.COLUMBIA.EDU, or
+CU20B.CC.COLUMBIA.EDU (a DECSYSTEM-20), as user ANONYMOUS, using any password,
+and GET (or MULTIPLE GET, or MGET) the desired files from logical device KER:,
+e.g. MGET KER:CP*.* for the new CP/M files.  You can also get Kermit files over
+BITNET/EARN; to get started send a message with text HELP to KERMSRV, the
+Kermit file server, at host CUVMA.  For detailed instructions, read the file
+KER:AANETW.HLP (AANETW HLP on KERMSRV).  To order by mail, request a complete
+list of Kermit versions and an order form from Kermit Distribution, Columbia
+University Center for Computing Activities, 612 West 115th Street, New York, NY
+10025 USA.
+
+Date: 8 Jan 88 0:00:00
+From: Bertil Schou, Loughborough University, UK
+Via: SYSKERMIT%vax1.central.lancaster.ac.uk@NSS.Cs.Ucl.AC.UK
+Subject: Announcing Version 4.09 of Kermit-80 for CP/M-80
+Keywords: CP/M-80 Kermit 4.09
+
+After an incredibly long gestation period, here is hopefully an updated
+version of Kermit-80 V4.05. Kermit-80 V4.08 is issued for testing purposes
+only.  Version 4.09 is the release issue of version 4.08.  I still, however,
+want any feedback about problems generated in this revision, or others
+desperately want fixing.
+
+Superficially, there is little real change in operation of Kermit-80, version
+4.05, but there have been some major jobs tackled like trapping BDOS calls and
+multiple FCB buffering...
+
+New bits for this version include:
+     SET       {SEND/RECEIVE} START-OF-PACKET character
+     SET       DIRECTORY-FILE-SIZE (Shows or hides file sizes on 
+                 DIRectory displays)
+     SET       TERMINAL to OFF, VT52, DUMB, EXTERNAL, QUIET, REGULAR.
+     SET       USER to set other user spaces
+     RECEIVE   to collect a file from a remote SENDer
+     GET       to collect a file from a remote SERVER
+     SEND      {local filename} {remote filename}
+     TAKE      to take command files from disk (including other take files!)
+     FCOPY     Copy CP/M files from within Kermit (no wildcard)
+     TYPE      Type a file to the console from within Kermit
+     PRINT     Print a file to the printer from within Kermit
+     -         Updated  TRANSMIT command that waits for a string of characters
+                 from the host (default is CR).
+     -         Command line commands, eg:
+                    KERMIT ;SET FILE BINARY;SEND FOO.BAR
+     -         Automatic TAKE KERMIT.INI on default disk on
+                 loading KERMIT-80 (useful for SET BAUD etc.)
+     -         Much improved speed on DIRECTORY 
+     -         Automatic CLOSE-ing of a terminal connection if the line is
+                 DROP-ped (currently only for an Apple, and Torch has a dummy
+                 test for cntrl-] D in connect state)
+     -         Improved printer handling.
+
+On the negative side, only LASM and Microsoft M80 assemblers can be used to
+assemble the source files. I personally see no point in being able to support
+several assemblers if LASM can do the job, but then again, I have not used the
+MAC80 cross assembler...  Comments on assembler compatabilities, please!
+
+All source files have been renamed, and there are a few additions. All source
+files are named in the form CPaxxx.ASM, where:
+
+     a=A for general information
+     a=S for system independent source files and hex file
+     a=X for system dependent source files
+     a=V for system-dependent hex files
+
+The system dependent code has changed a litle too, hopefully bringing the
+CPXSYS.ASM (formerly CP4SYS.ASM) file a bit more toward a manageable size.
+There is now the possibility for FAMILIES of systems, like APPLE and NorthStar
+(also Comart), which contains code for computers of a single type.  I have
+immediately gone against all this by creating a family with the code for
+Torches, Cifers, Ithacas and Superbrains (this because we have these systems
+here at Loughborough.)
+
+Bertil Schou.
+
+[Ed. - Many thanks, Bertil!  And also to Alan Phillips and Steve Jenkins at
+Lancaster University for sending this new version to us via transoceanic
+magnetic tape, and to the many others in the UK who contributed to this new
+release.  This version supports all the systems supported by version 4.05,
+with the exception of the HP-125, and with the addition of many more, for a
+total of something like 52 systems.  The new files have been installed in
+KER:CP*.*, and the old ones moved (on CU20B, anyway) to KO:CP*.*.  CP/M
+users, please get this new version and try it out, so we can make sure it's
+safe to distribute.  And this is also the time to plead ONCE AGAIN for
+volunteers to distribute CP/M Kermit on 5.25-inch diskette for different
+kinds of systems, and also in "universal" 8-inch diskette format.  Please
+come forward if you can do it, or know of a user group that can!]
+
+
+CPKERM.MSG       08 Jan 1988
+**********
+
+After  an incredibly long gestation peroid,  here is hopefully an 
+updated version of Kermit-80 V4.05. Kermit-80 V4.08 is issued for 
+testing  purposes  only.  Version  4.09 is the release  issue  of 
+version 4.08.  I still, however, want any feedback about problems 
+generated in this revision, or others desperately want fixing. 
+
+Superficially,  there  is  little  real change  in  operation  of 
+Kermit-80,   version 4.05,   but there have been some major  jobs 
+tackled like trapping BDOS calls and multiple FCB buffering... 
+
+New bits for this version include:
+     SET       {SEND/RECEIVE} START-OF-PACKET character
+     SET       DIRECTORY-FILE-SIZE (Shows or hides file sizes  on 
+               DIRectory displays)
+     SET       TERMINAL to  OFF,  VT52,  DUMB,  EXTERNAL,  QUIET, 
+               REGULAR.   External  is for those wanting to write 
+               their  own  drivers,  DUMB  passes  only  printing 
+               characters and sone control characters (eg CR/LF).  
+               QUIET/REGULAR    permits   brief/verbose    screen 
+               displays during transfers.
+     SET       USER to set other user spaces
+     RECEIVE   to collect a file from a remote SENDer
+     GET       to collect a file from a remote SERVER
+     SEND      {local filename} {remote filename}
+     TAKE      to  take command files from disk (including  other 
+               takes files!)
+     FCOPY     Copy CP/M files from within Kermit (no wildcard)
+     TYPE      Type a file to the console from within Kermit
+     PRINT     Print a file to the printer from within Kermit
+     -         updated  TRANSMIT command that waits for a  string 
+               of characters from the host (default is CR)
+     -         Command line commands, eg:
+                    KERMIT ;SET FILE BINARY;SEND FOO.BAR
+     -         automatic  TAKE  KERMIT.INI  on  default  disk  on 
+               loading KERMIT-80 (useful for SET BAUD etc.)
+     -         much improved speed on DIRECTORY 
+     -         automatic  CLOSE-ing of a terminal  connection  if 
+               the line is DROP-ped (currently only for an Apple, 
+               and  Torch  has  a  dummy test for  cntrl-]  D  in 
+               connect state)
+     -         improved  printer  handling.  (Kermit-80 sends  an 
+               XOFF to the host if the characters are comming  in 
+               faster  than they are printed.  This does not work 
+               in  this version,  as another  option,  SET  FLOW-
+               CONTROL  has not been fully implemented - also,  I 
+               did  not  have  a printer to test this  out  on  a 
+               Torch...) 
+
+On the negative side,  only LASM and Microsoft M80 assemblers can 
+be used to assemble the source files. I personally see no pont in 
+being  able to support several assemblers if LASM can do the job, 
+but  then  again,  I have not used the MAC80  cross  assembler... 
+Comments on assembler compatabilities, please!
+
+All  source  files  have  been  renamed,  and  there  are  a  few 
+additions. All source files are named in the form:
+
+
+
+
+
+
+
+CPaxxx.ASM
+
+where:
+
+     a=A for general information
+     a=S for system independent source files and hex file
+     a=X for system dependent source files
+     a=V for system-dependent hex files
+
+The  system  dependent code has changed a  litle  too,  hopefully 
+bringing  the  CPXSYS.ASM (formerly CP4SYS.ASM) file a  bit  more 
+toward  a  manageable  size.  There is now  the  possibility  for 
+FAMILIES  of  systems,  like APPLE and NorthStar  (also  Comart), 
+which  contains  code  for computers of a  single  type.  I  have 
+immediately  gone against all this by creating a family with  the 
+code for Torches,  Cifers, Ithacas and Superbrains. (This because 
+we have these systems here at Loughborough) 
+
+CPXSYS.ASM  is the "left over" systems not having a family to  go 
+to  (poor  things),  but is very much smaller than  the  original 
+CP4SYS.ASM.
+
+All VDU and terminal information is now held in CPXVDU.ASM.  This 
+is really the last section in the older CP4SYS.ASM file.
+
+A quick "schematic" of what happens at assembly time... (assuming 
+LASM is being used)
+
+LASM CPXTYP... this then assembles the following:
+
+CPXTYP
+ |
+ v
+CPSDEF
+ |
+ v
+CPXLNK
+ |
+ v
+CPXCOM (Common code for most systems)
+ |
+ v
+CPXSWT-------+----------+-----------+-----------+---- File selector
+ |           |          |           |           |
+ v           v          v           v       CPXTOR     CPXAPP      CPXNOR      CPX???    one of
+ |           |          |           |           |      several
+ |           |          |           |           |      Families
+ +<----------+----------+-----------+-----------+----
+ |
+ v
+CPXVDU   (if a terminal is required)
+ |
+ |
+ v
+<END of assembly>
+
+
+
+Users  should  be  aware  of  the  change  both  to  the  linking 
+
+
+
+
+
+
+information and start of the overlay address. Since Version 4.05, 
+four new entries have been added to the overlay table.   First of 
+all,  family  (offset +6),  which is a two byte poiter to a text 
+string in the family file.   The remainder are two byte  pointers 
+(in  the usual JMP 0 format) to a print status  routne,  (lptstat 
+offset 20h),  an optional VDU driver, and a reverse entry back to 
+the  system independent BDOS routines (which does a lot more than 
+simply pass on the BDOS request to BDOS)
+
+There  have  also  been some bugs fixed in  some  of  the  system 
+dependent code, so you would be wise pulling all the source files 
+across. 
+
+The overlay address is now 6000h, and will probably change before 
+this  revision  is  complete.  The speeding up of  multiple  file 
+handling takes its toll on memory,  as there are now 64-ish  FCBs 
+buffered. This speeds up the DIRECTORY command no end. 
+
+With  the overlay address at 6000h there is still a lot of  space 
+free for more things to be added,  so unless there is a big  hash 
+made to Kermit, this will not change.
+
+Most  of  the  Version 4.05 documentation still  holds  for  this 
+version  of kermit-80.  Note however the changes in the number of 
+system dependent files used, and the use of FAMILY files. 
+
+The  new  commands are  (hopefully)  self-explanatory.  The  TAKE 
+command  requires  files  TAKE-n to be pure ASCII  text,  with  a 
+control-z as the end of file marker.  Most editors will  probably 
+do this for you. 
+
+LASM  and Microsoft M80 assembles are the only ones supported.  I 
+suggest LASM be used by default for all further development work, 
+though   I   DO  know  that  there  are  others   requestin   M80 
+comaptability.  
+
+How to get V4.09 onto your system.
+**********************************
+If you alread have a Kermit running on your system, you should be 
+able  to  pull the CPSKER.HEX and suitable system file  to  yopur 
+system,  then MLOAD the two together.   If you dont have  kermit, 
+see  if you cannot get a copy from somewhere - it saves a lot  of 
+frustrating work.  Failing that, refer to the REAL manuals!
+
+If  you  want  to assemble the sources from  scratch,  pull  all 
+CPS*.ASM  files,   and  CPX(TYP  LNK  COM  SWT).ASM  files,   and 
+CPXVDU.ASM  if you use a terminal.   You will have to  pluck 
+either  CPXSYS./ASM or another family file.   You will also  need 
+loads of disk space.   If you run short,  but have a handy IBM PC 
+or  clone  with a Mbyte or two free,  use the public  domain  Z80 
+emulator Z80MU to develop the .HEX files required.  Also aquire a 
+copy  of LASM.   Use LASM it to assemble CPSKER and CPXTYP  after 
+editing CPXTYP and selecting a suitable system.    This generates 
+CPSKER.HEX and CPXTYP.HEX.
+
+MLOAD the two .HEX files together, eg: 
+
+MLOAD NEWKER=CPSKER,CPXTYP
+
+After this,  you will hopefully have a runnable copy of KERMIT-80 
+
+
+
+
+
+
+Version 4.09 on your system. 
+
+Disclaimer:  No  responsibilty can be assumed by anyone as to the 
+suitabilty etc.etc.  In otherwords,  you are the one  responsible 
+for your implentation of Kermit-80, any version. I will give help 
+where I can,  but no guaranttes will be given.  Note that not all 
+systems  and  facilities  have  been tested (thats  why  you  are 
+getting  involved!) so make sure you have a copy of  4.05  Kermit 
+before trying this one! 
+
+Things yet to be done - lots!
+
+There have been moves trying to add other independent modules for 
+other terminal emulators other than the VT52. Demands for SERVER, 
+REMOTE HOST..., file compression, better TRANSMIT, % of file sent 
+and/or  Kbytes  sent/received  as  part  of  the  display  diring 
+transfers,  a  lot  of cosmetic tidying up as well as  even  more 
+systems  to be added.  CP/M-80 is a slowly dying DOS,  and I feel 
+inclined to leave some bits out, like SERVER (how many use really 
+large  Winchesters in CP/M-80 systems,  and want true  servers?). 
+Does  anyone have a burning desire for these facilities?  And  if 
+so, will YOU be willing to take on the job of implementing them? 
+
+If you have any comments,  please E-mail them to  OBSchou (me) at 
+Loughborough.  If you really must, try (0509) 222313, but I share 
+a phone, so use the phone only if you cannot mail me. 
+
+Best of luck, 
+
+Bertil Schou.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/cpk411.ann b/cpk411.ann
new file mode 100644 (file)
index 0000000..92df86e
--- /dev/null
@@ -0,0 +1,90 @@
+Date:  24-May-1991
+
+Announcing:  CP/M Kermit Version 4.11
+
+Just to prove that the CP/M world still exists, here is CP/M Kermit -80 
+Version 4.11.
+
+Features added since version 4.09 include:
+
+o      SET COLLISION {BACKUP/DISCARD/OVERWRITE/RENAME}
+o      SET INCOMPLETE-FILES {DISCARD/KEEP}
+O      Many REMOTE commands, including some REMOTE SET commands
+o      RENAME command to rename CP/M files from within Kermit-80
+o      SET RECEIVE/SEND PACKET-LENGTH nn (nn <= 94)
+o      SET AUTORECEIVE ON now implies that Kermit-80 ALWAYS tries to
+       receive more files when a RECEIVE transaction has completed.  The
+       user can abort with ^C.
+o      QUIT is now a synonym for EXIT.
+o      STAY is now a synonym for SET NO-EXIT.
+o      CONNECT, RECEIVE and SEND may be abbreviated to C, R and S,
+       respectively.
+o      Processing of commands from a file via a TAKE command may now be
+       aborted by entering a Control-C at the console.
+o      The TYPE and PRINT commands are now immediately aborted if a
+       Control-C is entered at the console. If a Control-X is entered at
+       the console, typeout/printout of the current file is aborted and
+       typeout/printout of the next file, if any, begins. These actions
+       also occur if any other key has been pressed to halt typeout/printout
+       and Control-C or Control-X is pressed. Pressing any other key resumes
+       the typeout/printout.
+o      Many bug fixes
+o      Kermit-80 Version 4.11 now supports the Microbee family of
+               computers (56K, 64K, 128K and 256K) manufactured by
+               Microbee Systems, Ltd, of Australia.
+o      Kermit-80 now supports the Ampro Little Board system.
+
+Technical changes:
+
+o      An "I" packet is now tried before the request for files is sent
+               in a GET command
+o      The overlay address is now 7000H
+o      The overlay (CPXLNK.ASM) has an added INCFLG variable to handle
+               INCOMPLETE-FILES status
+o      The COPY, TYPE and PRINT commands now use the large buffer
+               (8K bytes default size) for file I/O
+
+Syntax hints:
+
+In REMOTE commands such as REMOTE COPY, REMOTE MESSAGE, REMOTE RENAME,
+REMOTE WHO etc., where two arguments are required, the syntax is as for Vax
+VMS Kermit, i.e.,
+REMOTE <command> <argument 1>
+Prompt:  <argument 2>
+For example:
+REMOTE COPY <old-file>
+New file: <new-file>
+
+The REMOTE LOGIN command has three arguments, of which the last two are
+prompted for an entered on new lines.  Arguments are optional.
+
+In commands such as REMOTE SET FILE BLOCK-SIZE which take a numeric
+argument, Kermit-80 does not check the argument for validity.  Whatever is
+typed is what the host sees.
+
+The FCOPY command has been renamed to COPY.
+
+The syntax for the RENAME command is as for the COPY command, that is:
+RENAME <old-filespec> <new-filespec>
+
+More rigorous checking for wildcards is now done by both of these
+commands.
+
+The STRING command has been renamed to OUTPUT.
+
+SET BAUD-RATE is now SET SPEED.
+
+The option SET FILE DEFAULT has ben re-enabled.  Use a TAKE-file to set the
+initial file-mode to ASCII or BINARY.
+
+Building Kermit-80 ver. 4.11:
+
+Kermit-80 ver. 4.11 is built using the same procedure as for ver. 4.09.
+
+
+Many thanks to those who have contributed bug fixes, and, in particular,
+to Mr. Russell Lang of Monash University, Australia, for contributing
+a bug-fix and the family file for the Microbee systems and to Mr.
+Jay S. Rouman of Mt. Pleasant, MI for contributing the code for the Ampro
+Little Board. Thanks are also due to Lance Tagliapietra of the University
+of Wisconsin at Platteville for finding several bugs.
diff --git a/cpkerm.bw2 b/cpkerm.bw2
new file mode 100644 (file)
index 0000000..ae3d6de
--- /dev/null
@@ -0,0 +1,131 @@
+Re:  Problems with CP/M Kermit Version 4.09
+
+Following is a list of problems and their solutions for CP/M Kermit
+Version 4.09.  Bear in mind that the latest version of CPSPK1.ASM I have is
+edit (11) and of CPSPK2.ASM is edit (4).
+
+Problem:  When the terminal is in "quiet" mode, initiation of file-transfers
+       causes lots of garbage to appear on the screen which is distracting
+       and which raises havoc with voice output devices.
+Diagnosis:  In the module CPXCOM.ASM, the routine "prtstr" has two flavors:
+       one for machines which cannot display control-characters via BDOS
+       function 9 and one which can display such characters via function 9.
+       In this latter case, only register pair BC is saved around the BDOS
+       call.  This is insufficient as BDOS also clobbers register pairs
+       DE and HL during the call.  In "quiet" mode, at least one of these
+       pairs is expected to remain constant.
+Solution:  Save register pairs DE and HL around the function 9 BDOS call.
+
+Problem:  When GETting a file, the initialization routine "init" is executed
+       twice.  This doesn't harm anything and may not be noticeeable in
+       print but is most annoying when using voice output as "init" types
+       out the Kermit version and screen initialization strings and thus
+       one hears them twice.
+Solution:  In the module CPSPK1.ASM, move the label "read0a" down one line
+       so that the common code for the "receive" and "get" commands starts
+       just *after* the call to "init" is made in "receive" mode.
+
+Problem:  With "auto-receive" set to "off", after a RECEIVE has completed,
+       Kermit waits for Console input; then looks for more data to receive
+       when there is none.
+Diagnosis:  In the module CPSPK1.ASM, when the status of "auto-receive" is
+       checked, the wrong label is branched to if "auto-receive" is OFF.
+Solution:  Change the instruction "jz read5c" to "jz read5b".
+
+Problem:  Files whose filenames are less then 8 characters in length have
+       ASCII zeros ("0") appended to them.
+Diagnosis:  In the module CPSPK2.ASM, after label "gofi7b", where the status
+       of "file-warning" is checked, the code for the appending of "&"
+       characters to filenames if the file already exists on disk has been
+       commented out and new code putting numeric suffixes on filenames
+       in this case has been substituted.  In the process, the code for
+       checking for a file's existence has been accidentally commented out.
+       Thus, if "file-warning" is "on", *every* file is assumed to have
+       a duplicate and a numeric suffix is added to each filename.  In
+       addition, no warning of this is given on-screen.
+Solution:  (1) Uncomment the code which checks for the existence of each file.
+       (2) Uncomment the code which prints the file-warning error message
+       and put a "lxi d,fnbuf" instruction between the "stax d" shown in
+       CPKERM.BWR and the call to "prtstr" so that routine can print the
+       filename of any file whose existence has been detected.
+
+
+With these changes, Kermit-80 performs like a champ.
+Following are file comparisons showing the changes noted above.
+
+************
+File DISK$USER:[OGRFJMF.KERMIT.CPM]CPXCOM.ASM;1
+  418           push    b
+******
+File DISK$USER:[OGRFJMF.KERMIT.CPM.HP125]CPXCOM.ASM;1
+  418          PUSH    H
+  419          PUSH    D
+  420           push    b
+************
+************
+File DISK$USER:[OGRFJMF.KERMIT.CPM]CPXCOM.ASM;1
+  422           ret             ; all done for good machines
+******
+File DISK$USER:[OGRFJMF.KERMIT.CPM.HP125]CPXCOM.ASM;1
+  424          POP     D
+  425          POP     H
+  426           ret             ; all done for good machines
+************
+
+Number of difference sections found: 2
+Number of difference records found: 4
+
+DIFFERENCES /IGNORE=()/MERGED=1/OUTPUT=DISK$USER:[OGRFJMF.KERMIT.CPM.HP125]CPXCOM.DIF;1-
+    DISK$USER:[OGRFJMF.KERMIT.CPM]CPXCOM.ASM;1-
+    DISK$USER:[OGRFJMF.KERMIT.CPM.HP125]CPXCOM.ASM;1
+
+File 1)        DSKE:CPSPK1.ASM[10,50,KERMIT,CPM]       created: 1940 26-Aug-89
+File 2)        DSKE:CPSPK1.ASM[10,50,KERMIT,CPM,HP125] created: 2247 27-Aug-89
+
+1)1    read0a: call    init            ;clear line, initialise buffers
+1)             lxi     d,remnam        ;[gnn] save local name here
+1)             mvi     a,cmtxt         ;[gnn]
+****
+2)1            call    init            ;clear line, initialise buffers
+2)     read0a: lxi     d,remnam        ;[gnn] save local name here
+2)             mvi     a,cmtxt         ;[gnn]
+**************
+1)2            jz      read5c          ; no autoreceives, so drop out
+1)             lxi     d,anymes        ; load up Press any key to continue
+****
+2)2            jz      read5b          ; no autoreceives, so drop out
+2)             lxi     d,anymes        ; load up Press any key to continue
+**************
+
+File 1)        DSKE:CPSPK2.ASM[10,50,KERMIT,CPM]       created: 0829 28-Aug-89
+File 2)        DSKE:CPSPK2.ASM[10,50,KERMIT,CPM,HP125] created: 2259 27-Aug-89
+
+1)1    ;       mvi     c,openf         ;See if the file exists.
+1)     ;       lxi     d,fcb
+1)     ;       call    bdos
+1)     ;       cpi     0FFH            ;Does it exist?
+1)     ;       jz      gofil9          ;If not create it.
+1)     ;       lxi     d,infms5
+1)     ;       call    error3
+1)     ;       lda     temp2           ;Get the number of chars in the file name.
+****
+2)1            mvi     c,openf         ;See if the file exists.
+2)             lxi     d,fcb
+2)             call    bdos
+2)             cpi     0FFH            ;Does it exist?
+2)             jz      gofil9          ;If not create it.
+2)             lxi     d,infms5
+2)             call    error3
+2)     ;       lda     temp2           ;Get the number of chars in the file name.
+**************
+1)1            call    prtstr          ; write string to console
+****
+2)1            lxi     d,fnbuf         ;[MF]Point to string
+2)             call    prtstr          ; write string to console
+**************
+\f
+
+I may be reached on BITNET by E-mail to mailer@uwalocke with the subject-line
+containing the phrase <dec10%"bpa">.
+-- Mike Freeman; Bonneville Power Administration; Vancouver, Wa;
+Telephone (206)690-2307 --
diff --git a/cpkerm.bw3 b/cpkerm.bw3
new file mode 100644 (file)
index 0000000..dc144e2
Binary files /dev/null and b/cpkerm.bw3 differ
diff --git a/cpkerm.bw4 b/cpkerm.bw4
new file mode 100644 (file)
index 0000000..9d7c7ff
--- /dev/null
@@ -0,0 +1,50 @@
+Date: Tue, 14 May 91 11:46:47 EDT
+From: Mike Freeman <freeman@watsun.cc.columbia.edu>
+To: info-cpm@wsmr-simtel20.army.mil, fdc
+Subject: Kermit-80 Version 4.11
+
+Dear Mr. Mills:
+     In a recent Info-cpm digest, in article <26697@hydra.gatech.EDU>, 
+you asked how to get Kermit-80 version 4.11. going.  Lance 
+Tagliapietra's answer was a good one.  You also might want to get 
+cpaaaa.hlp from watsun's ~kermit/a/ directory; this gives the machines 
+that Kermit-80 currently supports along with the filenames of the Intel 
+hex files for those machines.  As Mr. Tagliapietra says, you probably 
+won't have to rebuild the system-independent part of Kermit-80.  If your 
+CP/M machine is one of those currently supported by Kermit-80, you need 
+only get the system-dependent hex file and combine them with MLOAD, DDT, 
+DDTZ or whatever (MLOAD and DDTZ are my preferences since they don't 
+require you to calculate image length for a CP/M SAVE).  If your system 
+is not supported, pick up cpxtyp.asm, cpxcom.asm, cpxlnk.asm and 
+cpxswt.asm.  Currently, systems are organized into "families", as, for 
+example, Amstrad machines.  If you were going to recompile Amstrad 
+Kermit's system-dependent file, you'd also get cpxpcw.asm.  Some systems 
+(as, for example, the HP-125) are in the files cpxsys.asm and 
+cpxsy2.asm, which you'd get.  In any case, if your system isn't 
+supported, get a "family" file that's close or create one yourself.  If 
+your system doesn't have a built-in terminal, you'll also need 
+cpxvdu.asm (which contains terminal drivers).  Set the appropriate 
+switch in cpxtyp.asm to true (or put one in for your system if it isn't 
+supported), set a terminal-switch to TRUE (or select Generic CRT if 
+nothing's listed for your terminal or put your terminal's codes into a 
+family file or cpxvdu.asm), get LASM or M80 and compile away. L80 can be 
+used to link the system-dependent file but you must be sure to do a 
+/P:7000 as the first part of the L80 command tail so the REL-file has 
+the proper absolute address.  You still need MLOAD, DDT, DDTZ or 
+whatever to combine the files, so why not get LASM and use it, too.  
+Hope this message along with Mr. Tagliapietra's message helps you.  Feel 
+free to ask either him or me any Kermit-80 queries you'd like.
+     By the way, I think you'll like Kermit-80 4.11.  It's got support 
+for many REMOTE commands (advanced server commands).  It's only drawback 
+is that it doesn't support repeat-prefixing or extended-length packets 
+yet -- get QTERM version 43E (along with my bug fix for it) to get those 
+features.
+     Cheers!
+     -- Mike Freeman K7UIJ --
+     301 N.E. 107th Street
+     Vancouver, WA 98685
+     (206)574-8221 (home)
+     (206)690-2307 (work)
+P.S. If your system isn't supported, you'll also need to (a) create a
+family switch in cpxtyp.asm or (b) set sysfam TRUE and put your code in
+cpxsys.asm/cpxsy2.asm.  Then compile and link. -- Mike Freeman K7UIJ --
diff --git a/cpkerm.bwr b/cpkerm.bwr
new file mode 100644 (file)
index 0000000..538cea4
--- /dev/null
@@ -0,0 +1,565 @@
+From: Vace Kundakci <VVVCU@CUVMB.columbia.edu>
+To: Frank da Cruz <fdc@cunixc.cc.columbia.edu>
+Subject: Something in my rdr
+
+Dear VVVCU AT CUVMBA
+
+Yesterday I tried to contact OBSchou@Loughborough.Multics
+on JANET, for this was the address I found in the file
+CPAAA TXT on KERMSRV AT CUVMBA. I wanted to report a bug
+in CP/M kermit and to ask him a question about two source
+files on KERMSRV. Would you please be so kind to forward
+this message below to the one who is responsible for the
+files CP???? ASM on KERMSRV AT CUVMBA. Thanks a lot.
+
+While assembling a new KERMIT 4.09 for my good old CP/M 3
+computer I found a bug in the system independent part of
+the KERMIT source. The routine PAUSIT in the file
+CPSUTL.ASM doesn't end with a ret. As a result of this the
+program enters the routine GETFIL and falls trough it every
+time PAUSIT is executed: the disk drive is activated.
+This ends in an error when PAUSIT is executed after a
+wildcard operation.
+The bug is fixed by placing a ret instruction at the end of
+the PAUSIT routine.
+
+After creating a new CPSKER.HEX it appeared, that the file
+CPSKER.HEX on KERMSRV AT CUVMA used the files CPSPK1.ASM
+update 12 of 1-feb-88 and CPSPK2.ASM update 5 of 1-feb-88.
+The file CPSPK1.ASM on KERMSRV AT CUVMA is update 11 of
+28-jul-87, whereas CPSPK2.ASM is update 4 of 27-oct-87.
+Would you please be so kind to get the two files updated
+on KERMSRV ON CUVMA, so I can build an updated version of
+my KERMIT without the bug in CPSUTL.ASM.
+
+Thank you in advance!               Hans Petri
+
+WINFPET AT HDETUD1 on EARN
+/Vace
+------
+
+Date: Sun, 12 Mar 89 03:22:57 EST
+From: Mark W. Eichin <eichin@athena.mit.edu>
+Subject: Bug report, CP/M kermit (and other notes)
+Keywords: CP/M Kermit
+
+The latest kermit from ~ftp/kermit/a/cp[sx]*.asm has a minor (but
+visible) bug. In cpspk2.asm, line 341 is
+
+       mvi     a,'$'           ; dollar terminate string
+       call    prtstr
+
+(these are after the label gofi7g.)
+
+The problem is that the '$' has to be actually moved into the string
+to terminate it. Adding the line
+
+       stax    d
+
+between the above two solves the problem.
+
+The bug manifests itself when doing a "receive": as soon as the remote host
+sends the filename, it gets displayed on the local screen, followed by
+arbitrarily large amounts of garbage (whatever code followed the filename
+buffer up to the first '$', which for me tended to be about 4-5 lines of
+garbage...)
+
+On a related note: I have successfully ported kermit to TurboDOS (a CP/M-like
+operating system written by Software 2000) so that it uses the "T-functions",
+a set of standard extensions to CP/M, particularly a set of generic serial
+routines. I have only tested it on my personal system, a custom port of
+TurboDOS to the Radio Shack Model 4P, but it is likely to work on any TurboDOS
+system. Are you interested in adding this to your collection? Are there any
+stylistic constraints you require on submitted code? (I would like to see it
+included, if only because there have been "people working on" TurboDOS
+versions, according to your list, for at least 4 years now.)
+
+Also, I have patches to the Simtel20 PD2:<UNIX-C.CPM>XASM.SHAR[12], an 8080
+assembler which runs under UNIX, which add a LINK command, that enables it to
+assemble the entire CP/M Kermit release. I will be submitting them to the
+Simtel20 people, but I can send them to you as well if you are interested.
+
+Thanks for providing such a good *FREE* system!
+
+                               Mark Eichin
+                               <eichin@athena.mit.edu>
+
+
+------------------------------
+
+. From BPA
+. Postmark:30-Aug-89:09:32:15
+. To MAILER
+. Expires:29-Sep-89:09:31:49
+. Subject: bitnet%"fdccu@cuvma"
+Re:  Problems with CP/M Kermit Version 4.09
+
+Following is a list of problems and their solutions for CP/M Kermit
+Version 4.09.  Bear in mind that the latest version of CPSPK1.ASM I have is
+edit (4) and of CPSPK2.ASM is edit (11).
+
+Problem:  When the terminal is in "quiet" mode, initiation of file-transfers
+        causes lots of garbage to appear on the screen which is distracting
+        and which raises havoc with voice output devices.
+Diagnosis:  In the module CPXCOM.ASM, the routine "prtstr" has two flavors:
+        one for machines which cannot display control-characters via BDOS
+        function 9 and one which can display such characters via function 9.
+        In this latter case, only register pair BC is saved around the BDOS
+        call.  This is insufficient as BDOS also clobbers register pairs
+        DE and HL during the call.  In "quiet" mode, at least one of these
+        pairs is expected to remain constant.
+Solution:  Save register pairs DE and HL around the function 9 BDOS call.
+
+Problem:  When GETting a file, the initialization routine "init" is executed
+        twice.  This doesn't harm anything and may not be noticeeable in
+        print but is most annoying when using voice output as "init" types
+        out the Kermit version and screen initialization strings and thus
+        one hears them twice.
+Solution:  In the module CPSPK1.ASM, move the label "read0a" down one line
+        so that the common code for the "receive" and "get" commands starts
+        just *after* the call to "init" is made in "receive" mode.
+
+Problem:  With "auto-receive" set to "off", after a RECEIVE has completed,
+        Kermit waits for Console input; then looks for more data to receive
+        when there is none.
+Diagnosis:  In the module CPSPK1.ASM, when the status of "auto-receive" is
+        checked, the wrong label is branched to if "auto-receive" is OFF.
+Solution:  Change the instruction "jz read5c" to "jz read5b".
+
+Problem:  Files whose filenames are less then 8 characters in length have
+        ASCII zeros ("0") appended to them.
+Diagnosis:  In the module CPSPK2.ASM, after label "gofi7b", where the status
+        of "file-warning" is checked, the code for the appending of "&"
+        characters to filenames if the file already exists on disk has been
+        commented out and new code putting numeric suffixes on filenames
+        in this case has been substituted.  In the process, the code for
+        checking for a file's existence has been accidentally commented out.
+        Thus, if "file-warning" is "on", *every* file is assumed to have
+        a duplicate and a numeric suffix is added to each filename.  In
+        addition, no warning of this is given on-screen.
+Solution:  (1) Uncomment the code which checks for the existence of each file.
+        (2) Uncomment the code which prints the file-warning error message
+        and put a "lxi d,fnbuf" instruction between the "stax d" shown in
+        CPKERM.BWR and the call to "prtstr" so that routine can print the
+        filename of any file whose existence has been detected.
+
+Problem:  In the files CPXSY2.ASM and CPXSYS.ASM, various conditionals are
+        ignored.
+Diagnosis:  In many places, a semicolon is followed by a form-feed which is
+        immediately followed by an "IF" conditional.  My copy of LASM in-
+        terprets the "<FF>IF" as a comment.
+Solution:  Make the "<FF>IF" into "<FF>;<CR>IF".
+
+With these changes, Kermit-80 performs like a champ.
+Following are file comparisons showing the changes noted above.
+
+************
+File DISK$USER:[OGRFJMF.KERMIT.CPM]CPXCOM.ASM;1
+  418           push    b
+******
+File DISK$USER:[OGRFJMF.KERMIT.CPM.HP125]CPXCOM.ASM;1
+  418           PUSH    H
+  419           PUSH    D
+  420           push    b
+************
+************
+File DISK$USER:[OGRFJMF.KERMIT.CPM]CPXCOM.ASM;1
+  422           ret             ; all done for good machines
+******
+File DISK$USER:[OGRFJMF.KERMIT.CPM.HP125]CPXCOM.ASM;1
+  424           POP     D
+  425           POP     H
+  426           ret             ; all done for good machines
+************
+
+Number of difference sections found: 2
+Number of difference records found: 4
+
+DIFFERENCES /IGNORE=()/MERGED=1/OUTPUT=DISK$USER:[OGRFJMF.KERMIT.CPM.HP125]CPXCO
+M.DIF;1-
+    DISK$USER:[OGRFJMF.KERMIT.CPM]CPXCOM.ASM;1-
+    DISK$USER:[OGRFJMF.KERMIT.CPM.HP125]CPXCOM.ASM;1
+
+File 1) DSKE:CPSPK1.ASM[10,50,KERMIT,CPM]       created: 1940 26-Aug-89
+File 2) DSKE:CPSPK1.ASM[10,50,KERMIT,CPM,HP125] created: 2247 27-Aug-89
+
+1)1     read0a: call    init            ;clear line, initialise buffers
+1)              lxi     d,remnam        ;[gnn] save local name here
+1)              mvi     a,cmtxt         ;[gnn]
+****
+2)1             call    init            ;clear line, initialise buffers
+2)      read0a: lxi     d,remnam        ;[gnn] save local name here
+2)              mvi     a,cmtxt         ;[gnn]
+**************
+1)2             jz      read5c          ; no autoreceives, so drop out
+1)              lxi     d,anymes        ; load up Press any key to continue
+****
+2)2             jz      read5b          ; no autoreceives, so drop out
+2)              lxi     d,anymes        ; load up Press any key to continue
+**************
+
+File 1) DSKE:CPSPK2.ASM[10,50,KERMIT,CPM]       created: 0829 28-Aug-89
+File 2) DSKE:CPSPK2.ASM[10,50,KERMIT,CPM,HP125] created: 2259 27-Aug-89
+
+1)1     ;       mvi     c,openf         ;See if the file exists.
+1)      ;       lxi     d,fcb
+1)      ;       call    bdos
+1)      ;       cpi     0FFH            ;Does it exist?
+1)      ;       jz      gofil9          ;If not create it.
+1)      ;       lxi     d,infms5
+1)      ;       call    error3
+1)      ;       lda     temp2           ;Get the number of chars in the file nam
+e.
+****
+2)1             mvi     c,openf         ;See if the file exists.
+2)              lxi     d,fcb
+2)              call    bdos
+2)              cpi     0FFH            ;Does it exist?
+2)              jz      gofil9          ;If not create it.
+2)              lxi     d,infms5
+2)              call    error3
+2)      ;       lda     temp2           ;Get the number of chars in the file nam
+e.
+**************
+1)1             call    prtstr          ; write string to console
+****
+2)1             lxi     d,fnbuf         ;[MF]Point to string
+2)              call    prtstr          ; write string to console
+**************
+
+
+
+
+
+
+
+
+
+
+I may be reached on BITNET by E-mail to mailer@uwalocke with the subject-line
+containing the phrase <dec10%"bpa">.
+-- Mike Freeman; Bonneville Power Administration; Vancouver, Wa;
+Telephone (206)690-2307 --
+
+------------------------------
+
+Date:     Thu, 31 Aug 89 13:07 PST
+From:     <MAILER@UWALOCKE.BITNET>
+Subject:  Re:  Inconsistency in CP/M Kermit Version 4.09
+
+Problem:  Comments in the source-files indicate that the routine which
+        processes the "Set Port" command, "prtset" in CPSCOM.ASM, returns
+        the port value in the register pair DE for the system-dependent
+        routine to process.  In fact, the value is returned in the HL
+        register pair.
+Solution:  Either (1) put a "xchg" instruction after the "shld port"
+        instruction in "prtset" and modify all port-setting routines which
+        expect the port parameter in HL, e.g., that for those systems using
+        iobyte redirection, to get the value from DE (this would be, I
+        suppose, philosophically correct since this would correspond to
+        the way the baud-rate-setting routine handles things) or
+        (2) change the comments in CPSDAT.ASM and CPXLNK.ASM to show the
+        return value from "prtset" in HL and modify the "sysprt" routines
+        which expect the port value in DE to get it from HL.  I chose this
+        approach as it appeared that this would involve less code changes
+        (the only system I saw getting port values from DE was the Lobo).
+        Below are FILCOMs of the appropriate files showing these changes.
+
+File 1) DSKE:CPSDAT.ASM[10,50,KERMIT,CPM]       created: 1925 26-Aug-89
+File 2) DSKE:CPSDAT.ASM[10,50]                  created: 1202 31-Aug-89
+
+1)4                             ; called with value from table in DE
+1)      sysscr: jmp     $-$     ; screen setup for file transfer
+****
+2)4                             ; called with value from table in HL
+2)      sysscr: jmp     $-$     ; screen setup for file transfer
+**************
+
+File 1) DSKE:CPXLNK.ASM[10,50,KERMIT,CPM]       created: 1826 26-Aug-89
+File 2) DSKE:CPXLNK.ASM[10,50]                  created: 1157 31-Aug-89
+
+1)1                             ; called with value from table in DE
+1)              jmp     sysscr  ; screen setup for file transfer
+****
+2)1                             ; called with value from table in HL
+2)              jmp     sysscr  ; screen setup for file transfer
+**************
+
+File 1) DSKE:CPXSY2.ASM[10,50,KERMIT,CPM]       created: 0743 28-Aug-89
+File 2) DSKE:CPXSY2.ASM[10,50]                  created: 1210 31-Aug-89
+
+1)4             mov     a,e             ;[hh] get the data port value and store
+at
+1)              sta     outmd3+1        ;[hh] the two places we use...
+****
+2)4             mov     a,l             ;[hh] get the data port value and store
+at
+2)              sta     outmd3+1        ;[hh] the two places we use...
+**************
+1)4             mov     a,d             ;[hh] now get the baud rate port value
+1)              sta     getbd+1         ;[hh] store it in the two places we use.
+..
+****
+2)4             mov     a,h             ;[hh] now get the baud rate port value
+2)              sta     getbd+1         ;[hh] store it in the two places we use.
+..
+**************
+
+E-mail replies may be sent to me via Bitnet at mailer@uwalocke.
+Please place on the subject line the phrase <dec10%"bpa"> (less the angle-
+brackets).
+-- Mike Freeman (routing MORF); Bonneville Power Administration; P.O. Box
+491; Vancouver, Wa 98666; Telephone (206)690-2307 --
+
+------------------------------
+
+Date: Sat, 25 Nov 89 08:16:41 pst
+From: holmes@well.sf.ca.us (Tim Holmes)
+To: jrd@watsun.cc.columbia.edu
+Subject: Re: Kermit for Epson
+
+The Epson PX-8, also known as the Geneva, is a CP/M 2.2 machine.  It is
+a portable.  It is listed on the list of Kermit versions by machine as 
+Epson Px-8; program version 4.09.  This version I have never been able
+to do anything but get the machine to freeze up.  An earlier version,
+4.05, basically works, but with some problems, such as handshaking
+and flow control (I think).  The PX-4, better known as the HX-40, is
+a similar computer with an even smaller screen.
+
+The PX-8 version comes on the "A" tape.  By the way, I cannot get the
+"Generic"  kermit versions to work on the HX-40, whereas they basically
+work on the PX-8.
+
+Thanks again.
+
+------------------------------
+
+Date:     Thu,  1 Mar 90 16:48 PST
+From:     <MAILER@UWALOCKE>
+Subject:  dec10%"BPA" originated mail follows:-
+To:       fdccu@cuvma
+Original_To:  JNET%"fdccu@cuvma"
+
+. From BPA
+. Postmark:26-Feb-90:09:36:20
+. To MAILER
+. Expires:28-Mar-90:09:35:00
+. Subject: bitnet%"fdccu@cuvma"
+Re:  Problem with CP/M-80 Kermit
+
+     I have come up with a better, more general solution to the problem
+involving Kermit's interpretation of characters at the beggining of the CP/M
+command-line than the one I sent you a few days ago.  This more general
+solution and the description of the problem/diagnosis appear below:
+
+                                    PROBLEM
+
+B>A:KERMIT ;SET FI B;SET BL 3;SET TER Q
+Kermit-80 v4.09 configured for HP-125 Series 100
+
+For help, type ? at any point in a command
+Kermit-80   0B:>
+?Ambiguous
+Kermit-80   0B:>SET FI B
+Kermit-80   0B:>SET BL 3
+Kermit-80   0B:>SET TER Q
+B>
+
+                                   DIAGNOSIS
+
+
+     CP/M begins the buffer containing the tail to the command-line with
+the count of characters in the buffer, followed by the characters in the
+command- tail, beginning with the space(s) immediately following the
+transient program name (in this case, Kermit).  Kermit does not ignore
+leading spaces when reading command input from the CP/M command-line.
+Kermit therefore interprets the leading space(s) as part of the first
+command to be executed, leading to the "?Ambiguous" message.
+
+
+                                     SOLUTION
+
+
+        Rewrite Kermit so that leading spaces in input from the CP/M
+command-line are ignored.  This is done by adding code just prior to
+label CMINB1 in the module CPSCMD.ASM and adding a label a few lines
+following the label CMINB1 in the same module.  This gives, as a
+side-effect, the advantage that a leading semicolon is not required
+before the commands Kermit is to execute from the command-line, so that
+a command-line like:
+A>KERMIT SET FILE-MODE ASCII;SET TERMINAL QUIET;SET NO-EXIT
+executes without errors.  A Vax DIFFERENCES output showing the changes
+in CPSCMD.ASM follows:
+
+
+************
+File DISK$USER:[OGRFJMF]CPSCMD.ASM;1
+  981   cminb1: lxi     h,cmccnt        ;Increment the char count.
+******
+File DISK$USER:[OGRFJMF]CPSCMD.ASM;2
+  981           lda     takflg          ;[JMF]See if chars from file or command-
+line
+  982           ora     a               ;[JMF]...
+  983           jz      cminb1          ;[JMF]No
+  984           ani     1               ;[JMF]Yes, char from command-line?
+  985           jnz     cminb1          ;[JMF]No
+  986   cminb0: mvi     c,conin         ;[JMF]Yes, get a character
+  987           call    bdos            ;[JMF]...
+  988           cpi     40o             ;[JMF]If leading characters are spaces
+  989           jz      cminb0          ;[JMF]Ignore them, else
+  990           lxi     h,cmccnt        ;Increment the char count.
+  991           inr     m
+  992           jmp     cmin1a          ;[JMF]and proceed with command buffer
+  993   cminb1: lxi     h,cmccnt        ;Increment the char count.
+************
+************
+File DISK$USER:[OGRFJMF]CPSCMD.ASM;1
+  985           lhld    cmcptr          ;Get the pointer into the buffer.
+  986           mov     m,a             ;Put it in the buffer.
+******
+File DISK$USER:[OGRFJMF]CPSCMD.ASM;2
+  997   cmin1a: lhld    cmcptr          ;Get the pointer into the buffer.
+  998           mov     m,a             ;Put it in the buffer.
+************
+
+Number of difference sections found: 2
+Number of difference records found: 13
+
+DIFFERENCES /IGNORE=()/MERGED=1/OUTPUT=DISK$USER:[OGRFJMF]CPSCMD.DIF;1-
+    DISK$USER:[OGRFJMF]CPSCMD.ASM;1-
+    DISK$USER:[OGRFJMF]CPSCMD.ASM;2
+
+
+        I can be addressed via E-mail on Bitnet at address
+MAILER@UWALOCKE. Place the following as the subject of the message:
+<dec10%"bpa"> (less the angle-brackets). Thanks.
+Michael Freeman (Routing MORF)
+Bonneville Power Administration
+P.O. Box 491
+Vancouver, WA 98666
+Telephone (206)690-2307
+
+------------------------------
+
+Date: Mon, 14 May 90 10:26:54 EDT
+From: rochester!ames!claris!voder!nsc!thoreau.nsc.com!rtodd@columbia.edu
+  (Ron Todd)
+To: fdc@watsun.cc.columbia.edu
+Subject: My kermit problem( Kermit-80 to Kermit-32)
+
+Frank, 
+
+  I finally got my Kermit-80 (v4.09) on the Kaypro II to work with our
+Kermit-32 (v3.1.066) (the problem had to do with the protocol timing out
+during disk sector writes on the Kaypro).  The fix is some where in the
+combination of sets I am using, I tried your suggestion of turning off the
+timeouts on the mainframe.  The significant sets I am using are:
+
+Kermit-80
+  set flow on
+  
+Kermit-32
+  set server_time 0
+  set send time 0
+
+VMS
+  set term/readsync/ttsync
+
+DEC-Server
+  set session pasthru
+
+  So far I have only tried ascii file transfer but will be testing binary 
+soon, I have a feeling that that should work also.  I am mostly using the 
+GET command with Kermit-32 running in server so I may not need to do the 
+"set send time".  I am sure I need to use the "set session pasthru" on the 
+server and probably atleast one of the "sync" options on the "set term" 
+of the VMS side.  
+
+  Thanks for your help, I'll e-mail the final minimum set to you and also 
+post it to the net as a followup to help anyone else who may be running 
+into the same or similar problems.  
+
+Regards,
+  Ron Todd,   K3FR
+
+------------------------------
+
+Subject: Kermit-80 4.09 ported to new system, bug report
+From: Russell Lang <rjl@monu1.cc.monash.edu.au>
+Date: Tue, 19 Jun 90 11:04:47 +1000
+Sender: eln272v@monu1.cc.monash.edu.au
+
+Frank,
+   I have ported Kermit-80 4.09 to an Australian CP/M computer, 
+   the Microbee.  I have created a new system dependent file 
+   CPXBEE.ASM for this computer.
+   I sent some mail to Bertil Schou, but he informs me that he is 
+   no longer maintaining CP/M kermit.
+   Could you please tell me who is currently working on CP/M Kermit?
+
+
+   During the testing of kermit-80 on the Microbee, I found a bug
+   in the system independent part of kermit.
+
+Bug report for Kermit-80 4.09.
+
+Problem:   When receiving a file with WARNING ON, kermit-80 will avoid 
+   overwriting an existing file by creating a unique file name.  
+   This unique file will have the attributes of the file being avoided.  
+   If the created file is opened with Read-Only attribute, kermit-80 is 
+   unable to write to the file, and crashes with the message:
+   BDOS Err on A: File R/O
+
+Diagnosis:  Kermit checks for the existence of a file by attempting
+   to open it.  If the file exists, its directory entry is copied
+   into the FCB.  Kermit then modifies the file name in the FCB
+   in an attempt to find a unique name.  The name in the FCB has
+   the attributes of the previously existing file, so when kermit
+   eventually finds a unique name, it creates a file with the 
+   attributes of the most recently opened file! 
+
+Solution:
+   Clear bit 7 (attribute bit) of all file name and type characters
+   before opening/creating file.
+   A Unix context diff for CPSPK2.ASM (4)  27-Oct-87  is at the
+   end of this mail.
+
+
+-- 
+Russell Lang    Email: rjl@monu1.cc.monash.edu.au    Phone: (03) 565 3460
+Department of Electrical and Computer Systems Engineering
+Monash University, Australia
+
+diff -c cpspk2.asm cpxpk2.asm.new
+*** cpspk2.asm Tue Jun 19 10:48:54 1990
+--- cpspk2.asm.new     Tue Jun 19 10:52:30 1990
+***************
+*** 299,305
+  ;
+  ; Part 2) open the file (if success, then it exists)
+  
+! gofi7d:      lxi     d,fcb
+       mvi     c,openf
+       call    BDOS
+       inr     a               ; if 0ffh returned, error (ie does not exist)
+
+--- 299,315 -----
+  ;
+  ; Part 2) open the file (if success, then it exists)
+  
+! gofi7d:
+! ;zero the attribute bits.  [rjl@monu1.cc.monash.edu.au]
+!      lxi     h,fcb+1         ;[rjl]
+!      mvi     c,11            ;[rjl]
+! gofi7z:      mov     a,m             ;[rjl]
+!      ani     07fh            ;[rjl]
+!      mov     m,a             ;[rjl]
+!      inx     h               ;[rjl]
+!      dcr     c               ;[rjl]
+!      jnz     gofi7z          ;[rjl]
+!      lxi     d,fcb
+       mvi     c,openf
+       call    BDOS
+       inr     a               ; if 0ffh returned, error (ie does not exist)
+
+------------------------------
diff --git a/cpkerm.mss b/cpkerm.mss
new file mode 100644 (file)
index 0000000..2318208
--- /dev/null
@@ -0,0 +1,2616 @@
+@Part(CPKERM,root="kuser")
+@string(-cpmversion="@q<4.11>")
+@Chapter<CP/M-80 KERMIT>
+@index<CP/M-80 Kermit>
+
+@case(device,file="********@*
+This document is formatted as an ordinary, plain text ASCII disk file.
+Typeset copies are available in the Kermit User Guide from Columbia
+University.  Changes should be made to CPKERM.MSS.@*********")
+
+@Begin<Description,Leftmargin +12,Indent -12,spread 1>
+@i(Program:)@\Mike Freeman, Bonneville Power Administration, Vancouver, WA,
+USA, with contributions from many others.
+
+@i(Language:)@\8080 Assembler, LASM, M80, or MAC80
+
+@i(Version:)@\@value(-cpmversion)
+
+@i(Date:)@\April 1, 1991
+
+@i(Documentation:)@ @ Christine Gianone, Columbia University, with
+contributions from many others.
+
+@end<Description>
+@label<-k80>
+
+@i<KERMIT-80 Capabilities At A Glance:>
+@begin<format,leftmargin +2>
+@tabclear()@tabset(3.5inches,4.0inches)
+Local operation:@\Yes
+Remote operation:@\Partial, Auto-receive only
+Login scipts:@\Yes, limited
+Transfer text files:@\Yes
+Transfer binary files:@\Yes
+Wildcard send:@\Yes
+File transfer interruption:@\Yes
+Filename collision avoidance:@\Yes
+Can time out:@\Yes
+8th-bit prefixing:@\Yes
+Repeat count prefixing:@\No
+Alternate block checks:@\Yes
+Terminal emulation:@\Yes, VT52 and others
+Communication settings:@\Yes
+Support for dial-out modems:@\No
+Transmit BREAK:@\Yes; most versions
+IBM communication:@\Yes
+Transaction logging:@\No
+Debug logging:@\No
+Session logging:@\Yes
+Raw file transmit:@\Yes
+Act as server:@\No
+Talk to server:@\Yes
+Advanced commands for servers:@\Yes
+Command/init files:@\Yes
+Command macros:@\No
+Local file management:@\Yes
+Handle file attributes:@\No
+Long packets:@\No
+International Character Sets:@\No
+Sliding Windows:@\No
+Printer control:@\Yes, limited
+@end<format>
+
+@Section<Credits>
+
+CP/M Kermit is the first of all the Kermit programs.  It was originally
+written by Bill Catchings of Columbia University in 1981.  Over the years,
+contributions have been added by many people, including
+Charles Carvalho (ACC),
+Bernie Eiben (DEC), Nick Bush (Stevens Institute of Technology),
+John Bray (University of Tennessee), Bruce Tanner (Cerritos College),
+Greg Small (University of California at Berkeley),
+Kimmo Laaksonen (Helskini University of Technology),
+Brian Robertson (Aberdeen University), A.J. Cole (Leeds University),
+John Shearwood (Birmingham University),
+Tony Addyman (Salford University), Godfrey Nix and Martin Carter
+(Nottingham University), Ian Young (Edinburgh University), Chris Miles
+(Manchester University), Richard Russell, Dave Roberts,
+and many, many others.
+
+Version 4.11 is the work of Mike Freeman of the Bonneville Power
+Administration in Vancouver, WA, USA, with assistance from Russell Lang of
+Monash University in Australia, Jay S Rouman of Mt Pleasant MI, and others.
+
+@section<What's New>
+
+Features added since version 4.09 include:
+@begin<itemize>
+SET COLLISION {BACKUP/DISCARD/OVERWRITE/RENAME}
+
+SET INCOMPLETE-FILES {DISCARD/KEEP}
+
+Many REMOTE commands, including some REMOTE SET commands
+
+RENAME command to rename CP/M files from within Kermit-80
+
+SET RECEIVE/SEND PACKET-LENGTH nn (nn <= 94)
+
+SET AUTORECEIVE ON now implies that Kermit-80 ALWAYS tries to
+receive more files when a RECEIVE transaction has completed.  The
+user can cancel with ^C.
+
+QUIT is now a synonym for EXIT.
+
+STAY is now a synonym for SET NO-EXIT.
+
+CONNECT, RECEIVE and SEND may be abbreviated to C, R and S,
+respectively.
+
+Cancellation of TAKE, TYPE, and PRINT commands from the keyboard.
+
+Many bug fixes.
+
+Kermit-80 Version 4.11 now supports the Microbee family of
+computers (56K, 64K, 128K and 256K) manufactured by
+Microbee Systems, Ltd, of Australia.
+
+Kermit-80 now supports the Ampro Little Board system.
+@end<itemize>
+
+@section<Overview of Kermit Operation>
+
+Use the SET command to establish necessary communication parameters like
+SPEED and PARITY.  Use the CONNECT to establish a terminal connection to
+the remote computer.  If you are dialing out with a modem, type the necessary
+dialing commands to the modem first.  The dialing process can be automated
+to some extent using a TAKE command file containing INPUT, OUTPUT, and PAUSE
+commands.  Then log in to the remote computer or service and conduct a session.
+
+To transfer a text file, start the Kermit program on the remote computer and
+tell it to SEND the desired file (if uploading) or to RECEIVE (if
+downloading).  "Escape back" to CP/M Kermit, usually by typing Ctrl-] (hold
+down the Control key and press the right bracket key) and then type the letter
+C.  At the CP/M Kermit prompt type RECEIVE (if you gave a SEND command to the
+remote Kermit) or SEND @i<filename> (if you gave a receive command to the
+remote Kermit).
+
+To transfer a binary file, give the command SET FILE TYPE BINARY to the remote
+Kermit and SET FILE-MODE BINARY to CP/M Kermit before issuing any SEND or
+RECEIVE commands.
+
+Multiple files of the same type (text or binary) can be transferred in a
+single operation using "wildcard notation" (including special characters like
+asterisk in the filename).
+
+When file transfer is complete, CONNECT back to the remote computer,
+use the EXIT command to exit from the remote Kermit program, finish your work
+on the remote computer, log out from it, escape back to CP/M Kermit again,
+and EXIT from CP/M Kermit.
+
+The remote Kermit may also be put into "server mode" to simplify these
+operations.  Give the SERVER command to the remote Kermit, escape back to CP/M
+Kermit, and then issue SEND commands to send files (upload), GET @i<filename>
+commands to receive (download) files, REMOTE commands to request various other
+services (like directory listings) from the remote Kermit.  When you are done,
+give a BYE command to terminate your remote session, or a FINISH command to
+tell the remote Kermit to return to its prompt so you can CONNECT back and
+conduct further business.
+
+That's all there is to it.
+
+@Section<Summary of CP/M>
+
+There are essentially two versions of CP/M - Versions 2.2 
+and 3.0 (sometimes also called CP/M PLUS.)  
+
+CP/M-80 Version 2@q<.>2 is run in 
+a single 64 Kbyte "page", usually the largest amount of memory on
+Z80 or 8080 systems.  The BIOS (Basic input/output system),
+BDOS (Basic Disk Operating System) and CCP (Command console processor)
+all share memory with any transient program the user may wish to run.
+Some basic commands are
+available through the CCP, like DIR, ERA etc,while others are loaded 
+from disk into the transient program area and run as a program,
+like PIP or STAT.
+
+CP/M Version 3@q<.>0 (or CP/M PLUS) effectively removes the requirement 
+of having the CCP and BDOS along with a chunk of the BIOS code being
+resident in the single 64k byte page of memory.  This allows even more
+space for programs in the TPA, but still a little less than the maximum
+of 64k.  It is substantially different from CP/M version 2@q<.>2, with
+lots of added features.  Kermit-80 uses very few additional version
+3@q<.>0 features, and only where absolutely necessary.
+
+CP/M file specifications are of
+the form @q(DEV:XXXXXXXX.YYY), where
+@begin<description>
+ @q(DEV:)@\is a @i<device name>,
+normally the A:@ or B:@ floppy.  If omitted, the device name defaults
+to your connected diskette.
+
+@q(XXXXXXXX)@\is a @i<filename> of up to 8 characters.
+
+@q(YYY)@\is the @i<file type>, up to 3 characters.
+ @end<description>
+ File names and file types may contain letters, digits, and some
+special characters, including dash, dollar sign, and underscore, but
+no imbedded spaces.  Upper and lower case letters are equivalent.
+
+ "Wildcard" file-@|group specifications are permitted in file names
+and file types (but not device names) within certain contexts; a "@q(*)"
+matches a whole field, a "@q(?)"  matches a single character, including
+space.  Examples: "@q(*.F??)" specifies all files whose @i<types> start
+with F and are 1, 2, or 3 characters long; "@q(F?.*)" specifies all
+files whose names start with F and are no more than two characters
+long (before the trailing spaces).
+
+The five CP/M commands are:
+ @Begin<Description>
+DIR @i<file>@\Lists the the names of the specified files.  The
+default file specification is "*.*".  Example: @w<"@q(DIR B:*.FOR)">.
+
+ERA @i<file>@\Erases (deletes) the specified file(s); wildcards allowed.
+
+REN @i<new> @i<old>@\Changes the name of a file from @i<old> to 
+@i<new>, e.g.@*
+@w<"@q(REN NEW.FOR=OLD.FOR)">.
+
+SAVE@\Saves the specified number of memory blocks into a file. 
+(Not on CP/M Plus systems)
+
+TYPE @i<file>@\Types the specified file on the screen, e.g.
+@w<"@q(TYPE FOO.TXT)">.
+ @End<Description>
+The most important programs are:
+ @Begin<Description>
+STAT@\Gives statistics on disk usage; sets and displays IOBYTE.  
+(Not on CP/M Plus systems)
+
+PIP@\@u<P>eripheral @u<I>nterchange @u<P>rogram.  Copies files.  In
+response to the "@q(*)" prompt, give a command of the form
+ @example<disk:outfile=disk:infile>
+ Wildcards ("@q(*)" for a whole field or "@q(?)"  for a letter) can be used.
+Examples: "@q(A:=B:*.*)" to copy a whole disk, "@q(A:=B:*.FOR)" to copy all
+the Fortran programs from disk B to disk A.  If the disk specification
+is omitted, your "connected" disk is assumed.  Command line arguments
+are also accepted, e.g. "@q(PIP A:=B:*.*)".
+
+@End<Description>
+
+There are equivalent commands for CP/M Version 3.0, but are not loaded into
+memory in the same way as for CP/M Version 2.2.
+For further information on CP/M, consult your microcomputer manual or
+a CP/M handbook.
+
+@Section<Kermit-80 Description>
+
+Since Kermit-80 runs on a standalone micro, it is always in control of the
+screen -- it is always in "@i<local>@index<Local> mode".  It includes a
+terminal emulator for establishing a connection to a remote computer or
+service, and during file transfer, it keeps the screen updated with the
+file name and the packet number, whether sending or receiving.
+
+@index<Timeout> Kermit-80 is capable of an imprecise or "fuzzy" timeout on an
+input request, and can break deadlocks automatically.  In most cases, this is
+not important, because the Kermit program on the other side is most likely
+able to handle the timeouts.  The timeouts done by Kermit-80 are fuzzy because
+they depend on the speed of the processor and other factors that can vary from
+system to system.
+
+If, despite the timeout capability, the transmission appears to be stuck (and
+you can tell that this has happened if the screen fails to change for a while)
+you can type carriage return to have the micro do what it would have done on a
+@Index[Timeout] timeout, namely NAK@Index[NAK] the expected packet to
+cause theforeign host to send it again (or, if the micro is sending, to 
+retransmit the last packet).  Micro/@|micro or micro/@|IBM-@|mainframe 
+transfers could require this kind of manual intervention.
+
+File transfers may be interrupted in several ways.
+@begin<description>
+@Index[Control-C]
+Control-C@\This will return you to Kermit-80 command level immediately, so that
+you can connect back to the remote system, or take any other desired action.
+
+@Index[Control-X]
+Control-X@\When sending a file, this will terminate the sending of the current
+file with a signal to the KERMIT on the other side to discard what it got so
+far.  If there are more files to be sent, KERMIT-80 will go on to the next one.
+When receiving a file, KERMIT-80 will send a signal to the remote KERMIT to
+stop sending this file.  If the remote KERMIT understands this signal (not all
+implementations of KERMIT do), it will comply, otherwise the file will keep
+coming.  In any case, the remote KERMIT will go on to the next file in the
+group, if any.
+
+@Index[Control-Z]
+Control-Z@\Like Control-X, except if a file group is being transmitted, this
+will stop the transmission of the entire group.  If only a single file is being
+transmitted, it works exactly like Control-X.
+
+@Index[Carriage Return]
+@Index[CR]
+Carriage Return@\If you type a carriage return Kermit-80 will resend the
+current packet.  You may do this repeatedly, up to the packet retry limit
+(somewhere between 5 and 16 times) for a particular packet.
+@end<description>
+
+@heading<Kermit-80 Commands>
+
+Kermit-80 is an interactive program.  It issues a prompt, you type a command.
+The process repeats until you give the EXIT command to leave the program.
+
+Commands consist of keywords, filenames, and numbers.  Keywords may be
+abbreviated to minumum unique length.  "?" may be typed to request a menu of
+the available options for the current field at any point in a command.  ESC
+may be typed at any point in a command to fill out the current keyword or
+filename; if sufficient characters have not been typed to identify the current
+field uniquely, Kermit-80 will sound a beep and allow you to continue from
+that point.  Here are Kermit-80's commands:
+@begin<description,leftmargin +8,indent -8>
+@Index[Break]
+BREAK@\Send a BREAK condition to the remote computer.  This is only possible
+if your system is capable of sending breaks.  It is intended to be used with
+PAUSE, OUTPUT, etc and the TAKE command to do wierd and wonderful things, like
+automatic logging on to a remote host.
+
+@Index[Bye]
+BYE@\When talking to a remote Kermit Server, this command shuts down
+the server and logs it out, and also exits from Kermit-80 to CP/M command
+level.
+
+@Index[Virtual Terminal]@Index[Escape Character]@Index[Connect]
+CONNECT@\Establish a terminal connection to the computer, service, or device
+that is
+connected to the serial port, i.e.@ pass all typein to the serial port and
+display all input from the serial port on the screen.  Also, emulate a DEC VT52
+to allow cursor control, screen clearing, etc., if VT52-EMULATION is ON (see
+below), in which case you should also set your terminal type on the remote host
+to VT52.  (Some versions emulate other terminals.)  The CONNECT command may
+be abbreviated by the single letter C.
+
+@\Warning: VT52 emulation is only successful if your system or its
+attached terminal can do the same sort of functions as a genuine
+VT52.  Things to beware of are cursor addressing, clear to end of page
+and end of line, clear screen, home cursor, and clear-and-home
+functions.  The useability of VT52 emulation depends entirely on
+how many of the VT52 functions can be emulated by your micro or terminal.
+
+@\The escape character differs from micro to micro; when you issue
+the CONNECT command, the micro will print a message telling you how
+to get back.  The escape sequence is generally an uncommonly-@|used
+control character, like CTRL-backslash or CTRL-rightbracket, followed
+by a single letter "command":
+@begin<description,spread 0,leftmargin +4, indent -4>
+C@\Close Connection, return to @q(Kermit-80>) command level.
+
+S@\Display Status of connection, but maintain remote connection.
+
+@q<?>@\List available single-character commands.
+
+0@\(zero) Send a null (0) character.
+
+B@\Send a BREAK signal.  Most systems provide this function.
+
+D@\Drop the line.  Used on the Apple with modem.  Automatically
+closes the connection after dropping the line.  The TORCH system 
+acknowledges this command but does nothing.
+
+P@\Toggle printer on or off.  Allows you to copy whatever goes 
+to the screen to the printer.
+
+S@\Temporarily suspend logging to the log file.
+
+Q@\Restart logging to the log file
+
+@q<^]>@\(or whatever - a second copy of the escape character) Send the
+escape character itself to the remote host.
+ @end<description>
+
+@Index[Copy]
+@Index[File Copying]
+COPY @i<source> @i<destination>
+@\Copy a named file to another file, either on the same drive or another
+drive.
+
+@Index[Directory]
+DIRECTORY@\This provides a directory listing of the specified files.
+If no files are
+specified, all files on the default disk are listed.  File sizes, in K, are
+included.  You may interrupt the listing at any time by typing any character.
+The listing (even if interrupted) concludes with a display of the amount of
+free storage left on the disk.  You can inhibit the display of file sizes by
+SET DIRECTORY OFF.
+
+@Index[Erase]
+ERASE @i<filespec>@\This executes the CP/M ERA command on the specified 
+file(s).  The names of the files being erased are not displayed.
+
+@Index[Exit]
+EXIT@\Quit back to CP/M.  The return is made by a JMP 0 (Warmstart).  QUIT
+is a synonym for EXIT.
+
+@Index[FINISH]FINISH@\Like LOGOUT, but shuts down the remote server without
+logging it out.  Leaves you at Kermit-80 command level; subsequent CONNECT
+commands will put you back at host system command level.
+
+@Index[GET]GET @i<filespec> [@i<local_filespec>]
+@\When Kermit-80 is talking to a Kermit Server on
+the host, you should use the GET command to request the server to send
+files to you, for example:
+@example<get hlp:k*.hlp>
+You may specify a local filename if you want to save the remote file
+under a different filename.
+Limitation: If you request an alternate block check type using the SET BLOCK
+command, the GET command will not communicate it to the remote server.  If you
+want to have type 2 or 3 block checks done when getting files from the server,
+you have to issue the appropriate SET BLOCK command to the remote KERMIT before
+putting it in server mode.
+
+@Index[Help]HELP@\List all these commands, with a short description
+on what the commands do.  A question mark will do the same.  If you have
+already typed a command but do not know what the parameters are, type a
+space (to indicate the end of the command) and a question mark.  You will
+be informed of what Kermit can expect at that stage.
+
+@Index[Input]INPUT @i<seconds> @i<text>@\Setup a text line and time delay
+for your CP/M system to expect from the host, then wait up to the given number
+of seconds (approximately) for text to be sent to your CP/M-80 system.
+
+@Index[LOG]LOG @i<filespec>@\When CONNECTed to a foreign host as a terminal,
+log the terminal session to the specified diskette file.  This functionality
+depends to some extent on the remote host's ability to do
+@Index[XON/XOFF]XON/XOFF flow control, and does not guarantee a complete
+transcript (after all, that's what the KERMIT protocol is for).  The log file
+is closed when the connection is closed by typing the escape character followed
+by the single-@|character command "C".
+
+@Index[Append]
+@\It is possible to temporarily suspend logging during connect
+state.  Typing an escape sequence can turn file logging on
+(<escape-character> R for Resume) or off (<escape-character> Q for quiet).
+
+@\Re-entering connect state will re-open the previously opened 
+log file and append to that file.
+
+@Index[LOGOUT]LOGOUT@\Like BYE, but leaves you at Kermit-80 command level.
+
+@index<OUTPUT>OUTPUT @i<text>@\Send the text to the remote computer as if
+you had typed it.
+
+@Index[Pause]PAUSE @i<seconds>@\If this command is issued your CP/M
+system will wait a while before proceeding with another command.
+This is intended for use in TAKE commands, where you may want to pause
+for a while before proceeding with the rest of the TAKE file.  The
+actual delay is very variable between systems, and values should
+be determined on a trial and error basis.
+
+@Index[Print]PRINT@\Print a file to the console and printer.  Output to
+the printer is buffered by the Kermit-maintained printer buffer.
+This routine is identical to TYPE but characters are echoed to the printer
+as well as to the screen.  Suspending and canceling output is as
+described in TYPE.
+
+QUIT@\Synonym for EXIT.
+
+@Index[RECEIVE]@Index[File-Warning]
+RECEIVE @i<filespec>@\Receive file(s) from the remote
+Kermit, and save them under the names provided in the file headers
+supplied by the remote host.  If a local filespec is given, the file is
+saved under the given filename.  If the names aren't legal, use as 
+many legal characters from
+the name as possible (see the description of SET FILE-WARNING below).  If
+there's a conflict, and FILE-WARNING is ON, warn the user and try to build a
+unique name for the file by adding "@q<&>" characters to the name.  RECEIVE
+can be abbreviated to the single letter R.
+
+@index<REMOTE>REMOTE @i<command>@\Send a command to a remote Kermit server.
+The results are sent back to your CP/M screen.  When two arguments are
+required and specify less than two in the command, you will be prompted for
+the missing arguments.  REMOTE commands include:
+@begin<description,leftmargin +4, indent -4>
+REMOTE CD [directory]@\Ask the remote server to change its default directory.
+If no directory is specified, the server changes to its login directory.
+
+REMOTE COPY file1 file2@\Ask the remote server to copy file1 to file2.
+
+REMOTE RENAME file1 file2@\Ask the remote server to rename file1 to file2.
+
+REMOTE DELETE filespec@\Ask the remote server to delete the named file or
+files.
+
+REMOTE DIRECTORY [filespec]@\Ask the remote server to display a directory
+listing of the given files or, if the filespec is omitted, all the files in
+the current device or directory.
+
+REMOTE DISK-USAGE@\Ask the remote server to display information about its
+disk usage (such as free or used space).
+
+REMOTE ERASE filespec@\Same as REMOTE DELETE.
+
+REMOTE FINISH@\Same as FINISH.
+
+REMOTE HELP@\Ask the remote server to display a list of the commands it
+can respond to.
+
+REMOTE HOST command@\Ask the remote server to have its operating system
+execute the given command.
+
+REMOTE KERMIT command@\Ask the remote server to execute the given Kermit
+command, given in the server Kermit's command syntax.
+
+REMOTE LOGIN user password@\Log in to a remote Kermit server which has been
+set up to require a username and password.
+
+REMOTE MESSAGE text@\Send the text to the remote server for display on its
+screen (useful with MS-DOS Kermit servers).
+
+REMOTE SET parameter value@\Ask the remote server to set the given parameter
+to the given value, for example REMOTE SET FILE TYPE BINARY.  Type REMOTE SET
+? to see a list of the REMOTE SET options.
+
+REMOTE SPACE@\Same as REMOTE DISK-USAGE.
+
+REMOTE STATUS@\Ask the remote server to provide a status report.
+
+REMOTE TYPE file@\Ask the remote server to display the named file on
+the micro's screen.
+
+REMOTE WHO [user]@\Ask the remote server for a list of users who are logged
+in, or if a user is specified, for a report on the named user.
+@end<description>
+
+RENAME file1 file2@\Rename local CP/M file1 to file2.
+
+@Index[SEND]SEND @i<filespec>@\Send file(s) specified by @i<filespec> to
+the remote Kermit.  The @i<filespec> may contain CP/M wildcards.  SEND may
+be abbreviated to the single letter S.
+
+@Index[SET]SET @i<parameter> [@i<value>]@\Set the specified parameter to
+the specified value.  Possible parameter settings:
+
+@begin<description,leftmargin +8,indent -8>
+
+@Index[Autoreceive]AUTORECEIVE@\ON (or OFF).  Allows several files to be 
+received without having to type RECEIVE on the receiving machine.  The routine
+simply looks for activity on the serial line, and if so fudges a RECEIVE 
+command.  The packet sent by the sender will be lost.
+
+@Index[Block Check]BLOCK-CHECK-TYPE @i<option>
+@\The options are:
+@begin<description,spread 0,leftmargin +8,indent -8>
+1-CHARACTER-CHECKSUM@\Normal, default, standard 6-bit checksum.
+
+2-CHARACTER-CHECKSUM@\A 12-bit checksum encoded as two characters.
+
+3-CHARACTER-CRC-CCITT@\A 16-bit CCITT-format Cyclic Redundancy Check, encoded
+as 3 characters.
+
+@end<description>
+
+@Index[Buffer size]BUFFER-SIZE @i<value>@\This allows you to set a buffer 
+size during transfer of data.  On some systems it takes so long that the
+remote end times out while the local system is reading or writing to disk.
+The size is the number of 128 disk sectors (nominal) and can be from 1 
+(128 bytes) to 64 (8 kbytes).
+
+@\CP/M-80 filenames will still be mapped to uppercase characters.
+
+@index<COLLISION>COLLISION value@\What to do when a file arrives that has
+the same name as an existing file.  BACKUP means to rename the existing file.
+DISCARD means to discard and reject the incoming file.  OVERWRITE means to
+overwrite the existing file.  RENAME means to rename the existing file.
+
+@Index[Debug]DEBUG@\ON (or OFF).  Enables/disables displaying of packets 
+on the screen during file transfer.  Not performed if the QUIET option
+has been set for the terminal (SET TERMINAL QUIET)
+
+@Index[Default Disk]DEFAULT-DISK @i<drive letter>
+@\This allows you to set the default 
+disk as source and destination
+of file transfers.  In addition, issuing this command causes you to switch to
+the specified disk and log it in, write-@|enabled.
+The colon must be included in the disk name (A:).
+The selected disk appears
+in your KERMIT-80 prompt, for instance @example[Kermit-80 14A:>]
+
+@Index[Directory file size]DIRECTORY-FILE-SIZE ON (or OFF).
+
+@\By setting DIRECTORY-FILE-SIZE OFF you can get an abreviated listing of your
+disk drive.  File sizes are not calculated, and five files are shown on
+a line.  Setting this option ON will show file sizes of each file.
+
+@\Both options will list the free space remaining.
+
+@Index[Escape Character]ESCAPE@\Change the escape character for
+virtual terminal connections.  Kermit-80 will prompt you for the new
+escape character, which you enter literally.
+
+@Index[File-mode]FILE-MODE @i<option>
+@\Tells KERMIT-80 what kind of file it 
+is sending, so that KERMIT can correctly determine the end 
+of the file.  SET FILE BINARY means to send all the
+128-@|byte blocks (ie logical CP/M sectors) 
+of the file, including the last block in its entirety; SET
+FILE ASCII is used for text files, and transmission stops when the first
+Control-Z is encountered anywhere in the file (this is the CP/M convention for
+marking the end of a text file).
+
+@\SET FILE-MODE DEFAULT tells Kermit to attempt to determine the file type by
+examining the file being transmitted.  If a Control-Z appears before the
+last block of the file, it is assumed to be BINARY; if, when the first
+Control-Z is encountered, the remainder of the file contains only control-Z's,
+it is assumed to be a text file.  Unfortunately, not all programs fill the
+remainder of the last record of a text file with Control-Z's, 
+so this algorithm is not always successful.
+
+@\If binary transmission is used on a text file, or a compressed file 
+(eg a .DQC file) some extraneous characters (up to 127 of them) 
+may appear at the end of the file on the target system.  
+
+@\If ASCII transmission is used on a binary file, any 8th bits set will
+be stripped and a warning sent to the console.  When the first control-Z
+is encountered, the file is assumed to be at the end, even if it is not.
+
+@Index[Flow Control]FLOW-CONTROL ON (or OFF)
+@\Sets XON/XOFF flow control on or off.  If set ON the host is expected
+to respond to an XOFF or XON sent by Kermit-80.  If set off,
+no flow control is assumed and any XON/XOFF is ignored.
+
+@Index[IBM]IBM ON (or OFF)@\Allow the transfer of files to and from an IBM
+mainframe computer.  This makes Kermit-80 wait for the IBM turnaround character
+(XON), ignore parity on input, add appropriate parity to output, and use local
+echoing during CONNECT.  As distributed, KERMIT-80 uses MARK parity for IBM
+communication.  If you don't give this command, IBM mode is OFF.  Since IBM
+VM/CMS KERMIT does not have timeout capability, SET IBM ON also turns on the
+"fuzzy timer" automatically.
+
+@Index[Local-Echo]LOCAL-ECHO ON (or OFF)@\When you CONNECT to a remote
+host, you must set LOCAL-@|ECHO ON if the host is half duplex, OFF if
+full duplex.  OFF by default.
+
+@Index[Logging]LOGGING ON (or OFF)@\Cease or resume logging whenever 
+connect mode is entered.  This is really only applicable after a LOG 
+command is no longer required.
+
+@Index[No-exit]NO-EXIT@\This command is applicable only for Kermit initiated
+with a command tail.  For example, if Kermit was initiated by:
+
+@\KERMIT ;SEND HELLO;NO-EXIT
+
+@\Kermit would first seek out and execute the KERMIT.INI file (if present),
+then send file HELLO to a remote system.  Usually Kermit would exit back
+to CP/M, but NO-EXIT over-rides this.  STAY is a synonym for NO-EXIT.
+
+@\Note the leading semicolon.  This clears leading spaces from the first
+command.
+
+@Index[OUTPUT]OUTPUT @i<text-line>@\Send a line of text to the remote computer
+(or modem).  This simply copies the string to the correct line, and assumes all
+appropriate parameters have been set to be used, e.g. speed, parity etc.
+It is intended for use in TAKE command files.
+
+@Index[Parity]PARITY @i<option>
+@\Sets parity for outgoing characters to one of the
+following: NONE, SPACE, MARK, EVEN, or ODD.  On input, if parity is NONE, then
+the 8th bit is kept (as data), otherwise it is stripped and ignored.  The
+parity setting applies to both terminal connection and file transfer.
+If you set parity to anything other than none, KERMIT-80 will attempt to use
+@Index<Eighth-Bit Prefix>
+"8th bit prefixing" to transfer binary files.  If the other KERMIT is also
+capable of 8th bit prefixing, then binary files can be transferred
+successfully; if not, the 8th bit of each data byte will be lost (you will see
+a warning on your screen if this happens).
+
+@Index[Port]PORT @i<port name>
+@\Allows you to switch between different communication ports. 
+This command is not available on all systems.  
+Type @q<SET PORT ?> for a list of valid options for your system. (Note: 
+If your system does not support several ports, this command will 
+return a "Not implemented" error if you try to set a port.)
+
+@Index[PRINTER]PRINTER@\ON (or OFF)
+@\Turns copying of CONNECT session to printer on and off.  It is also 
+possible to toggle the printer on/off from the connect state, by
+typing <escape character> followed by P.
+
+@Index[Set Receive]RECEIVE @i<parameter> [@i<value>]
+@\Set a RECEIVE parameter.
+
+@begin<description, Spread 0, leftmargin +8,indent -8>
+
+@Index[Pad character]
+PAD-CHAR@\Set the PAD character to use while receiving files.
+Currently a dummy, as for SET SEND PAD-CHAR.
+
+@Index[Set padding]PADDING [value]
+@\Set the number of PAD characters to use while receiving files. 
+Same as SET SEND PADDING.
+
+@Index[Set Start of packet]
+START-OF-PACKET [value]
+@\Set the default start of Packet character for receiving files.  Apply the
+same rules and considerations as for SET SEND START-OF-PACKET.
+
+PACKET-LENGTH number@\Tell the other Kermit the longest packet length CP/M
+Kermit is willing to receive during file transfer.  The maximum length is 94,
+which is also the default length.
+
+@end<description>
+
+@Index[Set Send]SEND @i<parameter> [@i<value>]
+@\Set a SEND parameter.
+@begin<description, spread 0, leftmargin +8,indent -8>
+
+@Index[Pad character]
+PAD-CHAR@\Set the Pad character to be used while sending files.
+It is currently a dummy entry, and does not do anything.
+
+@Index[Set Padding]
+PADDING [value]
+@\Set the number of PAD-CHARS to be used while sending files.  This
+too does nothing.
+
+@Index[Set Start of packet]
+START-OF-PACKET@\Set the default start of packet character to
+another character than control-A.  This may be necessary on systems
+(including intervening networks) that trap control-A characters.  Choose
+a control character not otherwise used, ie not carriage return (13D, ODH),
+line feed (10D, OAN), tabs (09D, 09H), backspace (08H), and bell (07H)
+or any other used between you and your remote system.
+
+@end<description>
+
+@Index[Baud]SPEED @i<value>
+@\Change the baud rate of the communications port.  This
+command only works on some systems.  @i<value> is the numeric baud rate
+(300, 9600, etc.) desired.  Type SET SPEED followed by a question mark
+for a list of supported baud rates.
+On systems that do not support this command, you must set the port
+baud rate from CP/M or other setup mechanism outside of KERMIT-80.
+
+@Index[TacTrap]TACTRAP@\Set the TAC intercept character.  If you are attached
+to a TAC it will swallow the intercept character (commercial AT sign by
+default) so Kermit sends it twice.  With this command you can set the 
+intercept character (ie the one to send twice) to another character.
+
+@Index[VT52 Emulation]
+@Index[Terminal Emulation]
+@Index[External Terminal Emulation]
+TERMINAL @i<option>
+@\Select one of the following terminal characteristics:
+
+@begin<description,spread 0.5,leftmargin +8,indent -8>
+
+OFF@\sets emulation off, and its up to the attached terminal to 
+respond to escape sequences sent from the remote host system.
+
+DUMB@\Like off, but carriage return and line feed characters are
+the only control characters accepted.  All other control characters are
+simply ignored. (Really a "Glass TTY").
+
+EXTERNAL@\Emulation is provided for by a routine in the system dependent
+part of Kermit.  Attempting to set this option without having and 
+externally supplied routine will returna "Not Implemented" error.
+
+OFF@\All characters are passed directly to the terminal without any 
+interpretation by Kermit.
+
+VT52@\When connected as a terminal
+to a foreign host, the micro emulates a VT52.  
+VT52 emulation is set by default, except on micros
+that already have terminal functionality built in, such as the DEC VT180 and
+DECmate (these act as @index<VT100 Emulation>VT100-@|series terminals).  Some
+systems emulate other terminals, like the ADM3A; see table @ref<-cpmterms>.
+
+QUIET@\Do not display any file transfer information onto the console.
+This mode is useful if you console takes a long time to update the display.
+Only the file name is displayed.  DEBUGging information is not displayed
+even if selected.
+
+REGULAR@\Inverse of QUIET.  All packets etc displayed, as ususal.
+@end<description>
+
+@Index[TIMER]TIMER ON (or OFF)@\Enable or disable the "fuzzy timer".  The timer
+is off by default, because in the normal case KERMIT-80 is communicating with a
+mainframe KERMIT that has its own timer.  Mainframe KERMIT timers tend to be
+more precise or adaptable to changing conditions.  You should SET TIMER ON if
+you are communicating with a KERMIT that does not have a timer.  You should SET
+TIMER OFF if you are communicating over a network with long delays.
+
+@Index[USER]USER @i<user-number>
+@\Sets another user number to be active.
+Acceptable user numbers are 0 to 31, though it is recommended to use
+user numbers 0 to 15 only.
+This is really only useful for Winchester Systems with high disk capacities.
+
+@Index[Warning]WARNING ON (or OFF)@\Warn user of filename conflicts when
+receiving files from remote host, and attempt to generate a unique name by
+adding "@q<&>" characters to the given name.  ON by default, which is
+equivalent to SET COLLISION RENAME.
+@end<description>
+
+@Index[Show]SHOW@\Display all settable parameters.  You will get a page or so
+of the status af all parameters that can be set using the SET command.
+
+@Index[Status]STATUS@\The same function as Show.
+
+STAY@\Equivalent to SET NO-EXIT.
+
+@Index[Take]TAKE @i<filespec>@\Take characters and commands from the
+specified file as if they were entered from the keyboard.
+This is useful if you want to set up a batch job.  A command
+file can send, get, receive, set functions
+etc automatically.  A TAKE command can be interrupted with ^C.
+
+@\An automatic "TAKE KERMIT.INI" is executed from the default drive
+when Kermit-80 is loaded.  This can be used to set defaults of band rate,
+parity, filetype, default drive etc.
+
+@\If KERMIT.INI does not exist, control is given directly to the user.
+
+@Index[TRANSMIT]TRANSMIT @i<filespec> @i<turnaround>@\Send the specified file
+to the system on
+the other end of the connection as though it were being typed at the terminal,
+one line at a time.  Each line sent is terminated with a carriage return, and
+any line feeds are stripped from the file sent.  
+After each line has been sent Kermit waits for a character string
+from the host (eg a acrriage return).  If not specified, a carriage 
+return is assumed.  No KERMIT protocol is involved.
+An asterisk (star) is sent to the console for every line sent, to indicate
+how the transfer is progressing.
+This is useful for sending files to systems that don't have a
+KERMIT program.  During transmission, you may type one of these 
+single-@|character commands:
+@begin<description,spread 0,leftmargin +4, indent -4>
+Control-C@\Cease transmission, and drop into terminal emulation mode.
+
+CR@\(carriage return) Re-transmit the previous line.
+@end<description>
+
+@Index[Type]TYPE filespec@\Type a local CP/M file or files on the CP/M screen.
+A Control-C 
+will cancel the command and return to the Kermit prompt.  A Ctrl-X will cancel
+the current file and go on to the next one, if any.
+Typing any other character  
+while the file is being displayed will suspend 
+the output.  Another character will resume output.  
+
+@Index[VERSION]VERSION@\Show the name, edit number, and edit date of several of
+the modules that make up Kermit-80.
+
+@end<description>
+
+@section<Kermit-80 Flavors>
+@Comment(begin<description, leftmargin -8, indent +2>)
+
+Many of the systems supported use an external terminal, rather than a built-in
+console.  Kermit may be further customized for these systems by defining
+(at assembly time) the terminal type to be used.
+If the terminal type is unknown or does not match any of the existing
+terminal options, the generic "CRT" option may be selected.  In this case,
+Kermit cannot do fancy screen control during file transfer; it simply types the
+file names, packet numbers, and messages in sequence across and down the
+screen.  This works best if you can put your micro or terminal in "autowrap"
+mode; otherwise the packet numbers will pile up in the rightmost column; the
+filenames and messages will always appear on a new line, however.
+If no specific terminal has been selected, Kermit cannot do VT52 emulation;
+it can act
+as a "dumb terminal" (sometimes called a "glass TTY"), or else its own built in
+terminal firmware provides cursor control functions independent of the Kermit
+program.
+
+@subsection<Generic Kermit-80>
+@index<Generic Kermit-80>@index<8080> "Generic Kermit-80" is an implementation
+of Kermit that should run on any 8080-@|compatible CP/M 2.2 system with no
+modification
+at all, or perhaps only a minor one.  Unlike other Kermit-80 implementations,
+it contains no system-@|dependent manipulation of the serial port.
+All I/O is done with standard CP/M BIOS@index<BIOS> calls, and I/O redirection
+is done using the CP/M IOBYTE function, which, according to the Digital
+Research @i<CP/M Operating System Manual>, is an optional feature of any
+particular CP/M implementation.  If your system does not provide the IOBYTE
+function, Generic Kermit-80 will not work; furthermore, not all systems that
+implement IOBYTE do so in the same way.
+The SET PORT command may be used to select the devices to be used for input
+and output.   Table @ref<-cpmports> lists the options to the SET PORT command
+and their effects.
+
+@begin<table,use example,centered>
+@bar()
+@blankspace(1)
+@ux(SET PORT @i<xxx>)    @ux(input from)      @ux(output to)
+    CRT            CRT:            CRT:
+    PTR            PTR:            PTP:
+    TTY            TTY:            TTY:
+    UC1            UC1:            UC1:
+    UR1            UR1:            UP1:
+    UR2            UR2:            UP2:
+@caption<Kermit-80 SET PORT Options>
+@tag<-cpmports>
+@bar()
+@end<table>
+
+The default is SET PORT PTR.
+In all cases, the console (CON:) and list (LST:) devices used are those
+selected when Kermit is started.
+
+ The reason all Kermit-80 implementations aren't
+generic is that a good deal of speed is sacrificed by getting all services from
+the operating system.  While a specific implementation of Kermit-80 may be able
+to operate at 4800, 9600, or even 56 Kilo baud, 
+generic Kermit will fail to work
+on some systems at speeds in excess of 1200 baud.  In addition, many features
+of Kermit require more specific knowledge of the hardware involved.  Generic
+Kermit cannot send a BREAK signal, or change the baud rate, for example.
+
+@subsection<CP/M 3 Kermit>
+
+CP/M-3 Kermit (also known as CP/M-Plus Kermit) is a version of generic
+Kermit-80, and should run on most CP/M-3 (CP/M-Plus) systems.  It uses the
+auxilliary port (AUX:) to communicate to the remote Kermit.  The SET BAUD
+and SET PORT commands are not supported; nor can a BREAK be sent.
+Like generic Kermit-80, a terminal may be selected at assembly time.
+
+@subsection<System-Specific Versions>
+
+There are also many versions of Kermit-80 tailored to specific systems.
+Most of these operate uniformly, but some of them take advantage (or suffer
+limitations) of the specific system.  Here are some of the special features
+for particular systems:
+
+@begin<description, leftmargin +4, indent -4>
+@ux<Amstrad>: -- Two versions:
+
+@begin<description, leftmargin +4, indent -4>
+PCW 8256@\The PCW 8256/8512 with the serial inerafce attached.
+
+CPC 6128@\The 664 with add on memory and 6128 are both supported.  
+Both systems must run CP/M Plus, so the 664 will need an add on RAM pack 
+and CP/M upgrade.  A high speed transfer rate of 38k baud can be used 
+between Amstrad computers.
+@end<description>
+
+@ux<ACCESS>:@\Access Matrix computer using port J5.  Supports SET
+BAUD-RATE for rates of 300-9600 baud.
+
+@ux<Apple II> -- four variations:
+@begin<description,leftmargin +4,indent -4>
+APMMDM:@\Apple with Z80 Softcard and Micromodem II in slot 2
+Dialout capability provided in connect command; user is prompted for
+phone number if carrier is not present.  During connect mode,
+@q(^]D) drops carrier.  BYE command also causes carrier to be dropped.
+
+AP6551:@\Apple with Z80 Softcard, and one of several 6551-based
+communication cards; the slot number is a compile-time parameter
+(default is slot 2).  SET BAUD-RATE supported; speeds are 110-19200
+baud.
+
+APCPS:@\Apple with Z80 Softcard and CP Multi-Function Card.  The slot
+number is again a compile-time parameter.  SET BAUD-RATE is supported
+for baud rates from 50 baud to 19200 baud.
+
+AP6850:@\Apple II with Z80 Softcard and a 6850-based USART in slot 2-the
+slot being a compile-time parameter.  SET BAUD-RATE is not supported.
+@end<description>
+
+@ux<BBC>:@\Acorn Computers BBC Computer with Acorn Z80 second
+processor running CP/M-80.  Supports SET BAUD-RATE and can send breaks.
+
+@ux<BigBoard II>:@\Uses serial port A.  To use port B, change mnport, mnprts,
+and baudrt and reassemble.  Can generate BREAK.  SET SPEED supported;
+speeds are 300-38400 baud.
+
+@begin<multiple>
+@ux<Cifer>:@\Originally coded for Cifer 1886 using the VL: port set
+as TTYI: and TTYO: but works successfully on 18xx and 28xx
+series machines.  
+
+There are now two versions, each with two variations: Either running 
+CP/M Version 2.2 or 3.0, and either using the VL: or AUX: ports.  The VL:
+port version can only use seven bits of data, so parity prefixing is
+required for binary file transfers.  This restriction is removed by
+using the AUX: port.  For those interested, the problem is due to the 
+interprocessor link between the video and CPU (!) boards.  The VL: port
+is on the video board, and the AUX: port on the CPU board, 
+and the inter processor link can only transfer seven bits of data.
+
+Supports SET SPEED, and can generate breaks on
+some models with a BREAK key.
+@end<multiple>
+
+@ux<Comart>:@\Comart Communicator-Similar to Northstar
+equipment.  Can generate BREAK.
+
+@ux<Compupro>:@\Based on Kermit 3.x, and has been merged into V4.09
+
+@ux<CPT-85xx word processors>:@\Can generate BREAK.  SET SPEED supported;
+speeds are 50-9600 baud.
+
+@ux<Cromemco>:@\Cromemco computers with TU-ART card.  Supports SET
+BAUD-RATE (110-9600 baud).
+
+@ux<DEC DECmate II word processor (with Z80 card)>:@\Can generate BREAK.
+
+@ux<DEC VT180 (Robin)>:@\Three output ports, referred to as COMMUNICATIONS,
+GENERAL, and PRINTER.  Can generate BREAK.
+
+@ux<Digicomp Delphi 100>:@\SET SPEED supported; speeds are 50-19200 baud.
+
+@ux<Discovery>:@\Action Computer Enterprises "Discovery" Multi-user
+Computer.  Uses Port B on an 83U user board.  Supports SET SPEED
+for 50-19200 baud.  Can generate BREAK.
+
+@ux<Epson>:@\Epson PX-8 with LCD display.  Although it is quite different
+in displaying of Packet Information, it works as any other CP/M-80 Kermit.
+Supports SET SPEED and can generate BREAK.
+
+@ux<Generic Kermit>:@\Two versions, one for CP/M version 2@q<.>2 and 
+version 3.  These systems use IOBYTE flipping (V2@q<.>2) and the AUX: 
+device to communicate to the serial line.  You may have to SET PORT xxx
+before the version 2@q<.>2 will work, as Kermit needs to know what device
+is the serial line.
+
+@ux<Genie>:@\Eaca Video Genie.
+
+@ux<Heath>: Three Versions:
+@begin<description,leftmargin +4,indent -4>
+H8QUAD@\for Heath-8 systems with the quad io board.  This system has been
+derived from V3.x code.  Note that this version will not run "as is" on H89
+systems.
+
+H89@\For Heath-89 machines suports baud rates from 50 to 56,000 baud.
+
+Z100@\For Z-100 running CP/M-85.  This version does not support
+setting of baud rates.
+
+@end<description>
+
+@ux<Intertec Superbrain>: Two Versions:
+@begin<description,leftmargin +4,indent -4>
+BRAINA@\For superbrain using AUX port.  Breaks and SET BAUD both supported
+
+BRAINM@\As above, but using the MAIN port.
+@end<description>
+
+@ux<Ithaca>:@\Ithaca Intersystems based computer using the VIO card for 
+all IO to the outside world.  The system is strictly speaking a 
+home-brew variant of the Ithaca machine, using an S100 cardcage 
+without a front panel.  It uses the Extended BIOS by EuroMicro of London.  
+However, I see no reason for this version not running on a genuine 
+Ithaca Intersystems machine.  There are patches needed to the EuroMicro
+BIOS to make this version work.
+
+@ux<Kaypro:>@\Should work on most Kaypro models, as well as some related
+systems (Ferguson BigBoard I, Xerox 820).  For the newer Kaypros with multiple
+ports, Kermit uses the one labeled "serial data"; it cannot use the serial
+printer or internal modem ports (but it should be possible to modify the values
+for mnport, mnprts, and baudrt to do this).  Can generate BREAK.  SET SPEED
+supported; speeds are 50-19200 baud.
+
+@ux<Lobo>:@\Lobo MAX-80.  Supports SET SPEED and can generate BREAKS.
+
+@ux<Merlin>:@\British Telecom Merlin M2215 (also Rair Black Box, possibly
+also the ICL PC?).  Requires a terminal.
+
+@ux<Microbee>:@\Microbee Systems computer made in Australia.  Works on
+Microbee 56K (Series 2 APC), 64K (Computer in a Book), 128K (Dynamic), and
+256K (256TC).  Can generate BREAK.  SET BAUD-RATE supported; speeds are
+75-9600.  All serial I/O is via software, not hardware.  Simultaneous transmit
+and receive possible on all speeds except 75/1200, 1200/75, 4800, and 9600.
+
+@ux<Micromate>:@\PMC 101 Micromate.  Supports SET SPEED and can
+generate BREAK.
+
+@ux<Micromint>: Two versions
+@begin<description, leftmargin +4, indent -4>
+S6@\The Ciarcia/Micromint sb-180 board with a 6Mhz procoessor.  System
+requires a terminal.
+
+S9@\As above, but with a 9Mhz processor.
+@end<description>
+
+@ux<NCR>:@\Decisionmate 5.  Uses the 2651 and is largely 
+the same as the Ithaca Intersystems machine implementation.
+
+
+@ux<Northstar>: -- There are four versions available:
+@begin<description,leftmargin +4,indent -4>
+NORTHS:@\Northstar Horizon with HS10-4 board.  Supports SET SPEED
+and SET PORT.
+
+HORIZON:@\Northstar Horizon using the serial ports on the Mother
+board.  Can generate BREAK.
+
+BASICNS:@\Basic Northstar Horizon using the printer port.  
+Can generate BREAK.
+
+ADVANT:@\Northstar Advantage.  Supports SET SPEED and can
+generate BREAK.  Traps Control-0 in the system filter.
+@end<description>
+
+@ux<Morrow Decision I>:@\Uses the Multi-I/O board.  Port 1 is the console, port
+3 is the communications line.  SET SPEED supported; speeds are 75-56000
+baud.
+
+@ux<Morrow Micro Decision I>:@\
+
+@ux<Nokia MicroMikko>:@\
+Will not echo control-O (which locks keyboard).  SET SPEED
+supported; speeds are 75-9600 baud.
+
+@ux<Ohio Scientific>:@\Doesn't have screen control.
+
+@ux<Osborne 1>:@\Uses serial line, not internal modem.  Left-arrow 
+key generates
+<DEL> ("delete" or "rubout" character) during connect mode.  SET SPEED
+supported; speeds are 300 and 1200 baud.  Now supports multi-sector buffering.
+
+@ux<Research Machines>: Two Versions:
+@begin<description,leftmargin +4,indent -4>
+RM380ZM:@\380Z and 5.25" disks supports SET BAUD.RATE
+
+RM380ZF:@\380Z and 8" disks, otherwise as above.
+@end<description>
+
+@ux<Sanyo>:@\Sanyo MBC-1100.  This version derived from Kermit V3.x
+
+@ux<ScreenTyper>:@\Details unkown.
+
+@ux<TRS-80>: Three versions:
+@begin<description,leftmargin +4,indent -4>
+TRS80LB:@\TRS-80 with Lifeboat CP/M
+
+TRS80PT:@\TRS-80 with Pickles and Trout CP/M
+
+TRSM4:@\TRS-80 Model 4 with Montezuma CP/M
+@end<description>
+
+@ux<Teletek>:@\Teletek Systemaster. Supports SET BAUD.
+
+@ux<Telcon>:@\TELCON ZOBRA portable computer.
+
+@ux<Torch>:@\Torch Unicorn 5 initially, but the code runs on other
+Z80 based CP/N (as in Nut!) systems.  It uses the BBC Computer as a
+"Base processor", and is similar to the BBC version.  The base processors
+RS423 port is used rather than any built in Modem.
+(UK telecoms legislation effectively makes modem control software
+tricky business...).  Two potential versions exist-one using cursor
+positioning codes for a MCP  and CCCP ROM combination of revision less
+than 1.00, the other version uses the additional facility MCP/CCCP
+versions greater than 1.  Supports SET SPEED and can generate BREAKs.
+
+@\Note that binary files must be transferred using SET PARITY to anything
+other than NONE!  Parity is neither generated nor checked.
+
+@ux<US Micro Sales>:@\S-100-8 based computer.
+
+@ux<Vector Graphics>:@\Vector
+
+@ux<Xerox>:@\Xerox 820.
+
+@ux<Z80MU>:@\Development Kermit on a PC running the Z80MU Z80 and CP/M 2@q<.>2
+development system.  Allows development of the system independent modules
+to be done on an IBM PC or clone.  Also allows the generation of new .HEX 
+files, that may then be KERMITed to the target system.  Note:  Not all 
+the BDOS or BIOS routines are supported, so avoid "unusual" BIOS/BDOS calls.
+(For example, DIR from within Kermit will fail as one of the BIOS routines
+returning disk parameters is not supported.)
+@end<description>
+
+@section<Installation of Kermit-80>
+
+Kermit-80 was written originally for the Intertec SuperBrain in
+lowest-@|common-@|denominator @Index[8080] 8080 code with the standard
+assembler, ASM (single source module, no macros, no advanced instructions), so
+that it could be assembled on any CP/M-80 system (the 8080 assembler is
+distributed as a standard part of CP/M-80, whereas the fancier Z80@Index[Z80]
+or macro assemblers are normally commercial products).  It has since been
+modified to run on many other systems as well.  Kermit-80 should be able to run
+on any 8080-, 8085- or Z80-@|based microcomputer under @Index[CP/M] CP/M with
+appropriate minor changes to reflect the port I/O and screen control for the
+system (see below).
+
+The proliferation of new systems supported by Kermit-80 made the program grow
+so large and complicated that it had to be broken up into system-@|independent
+and system-@|dependent modules, as of version 4 (this was done by Charles
+Carvalho of ACC).  Each module is composed of multiple files.  This has reduced
+the time and disk space necessary for assembly; Kermit-80 may once again be
+assembled on a CP/M system with roughly 250Kbytes of space.  The majority of
+the code does not need to be reassembled to support a new system.
+Unfortunately, it can no longer be assembled with ASM, since ASM does not
+support multiple input files.  To allow it to be assembled on any CP/M system,
+the public-domain assembler LASM is included in the distribution kit. Kermit-80
+may also be assembled with Microsoft's M80 (not supplied).  In theory, any 8080
+assembler supporting the INCLUDE directive ought to work, as well.
+
+All versions of Kermit-80 are assembled from the same set of sources, with
+system dependencies taken care of by assembly-@|time conditionals within the
+system-@|dependent module (eventually, the system-@|dependent module will
+itself be broken up into multiple files, one for each system).  The most
+important system dependencies are terminal emulation (when CONNECTed to the
+remote host) and screen handling, which are dependent on the individual micro's
+escape codes (these features are table driven and easily modified for other
+CP/M systems), and the lowest level I/O routines for the serial communications
+port.  The port routines are best done only with BDOS calls, but some systems
+do not allow this, primarily because the BDOS routines strip the parity bit
+during port I/O, and the parity bit is used for data when transmitting binary
+files.
+
+Kermit-80's I/O routines must check the port status and go elsewhere if no
+input is available; this allows for virtual terminal connection, keyboard
+interruption of stuck transmissions, etc.  On systems that fully implement I/O
+redirection via the optional CP/M IOBYTE facility, this may be done by
+switching the IOBYTE definition.  On others, however, IN/OUT instructions
+explicitly referencing the port device registers must be used.
+
+@index<Timeout>
+CP/M-80 KERMIT versions 3.8 and later include a "fuzzy timer" that allows a
+timeout to occur after an interval ranging from 5 to 20 seconds (depending upon
+the speed of the processor and the operating system routines) during which
+expected input does not appear at the port.  In this case, retransmission
+occurs automatically.  In any case, you may type a carriage return during
+transmission to simulate a timeout when the transfer appears to be stuck.
+
+@subsection<Organization of Kermit-80>
+Kermit-80 consists of two modules, each of which is generated from multiple
+source files.  The first module contains the system-@|independent code;
+the second module is configured for a particular system and merged with
+the system-@|independent module to produce a customized Kermit-80.
+
+The distribution kit contains:
+@begin<itemize,spread 0>
+the system-@|independent module, @q<CPSKER.HEX>;
+
+the system-@|dependent modules, @q<CPV*.HEX> (see table @ref<-cpmsystems1>
+and @ref<-cpmsystems2>);
+
+the source files, @q(CPS*.ASM) and @q(CPX*.ASM),
+
+the public-domain CP/M assembler, @q<LASM.*>,
+
+the public-domain CP/M load/patch utility, @q<MLOAD.*>
+@end<itemize>
+
+@Comment(NewPage<> added for local manual)
+@begin<table,use verbatim,leftmargin +0>
+@bar()
+@blankspace(1)
+@u(Symbol  Filename System)
+@blankspace(0.25)
+ACCESS  CPVACC  @r<Access Matrix>
+ADVANT  CPVADV  @r<Northstar Advantage>
+AP6551  CPVAPL  @r<Apple II, Z80 Softcard, 6551 ACIA in serial interface>
+AP6850  CPVA65  @r<Apple II, Z80 Softcard, 6850 ACIA in Serial Iiterface>
+APMMDM  CPVAPM  @r<Apple II, Z80 Softcard, Micromodem II in slot 2>
+APCPS   CPVCPS  @r<Apple II, Z80 Softcard, with CPS multifunction card>
+BASICNS CPVBNS  @r<Northstar Horizon (terminal required)>
+BBC     CPVBBC  @r<Acorn "BBC" computer with Acorn Z80 second processor>
+BBII    CPVBB2  @r<BigBoard II (terminal required)>
+BRAINM  CPVBRM  @r<Intertec Superbrain using the main port>
+BRAINA  CPVBRA  @r<Intertec Superbrain using the Aux port>
+CIFER2  CPVCIF  @r<Cifer 1886 using the VL: Serial port and CP/M V2.2>
+CIFER3  CPVCI3  @r<Cifer 1886 using the VL: Serial port and CP/M V3.0>
+CIFER2  CPVCA2  @r<Cifer 1886 using the AUX: Serial port and CP/M V2.2>
+CIFER3  CPVCA3  @r<Cifer 1886 using the AUX: Serial port and CP/M V3.0>
+CMEMCO  CPVCRO  @r<Cromemco with TU-ART card. Terminal required)>
+COMART  CPVCOM  @r<Comart Communicator (terminal required)>
+COMPRO  CPVPRO  @r<Compupro with Interfacer 4 (or 3).  Terminal required.>
+CPC     CPVCPC  @r<Amstrad CPC 664 and 6128 and CP/M 3>
+CPM3    CPVCP3  @r<"Generic": CP/M 3.0 (CP/M Plus) systems (terminal req'd)>
+CPT85XX CPVCPT  @r<CPT-85xx wordprocessor with CP/M>
+DELPHI  CPVDEL  @r<Digicomp Delphi 100 (terminal required)>
+DISC    CPVDIS  @r<Action Computer Enterprises "Discovery" (terminal req'd)>
+DMII    CPVDM2  @r<DECmate II with CP/M option>
+GENER   CPVGEN  @r<"Generic": CPM 2.2 systems with IOBYTE (terminal req'd)>
+GENIE   CPVGNI  @r<Video Genie>
+H8QUAD  CPVH8Q  @r<Heath-8 with Quad 8 i/o board>
+HEATH   CPVH89  @r<Heath/Zenith H89>
+HORIZON CPVHOR  @r<Northstar Horizon (terminal required)>
+KPII    CPVKPR  @r<Kaypro-II (and 4; probably supports all Kaypro systems)>
+LOBO    CPVLBO  @r<Lobo Max-80>
+@begin<text,facecode R,above 1>
+"symbol" is the symbol used to select the target system, in @q<CPVTYP.ASM>;
+
+"filename" is the name under which the module is supplied in the distribution.
+@end<text>
+@caption<Systems supported by Kermit-80 (Part 1)>
+@bar()
+@tag<-cpmsystems1>
+@end<table>
+
+
+@Comment(NewPage<> added for local manual)
+@begin<table,use verbatim,leftmargin +0>
+@bar()
+@blankspace(1)
+@u(Symbol  Filename System)
+@blankspace(0.25)
+M2215   CPVMRL  @r<British Telecom Merlin/Rair Black Box (terminal required)>
+MBEE    CPVBEE  @r<Microbee>
+MDI     CPVMDI  @r<Morrow Decision I (terminal required)>
+MIKKO   CPVMIK  @r<MikroMikko>
+MMATE   CPVMM   @r<PMC 101 Micromate (terminal required)>
+MMDI    CPVUD   @r<Morrow Micro Decision I (terminal required)>
+NCRDMV  CPVDMV  @r<NCR Decision Mate V.  (Terminal required?)>
+NORTHS  CPVNS   @r<Northstar Horizon with HSIO-4 card (terminal req'd)>
+OSBRN1  CPVOSB  @r<Osborne 1>
+OSI     CPVOSI  @r<Ohio Scientific>
+PCI2651 CPVPCI  @r<Ithaca Intersystems with VI0 card (terminal required)>
+PCW     CPVPCW  @r<Amstrad PCW 8256/8512 with serial interface>
+PX8     CPVPX8  @r<Epson PX-8>
+RM380ZM CPVRMM  @r<Research Machines 380Z with MDS (5.25" discs)>
+RM380ZF CPVRMF  @r<Research Machines 380Z with FDS (8" discs)>
+ROBIN   CPVROB  @r<DEC VT180>
+S1008   CPVUSM  @r<US Microsales S-100-8 (terminal required)>
+SANYO   CPVSAN  @r<Sanyo MBC-1100>
+SB6     CPVSB6  @r<Micromint SB-180 with 6Mhz CPU (terminal required)>
+SB9     CPVSB9  @r<Micromint SB-180 with 9Mhz CPU (terminal required)>
+SCNTPR  CPVSCN  @r<Screentyper>
+TELCON  CPVTEL  @r<TELCON Zobra portable>
+TELETEK CPVTET  @r<Teletek Systemaster>
+TORCH   CPVTRC  @r<Torch computers BBC-B with Z80 second processors>
+TRS80LB CPVTLB  @r<TRS-80 model II with Lifeboat 2.25C CP/M Display>
+TRS80PT CPVTPT  @r<TRS-80 model II with Pickles + Trout CP/M Display>
+TRSM4   CPVTM4  @r<TRS-80 model IV>
+VECTOR  CPVVEC  @r<Vector Graphics>
+XER820  CPVXER  @r<Xerox 820>
+Z100    CPVZ00  @r<Z-100 under CP/M-85>
+Z80MU   CPVZ80  @r<Z80MU development system on a PC>
+@begin<text,facecode R,above 1>
+"symbol" is the symbol used to select the target system, in @q<CPXTYP.ASM>;
+
+"filename" is the name under which the module is supplied in the distribution.
+@end<text>
+@caption<Systems supported by Kermit-80 (Part 2)>
+@bar()
+@tag<-cpmsystems2>
+@end<table>
+
+@Comment(NewPage added for local manual)
+@NewPage()
+@begin<table,use verbatim,leftmargin +0>
+@bar()
+@blankspace(1)
+@u(Symbol  Terminal type)
+@blankspace(0.25)
+CRT     @r<Dumb terminal type.  Does not do cursor addressing>
+ADM3A   @r<Lear Seigler ADM 3A>
+ADM22   @r<Lear Seigler ADM 22>
+AM230   @r<Ampro 230>
+H1500   @r<Hazeltine 1500>
+SMRTVD  @r<Netronics Smartvid>
+SOROQ   @r<Soroq IQ-120>
+TVI912  @r<Televideo 912>
+TVI925  @r<Televideo 925 or Freedom 100>
+VT52    @r<Dec VT52 or equivalent (H19)>
+VT100   @r<Dec VT100 or equivalent>
+WYSE    @r<Wyse 100>
+@begin<text,facecode R,above 1>
+"symbol" is the symbol used to select the target system, in @q<CPXTYP.ASM>;
+
+"Terminal type" is the type of terminal "symbol" selects.
+@end<text>
+@caption<Terminals supported by Kermit-80>
+@bar()
+@tag<-cpmterminals>
+@end<table>
+@Comment(NewPage<> removed again)
+
+@Comment<for Installation of kermit-80>
+
+@subsection<Downloading Kermit-80>
+
+You'll need either a pre-configured @q<.COM> file or the system-@|independent
+module, @q<CPSKER>, in binary (@q<.COM>) or hex (@q<.HEX>) format and the
+system-@|dependent overlay for your system (from Tables @ref<-cpmsystems1> and 
+@ref<-cpmsystems2>).  If
+your system is not listed in the table, get the generic CP/M 2@q(.)2 Kermit or
+the generic CP/M 3 Kermit.  If you already have a version of Kermit on your
+micro and you want to install a new version, simply use your present version to
+get the new files.  Transfer the files to your system and skip ahead to
+"merging the modules".
+
+If you do not have a copy of Kermit on your micro, and you cannot borrow a
+Kermit floppy but you do have access to a mainframe computer with a copy of the
+Kermit-80 distribution, you should read this section.
+
+@Index[Bootstrapping CP/M Kermit]@index<Downloading>
+ There are several ways to get CP/M Kermit from a host system to your micro.
+The easiest is to "download" the necessary "hex" files into your micro's
+memory and then save them on the disk.  If you have a terminal emulator program
+on your micro which can save a copy of the session to disk, connect to your
+host, and type the necessary files.  Exit from the emulator, saving the
+session log, and edit the session log to extract the hex files.  Skip ahead to
+"merging the files".
+
+The following is a procedure which, though far from foolproof, should allow you
+to get a version of Kermit to your CP/M based micro.  It depends upon the host
+prompt, or at least the first character of the host prompt, being some
+character that cannot appear in a hex file (the valid characters for hex files
+are the digits 0-9, the upper case letters A-F, the colon ``@q<:>'', carriage
+return, and line feed).  As soon the prompt character is encountered, the
+transfer will terminate.  If your host does not issue a prompt that will
+accommodate this scheme, you can achieve the same effect by adding an atsign
+``@@'' to the very end of the hex file before sending it from the host.  The
+program below looks for an atsign (the normal DEC-20 prompt, hex 40).
+DECSYSTEM-10 users would look for a dot, hex 2E; VAX/VMS or UNIX users would
+look for a dollar sign, hex 24; UNIX C-Shell users would look for a percent
+sign, hex 26.
+
+@Begin <Enumerate>
+For CP/M 2@q<.>2 systems, connect to a floppy disk with plenty of free space.
+Run DDT and type in the following (the comments should not be typed in;
+they are there just to tell you what's happening): (Note that this wont work
+for CP/M Plus or 3@q<.>0 systems!)
+@Begin<figure, use Example, leftmargin +0>
+@bar()
+@blankspace(0.25)
+-a100                  ;Begin assembling code at 100
+0100   LXI H,2FE       ;Where to store in memory
+0103   SHLD 200        ;Keep pointer there
+0106   MVI E,D         ;Get a CR
+0108   MVI C,4         ;Output to PUNCH (send to HOST)
+010A   CALL 5
+010D   MVI C,3         ;Input from READER (read from HOST)
+010F   CALL 5
+0112   ANI 7F          ;Strip parity bit
+0114   PUSH PSW        ;Save a and flags
+0115   MOV E,A         ;Move char to E for echo
+0116   MVI C,2         ;Output to screen
+0118   CALL 5
+011B   POP PSW         ;Restore A and flags
+011C   CPI 40          ;(or 4E,24,26,etc) System prompt?
+011E   JZ 127          ;Yes, have whole file in memory
+0121   CALL 17A        ;No, store another byte
+0124   JMP 10D         ;Read another byte
+0127   MVI A,1A        ;Get a Control-Z (CP/M EOF mark)
+0129   CALL 17A        ;Store it in memory
+012C   LXI H,300       ;Get memory pointer
+012F   SHLD 202        ;Store as DMA pointer
+0132   LDA 201         ;Get 'HI' byte of memory pointer
+0135   STA 200         ;and store it as 'LO' one
+0138   XRA A
+0139   STA 201         ;Zero 'HI' byte (slow *256)
+013C   MVI C,16        ;Make NEW file
+013E   LXI D,5C        ;With FCB1
+0141   CALL 5
+0144   CALL 15E        ;Write 128 bytes (sector)
+0147   CALL 15E        ;Write another sector
+014A   LXI H,FFFF      ;Get a 16-bit Minus One
+014D   XCHG            ;into DE
+014E   LHLD 200        ;Get 256-byte counter
+0151   DAD D           ;Decrement
+0152   SHLD 200        ;and store back
+0155   MVI A,2         ;Check if
+0157   CMP L           ; 256-byte counter down to offset
+0158   JZ 183          ;Yes, we're done
+015B   JMP 144         ;Keep writing..
+015E   LHLD 202        ;Get file-pointer
+0161   XCHG            ;into DE
+0162   MVI C,1A        ;Set DMA-address
+0164   CALL 5
+0167   MVI C,15        ;Write sector (128 bytes)
+0169   LXI D,5C        ;using FCB1
+016C   CALL 5
+016F   LHLD 202        ;Get file-pointer
+0172   LXI D,80        ;128-bytes
+0175   DAD D           ;added to file-pointer
+0176   SHLD 202        ;and save
+0179   RET             ;and return
+017A   LHLD 200        ;Get Memory-pointer
+017D   MOV M,A         ;Store character
+017E   INX H           ;Increment Pointer
+017F   SHLD 200        ;and save
+0182   RET             ;and return
+0183   MVI C,10        ;CLOSE file
+0185   LXI D,5C        ;using FCB1
+0188   CALL 5
+018B   JMP 0           ;Force WARM BOOT
+0179
+-^C                     ;(Type Control-C) Return to CP/M
+A>SAVE 1 FETCH.COM      ;Save program, we need to run it twice.
+@caption<Bootstrap program for Kermit-80 and CP/M Version 2.2>
+@bar()
+@tag<-cpmboot>
+@end<Figure>
+Alternatively, an assembler source file for this program is distributed
+with CP/M Kermit as @q<CPKFET.ASM>.  You might prefer to type the assembler
+version in and assemble and load it (ASM CPKFET, LOAD CPKFET, or MASM CPKFET,
+MLOAD CPKFET), to let the assembler and loader catch any typing errors.
+
+Connect to your host using a terminal or a terminal emulation program.  Ensure
+that your host does not have your terminal in "page mode" (does not pause
+at the end of each screenful).
+
+Tell the host to display the first hex file (the system-independent module)
+at your terminal, e.g. give a command like @q<TYPE CPSKER.HEX>, @i<@u(without)
+a terminating carriage return>.
+
+Return to your micro by switching the cable from the terminal to the micro,
+or by terminating the micro's terminal program.
+
+Make sure your IOBYTE is set so that @q<RDR:> and @q<PUN:> correspond to the
+I/O port that is connected to the host (this would normally be the case
+unless you have done something special to change things).
+
+Load the program you entered in the first step with DDT, and use it to capture
+the first hex file:
+@Begin<Example,Free>
+DDT FETCH.COM
+-icpsker.hex            ;Setup FCB for file CPSKER.HEX
+-g100,179               ;Execute the program.
+@End<Example>
+Now there should be a file @q<CPSKER.HEX> on your connected disk.
+
+Return to the host, and tell it to display the second hex file (the
+system-@|dependent module for your configuration).  Again, do not type the
+terminating carriage return.
+
+Return to your micro, and run the capture program again:
+@Begin<Example,Free>
+DDT FETCH.COM
+-icpxovl.hex            ;Setup FCB to create CPXOVL.HEX
+-g100,179               ;Execute the program.
+@End<Example>
+Now there should be a file @q<CPXOVL.HEX> on your connected disk.  Replace
+@q<CPXOVL.HEX> in this example with the appropriate overlay file for your
+system.
+@end<enumerate>
+Merging the files:
+@begin<enumerate>
+For purposes of illustration, we will assume the system-@|dependent overlay is
+called "cpxovl@q<.>hex".  The two hex files may be combined with MLOAD or DDT.
+If you already have a running Kermit, you can transfer @q<MLOAD.HEX> to your
+system and create @q<MLOAD.COM> by running LOAD.  If you're bootstrapping
+Kermit, you could transfer @q<MLOAD.HEX> to your system the same way you got
+the other two @q<.HEX> files, but it's probably simpler to use DDT to get
+Kermit running, and get MLOAD later if you need it.
+
+Using MLOAD, the two pieces may be easily merged:
+@begin<example>
+A>@ux(mload kerm411=cpsker,cpxovl)
+@i[(Some messages about program size, etc...)]
+A>
+@end<example>
+
+If you don't have MLOAD running, it's a bit more complex:
+@begin<example>
+A>@ux<ddt cpsker.hex>
+NEXT  PC
+3500 0100
+-@ux<icpxovl.hex>
+-@ux<r>
+NEXT  PC
+xxxx 0000
+-@ux<^C>
+A>@ux<save @i(dd) kerm411.com>
+@end<example>
+The page count ("dd") used in the SAVE command is calculated from the last
+address ("xxxx") given by DDT in response to the R command: drop the last two
+digits and add 1 if they were not zero, then convert from hexadecimal (base 16)
+to decimal (base 10): 684F becomes 69 hex, which is 105 decimal (5 times 
+16 plus 9) -- but 6700 becomes 67 hex, or 103 decimal (consult an 
+introductory computing book if you don't understand number base conversion).
+
+If you are using the Z80MU CP/M and Z80 development toolkit on an IBM PC 
+or clone, then follow the same instructions as for a genuine CP/M system.
+When you have loaded your file, you will have to ship the .COM or two 
+.HEX files to the target CP/M system. (Possibly using a previous 
+issue of Kermit?)
+
+
+Note that CP/M hex files have checksums on each line.  If there were any
+transmission errors during the downloading process, MLOAD or DDT will notice a
+bad checksum and will report an error (something like "Illegal Format").  If
+you get any errors during loading, either fix the hex file locally with an
+editor, or repeat the transfer.
+
+@End<Enumerate>
+
+You now should have a running version of Kermit-80, called @q<KERM411.COM>.
+
+Test your new Kermit by running it.  If it gives you a prompt, it might be
+OK. (don't delete your old one yet...).  Instead of a prompt, you could get
+one of two messages indicating that the configuration information is invalid:
+@example<?Kermit has not been configured for a target system>
+or
+@example<?Consistency check on configuration failed>
+Of course, neither of these messages should appear if you're building Kermit
+from the distribution kit.  The first message indicates that the overlay was
+not found where the system-@|independent module expected to find it, probably
+because the overlay address is incorrect; the second indicates that the version
+of CPXLNK used in the system-@|dependent module is incompatible with the
+system-@|independent module.
+
+Once you are satisfied that KERMIT40 works correctly, you should rename your
+old @q<KERMIT.COM> to something else, like @q<OKERMIT.COM>, and rename
+@q<KERMIT40.COM> to @q(KERMIT.COM).
+
+@subsection<Assembling Kermit-80 from the sources>
+
+Kermit-80 is built in two pieces from the following files:
+@begin<description,spread 0>
+@i(The system-independent files:)
+
+@q<@ @ CPSKER.ASM>@\header file
+
+@q<@ @ CPSDEF.ASM>@\definitions for both KERMIT and KERSYS
+
+@q<@ @ CPSMIT.ASM>@\initialization, main loop, miscellaneous commands
+(BYE, EXIT, LOG, SET, SHOW, STATUS, and VERSION)
+
+@q<@ @ CPSCOM.ASM>@\second part of commands, status and set file
+
+@q<@ @ CPSPK1.ASM>@\part 1 of the KERMIT protocol handler
+(SEND, RECEIVE, LOGOUT,and FINISH commands)
+
+@q<@ @ CPSPK2.ASM>@\part 2 of the KERMIT protocol handler
+
+@q<@ @ CPSREM.ASM>@\REMOTE routines (FINISH, BYE and LOGOUT in CPXPK*.ASM)
+
+@q<@ @ CPSSER.ASM>@\SERVER routines (for the future)
+
+@q<@ @ CPSTT.ASM>@\the transparent commands (TRANSMIT, CONNECT)
+
+@q<@ @ CPSCPM.ASM>@\CP/M commands (DIR, ERA, USER, TYPE, PRINT, COPY)
+
+@q<@ @ CPSWLD.ASM>@\the wildcard handler
+
+@q<@ @ CPSCMD.ASM>@\the command parser
+
+@q<@ @ CPSUTL.ASM>@\utility routines and data
+
+@q<@ @ CPSDAT.ASM>@\data space and the overlay definitions
+
+@q<@ @ CPXLNK.ASM>@\linkage area description
+
+@blankspace(1)
+@i(The system-dependent files:)
+
+@q<@ @ CPXTYP.ASM>@\system selection
+
+@q<@ @ CPXLNK.ASM>@\system overlay specification and jump table
+
+@q<@ @ CPXCOM.ASM>@\common routines for all systems
+
+@q<@ @ CPXSWT.ASM>@\system selector or switcher
+
+@blankspace(1)
+One of:
+
+@q<@ @ CPXSYS.ASM>@\family file for some system-specific code
+
+@q<@ @ CPXTOR.ASM>@\family file for Torch, Superbrain, PCI2651 etc
+
+@q<@ @ CPXNOR.ASM>@\family file for Northstar and Comart machines
+
+@q<@ @ CPXMRL.ASM>@\family file for British Telecom Merlin/Rair Black Box
+
+@q<@ @ CPXSB.ASM>@\family file for Micromint SB-180 systems
+
+@q<@ @ CPXCIF.ASM>@\family file for Cifer systems
+
+@q<@ @ CPXHEA.ASM>@\family file for Heath/Zenith systems
+
+@q<@ @ CPXAPP.ASM>@\family file for Apple II systems
+
+@q<@ @ CPXPCW.ASM>@\family file for Amstrad PCW 8256/8512 machines
+
+@q<@ @ CPXBBI.ASM>@\family file for BigBoard, Kaypro and Xerox 820 systems
+
+@q<@ @ CPXBEE.ASM>@\Microbee
+
+@q<@ @ CPXSYO.ASM>@\family file for Sanyo MBS-1100 systems
+
+@q<@ @ CPXTM4.ASM>@\family file for Tandy Model 4 with CP/M systems
+
+@q<@ @ CPXGNI.ASM>@\family file for Video Genie systems
+
+@q<@ @ CPXPRO.ASM>@\family file for Compupro systems
+
+@q<@ @ CPXZ80.ASM>@\family file for the Z80MU development system
+
+@blankspace(1)
+and if you use a terminal,
+
+@q<@ @ CPXVDU.ASM>@\display codes for VDUs etc.  Not always required
+@end(description)
+The system-@|independent module contains all of the system-@|independent files
+except for @q(CPXLNK.ASM), which is assembled into the system-@|dependent
+module to provide the structures needed to connect the two modules.  As
+distributed, the system-@|independent module is named @q(CPSKER.HEX).  If you
+have a copy of @q(CPSKER.HEX), you do not need to reassemble the
+system-@|independent module to configure Kermit for your system.
+
+The system-@|dependent module consists of @Q(CPXTYP.ASM), @Q(CPSDEF.ASM),
+@Q(CPXLNK.ASM), @q(CPXSWT.ASM), @q(CPSCOM.ASM), one of the family files
+@Q(CPXSYS.ASM), @q(CPXTOR.ASM), @q(CPXMRL.ASM), @q(CPXSB.ASM), @q(CPXCIF.ASM),
+@q(CPXHEA.ASM), @q(CPXBBI.ASM), @q(CPXTM4.ASM), @q(CPXGNI.ASM), @q(CPXNOR.ASM),
+@q(CPXAPP.ASM), @q(CPXPCW.ASM), or @q(CPXPRO.ASM), and possibly @q(CPXVDU.ASM),
+if your system uses a terminal for the console.  One copy of the
+system-@|dependent module is supplied already assembled for each supported
+system; the filename may be obtained from tables @ref<-cpmsystems1> and
+@ref<-cpmsystems2>.  If a terminal is required for a system, a CRT (glass TTY
+device) has been selected.
+
+After assembling the two pieces separately, they are combined with DDT or
+MLOAD into a system-@|specific Kermit.
+
+If you want to rebuild the system-@|independent module, the only change you
+may need to make is to select the assembler to be used, in @Q(CPSKER.ASM).
+Define one of MAC80, M80, or LASM to TRUE to select it as the assembler;
+the others should be defined FALSE.
+
+Assuming you have the Microsoft Macro Assembler package (M80/L80), you'll
+need to do the following:
+@begin<example>
+A>@ux(m80 cpsker=cpsker.asm)
+A>@ux(l80 /p:100,cpsker,cpsker/n/e)
+@end<example>
+This will produce @Q(CPSKER.COM).
+
+If you are using LASM instead, do this:
+@example(A>@ux<lasm cpsker>)
+LASM will generate @Q(CPSKER.HEX) and @Q(CPSKER.PRN).  LASM allows options to
+be specified in the same way as the standard assembler, ASM, so the command
+@example[A>@ux(lasm cpsker.abz)]
+will read the source files from drive A, send the @q(.HEX) file to drive B,
+and suppress the listing file.
+
+If you are using the Z80MU development system on an IBM PC or clone, then
+assemble your files using either LASM and MLOAD or M80 and L80, as if you
+were using a genuine CP/M-80 system.  Note that you will still have the 
+problem of transferring your assembled files to the target CP/M system.
+
+If you want to generate a system-@|dependent overlay for a particular system,
+or want to change the terminal supported, you'll need to check three areas in
+@Q(CPXTYP.ASM):
+
+First, the overlay start ADDRESS.  The symbol "ovladr" is EQUated to the
+address of "LNKFLG" in the system-@|independent module, as the starting address
+of the overlay (7000H for version @value(-cpmversion)).  You'll need to know
+this value if you're building the overlay with M80/L80.  You won't normally
+need to change this value.
+
+Second, the assembler being used.  Again, define one of MAC80, M80, and LASM
+to be TRUE to select it, and define the others to be FALSE.  The two modules
+(system-@|independent and system-@|dependent) do not need to be built with the
+same assembler.
+
+Third, the system configuration.  Locate your system in tables
+@ref<-cpmsystems1> and @ref<-cpmsystems2>, then define the appropriate symbol
+TRUE, and the rest FALSE.  If the system comes with a builtin console terminal,
+define all the terminal switches FALSE.  If the system uses an external
+terminal as the console, locate the terminal in table @ref<-cpmterms> and
+define the appropriate symbol TRUE, and the remainder FALSE.  If the terminal
+is not listed in table @ref<-cpmterms>, use the CRT switch; in this case, VT52
+emulation is not supported.
+
+In addition, there are a few general and system-@|specific symbols which may
+be altered to fit your system:
+@begin<description>
+APSLOT@\For Apple with 6551 ACIA, defines the slot number of the serial card
+
+CPUSPD@\Processor speed in units of 100KHz (currently used only for bbII and
+        kpII for timing loops)
+
+TAC@\For users connecting through ARPAnet TACs: set to TRUE if you wish the
+default TACTRAP status to be ON. (This may be overridden with the SET TACTRAP
+command).  If you're not connecting through a TAC, set tac to FALSE and ignore
+tacval.
+
+TACVAL@\For ARPANET TAC users: defines the default TAC intercept character
+(may be overridden with the SET TACTRAP command).
+@end<description>
+
+If you are just assembling an existing configuration, you'll need to edit
+@Q(CPXTYP.ASM) only.  If you are adding support for a new system, you should
+not modify @Q(CPSDEF.ASM) or @Q(CPXLNK.ASM); if you do, you'll have to change
+the system-@|independent module also.  Eventually, @Q(CPXSYS.ASM) will be split
+into separate files, each of which will generate one or more related systems.
+When this happens, you'll want to pick the one closest to your system to use as
+a starting point.
+
+After editing @q<CPXTYP.ASM> as necessary, assemble and link the overlay as
+follows:
+@begin<itemize>
+With M80 (where "xxxx" is the hex value of ovladr from @q<CPXLNK.ASM>):
+@begin<example>
+A>@ux<m80 cpxtyp=cpxtyp.asm>
+A>@ux<l80 /p:xxxx,cpxtyp,cpxtyp/n/x/e>
+@end<example>
+
+With LASM:
+@begin<example>
+A>@ux<lasm cpxtyp>
+@end<example>
+@end<itemize>
+
+With an IBM PC or clone using the Z80MU softwrae, follow the instructions
+as if you were using a real CP/M system.
+
+The overlay (@q(CPXTYP.HEX)) may then be merged with the system-@|independent
+module as described above (creating a runnable Kermit from the distribution
+kit).
+
+If you are using the Z80MU 
+development system on a PC, and already have a running
+Kermit-80 v3.9 or later, you can merge the two @q<.HEX> files into a @q<.COM>
+file with LINK80 (TOPS 10/20), MLOAD (Z80MU), L80 (Z80MU), and 
+transfer the new @q<.COM> file to your micro with Kermit:
+@begin<itemize>
+Z80MU on a PC and MLOAD:
+@begin<example>
+@@@ux<MLOAD KERNEW=CPSKER,CPXTYP>
+@end<example>
+
+Z80MU on a PC and C80:
+@begin<example>
+@@@ux<L80 /P:xxxx,CPXTYP,CPXTYP/N/X/E>
+@end<example>
+@end<itemize>
+producing @Q(KERNEW.COM).
+
+@begin<table,leftmargin +0,use format>
+@tabclear()@tabset(1.5in)
+@bar()
+@blankspace(1)
+@u(Symbol)@\@ux<Terminal description>
+crt@\Basic CRT, no cursor positioning
+adm3a@\ADM3A Display or lookalike
+adm22@\ADM22 Display or lookalike
+am230@\Ampro 230
+h1500@\Hazeltine 1500
+smrtvd@\Netronics Smartvid-80
+soroq@\Soroq IQ-120
+tvi912@\TVI 912
+tvi925@\TVI 925, Freedom 100
+vt52@\VT 52 or VT52 emulator such as Heath H19, H29, etc.
+vt100@\VT 100 or emulator (most ANSI terminals should work)
+wyse@\Wyse 100
+@caption<Terminals known to Kermit-80>
+@tag<-cpmterms>
+@bar()
+@end<table>
+
+@section<Adding Support For A New System>
+Kermit-80 is built from a common set of source files; the system-@|dependent
+module makes heavy use of conditional assembly (this complication will be
+removed in future releases).  The system dependencies arise from attempts to
+answer some questions:
+@begin<enumerate>
+@i<What kind of terminal is to be supported?>
+@blankspace(1)
+For many micros, the console is an integral part of the system, but
+others can use an external terminal.  In either case, the commands
+to manipulate the screen (position the cursor, erase the screen, etc)
+must be defined.
+
+@i<How is the serial line accessed?>
+@blankspace(1)
+For systems supporting the IOBYTE function, this is straightforward; the
+symbol "IOBYT" is defined TRUE.  If the serial line is accessed with IN and OUT
+instructions, it may be possible to use the simple I/O routines provided.  In
+this case, the symbol "INOUT" is defined TRUE, the MNPORT and MNPRTS are
+defined to be the data and control addresses, respectively, and bit masks for
+testing for "input data available" and "output buffer empty" must be defined.
+If the interface is strange, leave IOBYT and INOUT set to FALSE, and provide
+the I/O routines.
+
+@i<What initialization is necessary?>
+@blankspace(1)
+You may wish to set the baud rate or configure the serial line at
+startup.  Examples for a number of devices are present.
+
+@i<What special features are to be supported?>
+@blankspace(1)
+You may want to provide the capability to select one of several serial lines
+with the SET PORT command, or to change the speed of the serial line with the
+SET SPEED command.  To do this, you'll need to build a command table, using
+the systems already supported as examples.  The ability to send a BREAK signal
+is desirable.  Again, examples for several different interfaces (ACIA, SIO,
+etc) are present.
+
+@i<Do you want to design an external terminal type?>
+@blankspace(1)
+There is a jump entry in the overlay file to allow users to add their
+own termainl emulator.  If you write the code for such an emulator,
+you must load this jump address with the address of your emulator, and
+SET TERMINAL EXTERNAL from within Kermit.  All characters will be passed
+to this routine during connect mode.
+@end<enumerate>
+
+@section<Notes on New Features in Kermit-80 Version 4>
+
+@begin<itemize>
+@i(Debugging aids:)
+SET DEBUG ON will add two fields to the SEND/RECEIVE display, labelled "Spack"
+and "Rpack".  These display the last packet sent and received.  Of course, this
+slows down the transfer, especially if the console is an external terminal.
+SET DEBUG OFF removes these fields.  The VERSION command displays the name,
+edit number, and edit date of several of the modules that make up Kermit.
+
+@index<ARPAnet>@index<TAC> @index<Attention Character>
+@index<Intercept Character>
+@i(TAC support:) ARPAnet TACs (and many other communication devices such as
+terminal concentrators, modems, port contention units, network PADs, etc) use a
+printing character (like "@@") as an intercept character, to allow commands to
+be issued to the TAC, or modem, etc.  In order to send this character to the
+host, it must be typed twice.  The command "SET TAC CHARACTER" to Kermit
+enables the "TACtrap" and asks the user to specify the TAC intercept character.
+This character will be automatically doubled when it appears in Kermit protocol
+messages (sent by the SEND or RECEIVE commands) or when it appears in a file
+being sent with the TRANSMIT command.  It is not automatically doubled when
+typed by the user in CONNECT mode.  "SET TAC ON" enables the TACtrap but does
+not change the TAC intercept character, which is initially "@@".  "SET TAC OFF"
+disables the TACtrap.
+
+@i(File buffering:)
+Previous versions of Kermit-80 buffered only one sector (128 bytes) at a time
+during file transfer operations.  This version buffers 16Kbytes at a time,
+reducing the number of times the floppy drive must be spun up and down, and
+increasing the effective throughput of the link.  If the disk transfer rate is
+too slow, however, the remote Kermit may time out and retransmit packets.  This
+will show up on the screen in the "Retries:" field; if this occurs after disk
+activity, you may want to increase the timeout value on the remote Kermit, 
+SET BUFFER <new value> while in Kermit,or
+reassemble Kermit with a smaller value for MAXSEC (in @Q(CPSDEF.ASM))
+This buffer is also used by the TRANSMIT command; the log file 
+enabled by the LOG command is still written a sector at a time.
+@end<itemize>
+
+@Comment<for Assembling Kermit-80)
+
+@section<Specification for Kermit-80 System Dependent Modules>
+
+This section is intended for people wanting to implement their own
+versions of Kermit-80 for computers not already defined.
+
+The system independent code communicates to routines for a specific
+system through a set of tables.  These tables are defined in
+CPXLNK.ASM, and should not be modified between revisions of Kermit.  If
+an entry is added or deleted, then the whole of Kermit-80
+needs reassembling.  Make sure that the changes to CPXLNK.ASM are
+duplicated in CPSUTL.ASM, which has the system independent
+equivalent of CPXLNK.ASM.
+
+The following entries/definitions apply to revision 4.09.  There
+have been three additional entries since revision 4.05.
+
+The table is split into three sectors; The first section defines 
+two byte "words" giving 16 bits of interface data; The second set is a
+set of jumps to various functions, and finally the third set
+a set of pure data bytes.
+
+
+@subsection(Interface Data.)
+
+@begin<description, spread 0, indent -8>
+
+@ux<LNKFLG>@\Must be first entry in overlay at overlay address.  Is a two 
+byte address giving the size of the linkage table.  This is used to 
+check for consistency of overlay's
+@blankspace(1)
+
+@ux<ENTSIZE>@\Length of entry table, also used for consistency checking after 
+the overlay.  Currently 6
+@blankspace(1)
+
+@ux<SYSEDT>@\The address of a dollar-terminated string giving the overlay 
+revision level and date.  Points to a string like: 
+CPXSYS.ASM(33) 4-JUN-1986$
+@blankspace(1)
+
+@ux<FAMILY>@\The address of a dollar-terminated string giving the Family overlay 
+revision level and date.  If the system is in CPXSYS.ASM rather than a 
+particular Family overlay, it is simply a pointer to $
+@end<description>
+@blankspace(1)
+
+@subsection(Jump Table.)
+This is split into three main sectors-
+@blankspace(1)
+
+@begin(enumerate)
+Input/Output routines
+
+Screen formatting routines
+
+other system dependent routines
+@end<enumerate>
+
+
+@begin<description, spread 0, indent -14>
+@blankspace(1)
+@ux<SELMDM>
+
+@i<Parameters>@\None
+
+@i<Returns>@\None
+
+@i<Description>@\selects the modem port.  Most systems do nothing and 
+simply return.  HL,DE and BC registers preserved.
+
+@blankspace(1)
+@ux<OUTMDM>
+
+@i<Parameters>@\None
+
+@i<Returns>@\None
+
+@i<Description>@\Output the character in E register to the communications 
+line.  BC,DE,HL registers preserved.
+
+@blankspace(1)
+@ux<INPMDM>
+
+@i<Parameters>@\None
+
+@i<Returns>@\Accumulator either 0 or character from comms line if available
+
+@i<Description>@\Check modem for character and if so, return it in A.  
+HL,DE,BC registers preserved, flags 
+and accumulator lost.
+
+@blankspace(1)
+@ux<FLSMDM>
+
+@i<Parameters>@\None
+
+@i<Returns>@\None
+
+@i<Description>@\Clear any pending characters in the input buffer from the 
+modem.  No registers are preserved.
+
+
+@blankspace(1)
+@ux<SELCON>
+
+@i<Parameters>@\None
+
+@i<Returns>@\None
+
+@i<Description>@\Select the console.  This is a null subroutine for most 
+systems, but for IOBYTE systems selects the console.
+
+@blankspace(1)
+@ux<OUTCON>
+
+@i<Parameters>@\Character in E
+
+@i<Returns>@\None
+
+@i<Description>@\Send the character in E to the console.  Any quirks of 
+system responding in an odd manner should be handled.  No 
+registers preserved.
+
+
+@blankspace(1)
+@ux<INPCON>
+
+@i<Parameters>@\None
+
+@i<Returns>@\Zero or character in A.
+
+@i<Description>@\Get a character from the console or return a null if 
+no character to be read.  No registers are preserved.
+
+
+@blankspace(1)
+@ux<OUTLPT>
+
+@i<Parameters>@\Character in E
+
+@i<Returns>@\None
+
+@i<Description>@\Send the character in E to the printer.  The console is 
+selected.  Only DE registers are preserved
+
+
+@blankspace(1)
+@ux<LPTSTAT>
+
+@i<Parameters>@\None
+
+@i<Returns>@\00H or 0FFH in A register
+
+@i<Description>@\Test the printer to see if it is ready to receive a 
+character to be printed.  If a 00H is returned then the printer is 
+ready to receive a character.
+
+
+@blankspace(1)
+@ux<EXTTER>
+
+@i<Parameters>@\Character to be sent to the user supplied terminal emulator
+in the E register
+
+@i<Returns>@\None
+
+@i<Description>@\If the user has supplied a terminal emulator in the overlay
+code, EXTTER will be a JMP <non zero address>.  If SET TERMINAL EXTERNAL
+has been set, all caharcters will be passed verbatim to this terminal 
+emulator.  If there is no external emulator, this code will never be called.
+The user should reset terminal conditions on initialisation of both
+ the system and before CONNECT.  All registers should be preserved.
+
+
+@blankspace(1)
+@ux<XBDOS>
+
+@i<Parameters>@\Any required for calling BDOS
+
+@i<Returns>@\Any expected from the called BDOS routine
+
+@i<Description>@\This is an alternative entry to BDOS.  This entry will also
+check the printer status etc.  For full details see the code for the 
+BDOS trap in CPSUTL.ASM.
+@blankspace(1)
+2b)
+@blankspace(1)
+@ux<CLRLIN>
+
+@i<Parameters>@\None
+
+@i<Returns>@\None
+
+@i<Description>@\Clear the current line on the terminal
+
+
+
+@blankspace(1)
+@ux<CLRSPC>
+
+@i<Parameters>@\None
+
+@i<Returns>@\None
+
+@i<Description>@\Erase the current position (after a backspace)
+
+
+
+@blankspace(1)
+@ux<DELCHR>
+
+@i<Parameters>@\None
+
+@i<Returns>@\None
+
+@i<Description>@\Make delete (7FH) look like a backspace.  Some systems 
+do a backspace, space, backspace automatically others have to simulate it
+
+@blankspace(1)
+@ux<CLRTOP>
+
+@i<Parameters>@\None
+
+@i<Returns>@\None
+
+@i<Description>@\Clear the screen and place the cursor at the top LH corner
+
+
+
+@blankspace(1)
+@ux<SCREND>
+
+@i<Parameters>@\None
+
+@i<Returns>@\None
+
+@i<Description>@\Place the cursor on the line for the Kermit-80 prompt 
+after a file transfer.  (Usually line 13)
+
+
+
+@blankspace(1)
+@ux<SCRERR>
+
+@i<Parameters>@\None
+
+@i<Returns>@\None
+
+@i<Description>@\Move cursor to the error message field on the 
+file transfer format screen
+
+
+
+@blankspace(1)
+@ux<SCRFLN>
+
+@i<Parameters>@\None
+
+@i<Returns>@\None
+
+@i<Description>@\Move the cursor to the filename field
+
+
+
+@blankspace(1)
+@ux<SCRNP>
+
+@i<Parameters>@\None
+
+@i<Returns>@\None
+
+@i<Description>@\Move the cursor to the packet count field
+
+
+
+@blankspace(1)
+@ux<SCRNRT>
+
+@i<Parameters>@\None
+
+@i<Returns>@\None
+
+@i<Description>@\Move cursor to the retry count field
+
+
+
+@blankspace(1)
+@ux<SCRST>
+
+@i<Parameters>@\None
+
+@i<Returns>@\None
+
+@i<Description>@\Move cursor to the status field
+
+
+
+@blankspace(1)
+@ux<RPPOS>
+
+@i<Parameters>@\None
+
+@i<Returns>@\None
+
+@i<Description>@\Move to the receive packet field (debugging use)
+
+
+
+@blankspace(1)
+@ux<SPPOS>
+
+@i<Parameters>@\None
+
+@i<Returns>@\None
+
+@i<Description>@\Move to the send packet field (for debugging use)
+@blankspace(1)
+2c)
+@blankspace(1)
+@ux<SYSINIT>
+
+@i<Parameters>@\None
+
+@i<Returns>@\None
+
+@i<Description>@\Initialize the system specific items.  No registers 
+are preserved.  Any initialization is done once only when Kermit-80 
+is first loaded.
+
+
+
+@blankspace(1)
+@ux<SYSEXIT>
+
+@i<Parameters>@\None
+
+@i<Returns>@\None
+
+@i<Description>@\Program termination.  De-initialize anything 
+in preparation for a return to CP/M
+
+
+
+@blankspace(1)
+@ux<SYSCON>
+
+@i<Parameters>@\None
+
+@i<Returns>@\None
+
+@i<Description>@\Initialize anything before entering the connect state.
+
+
+
+@blankspace(1)
+@ux<SYSCLS>
+
+@i<Parameters>@\None
+
+@i<Returns>@\None
+
+@i<Description>@\System dependent close routine when exiting connect state
+
+
+
+@blankspace(1)
+@ux<SYSINH>
+
+@i<Parameters>@\None
+
+@i<Returns>@\None
+
+@i<Description>@\Help routine to test for any extensions to the escape menu 
+during the connect state.  If a system has any special feature it 
+can use during connect mode, then it can be tested as 
+<escape-character>xxx.  This entry is a string for printing 
+to the console for an <escape-character>?  Often used for 
+generating breaks or controlling a modem.
+
+
+
+@blankspace(1)
+@ux<SYSINT>
+
+@i<Parameters>@\None
+
+@i<Returns>@\None
+
+@i<Description>@\This is a test-and-jump on receipt of an escape 
+sequence not understood by Kermit-80.  If the character in A is 
+not recognized by your version of Kermit=80, do a rskip
+
+
+
+@blankspace(1)
+@ux<SYSFLT>
+
+@i<Parameters>@\Character in E
+
+@i<Returns>@\Character in E.  Either a 00H or anything else in A
+
+@i<Description>@\Test the character in E.  If it may not be printed to 
+the console, set A to zero.  All other registers preserved.
+
+@\NB <XON>,<XOFF>,<DEL>,<NULL> are always rejected.
+
+
+@blankspace(1)
+@ux<SYSBYE>
+
+@i<Parameters>@\None
+
+@i<Returns>@\None
+
+@i<Description>@\System dependent processing for the BYE command.  (eg hang 
+up the phone)
+
+
+
+@blankspace(1)
+@ux<SYSSPD>
+
+@i<Parameters>@\Value from table in DE
+
+@i<Returns>@\None
+
+@i<Description>@\The system dependent code for baud rate change.  DE 
+contains the two byte value from the baud rate table.  This value is 
+also stored in "SPEED"
+
+
+
+@blankspace(1)
+@ux<SYSPRT>
+
+@i<Parameters>@\Value in DE
+
+@i<Returns>@\None
+
+@i<Description>@\The system dependent code for setting the port.  
+The parameters are passed in DE, which are obtained from the port tables
+
+
+
+@blankspace(1)
+@ux<SYSSCR>
+
+@i<Parameters>@\String pointer in DE
+
+@i<Returns>@\None
+
+@i<Description>@\Setup the screen display for file transfer.  The Kermit 
+version string is pointed to by DE.  If the terminal is not capable of 
+cursor addressing (eg dumb glass TTY) then only the screen is cleared 
+and the version string is printed.
+
+
+
+@blankspace(1)
+@ux<CSRPOS>
+
+@i<Parameters>@\Row number in B, column number in C
+
+@i<Returns>@\None
+
+@i<Description>@\Move the cursor to row B, column C where B=1,C=1 is top 
+LH corner of screen.  The routine should first end a "cursor 
+position" leading string (up to four characters)  then use the 
+parameters given to complete the versions cursor position function
+
+
+
+@blankspace(1)
+@ux<SYSSPC>
+
+@i<Parameters>@\None
+
+@i<Returns>@\K bytes free in HL
+
+@i<Description>@\Get the amount of free disk space on the selected disk 
+drive.  This could be in the system independent code.  Automatically 
+detects CP/M V2.2 or V3.0.  No registers saved.
+
+
+
+@blankspace(1)
+@ux<MOVER>
+
+@i<Parameters>@\Source Pointer in HL
+
+@\Destination Pointer in DE 
+
+@\Byte count in BC
+
+@i<Returns>@\None
+
+@i<Description>@\Move (BC) bytes from (HL) to (DE) Z80 based systems 
+do an LDIR, while 8080 systems do it as a loop.  All registers destroyed
+
+@blankspace(1)
+@ux<PRTSTR>
+
+@i<Parameters>@\$ terminated string pointed to by DE
+
+@i<Returns>@\None
+
+@i<Description>@\Print the string onto the console.
+@blankspace(1)
+3)
+@blankspace(1)
+@tabclear()
+@tabset(2 inches, 1.0 inches, 1.0 inches)
+
+@blankspace(1)
+@ux<PTTAB>@\WORD@\Points to VT52 equivalent escape sequences.
+
+@blankspace(1)
+@ux<SPDTAB>@\WORD@\Address of baud-rate command table, or 0 if table does 
+not exist
+
+@blankspace(1)
+@ux<SPDHLP>@\WORD@\Address of baud-rate help table, or 0 if SET SPEED 
+is not supported.  
+
+@blankspace(1)
+@ux<PRTTAB>@\WORD@\Address of port command table or 0 if SET PORT is not supported.
+
+@blankspace(1)
+@ux<PRTHLP>@\WORD@\Address of port help table or 0 if SET PORT is not supported
+
+@blankspace(1)
+@ux<TIMOUT>@\BYTE@\FUZZY-TIMER.  Set to value suitable to your 
+system (depends largely on CPU speed)
+
+@blankspace(1)
+@ux<VTFLG>@\BYTE@\VT52 emulation flag.  Set to 0 if terminal
+emulates a VT52, 01 if emulation is required, or 0FFH if emulations not
+possible (eg for "CRT")
+
+@blankspace(1)
+@ux<ESCCHR>@\BYTE@\default escape  character-usually control-] but 
+sometimes control-\
+
+@blankspace(1)
+@ux<SPEED>@\WORD@\Storage space for baud-rate.  Set to 0FFFFH as baud 
+rates are initially unknown.  Note that the STATUS routine only looks at the 
+first (least significant) byte.
+
+@blankspace(1)
+@ux<PORT>@\WORD@\Storage space for port.  Set to 0FFFFH as ports may 
+not be implemented, and is initially unknown
+
+@blankspace(1)
+@ux<PRNFLG>@\BYTE@\Printer copy flag-if O no copy.  Anything else => 
+copy to printer
+
+@blankspace(1)
+@ux<DBGFLG>@\BYTE@\Debugging flag.  If O then no debugging to be done.  
+(ie writing of debugging info during a file transfer)
+
+@blankspace(1)
+@ux<ECOFLG>@\BYTE@\Local ECHO flag (default is off)
+
+@blankspace(1)
+@ux<FLWFLG>@\BYTE@\File warning flag.  If set to 1 will not 
+overwrite files already existing on disk with some-named files 
+being transferred
+
+@blankspace(1)
+@ux<IBMFLG>@\BYTE@\IBM system is the host-assume IBM file transfers etc
+
+@blankspace(1)
+@ux<CPMFLG>@\BYTE@\Flag indicating type of CP/M files to be transferred.  
+Default setting - DEFAULT
+
+@blankspace(1)
+@ux<PARITY>@\BYTE@\Type of parity in use
+
+@\ 0 = Even parity
+
+@\ 3 = Mark parity
+
+@\ 6 = No parity (8th bit is data)
+
+@\ 9 = Odd parity
+
+@\12 = Space parity
+
+@blankspace(1)
+@ux<SPSIZ>@\BYTE@\Size of send packet
+
+@blankspace(1)
+@ux<RPSIZ>@\BYTE@\Size of receive packet
+
+@blankspace(1)
+@ux<STIME>@\BYTE@\Send timer (time-out)
+
+@blankspace(1)
+@ux<RTIME>@\BYTE@\Receive timer (time-out)
+
+@blankspace(1)
+@ux<SPAD>@\BYTE@\Send Padding (default=0)
+
+@blankspace(1)
+@ux<RPAD>@\BYTE@\Receive Padding (default=0)
+
+@blankspace(1)
+@ux<SPADCH>@\BYTE@\Send Padding character (default=NULL)
+
+@blankspace(1)
+@ux<RPADCH>@\BYTE@\Receive Padding character (default=NULC)
+
+@blankspace(1)
+@ux<SEOL>@\BYTE@\Send EOL character (default=CR)
+
+@blankspace(1)
+@ux<REOL>@\BYTE@\Receive EOL character (default=CR)
+
+@blankspace(1)
+@ux<SQUOTE>@\BYTE@\Send quote character (default=#)
+
+@blankspace(1)
+@ux<RQUOTE>@\BYTE@\Receive quote character (default=#)
+
+@blankspace(1)
+@ux<CHKTYP>@\BYTE@\Ascii value of checktype
+
+@\31H="1"=checktype1 (6bits)
+
+@\32H="2"=checktype2 (12bits)
+
+@\33H="3"=CCITT checksum (CRC)
+
+@\Default is 31H("1")
+
+@blankspace(1)
+@ux<TACFLG>@\BYTE@\If set to on (non zero) send the TACCHR twice.  This is
+for ARPA TAC users, where the TAC swallows one "wakeup" character.  If
+sent twice the TAC will pas one on and go back to normal mode.
+
+@blankspace(1)
+@ux<TACCHR>@\BYTE@\Desired TAC character.  It is ignored if TAC trapping 
+is turned off. Value to send twice if TAC interception is set on.  
+Default=0, but set to commercial AT if the conditional assembly flag TAC 
+is set true
+
+@blankspace(1)
+@ux<BUFADR>@\WORD@\Address of Multi-Sector buffering for I/O
+
+@blankspace(1)
+@ux<BUFSEC>@\BYTE@\The number of bytes the big buffers can hold.  
+Default is 1. (0=256 sectors).
+
+@blankspace(1)
+@ux<FFUSSY>@\BYTE@\Indicates if funny characters may be used in CP/M 
+file names (eg @q{<>.,;?#[]})  If zero, allow anything.  Default is nonzero.
+
+@blankspace(1)
+@ux<BMAX>
+@\SPACE:(2bytes) Highest block number on selected disk drive
+
+@blankspace(1)
+@ux<BMASK>@\SPACE:(1byte) (Records/block)-1
+
+@blankspace(1)
+@ux<BSHIFTF>@\SPACE:(1byte) Number of shifts to multiply by rec.block
+
+@blankspace(1)
+@ux<NNAMS>@\SPACE:(1byte) Counter for file-names per line
+
+@end<description>
+
+
+
+@section<Future Work>
+
+Work that needs to be done in future releases includes:
+@begin<itemize>
+Merge in support for additional CP/M-80 systems, particularly those for
+which support was recently added to the monolithic v3.x source.
+
+Break up @q<CPXSYS> into discrete source files, one for each system.
+These source files should serve as simple models for adding support for
+new systems to Kermit-80 -- only the very basic screen definitions, flags,
+i/o primitives, initializations, and so forth should appear in each
+system-@|dependent file.
+
+Addition of missing features -- compression of repeated characters during
+packet transmission, transmission of file attributes (particularly size, so
+that "percent done" can be displayed for both incoming and outbound files),
+command macros, more advanced login scripts, remote operation and server mode,
+etc etc.  Any offers??
+@end<itemize>
diff --git a/cpkerm.pdf b/cpkerm.pdf
new file mode 100644 (file)
index 0000000..d41b13c
Binary files /dev/null and b/cpkerm.pdf differ
diff --git a/cpkerm.ps b/cpkerm.ps
new file mode 100644 (file)
index 0000000..a4b33b6
--- /dev/null
+++ b/cpkerm.ps
@@ -0,0 +1,6971 @@
+%!PS-Adobe-2.0
+%%Title: cpkhdr.mss
+%%DocumentFonts: (atend)
+%%Creator: Frank da Cruz,718W,0000, and Scribe 7(1700)
+%%CreationDate: 25 May 1991 14:10
+%%Pages: (atend)
+%%EndComments
+% PostScript Prelude for Scribe.
+/BS {/SV save def 0.0 792.0 translate .01 -.01 scale} bind def
+/ES {showpage SV restore} bind def
+/SC {setrgbcolor} bind def
+/FMTX matrix def
+/RDF {WFT SLT 0.0 eq 
+  {SSZ 0.0 0.0 SSZ neg 0.0 0.0 FMTX astore}
+  {SSZ 0.0 SLT neg sin SLT cos div SSZ mul SSZ neg 0.0 0.0 FMTX astore}
+  ifelse makefont setfont} bind def
+/SLT 0.0 def
+/SI { /SLT exch cvr def RDF} bind def
+/WFT /Courier findfont def
+/SF { /WFT exch findfont def RDF} bind def
+/SSZ 1000.0 def
+/SS { /SSZ exch 100.0 mul def RDF} bind def
+/AF { /WFT exch findfont def /SSZ exch 100.0 mul def RDF} bind def
+/MT /moveto load def
+/XM {currentpoint exch pop moveto} bind def
+/UL {gsave newpath moveto dup 2.0 div 0.0 exch rmoveto
+   setlinewidth 0.0 rlineto stroke grestore} bind def
+/LH {gsave newpath moveto setlinewidth
+   0.0 rlineto
+   gsave stroke grestore} bind def
+/LV {gsave newpath moveto setlinewidth
+   0.0 exch rlineto
+   gsave stroke grestore} bind def
+/BX {gsave newpath moveto setlinewidth
+   exch
+   dup 0.0 rlineto
+   exch 0.0 exch neg rlineto
+   neg 0.0 rlineto
+   closepath
+   gsave stroke grestore} bind def
+/BX1 {grestore} bind def
+/BX2 {setlinewidth 1 setgray stroke grestore} bind def
+/PB {/PV save def newpath translate
+    100.0 -100.0 scale pop /showpage {} def} bind def
+/PE {PV restore} bind def
+/GB {/PV save def newpath translate rotate
+    div dup scale 100.0 -100.0 scale /showpage {} def} bind def
+/GE {PV restore} bind def
+/FB {dict dup /FontMapDict exch def begin} bind def
+/FM {cvn exch cvn exch def} bind def
+/FE {end /original-findfont /findfont load def  /findfont
+   {dup FontMapDict exch known{FontMapDict exch get} if
+   original-findfont} def} bind def
+/BC {gsave moveto dup 0 exch rlineto exch 0 rlineto neg 0 exch rlineto closepath clip} bind def
+/EC /grestore load def
+/SH /show load def
+/MX {exch show 0.0 rmoveto} bind def
+/W {0 32 4 -1 roll widthshow} bind def
+/WX {0 32 5 -1 roll widthshow 0.0 rmoveto} bind def
+/RC {100.0 -100.0 scale
+612.0 0.0 translate
+-90.0 rotate
+.01 -.01 scale} bind def
+/URC {100.0 -100.0 scale
+90.0 rotate
+-612.0 0.0 translate
+.01 -.01 scale} bind def
+/RCC {100.0 -100.0 scale
+0.0 -792.0 translate 90.0 rotate
+.01 -.01 scale} bind def
+/URCC {100.0 -100.0 scale
+-90.0 rotate 0.0 792.0 translate
+.01 -.01 scale} bind def
+%%EndProlog
+%%Page: 0 1
+BS
+0 SI
+15 /Times-Bold AF
+15510 28325 MT
+(CP/M-80 KERMIT VERSION 4.11 USER GUIDE)SH
+10 /Times-Roman AF
+29402 32237 MT
+(C. Gianone)SH
+20860 34629 MT
+(Columbia University Center for Computing Activities)SH
+25862 35825 MT
+(New York, New York 10027)SH
+/Times-Italic SF
+28777 39413 MT
+(April 23, 1991)SH
+/Times-Roman SF
+26610 44197 MT
+(Copyright \050C\051 1981,1991)SH
+20111 45393 MT
+(Trustees of Columbia University in the City of New York)SH
+/Times-Italic SF
+18429 47785 MT
+(Permission is granted to any individual or institution to use, copy,)SH
+18178 48981 MT
+(or redistribute this document so long as it is not sold for profit, and)SH
+23291 50177 MT
+(provided this copyright notice is retained.)SH
+ES
+%%Page: 1 2
+BS
+0 SI
+12 /Times-Bold AF
+8280 4404 MT
+(1. CP/M-80 KERMIT)SH
+10 /Times-Italic AF
+52275 XM
+(Page 1)SH
+46800 50 8280 5709 UL
+16 /Times-Bold AF
+8280 8272 MT
+(1. CP/M-80 KERMIT)SH
+10 /Times-Italic AF
+8280 10566 MT
+(Program:)SH
+/Times-Roman SF
+14280 XM
+(Mike Freeman, Bonneville Power Administration, Vancouver, WA, USA,)
+139 W( with contributions from)138 W
+14280 11671 MT
+(many others.)SH
+/Times-Italic SF
+8280 13881 MT
+(Language:)SH
+/Times-Roman SF
+14280 XM
+(8080 Assembler, LASM, M80, or MAC80)SH
+/Times-Italic SF
+8280 16091 MT
+(Version:)SH
+/Courier SF
+14280 XM
+(4.11)SH
+/Times-Italic SF
+8280 18301 MT
+(Date:)SH
+/Times-Roman SF
+14280 XM
+(April 1, 1991)SH
+/Times-Italic SF
+8280 20511 MT
+(Documentation:)SH
+/Times-Roman SF
+15279 XM
+(Christine Gianone, Columbia University, with contributions from many others.)SH
+/Times-Italic SF
+8280 22903 MT
+(KERMIT-80 Capabilities At A Glance:)SH
+/Times-Roman SF
+9280 24513 MT
+(Local operation:)SH
+34480 XM
+(Yes)SH
+9280 25618 MT
+(Remote operation:)SH
+34480 XM
+(Partial, Auto-receive only)SH
+9280 26723 MT
+(Login scipts:)SH
+34480 XM
+(Yes, limited)SH
+9280 27828 MT
+(Transfer text files:)SH
+34480 XM
+(Yes)SH
+9280 28933 MT
+(Transfer binary files:)SH
+34480 XM
+(Yes)SH
+9280 30038 MT
+(Wildcard send:)SH
+34480 XM
+(Yes)SH
+9280 31143 MT
+(File transfer interruption:)SH
+34480 XM
+(Yes)SH
+9280 32248 MT
+(Filename collision avoidance:)SH
+34480 XM
+(Yes)SH
+9280 33353 MT
+(Can time out:)SH
+34480 XM
+(Yes)SH
+9280 34458 MT
+(8th-bit prefixing:)SH
+34480 XM
+(Yes)SH
+9280 35563 MT
+(Repeat count prefixing:)SH
+34480 XM
+(No)SH
+9280 36668 MT
+(Alternate block checks:)SH
+34480 XM
+(Yes)SH
+9280 37773 MT
+(Terminal emulation:)SH
+34480 XM
+(Yes, VT52 and others)SH
+9280 38878 MT
+(Communication settings:)SH
+34480 XM
+(Yes)SH
+9280 39983 MT
+(Support for dial-out modems:)SH
+34480 XM
+(No)SH
+9280 41088 MT
+(Transmit BREAK:)SH
+34480 XM
+(Yes; most versions)SH
+9280 42193 MT
+(IBM communication:)SH
+34480 XM
+(Yes)SH
+9280 43298 MT
+(Transaction logging:)SH
+34480 XM
+(No)SH
+9280 44403 MT
+(Debug logging:)SH
+34480 XM
+(No)SH
+9280 45508 MT
+(Session logging:)SH
+34480 XM
+(Yes)SH
+9280 46613 MT
+(Raw file transmit:)SH
+34480 XM
+(Yes)SH
+9280 47718 MT
+(Act as server:)SH
+34480 XM
+(No)SH
+9280 48823 MT
+(Talk to server:)SH
+34480 XM
+(Yes)SH
+9280 49928 MT
+(Advanced commands for servers:)SH
+34480 XM
+(Yes)SH
+9280 51033 MT
+(Command/init files:)SH
+34480 XM
+(Yes)SH
+9280 52138 MT
+(Command macros:)SH
+34480 XM
+(No)SH
+9280 53243 MT
+(Local file management:)SH
+34480 XM
+(Yes)SH
+9280 54348 MT
+(Handle file attributes:)SH
+34480 XM
+(No)SH
+9280 55453 MT
+(Long packets:)SH
+34480 XM
+(No)SH
+9280 56558 MT
+(International Character Sets:)SH
+34480 XM
+(No)SH
+9280 57663 MT
+(Sliding Windows:)SH
+34480 XM
+(No)SH
+9280 58768 MT
+(Printer control:)SH
+34480 XM
+(Yes, limited)SH
+14 /Times-Bold AF
+8280 62370 MT
+(1.1. Credits)SH
+10 /Times-Roman AF
+8280 64488 MT
+(CP/M Kermit is the first)
+170 W( of all the Kermit programs.  It was originally written by Bill Catchings of Columbia)171 W
+8280 65684 MT
+(University in 1981.)
+119 W( Over)
+486 W( the years, contributions have been added by many people, including Charles Carvalho)118 W
+8280 66880 MT
+(\050ACC\051, Bernie Eiben \050DEC\051, Nick Bush \050Stevens Institute of Technology\051, John Bray)
+109 W( \050University of Tennessee\051,)110 W
+8280 68076 MT
+(Bruce Tanner \050Cerritos College\051, Greg Small \050University)
+99 W( of California at Berkeley\051, Kimmo Laaksonen \050Helskini)98 W
+8280 69272 MT
+(University of Technology\051, Bertil Schou \050Loughborough)
+391 W( University\051, Jon Warbrick \050Plymouth Polytechnic)392 W
+8280 70468 MT
+(University\051, Brian Robertson \050Aberdeen University\051, A.J. Cole)
+99 W( \050Leeds University\051, John Shearwood \050Birmingham)98 W
+8280 71664 MT
+(University\051, Tony Addyman \050Salford University\051,)
+180 W( Godfrey Nix and Martin Carter \050Nottingham University\051, Ian)181 W
+ES
+%%Page: 2 3
+BS
+0 SI
+10 /Times-Italic AF
+6120 4404 MT
+(Page 2)SH
+12 /Times-Bold AF
+30586 XM
+(Kermit User Guide: CP/M-80 KERMIT 1.1)SH
+46800 50 6120 5709 UL
+10 /Times-Roman AF
+6120 7886 MT
+(Young \050Edinburgh University\051, Chris Miles \050Manchester University\051,)
+144 W( Richard Russell, Dave Roberts, and many,)143 W
+6120 9082 MT
+(many others.)SH
+6120 11474 MT
+(Version 4.11 is the work of Mike Freeman of the Bonneville Power Administration in Vancouver, WA, USA, with)49 W
+6120 12670 MT
+(assistance from Russell Lang of Monash University in Australia, Jay S Rouman of Mt Pleasant MI, and others.)SH
+14 /Times-Bold AF
+6120 16272 MT
+(1.2. What's New)SH
+10 /Times-Roman AF
+6120 18390 MT
+(Features added since version 4.09 include:)SH
+/Symbol SF
+7910 20295 MT
+(\267)SH
+/Times-Roman SF
+8620 XM
+(SET COLLISION {BACKUP/DISCARD/OVERWRITE/RENAME})SH
+/Symbol SF
+7910 22284 MT
+(\267)SH
+/Times-Roman SF
+8620 XM
+(SET INCOMPLETE-FILES {DISCARD/KEEP})SH
+/Symbol SF
+7910 24273 MT
+(\267)SH
+/Times-Roman SF
+8620 XM
+(Many REMOTE commands, including some REMOTE SET commands)SH
+/Symbol SF
+7910 26262 MT
+(\267)SH
+/Times-Roman SF
+8620 XM
+(RENAME command to rename CP/M files from within Kermit-80)SH
+/Symbol SF
+7910 28251 MT
+(\267)SH
+/Times-Roman SF
+8620 XM
+(SET RECEIVE/SEND PACKET-LENGTH nn \050nn <= 94\051)SH
+/Symbol SF
+7910 30240 MT
+(\267)SH
+/Times-Roman SF
+8620 XM
+(SET AUTORECEIVE)
+122 W( ON now implies that Kermit-80 ALWAYS tries to receive more files when a)121 W
+8620 31345 MT
+(RECEIVE transaction has completed.  The user can cancel with ^C.)SH
+/Symbol SF
+7910 33334 MT
+(\267)SH
+/Times-Roman SF
+8620 XM
+(QUIT is now a synonym for EXIT.)SH
+/Symbol SF
+7910 35323 MT
+(\267)SH
+/Times-Roman SF
+8620 XM
+(STAY is now a synonym for SET NO-EXIT.)SH
+/Symbol SF
+7910 37312 MT
+(\267)SH
+/Times-Roman SF
+8620 XM
+(CONNECT, RECEIVE and SEND may be abbreviated to C, R and S, respectively.)SH
+/Symbol SF
+7910 39301 MT
+(\267)SH
+/Times-Roman SF
+8620 XM
+(Cancellation of TAKE, TYPE, and PRINT commands from the keyboard.)SH
+/Symbol SF
+7910 41290 MT
+(\267)SH
+/Times-Roman SF
+8620 XM
+(Many bug fixes.)SH
+/Symbol SF
+7910 43279 MT
+(\267)SH
+/Times-Roman SF
+8620 XM
+(Kermit-80 Version 4.11 now supports the Microbee family)
+67 W( of computers \05056K, 64K, 128K and 256K\051)68 W
+8620 44384 MT
+(manufactured by Microbee Systems, Ltd, of Australia.)SH
+/Symbol SF
+7910 46373 MT
+(\267)SH
+/Times-Roman SF
+8620 XM
+(Kermit-80 now supports the Ampro Little Board system.)SH
+14 /Times-Bold AF
+6120 49975 MT
+(1.3. Overview of Kermit Operation)SH
+10 /Times-Roman AF
+6120 52093 MT
+(Use the SET command to)
+210 W( establish necessary communication parameters like SPEED and PARITY.  Use the)209 W
+6120 53289 MT
+(CONNECT to establish a terminal connection to the remote computer.  If you are dialing out with a modem, type)76 W
+6120 54485 MT
+(the necessary dialing commands to the modem first.  The dialing process can be automated to some extent)
+63 W( using a)62 W
+6120 55681 MT
+(TAKE command)
+17 W( file containing INPUT, OUTPUT, and PAUSE commands.  Then log in to the remote computer or)18 W
+6120 56877 MT
+(service and conduct a session.)SH
+6120 59269 MT
+(To transfer a text file, start the Kermit)
+137 W( program on the remote computer and tell it to SEND the desired file \050if)136 W
+6120 60465 MT
+(uploading\051 or to)
+49 W( RECEIVE \050if downloading\051.  "Escape back" to CP/M Kermit, usually by typing Ctrl-] \050hold down)50 W
+6120 61661 MT
+(the Control key and press the right bracket key\051 and then)
+181 W( type the letter C. At the CP/M Kermit prompt type)180 W
+6120 62857 MT
+(RECEIVE \050if you gave a SEND command to the remote Kermit\051 or SEND)3 W
+/Times-Italic SF
+36349 XM
+(filename)SH
+/Times-Roman SF
+40046 XM
+(\050if you gave a)
+3 W( receive command)4 W
+6120 64053 MT
+(to the remote Kermit\051.)SH
+6120 66445 MT
+(To transfer a binary file, give the command)
+13 W( SET FILE TYPE BINARY to the remote Kermit and SET FILE-MODE)12 W
+6120 67641 MT
+(BINARY to CP/M Kermit before issuing any SEND or RECEIVE commands.)SH
+6120 70033 MT
+(Multiple files of the same type \050text or binary\051)
+107 W( can be transferred in a single operation using "wildcard notation")108 W
+6120 71229 MT
+(\050including special characters like asterisk in the filename\051.)SH
+ES
+%%Page: 3 4
+BS
+0 SI
+12 /Times-Bold AF
+8280 4404 MT
+(1.3. Overview of Kermit Operation)SH
+10 /Times-Italic AF
+52275 XM
+(Page 3)SH
+46800 50 8280 5709 UL
+/Times-Roman SF
+8280 7886 MT
+(When file transfer is complete, CONNECT back to the remote computer, use the)
+73 W( EXIT command to exit from the)72 W
+8280 9082 MT
+(remote Kermit program, finish your work on the remote computer, log out from it, escape back to)
+111 W( CP/M Kermit)112 W
+8280 10278 MT
+(again, and EXIT from CP/M Kermit.)SH
+8280 12670 MT
+(The remote Kermit may also be put into "server)
+57 W( mode" to simplify these operations.  Give the SERVER command)56 W
+8280 13866 MT
+(to the remote Kermit, escape back to CP/M Kermit, and)
+89 W( then issue SEND commands to send files \050upload\051, GET)90 W
+/Times-Italic SF
+8280 15062 MT
+(filename)SH
+/Times-Roman SF
+12233 XM
+(commands to receive \050download\051 files, REMOTE commands to request)
+259 W( various other services \050like)258 W
+8280 16258 MT
+(directory listings\051 from the remote Kermit.  When you are)
+103 W( done, give a BYE command to terminate your remote)104 W
+8280 17454 MT
+(session, or)
+87 W( a FINISH command to tell the remote Kermit to return to its prompt so you can CONNECT back and)86 W
+8280 18650 MT
+(conduct further business.)SH
+8280 21042 MT
+(That's all there is to it.)SH
+14 /Times-Bold AF
+8280 24644 MT
+(1.4. Summary of CP/M)SH
+10 /Times-Roman AF
+8280 26762 MT
+(There are essentially two versions of CP/M - Versions 2.2 and 3.0 \050sometimes also called CP/M PLUS.\051)SH
+8280 29154 MT
+(CP/M-80 Version 2)95 W
+/Courier SF
+(.)SH
+/Times-Roman SF
+(2 is run in)
+95 W( a single 64 Kbyte "page", usually the largest amount of memory on Z80 or 8080)96 W
+8280 30350 MT
+(systems. The)
+682 W( BIOS \050Basic input/output system\051, BDOS \050Basic Disk Operating System\051 and)
+216 W( CCP \050Command)215 W
+8280 31546 MT
+(console processor\051 all share memory with)
+58 W( any transient program the user may wish to run.  Some basic commands)59 W
+8280 32742 MT
+(are available through the)
+38 W( CCP, like DIR, ERA etc,while others are loaded from disk into the transient program area)37 W
+8280 33938 MT
+(and run as a program, like PIP or STAT.)SH
+8280 36330 MT
+(CP/M Version 3)33 W
+/Courier SF
+(.)SH
+/Times-Roman SF
+(0 \050or CP/M PLUS\051 effectively removes the requirement of having the CCP and)
+33 W( BDOS along with)34 W
+8280 37526 MT
+(a chunk of the)
+54 W( BIOS code being resident in the single 64k byte page of memory.  This allows even more space for)53 W
+8280 38722 MT
+(programs in the)
+20 W( TPA, but still a little less than the maximum of 64k.  It is substantially different from CP/M version)21 W
+8280 39918 MT
+(2)SH
+/Courier SF
+(.)SH
+/Times-Roman SF
+(2, with lots of added features.  Kermit-80)
+239 W( uses very few additional version 3)238 W
+/Courier SF
+(.)SH
+/Times-Roman SF
+(0 features, and only where)238 W
+8280 41114 MT
+(absolutely necessary.)SH
+8280 43506 MT
+(CP/M file specifications are of the form)SH
+/Courier SF
+24472 XM
+(DEV:XXXXXXXX.YYY)SH
+/Times-Roman SF
+(, where)SH
+/Courier SF
+8280 45297 MT
+(DEV:)SH
+/Times-Roman SF
+16280 XM
+(is a)125 W
+/Times-Italic SF
+18141 XM
+(device name)125 W
+/Times-Roman SF
+(, normally the A:)
+125 W( or)
+SH( B:)
+125 W( floppy.)
+SH( If)
+500 W( omitted, the device name defaults to your)125 W
+16280 46402 MT
+(connected diskette.)SH
+/Courier SF
+8280 47979 MT
+(XXXXXXXX)SH
+/Times-Roman SF
+16280 XM
+(is a)SH
+/Times-Italic SF
+17891 XM
+(filename)SH
+/Times-Roman SF
+21585 XM
+(of up to 8 characters.)SH
+/Courier SF
+8280 49556 MT
+(YYY)SH
+/Times-Roman SF
+16280 XM
+(is the)SH
+/Times-Italic SF
+18669 XM
+(file type)SH
+/Times-Roman SF
+(, up to 3 characters.)SH
+8280 51347 MT
+(File names and file types may contain letters, digits, and some special characters, including dash, dollar)
+90 W( sign, and)89 W
+8280 52543 MT
+(underscore, but no imbedded spaces.  Upper and lower case letters are equivalent.)SH
+8280 54935 MT
+("Wildcard" file-group specifications are)
+30 W( permitted in file names and file types \050but not device names\051 within certain)31 W
+8280 56131 MT
+(contexts; a ")134 W
+/Courier SF
+(*)SH
+/Times-Roman SF
+(" matches a whole field, a ")134 W
+/Courier SF
+(?)SH
+/Times-Roman SF
+(" matches)
+518 W( a single character, including space.)
+134 W( Examples:)
+517 W( ")133 W
+/Courier SF
+(*.F??)SH
+/Times-Roman SF
+(")SH
+8280 57327 MT
+(specifies all files whose)24 W
+/Times-Italic SF
+18152 XM
+(types)SH
+/Times-Roman SF
+20481 XM
+(start with F and are 1, 2, or 3 characters long; ")24 W
+/Courier SF
+(F?.*)SH
+/Times-Roman SF
+(" specifies all files whose names)25 W
+8280 58523 MT
+(start with F and are no more than two characters long \050before the trailing spaces\051.)SH
+8280 60915 MT
+(The five CP/M commands are:)SH
+8280 62706 MT
+(DIR)SH
+/Times-Italic SF
+10252 XM
+(file)SH
+/Times-Roman SF
+16280 XM
+(Lists the the names of)
+165 W( the specified files.  The default file specification is "*.*".  Example:)164 W
+16280 63811 MT
+(")SH
+/Courier SF
+(DIR B:*.FOR)SH
+/Times-Roman SF
+(".)SH
+8280 65388 MT
+(ERA)SH
+/Times-Italic SF
+10530 XM
+(file)SH
+/Times-Roman SF
+16280 XM
+(Erases \050deletes\051 the specified file\050s\051; wildcards allowed.)SH
+8280 66965 MT
+(REN)SH
+/Times-Italic SF
+10530 XM
+(new old)SH
+/Times-Roman SF
+16280 XM
+(Changes the name of a file from)SH
+/Times-Italic SF
+29416 XM
+(old)SH
+/Times-Roman SF
+30944 XM
+(to)SH
+/Times-Italic SF
+31972 XM
+(new)SH
+/Times-Roman SF
+(, e.g.)SH
+16280 68070 MT
+(")SH
+/Courier SF
+(REN NEW.FOR=OLD.FOR)SH
+/Times-Roman SF
+(".)SH
+8280 69647 MT
+(SAVE)SH
+16280 XM
+(Saves the specified number of memory blocks into a file.  \050Not on CP/M Plus systems\051)SH
+8280 71224 MT
+(TYPE)SH
+/Times-Italic SF
+11030 XM
+(file)SH
+/Times-Roman SF
+16280 XM
+(Types the specified file on the screen, e.g.  ")SH
+/Courier SF
+(TYPE FOO.TXT)SH
+/Times-Roman SF
+(".)SH
+ES
+%%Page: 4 5
+BS
+0 SI
+10 /Times-Italic AF
+6120 4404 MT
+(Page 4)SH
+12 /Times-Bold AF
+30586 XM
+(Kermit User Guide: CP/M-80 KERMIT 1.4)SH
+46800 50 6120 5709 UL
+10 /Times-Roman AF
+6120 7886 MT
+(The most important programs are:)SH
+6120 9677 MT
+(STAT)SH
+14120 XM
+(Gives statistics on disk usage; sets and displays IOBYTE.  \050Not on CP/M Plus systems\051)SH
+6120 11254 MT
+(PIP)SH
+14120 XM
+(Peripheral Interchange)
+51 W( Program.  Copies files.  In response to the ")52 W
+/Courier SF
+(*)SH
+/Times-Roman SF
+(" prompt, give a command)52 W
+556 50 14120 11454 UL
+333 50 18531 11454 UL
+556 50 23553 11454 UL
+14120 12359 MT
+(of the form)SH
+/Courier SF
+16520 14014 MT
+(disk:outfile=disk:infile)SH
+/Times-Roman SF
+14120 15731 MT
+(Wildcards \050")71 W
+/Courier SF
+(*)SH
+/Times-Roman SF
+(" for a whole field or ")71 W
+/Courier SF
+(?)SH
+/Times-Roman SF
+(" for)
+392 W( a letter\051 can be used.  Examples:)
+71 W( ")70 W
+/Courier SF
+(A:=B:*.*)SH
+/Times-Roman SF
+(" to)70 W
+14120 16836 MT
+(copy a whole disk, ")56 W
+/Courier SF
+(A:=B:*.FOR)SH
+/Times-Roman SF
+(" to copy all the Fortran programs)
+56 W( from disk B to disk A. If)57 W
+14120 17941 MT
+(the disk specification is omitted, your "connected" disk is assumed.  Command line arguments)78 W
+14120 19046 MT
+(are also accepted, e.g. ")SH
+/Courier SF
+(PIP A:=B:*.*)SH
+/Times-Roman SF
+(".)SH
+6120 21438 MT
+(There are equivalent commands for CP/M Version 3.0, but are not loaded into memory in the same)
+4 W( way as for CP/M)5 W
+6120 22634 MT
+(Version 2.2.  For further information on CP/M, consult your microcomputer manual or a CP/M handbook.)SH
+14 /Times-Bold AF
+6120 26236 MT
+(1.5. Kermit-80 Description)SH
+10 /Times-Roman AF
+6120 28354 MT
+(Since Kermit-80 runs on a standalone micro, it is always in control of the screen --)
+47 W( it is always in ")46 W
+/Times-Italic SF
+(local)SH
+/Times-Roman SF
+48837 XM
+(mode". It)342 W
+6120 29550 MT
+(includes a terminal emulator for establishing)
+42 W( a connection to a remote computer or service, and during file transfer,)43 W
+6120 30746 MT
+(it keeps the screen updated with the file name and the packet number, whether sending or receiving.)SH
+6120 33138 MT
+(Kermit-80 is)
+12 W( capable of an imprecise or "fuzzy" timeout on an input request, and can break deadlocks automatically.)11 W
+6120 34334 MT
+(In most cases, this is not important, because the Kermit program on)
+55 W( the other side is most likely able to handle the)56 W
+6120 35530 MT
+(timeouts. The)
+372 W( timeouts)
+61 W( done by Kermit-80 are fuzzy because they depend on the speed of the processor and other)60 W
+6120 36726 MT
+(factors that can vary from system to system.)SH
+6120 39118 MT
+(If, despite the timeout capability, the transmission appears to be stuck \050and you)
+26 W( can tell that this has happened if the)27 W
+6120 40314 MT
+(screen fails to change for a while\051 you can type carriage return to have the micro do what it would)
+56 W( have done on a)55 W
+6120 41510 MT
+(timeout, namely NAK the expected packet to cause theforeign host to send it again \050or, if the micro is sending,)
+75 W( to)76 W
+6120 42706 MT
+(retransmit the last packet\051.  Micro/micro or micro/IBM-mainframe)
+207 W( transfers could require this kind of manual)206 W
+6120 43902 MT
+(intervention.)SH
+6120 46294 MT
+(File transfers may be interrupted in several ways.)SH
+6120 48085 MT
+(Control-C)SH
+14120 XM
+(This will return you to Kermit-80 command level immediately, so that you can)
+46 W( connect back to)47 W
+14120 49190 MT
+(the remote system, or take any other desired action.)SH
+6120 50767 MT
+(Control-X)SH
+14120 XM
+(When sending a file, this will)
+182 W( terminate the sending of the current file with a signal to the)181 W
+14120 51872 MT
+(KERMIT on the other side to discard what it got so far.  If there are more files to be sent,)157 W
+14120 52977 MT
+(KERMIT-80 will go on to)
+53 W( the next one.  When receiving a file, KERMIT-80 will send a signal)52 W
+14120 54082 MT
+(to the remote KERMIT to stop sending this file.  If the remote KERMIT understands this)
+31 W( signal)32 W
+14120 55187 MT
+(\050not all implementations of KERMIT do\051, it will comply, otherwise the file will keep coming.)91 W
+14120 56292 MT
+(In any case, the remote KERMIT will go on to the next file in the group, if any.)SH
+6120 57869 MT
+(Control-Z)SH
+14120 XM
+(Like Control-X, except if a file)
+39 W( group is being transmitted, this will stop the transmission of the)40 W
+14120 58974 MT
+(entire group.  If only a single file is being transmitted, it works exactly like Control-X.)SH
+6120 60551 MT
+(Carriage Return)SH
+14120 XM
+(If you type a carriage return Kermit-80 will resend the current packet.  You)
+233 W( may do this)232 W
+14120 61656 MT
+(repeatedly, up to the)
+142 W( packet retry limit \050somewhere between 5 and 16 times\051 for a particular)143 W
+14120 62761 MT
+(packet.)SH
+ES
+%%Page: 5 6
+BS
+0 SI
+12 /Times-Bold AF
+8280 4404 MT
+(1.5. Kermit-80 Description)SH
+10 /Times-Italic AF
+52275 XM
+(Page 5)SH
+46800 50 8280 5709 UL
+13 /Times-Bold AF
+25451 8071 MT
+(Kermit-80 Commands)SH
+10 /Times-Roman AF
+8280 10444 MT
+(Kermit-80 is an interactive program.  It issues a prompt, you type a command.  The process repeats until you)
+64 W( give)63 W
+8280 11640 MT
+(the EXIT command to leave the program.)SH
+8280 14032 MT
+(Commands consist of keywords, filenames, and numbers.  Keywords)
+190 W( may be abbreviated to minumum unique)191 W
+8280 15228 MT
+(length. "?")
+296 W( may be typed to request a menu of the available options)
+23 W( for the current field at any point in a command.)22 W
+8280 16424 MT
+(ESC may be typed at any point in a command to fill out the current keyword or filename;)
+93 W( if sufficient characters)94 W
+8280 17620 MT
+(have not been typed to identify the current field uniquely, Kermit-80 will)
+75 W( sound a beep and allow you to continue)74 W
+8280 18816 MT
+(from that point.  Here are Kermit-80's commands:)SH
+8280 20607 MT
+(BREAK)SH
+12280 XM
+(Send a BREAK)
+144 W( condition to the remote computer.  This is only possible if your system is capable of)145 W
+12280 21712 MT
+(sending breaks.  It is intended to be used with PAUSE, OUTPUT, etc and)
+136 W( the TAKE command to do)135 W
+12280 22817 MT
+(wierd and wonderful things, like automatic logging on to a remote host.)SH
+8280 24394 MT
+(BYE)SH
+12280 XM
+(When talking to a remote Kermit Server, this command shuts down the server)
+103 W( and logs it out, and also)104 W
+12280 25499 MT
+(exits from Kermit-80 to CP/M command level.)SH
+8280 27076 MT
+(CONNECT)SH
+12280 28181 MT
+(Establish a terminal connection to the computer, service, or)
+135 W( device that is connected to the serial port,)136 W
+12280 29286 MT
+(i.e. pass)
+SH( all typein to the serial port)
+34 W( and display all input from the serial port on the screen.  Also, emulate)33 W
+12280 30391 MT
+(a DEC VT52 to allow)
+62 W( cursor control, screen clearing, etc., if VT52-EMULATION is ON \050see below\051, in)63 W
+12280 31496 MT
+(which case you should also set your terminal type on the remote host to VT52.)
+68 W( \050Some)
+385 W( versions emulate)67 W
+12280 32601 MT
+(other terminals.\051  The CONNECT command may be abbreviated by the single letter C.)SH
+12280 34178 MT
+(Warning: VT52 emulation is only successful if your system or its attached terminal can do the same)
+62 W( sort)63 W
+12280 35283 MT
+(of functions as)
+47 W( a genuine VT52.  Things to beware of are cursor addressing, clear to end of page and end)46 W
+12280 36388 MT
+(of line, clear screen, home)
+192 W( cursor, and clear-and-home functions.  The useability of VT52 emulation)193 W
+12280 37493 MT
+(depends entirely on how many of the VT52 functions can be emulated by your micro or terminal.)SH
+12280 39070 MT
+(The escape)
+103 W( character differs from micro to micro; when you issue the CONNECT command, the micro)102 W
+12280 40175 MT
+(will print)
+40 W( a message telling you how to get back.  The escape sequence is generally an uncommonly-used)41 W
+12280 41280 MT
+(control character, like CTRL-backslash or CTRL-rightbracket, followed by a single letter "command":)SH
+12280 43071 MT
+(C)SH
+14280 XM
+(Close Connection, return to)SH
+/Courier SF
+25585 XM
+(Kermit-80>)SH
+/Times-Roman SF
+31835 XM
+(command level.)SH
+12280 44176 MT
+(S)SH
+14280 XM
+(Display Status of connection, but maintain remote connection.)SH
+/Courier SF
+12280 45281 MT
+(?)SH
+/Times-Roman SF
+14280 XM
+(List available single-character commands.)SH
+12280 46386 MT
+(0)SH
+14280 XM
+(\050zero\051 Send a null \0500\051 character.)SH
+12280 47491 MT
+(B)SH
+14280 XM
+(Send a BREAK signal.  Most systems provide this function.)SH
+12280 48596 MT
+(D)SH
+14280 XM
+(Drop the line.  Used on)
+51 W( the Apple with modem.  Automatically closes the connection after dropping)50 W
+14280 49701 MT
+(the line.  The TORCH system acknowledges this command but does nothing.)SH
+12280 50806 MT
+(P)SH
+14280 XM
+(Toggle printer on or off.  Allows you to copy whatever goes to the screen to the printer.)SH
+12280 51911 MT
+(S)SH
+14280 XM
+(Temporarily suspend logging to the log file.)SH
+12280 53016 MT
+(Q)SH
+14280 XM
+(Restart logging to the log file)SH
+/Courier SF
+12280 54121 MT
+(^])SH
+/Times-Roman SF
+14280 XM
+(\050or whatever - a second copy of the escape character\051 Send the escape character itself)
+69 W( to the remote)70 W
+14280 55226 MT
+(host.)SH
+8280 57017 MT
+(COPY)SH
+/Times-Italic SF
+11197 XM
+(source destination)SH
+/Times-Roman SF
+12280 58122 MT
+(Copy a named file to another file, either on the same drive or another drive.)SH
+8280 59699 MT
+(DIRECTORY)SH
+12280 60804 MT
+(This provides a directory listing of the specified files.)
+27 W( If)
+303 W( no files are specified, all files on the default disk)26 W
+12280 61909 MT
+(are listed.  File sizes, in K, are included.  You may interrupt the listing)
+1 W( at any time by typing any character.)2 W
+12280 63014 MT
+(The listing \050even if interrupted\051 concludes with a display of the amount of free storage left)
+99 W( on the disk.)98 W
+12280 64119 MT
+(You can inhibit the display of file sizes by SET DIRECTORY OFF.)SH
+8280 65696 MT
+(ERASE)SH
+/Times-Italic SF
+11697 XM
+(filespec)SH
+/Times-Roman SF
+12280 66801 MT
+(This executes the CP/M ERA command on the specified file\050s\051.  The names of the files being erased)
+65 W( are)64 W
+12280 67906 MT
+(not displayed.)SH
+8280 69483 MT
+(EXIT)SH
+12280 XM
+(Quit back to CP/M.  The return is made by a JMP 0 \050Warmstart\051.  QUIT is a synonym for EXIT.)SH
+8280 71060 MT
+(FINISH)SH
+12280 XM
+(Like LOGOUT, but shuts down the remote server)
+199 W( without logging it out.  Leaves you at Kermit-80)200 W
+ES
+%%Page: 6 7
+BS
+0 SI
+10 /Times-Italic AF
+6120 4404 MT
+(Page 6)SH
+12 /Times-Bold AF
+30586 XM
+(Kermit User Guide: CP/M-80 KERMIT 1.5)SH
+46800 50 6120 5709 UL
+10 /Times-Roman AF
+10120 7886 MT
+(command level; subsequent CONNECT commands will put you back at host system command level.)SH
+6120 9463 MT
+(GET)SH
+/Times-Italic SF
+8314 XM
+(filespec)SH
+/Times-Roman SF
+11619 XM
+([)SH
+/Times-Italic SF
+(local_filespec)SH
+/Times-Roman SF
+(])SH
+10120 10568 MT
+(When Kermit-80 is talking)
+67 W( to a Kermit Server on the host, you should use the GET command to request)68 W
+10120 11673 MT
+(the server to send files to you, for example:)SH
+/Courier SF
+12520 13328 MT
+(get hlp:k*.hlp)SH
+/Times-Roman SF
+10120 15045 MT
+(You may specify a local filename)
+264 W( if you want to save the remote file under a different filename.)263 W
+10120 16150 MT
+(Limitation: If you request an alternate block check type using)
+194 W( the SET BLOCK command, the GET)195 W
+10120 17255 MT
+(command will not communicate it to the remote server.  If you want to have)
+7 W( type 2 or 3 block checks done)6 W
+10120 18360 MT
+(when getting files from the server, you have to issue)
+11 W( the appropriate SET BLOCK command to the remote)12 W
+10120 19465 MT
+(KERMIT before putting it in server mode.)SH
+6120 21042 MT
+(HELP)SH
+10120 XM
+(List all these commands,)
+27 W( with a short description on what the commands do.  A question mark will do the)26 W
+10120 22147 MT
+(same. If)
+408 W( you have already typed a command but do not know)
+79 W( what the parameters are, type a space \050to)80 W
+10120 23252 MT
+(indicate the end of the command\051 and a question mark.)
+43 W( You)
+335 W( will be informed of what Kermit can expect)42 W
+10120 24357 MT
+(at that stage.)SH
+6120 25934 MT
+(INPUT)SH
+/Times-Italic SF
+9314 XM
+(seconds text)SH
+/Times-Roman SF
+10120 27039 MT
+(Setup a text)
+55 W( line and time delay for your CP/M system to expect from the host, then wait up to the given)54 W
+10120 28144 MT
+(number of seconds \050approximately\051 for text to be sent to your CP/M-80 system.)SH
+6120 29721 MT
+(LOG)SH
+/Times-Italic SF
+8425 XM
+(filespec)SH
+/Times-Roman SF
+10120 30826 MT
+(When CONNECTed to a foreign host as a terminal, log the terminal session to the specified diskette file.)49 W
+10120 31931 MT
+(This functionality depends to some extent)
+13 W( on the remote host's ability to do XON/XOFF flow control, and)14 W
+10120 33036 MT
+(does not guarantee a complete transcript \050after all, that's what the KERMIT protocol is for\051.  The log file)48 W
+10120 34141 MT
+(is closed when the connection is closed by typing the escape character followed by the single-character)104 W
+10120 35246 MT
+(command "C".)SH
+10120 36823 MT
+(It is possible to temporarily)
+98 W( suspend logging during connect state.  Typing an escape sequence can turn)97 W
+10120 37928 MT
+(file logging on \050<escape-character> R for Resume\051 or off \050<escape-character> Q for quiet\051.)SH
+10120 39505 MT
+(Re-entering connect state will re-open the previously opened log file and append to that file.)SH
+6120 41082 MT
+(LOGOUT)SH
+10120 42187 MT
+(Like BYE, but leaves you at Kermit-80 command level.)SH
+6120 43764 MT
+(OUTPUT)SH
+/Times-Italic SF
+10314 XM
+(text)SH
+/Times-Roman SF
+10120 44869 MT
+(Send the text to the remote computer as if you had typed it.)SH
+6120 46446 MT
+(PAUSE)SH
+/Times-Italic SF
+9537 XM
+(seconds)SH
+/Times-Roman SF
+10120 47551 MT
+(If this command is issued your CP/M system will wait)
+42 W( a while before proceeding with another command.)41 W
+10120 48656 MT
+(This is intended for use)
+21 W( in TAKE commands, where you may want to pause for a while before proceeding)22 W
+10120 49761 MT
+(with the rest of the TAKE file.  The actual delay)
+62 W( is very variable between systems, and values should be)61 W
+10120 50866 MT
+(determined on a trial and error basis.)SH
+6120 52443 MT
+(PRINT)SH
+10120 XM
+(Print a file to)
+64 W( the console and printer.  Output to the printer is buffered by the Kermit-maintained printer)65 W
+10120 53548 MT
+(buffer. This)
+338 W( routine is identical)
+44 W( to TYPE but characters are echoed to the printer as well as to the screen.)43 W
+10120 54653 MT
+(Suspending and canceling output is as described in TYPE.)SH
+6120 56230 MT
+(QUIT)SH
+10120 XM
+(Synonym for EXIT.)SH
+6120 57807 MT
+(RECEIVE)SH
+/Times-Italic SF
+10592 XM
+(filespec)SH
+/Times-Roman SF
+10120 58912 MT
+(Receive file\050s\051 from the remote)
+185 W( Kermit, and save them under the names provided in the file headers)184 W
+10120 60017 MT
+(supplied by)
+37 W( the remote host.  If a local filespec is given, the file is saved under the given filename.  If the)38 W
+10120 61122 MT
+(names aren't legal, use)
+104 W( as many legal characters from the name as possible \050see the description of SET)103 W
+10120 62227 MT
+(FILE-WARNING below\051.  If there's)
+128 W( a conflict, and FILE-WARNING is ON, warn the user and try to)129 W
+10120 63332 MT
+(build a unique name for the file by)
+71 W( adding ")70 W
+/Courier SF
+(&)SH
+/Times-Roman SF
+(" characters to the name.  RECEIVE can be abbreviated to)70 W
+10120 64437 MT
+(the single letter R.)SH
+6120 66014 MT
+(REMOTE)SH
+/Times-Italic SF
+10481 XM
+(command)SH
+/Times-Roman SF
+10120 67119 MT
+(Send a command to a remote Kermit server.)
+66 W( The)
+381 W( results are sent back to your CP/M screen.  When two)65 W
+10120 68224 MT
+(arguments are required and specify less than two in)
+73 W( the command, you will be prompted for the missing)74 W
+10120 69329 MT
+(arguments. REMOTE)
+250 W( commands include:)SH
+10120 71120 MT
+(REMOTE CD [directory])SH
+ES
+%%Page: 7 8
+BS
+0 SI
+12 /Times-Bold AF
+8280 4404 MT
+(1.5. Kermit-80 Description)SH
+10 /Times-Italic AF
+52275 XM
+(Page 7)SH
+46800 50 8280 5709 UL
+/Times-Roman SF
+14280 7886 MT
+(Ask the remote server to change its default directory.  If no directory is)
+36 W( specified, the server changes)37 W
+14280 8991 MT
+(to its login directory.)SH
+12280 10568 MT
+(REMOTE COPY file1 file2)SH
+14280 11673 MT
+(Ask the remote server to copy file1 to file2.)SH
+12280 13250 MT
+(REMOTE RENAME file1 file2)SH
+14280 14355 MT
+(Ask the remote server to rename file1 to file2.)SH
+12280 15932 MT
+(REMOTE DELETE filespec)SH
+14280 17037 MT
+(Ask the remote server to delete the named file or files.)SH
+12280 18614 MT
+(REMOTE DIRECTORY [filespec])SH
+14280 19719 MT
+(Ask the remote server to display a directory listing of the given files or, if the filespec is)
+41 W( omitted, all)40 W
+14280 20824 MT
+(the files in the current device or directory.)SH
+12280 22401 MT
+(REMOTE DISK-USAGE)SH
+14280 23506 MT
+(Ask the remote server to display information about its disk usage \050such as free or used space\051.)SH
+12280 25083 MT
+(REMOTE ERASE filespec)SH
+14280 26188 MT
+(Same as REMOTE DELETE.)SH
+12280 27765 MT
+(REMOTE FINISH)SH
+14280 28870 MT
+(Same as FINISH.)SH
+12280 30447 MT
+(REMOTE HELP)SH
+14280 31552 MT
+(Ask the remote server to display a list of the commands it can respond to.)SH
+12280 33129 MT
+(REMOTE HOST command)SH
+14280 34234 MT
+(Ask the remote server to have its operating system execute the given command.)SH
+12280 35811 MT
+(REMOTE KERMIT command)SH
+14280 36916 MT
+(Ask the remote server to execute the given Kermit command, given)
+35 W( in the server Kermit's command)36 W
+14280 38021 MT
+(syntax.)SH
+12280 39598 MT
+(REMOTE LOGIN user password)SH
+14280 40703 MT
+(Log in to a remote Kermit server which has been set up to require a username and password.)SH
+12280 42280 MT
+(REMOTE MESSAGE text)SH
+14280 43385 MT
+(Send the text to the remote server for display on its screen \050useful with MS-DOS Kermit servers\051.)SH
+12280 44962 MT
+(REMOTE SET parameter value)SH
+14280 46067 MT
+(Ask the)
+145 W( remote server to set the given parameter to the given value, for example REMOTE SET)146 W
+14280 47172 MT
+(FILE TYPE BINARY.  Type REMOTE SET ? to see a list of the REMOTE SET options.)SH
+12280 48749 MT
+(REMOTE SPACE)SH
+14280 49854 MT
+(Same as REMOTE DISK-USAGE.)SH
+12280 51431 MT
+(REMOTE STATUS)SH
+14280 52536 MT
+(Ask the remote server to provide a status report.)SH
+12280 54113 MT
+(REMOTE TYPE file)SH
+14280 55218 MT
+(Ask the remote server to display the named file on the micro's screen.)SH
+12280 56795 MT
+(REMOTE WHO [user])SH
+14280 57900 MT
+(Ask the remote server for a list)
+13 W( of users who are logged in, or if a user is specified, for a report on the)12 W
+14280 59005 MT
+(named user.)SH
+8280 60796 MT
+(RENAME file1 file2)SH
+12280 61901 MT
+(Rename local CP/M file1 to file2.)SH
+8280 63478 MT
+(SEND)SH
+/Times-Italic SF
+11141 XM
+(filespec)SH
+/Times-Roman SF
+12280 64583 MT
+(Send file\050s\051 specified by)13 W
+/Times-Italic SF
+22330 XM
+(filespec)SH
+/Times-Roman SF
+25648 XM
+(to the remote Kermit.  The)13 W
+/Times-Italic SF
+36641 XM
+(filespec)SH
+/Times-Roman SF
+39959 XM
+(may contain CP/M wildcards.)
+13 W( SEND)277 W
+12280 65688 MT
+(may be abbreviated to the single letter S.)SH
+8280 67265 MT
+(SET)SH
+/Times-Italic SF
+10308 XM
+(parameter)SH
+/Times-Roman SF
+14724 XM
+([)SH
+/Times-Italic SF
+(value)SH
+/Times-Roman SF
+(])SH
+12280 68370 MT
+(Set the specified parameter to the specified value.  Possible parameter settings:)SH
+12280 70161 MT
+(AUTORECEIVE)SH
+16280 71266 MT
+(ON \050or OFF\051.)
+157 W( Allows)
+563 W( several files to be received without having to type RECEIVE on the)156 W
+ES
+%%Page: 8 9
+BS
+0 SI
+10 /Times-Italic AF
+6120 4404 MT
+(Page 8)SH
+12 /Times-Bold AF
+30586 XM
+(Kermit User Guide: CP/M-80 KERMIT 1.5)SH
+46800 50 6120 5709 UL
+10 /Times-Roman AF
+14120 7886 MT
+(receiving machine.  The routine simply looks for activity on)
+91 W( the serial line, and if so fudges a)92 W
+14120 8991 MT
+(RECEIVE command.  The packet sent by the sender will be lost.)SH
+10120 10568 MT
+(BLOCK-CHECK-TYPE)SH
+/Times-Italic SF
+20314 XM
+(option)SH
+/Times-Roman SF
+14120 11673 MT
+(The options are:)SH
+14120 13464 MT
+(1-CHARACTER-CHECKSUM)SH
+18120 14569 MT
+(Normal, default, standard 6-bit checksum.)SH
+14120 15674 MT
+(2-CHARACTER-CHECKSUM)SH
+18120 16779 MT
+(A 12-bit checksum encoded as two characters.)SH
+14120 17884 MT
+(3-CHARACTER-CRC-CCITT)SH
+18120 18989 MT
+(A 16-bit CCITT-format Cyclic Redundancy Check, encoded as 3 characters.)SH
+10120 20780 MT
+(BUFFER-SIZE)SH
+/Times-Italic SF
+16593 XM
+(value)SH
+/Times-Roman SF
+14120 21885 MT
+(This allows you to set a buffer size during transfer of data.  On some systems)
+86 W( it takes so long)87 W
+14120 22990 MT
+(that the remote end times)
+9 W( out while the local system is reading or writing to disk.  The size is the)8 W
+14120 24095 MT
+(number of 128 disk sectors \050nominal\051 and can be from 1 \050128 bytes\051 to 64 \0508 kbytes\051.)SH
+14120 25672 MT
+(CP/M-80 filenames will still be mapped to uppercase characters.)SH
+10120 27249 MT
+(COLLISION value)SH
+14120 28354 MT
+(What to do when a file arrives that has the same name as an existing file.)
+66 W( BACKUP)
+380 W( means to)65 W
+14120 29459 MT
+(rename the existing file.  DISCARD means to discard)
+444 W( and reject the incoming file.)445 W
+14120 30564 MT
+(OVERWRITE means to overwrite the existing file.  RENAME means to rename the existing)126 W
+14120 31669 MT
+(file.)SH
+10120 33246 MT
+(DEBUG)SH
+14120 XM
+(ON \050or OFF\051.  Enables/disables displaying of packets on the screen during)
+122 W( file transfer.  Not)123 W
+14120 34351 MT
+(performed if the QUIET option has been set for the terminal \050SET TERMINAL QUIET\051)SH
+10120 35928 MT
+(DEFAULT-DISK)SH
+/Times-Italic SF
+17591 XM
+(drive letter)SH
+/Times-Roman SF
+14120 37033 MT
+(This allows you to set the)
+94 W( default disk as source and destination of file transfers.  In addition,)95 W
+14120 38138 MT
+(issuing this command)
+134 W( causes you to switch to the specified disk and log it in, write-enabled.)133 W
+14120 39243 MT
+(The colon must be included in the disk name \050A:\051.  The selected disk appears in)
+302 W( your)303 W
+14120 40348 MT
+(KERMIT-80 prompt, for instance)SH
+/Courier SF
+16520 42003 MT
+(Kermit-80 14A:>)SH
+/Times-Roman SF
+10120 43720 MT
+(DIRECTORY-FILE-SIZE ON \050or OFF\051.)SH
+14120 45297 MT
+(By setting DIRECTORY-FILE-SIZE OFF you)
+71 W( can get an abreviated listing of your disk drive.)70 W
+14120 46402 MT
+(File sizes are not)
+2 W( calculated, and five files are shown on a line.  Setting this option ON will show)3 W
+14120 47507 MT
+(file sizes of each file.)SH
+14120 49084 MT
+(Both options will list the free space remaining.)SH
+10120 50661 MT
+(ESCAPE)SH
+14120 XM
+(Change the escape)
+5 W( character for virtual terminal connections.  Kermit-80 will prompt you for the)4 W
+14120 51766 MT
+(new escape character, which you enter literally.)SH
+10120 53343 MT
+(FILE-MODE)SH
+/Times-Italic SF
+15758 XM
+(option)SH
+/Times-Roman SF
+14120 54448 MT
+(Tells KERMIT-80 what kind of file it is)
+69 W( sending, so that KERMIT can correctly determine the)68 W
+14120 55553 MT
+(end of the file.  SET FILE BINARY means to send all the 128-byte blocks \050ie)
+119 W( logical CP/M)120 W
+14120 56658 MT
+(sectors\051 of the file, including the last block in its entirety; SET FILE ASCII)
+14 W( is used for text files,)13 W
+14120 57763 MT
+(and transmission stops when the first Control-Z is encountered anywhere in the)
+70 W( file \050this is the)71 W
+14120 58868 MT
+(CP/M convention for marking the end of a text file\051.)SH
+14120 60445 MT
+(SET FILE-MODE)
+99 W( DEFAULT tells Kermit to attempt to determine the file type by examining)98 W
+14120 61550 MT
+(the file)
+50 W( being transmitted.  If a Control-Z appears before the last block of the file, it is assumed)51 W
+14120 62655 MT
+(to be BINARY; if, when the first Control-Z is encountered, the remainder)
+104 W( of the file contains)103 W
+14120 63760 MT
+(only control-Z's, it is assumed to be a text file.  Unfortunately,)
+253 W( not all programs fill the)254 W
+14120 64865 MT
+(remainder of the last record of a text file with Control-Z's, so this algorithm is not)
+184 W( always)183 W
+14120 65970 MT
+(successful.)SH
+14120 67547 MT
+(If binary transmission is used on a text)
+238 W( file, or a compressed file \050eg a .DQC file\051 some)239 W
+14120 68652 MT
+(extraneous characters \050up to 127 of them\051 may appear at the end of the file on the target system.)SH
+14120 70229 MT
+(If ASCII transmission is used on a binary file, any 8th)
+96 W( bits set will be stripped and a warning)95 W
+14120 71334 MT
+(sent to the console.  When the first control-Z is encountered, the file is assumed to be at)
+16 W( the end,)17 W
+ES
+%%Page: 9 10
+BS
+0 SI
+12 /Times-Bold AF
+8280 4404 MT
+(1.5. Kermit-80 Description)SH
+10 /Times-Italic AF
+52275 XM
+(Page 9)SH
+46800 50 8280 5709 UL
+/Times-Roman SF
+16280 7886 MT
+(even if it is not.)SH
+12280 9463 MT
+(FLOW-CONTROL ON \050or OFF\051)SH
+16280 10568 MT
+(Sets XON/XOFF flow control on or off.  If set ON the host is expected to respond)
+48 W( to an XOFF)49 W
+16280 11673 MT
+(or XON sent by Kermit-80.  If set)
+177 W( off, no flow control is assumed and any XON/XOFF is)176 W
+16280 12778 MT
+(ignored.)SH
+12280 14355 MT
+(IBM ON \050or OFF\051)SH
+16280 15460 MT
+(Allow the transfer)
+125 W( of files to and from an IBM mainframe computer.  This makes Kermit-80)124 W
+16280 16565 MT
+(wait for the IBM turnaround)
+61 W( character \050XON\051, ignore parity on input, add appropriate parity to)62 W
+16280 17670 MT
+(output, and use local echoing during)
+167 W( CONNECT.  As distributed, KERMIT-80 uses MARK)166 W
+16280 18775 MT
+(parity for IBM communication.  If you)
+4 W( don't give this command, IBM mode is OFF.  Since IBM)5 W
+16280 19880 MT
+(VM/CMS KERMIT does not have timeout capability,)
+118 W( SET IBM ON also turns on the "fuzzy)117 W
+16280 20985 MT
+(timer" automatically.)SH
+12280 22562 MT
+(LOCAL-ECHO ON \050or OFF\051)SH
+16280 23667 MT
+(When you CONNECT to a)
+136 W( remote host, you must set LOCAL-ECHO ON if the host is half)135 W
+16280 24772 MT
+(duplex, OFF if full duplex.  OFF by default.)SH
+12280 26349 MT
+(LOGGING ON \050or OFF\051)SH
+16280 27454 MT
+(Cease or resume logging whenever)
+25 W( connect mode is entered.  This is really only applicable after)24 W
+16280 28559 MT
+(a LOG command is no longer required.)SH
+12280 30136 MT
+(NO-EXIT)SH
+16280 31241 MT
+(This command is applicable only)
+145 W( for Kermit initiated with a command tail.  For example, if)144 W
+16280 32346 MT
+(Kermit was initiated by:)SH
+16280 33923 MT
+(KERMIT ;SEND HELLO;NO-EXIT)SH
+16280 35500 MT
+(Kermit would first seek out and execute the KERMIT.INI file \050if present\051, then)
+248 W( send file)249 W
+16280 36605 MT
+(HELLO to a remote system.)
+8 W( Usually)
+265 W( Kermit would exit back to CP/M, but NO-EXIT over-rides)7 W
+16280 37710 MT
+(this. STAY)
+250 W( is a synonym for NO-EXIT.)SH
+16280 39287 MT
+(Note the leading semicolon.  This clears leading spaces from the first command.)SH
+12280 40864 MT
+(OUTPUT)SH
+/Times-Italic SF
+16474 XM
+(text-line)SH
+/Times-Roman SF
+16280 41969 MT
+(Send a line of text)
+121 W( to the remote computer \050or modem\051.  This simply copies the string to the)120 W
+16280 43074 MT
+(correct line, and assumes all appropriate parameters have been set to be used, e.g. speed, parity)54 W
+16280 44179 MT
+(etc. It)
+250 W( is intended for use in TAKE command files.)SH
+12280 45756 MT
+(PARITY)SH
+/Times-Italic SF
+16141 XM
+(option)SH
+/Times-Roman SF
+16280 46861 MT
+(Sets parity for outgoing characters to one of)
+49 W( the following: NONE, SPACE, MARK, EVEN, or)50 W
+16280 47966 MT
+(ODD. On)
+286 W( input, if parity is NONE, then the 8th bit is kept \050as data\051, otherwise it is stripped)
+18 W( and)17 W
+16280 49071 MT
+(ignored. The)
+558 W( parity setting applies to both terminal)
+154 W( connection and file transfer.  If you set)155 W
+16280 50176 MT
+(parity to)
+236 W( anything other than none, KERMIT-80 will attempt to use "8th bit prefixing" to)235 W
+16280 51281 MT
+(transfer binary files.)
+45 W( If)
+341 W( the other KERMIT is also capable of 8th bit prefixing, then binary files)46 W
+16280 52386 MT
+(can be transferred successfully; if not, the 8th bit of each data byte)
+75 W( will be lost \050you will see a)74 W
+16280 53491 MT
+(warning on your screen if this happens\051.)SH
+12280 55068 MT
+(PORT)SH
+/Times-Italic SF
+15086 XM
+(port name)SH
+/Times-Roman SF
+16280 56173 MT
+(Allows you to switch between different communication ports.  This command is not available)96 W
+16280 57278 MT
+(on all systems.  Type)56 W
+/Courier SF
+25283 XM
+(SET PORT ?)57 W
+/Times-Roman SF
+31704 XM
+(for a list of valid options for your system. \050Note:  If your)57 W
+16280 58383 MT
+(system does not support several)
+105 W( ports, this command will return a "Not implemented" error if)104 W
+16280 59488 MT
+(you try to set a port.\051)SH
+12280 61065 MT
+(PRINTER)SH
+16280 62170 MT
+(ON \050or OFF\051)SH
+16280 63275 MT
+(Turns copying of CONNECT session)
+151 W( to printer on and off.  It is also possible to toggle the)152 W
+16280 64380 MT
+(printer on/off from the connect state, by typing <escape character> followed by P.)SH
+12280 65957 MT
+(RECEIVE)SH
+/Times-Italic SF
+16752 XM
+(parameter)SH
+/Times-Roman SF
+21168 XM
+([)SH
+/Times-Italic SF
+(value)SH
+/Times-Roman SF
+(])SH
+16280 67062 MT
+(Set a RECEIVE parameter.)SH
+16280 68853 MT
+(PAD-CHAR)SH
+20280 69958 MT
+(Set the PAD character to use while receiving files.  Currently a dummy, as for SET)100 W
+20280 71063 MT
+(SEND PAD-CHAR.)SH
+ES
+%%Page: 10 11
+BS
+0 SI
+10 /Times-Italic AF
+6120 4404 MT
+(Page 10)SH
+12 /Times-Bold AF
+30586 XM
+(Kermit User Guide: CP/M-80 KERMIT 1.5)SH
+46800 50 6120 5709 UL
+10 /Times-Roman AF
+14120 7886 MT
+(PADDING [value])SH
+18120 8991 MT
+(Set the number of PAD characters to use while receiving files.  Same as SET)
+76 W( SEND)75 W
+18120 10096 MT
+(PADDING.)SH
+14120 11201 MT
+(START-OF-PACKET [value])SH
+18120 12306 MT
+(Set the default start of Packet character for receiving files.)
+58 W( Apply)
+364 W( the same rules and)57 W
+18120 13411 MT
+(considerations as for SET SEND START-OF-PACKET.)SH
+14120 14516 MT
+(PACKET-LENGTH number)SH
+18120 15621 MT
+(Tell the other Kermit the longest packet length CP/M Kermit)
+171 W( is willing to receive)170 W
+18120 16726 MT
+(during file transfer.  The maximum length is 94, which is also the default length.)SH
+10120 18517 MT
+(SEND)SH
+/Times-Italic SF
+12981 XM
+(parameter)SH
+/Times-Roman SF
+17397 XM
+([)SH
+/Times-Italic SF
+(value)SH
+/Times-Roman SF
+(])SH
+14120 19622 MT
+(Set a SEND parameter.)SH
+14120 21413 MT
+(PAD-CHAR)SH
+18120 22518 MT
+(Set the)
+98 W( Pad character to be used while sending files.  It is currently a dummy entry,)99 W
+18120 23623 MT
+(and does not do anything.)SH
+14120 24728 MT
+(PADDING [value])SH
+18120 25833 MT
+(Set the number of PAD-CHARS)
+249 W( to be used while sending files.  This too does)250 W
+18120 26938 MT
+(nothing.)SH
+14120 28043 MT
+(START-OF-PACKET)SH
+18120 29148 MT
+(Set the default start of packet character to another character than control-A.  This)
+28 W( may)29 W
+18120 30253 MT
+(be necessary on)
+439 W( systems \050including intervening networks\051 that trap control-A)438 W
+18120 31358 MT
+(characters. Choose)
+272 W( a control character not otherwise used, ie not carriage return)
+11 W( \05013D,)12 W
+18120 32463 MT
+(ODH\051, line feed)
+108 W( \05010D, OAN\051, tabs \05009D, 09H\051, backspace \05008H\051, and bell \05007H\051 or)107 W
+18120 33568 MT
+(any other used between you and your remote system.)SH
+10120 35359 MT
+(SPEED)SH
+/Times-Italic SF
+13426 XM
+(value)SH
+/Times-Roman SF
+14120 36464 MT
+(Change the)
+23 W( baud rate of the communications port.  This command only works on some systems.)22 W
+/Times-Italic SF
+14120 37569 MT
+(value)SH
+/Times-Roman SF
+16718 XM
+(is the numeric baud rate \050300, 9600, etc.\051 desired.  Type)
+182 W( SET SPEED followed by a)183 W
+14120 38674 MT
+(question mark for a list of supported baud rates.  On systems that do)
+36 W( not support this command,)35 W
+14120 39779 MT
+(you must set the port baud rate from CP/M or other setup mechanism outside of KERMIT-80.)SH
+10120 41356 MT
+(TACTRAP)SH
+14120 42461 MT
+(Set the TAC intercept character.  If you are attached to a TAC it will)
+149 W( swallow the intercept)148 W
+14120 43566 MT
+(character \050commercial AT sign by default\051 so Kermit sends)
+94 W( it twice.  With this command you)95 W
+14120 44671 MT
+(can set the intercept character \050ie the one to send twice\051 to another character.)SH
+10120 46248 MT
+(TERMINAL)SH
+/Times-Italic SF
+15536 XM
+(option)SH
+/Times-Roman SF
+14120 47353 MT
+(Select one of the following terminal characteristics:)SH
+14120 49144 MT
+(OFF)SH
+18120 XM
+(sets emulation off, and its up to the)
+63 W( attached terminal to respond to escape sequences)64 W
+18120 50249 MT
+(sent from the remote host system.)SH
+14120 51907 MT
+(DUMB)SH
+18120 XM
+(Like off, but carriage return)
+123 W( and line feed characters are the only control characters)122 W
+18120 53012 MT
+(accepted. All)
+250 W( other control characters are simply ignored. \050Really a "Glass TTY"\051.)SH
+14120 54670 MT
+(EXTERNAL)SH
+18120 55775 MT
+(Emulation is provided for by a)
+259 W( routine in the system dependent part of Kermit.)258 W
+18120 56880 MT
+(Attempting to set)
+236 W( this option without having and externally supplied routine will)237 W
+18120 57985 MT
+(returna "Not Implemented" error.)SH
+14120 59643 MT
+(OFF)SH
+18120 XM
+(All characters are passed directly to the terminal without any interpretation by Kermit.)SH
+14120 61301 MT
+(VT52)SH
+18120 XM
+(When connected)
+101 W( as a terminal to a foreign host, the micro emulates a VT52.  VT52)100 W
+18120 62406 MT
+(emulation is set by default, except on micros that already have terminal functionality)74 W
+18120 63511 MT
+(built in, such)
+35 W( as the DEC VT180 and DECmate \050these act as VT100-series terminals\051.)34 W
+18120 64616 MT
+(Some systems emulate other terminals, like the ADM3A; see table 1-5.)SH
+14120 66274 MT
+(QUIET)SH
+18120 XM
+(Do not display any file transfer information onto the console.  This mode is useful)
+72 W( if)73 W
+18120 67379 MT
+(you console takes)
+58 W( a long time to update the display.  Only the file name is displayed.)57 W
+18120 68484 MT
+(DEBUGging information is not displayed even if selected.)SH
+14120 70142 MT
+(REGULAR)SH
+18120 71247 MT
+(Inverse of QUIET.  All packets etc displayed, as ususal.)SH
+ES
+%%Page: 11 12
+BS
+0 SI
+12 /Times-Bold AF
+8280 4404 MT
+(1.5. Kermit-80 Description)SH
+10 /Times-Italic AF
+51775 XM
+(Page 11)SH
+46800 50 8280 5709 UL
+/Times-Roman SF
+12280 7886 MT
+(TIMER ON \050or OFF\051)SH
+16280 8991 MT
+(Enable or disable)
+131 W( the "fuzzy timer".  The timer is off by default, because in the normal case)132 W
+16280 10096 MT
+(KERMIT-80 is communicating with a mainframe KERMIT that has its own timer.)
+62 W( Mainframe)372 W
+16280 11201 MT
+(KERMIT timers tend to be more precise or adaptable to changing conditions.)
+46 W( You)
+343 W( should SET)47 W
+16280 12306 MT
+(TIMER ON if you are communicating with a KERMIT that does not have a)
+41 W( timer.  You should)40 W
+16280 13411 MT
+(SET TIMER OFF if you are communicating over a network with long delays.)SH
+12280 14988 MT
+(USER)SH
+/Times-Italic SF
+15086 XM
+(user-number)SH
+/Times-Roman SF
+16280 16093 MT
+(Sets another user number to be active.  Acceptable user numbers are)
+203 W( 0 to 31, though it is)202 W
+16280 17198 MT
+(recommended to use user numbers 0 to 15 only.  This is really only useful for Winchester)184 W
+16280 18303 MT
+(Systems with high disk capacities.)SH
+12280 19880 MT
+(WARNING ON \050or OFF\051)SH
+16280 20985 MT
+(Warn user of filename)
+5 W( conflicts when receiving files from remote host, and attempt to generate a)6 W
+16280 22090 MT
+(unique name)
+19 W( by adding ")18 W
+/Courier SF
+(&)SH
+/Times-Roman SF
+(" characters to the given name.  ON by default, which is equivalent to)18 W
+16280 23195 MT
+(SET COLLISION RENAME.)SH
+8280 24986 MT
+(SHOW)SH
+12280 XM
+(Display all settable parameters.  You will get a page or so)
+83 W( of the status af all parameters that can be set)84 W
+12280 26091 MT
+(using the SET command.)SH
+8280 27668 MT
+(STATUS)SH
+12280 XM
+(The same function as Show.)SH
+8280 29245 MT
+(STAY)SH
+12280 XM
+(Equivalent to SET NO-EXIT.)SH
+8280 30822 MT
+(TAKE)SH
+/Times-Italic SF
+11196 XM
+(filespec)SH
+/Times-Roman SF
+12280 31927 MT
+(Take characters and commands from the specified file as if they)
+40 W( were entered from the keyboard.  This is)41 W
+12280 33032 MT
+(useful if you want to set up a batch job.  A command file can send, get,)
+210 W( receive, set functions etc)209 W
+12280 34137 MT
+(automatically. A)
+250 W( TAKE command can be interrupted with ^C.)SH
+12280 35714 MT
+(An automatic)
+67 W( "TAKE KERMIT.INI" is executed from the default drive when Kermit-80 is loaded.  This)68 W
+12280 36819 MT
+(can be used to set defaults of band rate, parity, filetype, default drive etc.)SH
+12280 38396 MT
+(If KERMIT.INI does not exist, control is given directly to the user.)SH
+8280 39973 MT
+(TRANSMIT)SH
+/Times-Italic SF
+13641 XM
+(filespec turnaround)SH
+/Times-Roman SF
+12280 41078 MT
+(Send the specified file)
+70 W( to the system on the other end of the connection as though it were being typed at)71 W
+12280 42183 MT
+(the terminal, one line at a time.  Each line sent is terminated with a carriage return, and any line)
+36 W( feeds are)35 W
+12280 43288 MT
+(stripped from the file sent.)
+30 W( After)
+311 W( each line has been sent Kermit waits for a character string from the host)31 W
+12280 44393 MT
+(\050eg a acrriage return\051.  If not specified, a carriage return is assumed.  No KERMIT protocol)
+76 W( is involved.)75 W
+12280 45498 MT
+(An asterisk \050star\051 is sent to the console for every line sent,)
+1 W( to indicate how the transfer is progressing.  This)2 W
+12280 46603 MT
+(is useful for sending files to systems)
+43 W( that don't have a KERMIT program.  During transmission, you may)42 W
+12280 47708 MT
+(type one of these single-character commands:)SH
+12280 49499 MT
+(Control-C)SH
+14280 50604 MT
+(Cease transmission, and drop into terminal emulation mode.)SH
+12280 51709 MT
+(CR)SH
+14280 XM
+(\050carriage return\051 Re-transmit the previous line.)SH
+8280 53500 MT
+(TYPE filespec)SH
+12280 54605 MT
+(Type a)
+49 W( local CP/M file or files on the CP/M screen.  A Control-C will cancel the command and return to)50 W
+12280 55710 MT
+(the Kermit prompt.  A Ctrl-X will cancel the current file and go on to the next one, if)
+81 W( any.  Typing any)80 W
+12280 56815 MT
+(other character)
+86 W( while the file is being displayed will suspend the output.  Another character will resume)87 W
+12280 57920 MT
+(output.)SH
+8280 59497 MT
+(VERSION)SH
+12280 60602 MT
+(Show the name, edit number, and edit date of several of the modules that make up Kermit-80.)SH
+ES
+%%Page: 12 13
+BS
+0 SI
+10 /Times-Italic AF
+6120 4404 MT
+(Page 12)SH
+12 /Times-Bold AF
+30586 XM
+(Kermit User Guide: CP/M-80 KERMIT 1.6)SH
+46800 50 6120 5709 UL
+14 SS 
+6120 8138 MT
+(1.6. Kermit-80 Flavors)SH
+10 /Times-Roman AF
+6120 10256 MT
+(Many of the)
+152 W( systems supported use an external terminal, rather than a built-in console.  Kermit may be further)153 W
+6120 11452 MT
+(customized for these systems by)
+98 W( defining \050at assembly time\051 the terminal type to be used.  If the terminal type is)97 W
+6120 12648 MT
+(unknown or)
+29 W( does not match any of the existing terminal options, the generic "CRT" option may be selected.  In this)30 W
+6120 13844 MT
+(case, Kermit cannot do fancy screen control during file transfer; it simply types the file names, packet)
+25 W( numbers, and)24 W
+6120 15040 MT
+(messages in sequence across and down the screen.  This works best)
+183 W( if you can put your micro or terminal in)184 W
+6120 16236 MT
+("autowrap" mode; otherwise the packet numbers will pile up in the rightmost column;)
+69 W( the filenames and messages)68 W
+6120 17432 MT
+(will always appear on)
+150 W( a new line, however.  If no specific terminal has been selected, Kermit cannot do VT52)151 W
+6120 18628 MT
+(emulation; it can act as a "dumb terminal" \050sometimes called a "glass TTY"\051, or else its own built in)
+167 W( terminal)166 W
+6120 19824 MT
+(firmware provides cursor control functions independent of the Kermit program.)SH
+12 /Times-Bold AF
+6120 22940 MT
+(1.6.1. Generic Kermit-80)SH
+10 /Times-Roman AF
+6120 24882 MT
+("Generic Kermit-80" is an implementation of Kermit that should run on any)
+11 W( 8080-compatible CP/M 2.2 system with)12 W
+6120 26078 MT
+(no modification)
+7 W( at all, or perhaps only a minor one.  Unlike other Kermit-80 implementations, it contains no system-)6 W
+6120 27274 MT
+(dependent manipulation of the serial port.  All)
+87 W( I/O is done with standard CP/M BIOS calls, and I/O redirection is)88 W
+6120 28470 MT
+(done using the CP/M IOBYTE function, which, according to the Digital Research)24 W
+/Times-Italic SF
+39460 XM
+(CP/M Operating System Manual)24 W
+/Times-Roman SF
+(,)SH
+6120 29666 MT
+(is an optional feature of any particular CP/M implementation.)
+207 W( If)
+665 W( your system does not provide the IOBYTE)208 W
+6120 30862 MT
+(function, Generic Kermit-80 will not work; furthermore, not all systems that implement IOBYTE do so in)
+36 W( the same)35 W
+6120 32058 MT
+(way. The)
+360 W( SET PORT command may be used to select the)
+55 W( devices to be used for input and output.  Table 1-1 lists)56 W
+6120 33254 MT
+(the options to the SET PORT command and their effects.)SH
+46800 50 6120 35171 UL
+/Courier SF
+17220 37252 MT
+(SET PORT)SH
+/Courier-Oblique SF
+22620 XM
+(xxx)SH
+/Courier SF
+26820 XM
+(input from)
+SH( output)
+3000 W( to)SH
+7200 50 17220 37452 UL
+6000 50 26820 37452 UL
+5400 50 36420 37452 UL
+20220 38283 MT
+(CRT CRT: CRT:)6600 W
+20220 39314 MT
+(PTR PTR: PTP:)6600 W
+20220 40345 MT
+(TTY TTY: TTY:)6600 W
+20220 41376 MT
+(UC1 UC1: UC1:)6600 W
+20220 42407 MT
+(UR1 UR1: UP1:)6600 W
+20220 43438 MT
+(UR2 UR2: UP2:)6600 W
+/Times-Bold SF
+20881 45048 MT
+(Table 1-1:)SH
+/Times-Roman SF
+25742 XM
+(Kermit-80 SET PORT Options)SH
+46800 50 6120 46858 UL
+6120 49050 MT
+(The default is SET PORT)
+105 W( PTR.  In all cases, the console \050CON:\051 and list \050LST:\051 devices used are those selected)104 W
+6120 50246 MT
+(when Kermit is started.)SH
+6120 52638 MT
+(The reason all Kermit-80 implementations aren't generic is that a good deal of speed is)
+128 W( sacrificed by getting all)129 W
+6120 53834 MT
+(services from the operating system.  While a specific implementation of Kermit-80 may be able to operate)
+45 W( at 4800,)44 W
+6120 55030 MT
+(9600, or even 56 Kilo baud, generic Kermit will fail to work on some systems at speeds in excess)
+30 W( of 1200 baud.  In)31 W
+6120 56226 MT
+(addition, many features of Kermit require more specific knowledge of the hardware)
+171 W( involved.  Generic Kermit)170 W
+6120 57422 MT
+(cannot send a BREAK signal, or change the baud rate, for example.)SH
+12 /Times-Bold AF
+6120 60538 MT
+(1.6.2. CP/M 3 Kermit)SH
+10 /Times-Roman AF
+6120 62480 MT
+(CP/M-3 Kermit \050also known as CP/M-Plus Kermit\051 is)
+161 W( a version of generic Kermit-80, and should run on most)162 W
+6120 63676 MT
+(CP/M-3 \050CP/M-Plus\051 systems.  It uses the auxilliary port \050AUX:\051 to communicate to the remote Kermit.  The SET)60 W
+6120 64872 MT
+(BAUD and SET PORT commands are not supported; nor can a BREAK be sent.  Like generic Kermit-80, a terminal)3 W
+6120 66068 MT
+(may be selected at assembly time.)SH
+ES
+%%Page: 13 14
+BS
+0 SI
+12 /Times-Bold AF
+8280 4404 MT
+(1.6.3. System-Specific Versions)SH
+10 /Times-Italic AF
+51775 XM
+(Page 13)SH
+46800 50 8280 5709 UL
+12 /Times-Bold AF
+8280 8004 MT
+(1.6.3. System-Specific Versions)SH
+10 /Times-Roman AF
+8280 9946 MT
+(There are also many versions of Kermit-80 tailored to specific systems.  Most)
+39 W( of these operate uniformly, but some)38 W
+8280 11142 MT
+(of them take advantage \050or suffer limitations\051 of the specific system.  Here are some of the special features)
+145 W( for)146 W
+8280 12338 MT
+(particular systems:)SH
+8280 14129 MT
+(Amstrad: -- Two versions:)SH
+3444 50 8280 14329 UL
+10280 15920 MT
+(PCW 8256)SH
+12280 17025 MT
+(The PCW 8256/8512 with the serial inerafce attached.)SH
+10280 18602 MT
+(CPC 6128)SH
+12280 19707 MT
+(The 664 with add on memory and 6128 are both)
+10 W( supported.  Both systems must run CP/M Plus, so the 664)9 W
+12280 20812 MT
+(will need an add on RAM pack and CP/M upgrade.  A high speed transfer rate of)
+70 W( 38k baud can be used)71 W
+12280 21917 MT
+(between Amstrad computers.)SH
+8280 23708 MT
+(ACCESS:)SH
+3779 50 8280 23908 UL
+10280 24813 MT
+(Access Matrix computer using port J5.  Supports SET BAUD-RATE for rates of 300-9600 baud.)SH
+8280 26390 MT
+(Apple II -- four variations:)SH
+3360 50 8280 26590 UL
+10280 28181 MT
+(APMMDM:)SH
+12280 29286 MT
+(Apple with Z80 Softcard and Micromodem II in slot 2 Dialout capability provided in)
+63 W( connect command;)62 W
+12280 30391 MT
+(user is prompted for phone number)
+124 W( if carrier is not present.  During connect mode,)125 W
+/Courier SF
+47449 XM
+(^]D)SH
+/Times-Roman SF
+49624 XM
+(drops carrier.)125 W
+12280 31496 MT
+(BYE command also causes carrier to be dropped.)SH
+10280 33073 MT
+(AP6551:)SH
+12280 34178 MT
+(Apple with Z80 Softcard, and one of several 6551-based communication cards; the slot)
+198 W( number is a)199 W
+12280 35283 MT
+(compile-time parameter \050default is slot 2\051.  SET BAUD-RATE supported; speeds are 110-19200 baud.)SH
+10280 36860 MT
+(APCPS:)SH
+12280 37965 MT
+(Apple with Z80 Softcard and CP Multi-Function Card.  The)
+279 W( slot number is again a compile-time)280 W
+12280 39070 MT
+(parameter. SET)
+250 W( BAUD-RATE is supported for baud rates from 50 baud to 19200 baud.)SH
+10280 40647 MT
+(AP6850:)SH
+12280 41752 MT
+(Apple II)
+72 W( with Z80 Softcard and a 6850-based USART in slot 2-the slot being a compile-time parameter.)73 W
+12280 42857 MT
+(SET BAUD-RATE is not supported.)SH
+8280 44648 MT
+(BBC:)SH
+2001 50 8280 44848 UL
+10280 45753 MT
+(Acorn Computers BBC Computer with Acorn Z80 second processor running CP/M-80.)
+288 W( Supports)
+827 W( SET)289 W
+10280 46858 MT
+(BAUD-RATE and can send breaks.)SH
+8280 48435 MT
+(BigBoard II:)SH
+4805 50 8280 48635 UL
+10280 49540 MT
+(Uses serial)
+47 W( port A. To use port B, change mnport, mnprts, and baudrt and reassemble.  Can generate BREAK.)48 W
+10280 50645 MT
+(SET SPEED supported; speeds are 300-38400 baud.)SH
+8280 52222 MT
+(Cifer:)SH
+2055 50 8280 52422 UL
+10280 53327 MT
+(Originally coded for Cifer 1886)
+81 W( using the VL: port set as TTYI: and TTYO: but works successfully on 18xx)82 W
+10280 54432 MT
+(and 28xx series machines.)SH
+10280 56009 MT
+(There are now two versions, each with two variations: Either running)
+2 W( CP/M Version 2.2 or 3.0, and either using)1 W
+10280 57114 MT
+(the VL: or)
+61 W( AUX: ports.  The VL:  port version can only use seven bits of data, so parity prefixing is required)62 W
+10280 58219 MT
+(for binary file transfers.  This restriction is removed by using the AUX: port.  For those interested, the)
+22 W( problem)21 W
+10280 59324 MT
+(is due to the interprocessor link between the video and CPU \050!\051 boards.  The VL:)
+1 W( port is on the video board, and)2 W
+10280 60429 MT
+(the AUX: port on the CPU board, and the inter processor link can only transfer seven bits of data.)SH
+10280 62006 MT
+(Supports SET SPEED, and can generate breaks on some models with a BREAK key.)SH
+8280 63583 MT
+(Comart:)SH
+3000 50 8280 63783 UL
+10280 64688 MT
+(Comart Communicator-Similar to Northstar equipment.  Can generate BREAK.)SH
+8280 66265 MT
+(Compupro:)SH
+4278 50 8280 66465 UL
+10280 67370 MT
+(Based on Kermit 3.x, and has been merged into V4.09)SH
+8280 68947 MT
+(CPT-85xx word processors:)SH
+10943 50 8280 69147 UL
+10280 70052 MT
+(Can generate BREAK.  SET SPEED supported; speeds are 50-9600 baud.)SH
+8280 71629 MT
+(Cromemco:)SH
+4444 50 8280 71829 UL
+ES
+%%Page: 14 15
+BS
+0 SI
+10 /Times-Italic AF
+6120 4404 MT
+(Page 14)SH
+12 /Times-Bold AF
+29686 XM
+(Kermit User Guide: CP/M-80 KERMIT 1.6.3)SH
+46800 50 6120 5709 UL
+10 /Times-Roman AF
+8120 7886 MT
+(Cromemco computers with TU-ART card.  Supports SET BAUD-RATE \050110-9600 baud\051.)SH
+6120 9463 MT
+(DEC DECmate II word processor \050with Z80 card\051:)SH
+20023 50 6120 9663 UL
+8120 10568 MT
+(Can generate BREAK.)SH
+6120 12145 MT
+(DEC VT180 \050Robin\051:)SH
+8444 50 6120 12345 UL
+8120 13250 MT
+(Three output ports, referred to as COMMUNICATIONS, GENERAL, and PRINTER.  Can generate BREAK.)SH
+6120 14827 MT
+(Digicomp Delphi 100:)SH
+8722 50 6120 15027 UL
+8120 15932 MT
+(SET SPEED supported; speeds are 50-19200 baud.)SH
+6120 17509 MT
+(Discovery:)SH
+4110 50 6120 17709 UL
+8120 18614 MT
+(Action Computer Enterprises "Discovery" Multi-user Computer.  Uses Port)
+31 W( B on an 83U user board.  Supports)30 W
+8120 19719 MT
+(SET SPEED for 50-19200 baud.  Can generate BREAK.)SH
+6120 21296 MT
+(Epson:)SH
+2500 50 6120 21496 UL
+8120 22401 MT
+(Epson PX-8 with LCD display.  Although it is quite different in displaying of Packet Information, it)
+57 W( works as)56 W
+8120 23506 MT
+(any other CP/M-80 Kermit.  Supports SET SPEED and can generate BREAK.)SH
+6120 25083 MT
+(Generic Kermit:)SH
+6248 50 6120 25283 UL
+8120 26188 MT
+(Two versions, one for CP/M version 2)46 W
+/Courier SF
+(.)SH
+/Times-Roman SF
+(2 and version 3.  These systems use IOBYTE flipping \050V2)46 W
+/Courier SF
+(.)SH
+/Times-Roman SF
+(2\051 and)
+46 W( the)45 W
+8120 27293 MT
+(AUX: device)
+306 W( to communicate to the serial line.  You may have to SET PORT)
+28 W( xxx before the version 2)29 W
+/Courier SF
+(.)SH
+/Times-Roman SF
+(2 will)29 W
+8120 28398 MT
+(work, as Kermit needs to know what device is the serial line.)SH
+6120 29975 MT
+(Genie:)SH
+2388 50 6120 30175 UL
+8120 31080 MT
+(Eaca Video Genie.)SH
+6120 32657 MT
+(Heath: Three Versions:)SH
+2388 50 6120 32857 UL
+8120 34448 MT
+(H8QUAD)SH
+10120 35553 MT
+(for Heath-8 systems with the quad io board.  This system has been derived from V3.x code.  Note)
+14 W( that this)13 W
+10120 36658 MT
+(version will not run "as is" on H89 systems.)SH
+8120 38235 MT
+(H89)SH
+10120 XM
+(For Heath-89 machines suports baud rates from 50 to 56,000 baud.)SH
+8120 39812 MT
+(Z100)SH
+10120 40917 MT
+(For Z-100 running CP/M-85.  This version does not support setting of baud rates.)SH
+6120 42708 MT
+(Intertec Superbrain: Two Versions:)SH
+7692 50 6120 42908 UL
+8120 44499 MT
+(BRAINA)SH
+10120 45604 MT
+(For superbrain using AUX port.  Breaks and SET BAUD both supported)SH
+8120 47181 MT
+(BRAINM)SH
+10120 48286 MT
+(As above, but using the MAIN port.)SH
+6120 50077 MT
+(Ithaca:)SH
+2443 50 6120 50277 UL
+8120 51182 MT
+(Ithaca Intersystems based computer using the VIO card for all IO to the outside world.  The system is strictly)60 W
+8120 52287 MT
+(speaking a home-brew variant of the Ithaca machine, using an S100 cardcage without)
+24 W( a front panel.  It uses the)23 W
+8120 53392 MT
+(Extended BIOS by EuroMicro of London.  However, I see no reason for this version not running on)
+38 W( a genuine)39 W
+8120 54497 MT
+(Ithaca Intersystems machine.  There are patches needed to the EuroMicro BIOS to make this version work.)SH
+6120 56074 MT
+(Kaypro:)SH
+3277 50 6120 56274 UL
+8120 57179 MT
+(Should work on most Kaypro models, as well)
+24 W( as some related systems \050Ferguson BigBoard I, Xerox 820\051.  For)25 W
+8120 58284 MT
+(the newer Kaypros with multiple ports, Kermit uses)
+14 W( the one labeled "serial data"; it cannot use the serial printer)13 W
+8120 59389 MT
+(or internal modem ports \050but it should)
+81 W( be possible to modify the values for mnport, mnprts, and baudrt to do)82 W
+8120 60494 MT
+(this\051. Can)
+250 W( generate BREAK.  SET SPEED supported; speeds are 50-19200 baud.)SH
+6120 62071 MT
+(Lobo:)SH
+2111 50 6120 62271 UL
+8120 63176 MT
+(Lobo MAX-80.  Supports SET SPEED and can generate BREAKS.)SH
+6120 64753 MT
+(Merlin:)SH
+2722 50 6120 64953 UL
+8120 65858 MT
+(British Telecom Merlin M2215 \050also Rair Black Box, possibly also the ICL PC?\051.  Requires a terminal.)SH
+6120 67435 MT
+(Microbee:)SH
+3832 50 6120 67635 UL
+8120 68540 MT
+(Microbee Systems computer made in Australia.  Works on Microbee 56K \050Series 2 APC\051, 64K)
+26 W( \050Computer in a)27 W
+8120 69645 MT
+(Book\051, 128K \050Dynamic\051, and 256K)
+94 W( \050256TC\051.  Can generate BREAK.  SET BAUD-RATE supported; speeds)93 W
+8120 70750 MT
+(are 75-9600.  All serial I/O is via software, not)
+86 W( hardware.  Simultaneous transmit and receive possible on all)87 W
+8120 71855 MT
+(speeds except 75/1200, 1200/75, 4800, and 9600.)SH
+ES
+%%Page: 15 16
+BS
+0 SI
+12 /Times-Bold AF
+8280 4404 MT
+(1.6.3. System-Specific Versions)SH
+10 /Times-Italic AF
+51775 XM
+(Page 15)SH
+46800 50 8280 5709 UL
+/Times-Roman SF
+8280 7886 MT
+(Micromate:)SH
+4388 50 8280 8086 UL
+10280 8991 MT
+(PMC 101 Micromate.  Supports SET SPEED and can generate BREAK.)SH
+8280 10568 MT
+(Micromint: Two versions)SH
+4278 50 8280 10768 UL
+10280 12359 MT
+(S6)SH
+12280 XM
+(The Ciarcia/Micromint sb-180 board with a 6Mhz procoessor.  System requires a terminal.)SH
+10280 13936 MT
+(S9)SH
+12280 XM
+(As above, but with a 9Mhz processor.)SH
+8280 15727 MT
+(NCR:)SH
+2056 50 8280 15927 UL
+10280 16832 MT
+(Decisionmate 5.  Uses the 2651 and is largely the same as the Ithaca Intersystems machine implementation.)SH
+8280 18409 MT
+(Northstar: -- There are four versions available:)SH
+3777 50 8280 18609 UL
+10280 20200 MT
+(NORTHS:)SH
+12280 21305 MT
+(Northstar Horizon with HS10-4 board.  Supports SET SPEED and SET PORT.)SH
+10280 22882 MT
+(HORIZON:)SH
+12280 23987 MT
+(Northstar Horizon using the serial ports on the Mother board.  Can generate BREAK.)SH
+10280 25564 MT
+(BASICNS:)SH
+12280 26669 MT
+(Basic Northstar Horizon using the printer port.  Can generate BREAK.)SH
+10280 28246 MT
+(ADVANT:)SH
+12280 29351 MT
+(Northstar Advantage.  Supports SET SPEED and can generate BREAK.  Traps Control-0 in the)
+100 W( system)99 W
+12280 30456 MT
+(filter.)SH
+8280 32247 MT
+(Morrow Decision I:)SH
+7665 50 8280 32447 UL
+10280 33352 MT
+(Uses the Multi-I/O board.  Port 1 is the console, port 3 is the communications line.  SET SPEED)
+89 W( supported;)88 W
+10280 34457 MT
+(speeds are 75-56000 baud.)SH
+8280 36034 MT
+(Morrow Micro Decision I:)SH
+10359 50 8280 36234 UL
+8280 37611 MT
+(Nokia MicroMikko:)SH
+7805 50 8280 37811 UL
+10280 38716 MT
+(Will not echo control-O \050which locks keyboard\051.  SET SPEED supported; speeds are 75-9600 baud.)SH
+8280 40293 MT
+(Ohio Scientific:)SH
+6083 50 8280 40493 UL
+10280 41398 MT
+(Doesn't have screen control.)SH
+8280 42975 MT
+(Osborne 1:)SH
+4138 50 8280 43175 UL
+10280 44080 MT
+(Uses serial line, not internal modem.  Left-arrow key generates)
+39 W( <DEL> \050"delete" or "rubout" character\051 during)38 W
+10280 45185 MT
+(connect mode.  SET SPEED supported; speeds are 300 and 1200 baud.  Now supports multi-sector buffering.)SH
+8280 46762 MT
+(Research Machines: Two Versions:)SH
+7803 50 8280 46962 UL
+10280 48553 MT
+(RM380ZM:)SH
+12280 49658 MT
+(380Z and 5.25" disks supports SET BAUD.RATE)SH
+10280 51235 MT
+(RM380ZF:)SH
+12280 52340 MT
+(380Z and 8" disks, otherwise as above.)SH
+8280 54131 MT
+(Sanyo:)SH
+2500 50 8280 54331 UL
+10280 55236 MT
+(Sanyo MBC-1100.  This version derived from Kermit V3.x)SH
+8280 56813 MT
+(ScreenTyper:)SH
+5109 50 8280 57013 UL
+10280 57918 MT
+(Details unkown.)SH
+8280 59495 MT
+(TRS-80: Three versions:)SH
+3167 50 8280 59695 UL
+10280 61286 MT
+(TRS80LB:)SH
+12280 62391 MT
+(TRS-80 with Lifeboat CP/M)SH
+10280 63968 MT
+(TRS80PT:)SH
+12280 65073 MT
+(TRS-80 with Pickles and Trout CP/M)SH
+10280 66650 MT
+(TRSM4:)SH
+12280 67755 MT
+(TRS-80 Model 4 with Montezuma CP/M)SH
+8280 69546 MT
+(Teletek:)SH
+2999 50 8280 69746 UL
+10280 70651 MT
+(Teletek Systemaster. Supports SET BAUD.)SH
+ES
+%%Page: 16 17
+BS
+0 SI
+10 /Times-Italic AF
+6120 4404 MT
+(Page 16)SH
+12 /Times-Bold AF
+29686 XM
+(Kermit User Guide: CP/M-80 KERMIT 1.6.3)SH
+46800 50 6120 5709 UL
+10 /Times-Roman AF
+6120 7886 MT
+(Telcon:)SH
+2777 50 6120 8086 UL
+8120 8991 MT
+(TELCON ZOBRA portable computer.)SH
+6120 10568 MT
+(Torch:)SH
+2388 50 6120 10768 UL
+8120 11673 MT
+(Torch Unicorn 5 initially, but the code runs on other Z80 based CP/N \050as in Nut!\051 systems.)
+79 W( It)
+410 W( uses the BBC)80 W
+8120 12778 MT
+(Computer as a "Base processor", and is similar to the BBC version.  The base processors RS423)
+77 W( port is used)76 W
+8120 13883 MT
+(rather than any built in Modem.  \050UK telecoms legislation effectively)
+109 W( makes modem control software tricky)110 W
+8120 14988 MT
+(business...\051. Two)
+591 W( potential versions exist-one using cursor positioning codes for a MCP and CCCP ROM)170 W
+8120 16093 MT
+(combination of revision less than 1.00, the other version uses the additional facility MCP/CCCP)
+196 W( versions)197 W
+8120 17198 MT
+(greater than 1.  Supports SET SPEED and can generate BREAKs.)SH
+8120 18775 MT
+(Note that binary files must be transferred using SET PARITY to anything other than)
+45 W( NONE!  Parity is neither)44 W
+8120 19880 MT
+(generated nor checked.)SH
+6120 21457 MT
+(US Micro Sales:)SH
+6333 50 6120 21657 UL
+8120 22562 MT
+(S-100-8 based computer.)SH
+6120 24139 MT
+(Vector Graphics:)SH
+6581 50 6120 24339 UL
+8120 25244 MT
+(Vector)SH
+6120 26821 MT
+(Xerox:)SH
+2499 50 6120 27021 UL
+8120 27926 MT
+(Xerox 820.)SH
+6120 29503 MT
+(Z80MU:)SH
+3222 50 6120 29703 UL
+8120 30608 MT
+(Development Kermit on a PC running the)
+298 W( Z80MU Z80 and CP/M 2)299 W
+/Courier SF
+(.)SH
+/Times-Roman SF
+(2 development system.  Allows)299 W
+8120 31713 MT
+(development of the system independent modules to be done on an IBM)
+241 W( PC or clone.  Also allows the)240 W
+8120 32818 MT
+(generation of new .HEX files, that may then be KERMITed to the target system.  Note:)
+54 W( Not)
+359 W( all the BDOS or)55 W
+8120 33923 MT
+(BIOS routines are supported, so avoid "unusual" BIOS/BDOS calls.  \050For example,)
+92 W( DIR from within Kermit)91 W
+8120 35028 MT
+(will fail as one of the BIOS routines returning disk parameters is not supported.\051)SH
+14 /Times-Bold AF
+6120 38630 MT
+(1.7. Installation of Kermit-80)SH
+10 /Times-Roman AF
+6120 40748 MT
+(Kermit-80 was written originally for the Intertec SuperBrain in lowest-common-denominator)
+97 W( 8080)
+445 W( code with the)98 W
+6120 41944 MT
+(standard assembler, ASM \050single source module, no macros, no advanced)
+293 W( instructions\051, so that it could be)292 W
+6120 43140 MT
+(assembled on any CP/M-80 system \050the 8080 assembler is distributed as a standard)
+83 W( part of CP/M-80, whereas the)84 W
+6120 44336 MT
+(fancier Z80 or macro assemblers are normally commercial products\051.  It has since been modified to run on many)99 W
+6120 45532 MT
+(other systems as well.  Kermit-80 should be able)
+106 W( to run on any 8080-, 8085- or Z80-based microcomputer under)107 W
+6120 46728 MT
+(CP/M with appropriate minor changes to reflect the port I/O and screen control for the system \050see below\051.)SH
+6120 49120 MT
+(The proliferation of new systems supported by Kermit-80 made)
+66 W( the program grow so large and complicated that it)65 W
+6120 50316 MT
+(had to be)
+138 W( broken up into system-independent and system-dependent modules, as of version 4 \050this was done by)139 W
+6120 51512 MT
+(Charles Carvalho of ACC\051.  Each module is composed of multiple files.  This has reduced the time and disk)
+57 W( space)56 W
+6120 52708 MT
+(necessary for assembly; Kermit-80 may)
+126 W( once again be assembled on a CP/M system with roughly 250Kbytes of)127 W
+6120 53904 MT
+(space. The)
+302 W( majority of the code does not)
+26 W( need to be reassembled to support a new system.  Unfortunately, it can no)25 W
+6120 55100 MT
+(longer be assembled with ASM, since ASM does not support multiple input files.)
+73 W( To)
+398 W( allow it to be assembled on)74 W
+6120 56296 MT
+(any CP/M system,)
+103 W( the public-domain assembler LASM is included in the distribution kit. Kermit-80 may also be)102 W
+6120 57492 MT
+(assembled with Microsoft's M80 \050not supplied\051.  In theory, any 8080)
+33 W( assembler supporting the INCLUDE directive)34 W
+6120 58688 MT
+(ought to work, as well.)SH
+6120 61080 MT
+(All versions of Kermit-80 are)
+72 W( assembled from the same set of sources, with system dependencies taken care of by)71 W
+6120 62276 MT
+(assembly-time conditionals within the system-dependent module \050eventually, the system-dependent module)
+183 W( will)184 W
+6120 63472 MT
+(itself be broken up into multiple files, one for each system\051.  The most important)
+45 W( system dependencies are terminal)44 W
+6120 64668 MT
+(emulation \050when CONNECTed to)
+153 W( the remote host\051 and screen handling, which are dependent on the individual)154 W
+6120 65864 MT
+(micro's escape codes \050these features are table driven and easily modified for other CP/M)
+74 W( systems\051, and the lowest)73 W
+6120 67060 MT
+(level I/O routines for the serial communications port.  The)
+93 W( port routines are best done only with BDOS calls, but)94 W
+6120 68256 MT
+(some systems do not allow this, primarily because the BDOS)
+91 W( routines strip the parity bit during port I/O, and the)90 W
+6120 69452 MT
+(parity bit is used for data when transmitting binary files.)SH
+6120 71844 MT
+(Kermit-80's I/O routines must check the port status and go elsewhere if no input is available; this allows for virtual)38 W
+ES
+%%Page: 17 18
+BS
+0 SI
+12 /Times-Bold AF
+8280 4404 MT
+(1.7. Installation of Kermit-80)SH
+10 /Times-Italic AF
+51775 XM
+(Page 17)SH
+46800 50 8280 5709 UL
+/Times-Roman SF
+8280 7886 MT
+(terminal connection, keyboard interruption of stuck transmissions, etc.  On systems that fully)
+246 W( implement I/O)245 W
+8280 9082 MT
+(redirection via the optional CP/M IOBYTE facility, this may be done by switching)
+127 W( the IOBYTE definition.  On)128 W
+8280 10278 MT
+(others, however, IN/OUT instructions explicitly referencing the port device registers must be used.)SH
+8280 12670 MT
+(CP/M-80 KERMIT)
+110 W( versions 3.8 and later include a "fuzzy timer" that allows a timeout to occur after an interval)109 W
+8280 13866 MT
+(ranging from 5 to 20 seconds \050depending upon the speed)
+32 W( of the processor and the operating system routines\051 during)33 W
+8280 15062 MT
+(which expected input does not appear at the port.  In this)
+2 W( case, retransmission occurs automatically.  In any case, you)1 W
+8280 16258 MT
+(may type a carriage return during transmission to simulate a timeout when the transfer appears to be stuck.)SH
+12 /Times-Bold AF
+8280 19374 MT
+(1.7.1. Organization of Kermit-80)SH
+10 /Times-Roman AF
+8280 21316 MT
+(Kermit-80 consists of two modules, each of which is generated from multiple source files.)
+209 W( The)
+669 W( first module)210 W
+8280 22512 MT
+(contains the system-independent code;)
+27 W( the second module is configured for a particular system and merged with the)26 W
+8280 23708 MT
+(system-independent module to produce a customized Kermit-80.)SH
+8280 26100 MT
+(The distribution kit contains:)SH
+/Symbol SF
+10070 28005 MT
+(\267)SH
+/Times-Roman SF
+10780 XM
+(the system-independent module,)SH
+/Courier SF
+24001 XM
+(CPSKER.HEX)SH
+/Times-Roman SF
+(;)SH
+/Symbol SF
+10070 29110 MT
+(\267)SH
+/Times-Roman SF
+10780 XM
+(the system-dependent modules,)SH
+/Courier SF
+23612 XM
+(CPV*.HEX)SH
+/Times-Roman SF
+28662 XM
+(\050see table 1-2 and 1-3\051;)SH
+/Symbol SF
+10070 30215 MT
+(\267)SH
+/Times-Roman SF
+10780 XM
+(the source files,)SH
+/Courier SF
+17334 XM
+(CPS*.ASM)SH
+/Times-Roman SF
+22384 XM
+(and)SH
+/Courier SF
+24078 XM
+(CPX*.ASM)SH
+/Times-Roman SF
+(,)SH
+/Symbol SF
+10070 31320 MT
+(\267)SH
+/Times-Roman SF
+10780 XM
+(the public-domain CP/M assembler,)SH
+/Courier SF
+25474 XM
+(LASM.*)SH
+/Times-Roman SF
+(,)SH
+/Symbol SF
+10070 32425 MT
+(\267)SH
+/Times-Roman SF
+10780 XM
+(the public-domain CP/M load/patch utility,)SH
+/Courier SF
+28281 XM
+(MLOAD.*)SH
+ES
+%%Page: 18 19
+BS
+0 SI
+10 /Times-Italic AF
+6120 4404 MT
+(Page 18)SH
+12 /Times-Bold AF
+29686 XM
+(Kermit User Guide: CP/M-80 KERMIT 1.7.1)SH
+46800 50 6120 5709 UL
+46800 50 6120 8086 UL
+10 /Courier AF
+6120 10167 MT
+(Symbol Filename)
+600 W( System)SH
+3600 50 6120 10367 UL
+4800 50 10920 10367 UL
+3600 50 16320 10367 UL
+6120 11854 MT
+(ACCESS CPVACC)600 W
+/Times-Roman SF
+15720 XM
+(Access Matrix)SH
+/Courier SF
+6120 12885 MT
+(ADVANT CPVADV)600 W
+/Times-Roman SF
+15720 XM
+(Northstar Advantage)SH
+/Courier SF
+6120 13916 MT
+(AP6551 CPVAPL)600 W
+/Times-Roman SF
+15720 XM
+(Apple II, Z80 Softcard, 6551 ACIA in serial interface)SH
+/Courier SF
+6120 14947 MT
+(AP6850 CPVA65)600 W
+/Times-Roman SF
+15720 XM
+(Apple II, Z80 Softcard, 6850 ACIA in Serial Iiterface)SH
+/Courier SF
+6120 15978 MT
+(APMMDM CPVAPM)600 W
+/Times-Roman SF
+15720 XM
+(Apple II, Z80 Softcard, Micromodem II in slot 2)SH
+/Courier SF
+6120 17009 MT
+(APCPS CPVCPS)1200 W
+/Times-Roman SF
+15720 XM
+(Apple II, Z80 Softcard, with CPS multifunction card)SH
+/Courier SF
+6120 18040 MT
+(BASICNS CPVBNS)SH
+/Times-Roman SF
+15720 XM
+(Northstar Horizon \050terminal required\051)SH
+/Courier SF
+6120 19071 MT
+(BBC CPVBBC)2400 W
+/Times-Roman SF
+15720 XM
+(Acorn "BBC" computer with Acorn Z80 second processor)SH
+/Courier SF
+6120 20102 MT
+(BBII CPVBB2)1800 W
+/Times-Roman SF
+15720 XM
+(BigBoard II \050terminal required\051)SH
+/Courier SF
+6120 21133 MT
+(BRAINM CPVBRM)600 W
+/Times-Roman SF
+15720 XM
+(Intertec Superbrain using the main port)SH
+/Courier SF
+6120 22164 MT
+(BRAINA CPVBRA)600 W
+/Times-Roman SF
+15720 XM
+(Intertec Superbrain using the Aux port)SH
+/Courier SF
+6120 23195 MT
+(CIFER2 CPVCIF)600 W
+/Times-Roman SF
+15720 XM
+(Cifer 1886 using the VL: Serial port and CP/M V2.2)SH
+/Courier SF
+6120 24226 MT
+(CIFER3 CPVCI3)600 W
+/Times-Roman SF
+15720 XM
+(Cifer 1886 using the VL: Serial port and CP/M V3.0)SH
+/Courier SF
+6120 25257 MT
+(CIFER2 CPVCA2)600 W
+/Times-Roman SF
+15720 XM
+(Cifer 1886 using the AUX: Serial port and CP/M V2.2)SH
+/Courier SF
+6120 26288 MT
+(CIFER3 CPVCA3)600 W
+/Times-Roman SF
+15720 XM
+(Cifer 1886 using the AUX: Serial port and CP/M V3.0)SH
+/Courier SF
+6120 27319 MT
+(CMEMCO CPVCRO)600 W
+/Times-Roman SF
+15720 XM
+(Cromemco with TU-ART card. Terminal required\051)SH
+/Courier SF
+6120 28350 MT
+(COMART CPVCOM)600 W
+/Times-Roman SF
+15720 XM
+(Comart Communicator \050terminal required\051)SH
+/Courier SF
+6120 29381 MT
+(COMPRO CPVPRO)600 W
+/Times-Roman SF
+15720 XM
+(Compupro with Interfacer 4 \050or 3\051.  Terminal required.)SH
+/Courier SF
+6120 30412 MT
+(CPC CPVCPC)2400 W
+/Times-Roman SF
+15720 XM
+(Amstrad CPC 664 and 6128 and CP/M 3)SH
+/Courier SF
+6120 31443 MT
+(CPM3 CPVCP3)1800 W
+/Times-Roman SF
+15720 XM
+("Generic": CP/M 3.0 \050CP/M Plus\051 systems \050terminal req'd\051)SH
+/Courier SF
+6120 32474 MT
+(CPT85XX CPVCPT)SH
+/Times-Roman SF
+15720 XM
+(CPT-85xx wordprocessor with CP/M)SH
+/Courier SF
+6120 33505 MT
+(DELPHI CPVDEL)600 W
+/Times-Roman SF
+15720 XM
+(Digicomp Delphi 100 \050terminal required\051)SH
+/Courier SF
+6120 34536 MT
+(DISC CPVDIS)1800 W
+/Times-Roman SF
+15720 XM
+(Action Computer Enterprises "Discovery" \050terminal req'd\051)SH
+/Courier SF
+6120 35567 MT
+(DMII CPVDM2)1800 W
+/Times-Roman SF
+15720 XM
+(DECmate II with CP/M option)SH
+/Courier SF
+6120 36598 MT
+(GENER CPVGEN)1200 W
+/Times-Roman SF
+15720 XM
+("Generic": CPM 2.2 systems with IOBYTE \050terminal req'd\051)SH
+/Courier SF
+6120 37629 MT
+(GENIE CPVGNI)1200 W
+/Times-Roman SF
+15720 XM
+(Video Genie)SH
+/Courier SF
+6120 38660 MT
+(H8QUAD CPVH8Q)600 W
+/Times-Roman SF
+15720 XM
+(Heath-8 with Quad 8 i/o board)SH
+/Courier SF
+6120 39691 MT
+(HEATH CPVH89)1200 W
+/Times-Roman SF
+15720 XM
+(Heath/Zenith H89)SH
+/Courier SF
+6120 40722 MT
+(HORIZON CPVHOR)SH
+/Times-Roman SF
+15720 XM
+(Northstar Horizon \050terminal required\051)SH
+/Courier SF
+6120 41753 MT
+(KPII CPVKPR)1800 W
+/Times-Roman SF
+15720 XM
+(Kaypro-II \050and 4; probably supports all Kaypro systems\051)SH
+/Courier SF
+6120 42784 MT
+(LOBO CPVLBO)1800 W
+/Times-Roman SF
+15720 XM
+(Lobo Max-80)SH
+6120 44575 MT
+("symbol" is the symbol used to select the target system, in)SH
+/Courier SF
+29658 XM
+(CPVTYP.ASM)SH
+/Times-Roman SF
+(;)SH
+6120 46802 MT
+("filename" is the name under which the module is supplied in the distribution.)SH
+/Times-Bold SF
+18854 48412 MT
+(Table 1-2:)SH
+/Times-Roman SF
+23715 XM
+(Systems supported by Kermit-80 \050Part 1\051)SH
+46800 50 6120 50222 UL
+ES
+%%Page: 19 20
+BS
+0 SI
+12 /Times-Bold AF
+8280 4404 MT
+(1.7.1. Organization of Kermit-80)SH
+10 /Times-Italic AF
+51775 XM
+(Page 19)SH
+46800 50 8280 5709 UL
+46800 50 8280 8086 UL
+/Courier SF
+8280 10167 MT
+(Symbol Filename)
+600 W( System)SH
+3600 50 8280 10367 UL
+4800 50 13080 10367 UL
+3600 50 18480 10367 UL
+8280 11854 MT
+(M2215 CPVMRL)1200 W
+/Times-Roman SF
+17880 XM
+(British Telecom Merlin/Rair Black Box \050terminal required\051)SH
+/Courier SF
+8280 12885 MT
+(MBEE CPVBEE)1800 W
+/Times-Roman SF
+17880 XM
+(Microbee)SH
+/Courier SF
+8280 13916 MT
+(MDI CPVMDI)2400 W
+/Times-Roman SF
+17880 XM
+(Morrow Decision I \050terminal required\051)SH
+/Courier SF
+8280 14947 MT
+(MIKKO CPVMIK)1200 W
+/Times-Roman SF
+17880 XM
+(MikroMikko)SH
+/Courier SF
+8280 15978 MT
+(MMATE CPVMM)1200 W
+/Times-Roman SF
+17880 XM
+(PMC 101 Micromate \050terminal required\051)SH
+/Courier SF
+8280 17009 MT
+(MMDI CPVUD)1800 W
+/Times-Roman SF
+17880 XM
+(Morrow Micro Decision I \050terminal required\051)SH
+/Courier SF
+8280 18040 MT
+(NCRDMV CPVDMV)600 W
+/Times-Roman SF
+17880 XM
+(NCR Decision Mate V.  \050Terminal required?\051)SH
+/Courier SF
+8280 19071 MT
+(NORTHS CPVNS)600 W
+/Times-Roman SF
+17880 XM
+(Northstar Horizon with HSIO-4 card \050terminal req'd\051)SH
+/Courier SF
+8280 20102 MT
+(OSBRN1 CPVOSB)600 W
+/Times-Roman SF
+17880 XM
+(Osborne 1)SH
+/Courier SF
+8280 21133 MT
+(OSI CPVOSI)2400 W
+/Times-Roman SF
+17880 XM
+(Ohio Scientific)SH
+/Courier SF
+8280 22164 MT
+(PCI2651 CPVPCI)SH
+/Times-Roman SF
+17880 XM
+(Ithaca Intersystems with VI0 card \050terminal required\051)SH
+/Courier SF
+8280 23195 MT
+(PCW CPVPCW)2400 W
+/Times-Roman SF
+17880 XM
+(Amstrad PCW 8256/8512 with serial interface)SH
+/Courier SF
+8280 24226 MT
+(PX8 CPVPX8)2400 W
+/Times-Roman SF
+17880 XM
+(Epson PX-8)SH
+/Courier SF
+8280 25257 MT
+(RM380ZM CPVRMM)SH
+/Times-Roman SF
+17880 XM
+(Research Machines 380Z with MDS \0505.25" discs\051)SH
+/Courier SF
+8280 26288 MT
+(RM380ZF CPVRMF)SH
+/Times-Roman SF
+17880 XM
+(Research Machines 380Z with FDS \0508" discs\051)SH
+/Courier SF
+8280 27319 MT
+(ROBIN CPVROB)1200 W
+/Times-Roman SF
+17880 XM
+(DEC VT180)SH
+/Courier SF
+8280 28350 MT
+(S1008 CPVUSM)1200 W
+/Times-Roman SF
+17880 XM
+(US Microsales S-100-8 \050terminal required\051)SH
+/Courier SF
+8280 29381 MT
+(SANYO CPVSAN)1200 W
+/Times-Roman SF
+17880 XM
+(Sanyo MBC-1100)SH
+/Courier SF
+8280 30412 MT
+(SB6 CPVSB6)2400 W
+/Times-Roman SF
+17880 XM
+(Micromint SB-180 with 6Mhz CPU \050terminal required\051)SH
+/Courier SF
+8280 31443 MT
+(SB9 CPVSB9)2400 W
+/Times-Roman SF
+17880 XM
+(Micromint SB-180 with 9Mhz CPU \050terminal required\051)SH
+/Courier SF
+8280 32474 MT
+(SCNTPR CPVSCN)600 W
+/Times-Roman SF
+17880 XM
+(Screentyper)SH
+/Courier SF
+8280 33505 MT
+(TELCON CPVTEL)600 W
+/Times-Roman SF
+17880 XM
+(TELCON Zobra portable)SH
+/Courier SF
+8280 34536 MT
+(TELETEK CPVTET)SH
+/Times-Roman SF
+17880 XM
+(Teletek Systemaster)SH
+/Courier SF
+8280 35567 MT
+(TORCH CPVTRC)1200 W
+/Times-Roman SF
+17880 XM
+(Torch computers BBC-B with Z80 second processors)SH
+/Courier SF
+8280 36598 MT
+(TRS80LB CPVTLB)SH
+/Times-Roman SF
+17880 XM
+(TRS-80 model II with Lifeboat 2.25C CP/M Display)SH
+/Courier SF
+8280 37629 MT
+(TRS80PT CPVTPT)SH
+/Times-Roman SF
+17880 XM
+(TRS-80 model II with Pickles + Trout CP/M Display)SH
+/Courier SF
+8280 38660 MT
+(TRSM4 CPVTM4)1200 W
+/Times-Roman SF
+17880 XM
+(TRS-80 model IV)SH
+/Courier SF
+8280 39691 MT
+(VECTOR CPVVEC)600 W
+/Times-Roman SF
+17880 XM
+(Vector Graphics)SH
+/Courier SF
+8280 40722 MT
+(XER820 CPVXER)600 W
+/Times-Roman SF
+17880 XM
+(Xerox 820)SH
+/Courier SF
+8280 41753 MT
+(Z100 CPVZ00)1800 W
+/Times-Roman SF
+17880 XM
+(Z-100 under CP/M-85)SH
+/Courier SF
+8280 42784 MT
+(Z80MU CPVZ80)1200 W
+/Times-Roman SF
+17880 XM
+(Z80MU development system on a PC)SH
+8280 44575 MT
+("symbol" is the symbol used to select the target system, in)SH
+/Courier SF
+31818 XM
+(CPXTYP.ASM)SH
+/Times-Roman SF
+(;)SH
+8280 46802 MT
+("filename" is the name under which the module is supplied in the distribution.)SH
+/Times-Bold SF
+21014 48412 MT
+(Table 1-3:)SH
+/Times-Roman SF
+25875 XM
+(Systems supported by Kermit-80 \050Part 2\051)SH
+46800 50 8280 50222 UL
+ES
+%%Page: 20 21
+BS
+0 SI
+10 /Times-Italic AF
+6120 4404 MT
+(Page 20)SH
+12 /Times-Bold AF
+29686 XM
+(Kermit User Guide: CP/M-80 KERMIT 1.7.1)SH
+46800 50 6120 5709 UL
+46800 50 6120 8086 UL
+10 /Courier AF
+6120 10167 MT
+(Symbol Terminal)
+600 W( type)SH
+3600 50 6120 10367 UL
+4800 50 10920 10367 UL
+2400 50 16320 10367 UL
+6120 11854 MT
+(CRT)SH
+/Times-Roman SF
+10920 XM
+(Dumb terminal type.  Does not do cursor addressing)SH
+/Courier SF
+6120 12885 MT
+(ADM3A)SH
+/Times-Roman SF
+10920 XM
+(Lear Seigler ADM 3A)SH
+/Courier SF
+6120 13916 MT
+(ADM22)SH
+/Times-Roman SF
+10920 XM
+(Lear Seigler ADM 22)SH
+/Courier SF
+6120 14947 MT
+(AM230)SH
+/Times-Roman SF
+10920 XM
+(Ampro 230)SH
+/Courier SF
+6120 15978 MT
+(H1500)SH
+/Times-Roman SF
+10920 XM
+(Hazeltine 1500)SH
+/Courier SF
+6120 17009 MT
+(SMRTVD)SH
+/Times-Roman SF
+10920 XM
+(Netronics Smartvid)SH
+/Courier SF
+6120 18040 MT
+(SOROQ)SH
+/Times-Roman SF
+10920 XM
+(Soroq IQ-120)SH
+/Courier SF
+6120 19071 MT
+(TVI912)SH
+/Times-Roman SF
+10920 XM
+(Televideo 912)SH
+/Courier SF
+6120 20102 MT
+(TVI925)SH
+/Times-Roman SF
+10920 XM
+(Televideo 925 or Freedom 100)SH
+/Courier SF
+6120 21133 MT
+(VT52)SH
+/Times-Roman SF
+10920 XM
+(Dec VT52 or equivalent \050H19\051)SH
+/Courier SF
+6120 22164 MT
+(VT100)SH
+/Times-Roman SF
+10920 XM
+(Dec VT100 or equivalent)SH
+/Courier SF
+6120 23195 MT
+(WYSE)SH
+/Times-Roman SF
+10920 XM
+(Wyse 100)SH
+6120 24986 MT
+("symbol" is the symbol used to select the target system, in)SH
+/Courier SF
+29658 XM
+(CPXTYP.ASM)SH
+/Times-Roman SF
+(;)SH
+6120 27213 MT
+("Terminal type" is the type of terminal "symbol" selects.)SH
+/Times-Bold SF
+20132 28823 MT
+(Table 1-4:)SH
+/Times-Roman SF
+24993 XM
+(Terminals supported by Kermit-80)SH
+46800 50 6120 30633 UL
+12 /Times-Bold AF
+6120 33549 MT
+(1.7.2. Downloading Kermit-80)SH
+10 /Times-Roman AF
+6120 35491 MT
+(You'll need either a pre-configured)4 W
+/Courier SF
+20552 XM
+(.COM)SH
+/Times-Roman SF
+23207 XM
+(file or the system-independent module,)5 W
+/Courier SF
+39119 XM
+(CPSKER)SH
+/Times-Roman SF
+(, in binary \050)5 W
+/Courier SF
+(.COM)SH
+/Times-Roman SF
+(\051 or hex)5 W
+6120 36687 MT
+(\050)SH
+/Courier SF
+(.HEX)SH
+/Times-Roman SF
+(\051 format and the system-dependent overlay for your system \050from Tables 1-2 and 1-3\051.  If your system is)
+42 W( not)41 W
+6120 37883 MT
+(listed in the table, get the generic CP/M 2)12 W
+/Courier SF
+(.)SH
+/Times-Roman SF
+(2 Kermit)
+12 W( or the generic CP/M 3 Kermit.  If you already have a version of)13 W
+6120 39079 MT
+(Kermit on)
+75 W( your micro and you want to install a new version, simply use your present version to get the new files.)74 W
+6120 40275 MT
+(Transfer the files to your system and skip ahead to "merging the modules".)SH
+6120 42667 MT
+(If you do)
+27 W( not have a copy of Kermit on your micro, and you cannot borrow a Kermit floppy but you do have access)28 W
+6120 43863 MT
+(to a mainframe computer with a copy of the Kermit-80 distribution, you should read this section.)SH
+6120 46255 MT
+(There are several ways to get CP/M Kermit)
+106 W( from a host system to your micro.  The easiest is to "download" the)105 W
+6120 47451 MT
+(necessary "hex" files into your micro's memory and then save them on the disk.)
+84 W( If)
+419 W( you have a terminal emulator)85 W
+6120 48647 MT
+(program on your micro which can save a copy of the session to disk, connect to your host, and type)
+69 W( the necessary)68 W
+6120 49843 MT
+(files. Exit)
+316 W( from the emulator, saving)
+33 W( the session log, and edit the session log to extract the hex files.  Skip ahead to)34 W
+6120 51039 MT
+("merging the files".)SH
+6120 53431 MT
+(The following is a procedure which, though far from foolproof, should allow you to get a version of Kermit to your)32 W
+6120 54627 MT
+(CP/M based micro.  It depends upon the host prompt, or at least the first character of the host)
+62 W( prompt, being some)63 W
+6120 55823 MT
+(character that cannot appear in a hex)
+58 W( file \050the valid characters for hex files are the digits 0-9, the upper case letters)57 W
+6120 57019 MT
+(A-F, the colon ``)55 W
+/Courier SF
+(:)SH
+/Times-Roman SF
+('', carriage return, and line feed\051.  As soon the prompt character is encountered, the transfer)
+55 W( will)56 W
+6120 58215 MT
+(terminate. If)
+288 W( your host)
+19 W( does not issue a prompt that will accommodate this scheme, you can achieve the same effect)18 W
+6120 59411 MT
+(by adding an atsign ``@'' to the very end of the hex file before sending it from the host.  The)
+36 W( program below looks)37 W
+6120 60607 MT
+(for an atsign \050the normal DEC-20 prompt, hex 40\051.  DECSYSTEM-10 users would)
+241 W( look for a dot, hex 2E;)240 W
+6120 61803 MT
+(VAX/VMS or UNIX users would look for a dollar sign, hex 24; UNIX C-Shell users would look)
+29 W( for a percent sign,)30 W
+6120 62999 MT
+(hex 26.)SH
+8120 64790 MT
+(1.)SH
+9120 XM
+(For CP/M 2)44 W
+/Courier SF
+(.)SH
+/Times-Roman SF
+(2 systems, connect to a floppy disk with plenty)
+44 W( of free space.  Run DDT and type in the)43 W
+9120 65895 MT
+(following \050the comments should not be typed in; they are there just to tell you what's happening\051:)137 W
+9120 67000 MT
+(\050Note that this wont work for CP/M Plus or 3)SH
+/Courier SF
+(.)SH
+/Times-Roman SF
+(0 systems!\051)SH
+ES
+%%Page: 21 22
+BS
+0 SI
+12 /Times-Bold AF
+8280 4404 MT
+(1.7.2. Downloading Kermit-80)SH
+10 /Times-Italic AF
+51775 XM
+(Page 21)SH
+46800 50 8280 5709 UL
+46800 50 8280 8086 UL
+/Courier SF
+8280 9585 MT
+(-a100 ;Begin)
+10800 W( assembling code at 100)SH
+11280 10616 MT
+(0100 LXI)
+1800 W( H,2FE)
+SH( ;Where)
+3600 W( to store in memory)SH
+11280 11647 MT
+(0103 SHLD)
+1800 W( 200)
+SH( ;Keep)
+4200 W( pointer there)SH
+11280 12678 MT
+(0106 MVI)
+1800 W( E,D)
+SH( ;Get)
+4800 W( a CR)SH
+11280 13709 MT
+(0108 MVI)
+1800 W( C,4)
+SH( ;Output)
+4800 W( to PUNCH \050send to HOST\051)SH
+11280 14740 MT
+(010A CALL)
+1800 W( 5)SH
+11280 15771 MT
+(010D MVI)
+1800 W( C,3)
+SH( ;Input)
+4800 W( from READER \050read from HOST\051)SH
+11280 16802 MT
+(010F CALL)
+1800 W( 5)SH
+11280 17833 MT
+(0112 ANI)
+1800 W( 7F)
+SH( ;Strip)
+5400 W( parity bit)SH
+11280 18864 MT
+(0114 PUSH)
+1800 W( PSW)
+SH( ;Save)
+4200 W( a and flags)SH
+11280 19895 MT
+(0115 MOV)
+1800 W( E,A)
+SH( ;Move)
+4800 W( char to E for echo)SH
+11280 20926 MT
+(0116 MVI)
+1800 W( C,2)
+SH( ;Output)
+4800 W( to screen)SH
+11280 21957 MT
+(0118 CALL)
+1800 W( 5)SH
+11280 22988 MT
+(011B POP)
+1800 W( PSW)
+SH( ;Restore)
+4800 W( A and flags)SH
+11280 24019 MT
+(011C CPI)
+1800 W( 40)
+SH( ;\050or)
+5400 W( 4E,24,26,etc\051 System prompt?)SH
+11280 25050 MT
+(011E JZ)
+1800 W( 127)
+SH( ;Yes,)
+5400 W( have whole file in memory)SH
+11280 26081 MT
+(0121 CALL)
+1800 W( 17A)
+SH( ;No,)
+4200 W( store another byte)SH
+11280 27112 MT
+(0124 JMP)
+1800 W( 10D)
+SH( ;Read)
+4800 W( another byte)SH
+11280 28143 MT
+(0127 MVI)
+1800 W( A,1A)
+SH( ;Get)
+4200 W( a Control-Z \050CP/M EOF mark\051)SH
+11280 29174 MT
+(0129 CALL)
+1800 W( 17A)
+SH( ;Store)
+4200 W( it in memory)SH
+11280 30205 MT
+(012C LXI)
+1800 W( H,300)
+SH( ;Get)
+3600 W( memory pointer)SH
+11280 31236 MT
+(012F SHLD)
+1800 W( 202)
+SH( ;Store)
+4200 W( as DMA pointer)SH
+11280 32267 MT
+(0132 LDA)
+1800 W( 201)
+SH( ;Get)
+4800 W( 'HI' byte of memory pointer)SH
+11280 33298 MT
+(0135 STA)
+1800 W( 200)
+SH( ;and)
+4800 W( store it as 'LO' one)SH
+11280 34329 MT
+(0138 XRA)
+1800 W( A)SH
+11280 35360 MT
+(0139 STA)
+1800 W( 201)
+SH( ;Zero)
+4800 W( 'HI' byte \050slow *256\051)SH
+11280 36391 MT
+(013C MVI)
+1800 W( C,16)
+SH( ;Make)
+4200 W( NEW file)SH
+11280 37422 MT
+(013E LXI)
+1800 W( D,5C)
+SH( ;With)
+4200 W( FCB1)SH
+11280 38453 MT
+(0141 CALL)
+1800 W( 5)SH
+11280 39484 MT
+(0144 CALL)
+1800 W( 15E)
+SH( ;Write)
+4200 W( 128 bytes \050sector\051)SH
+11280 40515 MT
+(0147 CALL)
+1800 W( 15E)
+SH( ;Write)
+4200 W( another sector)SH
+11280 41546 MT
+(014A LXI)
+1800 W( H,FFFF)
+SH( ;Get)
+3000 W( a 16-bit Minus One)SH
+11280 42577 MT
+(014D XCHG)
+1800 W( ;into)
+6600 W( DE)SH
+11280 43608 MT
+(014E LHLD)
+1800 W( 200)
+SH( ;Get)
+4200 W( 256-byte counter)SH
+11280 44639 MT
+(0151 DAD)
+1800 W( D)
+SH( ;Decrement)6000 W
+11280 45670 MT
+(0152 SHLD)
+1800 W( 200)
+SH( ;and)
+4200 W( store back)SH
+11280 46701 MT
+(0155 MVI)
+1800 W( A,2)
+SH( ;Check)
+4800 W( if)SH
+11280 47732 MT
+(0157 CMP)
+1800 W( L)
+SH( ;)
+6000 W( 256-byte counter down to offset)SH
+11280 48763 MT
+(0158 JZ)
+1800 W( 183)
+SH( ;Yes,)
+5400 W( we're done)SH
+11280 49794 MT
+(015B JMP)
+1800 W( 144)
+SH( ;Keep)
+4800 W( writing..)SH
+11280 50825 MT
+(015E LHLD)
+1800 W( 202)
+SH( ;Get)
+4200 W( file-pointer)SH
+11280 51856 MT
+(0161 XCHG)
+1800 W( ;into)
+6600 W( DE)SH
+11280 52887 MT
+(0162 MVI)
+1800 W( C,1A)
+SH( ;Set)
+4200 W( DMA-address)SH
+11280 53918 MT
+(0164 CALL)
+1800 W( 5)SH
+11280 54949 MT
+(0167 MVI)
+1800 W( C,15)
+SH( ;Write)
+4200 W( sector \050128 bytes\051)SH
+11280 55980 MT
+(0169 LXI)
+1800 W( D,5C)
+SH( ;using)
+4200 W( FCB1)SH
+11280 57011 MT
+(016C CALL)
+1800 W( 5)SH
+11280 58042 MT
+(016F LHLD)
+1800 W( 202)
+SH( ;Get)
+4200 W( file-pointer)SH
+11280 59073 MT
+(0172 LXI)
+1800 W( D,80)
+SH( ;128-bytes)4200 W
+11280 60104 MT
+(0175 DAD)
+1800 W( D)
+SH( ;added)
+6000 W( to file-pointer)SH
+11280 61135 MT
+(0176 SHLD)
+1800 W( 202)
+SH( ;and)
+4200 W( save)SH
+11280 62166 MT
+(0179 RET)
+1800 W( ;and)
+7200 W( return)SH
+11280 63197 MT
+(017A LHLD)
+1800 W( 200)
+SH( ;Get)
+4200 W( Memory-pointer)SH
+11280 64228 MT
+(017D MOV)
+1800 W( M,A)
+SH( ;Store)
+4800 W( character)SH
+11280 65259 MT
+(017E INX)
+1800 W( H)
+SH( ;Increment)
+6000 W( Pointer)SH
+11280 66290 MT
+(017F SHLD)
+1800 W( 200)
+SH( ;and)
+4200 W( save)SH
+11280 67321 MT
+(0182 RET)
+1800 W( ;and)
+7200 W( return)SH
+11280 68352 MT
+(0183 MVI)
+1800 W( C,10)
+SH( ;CLOSE)
+4200 W( file)SH
+11280 69383 MT
+(0185 LXI)
+1800 W( D,5C)
+SH( ;using)
+4200 W( FCB1)SH
+11280 70414 MT
+(0188 CALL)
+1800 W( 5)SH
+11280 71445 MT
+(018B JMP)
+1800 W( 0)
+SH( ;Force)
+6000 W( WARM BOOT)SH
+ES
+%%Page: 22 23
+BS
+0 SI
+10 /Times-Italic AF
+6120 4404 MT
+(Page 22)SH
+12 /Times-Bold AF
+29686 XM
+(Kermit User Guide: CP/M-80 KERMIT 1.7.2)SH
+46800 50 6120 5709 UL
+10 /Courier AF
+9120 7824 MT
+(0179)SH
+9120 8855 MT
+(-^C ;\050Type)
+12000 W( Control-C\051 Return to CP/M)SH
+9120 9886 MT
+(A>SAVE 1 FETCH.COM)
+SH( ;Save)
+3000 W( program, we need to run it twice.)SH
+/Times-Bold SF
+15591 11496 MT
+(Figure 1-1:)SH
+/Times-Roman SF
+20840 XM
+(Bootstrap program for Kermit-80 and CP/M Version 2.2)SH
+46800 50 6120 13306 UL
+9120 14823 MT
+(Alternatively, an assembler source file for this program is distributed with)
+374 W( CP/M Kermit as)373 W
+/Courier SF
+9120 15928 MT
+(CPKFET.ASM)SH
+/Times-Roman SF
+(. You)
+478 W( might prefer to type the assembler)
+114 W( version in and assemble and load it \050ASM)115 W
+9120 17033 MT
+(CPKFET, LOAD CPKFET, or MASM CPKFET,)
+43 W( MLOAD CPKFET\051, to let the assembler and loader)42 W
+9120 18138 MT
+(catch any typing errors.)SH
+8120 20348 MT
+(2.)SH
+9120 XM
+(Connect to your host using a terminal or a terminal emulation program.  Ensure that your host does)
+6 W( not)7 W
+9120 21453 MT
+(have your terminal in "page mode" \050does not pause at the end of each screenful\051.)SH
+8120 23663 MT
+(3.)SH
+9120 XM
+(Tell the host to display the first hex file \050the)
+38 W( system-independent module\051 at your terminal, e.g. give a)37 W
+9120 24768 MT
+(command like)SH
+/Courier SF
+15064 XM
+(TYPE CPSKER.HEX)SH
+/Times-Roman SF
+(,)SH
+/Times-Italic SF
+24564 XM
+(without a terminating carriage return)SH
+/Times-Roman SF
+(.)SH
+3001 50 24564 24968 UL
+8120 26978 MT
+(4.)SH
+9120 XM
+(Return to your micro by switching the cable from the terminal to the micro, or by terminating)
+142 W( the)143 W
+9120 28083 MT
+(micro's terminal program.)SH
+8120 30293 MT
+(5.)SH
+9120 XM
+(Make sure your IOBYTE is set so that)17 W
+/Courier SF
+24864 XM
+(RDR:)SH
+/Times-Roman SF
+27530 XM
+(and)SH
+/Courier SF
+29240 XM
+(PUN:)SH
+/Times-Roman SF
+31906 XM
+(correspond to the I/O port that is connected to)16 W
+9120 31398 MT
+(the host \050this would normally be the case unless you have done something special to change things\051.)SH
+8120 33608 MT
+(6.)SH
+9120 XM
+(Load the program you entered in the first step with DDT, and use it to capture the first hex file:)SH
+/Courier SF
+11520 35263 MT
+(DDT FETCH.COM)SH
+11520 36294 MT
+(-icpsker.hex ;Setup)
+6600 W( FCB for file CPSKER.HEX)SH
+11520 37325 MT
+(-g100,179 ;Execute)
+8400 W( the program.)SH
+/Times-Roman SF
+9120 39042 MT
+(Now there should be a file)SH
+/Courier SF
+19951 XM
+(CPSKER.HEX)SH
+/Times-Roman SF
+26201 XM
+(on your connected disk.)SH
+8120 41252 MT
+(7.)SH
+9120 XM
+(Return to the host, and tell it)
+112 W( to display the second hex file \050the system-dependent module for your)113 W
+9120 42357 MT
+(configuration\051. Again,)
+250 W( do not type the terminating carriage return.)SH
+8120 44567 MT
+(8.)SH
+9120 XM
+(Return to your micro, and run the capture program again:)SH
+/Courier SF
+11520 46222 MT
+(DDT FETCH.COM)SH
+11520 47253 MT
+(-icpxovl.hex ;Setup)
+6600 W( FCB to create CPXOVL.HEX)SH
+11520 48284 MT
+(-g100,179 ;Execute)
+8400 W( the program.)SH
+/Times-Roman SF
+9120 50001 MT
+(Now there should be a file)132 W
+/Courier SF
+20743 XM
+(CPXOVL.HEX)SH
+/Times-Roman SF
+27124 XM
+(on your connected disk.  Replace)131 W
+/Courier SF
+41435 XM
+(CPXOVL.HEX)SH
+/Times-Roman SF
+47816 XM
+(in this)131 W
+9120 51106 MT
+(example with the appropriate overlay file for your system.)SH
+6120 52897 MT
+(Merging the files:)SH
+8120 54688 MT
+(1.)SH
+9120 XM
+(For purposes of illustration, we will assume the system-dependent overlay is called "cpxovl)162 W
+/Courier SF
+(.)SH
+/Times-Roman SF
+(hex".)SH
+9120 55793 MT
+(The two hex)
+1 W( files may be combined with MLOAD or DDT.  If you already have a running Kermit, you)SH
+9120 56898 MT
+(can transfer)208 W
+/Courier SF
+14478 XM
+(MLOAD.HEX)SH
+/Times-Roman SF
+20337 XM
+(to your system and create)209 W
+/Courier SF
+31852 XM
+(MLOAD.COM)SH
+/Times-Roman SF
+37711 XM
+(by running LOAD.  If you're)209 W
+9120 58003 MT
+(bootstrapping Kermit, you could transfer)27 W
+/Courier SF
+25864 XM
+(MLOAD.HEX)SH
+/Times-Roman SF
+31541 XM
+(to your system the same way you got the)
+27 W( other)26 W
+9120 59108 MT
+(two)SH
+/Courier SF
+10910 XM
+(.HEX)SH
+/Times-Roman SF
+13601 XM
+(files, but it's probably simpler to use DDT to get Kermit running, and get MLOAD later if)41 W
+9120 60213 MT
+(you need it.)SH
+8120 62423 MT
+(2.)SH
+9120 XM
+(Using MLOAD, the two pieces may be easily merged:)SH
+/Courier SF
+11520 64078 MT
+(A>mload kerm411=cpsker,cpxovl)SH
+16200 50 12720 64278 UL
+/Courier-Oblique SF
+11520 65109 MT
+(\050Some messages about program size, etc...\051)SH
+/Courier SF
+11520 66140 MT
+(A>)SH
+/Times-Roman SF
+8120 68350 MT
+(3.)SH
+9120 XM
+(If you don't have MLOAD running, it's a bit more complex:)SH
+ES
+%%Page: 23 24
+BS
+0 SI
+12 /Times-Bold AF
+8280 4404 MT
+(1.7.2. Downloading Kermit-80)SH
+10 /Times-Italic AF
+51775 XM
+(Page 23)SH
+46800 50 8280 5709 UL
+/Courier SF
+13680 7824 MT
+(A>ddt cpsker.hex)SH
+8400 50 14880 8024 UL
+13680 8855 MT
+(NEXT PC)600 W
+13680 9886 MT
+(3500 0100)SH
+13680 10917 MT
+(-icpxovl.hex)SH
+6600 50 14280 11117 UL
+13680 11948 MT
+(-r)SH
+600 50 14280 12148 UL
+13680 12979 MT
+(NEXT PC)600 W
+13680 14010 MT
+(xxxx 0000)SH
+13680 15041 MT
+(-^C)SH
+1200 50 14280 15241 UL
+13680 16072 MT
+(A>save)SH
+/Courier-Oblique SF
+17880 XM
+(dd)SH
+/Courier SF
+19680 XM
+(kerm411.com)SH
+11400 50 14880 16272 UL
+/Times-Roman SF
+11280 17789 MT
+(The page count)
+50 W( \050"dd"\051 used in the SAVE command is calculated from the last address \050"xxxx"\051 given)49 W
+11280 18894 MT
+(by DDT in)
+48 W( response to the R command: drop the last two digits and add 1 if they were not zero, then)49 W
+11280 19999 MT
+(convert from hexadecimal \050base 16\051 to decimal \050base 10\051: 684F)
+11 W( becomes 69 hex, which is 105 decimal)10 W
+11280 21104 MT
+(\0505 times 16 plus 9\051)
+89 W( -- but 6700 becomes 67 hex, or 103 decimal \050consult an introductory computing)90 W
+11280 22209 MT
+(book if you don't understand number base conversion\051.)SH
+10280 24419 MT
+(4.)SH
+11280 XM
+(If you are using the Z80MU)
+53 W( CP/M and Z80 development toolkit on an IBM PC or clone, then follow)52 W
+11280 25524 MT
+(the same instructions as for a genuine CP/M system.  When you have loaded your file, you will)
+57 W( have)58 W
+11280 26629 MT
+(to ship the .COM or two .HEX files to the target CP/M system. \050Possibly)
+108 W( using a previous issue of)107 W
+11280 27734 MT
+(Kermit?\051)SH
+10280 29944 MT
+(5.)SH
+11280 XM
+(Note that CP/M hex files have checksums on each line.  If there were any transmission)
+67 W( errors during)68 W
+11280 31049 MT
+(the downloading process, MLOAD or DDT will)
+210 W( notice a bad checksum and will report an error)209 W
+11280 32154 MT
+(\050something like "Illegal Format"\051.  If you get any errors during loading, either fix the hex)
+63 W( file locally)64 W
+11280 33259 MT
+(with an editor, or repeat the transfer.)SH
+8280 35651 MT
+(You now should have a running version of Kermit-80, called)SH
+/Courier SF
+32915 XM
+(KERM411.COM)SH
+/Times-Roman SF
+(.)SH
+8280 38043 MT
+(Test your new Kermit by running it.  If)
+96 W( it gives you a prompt, it might be OK. \050don't delete your old one yet...\051.)95 W
+8280 39239 MT
+(Instead of a prompt, you could get one of two messages indicating that the configuration information is invalid:)SH
+/Courier SF
+10680 40894 MT
+(?Kermit has not been configured for a target system)SH
+/Times-Roman SF
+8280 42611 MT
+(or)SH
+/Courier SF
+10680 44266 MT
+(?Consistency check on configuration failed)SH
+/Times-Roman SF
+8280 45983 MT
+(Of course, neither of these messages should appear)
+109 W( if you're building Kermit from the distribution kit.  The first)110 W
+8280 47179 MT
+(message indicates that)
+1 W( the overlay was not found where the system-independent module expected to find it, probably)SH
+8280 48375 MT
+(because the overlay address is incorrect; the second indicates that the version of CPXLNK used in the system-)157 W
+8280 49571 MT
+(dependent module is incompatible with the system-independent module.)SH
+8280 51963 MT
+(Once you are satisfied that KERMIT40 works correctly, you should rename your old)76 W
+/Courier SF
+43484 XM
+(KERMIT.COM)SH
+/Times-Roman SF
+49810 XM
+(to something)75 W
+8280 53159 MT
+(else, like)SH
+/Courier SF
+12085 XM
+(OKERMIT.COM)SH
+/Times-Roman SF
+(, and rename)SH
+/Courier SF
+24072 XM
+(KERMIT40.COM)SH
+/Times-Roman SF
+31522 XM
+(to)SH
+/Courier SF
+32550 XM
+(KERMIT.COM)SH
+/Times-Roman SF
+(.)SH
+12 /Times-Bold AF
+8280 56275 MT
+(1.7.3. Assembling Kermit-80 from the sources)SH
+10 /Times-Roman AF
+8280 58217 MT
+(Kermit-80 is built in two pieces from the following files:)SH
+/Times-Italic SF
+8280 60006 MT
+(The system-independent files:)SH
+/Courier SF
+9480 61111 MT
+(CPSKER.ASM)SH
+/Times-Roman SF
+16280 XM
+(header file)SH
+/Courier SF
+9480 62216 MT
+(CPSDEF.ASM)SH
+/Times-Roman SF
+16280 XM
+(definitions for both KERMIT and KERSYS)SH
+/Courier SF
+9480 63321 MT
+(CPSMIT.ASM)SH
+/Times-Roman SF
+16280 XM
+(initialization, main loop, miscellaneous commands \050BYE, EXIT, LOG, SET,)
+30 W( SHOW, STATUS,)31 W
+16280 64426 MT
+(and VERSION\051)SH
+/Courier SF
+9480 65531 MT
+(CPSCOM.ASM)SH
+/Times-Roman SF
+16280 XM
+(second part of commands, status and set file)SH
+/Courier SF
+9480 66636 MT
+(CPSPK1.ASM)SH
+/Times-Roman SF
+16280 XM
+(part 1 of the KERMIT protocol handler \050SEND, RECEIVE, LOGOUT,and FINISH commands\051)SH
+/Courier SF
+9480 67741 MT
+(CPSPK2.ASM)SH
+/Times-Roman SF
+16280 XM
+(part 2 of the KERMIT protocol handler)SH
+/Courier SF
+9480 68846 MT
+(CPSREM.ASM)SH
+/Times-Roman SF
+16280 XM
+(REMOTE routines \050FINISH, BYE and LOGOUT in CPXPK*.ASM\051)SH
+/Courier SF
+9480 69951 MT
+(CPSSER.ASM)SH
+/Times-Roman SF
+16280 XM
+(SERVER routines \050for the future\051)SH
+/Courier SF
+9480 71056 MT
+(CPSTT.ASM)SH
+/Times-Roman SF
+16280 XM
+(the transparent commands \050TRANSMIT, CONNECT\051)SH
+ES
+%%Page: 24 25
+BS
+0 SI
+10 /Times-Italic AF
+6120 4404 MT
+(Page 24)SH
+12 /Times-Bold AF
+29686 XM
+(Kermit User Guide: CP/M-80 KERMIT 1.7.3)SH
+46800 50 6120 5709 UL
+10 /Courier AF
+7320 7886 MT
+(CPSCPM.ASM)SH
+/Times-Roman SF
+14120 XM
+(CP/M commands \050DIR, ERA, USER, TYPE, PRINT, COPY\051)SH
+/Courier SF
+7320 8991 MT
+(CPSWLD.ASM)SH
+/Times-Roman SF
+14120 XM
+(the wildcard handler)SH
+/Courier SF
+7320 10096 MT
+(CPSCMD.ASM)SH
+/Times-Roman SF
+14120 XM
+(the command parser)SH
+/Courier SF
+7320 11201 MT
+(CPSUTL.ASM)SH
+/Times-Roman SF
+14120 XM
+(utility routines and data)SH
+/Courier SF
+7320 12306 MT
+(CPSDAT.ASM)SH
+/Times-Roman SF
+14120 XM
+(data space and the overlay definitions)SH
+/Courier SF
+7320 13411 MT
+(CPXLNK.ASM)SH
+/Times-Roman SF
+14120 XM
+(linkage area description)SH
+/Times-Italic SF
+6120 15840 MT
+(The system-dependent files:)SH
+/Courier SF
+7320 16945 MT
+(CPXTYP.ASM)SH
+/Times-Roman SF
+14120 XM
+(system selection)SH
+/Courier SF
+7320 18050 MT
+(CPXLNK.ASM)SH
+/Times-Roman SF
+14120 XM
+(system overlay specification and jump table)SH
+/Courier SF
+7320 19155 MT
+(CPXCOM.ASM)SH
+/Times-Roman SF
+14120 XM
+(common routines for all systems)SH
+/Courier SF
+7320 20260 MT
+(CPXSWT.ASM)SH
+/Times-Roman SF
+14120 XM
+(system selector or switcher)SH
+6120 22689 MT
+(One of:)SH
+/Courier SF
+7320 23794 MT
+(CPXSYS.ASM)SH
+/Times-Roman SF
+14120 XM
+(family file for some system-specific code)SH
+/Courier SF
+7320 24899 MT
+(CPXTOR.ASM)SH
+/Times-Roman SF
+14120 XM
+(family file for Torch, Superbrain, PCI2651 etc)SH
+/Courier SF
+7320 26004 MT
+(CPXNOR.ASM)SH
+/Times-Roman SF
+14120 XM
+(family file for Northstar and Comart machines)SH
+/Courier SF
+7320 27109 MT
+(CPXMRL.ASM)SH
+/Times-Roman SF
+14120 XM
+(family file for British Telecom Merlin/Rair Black Box)SH
+/Courier SF
+7320 28214 MT
+(CPXSB.ASM)SH
+/Times-Roman SF
+14120 XM
+(family file for Micromint SB-180 systems)SH
+/Courier SF
+7320 29319 MT
+(CPXCIF.ASM)SH
+/Times-Roman SF
+14120 XM
+(family file for Cifer systems)SH
+/Courier SF
+7320 30424 MT
+(CPXHEA.ASM)SH
+/Times-Roman SF
+14120 XM
+(family file for Heath/Zenith systems)SH
+/Courier SF
+7320 31529 MT
+(CPXAPP.ASM)SH
+/Times-Roman SF
+14120 XM
+(family file for Apple II systems)SH
+/Courier SF
+7320 32634 MT
+(CPXPCW.ASM)SH
+/Times-Roman SF
+14120 XM
+(family file for Amstrad PCW 8256/8512 machines)SH
+/Courier SF
+7320 33739 MT
+(CPXBBI.ASM)SH
+/Times-Roman SF
+14120 XM
+(family file for BigBoard, Kaypro and Xerox 820 systems)SH
+/Courier SF
+7320 34844 MT
+(CPXBEE.ASM)SH
+/Times-Roman SF
+14120 XM
+(Microbee)SH
+/Courier SF
+7320 35949 MT
+(CPXSYO.ASM)SH
+/Times-Roman SF
+14120 XM
+(family file for Sanyo MBS-1100 systems)SH
+/Courier SF
+7320 37054 MT
+(CPXTM4.ASM)SH
+/Times-Roman SF
+14120 XM
+(family file for Tandy Model 4 with CP/M systems)SH
+/Courier SF
+7320 38159 MT
+(CPXGNI.ASM)SH
+/Times-Roman SF
+14120 XM
+(family file for Video Genie systems)SH
+/Courier SF
+7320 39264 MT
+(CPXPRO.ASM)SH
+/Times-Roman SF
+14120 XM
+(family file for Compupro systems)SH
+/Courier SF
+7320 40369 MT
+(CPXZ80.ASM)SH
+/Times-Roman SF
+14120 XM
+(family file for the Z80MU development system)SH
+6120 42798 MT
+(and if you use a terminal,)SH
+/Courier SF
+7320 43903 MT
+(CPXVDU.ASM)SH
+/Times-Roman SF
+14120 XM
+(display codes for VDUs etc.  Not always required)SH
+6120 45694 MT
+(The system-independent module contains all of the system-independent files)
+135 W( except for)134 W
+/Courier SF
+42791 XM
+(CPXLNK.ASM)SH
+/Times-Roman SF
+(, which is)134 W
+6120 46890 MT
+(assembled into the system-dependent module to provide the structures needed to connect the)
+156 W( two modules.  As)157 W
+6120 48086 MT
+(distributed, the system-independent module is named)28 W
+/Courier SF
+27870 XM
+(CPSKER.HEX)SH
+/Times-Roman SF
+(. If)
+306 W( you have a)
+28 W( copy of)27 W
+/Courier SF
+43616 XM
+(CPSKER.HEX)SH
+/Times-Roman SF
+(, you do)27 W
+6120 49282 MT
+(not need to reassemble the system-independent module to configure Kermit for your system.)SH
+6120 51674 MT
+(The system-dependent module consists of)503 W
+/Courier SF
+25661 XM
+(CPXTYP.ASM)SH
+/Times-Roman SF
+(,)SH
+/Courier SF
+32664 XM
+(CPSDEF.ASM)SH
+/Times-Roman SF
+(,)SH
+/Courier SF
+39667 XM
+(CPXLNK.ASM)SH
+/Times-Roman SF
+(,)SH
+/Courier SF
+46670 XM
+(CPXSWT.ASM)SH
+/Times-Roman SF
+(,)SH
+/Courier SF
+6120 52870 MT
+(CPSCOM.ASM)SH
+/Times-Roman SF
+(, one of)
+675 W( the family files)674 W
+/Courier SF
+25748 XM
+(CPXSYS.ASM)SH
+/Times-Roman SF
+(,)SH
+/Courier SF
+32922 XM
+(CPXTOR.ASM)SH
+/Times-Roman SF
+(,)SH
+/Courier SF
+40096 XM
+(CPXMRL.ASM)SH
+/Times-Roman SF
+(,)SH
+/Courier SF
+47270 XM
+(CPXSB.ASM)SH
+/Times-Roman SF
+(,)SH
+/Courier SF
+6120 54066 MT
+(CPXCIF.ASM)SH
+/Times-Roman SF
+(,)SH
+/Courier SF
+12878 XM
+(CPXHEA.ASM)SH
+/Times-Roman SF
+(,)SH
+/Courier SF
+19636 XM
+(CPXBBI.ASM)SH
+/Times-Roman SF
+(,)SH
+/Courier SF
+26394 XM
+(CPXTM4.ASM)SH
+/Times-Roman SF
+(,)SH
+/Courier SF
+33152 XM
+(CPXGNI.ASM)SH
+/Times-Roman SF
+(,)SH
+/Courier SF
+39911 XM
+(CPXNOR.ASM)SH
+/Times-Roman SF
+(,)SH
+/Courier SF
+46670 XM
+(CPXAPP.ASM)SH
+/Times-Roman SF
+(,)SH
+/Courier SF
+6120 55262 MT
+(CPXPCW.ASM)SH
+/Times-Roman SF
+(, or)23 W
+/Courier SF
+13749 XM
+(CPXPRO.ASM)SH
+/Times-Roman SF
+(, and possibly)23 W
+/Courier SF
+25596 XM
+(CPXVDU.ASM)SH
+/Times-Roman SF
+(, if your)
+23 W( system uses a terminal for the console.  One)22 W
+6120 56458 MT
+(copy of the)
+1 W( system-dependent module is supplied already assembled for each supported system; the filename may be)2 W
+6120 57654 MT
+(obtained from tables 1-2 and 1-3.  If a terminal is)
+170 W( required for a system, a CRT \050glass TTY device\051 has been)169 W
+6120 58850 MT
+(selected.)SH
+6120 61242 MT
+(After assembling the two pieces separately, they are combined with DDT or MLOAD into a system-specific Kermit.)SH
+6120 63634 MT
+(If you want to rebuild the system-independent module, the only change you may)
+159 W( need to make is to select the)160 W
+6120 64830 MT
+(assembler to be used, in)182 W
+/Courier SF
+16862 XM
+(CPSKER.ASM)SH
+/Times-Roman SF
+(. Define)
+614 W( one of MAC80, M80, or LASM to TRUE to select)
+182 W( it as the)181 W
+6120 66026 MT
+(assembler; the others should be defined FALSE.)SH
+6120 68418 MT
+(Assuming you have the Microsoft Macro Assembler package \050M80/L80\051, you'll need to do the following:)SH
+/Courier SF
+8520 70073 MT
+(A>m80 cpsker=cpsker.asm)SH
+12600 50 9720 70273 UL
+8520 71104 MT
+(A>l80 /p:100,cpsker,cpsker/n/e)SH
+16800 50 9720 71304 UL
+ES
+%%Page: 25 26
+BS
+0 SI
+12 /Times-Bold AF
+8280 4404 MT
+(1.7.3. Assembling Kermit-80 from the sources)SH
+10 /Times-Italic AF
+51775 XM
+(Page 25)SH
+46800 50 8280 5709 UL
+/Times-Roman SF
+8280 7886 MT
+(This will produce)SH
+/Courier SF
+15585 XM
+(CPSKER.COM)SH
+/Times-Roman SF
+(.)SH
+8280 10278 MT
+(If you are using LASM instead, do this:)SH
+/Courier SF
+10680 11933 MT
+(A>lasm cpsker)SH
+6600 50 11880 12133 UL
+/Times-Roman SF
+8280 13650 MT
+(LASM will generate)53 W
+/Courier SF
+16910 XM
+(CPSKER.HEX)SH
+/Times-Roman SF
+23214 XM
+(and)SH
+/Courier SF
+24962 XM
+(CPSKER.PRN)SH
+/Times-Roman SF
+(. LASM)
+358 W( allows options to be specified in the same way as)54 W
+8280 14846 MT
+(the standard assembler, ASM, so the command)SH
+/Courier SF
+10680 16501 MT
+(A>lasm cpsker.abz)SH
+9000 50 11880 16701 UL
+/Times-Roman SF
+8280 18218 MT
+(will read the source files from drive A, send the)SH
+/Courier SF
+27637 XM
+(.HEX)SH
+/Times-Roman SF
+30287 XM
+(file to drive B, and suppress the listing file.)SH
+8280 20610 MT
+(If you are using)
+128 W( the Z80MU development system on an IBM PC or clone, then assemble your files using either)127 W
+8280 21806 MT
+(LASM and MLOAD or M80 and L80, as)
+3 W( if you were using a genuine CP/M-80 system.  Note that you will still have)4 W
+8280 23002 MT
+(the problem of transferring your assembled files to the target CP/M system.)SH
+8280 25394 MT
+(If you want to generate a system-dependent overlay for a particular system, or want to change the terminal)247 W
+8280 26590 MT
+(supported, you'll need to check three areas in)SH
+/Courier SF
+26692 XM
+(CPXTYP.ASM)SH
+/Times-Roman SF
+(:)SH
+8280 28982 MT
+(First, the overlay start ADDRESS.  The symbol)
+83 W( "ovladr" is EQUated to the address of "LNKFLG" in the system-)84 W
+8280 30178 MT
+(independent module, as the starting address of the overlay \0507000H for version)109 W
+/Courier SF
+40999 XM
+(4.11)SH
+/Times-Roman SF
+(\051. You'll)
+468 W( need to know this)109 W
+8280 31374 MT
+(value if you're building the overlay with M80/L80.  You won't normally need to change this value.)SH
+8280 33766 MT
+(Second, the assembler being used.  Again, define one of MAC80, M80, and LASM to be TRUE to)
+104 W( select it, and)105 W
+8280 34962 MT
+(define the others to be FALSE.  The two modules \050system-independent and system-dependent\051)
+100 W( do not need to be)99 W
+8280 36158 MT
+(built with the same assembler.)SH
+8280 38550 MT
+(Third, the system configuration.  Locate your system in)
+158 W( tables 1-2 and 1-3, then define the appropriate symbol)159 W
+8280 39746 MT
+(TRUE, and the rest FALSE.)
+84 W( If)
+417 W( the system comes with a builtin console terminal, define all the terminal switches)83 W
+8280 40942 MT
+(FALSE. If)
+558 W( the system uses an external terminal as the console, locate the terminal in)
+154 W( table 1-5 and define the)155 W
+8280 42138 MT
+(appropriate symbol TRUE, and the remainder FALSE.)
+20 W( If)
+289 W( the terminal is not listed in table 1-5, use the CRT switch;)19 W
+8280 43334 MT
+(in this case, VT52 emulation is not supported.)SH
+8280 45726 MT
+(In addition, there are a few general and system-specific symbols which may be altered to fit your system:)SH
+8280 47517 MT
+(APSLOT)SH
+16280 XM
+(For Apple with 6551 ACIA, defines the slot number of the serial card)SH
+8280 49094 MT
+(CPUSPD)SH
+16280 XM
+(Processor speed in units of 100KHz \050currently used only for bbII and kpII for timing loops\051)SH
+8280 50671 MT
+(TAC)SH
+16280 XM
+(For users connecting through ARPAnet TACs: set to TRUE if you)
+53 W( wish the default TACTRAP)54 W
+16280 51776 MT
+(status to be ON. \050This may be overridden with the SET TACTRAP command\051.  If)
+99 W( you're not)98 W
+16280 52881 MT
+(connecting through a TAC, set tac to FALSE and ignore tacval.)SH
+8280 54458 MT
+(TACVAL)SH
+16280 XM
+(For ARPANET TAC users: defines the default TAC)
+4 W( intercept character \050may be overridden with)5 W
+16280 55563 MT
+(the SET TACTRAP command\051.)SH
+8280 57955 MT
+(If you are just assembling an existing configuration,)
+141 W( you'll need to edit)140 W
+/Courier SF
+38603 XM
+(CPXTYP.ASM)SH
+/Times-Roman SF
+44993 XM
+(only. If)
+530 W( you are adding)140 W
+8280 59151 MT
+(support for a new)
+16 W( system, you should not modify)17 W
+/Courier SF
+28318 XM
+(CPSDEF.ASM)SH
+/Times-Roman SF
+34585 XM
+(or)SH
+/Courier SF
+35685 XM
+(CPXLNK.ASM)SH
+/Times-Roman SF
+(; if you do, you'll have to change)17 W
+8280 60347 MT
+(the system-independent module also.  Eventually,)28 W
+/Courier SF
+28613 XM
+(CPXSYS.ASM)SH
+/Times-Roman SF
+34891 XM
+(will be split into separate)
+28 W( files, each of which will)27 W
+8280 61543 MT
+(generate one or more related systems.  When this happens, you'll want to pick the one closest to your)
+29 W( system to use)30 W
+8280 62739 MT
+(as a starting point.)SH
+8280 65131 MT
+(After editing)SH
+/Courier SF
+13668 XM
+(CPXTYP.ASM)SH
+/Times-Roman SF
+19918 XM
+(as necessary, assemble and link the overlay as follows:)SH
+/Symbol SF
+10070 67036 MT
+(\267)SH
+/Times-Roman SF
+10780 XM
+(With M80 \050where "xxxx" is the hex value of ovladr from)SH
+/Courier SF
+33842 XM
+(CPXLNK.ASM)SH
+/Times-Roman SF
+(\051:)SH
+/Courier SF
+13180 68691 MT
+(A>m80 cpxtyp=cpxtyp.asm)SH
+12600 50 14380 68891 UL
+13180 69722 MT
+(A>l80 /p:xxxx,cpxtyp,cpxtyp/n/x/e)SH
+18600 50 14380 69922 UL
+/Symbol SF
+10070 71711 MT
+(\267)SH
+/Times-Roman SF
+10780 XM
+(With LASM:)SH
+ES
+%%Page: 26 27
+BS
+0 SI
+10 /Times-Italic AF
+6120 4404 MT
+(Page 26)SH
+12 /Times-Bold AF
+29686 XM
+(Kermit User Guide: CP/M-80 KERMIT 1.7.3)SH
+46800 50 6120 5709 UL
+10 /Courier AF
+11020 7824 MT
+(A>lasm cpxtyp)SH
+6600 50 12220 8024 UL
+/Times-Roman SF
+6120 10216 MT
+(With an IBM PC or clone using the Z80MU softwrae, follow the instructions as if)
+128 W( you were using a real CP/M)127 W
+6120 11412 MT
+(system.)SH
+6120 13804 MT
+(The overlay \050)6 W
+/Courier SF
+(CPXTYP.HEX)SH
+/Times-Roman SF
+(\051 may then be merged with the system-independent module as)
+6 W( described above \050creating)7 W
+6120 15000 MT
+(a runnable Kermit from the distribution kit\051.)SH
+6120 17392 MT
+(If you are using the Z80MU development system on a PC, and already have a running)
+42 W( Kermit-80 v3.9 or later, you)41 W
+6120 18588 MT
+(can merge the)
+1 W( two)2 W
+/Courier SF
+13735 XM
+(.HEX)SH
+/Times-Roman SF
+16387 XM
+(files into a)2 W
+/Courier SF
+20865 XM
+(.COM)SH
+/Times-Roman SF
+23517 XM
+(file with LINK80 \050TOPS 10/20\051, MLOAD \050Z80MU\051, L80 \050Z80MU\051, and)2 W
+6120 19784 MT
+(transfer the new)SH
+/Courier SF
+12812 XM
+(.COM)SH
+/Times-Roman SF
+15462 XM
+(file to your micro with Kermit:)SH
+/Symbol SF
+7910 21689 MT
+(\267)SH
+/Times-Roman SF
+8620 XM
+(Z80MU on a PC and MLOAD:)SH
+/Courier SF
+11020 23344 MT
+(@MLOAD KERNEW=CPSKER,CPXTYP)SH
+15600 50 11620 23544 UL
+/Symbol SF
+7910 25333 MT
+(\267)SH
+/Times-Roman SF
+8620 XM
+(Z80MU on a PC and C80:)SH
+/Courier SF
+11020 26988 MT
+(@L80 /P:xxxx,CPXTYP,CPXTYP/N/X/E)SH
+18600 50 11620 27188 UL
+/Times-Roman SF
+6120 28779 MT
+(producing)SH
+/Courier SF
+10425 XM
+(KERNEW.COM)SH
+/Times-Roman SF
+(.)SH
+46800 50 6120 30589 UL
+6120 32818 MT
+(Symbol)SH
+16920 XM
+(Terminal description)SH
+3112 50 6120 33018 UL
+8360 50 16920 33018 UL
+6120 33923 MT
+(crt)SH
+16920 XM
+(Basic CRT, no cursor positioning)SH
+6120 35028 MT
+(adm3a)SH
+16920 XM
+(ADM3A Display or lookalike)SH
+6120 36133 MT
+(adm22)SH
+16920 XM
+(ADM22 Display or lookalike)SH
+6120 37238 MT
+(am230)SH
+16920 XM
+(Ampro 230)SH
+6120 38343 MT
+(h1500)SH
+16920 XM
+(Hazeltine 1500)SH
+6120 39448 MT
+(smrtvd)SH
+16920 XM
+(Netronics Smartvid-80)SH
+6120 40553 MT
+(soroq)SH
+16920 XM
+(Soroq IQ-120)SH
+6120 41658 MT
+(tvi912)SH
+16920 XM
+(TVI 912)SH
+6120 42763 MT
+(tvi925)SH
+16920 XM
+(TVI 925, Freedom 100)SH
+6120 43868 MT
+(vt52)SH
+16920 XM
+(VT 52 or VT52 emulator such as Heath H19, H29, etc.)SH
+6120 44973 MT
+(vt100)SH
+16920 XM
+(VT 100 or emulator \050most ANSI terminals should work\051)SH
+6120 46078 MT
+(wyse)SH
+16920 XM
+(Wyse 100)SH
+/Times-Bold SF
+20854 47688 MT
+(Table 1-5:)SH
+/Times-Roman SF
+25715 XM
+(Terminals known to Kermit-80)SH
+46800 50 6120 49498 UL
+14 /Times-Bold AF
+6120 52900 MT
+(1.8. Adding Support For A New System)SH
+10 /Times-Roman AF
+6120 55018 MT
+(Kermit-80 is built from a common set of source files; the system-dependent module makes heavy use)
+23 W( of conditional)22 W
+6120 56214 MT
+(assembly \050this complication will be removed in future releases\051.  The)
+90 W( system dependencies arise from attempts to)91 W
+6120 57410 MT
+(answer some questions:)SH
+8120 59201 MT
+(1.)SH
+/Times-Italic SF
+9120 XM
+(What kind of terminal is to be supported?)SH
+/Times-Roman SF
+9120 61630 MT
+(For many micros, the console is an integral part of the system, but others)
+25 W( can use an external terminal.)24 W
+9120 62735 MT
+(In either case, the commands to manipulate the screen \050position)
+38 W( the cursor, erase the screen, etc\051 must)39 W
+9120 63840 MT
+(be defined.)SH
+8120 66050 MT
+(2.)SH
+/Times-Italic SF
+9120 XM
+(How is the serial line accessed?)SH
+/Times-Roman SF
+9120 68479 MT
+(For systems supporting the IOBYTE function,)
+38 W( this is straightforward; the symbol "IOBYT" is defined)37 W
+9120 69584 MT
+(TRUE. If)
+554 W( the serial line is accessed with IN and OUT instructions, it may be possible to use the)152 W
+9120 70689 MT
+(simple I/O routines provided.  In this case, the symbol "INOUT" is)
+36 W( defined TRUE, the MNPORT and)35 W
+9120 71794 MT
+(MNPRTS are defined to be the data and control addresses, respectively, and)
+64 W( bit masks for testing for)65 W
+ES
+%%Page: 27 28
+BS
+0 SI
+12 /Times-Bold AF
+8280 4404 MT
+(1.8. Adding Support For A New System)SH
+10 /Times-Italic AF
+51775 XM
+(Page 27)SH
+46800 50 8280 5709 UL
+/Times-Roman SF
+11280 7886 MT
+("input data available")
+123 W( and "output buffer empty" must be defined.  If the interface is strange, leave)122 W
+11280 8991 MT
+(IOBYT and INOUT set to FALSE, and provide the I/O routines.)SH
+10280 11201 MT
+(3.)SH
+/Times-Italic SF
+11280 XM
+(What initialization is necessary?)SH
+/Times-Roman SF
+11280 13630 MT
+(You may wish to set the baud rate or configure the serial line at startup.  Examples)
+86 W( for a number of)87 W
+11280 14735 MT
+(devices are present.)SH
+10280 16945 MT
+(4.)SH
+/Times-Italic SF
+11280 XM
+(What special features are to be supported?)SH
+/Times-Roman SF
+11280 19374 MT
+(You may want to provide the capability to select one of several serial lines with the SET)
+183 W( PORT)182 W
+11280 20479 MT
+(command, or to change the speed)
+24 W( of the serial line with the SET SPEED command.  To do this, you'll)25 W
+11280 21584 MT
+(need to build a command table, using the systems already)
+2 W( supported as examples.  The ability to send a)1 W
+11280 22689 MT
+(BREAK signal is desirable.  Again, examples for several different interfaces \050ACIA, SIO,)
+149 W( etc\051 are)150 W
+11280 23794 MT
+(present.)SH
+10280 26004 MT
+(5.)SH
+/Times-Italic SF
+11280 XM
+(Do you want to design an external terminal type?)SH
+/Times-Roman SF
+11280 28433 MT
+(There is a jump entry in the overlay file to allow users to add their own termainl emulator.)
+114 W( If)
+477 W( you)113 W
+11280 29538 MT
+(write the code for)
+223 W( such an emulator, you must load this jump address with the address of your)224 W
+11280 30643 MT
+(emulator, and SET)
+106 W( TERMINAL EXTERNAL from within Kermit.  All characters will be passed to)105 W
+11280 31748 MT
+(this routine during connect mode.)SH
+14 /Times-Bold AF
+8280 35350 MT
+(1.9. Notes on New Features in Kermit-80 Version 4)SH
+10 /Symbol AF
+10070 37582 MT
+(\267)SH
+/Times-Italic SF
+10780 XM
+(Debugging aids:)218 W
+/Times-Roman SF
+18628 XM
+(SET DEBUG ON will add two fields to the SEND/RECEIVE display, labelled)218 W
+10780 38687 MT
+("Spack" and)
+40 W( "Rpack".  These display the last packet sent and received.  Of course, this slows down the)39 W
+10780 39792 MT
+(transfer, especially if the console is an external)
+24 W( terminal.  SET DEBUG OFF removes these fields.  The)25 W
+10780 40897 MT
+(VERSION command)
+27 W( displays the name, edit number, and edit date of several of the modules that make)26 W
+10780 42002 MT
+(up Kermit.)SH
+/Symbol SF
+10070 43991 MT
+(\267)SH
+/Times-Italic SF
+10780 XM
+(TAC support:)32 W
+/Times-Roman SF
+16567 XM
+(ARPAnet TACs \050and many other communication devices)
+32 W( such as terminal concentrators,)33 W
+10780 45096 MT
+(modems, port contention units, network PADs, etc\051 use a printing character \050like)
+79 W( "@"\051 as an intercept)78 W
+10780 46201 MT
+(character, to allow commands to be issued to the TAC, or modem, etc.  In order to send this character)
+7 W( to)8 W
+10780 47306 MT
+(the host, it must be typed)
+163 W( twice.  The command "SET TAC CHARACTER" to Kermit enables the)162 W
+10780 48411 MT
+("TACtrap" and asks the)
+358 W( user to specify the TAC intercept character.  This character will be)359 W
+10780 49516 MT
+(automatically doubled when it)
+94 W( appears in Kermit protocol messages \050sent by the SEND or RECEIVE)93 W
+10780 50621 MT
+(commands\051 or when it appears in a)
+295 W( file being sent with the TRANSMIT command.  It is not)296 W
+10780 51726 MT
+(automatically doubled when typed by the user in CONNECT mode.  "SET TAC)
+192 W( ON" enables the)191 W
+10780 52831 MT
+(TACtrap but does not change the TAC intercept character, which)
+109 W( is initially "@".  "SET TAC OFF")110 W
+10780 53936 MT
+(disables the TACtrap.)SH
+/Symbol SF
+10070 55925 MT
+(\267)SH
+/Times-Italic SF
+10780 XM
+(File buffering:)96 W
+/Times-Roman SF
+17429 XM
+(Previous versions of Kermit-80 buffered only)
+96 W( one sector \050128 bytes\051 at a time during)95 W
+10780 57030 MT
+(file transfer operations.  This version buffers 16Kbytes at a time, reducing the number of)
+151 W( times the)152 W
+10780 58135 MT
+(floppy drive must be)
+33 W( spun up and down, and increasing the effective throughput of the link.  If the disk)32 W
+10780 59240 MT
+(transfer rate is)
+89 W( too slow, however, the remote Kermit may time out and retransmit packets.  This will)90 W
+10780 60345 MT
+(show up on the screen in the "Retries:" field; if this occurs after disk activity, you)
+26 W( may want to increase)25 W
+10780 61450 MT
+(the timeout value on the remote Kermit,)
+135 W( SET BUFFER <new value> while in Kermit,or reassemble)136 W
+10780 62555 MT
+(Kermit with a smaller value for MAXSEC \050in)304 W
+/Courier SF
+31821 XM
+(CPSDEF.ASM)SH
+/Times-Roman SF
+(\051 This)
+304 W( buffer is also used by the)303 W
+10780 63660 MT
+(TRANSMIT command; the log file enabled by the LOG command is still written a sector at a time.)SH
+8280 66052 MT
+(This section is intended for people wanting to implement their own versions)
+16 W( of Kermit-80 for computers not already)17 W
+8280 67248 MT
+(defined.)SH
+8280 69640 MT
+(The system independent code communicates to routines for a specific system through a set of tables.)
+62 W( These)
+372 W( tables)61 W
+8280 70836 MT
+(are defined in CPXLNK.ASM, and)
+106 W( should not be modified between revisions of Kermit.  If an entry is added or)107 W
+ES
+%%Page: 28 29
+BS
+0 SI
+10 /Times-Italic AF
+6120 4404 MT
+(Page 28)SH
+12 /Times-Bold AF
+30586 XM
+(Kermit User Guide: CP/M-80 KERMIT 1.9)SH
+46800 50 6120 5709 UL
+10 /Times-Roman AF
+6120 7886 MT
+(deleted, then)
+199 W( the whole of Kermit-80 needs reassembling.  Make sure that the changes to CPXLNK.ASM are)198 W
+6120 9082 MT
+(duplicated in CPSUTL.ASM, which has the system independent equivalent of CPXLNK.ASM.)SH
+6120 11474 MT
+(The following entries/definitions apply)
+140 W( to revision 4.09.  There have been three additional entries since revision)141 W
+6120 12670 MT
+(4.05.)SH
+6120 15062 MT
+(The table)
+56 W( is split into three sectors; The first section defines two byte "words" giving 16 bits of interface data; The)55 W
+6120 16258 MT
+(second set is a set of jumps to various functions, and finally the third set a set of pure data bytes.)SH
+12 /Times-Bold AF
+6120 19374 MT
+(1.9.1. Interface Data.)SH
+10 /Times-Roman AF
+10120 21316 MT
+(LNKFLG)SH
+14120 XM
+(Must be first entry in overlay at overlay address.  Is a two byte address giving the size of the)98 W
+3944 50 10120 21516 UL
+14120 22421 MT
+(linkage table.  This is used to check for consistency of overlay's)SH
+10120 24850 MT
+(ENTSIZE)SH
+4055 50 10120 25050 UL
+14120 25955 MT
+(Length of entry table, also used for consistency checking after the overlay.  Currently 6)SH
+10120 28384 MT
+(SYSEDT)SH
+14120 XM
+(The address of a dollar-terminated string giving the overlay revision level and date.  Points)
+45 W( to a)46 W
+3778 50 10120 28584 UL
+14120 29489 MT
+(string like:  CPXSYS.ASM\05033\051 4-JUN-1986$)SH
+10120 31918 MT
+(FAMILY)SH
+14120 XM
+(The address of a dollar-terminated string giving the Family overlay revision)
+80 W( level and date.  If)79 W
+3833 50 10120 32118 UL
+14120 33023 MT
+(the system is in CPXSYS.ASM rather than a)
+46 W( particular Family overlay, it is simply a pointer to)47 W
+14120 34128 MT
+($)SH
+12 /Times-Bold AF
+6120 39454 MT
+(1.9.2. Jump Table.)SH
+10 /Times-Roman AF
+6120 41396 MT
+(This is split into three main sectors-)SH
+8120 44511 MT
+(1.)SH
+9120 XM
+(Input/Output routines)SH
+8120 46721 MT
+(2.)SH
+9120 XM
+(Screen formatting routines)SH
+8120 48931 MT
+(3.)SH
+9120 XM
+(other system dependent routines)SH
+7120 52246 MT
+(SELMDM)SH
+4278 50 7120 52446 UL
+/Times-Italic SF
+7120 53351 MT
+(Parameters)SH
+/Times-Roman SF
+14120 XM
+(None)SH
+/Times-Italic SF
+7120 54456 MT
+(Returns)SH
+/Times-Roman SF
+14120 XM
+(None)SH
+/Times-Italic SF
+7120 55561 MT
+(Description)SH
+/Times-Roman SF
+14120 XM
+(selects the modem port.  Most)
+56 W( systems do nothing and simply return.  HL,DE and BC registers)55 W
+14120 56666 MT
+(preserved.)SH
+7120 59095 MT
+(OUTMDM)SH
+4555 50 7120 59295 UL
+/Times-Italic SF
+7120 60200 MT
+(Parameters)SH
+/Times-Roman SF
+14120 XM
+(None)SH
+/Times-Italic SF
+7120 61305 MT
+(Returns)SH
+/Times-Roman SF
+14120 XM
+(None)SH
+/Times-Italic SF
+7120 62410 MT
+(Description)SH
+/Times-Roman SF
+14120 XM
+(Output the character in E register to the communications line.  BC,DE,HL registers preserved.)SH
+7120 64839 MT
+(INPMDM)SH
+4111 50 7120 65039 UL
+/Times-Italic SF
+7120 65944 MT
+(Parameters)SH
+/Times-Roman SF
+14120 XM
+(None)SH
+/Times-Italic SF
+7120 67049 MT
+(Returns)SH
+/Times-Roman SF
+14120 XM
+(Accumulator either 0 or character from comms line if available)SH
+/Times-Italic SF
+7120 68154 MT
+(Description)SH
+/Times-Roman SF
+14120 XM
+(Check modem)
+90 W( for character and if so, return it in A. HL,DE,BC registers preserved, flags and)91 W
+14120 69259 MT
+(accumulator lost.)SH
+7120 71688 MT
+(FLSMDM)SH
+4223 50 7120 71888 UL
+ES
+%%Page: 29 30
+BS
+0 SI
+12 /Times-Bold AF
+8280 4404 MT
+(1.9.2. Jump Table.)SH
+10 /Times-Italic AF
+51775 XM
+(Page 29)SH
+46800 50 8280 5709 UL
+9280 7886 MT
+(Parameters)SH
+/Times-Roman SF
+16280 XM
+(None)SH
+/Times-Italic SF
+9280 8991 MT
+(Returns)SH
+/Times-Roman SF
+16280 XM
+(None)SH
+/Times-Italic SF
+9280 10096 MT
+(Description)SH
+/Times-Roman SF
+16280 XM
+(Clear any pending characters in the input buffer from the modem.  No registers are preserved.)SH
+9280 12525 MT
+(SELCON)SH
+3889 50 9280 12725 UL
+/Times-Italic SF
+9280 13630 MT
+(Parameters)SH
+/Times-Roman SF
+16280 XM
+(None)SH
+/Times-Italic SF
+9280 14735 MT
+(Returns)SH
+/Times-Roman SF
+16280 XM
+(None)SH
+/Times-Italic SF
+9280 15840 MT
+(Description)SH
+/Times-Roman SF
+16280 XM
+(Select the console.)
+44 W( This)
+337 W( is a null subroutine for most systems, but for IOBYTE systems selects)43 W
+16280 16945 MT
+(the console.)SH
+9280 19374 MT
+(OUTCON)SH
+4166 50 9280 19574 UL
+/Times-Italic SF
+9280 20479 MT
+(Parameters)SH
+/Times-Roman SF
+16280 XM
+(Character in E)SH
+/Times-Italic SF
+9280 21584 MT
+(Returns)SH
+/Times-Roman SF
+16280 XM
+(None)SH
+/Times-Italic SF
+9280 22689 MT
+(Description)SH
+/Times-Roman SF
+16280 XM
+(Send the character in E to the console.  Any quirks)
+145 W( of system responding in an odd manner)146 W
+16280 23794 MT
+(should be handled.  No registers preserved.)SH
+9280 26223 MT
+(INPCON)SH
+3722 50 9280 26423 UL
+/Times-Italic SF
+9280 27328 MT
+(Parameters)SH
+/Times-Roman SF
+16280 XM
+(None)SH
+/Times-Italic SF
+9280 28433 MT
+(Returns)SH
+/Times-Roman SF
+16280 XM
+(Zero or character in A.)SH
+/Times-Italic SF
+9280 29538 MT
+(Description)SH
+/Times-Roman SF
+16280 XM
+(Get a character from the console or return a null if no character to be read.)
+119 W( No)
+486 W( registers are)118 W
+16280 30643 MT
+(preserved.)SH
+9280 33072 MT
+(OUTLPT)SH
+3833 50 9280 33272 UL
+/Times-Italic SF
+9280 34177 MT
+(Parameters)SH
+/Times-Roman SF
+16280 XM
+(Character in E)SH
+/Times-Italic SF
+9280 35282 MT
+(Returns)SH
+/Times-Roman SF
+16280 XM
+(None)SH
+/Times-Italic SF
+9280 36387 MT
+(Description)SH
+/Times-Roman SF
+16280 XM
+(Send the character in E to the printer.  The console is selected.  Only DE registers are preserved)SH
+9280 38816 MT
+(LPTSTAT)SH
+4278 50 9280 39016 UL
+/Times-Italic SF
+9280 39921 MT
+(Parameters)SH
+/Times-Roman SF
+16280 XM
+(None)SH
+/Times-Italic SF
+9280 41026 MT
+(Returns)SH
+/Times-Roman SF
+16280 XM
+(00H or 0FFH in A register)SH
+/Times-Italic SF
+9280 42131 MT
+(Description)SH
+/Times-Roman SF
+16280 XM
+(Test the printer to see if it is ready to receive a character to)
+20 W( be printed.  If a 00H is returned then)21 W
+16280 43236 MT
+(the printer is ready to receive a character.)SH
+9280 45665 MT
+(EXTTER)SH
+3833 50 9280 45865 UL
+/Times-Italic SF
+9280 46770 MT
+(Parameters)SH
+/Times-Roman SF
+16280 XM
+(Character to be sent to the user supplied terminal emulator in the E register)SH
+/Times-Italic SF
+9280 47875 MT
+(Returns)SH
+/Times-Roman SF
+16280 XM
+(None)SH
+/Times-Italic SF
+9280 48980 MT
+(Description)SH
+/Times-Roman SF
+16280 XM
+(If the user has supplied a terminal emulator in)
+67 W( the overlay code, EXTTER will be a JMP <non)66 W
+16280 50085 MT
+(zero address>.  If SET TERMINAL EXTERNAL has been)
+148 W( set, all caharcters will be passed)149 W
+16280 51190 MT
+(verbatim to this terminal emulator.  If there is)
+155 W( no external emulator, this code will never be)154 W
+16280 52295 MT
+(called. The)
+320 W( user should reset terminal conditions on initialisation of both the system and)
+35 W( before)36 W
+16280 53400 MT
+(CONNECT. All)
+250 W( registers should be preserved.)SH
+9280 55829 MT
+(XBDOS)SH
+3389 50 9280 56029 UL
+/Times-Italic SF
+9280 56934 MT
+(Parameters)SH
+/Times-Roman SF
+16280 XM
+(Any required for calling BDOS)SH
+/Times-Italic SF
+9280 58039 MT
+(Returns)SH
+/Times-Roman SF
+16280 XM
+(Any expected from the called BDOS routine)SH
+/Times-Italic SF
+9280 59144 MT
+(Description)SH
+/Times-Roman SF
+16280 XM
+(This is an alternative entry to BDOS.  This entry will)
+53 W( also check the printer status etc.  For full)52 W
+16280 60249 MT
+(details see the code for the BDOS trap in CPSUTL.ASM.)SH
+16280 62678 MT
+(2b\051)SH
+16280 65107 MT
+(CLRLIN)SH
+3611 50 16280 65307 UL
+/Times-Italic SF
+9280 66212 MT
+(Parameters)SH
+/Times-Roman SF
+16280 XM
+(None)SH
+/Times-Italic SF
+9280 67317 MT
+(Returns)SH
+/Times-Roman SF
+16280 XM
+(None)SH
+/Times-Italic SF
+9280 68422 MT
+(Description)SH
+/Times-Roman SF
+16280 XM
+(Clear the current line on the terminal)SH
+9280 70851 MT
+(CLRSPC)SH
+3724 50 9280 71051 UL
+/Times-Italic SF
+9280 71956 MT
+(Parameters)SH
+/Times-Roman SF
+16280 XM
+(None)SH
+ES
+%%Page: 30 31
+BS
+0 SI
+10 /Times-Italic AF
+6120 4404 MT
+(Page 30)SH
+12 /Times-Bold AF
+29686 XM
+(Kermit User Guide: CP/M-80 KERMIT 1.9.2)SH
+46800 50 6120 5709 UL
+10 /Times-Italic AF
+7120 7886 MT
+(Returns)SH
+/Times-Roman SF
+14120 XM
+(None)SH
+/Times-Italic SF
+7120 8991 MT
+(Description)SH
+/Times-Roman SF
+14120 XM
+(Erase the current position \050after a backspace\051)SH
+7120 11420 MT
+(DELCHR)SH
+4000 50 7120 11620 UL
+/Times-Italic SF
+7120 12525 MT
+(Parameters)SH
+/Times-Roman SF
+14120 XM
+(None)SH
+/Times-Italic SF
+7120 13630 MT
+(Returns)SH
+/Times-Roman SF
+14120 XM
+(None)SH
+/Times-Italic SF
+7120 14735 MT
+(Description)SH
+/Times-Roman SF
+14120 XM
+(Make delete \0507FH\051 look like a backspace.  Some systems do a backspace, space, backspace)163 W
+14120 15840 MT
+(automatically others have to simulate it)SH
+7120 18269 MT
+(CLRTOP)SH
+3834 50 7120 18469 UL
+/Times-Italic SF
+7120 19374 MT
+(Parameters)SH
+/Times-Roman SF
+14120 XM
+(None)SH
+/Times-Italic SF
+7120 20479 MT
+(Returns)SH
+/Times-Roman SF
+14120 XM
+(None)SH
+/Times-Italic SF
+7120 21584 MT
+(Description)SH
+/Times-Roman SF
+14120 XM
+(Clear the screen and place the cursor at the top LH corner)SH
+7120 24013 MT
+(SCREND)SH
+3945 50 7120 24213 UL
+/Times-Italic SF
+7120 25118 MT
+(Parameters)SH
+/Times-Roman SF
+14120 XM
+(None)SH
+/Times-Italic SF
+7120 26223 MT
+(Returns)SH
+/Times-Roman SF
+14120 XM
+(None)SH
+/Times-Italic SF
+7120 27328 MT
+(Description)SH
+/Times-Roman SF
+14120 XM
+(Place the cursor on the line for the Kermit-80 prompt after a file transfer.  \050Usually line 13\051)SH
+7120 29757 MT
+(SCRERR)SH
+3835 50 7120 29957 UL
+/Times-Italic SF
+7120 30862 MT
+(Parameters)SH
+/Times-Roman SF
+14120 XM
+(None)SH
+/Times-Italic SF
+7120 31967 MT
+(Returns)SH
+/Times-Roman SF
+14120 XM
+(None)SH
+/Times-Italic SF
+7120 33072 MT
+(Description)SH
+/Times-Roman SF
+14120 XM
+(Move cursor to the error message field on the file transfer format screen)SH
+7120 35501 MT
+(SCRFLN)SH
+3779 50 7120 35701 UL
+/Times-Italic SF
+7120 36606 MT
+(Parameters)SH
+/Times-Roman SF
+14120 XM
+(None)SH
+/Times-Italic SF
+7120 37711 MT
+(Returns)SH
+/Times-Roman SF
+14120 XM
+(None)SH
+/Times-Italic SF
+7120 38816 MT
+(Description)SH
+/Times-Roman SF
+14120 XM
+(Move the cursor to the filename field)SH
+7120 41245 MT
+(SCRNP)SH
+3168 50 7120 41445 UL
+/Times-Italic SF
+7120 42350 MT
+(Parameters)SH
+/Times-Roman SF
+14120 XM
+(None)SH
+/Times-Italic SF
+7120 43455 MT
+(Returns)SH
+/Times-Roman SF
+14120 XM
+(None)SH
+/Times-Italic SF
+7120 44560 MT
+(Description)SH
+/Times-Roman SF
+14120 XM
+(Move the cursor to the packet count field)SH
+7120 46989 MT
+(SCRNRT)SH
+3890 50 7120 47189 UL
+/Times-Italic SF
+7120 48094 MT
+(Parameters)SH
+/Times-Roman SF
+14120 XM
+(None)SH
+/Times-Italic SF
+7120 49199 MT
+(Returns)SH
+/Times-Roman SF
+14120 XM
+(None)SH
+/Times-Italic SF
+7120 50304 MT
+(Description)SH
+/Times-Roman SF
+14120 XM
+(Move cursor to the retry count field)SH
+7120 52733 MT
+(SCRST)SH
+3057 50 7120 52933 UL
+/Times-Italic SF
+7120 53838 MT
+(Parameters)SH
+/Times-Roman SF
+14120 XM
+(None)SH
+/Times-Italic SF
+7120 54943 MT
+(Returns)SH
+/Times-Roman SF
+14120 XM
+(None)SH
+/Times-Italic SF
+7120 56048 MT
+(Description)SH
+/Times-Roman SF
+14120 XM
+(Move cursor to the status field)SH
+7120 58477 MT
+(RPPOS)SH
+3057 50 7120 58677 UL
+/Times-Italic SF
+7120 59582 MT
+(Parameters)SH
+/Times-Roman SF
+14120 XM
+(None)SH
+/Times-Italic SF
+7120 60687 MT
+(Returns)SH
+/Times-Roman SF
+14120 XM
+(None)SH
+/Times-Italic SF
+7120 61792 MT
+(Description)SH
+/Times-Roman SF
+14120 XM
+(Move to the receive packet field \050debugging use\051)SH
+7120 64221 MT
+(SPPOS)SH
+2946 50 7120 64421 UL
+/Times-Italic SF
+7120 65326 MT
+(Parameters)SH
+/Times-Roman SF
+14120 XM
+(None)SH
+/Times-Italic SF
+7120 66431 MT
+(Returns)SH
+/Times-Roman SF
+14120 XM
+(None)SH
+/Times-Italic SF
+7120 67536 MT
+(Description)SH
+/Times-Roman SF
+14120 XM
+(Move to the send packet field \050for debugging use\051)SH
+14120 69965 MT
+(2c\051)SH
+14120 72394 MT
+(SYSINIT)SH
+3833 50 14120 72594 UL
+ES
+%%Page: 31 32
+BS
+0 SI
+12 /Times-Bold AF
+8280 4404 MT
+(1.9.2. Jump Table.)SH
+10 /Times-Italic AF
+51775 XM
+(Page 31)SH
+46800 50 8280 5709 UL
+9280 7886 MT
+(Parameters)SH
+/Times-Roman SF
+16280 XM
+(None)SH
+/Times-Italic SF
+9280 8991 MT
+(Returns)SH
+/Times-Roman SF
+16280 XM
+(None)SH
+/Times-Italic SF
+9280 10096 MT
+(Description)SH
+/Times-Roman SF
+16280 XM
+(Initialize the system specific)
+49 W( items.  No registers are preserved.  Any initialization is done once)48 W
+16280 11201 MT
+(only when Kermit-80 is first loaded.)SH
+9280 13630 MT
+(SYSEXIT)SH
+4111 50 9280 13830 UL
+/Times-Italic SF
+9280 14735 MT
+(Parameters)SH
+/Times-Roman SF
+16280 XM
+(None)SH
+/Times-Italic SF
+9280 15840 MT
+(Returns)SH
+/Times-Roman SF
+16280 XM
+(None)SH
+/Times-Italic SF
+9280 16945 MT
+(Description)SH
+/Times-Roman SF
+16280 XM
+(Program termination.  De-initialize anything in preparation for a return to CP/M)SH
+9280 19374 MT
+(SYSCON)SH
+3945 50 9280 19574 UL
+/Times-Italic SF
+9280 20479 MT
+(Parameters)SH
+/Times-Roman SF
+16280 XM
+(None)SH
+/Times-Italic SF
+9280 21584 MT
+(Returns)SH
+/Times-Roman SF
+16280 XM
+(None)SH
+/Times-Italic SF
+9280 22689 MT
+(Description)SH
+/Times-Roman SF
+16280 XM
+(Initialize anything before entering the connect state.)SH
+9280 25118 MT
+(SYSCLS)SH
+3668 50 9280 25318 UL
+/Times-Italic SF
+9280 26223 MT
+(Parameters)SH
+/Times-Roman SF
+16280 XM
+(None)SH
+/Times-Italic SF
+9280 27328 MT
+(Returns)SH
+/Times-Roman SF
+16280 XM
+(None)SH
+/Times-Italic SF
+9280 28433 MT
+(Description)SH
+/Times-Roman SF
+16280 XM
+(System dependent close routine when exiting connect state)SH
+9280 30862 MT
+(SYSINH)SH
+3611 50 9280 31062 UL
+/Times-Italic SF
+9280 31967 MT
+(Parameters)SH
+/Times-Roman SF
+16280 XM
+(None)SH
+/Times-Italic SF
+9280 33072 MT
+(Returns)SH
+/Times-Roman SF
+16280 XM
+(None)SH
+/Times-Italic SF
+9280 34177 MT
+(Description)SH
+/Times-Roman SF
+16280 XM
+(Help routine to test for any extensions to the escape menu during the connect state.)
+40 W( If)
+331 W( a system)41 W
+16280 35282 MT
+(has any special feature it)
+499 W( can use during connect mode, then it can be tested as)498 W
+16280 36387 MT
+(<escape-character>xxx. This)
+1370 W( entry)
+560 W( is a string for printing to the console for an)561 W
+16280 37492 MT
+(<escape-character>? Often)
+250 W( used for generating breaks or controlling a modem.)SH
+9280 39921 MT
+(SYSINT)SH
+3500 50 9280 40121 UL
+/Times-Italic SF
+9280 41026 MT
+(Parameters)SH
+/Times-Roman SF
+16280 XM
+(None)SH
+/Times-Italic SF
+9280 42131 MT
+(Returns)SH
+/Times-Roman SF
+16280 XM
+(None)SH
+/Times-Italic SF
+9280 43236 MT
+(Description)SH
+/Times-Roman SF
+16280 XM
+(This is a test-and-jump on receipt of an escape sequence not understood by Kermit-80.)
+94 W( If)
+437 W( the)93 W
+16280 44341 MT
+(character in A is not recognized by your version of Kermit=80, do a rskip)SH
+9280 46770 MT
+(SYSFLT)SH
+3612 50 9280 46970 UL
+/Times-Italic SF
+9280 47875 MT
+(Parameters)SH
+/Times-Roman SF
+16280 XM
+(Character in E)SH
+/Times-Italic SF
+9280 48980 MT
+(Returns)SH
+/Times-Roman SF
+16280 XM
+(Character in E. Either a 00H or anything else in A)SH
+/Times-Italic SF
+9280 50085 MT
+(Description)SH
+/Times-Roman SF
+16280 XM
+(Test the character in E. If it may not be printed to the console, set A to zero.)
+33 W( All)
+317 W( other registers)34 W
+16280 51190 MT
+(preserved.)SH
+16280 52295 MT
+(NB <XON>,<XOFF>,<DEL>,<NULL> are always rejected.)SH
+9280 54724 MT
+(SYSBYE)SH
+3834 50 9280 54924 UL
+/Times-Italic SF
+9280 55829 MT
+(Parameters)SH
+/Times-Roman SF
+16280 XM
+(None)SH
+/Times-Italic SF
+9280 56934 MT
+(Returns)SH
+/Times-Roman SF
+16280 XM
+(None)SH
+/Times-Italic SF
+9280 58039 MT
+(Description)SH
+/Times-Roman SF
+16280 XM
+(System dependent processing for the BYE command.  \050eg hang up the phone\051)SH
+9280 60468 MT
+(SYSSPD)SH
+3668 50 9280 60668 UL
+/Times-Italic SF
+9280 61573 MT
+(Parameters)SH
+/Times-Roman SF
+16280 XM
+(Value from table in DE)SH
+/Times-Italic SF
+9280 62678 MT
+(Returns)SH
+/Times-Roman SF
+16280 XM
+(None)SH
+/Times-Italic SF
+9280 63783 MT
+(Description)SH
+/Times-Roman SF
+16280 XM
+(The system dependent code for baud rate)
+9 W( change.  DE contains the two byte value from the baud)8 W
+16280 64888 MT
+(rate table.  This value is also stored in "SPEED")SH
+9280 67317 MT
+(SYSPRT)SH
+3668 50 9280 67517 UL
+/Times-Italic SF
+9280 68422 MT
+(Parameters)SH
+/Times-Roman SF
+16280 XM
+(Value in DE)SH
+/Times-Italic SF
+9280 69527 MT
+(Returns)SH
+/Times-Roman SF
+16280 XM
+(None)SH
+/Times-Italic SF
+9280 70632 MT
+(Description)SH
+/Times-Roman SF
+16280 XM
+(The system dependent code for setting the port.  The parameters are passed in DE,)
+106 W( which are)107 W
+16280 71737 MT
+(obtained from the port tables)SH
+ES
+%%Page: 32 33
+BS
+0 SI
+10 /Times-Italic AF
+6120 4404 MT
+(Page 32)SH
+12 /Times-Bold AF
+29686 XM
+(Kermit User Guide: CP/M-80 KERMIT 1.9.2)SH
+46800 50 6120 5709 UL
+10 /Times-Roman AF
+7120 9410 MT
+(SYSSCR)SH
+3724 50 7120 9610 UL
+/Times-Italic SF
+7120 10515 MT
+(Parameters)SH
+/Times-Roman SF
+14120 XM
+(String pointer in DE)SH
+/Times-Italic SF
+7120 11620 MT
+(Returns)SH
+/Times-Roman SF
+14120 XM
+(None)SH
+/Times-Italic SF
+7120 12725 MT
+(Description)SH
+/Times-Roman SF
+14120 XM
+(Setup the screen display for file transfer.  The Kermit version string is pointed to by DE.  If)
+41 W( the)40 W
+14120 13830 MT
+(terminal is not capable of cursor addressing \050eg dumb glass TTY\051 then)
+12 W( only the screen is cleared)13 W
+14120 14935 MT
+(and the version string is printed.)SH
+7120 17364 MT
+(CSRPOS)SH
+3724 50 7120 17564 UL
+/Times-Italic SF
+7120 18469 MT
+(Parameters)SH
+/Times-Roman SF
+14120 XM
+(Row number in B, column number in C)SH
+/Times-Italic SF
+7120 19574 MT
+(Returns)SH
+/Times-Roman SF
+14120 XM
+(None)SH
+/Times-Italic SF
+7120 20679 MT
+(Description)SH
+/Times-Roman SF
+14120 XM
+(Move the cursor to)
+74 W( row B, column C where B=1,C=1 is top LH corner of screen.  The routine)73 W
+14120 21784 MT
+(should first end a)
+19 W( "cursor position" leading string \050up to four characters\051 then use the parameters)20 W
+14120 22889 MT
+(given to complete the versions cursor position function)SH
+7120 25318 MT
+(SYSSPC)SH
+3613 50 7120 25518 UL
+/Times-Italic SF
+7120 26423 MT
+(Parameters)SH
+/Times-Roman SF
+14120 XM
+(None)SH
+/Times-Italic SF
+7120 27528 MT
+(Returns)SH
+/Times-Roman SF
+14120 XM
+(K bytes free in HL)SH
+/Times-Italic SF
+7120 28633 MT
+(Description)SH
+/Times-Roman SF
+14120 XM
+(Get the amount of free disk space on the selected disk drive.  This could be in the system)179 W
+14120 29738 MT
+(independent code.  Automatically detects CP/M V2.2 or V3.0.  No registers saved.)SH
+7120 32167 MT
+(MOVER)SH
+3611 50 7120 32367 UL
+/Times-Italic SF
+7120 33272 MT
+(Parameters)SH
+/Times-Roman SF
+14120 XM
+(Source Pointer in HL)SH
+14120 34377 MT
+(Destination Pointer in DE)SH
+14120 35482 MT
+(Byte count in BC)SH
+/Times-Italic SF
+7120 36587 MT
+(Returns)SH
+/Times-Roman SF
+14120 XM
+(None)SH
+/Times-Italic SF
+7120 37692 MT
+(Description)SH
+/Times-Roman SF
+14120 XM
+(Move \050BC\051 bytes from \050HL\051 to \050DE\051 Z80 based)
+50 W( systems do an LDIR, while 8080 systems do it)51 W
+14120 38797 MT
+(as a loop.  All registers destroyed)SH
+7120 41226 MT
+(PRTSTR)SH
+3668 50 7120 41426 UL
+/Times-Italic SF
+7120 42331 MT
+(Parameters)SH
+/Times-Roman SF
+14120 XM
+($ terminated string pointed to by DE)SH
+/Times-Italic SF
+7120 43436 MT
+(Returns)SH
+/Times-Roman SF
+14120 XM
+(None)SH
+/Times-Italic SF
+7120 44541 MT
+(Description)SH
+/Times-Roman SF
+14120 XM
+(Print the string onto the console.)SH
+14120 46970 MT
+(3\051)SH
+7120 50504 MT
+(PTTAB)SH
+14120 XM
+(WORD)SH
+21320 XM
+(Points to VT52 equivalent escape sequences.)SH
+3167 50 7120 50704 UL
+7120 52933 MT
+(SPDTAB)SH
+14120 XM
+(WORD)SH
+21320 XM
+(Address of baud-rate command table, or 0 if table does not exist)SH
+3834 50 7120 53133 UL
+7120 55362 MT
+(SPDHLP)SH
+14120 XM
+(WORD)SH
+21320 XM
+(Address of baud-rate help table, or 0 if SET SPEED is not supported.)SH
+3723 50 7120 55562 UL
+7120 57791 MT
+(PRTTAB)SH
+14120 XM
+(WORD)SH
+21320 XM
+(Address of port command table or 0 if SET PORT is not supported.)SH
+3834 50 7120 57991 UL
+7120 60220 MT
+(PRTHLP)SH
+14120 XM
+(WORD)SH
+21320 XM
+(Address of port help table or 0 if SET PORT is not supported)SH
+3723 50 7120 60420 UL
+7120 62649 MT
+(TIMOUT)SH
+14120 XM
+(BYTE)SH
+21320 XM
+(FUZZY-TIMER. Set)
+582 W( to value suitable to your system \050depends largely)
+166 W( on)165 W
+3888 50 7120 62849 UL
+14120 63754 MT
+(CPU speed\051)SH
+7120 66183 MT
+(VTFLG)SH
+14120 XM
+(BYTE)SH
+21320 XM
+(VT52 emulation flag.  Set to 0 if terminal)
+23 W( emulates a VT52, 01 if emulation is)24 W
+3222 50 7120 66383 UL
+14120 67288 MT
+(required, or 0FFH if emulations not possible \050eg for "CRT"\051)SH
+7120 69717 MT
+(ESCCHR)SH
+14120 XM
+(BYTE)SH
+21320 XM
+(default escape character-usually control-] but sometimes control-\134)SH
+3890 50 7120 69917 UL
+7120 72146 MT
+(SPEED)SH
+14120 XM
+(WORD)SH
+21320 XM
+(Storage space for baud-rate.  Set to 0FFFFH as)
+303 W( baud rates are initially)302 W
+3056 50 7120 72346 UL
+ES
+%%Page: 33 34
+BS
+0 SI
+12 /Times-Bold AF
+8280 4404 MT
+(1.9.2. Jump Table.)SH
+10 /Times-Italic AF
+51775 XM
+(Page 33)SH
+46800 50 8280 5709 UL
+/Times-Roman SF
+16280 7886 MT
+(unknown. Note)
+250 W( that the STATUS routine only looks at the first \050least significant\051 byte.)SH
+9280 10315 MT
+(PORT)SH
+16280 XM
+(WORD)SH
+23480 XM
+(Storage space for port.  Set to 0FFFFH as ports may not be implemented, and)43 W
+2556 50 9280 10515 UL
+16280 11420 MT
+(is initially unknown)SH
+9280 13849 MT
+(PRNFLG)SH
+16280 XM
+(BYTE)SH
+23480 XM
+(Printer copy flag-if O no copy.  Anything else => copy to printer)SH
+3834 50 9280 14049 UL
+9280 16278 MT
+(DBGFLG)SH
+16280 XM
+(BYTE)SH
+23480 XM
+(Debugging flag.  If O then no debugging to be)
+24 W( done.  \050ie writing of debugging)23 W
+4000 50 9280 16478 UL
+16280 17383 MT
+(info during a file transfer\051)SH
+9280 19812 MT
+(ECOFLG)SH
+16280 XM
+(BYTE)SH
+23480 XM
+(Local ECHO flag \050default is off\051)SH
+3889 50 9280 20012 UL
+9280 22241 MT
+(FLWFLG)SH
+16280 XM
+(BYTE)SH
+23480 XM
+(File warning flag.  If set to 1 will not overwrite files already existing)
+66 W( on disk)67 W
+4000 50 9280 22441 UL
+16280 23346 MT
+(with some-named files being transferred)SH
+9280 25775 MT
+(IBMFLG)SH
+16280 XM
+(BYTE)SH
+23480 XM
+(IBM system is the host-assume IBM file transfers etc)SH
+3778 50 9280 25975 UL
+9280 28204 MT
+(CPMFLG)SH
+16280 XM
+(BYTE)SH
+23480 XM
+(Flag indicating)
+322 W( type of CP/M files to be transferred.  Default setting -)321 W
+4001 50 9280 28404 UL
+16280 29309 MT
+(DEFAULT)SH
+9280 31738 MT
+(PARITY)SH
+16280 XM
+(BYTE)SH
+23480 XM
+(Type of parity in use)SH
+3611 50 9280 31938 UL
+16280 32843 MT
+(0 = Even parity)SH
+16280 33948 MT
+(3 = Mark parity)SH
+16280 35053 MT
+(6 = No parity \0508th bit is data\051)SH
+16280 36158 MT
+(9 = Odd parity)SH
+16280 37263 MT
+(12 = Space parity)SH
+9280 39692 MT
+(SPSIZ)SH
+16280 XM
+(BYTE)SH
+23480 XM
+(Size of send packet)SH
+2612 50 9280 39892 UL
+9280 42121 MT
+(RPSIZ)SH
+16280 XM
+(BYTE)SH
+23480 XM
+(Size of receive packet)SH
+2723 50 9280 42321 UL
+9280 44550 MT
+(STIME)SH
+16280 XM
+(BYTE)SH
+23480 XM
+(Send timer \050time-out\051)SH
+3000 50 9280 44750 UL
+9280 46979 MT
+(RTIME)SH
+16280 XM
+(BYTE)SH
+23480 XM
+(Receive timer \050time-out\051)SH
+3111 50 9280 47179 UL
+9280 49408 MT
+(SPAD)SH
+16280 XM
+(BYTE)SH
+23480 XM
+(Send Padding \050default=0\051)SH
+2556 50 9280 49608 UL
+9280 51837 MT
+(RPAD)SH
+16280 XM
+(BYTE)SH
+23480 XM
+(Receive Padding \050default=0\051)SH
+2667 50 9280 52037 UL
+9280 54266 MT
+(SPADCH)SH
+16280 XM
+(BYTE)SH
+23480 XM
+(Send Padding character \050default=NULL\051)SH
+3945 50 9280 54466 UL
+9280 56695 MT
+(RPADCH)SH
+16280 XM
+(BYTE)SH
+23480 XM
+(Receive Padding character \050default=NULC\051)SH
+4056 50 9280 56895 UL
+9280 59124 MT
+(SEOL)SH
+16280 XM
+(BYTE)SH
+23480 XM
+(Send EOL character \050default=CR\051)SH
+2500 50 9280 59324 UL
+9280 61553 MT
+(REOL)SH
+16280 XM
+(BYTE)SH
+23480 XM
+(Receive EOL character \050default=CR\051)SH
+2611 50 9280 61753 UL
+9280 63982 MT
+(SQUOTE)SH
+16280 XM
+(BYTE)SH
+23480 XM
+(Send quote character \050default=#\051)SH
+3944 50 9280 64182 UL
+9280 66411 MT
+(RQUOTE)SH
+16280 XM
+(BYTE)SH
+23480 XM
+(Receive quote character \050default=#\051)SH
+4055 50 9280 66611 UL
+9280 68840 MT
+(CHKTYP)SH
+16280 XM
+(BYTE)SH
+23480 XM
+(Ascii value of checktype)SH
+4000 50 9280 69040 UL
+16280 69945 MT
+(31H="1"=checktype1 \0506bits\051)SH
+16280 71050 MT
+(32H="2"=checktype2 \05012bits\051)SH
+ES
+%%Page: 34 35
+BS
+0 SI
+10 /Times-Italic AF
+6120 4404 MT
+(Page 34)SH
+12 /Times-Bold AF
+29986 XM
+(Kermit User Guide: CP/M-80 KERMIT 1.10)SH
+46800 50 6120 5709 UL
+10 /Times-Roman AF
+14120 7886 MT
+(33H="3"=CCITT checksum \050CRC\051)SH
+14120 8991 MT
+(Default is 31H\050"1"\051)SH
+7120 11420 MT
+(TACFLG)SH
+14120 XM
+(BYTE)SH
+21320 XM
+(If set to on \050non zero\051 send the TACCHR twice.  This is for ARPA TAC users,)3 W
+3889 50 7120 11620 UL
+14120 12525 MT
+(where the TAC swallows one "wakeup" character.)
+11 W( If)
+271 W( sent twice the TAC will pas one on and go)10 W
+14120 13630 MT
+(back to normal mode.)SH
+7120 16059 MT
+(TACCHR)SH
+14120 XM
+(BYTE)SH
+21320 XM
+(Desired TAC character.  It is ignored if TAC trapping is turned off. Value)
+71 W( to)72 W
+4056 50 7120 16259 UL
+14120 17164 MT
+(send twice if TAC interception is set on.  Default=0, but set to commercial)
+16 W( AT if the conditional)15 W
+14120 18269 MT
+(assembly flag TAC is set true)SH
+7120 20698 MT
+(BUFADR)SH
+14120 XM
+(WORD)SH
+21320 XM
+(Address of Multi-Sector buffering for I/O)SH
+4056 50 7120 20898 UL
+7120 23127 MT
+(BUFSEC)SH
+14120 XM
+(BYTE)SH
+21320 XM
+(The number of bytes the big buffers can hold.  Default is 1. \0500=256 sectors\051.)SH
+3779 50 7120 23327 UL
+7120 25556 MT
+(FFUSSY)SH
+14120 XM
+(BYTE)SH
+21320 XM
+(Indicates if)
+491 W( funny characters may be used in CP/M file names \050eg)492 W
+3668 50 7120 25756 UL
+/Courier SF
+14120 26661 MT
+(<>.,;?#[])SH
+/Times-Roman SF
+(\051 If zero, allow anything.  Default is nonzero.)SH
+7120 29090 MT
+(BMAX)SH
+14120 XM
+(SPACE:\0502bytes\051 Highest block number on selected disk drive)SH
+3000 50 7120 29290 UL
+7120 31519 MT
+(BMASK)SH
+14120 XM
+(SPACE:\0501byte\051 \050Records/block\051-1)SH
+3556 50 7120 31719 UL
+7120 33948 MT
+(BSHIFTF)SH
+14120 XM
+(SPACE:\0501byte\051 Number of shifts to multiply by rec.block)SH
+4001 50 7120 34148 UL
+7120 36377 MT
+(NNAMS)SH
+14120 XM
+(SPACE:\0501byte\051 Counter for file-names per line)SH
+3611 50 7120 36577 UL
+14 /Times-Bold AF
+6120 39979 MT
+(1.10. Future Work)SH
+10 /Times-Roman AF
+6120 42097 MT
+(Work that needs to be done in future releases includes:)SH
+/Symbol SF
+7910 44002 MT
+(\267)SH
+/Times-Roman SF
+8620 XM
+(Merge in support for additional CP/M-80 systems, particularly)
+135 W( those for which support was recently)134 W
+8620 45107 MT
+(added to the monolithic v3.x source.)SH
+/Symbol SF
+7910 47096 MT
+(\267)SH
+/Times-Roman SF
+8620 XM
+(Break up)89 W
+/Courier SF
+12686 XM
+(CPXSYS)SH
+/Times-Roman SF
+16625 XM
+(into discrete source files, one for each system.  These source files should serve)
+89 W( as)90 W
+8620 48201 MT
+(simple models for adding support for new)
+308 W( systems to Kermit-80 -- only the very basic screen)307 W
+8620 49306 MT
+(definitions, flags, i/o primitives,)
+131 W( initializations, and so forth should appear in each system-dependent)132 W
+8620 50411 MT
+(file.)SH
+/Symbol SF
+7910 52400 MT
+(\267)SH
+/Times-Roman SF
+8620 XM
+(Addition of missing)
+352 W( features -- compression of repeated characters during packet transmission,)351 W
+8620 53505 MT
+(transmission of file attributes \050particularly size, so that "percent done")
+243 W( can be displayed for both)244 W
+8620 54610 MT
+(incoming and outbound files\051, command macros, more advanced login scripts, remote operation)
+139 W( and)138 W
+8620 55715 MT
+(server mode, etc etc.  Any offers??)SH
+ES
+%%Page: 35 36
+BS
+0 SI
+12 /Times-Bold AF
+8280 4404 MT
+(CP/M-80 Kermit)SH
+10 /Times-Italic AF
+51775 XM
+(Page 35)SH
+46800 50 8280 5709 UL
+16 /Times-Bold AF
+8280 8272 MT
+(Index)SH
+8 /Times-Roman AF
+12280 10429 MT
+(8080 12,)
+400 W( 16)SH
+31720 XM
+(Parity 9)400 W
+31720 11353 MT
+(Pause 6)400 W
+12280 12277 MT
+(Append 6)400 W
+31720 XM
+(Port 9)400 W
+12280 13201 MT
+(ARPAnet 27)400 W
+31720 XM
+(Print 6)400 W
+12280 14125 MT
+(Attention Character)
+SH( 27)400 W
+31720 XM
+(PRINTER 9)400 W
+12280 15049 MT
+(Autoreceive 7)400 W
+31720 15973 MT
+(RECEIVE 6)400 W
+12280 16897 MT
+(Baud 10)400 W
+31720 XM
+(REMOTE 6)400 W
+12280 17821 MT
+(BIOS 12)400 W
+12280 18745 MT
+(Block Check)
+SH( 8)400 W
+31720 XM
+(SEND 7)400 W
+12280 19669 MT
+(Bootstrapping CP/M Kermit)
+SH( 20)400 W
+31720 XM
+(SET 7)400 W
+12280 20593 MT
+(Break 5)400 W
+31720 XM
+(Set padding)
+SH( 9,)
+400 W( 10)SH
+12280 21517 MT
+(Buffer size)
+SH( 8)400 W
+31720 XM
+(Set Receive)
+SH( 9)400 W
+12280 22441 MT
+(Bye 5)400 W
+31720 XM
+(Set Send)
+SH( 10)400 W
+31720 23365 MT
+(Set Start of packet)
+SH( 10)400 W
+12280 24289 MT
+(Carriage Return)
+SH( 4)400 W
+31720 XM
+(Show 11)400 W
+12280 25213 MT
+(COLLISION 8)400 W
+31720 XM
+(Status 11)400 W
+12280 26137 MT
+(Connect 5)400 W
+12280 27061 MT
+(Control-C 4)400 W
+31720 XM
+(TAC 27)400 W
+12280 27985 MT
+(Control-X 4)400 W
+31720 XM
+(TacTrap 10)400 W
+12280 28909 MT
+(Control-Z 4)400 W
+31720 XM
+(Take 11)400 W
+12280 29833 MT
+(Copy 5)400 W
+31720 XM
+(Terminal Emulation)
+SH( 10)400 W
+12280 30757 MT
+(CP/M 16)400 W
+31720 XM
+(Timeout 4,)
+400 W( 17)SH
+12280 31681 MT
+(CP/M-80 Kermit)
+SH( 1)400 W
+31720 XM
+(TIMER 10)400 W
+12280 32605 MT
+(CR 4)400 W
+31720 XM
+(TRANSMIT 11)400 W
+31720 33529 MT
+(Type 11)400 W
+12280 34453 MT
+(Debug 8)400 W
+12280 35377 MT
+(Default Disk)
+SH( 8)400 W
+31720 XM
+(USER 11)400 W
+12280 36301 MT
+(Directory 5)400 W
+12280 37225 MT
+(Directory file size)
+SH( 8)400 W
+31720 XM
+(VERSION 11)400 W
+12280 38149 MT
+(Downloading 20)400 W
+31720 XM
+(Virtual Terminal)
+SH( 5)400 W
+31720 39073 MT
+(VT100 Emulation)
+SH( 10)400 W
+12280 39997 MT
+(Eighth-Bit Prefix)
+SH( 9)400 W
+31720 XM
+(VT52 Emulation)
+SH( 10)400 W
+12280 40921 MT
+(Erase 5)400 W
+12280 41845 MT
+(Escape Character)
+SH( 5,)
+400 W( 8)SH
+31720 XM
+(Warning 11)400 W
+12280 42769 MT
+(Exit 5)400 W
+12280 43693 MT
+(External Terminal Emulation)
+SH( 10)400 W
+31720 XM
+(XON/XOFF 6)400 W
+12280 45541 MT
+(File Copying)
+SH( 5)400 W
+31720 XM
+(Z80 16)400 W
+12280 46465 MT
+(File-mode 8)400 W
+12280 47389 MT
+(File-Warning 6)400 W
+12280 48313 MT
+(FINISH 5)400 W
+12280 49237 MT
+(Flow Control)
+SH( 9)400 W
+12280 51085 MT
+(Generic Kermit-80)
+SH( 12)400 W
+12280 52009 MT
+(GET 6)400 W
+12280 53857 MT
+(Help 6)400 W
+12280 55705 MT
+(IBM 9)400 W
+12280 56629 MT
+(Input 6)400 W
+12280 57553 MT
+(Intercept Character)
+SH( 27)400 W
+12280 59401 MT
+(Local 4)400 W
+12280 60325 MT
+(Local-Echo 9)400 W
+12280 61249 MT
+(LOG 6)400 W
+12280 62173 MT
+(Logging 9)400 W
+12280 63097 MT
+(LOGOUT 6)400 W
+12280 64945 MT
+(NAK 4)400 W
+12280 65869 MT
+(No-exit 9)400 W
+12280 67717 MT
+(OUTPUT 6,)
+400 W( 9)SH
+12280 69565 MT
+(Pad character)
+SH( 9,)
+400 W( 10)SH
+ES
+%%Page: 36 37
+BS
+0 SI
+10 /Times-Italic AF
+6120 4404 MT
+(Page 36)SH
+12 /Times-Bold AF
+43052 XM
+(Kermit User Guide)SH
+46800 50 6120 5709 UL
+ES
+%%Page: i 38
+BS
+0 SI
+12 /Times-Bold AF
+8280 4404 MT
+(CP/M-80 Kermit)SH
+10 /Times-Italic AF
+52497 XM
+(Page i)SH
+46800 50 8280 5709 UL
+16 /Times-Bold AF
+25591 8272 MT
+(Table of Contents)SH
+12 SS 
+8280 10684 MT
+(1. CP/M-80 KERMIT)SH
+54480 XM
+(1)SH
+10 SS 
+9780 12074 MT
+(1.1. Credits)SH
+54580 XM
+(1)SH
+9780 13154 MT
+(1.2. What's New)SH
+54580 XM
+(2)SH
+9780 14234 MT
+(1.3. Overview of Kermit Operation)SH
+54580 XM
+(2)SH
+9780 15314 MT
+(1.4. Summary of CP/M)SH
+54580 XM
+(3)SH
+9780 16394 MT
+(1.5. Kermit-80 Description)SH
+54580 XM
+(4)SH
+9780 17474 MT
+(1.6. Kermit-80 Flavors)SH
+54080 XM
+(12)SH
+11780 18554 MT
+(1.6.1. Generic Kermit-80)SH
+54080 XM
+(12)SH
+11780 19634 MT
+(1.6.2. CP/M 3 Kermit)SH
+54080 XM
+(12)SH
+11780 20714 MT
+(1.6.3. System-Specific Versions)SH
+54080 XM
+(13)SH
+9780 21794 MT
+(1.7. Installation of Kermit-80)SH
+54080 XM
+(16)SH
+11780 22874 MT
+(1.7.1. Organization of Kermit-80)SH
+54080 XM
+(17)SH
+11780 23954 MT
+(1.7.2. Downloading Kermit-80)SH
+54080 XM
+(20)SH
+11780 25034 MT
+(1.7.3. Assembling Kermit-80 from the sources)SH
+54080 XM
+(23)SH
+9780 26114 MT
+(1.8. Adding Support For A New System)SH
+54080 XM
+(26)SH
+9780 27194 MT
+(1.9. Notes on New Features in Kermit-80 Version 4)SH
+54080 XM
+(27)SH
+11780 28274 MT
+(1.9.1. Interface Data.)SH
+54080 XM
+(28)SH
+11780 29354 MT
+(1.9.2. Jump Table.)SH
+54080 XM
+(28)SH
+9780 30434 MT
+(1.10. Future Work)SH
+54080 XM
+(34)SH
+12 SS 
+8280 31958 MT
+(Index)SH
+53880 XM
+(35)SH
+ES
+%%Page: ii 39
+BS
+0 SI
+10 /Times-Italic AF
+6120 4404 MT
+(Page ii)SH
+12 /Times-Bold AF
+43052 XM
+(Kermit User Guide)SH
+46800 50 6120 5709 UL
+ES
+%%Page: iii 40
+BS
+0 SI
+12 /Times-Bold AF
+8280 4404 MT
+(CP/M-80 Kermit)SH
+10 /Times-Italic AF
+51941 XM
+(Page iii)SH
+46800 50 8280 5709 UL
+16 /Times-Bold AF
+26702 8272 MT
+(List of Figures)SH
+10 SS 
+9780 10550 MT
+(Figure 1-1:)
+SH( Bootstrap)
+500 W( program for Kermit-80 and CP/M Version 2.2)SH
+54080 XM
+(22)SH
+ES
+%%Page: iv 41
+BS
+0 SI
+10 /Times-Italic AF
+6120 4404 MT
+(Page iv)SH
+12 /Times-Bold AF
+43052 XM
+(Kermit User Guide)SH
+46800 50 6120 5709 UL
+ES
+%%Page: v 42
+BS
+0 SI
+12 /Times-Bold AF
+8280 4404 MT
+(CP/M-80 Kermit)SH
+10 /Times-Italic AF
+52331 XM
+(Page v)SH
+46800 50 8280 5709 UL
+16 /Times-Bold AF
+27013 8272 MT
+(List of Tables)SH
+10 SS 
+9780 10550 MT
+(Table 1-1:)
+SH( Kermit-80)
+500 W( SET PORT Options)SH
+54080 XM
+(12)SH
+9780 11630 MT
+(Table 1-2:)
+SH( Systems)
+500 W( supported by Kermit-80 \050Part 1\051)SH
+54080 XM
+(18)SH
+9780 12710 MT
+(Table 1-3:)
+SH( Systems)
+500 W( supported by Kermit-80 \050Part 2\051)SH
+54080 XM
+(19)SH
+9780 13790 MT
+(Table 1-4:)
+SH( Terminals)
+500 W( supported by Kermit-80)SH
+54080 XM
+(20)SH
+9780 14870 MT
+(Table 1-5:)
+SH( Terminals)
+500 W( known to Kermit-80)SH
+54080 XM
+(26)SH
+ES
+%%Trailer
+%%Pages: 42
+%%DocumentFonts: Times-Roman Times-Bold Times-Italic Courier Symbol Courier-Oblique
diff --git a/cpkerm.txt b/cpkerm.txt
new file mode 100644 (file)
index 0000000..abcd0a3
--- /dev/null
@@ -0,0 +1,2463 @@
+
+                    CP/M-80 KERMIT VERSION 4.11 USER GUIDE
+
+
+                                  C. Gianone
+
+              Columbia University Center for Computing Activities
+                           New York, New York 10027
+
+
+                                April 23, 1991
+
+
+
+                            Copyright (C) 1981,1991
+            Trustees of Columbia University in the City of New York
+
+     Permission is granted to any individual or institution to use, copy,
+    or redistribute this document so long as it is not sold for profit, and
+                  provided this copyright notice is retained.
+1. CP/M-80 KERMIT
+
+********
+This document is formatted as an ordinary, plain text ASCII disk file.  Typeset
+copies are available in the Kermit User Guide from Columbia University.
+Changes should be made to CPKERM.MSS.
+********
+
+Program:    Mike Freeman, Bonneville Power Administration, Vancouver, WA, USA,
+            with contributions from many others.
+
+Language:   8080 Assembler, LASM, M80, or MAC80
+
+Version:    4.11
+
+Date:       April 1, 1991
+
+Documentation:  Christine Gianone, Columbia University, with contributions from
+            many others.
+
+KERMIT-80 Capabilities At A Glance:
+  Local operation:                   Yes
+  Remote operation:                  Partial, Auto-receive only
+  Login scipts:                      Yes, limited
+  Transfer text files:               Yes
+  Transfer binary files:             Yes
+  Wildcard send:                     Yes
+  File transfer interruption:        Yes
+  Filename collision avoidance:      Yes
+  Can time out:                      Yes
+  8th-bit prefixing:                 Yes
+  Repeat count prefixing:            No
+  Alternate block checks:            Yes
+  Terminal emulation:                Yes, VT52 and others
+  Communication settings:            Yes
+  Support for dial-out modems:       No
+  Transmit BREAK:                    Yes; most versions
+  IBM communication:                 Yes
+  Transaction logging:               No
+  Debug logging:                     No
+  Session logging:                   Yes
+  Raw file transmit:                 Yes
+  Act as server:                     No
+  Talk to server:                    Yes
+  Advanced commands for servers:     Yes
+  Command/init files:                Yes
+  Command macros:                    No
+  Local file management:             Yes
+  Handle file attributes:            No
+  Long packets:                      No
+  International Character Sets:      No
+  Sliding Windows:                   No
+  Printer control:                   Yes, limited
+
+
+1.1. Credits
+
+CP/M Kermit is the first of all the Kermit programs.  It was originally written
+by Bill Catchings of Columbia University in 1981.  Over the years,
+contributions have been added by many people, including Charles Carvalho (ACC),
+Bernie Eiben (DEC), Nick Bush (Stevens Institute of Technology), John Bray
+(University of Tennessee), Bruce Tanner (Cerritos College), Greg Small
+(University of California at Berkeley), Kimmo Laaksonen (Helskini University of
+Technology), Bertil Schou (Loughborough University), Jon Warbrick (Plymouth
+Polytechnic University), Brian Robertson (Aberdeen University), A.J. Cole
+(Leeds University), John Shearwood (Birmingham University), Tony Addyman
+(Salford University), Godfrey Nix and Martin Carter (Nottingham University),
+Ian Young (Edinburgh University), Chris Miles (Manchester University), Richard
+Russell, Dave Roberts, and many, many others.
+
+Version 4.11 is the work of Mike Freeman of the Bonneville Power Administration
+in Vancouver, WA, USA, with assistance from Russell Lang of Monash University
+in Australia, Jay S Rouman of Mt Pleasant MI, and others.
+
+
+1.2. What's New
+
+Features added since version 4.09 include:
+
+   - SET COLLISION {BACKUP/DISCARD/OVERWRITE/RENAME}
+
+   - SET INCOMPLETE-FILES {DISCARD/KEEP}
+
+   - Many REMOTE commands, including some REMOTE SET commands
+
+   - RENAME command to rename CP/M files from within Kermit-80
+
+   - SET RECEIVE/SEND PACKET-LENGTH nn (nn <= 94)
+
+   - SET AUTORECEIVE ON now implies that Kermit-80 ALWAYS tries to receive
+     more files when a RECEIVE transaction has completed.  The user can
+     cancel with ^C.
+
+   - QUIT is now a synonym for EXIT.
+
+   - STAY is now a synonym for SET NO-EXIT.
+
+   - CONNECT, RECEIVE and SEND may be abbreviated to C, R and S,
+     respectively.
+
+   - Cancellation of TAKE, TYPE, and PRINT commands from the keyboard.
+
+   - Many bug fixes.
+
+   - Kermit-80 Version 4.11 now supports the Microbee family of computers
+     (56K, 64K, 128K and 256K) manufactured by Microbee Systems, Ltd, of
+     Australia.
+
+   - Kermit-80 now supports the Ampro Little Board system.
+
+
+1.3. Overview of Kermit Operation
+
+Use the SET command to establish necessary communication parameters like SPEED
+and PARITY.  Use the CONNECT to establish a terminal connection to the remote
+computer.  If you are dialing out with a modem, type the necessary dialing
+commands to the modem first.  The dialing process can be automated to some
+extent using a TAKE command file containing INPUT, OUTPUT, and PAUSE commands.
+Then log in to the remote computer or service and conduct a session.
+
+To transfer a text file, start the Kermit program on the remote computer and
+tell it to SEND the desired file (if uploading) or to RECEIVE (if downloading).
+"Escape back" to CP/M Kermit, usually by typing Ctrl-] (hold down the Control
+key and press the right bracket key) and then type the letter C. At the CP/M
+Kermit prompt type RECEIVE (if you gave a SEND command to the remote Kermit) or
+SEND filename (if you gave a receive command to the remote Kermit).
+
+To transfer a binary file, give the command SET FILE TYPE BINARY to the remote
+Kermit and SET FILE-MODE BINARY to CP/M Kermit before issuing any SEND or
+RECEIVE commands.
+
+Multiple files of the same type (text or binary) can be transferred in a single
+operation using "wildcard notation" (including special characters like asterisk
+in the filename).
+
+When file transfer is complete, CONNECT back to the remote computer, use the
+EXIT command to exit from the remote Kermit program, finish your work on the
+remote computer, log out from it, escape back to CP/M Kermit again, and EXIT
+from CP/M Kermit.
+
+The remote Kermit may also be put into "server mode" to simplify these
+operations.  Give the SERVER command to the remote Kermit, escape back to CP/M
+Kermit, and then issue SEND commands to send files (upload), GET filename
+commands to receive (download) files, REMOTE commands to request various other
+services (like directory listings) from the remote Kermit.  When you are done,
+give a BYE command to terminate your remote session, or a FINISH command to
+tell the remote Kermit to return to its prompt so you can CONNECT back and
+conduct further business.
+
+That's all there is to it.
+
+
+1.4. Summary of CP/M
+
+There are essentially two versions of CP/M - Versions 2.2 and 3.0 (sometimes
+also called CP/M PLUS.)
+
+CP/M-80 Version 2.2 is run in a single 64 Kbyte "page", usually the largest
+amount of memory on Z80 or 8080 systems.  The BIOS (Basic input/output system),
+BDOS (Basic Disk Operating System) and CCP (Command console processor) all
+share memory with any transient program the user may wish to run.  Some basic
+commands are available through the CCP, like DIR, ERA etc,while others are
+loaded from disk into the transient program area and run as a program, like PIP
+or STAT.
+
+CP/M Version 3.0 (or CP/M PLUS) effectively removes the requirement of having
+the CCP and BDOS along with a chunk of the BIOS code being resident in the
+single 64k byte page of memory.  This allows even more space for programs in
+the TPA, but still a little less than the maximum of 64k.  It is substantially
+different from CP/M version 2.2, with lots of added features.  Kermit-80 uses
+very few additional version 3.0 features, and only where absolutely necessary.
+
+CP/M file specifications are of the form DEV:XXXXXXXX.YYY, where
+
+DEV:            is a device name, normally the A: or B: floppy.  If omitted,
+                the device name defaults to your connected diskette.
+
+XXXXXXXX        is a filename of up to 8 characters.
+
+YYY             is the file type, up to 3 characters.
+
+File names and file types may contain letters, digits, and some special
+characters, including dash, dollar sign, and underscore, but no imbedded
+spaces.  Upper and lower case letters are equivalent.
+
+"Wildcard" file-group specifications are permitted in file names and file types
+(but not device names) within certain contexts; a "*" matches a whole field, a
+"?"  matches a single character, including space.  Examples: "*.F??" specifies
+all files whose types start with F and are 1, 2, or 3 characters long; "F?.*"
+specifies all files whose names start with F and are no more than two
+characters long (before the trailing spaces).
+
+The five CP/M commands are:
+
+DIR file        Lists the the names of the specified files.  The default file
+                specification is "*.*".  Example: "DIR B:*.FOR".
+
+ERA file        Erases (deletes) the specified file(s); wildcards allowed.
+
+REN new old     Changes the name of a file from old to new, e.g.
+                "REN NEW.FOR=OLD.FOR".
+
+SAVE            Saves the specified number of memory blocks into a file.  (Not
+                on CP/M Plus systems)
+
+TYPE file       Types the specified file on the screen, e.g.  "TYPE FOO.TXT".
+
+The most important programs are:
+
+STAT            Gives statistics on disk usage; sets and displays IOBYTE.  (Not
+                on CP/M Plus systems)
+
+PIP             Peripheral Interchange Program.  Copies files.  In response to
+                the "*" prompt, give a command of the form
+
+                    disk:outfile=disk:infile
+
+                Wildcards ("*" for a whole field or "?"  for a letter) can be
+                used.  Examples: "A:=B:*.*" to copy a whole disk, "A:=B:*.FOR"
+                to copy all the Fortran programs from disk B to disk A. If the
+                disk specification is omitted, your "connected" disk is
+                assumed.  Command line arguments are also accepted, e.g. "PIP
+                A:=B:*.*".
+
+There are equivalent commands for CP/M Version 3.0, but are not loaded into
+memory in the same way as for CP/M Version 2.2.  For further information on
+CP/M, consult your microcomputer manual or a CP/M handbook.
+
+
+1.5. Kermit-80 Description
+
+Since Kermit-80 runs on a standalone micro, it is always in control of the
+screen -- it is always in "local mode".  It includes a terminal emulator for
+establishing a connection to a remote computer or service, and during file
+transfer, it keeps the screen updated with the file name and the packet number,
+whether sending or receiving.
+
+Kermit-80 is capable of an imprecise or "fuzzy" timeout on an input request,
+and can break deadlocks automatically.  In most cases, this is not important,
+because the Kermit program on the other side is most likely able to handle the
+timeouts.  The timeouts done by Kermit-80 are fuzzy because they depend on the
+speed of the processor and other factors that can vary from system to system.
+
+If, despite the timeout capability, the transmission appears to be stuck (and
+you can tell that this has happened if the screen fails to change for a while)
+you can type carriage return to have the micro do what it would have done on a
+timeout, namely NAK the expected packet to cause theforeign host to send it
+again (or, if the micro is sending, to retransmit the last packet).  Micro/
+micro or micro/IBM-mainframe transfers could require this kind of manual
+intervention.
+
+File transfers may be interrupted in several ways.
+
+Control-C       This will return you to Kermit-80 command level immediately, so
+                that you can connect back to the remote system, or take any
+                other desired action.
+
+Control-X       When sending a file, this will terminate the sending of the
+                current file with a signal to the KERMIT on the other side to
+                discard what it got so far.  If there are more files to be
+                sent, KERMIT-80 will go on to the next one.  When receiving a
+                file, KERMIT-80 will send a signal to the remote KERMIT to stop
+                sending this file.  If the remote KERMIT understands this
+                signal (not all implementations of KERMIT do), it will comply,
+                otherwise the file will keep coming.  In any case, the remote
+                KERMIT will go on to the next file in the group, if any.
+
+Control-Z       Like Control-X, except if a file group is being transmitted,
+                this will stop the transmission of the entire group.  If only a
+                single file is being transmitted, it works exactly like
+                Control-X.
+
+Carriage Return If you type a carriage return Kermit-80 will resend the current
+                packet.  You may do this repeatedly, up to the packet retry
+                limit (somewhere between 5 and 16 times) for a particular
+                packet.
+
+
+                              KERMIT-80 COMMANDS
+
+Kermit-80 is an interactive program.  It issues a prompt, you type a command.
+The process repeats until you give the EXIT command to leave the program.
+
+Commands consist of keywords, filenames, and numbers.  Keywords may be
+abbreviated to minumum unique length.  "?" may be typed to request a menu of
+the available options for the current field at any point in a command.  ESC may
+be typed at any point in a command to fill out the current keyword or filename;
+if sufficient characters have not been typed to identify the current field
+uniquely, Kermit-80 will sound a beep and allow you to continue from that
+point.  Here are Kermit-80's commands:
+
+BREAK   Send a BREAK condition to the remote computer.  This is only possible
+        if your system is capable of sending breaks.  It is intended to be used
+        with PAUSE, OUTPUT, etc and the TAKE command to do wierd and wonderful
+        things, like automatic logging on to a remote host.
+
+BYE     When talking to a remote Kermit Server, this command shuts down the
+        server and logs it out, and also exits from Kermit-80 to CP/M command
+        level.
+
+CONNECT Establish a terminal connection to the computer, service, or device
+        that is connected to the serial port, i.e. pass all typein to the
+        serial port and display all input from the serial port on the screen.
+        Also, emulate a DEC VT52 to allow cursor control, screen clearing,
+        etc., if VT52-EMULATION is ON (see below), in which case you should
+        also set your terminal type on the remote host to VT52.  (Some versions
+        emulate other terminals.)  The CONNECT command may be abbreviated by
+        the single letter C.
+
+        Warning: VT52 emulation is only successful if your system or its
+        attached terminal can do the same sort of functions as a genuine VT52.
+        Things to beware of are cursor addressing, clear to end of page and end
+        of line, clear screen, home cursor, and clear-and-home functions.  The
+        useability of VT52 emulation depends entirely on how many of the VT52
+        functions can be emulated by your micro or terminal.
+
+        The escape character differs from micro to micro; when you issue the
+        CONNECT command, the micro will print a message telling you how to get
+        back.  The escape sequence is generally an uncommonly-used control
+        character, like CTRL-backslash or CTRL-rightbracket, followed by a
+        single letter "command":
+
+        C   Close Connection, return to Kermit-80> command level.
+        S   Display Status of connection, but maintain remote connection.
+        ?   List available single-character commands.
+        0   (zero) Send a null (0) character.
+        B   Send a BREAK signal.  Most systems provide this function.
+        D   Drop the line.  Used on the Apple with modem.  Automatically closes
+            the connection after dropping the line.  The TORCH system
+            acknowledges this command but does nothing.
+        P   Toggle printer on or off.  Allows you to copy whatever goes to the
+            screen to the printer.
+        S   Temporarily suspend logging to the log file.
+        Q   Restart logging to the log file
+        ^]  (or whatever - a second copy of the escape character) Send the
+            escape character itself to the remote host.
+
+COPY source destination
+        Copy a named file to another file, either on the same drive or another
+        drive.
+
+DIRECTORY
+        This provides a directory listing of the specified files.  If no files
+        are specified, all files on the default disk are listed.  File sizes,
+        in K, are included.  You may interrupt the listing at any time by
+        typing any character.  The listing (even if interrupted) concludes with
+        a display of the amount of free storage left on the disk.  You can
+        inhibit the display of file sizes by SET DIRECTORY OFF.
+
+ERASE filespec
+        This executes the CP/M ERA command on the specified file(s).  The names
+        of the files being erased are not displayed.
+
+EXIT    Quit back to CP/M.  The return is made by a JMP 0 (Warmstart).  QUIT is
+        a synonym for EXIT.
+
+FINISH  Like LOGOUT, but shuts down the remote server without logging it out.
+        Leaves you at Kermit-80 command level; subsequent CONNECT commands will
+        put you back at host system command level.
+
+GET filespec [local_filespec]
+        When Kermit-80 is talking to a Kermit Server on the host, you should
+        use the GET command to request the server to send files to you, for
+        example:
+
+            get hlp:k*.hlp
+
+        You may specify a local filename if you want to save the remote file
+        under a different filename.  Limitation: If you request an alternate
+        block check type using the SET BLOCK command, the GET command will not
+        communicate it to the remote server.  If you want to have type 2 or 3
+        block checks done when getting files from the server, you have to issue
+        the appropriate SET BLOCK command to the remote KERMIT before putting
+        it in server mode.
+
+HELP    List all these commands, with a short description on what the commands
+        do.  A question mark will do the same.  If you have already typed a
+        command but do not know what the parameters are, type a space (to
+        indicate the end of the command) and a question mark.  You will be
+        informed of what Kermit can expect at that stage.
+
+INPUT seconds text
+        Setup a text line and time delay for your CP/M system to expect from
+        the host, then wait up to the given number of seconds (approximately)
+        for text to be sent to your CP/M-80 system.
+
+LOG filespec
+        When CONNECTed to a foreign host as a terminal, log the terminal
+        session to the specified diskette file.  This functionality depends to
+        some extent on the remote host's ability to do XON/XOFF flow control,
+        and does not guarantee a complete transcript (after all, that's what
+        the KERMIT protocol is for).  The log file is closed when the
+        connection is closed by typing the escape character followed by the
+        single-character command "C".
+
+        It is possible to temporarily suspend logging during connect state.
+        Typing an escape sequence can turn file logging on (<escape-character>
+        R for Resume) or off (<escape-character> Q for quiet).
+
+        Re-entering connect state will re-open the previously opened log file
+        and append to that file.
+
+LOGOUT  Like BYE, but leaves you at Kermit-80 command level.
+
+OUTPUT text
+        Send the text to the remote computer as if you had typed it.
+
+PAUSE seconds
+        If this command is issued your CP/M system will wait a while before
+        proceeding with another command.  This is intended for use in TAKE
+        commands, where you may want to pause for a while before proceeding
+        with the rest of the TAKE file.  The actual delay is very variable
+        between systems, and values should be determined on a trial and error
+        basis.
+
+PRINT   Print a file to the console and printer.  Output to the printer is
+        buffered by the Kermit-maintained printer buffer.  This routine is
+        identical to TYPE but characters are echoed to the printer as well as
+        to the screen.  Suspending and canceling output is as described in
+        TYPE.
+
+QUIT    Synonym for EXIT.
+
+RECEIVE filespec
+        Receive file(s) from the remote Kermit, and save them under the names
+        provided in the file headers supplied by the remote host.  If a local
+        filespec is given, the file is saved under the given filename.  If the
+        names aren't legal, use as many legal characters from the name as
+        possible (see the description of SET FILE-WARNING below).  If there's a
+        conflict, and FILE-WARNING is ON, warn the user and try to build a
+        unique name for the file by adding "&" characters to the name.  RECEIVE
+        can be abbreviated to the single letter R.
+
+REMOTE command
+        Send a command to a remote Kermit server.  The results are sent back to
+        your CP/M screen.  When two arguments are required and specify less
+        than two in the command, you will be prompted for the missing
+        arguments.  REMOTE commands include:
+
+        REMOTE CD [directory]
+            Ask the remote server to change its default directory.  If no
+            directory is specified, the server changes to its login directory.
+
+        REMOTE COPY file1 file2
+            Ask the remote server to copy file1 to file2.
+
+        REMOTE RENAME file1 file2
+            Ask the remote server to rename file1 to file2.
+
+        REMOTE DELETE filespec
+            Ask the remote server to delete the named file or files.
+
+        REMOTE DIRECTORY [filespec]
+            Ask the remote server to display a directory listing of the given
+            files or, if the filespec is omitted, all the files in the current
+            device or directory.
+
+        REMOTE DISK-USAGE
+            Ask the remote server to display information about its disk usage
+            (such as free or used space).
+
+        REMOTE ERASE filespec
+            Same as REMOTE DELETE.
+
+        REMOTE FINISH
+            Same as FINISH.
+
+        REMOTE HELP
+            Ask the remote server to display a list of the commands it can
+            respond to.
+
+        REMOTE HOST command
+            Ask the remote server to have its operating system execute the
+            given command.
+
+        REMOTE KERMIT command
+            Ask the remote server to execute the given Kermit command, given in
+            the server Kermit's command syntax.
+
+        REMOTE LOGIN user password
+            Log in to a remote Kermit server which has been set up to require a
+            username and password.
+
+        REMOTE MESSAGE text
+            Send the text to the remote server for display on its screen
+            (useful with MS-DOS Kermit servers).
+
+        REMOTE SET parameter value
+            Ask the remote server to set the given parameter to the given
+            value, for example REMOTE SET FILE TYPE BINARY.  Type REMOTE SET ?
+            to see a list of the REMOTE SET options.
+
+        REMOTE SPACE
+            Same as REMOTE DISK-USAGE.
+
+        REMOTE STATUS
+            Ask the remote server to provide a status report.
+
+        REMOTE TYPE file
+            Ask the remote server to display the named file on the micro's
+            screen.
+
+        REMOTE WHO [user]
+            Ask the remote server for a list of users who are logged in, or if
+            a user is specified, for a report on the named user.
+
+RENAME file1 file2
+        Rename local CP/M file1 to file2.
+
+SEND filespec
+        Send file(s) specified by filespec to the remote Kermit.  The filespec
+        may contain CP/M wildcards.  SEND may be abbreviated to the single
+        letter S.
+
+SET parameter [value]
+        Set the specified parameter to the specified value.  Possible parameter
+        settings:
+
+        AUTORECEIVE
+                ON (or OFF).  Allows several files to be received without
+                having to type RECEIVE on the receiving machine.  The routine
+                simply looks for activity on the serial line, and if so fudges
+                a RECEIVE command.  The packet sent by the sender will be lost.
+
+        BLOCK-CHECK-TYPE option
+                The options are:
+
+                1-CHARACTER-CHECKSUM
+                        Normal, default, standard 6-bit checksum.
+                2-CHARACTER-CHECKSUM
+                        A 12-bit checksum encoded as two characters.
+                3-CHARACTER-CRC-CCITT
+                        A 16-bit CCITT-format Cyclic Redundancy Check, encoded
+                        as 3 characters.
+
+        BUFFER-SIZE value
+                This allows you to set a buffer size during transfer of data.
+                On some systems it takes so long that the remote end times out
+                while the local system is reading or writing to disk.  The size
+                is the number of 128 disk sectors (nominal) and can be from 1
+                (128 bytes) to 64 (8 kbytes).
+
+                CP/M-80 filenames will still be mapped to uppercase characters.
+
+        COLLISION value
+                What to do when a file arrives that has the same name as an
+                existing file.  BACKUP means to rename the existing file.
+                DISCARD means to discard and reject the incoming file.
+                OVERWRITE means to overwrite the existing file.  RENAME means
+                to rename the existing file.
+
+        DEBUG   ON (or OFF).  Enables/disables displaying of packets on the
+                screen during file transfer.  Not performed if the QUIET option
+                has been set for the terminal (SET TERMINAL QUIET)
+
+        DEFAULT-DISK drive letter
+                This allows you to set the default disk as source and
+                destination of file transfers.  In addition, issuing this
+                command causes you to switch to the specified disk and log it
+                in, write-enabled.  The colon must be included in the disk name
+                (A:).  The selected disk appears in your KERMIT-80 prompt, for
+                instance
+
+                    Kermit-80 14A:>
+
+        DIRECTORY-FILE-SIZE ON (or OFF).
+
+                By setting DIRECTORY-FILE-SIZE OFF you can get an abreviated
+                listing of your disk drive.  File sizes are not calculated, and
+                five files are shown on a line.  Setting this option ON will
+                show file sizes of each file.
+
+                Both options will list the free space remaining.
+
+        ESCAPE  Change the escape character for virtual terminal connections.
+                Kermit-80 will prompt you for the new escape character, which
+                you enter literally.
+
+        FILE-MODE option
+                Tells KERMIT-80 what kind of file it is sending, so that KERMIT
+                can correctly determine the end of the file.  SET FILE BINARY
+                means to send all the 128-byte blocks (ie logical CP/M sectors)
+                of the file, including the last block in its entirety; SET FILE
+                ASCII is used for text files, and transmission stops when the
+                first Control-Z is encountered anywhere in the file (this is
+                the CP/M convention for marking the end of a text file).
+
+                SET FILE-MODE DEFAULT tells Kermit to attempt to determine the
+                file type by examining the file being transmitted.  If a
+                Control-Z appears before the last block of the file, it is
+                assumed to be BINARY; if, when the first Control-Z is
+                encountered, the remainder of the file contains only
+                control-Z's, it is assumed to be a text file.  Unfortunately,
+                not all programs fill the remainder of the last record of a
+                text file with Control-Z's, so this algorithm is not always
+                successful.
+
+                If binary transmission is used on a text file, or a compressed
+                file (eg a .DQC file) some extraneous characters (up to 127 of
+                them) may appear at the end of the file on the target system.
+
+                If ASCII transmission is used on a binary file, any 8th bits
+                set will be stripped and a warning sent to the console.  When
+                the first control-Z is encountered, the file is assumed to be
+                at the end, even if it is not.
+
+        FLOW-CONTROL ON (or OFF)
+                Sets XON/XOFF flow control on or off.  If set ON the host is
+                expected to respond to an XOFF or XON sent by Kermit-80.  If
+                set off, no flow control is assumed and any XON/XOFF is
+                ignored.
+
+        IBM ON (or OFF)
+                Allow the transfer of files to and from an IBM mainframe
+                computer.  This makes Kermit-80 wait for the IBM turnaround
+                character (XON), ignore parity on input, add appropriate parity
+                to output, and use local echoing during CONNECT.  As
+                distributed, KERMIT-80 uses MARK parity for IBM communication.
+                If you don't give this command, IBM mode is OFF.  Since IBM
+                VM/CMS KERMIT does not have timeout capability, SET IBM ON also
+                turns on the "fuzzy timer" automatically.
+
+        LOCAL-ECHO ON (or OFF)
+                When you CONNECT to a remote host, you must set LOCAL-ECHO ON
+                if the host is half duplex, OFF if full duplex.  OFF by
+                default.
+
+        LOGGING ON (or OFF)
+                Cease or resume logging whenever connect mode is entered.  This
+                is really only applicable after a LOG command is no longer
+                required.
+
+        NO-EXIT This command is applicable only for Kermit initiated with a
+                command tail.  For example, if Kermit was initiated by:
+
+                KERMIT ;SEND HELLO;NO-EXIT
+
+                Kermit would first seek out and execute the KERMIT.INI file (if
+                present), then send file HELLO to a remote system.  Usually
+                Kermit would exit back to CP/M, but NO-EXIT over-rides this.
+                STAY is a synonym for NO-EXIT.
+
+                Note the leading semicolon.  This clears leading spaces from
+                the first command.
+
+        OUTPUT text-line
+                Send a line of text to the remote computer (or modem).  This
+                simply copies the string to the correct line, and assumes all
+                appropriate parameters have been set to be used, e.g. speed,
+                parity etc.  It is intended for use in TAKE command files.
+
+        PARITY option
+                Sets parity for outgoing characters to one of the following:
+                NONE, SPACE, MARK, EVEN, or ODD.  On input, if parity is NONE,
+                then the 8th bit is kept (as data), otherwise it is stripped
+                and ignored.  The parity setting applies to both terminal
+                connection and file transfer.  If you set parity to anything
+                other than none, KERMIT-80 will attempt to use "8th bit
+                prefixing" to transfer binary files.  If the other KERMIT is
+                also capable of 8th bit prefixing, then binary files can be
+                transferred successfully; if not, the 8th bit of each data byte
+                will be lost (you will see a warning on your screen if this
+                happens).
+
+        PORT port name
+                Allows you to switch between different communication ports.
+                This command is not available on all systems.  Type SET PORT ?
+                for a list of valid options for your system. (Note:  If your
+                system does not support several ports, this command will return
+                a "Not implemented" error if you try to set a port.)
+
+        PRINTER ON (or OFF)
+                Turns copying of CONNECT session to printer on and off.  It is
+                also possible to toggle the printer on/off from the connect
+                state, by typing <escape character> followed by P.
+
+        RECEIVE parameter [value]
+                Set a RECEIVE parameter.
+
+                PAD-CHAR
+                        Set the PAD character to use while receiving files.
+                        Currently a dummy, as for SET SEND PAD-CHAR.
+                PADDING [value]
+                        Set the number of PAD characters to use while receiving
+                        files.  Same as SET SEND PADDING.
+                START-OF-PACKET [value]
+                        Set the default start of Packet character for receiving
+                        files.  Apply the same rules and considerations as for
+                        SET SEND START-OF-PACKET.
+                PACKET-LENGTH number
+                        Tell the other Kermit the longest packet length CP/M
+                        Kermit is willing to receive during file transfer.  The
+                        maximum length is 94, which is also the default length.
+
+        SEND parameter [value]
+                Set a SEND parameter.
+
+                PAD-CHAR
+                        Set the Pad character to be used while sending files.
+                        It is currently a dummy entry, and does not do
+                        anything.
+                PADDING [value]
+                        Set the number of PAD-CHARS to be used while sending
+                        files.  This too does nothing.
+                START-OF-PACKET
+                        Set the default start of packet character to another
+                        character than control-A.  This may be necessary on
+                        systems (including intervening networks) that trap
+                        control-A characters.  Choose a control character not
+                        otherwise used, ie not carriage return (13D, ODH), line
+                        feed (10D, OAN), tabs (09D, 09H), backspace (08H), and
+                        bell (07H) or any other used between you and your
+                        remote system.
+
+        SPEED value
+                Change the baud rate of the communications port.  This command
+                only works on some systems.  value is the numeric baud rate
+                (300, 9600, etc.) desired.  Type SET SPEED followed by a
+                question mark for a list of supported baud rates.  On systems
+                that do not support this command, you must set the port baud
+                rate from CP/M or other setup mechanism outside of KERMIT-80.
+
+        TACTRAP Set the TAC intercept character.  If you are attached to a TAC
+                it will swallow the intercept character (commercial AT sign by
+                default) so Kermit sends it twice.  With this command you can
+                set the intercept character (ie the one to send twice) to
+                another character.
+
+        TERMINAL option
+                Select one of the following terminal characteristics:
+
+                OFF     sets emulation off, and its up to the attached terminal
+                        to respond to escape sequences sent from the remote
+                        host system.
+
+                DUMB    Like off, but carriage return and line feed characters
+                        are the only control characters accepted.  All other
+                        control characters are simply ignored. (Really a "Glass
+                        TTY").
+
+                EXTERNAL
+                        Emulation is provided for by a routine in the system
+                        dependent part of Kermit.  Attempting to set this
+                        option without having and externally supplied routine
+                        will returna "Not Implemented" error.
+
+                OFF     All characters are passed directly to the terminal
+                        without any interpretation by Kermit.
+
+                VT52    When connected as a terminal to a foreign host, the
+                        micro emulates a VT52.  VT52 emulation is set by
+                        default, except on micros that already have terminal
+                        functionality built in, such as the DEC VT180 and
+                        DECmate (these act as VT100-series terminals).  Some
+                        systems emulate other terminals, like the ADM3A; see
+                        table 1-5.
+
+                QUIET   Do not display any file transfer information onto the
+                        console.  This mode is useful if you console takes a
+                        long time to update the display.  Only the file name is
+                        displayed.  DEBUGging information is not displayed even
+                        if selected.
+
+                REGULAR Inverse of QUIET.  All packets etc displayed, as
+                        ususal.
+
+        TIMER ON (or OFF)
+                Enable or disable the "fuzzy timer".  The timer is off by
+                default, because in the normal case KERMIT-80 is communicating
+                with a mainframe KERMIT that has its own timer.  Mainframe
+                KERMIT timers tend to be more precise or adaptable to changing
+                conditions.  You should SET TIMER ON if you are communicating
+                with a KERMIT that does not have a timer.  You should SET TIMER
+                OFF if you are communicating over a network with long delays.
+
+        USER user-number
+                Sets another user number to be active.  Acceptable user numbers
+                are 0 to 31, though it is recommended to use user numbers 0 to
+                15 only.  This is really only useful for Winchester Systems
+                with high disk capacities.
+
+        WARNING ON (or OFF)
+                Warn user of filename conflicts when receiving files from
+                remote host, and attempt to generate a unique name by adding
+                "&" characters to the given name.  ON by default, which is
+                equivalent to SET COLLISION RENAME.
+
+SHOW    Display all settable parameters.  You will get a page or so of the
+        status af all parameters that can be set using the SET command.
+
+STATUS  The same function as Show.
+
+STAY    Equivalent to SET NO-EXIT.
+
+TAKE filespec
+        Take characters and commands from the specified file as if they were
+        entered from the keyboard.  This is useful if you want to set up a
+        batch job.  A command file can send, get, receive, set functions etc
+        automatically.  A TAKE command can be interrupted with ^C.
+        An automatic "TAKE KERMIT.INI" is executed from the default drive when
+        Kermit-80 is loaded.  This can be used to set defaults of band rate,
+        parity, filetype, default drive etc.
+
+        If KERMIT.INI does not exist, control is given directly to the user.
+
+TRANSMIT filespec turnaround
+        Send the specified file to the system on the other end of the
+        connection as though it were being typed at the terminal, one line at a
+        time.  Each line sent is terminated with a carriage return, and any
+        line feeds are stripped from the file sent.  After each line has been
+        sent Kermit waits for a character string from the host (eg a acrriage
+        return).  If not specified, a carriage return is assumed.  No KERMIT
+        protocol is involved.  An asterisk (star) is sent to the console for
+        every line sent, to indicate how the transfer is progressing.  This is
+        useful for sending files to systems that don't have a KERMIT program.
+        During transmission, you may type one of these single-character
+        commands:
+
+        Control-C
+            Cease transmission, and drop into terminal emulation mode.
+        CR  (carriage return) Re-transmit the previous line.
+
+TYPE filespec
+        Type a local CP/M file or files on the CP/M screen.  A Control-C will
+        cancel the command and return to the Kermit prompt.  A Ctrl-X will
+        cancel the current file and go on to the next one, if any.  Typing any
+        other character while the file is being displayed will suspend the
+        output.  Another character will resume output.
+
+VERSION Show the name, edit number, and edit date of several of the modules
+        that make up Kermit-80.
+
+
+1.6. Kermit-80 Flavors
+
+Many of the systems supported use an external terminal, rather than a built-in
+console.  Kermit may be further customized for these systems by defining (at
+assembly time) the terminal type to be used.  If the terminal type is unknown
+or does not match any of the existing terminal options, the generic "CRT"
+option may be selected.  In this case, Kermit cannot do fancy screen control
+during file transfer; it simply types the file names, packet numbers, and
+messages in sequence across and down the screen.  This works best if you can
+put your micro or terminal in "autowrap" mode; otherwise the packet numbers
+will pile up in the rightmost column; the filenames and messages will always
+appear on a new line, however.  If no specific terminal has been selected,
+Kermit cannot do VT52 emulation; it can act as a "dumb terminal" (sometimes
+called a "glass TTY"), or else its own built in terminal firmware provides
+cursor control functions independent of the Kermit program.
+
+
+1.6.1. Generic Kermit-80
+
+"Generic Kermit-80" is an implementation of Kermit that should run on any 8080-
+compatible CP/M 2.2 system with no modification at all, or perhaps only a minor
+one.  Unlike other Kermit-80 implementations, it contains no system-dependent
+manipulation of the serial port.  All I/O is done with standard CP/M BIOS
+calls, and I/O redirection is done using the CP/M IOBYTE function, which,
+according to the Digital Research CP/M Operating System Manual, is an optional
+feature of any particular CP/M implementation.  If your system does not provide
+the IOBYTE function, Generic Kermit-80 will not work; furthermore, not all
+systems that implement IOBYTE do so in the same way.  The SET PORT command may
+be used to select the devices to be used for input and output.  Table 1-1 lists
+the options to the SET PORT command and their effects.
+
+    -----------------------------------------------------------------------
+
+                   SET PORT xxx    input from      output to
+                        CRT            CRT:            CRT:
+                        PTR            PTR:            PTP:
+                        TTY            TTY:            TTY:
+                        UC1            UC1:            UC1:
+                        UR1            UR1:            UP1:
+                        UR2            UR2:            UP2:
+
+                    Table 1-1:  Kermit-80 SET PORT Options
+
+    -----------------------------------------------------------------------
+
+The default is SET PORT PTR.  In all cases, the console (CON:) and list (LST:)
+devices used are those selected when Kermit is started.
+
+The reason all Kermit-80 implementations aren't generic is that a good deal of
+speed is sacrificed by getting all services from the operating system.  While a
+specific implementation of Kermit-80 may be able to operate at 4800, 9600, or
+even 56 Kilo baud, generic Kermit will fail to work on some systems at speeds
+in excess of 1200 baud.  In addition, many features of Kermit require more
+specific knowledge of the hardware involved.  Generic Kermit cannot send a
+BREAK signal, or change the baud rate, for example.
+
+
+1.6.2. CP/M 3 Kermit
+
+CP/M-3 Kermit (also known as CP/M-Plus Kermit) is a version of generic
+Kermit-80, and should run on most CP/M-3 (CP/M-Plus) systems.  It uses the
+auxilliary port (AUX:) to communicate to the remote Kermit.  The SET BAUD and
+SET PORT commands are not supported; nor can a BREAK be sent.  Like generic
+Kermit-80, a terminal may be selected at assembly time.
+
+
+1.6.3. System-Specific Versions
+
+There are also many versions of Kermit-80 tailored to specific systems.  Most
+of these operate uniformly, but some of them take advantage (or suffer
+limitations) of the specific system.  Here are some of the special features for
+particular systems:
+
+Amstrad: -- Two versions:
+
+    PCW 8256
+        The PCW 8256/8512 with the serial inerafce attached.
+
+    CPC 6128
+        The 664 with add on memory and 6128 are both supported.  Both systems
+        must run CP/M Plus, so the 664 will need an add on RAM pack and CP/M
+        upgrade.  A high speed transfer rate of 38k baud can be used between
+        Amstrad computers.
+
+ACCESS:
+    Access Matrix computer using port J5.  Supports SET BAUD-RATE for rates of
+    300-9600 baud.
+
+Apple II -- four variations:
+
+    APMMDM:
+        Apple with Z80 Softcard and Micromodem II in slot 2 Dialout capability
+        provided in connect command; user is prompted for phone number if
+        carrier is not present.  During connect mode, ^]D drops carrier.  BYE
+        command also causes carrier to be dropped.
+
+    AP6551:
+        Apple with Z80 Softcard, and one of several 6551-based communication
+        cards; the slot number is a compile-time parameter (default is slot 2).
+        SET BAUD-RATE supported; speeds are 110-19200 baud.
+
+    APCPS:
+        Apple with Z80 Softcard and CP Multi-Function Card.  The slot number is
+        again a compile-time parameter.  SET BAUD-RATE is supported for baud
+        rates from 50 baud to 19200 baud.
+
+    AP6850:
+        Apple II with Z80 Softcard and a 6850-based USART in slot 2-the slot
+        being a compile-time parameter.  SET BAUD-RATE is not supported.
+
+BBC:
+    Acorn Computers BBC Computer with Acorn Z80 second processor running
+    CP/M-80.  Supports SET BAUD-RATE and can send breaks.
+
+BigBoard II:
+    Uses serial port A. To use port B, change mnport, mnprts, and baudrt and
+    reassemble.  Can generate BREAK.  SET SPEED supported; speeds are 300-38400
+    baud.
+
+Cifer:
+    Originally coded for Cifer 1886 using the VL: port set as TTYI: and TTYO:
+    but works successfully on 18xx and 28xx series machines.
+
+    There are now two versions, each with two variations: Either running CP/M
+    Version 2.2 or 3.0, and either using the VL: or AUX: ports.  The VL:  port
+    version can only use seven bits of data, so parity prefixing is required
+    for binary file transfers.  This restriction is removed by using the AUX:
+    port.  For those interested, the problem is due to the interprocessor link
+    between the video and CPU (!) boards.  The VL: port is on the video board,
+    and the AUX: port on the CPU board, and the inter processor link can only
+    transfer seven bits of data.
+
+    Supports SET SPEED, and can generate breaks on some models with a BREAK
+    key.
+
+Comart:
+    Comart Communicator-Similar to Northstar equipment.  Can generate BREAK.
+
+Compupro:
+    Based on Kermit 3.x, and has been merged into V4.09
+
+CPT-85xx word processors:
+    Can generate BREAK.  SET SPEED supported; speeds are 50-9600 baud.
+
+Cromemco:
+    Cromemco computers with TU-ART card.  Supports SET BAUD-RATE (110-9600
+    baud).
+
+DEC DECmate II word processor (with Z80 card):
+    Can generate BREAK.
+
+DEC VT180 (Robin):
+    Three output ports, referred to as COMMUNICATIONS, GENERAL, and PRINTER.
+    Can generate BREAK.
+
+Digicomp Delphi 100:
+    SET SPEED supported; speeds are 50-19200 baud.
+
+Discovery:
+    Action Computer Enterprises "Discovery" Multi-user Computer.  Uses Port B
+    on an 83U user board.  Supports SET SPEED for 50-19200 baud.  Can generate
+    BREAK.
+
+Epson:
+    Epson PX-8 with LCD display.  Although it is quite different in displaying
+    of Packet Information, it works as any other CP/M-80 Kermit.  Supports SET
+    SPEED and can generate BREAK.
+
+Generic Kermit:
+    Two versions, one for CP/M version 2.2 and version 3.  These systems use
+    IOBYTE flipping (V2.2) and the AUX:  device to communicate to the serial
+    line.  You may have to SET PORT xxx before the version 2.2 will work, as
+    Kermit needs to know what device is the serial line.
+
+Genie:
+    Eaca Video Genie.
+
+Heath: Three Versions:
+
+    H8QUAD
+        for Heath-8 systems with the quad io board.  This system has been
+        derived from V3.x code.  Note that this version will not run "as is" on
+        H89 systems.
+
+    H89 For Heath-89 machines suports baud rates from 50 to 56,000 baud.
+
+    Z100
+        For Z-100 running CP/M-85.  This version does not support setting of
+        baud rates.
+
+Intertec Superbrain: Two Versions:
+
+    BRAINA
+        For superbrain using AUX port.  Breaks and SET BAUD both supported
+
+    BRAINM
+        As above, but using the MAIN port.
+
+Ithaca:
+    Ithaca Intersystems based computer using the VIO card for all IO to the
+    outside world.  The system is strictly speaking a home-brew variant of the
+    Ithaca machine, using an S100 cardcage without a front panel.  It uses the
+    Extended BIOS by EuroMicro of London.  However, I see no reason for this
+    version not running on a genuine Ithaca Intersystems machine.  There are
+    patches needed to the EuroMicro BIOS to make this version work.
+
+Kaypro:
+    Should work on most Kaypro models, as well as some related systems
+    (Ferguson BigBoard I, Xerox 820).  For the newer Kaypros with multiple
+    ports, Kermit uses the one labeled "serial data"; it cannot use the serial
+    printer or internal modem ports (but it should be possible to modify the
+    values for mnport, mnprts, and baudrt to do this).  Can generate BREAK.
+    SET SPEED supported; speeds are 50-19200 baud.
+
+Lobo:
+    Lobo MAX-80.  Supports SET SPEED and can generate BREAKS.
+
+Merlin:
+    British Telecom Merlin M2215 (also Rair Black Box, possibly also the ICL
+    PC?).  Requires a terminal.
+
+Microbee:
+    Microbee Systems computer made in Australia.  Works on Microbee 56K (Series
+    2 APC), 64K (Computer in a Book), 128K (Dynamic), and 256K (256TC).  Can
+    generate BREAK.  SET BAUD-RATE supported; speeds are 75-9600.  All serial
+    I/O is via software, not hardware.  Simultaneous transmit and receive
+    possible on all speeds except 75/1200, 1200/75, 4800, and 9600.
+
+Micromate:
+    PMC 101 Micromate.  Supports SET SPEED and can generate BREAK.
+
+Micromint: Two versions
+
+    S6  The Ciarcia/Micromint sb-180 board with a 6Mhz procoessor.  System
+        requires a terminal.
+
+    S9  As above, but with a 9Mhz processor.
+
+NCR:
+    Decisionmate 5.  Uses the 2651 and is largely the same as the Ithaca
+    Intersystems machine implementation.
+
+Northstar: -- There are four versions available:
+
+    NORTHS:
+        Northstar Horizon with HS10-4 board.  Supports SET SPEED and SET PORT.
+
+    HORIZON:
+        Northstar Horizon using the serial ports on the Mother board.  Can
+        generate BREAK.
+
+    BASICNS:
+        Basic Northstar Horizon using the printer port.  Can generate BREAK.
+
+    ADVANT:
+        Northstar Advantage.  Supports SET SPEED and can generate BREAK.  Traps
+        Control-0 in the system filter.
+
+Morrow Decision I:
+    Uses the Multi-I/O board.  Port 1 is the console, port 3 is the
+    communications line.  SET SPEED supported; speeds are 75-56000 baud.
+
+Morrow Micro Decision I:
+
+Nokia MicroMikko:
+    Will not echo control-O (which locks keyboard).  SET SPEED supported;
+    speeds are 75-9600 baud.
+
+Ohio Scientific:
+    Doesn't have screen control.
+
+Osborne 1:
+    Uses serial line, not internal modem.  Left-arrow key generates <DEL>
+    ("delete" or "rubout" character) during connect mode.  SET SPEED supported;
+    speeds are 300 and 1200 baud.  Now supports multi-sector buffering.
+
+Research Machines: Two Versions:
+
+    RM380ZM:
+        380Z and 5.25" disks supports SET BAUD.RATE
+
+    RM380ZF:
+        380Z and 8" disks, otherwise as above.
+
+Sanyo:
+    Sanyo MBC-1100.  This version derived from Kermit V3.x
+
+ScreenTyper:
+    Details unkown.
+
+TRS-80: Three versions:
+
+    TRS80LB:
+        TRS-80 with Lifeboat CP/M
+
+    TRS80PT:
+        TRS-80 with Pickles and Trout CP/M
+
+    TRSM4:
+        TRS-80 Model 4 with Montezuma CP/M
+
+Teletek:
+    Teletek Systemaster. Supports SET BAUD.
+
+Telcon:
+    TELCON ZOBRA portable computer.
+
+Torch:
+    Torch Unicorn 5 initially, but the code runs on other Z80 based CP/N (as in
+    Nut!) systems.  It uses the BBC Computer as a "Base processor", and is
+    similar to the BBC version.  The base processors RS423 port is used rather
+    than any built in Modem.  (UK telecoms legislation effectively makes modem
+    control software tricky business...).  Two potential versions exist-one
+    using cursor positioning codes for a MCP and CCCP ROM combination of
+    revision less than 1.00, the other version uses the additional facility
+    MCP/CCCP versions greater than 1.  Supports SET SPEED and can generate
+    BREAKs.
+
+    Note that binary files must be transferred using SET PARITY to anything
+    other than NONE!  Parity is neither generated nor checked.
+
+US Micro Sales:
+    S-100-8 based computer.
+
+Vector Graphics:
+    Vector
+
+Xerox:
+    Xerox 820.
+
+Z80MU:
+    Development Kermit on a PC running the Z80MU Z80 and CP/M 2.2 development
+    system.  Allows development of the system independent modules to be done on
+    an IBM PC or clone.  Also allows the generation of new .HEX files, that may
+    then be KERMITed to the target system.  Note:  Not all the BDOS or BIOS
+    routines are supported, so avoid "unusual" BIOS/BDOS calls.  (For example,
+    DIR from within Kermit will fail as one of the BIOS routines returning disk
+    parameters is not supported.)
+
+
+1.7. Installation of Kermit-80
+
+Kermit-80 was written originally for the Intertec SuperBrain in lowest-common-
+denominator  8080 code with the standard assembler, ASM (single source module,
+no macros, no advanced instructions), so that it could be assembled on any
+CP/M-80 system (the 8080 assembler is distributed as a standard part of
+CP/M-80, whereas the fancier Z80 or macro assemblers are normally commercial
+products).  It has since been modified to run on many other systems as well.
+Kermit-80 should be able to run on any 8080-, 8085- or Z80-based microcomputer
+under  CP/M with appropriate minor changes to reflect the port I/O and screen
+control for the system (see below).
+
+The proliferation of new systems supported by Kermit-80 made the program grow
+so large and complicated that it had to be broken up into system-independent
+and system-dependent modules, as of version 4 (this was done by Charles
+Carvalho of ACC).  Each module is composed of multiple files.  This has reduced
+the time and disk space necessary for assembly; Kermit-80 may once again be
+assembled on a CP/M system with roughly 250Kbytes of space.  The majority of
+the code does not need to be reassembled to support a new system.
+Unfortunately, it can no longer be assembled with ASM, since ASM does not
+support multiple input files.  To allow it to be assembled on any CP/M system,
+the public-domain assembler LASM is included in the distribution kit. Kermit-80
+may also be assembled with Microsoft's M80 (not supplied).  In theory, any 8080
+assembler supporting the INCLUDE directive ought to work, as well.
+
+All versions of Kermit-80 are assembled from the same set of sources, with
+system dependencies taken care of by assembly-time conditionals within the
+system-dependent module (eventually, the system-dependent module will itself be
+broken up into multiple files, one for each system).  The most important system
+dependencies are terminal emulation (when CONNECTed to the remote host) and
+screen handling, which are dependent on the individual micro's escape codes
+(these features are table driven and easily modified for other CP/M systems),
+and the lowest level I/O routines for the serial communications port.  The port
+routines are best done only with BDOS calls, but some systems do not allow
+this, primarily because the BDOS routines strip the parity bit during port I/O,
+and the parity bit is used for data when transmitting binary files.
+
+Kermit-80's I/O routines must check the port status and go elsewhere if no
+input is available; this allows for virtual terminal connection, keyboard
+interruption of stuck transmissions, etc.  On systems that fully implement I/O
+redirection via the optional CP/M IOBYTE facility, this may be done by
+switching the IOBYTE definition.  On others, however, IN/OUT instructions
+explicitly referencing the port device registers must be used.
+
+CP/M-80 KERMIT versions 3.8 and later include a "fuzzy timer" that allows a
+timeout to occur after an interval ranging from 5 to 20 seconds (depending upon
+the speed of the processor and the operating system routines) during which
+expected input does not appear at the port.  In this case, retransmission
+occurs automatically.  In any case, you may type a carriage return during
+transmission to simulate a timeout when the transfer appears to be stuck.
+
+
+1.7.1. Organization of Kermit-80
+
+Kermit-80 consists of two modules, each of which is generated from multiple
+source files.  The first module contains the system-independent code; the
+second module is configured for a particular system and merged with the system-
+independent module to produce a customized Kermit-80.
+
+The distribution kit contains:
+
+   - the system-independent module, CPSKER.HEX;
+   - the system-dependent modules, CPV*.HEX (see table 1-2 and 1-3);
+   - the source files, CPS*.ASM and CPX*.ASM,
+   - the public-domain CP/M assembler, LASM.*,
+   - the public-domain CP/M load/patch utility, MLOAD.*
+
+-------------------------------------------------------------------------------
+
+Symbol  Filename System
+ACCESS  CPVACC  Access Matrix
+ADVANT  CPVADV  Northstar Advantage
+AP6551  CPVAPL  Apple II, Z80 Softcard, 6551 ACIA in serial interface
+AP6850  CPVA65  Apple II, Z80 Softcard, 6850 ACIA in Serial Iiterface
+APMMDM  CPVAPM  Apple II, Z80 Softcard, Micromodem II in slot 2
+APCPS   CPVCPS  Apple II, Z80 Softcard, with CPS multifunction card
+BASICNS CPVBNS  Northstar Horizon (terminal required)
+BBC     CPVBBC  Acorn "BBC" computer with Acorn Z80 second processor
+BBII    CPVBB2  BigBoard II (terminal required)
+BRAINM  CPVBRM  Intertec Superbrain using the main port
+BRAINA  CPVBRA  Intertec Superbrain using the Aux port
+CIFER2  CPVCIF  Cifer 1886 using the VL: Serial port and CP/M V2.2
+CIFER3  CPVCI3  Cifer 1886 using the VL: Serial port and CP/M V3.0
+CIFER2  CPVCA2  Cifer 1886 using the AUX: Serial port and CP/M V2.2
+CIFER3  CPVCA3  Cifer 1886 using the AUX: Serial port and CP/M V3.0
+CMEMCO  CPVCRO  Cromemco with TU-ART card. Terminal required)
+COMART  CPVCOM  Comart Communicator (terminal required)
+COMPRO  CPVPRO  Compupro with Interfacer 4 (or 3).  Terminal required.
+CPC     CPVCPC  Amstrad CPC 664 and 6128 and CP/M 3
+CPM3    CPVCP3  "Generic": CP/M 3.0 (CP/M Plus) systems (terminal req'd)
+CPT85XX CPVCPT  CPT-85xx wordprocessor with CP/M
+DELPHI  CPVDEL  Digicomp Delphi 100 (terminal required)
+DISC    CPVDIS  Action Computer Enterprises "Discovery" (terminal req'd)
+DMII    CPVDM2  DECmate II with CP/M option
+GENER   CPVGEN  "Generic": CPM 2.2 systems with IOBYTE (terminal req'd)
+GENIE   CPVGNI  Video Genie
+H8QUAD  CPVH8Q  Heath-8 with Quad 8 i/o board
+HEATH   CPVH89  Heath/Zenith H89
+HORIZON CPVHOR  Northstar Horizon (terminal required)
+KPII    CPVKPR  Kaypro-II (and 4; probably supports all Kaypro systems)
+LOBO    CPVLBO  Lobo Max-80
+
+"symbol" is the symbol used to select the target system, in CPVTYP.ASM;
+
+"filename" is the name under which the module is supplied in the distribution.
+
+              Table 1-2:  Systems supported by Kermit-80 (Part 1)
+
+-------------------------------------------------------------------------------
+
+-------------------------------------------------------------------------------
+
+Symbol  Filename System
+M2215   CPVMRL  British Telecom Merlin/Rair Black Box (terminal required)
+MBEE    CPVBEE  Microbee
+MDI     CPVMDI  Morrow Decision I (terminal required)
+MIKKO   CPVMIK  MikroMikko
+MMATE   CPVMM   PMC 101 Micromate (terminal required)
+MMDI    CPVUD   Morrow Micro Decision I (terminal required)
+NCRDMV  CPVDMV  NCR Decision Mate V.  (Terminal required?)
+NORTHS  CPVNS   Northstar Horizon with HSIO-4 card (terminal req'd)
+OSBRN1  CPVOSB  Osborne 1
+OSI     CPVOSI  Ohio Scientific
+PCI2651 CPVPCI  Ithaca Intersystems with VI0 card (terminal required)
+PCW     CPVPCW  Amstrad PCW 8256/8512 with serial interface
+PX8     CPVPX8  Epson PX-8
+RM380ZM CPVRMM  Research Machines 380Z with MDS (5.25" discs)
+RM380ZF CPVRMF  Research Machines 380Z with FDS (8" discs)
+ROBIN   CPVROB  DEC VT180
+S1008   CPVUSM  US Microsales S-100-8 (terminal required)
+SANYO   CPVSAN  Sanyo MBC-1100
+SB6     CPVSB6  Micromint SB-180 with 6Mhz CPU (terminal required)
+SB9     CPVSB9  Micromint SB-180 with 9Mhz CPU (terminal required)
+SCNTPR  CPVSCN  Screentyper
+TELCON  CPVTEL  TELCON Zobra portable
+TELETEK CPVTET  Teletek Systemaster
+TORCH   CPVTRC  Torch computers BBC-B with Z80 second processors
+TRS80LB CPVTLB  TRS-80 model II with Lifeboat 2.25C CP/M Display
+TRS80PT CPVTPT  TRS-80 model II with Pickles + Trout CP/M Display
+TRSM4   CPVTM4  TRS-80 model IV
+VECTOR  CPVVEC  Vector Graphics
+XER820  CPVXER  Xerox 820
+Z100    CPVZ00  Z-100 under CP/M-85
+Z80MU   CPVZ80  Z80MU development system on a PC
+
+"symbol" is the symbol used to select the target system, in CPXTYP.ASM;
+
+"filename" is the name under which the module is supplied in the distribution.
+
+              Table 1-3:  Systems supported by Kermit-80 (Part 2)
+
+-------------------------------------------------------------------------------
+
+-------------------------------------------------------------------------------
+
+Symbol  Terminal type
+CRT     Dumb terminal type.  Does not do cursor addressing
+ADM3A   Lear Seigler ADM 3A
+ADM22   Lear Seigler ADM 22
+AM230   Ampro 230
+H1500   Hazeltine 1500
+SMRTVD  Netronics Smartvid
+SOROQ   Soroq IQ-120
+TVI912  Televideo 912
+TVI925  Televideo 925 or Freedom 100
+VT52    Dec VT52 or equivalent (H19)
+VT100   Dec VT100 or equivalent
+WYSE    Wyse 100
+
+"symbol" is the symbol used to select the target system, in CPXTYP.ASM;
+
+"Terminal type" is the type of terminal "symbol" selects.
+
+                 Table 1-4:  Terminals supported by Kermit-80
+
+-------------------------------------------------------------------------------
+
+
+1.7.2. Downloading Kermit-80
+
+You'll need either a pre-configured .COM file or the system-independent module,
+CPSKER, in binary (.COM) or hex (.HEX) format and the system-dependent overlay
+for your system (from Tables 1-2 and 1-3).  If your system is not listed in the
+table, get the generic CP/M 2.2 Kermit or the generic CP/M 3 Kermit.  If you
+already have a version of Kermit on your micro and you want to install a new
+version, simply use your present version to get the new files.  Transfer the
+files to your system and skip ahead to "merging the modules".
+
+If you do not have a copy of Kermit on your micro, and you cannot borrow a
+Kermit floppy but you do have access to a mainframe computer with a copy of the
+Kermit-80 distribution, you should read this section.
+
+There are several ways to get CP/M Kermit from a host system to your micro.
+The easiest is to "download" the necessary "hex" files into your micro's memory
+and then save them on the disk.  If you have a terminal emulator program on
+your micro which can save a copy of the session to disk, connect to your host,
+and type the necessary files.  Exit from the emulator, saving the session log,
+and edit the session log to extract the hex files.  Skip ahead to "merging the
+files".
+
+The following is a procedure which, though far from foolproof, should allow you
+to get a version of Kermit to your CP/M based micro.  It depends upon the host
+prompt, or at least the first character of the host prompt, being some
+character that cannot appear in a hex file (the valid characters for hex files
+are the digits 0-9, the upper case letters A-F, the colon ``:'', carriage
+return, and line feed).  As soon the prompt character is encountered, the
+transfer will terminate.  If your host does not issue a prompt that will
+accommodate this scheme, you can achieve the same effect by adding an atsign
+``@'' to the very end of the hex file before sending it from the host.  The
+program below looks for an atsign (the normal DEC-20 prompt, hex 40).
+DECSYSTEM-10 users would look for a dot, hex 2E; VAX/VMS or UNIX users would
+look for a dollar sign, hex 24; UNIX C-Shell users would look for a percent
+sign, hex 26.
+
+   1. For CP/M 2.2 systems, connect to a floppy disk with plenty of free
+      space.  Run DDT and type in the following (the comments should not
+      be typed in; they are there just to tell you what's happening):
+      (Note that this wont work for CP/M Plus or 3.0 systems!)
+
+      ----------------------------------------------------------------
+-a100                   ;Begin assembling code at 100
+      0100    LXI H,2FE       ;Where to store in memory
+      0103    SHLD 200        ;Keep pointer there
+      0106    MVI E,D         ;Get a CR
+      0108    MVI C,4         ;Output to PUNCH (send to HOST)
+      010A    CALL 5
+      010D    MVI C,3         ;Input from READER (read from HOST)
+      010F    CALL 5
+      0112    ANI 7F          ;Strip parity bit
+      0114    PUSH PSW        ;Save a and flags
+      0115    MOV E,A         ;Move char to E for echo
+      0116    MVI C,2         ;Output to screen
+      0118    CALL 5
+      011B    POP PSW         ;Restore A and flags
+      011C    CPI 40          ;(or 4E,24,26,etc) System prompt?
+      011E    JZ 127          ;Yes, have whole file in memory
+      0121    CALL 17A        ;No, store another byte
+      0124    JMP 10D         ;Read another byte
+      0127    MVI A,1A        ;Get a Control-Z (CP/M EOF mark)
+      0129    CALL 17A        ;Store it in memory
+      012C    LXI H,300       ;Get memory pointer
+      012F    SHLD 202        ;Store as DMA pointer
+      0132    LDA 201         ;Get 'HI' byte of memory pointer
+      0135    STA 200         ;and store it as 'LO' one
+      0138    XRA A
+      0139    STA 201         ;Zero 'HI' byte (slow *256)
+      013C    MVI C,16        ;Make NEW file
+      013E    LXI D,5C        ;With FCB1
+      0141    CALL 5
+      0144    CALL 15E        ;Write 128 bytes (sector)
+      0147    CALL 15E        ;Write another sector
+      014A    LXI H,FFFF      ;Get a 16-bit Minus One
+      014D    XCHG            ;into DE
+      014E    LHLD 200        ;Get 256-byte counter
+      0151    DAD D           ;Decrement
+      0152    SHLD 200        ;and store back
+      0155    MVI A,2         ;Check if
+      0157    CMP L           ; 256-byte counter down to offset
+      0158    JZ 183          ;Yes, we're done
+      015B    JMP 144         ;Keep writing..
+      015E    LHLD 202        ;Get file-pointer
+      0161    XCHG            ;into DE
+      0162    MVI C,1A        ;Set DMA-address
+      0164    CALL 5
+      0167    MVI C,15        ;Write sector (128 bytes)
+      0169    LXI D,5C        ;using FCB1
+      016C    CALL 5
+      016F    LHLD 202        ;Get file-pointer
+      0172    LXI D,80        ;128-bytes
+      0175    DAD D           ;added to file-pointer
+      0176    SHLD 202        ;and save
+      0179    RET             ;and return
+      017A    LHLD 200        ;Get Memory-pointer
+      017D    MOV M,A         ;Store character
+      017E    INX H           ;Increment Pointer
+      017F    SHLD 200        ;and save
+      0182    RET             ;and return
+      0183    MVI C,10        ;CLOSE file
+      0185    LXI D,5C        ;using FCB1
+      0188    CALL 5
+      018B    JMP 0           ;Force WARM BOOT
+      0179
+      -^C                     ;(Type Control-C) Return to CP/M
+      A>SAVE 1 FETCH.COM      ;Save program, we need to run it twice.
+
+       Figure 1-1:  Bootstrap program for Kermit-80 and CP/M Version 2.2
+
+      ----------------------------------------------------------------
+
+      Alternatively, an assembler source file for this program is
+      distributed with CP/M Kermit as CPKFET.ASM.  You might prefer to
+      type the assembler version in and assemble and load it (ASM CPKFET,
+      LOAD CPKFET, or MASM CPKFET, MLOAD CPKFET), to let the assembler and
+      loader catch any typing errors.
+
+   2. Connect to your host using a terminal or a terminal emulation
+      program.  Ensure that your host does not have your terminal in "page
+      mode" (does not pause at the end of each screenful).
+
+   3. Tell the host to display the first hex file (the system-independent
+      module) at your terminal, e.g. give a command like TYPE CPSKER.HEX,
+      without a terminating carriage return.
+
+   4. Return to your micro by switching the cable from the terminal to the
+      micro, or by terminating the micro's terminal program.
+
+   5. Make sure your IOBYTE is set so that RDR: and PUN: correspond to the
+      I/O port that is connected to the host (this would normally be the
+      case unless you have done something special to change things).
+
+   6. Load the program you entered in the first step with DDT, and use it
+      to capture the first hex file:
+
+          DDT FETCH.COM
+          -icpsker.hex            ;Setup FCB for file CPSKER.HEX
+          -g100,179               ;Execute the program.
+
+      Now there should be a file CPSKER.HEX on your connected disk.
+
+   7. Return to the host, and tell it to display the second hex file (the
+      system-dependent module for your configuration).  Again, do not type
+      the terminating carriage return.
+
+   8. Return to your micro, and run the capture program again:
+
+          DDT FETCH.COM
+          -icpxovl.hex            ;Setup FCB to create CPXOVL.HEX
+          -g100,179               ;Execute the program.
+
+      Now there should be a file CPXOVL.HEX on your connected disk.
+      Replace CPXOVL.HEX in this example with the appropriate overlay file
+      for your system.
+
+Merging the files:
+
+   1. For purposes of illustration, we will assume the system-dependent
+      overlay is called "cpxovl.hex".  The two hex files may be combined
+      with MLOAD or DDT.  If you already have a running Kermit, you can
+      transfer MLOAD.HEX to your system and create MLOAD.COM by running
+      LOAD.  If you're bootstrapping Kermit, you could transfer MLOAD.HEX
+      to your system the same way you got the other two .HEX files, but
+      it's probably simpler to use DDT to get Kermit running, and get
+      MLOAD later if you need it.
+
+   2. Using MLOAD, the two pieces may be easily merged:
+
+          A>mload kerm411=cpsker,cpxovl
+          (Some messages about program size, etc...)
+          A>
+
+   3. If you don't have MLOAD running, it's a bit more complex:
+          A>ddt cpsker.hex
+          NEXT  PC
+          3500 0100
+          -icpxovl.hex
+          -r
+          NEXT  PC
+          xxxx 0000
+          -^C
+          A>save dd kerm411.com
+
+      The page count ("dd") used in the SAVE command is calculated from
+      the last address ("xxxx") given by DDT in response to the R command:
+      drop the last two digits and add 1 if they were not zero, then
+      convert from hexadecimal (base 16) to decimal (base 10): 684F
+      becomes 69 hex, which is 105 decimal (5 times 16 plus 9) -- but 6700
+      becomes 67 hex, or 103 decimal (consult an introductory computing
+      book if you don't understand number base conversion).
+
+   4. If you are using the Z80MU CP/M and Z80 development toolkit on an
+      IBM PC or clone, then follow the same instructions as for a genuine
+      CP/M system.  When you have loaded your file, you will have to ship
+      the .COM or two .HEX files to the target CP/M system. (Possibly
+      using a previous issue of Kermit?)
+
+   5. Note that CP/M hex files have checksums on each line.  If there were
+      any transmission errors during the downloading process, MLOAD or DDT
+      will notice a bad checksum and will report an error (something like
+      "Illegal Format").  If you get any errors during loading, either fix
+      the hex file locally with an editor, or repeat the transfer.
+
+You now should have a running version of Kermit-80, called KERM411.COM.
+
+Test your new Kermit by running it.  If it gives you a prompt, it might be OK.
+(don't delete your old one yet...).  Instead of a prompt, you could get one of
+two messages indicating that the configuration information is invalid:
+
+    ?Kermit has not been configured for a target system
+
+or
+
+    ?Consistency check on configuration failed
+
+Of course, neither of these messages should appear if you're building Kermit
+from the distribution kit.  The first message indicates that the overlay was
+not found where the system-independent module expected to find it, probably
+because the overlay address is incorrect; the second indicates that the version
+of CPXLNK used in the system-dependent module is incompatible with the system-
+independent module.
+
+Once you are satisfied that KERMIT40 works correctly, you should rename your
+old KERMIT.COM to something else, like OKERMIT.COM, and rename KERMIT40.COM to
+KERMIT.COM.
+
+
+1.7.3. Assembling Kermit-80 from the sources
+
+Kermit-80 is built in two pieces from the following files:
+
+The system-independent files:
+  CPSKER.ASM    header file
+  CPSDEF.ASM    definitions for both KERMIT and KERSYS
+  CPSMIT.ASM    initialization, main loop, miscellaneous commands (BYE, EXIT,
+                LOG, SET, SHOW, STATUS, and VERSION)
+  CPSCOM.ASM    second part of commands, status and set file
+  CPSPK1.ASM    part 1 of the KERMIT protocol handler (SEND, RECEIVE,
+                LOGOUT,and FINISH commands)
+  CPSPK2.ASM    part 2 of the KERMIT protocol handler
+  CPSREM.ASM    REMOTE routines (FINISH, BYE and LOGOUT in CPXPK*.ASM)
+  CPSSER.ASM    SERVER routines (for the future)
+  CPSTT.ASM     the transparent commands (TRANSMIT, CONNECT)
+  CPSCPM.ASM    CP/M commands (DIR, ERA, USER, TYPE, PRINT, COPY)
+  CPSWLD.ASM    the wildcard handler
+  CPSCMD.ASM    the command parser
+  CPSUTL.ASM    utility routines and data
+  CPSDAT.ASM    data space and the overlay definitions
+  CPXLNK.ASM    linkage area description
+
+The system-dependent files:
+  CPXTYP.ASM    system selection
+  CPXLNK.ASM    system overlay specification and jump table
+  CPXCOM.ASM    common routines for all systems
+  CPXSWT.ASM    system selector or switcher
+
+One of:
+  CPXSYS.ASM    family file for some system-specific code
+  CPXTOR.ASM    family file for Torch, Superbrain, PCI2651 etc
+  CPXNOR.ASM    family file for Northstar and Comart machines
+  CPXMRL.ASM    family file for British Telecom Merlin/Rair Black Box
+  CPXSB.ASM     family file for Micromint SB-180 systems
+  CPXCIF.ASM    family file for Cifer systems
+  CPXHEA.ASM    family file for Heath/Zenith systems
+  CPXAPP.ASM    family file for Apple II systems
+  CPXPCW.ASM    family file for Amstrad PCW 8256/8512 machines
+  CPXBBI.ASM    family file for BigBoard, Kaypro and Xerox 820 systems
+  CPXBEE.ASM    Microbee
+  CPXSYO.ASM    family file for Sanyo MBS-1100 systems
+  CPXTM4.ASM    family file for Tandy Model 4 with CP/M systems
+  CPXGNI.ASM    family file for Video Genie systems
+  CPXPRO.ASM    family file for Compupro systems
+  CPXZ80.ASM    family file for the Z80MU development system
+
+and if you use a terminal,
+  CPXVDU.ASM    display codes for VDUs etc.  Not always required
+
+The system-independent module contains all of the system-independent files
+except for CPXLNK.ASM, which is assembled into the system-dependent module to
+provide the structures needed to connect the two modules.  As distributed, the
+system-independent module is named CPSKER.HEX.  If you have a copy of
+CPSKER.HEX, you do not need to reassemble the system-independent module to
+configure Kermit for your system.
+
+The system-dependent module consists of CPXTYP.ASM, CPSDEF.ASM, CPXLNK.ASM,
+CPXSWT.ASM, CPSCOM.ASM, one of the family files CPXSYS.ASM, CPXTOR.ASM,
+CPXMRL.ASM, CPXSB.ASM, CPXCIF.ASM, CPXHEA.ASM, CPXBBI.ASM, CPXTM4.ASM,
+CPXGNI.ASM, CPXNOR.ASM, CPXAPP.ASM, CPXPCW.ASM, or CPXPRO.ASM, and possibly
+CPXVDU.ASM, if your system uses a terminal for the console.  One copy of the
+system-dependent module is supplied already assembled for each supported
+system; the filename may be obtained from tables 1-2 and 1-3.  If a terminal is
+required for a system, a CRT (glass TTY device) has been selected.
+
+After assembling the two pieces separately, they are combined with DDT or MLOAD
+into a system-specific Kermit.
+
+If you want to rebuild the system-independent module, the only change you may
+need to make is to select the assembler to be used, in CPSKER.ASM.  Define one
+of MAC80, M80, or LASM to TRUE to select it as the assembler; the others should
+be defined FALSE.
+
+Assuming you have the Microsoft Macro Assembler package (M80/L80), you'll need
+to do the following:
+
+    A>m80 cpsker=cpsker.asm
+    A>l80 /p:100,cpsker,cpsker/n/e
+
+This will produce CPSKER.COM.
+
+If you are using LASM instead, do this:
+
+    A>lasm cpsker
+
+LASM will generate CPSKER.HEX and CPSKER.PRN.  LASM allows options to be
+specified in the same way as the standard assembler, ASM, so the command
+
+    A>lasm cpsker.abz
+
+will read the source files from drive A, send the .HEX file to drive B, and
+suppress the listing file.
+
+If you are using the Z80MU development system on an IBM PC or clone, then
+assemble your files using either LASM and MLOAD or M80 and L80, as if you were
+using a genuine CP/M-80 system.  Note that you will still have the problem of
+transferring your assembled files to the target CP/M system.
+
+If you want to generate a system-dependent overlay for a particular system, or
+want to change the terminal supported, you'll need to check three areas in
+CPXTYP.ASM:
+
+First, the overlay start ADDRESS.  The symbol "ovladr" is EQUated to the
+address of "LNKFLG" in the system-independent module, as the starting address
+of the overlay (7000H for version 4.11).  You'll need to know this value if
+you're building the overlay with M80/L80.  You won't normally need to change
+this value.
+
+Second, the assembler being used.  Again, define one of MAC80, M80, and LASM to
+be TRUE to select it, and define the others to be FALSE.  The two modules
+(system-independent and system-dependent) do not need to be built with the same
+assembler.
+
+Third, the system configuration.  Locate your system in tables 1-2 and 1-3,
+then define the appropriate symbol TRUE, and the rest FALSE.  If the system
+comes with a builtin console terminal, define all the terminal switches FALSE.
+If the system uses an external terminal as the console, locate the terminal in
+table 1-5 and define the appropriate symbol TRUE, and the remainder FALSE.  If
+the terminal is not listed in table 1-5, use the CRT switch; in this case, VT52
+emulation is not supported.
+
+In addition, there are a few general and system-specific symbols which may be
+altered to fit your system:
+
+APSLOT          For Apple with 6551 ACIA, defines the slot number of the serial
+                card
+
+CPUSPD          Processor speed in units of 100KHz (currently used only for
+                bbII and kpII for timing loops)
+
+TAC             For users connecting through ARPAnet TACs: set to TRUE if you
+                wish the default TACTRAP status to be ON. (This may be
+                overridden with the SET TACTRAP command).  If you're not
+                connecting through a TAC, set tac to FALSE and ignore tacval.
+
+TACVAL          For ARPANET TAC users: defines the default TAC intercept
+                character (may be overridden with the SET TACTRAP command).
+
+If you are just assembling an existing configuration, you'll need to edit
+CPXTYP.ASM only.  If you are adding support for a new system, you should not
+modify CPSDEF.ASM or CPXLNK.ASM; if you do, you'll have to change the system-
+independent module also.  Eventually, CPXSYS.ASM will be split into separate
+files, each of which will generate one or more related systems.  When this
+happens, you'll want to pick the one closest to your system to use as a
+starting point.
+
+After editing CPXTYP.ASM as necessary, assemble and link the overlay as
+follows:
+
+   - With M80 (where "xxxx" is the hex value of ovladr from CPXLNK.ASM):
+
+         A>m80 cpxtyp=cpxtyp.asm
+         A>l80 /p:xxxx,cpxtyp,cpxtyp/n/x/e
+
+   - With LASM:
+
+         A>lasm cpxtyp
+
+With an IBM PC or clone using the Z80MU softwrae, follow the instructions as if
+you were using a real CP/M system.
+
+The overlay (CPXTYP.HEX) may then be merged with the system-independent module
+as described above (creating a runnable Kermit from the distribution kit).
+
+If you are using the Z80MU development system on a PC, and already have a
+running Kermit-80 v3.9 or later, you can merge the two .HEX files into a .COM
+file with LINK80 (TOPS 10/20), MLOAD (Z80MU), L80 (Z80MU), and transfer the new
+.COM file to your micro with Kermit:
+
+   - Z80MU on a PC and MLOAD:
+
+         @MLOAD KERNEW=CPSKER,CPXTYP
+
+   - Z80MU on a PC and C80:
+
+         @L80 /P:xxxx,CPXTYP,CPXTYP/N/X/E
+
+producing KERNEW.COM.
+
+-------------------------------------------------------------------------------
+
+Symbol         Terminal description
+crt            Basic CRT, no cursor positioning
+adm3a          ADM3A Display or lookalike
+adm22          ADM22 Display or lookalike
+am230          Ampro 230
+h1500          Hazeltine 1500
+smrtvd         Netronics Smartvid-80
+soroq          Soroq IQ-120
+tvi912         TVI 912
+tvi925         TVI 925, Freedom 100
+vt52           VT 52 or VT52 emulator such as Heath H19, H29, etc.
+vt100          VT 100 or emulator (most ANSI terminals should work)
+wyse           Wyse 100
+
+                   Table 1-5:  Terminals known to Kermit-80
+
+-------------------------------------------------------------------------------
+
+
+1.8. Adding Support For A New System
+
+Kermit-80 is built from a common set of source files; the system-dependent
+module makes heavy use of conditional assembly (this complication will be
+removed in future releases).  The system dependencies arise from attempts to
+answer some questions:
+
+   1. What kind of terminal is to be supported?
+
+      For many micros, the console is an integral part of the system, but
+      others can use an external terminal.  In either case, the commands
+      to manipulate the screen (position the cursor, erase the screen,
+      etc) must be defined.
+
+   2. How is the serial line accessed?
+
+      For systems supporting the IOBYTE function, this is straightforward;
+      the symbol "IOBYT" is defined TRUE.  If the serial line is accessed
+      with IN and OUT instructions, it may be possible to use the simple
+      I/O routines provided.  In this case, the symbol "INOUT" is defined
+      TRUE, the MNPORT and MNPRTS are defined to be the data and control
+      addresses, respectively, and bit masks for testing for "input data
+      available" and "output buffer empty" must be defined.  If the
+      interface is strange, leave IOBYT and INOUT set to FALSE, and
+      provide the I/O routines.
+
+   3. What initialization is necessary?
+
+      You may wish to set the baud rate or configure the serial line at
+      startup.  Examples for a number of devices are present.
+
+   4. What special features are to be supported?
+
+      You may want to provide the capability to select one of several
+      serial lines with the SET PORT command, or to change the speed of
+      the serial line with the SET SPEED command.  To do this, you'll need
+      to build a command table, using the systems already supported as
+      examples.  The ability to send a BREAK signal is desirable.  Again,
+      examples for several different interfaces (ACIA, SIO, etc) are
+      present.
+
+   5. Do you want to design an external terminal type?
+
+      There is a jump entry in the overlay file to allow users to add
+      their own termainl emulator.  If you write the code for such an
+      emulator, you must load this jump address with the address of your
+      emulator, and SET TERMINAL EXTERNAL from within Kermit.  All
+      characters will be passed to this routine during connect mode.
+
+
+1.9. Notes on New Features in Kermit-80 Version 4
+
+   - Debugging aids:  SET DEBUG ON will add two fields to the SEND/RECEIVE
+     display, labelled "Spack" and "Rpack".  These display the last packet
+     sent and received.  Of course, this slows down the transfer,
+     especially if the console is an external terminal.  SET DEBUG OFF
+     removes these fields.  The VERSION command displays the name, edit
+     number, and edit date of several of the modules that make up Kermit.
+
+   - TAC support: ARPAnet TACs (and many other communication devices such
+     as terminal concentrators, modems, port contention units, network
+     PADs, etc) use a printing character (like "@") as an intercept
+     character, to allow commands to be issued to the TAC, or modem, etc.
+     In order to send this character to the host, it must be typed twice.
+     The command "SET TAC CHARACTER" to Kermit enables the "TACtrap" and
+     asks the user to specify the TAC intercept character.  This character
+     will be automatically doubled when it appears in Kermit protocol
+     messages (sent by the SEND or RECEIVE commands) or when it appears in
+     a file being sent with the TRANSMIT command.  It is not automatically
+     doubled when typed by the user in CONNECT mode.  "SET TAC ON" enables
+     the TACtrap but does not change the TAC intercept character, which is
+     initially "@".  "SET TAC OFF" disables the TACtrap.
+
+   - File buffering:  Previous versions of Kermit-80 buffered only one
+     sector (128 bytes) at a time during file transfer operations.  This
+     version buffers 16Kbytes at a time, reducing the number of times the
+     floppy drive must be spun up and down, and increasing the effective
+     throughput of the link.  If the disk transfer rate is too slow,
+     however, the remote Kermit may time out and retransmit packets.  This
+     will show up on the screen in the "Retries:" field; if this occurs
+     after disk activity, you may want to increase the timeout value on
+     the remote Kermit, SET BUFFER <new value> while in Kermit,or
+     reassemble Kermit with a smaller value for MAXSEC (in CPSDEF.ASM)
+     This buffer is also used by the TRANSMIT command; the log file
+     enabled by the LOG command is still written a sector at a time.
+
+This section is intended for people wanting to implement their own versions of
+Kermit-80 for computers not already defined.
+
+The system independent code communicates to routines for a specific system
+through a set of tables.  These tables are defined in CPXLNK.ASM, and should
+not be modified between revisions of Kermit.  If an entry is added or deleted,
+then the whole of Kermit-80 needs reassembling.  Make sure that the changes to
+CPXLNK.ASM are duplicated in CPSUTL.ASM, which has the system independent
+equivalent of CPXLNK.ASM.
+
+The following entries/definitions apply to revision 4.09.  There have been
+three additional entries since revision 4.05.
+
+The table is split into three sectors; The first section defines two byte
+"words" giving 16 bits of interface data; The second set is a set of jumps to
+various functions, and finally the third set a set of pure data bytes.
+
+
+1.9.1. Interface Data.
+
+        LNKFLG  Must be first entry in overlay at overlay address.  Is a two
+                byte address giving the size of the linkage table.  This is
+                used to check for consistency of overlay's
+
+        ENTSIZE Length of entry table, also used for consistency checking after
+                the overlay.  Currently 6
+
+        SYSEDT  The address of a dollar-terminated string giving the overlay
+                revision level and date.  Points to a string like:
+                CPXSYS.ASM(33) 4-JUN-1986$
+
+        FAMILY  The address of a dollar-terminated string giving the Family
+                overlay revision level and date.  If the system is in
+                CPXSYS.ASM rather than a particular Family overlay, it is
+                simply a pointer to $
+
+
+
+
+1.9.2. Jump Table.
+
+This is split into three main sectors-
+
+
+   1. Input/Output routines
+
+   2. Screen formatting routines
+
+   3. other system dependent routines
+
+
+  SELMDM
+  Parameters    None
+  Returns       None
+  Description   selects the modem port.  Most systems do nothing and simply
+                return.  HL,DE and BC registers preserved.
+
+  OUTMDM
+  Parameters    None
+  Returns       None
+  Description   Output the character in E register to the communications line.
+                BC,DE,HL registers preserved.
+
+  INPMDM
+  Parameters    None
+  Returns       Accumulator either 0 or character from comms line if available
+  Description   Check modem for character and if so, return it in A. HL,DE,BC
+                registers preserved, flags and accumulator lost.
+
+  FLSMDM
+  Parameters    None
+  Returns       None
+  Description   Clear any pending characters in the input buffer from the
+                modem.  No registers are preserved.
+
+  SELCON
+  Parameters    None
+  Returns       None
+  Description   Select the console.  This is a null subroutine for most
+                systems, but for IOBYTE systems selects the console.
+
+  OUTCON
+  Parameters    Character in E
+  Returns       None
+  Description   Send the character in E to the console.  Any quirks of system
+                responding in an odd manner should be handled.  No registers
+                preserved.
+
+  INPCON
+  Parameters    None
+  Returns       Zero or character in A.
+  Description   Get a character from the console or return a null if no
+                character to be read.  No registers are preserved.
+
+  OUTLPT
+  Parameters    Character in E
+  Returns       None
+  Description   Send the character in E to the printer.  The console is
+                selected.  Only DE registers are preserved
+
+  LPTSTAT
+  Parameters    None
+  Returns       00H or 0FFH in A register
+  Description   Test the printer to see if it is ready to receive a character
+                to be printed.  If a 00H is returned then the printer is ready
+                to receive a character.
+
+  EXTTER
+  Parameters    Character to be sent to the user supplied terminal emulator in
+                the E register
+  Returns       None
+  Description   If the user has supplied a terminal emulator in the overlay
+                code, EXTTER will be a JMP <non zero address>.  If SET TERMINAL
+                EXTERNAL has been set, all caharcters will be passed verbatim
+                to this terminal emulator.  If there is no external emulator,
+                this code will never be called.  The user should reset terminal
+                conditions on initialisation of both the system and before
+                CONNECT.  All registers should be preserved.
+
+  XBDOS
+  Parameters    Any required for calling BDOS
+  Returns       Any expected from the called BDOS routine
+  Description   This is an alternative entry to BDOS.  This entry will also
+                check the printer status etc.  For full details see the code
+                for the BDOS trap in CPSUTL.ASM.
+
+                2b)
+
+                CLRLIN
+  Parameters    None
+  Returns       None
+  Description   Clear the current line on the terminal
+
+  CLRSPC
+  Parameters    None
+  Returns       None
+  Description   Erase the current position (after a backspace)
+
+  DELCHR
+  Parameters    None
+  Returns       None
+  Description   Make delete (7FH) look like a backspace.  Some systems do a
+                backspace, space, backspace automatically others have to
+                simulate it
+
+  CLRTOP
+  Parameters    None
+  Returns       None
+  Description   Clear the screen and place the cursor at the top LH corner
+
+  SCREND
+  Parameters    None
+  Returns       None
+  Description   Place the cursor on the line for the Kermit-80 prompt after a
+                file transfer.  (Usually line 13)
+
+  SCRERR
+  Parameters    None
+  Returns       None
+  Description   Move cursor to the error message field on the file transfer
+                format screen
+
+  SCRFLN
+  Parameters    None
+  Returns       None
+  Description   Move the cursor to the filename field
+
+  SCRNP
+  Parameters    None
+  Returns       None
+  Description   Move the cursor to the packet count field
+
+  SCRNRT
+  Parameters    None
+  Returns       None
+  Description   Move cursor to the retry count field
+
+  SCRST
+  Parameters    None
+  Returns       None
+  Description   Move cursor to the status field
+
+  RPPOS
+  Parameters    None
+  Returns       None
+  Description   Move to the receive packet field (debugging use)
+
+  SPPOS
+  Parameters    None
+  Returns       None
+  Description   Move to the send packet field (for debugging use)
+
+                2c)
+
+                SYSINIT
+  Parameters    None
+  Returns       None
+  Description   Initialize the system specific items.  No registers are
+                preserved.  Any initialization is done once only when Kermit-80
+                is first loaded.
+
+  SYSEXIT
+  Parameters    None
+  Returns       None
+  Description   Program termination.  De-initialize anything in preparation for
+                a return to CP/M
+
+  SYSCON
+  Parameters    None
+  Returns       None
+  Description   Initialize anything before entering the connect state.
+
+  SYSCLS
+  Parameters    None
+  Returns       None
+  Description   System dependent close routine when exiting connect state
+
+  SYSINH
+  Parameters    None
+  Returns       None
+  Description   Help routine to test for any extensions to the escape menu
+                during the connect state.  If a system has any special feature
+                it can use during connect mode, then it can be tested as
+                <escape-character>xxx.  This entry is a string for printing to
+                the console for an <escape-character>?  Often used for
+                generating breaks or controlling a modem.
+
+  SYSINT
+  Parameters    None
+  Returns       None
+  Description   This is a test-and-jump on receipt of an escape sequence not
+                understood by Kermit-80.  If the character in A is not
+                recognized by your version of Kermit=80, do a rskip
+
+  SYSFLT
+  Parameters    Character in E
+  Returns       Character in E. Either a 00H or anything else in A
+  Description   Test the character in E. If it may not be printed to the
+                console, set A to zero.  All other registers preserved.
+                NB <XON>,<XOFF>,<DEL>,<NULL> are always rejected.
+
+  SYSBYE
+  Parameters    None
+  Returns       None
+  Description   System dependent processing for the BYE command.  (eg hang up
+                the phone)
+
+  SYSSPD
+  Parameters    Value from table in DE
+  Returns       None
+  Description   The system dependent code for baud rate change.  DE contains
+                the two byte value from the baud rate table.  This value is
+                also stored in "SPEED"
+
+  SYSPRT
+  Parameters    Value in DE
+  Returns       None
+  Description   The system dependent code for setting the port.  The parameters
+                are passed in DE, which are obtained from the port tables
+
+  SYSSCR
+  Parameters    String pointer in DE
+  Returns       None
+  Description   Setup the screen display for file transfer.  The Kermit version
+                string is pointed to by DE.  If the terminal is not capable of
+                cursor addressing (eg dumb glass TTY) then only the screen is
+                cleared and the version string is printed.
+
+  CSRPOS
+  Parameters    Row number in B, column number in C
+  Returns       None
+  Description   Move the cursor to row B, column C where B=1,C=1 is top LH
+                corner of screen.  The routine should first end a "cursor
+                position" leading string (up to four characters) then use the
+                parameters given to complete the versions cursor position
+                function
+
+  SYSSPC
+  Parameters    None
+  Returns       K bytes free in HL
+  Description   Get the amount of free disk space on the selected disk drive.
+                This could be in the system independent code.  Automatically
+                detects CP/M V2.2 or V3.0.  No registers saved.
+
+  MOVER
+  Parameters    Source Pointer in HL
+                Destination Pointer in DE
+                Byte count in BC
+  Returns       None
+  Description   Move (BC) bytes from (HL) to (DE) Z80 based systems do an LDIR,
+                while 8080 systems do it as a loop.  All registers destroyed
+
+  PRTSTR
+  Parameters    $ terminated string pointed to by DE
+  Returns       None
+  Description   Print the string onto the console.
+
+                3)
+
+
+  PTTAB         WORD      Points to VT52 equivalent escape sequences.
+
+  SPDTAB        WORD      Address of baud-rate command table, or 0 if table
+                does not exist
+
+  SPDHLP        WORD      Address of baud-rate help table, or 0 if SET SPEED is
+                not supported.
+
+  PRTTAB        WORD      Address of port command table or 0 if SET PORT is not
+                supported.
+
+  PRTHLP        WORD      Address of port help table or 0 if SET PORT is not
+                supported
+
+  TIMOUT        BYTE      FUZZY-TIMER.  Set to value suitable to your system
+                (depends largely on CPU speed)
+
+  VTFLG         BYTE      VT52 emulation flag.  Set to 0 if terminal emulates a
+                VT52, 01 if emulation is required, or 0FFH if emulations not
+                possible (eg for "CRT")
+
+  ESCCHR        BYTE      default escape character-usually control-] but
+                sometimes control-\
+
+  SPEED         WORD      Storage space for baud-rate.  Set to 0FFFFH as baud
+                rates are initially unknown.  Note that the STATUS routine only
+                looks at the first (least significant) byte.
+
+  PORT          WORD      Storage space for port.  Set to 0FFFFH as ports may
+                not be implemented, and is initially unknown
+
+  PRNFLG        BYTE      Printer copy flag-if O no copy.  Anything else =>
+                copy to printer
+
+  DBGFLG        BYTE      Debugging flag.  If O then no debugging to be done.
+                (ie writing of debugging info during a file transfer)
+
+  ECOFLG        BYTE      Local ECHO flag (default is off)
+
+  FLWFLG        BYTE      File warning flag.  If set to 1 will not overwrite
+                files already existing on disk with some-named files being
+                transferred
+
+  IBMFLG        BYTE      IBM system is the host-assume IBM file transfers etc
+
+  CPMFLG        BYTE      Flag indicating type of CP/M files to be transferred.
+                Default setting - DEFAULT
+
+  PARITY        BYTE      Type of parity in use
+                0 = Even parity
+                3 = Mark parity
+                6 = No parity (8th bit is data)
+                9 = Odd parity
+                12 = Space parity
+
+  SPSIZ         BYTE      Size of send packet
+
+  RPSIZ         BYTE      Size of receive packet
+
+  STIME         BYTE      Send timer (time-out)
+
+  RTIME         BYTE      Receive timer (time-out)
+
+  SPAD          BYTE      Send Padding (default=0)
+
+  RPAD          BYTE      Receive Padding (default=0)
+
+  SPADCH        BYTE      Send Padding character (default=NULL)
+
+  RPADCH        BYTE      Receive Padding character (default=NULC)
+
+  SEOL          BYTE      Send EOL character (default=CR)
+
+  REOL          BYTE      Receive EOL character (default=CR)
+
+  SQUOTE        BYTE      Send quote character (default=#)
+
+  RQUOTE        BYTE      Receive quote character (default=#)
+
+  CHKTYP        BYTE      Ascii value of checktype
+                31H="1"=checktype1 (6bits)
+                32H="2"=checktype2 (12bits)
+                33H="3"=CCITT checksum (CRC)
+                Default is 31H("1")
+
+  TACFLG        BYTE      If set to on (non zero) send the TACCHR twice.  This
+                is for ARPA TAC users, where the TAC swallows one "wakeup"
+                character.  If sent twice the TAC will pas one on and go back
+                to normal mode.
+
+  TACCHR        BYTE      Desired TAC character.  It is ignored if TAC trapping
+                is turned off. Value to send twice if TAC interception is set
+                on.  Default=0, but set to commercial AT if the conditional
+                assembly flag TAC is set true
+
+  BUFADR        WORD      Address of Multi-Sector buffering for I/O
+
+  BUFSEC        BYTE      The number of bytes the big buffers can hold.
+                Default is 1. (0=256 sectors).
+
+  FFUSSY        BYTE      Indicates if funny characters may be used in CP/M
+                file names (eg <>.,;?#[]) If zero, allow anything.  Default is
+                nonzero.
+
+  BMAX          SPACE:(2bytes) Highest block number on selected disk drive
+
+  BMASK         SPACE:(1byte) (Records/block)-1
+
+  BSHIFTF       SPACE:(1byte) Number of shifts to multiply by rec.block
+
+  NNAMS         SPACE:(1byte) Counter for file-names per line
+
+
+1.10. Future Work
+
+Work that needs to be done in future releases includes:
+
+   - Merge in support for additional CP/M-80 systems, particularly those
+     for which support was recently added to the monolithic v3.x source.
+
+   - Break up CPXSYS into discrete source files, one for each system.
+     These source files should serve as simple models for adding support
+     for new systems to Kermit-80 -- only the very basic screen
+     definitions, flags, i/o primitives, initializations, and so forth
+     should appear in each system-dependent file.
+
+   - Addition of missing features -- compression of repeated characters
+     during packet transmission, transmission of file attributes
+     (particularly size, so that "percent done" can be displayed for both
+     incoming and outbound files), command macros, more advanced login
+     scripts, remote operation and server mode, etc etc.  Any offers??
+
+Index (Page numbers are approximate)...
+
+          8080   5, 6
+
+          Append   2
+          ARPAnet   10
+          Attention Character   10
+          Autoreceive   3
+
+          Baud   4
+          BIOS   5
+          Block Check   3
+          Bootstrapping CP/M Kermit   8
+          Break   2
+          Buffer size   3
+          Bye   2
+
+          Carriage Return   2
+          COLLISION   3
+          Connect   2
+          Control-C   2
+          Control-X   2
+          Control-Z   2
+          Copy   2
+          CP/M   6
+          CP/M-80 Kermit   1
+          CR   2
+
+          Debug   3
+          Default Disk   3
+          Directory   2
+          Directory file size   3
+          Downloading   8
+
+          Eighth-Bit Prefix   4
+          Erase   2
+          Escape Character   2, 3
+          Exit   2
+          External Terminal Emulation
+                  4
+
+          File Copying   2
+          File-mode   3
+          File-Warning   3
+          FINISH   2
+          Flow Control   4
+
+          Generic Kermit-80   5
+          GET   2
+
+          Help   2
+
+          IBM   4
+          Input   2
+          Intercept Character   10
+
+          Local   2
+          Local-Echo   4
+          LOG   2
+          Logging   4
+          LOGOUT   3
+
+          NAK   2
+          No-exit   4
+
+          OUTPUT   3, 4
+
+          Pad character   4
+          Parity   4
+          Pause   3
+          Port   4
+          Print   3
+          PRINTER   4
+
+          RECEIVE   3
+          REMOTE   3
+
+          SEND   3
+          SET   3
+          Set padding   4
+          Set Receive   4
+          Set Send   4
+          Set Start of packet   4
+          Show   4
+          Status   4
+
+          TAC   10
+          TacTrap   4
+          Take   4
+          Terminal Emulation   4
+          Timeout   2, 7
+          TIMER   4
+          TRANSMIT   5
+          Type   5
+
+          USER   4
+
+          VERSION   5
+          Virtual Terminal   2
+          VT100 Emulation   4
+          VT52 Emulation   4
+
+          Warning   4
+
+          XON/XOFF   2
+
+          Z80   6
+
+
+Table of Contents (page numbers are approximate)
+
+1. CP/M-80 KERMIT                                                             1
+
+   1.1. Credits                                                               1
+   1.2. What's New                                                            1
+   1.3. Overview of Kermit Operation                                          1
+   1.4. Summary of CP/M                                                       1
+   1.5. Kermit-80 Description                                                 2
+   1.6. Kermit-80 Flavors                                                     5
+       1.6.1. Generic Kermit-80                                               5
+       1.6.2. CP/M 3 Kermit                                                   5
+       1.6.3. System-Specific Versions                                        5
+   1.7. Installation of Kermit-80                                             6
+       1.7.1. Organization of Kermit-80                                       7
+       1.7.2. Downloading Kermit-80                                           8
+       1.7.3. Assembling Kermit-80 from the sources                           9
+   1.8. Adding Support For A New System                                      10
+   1.9. Notes on New Features in Kermit-80 Version 4                         10
+       1.9.1. Interface Data.                                                10
+       1.9.2. Jump Table.                                                    10
+   1.10. Future Work                                                         12
+
+Index                                                                        13
+
+                                List of Figures
+
+   Figure 1-1:   Bootstrap program for Kermit-80 and CP/M Version 2.2         8
+
+
+                                List of Tables
+
+   Table 1-1:   Kermit-80 SET PORT Options                                    5
+   Table 1-2:   Systems supported by Kermit-80 (Part 1)                       7
+   Table 1-3:   Systems supported by Kermit-80 (Part 2)                       7
+   Table 1-4:   Terminals supported by Kermit-80                              8
+   Table 1-5:   Terminals known to Kermit-80                                 10
diff --git a/cpkfet.ddt b/cpkfet.ddt
new file mode 100644 (file)
index 0000000..1fcca53
--- /dev/null
@@ -0,0 +1,61 @@
+-a100                  ;Begin assembling code at 100
+0100   LXI H,2FE       ;Where to store in memory
+0103   SHLD 200        ;Keep pointer there
+0106   MVI E,D         ;Get a CR
+0108   MVI C,4         ;Output to PUNCH {send to HOST}
+010A   CALL 5
+010D   MVI C,3         ;Input from READER {read from HOST}
+010F   CALL 5
+0112   ANI 7F          ;Strip parity bit
+0114   PUSH PSW        ;save a and flags
+0115   MOV E,A         ;move char to e for echo
+0116   MVI C,2         ;Output to screen
+0118   CALL 5
+011B   POP PSW         ;restore a and flags
+011C   CPI 40          ;Is it our DEC-20 prompt?
+011E   JZ 127          ;Yes, have whole file in memory
+0121   CALL 17A        ;no , store another byte
+0124   JMP 10D         ;read another byte
+0127   MVI A,1A        ;Get a Control-Z {CP/M EOF mark}
+0129   CALL 17A        ;store it in memory
+012C   LXI H,300       ;Get memory pointer
+012F   SHLD 202        ;Store as DMA pointer
+0132   LDA 201         ;Get 'HI' byte of memory pointer
+0135   STA 200         ;and store it as 'LO' one
+0138   XRA A
+0139   STA 201         ;Zero 'HI' byte {slow *256}
+013C   MVI C,16        ;Make NEW file
+013E   LXI D,5C        ;With FCB1
+0141   CALL 5
+0144   CALL 15E        ;Write 128 bytes {sector}
+0147   CALL 15E        ;Write another sector
+014A   LXI H,FFFF      ;Get a 16-bit Minus One
+014D   XCHG            ;into DE
+014E   LHLD 200        ;Get 256-byte counter
+0151   DAD D           ;decrement
+0152   SHLD 200        ;and store back
+0155   MVI A,2         ;Check if
+0157   CMP L           ; 256-byte counter down to offset
+0158   JZ 183          ;Yes, wer'e done
+015B   JMP 144         ;Keep writing..
+015E   LHLD 202        ;Get file-pointer
+0161   XCHG            ;into DE
+0162   MVI C,1A        ;Set DMA-address
+0164   CALL 5
+0167   MVI C,15        ;Write sector {128 bytes}
+0169   LXI D,5C        ;using FCB1
+016C   CALL 5
+016F   LHLD 202        ;Get file-pointer
+0172   LXI D,80        ;128-bytes
+0175   DAD D           ;added to file-pointer
+0176   SHLD 202        ;and save
+0179   RET             ;and return
+017A   LHLD 200        ;Get Memory-pointer
+017D   MOV M,A         ;store character
+017E   INX H           ;Increment Pointer
+017F   SHLD 200        ;and save
+0182   RET             ;and return
+0183   MVI C,10        ;CLOSE file
+0185   LXI D,5C        ;using FCB1
+0188   CALL 5
+018B   JMP 0           ;Force WARM BOOT
diff --git a/cpkfet.msg b/cpkfet.msg
new file mode 100644 (file)
index 0000000..97b3043
--- /dev/null
@@ -0,0 +1,24 @@
+Date: 23 May 1986 0807-EDT
+From: "Bernie AT&T:617-467-5664 LDP Workstations" <EIBEN@MARLBORO.DEC.COM>
+To: sy.fdc@cu20b
+Subject: CP/M-80 Kermit Bootstrapping Procedure Corrected
+
+Here is a fixed version of the CP/M bootstrapping program.  The version that
+has been listed in the CP/M-80 Kermit manual for the past several years failed
+to store the end of the file after downloading it into memory.  The new version
+stores in multiples of 2 sectors [256 bytes] and could have a 'overrun' of that
+much, however without problems, since the Control-Z does the magic.  Unlike the
+previous version, this program displays the data on the screen while capturing
+it into memory.
+
+Probably you want to include the 'program' - for the guy who has an editor AND
+the DDT-form.  I believe that the assembler will catch typos easier than DDT -
+and not everybody is fluent enough in DDT to correct typos on the fly.
+
+The Rainbow was able to 'fetch' at 2400 baud, VT180 only checked at 1200 baud.
+You might want to check on your micros, first thing to go [speed-wise] could be
+the 'visual' display - although I NEEDED to see the 'bytes' trickling in - and
+its also quite handy to see a 'blotch' coming on the VT180 - so you know right
+away when a transfer wasn't clean.
+
+- Bernie
diff --git a/cpkhdr.mss b/cpkhdr.mss
new file mode 100644 (file)
index 0000000..240b5a2
--- /dev/null
@@ -0,0 +1,156 @@
+@Comment(-*-SCRIBE-*-)
+@Comment(SCRIBE Text Formatter Input for the CP/M-80 Kermit User Guide)
+
+@Make<Manual>
+@device(postscript)
+@Comment(Use /draft:F on command line to produce .LPT file w/cc in column 1)
+
+@case(device,postscript="@LibraryFile<Mathematics10>")
+
+@String<Ellips="...">
+
+@Style<Spacing 1, Spread 1, Indent 0, HyphenBreak Off, SingleSided>
+
+@case<device,file="@style(justification off,hyphenation off)",
+else="@Style(Justification On, Hyphenation On, WidestBlank 1.4)">
+
+@Use<Hyphendic="kuser.hyp">
+@Modify<IndexEnv,Boxed,
+       Columns 2,ColumnMargin 0.5inch,LineWidth 2.2inch,ColumnWidth 2.7inch>
+
+@Comment(Set desired spacing around various environments)
+
+@Modify<Quotation,Indentation 0, Above 1, Below 1, Spacing 1>
+@Modify<Example, Above 1, Below 1, Blanklines Hinge>
+@Modify<Verbatim, Leftmargin 0>
+@Modify<Itemize, Above 1, Below 1, Spacing 1, Spread 1>
+@Modify<Enumerate, Above 1, Below 1, Spacing 1, Spread 1>
+@Modify<Description, Above 1, Below 1, Spacing 1>
+@Define<MD,Use Display>
+@Define<Q,FaceCode R>
+@Define<QQ,FaceCode R,AfterEntry=["],BeforeExit=["]>
+@Define<SubH,Use Display,FaceCode R,Above 1.6,Below 1>
+@Define<SubU,Use UX,FaceCode R,Above 1.6,Below 1,need 6>
+@define<xx,use b>
+@define<yy,use i>
+
+@Comment(Printing Device Dependencies)
+
+@Case{Device,
+ LPT="@use(Auxfile='CPMLP.AUX')
+    @Case[Draft,F=`@Style(CarriageControl=FORTRAN)']
+    @Style(linewidth 79)
+    @Define<SubH,Use Display,FaceCode B,Above 1.6,Below 1>",
+ Printronix="@use(AuxFile='CPMPX.AUX')
+    @Case[Draft,F=`@Style(CarriageControl=FORTRAN)']
+    @Style(LineWidth 74, PaperLength 11 inches,BottomMargin 5 spacings)",
+ PagedFile="@use(AuxFile='CPMPF.AUX')
+    @Style(LineWidth 79, PaperLength 10.8 inches)
+    @Style(TopMargin 3 spacings,BottomMargin 6 Spacings)
+    @Modify(Example,Leftmargin +2)",
+ Diablo="@Use(Auxfile='CPMDIA.AUX')
+    @TypeWheel(Titan 10)
+    @Define<SubH,Use Display,FaceCode B,Above 1.6,Below 1>",
+ Postscript="@Use(Auxfile='CPMPS.AUX')
+    @Style<Doublesided>
+    @Style<Fontscale 10>
+    @Define<MD,Use Mathdisplay>
+    @String<Ellips='@Math(@Ldots)'>
+    @Define<xx,use b,Size 12>
+    @Define<yy,use i,Size 10>
+    @Define<Q,FaceCode T>
+    @Define(QQ,FaceCode T,AfterEntry=[@r<``>],BeforeExit=[@r<''>])
+    @Define<SubH,Use Display,FaceCode B,Above 1.6,Below 1>
+    @Modify<Quotation,Size +0>
+    @Modify<Itemize,Spread 0.8>",
+ Imprint10="@Use(AuxFile='CPMIMP.AUX')
+    @Define<Q,FaceCode U>
+    @Define(QQ,FaceCode U,AfterEntry=[@r<``>],BeforeExit=[@r<''>])
+    @Define<SubH,Use Display,FaceCode B,Above 1.6,Below 1>
+    @define<xx,use b,font bodyfont>
+    @define<yy,use i,font bodyfont>
+    @Modify<Insert,Spacing 1>
+    @Modify<Verbatim,FaceCode U>
+    @Modify<Example,FaceCode U,spacing 1.2>
+    @Modify<Itemize,Spread 0.8>
+    @Style<FontFamily SmallRoman12,Spacing 1.6,SingleSided>",
+ Imagen300="@Use(AuxFile='CPMIM3.AUX')
+    @Define<Q,FaceCode U>
+    @Define(QQ,FaceCode U,AfterEntry=[@r<``>],BeforeExit=[@r<''>])
+    @Define<SubH,Use Display,FaceCode B,Above 1.6,Below 1>
+    @define<xx,use b,font bodyfont>
+    @define<yy,use i,font bodyfont>
+    @Modify<Insert,Spacing 1>
+    @Modify<Verbatim,FaceCode U>
+    @Modify<Example,FaceCode U,spacing 1.2>
+    @Modify<Itemize,Spread 0.8>
+    @Style<FontFamily SmallRoman12,Spacing 1.6,SingleSided>",
+ X9700="@Use<AuxFile='CKX9.AUX'>
+    @Style<FontFamily Univers10, DoubleSided, Spacing 0.9, Spread 0.8>
+    @Style<Scriptpush No>
+    @define<xx,use b,font bodyfont>
+    @define<yy,use i,font bodyfont>
+    @Define<Q,FaceCode U>
+    @Define(QQ,FaceCode U,AfterEntry=[@r<``>],BeforeExit=[@r<''>])
+    @Define<SubH,Use Display,FaceCode B,Above 1.6,Below 1>
+    @Modify<Description,Spacing 0.8,Spread 0.75> 
+    @Modify<Quotation,Spacing 0.8,Spread 0.75> 
+    @Modify<Enumerate,Spacing 0.8,Spread 0.75> 
+    @Modify(Verbatim,Spacing 0.8,Spread 0.75,FaceCode U)
+    @Modify<Example,FaceCode U, Spacing 1.1>
+    @Modify[Itemize, Numbered <\ 4 @,- >, Spacing 0.8, Spread 0.5]"
+}
+@Comment(Set spacing and paging requirements for chapter & section headings)
+
+@Modify(Hdx,Above 2,Below 1,Need 8)
+@Modify(Hd0,Above 2,Below 1,Need 8)
+@Modify(Hd2,Above 2,Below 1,Need 8)
+@Modify(Hd3,Above 2,Below 1,Need 8)
+@Modify(Hd4,Above 2,Below 1,Need 8)
+@Modify<Heading, Above 2, Need 8>
+@Modify<Subheading, Above 1.5, Need 6>
+
+@Pageheading<>
+@Begin(TitlePage,Initialize "@BlankSpace(2.4inches)",sink 0)
+@MajorHeading(CP/M-80 KERMIT VERSION 4.11 USER GUIDE)
+
+
+C. Gianone
+
+Columbia University Center for Computing Activities
+New York, New York  10027
+
+
+@i<April 23, 1991>
+
+
+
+Copyright (C) 1981,1991
+Trustees of Columbia University in the City of New York
+
+@i<Permission is granted to any individual or institution to use, copy,
+or redistribute this document so long as it is not sold for profit, and
+provided this copyright notice is retained.>
+@case[device, x9700="@blankpage(1)"]
+@end<titlepage>
+@PageHeading(Odd,Immediate,
+       Left="@xx<@Value[SectionNumber]. @Value[SectionTitle]>",
+       Right="@yy<Page @ref(page)>",
+       Line="@bar()@blankspace(2)")
+@PageHeading(Even,
+       Left="@yy<Page @ref(page)>",
+       Right="@xx<Kermit User Guide: @Title(Chapter) @Value[SectionNumber]>",
+       Line="@bar()@blankspace(2)")
+@set(page=1)
+@Include<cpkerm.mss>
+@PageHeading(Odd,Immediate,
+       Left="@xx<CP/M-80 Kermit>",
+       Right="@yy<Page @ref(page)>",
+       Line="@bar()@blankspace(2)")
+@PageHeading(Even,
+       Left="@yy<Page @ref(page)>",
+       Right="@xx<Kermit User Guide>",
+       Line="@bar()@blankspace(2)")
+@Case(Device,x9700="@Comment<Begin Duplex Kludge>
+@SendEnd(#Index `@begin<Transparent,PageBreak UntilOdd>@end<Transparent>')
+@Comment<End Duplex Kludge>")
diff --git a/cpkhex.bas b/cpkhex.bas
new file mode 100644 (file)
index 0000000..9bad29b
--- /dev/null
@@ -0,0 +1,88 @@
+1 REM -- CP4HEX.BAS --
+2 REM This program reads an Intel-format hex file and checks it for validity.
+3 REM It discards blank lines, and if it finds any other lines that are bad,
+4 REM either bacause the format is wrong or the checksum doesn't agree, it
+5 REM prompts you to type in a replacement line.  Use this program to fix
+6 REM hex files you have downloaded using a non-error-correcting method.
+7 REM Written by F. da Cruz & C. Gianone, Columbia University, April 1986.
+8 REM Used with success on Vector Graphic Model 3 CP/M-80 system.
+9 REM
+100  ON ERROR GOTO 9000
+200  INPUT;"Input hex file "; F$
+300  PRINT
+400  OPEN "I",#1,F$
+500  INPUT;"Output hex file"; O$
+600  PRINT
+700  OPEN "O",#2,O$
+800  B = 0
+900  REM Loop at 1000 for each line, B, of the input hex file, then...
+901  REM   Discard blank lines.
+902  REM   Look for colon that begins hex record
+903  REM   Decode rest of record...
+904  REM   L  = length of rest, in bytes (not hex characters!), 1 byte
+905  REM   N  = address, 2 bytes
+906  REM   T  = record type, 0 = data, 1 = EOF
+907  REM   C% = 1-byte checksum
+908  REM Record has negative of actual checksum, adding to C% should give 0.
+909  REM Subroutine at 8000 converts pair of hex nibbles to 8-bit byte.
+910  REM
+1000 LINE INPUT #1, A$
+1010 B = B + 1
+1015 IF A$ = "" THEN GOTO 1000
+1020 IF LEFT$(A$,1) = ":" THEN GOTO 2000
+1030 X = INSTR(2,A$,":")
+1033 IF X < 1 THEN GOTO 1040
+1035 A$ = MID$(A$,X,LEN(A$)-X+1)
+1037 GOTO 2000
+1040 PRINT "Line";B;"has no colon"
+1060 GOTO 3070
+2000 C% = 0
+2005 PRINT ".";
+2010 X$ = MID$(A$,2,2)
+2020 GOSUB 8000
+2030 L = K
+2040 X$ = MID$(A$,4,2)
+2050 GOSUB 8000
+2060 N = K
+2070 X$ = MID$(A$,6,2)
+2080 GOSUB 8000
+2090 N = 256 * N + K
+2100 X$ = MID$(A$,8,2)
+2110 GOSUB 8000
+2120 T = K
+2125 IF T = 1 THEN PRINT "End of";F$;"at line";B : GOTO 9000
+2130 IF T <> 0 THEN PRINT "Invalid record type"; T : GOTO 3070
+2140 M = 10
+3000 X$ = MID$(A$,M,2)
+3002 GOSUB 8000
+3005 M = M + 2
+3010 L = L - 1
+3020 IF L > 0 THEN GOTO 3000
+3030 X$ = MID$(A$,M,2)
+3050 GOSUB 8000
+3060 IF (C% AND 255) = 0 THEN GOTO 3100
+3065 PRINT "Bad Checksum"
+3070 PRINT "Line";B
+3075 PRINT "Bad: "; A$
+3080 INPUT "New  "; A$
+3090 PRINT
+3100 PRINT #2,A$
+4000 GOTO 1000
+7999 REM Subroutine to convert pair of hex nibbles to one 8-bit byte.
+8000 I = ASC(LEFT$(X$,1))
+8005 K = 0
+8010 IF I > 64 AND I < 71 THEN I = I - 7
+8020 IF I < 48 OR I > 63 THEN K = -1
+8030 J = ASC(MID$(X$,2,1))
+8040 IF J > 64 AND J < 71 THEN J = J - 7
+8050 IF J < 48 OR J > 63 THEN K = -1
+8060 IF K < 0 THEN RETURN
+8070 K = 16 * (I - 48) + J - 48
+8080 C% = C% + K
+8099 RETURN
+8999 Program exit and error handler
+9000 CLOSE #1
+9010 CLOSE #2
+9020 CLOSE
+9030 PRINT "Records processed:";B
+9999 END
diff --git a/cpscmd.asm b/cpscmd.asm
new file mode 100644 (file)
index 0000000..6cff603
--- /dev/null
@@ -0,0 +1,1140 @@
+; CPSCMD.ASM
+;       KERMIT - (Celtic for "FREE")
+;
+;       This is the CP/M-80 implementation of the Columbia University
+;       KERMIT file transfer protocol.
+;
+;       Version 4.0
+;
+;       Copyright June 1981,1982,1983,1984,1985
+;       Columbia University
+;
+; Originally written by Bill Catchings of the Columbia University Center for
+; Computing Activities, 612 W. 115th St., New York, NY 10025.
+;
+; Contributions by Frank da Cruz, Daphne Tzoar, Bernie Eiben,
+; Bruce Tanner, Nick Bush, Greg Small, Kimmo Laaksonen, Jeff Damens, and many
+; others. 
+;
+;
+;       This file provides a user oriented way of parsing commands.
+;       It is similar to that of the COMND JSYS in TOPS-20.
+;
+; revision history (latest first):
+;
+;edit 13, 17-Jan-1991 by MF. Modified "cmifil" routine to zero the entire
+;      fcb (not just the extent) to fix a bug in the COPY command which
+;      prevented successive COPY commands from working properly.
+;edit 12, 16-Jan-1991 by MF. Modified routine "cmkeyw" to ignore leading
+;      spaces/tabs before a keyword. This apparently was the intent in
+;      "prompt" and "repars" (at least for command-lines) as the variable 
+;      "cmsflg "is set upon command parse and reparse. The intent was ,
+;      subverted, however, as "cmkeyw" did not reset the flag to ignore
+;      leading white space for each search thru the key tables (even though
+;      the buffer pointer to the keyword entered was reset). The fix was
+;      to reset the "spaces seen" flag (cmsflg) after "cmkey2" so that
+;      it is reset each time a new table entry is compared to the text
+;      the user has entered from the keyboard/TAKE-file etc. The upshot
+;      of all this is that the kluge code in "cminbf" at "cminb0" designed
+;      to force Kermit to ignore leading white space on command-lines in
+;      TAKE-files and on the CP/M command-line is no longer needed and,
+;      therefore, has been eliminated. Also modify "comnd" to expect leading
+;      spaces for functions other than "get keyword".
+;edit 11, 26-Dec-1990 by MF. Modified routines to ignore leading white space
+;      in lines from TAKE-files as well as during input from the CP/M
+;      command-line  (form-feeds are now considered white space under these
+;      circumstances).
+;edit 10, 8-Sep-1990 by Mike Freeman.  Modified routines to ignore leading
+;      spaces/tabs when processing Kermit commands from the CP/M
+;      command-line.
+;      Added flag CMBFLG to allow initial word on a command-line
+;      to be blank (useful for Remote commands such as Remote CWD etc).
+;      Added flag cmqflg to prevent character-echoing while entering
+;      commands so Remote CWD etc can have nonechoing password entry.
+; edit 9, 15 June, 1987 by OBSchou.  Bug fixing to allow a second filename
+;      (quiet) be entered as d:<blank>.  Previous revision put the drive name 
+;      in first character of FCB, I put that character back to a space.
+;
+; edit 8, 12 June, 1987 by OBSchou.  Addedin code in cmkeyw to print
+;      20 lines of help, then pause for a key from the user befor
+;      proceeding with help.
+;
+; edit 7, 11 March, 1987 by OBSchou for Richard Russell, BBC.  He writes:
+;      Bug in cmtext which prevented use of octal characters (\nnn) fixed.
+;
+; edit 6, 18 June, 1986 by OBSchou, Loughborough University, Leics. UK
+;       added code to parse a number from user input.  Added check to make 
+;       sure the input command buffer does not overflow the limit.
+;
+; edit 5a: 7 March, 1986.  OBSchou. Added stuff rom MJ Carter.  He writes:
+;       7th May 85, MJ Carter [majoc], Nottingham University
+;       Code in cmifil() put one too many spaces in the FCB; this caused 
+;       the BDOS of the British Micro Mimi to search for exteny 32,
+;       rather than extent 0, so era() always said "can't find file"
+;       Puttig a null at the point in question ought to fix 9 it.
+;
+; edit 5: 6-Feb-85 by Charles Carvalho
+;       Make ffussy a runtime (rather than assembly-time) switch, to
+;       eliminate conditional assembly in system-independent module.
+;       Don't allow _%|()/\ in filenames if ffussy set; my CP/M manual
+;       disallows those, too.
+;
+; edit 4: 13-Jan-85 by Vanya J.Cooper Pima Commun. College Tel: 602-884-6809
+;
+;pcc006 2-jan-85        VJC     modules:cp4cmd,cp4utl
+;       Problems with "?" in filespecs.  On reparse, may cause action
+;       flag to be reset at wrong point, requiring multiple <CR>'s
+;       to terminate the line or other weird stuff.  Also need to
+;       check flag and complain if wild-cards illegal.
+
+;pcc007 2-Jan-85        vjc     modules:cp4def,cp4cmd
+;       Cmifil is too fussy about what characters to accept in a
+;       filespec.  My CP/M manual says any printable character is ok
+;       except <>.,;:?*[], and lower case.  In practice, even those work
+;       sometimes.  Kermit itself uses '&' if file warning is on,
+;       and then won't let you reference the file.  Allow all
+;       printable characters except those above.  Add conditional
+;       ffussy, so that if not ffussy, all special characters will be
+;       allowed, just convert lower to upper-case.
+
+; edit 3: July 8, 1984 (CJC)
+;       integrate Toad Hall changes for LASM compatibility: CP4CPM is linked
+;       by CP4WLD, and links CP4UTL.
+;       
+; edit 2: June 5, 1984 (CJC)
+;       formatting and documentation; delete unnecessary code at cminb7; add
+;       module version string.
+;
+; edit 1: May, 1984 (CJC)
+;       extracted from CPMBASE.M80 version 3.9; modifications are described in
+;       the accompanying .UPD file.
+
+cmdver:        db      'CPSCMD.ASM (13)  17-Jan-1991$' ; name, edit number, date
+
+;       This routine prints the prompt in DE and specifies the reparse
+;       address.
+;       called by:  kermit
+
+prompt:        pop     h               ;Get the return address.
+       push    h               ;Put it on the stack again.
+       shld    cmrprs          ;Save it as the address to go to on reparse.
+       lxi     h,0             ;Clear out hl pair.
+       dad     sp              ;Get the present stack pointer.
+       shld    cmostp          ;Save for later restoral.
+       xchg                    ;Save the pointer to the prompt.
+       shld    cmprmp
+       xchg
+       lxi     h,cmdbuf
+       shld    cmcptr          ;Initialize the command pointer.
+       shld    cmdptr
+       xra     a
+       sta     cmaflg          ;Zero the flags.
+       sta     cmccnt
+;      mvi     a,0FFH          ;Try it this way (Daphne.)
+;      sta     cmsflg
+       call    prcrlf          ;Print a CR/LF [Toad Hall]
+       jmp     prprmp          ;Print the prompt.  [Toad Hall]
+;\f
+;       This address is jumped to on reparse.
+;       here from:  cmcfrm, cmkeyw, cmifil, cminbf
+
+repars:        lhld    cmostp          ;Get the old stack pointer.
+       sphl                    ;Make it the present one.
+       lxi     h,cmdbuf
+       shld    cmdptr
+;      mvi     a,0FFH          ;Try it this way (Daphne.)
+;      sta     cmsflg
+       lhld    cmrprs          ;Get the reparse address.
+       pchl                    ;Go there.
+
+;       This address can be jumped to on a parsing error.
+;       here from:  cmkeyw, cminbf
+
+prserr:        lhld    cmostp          ;Get the old stack pointer.
+       sphl                    ;Make it the present one.
+       lxi     h,cmdbuf
+       shld    cmcptr          ;Initialize the command pointer.
+       shld    cmdptr
+       xra     a
+       sta     cmaflg          ;Zero the flags.
+       sta     cmccnt
+;      mvi     a,0FFH          ;Try it this way (Daphne.)
+;      sta     cmsflg
+       call    prcrlf          ;Print a CR/LF  [Toad Hall]
+       call    prprmp          ;Print the prompt  [Toad Hall]
+;* Instead return to before the prompt call.
+       lhld    cmrprs
+       pchl
+;\f
+;       This routine parses the specified function in A.  Any additional
+;       information is in DE and HL.
+;       Returns +1 on success
+;               +4 on failure (assumes a JMP follows the call)
+;       called by:  log, setcom, read, send, xmit, dir, era, keycmd, cfmcmd
+;      and CPSREM
+
+comnd: sta     cmstat          ;Save what we are presently parsing.
+       call    cminbf          ;Get chars until an action or a erase char.
+       push    psw             ;[MF]Save function
+       mvi     a,0ffh          ;[MF]Expect leading spaces
+       sta     cmsflg          ;[MF]...
+       pop     psw             ;[MF]Restore function
+       cpi     cmcfm           ;Parse a confirm?
+       jz      cmcfrm          ;Go get one.
+       cpi     cmkey           ;Parse a keyword?
+       jz      cmkeyw          ;Try and get one.
+       cpi     cmifi           ;Parse an input file spec?
+       jz      cmifil          ;Go get one.
+       cpi     cmifin          ;Input file-spec silent?
+       jz      cmifil          ;do as he wishes
+       cpi     cmofi           ;Output file spec?
+       jz      cmofil          ;Go get one.
+       cpi     cmtxt           ;Parse arbitrary text?
+       jz      cmtext          ;Go do it.
+       cpi     cmnum           ;[7] Parse a number?
+       jz      cmnumb          ;[7] go do it
+       lxi     d,cmer00        ;"?Unrecognized COMND call"
+       call    prtstr
+       ret
+;\f
+;       This routine parses arbitrary text up to a CR.
+;       Accepts DE:     address to put text
+;       Returns in A:   number of chars in text (may be 0)
+;                DE:    updated pointer
+;       called by: comnd
+
+cmtext:        xra     a               ; clear counters erc for slashes etc
+       sta     slshsn          ; if we are in a slash sequence
+       sta     slashn          ; the octal number being entered
+       sta     slashc          ; number of characters entered
+
+       xchg                    ;Put the pointer to the dest in HL.
+       shld    cmptab          ;Save the pointer.
+       mvi     b,0             ;Init the char count
+cmtxt1:        call    cmgtch          ;Get a char.
+       ora     a               ;Terminator?
+       jp      cmtx3           ;No, put in user space. [rtr] was cmtx5
+       ani     7FH             ;Turn off minus bit.
+       cpi     esc             ;An escape?
+       jnz     cmtxt2          ;No.
+       mvi     c,conout
+       mvi     e,bell          ;Get a bell.
+       call    bdos
+       xra     a
+       sta     cmaflg          ;Turn off the action flag.
+       lhld    cmcptr          ;Move the pointer to before the escape.
+       dcx     h
+       shld    cmcptr
+       shld    cmdptr
+       lxi     h,cmccnt        ;Get the char count.
+       dcr     m               ;Decrement it by one.
+       jmp     cmtxt1          ;Try again.
+
+cmtxt2:        cpi     '?'             ;Is it a question mark?
+       jz      cmtxt4          ;If so put it in the text. [rtr] was cmtx3
+       cpi     ff              ;Is it a formfeed?
+       cz      clrtop          ;If so blank the screen.
+       mov     a,b             ;Return the count.
+       lhld    cmptab          ;Return updated pointer in HL.
+       xchg
+       jmp     rskp            ;Return success.
+
+cmtx3: cpi     '\'             ; slash?
+       jnz     cmtx3a          ; nope, so try something else
+       lda     slshsn          ; a slash already entered?
+       ana     a
+       cma                     ;[rtr]
+       jnz     cmtx3a          ; yes, so assume its a valid slash to enter
+       sta     slshsn          ; make sure the flag is set for next time routnd
+       jmp     cmtxt1          ; get another character
+
+cmtx3a:
+;      lxi     h,cmaflg        ;Point to the action flag.
+;      mvi     m,0             ;Set it to zero.
+       mov     e,a             ; save it in case we are interpreting a slash
+       lda     slshsn          ; slash already entered?
+       ana     a               ; test flag
+       mov     a,e             ; restore it in case...
+       jz      cmtx5           ; not a slash seen, so enter as a normal character
+       cpi     '\'
+       jnz     cmtx3b          ; \\ not detected
+       lda     slashn          ; else get number
+       jmp     cmtx5b          ; and enter it ( in the case of \n or \nn)
+                               ; here if an octal number of 1 or 2 digits
+                               ; entered instead of 3, followed by \ again
+
+cmtx3b:
+       sui     30h             ; else it should be an octal number
+       jm      cmtxt6          ; if not a digit complain
+       cpi     8               ; ditto
+       jp      cmtxt6          ;[rtr] was cmtxt
+       mov     e,a             ; else add it to the number already entered
+       lda     slashn
+       add     a
+       add     a
+       add     a               ; multiply by 8
+       add     e
+       sta     slashn
+       lda     slashc          ; get the count
+       inr     a
+       sta     slashc          ; plus one.  If three then a number entered
+       cpi     3
+       lda     slashn          ; get the number in case...
+       jz      cmtx5
+       jmp     cmtxt1          ; else loop
+
+cmtxt4:        lhld    cmdptr          ;[rtr] Get a pointer into the buffer
+       inx     h               ;[rtr] Bump past '?'
+       shld    cmdptr          ;[rtr]
+cmtx5: call    cmtx5c
+       jmp     cmtxt1          ; put this into a subroutine
+
+cmtx5b:
+       call    cmtx5c          ; here if we see \n\ or \nn\ rather than \nnn\
+       mvi     a,'\'           ; so send slash number to buffer, 
+       sta     slshsn          ; re-store a slash seen
+       jmp     cmtxt1          ; try next one
+
+cmtx5c:
+       inr     b               ;Increment the count.
+       lhld    cmptab          ;Get the pointer.
+       mov     m,a             ;Put the char in the array.
+       inx     h
+       shld    cmptab          ;Save the updated pointer.
+       xra     a               ; clear slash counters etc
+       sta     slashc
+       sta     slashn
+       sta     slshsn
+       ret                     ; and exit
+
+cmtxt6:        lxi     d,cmer05        ; complain - not a valid \ parameter
+       call    prtstr
+       jmp     kermit          ; and try another command
+       ds      20h             ; for debugging
+;\f
+;       This routine gets a number from user input.
+;       Called by: comnd
+;
+cmnumb:        lxi     h,0             ; make sure the number is zero to start with
+       shld    number
+cmnum0:        call    cmgtch          ; get another character
+       ora     a               ; if negative then its an action
+       jp      cmnum1          ; nope, so (possibly) valid input
+       ani     7fh             ; else lets see what it is...
+       cpi     esc             ; do not know what to do with this one...
+       cpi     ' '             ; if it is a space then either a return or more
+       jnz     cmnum2          ; else
+       jmp     rskp            ; space is a deliminter
+       dw      0               ; set three bytes aside for a jump/call
+       dw      0               ; and then another three just in case...
+       dw      0               ; making 6 bytes
+cmnum2:        cpi     '?'             ; user is curious
+       jz      gnum2
+       cpi     cr              ; end of input?
+       jz      cmnumx
+gnum1: jmp     prserr          ; did not under stand this, so error
+cmnumx:        dw      0
+       dw      0
+       jmp     rskp            ; return ok
+
+gnum2: lhld    number          ; get the number.. if at all entered
+       mov     a,l
+       ora     h               ; if hl = 0 then possibly no number entered
+       lxi     d,cmin02        ; say confirm...or more on line
+       jnz     gnum21          ; else say enter a return
+       lxi     d,cmin01        ; say enter a number
+gnum21:        call    prtstr          ; say it
+       call    prcrlf          ; do a lf
+       call    prprmp          ; another reprompt
+       lhld    cmdptr          ; get pointer of string already entered
+       mvi     m,'$'           ; dollar it to  set end of line
+       lhld    cmcptr
+       dcx     h               ; decrement and save the buffer pointer
+       shld    cmcptr
+       lxi     d,cmdbuf
+       call    prtstr          ; print what has already been entered
+       xra     a
+       sta     cmaflg          ; turn the action flag off
+       jmp     repars          ; and try again
+
+       mvi     a,cmcfm         ; parse a confirm
+dw     0
+dw     0
+dw     0
+dw     0
+dw     0       ; some space to patch...
+dw     0
+
+cmnum1:        ani     7fh             ; here for a (potentially) valid number
+       sui     '0'             ; less ascii bias
+       jc      gnum3
+       cpi     10              ; if 10 or more its still bad
+       jnc     gnum3
+       cmc
+       lhld    number          ; now multiply number by ten and add the new value
+       push    h
+       pop     d
+       dad     h               ; hl = hl * 2
+       dad     h               ; * 4
+       dad     d               ; * 5
+       dad     h               ; * 10
+       mvi     d,0
+       mov     e,a             ; add de to hl...
+       dad     d
+       shld    number
+       jmp     cmnum0
+;
+gnum3: lxi     d,cmer04        ; invalid number...
+       call    prtstr
+       jmp     rskp
+;
+
+;\f
+;       This routine gets a confirm.
+;       called by: comnd
+
+cmcfrm:        call    cmgtch          ;Get a char.
+       ora     a               ;Is it negative (a terminator;a space or
+                               ;a tab will not be returned here as they
+                               ;will be seen as leading white space.)
+       rp                      ;If not, return failure.
+       ani     7FH             ;Turn off the minus bit.
+       cpi     esc             ;Is it an escape?
+       jnz     cmcfr2
+       mvi     c,conout
+       mvi     e,bell          ;Get a bell.
+       call    bdos
+       xra     a
+       sta     cmaflg          ;Turn off the action flag.
+       lhld    cmcptr          ;Move the pointer to before the escape.
+       dcx     h
+       shld    cmcptr
+       shld    cmdptr
+       lxi     h,cmccnt        ;Get the char count.
+       dcr     m               ;Decrement it by one.
+       jmp     cmcfrm          ;Try again.
+
+cmcfr2:        cpi     '?'             ;Curious?
+       jnz     cmcfr3
+       lxi     d,cmin00        ;Print something useful.
+       call    prtstr
+       call    prcrlf          ;Print a crlf.  [Toad Hall]
+       call    prprmp          ;Reprint the prompt  [Toad Hall]
+       lhld    cmdptr          ;Get the pointer into the buffer.
+       mvi     a,'$'           ;Put a $ there for printing.
+       mov     m,a
+       lhld    cmcptr
+       dcx     h               ;Decrement and save the buffer pointer.
+       shld    cmcptr
+       lxi     d,cmdbuf
+       call    prtstr
+       xra     a               ;Turn off the action flag.
+       sta     cmaflg
+       jmp     repars          ;Reparse everything.
+
+cmcfr3:        cpi     ff              ;Is it a form feed?
+       cz      clrtop          ;If so blank the screen.
+       jmp     rskp
+;\f
+;       This routine parses a keyword from the table pointed
+;       to in DE.  The format of the table is as follows:
+;
+;       addr:   db      n       ;Where n is the # of entries in the table.
+;               db      m       ;M is the size of the keyword.
+;               db      'string$' ;Where string is the keyword.
+;               db      a,b     ;Where a & b are pieces of data
+;                               ;to be returned.  (Must be two of them.)
+;
+;       The keywords must be in alphabetical order.
+;**** Note:  The data value a is returned in registers A and E.  The
+;****   data value b is returned in register D.  This allows the two data
+;       bytes to be stored as:
+;               dw      xxx
+;       and result in a correctly formatted 16-bit value in register pair
+;       DE.
+;       called by: comnd
+
+cmkeyw:        shld    cmhlp           ;Save the help.
+       xchg                    ;Get the address of the table.
+       shld    cmptab          ;Save the beginning of keyword tab for '?'.
+       mov     b,m             ;Get the number of entries in the table.
+       inx     h
+       shld    cmkptr
+       lhld    cmdptr          ;Save the command pointer.
+       shld    cmsptr
+cmkey2:        mov     a,b             ;Get the number of entries left.
+       ora     a               ;Any left?
+       rz                      ;If not we failed.
+       mvi     a,0ffh          ;[MF]Make sure we ignore leading spaces
+       sta     cmsflg          ;[MF]...
+       lhld    cmkptr
+       mov     e,m             ;Get the length of the keyword.
+       inx     h
+cmkey3:        dcr     e               ;Decrement the number of chars left.
+       mov     a,e
+       cpi     0FFH            ;Have we passed the end?
+       jm      cmkey5          ;If so go to the next.
+       call    cmgtch          ;Get a char.
+       ora     a               ;Is it a terminator?
+       jp      cmkey4          ;If positive, it is not.
+       ani     7FH             ;Turn off the minus bit.
+       cpi     '?'
+       jnz     cmky31
+       xra     a
+       sta     cmaflg          ;Turn off the action flag.
+       lxi     h,cmccnt        ;Decrement the char count.
+       dcr     m
+;* Must go through the keyword table and print them.
+       lhld    cmhlp           ;For now print the help text.
+       xchg
+       call    p20ln           ;[8] print at most 20 lines then pause
+;      call    prtstr
+       call    prcrlf          ;Print a crlf  [Toad Hall]
+       call    prprmp          ;Reprint the prompt  [Toad Hall]
+       lhld    cmdptr          ;Get the pointer into the buffer.
+       mvi     a,'$'           ;Put a $ there for printing.
+       mov     m,a
+       lhld    cmcptr
+       dcx     h               ;Decrement and save the buffer pointer.
+       shld    cmcptr
+       lxi     d,cmdbuf
+       call    prtstr
+       jmp     repars          ;Reparse everything.
+
+cmky31:        cpi     esc             ;Is it an escape?
+       jnz     cmky35
+       xra     a
+       sta     cmaflg          ;Turn off the action flag.
+       push    d
+       push    b
+       push    h
+       call    cmambg
+       jmp     cmky32          ;Not ambiguous.
+       mvi     c,conout
+       mvi     e,bell
+       call    bdos            ;Ring the bell.
+       lhld    cmcptr          ;Move the pointer to before the escape.
+       dcx     h
+       shld    cmcptr
+       shld    cmdptr
+       lxi     h,cmccnt        ;Get the char count.
+       dcr     m               ;Decrement it by one.
+       pop     h
+       pop     b
+       pop     d
+       inr     e               ;Increment the left to parse char count.
+       jmp     cmkey3
+
+cmky32:        lhld    cmcptr          ;Pointer into buffer.
+       dcx     h               ;Backup to the escape.
+       xchg
+       pop     h
+       push    h
+cmky33:        mov     a,m             ;Get the next char.
+       cpi     '$'             ;Finished?
+       jz      cmky34
+       inx     h
+       xchg
+       mov     m,a             ;Move it into the buffer.
+       inx     h
+       xchg
+       lda     cmccnt          ;Increment the char count.
+       inr     a
+       sta     cmccnt
+       jmp     cmky33
+
+cmky34:        lda     cmccnt          ;Get the character count.
+       inr     a               ;Increment and save it.
+       sta     cmccnt
+       xchg                    ;Put the command buffer pointer in HL.
+       mvi     a,' '           ;Get a blank.
+       mov     m,a             ;Put it in the command buffer.
+       inx     h               ;Increment the pointer
+       shld    cmcptr          ;Save the updated pointer.
+       shld    cmdptr
+       pop     h
+       push    h
+       xchg
+       call    prtstr          ;Print the rest of the keyword.
+       mvi     c,conout
+       mvi     e,' '
+       call    bdos            ;Print a blank.
+       pop     h
+       pop     b
+       pop     d
+       jmp     cmky37
+
+cmky35:        push    h
+       push    d
+       call    cmambg
+       jmp     cmky36
+       lxi     d,cmer01
+       call    prtstr          ;Say its ambiguous.
+       jmp     prserr          ;Give up.
+
+cmky36:        pop     d
+       pop     h
+cmky37:        inr     e               ;Add one incase it is negative.
+       mvi     d,0
+       dad     d               ;Increment past the keyword.
+       inx     h               ;Past the $.
+       mov     e,m             ;Get the data.
+       inx     h
+       mov     d,m
+       mov     a,e
+       jmp     rskp
+
+cmkey4:        cpi     'a'             ;Is it less than a?
+       jm      cmky41          ;If so don't capitalize it.
+       cpi     'z'+1           ;Is it more than z?
+       jp      cmky41          ;If so don't capitalize it.
+       ani     137O            ;Capitalize it.
+cmky41:        mov     d,m             ;Get the next char of the keyword.
+       inx     h
+       cmp     d               ;Match?
+       jz      cmkey3          ;If so get the next letter.
+
+cmkey5:        mvi     d,0
+       mov     a,e             ;Get the number of chars left.
+       ora     a               ;Is it negative?
+       jp      cmky51
+       mvi     d,0FFH          ;If so, sign extend.
+cmky51:        dad     d               ;Increment past the keyword.
+       lxi     d,0003H         ;Plus the $ and data.
+       dad     d
+       shld    cmkptr
+       dcr     b               ;Decrement the number of entries left.
+       lhld    cmsptr          ;Get the old cmdptr.
+       shld    cmdptr          ;Restore it.
+;* check so we don't pass it.
+       jmp     cmkey2          ;Go check the next keyword.
+;\f
+;       Test keyword for ambiguity.
+;       returns: nonskip if ambiguous, skip if OK.
+;       called by: cmkeyw
+
+cmambg:        dcr     b               ;Decrement the number of entries left.
+       rm                      ;If none left then it is not ambiguous.
+       inr     e               ;This is off by one;adjust.
+       mov     c,e             ;Save the char count.
+       mov     a,e
+       ora     a               ;Any chars left?
+       rz                      ;No, it can't be ambiguous.
+       mvi     d,0
+       dad     d               ;Increment past the keyword.
+       mvi     e,3             ;Plus the $ and data.
+       dad     d
+       mov     b,m             ;Get the length of the keyword.
+       inx     h
+       xchg
+       lhld    cmkptr          ;Get pointer to keyword entry.
+       mov     a,m             ;Get the length of the keyword.
+       sub     c               ;Subtract how many left.
+       mov     c,a             ;Save the count.
+       cmp     b
+       jz      cmamb0
+       rp                      ;If larger than the new word then not amb.
+cmamb0:        lhld    cmsptr          ;Get the pointer to what parsed.
+cmamb1:        dcr     c               ;Decrement the count.
+       jm      rskp            ;If we are done then it is ambiguous.
+       xchg                    ;Exchange the pointers.
+       mov     b,m             ;Get the next char of the keyword
+       inx     h
+       xchg                    ;Exchange the pointers.
+       mov     a,m             ;Get the next parsed char.
+       inx     h
+       cpi     'a'             ;Is it less than a?
+       jm      cmamb2          ;If so don't capitalize it.
+       cpi     'z'+1           ;Is it more than z?
+       jp      cmamb2          ;If so don't capitalize it.
+       ani     137O
+cmamb2:        cmp     b               ;Are they equal?
+       rnz                     ;If not then its not ambiguous.
+       jmp     cmamb1          ;Check the next char.
+;\f
+;       cmofil - parse output filespec
+;       cmifil - parse input filespec
+;       here from: comnd
+
+cmofil:        mvi     a,0             ;Don't allow wildcards.
+;       jmp     cmifil          ;For now, the same as CMIFI.
+cmifil:        sta     cmfwld          ;Set wildcard flag
+       xchg                    ;Get the fcb address.
+       shld    cmfcb           ;Save it.
+       mvi     e,0             ;Initialize char count.
+       mvi     m,0             ;Set the drive to default to current.
+       inx     h
+       shld    cmfcb2
+       xra     a               ;Initialize counter.
+cmifi0:        mvi     m,' '           ;Blank the FCB.
+       inx     h
+       inr     a
+;       cpi     0CH             ;Twelve? [5a dont use this]
+       cpi     0Bh             ; [majoc 850585] Eleven?
+       jm      cmifi0
+cmif0a:                                ;[MF]Zero entire fcb, not just the extent
+       mvi     m,0             ; [majoc 850507] Specify extent 0
+       inx     h               ;[MF]Increment fcb byte pointer
+       inr     a               ;[MF]Increment fcb byte count
+       cpi     32              ;[MF]Done with fcb?
+       jm      cmif0a          ;[MF]No, zero until done
+cmifi1:        call    cmgtch          ;Get another char.
+       ora     a               ;Is it an action character?
+       jp      cmifi2
+       ani     7FH             ;Turn off the action bit.
+       cpi     '?'             ;A question mark?
+       jnz     cmif12
+       lda     cmfwld          ;[pcc006] Wildcards allowed?
+       ora     a               ;[pcc006]
+       jz      cmif11          ;[pcc006] complain if not
+       lhld    cmdptr          ;[jd] Increment buffer pointer
+       inx     h               ;[jd] that was decremented in cmgtch
+       shld    cmdptr          ;[jd] since we want this chr
+       lda     cmcptr          ;[pcc006] get lsb of real input pointer
+       cmp     l               ;[pcc006] is this the last chr input?
+       jnz     cmif1a          ;[pcc006] no, don't reset action flag
+       xra     a               ;[pcc006] yes, reset action flag
+       sta     cmaflg          ;[pcc006] 
+cmif1a:        mvi     a,'?'           ;[pcc006] get it back in A
+       jmp     cmifi8          ;Treat like any other character
+
+cmif12:        cpi     esc             ;An escape?
+       jnz     cmif13
+;Try to recognize file-spec a'la TOPS-20
+       xra     a
+       sta     cmaflg          ;Turn off the action flag.
+       lhld    cmcptr          ;Move the pointer to before the escape.
+       dcx     h
+       shld    cmcptr
+       shld    cmdptr
+       lxi     h,cmccnt        ;Get the char count.
+       dcr     m               ;Decrement it by one.
+       mov     a,e             ;Save character count up to now.
+       sta     temp1
+       cpi     9               ;Past '.'?
+       jm      cmfrec          ;No.
+       dcr     a               ;Yes, don't count point.
+cmfrec:        lhld    cmfcb2          ;Fill the rest with CP/M wildcards.
+cmfrc1:        cpi     11              ;Done?
+       jp      cmfrc2          ;Yes.
+       mvi     m,'?'
+       inx     h
+       inr     a
+       jmp     cmfrc1
+
+cmfrc2:        mvi     c,sfirst        ;Find first matching file?
+       lhld    cmfcb
+       xchg
+       call    bdos
+       cpi     0FFH
+       jz      cmfrc9          ;No, lose.
+       lxi     h,fcbblk        ;Copy first file spec.
+       call    fspcop
+       lxi     h,fcbblk+10H    ;Get another copy (in case not ambiguous).
+       call    fspcop
+       mvi     c,snext         ;More matching specs?
+       lhld    cmfcb
+       xchg
+       call    bdos
+       cpi     0FFH
+       jz      cmfrc3          ;Only one.
+       lxi     h,fcbblk+10H    ;Copy second file spec.
+       call    fspcop
+cmfrc3:        lxi     d,fcbblk        ;Start comparing file names.
+       lxi     h,fcbblk+10H
+       lda     temp1           ;Bypass characters typed.
+       cpi     9               ;Past '.'?
+       jm      cmfrc4          ;No.
+       dcr     a               ;Yes, don't count point.
+cmfrc4:        mvi     c,0
+cmfrl1:        cmp     c               ;Bypassed?
+       jz      cmfrl2          ;Yes.
+       inx     d
+       inx     h
+       inr     c
+       jmp     cmfrl1          ;Repeat.
+
+cmfrl2:        mov     a,c             ;Get file name characters processed.
+       cpi     11              ;All done?
+       jz      cmfrc5          ;Yes.
+       cpi     8               ;End of file name?
+       jnz     cmfrl3          ;No.
+       lda     temp1           ;Exactly at point?
+       cpi     9
+       jz      cmfrl3          ;Yes, don't output a second point.
+       mvi     a,'.'           ;Output separator.
+       call    cmfput
+cmfrl3:        ldax    d               ;Get a character from first file spec.
+       inx     d
+       mov     b,m             ;Get from second file spec.
+       inx     h
+       cmp     b               ;Compare.
+       jnz     cmfrc5          ;Ambiguous.
+       inr     c               ;Same, count.
+       cpi     ' '             ;Blank?
+       jz      cmfrl2          ;Yes, don't output.
+       call    cmfput          ;Put character into buffer.
+       jmp     cmfrl2          ;Repeat.
+
+cmfrc5:        mov     a,c             ;Get count of characters processed.
+       sta     temp1           ;Save it.
+       mvi     a,'$'           ;Get terminator.
+       call    cmfput          ;Put it into buffer.
+       lhld    cmdptr          ;Output recognized characters.
+       xchg
+       mvi     c,prstr
+       call    bdos
+       lhld    cmcptr          ;Remove terminator from buffer.
+       dcx     h
+       shld    cmcptr
+       lxi     h,cmccnt
+       dcr     m
+       lda     temp1           ;Characters processed.
+       cpi     11              ;Complete file name.
+       jz      repars          ;Yes, don't beep.
+
+cmfrc9:        mvi     c,conout
+       mvi     e,bell
+       call    bdos            ;Ring the bell.
+       jmp     repars
+;\f
+;       Continue file spec parsing.
+
+cmif13:        mov     a,e             ;It must be a terminator.
+       ora     a               ;Test the length of the file name.
+       jz      cmifi9          ;If zero complain.
+       cpi     0DH
+       jp      cmifi9          ;If too long complain.
+       jmp     rskp            ;Otherwise we have succeeded.
+
+cmifi2:        cpi     '.'
+       jnz     cmifi3
+       inr     e
+       mov     a,e
+       cpi     1H              ;Any chars yet?
+       jz      cmifi9          ;No, give error.
+       cpi     0AH             ;Tenth char?
+       jp      cmifi9          ;Past it, give an error.
+       mvi     c,9H
+       mvi     b,0
+       lhld    cmfcb
+       dad     b               ;Point to file type field.
+       shld    cmfcb2
+       mvi     e,9H            ;Say we've gotten nine.
+       jmp     cmifi1          ;Get the next char.
+
+cmifi3:        cpi     ':'
+       jnz     cmifi4
+       inr     e
+       mov     a,e
+       cpi     2H              ;Is it in the right place for a drive?
+       jnz     cmifi9          ;If not, complain.
+       lhld    cmfcb2
+       dcx     h               ;Point to previous character.
+       mov     a,m             ;Get the drive name.
+       sui     '@'             ;Get the drive number.
+       shld    cmfcb2          ;Save pointer to beginning of name field.
+       mvi     m,space         ;[obs] restore a space in FCB
+       dcx     h               ;Point to drive number.
+       mov     m,a             ;Put it in the fcb.
+       mvi     e,0             ;Start character count over.
+       jmp     cmifi1
+
+cmifi4:        cpi     '*'
+       jnz     cmifi7
+       lda     cmfwld          ;Wildcards allowed?
+       cpi     0
+       jz      cmif11          ;No,complain
+       mov     a,e
+       cpi     8H              ;Is this in the name or type field?
+       jz      cmifi9          ;If its where the dot should be give up.
+       jp      cmifi5          ;Type.
+       mvi     b,8H            ;Eight chars.
+       jmp     cmifi6
+
+cmifi5:        mvi     b,0CH           ;Three chars.
+cmifi6:        lhld    cmfcb2          ;Get a pointer into the FCB.
+       mvi     a,'?'
+       mov     m,a             ;Put a question mark in.
+       inx     h
+       shld    cmfcb2
+       inr     e
+       mov     a,e
+       cmp     b
+       jm      cmifi6          ;Go fill in another.
+       jmp     cmifi1          ;Get the next char.
+
+cmifi7:        cpi     '!'             ;[pcc007] control chr or space?
+       jm      cmifi9          ;[pcc007] yes, illegal
+       mov     h,a             ;[5] stash input char for a bit
+       lda     ffussy          ;[5]  while we check the fussy flag
+       ora     a               ;[5] set the flags accordingly
+       mov     a,h             ;[5] restore the input character
+       jz      cmif7a          ;[5] if ffussy=0, allow <>.,;:?*[]
+;[5] So far, we've eliminated "action characters" (including question),
+;[5] period, colon, asterisk, control characters, and space.
+;[5] That leaves us %(),/;<=>[\]_| to check for.
+       cpi     '%'             ;[5]
+       jz      cmifi9          ;[5]
+       cpi     '('             ;[5]
+       jz      cmifi9          ;[5]
+       cpi     ')'             ;[5]
+       jz      cmifi9          ;[5]
+       cpi     ','             ;[pcc007] weed out comma
+       jz      cmifi9          ;[pcc007]
+       cpi     '/'             ;[5]
+       jz      cmifi9          ;[5]
+       cpi     '9'+1           ;[pcc007] anything else 21H-39H is ok
+       jm      cmifi8          ;[pcc007] except '*' never gets here
+       cpi     '@'             ;[pcc007] all of 3AH-3FH is illegal
+       jm      cmifi9          ;[pcc007]
+       cpi     '['             ;[pcc007] [\] also illegal
+       jm      cmifi8          ;[pcc007]
+       cpi     ']'+1           ;[pcc007]
+       jm      cmifi9          ;[pcc007]
+       cpi     '_'             ;[5]
+       jz      cmifi9          ;[5] (If I was doing CP/M, I would have
+       cpi     '|'             ;[5]  just eliminated all them funny chars
+       jz      cmifi9          ;[5]  instead of a random selection)
+cmif7a:                                ;[5]
+       cpi     'a'             ;[pcc007] if not lower case its ok
+       jm      cmifi8          ;[pcc007] (DEL never gets here)
+       cpi     'z'+1           ;[pcc007] only convert letters
+       jp      cmifi8          ;[pcc007]
+       ani     137O            ;Capitalize.
+cmifi8:        lhld    cmfcb2          ;Get the pointer into the FCB.
+       mov     m,a             ;Put the char there.
+       inx     h
+       shld    cmfcb2
+       inr     e
+       jmp     cmifi1
+
+cmifi9:        lda     cmstat
+       cpi     cmifin          ;"silent"?
+       jz      r               ;Yes,let him go w/o check
+       lxi     d,cmer02
+cmif10:        mvi     c,prstr
+       call    bdos
+       ret
+
+cmif11:        lxi     d,cmer03        ;Complain about wildcards.
+       jmp     cmif10
+
+;\f
+
+;       copy filename from buffer
+;       called with HL = destination, A = position (0-3) in buffer
+;       called by: cmifil
+
+fspcop:        push    psw             ;Save A.
+       lxi     d,buff          ;Get the right offset in the buffer.
+       rlc
+       rlc
+       rlc
+       rlc
+       rlc
+       add     e
+       inr     a               ;Bypass drive spec.
+       mov     e,a
+       mvi     b,11            ;Copy file name.
+fspcp1:        ldax    d
+       inx     d
+       mov     m,a
+       inx     h
+       dcr     b
+       jnz     fspcp1
+       pop     psw             ;Restore A.
+       ret
+
+;       append character in A to command buffer
+;       called by: cmifil
+
+cmfput:        push    h               ;Save H.
+       lhld    cmcptr          ;Get buffer pointer.
+       mov     m,a             ;Store in buffer.
+       inx     h
+       shld    cmcptr
+       lxi     h,cmccnt        ;Count it.
+       inr     m
+       pop     h               ;Restore H.
+       ret
+;\f
+;       Read characters from the command buffer.
+;       called by:  cmtext, cmcfrm, cmkeyw, cmifil
+
+cmgtch:        push    h
+       push    b
+cmgtc1:        lda     cmaflg
+       ora     a               ;Is it set.
+       cz      cminbf          ;If the action char flag is not set get more.
+       lhld    cmdptr          ;Get a pointer into the buffer.
+       mov     a,m             ;Get the next char.
+       inx     h
+       shld    cmdptr
+       cpi     ' '             ;Is it a space?
+       jz      cmgtc2
+       cpi     tab             ;Or a tab?
+       jnz     cmgtc3
+cmgtc2:        lda     cmsflg          ;Get the space flag.
+       ora     a               ;Was the last char a space?
+       jnz     cmgtc1          ;Yes, get another char.
+       mvi     a,0FFH          ;Set the space flag.
+       sta     cmsflg
+       mvi     a,' '
+       pop     b
+       pop     h
+       jmp     cmgtc5
+
+cmgtc3:        push    psw
+       xra     a
+       sta     cmsflg          ;Zero the space flag.
+       pop     psw
+       pop     b
+       pop     h
+       cpi     esc
+       jz      cmgtc5
+       cpi     '?'             ;Is the user curious?
+       jz      cmgtc4
+       cpi     cr
+       jz      cmgtc4
+       cpi     lf
+       jz      cmgtc4
+       cpi     ff
+       rnz                     ;Not an action char, just return.
+cmgtc4:        push    h
+       lhld    cmdptr
+       dcx     h
+       shld    cmdptr
+       pop     h
+cmgtc5:        ori     80H             ;Make the char negative to indicate it is
+       ret                     ;a terminator.
+;\f
+;       Read characters from console into command buffer, processing
+;       editing characters (^H, ^M, ^J, ^L, ^U, ^X, ?, del).
+;       called by: comnd, cmgtch
+
+cminbf:        push    psw
+       push    d
+       push    h
+       lda     cmaflg          ;Is the action char flag set?
+       ora     a
+       jnz     cminb9          ;If so get no more chars.
+cminb1:        lxi     h,cmccnt        ;Increment the char count.
+       inr     m
+       mvi     c,conin         ;Get a char.
+       lda     cmqflg          ;[MF]but do we want it echoed?
+       ora     a               ;[MF]...
+       jz      cmin1b          ;[MF]Yup, proceed normally
+cmin1c:        mvi     e,0ffH          ;[MF]Nope, do it with Direct
+       mvi     c,dconio        ;[MF]Console I/O
+       call    bdos            ;[MF]...
+       ora     a               ;[MF]Did the user type anything?
+       jz      cmin1c          ;[MF]No, don't go on until he/she does.
+       jmp     cmin1a          ;[MF]We got a character
+cmin1b:        call    bdos
+cmin1a:        lhld    cmcptr          ;Get the pointer into the buffer.
+       mov     m,a             ;Put it in the buffer.
+       inx     h
+       shld    cmcptr
+       cpi     25O             ;Is it a ^U?
+       jz      cmnb12          ;Yes.
+       cpi     30O             ;Is it a ^X?
+       jnz     cminb2
+cmnb12:        call    clrlin          ;Clear the line.
+       call    prprmp          ;Print the prompt  [Toad Hall]
+       lxi     h,cmdbuf
+       shld    cmcptr          ;Reset the point to the start.
+       lxi     h,cmccnt        ;Zero the count.
+       mvi     m,0
+       jmp     repars          ;Go start over.
+
+cminb2:        cpi     10O             ;Backspace?
+       jz      cminb3
+       cpi     del             ;or Delete?
+       jnz     cminb4
+       lda     cmqflg          ;[MF]If we are echoing characters,
+       ora     a               ;[MF]...
+       cz      delchr          ;Print the delete string. [MF]
+cminb3:        lda     cmccnt          ;Decrement the char count by two.
+       dcr     a
+       dcr     a
+       ora     a               ;Have we gone too far?
+       jp      cmnb32          ;If not proceed.
+       mvi     c,conout        ;Ring the bell.
+       mvi     e,bell
+       call    bdos
+       jmp     cmnb12          ;Go reprint prompt and reparse.
+
+cmnb32:        sta     cmccnt          ;Save the new char count.
+       lda     cmqflg          ;[MF]Echoing characters?
+       ora     a               ;[MF]If we are, then
+       cz      clrspc          ;Erase the character. [MF]
+       lhld    cmcptr          ;Get the pointer into the buffer.
+       dcx     h               ;Back up in the buffer.
+       dcx     h
+       shld    cmcptr
+       jmp     repars          ;Go reparse everything.
+
+cminb4:        cpi     '?'             ;Is it a question mark.
+       jz      cminb6
+       cpi     esc             ;Is it an escape?
+       jz      cminb6
+       cpi     cr              ;Is it a carriage return?
+       jz      cminb5
+       cpi     lf              ;Is it a line feed?
+       jz      cminb5
+       cpi     ff              ;Is it a formfeed?
+       jnz     cminb8          ;no - just store it and 
+                               ;test if buffer overflowing, else get another character.
+       call    clrtop
+cminb5:        lda     cmbflg          ;[MF]Allowing initial blank word (<cr>)?
+       ora     a               ;[MF]...
+       jnz     cminb6          ;[MF]Yes
+       lda     cmccnt          ;Have we parsed any chars yet?
+       cpi     1
+       jz      prserr          ;If not, just start over.
+cminb6:        mvi     a,0FFH          ;Set the action flag.
+       sta     cmaflg
+       jmp     cminb9
+
+cminb8:
+       lda     cmccnt          ; get the command character count
+       cpi     cmbufl          ; check for comand buffer length
+       jm      cminb1          ; if less, then all ok
+       mvi     e,bell          ; else beep at user
+       call    outcon          ; send it to the console
+       lda     cmccnt          ; back up one character
+       dcr     a
+       sta     cmccnt
+       lhld    cmcptr          ; ditto pointer
+       dcx     h
+       shld    cmcptr          ; save it again
+       jmp     cminb1          ; and try again
+
+cminb9:        pop     h
+       pop     d
+       pop     psw
+       ret
+;\f
+;Little utility to print the prompt.  (We do a LOT of these.)  [Toad Hall]
+;Enters with nothing.
+;Destroys HL (and I suppose B and DE and A).
+prprmp:        mvi     e,cr            ; do a cr first
+       mvi     c,dconio
+       call    bdos
+       lhld    cmprmp          ;Get the prompt.
+       xchg
+       call    prtstr
+       ret
+
+; Little code to allow some expansion of code without changing
+;  every futher address, only up to the end of this file.
+;   TO BE REMOVED FOR RELEASE!
+
+;      org ($+100h) AND 0FF00H
+
+
+IF     lasm
+LINK   CPSUTL
+ENDIF  ;lasm  [Toad Hall]
diff --git a/cpscom.asm b/cpscom.asm
new file mode 100644 (file)
index 0000000..7f2a57a
--- /dev/null
@@ -0,0 +1,1371 @@
+; CPSCOM.ASM
+;       KERMIT - (Celtic for "FREE")
+;
+;       This is the CP/M-80 implementation of the Columbia University
+;       KERMIT file transfer protocol.
+;
+;       Version 4.0
+;
+;       Copyright June 1981,1982,1983,1984,1985
+;       Columbia University
+;
+; Originally written by Bill Catchings of the Columbia University Center for
+; Computing Activities, 612 W. 115th St., New York, NY 10025.
+;
+; Contributions by Frank da Cruz, Daphne Tzoar, Bernie Eiben,
+; Bruce Tanner, Nick Bush, Greg Small, Kimmo Laaksonen, Jeff Damens, and many
+; others. 
+;
+;       This file contains some of the main loop commands, all SET xxx and
+;      status routines.  File split from CPSMIT.ASM as that file 
+;      was getting too big.
+;
+; revision history:
+;
+;edit 13, 25-Mar-1991 by MF. Require confirmation if a STAY command
+;      (code at "noexit") is given and a question-mark is entered.
+;edit 12, 21-Mar-1991 by MF.  Change SET COLLISSION REPLACE to
+;      SET COLLISION OVERWRITE to conform with C-Kermit. Modify SET COLLISION
+;      help text slightly.
+
+;edit 11, 27-Feb-1991 by MF. Show Kermit version in VERSION command
+;      ("shover").
+;edit 10, 12-Feb-1991 by MF. Modified OUTPUT command to get a "confirm"
+;      after accepting the string to be output so that the OUTPUT command
+;      doesn't immediately execute if a terminator other than <cr> is typed
+;      (immediate execution confuses some users new to Kermit). This
+;      situation should seldom, if ever, occur, as the OUTPUT command
+;      is most likely to be executed in a TAKE-file but one should
+;      protect oneself, shouldn't one?
+;      Also commented out case-sensivity code as it is unlikely to be used.
+;edit 9, 4-Dec-1990 by MF. Add "stautr" routine to display Autoreceive
+;      status in SHOW/STATUS/<ESC>S commands.
+;edit 8, 30-Nov-1990 by MF. Modify routine "statvt" (terminal status) to
+;      display setting of "quiet" switch. Although I presume that Mr.
+;      Schou thought the code would accommodate display of QUIET or
+;      REGULAR, the code does not in fact allow this since the emulation
+;      flag is not involved in the "quiet" setting.
+;      Also fix SET TERMINAL's help text a bit.
+;edit 7, 8-Nov-1990 by MF.  In SET {RECEIVE/SEND} PACKET-LENGTH routines,
+;      call utility routine subbc from CPSUTL.ASM to do 16-bit subtraction
+;      rather than doing it in-line to save a few bytes.  Eliminate
+;      commented-out instructions.
+;edit 6, 1-Nov-1990 by MF.  Changed SET BAUD-RATE to SET SPEED in the quest
+;      for uniformity of nomenclature (per request of FDC).
+;edit 5, 17-Oct-1990 by MF.  Change SET {RECEIVE SEND} PACKET-SIZE to
+;      SET {RECEIVE SEND} PACKET-LENGTH to conform with the nomenclature
+;      suggested in Chapter 10 of the 6th edition of the Kermit Protocol
+;      Manual.
+;edit 4, 14-Sep-1990 by MF.  Implemented SET FILE-COLLISION (SET COLLISION)
+;      command (except for SET COLLISION ASK and SET COLLISION APPEND).
+;      How one APPENDs to a CP/M file depends upon whether it's ASCII or
+;      BINARY -- something we may not know.
+;      Also implemented SET INCOMPLETE-FILE command.
+;      Let's also restore SET FILE-MODE DEFAULT:  I never use it but if
+;      we leave the DEFAULT code, as Version 4.09 does, the user is entitled
+;      to be able to select it if he/she wishes (I'd favor getting rid
+;      of it altogether but as soon as I did that, someone'd come out
+;      of the woodwork and complain vehemently that he/she **likes** 
+;      SET FILE-MODE DEFAULT and would the so-and-so who took it out
+;      please put it back in.  Such is life.  In any case, the user can
+;      always set the file-mode from a take-file.
+;edit 3, 9-Sep-1990 by MF.  Implemented setting of packet sizes for
+;      packets up thru length 94 characters for SEND and RECEIVE.  Even
+;      for standard-length packets, variable sizes are useful.
+;      Correct 16-bit subtraction in stspks/strpks to set carry if needed
+;      Also corrected bug in routine getnp wherein a JMP KERMIT
+;      instruction was left out after trying to parse a confirm, thus
+;      skipping loading of number into HL.
+;      Fixed bug in PRTSTR wherein BC/HL were not saved under certain
+;      conditions, thus causing garbage to appear when PRTSTR was
+;      called with QUIETD set.
+; edit 2, September 10, 1987, by OBSchou.  Changed SET IBM to reset the 
+;      flow control flag.  IBMs use 13h as a turnaround character (so they
+;      say) so no flow control.  Anybody willing to add comments etsc, as I 
+;      have NO IDEA what IBMs do or need.
+;      Also removed the SET FILE-MODE DEFAULT option, as it always causes
+;      so much trouble.  Assume the default mode to be ASCII.  Moved a test
+;      for key pressed from the status routine to the CPSUTL file.
+;
+; edit 1, April 8th, 1987.
+;      Hived off the SET command etc from CPSMIT.ASM to 
+;      make a more manageable file
+
+
+comver:        db      'CPSCOM.ASM (13) 25-Mar-1991$'  ;name, edit no. and date
+;
+;
+; This is the SET command.
+
+setcom:        lxi     d,settab        ;Parse a keyword from the set table.
+       lxi     h,sethlp
+       call    keycmd
+       xchg            ; Get result (dispatch address) into HL
+       pchl            ; Dispatch.
+
+settab:        db      26              ;[pcc013] 16 entries [Toad Hall] [9], now 17
+                               ;[11] removed XMIT and added CASE and FLOW-CTL
+                               ; Value is address of processing routine.
+                               ;[14] removed SET CASE-SENSITIVE for now
+                               ;[DRJ] Added SET USER. settab = 22
+                               ;[OBS] Added SET AUTORECEIVE. 
+                               ; and SET NO-EXIT.  settab = 24
+                               ;[MF]Added SET COLLISION, settab=25
+                               ;[MF]Added Set Incomplete settab=26
+       db      11,     'AUTORECEIVE$'
+               dw setaut
+       db      16,     'BLOCK-CHECK-TYPE$'
+               dw blkset
+       db      11,     'BUFFER-SIZE$'
+               dw setbuf
+;       db      14,    'CASE-SENSITIVE$'   ;[10]
+;               dw setcase              ;[10]
+       db      9,'COLLISION$'  ;[MF]
+       dw      setcol          ;[MF]
+       db      5,      'DEBUG$'
+               dw setdbg
+       db      12,     'DEFAULT-DISK$'
+               dw setdisk
+       db      19,     'DIRECTORY-FILE-SIZE$'
+               dw hidef
+       db      6,      'ESCAPE$'
+               dw escape
+       db      9,      'FILE-MODE$'
+               dw setcpm
+       db      12,     'FLOW-CONTROL$' ;[10]
+               dw setflo               ;[10]
+       db      3,      'IBM$'
+               dw ibmset
+       db      16,'INCOMPLETE-FILES$'
+       dw      setinc          ;[MF]Set Incomplete
+       db      10,     'LOCAL-ECHO$'
+               dw locall
+       db      7,      'LOGGING$'              ;[pcc013]
+               dw setlog               ;[pcc013]
+       db      7,      'NO-EXIT$'
+               dw noexit
+       db      6,      'PARITY$'
+               dw parset
+       db      4,      'PORT$'
+               dw prtset
+       db      7,      'PRINTER$'
+               dw setprn
+       db      7,      'RECEIVE$'              ;[gnn]
+               dw setrec               ;[gnn]
+       db      4,      'SEND$'         ;[gnn]
+               dw setsnd               ;[gnn]
+       db      5,      'SPEED$';[MF]
+               dw baud
+       db      7,      'TACTRAP$'
+               dw settac
+       db      8,      'TERMINAL$'
+               dw vt52em
+       db      5,      'TIMER$'
+               dw settim
+       db      4,      'USER$'         ;[DJR]
+               dw user         ;[DJR]
+       db      7,      'WARNING$'
+               dw filwar
+
+; help message for SET command. Caps indicate keywords
+
+sethlp:        db      cr,lf,'AUTORECEIVE to automatically re-receive files'
+       db      cr,lf,'BLOCK-CHECK-TYPE for error detection'
+       db      cr,lf,'BUFFER-SIZE for multi-sector buffering'
+;       db      cr,lf,'CASE-SENSITIVE to equate lower and upper case'   ;[10]
+       db      cr,lf,'COLLISION to specify action for filename conflicts'
+       db      cr,lf,'DEBUG message control'
+       db      cr,lf,'DEFAULT-DISK to receive data'
+       db      cr,lf,'DIRECTORY-FILE-SIZE when displaying directories'
+       db      cr,lf,'ESCAPE character during CONNECT'
+       db      cr,lf,'FILE-MODE for outgoing files'
+       db      cr,lf,'FLOW-CONTROL to set XON/XOFF flow control'       ;[10]
+       db      cr,lf,'IBM mode: parity and turn around handling'
+       db      cr,lf,'INCOMPLETE-FILE disposition'
+       db      cr,lf,'LOCAL-ECHO (half-duplex)'
+       db      cr,lf,'LOGGING of terminal sessions'    ;[pcc013]
+       db      cr,lf,'NO-EXIT to prevent exit to CP/M after a command tail'
+       db      cr,lf,'PARITY for communication line'
+       db      cr,lf,'PORT to communicate on'
+       db      cr,lf,'PRINTER copy control'
+       db      cr,lf,'RECEIVE parameters'      ;not all currently implemented
+       db      cr,lf,'SEND parameters'         ;Ditto
+       db      cr,lf,'SPEED of communication line'
+       db      cr,lf,'TAC interface support'
+       db      cr,lf,'TERMINAL to set a terminal type'
+       db      cr,lf,'TIMER control'
+       db      cr,lf,'USER to set a user number'               ;[DJR]
+       db      cr,lf,'WARNING for filename conflicts'
+       db      '$'
+
+;\f
+; SET AUTORECEIVE on/off command
+setaut:        call    onoff           ; set it either on or off
+       sta     autorc          ; and save the flag
+       jmp     kermit          ; and do next command
+
+;SET BLOCK-CHECK-TYPE command.
+
+blkset:        lxi     d,blktab        ;Get the address of the block-check table
+       lxi     h,blkhlp        ;And the address of the help text
+       call    chkkey          ;Go check input (val returns in A).
+       sta     chktyp          ;Save desired checksum type
+       jmp     kermit          ;Go get another command
+
+blktab:        db      3               ;Three entries.
+       db      20,     '1-CHARACTER-CHECKSUM$',        '1','1'
+       db      20,     '2-CHARACTER-CHECKSUM$',        '2','2'
+       db      21,     '3-CHARACTER-CRC-CCITT$',       '3','3'
+
+blkhlp:        db      cr,lf,'1-CHARACTER-CHECKSUM'
+       db      cr,lf,'2-CHARACTER-CHECKSUM'
+       db      cr,lf,'3-CHARACTER-CRC-CCITT$'
+
+;
+;       This is the SET BUFFER-SIZE command.  
+;       Sets to maximum number of sectors to use for multiple sector 
+;       buffering.  Sorts a lot f problems on some slow disc-access machines..
+setbuf:        mvi     a,cmnum         ; get a number from the user 
+       call    comnd
+       jmp     kermit          ; error if nothing
+       lhld    number          ; get the value
+       mov     a,h
+       ana     a
+       jnz     setbu1          ; if number greater than 255 then error
+       lda     maxbsc          ; get maximum no sectors allowed by system
+       cmp     l               ; set flags from a-l
+       jm      setbu1          ; if l > a then error
+       mov     a,l             ; only ls bits used
+       sta     bufsec
+       jmp     kermit
+
+setbu1:        lxi     d,erms25
+       call    prtstr
+       jmp     kermit
+
+
+;SET DEFAULT DISK command
+
+setdisk:lxi    d,fcb
+       mvi     a,cmifin        ;get "file-spec" silently
+       call    comnd
+       jmp     setdi1
+setdi1:        lda     fcb
+       ora     a               ;Was a drive specified? (if zero, no)
+       jnz     setdi2          ;he typed a drive-spec
+       lda     curdsk          ;he didn't - give him default
+setdi2:        sta     curdsk
+       mvi     c,inbdos        ;reset disks
+       call    bdos
+       lda     curdsk
+       dcr     a               ;LOGDSK is relative 0
+       mov     e,a
+       mvi     c,logdsk
+       call    bdos            ;and "LOG" it
+       jmp     kermit          ;all done
+;\f
+;SET SEND command.  Sort of supported
+
+setsnd:        lxi     d,stsntb        ;Parse a keyword from the set send table.
+       lxi     h,stshlp
+       call    keycmd
+       xchg            ; Get dispatch address into HL
+       pchl            ; Go for it.
+
+stsntb:        db      4               ;Two entries.  four entries
+       db      8, 'PAD-CHAR$'
+               dw stspac
+       db      7, 'PADDING$'
+               dw stspad
+       db      15, 'START-OF-PACKET$'  ;[gnn]
+               dw stssop               ;[gnn]
+       db      13,'PACKET-LENGTH$'     ;
+               dw stspks               ;
+;      db      9,'CHECKTYPE$'          ;
+;              dw stsckt               ;
+
+stshlp:        db      cr,lf,'PAD-CHAR to define the pad character to use'
+       db      cr,lf,'PADDING to define the number of PAD-CHAR to use'
+       db      cr,lf,'START-OF-PACKET to define the start of packet character' ;[gnn]
+       db      cr,lf,'PACKET-LENGTH for the length of transmitted packet';
+;      db      cr,lf,'CHECKTYPE to define the check-type to use';[21]
+       db      '$'             ;[gnn]
+
+; SET SEND START-OF-PACKET   [gnn]
+stssop:        call    cfmcmd
+       lxi     d,sopmes
+       call    prtstr
+       mvi     c,conin
+       call    bdos
+       sta     sndsop
+       jmp     kermit
+
+; SET SEND PADDING command. does nothing.  get value to dspad
+stspad:        call    getnp           ; get the number of padding characters
+       sta     dspad           ; save ad default send no. pad characters
+       jmp     kermit
+
+; SET SEND PAD-CHAR command. does nothing.  gets char to dspadc
+stspac:        call    getpad          ; get the character to use
+       sta     dspadc          ; save as default send pad character
+       jmp     kermit
+
+; SET SEND PACKET-LENGTH command.  Max 95, but could be more for long pkts...
+stspks:        call    getnp           ; get number into hl
+       lxi     b,(maxpkt-1)    ;[MF] One below upper limit of packet-size
+       push    h               ;[MF] Save number
+       call    subbc           ;[MF] Do 16-bit subtraction, even though
+                               ;[MF] getnp puts low-order bits in a,
+                               ;[MF] in case long packets are
+                               ;[MF] implemented
+       pop     h               ;[MF] Restore number
+       lxi     d,erms26        ; packet length to long error
+       jnc     stspk1
+       mov     a,l
+       sta     spsiz           ;[MF] Save as default send packet length
+       jmp     kermit
+stspk1:        call    prtstr
+       jmp     kermit          ; error exit
+
+; SET SEND CHECKTYPE command. Accepts 1,2 or 3
+stsckt:        call    getnp           ; get a number
+       cpi     4               ; if more than 3 then error
+       jnz     stsck1
+stsck2:        lxi     d,erms27        ; checktype wrong
+       jmp     kermit
+stsck1:        cpi     0               ; error also for null
+       jz      stsck2
+       adi     30h             ; make it printable
+       sta     sdckt           ; save as default send checktype
+       jmp     kermit
+
+
+;SET RECEIVE command.   [gnn]
+setrec:        lxi     d,strctb        ;Parse a keyword from the set rec table.
+       lxi     h,stshlp        ; use same help for send and receive
+       call    keycmd
+       xchg            ; Get dispatch address into HL
+       pchl            ; Go for it.
+
+strctb:        db      4               ;  Three entries.  four entries
+       db      8, 'PAD-CHAR$'
+               dw strpac       ; use dummy entry of set send
+       db      7, 'PADDING$'
+               dw strpad       ; use dummy entry of set send
+       db      15,'START-OF-PACKET$'
+               dw strsop
+       db      13,'PACKET-LENGTH$'             ;
+               dw strpks               ;
+;      db      9,'CHECKTYPE$'          ;
+;              dw strckt               ;
+
+; SET RECEIVE START-OF-PACKET  
+strsop:        call    cfmcmd
+       lxi     d,sopmes
+       call    prtstr
+       mvi     c,conin
+       call    bdos
+       sta     rcvsop
+       jmp     kermit
+
+; SET RECEIVE PADDING
+strpad:        mvi     a,cmnum         ; go parse a number
+       call    comnd           ; get it
+       jmp     kermit          ; duff entry, so die
+       mvi     a,cmcfm         ; ask to confirm
+       call    comnd
+       lhld    number          ; get the number of padding charaters
+       mov     a,l             ; assume 255 or less
+       sta     dspad           ; save ad default send no. pad characters
+
+; SET SEND RECEIVE routines
+getpad:        call    cfmcmd
+       lxi     d,padcms        ; tell user we want the pad character
+       call    prtstr
+       mvi     c,conin         ; get it verbatum
+       call    bdos
+       ret
+
+; SET RECEIVE PAD-CHAR routine
+strpac:        call    getpad          ; get the character to use
+       sta     drpadc          ; save it
+       jmp     kermit
+
+; SET RECEIVE PACKET-LENGTH.  Max 95, but could be more for long pkts...
+strpks:        call    getnp           ; get number into hl
+       lxi     b,(maxpkt-1)    ;[MF] One below upper limit of packet-size
+       push    h               ;[MF] Save number
+       call    subbc           ;[MF] Do 16-bit subtraction, even though
+                               ;[MF] getnp puts low-order bits in a,
+                               ;[MF] in case long packets are
+                               ;[MF] implemented
+       pop     h               ;[MF] Restore number
+       lxi     d,erms26        ; packet length to long error
+       jnc     strpk1
+       mov     a,l
+       sta     rpsiz           ;[MF] Save as default receive packet-length
+       jmp     kermit
+strpk1:        call    prtstr
+       jmp     kermit          ; error exit
+
+
+; SET RECEIVE CHECKTYPE
+strckt:        call    getnp           ; get a number
+       cpi     4               ; if more than 3 then error
+       jnz     strck1
+strck2:        lxi     d,erms27        ; checktype wrong
+       jmp     kermit
+strck1:        cpi     0               ; error also for null
+       jz      strck2
+       adi     30h             ; make it printable
+       sta     rdckt           ; save as default receive checktype
+       jmp     kermit
+
+getnp: mvi     a,cmnum         ; go parse a number
+       call    comnd           ; get it
+       jmp     kermit          ; duff entry, so die
+       mvi     a,cmcfm         ; ask to confirm
+       call    comnd
+         jmp   kermit          ;[MF] Die!
+       lhld    number          ; get the number of padding charaters
+       mov     a,l             ; assume 255 or less
+       ret             ; return to caller
+
+
+; SET NO-EXIT on/off.  Sets a flag to prevent automatically dropping 
+;      back to CPM after a command tail has been "done".  No other use.
+noexit:        call    cfmcmd          ;[MF]Get a "confirm" in case here via STAY
+       xra     a
+       sta     nexitf          ; no exit to CP/M
+       jmp     kermit
+
+;[pcc013]
+;       This is the SET LOGGING ON/OFF subcommand
+
+setlog:        call    onoff           ;[pcc013] Get on/off
+       sta     logflg          ;[pcc013] Store flag
+       jmp     kermit
+;\f
+;       This is the SET ESCAPE character subcommand.
+
+escape:        call    cfmcmd
+       lxi     d,escmes        ;Get the address of the escape message.
+       call    prtstr
+       mvi     c,conin         ;Get the char.
+       call    bdos
+       sta     escchr          ;Store the new escape character.
+       jmp     kermit
+
+;       This is the SET LOCAL-ECHO subcommand.
+
+locall:        call    onoff           ;Get on/off setting [Toad Hall]
+       sta     ecoflg          ;Store local echo flag.
+       jmp     kermit
+
+;       This is the SET PRINTER ON/OFF subcommand
+
+setprn:        call    onoff           ;Get on/off setting [Toad Hall]
+       sta     prnflg          ;Store printer flag
+       jmp     kermit
+
+;       This is the SET DEBUG ON/OFF subcommand
+
+setdbg:        call    onoff           ;Get on/off setting [Toad Hall]
+       sta     dbgflg          ;Store debug flag
+       jmp     kermit
+
+;[jd] this is the SET TIMER subcommand
+
+settim:        call    onoff           ;Get on/off setting [Toad Hall]
+       sta     timflg          ;Store timer flag value
+       jmp     kermit
+
+;This is the SET FILE-WARNING subcommand
+
+filwar:        call    onoff           ;Get on/off setting [Toad Hall]
+       sta     flwflg          ;Store file-warning flag.
+       jmp     kermit
+
+;[MF]This is the SET COLLISION subcommand
+;[MF]First, the requisite tables:
+;
+coltab:        db      4               ;[MF]4 entries
+       db      6,'BACKUP$',02h,02h
+       db      7,'DISCARD$',03h,03h
+       db      9,'OVERWRITE$',00h,00h
+       db      6,'RENAME$',01h,01h
+;
+colhlp:        db      cr,lf,'BACKUP (rename) existing files'
+       db      cr,lf,'DISCARD new versions of existing files'
+       db      cr,lf,'OVERWRITE existing files'
+       db      cr,lf,'RENAME new versions of existing files'
+       db      '$'
+;
+;[MF]Now the routine proper
+;
+setcol:        lxi     d,coltab        ;[MF]Table address
+       lxi     h,colhlp        ;[MF]Help address
+       call    chkkey          ;[MF]Get user's answer
+       sta     flwflg          ;[MF]and remember it
+       jmp     kermit          ;[MF]Back to main loop
+
+;[10] This is the SET FLOW-CONTROL subcommand.
+setflo:        call    onoff           ;is it on or off
+       sta     floctl          ; store flow contol flag
+       jmp     kermit
+
+;[10] SET CASE-SENSITIVE on or off
+;setcase:      
+;      call    onoff           ; set it on or off
+;      sta     casens          ; save it
+;      jmp     kermit
+
+; SET FILE-SIZE on or off.  If on, then show file size during DIR
+;
+hidef: call    onoff           ; see if on or off
+       sta     hidefs
+       jmp     kermit
+
+;\f
+;       This is the SET IBM command.
+;
+;      If SET IBM ON, we should do
+;              1)  Flow Control = off
+;              2)  Parity = mark
+;              3)  Local echo = on
+;              4)  Timer = on
+;
+;      If SET IBM OF, we should assume (& do)
+;              1)  Flow control = off (default)
+;              2)  Parity = none
+;              3)  Local Echo = off
+;              4)  Timer = off
+
+
+ibmset:        call    onoff           ;Get on/off setting [Toad Hall]
+       sta     ibmflg          ;Store IBM flag.
+       ora     a               ;Is it turned on?
+       jz      ibmst1          ;If not, set parity to the default.
+;
+; SET IBM ON code
+       mvi     a,ibmpar        ;Get the IBM parity.
+       sta     parity
+       mvi     a,1             ;Set local echo on.
+       sta     ecoflg
+       sta     timflg          ; also set timer on
+       xra     a               ; no flow control
+       sta     floctl
+       jmp     ibmst2          ; exit
+;
+; SET IBM OFF code
+
+ibmst1:        mvi     a,defpar        ; set default parity (none)
+       sta     parity
+       xra     a               ;Set local echo off.
+       sta     ecoflg
+       sta     timflg          ;[jd] timer is same as local echo
+       sta     floctl          ;[obs] set flow control off
+ibmst2:        jmp     kermit          ; exit from here
+
+;\f
+;       SET FILE-MODE command.
+;[OBS] assume only ascii and binary, no default.
+
+setcpm:        lxi     d,typtab
+       lxi     h,typhlp
+       call    chkkey          ;Get and confirm keyword, or die trying
+       sta     cpmflg          ;Set the CPM flag.
+       jmp     kermit
+
+typtab:        db      3               ;Three entries, now two entries
+                               ;[MF]Now 3 again!
+       db      5, 'ASCII$',    01H,01H
+       db      6, 'BINARY$',   02H,02H
+       db      7, 'DEFAULT$',  00H,00H ; Default
+
+typhlp:        db      cr,lf,'ASCII    BINARY  DEFAULT'
+       db      '$'
+;
+;setinc - Set Incomplete-file [MF]
+;
+setinc:        lxi     d,inctab        ;[MF]Point to tables
+       lxi     h,inchlp        ;[MF]...
+       call    chkkey          ;[MF]Get user's answer or croak
+       sta     incflg          ;[MF]Remember the answer
+       jmp     kermit          ;[MF]We are done.
+;
+inctab:        db      2               ;two entries
+       db      7,'DISCARD$'
+       db      00h,00h         ;Discard incomplete files
+       db      4,'KEEP$'
+       db      01h,01h         ;Keep incomplete files
+;
+inchlp:        db      cr,lf,'DISCARD  KEEP'
+       db      '$'
+
+;       This is the SET PARITY subcommand.
+
+parset:        lxi     d,partab
+       lxi     h,parhlp
+       call    chkkey          ;Get and confirm keyword, or die trying
+       sta     parity          ;Set the parity flag.
+       jmp     kermit
+
+partab:        db      5               ;Five entries.
+       db      4, 'EVEN$',     parevn,parevn
+       db      4, 'MARK$',     parmrk,parmrk
+       db      4, 'NONE$',     parnon,parnon
+       db      3, 'ODD$',      parodd,parodd
+       db      5, 'SPACE$',    parspc,parspc
+
+parhlp:        db      cr,lf,'EVEN     MARK    NONE    ODD     SPACE$'
+
+;       This is the SET TACTRAP subcommand.
+;       options are ON, OFF, or CHARACTER.  (for CHARACTER, we request the
+;       new TAC Intercept character, and turn the TACtrap on)
+
+settac:        lxi     d,tactab
+       lxi     h,tachlp
+       call    chkkey          ;Get and confirm keyword
+       ora     a               ;Was it "OFF" (zero)?
+       jz      settc2          ;If so, go disable TACtrap.
+       cpi     1               ;Was it "ON"?
+       jz      settc1          ;If so, go enable TACtrap.
+       lxi     d,tacmes        ;"CHARACTER". request new TAC Intercept char.
+       call    prtstr
+       mvi     c,conin         ;Get the char.
+       call    bdos
+       sta     tacchr          ;Store the new TAC Intercept character.
+settc1:        lda     tacchr          ;Copy tacchr to tacflg to enable TACtrap.
+settc2:        sta     tacflg          ;Enable/disable TACtrap
+       jmp     kermit
+
+tactab:        db      3               ;Three entries.
+       db      9,      'CHARACTER$',   02H,02H
+       db      3,      'OFF$',         00H,00H
+       db      2,      'ON$',          01H,01H
+
+tachlp:        db      cr,lf,'ON to enable TAC trap'
+       db      cr,lf,'OFF to disable TAC trap'
+       db      cr,lf,'CHARACTER to enable TAC trap and'
+       db      ' specify intercept character$'
+
+;       This is the SET VT52-EMULATION subcommand.
+; Now SET TERMINAL xxx
+;vt52em:       lda     vtflg           ;get the flag value
+;      cpi     0ffH            ;0ffH means not allowed -
+;      jz      notimp          ; say it's not implemented.
+;      call    onoff           ;Get keyword (ON or OFF)
+;      sta     vtflg           ;Set the VT52 emulation flag.
+;      jmp     kermit
+vt52em:        lxi     d,sttert        ; set terminal type
+       lxi     h,stterh        ; help table
+       call    chkkey          ; get it
+       mov     a,d             ; value returned in DE
+       cpi     vtdefe          ; was it selecting an external terminal?
+       jnz     vt52e1          ; no, so save new value
+       lhld    extern+1        ; if external, lets see if one is in place
+       mov     a,h
+       ora     l
+       mvi     a,vtdefe        ; restore external flag
+       jnz     vt52e1          ; we have one, so we can save value
+       call    prcrlf
+       lxi     d,inms11        ; load up sorry message
+       call    prtstr
+       jmp     kermit
+
+vt52e1:        cpi     40h             ; are we to have a quiet display?
+       jnz     vt52e2
+       sta     quietd          ; store it
+       jmp     kermit
+
+vt52e2:        cpi     80h             ; are we to be a noisy display?
+       jnz     vt52e3
+       xra     a
+       sta     quietd
+       jmp     kermit
+
+vt52e3:        sta     vtflg           ; else save new set parameter..
+       jmp     kermit          ; and exit
+
+; tabe with string entry, and the returned value as two identical bytes.
+sttert:        db      6               ; six types
+       db      4,'DUMB$',vtdefd,vtdefd         ; assume our terminal is thick
+       db      8,'EXTERNAL$',vtdefe,vtdefe     ; assume off, but terminal is in dep. code
+       db      5,'QUIET$',40h,40h              ; display quiet
+       db      7,'REGULAR$',80h,80h            ; display loud
+       db      3,'OFF$',vtdefo,vtdefo          ; assume our terminal does everything
+       db      4,'VT52$',vtdefv,vtdefv         ; VT52 as before
+
+stterh:        db      cr,lf,'DUMB - only printable characters passed to terminal'
+       db      cr,lf,'EXTERNAL - with emulation code system specific'
+       db      cr,lf,'OFF - all characters passed to terminal'
+       db      cr,lf,'QUIET - display nothing during transfers'
+       db      cr,lf,'REGULAR - normal display for transfers'
+       db      cr,lf,'VT52 - assume Kermit can emulate a VT52'
+       db      '$'
+
+;\f
+;       Note:  For the SET BAUD and SET PORT commands, which might not be
+;       supported for the current system, the command tables are stored in
+;       the overlay.  We locate them through pointers in the linkage area:
+;       spdtab for SET BAUD, prttab for SET PORT.  The contents of spdtab
+;       (or prttab) is the address of the beginning of the table (the table
+;       does NOT begin at spdtab).  If the address is zero, the command is
+;       not supported.  If the table address is nonzero, then there is a
+;       corresponding help message pointed to by (NOT starting at) spdhlp
+;       or prthlp.
+
+;       This is the SET BAUD command
+
+baud:  lhld    spdtab          ; get pointer to speed table
+       mov     a,h
+       ora     l               ; test for NULL (zero)
+       jz      notimp          ; if so, say it's not implemented
+       xchg            ; move speed table address to DE
+       lhld    spdhlp          ; get pointer to speed help text
+       call    keycmd
+       push    d               ; save selected speed
+       call    cfmcmd          ; confirm...
+       pop     h               ; restore speed to HL
+       shld    speed           ; save all 16 bits of speed value
+       xchg            ; move speed to DE
+       call    sysspd          ; do system-dependent speed setting.
+       jmp     kermit          ; return to command level
+
+;       This is the SET PORT command
+
+prtset:        lhld    prttab          ; get pointer to port table
+       mov     a,h
+       ora     l               ; test for NULL
+       jz      notimp          ; not supported if pointer was null.
+       xchg            ; move port table address to DE
+       lhld    prthlp          ; get pointer to port help text
+       call    keycmd
+       push    d               ; save selected port entry
+       call    cfmcmd          ; confirm...
+       pop     h               ; restore table address to HL
+       shld    port            ;[hh] save all 16 bits of port value
+       call    sysprt          ; go do port stuff
+       jmp     kermit
+;\f
+;       Subroutines for SET subcommands
+
+;       ontab - command table for onoff.
+;       onhlp - help text for onoff.
+;       onoff - accept "ON" or "OFF" keyword.
+;       returns:
+;          success: value in A (non-zero = ON)
+;          error: no return to caller. print error message and return to
+;               main loop.
+ontab: db      2               ;Two entries.
+       db      3, 'OFF$',      00H,00H
+       db      2, 'ON$',       01H,01H
+
+onhlp: db      cr,lf,'OFF      ON$'
+
+onoff: lxi     d,ontab
+       lxi     h,onhlp
+       ;Fall through to check input.  [Toad Hall]
+
+;       chkkey - parse and confirm keyword.
+;       called with:
+;          DE/ address of keyword table
+;          HL/ address of help text
+;       returns:
+;          success: low byte of keyword value (from table) in A.
+;          error: no return to caller.  print error message and return to
+;               main loop.  (Since the main loop reloads the stack pointer,
+;               we don't have to attempt to clean up the stack here)
+
+chkkey:        call    keycmd          ; Parse a keyword (might not return)
+       sta     temp1           ; Save the parsed value
+       call    cfmcmd          ; Request confirmation (might not return)
+       lda     temp1           ; Get saved value
+       ret             ; Return
+
+;[hh]   fndkyw - find a keyword string from a table using 
+;               it's associated value
+;       called with:
+;          HL/ address of keyword table
+;           A/ value associated with keyword string
+;       returns:
+;          success: HL points to first byte of keyword string
+;                   CY flag is cleared
+;          error:   HL points to error string (?Not found)
+;                   CY flag is set
+
+fndkyw:        mov     d,m             ;get count of entries
+       inx     h               ;advance over count value
+fndkw1:        mov     b,m             ;get string length
+       inr     b               ;account for $
+       inx     h               ;advance over length value
+       shld    temp1           ;save string pointer
+fndkw2:        inx     h               ;loop over string
+       dcr     b
+       jnz     fndkw2
+       mov     c,m             ;get keyword value from table
+       cmp     c               ;do they match?
+       jz      fndkw3          ;Yup
+       inx     h               ;bump to next keyword
+       inx     h               ;
+       dcr     d               ;decrement entry count
+       jnz     fndkw1          ;check the remaining keywords
+       lxi     h,kywdnf        ;point to not found message
+       stc             ;give calling routine a not found flag
+       ret
+fndkw3:        ora     a               ;clear CY to tell caller we succeeded
+       lhld    temp1           ;restore the saved string pointer
+       ret
+
+kywdnf:        db      cr,lf,'?Not found$'     ;not found message
+
+;\f
+;       This is the SHOW command.
+
+show:  call    cfmcmd
+;* Reconcile this and status.
+       call    clrtop          ;[hh] Clear screen first
+       call    stat01          ;For now just cop out.
+       jmp     kermit
+
+;       This is the STATUS command.
+
+status:        call    cfmcmd
+       call    clrtop          ;[hh] Clear screen first
+       call    stat01
+       jmp     kermit
+
+;       processor for SHOW, STATUS and <escape>S commands
+;       called by: show, status, intchr
+
+stat01:        lda     fileio          ;Are we in transmit?
+       ora     a
+       jz      sta01b          ;No
+       lxi     d,xmtst         ;Yes,say so
+       call    prtstr
+
+;       The following block of code - down to RET - re-ordered by  [DJR]
+;       DJR January 1987 to get SHOW/STATUS output in the same     [DJR]
+;       (alphabetical) order as SET's HELP.                        [DJR]
+sta01b:
+       call    stautr          ;[MF]Show AUTORECEIVE state
+        call    stabcc          ; Tell current block check type
+        call    stabsz          ; Tell user about multi-sector buffers
+       call    stacol          ;[MF]COLLISION state
+        call    stadbg          ; [DJR] Debug mode
+        call    stacurd         ; [DJR] Current disk
+        call    stahfs          ; Tell user if file sizez are hidden during DIR
+        call    staesc          ; Tell current escape character
+        call    stafil          ; Tell about file type
+        call    staflo          ;[10] Tell about flow control
+        call    staibm          ; Tell about IBM flag
+       call    stainc          ;[MF]Tell about incomplete file disposition
+;
+; Ask user to press a key before continuing
+;
+       call    pausit          ; wait for a while till user presses a key
+;
+        call    staeco          ; Tell about local echo flag
+        call    stalog          ; [pcc003] Tell about log file status
+       call    stapar          ; Tell about parity
+        lhld    prttab          ;[hh] Got a port table? (is pointer nonzero?)
+        mov     a,h             ;[hh]
+        ora     l               ;[hh]
+        cnz     stapor          ;[hh] If so, tell which port we're using
+        call    stalpt          ; Tell about printer copy flag
+       call    starps          ;[MF]Show receive packet length
+        call    starsp          ;[gnn] tell rec. start-of-pkt char
+       call    stasps          ;[MF]Show send packet length
+        call    stassp          ;[gnn] tell send start-of-pkt char
+        lhld    spdtab          ; Got a speed table? (is pointer nonzero?)
+        mov     a,h
+        ora     l
+        cnz     staspd          ; If so, tell what speed we're running.
+        call    statac          ; Tell about TAC flag/intercept character.
+        call    statim         ; Tell about timer flag
+        call   stusr           ;[7] Tell about user
+        call   statvt          ; Tell about what emulation we are doing
+        call    stawrn          ; Tell about file-warning flag
+        ret
+
+;      stautr - Show Autoreceive setting [MF]
+;
+stautr:        lxi     d,autrst        ;[MF]Point to "Autoreceive" string
+       call    prtstr          ;[MF]and print it
+       lda     autorc          ;[MF]Get Autoreceive flag
+       jmp     staton          ;[MF]Say "on" or "off" and return
+
+;       Show the value of the LOCAL-ECHO flag (On or Off).
+
+staeco:        lxi     d,locst         ;Get the address of the local echo string.
+       call    prtstr
+       lda     ecoflg          ;Get the local echo flag.
+       jmp     staton          ;Say ON or OFF, and return
+
+;       Show the value of the VT52-EMULATION flag (On, Off, or Not Supported).
+;      Also show terminal display mode (regular, quiet)
+
+statvt:        lxi     d,vtdpst        ;[MF]Get address of terminal display string
+       call    prtstr          ;[MF]Print it
+       lxi     d,vtdpsr        ;[MF]Assume a regular (loud) display
+       lda     quietd          ;[MF]Get "quiet" flag
+       ora     a               ;[MF]a quiet display?
+       jz      statva          ;[MF]No, print "regular" message
+       lxi     d,vtdpsq        ;[MF]Yes, point to "quiet" string
+statva:        call    prtstr          ;[MF]and print it
+       lxi     d,vtemst        ; Get the address of the VT52 emulation string.
+       call    prtstr
+       lda     vtflg           ; Get the VT52 emulation flag.
+       cpi     0ffh            ; isterminal emulation possible?
+       jnz     statv0          ; yes, maybe
+       lxi     h,inms11        ; ... no, load up not implemented message ...
+       jmp     prvtv           ; so tell user
+
+
+statv0:        mov     c,a             ; save it to C
+       lxi     h,sttert        ; get table listing what we can do
+       mov     b,m             ; get number of terminal types to b
+statv1:        inx     h               ; point to first entry
+       mov     e,m             ; get length of entry
+       mvi     d,0
+       inx     h               ; point to text part of entry
+       xchg            ; save address in de
+       dad     d               ; start + length
+       inx     h               ;... + 1 for the dollar...
+       inx     h               ; plus point to seconcd copy of ter. type value
+       cmp     m               ; is it the one we want?
+       jz      prvtv           ; yes, then print the terminal type value
+       dcr     b               ; have we completed?
+       rz              ; yes, then just exit back to status
+       jmp     statv1          ; else try next entry.  HL points to next -1
+
+prvtv: jmp     prtstr          ; print string from DE
+                               ;[MF]and return
+
+;       Show the value of the FILE-MODE flag (ASCII, Binary, or Default).
+
+stafil:        lxi     d,cpmst         ; Get the address of the file mode message.
+       call    prtstr
+       lda     cpmflg          ; Get the file mode flag.
+       lxi     d,defstr        ; Assume Default (0).
+       ora     a               ; Is it?
+       jz      prtstr          ; If so, say so, and return.
+       lxi     d,ascstr        ; Not default, assume ASCII
+       cpi     1               ; Is it ASCII?
+       jz      prtstr          ; Say ASCII, and return
+       lxi     d,binstr        ; Not default or ASCII, must be binary
+       jmp     prtstr          ; Print type, and return.
+;
+;Show current disposition for incomplete files [MF]
+;
+stainc:        lxi     d,incst         ;[MF]Announce what's to be shown
+       call    prtstr          ;[MF]...
+       lxi     d,dscstr        ;[MF]Assume "discard"
+       lda     incflg          ;[MF]Get flag
+       ora     a               ;[MF]Really discarding incomplete files?
+       jz      prtstr          ;[MF]Yes, say so and return
+       lxi     d,kepstr        ;[MF]No, say we're keeping incomplete files
+       jmp     prtstr          ;[MF]and return
+
+;       show if file sizes are hidden during DIR (Would have thought this
+;       obvious, but its in for completeness
+stahfs:        lxi     d,hfsod         ; get hide file size on dir
+       call    prtstr
+       lda     hidefs
+       jmp     staton          ; say if on or off
+
+;       Show the value of the IBM-MODE flag (On or Off).
+
+staibm:        lxi     d,ibmst         ;IBM string.
+       call    prtstr
+       lda     ibmflg          ; Get IBM flag.
+       jmp     staton          ; Print its value and return
+
+;       Show the value of the FILE-WARNING flag (On or Off).
+
+stawrn:        lxi     d,filst         ; File warning string.
+       call    prtstr
+       lda     flwflg          ; File warning flag.
+       jmp     staton          ; Say ON or OFF
+
+;       Show the value of the PRINTER flag (On or Off).
+
+stalpt:        lxi     d,prst          ;Printer copy string
+       call    prtstr
+       lda     prnflg          ;Printer ON/OFF flag
+       jmp     staton          ; Say ON or OFF
+
+
+;       Show status of log file
+stalog: lxi     d,logst         ;[pcc003] Logging lead-in message
+        call    prtstr          ;[pcc003]
+;       name of logging file
+;   Code derived from [JD's] code for GET, and uses his FNBUF  [DJR]
+        lxi    d,fnbuf         ;[DJR] point to destination
+        lxi    h,lognam        ;[DJR] source of filespec
+        mov    a,m             ;[DJR] get drive byte
+        ora    a               ;[DJR] zero = default disc
+        jnz    stalg1          ;[DJR] if drive has been specified
+        lda    curdsk          ;[DJR]  otherwise get the default
+stalg1: adi    'A'-1           ;[DJR] make it printable
+        stax   d               ;[DJR] into dest block
+        inx    d               ;[DJR]
+        mvi    a,':'           ;[DJR] colon after drive
+        stax   d               ;[DJR] 
+        inx    d               ;[DJR] 
+
+        mvi    c,8             ;[DJR] length of name part
+        lxi    h,lognam+1      ;[DJR] start of name
+        mvi    b,0             ;[DJR] first-time-thru flag
+stalga: mov    a,m             ;[DJR] get a char from the name
+        inx    h               ;[DJR] pass it
+        cpi    ' '             ;[DJR] end of this part of name?
+        jz     stalgb          ;[DJR] yes, skip rest...
+        stax   d               ;[DJR] else drop char into dest
+        inx    d               ;[DJR] increment dest ptr
+        dcr    c               ;[DJR] decrement count
+        jnz    stalga          ;[DJR] and continue if more to go
+
+stalgb: mov    a,b             ;[DJR]
+        ora    a               ;[DJR] first time thru?
+        jnz    stalgc          ;[DJR] no, no period
+        mvi    a,'.'           ;[DJR] period between parts
+        stax   d               ;[DJR] 
+        inx    d               ;[DJR] 
+        mvi    b,0ffh          ;[DJR] not first time thru anymore
+        mvi    c,3             ;[DJR] length of ext part
+        lxi    h,lognam+9      ;[DJR] start of extension
+        jmp    stalga          ;[DJR] keep copying
+
+stalgc: mvi    a,'$'
+        stax   d               ;[DJR] end the name string
+        lxi    d,fnbuf         ;[DJR] Print the file name
+        call   prtstr          ;[DJR]
+
+       lxi    d,logst2        ;[DJR] second part of message
+        call   prtstr          ;[DJR]
+
+;      Show status of logging
+       lda     logflg          ;[pcc003] get the flag
+       ani     7FH             ;[pcc003] ignore open flag
+       cpi     2               ;[pcc003] is it suspended?
+       jnz     staton          ;[pcc003] no, must be on or off
+       lxi     d,susstr        ;[pcc003] suspended
+       jp      prtstr          ;[pcc003] print and return
+
+;       Show the value of the PARITY flag (Odd, Even, Mark, Space, or None).
+
+stapar:        lxi     d,parst         ;Parity string.
+       call    prtstr
+       lda     parity          ;Get the parity setting.
+       lxi     d,pnonst        ;Assume parity is NONE
+       cpi     parnon          ;Were we right?
+       jz      prtstr          ;Yep, go say None, and return
+       lxi     d,pmrkst        ;Get ready to say Mark
+       cpi     parmrk          ;Is it mark?
+       jz      prtstr          ;Yep, go say Mark, and return
+       lxi     d,pspcst        ;Get ready to say Space
+       cpi     parspc          ;Is it space?
+       jz      prtstr          ;Yep, go say Space, and return
+       lxi     d,poddst        ;Get ready to say Odd
+       cpi     parodd          ;Is it odd?
+       jz      prtstr          ;Yep, go say Odd, and return
+       lxi     d,pevnst        ;Must be Even.
+       jmp     prtstr          ;Say Even, and return.
+
+; [gnn] Show start of packet characters
+stassp:        lxi     d,sspmsg        ;message of send s-o-p
+       call    prtstr
+       lda     sndsop
+       adi     'A'-1           ;convert to printable character
+       mov     e,a
+       mvi     c,conout
+       jmp     bdos            ;and print it
+starsp:        lxi     d,rspmsg        ;rec. s-o-p message
+       call    prtstr
+       lda     rcvsop
+       adi     'A'-1           ;convert to printable character
+       mov     e,a
+       mvi     c,conout
+       jmp     bdos            ;and print it
+;
+;[MF]Show receive packet length
+;
+starps:        lxi     d,rpsmsg        ;[MF]Point to message
+       call    prtstr          ;[MF]and print it
+       lda     rpsiz           ;[MF]Get receive packet length
+       mov     l,a             ;[MF]Put in HL
+       mvi     h,0             ;[MF]...
+       jmp     nout            ;[MF]Print receive packet length in decimal
+;
+;[MF]stasps - Print send packet length
+;
+stasps:        lxi     d,spsmsg        ;[MF]Point to message
+       call    prtstr          ;[MF]and print it
+       lda     spsiz           ;[MF]Get send packet length
+       mov     l,a             ;[MF]into HL
+       mvi     h,0             ;[MF]...
+       jmp     nout            ;[MF]and print in decimal
+
+;[hh]   Show the current port (if known).
+
+stapor:        lxi     d,porst         ;[hh]
+       call    prtstr          ;[hh]
+       lda     port            ;[hh] Get current port value
+       lxi     h,spdust        ;[hh] Assume undefined (this error msg is fine)
+       cpi     0FFH            ;[hh] Is it?
+       jz      stat73          ;[hh] Yup. Say so
+       lhld    prttab          ;[hh] Address of port keyword table
+       call    fndkyw          ;[hh] Look for correct keyword string
+       jnc     stpr1           ;[hh] Found a match
+       lxi     h,spdust        ;[hh] No match found - say it's undefined
+stpr1: jmp     stat73          ;[hh] Print it and return
+
+;       Show the current line speed (if known).
+
+staspd:        lxi     d,spdst
+       call    prtstr
+       lda     speed           ;Get current speed.
+       lxi     h,spdust        ;Assume undefined.
+       cpi     0FFH            ;Is it?
+       jz      stat73          ;Yes.
+       lhld    spdtab          ;Start scanning keyword table.
+       mov     d,m             ; get count of entries
+       inx     h               ; advance over it.
+stat70:        mov     b,m             ;Get string length.
+       inr     b               ;Account for $.
+       inx     h
+       shld    temp1           ;Save string pointer.
+stat71:        inx     h               ;Loop over string.
+       dcr     b
+       jnz     stat71
+       mov     c,m             ;Get speed value
+       cmp     c               ;Match?
+       jz      stat72          ;Yes.
+       inx     h               ;Bump to next keyword.
+       inx     h
+       dcr     d               ; decrement entry count
+       jnz     stat70          ; if more left, check them.
+       lxi     h,spdust        ; can't find it. say it's undefined.
+       jmp     stat73          ; print the message.
+
+stat72:        lhld    temp1           ;Restore saved string pointer.
+       xchg            ;[MF] Set into DE for display
+       call    prtstr          ;[MF] Print speed
+       lxi     h,spdst2        ;[MF] Point to "bps" message
+stat73:        xchg            ;Set into DE for display.
+       jmp     prtstr          ; print it, and return.
+
+;       Show the current BLOCK-CHECK-TYPE (1-, 2-, or 3-character).
+
+stabcc:        lxi     d,bckst         ;Get the string
+       call    prtstr          ;Print "Block check type: "
+       lda     chktyp          ;Get the type (character 1, 2, or 3)
+       mov     e,a             ;Put into E
+       mvi     c,conout        ;Want to print it
+       call    BDOS            ;Do so
+       lxi     d,bckst1        ;Get rest of text ("-character")
+       jmp     prtstr          ;Print it and return
+;
+;[MF]stacol - Print "SET COLLISION" state
+;
+stacol:        lxi     d,collst        ;[MF]Get message
+       call    prtstr          ;[MF]Print it
+       lxi     h,coltab        ;[MF]Point to COLLISION keywords
+       lda     flwflg          ;[MF]Get COLLISION state
+       call    fndkyw          ;[MF]Get COLLISION state
+                               ;[MF](Since user doesn't control flwflg
+                               ;[MF]directly, no need to check for errors
+       xchg            ;[MF]Prepare for printing
+       jmp     prtstr          ;[MF]Print COLLISION state and return
+
+;       Print the current escape character
+
+staesc:        lxi     d,escst         ;Escape string.
+       call    prtstr
+       call    escpr           ;Print the escape char.
+;      jmp     prcrlf          ;removed [DJR] Print CR/LF and return  [Toad Hall]
+       ret             ;[DJR] added
+
+;       Show number proportion of buffers used in multiple sector buffering
+stabsz:        lxi     d,bufsz1
+       call    prtstr          ; do first bit of string
+       lxi     h,0
+       lda     bufsec
+       mov     l,a             ; get size used...
+       call    nout            ;... to screen
+       lxi     d,bufsz2        ; and then say max value
+       call    prtstr
+       lxi     h,0
+       lda     maxbsc          ; get max for this system
+       mov     l,a
+       call    nout            ;.. thence to screen
+;      jmp     prcrlf          ; removed [DJR] cr lf and out
+       ret             ;[DJR]
+
+;
+;       Show the value of the TIMER flag
+statim:        lxi     d,timmsg        ;[jd] 
+       call    prtstr          ;[jd] 
+       lda     timflg
+       jmp     staton          ;Tell whether it's on or off.
+
+;       Show internal versions (edit strings)
+shover:        call    cfmcmd
+       call    prcrlf
+       lxi     d,version       ;[MF]Point to Kermit version
+       call    prtstr          ;[MF]and show it
+       lxi     d,modmsg        ;[MF]Continue the message
+       call    prtstr          ;[MF]...
+       call    prcrlf          ;[MF]End the line
+       lxi     h,vertab        ; Get address of version list
+shovr1:        mov     e,m             ; Get next word from list
+       inx     h
+       mov     d,m             ; Next version string is in DE
+       inx     h
+       mov     a,d             ; Test for zero (end of list)
+       ora     e
+       jz      shovr2          ; Done with list if zero
+       push    h               ; Save position in list
+       call    prtstr          ; Not zero.  Print it.
+       call    prcrlf          ; Follow with crlf
+       pop     h               ; Restore position in list
+       jmp     shovr1          ;  and go see if there are any more.
+
+shovr2:        lhld    ovlver          ; Get overlay version string
+       xchg            ;  into DE
+       call    prtstr          ; Print it
+       call    prcrlf          ; Output crlf
+       lhld    family          ;[11] New entry in overlay.  Get string of 
+       xchg            ;[11]  family of machines (eg apple) and  print
+       call    prtstr          ;[11]  it.  For "common" m/c do a $ only.
+       jmp     kermit          ; Return to main loop.
+
+; table of pointers to version strings.
+vertab:        dw      mitver          ; CPSMIT
+       dw      comver          ; CPSCOM
+       dw      pk1ver          ; CPSPK1
+       dw      pk2ver          ; CPSPK2
+       dw      remver          ; CPSREM
+       dw      server          ; CPSSER
+       dw      ttver           ; CPSTT
+       dw      cpmver          ; CPSCPM
+       dw      wldver          ; CPSWLD
+       dw      cmdver          ; CPSCMD
+       dw      utlver          ; CPSUTL
+       dw      datver          ; CPSDAT
+       dw      0               ; end of list
+
+;       Show TACTrap status (On or Off, and intercept character)
+statac:        lxi     d,tacst         ;"Current TACTrap status/char: "
+       call    prtstr
+       lxi     d,offstr        ;Assume set off
+       lda     tacflg          ;Get the TACTrap char/flag
+       ora     a               ;Is it off?
+       jz      prtstr          ;Yep, go print OFF...
+       mvi     c,conout        ;Display...
+       mov     e,a             ;...the current intercept char
+       call    bdos
+       jmp     prcrlf
+
+;       Show if flow control is set on or off
+staflo:        lxi     d,flost         ; Flow control string
+       call    prtstr
+       lda     floctl          ; get the flag
+       jmp     staton
+
+;       Show if Case sensitvity is on or off
+;stasens:
+;      lxi     d,senst         ; case sensitivity string
+;      call    prtstr          ;
+;      lda     casens
+;      jmp     staton          ; say if its on or off
+
+
+;       Show the current user. (Should do this under directory...)
+stusr:
+       mvi     c,usrcod
+       mvi     e,0ffh          ;[9] get the current user
+       call    bdos
+       mov     l,a             ;[9] print hl as a number...
+       mvi     h,0
+       push    h               ;[9] got the user number
+       lxi     d,usrst         ;[9] tell the user number
+       call    prtstr
+       pop     h               ;[9] now do number
+       call    nout            ;[6] using routine for writing packet nos.
+       ret
+
+;
+;
+;       [DJR] Show debug mode
+stadbg:
+        lxi     d,dbgst         ;[DJR] Display string
+        call    prtstr          ;[DJR]
+        lda     dbgflg          ;[DJR] load flag
+        jmp     staton          ;[DJR]
+
+
+;       [DJR] Show default disk
+stacurd:
+        lxi     d,curdst        ;[DJR]
+        call    prtstr          ;[DJR]
+        lda     curdsk          ;[DJR]
+        adi     'A'-1           ;[DJR]
+        mov     e,a             ;[DJR]
+        mvi     c,conout        ;[DJR]
+        jmp     bdos            ;[DJR]
+
+;
+;       Display current state of a boolean flag.
+;       called with A/ value (zero = Off, non-zero = On)
+
+staton:        lxi     d,onstr         ; Assume it's on.
+       ora     a               ; Is it on?
+       jnz     prtstr          ; If so, say so, then return.
+       lxi     d,offstr        ; No, say off.
+       jmp     prtstr          ; Print the string, then return.
+
+;       STRING command
+;       get a string from the user and send it to the host.
+string:        mvi     a,cmtxt         ; get the text
+       lxi     d,stbuff        ; where to put it
+       call    comnd
+       jmp     kermit          ; if we cannot do it, then back to command level
+       sta     strcnt          ; save the string count
+       ana     a               ; if it is zero, then do nowt
+       jz      kermit
+       call    cfmcmd          ;[MF]Otherwise, get a "confirm"
+       call    selmdm          ; then select the modem
+       lxi     d,stbuff        ; where to get the string
+stlop: ldax    d               ; get byte
+       inx     d               ; pointer plus one
+       push    d               ; update pointer, and save de, and the character
+       call    setpar          ; set whatever parity
+       mov     e,a             ; outmdm wants character in e
+       call    outmdm          ; send character in a to line
+       pop     d
+       lda     strcnt          ; get the count
+       dcr     a
+       sta     strcnt          ; less one
+       jnz     stlop           ; else still looping
+       call    selcon          ; re-select the console
+       jmp     kermit
+
+;       Print "(not implemented)".
+;       here from vt52em, baud, prtset, stavt
+
+notimp:        lxi     d,inms12        ; Say it's not implemented.
+       call    prtstr
+       jmp     kermit          ; Return to main loop.
+
+; Little code to allow some expansion of code without changing
+;  every futher address, only up to the end of this file.
+;   TO BE REMOVED FRO RELEASE!
+
+;      org ($+100h) AND 0FF00H
+
+IF lasm                                ; If using LASM, chain to the next file.
+       LINK    CPSPK1          ;[obs] break down them big files...
+ENDIF;lasm
diff --git a/cpscpm.asm b/cpscpm.asm
new file mode 100644 (file)
index 0000000..49df54f
--- /dev/null
@@ -0,0 +1,932 @@
+; CPSCPM.ASM
+;       KERMIT - (Celtic for "FREE")
+;
+;       This is the CP/M-80 implementation of the Columbia University
+;       KERMIT file transfer protocol.
+;
+;       Version 4.0
+;
+;       Copyright June 1981,1982,1983,1984
+;       Columbia University
+;
+; Originally written by Bill Catchings of the Columbia University Center for
+; Computing Activities, 612 W. 115th St., New York, NY 10025.
+;
+; Contributions by Frank da Cruz, Daphne Tzoar, Bernie Eiben,
+; Bruce Tanner, Nick Bush, Greg Small, Kimmo Laaksonen, Jeff Damens, and many
+; others. 
+;
+;       This file duplicates the CP/M DIR and ERA functions so we don't have
+;       to exit.
+;
+; revision history:
+;
+;edit 14, 1-Apr-1991 by MF. Correct a bug which crept in with edit 13 which
+;      caused any control-key other than ^Y or ^Z to act like ^X after a key
+;      had been depressed to halt output of the TYPE/PRINT commands.
+;edit 13, 25-Mar-1991 by MF. Make the TYPE command always abort to Kermit
+;      command-level if ^C is entered on the console even if multiple files
+;      are being typed via wild-cards. Make ^X typed on the console abort
+;      typeout of the current file and begin typeout of the next file,
+;      if any, otherwise go back to Kermit command-level.
+;      The foregoing also applies to the PRINT command.
+;edit 12, 14-Feb-1991 by MF. Call "clrtop" in TYPE command at "type1"
+;      rather than sending a <ff> directly to the terminal as some
+;      terminals don't respond to <ff> characters. Thus the screen will be
+;      cleared (if the terminal allows) before each file is typed.
+;      Also use "getfil" rather than the bdos "openf" call to open
+;      files for typing (label "type2"). This tightens up the code.
+;      Zero "fcbcnt" before starting to type files (label "type0b").
+;      This apparently fixes a phantom bug which caused incorrect lookup (and
+;      hence garbage typeout) of files occassionally after a new disk
+;      was inserted and a SET DEFAULT-DISK was performed to reset the disk
+;      system. (It looked like parts of other files were being typed, as
+;      if the directory had been misread or had not been reset.)
+;edit 11, 8-Feb-1991 by MF. Cause the bdos call for direct console input
+;      in "ckchr" **not** to go thru the bdos trap but to call bdos at 0005h
+;      directly. This corrects a bug wherein if commands such as INPUT
+;      (which check to see if a keyboard key has been pressed) were executed
+;      from a TAKE-file, the character following the terminator of such
+;      commands was being interpreted as that keyboard input, thus causing
+;      the next command in the TAKE-file to be unrecognized since its
+;      first character had been eaten as a result of the keyboard check.
+;      This bug **may** be the cause of a report received by Dr. Martin
+;      J. Carter of Nottingham University in the U.K. in which Kermit
+;      was reported to have read a character beyond a command terminator
+;      in a TAKE-file, making the subsequent command unrecognizable since
+;      its first character was missing.
+;edit 10, 29-Jan-1991 by MF. Use the big buffer for TYPE/PRINT commands.
+;      Thus, edit 9 has been superseded.
+;edit 9, 29-Jan-1991 by MF. Corrected EOF check in TYPE command routine
+;      following label "type20". a READF call, if successful, gives A=0
+;      (not A=0FFH) and A not zero if failure. Thus the "INR A" instruction
+;      checking for EOF was **always** nonzero. The reason the TYPE command
+;      worked is that CP/M text files indicate the text end-of-file with a
+;      Control-Z, in which case the TYPE routine branched correctly. In
+;      other words, this edit is more for aesthetic purposes to satisfy
+;      purists than something brought about by dire necessity!
+;edit 8, 28-Jan-1991 by MF. Added code courtesy of Dr. Martin J. Carter
+;      of Nottingham University, UK, to use the big buffer for the COPY
+;      command.
+;edit 7, 18-Sep-1990 by MF.  Added RENAME routine to implement the
+;      RENAME (FRENAME) command to rename a CP/M file.
+;      Modified COPY routine to explicitly reject wild-carded filenames
+;      by using COMND function CMOFI rather than functions CMIFI and
+;      CMIFIN to get input and output filenames.
+;      Modified ERA and COPY routines to not act upon the respective
+;      commands until a "confirm" is typed.  This prevents these
+;      routines from taking off upon recognition of action characters
+;      like "?", which can be quite annoying if one is an inexperienced user.
+; edit 6, March 11, 1987 by OBSchou.  Added in the TYPE and PRINT commands
+;      Both type to the screen, print also echoes to printer.
+;
+; edit 5 20 June, 1986.  Added support for multiple file FCB buffering.
+;
+; edit 4: June 16, 1986 OBSchou at Loughborough University, UK
+;       added in a test to prevent a DIR command issued from a TAKE command
+;       being interruped by the next character in the take command buffer.
+;       Also added code for USER nn. (Well, its OS related,is it not?)
+;
+; edit 3: July 8, 1984 (CJC)
+;       Merge modifications from Toad Hall: support LASM (linked by CPSTT,
+;       links to CPSWLD), use prcrlf where appropriate.
+;
+; edit 2: June 5, 1984 (CJC)
+;       documentation and formatting; delete unused code (dir13); add module
+;       version string.
+;
+; edit 1: May, 1984 (CJC)
+;       extracted from CPMBASE.M80 version 3.9; modifications are described in
+;       the accompanying .UPD file.
+;
+cpmver:        db      'CPSCPM.ASM (14)  1-Apr-1991$'    ; name, edit number, date
+
+npl    EQU     04H     ;Number of names per line for dir command.
+
+;       This is the DIR command.  Display the name and size of all files
+;       matching the filespec.
+;       here from: kermit
+;
+;       Note: This is abstracted from Keith Peterson's DIRF.ASM
+;               directory print function.  Thanks again Keith.
+;
+;
+dir:   lxi     d,fcb           ;Where to put the data, if any.
+       mvi     a,cmifin
+       call    comnd           ;Parse a full or piece of file-spec
+       jmp     dir2            ;Didn't get a FULL file-spec
+       jmp     dir4            ;lets do it
+;
+;
+;Make FCB all '?' to match any file
+dir2:  lda     fcb
+       cpi     ' '             ;CMIFIN leaves that as ' '
+       jnz     dir2a           ;he typed at least x:
+       xra     a
+       sta     fcb             ;default drive
+dir2a: lxi     h,fcb+1
+       mvi     b,11            ;FN+FT count.
+
+dir3:  mvi     m,'?'           ;Store '?'s in FCB.
+       inx     h
+       dcr     b
+       jnz     dir3
+;Print signon message and drive name
+dir4:  call    getun           ; get current user number
+       lda     fcb
+       ora     a               ;if not zero, get default
+       jnz     dir4a
+       lda     curdsk          ;get default
+dir4a: adi     'A'-1           ;Asciize it
+       sta     dnam14+2        ;[4] add in user no, and Save it in message.
+       lda     temp1+1         ;[4] most sig. user number
+       cpi     '0'             ;[4] if zero set space
+       jnz     dir4b
+       mvi     a,' '           ;[4] space
+dir4b: sta     dnam14          ;[4]
+       lda     temp1
+       sta     dnam14+1        ;[4] ls user number digit
+       call    prcrlf
+       lxi     d,inms14        ;Point to message
+       call    prtstr
+;
+;Initialize number of names per line counter
+       mvi     a,npl           ;Nr. names per line.
+       sta     nnams           ;Init counter.
+       lda     hidefs          ; are we doing file size?
+       ana     a
+       jnz     dir4c           ; we are not showing file size,
+       lda     nnams
+       inr     a
+       sta     nnams           ; so we can show another name per line
+
+dir4c: xra     a               ; clear the flags ready for multi-sector buffering
+       sta     fcbcnt          ; clear fcb counter
+       sta     mfflg1
+       sta     mfflg2
+       sta     mfflg3
+       lxi     h,fcb0          ; reset pointer for fcb save space
+       shld    xfcbptr
+;
+       call    dir26           ;Get disk parameters
+       xra     a               ;[5] say first time round, so no spare fcbs
+       sta     fcbcnt          ;[5]
+dir5:  call    mfname          ;get some names
+       jnc     dir6            ;got one
+       jmp     dir17           ;got none - do summary
+
+dir6:                          ;Check for console break
+       lda     takflg          ;[4] ... but not if issued from TAKE....
+       ana     a               ;[4]
+       jnz     dir6a           ;[4] we do the lot regardless.
+
+       mvi     c,consta        ;Ck status of kbd.
+       call    bdos
+       ora     a               ;Any key pressed?
+       jz      dir6a           ;nope, keep going
+       mvi     c,conin
+       call    bdos            ;gobble key
+       jmp     dir17           ;and print summary only
+
+;Print an entry
+dir6a:
+       lxi     h,fcb+1         ;point to Filename
+       mvi     b,8             ;File name length.
+       call    dir11           ;Type filename.
+       mvi     a,'.'           ;Period after FN.
+       call    dir10
+       mvi     b,3             ;Get the filetype.
+       call    dir11
+       call    dir25           ;print size
+       lxi     h,nnams         ;Point to names counter.
+       dcr     m               ;One less on this line.
+       push    psw
+       cnz     dir7            ;No cr-lf needed, do fence.
+       pop     psw
+       cz      dir12           ;Cr-lf needed.
+       jmp     dir5
+
+;Print space, fence character, then space
+dir7:  call    dir9
+       mvi     a,':'           ;Fence character.
+       call    dir10
+       jmp     dir9
+
+; dir8 - Print two spaces
+; dir9 - Print one space
+; dir10 - Type char in A register
+dir8:  call    dir9
+dir9:  mvi     a,' '
+dir10: push    b
+       push    d
+       push    h
+       mov     e,a             ;Char to E for CP/M.
+       mvi     c,conout        ;Write char to console function.
+       call    bdos
+       pop     h
+       pop     d
+       pop     b
+       ret
+
+;Type (B) characters from memory (HL)
+dir11: mov     a,m
+       ani     7FH             ;Remove CP/M 2.x attributes.
+       call    dir10
+       inx     h
+       dcr     b
+       jnz     dir11
+       ret
+
+;CR-LF routine. HL=NNAMS upon entry
+dir12: push    b
+       push    d
+       push    h
+       call    prcrlf          ;Print CR/LF [Toad Hall]
+       pop     h               ;(did use call to dir10, but slooow)
+       pop     d
+       pop     b
+       mvi     m,npl           ;Number of names per line.
+       lda     hidefs          ; are we showing file size?
+       ana     a
+       rnz                     ; no, so all ok
+       inr     m               ; else show another file per line
+       ret
+
+;Exit - All done, return via jmp (as for all main commands)
+dir16: call    prcrlf
+       lda     curdsk
+       dcr     a               ;relative to 0
+       mov     e,a
+       mvi     c,logdsk
+       call    bdos            ;back to "logged in" disk
+       jmp     kermit          ;...and return to kermit.
+
+;
+;Determines free space remaining
+;
+dir17: xra     a
+       sta     mfflg1          ;clean up MFNAME
+       sta     mfflg2
+       lda     fcb             ; get drive number from FCB
+       ora     a
+       jz      dir18           ; default?
+       dcr     a               ; no, make requested drive current drive.
+       mov     e,a
+       mvi     c,logdsk
+       call    bdos
+dir18: call    sysspc          ; get space available for current drive
+       push    h
+       lxi     d,inms15        ;"Drive "
+       call    prtstr
+       lda     fcb             ;If no drive, get
+       ora     a               ;logged in drive
+       jnz     dir24
+       mvi     c,rddrv
+       call    bdos
+       inr     a
+dir24: adi     'A'-1
+       sta     inms16
+       lxi     d,inms16        ;"x has "
+       call    prtstr
+       pop     h               ;Get number of bytes available
+       call    nout
+       lxi     d,inms17        ;"K bytes free"
+       call    prtstr
+       jmp     dir16           ;all done
+
+;Compute the size of the file
+
+dir25: lda     hidefs          ; do we show file size?
+       ana     a               ; if non zero, we dont.
+       rz                      ; so just return
+       mvi     c,cflsz         ;get file-size
+       lxi     d,fcb
+       call    bdos
+       lda     fcbrno          ;shift least sign. part
+       lxi     b,0             ;init bc
+       mov     l,a
+       ani     7
+       jz      dir250          ;even K
+       lxi     b,1             ;save for later
+dir250:        push    b               ;save 0 or 1 to add to size
+       mvi     b,3             ;shift 3 bits
+dir25a:        xra     a               ;clear sign
+       lda     fcbrno+1        ;get most sig byte
+       rar                     ;shift right
+       sta     fcbrno+1        ;put back
+       lda     fcbrno          ;get least sig part
+       rar
+       sta     fcbrno
+       dcr     b               ;loop 3 times
+       jnz     dir25a
+       mov     l,a             ;size in HL
+       lda     fcbrno+1
+       mov     h,a
+       pop     b               ;get 0 or 1
+       dad     b               ;round up to KB used
+       lda     bmask           ;get (sectors/block)-1
+       rrc
+       rrc                     ;get (K/block)-1
+       rrc
+       ani     1FH
+       mov     c,a
+       dad     b               ;add (K/block)-1 to size to round up
+       cma                     ;make a mask
+       ana     l               ;truncate after rounding up
+       mov     l,a
+       push    h
+       lxi     b,-10           ;subtract 10
+       dad     b
+       jc      dir25d          ;>= 10
+       call    dir8            ; print a leading space
+       jmp     dir25e
+
+dir25d:        pop     h               ;get size again
+       push    h
+       lxi     b,-100          ;subtract 100
+       dad     b
+       jc      dir25e          ;>= 100
+       call    dir9            ; print another leading space
+dir25e:        call    dir9            ;a space
+       pop     h               ;get size back
+       call    nout            ;..go print it
+       mvi     a,'k'           ;..and follow with K size
+       call    dir10
+       ret
+
+dir26: mvi     c,gtdpar        ;current DISK PARAMETER BLOCK
+       call    bdos
+       inx     h
+       inx     h
+       mov     a,m             ;Get Block Shift Factor
+       sta     bshiftf
+       inx     h               ;Bump to Block Mask
+       mov     a,m             ;get it
+       sta     bmask
+       inx     h
+       inx     h
+       mov     e,m             ;Get Max Block number
+       inx     h
+       mov     d,m
+       xchg
+       shld    bmax            ;Put it away
+       ret
+;\f
+;       ERA command - erase a CP/M file
+;       here from: kermit
+
+era:   mvi     a,cmifi         ;Parse a file-spec
+       lxi     d,fcb           ;into FCB
+       call    comnd
+       jmp     kermit          ;bad parse
+       mvi     a,cmcfm         ;[MF]Get a confirm from the user
+       call    comnd           ;[MF]...
+       jmp     kermit          ;[MF]NO? try another command
+       lxi     d,fcb
+       mvi     c,sfirst        ;check if valid
+       call    bdos
+       inr     a               ;0 if FILE not found
+       jnz     era1            ;found at least one
+       lxi     d,erms15        ;"unable to find file"
+       call    prtstr
+       jmp     kermit
+
+era1:  lxi     d,fcb
+       mvi     c,delf
+       call    bdos
+       lxi     d,inms18        ;" File(s) erased"
+       call    prtstr
+       jmp     kermit
+
+; USER - select a new user.  This is an unusual routine in that the user 
+;       enters a number.  The others take on/off or filename (except
+;       set escape
+;
+user:  mvi     a,cmnum         ; go parse a number
+       call    comnd
+       jmp     kermit          ; if we can not do it, quit to command loop
+       mvi     a,cmcfm ; get a confirm from the user
+       call    comnd
+       jmp     kermit          ; if no, then try another command
+       lhld    number          ; else get the number...
+       xchg                    ; until a non valid digit is typed (eg cr)
+       lxi     h,-32           ; if a carry, then ok
+       dad     d               ; ... else its above 32
+       jc      user1
+       xchg                    ; restor number in hl again
+       mov     a,l             ; Lets save it
+       sta     curusr          ; as current user number
+       mov     e,l             ; get user no to e...
+       mvi     c,usrcod
+       call    bdos
+       call    getun           ; get user number to temp1 and temp2
+       lda     temp2
+       cpi     '0'
+       jnz     user0           ; dont do ms digit if a zero
+       mvi     a,' '
+user0: sta     kerm1           ; save into string etc
+       sta     dnam14          ; also for dir command
+       lda     temp1
+       sta     kerm1+1
+       sta     dnam14+1        ; also for dir command
+       jmp     kermit
+
+user1: lxi     d,erms23        ; tell user sorry
+       call    prtstr
+       jmp     kermit
+
+
+;
+;      TYPE - type a file or files to the console.  
+;
+; This utility also used by print, where the characters printed to 
+; the console are also copied to the printer if the prnfl flag 
+; is non-zero.  Uses mfname to type (print) multiple names.  
+; Each file is preceeded with a formfeed character (usually clears 
+; the screen on a VDU)
+;
+
+type:  mvi     a,cmifi         ; parse a file name
+       lxi     d,fcb           ; let the parser know where the FCB is
+       call    comnd
+       jmp     type02          ; if error say so
+
+type0b:
+       xra     a               ; clear some flags for mfname
+       sta     mfflg1
+       sta     mfflg2
+       sta     mfflg3
+       sta     fcbcnt          ;[12]...
+       lxi     h,fcb0          ; reset the fcb pointers etc
+       shld    fcbptr
+       call    mfname
+       jc      type02          ; match not found
+
+;[MF][10]The following code to type a file using a 1-sector buffer has
+;[MF][10]been replaced by code to use the "big buffer" -- 30-Jan-1991
+;type1:        lxi     d,buff          ; point to the default DMA address
+;      mvi     c,setdma
+;      call    bdos            ; tell bdos where to put the dma address
+;      mvi     a,ff            ; do a form feed
+;      call    typit
+;      xra     a               ; clear the character count
+;      sta     chrcnt
+;
+;type2:        mvi     c,openf         ; open the file for reading
+;      lxi     d,fcb
+;      xra     a               ; but first clear bits of fcb...
+;      sta     fcb+12
+;      sta     fcb+14
+;      sta     fcb+15
+;      sta     fcb+32
+;      call    bdos            ; NOW open the file
+;
+;type20:       mvi     c,readf         ; open up the file and read first sector
+;      lxi     d,fcb
+;      call    bdos
+;;[MF][9]Correct EOF test below (next two instructions)
+;;     inr     a               ; if 0ffh returned, error. Assume EOF
+;;     jz      typex           ; so exit from here
+;      ora     a               ;[MF][9]If error, assume EOF
+;      jnz     typex           ;[MF][9]so exit
+;      lxi     h,0             ; else clear the pointer into the file
+;      shld    typptr
+;
+;
+;type2a:       lxi     d,buff          ;ok, so lets get the byte to print
+;      lhld    typptr
+;      dad     d               ; add offset to the DMA base
+;      mov     a,m             ; and get character to type (print)
+;      ani     7fh             ; make sure it is printable
+;      cpi     20h             ; is it a control character?
+;      jp      type3
+;      cpi     09h             ; if its a tab, then expand it
+;      jnz     type2b
+;
+;type2c:       mvi     a,' '           ; send a space
+;      call    typit           ; type it
+;      lda     chrcnt          ; get the number of chrs so far
+;      ani     7h              ; see of an 8th pos?
+;      jnz     type2c          ; loop until all spaces done, then exit
+;      jmp     type4
+;
+;type2b:       cpi     cr              ; is it a cr or lf?
+;      jnz     type2d
+;      call    typit           ; do a cr
+;      xra     a
+;      sta     chrcnt          ; cr of lf => clear character count
+;      jmp     type4           ; and exit
+;
+;type2d:       cpi     lf
+;      jnz     type2e
+;      call    typit           ; print the character
+;      xra     a
+;      sta     chrcnt          ; cr or lf clears the character count
+;      jmp     type4
+;
+;type2e:       cpi     cntlz           ; is it end of file?
+;      jnz     type2f
+;      jmp     typex           ; yes, so close and try for another file
+;
+;type2f:       push    psw             ; control char - save the character
+;      mvi     a,'^'           ; send control chars as ^A, for ex.
+;      call    typit
+;      pop     psw
+;
+;type3:        call    typit
+;      
+;
+;type4:        lhld    typptr          ; get the pointer
+;      inx     h
+;      shld    typptr          ; up it by one character, and save it.
+;      mov     a,l             ; lets see if the sector has been typed
+;      ana     a
+;      jm      type20          ; if 80h => read new sector
+;      jmp     type2a          ; else just continue along
+
+;[MF][10]The following code uses the "big buffer" to read the file
+;[MF][10]which is to be typed
+;[12]Clear the screen explicitly as some terminals don't respond
+;[12]to the <ff> character.
+;type1:        mvi     a,ff            ; do a form feed
+;      call    typit
+type1: call    clrtop          ;[12] Clear the screen
+       xra     a               ; clear the character count
+       sta     temp1           ;[MF]alias column counter
+
+type2:
+;[12]Eliminate call to openf in favor of call to "getfil"
+;      mvi     c,openf         ; open the file for reading
+       lxi     d,fcb
+;      xra     a               ; but first clear bits of fcb...
+;      sta     fcb+12
+;      sta     fcb+14
+;      sta     fcb+15
+;      sta     fcb+32
+;      call    bdos            ; NOW open the file
+       call    getfil          ;[12] NOW open the file
+
+type20:        call    inbuf           ;[MF]Fill input buffers
+       jmp     typex           ;[MF]Tru end-of-file reached
+       jmp     type21          ;[MF]Begin typing/printing characters
+
+type2a:        lda     chrcnt          ;[MF]Get buffer character counter
+       dcr     a               ;[MF]and decrement it
+       jm      type20          ;[MF]Get more characters if needed
+type21:        sta     chrcnt          ;[MF]else remember new buffer character counter
+       lhld    bufpnt          ;[MF]Now get character pointer
+       mov     a,m             ; and get character to type (print)
+       inx     h               ;[MF]Increment the pointer
+       shld    bufpnt          ;[MF]and remember it
+       ani     7fh             ; make sure character is printable
+       cpi     20h             ; is it a control character?
+       jp      type3
+       cpi     09h             ; if its a tab, then expand it
+       jnz     type2b
+
+type2c:        mvi     a,' '           ; send a space
+       call    typit           ; type it
+       lda     temp1           ;[MF]Get the number of characters so far
+       ani     7h              ; see if an 8th pos?
+       jnz     type2c          ; loop until all spaces done, then exit
+       jmp     type2a          ;[MF]and continue
+
+type2b:        cpi     cr              ; is it a cr or lf?
+       jnz     type2d
+       call    typit           ; do a cr
+       xra     a
+       sta     temp1           ; cr or lf => clear character count
+       jmp     type2a          ;[MF]and continue
+
+type2d:        cpi     lf
+       jnz     type2e
+       call    typit           ; print the character
+       xra     a
+       sta     temp1           ; cr or lf clears the character count
+       jmp     type2a          ;[MF]and continue
+
+type2e:        cpi     cntlz           ; is it end of file?
+       jnz     type2f
+       jmp     typex           ; yes, so close and try for another file
+
+type2f:        push    psw             ; control char - save the character
+       mvi     a,'^'           ; send control chars as ^A, for ex.
+       call    typit
+       pop     psw
+
+type3: call    typit
+       jmp     type2a          ; and continue along
+
+typex: mvi     c,closf
+       lxi     d,fcb
+       call    bdos            ; close the file
+       mvi     a,cr            ; send cr lf to screen/printer to clear buffers
+       call    typit
+       mvi     a,lf
+       call    typit
+       call    mfname          ; and see if there are other files to type
+       jnc     type1           ; yup, so go do it
+       xra     a               ; make sure the flag is reset
+       sta     prnfl
+       jmp     kermit          ; then exit.
+
+typex0:        mvi     c,closf         ;[MF]Close the file
+       lxi     d,fcb           ;[MF]...
+       call    bdos            ;[MF]...
+       mvi     a,cr            ;[MF]Clear buffers
+       call    typit           ;[MF]...
+       mvi     a,lf            ;[MF]...
+       call    typit           ;[MF]...
+       xra     a               ;[MF]Clear flag
+       sta     prnfl           ;[MF]...
+       lda     takflg          ;[MF]See if we're TAKEing commands
+       ani     1               ;[MF]from a file
+       cnz     closet          ;[MF]If we are, abort TAKE-file processing
+       jmp     kermit          ;[MF]Back to Kermit command-level
+
+; error for file not found for type
+type02:        lxi     d,nofile        ; say no file name (its invalid)
+       call    prtstr
+       xra     a
+       sta     prnfl           ; clear the flag
+       jmp     kermit          ; so abort
+
+
+typit: mov     e,a
+       call    ckqtyp          ; see if a cntl-c or other character from user
+       jmp     typit2          ;[MF] Control-C entered, abort
+       jc      typit1          ; CNTL-X entered, so abort file [MF]
+       push    d               ; save for a bit
+       call    outcon          ; send it to the console
+       lda     temp1           ; update the number of characters sent[MF]
+       inr     a
+       sta     temp1           ;[MF]
+       pop     d
+       lda     prnfl           ; see if we have to print it too
+       ana     a
+       rz
+       call    outprn          ; send character to printer (buffer)
+       ret
+
+typit1:        pop     d               ; adjust stack again
+       jmp     typex           ; and say we are done (for this file)
+
+typit2:        pop     d               ;[MF] Adjust the stack
+       jmp     typex0          ;[MF] and abort file typeout completely
+
+
+; CKQTYP - CHeck for requested Quiet TYPe (ie hang on a second)
+;      Routine sees if the user has typed ANY key.  If a key HAS been pressed
+;      see if its a Control-c.  If so, flag for an abort, else wait for 
+;      a second entry from the user. If its a Control C, flag an abort
+;      else continue with the print.
+;      note: only the DE  registers maintained.  All others destroyed.
+;      **NOTE** CKQTYP now gives a nonskip return if Control-C is typed,
+;      a skip-return with carry set if a Control-X is typed and a skip-return
+;      with carry clear if any other character is typed as the second
+;      character.
+
+ckqtyp:        push    d               ; save the character to be printed
+       call    ckchr           ; see if user entered a character
+       ani     7fh             ; strip parity etc
+       jz      ckqty3          ; nothing entered, so go on as usual (See below)
+       cpi     ctrlc           ; control c?
+       jz      ckqt1a          ;[MF] Yup, give nonskip return
+       cpi     'X'-100o        ;[MF] If Control-X,
+       jz      ckqty1          ; yup, set carry and exit
+ckqty2:        call    ckchr           ; another character to wait for (ie pause)
+       ani     7fh
+       jz      ckqty2          ; wait until some input
+       cpi     ctrlc           ; if control c, abort
+       jz      ckqt1a          ;[MF] ...
+       cpi     'X'-100o        ;[MF] Control-X?
+       jz      ckqty1          ; yuss, so flag abort file [MF]
+ckqty3:        pop     d               ; else restore the character to be typed [MF]
+;      ret                     ; no, so continue with type/print
+       stc                     ;[MF]Set carry
+       cmc                     ;[MF]Then clear it
+       jmp     rskp            ;[MF] Continue with type/print (skip ret)
+
+ckqty1:        pop     d               ; restore stack again
+       stc                     ; set carry and return
+;      ret
+       jmp     rskp            ;[MF] ...
+
+ckqt1a:        pop     d               ;[MF] Adjust stack
+       ret                     ;[MF] and return
+
+;[MF][14]No longer need these lines
+;ckqty3:       pop     d               ; restore stack again
+;;     ret
+;      stc                     ;[MF] Clear carry
+;      cmc                     ;[MF] ...
+;      jmp     rskp            ;[MF] and give skip return
+
+ckchr: call    selcon          ; make sure we are talking to the console
+       mvi     e,0ffh          ; see if user has any input for us
+       mvi     c,dconio
+;      call    bdos            ;[11]Don't go thru bdos trap
+       call    0005h           ;[11]Call bdos directly
+       ret                     ; This routine does not care what comes back
+
+       
+;
+; COPY - routine to copy from a source file to a destination file 
+;      from the Kermit command state.
+;
+;      Note.  This could be tricky, as there are several forms of copy
+;              copy d:source.ext d:dest.ext    (Easy one)
+;              copy d:source.ext d:            (File to another drive)
+;              copy d:source.??? d:            (several files)
+;              copy d:*.* d:                   (Several files)
+;
+;      Initially, lets make it top one, and see how we go, ok?
+;
+;
+;Things to do for copy:
+;      1) get source name
+;      2) get target name
+;      3) if both source and destination = abort
+;      4) if source does not exist abort
+;      5) attempt to delete destination file if it exists
+;      6) open source and destination files
+;      7) copy file across
+;      8) close all files
+;      9) return to command mode
+;
+copy:                  ; Here goes...
+;      1) get source file name
+       mvi     a,cmofi         ; go parse a file name
+                               ;[MF]Nonwild
+       lxi     d,cfcbs         ; use the source for copy FCB (Allows copy
+       call    comnd           ; from a TAKE file etc)
+       jmp     kermit          ; if error, abort
+
+;      2) get target name
+       mvi     a,cmofi         ; go parse a target file name
+                               ;[MF]Again, nonwild
+       lxi     d,cfcbd         ; use destination fcb
+       call    comnd           ; get it
+       jmp     kermit          ;[MF]Couldn't.
+       mvi     a,cmcfm         ;[MF]Get a confirm from the user
+       call    comnd           ;[MF]...
+       jmp     kermit          ;[MF]No? try another command
+
+;      3) see if both target and source are equal
+copy0: mvi     b,12            ; we are gonna test drive, file and extention
+       lxi     d,cfcbs         ; from source file name...
+       lxi     h,cfcbd         ; to destination file name
+       xra     a               ; clear flag for difference found
+       sta     equflg
+copy1: ldax    d               ; get source file name character
+       cmp     m               ; test with targer file name
+       jz      copy2           ; if equal, do nothing
+       lda     equflg          ; else update flage (ie files are different)
+       inr     a
+       sta     equflg
+copy2: inx     h
+       inx     d
+       dcr     b
+       jnz     copy1           ; up pointers and test for next char
+
+       lda     equflg          ; if still null, then its a daft thing to do
+       ana     a
+       jnz     copy3           ; its not a daft thing to do
+       lxi     d,samems        ; load up "File source and destination the same"
+       call    prtstr          ; tell user
+       jmp     kermit          ; and try again
+
+;      4) If source does not exist, abort.  Assume we have a full file name.
+copy3:
+       lxi     d,cfcbs         ; load up source fcb
+       mvi     c,openf         ; open file
+       call    bdos
+       inr     a               ; error on open?
+       jnz     copy4
+       lxi     d,nofile        ; assume file not found
+       call    prtstr
+       jmp     kermit          ; and die
+
+copy4: lxi     d,cfcbd         ; load up destination fcb
+       mvi     c,delf          ; destroy target name if it exists
+       call    bdos            ; ignore error messages
+       lxi     d,cfcbd         ; load up destination fcb
+       mvi     c,makef         ; make a file
+       call    bdos
+       inr     a               ; make error?
+       jnz     copy4a
+       lxi     d,erms12        ; no directory space
+       call    prtstr
+       jmp     copy7           ; close source file
+
+copy4a:        lxi     d,cfcbd         ; load up destination fcb...
+       mvi     c,openf         ; for open
+       call    bdos
+       inr     a               ; error on open?
+       jnz     copy5           ; could do with better error detection...
+       lxi     d,erms15        ;... but assume its a disk full
+       call    prtstr
+       jmp     copy7           ; close source file and jmp kermit
+
+;copy5:        lxi     d,buff          ; set default dma address to 80h
+;      mvi     c,setdma
+;      call    bdos
+;
+;copy6:        lxi     d,cfcbs         ; copy routine proper.. get a sector
+;      mvi     c,readf
+;      call    bdos
+;      ana     a               ; error reading the file?
+;      jnz     copy8           ; yes, then cope with it (could be EOF)
+; [MaJoC 910128] The above code, which reads single logical sectors,
+; is grossly inefficient with systems (most of them) with larger physical
+; disk blocks and a single shared read/write buffer.  Use of INBUF below
+; is functionally equivalent at this level, but does actual disk reads
+; by the Big Buffer-ful.
+copy5:
+       xra     a               ; Initialise INBUF, to force reading of
+       sta     seccnt          ;  the first Big Buffer-ful.  Redundant
+       sta     endsts          ;  if file opened by GETFIL (or variant).
+       sta     eoflag          ;[MF]...
+       lxi     h,cfcbs         ;[MF]Copy source fcb to default fcb
+       lxi     d,fcb           ;[MF]since INBUF uses the default fcb
+       lxi     b,33            ;[MF]...
+       call    mover           ;[MF]...
+copy6:
+; INBUF returns a pointer to the next logical bufferful via bufpnt, filling
+; the Big Buffer as necessary, with skip return for success and nonskip on
+; error or EOF.
+       call    inbuf           ; Start of copy proper: get bufferful.
+       jmp     copy8           ; Nonskip return: treat as EOF.
+       lhld    bufpnt          ; Skip return => OK: pick up buffer pointer.
+       xchg
+       mvi     c, setdma       ; Tell system where to write from.
+       call    bdos
+; [majoc 910128: end]
+       lxi     d,cfcbd         ; send sector to destination
+       mvi     c,writef
+       call    bdos
+       ana     a               ; error on write (disk full?)
+       jz      copy6           ; no error, so do another sector.
+       lxi     d,erms17        ; say disk is full
+       call    prtstr
+       lxi     d,cfcbd         ; close the output file...
+       mvi     c,closf
+       call    bdos
+       lxi     d,cfcbd         ; ... and then delete it
+       mvi     c,delf
+       call    bdos            ; ... and then drop through to...
+
+copy7: lxi     d,cfcbs         ; here to close the source FCB
+       mvi     c,closf
+       call    bdos
+       jmp     kermit
+
+copy8: lxi     d,cfcbd         ; orderly close of destination file
+       mvi     c,closf
+       call    bdos
+       jmp     copy7           ; now close the source file as well.
+
+;
+;[MF]RENAME - Rename a file
+;
+rename:        mvi     a,cmofi         ;[MF]Get nonwild filename
+       lxi     d,cfcbs         ;[MF]Use "COPY" fcb's
+       call    comnd           ;[MF]...
+       jmp     kermit          ;[MF]Couldn't get it.
+       mvi     a,cmofi ;[MF]Get filespec to rename it to
+       lxi     d,cfcbd         ;[MF]...
+       call    comnd           ;[MF]...
+       jmp     kermit          ;[MF]Couldn't.
+renam0:        lxi     d,cfcbs         ;[MF]See if file to be renamed exists
+       mvi     c,openf         ;[MF]by trying to open it
+       call    bdos            ;[MF]...
+       inr     a               ;[MF]Does the file exist?
+       jnz     renam1          ;[MF]Yes
+       lxi     d,nofile        ;[MF]No, inform the user
+       call    prtstr          ;[MF]...
+       jmp     kermit          ;[MF]and bomb
+renam1:        lxi     d,cfcbd         ;[MF]Point to rename filespec
+       mvi     c,openf         ;[MF]Set function code to
+       call    bdos            ;[MF]See if rename file exists
+       inr     a               ;[MF]Does it?
+       jz      renam2          ;[MF]No
+       lxi     d,erms31        ;[MF]Yes, complain
+       call    prtstr          ;[MF]...
+       jmp     kermit          ;[MF]and depart with tail between legs
+renam2:        lxi     h,cfcbd         ;[MF]Now get rename filespec again
+       lxi     d,cfcbs+16      ;[MF]and where to copy it to
+       lxi     b,16            ;[MF]We copy drive, filename, filetype, extent
+       call    mover           ;[MF]...
+       lxi     d,cfcbs         ;[MF]Point to fcb for rename
+       mvi     c,renam ;[MF]Get rename function
+       call    bdos            ;[MF]Try to rename the file
+       inr     a               ;[MF]Did we succeed?
+       jnz     kermit          ;[MF]Yes, done
+       lxi     d,erms16        ;[MF]No, complain
+       call    prtstr          ;[MF]...
+       jmp     kermit          ;[MF]and start over
+
+
+IF lasm
+       LINK    CPSWLD
+ENDIF;lasm  [Toad Hall]
diff --git a/cpsdat.asm b/cpsdat.asm
new file mode 100644 (file)
index 0000000..729ca52
--- /dev/null
@@ -0,0 +1,648 @@
+; CPSDAT.ASM
+;       KERMIT - (Celtic for "FREE")
+;
+;       This is the CP/M-80 implementation of the Columbia University
+;       KERMIT file transfer protocol.
+;
+;       Version 4.0
+;
+;       Copyright June 1981,1982,1983,1984,1985
+;       Columbia University
+;
+; Originally written by Bill Catchings of the Columbia University Center for
+; Computing Activities, 612 W. 115th St., New York, NY 10025.
+;
+; Contributions by Frank da Cruz, Daphne Tzoar, Bernie Eiben,
+; Bruce Tanner, Nick Bush, Greg Small, Kimmo Laaksonen, Jeff Damens, and many
+; others. 
+;
+;       Pure and impure data areas. Previously of CPSUTL.ASM
+;
+; revision history:
+;
+;edit 19, 29-Mar-1991 by MF. Add flag "initak" (nonzero) which is cleared
+;      after the initial automatic TAKE attempt of KERMIT.INI to allow
+;      "unable to find file" complaints if not doing that initial TAKE.
+;edit 18, 21-Mar-1991 by MF. Renamed parameter vermin to revno (revision
+;      level) since verno is already known as the "minor version number".
+;edit 17, 27-Feb-1991 by MF. Corrected typeo in "inms19" and commented out
+;      "typptr" pointer as the TYPE command now uses the big buffer.
+;      Also provided for a "minor version number" (1-26=A-Z) and message to
+;      facilitate display of Kermit version in VERSION command (modmsg)
+;edit 16, 12-Feb-1991 by MF. Eliminated storage (message and variable)
+;      for case sensitivity by commenting it out.
+;edit 15, 9-Dec-1990 by MF. Modified message for "directory file size"
+;      status report to make it clearer when spoken by a speech synthesizer.
+;edit 14, 4-Dec-1990 by MF. Added message for Autoreceive status report.
+;edit 13, 30-Nov-1990 by MF. Added messages to display regular/quiet status
+;      of terminal in SHOW and STATUS commands.
+;edit 12, 8-Nov-1990 by MF.  Added a new message for Set Autoreceive.
+;edit 11, 2-Nov-1990 by MF.  Moved overlay address to 7000H -- I didn't
+;      realize I was **that** close to the limit until I made a couple of
+;      cosmetic changes and REM CD bombed.  This is still ver. 4.10 as it
+;      hasn''t been released yet.
+;edit 10, 1-Nov-1990 by MF.  Changed message at "spdst" to conform with
+;      the change of "SET BAUD-RATE" to "SET SPEED".
+;      Also added message "sdpst2" for speed status (staspd) routine
+;edit 9, 17-Oct-1990 by MF.  Changed "packet-size" messages to use the
+;      word "length" to conform with the nomenclature suggested in the
+;      6th edition of the Kermit Protocol Manual.
+;edit 8, 19-Sep-1990 by MF.  Added error message for FRENAME command.
+;edit 7, 14-Sep-1990 by MF.  Added storage/strings for SET COLLISION command.
+;      Also added strings/storage for SET INCOMPLETE-FILE command.
+;edit 6, 9-Sep-1990 by MF.  Added messages and storage for Remote commands.
+;      and display of packet sizes
+;      Moved overlay address to 06C00H for Version 4.10.
+; edit 5, 8 April, 1987 by OBSchou.  Added new entry in jump table to call 
+;      code for an external terminal type.  Added some new error messages
+;      and added more to the packet space.
+;
+; edit 4, 30 March by OBSchou.  Added in space for autoreceive.
+;
+; edit 3, 19 March, 1987 by OBSchou.  Added some more strings etc, and 
+;      increased the stack space fro 32 entries to 64.
+;
+; edit 2, 11 March, 1987 by OBSchou. 
+;      Added in some more data and strings and things.  Nothing special
+;
+; edit 1, 28 January, 1987 by OBSchou
+;      Following file the data section of CPSUTL.ASM.  This part of the 
+;      CPSUTL.ASM file now seperate as it ws getting too larg.  Link to here
+;      from CPSUTL.ASM (which now has only the utlity routines). 
+;      Also added in bits submitted by Dave Roberts of Leicester:
+;       DJR  18th January 1987 - David J. Roberts.
+;           Support for cosmetic changes in CPSMIT:
+;              New strings DBGST and CURDST
+;              CRLF in front of TIMMSG
+;              LOGST changed, and new LOGST2
+;
+;
+datver:        db      'CPSDAT.ASM (19)  29-Mar-1991$'
+
+
+
+;\f
+
+version:db     'Kermit-80 v4.'
+       db      (verno/10) + '0'        ; tenth's digit of version number
+       db      (verno MOD 10) + '0'    ; hundredth's digit
+IF revno                       ;[MF]If a revision level,
+       db      revno+'@'       ;[MF]put it in (range 1-26=A-Z)
+ENDIF ;revno [MF]
+       db      ' $'
+modmsg:        db      ' has been built from the following modules:$';[MF]
+kerm:  db      'Kermit-80  '
+kerm1: db      'nnx:>$'        ;'x' filled in at startup with DRIVE name
+                               ;'nn filled at startup and user with user number
+crlf:  db      cr,lf,'$'
+ermes1:        db      cr,lf,'?Unrecognized command$'
+ermes3:        db      cr,lf,'?Not confirmed$'
+ermes4:        db      '?Unable to receive initiate',cr,lf,'$'
+ermes5:        db      '?Unable to receive file name',cr,lf,'$'
+ermes6:        db      '?Unable to receive end of file',cr,lf,'$'
+erms10:        db      '?Unable to receive data',cr,lf,'$'
+erms11:        db      '?Disk full',cr,lf,'$'
+erms12:        db      '?Directory full',cr,lf,'$'
+erms14:        db      '?Unable to receive an acknowledgement from the host',cr,lf,'$'
+erms15:        db      cr,lf,'?Unable to find file',cr,lf,'$'
+erms16:        db      '?Unable to rename file$'
+erms17:        db      cr,lf,'?Disk full$'
+erms18:        db      cr,lf,'?Unable to tell host that the session is finished$'
+erms19:        db      cr,lf,'?Unable to tell host to logout$'
+erms20:        db      cr,lf,'?Kermit has not been configured for a target system$'
+erms21:        db      cr,lf,'?Consistency check on configuration failed$'
+erms22:        db      cr,lf,'?Error writing to log file',cr,lf,'$'    ;[pcc005]
+erms23:        db      cr,lf,'?Invalid user number$'
+erms24:        db      cr,lf,'?Invalid Pause parameter$'
+erms25:        db      cr,lf,'?Invalid BUFFER-SIZE parameter$'
+erms26:        db      cr,lf,'?Invalid packet length (too long)$'
+erms27:        db      cr,lf,'?Invalid Checktype$'
+erms28:        db      cr,lf,'?Too many retries$'
+erms29:        db      cr,lf,'?Failed to exchange parameters$'
+erms30:        db      cr,lf,'?Failed to receive input string in alloted time$'
+erms31:        db      cr,lf,'?File already exists$' ;[MF]
+
+infms3:        db      bell,'Completed$'
+infms4:        db      bell,'Failed$'
+infms5:        db      '%Renaming file to $'
+infms6:        db      cr,lf,'[Closing the log file]$'
+infms7:        db      cr,lf,'[Connected to remote host.  Type $'
+infms8:        db      'C to return;',cr,lf,' type $'
+inms8a:        db      '? for command list]',cr,lf,'$'
+infms9:        db      cr,lf,'[Connection closed, back at micro]$'
+inms10:        db      'Control-$'
+inms11:        db      ' Not implemented.$'
+inms12:        db      ' (Not implemented)',cr,lf,'$'
+inms13:        db      bell,'Interrupted$'
+inms14:        db      TAB,TAB,'    Directory for drive '
+dnam14:        db      'nnx:',cr,lf,'$'                ;filled in by dir routine.
+inms15:        DB      CR,LF,TAB,TAB,'Drive $'
+inms16:        DB      '  has $';filled in by summary code with drive letter
+inms17:        DB      'K bytes free',CR,LF,'$'
+inms18:        DB      CR,LF,'File(s) erased$',CR,LF
+inms19:        db      cr,lf,'[Transmitting file to host:'
+       db      cr,lf,' 1. Lines automatically sent, and wait for possible reply'
+       db      cr,lf,' 2. CONTROL-C aborts transfer'
+       db      cr,lf,' 3. If transfer hangs, try a return to continue'
+       db      cr,lf,' 4. on exit, you will be placed in CONNECT state.'
+       db      cr,lf,'$'
+inms20:        db      'R to send the same line again,'
+       db      cr,lf,'   or type $'
+inms21:        db      'C to abort transmission.]',cr,lf,'$'
+inms22:        db      cr,lf,'[Transmission done. Connected normally '
+       db      'to remote host,'
+       db      cr,lf,' type $'
+inms23:        db      'Sending...$'
+inms24:        db      'Receiving...$'
+inms25:        db      bell,'Warning: eighth bit cannot be sent$'
+inms26:        db      cr,lf,'For help, type ? at any point in a command$'
+inms27:        db      cr,lf,'[Logging suspended]',cr,lf,'$'   ;[pcc003]
+inms28:        db      cr,lf,'[Logging resumed]',cr,lf,'$'     ;[pcc003]
+inms29:        db      cr,lf,'[Transmission Aborted. Connected normally '
+       db      'to remote host,'
+       db      cr,lf,' type $'
+autmes:        db      cr,lf,cr,lf,'[Automatically receiving; type ^C to abort]'
+       db      cr,lf,cr,lf,'$' ;[MF]
+anymes:        db      cr,lf,cr,lf,' * * * Press any key to continue * * * '
+       db      cr,lf,cr,lf,'$'
+escmes:        db      cr,lf,'Type the new escape character:  $'
+tacmes:        db      cr,lf,'Type the new TAC intercept character:  $'
+sopmes:        db      cr,lf,'Give the start-of-packet character: $'   ;[gnn]
+padcms:        db      cr,lf,'Type the new padding character: $'       ;[obs]
+xmthlp:        db      cr,lf,'R Send the same line again$'
+loghlp:        db      cr,lf,'Q  Suspend logging'              ;[pcc003]
+       db      cr,lf,'R  Resume logging$'              ;[pcc003]
+inthlp:        db      cr,lf,'?  This message'
+       db      cr,lf,'C  Close the connection'
+       db      cr,lf,'0  (zero) Transmit a NULL'
+       db      cr,lf,'P  Toggle printer on/off'        ;[pcc002]
+       db      cr,lf,'S  Status of the connection$'
+inhlp1:        db      cr,lf,'Typing another $'
+inhlp2:        db      ' will send it to the host'
+       db      cr,lf,cr,lf,'Command>$'
+
+xmtst: db      cr,lf,'Transmitting a file$'
+autrst:        db      cr,lf,'Autoreceive is$'
+locst: db      cr,lf,'Local echo$'
+onstr: db      ' on$'
+offstr:        db      ' off$'
+flost: db      cr,lf,'Flow control$'
+;senst:        db      cr,lf,'Case sensetivity$'
+vtdpst:        db      cr,lf,'Terminal display is $'
+vtdpsr:        db      'REGULAR$'
+vtdpsq:        db      'QUIET$'
+vtemst:        db      cr,lf,'Terminal emulation is $'
+cpmst: db      cr,lf,'File Mode$'
+defstr:        db      ' default$'
+ascstr:        db      ' ASCII$'
+binstr:        db      ' binary$'
+hfsod: db      cr,lf,'Display file size on DIRECTORY command$'
+ibmst: db      cr,lf,'IBM flag$'
+incst: db      cr,lf,'Disposition for incomplete files is$'
+dscstr:        db      ' discard$'
+kepstr:        db      ' keep$'
+filst: db      cr,lf,'File warning$'
+prst:  db      cr,lf,'Printer copy$'
+logst: db      cr,lf,'Logging to $'            ;[pcc003][DJR]
+logst2:        db      ' is$'                          ;[DJR]
+susstr:        db      ' suspended$'                   ;[pcc003]
+sspmsg:        db      cr,lf,'SEND start-of-pkt char  ^$' ;[gnn]
+rspmsg:        db      cr,lf,'RECEIVE start-of-pkt char  ^$' ;[gnn]
+spsmsg:        db      cr,lf,'SEND packet length  $' ;[MF]
+rpsmsg:        db      cr,lf,'RECEIVE packet length  $' ;[MF]
+escst: db      cr,lf,'Escape char: $'
+bufsz1:        db      cr,lf,'Multi-sector buffering at $'
+bufsz2:        db      ' of a maximum of $'
+xmitst:        db      cr,lf,'Transmit protocol char: $'
+bckst: db      cr,lf,'Block check type: $'
+bckst1:        db      '-character$'
+collst:        db      cr,lf,'File COLLISION:  $';[MF]
+parst: db      cr,lf,'Parity: $'
+pnonst:        db      'none$'
+pmrkst:        db      'mark$'
+pspcst:        db      'space$'
+poddst:        db      'odd$'
+pevnst:        db      'even$'
+porst: db      cr,lf,'Port in use is: $'
+spdst: db      cr,lf,'Current speed is: $'
+spdst2:        db      ' bps$'         ;[MF]
+spdust:        db      'indeterminate (not SET)$'
+timmsg:        db      cr,lf,'Timer$'                  ;[DJR] Added CRLF like the others
+tacst: db      cr,lf,'Current TACTrap Status/Intercept Character:  $'
+usrst: db      cr,lf,'Current user number:  $'
+dbgst: db      cr,lf,'Debugging$'              ;[DJR]
+curdst:        db      cr,lf,'Current default disk: $' ;[DJR]
+spac15:        db      '               $'              ; *** 15 spaces ***
+samems:        db      cr,lf,'?Source and destination files the same$'
+nofile:        db      cr,lf,'?File not found$'
+cmer00:        db      cr,lf,'?Program error:  Invalid COMND call$'
+cmer01:        db      cr,lf,'?Ambiguous$'
+cmer02:        db      cr,lf,'?Illegal CP/M file specification$'
+cmer03:        db      cr,lf,'?Wild-cards not allowed in file specification$'  ;[pcc006]
+cmer04:        db      cr,lf,'?Invalid user number$'
+cmer05:        db      cr,lf,'?Invalid \ parameter$'
+cmin00:        db      ' Confirm with carriage return$'
+cmin01:        db      ' Enter a number$'
+cmin02:        db      ' Confirm with carriage return or enter more$'
+
+;  Diagnostic messages
+sstatm:        db      '<SState:> ',0
+rstatm:        db      '<RState:> ',0
+spackm:        db      '<Data transmitted> ',0
+rpackm:        db      '<Data received   > ',0
+princr:        db      cr,lf,0
+;
+; Remote command messages [MF]
+;
+newfms:        db      cr,lf,'New file: $'
+pswdms:        db      cr,lf,'Password: $'
+acctms:        db      cr,lf,'Account: $'
+newnms:        db      cr,lf,'New name: $'
+msgms: db      cr,lf,'Message: $'
+optms: db      cr,lf,'Options: $'
+
+;\f
+       ;Impure data
+
+;COMND storage
+
+comchr:        ds      1               ;[8] save space
+floctl:        db      0               ;[8] flow control on/off flag
+;casens:       db      0               ;[8] Upper/lower case sensitive
+cmstat:        ds      1               ;What is presently being parsed.
+cmaflg:        ds      1               ;Non-zero when an action char has been found.
+cmbflg:        ds      1               ;[MF]Nonzero to allow a blank initial keyword
+cmqflg:        ds      1               ;[MF]Nonzero to prevent character echoing
+                               ;[MF]when entering commands
+cmccnt:        ds      1               ;Non-zero if a significant char is found.
+cmsflg:        ds      1               ;Non-zero when the last char was a space.
+cmostp:        ds      2               ;Old stack pointer for reparse.
+cmrprs:        ds      2               ;Address to go to on reparse.
+cmprmp:        ds      2               ;Address of prompt.
+cmptab:        ds      2               ;Address of present keyword table.
+cmhlp: ds      2               ;Address of present help.
+cmdbuf:        ds      80H             ;Buffer for command parsing.
+cmbufl equ     $-cmdbuf-3      ; set a limit on the command buffer
+cmfcb: ds      2               ;Pointer to FCB.
+cmfcb2:        ds      2               ;Pointer to position in FCB.
+cmfwld:        ds      1               ;Wildcard flag
+cmcptr:        ds      2               ;Pointer for next char input.
+cmdptr:        ds      2               ;Pointer into the command buffer.
+cmkptr:        ds      2               ;Pointer to keyword.
+cmsptr:        ds      2               ;Place to save a pointer.
+slshsn:        db      0               ; slash seen in command line
+slashc:        db      0               ; count for number of characters in slash sequence
+slashn:        db      0               ; number to be built for \xxx
+;\f
+oldsp: ds      2               ;Room for old system stack.
+       ds      80H             ;Room for 64 levels of calls.[obs]
+stack: ds      2
+eoflag:        ds      1               ;EOF flag;non-zero on EOF.
+curdsk:        db      0               ;holds "logged" disk
+curusr:        db      0               ;[8] holds "user" number
+rcvsop:        db      SOH             ;[gnn] receive start-of-packet
+sndsop:        db      SOH             ;[gnn] send start-of-packet
+prtcnt:        db      0               ;[pcc008] prtchr fairness count
+timflg:        db      0               ;[jd] timer flag: 0 -> no timer
+timval:        dw      0               ;[jd] timer value
+wrn8:  db      0               ;[jd] non-zero if 8-bit-lost warning sent
+qbchr: db      '&'             ;[jd] binary quote character.
+quot8: db      0               ;[jd] non-zero if doing 8-bit quoting
+logflg:        db      0               ;Flag for a log file.
+                               ;[pcc005] 0 = no log
+                               ;[pcc005] x1 = logging on
+                               ;[pcc005] x2 = suspended
+                               ;[pcc005] 8xH (bit 7) = file open
+lognam:        db      0               ;[pcc013] File to use for session logging
+       db      'KERMIT  '      ;[pcc013]
+       db      'LOG'           ;[pcc013]
+nexitf:        db      0               ; set to 1 for exit to CPM after command tail
+takflg:        db      0               ;[8] TAKE flag. 
+                               ; Bit zero = 1 for take file in progress
+                               ; bit 4 = 1 if command line present/in progress
+                               ; Note: Take has priority over command line.
+initak:        db      0ffh            ;[MF]Cleared after initial TAKE (KERMIT.INI)
+taknam:        db      0               ;[8] use default drive
+       db      'KERMIT  '
+       db      'INI'           ;[8] Inital file to TAKE KERMIT.INI
+takptr:        ds      2               ;[8] Pointer to position in TAKE file input
+takfcb:        ds      12              ;[8] fcb space for take file
+       dw      0               ;[8] fill up extents etc with 00
+       dw      0
+       ds      16              ;[8] used by dos
+       dw      0
+       dw      0
+takdma:        ds      128             ;[8]space to read TAKE file...
+prnbuf:        ds      1               ; printer buffer. Output pointer
+       ds      1               ; input offset pointer
+       ds      256             ; give a large buffer
+       ds      10              ; and a little spare
+;
+;
+;
+; Transmit space
+;
+repcnt:        db      0               ; repeat counter
+starc: db      0               ; star count
+rexbfl:        db      0               ; retransmit flag (1=> retransmit)
+rexcnt:        db      0               ; retransmit character count
+rexbuf:        ds      128             ; max retransmit line length 128 characters
+xmtbuff:
+       ds      128             ; 128 byte sector buffer
+xmtptr:        db      0               ; offset pointer to xmtbuff above
+xmtfcb:        ds      36              ; fcb for transmit file.
+;
+;INPUT and STRING space
+strlen:        db      0               ; length of the string from INPUT and STRING
+
+; Assorted other space
+errorc:        db      0               ; error level set to xxx
+errorl:        db      0               ; error level to test against
+
+remtxt:        db      0               ; set <> 0 if D packets to screen
+
+hosths:        ds      1               ; have we told the host to xoff? (is this duplicated)
+stbuff:        ds      80h             ; some space or the string buffer
+waitp: ds      2               ; wait command timer
+waitp1:        ds      2               ; wait/input timer (copy of waitp)
+prntmp:        ds      1               ; temporary space to put the caracter to print
+prnfl: db      0               ; printer flag.  Used by TYPE/PRINT
+;[MF][17]Following line no longer needed as TYPE uses the big buffer
+;typptr:       ds      2               ; pointer used by TYPE/PRINT
+equflg:        db      0               ; set to non zero if copy files same
+nquiet:        db      0               ; If non zero print from NOUT to display
+
+escflg:        db      0               ;Escape flag (start off).
+fileio:        db      0               ;Line-by-line from file (default off).
+xofflg:        db      0               ;X-OFF (=^S) received from COMM-line
+                               ;X-ON (=^Q) received resets this
+clkbit:        dw      0               ; 32 bit pseudo clock
+       dw      0               ; MS bits of clock
+number:        ds      2               ; Number in binary form from user input
+initflg:db     0               ; set to non zero when system initialised
+maxbsc:        ds      1               ; save space to know how big system allows
+                               ; for multi-sector buffering. (Usually 8k?)
+;
+;       Multiple FCB storage space.  Used for the DIR command
+;               Later on, I want to shift this into space after the system
+;               dependent stuff, but then it becomes messy with pointers
+;               to pointers etc... [OBS]
+;
+xfcbptr:
+       ds      2               ; pointer to current fcb space
+fcbcnt:        ds      1               ; Number of valid fcbs in space
+;
+fcb0:  ds      12              ; 36 bytes requred for a single fcb
+fcblen EQU     $-fcb0          ; length of a single fcb
+       ds      maxfcb*fcblen   ; space for maximum fcbs + 1 
+;
+hidefs:        db      0ffh            ; flag <> 0 if we show file size in DIR
+
+; FCB sapce for COPY command
+cfcbs: ds      33              ; source fcb for copy file ops.
+                               ;[MF]and FRENAME ops.
+cfcbd: ds      33              ; destination fcb for copy ops.
+                               ;[MF]and FRENAME ops.
+
+colfcb:        ds      33              ;[MF]Rename fcb for SET COLLISION
+
+; Command tail data space etc
+cbptr: db      2               ; command tail pointer (0= length of tail)
+cbuff: ds      128             ; temp. space for potential command tail
+
+strcnt:        db      0               ; string count for string operations...
+
+vtyval:        ds      1               ; holds row number for VT52 cursor positioning
+chrcnt:        ds      1               ;Number of chars in the file buffer.
+
+; Various packet variables etc
+bytes: dw      0               ; 4 byte 'byte count' space
+       dw      0
+filcnt:        ds      1               ;Number of chars left to fill.
+outpnt:        ds      2               ;Position in packet.
+bufpnt:        ds      2               ;Position in file buffer.
+fcbptr:        ds      2               ;Position in FCB.
+datptr:        ds      2               ;Position in packet data buffer.
+cbfptr:        ds      2               ;Position in character buffer.
+pktptr:        ds      2               ;Position in receive packet.
+size:  ds      1               ;Size of data from gtchr.
+curchk:        ds      1               ;Current checksum type
+inichk:        ds      1               ;Agreed upon checksum type
+czseen:        ds      1               ;Flag that control-Z was typed
+dscflg:        ds      1               ;[MF]Discard file if nonzero
+pktnum:        ds      1               ;Packet number.
+numpkt:        ds      2               ;Total number of packets sent.
+numrtr:        ds      2               ;Total number of retries.
+numtry:        ds      1               ;Number of tries on this packet.
+oldtry:        ds      1               ;Number of tries on previous packet.
+state: ds      1               ;Present state of the automaton.
+;*** start of new flags.  Do not assume that just because these flags are
+;  present that the feature is available.  I simply put them in 'for future use'
+rcapas:
+rcap1: db      0               ; receive capabilties byte 0
+rcap2: db      0               ; receive cpabilities byte 1
+scapas:
+scap1: db      0               ; send capabilities byte 0
+scap2: db      0               ; send capabilities byte 1
+rtimeo:        db      0               ; receive timeout
+stimeo:        db      0               ; send timeout
+rpadc: db      0               ; receive pad character
+spadc: db      0               ; send pad character
+rrept: db      0               ; receive repeat prefix
+srept: db      0               ; send repeat prefix
+rwindo:        db      0               ; receive window size
+swindo:        db      0               ; send window size
+rdpkt:
+rlpkt: dw      0               ; receive long packet length
+sdpkt:
+slpkt: dw      0               ; send long packet length
+sdckt: db      0               ; send default checktype
+rdckt: db      0               ; receive checktype (should be same as sdckt)
+;*** end  of new flags
+sohchr:        db      1               ;Default Start-of-header chr is cntl-a
+; Kermit packet starts here
+;      Byte 0 = start of packe character
+;           1 = length of packet
+;           2 = packet number
+;           3 = packet type (S R I Z E B etc)
+packet:        ds      4               ;Packet (data is part of it).
+; Data part of packet (variable length - include checksum)
+data:  ds      5AH             ;Data and checksum field of packet.
+recpkt:        ds      65H             ;Receive packet storage (use the following).
+recpkx:        db      cr,'$'          ;=      =       = buffer limit
+filbuf:        ds      65H             ;Character buffer.
+fnbuf: ds      20h             ;[jd] file name buffer
+autorc:        db      0               ;[obs] set to ON for autoreceive
+
+; Temporary data space.  Sometimes accesses as 16 bits (eg temp1/2)
+;** Temp 1 & 2 must be in order
+lstchr:                                ;Last console input character.
+temp1: ds      1               ;Temporary storage.
+temp2: ds      1
+lincnt:                                ; used for counting lines in p20ln
+temp3: ds      1
+temp4: ds      1
+temp5: ds      1
+temp6: ds      1
+temp7: ds      1
+temp8: ds      1
+temp9: ds      1
+temp10:        ds      1
+temp11:        ds      1
+
+
+getrxflg:
+       ds      1               ;[obs 22]
+quietd:        db      0               ;loud display during file transfers
+argblk:        ds      20H             ;Used for subroutine arguments
+
+maxfil EQU     2               ; currently, only two names used.
+fcbblk:        ds      maxfil*10H      ;Used for a list of FCB's
+
+; [gnn] secondary filename storage (remote on send, local on get)
+remnam:        ds      60              ;[gnn]
+remlen:        ds      1               ;[gnn] length of name
+
+; Bookkeeping storage for multiple-sector buffering.  The actual buffer
+; is somewhere in the system-dependent overlay. (at the end, I hope).
+nxtbuf:        ds      2               ; Pointer to next sector
+seccnt:        ds      1               ; Number of sectors buffered
+endsts:        ds      1               ; Status for last read into buffer
+;
+;
+; [MF] Storage for Remote Command processing
+;
+;
+rdl:   ds      1               ;[MF]Holds accumulated length of remote data
+;
+rcl:   ds      1               ;[MF]Holds length of Remote command line arg
+;
+remdat:        ds      95              ;[MF]Packet data buffer (plenty big)
+;
+rcom:  ds      1               ;[MF] Remote Command type
+;
+rprmpt:        dw      0               ;[MF]Address of prompt strings
+;
+rptr:  dw      0               ;[MF]Remote command packet data pointer
+;
+rscode:        ds      3               ;[MF]Holds Remote Set command ASCII code
+;
+;
+       org     7000h           ; address for Kermit 4.11
+;               ORG     ($ + 0ffH) AND 0ff00H   ; move to start of next page
+
+;
+;       hooks for system-dependent routines:
+;       This area is overwritten by the system-dependent overlay.
+;
+lnkflg:        dw      0       ; linkage information for consistency check.
+lnkent:        dw      0       ; more of the same.
+ovlver:        dw      0       ; pointer to overlay's version string
+family:        dw      0       ;*NEW* [10] address of the family overlay (not CPSSYS)
+;
+; Input/output routines.  Note that outmdm and outcon may actually be the
+;       same routine if selmdm and selcon do anything.  (the same is true
+;       of inpmdm and inpcon).
+;
+selmdm:        jmp     $-$     ; select modem for I/O
+outmdm:        jmp     $-$     ; output character in E to modem
+inpmdm:        jmp     $-$     ; read character from modem. return character or 0 in A.
+flsmdm:        jmp     $-$     ; flush pending input from modem
+selcon:        jmp     $-$     ; select console for I/O
+outcon:        jmp     $-$     ; output character in E to console
+inpcon:        jmp     $-$     ; read char from console. return character or 0 in A
+outlpt:        jmp     $-$     ; output character in E to printer
+lptstat:jmp    $-$     ;*NEW*[10] see if printer ready to print a character
+                       ; If 0ffh then ok, if 0h then not ok.
+extern:        jmp     $-$     ;*NEW for 4.09* If $-$ is not zero, then its a jump to
+                       ; a routine to emulate any terminal type the user
+                       ; wants to implement.
+xbdos: jmp     0       ;*NEW* address of the bdos trap in this section
+                       ; of code.  It is filled in initialisation.
+;
+; screen formatting routines
+clrlin:        jmp     $-$     ; erase current line
+clrspc:        jmp     $-$     ; erase current position (after backspace)
+delchr:        jmp     $-$     ; make delete look like backspace
+clrtop:        jmp     $-$     ; erase screen and go home
+;
+; these routines are called to display a field on the screen.
+scrend:        jmp     $-$     ; move to prompt field
+screrr:        jmp     $-$     ; move to error message field
+scrfln:        jmp     $-$     ; move to filename field
+scrnp: jmp     $-$     ; move to packet count field
+scrnrt:        jmp     $-$     ; move to retry count field
+scrst: jmp     $-$     ; move to status field
+rppos: jmp     $-$     ; move to receive packet field (debug)
+sppos: jmp     $-$     ; move to send packet field (debug)
+;
+sysinit: jmp   $-$     ; program initialization
+sysexit: jmp   $-$     ; program termination
+syscon:        jmp     $-$     ; remote session initialization
+syscls:        jmp     $-$     ; return to local command level
+sysinh:        jmp     $-$     ; help text for interrupt (escape) extensions
+sysint:        jmp     $-$     ; interrupt (escape) extensions, including break
+sysflt:        jmp     $-$     ; filter for incoming characters.
+                       ;  called with character in E.
+sysbye:        jmp     $-$     ; terminate remote session
+sysspd:        jmp     $-$     ; baud rate change routine.
+                       ; called with value from table in DE
+sysprt:        jmp     $-$     ; port change routine.
+                       ; called with value from table in HL
+sysscr:        jmp     $-$     ; screen setup for file transfer
+                       ; called with Kermit's version string in DE
+csrpos:        jmp     $-$     ; move cursor to row B, column C
+sysspc:        jmp     $-$     ; calculate free space for current disk
+mover: jmp     $-$     ; block move
+prtstr:        jmp     $-$     ; *** NEW *** prtstr moved to overlay
+;
+; Data initialized by system-dependent overlay:
+;
+pttab: ds      2       ; points to local equivalents to VT52 escape sequences
+spdtab:        ds      2       ; address of baud rate command table, or zero
+spdhlp:        ds      2       ; address of baud rate help table, or zero
+prttab:        ds      2       ; address of port command table, or zero
+prthlp:        ds      2       ; address of port help table, or zero
+timout:        ds      2       ; Initial value for fuzzy timeout
+vtflg: ds      1       ; VT52 emulation flag
+escchr:        ds      1       ; Storage for the escape character.
+speed: ds      2       ; storage for the baud rate
+port:  ds      2       ; storage for port value
+prnflg:        ds      1       ;[hh] printer copy flag (overlay may need it)
+dbgflg:        ds      1       ; debugging flag
+ecoflg:        ds      1       ; Local echo flag (default off).
+flwflg:        ds      1       ; File warning flag (default on).
+ibmflg:        ds      1       ; IBM flag (default off).
+cpmflg:        ds      1       ; File mode flag (ascii/binary/default)
+incflg:        ds      1               ;[MF]Incomplete flag (keep/discard)
+                               ;[MF](default discard)
+parity:        ds      1       ; Current parity.
+spsiz: ds      1       ; Send packet size.
+rpsiz: ds      1       ; Receive packet size.
+stime: ds      1       ; Send time out.
+rtime: ds      1       ; Receive time out.
+spad:  ds      1       ; Send padding.
+rpad:  ds      1       ; Receive padding.
+spadch:        ds      1       ; Send padding char.
+rpadch:        ds      1       ; Receive padding char.
+seol:  ds      1       ; Send EOL char.
+reol:  ds      1       ; Receive EOL char.
+squote:        ds      1       ; Send quote char.
+rquote:        ds      1       ; Receive quote char.
+chktyp:        ds      1       ; Checksum type desired
+tacflg:        ds      1       ; TACTrap flag (zero=off, nonzero=on; when non-zero,
+                       ;  contains current TAC intercept character)
+tacchr:        ds      1       ; TAC intercept character
+bufadr:        ds      2       ; Pointer to big buffer for multiple-sector I/O
+bufsec:        ds      1       ; Number of sectors big buffer can hold (0 means 256)
+ffussy:        ds      1       ; if nonzero, don't permit <>.,;?*[] in CP/M filespec.
+; space used by directory command; here because space calculation is
+;  (operating) system-dependent
+bmax:  ds      2       ; highest block number on drive
+bmask: ds      1       ; (records/block)-1
+bshiftf: ds    1       ; number of shifts to multiply by rec/block
+nnams: ds      1       ; counter for filenames per line
+
+lnksiz equ     $-lnkflg ; length of linkage section, for consistency check.
+
+       END     START
diff --git a/cpsdef.asm b/cpsdef.asm
new file mode 100644 (file)
index 0000000..46e3ba6
--- /dev/null
@@ -0,0 +1,287 @@
+;       KERMIT - (Celtic for "FREE")
+;
+;       This is the CP/M-80 implementation of the Columbia University
+;       KERMIT file transfer protocol.
+;
+;       Version 4.0
+;
+;       Copyright June 1981,1982,1983,1984,1985
+;       Columbia University
+;
+; Originally written by Bill Catchings of the Columbia University Center for
+; Computing Activities, 612 W. 115th St., New York, NY 10025.
+;
+; Contributions by Frank da Cruz, Daphne Tzoar, Bernie Eiben,
+; Bruce Tanner, Nick Bush, Greg Small, Kimmo Laaksonen, Jeff Damens, and many
+; others. 
+;
+;       This file contains definitions used by both modules of Kermit.
+;
+; revision history:
+;
+;edit 9, 30-Nov-1990 by MF. Make "fairness" count "prfair" be 50 so
+;      console gets checked a bit more often.
+; edit 8, 11-Sep-1990 by MF.  Make default RECEIVE and SEND packet-size
+;      80 (per Kermit standard) as packet size is adjustable in Version
+;      4.10.
+; edit 7 16-Jun-86 OBSchou.  Added cmnum in the command opcodes.  This gets a
+;       number from the user inot variable number.  No checking on overflow.
+;
+; edit 6 13-May-86 OBSchou.  BDOS calls trapped to check for console use
+;       as we want to substitute in commands from a TAKE file.  Trapping
+;       means I dont have to go through an check ever BDOS call...
+;
+; edit 5: 22-Apr-86 by Bertil Schou, Loughborough University, UK
+;       moved some definitions from the CP4SYS.ASM file to here for 
+;       Kermit version 4.06
+;
+; edit 4: 6-Feb-85 by Charles Carvalho
+;       modify pcc007: replace ffussy assembly switch with runtime test.
+;       add "getvnm" - get CP/M version number.
+;
+; edit 3: 13-Jan-85 by Vanya J.Cooper Pima Commun. College Tel: 602-884-6809
+;
+;pcc007 2-Jan-85        vjc     modules:cp4def,cp4cmd
+;       Cmifil is too fussy about what characters to accept in a
+;       filespec.  My CP/M manual says any printable character is ok
+;       except <>.,;:?*[], and lower case.  In practice, even those work
+;       sometimes.  Kermit itself uses '&' if file warning is on,
+;       and then won't let you reference the file.  Allow all
+;       printable characters except those above.  Add conditional
+;       ffussy, so that if not ffussy, all special characters will be
+;       allowed, just convert lower to upper-case.
+;
+;pcc008 2-Jan-85        vjc     modules:cp4def,cp4tt,cp4utl
+;       Keyboard input during CONNECT mode can get locked out if
+;       there is enough input from the modem port to keep prtchr
+;       busy.  This can happen for example, if the printer is running
+;       at the same speed as the modem line, leaving you helpless to
+;       turn it off or abort the host.  Add a fairness count, so that
+;       at least every prfair characters we look at console input.
+;
+; edit 2: July 10, 1984 (CJC)
+;       Remove defines for TRUE and FALSE, during reorganization for LASM
+;       compatibility.  If we're using LASM, this file is linked by CP4KER
+;       or CP4TYP, and links to CP4MIT or CP4LNK.  Also, push comments around
+;       a little.
+;
+; edit 1: May, 1984 (CJC)
+;       extracted from CPMBASE.M80 version 3.9; modifications are described
+;       in the accompanying .UPD file.
+;
+
+;Symbolic Definitions for some ASCII characters
+;
+soh     EQU     01O     ;ASCII SOH (Control-A)
+cntlc  EQU     03O     ;ASCII ETX (Control-C)
+ctrlc   EQU     03O     ;ASCII ETX (Control-C)
+bell    EQU     07O     ;ASCII BEL (Control-G)
+bs      EQU     10O     ;ASCII backspace (Control-H)
+tab     EQU     11O     ;ASCII Tab (Control-I)
+lf      EQU     12O     ;ASCII Line Feed (CTRL-J)
+ff      EQU     14O     ;ASCII Form Feed (CTRL-L)
+cr      EQU     15O     ;ASCII Carriage Return (CTRL-M)
+space  EQU     20h     ;ASCII Space
+xon     EQU     21O     ;ASCII XON (Control-Q)
+xoff    EQU     23O     ;ASCII XOFF (Control-S)
+esc     EQU     33O     ;ASCII ESCape
+semico EQU     3bh     ;ASCII Semicolon
+subt    EQU     32O     ;ASCII SUB (CTRL-Z)
+cntlz   EQU     subt    ;ASCII SUB (Control-z) [6]
+ctrlz  EQU     subt    ;ASCII SUB (Control-z)
+del     EQU     177O    ;ASCII DELete (rubout)
+;\f
+;BDOS calls
+IF NOT cpsker   ;[6] If CPSKER is truem then system indep. stuff.  We want
+                ;to trap BDOS calls and test for console activity
+bdos    EQU     0005H   ;BDOS entry point, for the following functions:
+ENDIF   ;NOT cpsker [6]
+;
+;Function Name          Function        Input Parameters Output Parameter
+;=============          ========        ================ ================
+;       (ALL Function Numbers are passed in Register C)
+conin   EQU     01H     ;Read Console   NONE             ASCII Char in A
+conout  EQU     02H     ;Write Console  ASCII Char in E  NONE
+auxin   EQU     03H     ;Auxiliary input
+rdrin   EQU     03H     ;Read Reader    NONE             ASCII Char in A
+lstout  EQU     05H     ;Write List     ASCII Char in E  NONE
+dconio  EQU     06H     ;Direct Con I/O ASCII Char in E  I/O Status in A
+                        ;                                if E=0FEH,
+                        ;                                 Input if E=0FFH
+prstr   EQU     09H     ;Print String   String-Address   NONE
+                        ;               in DE (term=$)
+rdstr   EQU     0AH     ;Read Buffer    Buffer-Address  Read Buffer filled
+;                                       in DE
+;       Read Buffer     Byte    Function
+;                         1     Maximum Buffer Length
+;                         2     Current Buffer Length (returned value)
+;                       3-n     Data (returned values)
+;
+consta  EQU     0BH     ;Console Stat   NONE            LSB(A)=1 if char ready
+getvnm  EQU     0CH     ;Version Number NONE            H=0 (CP/M), L=BDOS ver
+inbdos  EQU     0DH     ;Init BDOS      NONE            NONE
+logdsk  EQU     0EH     ;LOG-In disk    Value in E      NONE
+                        ;               A=0,B=1,...
+openf   EQU     0FH     ;Open File      FCB-Addr in DE  Byte Addr.of FCB,
+                        ;                                or 0FFH if not
+closf   EQU     10H     ;Close File     FCB-Addr in DE  Byte Addr.of FCB,
+                        ;                                or 0FFH if not
+sfirst  EQU     11H     ;Search File    FCB-Addr in DE  Byte Addr.of FCB(0-3),
+                        ;                                or 0FFH if not
+snext   EQU     12H     ;Search next    FCB-Addr in DE  Byte Addr.of next FCB,
+                        ;                                or 0FFH if not
+delf    EQU     13H     ;Delete File    FCB-Addr in DE  Byte Addr.of FCB(0-3),
+                        ;                                or 0FFH if not
+readf   EQU     14H     ;Read Record    FCB-Addr in DE  0=successful read
+                        ;                               1=read past EOF
+                        ;                               2=reading random data
+writef  EQU     15H     ;Write Record   FCB-Addr in DE  0=successful write
+                        ;                               1=ERROR extending
+                        ;                               2=End of disk data
+                        ;                               255=No more DIR space
+makef   EQU     16H     ;Make File      FCB-Addr in DE  0-3= success,
+                        ;                               255= no more dir space
+renam   EQU     17H     ;Rename File    FCB-Addr in DE  0-3= success,
+                        ;                               255= file not found
+rdlog   EQU     18H     ;Ret. Log Code  NONE            Login Vector in HL
+rddrv   EQU     19H     ;Read Drive #   NONE            # of logged in drive in
+                        ;                               (A=0,B=1,C=2....)
+setdma  EQU     1AH     ;Set DMA Addr.  Addr. of 128    NONE
+                        ;               byte buffer in DE
+wrtprt  EQU     1CH     ;Write prot dsk NONE            NONE
+getrov  EQU     1DH     ;Get R/O Vect.  NONE            HL= R/O Vect. value
+setfat  EQU     1EH     ;Set File Attr. FCB-Addr.in DE  Dir. code in A
+gtdpar  EQU     1FH     ;Get DSK par.   NONE            HL=DPB Address
+usrcod  EQU     20H     ;Get/Set Usr.Cd E=0FFH (get)    A=current code (get)
+                        ;               E-code (set)    A=no value (set)
+rrand   EQU     21H     ;Read  Random   FCB-Addr in DE  A=Return code
+wrand   EQU     22H     ;Write Random   FCB-Addr in DE  1=read'g unwritten data
+                        ;                               2=(not used)
+                        ;                               3=can't close curr. ext
+                        ;                               4=seek to unwr. ext.
+                        ;                               5=dir overflow(write)
+                        ;                               6=seek past End of DSK
+cflsz   EQU     23H     ;Comp File Sz.  FCB Addr.in DE  Rand.Rec.field set to
+                        ;                                File size
+setrar  EQU     24H     ;Set Rand. Rec. FCB-Addr.in DE  Rand.Rec.field set
+
+; CPM 2 only:
+punout  EQU     04H     ;Write Punch    ASCII Char in E  NONE
+gtiob   EQU     07H     ;Get I/O status NONE             I/O Status in A
+ptiob   EQU     08H     ;Put I/O status I/O Status in E  NONE
+getalv  EQU     1BH     ;Get All.Vect.  NONE            All.Vect in HL
+
+; CPM 3 only:
+auxout  EQU     04H     ;Auxiliary output
+auxist  EQU     07H     ;Get AUXIN: status               A=FF if character
+                        ;                                ready, A=0 if none
+auxost  EQU     08H     ;Get AUXOUT: status              A=FF if ready, A=0
+                        ;                                if not ready
+getfs   EQU     2EH     ;Get free space E=drive         # rec free in dma addr
+;\f
+parevn  EQU     00H     ;Even parity.
+parmrk  EQU     03H     ;Mark parity.
+parnon  EQU     06H     ;No parity (eighth bit is data).
+parodd  EQU     09H     ;Odd parity.
+parspc  EQU     0CH     ;Space parity.
+
+defpar  EQU     parnon  ;Default parity.
+ibmpar  EQU     parmrk  ;IBM COMTEN's parity.
+
+fcb     EQU     5CH     ;Location of File Control Block.
+fcbext  equ     fcb+12
+fcbrno  equ     fcb+33
+buff    EQU     80H     ;Location of file output buffer (DMA).
+bufsiz  EQU     80H     ;Size of DMA.
+
+maxfcb  equ     64      ; maximum of 64 fcbs to be stored in multiple fcb bock
+
+maxpkt  EQU    '~'-' '+2O;Maximum size of a packet.
+maxtry  EQU     05O     ; Number of retries on a packet.
+imxtry  EQU     20O     ; Number of retries send initiate.
+prfair  EQU     50     ;[pcc008] Prtchr fairness count
+
+; opcodes for command parser
+cmkey   EQU     01H     ;Parse a keyword.
+cmifi   EQU     02H     ;Parse an input file spec (can be wild).
+cmofi   EQU     03H     ;Parse an output file spec.
+cmcfm   EQU     04H     ;Parse a confirm.
+cmtxt   EQU     05H     ;Parse text.
+cmnum   EQU     06h     ;Parse a number
+cmifin  EQU     10H     ;Parse an input file spec (but no
+                        ;Error output
+
+;[4] from CP4SYS.ASM
+;\f
+;=========================================================================
+;       I/O Byte assignments (2-bit fields for 4 devices at loc 3)
+;
+;bits 6+7               LIST field
+;       0               LIST is Teletype device (TTY:)
+;       1               LIST is CRT device (CRT:)
+;       2               LIST is Lineprinter (LPT:)
+;       3               LIST is user defined (UL1:)
+;
+;bits 4+5               PUNCH field
+;       0               PUNCH is Teletype device (TTY:)
+;       1               PUNCH is high speed punch (PUN:)
+;       2               PUNCH is user defined #1 (UP1:)
+;       3               PUNCH is user defined #2 (UP2:)
+;
+;bits 2+3               READER field
+;       0               READER is Teletype device (TTY:)
+;       1               READER is high speed reader (RDR:)
+;       2               READER is user defined #1 (UR1:)
+;       3               READER is user defined #2 (UR2:)
+;
+;bits 0+1               CONSOLE field
+;       0               CONSOLE is console printer (TTY:)
+;       1               CONSOLE is CRT device (CRT:)
+;       2               CONSOLE is in Batch-mode (BAT:);READER = Input,
+;                       LIST = Output
+;       3               CONSOLE is user defined (UC1:)
+;
+;=========================================================================
+
+iobyte  EQU     03H     ;Location of I/O byte
+
+;[4] From CP4SYS.ASM
+;
+;\f
+;
+;       Protocol parameters.  Some of these can be changed with commands.
+;
+
+drpsiz  SET     50H     ;Default receive packet size. (maximum is 5EH)
+dspsiz  SET     50H     ;Default send packet size. (maximum is 5EH)
+dstime  SET     08H     ;Default send time out interval.
+drtime SET     05      ;Default receive time out interval
+
+dspad   EQU     00H     ;Default send padding.
+drpad   EQU     00H     ;Default receive padding.
+dspadc  EQU     00H     ;Default send padding char.
+drpadc  EQU     00H     ;Default receive padding char.
+dseol   EQU     CR      ;Default send EOL char.
+dreol   EQU     CR      ;Default receive EOL char.
+dsquot  EQU     '#'     ;Default send quote char.
+drquot  EQU     '#'     ;Default receive quote char.
+dschkt  EQU     '1'     ;Default checksum type
+;
+
+; Define VT or Terminal type values
+vtdefo EQU     0       ;VT52 emulation by terminal itself.
+vtdefv EQU     1       ;VT52 emulation by ttab tables in CPXVDU.ASM etc
+vtdefd EQU     2       ;Dumb Terminal (Just prints)
+vtdefe EQU     3       ;Termianl emulation done outside (in overlay)
+
+
+; If this is being assembled by LASM, we need to LINK to one of two modules;
+; if we're not using LASM, no problem.
+; CPSKER.ASM defines "cpsker" TRUE, and CPXTYP.ASM defines it FALSE, so we can
+; determine what's going on.
+IF lasm AND cpsker      ; building CP4KER with LASM?
+        LINK    CPSMIT  ; yes, chain to next piece.
+ENDIF;lasm AND cpsker
+IF lasm AND NOT cpsker  ; LASM, but not building CP4KER?
+        LINK    CPXLNK  ; yes, chain to different piece.
+ENDIF;lasm AND NOT cpsker
diff --git a/cpsker.asm b/cpsker.asm
new file mode 100644 (file)
index 0000000..254d056
--- /dev/null
@@ -0,0 +1,315 @@
+; CPSKER.ASM
+;       KERMIT - (Celtic for "FREE")
+;
+;       This is the CP/M-80 implementation of the Columbia University
+;       KERMIT file transfer protocol.
+;
+;       Version 4.0
+;
+;       Copyright June 1981,1982,1983,1984
+;       Columbia University
+;
+; Originally written by Bill Catchings of the Columbia University Center for
+; Computing Activities, 612 W. 115th St., New York, NY 10025.
+;
+; Contributions by Frank da Cruz, Daphne Tzoar, Bernie Eiben,
+; Bruce Tanner, Nick Bush, Greg Small, Kimmo Laaksonen, Jeff Damens, and many
+; others. 
+;
+;
+; This is the header for the system-independent portion of KERMIT, which
+; consists of the following files (in this order):
+;
+;       CPSKER.ASM - this file
+;       CPSDEF.ASM - definitions for both KERMIT and KERSYS
+;       CPSMIT.ASM - \initialization, main loop, miscellaneous commands 
+;      CPSCOM.ASM - /(BYE, EXIT, LOG, SET, SHOW, and STATUS) (Part1 of 2)
+;       CPSPK1.ASM - \the KERMIT protocol handler (SEND, RECEIVE, LOGOUT,
+;       CPSPK2.ASM - / and FINISH commands) (In two parts)
+;      CPSREM.ASM - REMOTE commands etc
+;      CPSSER.ASM - SERVER commands etc (Empty as yet)
+;       CPSTT.ASM  - the transparent commands (TRANSMIT, CONNECT)
+;       CPSCPM.ASM - CP/M commands (DIR, ERA)
+;       CPSWLD.ASM - the wildcard handler
+;       CPSCMD.ASM - the command parser
+;       CPSUTL.ASM - utility routines
+;       CPSDAT.ASM - Data space and the overlay link space
+;
+; When building the system-independent part with M80 or MAC80, CPSKER
+; INCLUDEs the other files; when building with LASM, each file LINKs to
+; the next file.
+;
+; For now, the system-dependent routines are all in CPSSYS.ASM, with
+; the actual configuration defined in CPSTYP.ASM.
+;
+; revision history (latest first):
+;
+;      Begin CP/M Kermit-80 version 4.11.
+;edit 32, 1-Apr-1991 by MF. Official release of work to date as CP/M Kermit
+;      (Kermit-80) Version 4.11.
+;      Modified edit level of cpscpm.asm to reflect a bug fix for the TYPE
+;      command introduced with edit 13.
+;edit 31, 29-Mar-1991 by MF. Modified edit levels of cpsker.asm,
+;      cpscom.asm and cpsdat.asm to reflect rename of parameter vermin to
+;      revno (revision level) and change of SET COLLISION REPLACE to
+;      SET COLLISION OVERWRITE to conform with C-Kermit. Modified
+;      edit level of cpsrem.asm to reflect change from REMOTE SET FILE
+;      COLLISION REPLACE to REMOTE SET FILE COLLISION OVERWRITE.
+;      Modified edit level of cpsutl.asm to reflect code tightening and
+;      edit levels of cpsmit.asm and cpspk2.asm to close any open TAKE-file
+;      and abort take-file processing if ^C is typed from the console
+;      Also corrected ^Z test in cpsmit.asm in INPUT command ("inp2b")
+;      Implement "file not found" complaint if a TAKE command can't find
+;      the TAKE-file and it's not the initial TAKE (KERMIT.INI)
+;      Modified edit level of cpscpm.asm to reflect modification of the
+;      TYPE and PRINT commands to cancel file typeout/printout completely
+;      if ^C is entered on the console (either immediately or after a key
+;      has been pressed to induce a pause) and to immediately begin
+;      typeout/printout of the next file (if the filespec was wild-carded)
+;      if ^X is entered (either immediately or after a key has been pressed
+;      to induce a pause).
+;      Modified edit levels of cpsmit.asm and cpscom.asm to reflect addition
+;      of the STAY command as a synonym for SET NO-EXIT.
+;edit 30, 27-Feb-1991 by MF. Modified edit levels of cpscom.asm,
+;      cpsmit.asm, cpsutl.asm and cpsdat.asm to reflect provision for
+;      a "revision level" field (1-26=A-Z), addition of QUIT as a synonym
+;      for the EXIT command, recognition of C, R and S as abbreviations
+;      for the CONNECT, RECEIVE and SEND commands, respectively, display
+;      of Kermit version in the VERSION command and a fix to the TAKE-file
+;      input routine "r1tchr" to prevent semicolons from being interpreted
+;      as command separators during TAKE-file execution. This last fix
+;      allows such commands as REMOTE DELETE *.*;* to Kermit-32 to
+;      operate as expected.
+;edit 29, 14-Feb-1991 by MF. Updated edit levels of cpscom.asm,
+;      cpscpm.asm, cpsdat.asm and cpsrem.asm to reflect bug fixes,
+;      code tightening and simplified routine "remcli" (in cpsrem.asm)
+;      which gets text to be passed on to a remote Kermit in REMOTE
+;      Kermit commands.
+;edit 28, 8-Feb-1991 by MF. Changed edit level of cpscpm.asm to reflect
+;      a bug fix to make TAKE-files work properly with commands such as
+;      INPUT which check the keyboard for input.
+;edit 27, 30-Jan-1991 by MF. Changed edit levels of cpscpm.asm, cpsrem.asm,
+;      cpstt.asm and cpsutl.asm to reflect bug fixes and enhancements
+;edit 26, 17-Jan-1991 by MF. Changed edit level of cpscmd.asm to
+;      reflect fixes to allow leading spaces/tabs to be ignored when
+;      parsing keywords (this was the intent but the code never worked
+;      correctly) and to blank the entire fcb in "cmifil" to allow successive
+;      COPY commands to function properly. Also changed edit level of
+;      cpspk1.asm to reflect further work on "disk full" error reporting.
+;edit 25, 14-Jan-1991 by MF. Incremented edit level of cpspk1.asm to
+;      reflect bug fix to "disk full" error reporting code so <cr><lf>
+;      is not sent directly to the Remote Kermit. This per a report from
+;      Russell Lang of Australia's Monash University.
+;edit 24, 10-Jan-1991 by MF. Modified edit level of cpxtyp.asm to
+;      reflect addition of "terminal required" message for some.
+;      machines.
+;edit 23, 7-Jan-1991 by MF. Modified edit levels of cpxtyp.asm, cpxswt.asm,
+;      cpxbbi.asm to reflect addition of Ampro Little Board support.
+;edit 22, 3-Jan-1991 by MF. Incremented edit levels of cpspk1.asm/cpspk2.asm
+;      to reflect further mods to "sdata" and "inchr" routines.
+;edit 21, 2-Jan-1991 by MF. Incremented edit level of cpspk1.asm to reflect
+;      code cleanup in "sdata" routine.
+;edit 20, 26-Dec-1990 by MF. Modified edit level of CPSCMD.ASM to reflect
+;      fix to allow leading white space to be skipped in lines from
+;      TAKE-files as well as from the CP/M command-line tail; this per a
+;      phoned-in bug-report to Dr. Martin J. Carter of Nottingham
+;      University in the U.K. (PPZMAJOC@vax.ccc.nottingham.ac.uk)
+;edit 19, 14-Dec-1990 by MF.  Modified edit level of cpspk2.asm to reflect
+;      modification to "gofil" to allow drive specifications in 2nd
+;      filename of GET and RECEIVE commands; also modified edit levels of
+;      cpspk1.asm and cpsrem.asm to reflect addition of "<<>>" around
+;      "X" or "F" packets coming as a reply to a REMOTE command and
+;      deletion of an unnecessary instruction before label remc2d
+;      in cpsrem.asm.
+;edit 18, 9-Dec-1990 by MF. Modified edit levels for Version 4.10
+;      yet another time to reflect changes in CPSDAT.ASM to clarify
+;      "File size on DIR" status message.
+;edit 17, 4-Dec-1990 by MF. Adjusted edit levels of cpscom.asm/cpsdat.asm
+;      to reflect addition of Autoreceive status to SHOW/STATUS display.
+;edit 16, 30-Nov-1990 by MF. Adjusted edit levels of cpscom.asm/cpsdat.asm
+;      to reflect fix to SHOW/STATUS routines to show terminal display
+;      mode (quiet/regular). Also adjusted edit level of cpsutl.asm to reflect
+;      change to routine "p20ln" to use "pausit" to save code space.
+;      Adjusted edit level of cpsdef.asm to reflect change in "fairness"
+;      counter prfair from 100 to 50 to make terminal a bit more responsive
+;      during CONNECTs.
+;edit 15, 27-Nov-1990 by MF. Adjusted edit level of cpspk1.asm to reflect
+;      a bug fix.
+;edit 14, 27-Nov-1990 by MF. Again adjusted edit level of cpspk1.asm to
+;      reflect modifications of "disk-full"and SET INCOMPLETE-FILES behavior.
+;edit 13, 23 Nov-1990 by MF.  Adjusted edit level of cpspk1.asm to reflect
+;      code changes for "disk full" processing.
+;edit 12, 8-Nov-1990 by MF.
+;      Adjusted edit levels shown for cpscom.asm/cpspk1.asm/cpsdat.asm to
+;      reflect bug fixes and code revisions.
+;edit 11, 5-Nov-1990 by MF.
+;      Cosmetic changes for main help text for COPY and RENAME commands.
+;      Begin CP/M Kermit-80 version 4.10.
+;edit 10, 2-Nov-1990 by MF.  Moved Overlay address to 7000H (cpsdat.asm).
+;edit 9, 1-Nov-1990 by Mike Freeman (BPA).  Cosmetic changes (command-name
+;      changes:  SET BAUD-RATE==>SET SPEED, FCOPY==>COPY, FRENAME==>RENAME,
+;      STRING==>OUTPUT, REMOTE CWD==>REMOTE CD per suggestions of FDC
+;      to aid in uniformity of nomenclature for various Kermits.
+;edit 8, 30-Oct-1990 by Michael Freeman; 301 N.E. 107th Street;
+;      Vancouver, WA 98685 USA; Telephone (206)574-8221.
+;      Work:  Bonneville Power Administration
+;      P.O. Box 491 M/S MORF
+;      Vancouver, WA USA 98666
+;      Telephone (206)690-2307
+;      Implemented FRENAME command to rename a CP/M file.
+;      Implemented many Remote commands, variable-length packets up thru
+;      94 characters in length.  Fixed a bug in CPSCOM.ASM in the
+;      routine "getnp" and a bug in CPSCOM.ASM which caused garbage to appear
+;      on the screen when PRTSTR was called with QUIETD flag set.
+;      Modified code in module CPSCMD.ASM to skip leading spaces and tabs
+;      when getting Kermit commands from the CP/M command line.  This also
+;      obviates the necessity to type a leading semicolon to separate the
+;      Kermit command from the Kermit commands on the CP/M command line.
+;      Fixed code in CPSPK2.ASM which handles file collision detection
+;      and resulting file rename per my entries in CPKERM.BWR.
+;      and included fix by Russell Lang of Dept. of Electrical and Computer
+;      Engineering, Monash University, Australia, to prevent renamed
+;      files with SET WARNING ON from having the attributes (e.g., R/O)
+;      copied from original file.  Mr. Lang's E-mail address is:
+;      Russell Lang    Email: rjl@monu1.cc.monash.edu.au  Phone: (03) 565 3460
+;      Department of Electrical and Computer Systems Engineering
+;      Monash University, Australia
+;      Also fixed a bug in CPSPK2.ASM which prevented completion messages
+;      from being displayed if terminal was set to QUIET.
+;      Implemented most proposed SET FILE-COLLISION (COLLISION) commands.
+;      Implemented SET INCOMPLETE file disposition command.
+;      Implemented a few of the proposed REMOTE SET commands.
+;      Implemented other fixes suggested in CPKERM.BWR.
+;      Moved overlay address to 6C00H.
+;      Changed location of .printx in this file so LASM doesn't complain.
+;      In system-dependent modules, included HP-125 support.
+;      Also modified Telcon Zorba code in CPXHEA.ASM to enable setting
+;      of baud-rates and sending of a break.
+;      Included Russell Lang of Monash Univ. Australia's implementation
+;      for the Microbee series of computers (CPXBEE.ASM).
+;      Fixed COMPUPRO version of Kermit to compile correctly and to
+;      conform to current syntax for setting baud-rate.
+; edit 7, September, 1987.  Added files for SERVER and REMOTE 
+;      modules (CPSSER/CPSREM).  SERVER is still empty, and may be 
+;      only wishfull thinking.  I have ideas, but I dont think I 
+;      will have the time to implement it.
+;
+; edit 6: 30 March, 1987 by OBSchou.  Start Kermit-80 V4.09 with the 
+;      overlay address at 6000h.  Also adjusted the INCLUDEs to allow
+;      M80 to assmeble these files.
+;
+; edit 5: 20 June, 1986.  Have added so much code etc that the overlay had to 
+;       be moved again.. give it to 5000h.  This starts off Kermit-80 V4.08
+;
+; edit 4 22 April 1986
+;       Start work on 4.06.  This should clear up a couple of bugs, add in
+;       a few features, and split the system dependent stuff into 
+;       smaller units.
+;
+; edit 3a 7 March 86 OBSchou Loughborough england.  Minor additions
+;       to cpsker.asm, cpscmd.asm and cpspkt.asm.
+;
+; edit 3: February 10, 1985 (CJC)
+;       Update for v4.05; add "verno" so CPSUTL doesn't have to change
+;       just because some other module did.
+;
+; edit 2: September 10, 1984 (CJC)
+;       Update for v4.03.
+;
+; edit 1: July 27, 1984 (CJC)
+;       Created to allow assembly of Kermit by LASM as well as MAC80 and M80.
+
+verno  EQU     11              ; minor version number
+revno  EQU     0               ;[MF]Revision level
+                               ;[MF]0-26 yields A-Z
+       
+; Version 4.10 of Kermit consists of the following edit levels:
+;       cpsker.asm edit 32
+;       cpsdef.asm edit 9
+;       cpsmit.asm edit 30
+;       cpscom.asm edit 13
+;       cpspk1.asm edit 23
+;       cpspk2.asm edit 11
+;       cpsrem.asm edit 13
+;       cpsser.asm edit 1
+;       cpstt.asm  edit 12
+;       cpscpm.asm edit 14
+;       cpswld.asm edit 4
+;       cpscmd.asm edit 13
+;       cpsutl.asm edit 30
+;      cpsdat.asm edit 19
+;       cpxlnk.asm edit 8 (cpslnk.asm is not assembled with cpsker, but it
+;               defines the linkage area expected by cpsker, and so must
+;               match the description in cpsutl.asm)
+;      cpxswt.asm edit 10
+;
+; Version 4.10 of Kermit has been tested with the following edit levels of
+; the system-dependent files:
+;       cpxtyp.asm edit 34
+;       cpxsys.asm edit 40
+;      cpxhea.asm edit 4
+;      cpxtor.asm edit 4
+;      cpxbbi.asm edit 4 (Ampro Little Board)
+;
+; Version 4.10 of Kermit is still to be tested fully against all known systems
+; so far included in the system dependent overlays.
+;
+
+
+FALSE  equ     0
+TRUE   equ     NOT FALSE
+
+cpsker equ     TRUE    ; building system-independent part
+debug  equ     FALSE   ; set false for running system.  True => does some
+                       ; unusual or unexpected things.
+;
+; Assembler type.  Define the appropriate one TRUE, the rest FALSE.  (We can't
+; use ASM, because it cannot handle multiple input files)
+mac80  EQU     FALSE           ; For assembly via MAC80 cross-assembler.
+m80    EQU     false           ; For assembly via Microsoft's M80.
+lasm   EQU     true            ; For assembly via LASM, a public-domain
+                               ; assembler.
+;
+;       Get the other modules...
+
+IF lasm                                ; If we're linking, go on to the next file.
+       LINK    CPSDEF
+ENDIF;lasm
+
+; If we're still here, we must be using M80 or MAC80.  M80 doesn't
+; like ENDs inside conditionals, but the END statement has to be
+; in CPSUTL for LASM (otherwise, we'd need a file containing just an
+; END statement).  So, we leave off the IF m80 OR mac80 conditional
+; that ought to be around these INCLUDEs.  No problem until the next
+; incompatible assembler comes along...
+; Let's first say where we are:
+;
+.printx        * CPSKER.ASM (or nearest offer) *
+;
+.printx        * CPSDEF.ASM *
+       INCLUDE CPSDEF.ASM      ; definitions
+.printx        * CPSMIT.ASM *
+       INCLUDE CPSMIT.ASM      ; initialization, main loop, some commands
+.printx * CPSCOM.ASM *
+       INCLUDE CPSCOM.ASM      ; part of command/status/set etc
+.printx        * CPSPK1.ASM *
+       INCLUDE CPSPK1.ASM      ; KERMIT protocol handler (Part 1)
+.printx        * CPSPK2.ASM *
+       INCLUDE CPSPK2.ASM      ; KERMIT protocol handler (Part 2)
+.printx * CPSREM.ASM *
+       INCLUDE CPSREM.ASM      ; Kermit REMOTE code (little in it, as yet)
+.printx * CPSSER.ASM *
+       INCLUDE CPSSER.ASM      ; Kermit SERVER code (As yet, empty)
+.printx        * CPSTT.ASM *
+       INCLUDE CPSTT.ASM       ; transparent communication handler
+.printx        * CPSCPM.ASM *
+       INCLUDE CPSCPM.ASM      ; CP/M command support (DIR, ERA)
+.printx        * CPSWLD.ASM *
+       INCLUDE CPSWLD.ASM      ; wildcard handler
+.printx        * CPSCMD.ASM *
+       INCLUDE CPSCMD.ASM      ; command parser
+.printx        * CPSUTL.ASM *
+       INCLUDE CPSUTL.ASM      ; Various utilities and data, and END [ToadHall]
+.printx * CPSDAT.ASM *
+       INCLUDE CPSDAT.ASM
+       END                     ; MAC80 ignores END's in included files...
diff --git a/cpsker.hex b/cpsker.hex
new file mode 100644 (file)
index 0000000..9120b31
--- /dev/null
@@ -0,0 +1,1589 @@
+:100100000000C32701C3C201C3234F4350534D49CD
+:10011000542E41534D20283330292032392D4D6142
+:10012000722D313939312421000039220F63319188
+:1001300063117C54CD554F0E19CD82513C329463DE
+:100140003A8670FEFF3E00C24D013286702A007072
+:100150007CB5CAB0011154FF197CB5C2B9012A029D
+:100160007011FAFF197CB5C2B901218251222770A2
+:10017000CD4D703AA570322D6711C95ACD777021D7
+:10018000800011A26A018000CD74703A8000A7CA75
+:10019000A1013DCAA1013AAD63F61032AD6332ACA4
+:1001A000633EFF322C67CD1A08AF32AE63C3C20183
+:1001B000115556CD554FC3D006118B56CD554FC353
+:1001C000D006319163CD1470AF32324732334732AB
+:1001D000344732AC6C3271623272623299663A9450
+:1001E00063C64032C654CD09543AA26CFE30C2F305
+:1001F000013E2032C4543AA16C32C5543AAD63E694
+:1002000011C20B023AAC63A7C2CA0611B954CD524F
+:1002100047112502213C03CD084FEBE911E554CDF0
+:100220007770C3C2012005425245414B24AA060300
+:1002300042594524BB06014324CA3D07434F4E4E55
+:1002400045435424CA3D04434F5059249344094420
+:1002500049524543544F525924E4400545524153B5
+:100260004524C042044558495424CA060646494E0E
+:10027000495348240F270347455424371904484558
+:100280004C5024850705494E50555424D306034C41
+:100290004F47249107064C4F474F55542465270676
+:1002A0004F555450555424DC18055041555345249E
+:1002B000B307055052494E5424F60704515549548A
+:1002C00024CA060152246D19075245434549564533
+:1002D000246D190652454D4F544524542D06524560
+:1002E0004E414D45248345015324A31D0453454EDF
+:1002F0004424A31D035345542484080453484F57F2
+:100300002449150653544154555324551504535448
+:1003100041592458100454414B45240908085452AB
+:10032000414E534D495424283C04545950452447C8
+:10033000430756455253494F4E241D180D0A425249
+:1003400045414B20746F2073656E6420612062729A
+:1003500065616B20746F2074686520686F73740D1D
+:100360000A42594520746F20686F737420284C4FDF
+:10037000474F55542920616E642065786974207454
+:100380006F2043502F4D0D0A434F4E4E454354208E
+:10039000746F20686F7374206F6E2073656C656373
+:1003A00074656420706F72740D0A434F5059207445
+:1003B0006F20636F707920612043502F4D20666954
+:1003C0006C650D0A4449524543544F5259206F669B
+:1003D0002063757272656E742075736564204D6953
+:1003E00063726F2D6469736B0D0A4552415345204A
+:1003F000612043502F4D2066696C650D0A455849B0
+:100400005420746F2043502F4D0D0A46494E4953D6
+:10041000482072756E6E696E67204B65726D6974E7
+:10042000206F6E2074686520686F73740D0A4745ED
+:100430005420612066696C652066726F6D20746857
+:100440006520686F73740D0A48454C50206279200E
+:10045000676976696E672074686973206D65737368
+:100460006167650D0A494E50555420746F206D61C7
+:100470006B6520746865206D6963726F20776169B0
+:100480007420666F72206120737472696E672066D3
+:10049000726F6D2074686520686F73740D0A4C4F1D
+:1004A0004720746865207465726D696E616C207395
+:1004B000657373696F6E7320746F20612066696C59
+:1004C000650D0A4C4F474F55542074686520686F7E
+:1004D00073740D0A4F555450555420746F20736532
+:1004E0006E6420612073706563696669656420735A
+:1004F0007472696E6720746F2074686520686F730A
+:10050000740D0A504155534520746F20776169740A
+:1005100020666F722061206C6974746C6520746948
+:100520006D650D0A5052494E5420612066696C6514
+:1005300020746F20746865207072696E7465720D26
+:100540000A5155495420746F2043502F4D0D0A52C3
+:100550004543454956452066696C652066726F6D56
+:1005600020686F73740D0A52454D4F544520746FC7
+:100570002073656E6420636F6D6D616E64732074AB
+:100580006F20612072656D6F74652073657276658A
+:10059000720D0A52454E414D4520746F2072656EB2
+:1005A000616D6520612043502F4D2066696C650D9B
+:1005B0000A53454E442066696C6520746F20686F4D
+:1005C00073740D0A534554206120706172616D652A
+:1005D0007465720D0A53484F572074686520706126
+:1005E00072616D65746572730D0A535441545553AD
+:1005F000206F66204B65726D69740D0A5354415922
+:10060000206174204B65726D697420636F6D6D613C
+:100610006E642D6C6576656C206166746572206110
+:1006200020636F6D6D616E64207461696C0D0A5496
+:10063000414B4520636F6D6D616E64732066726F10
+:100640006D20612066696C650D0A5452414E534D10
+:1006500049542066696C6520746F20686F7374203C
+:1006600028696E20636F6E6E6563742073746174A5
+:1006700065290D0A5459504520612066696C652032
+:10068000746F2074686520636F6E736F6C650D0AFC
+:1006900056455253494F4E206F66204B65726D6927
+:1006A000742072756E6E696E6724CD1A4F3E42CD0E
+:1006B0005C70C3C20111AF58C3C201CD1A4FCD71D6
+:1006C00027C3C201CD6270C3CD06CD1A4FCD507085
+:1006D000C300003E06CDA547C3C2012A2A67221BDC
+:1006E00067119B663E05CDA547C3C20132226BCD83
+:1006F0001A4F2A1B6729292923221B67221D67AF4E
+:10070000326D652A1B672B221B677CB5C217073E1B
+:1007100003329766C37C07CDA63DE67FC24E07CD68
+:100720008844F5CD0870F1E67FC236073A226BA700
+:10073000C20307C3C201FE03C246073AAD63E60126
+:10074000C47752C3C201FE1ACAC201C303075F3A8B
+:100750006D65219B66856F3E008C677BBEC2FF0680
+:100760003A6D653C326D652A1D67221B675F3A2230
+:100770006B93C20307AF329766C3C201119857CD7E
+:100780007770C3C201CD1A4F113C03CD3554C3C29B
+:10079000013E03115C00CDA547C31C02CD1A4F21B9
+:1007A0005C0011A063010C00CD74703E01329F63A8
+:1007B000C3C2013E06CDA547C3C2012A2A67EB2A60
+:1007C00027677CE67F6719222A67CD8B523AAD6393
+:1007D000A7C2DF070E061EFFCD8251A7C2C2012AA3
+:1007E0002A67EB2A27677CE67F677B955F7A9CB355
+:1007F000C2CA07C3C2013EFF322067CD4743AF32B2
+:100800002067C3C201AFC3F8073E0211BD63CDA587
+:1008100047C3C201CD2608C3C201010C0011BD634C
+:1008200021AF63CD74703AAD63E601C477520E1AFE
+:1008300011E163CD8251AF32CB6332DD6311BD6311
+:100840000E0FCD82513CCA5A0821000022BB633AE8
+:10085000AD63F60132AD63C353523AAE63B7C01114
+:10086000C355CD7770C37A51435053434F4D2E41FA
+:10087000534D20283133292032352D4D61722D31D1
+:1008800039393124118F0821D109CD084FEBE91AEC
+:100890000B4155544F52454345495645241A0D10B6
+:1008A000424C4F434B2D434845434B2D54595045E3
+:1008B00024230D0B4255464645522D53495A452493
+:1008C000C00D09434F4C4C4953494F4E2463110509
+:1008D00044454255472491100C44454641554C54DB
+:1008E0002D4449534B24E70D134449524543544F7B
+:1008F00052592D46494C452D53495A45247B1106E2
+:10090000455343415045246B100946494C452D4DF4
+:100910004F444524B4110C464C4F572D434F4E5471
+:10092000524F4C2472110349424D24841110494EF8
+:10093000434F4D504C4554452D46494C455324F9A1
+:10094000110A4C4F43414C2D4543484F247F10071B
+:100950004C4F4747494E47246210074E4F2D45588C
+:10096000495424581006504152495459242B12041A
+:10097000504F525424D314075052494E54455224D8
+:100980008810075245434549564524830F04534573
+:100990004E4424110E05535045454424B5140754C4
+:1009A000414354524150247E12085445524D494E01
+:1009B000414C2431130554494D4552249A10045595
+:1009C00053455224F942075741524E494E4724A3FA
+:1009D000100D0A4155544F52454345495645207420
+:1009E0006F206175746F6D61746963616C6C7920DF
+:1009F00072652D726563656976652066696C6573DD
+:100A00000D0A424C4F434B2D434845434B2D5459FF
+:100A1000504520666F72206572726F722064657433
+:100A2000656374696F6E0D0A4255464645522D53F3
+:100A3000495A4520666F72206D756C74692D736517
+:100A400063746F7220627566666572696E670D0AFF
+:100A5000434F4C4C4953494F4E20746F207370657F
+:100A60006369667920616374696F6E20666F7220B6
+:100A700066696C656E616D6520636F6E666C696337
+:100A800074730D0A4445425547206D657373616761
+:100A90006520636F6E74726F6C0D0A444546415554
+:100AA0004C542D4449534B20746F20726563656923
+:100AB000766520646174610D0A4449524543544F80
+:100AC00052592D46494C452D53495A452077686562
+:100AD0006E20646973706C6179696E6720646972F5
+:100AE0006563746F726965730D0A455343415045E0
+:100AF0002063686172616374657220647572696EE7
+:100B00006720434F4E4E4543540D0A46494C452DF0
+:100B10004D4F444520666F72206F7574676F696E24
+:100B2000672066696C65730D0A464C4F572D434F1D
+:100B30004E54524F4C20746F2073657420584F4EA2
+:100B40002F584F464620666C6F7720636F6E747225
+:100B50006F6C0D0A49424D206D6F64653A207061DB
+:100B60007269747920616E64207475726E2061728E
+:100B70006F756E642068616E646C696E670D0A49FA
+:100B80004E434F4D504C4554452D46494C452064ED
+:100B90006973706F736974696F6E0D0A4C4F4341CE
+:100BA0004C2D4543484F202868616C662D64757054
+:100BB0006C6578290D0A4C4F4747494E47206F66B0
+:100BC000207465726D696E616C2073657373696FF3
+:100BD0006E730D0A4E4F2D4558495420746F207086
+:100BE000726576656E74206578697420746F204331
+:100BF000502F4D206166746572206120636F6D6DAA
+:100C0000616E64207461696C0D0A504152495459F7
+:100C100020666F7220636F6D6D756E6963617469B4
+:100C20006F6E206C696E650D0A504F525420746FC0
+:100C300020636F6D6D756E6963617465206F6E0DF5
+:100C40000A5052494E54455220636F707920636FA9
+:100C50006E74726F6C0D0A524543454956452070BB
+:100C60006172616D65746572730D0A53454E44205F
+:100C7000706172616D65746572730D0A53504545FC
+:100C800044206F6620636F6D6D756E696361746972
+:100C90006F6E206C696E650D0A54414320696E7455
+:100CA00065726661636520737570706F72740D0A8A
+:100CB0005445524D494E414C20746F207365742049
+:100CC00061207465726D696E616C20747970650D58
+:100CD0000A54494D455220636F6E74726F6C0D0A51
+:100CE0005553455220746F207365742061207573CD
+:100CF0006572206E756D6265720D0A5741524E49DC
+:100D00004E4720666F722066696C656E616D652066
+:100D1000636F6E666C6963747324CD071532A06CC3
+:100D2000C3C20111320D217C0DCD0D1532A070C34F
+:100D3000C2010314312D4348415241435445522DC1
+:100D4000434845434B53554D24313114322D4348CC
+:100D5000415241435445522D434845434B53554D11
+:100D600024323215332D4348415241435445522DCC
+:100D70004352432D43434954542433330D0A312DF8
+:100D80004348415241435445522D434845434B53F8
+:100D9000554D0D0A322D4348415241435445522D81
+:100DA000434845434B53554D0D0A332D434841525B
+:100DB00041435445522D4352432D434349545424F7
+:100DC0003E06CDA547C3C2012A2A677CA7C2DE0D15
+:100DD0003A2D67BDFADE0D7D32A570C3C20111093F
+:100DE00057CD7770C3C201115C003E10CDA547C33B
+:100DF000F20D3A5C00B7C2FC0D3A94633294630E74
+:100E00000DCD82513A94633D5F0E0ECD8251C3C227
+:100E100001111C0E21580ECD084FEBE9040850417A
+:100E2000442D4348415224410F0750414444494E08
+:100E30004724380F0F53544152542D4F462D5041E3
+:100E4000434B455424240F0D5041434B45542D4CE6
+:100E5000454E475448244A0F0D0A5041442D4348FB
+:100E6000415220746F20646566696E652074686500
+:100E700020706164206368617261637465722074BC
+:100E80006F207573650D0A50414444494E472074E4
+:100E90006F20646566696E6520746865206E756D87
+:100EA000626572206F66205041442D4348415220B4
+:100EB000746F207573650D0A53544152542D4F467B
+:100EC0002D5041434B455420746F20646566696E14
+:100ED0006520746865207374617274206F66207079
+:100EE00061636B6574206368617261637465720D20
+:100EF0000A5041434B45542D4C454E4754482066BB
+:100F00006F7220746865206C656E677468206F6608
+:100F1000207472616E736D697474656420706163AE
+:100F20006B657424CD1A4F11195CCD77700E01CD0D
+:100F30008251329763C3C201CD4310320000C3C255
+:100F400001CDF20F320000C3C201CD4310015F009A
+:100F5000E5CD2854E1112A57D2620F7D329470C337
+:100F6000C201CD7770C3C201CD4310FE04C2760F1B
+:100F7000114E57C3C201FE00CA700FC63032536B08
+:100F8000C3C201118E0F21580ECD084FEBE90408A2
+:100F90005041442D434841522401100750414444DC
+:100FA000494E4724DE0F0F53544152542D4F462DC6
+:100FB0005041434B455424CA0F0D5041434B4554B7
+:100FC0002D4C454E475448240A10CD1A4F11195C38
+:100FD000CD77700E01CD8251329663C3C2013E06B9
+:100FE000CDA547C3C2013E04CDA5472A2A677D325D
+:100FF0000000CD1A4F11405CCD77700E01CD8251AB
+:10100000C9CDF20F320000C3C201CD4310015F0011
+:10101000E5CD2854E1112A57D222107D329570C3B4
+:10102000C201CD7770C3C201CD4310FE04C2361099
+:10103000114E57C3C201FE00CA3010C63032546B85
+:10104000C3C2013E06CDA547C3C2013E04CDA5479C
+:10105000C3C2012A2A677DC9CD1A4FAF32AC63C320
+:10106000C201CD0715329F63C3C201CD1A4F11CC07
+:101070005BCD77700E01CD8251328770C3C201CD36
+:101080000715328E70C3C201CD0715328C70C3C2F2
+:1010900001CD0715328D70C3C201CD07153299639A
+:1010A000C3C201CD0715328F70C3C201040642418D
+:1010B000434B5550240202074449534341524424B0
+:1010C0000303094F56455257524954452400000620
+:1010D00052454E414D452401010D0A4241434B55B5
+:1010E00050202872656E616D65292065786973747A
+:1010F000696E672066696C65730D0A444953434104
+:101100005244206E65772076657273696F6E732026
+:101110006F66206578697374696E672066696C65AF
+:10112000730D0A4F56455257524954452065786908
+:101130007374696E672066696C65730D0A52454E5B
+:10114000414D45206E65772076657273696F6E73C9
+:10115000206F66206578697374696E672066696CB4
+:1011600065732411AC1021D910CD0D15328F70C3C9
+:10117000C201CD0715326E62C3C201CD0715323DE3
+:101180006AC3C201CD0715329070B7CAA2113E03DF
+:101190003293703E01328E70329963AF326E62C309
+:1011A000B1113E06329370AF328E70329963326E57
+:1011B00062C3C20111C31121E211CD0D153291702C
+:1011C000C3C2010305415343494924010106424971
+:1011D0004E4152592402020744454641554C54247D
+:1011E00000000D0A41534349490942494E415259B1
+:1011F0000944454641554C5424110812211C12CD76
+:101200000D15329270C3C201020744495343415243
+:1012100044240000044B4545502401010D0A444973
+:101220005343415244094B45455024113A1221631E
+:1012300012CD0D15329370C3C20105044556454EBB
+:10124000240000044D41524B240303044E4F4E45ED
+:10125000240606034F4444240909055350414345DD
+:10126000240C0C0D0A4556454E094D41524B094E72
+:101270004F4E45094F44440953504143452411A75B
+:101280001221C212CD0D15B7CAA112FE01CA9E12BB
+:1012900011EF5BCD77700E01CD825132A2703AA270
+:1012A0007032A170C3C20103094348415241435403
+:1012B0004552240202034F4646240000024F4E24AA
+:1012C00001010D0A4F4E20746F20656E61626C65DE
+:1012D0002054414320747261700D0A4F46462074B9
+:1012E0006F2064697361626C65205441432074729D
+:1012F00061700D0A43484152414354455220746F76
+:1013000020656E61626C6520544143207472617087
+:1013100020616E64207370656369667920696E74FC
+:10132000657263657074206368617261637465726D
+:101330002411731321AB13CD0D157AFE03C256137E
+:101340002A24707CB53E03C25613CD4F4F119D58D1
+:10135000CD7770C3C201FE40C2611332AD6CC3C20F
+:1013600001FE80C26D13AF32AD6CC3C20132867014
+:10137000C3C201060444554D422402020845585494
+:1013800045524E414C2403030551554945542440D0
+:101390004007524547554C4152248080034F4646F2
+:1013A00024000004565435322401010D0A44554DE1
+:1013B00042202D206F6E6C79207072696E746162AC
+:1013C0006C6520636861726163746572732070611B
+:1013D0007373656420746F207465726D696E616CDF
+:1013E0000D0A45585445524E414C202D20776974C2
+:1013F0006820656D756C6174696F6E20636F6465DC
+:101400002073797374656D207370656369666963B1
+:101410000D0A4F4646202D20616C6C206368617276
+:101420006163746572732070617373656420746F97
+:10143000207465726D696E616C0D0A515549455491
+:10144000202D20646973706C6179206E6F746869F7
+:101450006E6720647572696E67207472616E736660
+:101460006572730D0A524547554C4152202D206E2E
+:101470006F726D616C20646973706C617920666F46
+:1014800072207472616E73666572730D0A565435FC
+:1014900032202D20617373756D65204B65726D6907
+:1014A000742063616E20656D756C617465206120C8
+:1014B00056543532242A7C707CB5CA1219EB2A7E28
+:1014C00070CD084FD5CD1A4FE1228870EBCD6570F5
+:1014D000C3C2012A80707CB5CA1219EB2A8270CD72
+:1014E000084FD5CD1A4FE1228A70CD6870C3C20172
+:1014F00002034F4646240000024F4E2401010D0A0C
+:101500004F4646094F4E2411F01421FE14CD084FCA
+:1015100032A16CCD1A4F3AA16CC95623460423223E
+:10152000A16C2305C222154EB9CA3715232315C253
+:101530001C15213C1537C9B72AA16CC90D0A3F4EAD
+:101540006F7420666F756E6424CD1A4FCD3270CDE6
+:101550006115C3C201CD1A4FCD3270CD6115C3C222
+:10156000013A2467B7CA6E15115D5DCD7770CDCD98
+:1015700015CDBE17CDF017CDD317CDB218CDBE18EF
+:10158000CD5D16CDE617CD2916CD9018CD6916CDB7
+:101590004716CD604FCDD915CD8D16CDEF162A80CB
+:1015A000707CB5C45E17CD8116CD4017CD2F17CDF9
+:1015B0004F17CD1E172A7C707CB5C47E17CD7718C7
+:1015C000CD1118CD9C18CDE515CD7516C911735DDB
+:1015D000CD77703AA06CC3CF1811845DCD77703A87
+:1015E0008E70C3CF1811A95DCD777011C05D3AAD73
+:1015F0006CB7CAF81511C85DCD777011CE5DCD7787
+:10160000703A8670FEFFC20F16219D58C326164FF2
+:1016100021731346235E160023EB192323BECA262B
+:101620001605C8C31416C3777011E75DCD77703AFD
+:10163000917011F35DB7CA777011FC5DFE01CA7736
+:101640007011035EC37770113F5ECD777011655ED8
+:101650003A9270B7CA7770116E5EC37770110B5EE5
+:10166000CD77703A3D6AC3CF1811345ECD77703AAA
+:101670009070C3CF1811745ECD77703A8F70C3CF5E
+:101680001811835ECD77703A8C70C3CF1811925EBB
+:10169000CD777011806C21A0637EB7C2A1163A94F9
+:1016A00063C64012133E3A12130E0821A1630600CE
+:1016B0007E23FE20CABD1612130DC2B01678B7C223
+:1016C000D0163E2E121306FF0E0321A963C3B016D7
+:1016D0003E241211806CCD777011A05ECD77703AE8
+:1016E0009F63E67FFE02C2CF1811A45EF2777011ED
+:1016F000A95FCD77703A937011B45FFE06CA777018
+:1017000011B95FFE03CA777011BE5FFE0CCA777015
+:1017100011C45FFE09CA777011C85FC3777011AF3B
+:101720005ECD77703A9763C6405F0E02C382511157
+:10173000CB5ECD77703A9663C6405F0E02C382518E
+:1017400011015FCD77703A95706F2600C3234F115A
+:10175000EA5ECD77703A94706F2600C3234F11CDA7
+:101760005FCD77703A8A7021FA5FFEFFCABA172AF6
+:101770008070CD1A15D27B1721FA5FC3BA1711E01A
+:101780005FCD77703A887021FA5FFEFFCABA172AD8
+:101790007C70562346042322A16C2305C29A174E5F
+:1017A000B9CAB017232315C2941721FA5FC3BA1719
+:1017B0002AA16CEBCD777021F55FEBC377701175C3
+:1017C0005FCD77703AA0705F0E02CD8251118A5FB3
+:1017D000C3777011955FCD777021AC103A8F70CDC3
+:1017E0001A15EBC37770111B5FCD7770CDEF4EC923
+:1017F000112B5FCD77702100003AA5706FCD234F7C
+:1018000011485FCD77702100003A2D676FCD234FCF
+:10181000C9111260CD77703A9963C3CF18CD1A4FB2
+:10182000CD4F4F117C54CD7770118D54CD7770CD45
+:101830004F4F215D185E2356237AB3CA4918E5CD70
+:101840007770CD4F4FE1C335182A0470EBCD777018
+:10185000CD4F4F2A0670EBCD7770C3C2010B0168E4
+:10186000081B192925372DF33B0C3CC840E44535AE
+:1018700047934E5F540000111A60CD777011955D4B
+:101880003AA170B7CA77700E025FCD8251C34F4F35
+:10189000119A5DCD77703A6E62C3CF180E201EFF8D
+:1018A000CD82516F2600E5114A60CD7770E1CD23DE
+:1018B0004FC9116360CD77703A8D70C3CF18116F27
+:1018C00060CD77703A9463C6405F0E02C3825111B7
+:1018D000915DB7C2777011955DC377703E05119B1E
+:1018E00066CDA547C3C20132226BA7CAC201CD1A79
+:1018F0004FCD0870119B661A13D5CDAF4E5FCD0B3F
+:1019000070D13A226B3D32226BC2F718CD1470C3EE
+:10191000C20111AF58CD7770C3C201435053504B31
+:10192000312E41534D20283233292031362D4A6142
+:101930006E2D31393931243EFF32AC6C11316D3EA0
+:1019400005CDA547C31C02B7CA1C02322F6DEB366A
+:1019500024CD362C3AAD6CA7CA6119CD4F4FC36464
+:1019600019CD3B7011316DCD7770C378193E0032BF
+:101970002F6D32AC6CCD362C11EE6C3E05CDA547EB
+:10198000C31C02322A6D32AC6C3A2F6DB7CA95195E
+:101990003E4932426BAF32396B210000223C6B2250
+:1019A0003E6B323B6B32406B3AAD6CA7C2B819CD7F
+:1019B0004170210000CD234F3A2F6DB7C2C4193EAC
+:1019C0005232426B3AAD6CA7C2DB193A9966B7C284
+:1019D000DB19CD3E702A3C6BCD234F3A426BFE445F
+:1019E000C2E919CD4F1CC3C419FE58C2F419CD1851
+:1019F0001BC3C419FE46C2FF19CD181BC3C419FE70
+:101A000052C2181ACDB21A3A426BFE46C2C419111C
+:101A1000985ACD912CC3C419FE43C24C1A11E157F8
+:101A20003A396BB7CA2E1AAF32396B11C4583A998A
+:101A300066B7CC912C3A2F6DB7C2C2013AA06CA701
+:101A4000CAC20111685BCD7770C39519FE59CAC22D
+:101A500001FE49C2A41ACD951E3A426BFE58CA69CE
+:101A60001AFE41C2C419C3C2013A2F6D32AF6C4F86
+:101A7000060021316D115A6BCD74703E3132376BD7
+:101A8000AF32AE6C3E52CDC027C31C02AF32396BB1
+:101A9000210000223C6B323B6B32406B3E523242A3
+:101AA0006BC3DB19FE41C2A91A11EC57CD912CC3AF
+:101AB000C2013A406BFE10FAC31A11F654CD212C24
+:101AC000C34D2C3C32406B3E3132376BCDEF28C3D7
+:101AD000562CFE53C20D1B3A406B32416BAF324065
+:101AE0006B3AAE6CCDDD2C3AAF6C215A6BCD8E22A9
+:101AF000215A6BCD4D2232AF6C3E59CDC027C34D1C
+:101B00002C3A386B32376B3E4632426BC9FE45C2C7
+:101B1000532CCDDC2BC34D2C3A406BFE05FA291B10
+:101B2000111455CD212CC34D2C3C32406BCDEF28E8
+:101B3000C3562CFE53C2741B3A416BFE10FA491B6C
+:101B400011F654CD212CC34D2C3C32416B3A3B6BEA
+:101B50003DE63F473AAE6CB8C2532CCD692CAF324C
+:101B6000406B215A6BCD4D2232AF6C3E59CDC02710
+:101B7000C34D2CC9FE5AC28E1B3A416BFE05FA8A30
+:101B80001B113355CD212CC34D2CCDFB2CC9FE464A
+:101B9000C2CD1B4F3A9966B779C2D21BCDD42CC2A5
+:101BA000532CCDDD2C4F3A9966B779C2B41BCD4684
+:101BB00025C34D2C3A406B32416BCDEB2C3E443269
+:101BC000426B3A396BFE5AC8AF32396BC9FE58C204
+:101BD000271CCDD42CC2532CCDDD2CCD14703AAFA4
+:101BE0006CB7CA0E1CF51E3CD5CD1770D1CD177041
+:101BF000F1215A6BF55E23E5CD1770E1F13DC2F49A
+:101C00001B1E3ED5CD1770D1CD1770CD4F4F3A402A
+:101C10006B32416BCDEB2C3E4432426B3A396BFE5A
+:101C20005AC8AF32396BC9FE42C2441CCDD42CC253
+:101C3000532CAF32AF6C3E59CDC027C34D2C3E4321
+:101C400032426BC9FE45C24D2CCDDC2BC34D2C3A24
+:101C5000406BFE05FA861C115455CD212C3A99662D
+:101C6000B7C24D2C3A9270B7C27D1C115C00D50EE4
+:101C700010CD8251D10E13CD8251C34D2CCD475181
+:101C8000C3751DC34D2C3C32406BCDEF28C3562C81
+:101C9000FE44C2E41CCDD42CCAB01C3A416BFE05F4
+:101CA000FAAC1C115455CD212CC35D1CCDFB2CC9A5
+:101CB000CDDD2C3A406B32416B3AAF6CCD2623C35D
+:101CC000781DAF32406B32AF6C4F3A396BB7CADB1D
+:101CD0001C4F3E0132AF6C79325A6B3E59CDC02752
+:101CE000C35D1CC9FE46C2FE1C3A416BFE05FAFAF2
+:101CF0001C111455CD212CC35D1CCDFB2CC9FE5AE3
+:101D0000C2981DCDD42CC2532CCDDD2C3AAF6CFE25
+:101D100001C21C1D3A5A6BFE44CA391D3A9966B776
+:101D2000C2291DCD4751C3751DAF32396B3A406B87
+:101D300032416BCDEB2CC36F1D3A406B32416BCD02
+:101D4000EB2C3A9966B7C26F1D3A3A6BB7C26F1D5A
+:101D50003A9270B7C2691D115C000E10D5CD825148
+:101D6000D10E13CD8251C36F1DCD4751C3751D3E9A
+:101D70004632426BC9CDDF233A9966B7C24D2C116A
+:101D80005C00D50E10CD8251D13A9270B7C24D2C65
+:101D90000E13CD8251C34D2CFE45C25D1CCDDC2BF4
+:101DA000C35D1C3E02115C00CDA547C3C20111EE0C
+:101DB0006C3E05CDA547C31C02322A6DAF323247B7
+:101DC000323347323447323067213167222E67CDB4
+:101DD000FE45D2DE1D11C355CD7770C3C201CD368D
+:101DE0002CAF323B6B32406B329C63210000223CB3
+:101DF0006B223E6B3AAD6CA7C2041ECD4170210030
+:101E000000CD234F3E3132376B3E5332426B3AADF9
+:101E10006CA7C21E1ECD3E702A3C6BCD234F3A42AA
+:101E20006BFE44C22C1ECD4620C30E1EFE46C2379A
+:101E30001ECD401FC30E1EFE5AC2421ECD4321C3FB
+:101E40000E1EFE53C25B1ECD951E3A426BFE46C26D
+:101E50000E1E118D5ACD912CC30E1EFE42C2661E5F
+:101E6000CDE221C30E1EFE43C27E1E11E1573A3958
+:101E70006BB7CA781E11C458CD912CC3C201FE4164
+:101E8000C28C1E11EC57CD912CC3C20111EC57CD61
+:101E9000912CC3C2013A406BFE10FAA61E118D555B
+:101EA000CD212CC34D2C3C32406B3E3132376B3A46
+:101EB000A07032386B215A6BCD4D2232AF6C3A3C58
+:101EC0006B32AE6C3A426BCDC027C34D2CCDEF28A0
+:101ED000C35F4FFE59C20F1FCDD42CC0CDDD2C3AAD
+:101EE000AF6C215A6BCD8E223A406B32416BAF32D0
+:101EF000406B3A426BFE49C2001F3E5832426BC9EA
+:101F00003A386B32376B3E4632426BCD6E4FC9FE6C
+:101F10004EC22D1FCD692C3A3B6B3CE63F473AAE93
+:101F20006CB8C0AF32406B3E4632426BC9FE45C210
+:101F30004D2C3A426BFE49CAFA1ECDDC2BC34D2C08
+:101F40003A406BFE05FA511F118D55CD212CC34D22
+:101F50002C3C32406BAF32396B215A6B22306B3ADA
+:101F60002A6DB7C22F20215D00222E6B06000E00C5
+:101F700078FE08C2811F3E2E2A306B772322306BF9
+:101F80000C0478FE0CF2A31F2A2E6B7EE67F232220
+:101F90002E6BFE21FA701F2A306B772322306B0CD8
+:101FA000C3701F7932AF6C2A306B3E24773AAD6C28
+:101FB000A7C2B71FCD3B70115A6BCD77703A3B6B00
+:101FC00032AE6C3E46CDC027C34D2CCDEF28C35F4B
+:101FD0004FFE59C20D20CDD42CC0CDDD2C3A406B24
+:101FE00032416BAF32406B32256B32266B32276B3E
+:101FF00032286BCD1B24C3022032366B3E44324262
+:102000006BC9FEFFC24D2C3E5A32426BC9FE4EC216
+:102010002420CD692C3A3B6B3CE63F473AAE6CB886
+:10202000C0C3DA1FFE45C24D2CCDDC2BC34D2CEBBB
+:1020300021EE6C4F477E1223130578B7C23520EB93
+:1020400022306BC3A31F3A406BFE05FA5720118D57
+:1020500055CD212CC34D2C3C32406B215A6B223084
+:102060006B211B6C22326B06012A326B7E232232DB
+:102070006B4F3A9E63B779C29B203A9370FE067904
+:10208000CA9B203A9C63B7C2982079E680CA982000
+:10209000CD842C3EFF329C6379E67F2A306B772318
+:1020A00022306B043A366BB8F269203A366B32AFA5
+:1020B0006C3A3B6B32AE6C3E44CDC027C34D2CCD49
+:1020C000EF28C35F4FFE59C22121CDD42CC03AAEB8
+:1020D0006CCDDD2C3A406B32416BAF32406B3AAF86
+:1020E0006CFE01C2FF203A5A6BFE5AC2F42032390C
+:1020F0006BC30621FE58C2FF2032396BC306213A5A
+:10210000396BB7CA0C213E5A32426BC9CD1B24C36E
+:10211000162132366BC9FEFFC24D2C3E5A32426B3D
+:10212000C9FE4EC23821CD692C3A3B6B3CE63F4795
+:102130003AAE6CB8C0C30C21FE45C24D2CCDDC2B91
+:10214000C34D2C3A406BFE05FA5421118D55CD211B
+:102150002CC34D2C3C32406B3A3B6B32AE6CAF32F1
+:10216000AF6C3A396BB7CA73213E44325A6B3E01A9
+:1021700032AF6C3E5ACDC027C34D2CCDEF28C35F84
+:102180004FFE59C2C021CDD42CC0CDDD2C3A406BBE
+:1021900032416BAF32406B0E10115C00CD82513A70
+:1021A000396BFE5ACABA21CDFE45DABA21CD6E4F3F
+:1021B000AF32396B3E4632426BC93E4232426BC946
+:1021C000FE4EC2D721CD692C3A3B6B3CE63F473AE5
+:1021D000AE6CB8C0C38A21FE45C24D2CCDDC2BC3EA
+:1021E0004D2C3A406BFE05FAF321118D55CD212C73
+:1021F000C34D2C3C32406B3A3B6B32AE6CAF32AFCE
+:102200006C3E42CDC027C34D2CCDEF28C35F4FFE9F
+:1022100059C22B22CDD42CC0CDDD2C3A406B32419B
+:102220006BAF32406B3E4332426BC9FE4EC242221C
+:10223000CD692C3A3B6B3CE63F473AAE6CB8C0C325
+:102240001822FE45C24D2CCDDC2BC34D2C3A957087
+:10225000C62077233A9770C62077233A9970C62014
+:1022600077233A9B70C640E67F77233A9D70C6205D
+:1022700077233A9F70772336593A9370FE06CA85C2
+:10228000223A9D6377233AA07077233E08C932A48F
+:102290006C3E0D329C703E23329E703E26329D6312
+:1022A0003E3132386B7EDE203294703AA46CFE03ED
+:1022B000F823237EDE203298703AA46CFE04F823C3
+:1022C0007EC640E67F329A703AA46CFE05F8237E03
+:1022D000DE20329C703AA46CFE06F8237E329E709B
+:1022E0003AA46CFE07F8233E00329E637EFE4ECA7F
+:1022F0001423FE20CA1423FE59C20C233A9370FE05
+:1023000006CA14233EFF329E63C31423329D633EEC
+:10231000FF329E633AA46CFE08F8237E473AA07011
+:10232000B8C032386BC932A16C3A9966B7C247233C
+:102330003A8F70FE03C247233A3A6BB7CA47233E2F
+:102340005832396BC35A4F215A6B222A6B3A9F700D
+:10235000470E003A9E63B7CA5E233A9D634F21A1A0
+:102360006C35FA5A4F3A9966A7C2792321246B3506
+:10237000F27923CDEB50C3DF232A2A6B7E23222A56
+:102380006B1E00B9C295231E803AA16C3D32A16C30
+:102390007E23222A6BB8C2B7237E23222A6B21A177
+:1023A0006C3557E680B35F7AE67FB8CAB723B9CAFF
+:1023B000B7237AC640E67FB332A36C3A9966A73A50
+:1023C000A36CCAD423E5D5C55F0E06CD8251C1D119
+:1023D000E1C35E232A2C6B7723222C6BC35E23116F
+:1023E0006E55D5CD212CD1215A6B3AAE6CCDDD2C5A
+:1023F00032AE6CAF32A16C1AFE0DCA0A24771323D9
+:102400003AA16C3C32A16CC3F72336003AA16C327E
+:10241000AF6C3E45CDC027000000C93A9E704F3AD0
+:10242000376BD631473A9470D6059032A16C211B98
+:102430006C22326B06003AA16C3DF2412478C35AFB
+:102440004F32A16C3A246B3DFA512432246BC362A3
+:1024500024CD8D4FC35A24C3622478B7C25A4FC3C8
+:1024600026252A2C6B7E23222C6B57E6805FCA928E
+:10247000243A9E63B7CA92243AA16CFE02FA172549
+:102480003D32A16C2A326B3A9D63772322326B0472
+:102490001E007AE67F57FE20FAC424FE7FCAC424B9
+:1024A0003A9E63B7CAAE243A9D63BACAB3247AB9D6
+:1024B000C20A2521A16C352A326B712322326B04AA
+:1024C0007AC30A25FE1AC2F3243A9170FE01CAE2C9
+:1024D00024FE02CAF1242A2C6B3A246B57157AF297
+:1024E000EA24AF32246B78C35A4F7E23FE1ACADD2A
+:1024F000243E1A32A26C21A16C352A326B71232240
+:10250000326B043AA26CC640E67F2A326BB3772363
+:1025100022326B04C336242A2C6B2B222C6B2124F1
+:102520006B3478C35A4F3EFFC9435053504B322E41
+:1025300041534D2028313129202032312D4D6172F7
+:102540002D3139393124AF325C00215A6B3A2A6D72
+:10255000B7CA692521EE6C3AEF6CFE3AC269257E56
+:10256000E65FD640325C00232322306B215D0022DF
+:102570002E6BAF32A16C32A26C062070233CFE0B96
+:10258000FA7B2536002A306B7EFE61FA9025E65FE5
+:1025900023FE2EC2AD2522306B216500222E6B3A20
+:1025A000A16C32A26C3E0932A16CC3DC25B7CA0310
+:1025B0002622306B2A2E6B7723222E6B3AA16C3C9D
+:1025C00032A16CFE08FA852532A26C2A306B7E237C
+:1025D00022306BB7CA0326FE2EC2C8252A306B7E76
+:1025E000FE61FAE725E65FB7CA03262322306B2A8D
+:1025F0002E6B7723222E6B3AA16C3C32A16CFE0C21
+:10260000FADC252A306B36243AAD6CA7C21226CDEF
+:102610003B70115A6B3AAC6CA7CA1F2611EE6CCDF9
+:102620007770AF323A6B3A8F70B7CAFF260E0F1130
+:102630005C00CD8251FEFFCAFF263A8F70FE03C2B6
+:102640004A263EFF323A6BC35A4FF511F457CD215B
+:102650002CF1FE01CA6326215C0011806A01210071
+:10266000CD74700E083E30216400770DCA78262B99
+:102670007EFE203E30CA6A26215D000E0B7EE67F7C
+:1026800077230DC27D26115C000E0FCD82513CCA0E
+:10269000A5263A64003C326400FE3AC2782611DC7A
+:1026A00055CD7770C911806C215D000E087E122314
+:1026B000130DC2AD263E2E12130E037E1223130DF0
+:1026C000C2BB263E241211806CCD77703A8F70FE0B
+:1026D00002C2FF26215C0011906A011000CD7470C7
+:1026E00011806A0E17CD8251FEFFC2F32611DC5510
+:1026F000C3212C21806A115C00011000CD7470CDC3
+:10270000A750C30827C35A4F116E55CD212CC9CDF0
+:102710001A4FCD0870CD1170CD1470AF32406B3EA2
+:102720003132376B3A406BFE05FA3527110056CD32
+:102730007770C3C2013C32406BAF32AE6C3E0132A7
+:10274000AF6C215A6B36463E47CDC027C32C27CDF0
+:10275000EF28C32427FE59CAC201FE45C22427CD53
+:10276000F52BC3C201CD1A4FCD7127C3C201C3C21D
+:1027700001CD0870CD1170CD1470AF32406B3E3179
+:1027800032376B3A406BFE05FA9227113456CD77FB
+:1027900070C93C32406BAF32AE6C3E0132AF6C213F
+:1027A0005A6B364C3E47CDC027C38B27CDEF28C38D
+:1027B0008327FE59CA5A4FFE45C28327CDF52BC940
+:1027C00032B06C21566B3A976377233A376BD63128
+:1027D000473AAF6CC6238077230100004F3AAE6CB6
+:1027E000C6207723814F3E0088473AB06C7723811B
+:1027F0004F3E0088473AAF6CB7CA0B283D32AF6CEA
+:102800007E23814F3E008847C3F5273A376BFE325F
+:10281000CA3C28D2252879E6C0070781E63FC620B2
+:102820007723C353283600E521576BCD662BE14B48
+:10283000427A07070707E60FC620772378E60F07D7
+:102840000747790707E603B0C620772379E63FC636
+:102850002077233A8D70B7CAA028E536003AAD6CD0
+:10286000A7C29F28CD4A7021576BCD142D3A8C708A
+:10287000A7CA9F2821E161CD212D3A426B5FCDC1CE
+:1028800052211F62CD212D21F761CD212D21576BC2
+:10289000CD212D211F62CD212D211F62CD212DE1C2
+:1028A0003A9C707723AF77CD08703A987032A16C5C
+:1028B0003AA16C3DB7FAC82832A16C3A9A70CDAFF4
+:1028C0004E5FCD0B70C3B02821566B7EB7CAE92886
+:1028D000CDAF4E5FCD0B703AA170BEC2E528CDAF33
+:1028E0004E5FCD0B7023C3CB28CD1470C35A4FCD90
+:1028F000262AC35F4FCDE62AC3EF28219663BEC2C6
+:10290000F528CDE62AC35F4F219663BECA0229325D
+:10291000576B4F3A376BD6314779D6239032AF6C2D
+:102920000600CDE62AC35F4F219663BECA02293254
+:10293000AE6C32586B814F3E0088473AAE6CD62061
+:1029400032AE6CCDE62AC35F4F219663BECA022920
+:1029500032A16C32596B814F3E0088473AAF6C32DE
+:10296000A26C215A6B22306B3AA26CD601FA9129E3
+:1029700032A26CCDE62AC35F4F219663BECA0229FC
+:102980002A306B772322306B814F3E008847C36823
+:1029900029CDE62AC35F4F219663BECA0229D620FD
+:1029A00032A36C3A376BFE32CAF029D2C22979E6DB
+:1029B000C0070781E63F473AA36CB8CA1B2ACD6916
+:1029C0002CC92A306B360021576BCD662B4B427ACF
+:1029D00007070707E60F573AA36CBAC2BE29CDE630
+:1029E0002AC35F4F219663BECA0229D62032A36C48
+:1029F00078E60F070747790707E603B0473AA36C65
+:102A0000B8C2BE29CDE62AC35F4F219663BECA0273
+:102A100029D6204779E63FB8C2BE292A306B360056
+:102A20003AA16CC35A4F21B46B22346BCDF32AC345
+:102A30005F4F219663BEC22C2AC34F2ACDF32AC30F
+:102A40005F4F219663BEC24F2A21B46B22346B2A9A
+:102A5000346B772322346B4711E79319DA262A3A2D
+:102A60009D70B8C23C2A21B76B3A596BBECA262A60
+:102A70003A9070B7CA8A2A3A426BFE53CA8A2ACD64
+:102A8000F32AC38A2AFE11C27F2A2A346B2B36000E
+:102A9000CD14703A8D70B7CADD2A233AAD6CA7C247
+:102AA000DD2ACD477021B56BCD142D3A8C70A7CAA5
+:102AB000DD2A21EC61CD212D3A426B5FCDC152213F
+:102AC0001F62CD212D210B62CD212D21B56BCD2192
+:102AD0002D211F62CD212D211F62CD212D21B46B0F
+:102AE00022346BC35A4F2A346B7E2322346BB7C215
+:102AF0005A4FC9E5C52A8470229A63CD0870CD0E5D
+:102B000070B7CA162B473A9370FE0678CA112BE6A7
+:102B10007FC1E1C35A4FCD1470CD1A70B7CA3F2B95
+:102B2000FE0DCA3C2BFE1ACA342BFE03CA582BFEDC
+:102B300018C23F2BC64032396BC33F2BC1E1C93AA3
+:102B40009963B7CAFB2A2A9A632B229A637CB5C27F
+:102B5000FB2ACD692CC1E1C9CD32703AAD63E601E3
+:102B6000C47752C3C201E5C51100007EB7CA992BD4
+:102B7000E5AB5FE60F4F060021BC2B0909E57B0F93
+:102B80000F0FE61E4F219C2B097EAA2356E1AE5F54
+:102B9000237EAA57E123C36B2BC1E1C9000081103A
+:102BA0000221833104428552066387730884899425
+:102BB0000AA58BB50CC68DD60EE78FF700008911DC
+:102BC00012239B322446AD573665BF74488CC19D95
+:102BD0005AAFD3BE6CCAE5DB7EE9F7F83AAD6CA715
+:102BE000C2ED2B3A9966B7C2ED2BCD38703E41321B
+:102BF000426BC3022C11CA543AAD6CA7C2022CCD51
+:102C000077703AAF6C4F0600215A6B093624115A7F
+:102C10006B3A9966B7C21D2C3AAD6CA7C0CD7770E0
+:102C2000C93AAD6CA7C03A9966B7C2322CD5CD3837
+:102C300070D1CD7770C9117C543AAD6CA7C2432CCA
+:102C4000CD6B70CD0870CD1170CD1470C93E41327E
+:102C5000426BC9CD692C3A3B6B32AE6CAF32AF6C74
+:102C60003E4ECDC027C34D2CC92A3E6B23223E6B5E
+:102C70003A9966B7C03AAD6CA7C0CD41702A3E6B99
+:102C8000CD234FC9C5D5E511A55ACD212CE1D1C120
+:102C9000C93AAD6CA7CAAF2CD5CD4F4FD1CD777007
+:102CA0001E200E06C5D5CD8251D1C1CD8251C9D5C8
+:102CB000CD4470D1CD7770C90E0421C4545EE5C5F2
+:102CC000CD0200C1E1230DC2BD2C118860CD77700B
+:102CD000CD3570C93A3B6B473AAE6CB8C93CE63F5C
+:102CE000323B6B2A3C6B23223C6BC9AF32406B32C8
+:102CF000AF6C3E59CDC027C34D2CC93C32416B3A15
+:102D00003B6B3DE63F473AAE6CB8C2532CCD692CC5
+:102D1000CDEB2CC97EB7C8E55FCD1770E123C31496
+:102D20002D7EB7C8E55FCDC152E123C3212DC54F2C
+:102D30003A556BB979C1C943505352454D2E415351
+:102D40004D2028313329202032312D4D61722D3113
+:102D500039393124CD0870CD1170CD147011682D22
+:102D6000211A2ECD084FEBE913024344248E31047F
+:102D7000434F5059243D310644454C45544524F8B1
+:102D800031094449524543544F52592436320A447A
+:102D900049534B2D5553414745243B32054552413C
+:102DA000534524F8310646494E495348240F270419
+:102DB00048454C5024403204484F53542445320671
+:102DC0004B45524D4954245E32054C4F47494E24E1
+:102DD0006332064C4F474F5554246527074D4553E2
+:102DE0005341474524F1320652454E414D4524E6B4
+:102DF000320353455424FC32055350414345243B90
+:102E000032065354415455532453330454595045B6
+:102E10002468330357484F246D330D0A4344202D53
+:102E2000206368616E67652064656661756C7420F7
+:102E30006469726563746F727920666F722072655F
+:102E40006D6F746520736572766572206F70657240
+:102E50006174696F6E730D0A434F5059202D2063C2
+:102E60006F70792066696C6573206F6E20612072C7
+:102E7000656D6F74652073797374656D0D0A4445D3
+:102E80004C455445202D2064656C65746520666949
+:102E90006C6573206F6E20612072656D6F746520A4
+:102EA00073797374656D0D0A4449524543544F520A
+:102EB00059202D206C6973742061206469726563E8
+:102EC000746F7279206F6E20612072656D6F74650A
+:102ED0002073797374656D0D0A4449534B2D555316
+:102EE000414745202D2073686F77206469736B20FC
+:102EF0007573616765206F6E20612072656D6F74F8
+:102F0000652073797374656D0D0A46494E495348BF
+:102F1000202D2073746F7020612072656D6F746551
+:102F2000207365727665720D0A48454C50202D203D
+:102F30006765742068656C702066726F6D20612013
+:102F400072656D6F7465207365727665720D0A48DF
+:102F50004F5354202D20657865637574652061207A
+:102F6000636F6D6D616E64206F6E20612072656DA0
+:102F70006F74652073797374656D0D0A4B45524DFE
+:102F80004954202D2074656C6C20612072656D6F32
+:102F900074652073657276657220746F206578653C
+:102FA000637574652061204B65726D697420636F71
+:102FB0006D6D616E640D0A4C4F47494E202D207394
+:102FC000656E6420757365722D6964656E746966DB
+:102FD00069636174696F6E20746F20612072656D22
+:102FE0006F7465207365727665720D0A4C4F474F9A
+:102FF0005554202D202073746F7020616E64206CF6
+:103000006F676F757420612072656D6F74652073D2
+:1030100065727665720D0A4D455353414745202D23
+:103020002073656E642061206D6573736167652030
+:10303000746F20612072656D6F746520737973748D
+:10304000656D20757365720D0A52454E414D4520E0
+:103050002D2072656E616D652066696C6573206FE9
+:103060006E20612072656D6F74652073797374656D
+:103070006D0D0A534554202D207365742072656DC3
+:103080006F74652073657276657220706172616D10
+:1030900065746572730D0A5350414345202D2073AA
+:1030A000686F77206469736B2D7573616765206F36
+:1030B0006E20612072656D6F74652073797374651D
+:1030C0006D0D0A535441545553202D2047657420EB
+:1030D000737461747573206F6620612072656D6F03
+:1030E0007465207365727665720D0A5459504520D7
+:1030F0002D20747970652066696C6573206F6E2071
+:10310000612072656D6F74652073797374656D0DE0
+:103110000A57484F202D2073686F772063757272AD
+:10312000656E74207573657273206F6E20612072F6
+:10313000656D6F74652073797374656D24212262E7
+:1031400022916D3E4B32316D3E02322F6D3E473241
+:10315000906D11336DCD0035B7CA1C0247C62032C1
+:10316000326D3A2F6D80322F6D2A916DEB22936D67
+:10317000CD52472A936D23EBCD00352A936D4FC670
+:1031800020773A2F6D81C601322F6DC37833212FFE
+:103190006222916D3E4332316D3E01322F6D3E47CA
+:1031A00032906D11336DCD003547C62032326D3A05
+:1031B0002F6D80C601322F6D3A316DFE43C2CA3188
+:1031C00078B7CA78333EFF3272622A916DEB229350
+:1031D0006D3EFF327162CD52472A936DEB13CD00E5
+:1031E00035B7CA78334FC6202A936D773A2F6DC60C
+:1031F0000181322F6DC378333E4532316D3E01324D
+:103200002F6D3E4732906D11336DCD0035473A3109
+:103210006DFE45CA2032FE54CA203278B7CA7833D0
+:1032200078B7CA1C02C62032326D3A2F6D80C601B3
+:10323000322F6DC378333E44C3FA313E55C3FA3161
+:103240003E48C3FA313E4332906DAF322F6D11319B
+:103250006DCD0035B7CA1C02322F6DC378333E4B9B
+:10326000C347323E4732906D3E4932316D3E0132A6
+:103270002F6D11336DCD0035B7CA783347C6203274
+:10328000326D3A2F6D80C601322F6DEB22936D3E69
+:10329000FF327162327262112F62CD52472A936DF2
+:1032A000EB13CD0035B7CA78334FC6202A936D771C
+:1032B0003A2F6DC60181322F6DEB22936DAF3272C2
+:1032C00062113C62CD52472A936DEB13CD0035B7A6
+:1032D000CA78334FC6202A936D773A2F6DC6018185
+:1032E000322F6DC3783321226222916D3E52C34545
+:1032F0003121556222916D3E4DC345313E06322F3C
+:103300006D3E5332316D3E4732906D3E2332326D09
+:10331000113D35219935CD084FEBE911376D3E054B
+:10332000CDA547C31C02B7CA1C024FC62032366D5A
+:103330003A2F6D81322F6DCD1A4FC37833CD0D15D5
+:1033400032376D3E2132366D3A2F6DC601322F6D08
+:10335000C37833CD1A4F3E5132316D3E4732906DB6
+:103360003E01322F6DC378333E54C3FA312161627E
+:1033700022916D3E57C396313EFF3299663A906D69
+:10338000FE47C28D333A316DFE53CA9033CD327051
+:10339000AF32406B32396B323B6B210000223C6B09
+:1033A000223E6B3E3132376B3E4932426BCD951E29
+:1033B0003A426BFE58CAC033FE41C2A833C3C201B1
+:1033C000AF32406B32396B323B6B210000223C6BD9
+:1033D000223E6B3E3132376B3A2F6DB7CA423432E0
+:1033E000A16C3A9470D60532A26C11316D215A6BE2
+:1033F0003A9D63473A9E704F3AA26C3D32A26CFAF6
+:1034000038341AFE20FA1834B9CA18343A9E63B711
+:10341000CA2B341AB8C2353471233AA26C3D32A299
+:103420006CFA38343A2F6D3C322F6D1AFE20F2358B
+:1034300034C640E67F7723133AA16C3D32A16CC2BB
+:10344000F833AF32AE6C3A2F6D32AF6C3A906DCD2F
+:10345000C027C31C02C35B34CD532C3A406B3CFEE7
+:1034600005FA6D34116357CD7770C3C20132406BDA
+:10347000CDEF28C35834FE45C291343A906DFE47D3
+:10348000C28B343A316DFE53CC4F4FCDED2BC3C2BE
+:1034900001FE53C2A934CDD71A3A426BFE41CAC2CB
+:1034A000013E5832426BC3C419FE4ECA5B343242ED
+:1034B0006BCD1470215A6B3AAF6CB7CAEA34E5F59C
+:1034C0001E3CD5CD1770D1CD1770F1E1B7CADD34F0
+:1034D0003D5E23F5E5CD1770E1F1C3CC341E3ED53A
+:1034E000CD1770D1CD1770CD4F4F3A426BFE59CAF0
+:1034F000C201CDEB2CCDDD2C3E4432426BC3C4194E
+:10350000AF32306D47CD4F4DE67FFE0DCA3835FEE8
+:103510000ACA3835120413FE1BCA2F35FE0CCA2600
+:1035200035FE3FC20535E52A066323220663E1F531
+:10353000AF327062F1C305357832306DC907104281
+:103540004C4F434B2D434845434B2D545950452434
+:10355000FF3A0446494C4524133B0A494E434F4D1C
+:10356000504C45544524493B07524543454956452F
+:10357000241E3B075245504C41434524933B055282
+:103580004554525924D73B0E5345525645522D545B
+:10359000494D454F555424E53B0D0A424C4F434B92
+:1035A0002D434845434B2D5459504520666F72209A
+:1035B000612072656D6F7465207365727665720D3A
+:1035C0000A46494C4520706172616D65746572737D
+:1035D00020666F7220612072656D6F74652073655F
+:1035E000727665720D0A494E434F4D504C45544515
+:1035F0002066696C6520646973706F736974696FA4
+:103600006E20666F7220612072656D6F7465207325
+:1036100065727665720D0A524543454956452070DC
+:103620006172616D657465727320666F72206120CE
+:1036300072656D6F7465207365727665720D0A52DE
+:1036400045504C4143452066696C65206174747235
+:1036500069627574652068616E646C696E67206666
+:103660006F7220612072656D6F746520736572766C
+:1036700065720D0A5245545259206D6178696D7515
+:103680006D20666F7220612072656D6F74652073A6
+:1036900065727665720D0A5345525645522D54494E
+:1036A0004D454F555420696E74657276616C206685
+:1036B0006F7220612072656D6F746520736572761C
+:1036C000657224080A424C4F434B2D53495A4524F6
+:1036D000273B09434F4C4C4953494F4E24353B0A35
+:1036E000494E434F4D504C45544524493B054E41AE
+:1036F0004D4553245D3B0D5245434F52442D464F9B
+:10370000524D415424713B0D5245434F52442D4C70
+:10371000454E47544824853B075245504C4143454C
+:1037200024933B045459504524A73B0D0A424C4F67
+:10373000434B2D53495A45206F662066696C65736B
+:1037400020666F7220612072656D6F7465207365ED
+:10375000727665720D0A434F4C4C4953494F4E20C7
+:10376000616374696F6E206F6E2066696C656E614F
+:103770006D6520636F6E666C6963747320666F722B
+:1037800020612072656D6F74652073657276657255
+:103790000D0A494E434F4D504C4554452066696CC7
+:1037A0006520646973706F736974696F6E20666FEA
+:1037B0007220612072656D6F746520736572766525
+:1037C000720D0A4E414D4553207472616E736C61E7
+:1037D00074696F6E206F662066696C657320666F12
+:1037E0007220612072656D6F7465207365727665F5
+:1037F000720D0A5245434F52442D464F524D41548B
+:10380000206F662066696C657320666F7220612088
+:1038100072656D6F7465207365727665720D0A52FC
+:1038200045434F52442D4C454E47544820666F72D5
+:1038300020612072656D6F746520736572766572A4
+:103840000D0A5245504C4143452066696C65206124
+:1038500074747269627574652068616E646C696EF7
+:103860006720666F7220612072656D6F74652073CA
+:1038700065727665720D0A54595045206F66206650
+:10388000696C657320666F7220612072656D6F745C
+:103890006520736572766572240205464958454471
+:1038A000244646085641524941424C452456560D3D
+:1038B0000A4649584544095641524941424C45241B
+:1038C000020D5041434B45542D4C454E475448241E
+:1038D000BB3B0754494D454F555424C93B0D0A5035
+:1038E00041434B45542D6C656E6774680954494DCE
+:1038F000454F5554240606415050454E4424333319
+:103900000341534B243535064241434B5550243235
+:10391000320744495343415244243434094F5645F5
+:103920005257524954452431310652454E414D4576
+:103930002430300D0A41534B2061626F757420654D
+:1039400078697374696E672066696C6573206F6E41
+:1039500020612072656D6F74652073797374656D75
+:103960000D0A415050454E4420746F2065786973AC
+:1039700074696E672066696C6573206F6E206120C4
+:1039800072656D6F74652073797374656D0D0A428D
+:1039900041434B5550202872656E616D6529206545
+:1039A00078697374696E672066696C6573206F6EE1
+:1039B00020612072656D6F74652073797374656D15
+:1039C0000D0A44495343415244206E657720766581
+:1039D0007273696F6E73206F66206578697374699E
+:1039E0006E672066696C6573206F6E20612072655A
+:1039F0006D6F74652073797374656D0D0A4F56454C
+:103A0000525752495445206578697374696E67202E
+:103A100066696C6573206F6E20612072656D6F74CE
+:103A2000652073797374656D0D0A52454E414D459D
+:103A3000206E65772076657273696F6E73206F668E
+:103A4000206578697374696E672066696C65732098
+:103A50006F6E20612072656D6F7465207379737469
+:103A6000656D2402074449534341524424303004D5
+:103A70004B4545502431310D0A444953434152448A
+:103A8000094B454550240209434F4E564552544573
+:103A900044243030074C49544552414C2431310DB7
+:103AA0000A434F4E564552544544094C49544552D9
+:103AB000414C24020850524553455256452430305B
+:103AC0000744454641554C542431310D0A50524566
+:103AD00053455256450944454641554C5424020627
+:103AE00042494E41525924313104544558542430EE
+:103AF000300D0A42494E4152590954455854242127
+:103B0000343022336D3E3032356D11320D217C0D53
+:103B1000C33D3311C336212B37CD084FEBE911C01C
+:103B20003821DD38C3193B21333122336D3E313228
+:103B3000356DC31B3321333022336D3E3232356D48
+:103B400011F538213339C33D3321333122336D3EF2
+:103B50003032356D11633A21773AC33D332133302A
+:103B600022336D3E3132356D11863A219F3AC33D85
+:103B70003321333122336D3E3332356D1199382183
+:103B8000AF38C33D3321333122336D3E3232356D90
+:103B9000C31B3321333022336D3E3332356D11B3C5
+:103BA0003A21CB3AC33D3321333022336D3E30329C
+:103BB000356D11DE3A21F13AC33D332134302233E1
+:103BC0006D3E3132356DC31B3321343022336D3EAF
+:103BD0003232356DC31B3321343022336D3E3332E4
+:103BE000356DC31B3321343022336D3E3432356D95
+:103BF000C31B334350535345522E41534D2028315C
+:103C0000292020382D5345502D3837244350535404
+:103C1000542E41534D2020283132292033312D4A52
+:103C2000616E2D31393931243E03115C00CDA54739
+:103C3000C3C201119B663E05CDA547C3C201322216
+:103C40006BA7C24F3C3E0132226B3E0D329B66CDCC
+:103C50001A4FCD6E4FFEFFC2633C11C355CD777036
+:103C6000C3C201112659CD7770AF326D65326E65D2
+:103C7000AF326F65327065CD333DE67FFE0DC277A2
+:103C80003CAF327065CD14701E2ACD17703A6E6548
+:103C90003C326E65FE3CC2A03CAF326E65CD4F4FEC
+:103CA0003A9363A7C2AF3DAF326D65CDA63DE67FC7
+:103CB000C2EC3CCD8844F5CD0870F1E67FC2CA3C29
+:103CC0003A226BA7CA773CC3EC3CFE03CAAF3DFE69
+:103CD0001AC2DF3C115C000E10CD8251C3C201FE3E
+:103CE0000DC2AB3C3E01326F65C3773CC30F3DFE56
+:103CF00013C20F3DCDA63DE67FC20F3DCD8844F5F2
+:103D0000CD0870F1E67FFE03CAAF3DA7CAF43C5F61
+:103D10003A6D65219B66856F3E008C677BBEC2A0B5
+:103D20003C3A6D653C326D655F3A226B93CA703CDC
+:103D3000C3AB3CCD08703A9363A7C23F3D3E0DCD67
+:103D40007A3DFE0AFE1ACAAF3DFE20F25B3DFE0D33
+:103D5000CA5B3DFE09CA5B3DC33F3DCDAF4EF55F3B
+:103D6000CD0B70F15F3AA170A77BCA793D3AA27082
+:103D7000BBC2793DF5CD0B70F1C93A6F65A7CA9109
+:103D80003D2171653A706516005F193C3270657EA1
+:103D9000C9CD0C504F3A70655F1600217165193C12
+:103DA0003270657971C9CD0870CD0E70E67FC9118A
+:103DB0005C000E10CD8251CD14703A9363114C5AB1
+:103DC000A7CAC73D11245BC3D03DCD1A4F1120585F
+:103DD000CD7770CDEF4E114458CD7770CDEF4E11A9
+:103DE0005958CD7770CD53703A9F63B7C4B03ECD6C
+:103DF000FB3DCDA53FC3C201C3EF3DCD0870CD0E45
+:103E000070F5CD1470F1B7C20E3E329863C9E67FEB
+:103E1000326D623A8670FE033A6D62CA2370A7CA99
+:103E2000FB3DFE7FCAFB3DFE11CAA93EFE13CAAA96
+:103E30003E5F3A8670FE01C2553E3A2367B7CA47D5
+:103E40003ECD2C3FC3FB3D7BFE1BC2553E3E0132A7
+:103E50002367C3FB3DFE03C2633E2124707CB5CAC9
+:103E6000633EE9FE02C27D3E3A6D62FE0DCA7D3EB2
+:103E7000FE0ACA7D3EFE09CA7D3EFE20F8CD5F7077
+:103E8000B7CAFB3D3A9F63FE81CCDB3ECD14703A4E
+:103E90008C70B7C41D70CD1770219863347EFE33CB
+:103EA000FAFB3D36003A6D62C9AF322567C3FB3D70
+:103EB0003E1ABBC821A063115C00010C00CD7470D8
+:103EC000CD4150C3193F219F633E80B677110E5BF1
+:103ED000FE81CA777011F65AC3777021246B35F2D0
+:103EE000EF3ED5CDDC50CDF83ED13A9F63B7C82A1E
+:103EF0002C6B7323222C6BC9CD6A53CDEB50CD199B
+:103F00003FCDA453C9110758CD7770CD4751C31980
+:103F10003F219F637EE67F77C911B856CD77700E3B
+:103F200010115C00CD8251AF329F63C9FE01C28186
+:103F30003F7BFE59C23D3F3E02322367C9FE5ACA4B
+:103F4000633FFE41FA5E3FFE4CF25E3FD6410707FB
+:103F50002A7A705F160019EBCD1470CD7770AF32EE
+:103F60002367C93E1BCDAF4E5FCD0B703E2FCDAF4B
+:103F70004E5FCD0B703E4BCDAF4E5FCD0B70C35E31
+:103F80003FFE02C2923F7BD61F32236B3E03322399
+:103F900067C9AF3223677BD61F4F3A236B47CD14D7
+:103FA00070CD6E70C9CD1A70E67FCA5A4F5F32A1CC
+:103FB0006C3A8770BBCAD93FCD08707BCDAF4E5FDE
+:103FC000D5CD0B70D1CD14703A8E70B7CA5A4F7BD5
+:103FD000E67F5FCD1770C35A4FCD1A70B7CAD93F6D
+:103FE00047FE03CAED3FE65FFE43C2FE3F116F5836
+:103FF000CD7770CD56703A9F63B7FC053FC9FE532D
+:10400000C20C40CD6115CD4F4FC35A4F78FE3FC211
+:104010003A403A9F63B7F21F4011805CCD77701130
+:10402000A85CCD7770CD597011255DCD7770CDEF3F
+:104030004E11375DCD7770C3D93F78FE30C2514005
+:10404000AFCDAF4E5FCD0870CD0B70CD1470C35A9D
+:104050004F3A8770B8C2694078CDAF4E5FCD0870D7
+:10406000CD0B70CD1470C35A4F78E65FFE50C27C02
+:10407000403A8C70EE01328C70C35A4F3A9F63B74E
+:10408000F2AC4078E65FFE52C299403E81329F63B7
+:10409000110E5BCD7770C35A4FFE51C2AC403E82C9
+:1040A000329F6311F65ACD7770C35A4F78F5CD5CC5
+:1040B00070C3BD40F11E07CD1770C35A4FF1E65FC4
+:1040C000FE44CAED3FC35A4F43505343504D2E4117
+:1040D000534D20283134292020312D4170722D314B
+:1040E00039393124115C003E10CDA547C3F240C3DD
+:1040F0000A413A5C00FE20C2FE40AF325C00215D06
+:1041000000060B363F2305C20341CD09543A5C003B
+:10411000B7C217413A9463C64032ED583AA26CFEDA
+:1041200030C226413E2032EB583AA16C32EC58CDD9
+:104130004F4F11D158CD77703E0432AB703A3D6A83
+:10414000A7C24B413AAB703C32AB70AF32306732F2
+:104150003247323347323447213167222E67CDA6AA
+:1041600042AF323067CDFE45D26E41C3F5413AAD24
+:1041700063A7C286410E0BCD8251B7CA86410E019C
+:10418000CD8251C3F541215D000608CDC7413E2EC9
+:10419000CDBA410603CDC741CD394221AB7035F5CB
+:1041A000C4AA41F1CCD341C36541CDB8413E3ACD1B
+:1041B000BA41C3B841CDB8413E20C5D5E55F0E0236
+:1041C000CD8251E1D1C1C97EE67FCDBA412305C27E
+:1041D000C741C9C5D5E5CD4F4FE1D1C136043A3D00
+:1041E0006AA7C034C9CD4F4F3A94633D5F0E0ECDE0
+:1041F0008251C3C201AF3232473233473A5C00B713
+:10420000CA0A423D5F0E0ECD8251CD7170E511F2AA
+:1042100058CD77703A5C00B7C221420E19CD825159
+:104220003CC64032FD5811FD58CD7770E1CD234F8B
+:10423000110459CD7770C3E5413A3D6AA7C80E23F2
+:10424000115C00CD82513A7D000100006FE607CA83
+:104250005542010100C50603AF3A7E001F327E00C1
+:104260003A7D001F327D0005C258426F3A7E0067DA
+:10427000C1093AA9700F0F0FE61F4F092FA56FE56F
+:1042800001F6FF09DA8D42CDB541C39942E1E5015E
+:104290009CFF09DA9942CDB841CDB841E1CD234F19
+:1042A0003E6BCDBA41C90E1FCD825123237E32AA67
+:1042B00070237E32A97023235E2356EB22A770C998
+:1042C0003E02115C00CDA547C3C2013E04CDA54707
+:1042D000C3C201115C000E11CD82513CC2E84211F3
+:1042E000C355CD7770C3C201115C000E13CD82514E
+:1042F000111359CD7770C3C2013E06CDA547C3C285
+:10430000013E04CDA547C3C2012A2A67EB21E0FF85
+:1043100019DA3E43EB7D3295635D0E20CD8251CD9F
+:1043200009543AA26CFE30C22C433E2032C45432AF
+:10433000EB583AA16C32C55432EC58C3C20111D7C4
+:1043400056CD7770C3C2013E02115C00CDA547C3B4
+:104350002244AF323247323347323447323067215A
+:104360003167222E6BCDFE45DA2244CD3270AF325A
+:10437000A16C115C00CD6E4FCD8D4FC3E243C3885D
+:10438000433A246B3DFA784332246B2A2C6B7E230C
+:10439000222C6BE67FFE20F2DC43FE09C2AF433ED7
+:1043A00020CD2F443AA16CE607C29F43C38143FE50
+:1043B0000DC2BE43CD2F44AF32A16CC38143FE0A70
+:1043C000C2CD43CD2F44AF32A16CC38143FE1AC28C
+:1043D000D543C3E243F53E5ECD2F44F1CD2F44C318
+:1043E00081430E10115C00CD82513E0DCD2F443E15
+:1043F0000ACD2F44CDFE45D26B43AF322067C3C2F6
+:10440000010E10115C00CD82513E0DCD2F443E0AAD
+:10441000CD2F44AF3220673AAD63E601C47752C373
+:10442000C20111C160CD7770AF322067C3C2015F96
+:10443000CD5644C35244DA4E44D5CD17703AA16CE0
+:104440003C32A16CD13A2067A7C8CDC152C9D1C3B3
+:10445000E243D1C30144D5CD8844E67FCA7B44FE04
+:1044600003CA8644FE18CA8144CD8844E67FCA69DF
+:1044700044FE03CA8644FE18CA8144D1373FC35A5A
+:104480004FD137C35A4FD1C9CD14701EFF0E06CD80
+:104490000500C93E03113E6ACDA547C3C2013E03D4
+:1044A000115F6ACDA547C3C2013E04CDA547C3C273
+:1044B00001060C113E6A215F6AAF3221671ABECA3B
+:1044C000C9443A21673C322167231305C2BD443AEF
+:1044D0002167A7C2DF44119860CD7770C3C2011174
+:1044E0003E6A0E0FCD82513CC2F44411C160CD77BB
+:1044F00070C3C201115F6A0E13CD8251115F6A0E43
+:1045000016CD82513CC21145117B55CD7770C36DDC
+:1045100045115F6A0E0FCD82513CC2264511C3552D
+:10452000CD7770C36D45AF322D6D322E6D329363F2
+:10453000213E6A115C00012100CD7470CD8D4FC306
+:1045400078452A2C6BEB0E1ACD8251115F6A0E153D
+:10455000CD8251A7CA3C4511F355CD7770115F6AE2
+:104560000E10CD8251115F6A0E13CD8251113E6A39
+:104570000E10CD8251C3C201115F6A0E10CD82515F
+:10458000C36D453E03113E6ACDA547C3C2013E033C
+:10459000115F6ACDA547C3C201113E6A0E0FCD82DD
+:1045A000513CC2AE4511C160CD7770C3C201115FED
+:1045B0006A0E0FCD82513CCAC34511CA57CD7770E0
+:1045C000C3C201215F6A114E6A011000CD747011DF
+:1045D0003E6A0E17CD82513CC2C20111DC55CD7727
+:1045E00070C3C201435053574C442E41534D2028B1
+:1045F0003429202032302D4A756E2D383624B7C527
+:10460000D5E5C30B46213167222E673A3067A7CA2A
+:104610003A462A2E67115C00010C00CD7470AF324F
+:104620006800327D002A2E67110C0019222E673A8D
+:1046300030673D323067AFC3F4463A3447A7C20211
+:1046400047213167222E67AF3230670E1A11800082
+:10465000CD8251AF3268003A3247B7C27846323322
+:1046600047215C00112647010C00CD74700E11111A
+:104670005C00CD8251C395463D3233472126471118
+:104680005C00010C00CD74700E11115C00CD8251E4
+:104690000E12CD8251F53A3347B7CAA5463D3233A3
+:1046A00047F1C39046F1B7FAF846CD10473A26478E
+:1046B000325C003A32473C3232473E0032680032C8
+:1046C0007D002A2E67EB215C00010C00CD74702A5E
+:1046D0002E67110C0019222E673A30673C32306782
+:1046E000FE40F20546115C00212647010C00CD7406
+:1046F00070C39046E1D1C1C93234473A3067A7C28E
+:104700000546AF32344732334732324737C3F44677
+:1047100087878787874F060021800009115C000189
+:064720000C00CD7470C90D
+:10473200000000435053434D442E41534D20283135
+:104742003329202031372D4A616E2D3139393124F8
+:10475200E1E522776221000039227562EB2279625B
+:10476200EB217F62220463220663AF3270623273EE
+:1047720062CD4F4FC3844E2A7562F9217F622206B1
+:10478200632A7762E92A7562F9217F622204632231
+:104792000663AF327062327362CD4F4FCD844E2AC0
+:1047A2007762E9326F62CDA84DF53EFF327462F155
+:1047B200FE04CA6549FE01CAC049FE02CA154BFE83
+:1047C20010CA154BFE03CA134BFE05CADC47FE0690
+:1047D200CACB4811D360CD7770C9AF320C63320EA9
+:1047E20063320D63EB227B620600CD4F4DB7F22898
+:1047F20048E67FFE1BC216480E021E07CD8251AF4D
+:104802003270622A04632B220463220663217362DC
+:1048120035C3EC47FE3FCA7648FE0CCC3270782A8C
+:104822007B62EBC35A4FFE5CC23B483A0C63A72F34
+:10483200C23B48320C63C3EC475F3A0C63A77BCAA6
+:104842007D48FE5CC24F483A0E63C38348D630FAB5
+:10485200A248FE08F2A2485F3A0E63878787833236
+:104862000E633A0D633C320D63FE033A0E63CA7D5A
+:1048720048C3EC472A066323220663CD8E48C3EC65
+:1048820047CD8E483E5C320C63C3EC47042A7B6200
+:104892007723227B62AF320D63320E63320C63C91F
+:0948A200117061CD7770C3C201F1
+:1048CB00210000222A67CD4F4DB7F23C49E67FFE0F
+:1048DB001BFE20C2EA48C35A4F000000000000FE36
+:1048EB003FCAFE48FE0DCAF748C3874700000000C9
+:1048FB00C35A4F2A2A677DB411B561C20C4911A561
+:10490B0061CD7770CD4F4FCD844E2A066336242A66
+:10491B0004632B220463117F62CD7770AF32706218
+:10492B00C379473E040000000000000000000000B7
+:10493B0000E67FD630DA5C49FE0AD25C493F2A2A70
+:10494B0067E5D12929192916005F19222A67C3D1D6
+:10495B0048115961CD7770C35A4FCD4F4DB7F0E623
+:10496B007FFE1BC28D490E021E07CD8251AF3270E6
+:10497B00622A04632B22046322066321736235C30C
+:10498B006549FE3FC2B849118761CD7770CD4F4F56
+:10499B00CD844E2A06633E24772A04632B220463BC
+:1049AB00117F62CD7770AF327062C37947FE0CCC4A
+:1049BB003270C35A4F227D62EB227B624623220860
+:1049CB00632A0663220A6378B7C83EFF3274622AF1
+:1049DB0008635E231D7BFEFFFABF4ACD4F4DB7F236
+:1049EB00AD4AE67FFE3FC21F4AAF3270622173624F
+:1049FB00352A7D62EBCD3554CD4F4FCD844E2A06F3
+:104A0B00633E24772A04632B220463117F62CD77E4
+:104A1B0070C37947FE1BC28E4AAF327062D5C5E5B3
+:104A2B00CDDA4AC34D4A0E021E07CD82512A0463CA
+:104A3B002B22046322066321736235E1C1D11CC3AF
+:104A4B00DF492A04632BEBE1E57EFE24CA694A2386
+:104A5B00EB7723EB3A73623C327362C3544A3A737B
+:104A6B00623C327362EB3E2077232204632206639F
+:104A7B00E1E5EBCD77700E021E20CD8251E1C1D165
+:104A8B00C3A14AE5D5CDDA4AC39F4A11F960CD7768
+:104A9B0070C38747D1E11C160019235E23567BC3D5
+:104AAB005A4FFE61FAB94AFE7BF2B94AE65F5623CA
+:104ABB00BACADF4916007BB7F2C84A16FF191103B1
+:104ACB000019220863052A0A63220663C3D249052B
+:104ADB00F81C4B7BB7C81600191E03194623EB2A8B
+:104AEB0008637E914FB8CAF54AF02A0A630DFA5A49
+:104AFB004FEB4623EB7E23FE61FA0E4BFE7BF20E51
+:104B0B004BE65FB8C0C3F84A3E00320363EB22FFAB
+:104B1B00621E00360023220163AF3620233CFE0BBE
+:104B2B00FA254B3600233CFE20FA2E4BCD4F4DB7CA
+:104B3B00F2444CE67FFE3FC2634B3A0363B7CA2293
+:104B4B004D2A0663232206633A0463BDC25E4BAF54
+:104B5B003270623E3FC3054DFE1BC2374CAF327005
+:104B6B00622A04632B220463220663217362357B62
+:104B7B0032A16CFE09FA844B3D2A0163FE0BF293C2
+:104B8B004B363F233CC3874B0E112AFF62EBCD8282
+:104B9B0051FEFFCA2D4C21CE6CCD284D21DE6CCDA4
+:104BAB00284D0E122AFF62EBCD8251FEFFCAC14B7C
+:104BBB0021DE6CCD284D11CE6C21DE6C3AA16CFE42
+:104BCB0009FAD04B3D0E00B9CADC4B13230CC3D2F0
+:104BDB004B79FE0BCA084CFE08C2F44B3AA16CFE93
+:104BEB0009CAF44B3E2ECD404D1A134623B8C208CA
+:104BFB004C0CFE20CADC4BCD404DC3DC4B7932A1B3
+:104C0B006C3E24CD404D2A0663EB0E09CD82512A12
+:104C1B0004632B220463217362353AA16CFE0BCA29
+:104C2B0079470E021E07CD8251C379477BB7CA1154
+:104C3B004DFE0DF2114DC35A4FFE2EC2654C1C7B1F
+:104C4B00FE01CA114DFE0AF2114D0E0906002AFF94
+:104C5B0062092201631E09C3374BFE3AC2844C1C06
+:104C6B007BFE02C2114D2A01632B7ED640220163CB
+:104C7B0036202B771E00C3374BFE2AC2B44C3A03A7
+:104C8B0063FE00CA224D7BFE08CA114DF29F4C06F3
+:104C9B0008C3A14C060C2A01633E3F772322016314
+:104CAB001C7BB8FAA14CC3374BFE21FA114D673A66
+:104CBB00A670B77CCAF94CFE25CA114DFE28CA1145
+:104CCB004DFE29CA114DFE2CCA114DFE2FCA114D96
+:104CDB00FE3AFA054DFE40FA114DFE5BFA054DFE0C
+:104CEB005EFA114DFE5FCA114DFE7CCA114DFE617D
+:104CFB00FA054DFE7BF2054DE65F2A016377232211
+:104D0B0001631CC3374B3A6F62FE10CA5F4F11062B
+:104D1B00610E09CD8251C9112961C31C4DF511805A
+:104D2B00000707070707833C5F060B1A137723055A
+:104D3B00C2364DF1C9E52A0463772322046321733C
+:104D4B006234E1C9E5C53A7062B7CCA84D2A066357
+:104D5B007E23220663FE20CA6A4DFE09C27D4D3AB0
+:104D6B007462B7C2514D3EFF3274623E20C1E1C343
+:104D7B00A54DF5AF327462F1C1E1FE1BCAA54DFE24
+:104D8B003FCA9C4DFE0DCA9C4DFE0ACA9C4DFE0CA3
+:104D9B00C0E52A06632B220663E1F680C9F5D5E54B
+:104DAB003A7062B7C2804E217362340E013A72625E
+:104DBB00B7CACD4D1EFF0E06CD8251B7CABF4DC32C
+:104DCB00D04DCD82512A04637723220463FE15CA8A
+:104DDB00E24DFE18C2F64DCD2970CD844E217F6277
+:104DEB002204632173623600C37947FE08CA074E5B
+:104DFB00FE7FC22F4E3A7262B7CC2F703A73623D70
+:104E0B003DB7F21A4E0E021E07CD8251C3E24D3250
+:104E1B0073623A7262B7CC2C702A04632B2B220478
+:104E2B0063C37947FE3FCA5A4EFE1BCA5A4EFE0D4C
+:104E3B00CA4B4EFE0ACA4B4EFE0CC2624ECD3270AE
+:104E4B003A7162B7C25A4E3A7362FE01CA87473E45
+:104E5B00FF327062C3804E3A7362FE7DFAB24D1E12
+:104E6B0007CD17703A73623D3273622A04632B22AB
+:104E7B000463C3B24DE1D1F1C91E0D0E06CD8251B3
+:104E8B002A7962EBCD7770C943505355544C2E4160
+:104E9B00534D20283331292032312D4D61722D3164
+:104EAB0039393124E5C52193704E060021BC4E09DA
+:104EBB00E9C3CE4EC3D84EC3CB4EC3DD4EC3E74E74
+:104ECB00C3EC4EE67FEAEC4EF680C3EC4EF680C3A5
+:104EDB00EC4EE67FE2EC4EF680C3EC4EE67FC3EC85
+:104EEB004EC1E1C93A8770FE20F2014FF51194587B
+:104EFB00CD7770F1F6400E025FCD8251C93E01CDE8
+:104F0B00A547C3114FC911CD54CD7770C3C2013E14
+:104F1B0004CDA547C31C02C93E30CDDE5301F6FFBD
+:104F2B0011FFFF0913DA2E4FE5EB7CB5C42B4FE1D4
+:104F3B007DC63ACDF05332A16C5F3A2267A7C00E03
+:104F4B0002C3825111CA54C377700E09C38251E157
+:104F5B00232323E9C9119C5BCD7770CD2054A7CABD
+:104F6B00664FC9AF32246B322D6D329363322E6D87
+:104F7B00326800326A00327C000E0F115C00CD8269
+:104F8B0051C93A9363B7C0C5D5E53A2D6DB7CAB8C9
+:104F9B004F2A2B6D222C6B01800009222B6D3D3289
+:104FAB002D6D3E7F32246BE1D1C1C35A4F3A2E6D2A
+:104FBB00B7CACA4F329363AF32246BE1D1C1C92A4E
+:104FCB00A370222B6D222C6BEB0E1ACD82510E147B
+:104FDB00115C00CD8251322E6DB7C2FD4F212D6D6C
+:104FEB00343AA570BECA03502A2C6B11800019C32A
+:104FFB00D04FCD7A51C3954FCD7A513A2D6DC39C7D
+:10500B004F3A9363B7C0117F622A2C6B3A246B47DC
+:10501B0005F22C50CD8D4FC33B502A2C6B3A246B91
+:10502B00477832246B7E23222C6BE67FCA1B50C938
+:10503B003EFF329363C9AF326800326A00327C00A4
+:10504B000E0F115C00CD8251FEFFCAB9500E231119
+:10505B005C00CD82512A7D007CB5CAC4502B227DC9
+:10506B00002AA370EB0E1ACD82510E21115C00CDDC
+:10507B008251B7C27A512AA3701180003E1ABECA60
+:10508B009250231DC28950222C6B19222B6D7B321F
+:10509B00246BAF322D6DCD7A51C35A4F0E13115C69
+:1050AB0000CD8251AF326800326A00327C000E169E
+:1050BB00115C00CD8251FEFFC82AA370222C6B110C
+:1050CB00800019222B6D7B32246BAF322D6DC35AAE
+:1050DB004FC5212D6D343AA570BEC2FD5035C1C9E7
+:1050EB00C5212D6D343AA570BEC2FD50CD1551C3EF
+:1050FB0013512A2B6D222C6B11800019222B6D3E24
+:10510B007F32246BC1C35A4FC1C92AA370222B6DA6
+:10511B00222C6B2A2C6BEB21800019222C6B0E1A84
+:10512B00CD8251115C000E15CD8251B7C27A51213F
+:10513B002D6D35C21E51CD7A51C35A4F3A246BFE99
+:10514B0080CA62512A2C6B3DFA5C51361A23C3522A
+:10515B0051CDEB50C35F4F3A2D6DB7CA6F51CD1583
+:10516B0051C35F4F0E10115C00CD8251C35A4F11CA
+:10517B0080000E1AC38251F53AAD63A7CA9F5179CD
+:10518B00FE01CAA351FE06CAA851FE0ACAB251FEBD
+:10519B000BCAD551F1C30500F1CDEA51C97B3CC215
+:1051AB009F51F1CDEA51C9F113CDEA51FE0DCAD38E
+:1051BB0051FE0ACAB451F526001A6F26001319F1D5
+:1051CB00771BEB34EBC3B4511BC9F1E5D511E1638C
+:1051DB002ABB63197ED1E1FE1A3EFFC0C37752E5AD
+:1051EB00D53AAD63E601CA205211E1632ABB6319BC
+:1051FB007E2ABB632322BB63CDA352F57DA7F20F9F
+:10520B0052CD5352F1D1E1FE0ACAEA51FE1AC0CD7A
+:10521B0077523E0DC911A26A3AA16A6F3AA26ABDD2
+:10522B00F23C523AAD63E6EF32AD633E1AF5C30F73
+:10523B00527D2600193C32A16A7EFE3BC24C523E87
+:10524B000DCDA352F5C30F52C5D5E50E1A11E1636F
+:10525B00CD82510E1411BD63CD8251A7C47752215B
+:10526B00000022BB63CD7A51E1D1C1C93AAD63E6EF
+:10527B00FE32AD630E1011BD63CD8251CD7A51C993
+:10528B00F5E52A2667232226677CB5C2A0522A2879
+:10529B006723222867E1F1C9FE0ACAC052FE0DCA74
+:1052AB00C052FE1ACAC052F5C5D5E55F0E02CD0538
+:1052BB0000E1D1C1F1C97B321F67C3EE52CDF3526E
+:1052CB00FE02F2D652CD0A53C3C852FE04FC6A53F7
+:1052DB0078CD5F5347326264216364CD56533A1FD6
+:1052EB006777C95FCD1D70C93A61644F3A626447F5
+:1052FB007891FA07533E7F9081C309537990C9E5A2
+:10530B00D5C5F53A2C67A7CA4D53CD5253A7CA4DF5
+:10531B00532161647E23BECA4D532BCD5F53326143
+:10532B00642323CD56534E3A9A66FE13C24953C596
+:10533B00CDF352C1FE04CA4D53C5CDA453C179CD93
+:10534B00EE52F1C1D1E1C9CD2070C9F5856F3E0098
+:10535B008C67F1C9C53C473E7F9078C1C0AFC9F59A
+:10536B00C5D5E53A6E62A7CA87533E13329A66CD0E
+:10537B00AF4E5FCD0B70118C53CD7770E1D1C1F176
+:10538B00C90D0A5B584F46462073656E7420746FC7
+:10539B0020686F73745D0D0A24F5C5D5E53A6E620E
+:1053AB00A7CAC253AF329A663E11CDAF4E5FCD0B3B
+:1053BB007011C753CD7770E1D1C1F1C90D0A5B589C
+:1053CB004F4E2073656E7420746F20686F73745D1D
+:1053DB000D0A24C5D5E521A16C060A772305C2E683
+:1053EB0053E1D1C1C9F5C5D5E511A96C21AA6C064C
+:1053FB00091A771B2B05C2FC53E1D1C1F1C93EFF42
+:10540B003222670E201EFFCD82516F2600CD234F17
+:10541B00AF322267C91EFF0E06CD8251C932A16C75
+:10542B007D916F7C98673AA16CC9AF32A36C1A134C
+:10543B00FE24C8D5F55FCD1770F1D1FE0AC23954E1
+:10544B003AA36C3C32A36CFE14C23954D5CD604FD9
+:10545B00D1C335544350534441542E41534D20280E
+:10546B00313929202032392D4D61722D31393931A5
+:10547B00244B65726D69742D38302076342E3131A2
+:10548B00202420686173206265656E206275696CEB
+:10549B00742066726F6D2074686520666F6C6C6F1C
+:1054AB0077696E67206D6F64756C65733A244B6515
+:1054BB00726D69742D383020206E6E783A3E240D53
+:1054CB000A240D0A3F556E7265636F676E697A65C4
+:1054DB006420636F6D6D616E64240D0A3F4E6F74B3
+:1054EB0020636F6E6669726D6564243F556E6162F1
+:1054FB006C6520746F207265636569766520696ED3
+:10550B006974696174650D0A243F556E61626C653F
+:10551B0020746F20726563656976652066696C65BA
+:10552B00206E616D650D0A243F556E61626C6520BE
+:10553B00746F207265636569766520656E64206F94
+:10554B00662066696C650D0A243F556E61626C6559
+:10555B0020746F2072656365697665206461746180
+:10556B000D0A243F4469736B2066756C6C0D0A241D
+:10557B003F4469726563746F72792066756C6C0D4C
+:10558B000A243F556E61626C6520746F20726563EF
+:10559B006569766520616E2061636B6E6F776C65F4
+:1055AB006467656D656E742066726F6D20746865D7
+:1055BB0020686F73740D0A240D0A3F556E61626C7F
+:1055CB006520746F2066696E642066696C650D0AD0
+:1055DB00243F556E61626C6520746F2072656E613D
+:1055EB006D652066696C65240D0A3F4469736B20F9
+:1055FB0066756C6C240D0A3F556E61626C65207488
+:10560B006F2074656C6C20686F73742074686174A0
+:10561B00207468652073657373696F6E20697320DE
+:10562B0066696E6973686564240D0A3F556E616225
+:10563B006C6520746F2074656C6C20686F737420BC
+:10564B00746F206C6F676F7574240D0A3F4B657216
+:10565B006D697420686173206E6F74206265656E6E
+:10566B0020636F6E6669677572656420666F722062
+:10567B0061207461726765742073797374656D242E
+:10568B000D0A3F436F6E73697374656E63792063A4
+:10569B006865636B206F6E20636F6E6669677572EA
+:1056AB006174696F6E206661696C6564240D0A3FD5
+:1056BB004572726F722077726974696E6720746FAE
+:1056CB00206C6F672066696C650D0A240D0A3F49D3
+:1056DB006E76616C69642075736572206E756D6290
+:1056EB006572240D0A3F496E76616C6964205061C6
+:1056FB0075736520706172616D65746572240D0A36
+:10570B003F496E76616C6964204255464645522D81
+:10571B0053495A4520706172616D65746572240D31
+:10572B000A3F496E76616C6964207061636B6574C6
+:10573B00206C656E6774682028746F6F206C6F6EB9
+:10574B006729240D0A3F496E76616C6964204368B2
+:10575B0065636B74797065240D0A3F546F6F206D10
+:10576B00616E792072657472696573240D0A3F4608
+:10577B0061696C656420746F2065786368616E671E
+:10578B006520706172616D6574657273240D0A3FDB
+:10579B004661696C656420746F2072656365697618
+:1057AB006520696E70757420737472696E672069F9
+:1057BB006E20616C6C6F7465642074696D65240D6B
+:1057CB000A3F46696C6520616C726561647920657E
+:1057DB0078697374732407436F6D706C65746564BB
+:1057EB0024074661696C6564242552656E616D6999
+:1057FB006E672066696C6520746F20240D0A5B430D
+:10580B006C6F73696E6720746865206C6F672066B8
+:10581B00696C655D240D0A5B436F6E6E6563746521
+:10582B006420746F2072656D6F746520686F73747C
+:10583B002E20205479706520244320746F207265CC
+:10584B007475726E3B0D0A207479706520243F20AD
+:10585B00666F7220636F6D6D616E64206C6973741B
+:10586B005D0D0A240D0A5B436F6E6E656374696F81
+:10587B006E20636C6F7365642C206261636B2061B7
+:10588B0074206D6963726F5D24436F6E74726F6CFD
+:10589B002D24204E6F7420696D706C656D656E7470
+:1058AB0065642E2420284E6F7420696D706C656DB5
+:1058BB00656E746564290D0A2407496E74657272EE
+:1058CB007570746564240909202020204469726571
+:1058DB0063746F727920666F7220647269766520CB
+:1058EB006E6E783A0D0A240D0A09094472697665C1
+:1058FB002024202068617320244B20627974657307
+:10590B0020667265650D0A240D0A46696C6528735D
+:10591B002920657261736564240D0A0D0A5B54724C
+:10592B00616E736D697474696E672066696C65204E
+:10593B00746F20686F73743A0D0A20312E204C69F6
+:10594B006E6573206175746F6D61746963616C6CE6
+:10595B00792073656E742C20616E64207761697495
+:10596B0020666F7220706F737369626C652072654D
+:10597B00706C790D0A20322E20434F4E54524F4CEF
+:10598B002D432061626F727473207472616E736643
+:10599B0065720D0A20332E204966207472616E7376
+:1059AB006665722068616E67732C20747279206152
+:1059BB002072657475726E20746F20636F6E7469DC
+:1059CB006E75650D0A20342E206F6E206578697414
+:1059DB002C20796F752077696C6C20626520706C58
+:1059EB006163656420696E20434F4E4E45435420DE
+:1059FB0073746174652E0D0A245220746F207365C5
+:105A0B006E64207468652073616D65206C696E65CA
+:105A1B0020616761696E2C0D0A2020206F72207443
+:105A2B0079706520244320746F2061626F7274203B
+:105A3B007472616E736D697373696F6E2E5D0D0A8F
+:105A4B00240D0A5B5472616E736D697373696F6EAB
+:105A5B0020646F6E652E20436F6E6E656374656494
+:105A6B00206E6F726D616C6C7920746F2072656D36
+:105A7B006F746520686F73742C0D0A2074797065D0
+:105A8B00202453656E64696E672E2E2E2452656337
+:105A9B00656976696E672E2E2E24075761726E69C3
+:105AAB006E673A2065696768746820626974206361
+:105ABB00616E6E6F742062652073656E74240D0ABF
+:105ACB00466F722068656C702C2074797065203F6E
+:105ADB0020617420616E7920706F696E7420696E1D
+:105AEB00206120636F6D6D616E64240D0A5B4C6FDA
+:105AFB006767696E672073757370656E6465645D47
+:105B0B000D0A240D0A5B4C6F6767696E672072651F
+:105B1B0073756D65645D0D0A240D0A5B5472616EBD
+:105B2B00736D697373696F6E2041626F7274656414
+:105B3B002E20436F6E6E6563746564206E6F726D9D
+:105B4B00616C6C7920746F2072656D6F7465206861
+:105B5B006F73742C0D0A207479706520240D0A0D57
+:105B6B000A5B4175746F6D61746963616C6C79204C
+:105B7B00726563656976696E673B20747970652021
+:105B8B005E4320746F2061626F72745D0D0A0D0AA3
+:105B9B00240D0A0D0A202A202A202A205072657310
+:105BAB007320616E79206B657920746F20636F6E43
+:105BBB0074696E7565202A202A202A200D0A0D0A89
+:105BCB00240D0A5479706520746865206E65772002
+:105BDB00657363617065206368617261637465727C
+:105BEB003A2020240D0A5479706520746865206E64
+:105BFB0065772054414320696E74657263657074D8
+:105C0B00206368617261637465723A2020240D0A07
+:105C1B0047697665207468652073746172742D6FA3
+:105C2B00662D7061636B6574206368617261637468
+:105C3B0065723A20240D0A547970652074686520CA
+:105C4B006E65772070616464696E6720636861724A
+:105C5B0061637465723A20240D0A522053656E6499
+:105C6B00207468652073616D65206C696E652061B9
+:105C7B006761696E240D0A51202053757370656E30
+:105C8B0064206C6F6767696E670D0A52202052653E
+:105C9B0073756D65206C6F6767696E67240D0A3FBE
+:105CAB00202054686973206D6573736167650D0AF5
+:105CBB00432020436C6F73652074686520636F6E9F
+:105CCB006E656374696F6E0D0A302020287A6572D9
+:105CDB006F29205472616E736D69742061204E556B
+:105CEB004C4C0D0A502020546F67676C6520707206
+:105CFB00696E746572206F6E2F6F66660D0A532086
+:105D0B0020537461747573206F662074686520630B
+:105D1B006F6E6E656374696F6E240D0A54797069CA
+:105D2B006E6720616E6F7468657220242077696CD2
+:105D3B006C2073656E6420697420746F20746865C1
+:105D4B0020686F73740D0A0D0A436F6D6D616E647D
+:105D5B003E240D0A5472616E736D697474696E67BB
+:105D6B0020612066696C65240D0A4175746F72653C
+:105D7B006365697665206973240D0A4C6F63616CEA
+:105D8B00206563686F24206F6E24206F6666240D78
+:105D9B000A466C6F7720636F6E74726F6C240D0AFA
+:105DAB005465726D696E616C20646973706C617996
+:105DBB002069732024524547554C41522451554973
+:105DCB004554240D0A5465726D696E616C20656DC6
+:105DDB00756C6174696F6E20697320240D0A4669B6
+:105DEB006C65204D6F6465242064656661756C7409
+:105DFB0024204153434949242062696E61727924FE
+:105E0B000D0A446973706C61792066696C65207347
+:105E1B00697A65206F6E204449524543544F52595D
+:105E2B0020636F6D6D616E64240D0A49424D2066CF
+:105E3B006C6167240D0A446973706F736974696FC1
+:105E4B006E20666F7220696E636F6D706C65746522
+:105E5B002066696C657320697324206469736361C0
+:105E6B00726424206B656570240D0A46696C65208D
+:105E7B007761726E696E67240D0A5072696E746574
+:105E8B007220636F7079240D0A4C6F6767696E67B8
+:105E9B0020746F2024206973242073757370656ED2
+:105EAB00646564240D0A53454E4420737461727407
+:105EBB002D6F662D706B74206368617220205E24D9
+:105ECB000D0A524543454956452073746172742D32
+:105EDB006F662D706B74206368617220205E240DD9
+:105EEB000A53454E44207061636B6574206C656E7C
+:105EFB006774682020240D0A5245434549564520B6
+:105F0B007061636B6574206C656E67746820202408
+:105F1B000D0A45736361706520636861723A2024D2
+:105F2B000D0A4D756C74692D736563746F72206205
+:105F3B007566666572696E672061742024206F66D2
+:105F4B002061206D6178696D756D206F6620240D61
+:105F5B000A5472616E736D69742070726F746F6323
+:105F6B006F6C20636861723A20240D0A426C6F6378
+:105F7B006B20636865636B20747970653A20242D00
+:105F8B00636861726163746572240D0A46696C659E
+:105F9B0020434F4C4C4953494F4E3A2020240D0A75
+:105FAB005061726974793A20246E6F6E65246D614D
+:105FBB00726B247370616365246F6464246576650A
+:105FCB006E240D0A506F727420696E2075736520F4
+:105FDB0069733A20240D0A43757272656E742073CF
+:105FEB00706565642069733A20242062707324699C
+:105FFB006E64657465726D696E61746520286E6F71
+:10600B00742053455429240D0A54696D6572240D6F
+:10601B000A43757272656E742054414354726170F9
+:10602B00205374617475732F496E74657263657058
+:10603B0074204368617261637465723A2020240D89
+:10604B000A43757272656E742075736572206E7576
+:10605B006D6265723A2020240D0A4465627567678C
+:10606B00696E67240D0A43757272656E74206465E0
+:10607B006661756C74206469736B3A202420202050
+:10608B00202020202020202020202020240D0A3F0B
+:10609B00536F7572636520616E64206465737469F8
+:1060AB006E6174696F6E2066696C657320746865C8
+:1060BB002073616D65240D0A3F46696C65206E6F18
+:1060CB007420666F756E64240D0A3F50726F677291
+:1060DB00616D206572726F723A2020496E76616C29
+:1060EB00696420434F4D4E442063616C6C240D0A50
+:1060FB003F416D626967756F7573240D0A3F496C7B
+:10610B006C6567616C2043502F4D2066696C652070
+:10611B0073706563696669636174696F6E240D0AD8
+:10612B003F57696C642D6361726473206E6F7420CA
+:10613B00616C6C6F77656420696E2066696C652095
+:10614B0073706563696669636174696F6E240D0AA8
+:10615B003F496E76616C69642075736572206E754C
+:10616B006D626572240D0A3F496E76616C6964201D
+:10617B005C20706172616D657465722420436F6E73
+:10618B006669726D207769746820636172726961E8
+:10619B0067652072657475726E2420456E74657226
+:1061AB002061206E756D6265722420436F6E666987
+:1061BB00726D2077697468206361727269616765BB
+:1061CB002072657475726E206F7220656E746572C5
+:1061DB00206D6F7265243C5353746174653A3E2095
+:1061EB00003C5253746174653A3E20003C44617428
+:1061FB0061207472616E736D69747465643E200006
+:10620B003C44617461207265636569766564202026
+:10621B00203E20000D0A000D0A4E65772066696C42
+:10622B00653A20240D0A50617373776F72643A20BC
+:10623B00240D0A4163636F756E743A20240D0A4E68
+:10624B006577206E616D653A20240D0A4D65737379
+:10625B006167653A20240D0A4F7074696F6E733A4B
+:02626B002024ED
+:01626E00002F
+:03630C000000008E
+:10639400000001010000000000260000004B4552EF
+:1063A4004D495420204C4F470000FF004B45524DAF
+:0763B40049542020494E4925
+:0463C90000000000D0
+:0463DD0000000000BC
+:04656D00000000002A
+:016671000028
+:046696000000000000
+:0A672000000000000000000000006F
+:01672C00006C
+:016A3D00FF59
+:016AA10002F2
+:016B22000072
+:046B2500000000006C
+:106B43000000000000000000000000000000000042
+:036B53000000013E
+:026C19000D2448
+:016CA00000F3
+:016CAD0000E6
+:046D910000000000FE
+:107000000000000000000000C30000C30000C30037
+:1070100000C30000C30000C30000C30000C30000A1
+:10702000C30000C30000C30000C30000C30000C3CE
+:107030000000C30000C30000C30000C30000C30081
+:1070400000C30000C30000C30000C30000C3000071
+:10705000C30000C30000C30000C30000C30000C39E
+:107060000000C30000C30000C30000C30000C30051
+:0A70700000C30000C30000C30000CD
+:00012700D8
diff --git a/cpsmit.asm b/cpsmit.asm
new file mode 100644 (file)
index 0000000..f41ee70
--- /dev/null
@@ -0,0 +1,834 @@
+; CPSMIT.ASM
+;       KERMIT - (Celtic for "FREE")
+;
+;       This is the CP/M-80 implementation of the Columbia University
+;       KERMIT file transfer protocol.
+;
+;       Version 4.0
+;
+;       Copyright June 1981,1982,1983,1984,1985
+;       Columbia University
+;
+; Originally written by Bill Catchings of the Columbia University Center for
+; Computing Activities, 612 W. 115th St., New York, NY 10025.
+;
+; Contributions by Frank da Cruz, Daphne Tzoar, Bernie Eiben,
+; Bruce Tanner, Nick Bush, Greg Small, Kimmo Laaksonen, Jeff Damens, and many
+; others. 
+;
+;       This file contains the system-independent initialization, the main
+;       loop, and the commands that don't have any place better to go.
+;      All the SET xxx and status routines now in CPSCOM.ASM as CPSMIT.ASM
+;      was getting too big.
+;
+; revision history:
+;
+;edit 30, 29-Mar-1991 by MF. When looking up a TAKE-file in a TAKE command
+;      and the file is not found, complain if it's not the first TAKE of
+;      the current program execution (the automatic TAKE of KERMIT.INI)
+;edit 29, 25-Mar-1991 by MF. Add STAY command as a synonym for SET NO-EXIT
+;      command per Martin J. Carter of Nottingham University in the U.K.
+;edit 28, 21-Mar-1991 by MF. Modify code after "inp2a" in INPUT command
+;      so a ^C will halt TAKE-file processing
+;edit 27, 27-Feb-1991 by MF. Add QUIT as a synonym for EXIT per code of
+;      Dr. Martin J. Carter of Nottingham University, U.K. Recognizing QUIT
+;      helps those who forget they're not in MS-Kermit, C-Kermit,
+;      Kermit-32 etc. Also add commands so that CONNECT, RECEIVE and SEND may
+;      be abbreviated to C,  R and S, respectively.
+;edit 26, 5-Nov-1990 by MF.  Cosmetic changes to main HELP messages for
+;      COPY and RENAME commands.
+;edit 25, 1-Nov-1990 by MF.  Made the following command-name changes in the
+;      interest of uniformity of nomenclature (per suggestions of FDC):
+;      FCOPY to COPY, FRENAME to RENAME and STRING to OUTPUT.
+;      This means we'll have to type "CO" for CONNECT and "REC" for 
+;      RECEIVE but with REMOTE now with us we have to do the latter anyway.
+;edit 24, 18-Sep-1990 by MF.  Implemented FRENAME command to rename a
+;      CP/M file.
+;edit 23, 9-Sep-1990 by MF.  Implemented commands to be sent to a
+;      remote Kermit Server (Remote commands).
+;      Implemented setting of packet sizes for RECEIVE and SEND.
+;      Put DIRECTORY/STRING help texts in proper alphabetical position.
+; edit 22, July 6th, 1987 by OBSchou.  Added a dummy Commandline to be
+;      loaded for debugging purposes as DDT destroys any command line at 80H
+;      Also fixed a bug or two...
+;
+; edit 21, April 8th, 1987.
+;      Various bits, including more SET SENDRECEIVE options, and make 
+;      PADDING and PADCHAR valid options.  Have I wasted my time, or 
+;      there still systems that use padding??  Fixed a bug in the INPUT
+;      command so we know how many characters there are to check for. Also
+;      hived off the SET commands to make a new file, CPSCOM.ASM thereby
+;      reducing the size of CPSMIT.ASM.  Also rename COPY command to FCOPY
+;      hence retaining a single C to imply connect.
+;
+; edit 20, March 30, 1987 by OBSchou.  
+;      added code for no exit to CPM if a command tail is done (optional)
+;      by the SET NO-EXIT command.  Added bits for SET AUTORECEIVE to enable 
+;      or inhibit automatic receive of several files (if something is coming 
+;      along from the remote side, do a receive. Toss first packet away.)  
+;      This is first step to SERVER???
+;      Also added back the INPUT command.
+;
+; edit 19, March 16, 1987.  Moved the code to check for and execute 
+;      command tails (See Richard Russells submission below).  
+;      Added flags to exit to CP/M after executing a command tail.  
+;      The KERMIT.INI file is taken before the command tail is issued.
+;
+; edit 18, March 11, 1987 by OBSchou.
+;      Added in code for TYPE <file> and PRINT <file>.  Hope to add COPY 
+;      later on.  Also added in code submitted by Richard Russel, to accept
+;      a command tail on entry to kermit (eg KERMIT CONNECT).  This facility
+;      if used, will replace the automatic TAKE function on loading Kermit.
+;      Unfortunately, you will not be dropped back to CP/M after the command
+;      In the future, it may be possible to either accept several commands
+;      on the command tail, and possibly accept the automatic TAKE facility
+;      as well.  Low on my list of things to do.
+;
+; edit 17, January 28, 1987 by OBSchou for DJ Roberts of Leicester
+;      Also added a couple of fixes [obs]
+;
+;      DJR  January 1987  David J. Roberts.
+;          USER made a SET option
+;          STATUS output placed in alphabetical order
+;          Report DEBUG mode and default disk 
+;          Name of LOG file on SHOW/STATUS display
+;
+;
+; edit 16 December 1st, OBSchou.  Fixed bug in that if the overlay is not in
+;      place or correct then prtstr is not called to print the error message
+;      (As prtstr has been moved out of the system independent code)
+;
+; edit 15 November 10, 1986 by OBSchou.  Re-inserted Pause and Break 
+;       commands for release.
+;
+; edit 14 August 29, 1986.  Removed PAUSE,BREAK,INPUT and SET CASE as 
+;       these have not been fully coded or debugged.  (For next 
+;       version of Kermit-80...). Also tidied up a bit.
+;
+; 13 by OBSchou for Godfrey Nix.  He writes:
+;       edit August 11,1986      Godfrey Nix, Nottingham University [gnn]
+;       To insert code for setting the packet start character on
+;       both send and receive packets (default is still 01H)
+;       and make GET and RECEIVE to be separate;
+;       use with edits to CP4PKT, CP4UTL
+;
+; edit 12: 19 June, 1986 by OBSchou.  Added PAUSE and BREAK facility.
+;       Breaks simulate a call to sysint which tests for a B being passed.
+;       Note this is only useful if the system dependent code supports breaks,
+;       and an appropriate message is returned if breaks are not possible.
+;       Also added is the command entry for INPUT, which waits for a string
+;       from the host for a given time.  The time is a very variable counter
+;       incremented every BDOS call.  Trial and error will give a reasonable
+;       value.  STRING acceps a string from the use and then sends it on 
+;       to the host.  These new commands allow a user to (almost) set up auto
+;       log on files, where BREAKS/INPUT/STRING/STRING partially emulate a user
+;       (AI LURES OK and all that).  Still could do with a test, eg if not a
+;       correctly returned string go back n steps.  This would make a fairly 
+;       simple TAKE command a lot more complicated.
+;
+;edit 11: 30 May, 1986 OBSchou.  Added in a couple of more routines and such
+;
+;edit 10: 27 May, 1986 OBSchou.  Added in support for USER function
+;       removed XMIT test and routine, but also added SET FLOW-CONTROL
+;       (set for XON/XOFF flow control in both directions) and a 
+;       SET CASE-SENSITIVE ON/OFF (if on => a # A, if ON => a=A)
+;
+;edit 9: 13 May, 1986 OBSchou, Loughborough University, UK
+;       Added in code for SET XMIT character to allow setting of the
+;       character to wait for from the host during TRANSMIT.  It is
+;       a line feed by default.  Also added a TAKE command, to take: commands
+;       from a named disk file.  If a file is TAKEn, then all BDOS calls 
+;       are trapped and tested for console input.  If so, we substitute a 
+;       character (or buffer) from the TAKE file specified.
+;       This may also be used in the future for a CPKERMIT.INI 
+;       to be evaluated during Kermit initialsation.
+;
+; edit 8: February 6, 1895
+;       Add a PORT status/show routine for those machines that have more
+;       than one they can talk to. It also required a port storage variable
+;       a la SPEED and the necessary code to handle it in the SET routine.
+;       [Hal Hostetler]
+;
+; edit 7: 13-Jan-85 by Vanya J.Cooper Pima Commun. College Tel: 602-884-6809
+;
+;pcc003-pcc005  2-Jan-85        vjc     modules:cp4mit,cp4tt,cp4utl
+;       These edits must all be installed together and change the way
+;       logging is handled.  The log file spec is moved to a separate
+;       fcb, and not opened until an actual CONNECT command is given.
+;       This takes care of a NASTY bug that if you used any other file
+;       command between the LOG and CONNECT, the log file would get
+;       written over the last file used.  This also allows logging to
+;       be "permanently" enabled until an CLOSE (new command) for all
+;       CONNECT sessions, like most other kermits do.  If a log file
+;       already exists, it will be appended to.  Also add two new
+;       CONNECT mode commands <esc>Q to suspend logging and <esc>R to
+;       resume.  <esc>R means something else during TRANSMIT, but
+;       logging is never on then, so there shouldn't be any conflict.
+;       I also changed the write code, so that it can handle one more
+;       character after the XOFF is send to stop the host.  This allows
+;       a little "slop" for systems that don't stop immediately (such
+;       as TOPS10), but it didn't help much.
+;
+;pcc012 4-Jan-85        vjc     modules:cp4mit,cp4tt,cp4utl
+;       Use the big buffer for the log file.  Move the log file back
+;       into the common fcb and only save the drive, name, and
+;       extension between connects.  Add new routines to cp4utl to
+;       create or append to an existing file, and to conditionally
+;       advance buffers only if in memory.  Remove edit pcc003 that
+;       allows one more character after the xoff, since it didn't
+;       really work very well and does not fit in well with the way
+;       the buffer advancing routines are set up.  If someone still
+;       thinks this would be useful, it could be put back in with a
+;       little more work.
+;       
+;       While testing this edit, I also noticed another bug that
+;       the command parsing routines do not limit or check the
+;       length of command lines or file specs, trashing what ever
+;       comes after them.  Currently because of where the fcb and
+;       command buffer are located, this does not usually cause a
+;       problem, but could if an extremely long line was typed in,
+;       or in the future multiple fcbs defined elsewhere in memory
+;       were used.  Maybe this should be put on the bug list
+;       somewhere.
+;
+;pcc013 8-Jan-85        vjc     modules:cp4mit,cp4utl,cp4typ
+;       Replace CLOSE command to cancel session logging to SET
+;       LOGGING ON/OFF.  This seems to fit in with the command
+;       structure better.  Default the log file to KERMIT.LOG
+;       incase no previous LOG command.  Logging is also enabled
+;       by LOG command, as before.
+;
+; edit 6: September 8, 1984
+;       Add VERSION command, to display the internal version strings.
+;       Move command tables here from CP4UTL, and translate string
+;       lengths in them to decimal (how many fingers do YOU got?).
+;       Replace some jump tables with dispatch addresses in tables.
+;       Make help text for SET command consistent with top level help text.
+;
+; edit 5: August 21, 1984
+;       Add word at 0100H to allow us to exit cleanly from DDT (shifting
+;       entry section by two bytes).
+;
+; edit 4: August 3, 1984 (CJC)
+;       Remove "mover" from entry section, as it now lives in CP4SYS.
+;
+; edit 3: July 27, 1984 (CJC)
+;       Merge LASM support from Toad Hall: most of CP4MIT is now in CP4UTL.
+;       When assembling with LASM, CP4MIT is linked by CP4DEF; it links to
+;       CP4PKT.  Add SET TACTRAP command.  Separate out display routines so
+;       we can eventually do "SHOW <parameter>".  Save both bytes of baud
+;       rate in speed, and check both bytes when displaying baud rate.  Move
+;       header info to CP4KER.ASM.  Add onoff and chkkey routines to simplify
+;       SET command (Toad Hall)
+;
+; edit 2: June 8, 1984
+;       formatting and documentation; delete unreferenced variables and some
+;       unnecessary labels; move setpar here from cp4pkt; add module version
+;       string; make this version 4.01.
+;
+; edit 1: May, 1984
+;       extracted from CPMBASE.M80 version 3.9; modifications are described
+;       in the accompanying .UPD file.
+
+;\f
+       ASEG
+       ORG     100H
+
+; The CCP invokes programs with a CALL 100H, with the stack pointer set to
+; 100H.  When we exit to CP/M, we do so with a RET, avoiding a warm boot.
+; Unfortunately, DDT starts programs with a jump, not a call, so when we
+; attempt to return to CP/M, we blow the stack and use the word at 100H as
+; the new PC.  Put a 0 there so we reboot instead of dying horribly.
+; (Fortunately, this happens to be two NOP's).
+       dw      0
+       jmp     start   ; Bypass entry section
+
+;
+;       Entry section for system-independent part.  This contains
+;       jumps to routines needed by the system support module.
+;
+entries:
+       jmp     kermit          ; reentry address
+       jmp     nout            ; output HL in decimal
+entsiz equ     $-entries       ; length of entry section
+;
+;       End of entry section.  As a consistency check, the expected
+;       length of this section is stored by the system-dependent
+;       module in the linkage section at the end of Kermit, and
+;       tested at initialization.
+
+mitver:        db      'CPSMIT.ASM (30) 29-Mar-1991$'  ; name, edit number, date
+;\f
+;
+;       Initialization
+;
+start: lxi     h,0             ; Clear out hl pair
+       dad     sp              ; and fetch the system stack pointer
+       shld    oldsp           ; and save for later restoral
+       lxi     sp,stack        ; move in our own stack.
+       lxi     d,version       ; print Kermit version
+       call    prtstx          ;  before we do too much (Use fudged prtstr)
+       mvi     c,rddrv         ;Get our logged in drive
+       call    BDOS
+       inr     a               ;relative 1
+       sta     CURDSK          ;and save it for later
+
+       lda     vtflg           ; [OBS] Hangover from VT52 ems not possible...
+       cpi     0ffh            ; ... if 0ff stored, assume terminal = off
+       mvi     a,vtdefo
+       jnz     start0
+       sta     vtflg           ; if 0ffh make it VT52 off
+start0:
+
+
+IF debug
+;vvvvvvvvvvvvvvvv remove this for run time
+; OBS edit 22 - add in a dummy command line to 80H
+       lxi     h,dcomln        ;[22] load up dummy command line
+       lxi     d,81h           ;[22] where to put it
+       lxi     b,endcoml-dcomln
+       mov     a,c             ; get length to a
+       sta     80h             ; ... and save as command line length
+       call    mover           ; ... and save rest of line
+       jmp     starta
+dcomln:        db      'set baud 4800',semico
+       db      'set dir on',semico
+       db      'dir'
+       db      0,0     ; just to make up space
+endcoml:
+;^^^^^^^^^^^^^^^^ remove this for run time
+ENDIF  ;debug
+
+
+starta:
+;
+;       Make sure the overlay is in place...
+;
+       lhld    lnkflg
+       mov     a,h
+       ora     l               ; if lnkflg is still zero,
+       jz      start1          ;  the configuration overlay is missing.
+       lxi     d,-lnksiz       ; if it's not equal to lnksiz,
+       dad     d               ;  we've probably got the wrong
+       mov     a,h             ;  version of the configuration overlay.
+       ora     l
+       jnz     start2
+       lhld    lnkent          ; make sure the overlay knows how long
+       lxi     d,-entsiz       ; our entry section is, so they don't miss.
+       dad     d
+       mov     a,h
+       ora     l
+       jnz     start2
+                               ; might be ok.
+       lxi     h,bdos          ; set xbdos address to bdos trap in our code.
+       shld    xbdos+1         ; (they may never use it...)
+       call    sysinit         ; do system-dependent initialization
+       lda     bufsec          ; get the max no of buffers allowed by system
+       sta     maxbsc          ; save for SET BUFFER use to compare
+       lxi     d,inms26        ; offer some advice on getting help
+       call    prtstr
+       lxi     h,buff          ;[19] we copy any potential command tail across
+       lxi     d,cbuff
+       lxi     b,80h           ;[19] copy all 128 bytes.  May use none.
+       call    mover
+       lda     80h             ; see if there is a command tail...
+
+       ana     a
+
+
+
+; Remove for runtime use
+;      xra     a               ; make out there is no command tail
+; Runtime => no XRA above
+
+       jz      startz
+       dcr     a
+       jz      startz          ; one character tail...
+       lda     takflg          ; if more characters, say we are have tail
+       ori     10h             ; set bit 4
+       sta     takflg
+       sta     nexitf          ; exit back to CP/M after command line
+startz:
+       mvi     a,0ffh          ; when here, system basically initiallised,...
+       sta     initflg         ; apart from KERMIT.INI, so say initialised.
+
+       call    take1           ;[9] take a KERMIT.INI file
+       xra     a               ;[MF] Say we've done it
+       sta     initak          ;[MF] ...
+       jmp     kermit          ; Start main loop.
+
+start1:        lxi     d,erms20        ; "Kermit has not been configured"
+       call    prtstx          ; print error message (Use bodge for prtstr)
+       jmp     exit2           ;  and exit.
+
+start2:        lxi     d,erms21        ; "Consistency check on configuration failed"
+       call    prtstx          ; print error message
+       jmp     exit2           ;  and exit.
+;\f
+;This is the main KERMIT loop.  It prompts for and gets the users commands.
+
+kermit:        lxi     sp,stack        ; get new stack pointer, old one might be bad.
+       call    selcon          ; make sure console is selected.
+       xra     a
+       sta     mfflg1          ;reset MFNAME
+       sta     mfflg2          ;ditto
+       sta     mfflg3
+       sta     getrxflg        ; clear the get/receive flag
+                               ;0=> receive, non 0 => get
+       sta     cmbflg          ;[MF]Initial keyword must not be blank
+       sta     cmqflg          ;[MF]Allow character-echoing during commands
+       sta     remtxt          ;[MF] Clear remote-text-to-screen flag
+       lda     curdsk          ; update the prompt
+       adi     'A'-1
+       sta     kerm1+2
+       call    getun           ;[11] get the user number into temp1/2
+       lda     temp1+1         ;[11] get ms value of user number
+       cpi     '0'             ;[11] less than 10 => do a space
+       jnz     kerm4           ;[11] else do MS digit of user number
+       mvi     a,' '           ;[11]
+kerm4: sta     kerm1           ;[11]
+       lda     temp1           ;[11] get ls digit of user number
+       sta     kerm1+1         ;[11] save that
+       lda     takflg          ; are we in TAKE or command line??
+       ani     11h             ; strip out both bits
+       jnz     kerm5           ; still in either or both...
+       lda     nexitf          ; if neither, and no-exit-flag set, we quit.
+       ana     a
+       jnz     exit            ;... back to CP/M, else as you were...
+kerm5:
+       lxi     d,kerm
+       call    prompt          ;Prompt the user.
+
+kerm7: lxi     d,comtab
+       lxi     h,tophlp
+       call    keycmd          ; Get a keyword
+       xchg                    ; Get result (dispatch address) into HL
+       pchl                    ; Dispatch.
+
+;       here from: log, setcom, read, cfmcmd
+kermt3:        lxi     d,ermes3        ;"Not confirmed"
+       call    prtstr
+       jmp     kermit          ;Do it again.
+
+;       Structure of command table:
+;
+;       1) Number of entries.
+;       2) Each entry is arranged as follows:
+;               a) length of command in bytes.
+;               b) 'name of command and $-sign'
+;               c) address of routine to process command
+;
+;       ---> Note this command table is in alphabetic order.
+;
+
+comtab:        db      32      ; added remote
+                       ;[obs] added in COPY command, now called FCOPY
+                       ;[obs] removed remote simply to issue V4.09
+                               ;[MF]Make FCOPY/FRENAME COPY/RENAME for
+                               ;[MF]Version 4.10
+                               ;[MF]Add QUIT as a synonym for EXIT and
+                               ;[MF]C, R and S as abbreviations for
+                               ;[MF]CONNECT, RECEIVE and SEND, respectively
+                               ;[MF]Add STAY as a synonym for SET NO-EXIT
+       db      5, 'BREAK$'
+               dw break
+       db      3, 'BYE$'
+               dw bye
+       db      1,'C$'
+       dw      telnet          ;[MF]Abbreviation for CONNECT
+       db      7, 'CONNECT$'
+               dw telnet
+       db      4,'COPY$'
+               dw copy
+       db      9, 'DIRECTORY$'
+               dw dir
+       db      5, 'ERASE$'
+               dw era
+       db      4, 'EXIT$'
+               dw exit
+       db      6, 'FINISH$'
+               dw finish
+       db      3, 'GET$'
+               dw read         ; [gnn] entry for GET
+       db      4, 'HELP$'
+               dw help
+       db      5, 'INPUT$'
+               dw input
+       db      3, 'LOG$'
+               dw log
+       db      6, 'LOGOUT$'
+               dw logout
+       db      6, 'OUTPUT$'
+               dw string
+       db      5, 'PAUSE$'
+               dw pause
+       db      5, 'PRINT$'
+               dw printf       ;[obs] print a file
+       db      4,'QUIT$'
+       dw      exit            ;[MF]Synonym for EXIT
+       db      1,'R$'
+       dw      read0           ;[MF]Abbreviation for RECEIVE
+       db      7, 'RECEIVE$'
+               dw read0        ; [gnn] not same as GET now
+       db      6, 'REMOTE$'
+               dw remote
+       db      6,'RENAME$'
+       dw      rename          ;[MF]
+       db      1,'S$'
+       dw      send            ;[MF]Abbreviation for SEND
+       db      4, 'SEND$'
+               dw send
+       db      3, 'SET$'
+               dw setcom
+       db      4, 'SHOW$'
+               dw show
+       db      6, 'STATUS$'
+               dw status
+       db      4,'STAY$'
+       dw      noexit          ;STAY (SET NO-EXIT)
+       db      4, 'TAKE$'                      ;[9]
+               dw take
+       db      8, 'TRANSMIT$'
+               dw xmit
+       db      4, 'TYPE$'
+               dw type         ;[obs] type a file command
+       db      7, 'VERSION$'
+               dw shover
+;      db      4, 'USER$'                      ; removed [DRJ]
+;              dw user                         ;[10] removed [DRJ]
+; top-level help message. Caps indicate keywords.
+; this text is also printed by the HELP command.
+
+tophlp:        
+       db      cr,lf,'BREAK to send a break to the host'
+       db      cr,lf,'BYE to host (LOGOUT) and exit to CP/M'
+       db      cr,lf,'CONNECT to host on selected port'
+       db      cr,lf,'COPY to copy a CP/M file'
+       db      cr,lf,'DIRECTORY of current used Micro-disk'
+       db      cr,lf,'ERASE a CP/M file'
+       db      cr,lf,'EXIT to CP/M'
+       db      cr,lf,'FINISH running Kermit on the host'
+       db      cr,lf,'GET a file from the host'
+       db      cr,lf,'HELP by giving this message'
+       db      cr,lf,'INPUT to make the micro wait for a string from the host'
+       db      cr,lf,'LOG the terminal sessions to a file'
+       db      cr,lf,'LOGOUT the host'
+       db      cr,lf,'OUTPUT to send a specified string to the host'
+       db      cr,lf,'PAUSE to wait for a little time'
+       db      cr,lf,'PRINT a file to the printer'
+       db      cr,lf,'QUIT to CP/M'
+       db      cr,lf,'RECEIVE file from host'
+       db      cr,lf,'REMOTE to send commands to a remote server'
+       db      cr,lf,'RENAME to rename a CP/M file'
+       db      cr,lf,'SEND file to host'
+       db      cr,lf,'SET a parameter'
+       db      cr,lf,'SHOW the parameters'
+       db      cr,lf,'STATUS of Kermit'
+       db      cr,lf,'STAY at Kermit command-level after a command tail'
+       db      cr,lf,'TAKE commands from a file'               ;[9]
+       db      cr,lf,'TRANSMIT file to host (in connect state)'
+       db      cr,lf,'TYPE a file to the console'
+       db      cr,lf,'VERSION of Kermit running'               ;[pcc005]
+;      db      cr,lf,'USER to set a different user number' ;removed [DJR]
+       db      '$'             ;[obs] added it here to allow for expansion
+
+;\f
+;       This is the BREAK command.  It sends a 'B' to the system dependent
+;       interrupt routines (test for escape-cokebottle xxx) and do a break
+;       if the overlay can.  Else, we tell user not to be so silly.
+break: call    cfmcmd          ; get return
+       mvi     a,'B'           ; were gonna do a break if the overlay can
+       call    sysint          ; try doing it..
+       jmp     kermit          ; if we can do it, else
+       lxi     d,inms12        ;... say not implemented
+       jmp     kermit
+
+;
+;
+;       This is the BYE command.  It tells the remote KERSRV to logout,
+;       then exits.
+
+bye:   call    cfmcmd
+       call    logo            ;Tell the main frame to logout.
+       jmp     kermit          ;If it fails, don't exit.
+       call    sysbye          ; success. do system-dependent cleanup
+       jmp     exit1           ;Exit Kermit.
+
+;       This is the EXIT command.  It leaves KERMIT and returns to CP/M.
+;       alternate entries: exit1, from BYE command;
+;       exit2, from initialization (if it fails)
+
+exit:  call    cfmcmd          ; confirm...
+exit1: call    sysexit         ; do system-dependent termination
+exit2: 
+       jmp     0               ; return to CP/M via JUMP instead of RET.
+       
+;      lhld    oldsp           ;Get back the system stack
+;      sphl                    ;and restore it.
+;      ret                     ;Then return to system.
+
+;       Input command.  Syntax:
+;               INPUT [Wait period] [string]
+;       where
+;               Wait period is a time period to wat for
+;               string is a string to expect back from the host.  Control
+;                       characters are entered as \ and an octal number.
+;
+;       I can see uses for this command from other routines...
+;
+input: mvi     a,cmnum         ; first get the number
+       call    comnd           ; get it
+       jmp     kermit          ; if we dont understand it...
+       lhld    number
+       shld    waitp           ; and save as the wait period
+       lxi     d,stbuff        ; where to put the string
+       mvi     a,cmtxt         ; get text
+       call    comnd
+       jmp     kermit          ; not quite correct...
+       sta     strcnt          ; string count returned in a
+       call    cfmcmd          ; get a confirm
+
+       lhld    waitp           ; multiply the number by
+       dad     h
+       dad     h               ; ... 4
+       dad     h               ; ... 8
+       inx     h               ; but make sure it is at least 1
+       shld    waitp           ; and save it away again
+       shld    waitp1          ; save in case we need to reset counter
+
+; Right, now wait for characters comming from the line, within the
+;      time allowed (very fuzzy).  Compare with STRING buffer
+;
+inp1:  xra     a
+       sta     repcnt          ; clear the host prompt chars.counter
+inp2:  lhld    waitp           ; have we waited long enough
+       dcx     h
+       shld    waitp           ; count less one
+       mov     a,h             ; test to see if both zero
+       ora     l
+       jnz     inp20           ; nope
+       mvi     a,3             ; error is three ie total failure
+       sta     errorc
+       jmp     inp5            ; take error exit
+
+inp20: call    rd1chl          ; read a character from the line
+       ani     7fh             ; set flags
+       jnz     inp4            ; Not zero => we have a character from host
+       call    ckchr           ; see if *WE* have a character from console
+       push    psw             ; restore to modem
+       call    selmdm          ; reselect the modem port
+       pop     psw
+       ani     7fh             ; strip parity (should not be there)
+       jnz     inp2a           ; if a null, try again
+       lda     strcnt          ; if the string length is zero, dont wait.
+       ana     a
+       jnz     inp2            ; so loop back again
+       jmp     kermit          ; else drop out
+
+inp2a: cpi     cntlc           ; do we want to abort?
+;[MF]Change following line
+;      jz      kermit          ; in which case exit back to command loop
+       jnz     inp2b           ;[MF] No
+       lda     takflg          ;[MF] Yes, are we TAKEing
+       ani     1               ;[MF] commands from a file?
+       cnz     closet          ;[MF] Yes, close and reset to get
+                               ;[MF] commands from the command-line
+       jmp     kermit          ;[MF] and exit back to command loop
+inp2b: cpi     cntlz           ; if control z exit back to command loop
+       jz      kermit          ; else try for other characters [MF]
+       jmp     inp2
+
+inp4:  mov     e,a             ; save it for a while
+       lda     repcnt          ; see if this character matches with one in buffer
+       lxi     h,stbuff        ; point to string buffer
+       add     l               ; make hl = hl + a
+       mov     l,a
+       mvi     a,0             ; ie make hl = hl + character count
+       adc     h
+       mov     h,a             ; not using xra, as that clears the Carry flag
+       mov     a,e             ; get the character back again
+       cmp     m               ; is it = to what we expect?
+       jnz     inp1            ; no, clear counter and try again
+       lda     repcnt          ; yes, then update the pointer, and ...
+       inr     a               ; ... see if we have received all ...
+       sta     repcnt          ; ... we should have received
+       lhld    waitp1          ; get original counter
+       shld    waitp           ; and reset the loop (timer) counter
+       mov     e,a             ; save length into E again
+       lda     strcnt          ; get the length to compare
+       sub     e               ; if (e) > string length, we have it
+       jnz     inp2            ; else wait for a little longer
+
+       xra     a               ; no errors
+       sta     errorc
+       jmp     kermit          ; so say nothing
+;else if error...
+
+inp5:  lxi     d,erms30        ; say message not receive in time...
+       call    prtstr
+       jmp     kermit          ; have string, so exit
+
+;
+;
+
+;       This is the HELP command.  It gives a list of the commands.
+
+help:  call    cfmcmd
+       lxi     d,tophlp        ;The address of the help message.
+       call    p20ln           ;Print at most 20 lines then pause
+;      call    prtstr
+       jmp     kermit
+;\f
+;       This is the LOG command.  It logs a session to a file.
+
+log:   mvi     a,cmofi         ;[pcc005] Parse an output file spec.
+       lxi     d,fcb           ;[pcc012] where to put it
+       call    comnd
+       jmp     kermt3
+       call    cfmcmd
+       lxi     h,fcb           ;[pcc012] copy file name and ext
+       lxi     d,lognam        ;[pcc012] to a safe place
+       lxi     b,12            ;[pcc012] 12 bytes
+       call    mover           ;[pcc012] zap ...
+       mvi     a,1             ;[pcc005] set flag for logging
+       sta     logflg          ;[pcc005]
+       jmp     kermit          ;[pcc005]
+
+;
+;       PAUSE [Wait period]. Just wait for a couple of tics...
+pause: mvi     a,cmnum         ; get the number of the wait period
+       call    comnd           ; get it
+       jmp     kermit          ; we canna do it, so get next command
+       lhld    number
+       xchg                    ; move to d
+       lhld    clkbit+1        ; get clock bits 8 to 23
+       mov     a,h             ; strip ms bit so we have space for a possible carry
+       ani     7fh
+       mov     h,a
+       dad     d               ; add the number (ie get the number to wait to
+       shld    number          ; save it somewhere
+;
+;       Now, wait for time to be equal to newer NUMBER with Carry
+ploop: 
+       call    clock           ; increment clock
+       lda     takflg          ; test if keyboard interrupt.. not for takes
+       ana     a
+       jnz     ploop1          ; do nothing for take command files
+       mvi     c,dconio        ; get status from console
+       mvi     e,0ffh          ; just get the character
+       call    bdos
+       ana     a               ; if non zero return, then quit
+       jnz     kermit          ; we got something, so quit
+ploop1:        lhld    number
+       xchg
+       lhld    clkbit+1        ; get bits 8 to 23
+       mov     a,h
+       ani     7fh             ; make it 15 bits for a carry...
+       mov     h,a
+       mov     a,e             ; now, do (DE with carry) - HL
+       sub     l
+       mov     e,a
+       mov     a,d
+       sbb     h
+       ora     e               ; a = OR of result
+       jnz     ploop
+       jmp     kermit          ; otherwise we are done.
+
+; PRINT - Print a file to the console and printer.  
+;      This command is active only from the command level, and not 
+;      from the connect state.  Unfortunately, the print command is 
+;      not going to be a background utility.
+printf:        mvi     a,0ffh          ; set the print flag on
+typent:        sta     prnfl           ; Type file entry.  Common for PRINT and TYPE
+       call    type            ; and do the rest of the print via type
+       xra     a
+       sta     prnfl           ; next clear the print flag
+       jmp     kermit
+
+; TYPE - Type a file to the console.
+;      This command is really the same as the print command, but the output
+;      is not copied to the printer.
+typef: xra     a               ; we want to clear the printer on flag
+       jmp     typent          ; go to the type entry in printfile above
+
+
+;\f
+;       This is the TAKE command.  It take input from a file.
+;       TAKE1 is the entry for automatically TAKE-ing KERMIT.INI (or whatever
+;       the file name at taknam is) from the default drive
+;      [18] code added to accept command tails.  See note [18] above
+;
+take:  mvi     a,cmifi         ;[9] Get filename from user
+       lxi     d,takfcb        ;[9] Take file fcb space
+       call    comnd           ;[9] get the file spec
+       jmp     kermit          ;[9] User failed to specify a good file spec
+       call    take2           ;[MF] Now TAKE the file
+       jmp     kermit          ;[MF] Go back to main Kermit command loop
+;
+take1: lxi     b,12            ;[9] copy default drive and file name to take fcb
+       lxi     d,takfcb
+       lxi     h,taknam
+       call    mover           ;[9] and do it (all other extents etc are zero)
+;[MF][30]No longer need the following line
+;      jmp     take2           ; got the file name, now take it.
+;
+                               ;[9] get the file name, now lets open it 
+;
+take2:
+       lda     takflg          ; check to see we have not tak-take
+       ani     1               ; if set, we are in a take already
+;[MF]We can do the following test/call more efficiently
+;      jz      take21
+;      call    closet          ; so close current take file
+       cnz     closet          ;[MF] So close current take file
+take21:
+       mvi     c,setdma
+       lxi     d,takdma        ;[9] tell bdos where to send data
+       call    BDOS
+       xra     a               ;[9] clear all these extents etc
+       sta     takfcb+14
+       sta     takfcb+32
+       lxi     d,takfcb        ;[9] open the file
+       mvi     c,openf         ;[9] open the file
+       call    BDOS
+       inr     a               ;[9] if FF returned, problems
+;[MF]Complain if failure and not seeking KERMIT.INI
+;      jz      kermit          ;[9] for now, say nowt if no ini file. Else..
+       jz      ntake           ;[9] We'll say file not found
+                               ;[MF] unless the initial TAKE (KERMIT.INI)
+;      jmp     take3           ; a test
+;      mvi     c,readf         ;[9] read first bytes from file
+;      lxi     d,takfcb        ;[9]
+;      call    BDOS
+
+take3: lxi     h,0
+       shld    takptr          ;[9] point to first byte of take file
+       lda     takflg          ; get current flag
+       ori     1               ;[9] and set flag to tell Kermit we're taking
+       sta     takflg
+;[MF][30]Redo next lines so can flag initial TAKE of KERMIT.INI
+;      call    rnsect          ;[9] read a sector
+;      jmp     kermit          ;(Should use a ret, but this will do)
+       jmp     rnsect          ;[9] read a sector and return
+
+ntake: lda     initak          ;[MF]Is this the initial TAKE (KERMIT.INI)?
+       ora     a               ;[MF]...
+       rnz                     ;[MF]Yes, don't complain
+       lxi     d,erms15        ;[9] Say file not found
+       call    prtstr
+;[MF][30]Make next line a "jmp" since we've called TAKE2
+;      call    rstdma          ;[9] reset the DMA addres for other files
+;      jmp     kermit
+       jmp     rstdma          ;[9] reset the DMA addres for other files
+                               ;[MF] and return
+
+
+; Little code to allow some expansion of code without changing
+;  every futher address, only up to the end of this file.
+;   TO BE REMOVED FRO RELEASE!
+
+;      org ($+100h) AND 0FF00H
+
+IF lasm
+       LINK CPSCOM
+ENDIF ;lasm
diff --git a/cpspk1.asm b/cpspk1.asm
new file mode 100644 (file)
index 0000000..6ea4831
--- /dev/null
@@ -0,0 +1,1904 @@
+; CPSPK1.ASM
+;       KERMIT - (Celtic for "FREE")
+;
+;       This is the CP/M-80 implementation of the Columbia University
+;       KERMIT file transfer protocol.
+;
+;       Version 4.0
+;
+;       Copyright June 1981,1982,1983,1984
+;       Columbia University
+;
+; Originally written by Bill Catchings of the Columbia University Center for
+; Computing Activities, 612 W. 115th St., New York, NY 10025.
+;
+; Contributions by Frank da Cruz, Daphne Tzoar, Bernie Eiben,
+; Bruce Tanner, Nick Bush, Greg Small, Kimmo Laaksonen, Jeff Damens, and many
+; others. 
+;
+;       This file contains the (system-independent) routines that implement
+;       the KERMIT protocol, and the commands that use them:
+;       RECEIVE, SEND, FINISH, and LOGOUT.
+;
+; revision history:
+;
+;edit 23, 16-Jan-1991 by MF. The bug of (22) was not fixed (although
+;      the error described needed to be corrected). Really fixed the bug this:
+;      time. changed "lda 'E'" after "ptch9b" to "mvi a,'E'" -- Zilog
+;      mnemonic thinking must've addled my brain!
+;edit 22, 14-Jan-1991 by MF. Fix bug in the code which sends an "E" packet
+;      to the remote Kermit on encountering "disk full" so that
+;      uncontrollified <CR><LF> is not copied to the packet data area (and
+;      hence sent to the remote Kermit). This should fix a bug reported
+;      by Russell Lang of Monash University in Australia wherein a PC
+;      running Kermit in Server mode complained of invalid characters when
+;      receiving the "disk full" error packet from CP/M Kermit.
+;edit 21 of 3-Jan-1991 by MF. Reverse part of edit 20 which flushes comm
+;      input at EOF send: the problem of multiple copies of packets being
+;      sent when a stream of files being sent is partially interrupted with
+;      ^X has been fixed by modifying "inchr" in CPSPK2.ASM.
+;edit 20, 2-Jan-1991 by MF. Tightened up code just after "sdata1" and around
+;      "sdat14". Added code to flush comm input after user has typed ^X
+;      or ^Z to interrupt file sends so that duplicate packets are not
+;      sent after the interrupt character (especially ^X) has been typed.
+;edit 19, 14-Dec-1990 by MF.  Place "<<>>" around "F" and "X" packets coming
+;      as replies to REMOTE commands a la VMS Bliss Kermit.
+;      Also type each character of "X" or "F" packet explicitly in case
+;      dollar-signs are part of the filename (as in VMS Bliss Kermit
+;      when a REMOTE TYPE is given and SET FILE NAMING FULL is in effect).
+;      Expanded code is at label rfil3f.
+;edit 18, 27-Nov-1990 by MF. Fix bug introduced with edit 17 which resulted
+;      in "E" packet being sent twice when receiving file(s) and disk-full
+;      occurred. Sorry about that, folks!
+;edit 17, 27-Nov-1990 by MF. When receiving files, make the decision as to
+;      whether to delete a partially-received file on a "disk full"
+;      condition subject to the setting of the SET INCOMPLETE-FILES
+;      switch in conformity with the behavior of MSDOS Kermit.
+;      An "E" packet is still sent to the remote Kermit. Also try to close
+;      any incomplete file whether deleting it or not (labels rdat16 and
+;      rdat3a). If keeping incomplete files, try to write outstanding
+;      buffers to disk, giving an error if the disk is full.
+;edit 16, 23-Nov-1990 by MF. When receiving, cause the file being written
+;      to disk to **always** be deleted and an "E" packet to be sent when a
+;      "disk full" condition is encountered (per suggestion of
+;      RJL@MONU1.CC.MONASH.EDU.AU).
+;edit 15, 15-Nov-1990 by MF.  Changed code for the Receive Complete state
+;      to always go into RECEIVE if AUTORECEIVE is on.  This will happen
+;      most of the time anyway as most mainframe Kermits issue a prompt
+;      after a single SEND command (wild-carded or not), thus guaranteeing
+;      that the modem status check of Kermit-80 ver. 4.09 would **always**
+;      have characters ready for input (the mainframe Kermit's prompt),
+;      defeating the status check and the Console input check (originally
+;      intended to drop the user out of the loop if he/she typed a key with
+;      no comm input present).  Eliminate "any key" message there also.
+;      the user can drop out by hitting ^C.
+;      Of course, none of the foregoing applies if the Receive Complete
+;      state occurs as the result of a "Get" command where Autoreceive
+;      is meaningless and we just drop back to Kermit command-level.
+;edit 14, 1-Oct-1990 by MF.  Added code to send an "I" packet before an
+;      "R" packet in GET command.
+;      Modified routine "sinit" to ignore "E" packets when sending an
+;      "i" packet (per KPROTO.DOC).
+;edit 13, 14-Sep-1990 by MF.  Added code to implement SET FILE COLLISION
+;      and SET INCOMPLETE commands.
+;edit 12, 9-Sep-1990 by MF.  Added code to prevent packet counts
+;      from being displayed during Remote commands.  Fixed
+;      AUTORECEIVE     code, file colision Rename algorithm and eliminated
+;      multiple display of initial messages during GET/RECEIVE.
+; edit 11, 28 July, 1987 by OBSchou.  Commented out capas etc support
+;      (Long packets etc) as this is not worth the effort coding... but
+;      I have left what WAS done for any enthusiast.  Also set in a few
+;      to NOT write to screen if SET TERMINAL QUIET set.  Hopefully speeds
+;      up transfers on systems taking forever to update screens.
+;
+; edit 10, 8 April, 1987 by OBSchou.  Tarted up all sorts of bits n bobs
+;      to cope with all the new aditions for Kermit-80 V 4.09
+;      Look for the [10] for most cahnges.  spar and rpar largely replaced
+;
+; edit 9, March 30th by OBSchou.  Set bits for automatically receiving
+;      another file if a remote sender sends files in seperate sessions.
+;      The code simply checks the serial line, and if there is some
+;      activity, assume its another SEND INIT packet.  As there is no
+;      simple way to go to receive with the control-a, just ignore the
+;      packet.  Causes one retry on the sender, but so what.  Really 
+;      should make it a server gizzmo.
+;
+; edit 8: January 28, 1987 by OBSchou
+;      Two major issues: firstly split CPSPKT.ASM into CPSPK(1 2).ASM
+;      making it far easier to handle this file.
+;      Second, some mode to the GET routines to correctly print the file
+;      name instead of the fireworks.  Trouble was with GET <file> <file>
+;      and RECEIVE <file>.  However, new bugs discovered...
+;
+; edit 7: August 11, 1986    Godfrey N. Nix [gnn] Nottingham University
+;       To ignore echoed packets (ie send 'S' receive 'S' before 'A');
+;       To allow character other than SOH for packet header (see also
+;                       updates to CP4MIT and CP4UTL for other code needed);
+;       To permit SEND and RECEIVE to specify a host filename which
+;                       is of a different structure to that of CP/M.
+;
+; edit 6a: [OBSchou] 7 March, 1985.
+;       Edited file with additions from MJ Carter.  He writes:
+;       25th September 1985, M J Carter [majoc], Nottingham University
+;       Code in gofil() amended, for exactly the same reasons to the 
+;       alteration to cmifil() in cpscmd.asm.  If there is any deep
+;       reason why gofil() has to be used instead of a call to comnd(cmofil), 
+;       I can't see it.  The bug (on a British Micro Mimi 803) caused 
+;       gofil() to overwrite existing files in GET and RECEIVE, even 
+;       with file warning SET ON.
+;
+;edir 6: November 22, 1984
+;       Change SEND's 'Unable to find file' error exit from calling
+;       error3 to calling prtstr instead.  I don't know about you, but
+;       I greatly dislike having messages dumped into pre-existing
+;       junk on the screen where I have to spend lots of time hunting
+;       for them.  [Hal Hostetler]
+;
+; edit 5: September 9, 1984
+;       Call flsmdm in init to flush old input when starting transfers.
+;       Select console before returning from inpkt.
+;       Replace inline code with calls to makfil/clofil to set up for
+;       multisector buffering on output.
+;       Remove superfluous call to clrlin in error3.
+;
+; edit 4: August 21, 1984 (CJC)
+;       Fix comment in inpkt: packet is terminated by NUL on return, not CR.
+;       If debugging, display the outgoing packet before putting the EOL
+;       character on, so the dumped packet doesn't get overwritten.
+;
+; edit 3: July 27, 1984
+;       add link directive for LASM.  CP4PKT is linked by CP4MIT, and links
+;       to CP4TT.  Add Toad Hall TACtrap to permit operations through a TAC.
+;
+; edit 2: June 8, 1984
+;       formatting and documentation; remove some unused labels; move setpar
+;       to cp4mit.m80; add module version string; make all arithmetic on
+;       'pktnum' modulo 64; apply defaults correctly for missing parameters
+;       in send-init packet (and corresponding ack).
+;
+; edit 1: May, 1984
+;       extracted from CPMBASE.M80 version 3.9; modifications are described
+;       in the accompanying .UPD file.
+;
+pk1ver:        db      'CPSPK1.ASM (23) 16-Jan-1991$'  ; name, edit number, date
+
+;       GET command   [gnn]
+;       here from: kermit
+
+read:  mvi     a,0ffh          ;[obs 8] we are doing a get
+       sta     getrxflg        ;[obs 8] so set flag
+       lxi     d,remdat        ;Where to put the text (if any.)
+       mvi     a,cmtxt
+       call    comnd           ;Get either some text or a confirm.
+       jmp     kermt3          ; Didn't get anything.
+       ora     a               ;Get any chars?
+       jz      kermt3          ;[gnn] GET must have a filename
+       sta     rdl             ;Store the number of chars.
+       xchg                    ;Get pointer into HL.
+       mvi     m,'$'           ;Put in a dollar sign for printing.
+       call    init            ;Clear the line and initialize the buffers.
+       lda     quietd          ; quiet display?
+       ana     a
+       jz      read01          ;[MF]No, go ahead and position cursor
+       call    prcrlf          ;[MF]Yes, keep from overwriting the prompt
+       jmp     read00          ;[MF]and write filename
+read01:        call    scrfln          ;Position cursor [MF]
+read00:        lxi     d,remdat        ;Print the file name, in either case
+       call    prtstr
+       jmp     read0a          ;[gnn] go get local name if any
+
+
+; enter here for RECEIVE command  [gnn]
+read0: mvi     a,0             ;[gnn]
+       sta     rdl             ;[gnn][MF] flag entry as receive, not get
+       sta     getrxflg        ;[obs 8] doing a receive, so reset flag
+       call    init            ;clear line, initialise buffers
+read0a:        lxi     d,remnam        ;[gnn] save local name here
+       mvi     a,cmtxt         ;[gnn]
+       call    comnd           ;[gnn] read second filename if present
+       jmp     kermt3          ;[gnn]  error exit
+       sta     remlen          ;[gnn] save length of name, may be zero
+       sta     getrxflg        ;[obs 8] May also be receive <fnam> so 
+                               ;[obs 8]pretend get for printing filename
+       lda     rdl             ;[gnn] look at first name
+       ora     a               ;[gnn] receive or get?
+       jz      read1           ;[gnn] receive
+
+       mvi     a,'I'           ;[MF]Set state to send "I" packet
+       sta     state           ;[MF]...
+
+;       jmp     read12         ;[obs] [gnn] does not want this
+
+read1: ;call   init            ;Clear the line and initialize the buffers.
+read12:        xra     a
+       sta     czseen          ;Clear the ^X/^Z flag initially.
+       lxi     h,0
+       shld    numpkt          ;Set the number of packets to zero.
+       shld    numrtr          ;Set the number of retries to zero.
+       sta     pktnum          ;Set the packet number to zero.
+       sta     numtry          ;Set the number of tries to zero.
+       lda     quietd          ; quiet display?
+       ana     a
+       jnz     read13          ; yes, so dont write...
+       call    scrnrt          ;Position cursor
+       lxi     h,0
+       call    nout            ;Write the number of retries.
+read13:        lda     rdl             ;[MF]Get or receive?
+       ora     a               ;[MF]...
+       jnz     read2           ;[MF]Get, don't reset state
+       mvi     a,'R'
+       sta     state           ;Set the state to receive initiate.
+       ;...
+;\f
+;RECEIVE state table switcher.
+
+read2: lda     quietd          ; noisy display?
+       ana     a
+       jnz     read21          ; no, a quiet one
+       lda     remtxt          ;[MF] In Remote command?
+       ora     a
+       jnz     read21          ;[MF] Yes, don't write to screen
+       call    scrnp           ;Position cursor
+       lhld    numpkt
+       call    nout            ;Write the current packet number.
+read21:        lda     state           ;Get the state.
+       cpi     'D'             ;Are we in the DATA receive state?
+       jnz     read22
+       call    rdata
+       jmp     read2
+
+read22:        cpi     'X'             ; F packet but not an F packet?
+       jnz     read3           ; nope, so try next one
+       call    rfile           ; 'get' the filename (but dont open it)
+       jmp     read2
+
+read3: cpi     'F'             ;Are we in the FILE receive state?
+       jnz     read4
+       call    rfile           ;Call receive file.
+       jmp     read2
+
+read4: cpi     'R'             ;Are we in the Receive-Initiate state?
+       jnz     read5
+       call    rinit
+       lda     state           ;[jd] get new state
+       cpi     'F'             ;[jd] went into receive state?
+       jnz     read2           ;[jd] no
+       lxi     d,inms24        ;[jd] yes, get receiving... message
+       call    finmes          ;[jd] go print it
+       jmp     read2
+
+read5: cpi     'C'             ;Are we in the Receive-Complete state?
+       jnz     read6
+       lxi     d,infms3        ;Put in "Complete" message.
+       lda     czseen          ;Or was it interrupted?
+       ora     a               ; .  .  .
+       jz      read5a          ;No.
+       xra     a               ;Yes, clear flag.
+       sta     czseen          ; ...
+       lxi     d,inms13        ;Issue "interrupted" message.
+read5a:        lda     remtxt          ;[MF] Doing a Remote command?
+       ora     a
+       cz      finmes          ;Print completion message in right place if not
+;
+       lda     rdl             ;[MF]Receive or Get?
+       ora     a               ;[MF]...
+       jnz     kermit          ;[MF]Get, Autoreceive means nothing.
+       lda     autorc          ; see if we want autoreceives
+       ana     a
+       jz      kermit          ;[MF]No autoreceives, so drop out
+       lxi     d,autmes        ;[MF]Yes, tell the user what we're doing
+       call    prtstr          ;[MF]...
+       jmp     read1           ;[MF]Try another Receive (we get one
+                               ;[MF]retry from the sender as the ^A is lost)
+
+read6: cpi     'Y'             ;[MF]Simple ack (from remote command)?
+       jz      kermit          ;[MF]Yes
+
+       cpi     'I'             ;[MF]Exchanging parameters via info packet?
+       jnz     read7           ;[MF]No
+       call    sinit           ;[MF]Yes, send the packet
+       lda     state           ;[MF]Now see what happened
+       cpi     'X'             ;[MF]Did we exchange parameters successfully?
+       jz      read6a          ;[MF]Yes, go send the filespec
+       cpi     'A'             ;[MF]No, are we in abort state?
+       jnz     read2           ;[MF]No, try again
+       jmp     kermit          ;[MF]Yes, it's a real disaster, we must stop
+read6a:        lda     rdl             ;[MF]Get length of filespec
+       sta     argblk+1        ;[MF]as length of packet
+       mov     c,a             ;[MF]We must copy the filespec
+       mvi     b,0             ;[MF]...
+       lxi     h,remdat        ;[MF]from the temporary buffer
+       lxi     d,data          ;[MF]to the packet data area
+       call    mover           ;[MF]Do it.
+; for GET we must send the name of the file we want [gnn]
+
+       mvi     a,'1'           ;Start with single character checksum
+       sta     curchk          ;Save the type
+       xra     a               ;Start a packet zero.
+       sta     argblk
+       mvi     a,'R'           ;Receive init packet.
+       call    spack           ;Send the packet.
+       jmp     kermt3          ; Die!
+       xra     a
+       sta     czseen          ;Clear the ^X/^Z flag initially.
+       lxi     h,0
+       shld    numpkt          ;Set the number of packets to zero.
+       sta     pktnum          ;Set the packet number to zero.
+       sta     numtry          ;Set the number of tries to zero.
+       mvi     a,'R'           ;[MF]Set state to Receive-Initiate
+       sta     state           ;[MF]...
+       jmp     read21          ;[MF]and go around again
+                               ;[MF]without retyping packet-number
+
+read7: cpi     'A'             ;Are we in the Receive-"Abort" state?
+       jnz     read8
+read8: lxi     d,infms4        ;Anything else is equivalent to "abort".
+       call    finmes
+       jmp     kermit
+;\f
+;       Receive routines
+
+;       Receive init
+;       called by: read
+
+rinit: lda     numtry          ;Get the number of tries.
+       cpi     imxtry          ;Have we reached the maximum number of tries?
+       jm      rinit2
+       lxi     d,ermes4
+       call    error3          ;Move cursor and print an error message.
+       jmp     abort           ;Change the state to abort.
+
+rinit2:        inr     a               ;Increment it.
+       sta     numtry          ;Save the updated number of tries.
+       mvi     a,'1'           ;Reset block check type to single character
+       sta     curchk          ;Store as current type for initialization
+       call    rpack           ;Get a packet.
+       jmp     nak             ; Trashed packet: nak, retry.
+       cpi     'S'             ;Is it a send initiate packet?
+       jnz     rinit3          ;If not see if its an error.
+rini2a:        lda     numtry          ;Get the number of tries.
+       sta     oldtry          ;Save it.
+       xra     a
+       sta     numtry          ;Reset the number of tries.
+       lda     argblk          ;Returned packet number.  (Synchronize them.)
+       call    countp
+       lda     argblk+1        ;Get the number of arguments received.
+       lxi     h,data          ;Get a pointer to the data.
+       call    spar            ;Get the data into the proper variables.
+       lxi     h,data          ;Get a pointer to our data block.
+       call    rpar            ;Set up the receive parameters.
+       sta     argblk+1        ;Store the returned number of arguments.
+       mvi     a,'Y'           ;Acknowledge packet.
+       call    spack           ;Send the packet.
+       jmp     abort           ; Failed, abort.
+       lda     inichk          ;Now switch to agreed upon check-type
+       sta     curchk          ;For all future packets
+       mvi     a,'F'           ;Set the state to file send.
+       sta     state
+       ret
+
+rinit3:        cpi     'E'             ;Is it an error packet.
+       jnz     nak0            ;If not NAK whatever it is.
+       call    error
+       jmp     abort
+;\f
+;       Receive file
+;       called by: read
+
+rfile: lda     numtry          ;Get the number of tries.
+       cpi     maxtry          ;Have we reached the maximum number of tries?
+       jm      rfile1
+       lxi     d,ermes5
+       call    error3          ;Move cursor and print an error message.
+       jmp     abort           ;Change the state to abort.
+
+rfile1:        inr     a               ;Increment it.
+       sta     numtry          ;Save the updated number of tries.
+       call    rpack           ;Get a packet.
+       jmp     nak             ; Trashed packet: nak, retry.
+       cpi     'S'             ;Is it a send initiate packet?
+       jnz     rfile2          ; No, try next type.
+       lda     oldtry          ;Get the number of tries.
+       cpi     imxtry          ;Have we reached the maximum number of tries?
+       jm      rfil12          ;If not proceed.
+       lxi     d,ermes4
+       call    error3          ;Move cursor and print an error message.
+       jmp     abort           ;Change the state to abort.
+
+rfil12:        inr     a               ;Increment it.
+       sta     oldtry          ;Save the updated number of tries.
+       lda     pktnum          ;Get the present packet number.
+       dcr     a               ;Decrement
+       ani     3FH             ; modulo 64
+       mov     b,a
+       lda     argblk          ;Get the packet's number
+       cmp     b               ;Is the packet's number one less than now?
+       jnz     nak0            ;No, NAK and try again.
+       call    updrtr          ;Update the retry count.
+       xra     a
+       sta     numtry          ;Reset the number of tries.
+       lxi     h,data          ;Get a pointer to our data block.
+       call    rpar            ;Set up the parameter information.
+       sta     argblk+1        ;Save the number of arguments.
+       mvi     a,'Y'           ;Acknowledge packet.
+       call    spack           ;Send the packet.
+       jmp     abort           ; Failed, abort.
+       ret
+
+rfile2:        cpi     'Z'             ;Is it an EOF packet?
+       jnz     rfile3          ; No, try next type.
+       lda     oldtry          ;Get the number of tries.
+       cpi     maxtry          ;Have we reached the maximum number of tries?
+       jm      rfil21          ;If not proceed.
+       lxi     d,ermes6
+       call    error3          ;Move cursor and print an error message.
+       jmp     abort           ;Change the state to abort.
+
+rfil21:        call    tryagn
+       ret
+
+rfile3:        cpi     'F'             ;Start of file?
+       jnz     rfil3b
+       mov     c,a             ;[MF]Save packet type
+       lda     remtxt          ;[MF]Doing a remote server command?
+       ora     a               ;[MF]...
+       mov     a,c             ;[MF]Restore packet type
+       jnz     rfil3d          ;[MF]If yes, same as x packet
+       call    compp
+       jnz     nak0            ;No, NAK it and try again.
+       call    countp
+       mov     c,a             ;[MF]
+       lda     remtxt          ;[MF]Doing a remote command?
+       ora     a               ;[MF]...
+       mov     a,c             ;[MF]
+       jnz     rfil3a          ;[MF]Yes, don't open a file
+       call    gofil           ;Get a file to write to, and init output buffer.
+       jmp     abort
+rfil3a:        lda     numtry          ;Get the number of tries.
+       sta     oldtry          ;Save it.
+       call    ackp
+       mvi     a,'D'           ;Set the state to data receive.
+       sta     state
+       lda     czseen          ;Check if we punted a file
+       cpi     'Z'             ;and didn't want any more
+       rz                      ;If that was the request, keep telling other end
+       xra     a               ;Otherwise, clear flag (^X is only for one file)
+       sta     czseen          ;And store the flag back
+       ret
+
+rfil3b:        cpi     'X'             ;Start of 'file?' , but not a file?
+       jnz     rfile4
+rfil3d:        call    compp
+       jnz     nak0            ;No, NAK it and try again.
+       call    countp
+
+       call    selcon          ;[MF]Select Console
+       lda     argblk+1        ; get length
+       ora     a               ;[MF]Anything to write?
+       jz      rfil3e          ;[MF]No
+       push    psw             ;[MF]Yes, save character count
+       mvi     e,'<'           ;[MF]Write "<<" as in VMSKermit
+       push    d               ;[MF]...
+       call    outcon          ;[MF]...
+       pop     d               ;[MF]...
+       call    outcon          ;[MF]...
+       pop     psw             ;[MF]Restore character count
+       lxi     h,data          ; lets write the filename (?) to display
+rfil3f:        push    psw             ;[MF]Save loop counter
+       mov     e,m             ;[MF]Get character to write
+       inx     h               ;[MF]and increment character pointer
+       push    h               ;[MF]Save the pointer
+       call    outcon          ;[MF]Write character to display
+       pop     h               ;[MF]Restore pointer
+       pop     psw             ;[MF]and loop counter
+       dcr     a               ;[MF]Decrement the counter
+       jnz     rfil3f          ;[MF]Display entire filename
+       mvi     e,'>'           ;[MF]Put in ">>" as in VMSKermit
+       push    d               ;[MF]...
+       call    outcon          ;[MF]...
+       pop     d               ;[MF]...
+       call    outcon          ;[MF]...
+       call    prcrlf          ;[MF]New line
+rfil3e:        lda     numtry          ;Get the number of tries.
+       sta     oldtry          ;Save it.
+       call    ackp
+       mvi     a,'D'           ; expecting a D packet
+       sta     state
+       lda     czseen          ;Check if we punted a file
+       cpi     'Z'             ;and didn't want any more
+       rz                      ;If that was the request, keep telling other end
+       xra     a               ;Otherwise, clear flag (^X is only for one file)
+       sta     czseen          ;And store the flag back
+       ret
+
+rfile4:        cpi     'B'             ;End of transmission.
+       jnz     rfile5
+       call    compp
+       jnz     nak0            ;No, NAK it and try again.
+       xra     a               ;No data.  (Packet number already in argblk).
+       sta     argblk+1
+       mvi     a,'Y'           ;Acknowledge packet.
+       call    spack           ;Send the packet.
+       jmp     abort
+       mvi     a,'C'           ;Set the state to complete.
+       sta     state
+       ret
+
+rfile5:        cpi     'E'             ;Is it an error packet.
+       jnz     abort
+       call    error
+       jmp     abort
+;\f
+;       Receive data
+;       called by: read
+
+rdata: lda     numtry          ;Get the number of tries.
+       cpi     maxtry          ;Have we reached the maximum number of tries?
+       jm      rdata1
+       lxi     d,erms10
+       call    error3          ;Display error message.
+rdat16:        lda     remtxt          ;[MF]Is a Remote command in progress?
+       ora     a               ;[MF]...
+       jnz     abort           ;[MF]Yes, don't worry about file disposition
+       lda     incflg          ;[MF]Are we keeping incomplete files?
+       ora     a               ;[MF]...
+       jnz     rdat17          ;[MF]Yes
+       lxi     d,fcb           ;[MF]No, close the file, ignoring errors
+       push    d               ;[MF]while protecting the pointer
+       mvi     c,closf         ;[MF]...
+       call    bdos            ;[MF]...
+       pop     d               ;[MF]Now delete the file, ignoring errors
+       mvi     c,delf          ;[MF]...
+       call    bdos            ;[MF]...
+       jmp     abort           ;Change the state to abort.
+rdat17:        call    clofil          ;[MF]Try to close the file, writing
+                               ;[MF]outstanding buffers to disk
+       jmp     rdat37          ;[MF]We can't, the disk is full
+       jmp     abort           ;[MF]Change the state to "abort"
+
+rdata1:        inr     a               ;Increment it.
+       sta     numtry          ;Save the updated number of tries.
+       call    rpack           ;Get a packet.
+       jmp     nak             ; Trashed packet: nak, retry.
+       cpi     'D'             ;Is it a data packet?
+       jnz     rdata2          ; No, try next type.
+       call    compp           ;check for correct packet number (zero flag = ok)
+       jz      rdat14          ;its correct
+       lda     oldtry          ;Get the number of tries.
+       cpi     maxtry          ;Have we reached the maximum number of tries?
+       jm      rdat12          ;If not proceed.
+       lxi     d,erms10
+       call    error3          ;Display err msg.
+       jmp     rdat16          ;[MF]Change the state to abort.
+
+rdat12:        call    tryagn
+       ret
+
+rdat14:        call    countp
+       lda     numtry          ;Get the number of tries.
+       sta     oldtry          ;Save it.
+       lda     argblk+1        ;Get the length of the data.
+       call    ptchr
+       jmp     rdat3b          ;[MF] Unable to write out chars;abort.
+       xra     a
+       sta     numtry          ;Reset the number of tries.
+       sta     argblk+1        ;No data.  (Packet number still in argblk.)
+       mov     c,a             ;Assume no data
+       lda     czseen          ;Check if control-X typed
+       ora     a               ; .  .  .
+       jz      rdat15          ;Zero if not typed
+       mov     c,a             ;Get the type of character typed
+       mvi     a,1             ;One data character
+       sta     argblk+1        ;Save the count
+       mov     a,c             ;Get the possible data character
+       sta     data            ;Store in data area
+rdat15:        mvi     a,'Y'           ;Acknowledge packet.
+       call    spack           ;Send the packet.
+       jmp     rdat16          ;[MF]
+       ret
+
+rdata2:        cpi     'F'             ;Start of file?
+       jnz     rdata3          ; No, try next type.
+       lda     oldtry          ;Get the number of tries.
+       cpi     maxtry          ;Have we reached the maximum number of tries?
+       jm      rdat21          ;If not proceed.
+       lxi     d,ermes5
+       call    error3          ;Display err msg.
+       jmp     rdat16          ;[MF]Change the state to abort.
+
+rdat21:        call    tryagn
+       ret
+
+rdata3:        cpi     'Z'             ;Is it a EOF packet?
+       jnz     rdata4          ;Try and see if its an error.
+       call    compp
+       jnz     nak0            ;No, NAK it and try again.
+       call    countp
+       lda     argblk+1        ;Get the data length
+       cpi     1               ;Have one item?
+       jnz     rdat33          ;If not, ignore data
+       lda     data            ;Yes, get the character
+       cpi     'D'             ;Is it a 'D' for discard?
+       jz      rdat36          ;If so, punt file
+rdat33:        lda     remtxt          ;[MF]Writing text to disk?
+       ora     a               ;[MF]...
+         jnz   rdat38          ;[MF]No, don't close file
+       call    clofil          ;Finish off the file.
+       jmp     rdat37          ; Give up if the disk is full.
+rdat38:        xra     a               ;Since we kept the file,
+       sta     czseen          ;don't say it was discarded.
+       lda     numtry          ;Get the number of tries. [MF]
+       sta     oldtry          ;Save it. [MF]
+       call    ackp            ;[MF]
+       jmp     rdat39          ;[MF]and get ready to get more files
+rdat36:        lda     numtry          ;Get the number of tries.
+       sta     oldtry          ;Save it.
+       call    ackp
+       lda     remtxt          ;[MF]Is a Remote command in progress?
+       ora     a               ;[MF]...
+       jnz     rdat39          ;[MF]Yes, don't worry about file disposition
+       lda     dscflg          ;[MF]Is the file being punted because
+       ora     a               ;[MF]of a collision?
+       jnz     rdat39          ;[MF]Yes, don't delete the existing file
+       lda     incflg          ;[MF]No, are we keeping incomplete files?
+       ora     a               ;[MF]...
+       jnz     rdat3a          ;[MF]Yes
+       lxi     d,fcb           ;[MF]No, close the file,
+       mvi     c,closf         ;[MF]ignoring errors
+       push    d               ;[MF]...
+       call    bdos            ;[MF]...
+       pop     d               ;[MF]Now delete the file,
+       mvi     c,delf          ;[MF]ignoring errors
+       call    bdos            ;[MF]...
+       jmp     rdat39          ;[MF]and continue
+rdat3a:        call    clofil          ;[MF]Try to close the file, writing
+                               ;[MF]outstanding buffers to disk
+       jmp     rdat37          ;[MF]Can't, disk is full
+rdat39:        mvi     a,'F'
+       sta     state
+       ret
+
+rdat37:        call    ptchr9          ; Send "?Disk full" on the error line [MF]
+                               ; and to the remote Kermit [MF]
+rdat3b:        lda     remtxt          ;[MF]Doing a Remote command?
+       ora     a               ;[MF]...
+       jnz     abort           ;[MF]Yes, just abort
+       lxi     d,fcb           ;[MF]Close the file, ignoring errors
+       push    d               ;[MF]Protect fcb pointer
+       mvi     c,closf         ;[MF]...
+       call    bdos            ;[MF]...
+       pop     d               ;[MF]Restore pointer
+       lda     incflg          ;[MF]Are we keeping incomplete files?
+       ora     a               ;[MF]...
+       jnz     abort           ;[MF]Yes, just abort transfer
+       mvi     c,delf          ;[MF]No, delete the file, ignoring errors
+       call    bdos            ;[MF]...
+       jmp     abort           ;[MF] abort transfer
+
+rdata4:        cpi     'E'             ;Is it an error packet.
+       jnz     rdat16          ;[MF]
+       call    error
+       jmp     rdat16          ;[MF]
+;\f
+;       SEND command
+;       here from: kermit
+
+send:  mvi     a,cmifi         ;Parse an input file spec.
+       lxi     d,fcb           ;Give the address for the FCB.
+       call    comnd
+       jmp     kermit          ; Give up on bad parse.
+;       section to get remote filename [gnn]
+       lxi     d,remnam        ;[gnn] where to put filename
+       mvi     a,cmtxt         ;[gnn] 
+       call    comnd           ;[gnn] get the text to end of the line
+       jmp     kermt3          ;[gnn] failure in reading buffer
+       sta     remlen          ;[gnn] save length (may be zero)
+;
+       xra     a
+       sta     mfflg1          ; clear flags...
+       sta     mfflg2
+       sta     mfflg3          ;[gnn]
+       sta     fcbcnt          ;[gnn] clear fcbcount
+       lxi     h,fcb0          ;[gnn] and fcb pointer
+       shld    xfcbptr
+;
+       call    mfname          ;handle (multi) files
+       jnc     send14          ;got a valid file-name
+       lxi     d,erms15
+       call    prtstr          ;Display error msg. ([hh] where it's visible)
+       jmp     kermit
+
+send14:        call    init            ;Clear the line and initialize the buffers.
+       xra     a
+       sta     pktnum          ;Set the packet number to zero.
+       sta     numtry          ;Set the number of tries to zero.
+       sta     wrn8            ;[jd] we haven't sent the 8-bit-lost warning
+       lxi     h,0
+       shld    numpkt          ;Set the number of packets to zero.
+       shld    numrtr          ;Set the number of retries to zero.
+       lda     quietd          ; a quiet display?
+       ana     a
+       jnz     send15          ; yup, dont write
+       call    scrnrt          ;Position cursor
+       lxi     h,0
+       call    nout            ;Write the number of retries.
+send15:        mvi     a,'1'           ;Reset to use single character checksum
+       sta     curchk          ;For startup
+       mvi     a,'S'
+       sta     state           ;Set the state to receive initiate.
+       ;...
+;\f
+;SEND state table switcher
+
+send2: lda     quietd          ; a quiet display?
+       ana     a
+       jnz     send21          ; yes, so dont write
+       call    scrnp           ;Position cursor
+       lhld    numpkt
+       call    nout            ;Write the packet number.
+send21:        lda     state           ;Get the state.
+       cpi     'D'             ;Are we in the data send state?
+       jnz     send3
+       call    sdata
+       jmp     send2
+
+send3: cpi     'F'             ;Are we in the file send state?
+       jnz     send4
+       call    sfile           ;Call send file.
+       jmp     send2
+
+send4: cpi     'Z'             ;Are we in the EOF state?
+       jnz     send5
+       call    seof
+       jmp     send2
+
+send5: cpi     'S'             ;Are we in the send initiate state?
+       jnz     send6
+       call    sinit
+       lda     state           ;[jd] get state back
+       cpi     'F'             ;[jd] into file send state yet?
+       jnz     send2           ;[jd] no
+       lxi     d,inms23        ;[jd] yes, print sending...
+       call    finmes          ;[jd] 
+       jmp     send2
+
+send6: cpi     'B'             ;Are we in the eot state?
+       jnz     send7
+       call    seot
+       jmp     send2
+
+send7: cpi     'C'             ;Are we in the send complete state?
+       jnz     send8           ;No...
+       lxi     d,infms3        ;Yes, write "Complete" message.
+       lda     czseen          ;Or was it interrupted?
+       ora     a               ; .  .  .
+       jz      send7a          ;No.
+       lxi     d,inms13        ;Yes, then say "Interrupted" instead.
+send7a:        call    finmes
+       jmp     kermit
+
+send8: cpi     'A'             ;Are we in the send "abort" state?
+       jnz     send9
+       lxi     d,infms4        ;Print  message.
+       call    finmes
+       jmp     kermit
+
+send9: lxi     d,infms4        ;Anything else is equivalent to "abort".
+       call    finmes
+       jmp     kermit
+;\f
+;       Send routines
+
+;       Send initiate
+;       called by: send
+
+sinit: lda     numtry          ;Get the number of tries.
+       cpi     imxtry          ;Have we reached the maximum number of tries?
+       jm      sinit2
+       lxi     d,erms14
+       call    error3          ;Display ermsg
+       jmp     abort           ;Change the state to abort.
+
+sinit2:        inr     a               ;Increment it.
+       sta     numtry          ;Save the updated number of tries.
+       mvi     a,'1'           ;Reset to use single character checksum
+       sta     curchk          ;For startup
+       lda     chktyp          ;Get our desired block check type
+       sta     inichk          ;Store so we tell other end
+       lxi     h,data          ;Get a pointer to our data block.
+       call    rpar            ;Set up the parameter information.
+       sta     argblk+1        ;Save the number of arguments.
+       lda     numpkt          ;Get the packet number.
+       sta     argblk
+       lda     state           ; load state (I or S)
+
+       call    spack           ;Send the packet.
+       jmp     abort           ; Failed, abort.
+       call    rpack           ;Get a packet.
+       jmp     r               ; Trashed packet don't change state, retry.
+       cpi     'Y'             ;ACK?
+       jnz     sinit3          ;If not try next.
+       call    compp           ;compare packets. If ok, zero flag set
+       rnz                     ;If not try again.
+       call    countp          ;increment packet number modulo 64
+       lda     argblk+1        ;Get the number of pieces of data.
+       lxi     h,data          ;Pointer to the data.
+       call    spar            ;Read in the data. (decode what they want)
+       lda     numtry          ;Get the number of tries.
+       sta     oldtry          ;Save it.
+       xra     a
+       sta     numtry          ;Reset the number of tries.
+       lda     state           ; se if S or I state
+       cpi     'I'             ; I state, so set X as next state
+       jnz     sinita
+sinitb:        mvi     a,'X'
+       sta     state
+       ret
+
+sinita:        lda     inichk          ;Get the agreed upon block check type
+       sta     curchk          ;Store as type to use for packets now
+       mvi     a,'F'           ;Set the state to file send. (Assumed)
+       sta     state
+       call    getfil          ;Open the file.
+       ret                     ; assume success; mfname thinks the file exists.
+
+sinit3:        cpi     'N'             ;NAK?
+       jnz     sinit4          ;If not see if its an error.
+       call    updrtr          ;Update the number of retries.
+       lda     pktnum          ;Get the present packet number.
+       inr     a               ;Increment
+       ani     3FH             ; modulo 64
+       mov     b,a
+       lda     argblk          ;Get the packet's number.
+       cmp     b               ;Is the packet's number one more than now?
+       rnz                     ;If not assume its for this packet, go again.
+       xra     a
+       sta     numtry          ;Reset number of tries.
+       mvi     a,'F'           ;Set the state to file send.
+       sta     state
+       ret
+
+sinit4:        cpi     'E'             ;Is it an error packet.
+       jnz     abort
+       lda     state           ;[MF]Get state
+       cpi     'I'             ;[MF]If an "I" packet was sent,
+       jz      sinitb          ;[MF]Ignore the error, pretend success
+       call    error           ;[MF]else display the error info
+       jmp     abort           ;[MF]and abort
+;\f
+;       Send file header
+;       called by: send
+;[5a] Question [majoc]: Why could not the filename
+;     parsing have been done by comnd, like all the rest?
+
+sfile: lda     numtry          ;Get the number of tries.
+       cpi     maxtry          ;Have we reached the maximum number of tries?
+       jm      sfile1
+       lxi     d,erms14
+       call    error3
+       jmp     abort           ;Change the state to abort.
+
+sfile1:        inr     a               ;Increment it.
+       sta     numtry          ;Save the updated number of tries.
+       xra     a               ;Clear A
+       sta     czseen          ;No control-Z or X seen
+       lxi     h,data          ;Get a pointer to our data block.
+       shld    datptr          ;Save it.
+; use remote name if given, else use local name [gnn]
+       lda     remlen          ;[gnn] anything given?
+       ora     a               ;[gnn] 
+       jnz     sfile4          ;[gnn] use remote name
+
+       lxi     h,fcb+1         ;Pointer to the file name in the FCB.
+       shld    fcbptr          ;Save position in FCB.
+       mvi     b,0             ;No chars yet.
+       mvi     c,0
+sfil11:        mov     a,b
+       cpi     8H              ;Is this the ninth char?
+       jnz     sfil12          ;If not proceed.
+       mvi     a,'.'           ;Get a dot.
+       lhld    datptr
+       mov     m,a             ;Put the char in the data packet.
+       inx     h
+       shld    datptr          ;Save position in data packet.
+       inr     c
+sfil12:        inr     b               ;Increment the count.
+       mov     a,b
+       cpi     0CH             ;Twelve? 
+       jp      sfil13
+       lhld    fcbptr
+       mov     a,m
+       ani     7fH             ;Turn off CP/M 2 or 3's high bits.
+       inx     h
+       shld    fcbptr          ;Save position in FCB.
+       cpi     '!'             ;Is it a good character?
+       jm      sfil11          ;If not get the next.
+       lhld    datptr
+       mov     m,a             ;Put the char in the data packet.
+       inx     h
+       shld    datptr          ;Save position in data packet.
+       inr     c
+       jmp     sfil11          ;Get another.
+
+sfil13:        mov     a,c             ;Number of char in file name.
+       sta     argblk+1
+       lhld    datptr
+       mvi     a,'$'
+       mov     m,a             ;Put in a dollar sign for printing.
+       lda     quietd          ; a quiet display
+       ana     a
+       jnz     sfi13a          ; yes, dont write
+       call    scrfln          ;Position cursor
+sfi13a:        lxi     d,data          ;Print the file name though, in either case
+       call    prtstr
+       lda     pktnum          ;Get the packet number.
+       sta     argblk
+       mvi     a,'F'           ;File header packet.
+       call    spack           ;Send the packet.
+       jmp     abort           ; Failed, abort.
+       call    rpack           ;Get a packet.
+       jmp     r               ; Trashed packet don't change state, retry.
+       cpi     'Y'             ;ACK?
+       jnz     sfile2          ;If not try next.
+       call    compp
+       rnz                     ;If not hold out for the right one.
+sfil14:        call    countp
+       lda     numtry          ;Get the number of tries.
+       sta     oldtry          ;Save it.
+       xra     a
+       sta     numtry          ;Reset the number of tries.
+       sta     bytes           ;[10] clear the "bytes transferred" counter
+       sta     bytes+1         ;[10]
+       sta     bytes+2         ;[10]
+       sta     bytes+3         ;[10]
+       call    gtchr           ;Fill the first data packet
+       jmp     sfil16          ;Error go see if its EOF.
+;                                      ;Got the chars, proceed.
+       sta     size            ;Save the size of the data gotten.
+       mvi     a,'D'           ;Set the state to data send.
+       sta     state
+       ret
+
+sfil16:        cpi     0FFH            ;Is it EOF?
+       jnz     abort           ;If not give up.
+       mvi     a,'Z'           ;Set the state to EOF.
+       sta     state
+       ret
+
+sfile2:        cpi     'N'             ;NAK?
+       jnz     sfile3          ;Try if error packet.
+       call    updrtr          ;Update the number of retries.
+       lda     pktnum          ;Get the present packet number.
+       inr     a               ;Increment
+       ani     3FH             ; modulo 64
+       mov     b,a
+       lda     argblk          ;Get the packet's number.
+       cmp     b               ;Is the packet's number one more than now?
+       rnz                     ;If not go try again.
+       jmp     sfil14          ;Just as good as a ACK;go to the ACK code.
+
+sfile3:        cpi     'E'             ;Is it an error packet.
+       jnz     abort
+       call    error
+       jmp     abort
+
+; copy remote name into packet to send [gnn]
+sfile4:        xchg                    ;[gnn] keep pointer to packet
+       lxi     h,remnam        ;[gnn] set pointer to name
+       mov     c,a             ;[gnn] keep count of length
+       mov     b,a             ;[gnn] and set as loop counter
+sfil41:        mov     a,m             ;[gnn] get a character
+       stax    d               ;[gnn] copy it to packet
+       inx     h               ;[gnn] 
+       inx     d               ;[gnn] move pointers
+       dcr     b               ;[gnn] 
+       mov     a,b             ;[gnn] 
+       ora     a               ;[gnn] done them all?
+       jnz     sfil41          ;[gnn] repeat until done
+       xchg                    ;[gnn] get final position
+       shld    datptr          ;[gnn] and save it
+       jmp     sfil13          ;[gnn] now go and send packet
+
+;\f
+;       Send data
+;       called by: send
+
+sdata: lda     numtry          ;Get the number of tries.
+       cpi     maxtry          ;Have we reached the maximum number of tries?
+       jm      sdata1
+       lxi     d,erms14
+       call    error3
+       jmp     abort           ;Change the state to abort.
+
+sdata1:        inr     a               ;Increment it.
+       sta     numtry          ;Save the updated number of tries.
+       lxi     h, data         ;Get a pointer to our data block.
+       shld    datptr          ;Save it.
+       lxi     h,filbuf        ;Pointer to chars to be sent.
+       shld    cbfptr          ;Save position in char buffer.
+       mvi     b,1             ;First char.
+sdat11:        lhld    cbfptr
+       mov     a,m
+       inx     h
+       shld    cbfptr          ;Save position in char buffer.
+       mov     c,a             ;[jd] preserve character temporarily
+       lda     quot8           ;[jd] doing eighth-bit quoting?
+       ora     a               ;[jd] 
+       mov     a,c             ;[jd] restore char
+       jnz     sdat4           ;[jd] using eighth-bit quoting, no warning
+       lda     parity          ;[jd] get parity
+       cpi     parnon          ;[jd] none?
+       mov     a,c             ;[jd] restore character
+       jz      sdat4           ;[jd] no parity, leave char alone
+       lda     wrn8            ;[jd] look at warning flag
+       ora     a               ;[jd] have we already given the warning?
+       jnz     sdat5           ;[jd] yes, skip this
+       mov     a,c             ;[jd] restore character...
+       ani     80h             ;[jd] examine parity
+       jz      sdat5           ;[jd] no parity, no warning.
+       call    parwrn          ;[jd] ...print warning - parity lost
+       mvi     a,0ffh          ;[jd] remember that we sent the message
+       sta     wrn8            ;[jd]
+sdat5: mov     a,c             ;[jd] restore character again
+       ani     7fh             ;[jd] strip parity so not checksummed
+sdat4: lhld    datptr
+       mov     m,a             ;Put the char in the data packet.
+       inx     h
+       shld    datptr          ;Save position in data packet.
+       inr     b               ;Increment the count.
+       lda     size            ;Get the number of chars in char buffer.
+       cmp     b               ;Have we transfered that many?
+       jp      sdat11          ;If not get another.
+       lda     size            ;Number of char in char buffer.
+       sta     argblk+1
+       lda     pktnum          ;Get the packet number.
+       sta     argblk
+       mvi     a,'D'           ;Data packet.
+       call    spack           ;Send the packet.
+       jmp     abort           ; Failed, abort.
+       call    rpack           ;Get a packet.
+       jmp     r               ; Trashed packet don't change state, retry.
+       cpi     'Y'             ;ACK?
+       jnz     sdata2          ;If not try next.
+       call    compp
+       rnz                     ;If not hold out for the right one.
+       lda     argblk          ;Get the packet number back
+       call    countp
+       lda     numtry          ;Get the number of tries.
+       sta     oldtry          ;Save it.
+       xra     a
+       sta     numtry          ;Reset the number of tries.
+       lda     argblk+1        ;Get the data length
+       cpi     1               ;Check if only 1 character?
+       jnz     sdat15          ;If not, just continue
+       lda     data            ;Got one character, get it from data
+       cpi     'Z'             ;Want to abort entire stream?
+       jnz     sdat14          ;If not, check for just this file
+       sta     czseen          ;Yes, remember it
+       jmp     sdat16          ;[MF] and set EOF state
+sdat14:        cpi     'X'             ;Desire abort of current file?
+       jnz     sdat15          ;If not, just continue
+       sta     czseen          ;Yes, remember that
+       jmp     sdat16          ;[MF] and set EOF
+sdat15:        lda     czseen          ;Also get control-Z flag
+       ora     a               ;Check if either given
+       jz      sdat12          ;If neither given, continue
+sdat16:        mvi     a,'Z'           ;Change state to EOF
+       sta     state           ; .  .  .
+       ret                     ;And return
+
+sdat12:        call    gtchr
+       jmp     sdat13          ;Error go see if its EOF.
+       sta     size            ;Save the size of the data gotten.
+       ret
+
+sdat13:        cpi     0FFH            ;Is it EOF?
+       jnz     abort           ;If not give up.
+       mvi     a,'Z'           ;Set the state to EOF.
+       sta     state
+       ret
+
+sdata2:        cpi     'N'             ;NAK?
+       jnz     sdata3          ;See if is an error packet.
+       call    updrtr          ;Update the number of retries.
+       lda     pktnum          ;Get the present packet number.
+       inr     a               ;Increment
+       ani     3FH             ; modulo 64
+       mov     b,a
+       lda     argblk          ;Get the packet's number.
+       cmp     b               ;Is the packet's number one more than now?
+       rnz                     ;If not go try again.
+       jmp     sdat12          ;Just as good as a ACK;go to the ACK code.
+
+sdata3:        cpi     'E'             ;Is it an error packet.
+       jnz     abort
+       call    error
+       jmp     abort
+;\f
+;       Send EOF
+;       called by: send
+
+seof:  lda     numtry          ;Get the number of tries.
+       cpi     maxtry          ;Have we reached the maximum number of tries?
+       jm      seof1
+       lxi     d,erms14
+       call    error3
+       jmp     abort           ;Change the state to abort.
+
+seof1: inr     a               ;Increment it.
+       sta     numtry          ;Save the updated number of tries.
+       lda     pktnum          ;Get the packet number.
+       sta     argblk
+       xra     a
+       sta     argblk+1        ;No data.
+       lda     czseen          ;Check if C-Z or C-X typed
+       ora     a               ; .  .  .
+       jz      seof14          ;If not aborted, just keep going
+       mvi     a,'D'           ;Tell other end to discard packet
+       sta     data            ;Store in data portion
+       mvi     a,1             ;One character
+       sta     argblk+1        ;Store the length
+seof14:        mvi     a,'Z'           ;EOF packet.
+       call    spack           ;Send the packet.
+       jmp     abort           ; Failed, abort.
+       call    rpack           ;Get a packet.
+       jmp     r               ; Trashed packet don't change state, retry.
+       cpi     'Y'             ;ACK?
+       jnz     seof2           ;If not try next.
+       call    compp
+       rnz                     ;If not hold out for the right one.
+seof12:        call    countp
+       lda     numtry          ;Get the number of tries.
+       sta     oldtry          ;Save it.
+       xra     a
+       sta     numtry          ;Reset the number of tries.
+       mvi     c,closf         ;Close the file.
+       lxi     d,fcb
+       call    bdos
+;* Check if successful
+       lda     czseen          ;Desire abort of entire stream?
+       cpi     'Z'             ;Desire abort of entire stream?
+       jz      seof13          ;If so, just give up now
+       call    mfname          ;Get the next file.
+       jc      seof13          ; No more.
+       call    getfil          ;and open it (assume success)
+       xra     a               ;Clear A
+       sta     czseen          ;Since we have not aborted this file
+       mvi     a,'F'           ;Set the state to file send.
+       sta     state
+       ret
+
+seof13:        mvi     a,'B'           ;Set the state to EOT.
+       sta     state
+       ret
+
+seof2: cpi     'N'             ;NAK?
+       jnz     seof3           ;Try and see if its an error packet.
+       call    updrtr          ;Update the number of retries.
+       lda     pktnum          ;Get the present packet number.
+       inr     a               ;Increment
+       ani     3FH             ; modulo 64
+       mov     b,a
+       lda     argblk          ;Get the packet's number.
+       cmp     b               ;Is the packet's number one more than now?
+       rnz                     ;If not go try again.
+       jmp     seof12          ;Just as good as a ACK;go to the ACK code.
+
+seof3: cpi     'E'             ;Is it an error packet.
+       jnz     abort
+       call    error
+       jmp     abort
+;\f
+;       Send EOT
+;       called by: send
+
+seot:  lda     numtry          ;Get the number of tries.
+       cpi     maxtry          ;Have we reached the maximum number of tries?
+       jm      seot1
+       lxi     d,erms14
+       call    error3
+       jmp     abort           ;Change the state to abort.
+
+seot1: inr     a               ;Increment it.
+       sta     numtry          ;Save the updated number of tries.
+       lda     pktnum          ;Get the packet number.
+       sta     argblk
+       xra     a
+       sta     argblk+1        ;No data.
+       mvi     a,'B'           ;EOF packet.
+       call    spack           ;Send the packet.
+       jmp     abort           ; Failed, abort.
+       call    rpack           ;Get a packet.
+       jmp     r               ; Trashed packet don't change state, retry.
+       cpi     'Y'             ;ACK?
+       jnz     seot2           ;If not try next.
+       call    compp
+       rnz                     ;If not hold out for the right one.
+seot12:        call    countp
+       lda     numtry          ;Get the number of tries.
+       sta     oldtry          ;Save it.
+       xra     a
+       sta     numtry          ;Reset the number of tries.
+       mvi     a,'C'           ;Set the state to file send.
+       sta     state
+       ret
+
+seot2: cpi     'N'             ;NAK?
+       jnz     seot3           ;Is it error.
+       call    updrtr          ;Update the number of retries.
+       lda     pktnum          ;Get the present packet number.
+       inr     a               ;Increment
+       ani     3FH             ; modulo 64
+       mov     b,a
+       lda     argblk          ;Get the packet's number.
+       cmp     b               ;Is the packet's number one more than now?
+       rnz                     ;If not go try again.
+       jmp     seot12          ;Just as good as a ACK;go to the ACK code.
+
+seot3: cpi     'E'             ;Is it an error packet.
+       jnz     abort
+       call    error
+       jmp     abort
+;\f
+;       This routine sets up the data for init packet (either the
+;       Send_init or ACK packet).
+;       called by: rinit, rfile, sinit
+;
+; Called by rinit, rfile and sinit.  See what WE want from the other fella
+;
+; [11] by OBS - Stripped out all the new capas code etc and reverted
+;      to Good Ol' Basic Kermit again!
+;      Those keen should study the followin gode with care, and remove
+;      or add semicolons as indicated.
+;
+; See also SPAR which decodes what comes in.  It also decodes bits in 
+;      the "capability" fields.  (Two CAPAS files allowed from remote
+;      machines, but we will only send one at max.)  Note that not all 
+;      if any of the capability bits will be used.
+;
+; Definitions - init packet (data section only.. rest of header assumed OK)
+;      Byte 0  Maximum length I want to send
+;           1  The Timeout I want you to use
+;           2  Number of PAD characters I want tot use (May be null)
+;           3  The PAD character I want to use (May be Null)
+;           4  The End-of-Line character I will use (Carriage Return)
+;           5  The control character Quote Character I will use (#)
+;           6  The parity bit Quote Character I will use (&)
+;           7  The Checktype I will use
+;           8  The repeat prefix I will use (Null, as we cannot to repeats)
+;           9  Capability Byte 0 (See SPAR for defs)
+;          10  Capability byte 1 ( --- " --- but we will not send it.)
+;          11  The number of packets I will send per window (not used)
+;          12  MAXL1 - Long packet size, ms count
+;          13  MAXL2 - Long packet size, ls count
+;
+;
+; Enter with HL pointing to the "data" part of the packet.
+
+;
+; older part of rpar follows...
+;
+;
+rpar:  lda     rpsiz           ;Get the receive packet size.
+       adi     space           ;Add a space to make it printable.
+       mov     m,a             ;Put it in the packet.
+       inx     h               ;Point to the next char.
+       lda     rtime           ;Get the receive packet time out.
+       adi     space           ;Add a space.
+       mov     m,a             ;Put it in the packet.
+       inx     h
+       lda     rpad            ;Get the number of padding chars.
+       adi     space
+       mov     m,a
+       inx     h
+       lda     rpadch          ;Get the padding char.
+       adi     100O            ;Uncontrol it.
+       ani     7FH
+       mov     m,a
+       inx     h
+       lda     reol            ;Get the EOL char.
+       adi     space
+       mov     m,a
+       inx     h
+       lda     rquote          ;Get the quote char.
+       mov     m,a
+       inx     h
+       mvi     m,'Y'           ;[jd] we know how to do 8-bit quoting
+       lda     parity          ;[jd]
+       cpi     parnon          ;[jd] parity none?
+       jz      rpar1           ;[jd] yes, keep going
+       lda     qbchr           ;[jd] no, better request 8-bit quoting
+       mov     m,a
+
+rpar1:
+       inx     h               ;Advance to next
+       lda     chktyp          ;Get desired block check type
+       mov     m,a             ;Store it
+       inx     h               ;Advance pointer
+
+; Comment out the next two lines for capas etc.  WILL require debugging
+       mvi     a,8             ; this id the older end for this routine.  May be useful.
+       ret
+
+; [11] Rest not needed for now, commented out
+; [10] (to ret)
+; New additions to rpar follows...
+
+;      lda     rcap1           ; get the first capability byte
+;      ani     3eh             ; mask out bit 0, ie only one CAPAS byte
+;      adi     space           ; tochar it
+;      mov     m,a
+;      inx     h
+;      mvi     m,space         ; No windows, ie space to packet
+;      inx     h
+;      push    h               ; we need the HL regs for maths.
+;      lhld    rdpkt           ; get receive packet length
+;      lxi     d,95            ; we want hl div 95 and hl mod 95
+;      call    divide          ; return with divsion in hl, remainder in de
+;      mov     a,l             ; two sets of bytes
+;      pop     h
+;      adi     space           ; tochar(maxl1)
+;      mov     m,a
+;      inx     h
+;      mov     a,l
+;      adi     space           ; tochar(maxl2)
+;      mov     m,a
+;
+; done all, set databytes = 12 and return
+;      mvi     a,12            ; 12 bits of data
+;      ret
+
+;[11] End of commented out code for rpar
+
+
+;\f
+;       This routine reads in all the send_init packet information.
+;       called by: rinit, sinit
+
+;[11] As for rpar, restore the "old" kermit code for non-capas Kermit.
+;[10] (to ret at end)
+;
+; SPAR - routine to decode parameters received from the remote end
+;
+;      Called by rinit,sinit
+;
+;      Entry:  a: Number of databytes in packet
+;              hl: Pointer to "data" part of packet
+;
+;spar: sta     temp4           ; save for a while
+;                              ; first clear some variables
+;      lda     dspsiz          ; get default "send" packet length
+;      sta     spktl
+;      lda     dstime          ; get default time-out
+;      sta     stimeo
+;      xra     a               ; set no pad characters by default
+;      sta     spad
+;      lda     dspadc          ; get the default padding character
+;      sta     spadc
+;      mvi     a,cr            ; default end of line character (CR)
+;      sta     seol
+;      mvi     a,dsquot        ; default quote character
+;      sta     squote
+;      mvi     a,dsbqut        ; default binary quote character
+;      sta     qbchr
+;      mvi     a,dschkt        ; set checktype = 1 for inits
+;      sta     inichk
+;      mvi     a,space         ; no repeat prefixing ( otherwise ~)
+;      sta     srept
+;
+; Now follows the "capabilities" bits... 5 bits per capas byte.
+;
+;      Note: Before extracting any data bits, apply unchar() to get the 
+;      six ls bits.  If bit 0 = 1 the a subsequent capaa byte follows
+;
+;      Byte0:  Bit 0:  Set to 1 if there are subsequent CAPAS bytes
+;                  1:  (Cap. 5) Set to 1 for long packets.  Second byte
+;                      AFTER the last capas byte has packet length DIV 95
+;                      and Thire byte has length MOD 95
+;                  2:  (Cap. 4) Sliding Windows.  If used, first byte AFTER
+;                      last capas byte has TOCHAR(no. of packets in window)
+;                  3:  (Cap. 3) Ability to accept "A" (attribute packets)
+;                  4:  (Cap. 2) Reserved
+;                  5:  (Cap. 1) Reserved
+;      Byte 2 onward: not used in this implementation. Any capas bytes sent 
+;              will be stored, however.
+;
+;      lda     temp4           ; get the number of bytes to test
+;      mov     c,a             ; to a count register
+;      mov     a,m             ; get first byte
+;      call    decc            ; unchar it, and decrement c
+;      sta     spsiz           ; save a send packet size
+;      jz      sparx           ; if no more, exit
+;
+;      mov     a,m             ; get timout
+;      call    decc
+;      sta     stime           ; save timeout
+;      jz      sparx
+;
+;      mov     a,m             ; get pad characters
+;      call    decc    
+;      sta     spadc           ; save it
+;      jz      sparx
+;
+;      mov     a,m             ; get pad character count
+;      call    decc
+;      sta     spad
+;      jz      sparx
+;
+;      mov     a,m             ; get send EOL
+;      call    decc
+;      sta     seol
+;      jz      sparx
+;
+;      mov     a,m             ; get control quote character
+;      call    decc
+;      sta     squote
+;      jz      sparx
+;
+;      mov     a,m             ; get binary (parity) quote char
+;      mov     b,a             ; this time we actually WANT accumulator
+;      cpi     space           ; are we doing 8th bit quoteing
+;      jz      spar1           ; dont know, assume not
+;      cpi     'N'             ; definately not?
+;      jz      spar1
+;      cpi     'Y'             ; definately - use &
+;      jz      spar2
+;      sta     squote          ; else save the new character
+;spar2:        lda     parity          ; see if we are using the parity bit
+;      cpi     parnon          ; no parity => no quoting
+;      jz      spar3           ; yup, so use the default quote character &
+;
+;spar1:        xra     a               ; save not quoting
+;      sta     squote
+;spar3:        call    decc            ; update counters etc
+;      jz      sparx
+;
+;      mov     a,m             ; get repeat prefixing
+;      call    decc
+;      push    psw             ; save flags
+;      cpi     space-32        ; we want it?
+;      jz      spar4
+;      sta     srept
+;spar4:        pop     psw             ; restore flags
+;      jz      sparx
+;
+;      lxi     d,scapas        ; point to start of capability byte(s)
+;      push    psw             ; must do this...
+;spar5:        pop     psw             ; cos we restore the spack
+;      mov     a,m
+;      call    decc            ; get scap1 (or n)
+;      sta     scap1
+;      push    psw
+;      ani     01              ; another byte following?
+;      jnz     spar5
+;      pop     psw             ; see if any other data bytes (Windows etc)
+;      jz      sparx
+;
+;      mov     a,m             ; get window size
+;      call    decc
+;      sta     swindo
+;      jz      sparx
+;
+;      mov     a,m             ; get long packets ms bits
+;      call    decc            ;
+;      mov     d,a             ; unchared ms bits-ish
+;      mov     a,m
+;      call    decc            ; ls bits-ish
+;      push    h               ; and we are doing maths
+;      push    b               ; and an intermediate result in c
+;      push    psw             ; we want flags  and the ls bits...
+;      mvi     b,0
+;      mov     c,d             ; get ms bits-ish to bc
+;      push    b               ; get number to hl
+;      pop     h
+; now multipy by 95
+;      dad     h               ;*2
+;      dad     h               ;*4
+;      dad     h               ;*8
+;      dad     h               ;*16
+;      push    h               ; *16 to ...
+;      pop     d               ; ... de
+;      dad     h               ;*32
+;      dad     d               ; *(32+16) = *48
+;      dad     h               ; *96
+;      mov     a,l             ; *(96-1)
+;      sub     c
+;      mov     l,a
+;      mov     a,0
+;      sbb     h
+;      mov     h,a
+;      pop     psw             ; restore ls bitsish
+;      mov     e,a
+;      mvi     d,0
+;      dad     d               ; *95 + ls bits. Phew.
+;      shld    sdpkt           ; save long packet length
+;      pop     b
+;      pop     h               ; restore regs
+;
+;sparx:        ret                     ; if here, (assume) no more data to read in
+;[10] routines required follow
+;decc: mov     a,m             ; get data byte
+;      sui     space           ; unchar it
+;      inx     h               ; increment input pointer
+;      dcr     c               ; decrement data counter
+;      ret                     ; return
+;[10] end or spar replacement
+
+;[11] Restore older spar....
+; Older spar follows...
+spar:  sta     temp4           ;Save the number of arguments.
+; Initialize some variables to their required default values, so we use
+; the right values even if the remote Kermit doesn't send the full packet:
+;                                      ; we don't do anything with timeout values yet.
+;                                      ; no default pad count/pad character?
+       mvi     a,cr            ; EOL character = carriage-return
+       sta     seol
+       mvi     a,'#'           ; quote character = '#'
+       sta     squote
+       mvi     a,'&'           ; eighth-bit quote character = '&'
+       sta     qbchr
+       mvi     a,'1'           ; block-check = 1-character-checksum
+       sta     inichk
+; 
+       mov     a,m             ;Get the max packet size.
+       sbi     space           ;Subtract a space.
+       sta     spsiz           ;Save it.
+       lda     temp4
+       cpi     3               ;Fewer than three pieces?
+       rm                      ;If so we are done.
+       inx     h
+       inx     h               ;Increment past the time out info.
+       mov     a,m             ;Get the number of padding chars.
+       sbi     space
+       sta     spad
+       lda     temp4
+       cpi     4               ;Fewer than four pieces?
+       rm                      ;If so we are done.
+       inx     h
+       mov     a,m             ;Get the padding char.
+       adi     100O            ;Re-controlify it.
+       ani     7FH
+       sta     spadch
+       lda     temp4
+       cpi     5               ;Fewer than five pieces?
+       rm                      ;If so we are done.
+       inx     h
+       mov     a,m             ;Get the EOL char.
+       sbi     space
+       sta     seol
+       lda     temp4
+       cpi     6               ;Fewer than six pieces?
+       rm                      ;If so we are done.
+       inx     h
+       mov     a,m             ;Get the quote char.
+       sta     squote
+       lda     temp4           ;Get the amount of data supplied
+       cpi     7               ;Have an 8-bit quote?
+       rm                      ;If not there, all done
+       inx     h               ;Yes, get the character
+       mvi     a,0             ;[jd] 
+       sta     quot8           ;[jd] assume not quoting
+       mov     a,m             ;Get the supplied character
+       cpi     'N'             ;[jd] No?
+       jz      spar1           ;[jd] then don't try to do it
+       cpi     space           ;[jd] maybe they don't know about it...
+       jz      spar1           ;[jd] then don't try to do it.
+       cpi     'Y'             ;[jd] Yes?
+       jnz     spar2           ;[jd] if not 'Y', assume it's a quote char.
+       lda     parity          ;[jd] using parity?
+       cpi     parnon          ;[jd] no, don't need quoting...
+       jz      spar1           ;[jd] 
+       mvi     a,0ffh          ;[jd] else turn on...
+       sta     quot8           ;[jd] ...quote flag
+       jmp     spar1
+
+;[11] Note: If capas etc required, beware of the next two lables, as these 
+; are used elswhere.
+
+spar2: sta     qbchr           ;[jd] use their quote char (should validate)
+       mvi     a,0ffh
+       sta     quot8           ;[jd] turn quote flag and fall thru...
+
+spar1: lda     temp4           ;Determine if block check type given
+       cpi     8               ;Is the field there?
+       rm                      ;If not, all done
+       inx     h               ;Point to the character
+       mov     a,m             ;Get the value
+       mov     b,a             ;Copy value
+       lda     chktyp          ;Get our type
+       cmp     b               ;Is it our desired type?
+       rnz                     ; If not, use default (1-character-checksum)
+       sta     inichk          ; Match, store as type to use after init
+       ret                     ; and return
+;[10] end of replacement
+;[11] end of replacement of replacement (ie back to original code)
+;\f
+
+;       Copy characters from packet to disk (or screen)
+;       called by: rdata
+
+ptchr: sta     temp1           ;Save the size.
+       lda     remtxt          ;[MF]Get remote command flag
+       ora     a               ;[MF]Remote command in progress?
+       jnz     ptchr0          ;[MF]Yes, don't check for file collisions
+       lda     flwflg          ;[MF]Get File Warning (Set Collision) flag
+       cpi     3               ;[MF]SET COLLISION DISCARD?
+       jnz     ptchr0          ;[MF]No
+       lda     dscflg          ;[MF]Yes, get "discard" flag
+       ora     a               ;[MF]Discarding file?
+       jz      ptchr0          ;[MF]No
+       mvi     a,'X'           ;[MF]Yes, simulate a user rejection
+       sta     czseen          ;[MF]...
+       jmp     rskp            ;[MF]and pretend success
+ptchr0:                                ;[MF]
+       lxi     h,data          ;Beginning of received packet data.
+       shld    outpnt          ;Remember where we are.
+       lda     rquote
+       mov     b,a             ;Keep the quote char in b.
+       mvi     c,0             ;[jd] assume no 8-bit quote char
+       lda     quot8           ;[jd] doing 8-bit quoting?
+       ora     a
+       jz      ptchr1          ;[jd] no, keep going
+       lda     qbchr           ;[jd] else get 8-bit quote char
+       mov     c,a             ;[jd] keep this in c
+ptchr1:        lxi     h,temp1
+       dcr     m               ;Decrement # of chars in packet.
+       jm      rskp            ;Return successfully if done.
+       lda     remtxt          ; to screen only?
+       ana     a
+       jnz     ptchr2          ; dont do any disk stuff
+       lxi     h,chrcnt        ;Number of chars remaining in dma.
+       dcr     m               ;Decrement.
+       jp      ptchr2          ;Continue if space left.
+       call    outbuf          ;Output it if full.
+       jmp     ptchr9          ; Error return if disk is full.
+ptchr2:        lhld    outpnt          ;Get position in output buffer.
+       mov     a,m             ;Grab a char.
+       inx     h
+       shld    outpnt          ;and bump pointer.
+       mvi     e,0             ;[jd] assume nothing to OR in.
+       cmp     c               ;[jd] is it the binary quote char?
+       jnz     ptch2a          ;[jd] no, keep going
+       mvi     e,80h           ;[jd] include parity bit
+       lda     temp1
+       dcr     a
+       sta     temp1           ;[jd] decrement character count
+       mov     a,m             ;[jd] get next character
+       inx     h
+       shld    outpnt
+ptch2a:        cmp     b               ;Is it the quote char?
+       jnz     ptchr3          ;[jd] changed to ptchr3 so includes parity
+       mov     a,m             ;Get the quoted character
+       inx     h
+       shld    outpnt          ;and bump pointer.
+       lxi     h,temp1
+       dcr     m               ;Decrement # of chars in packet.
+       mov     d,a             ;Save the char.
+       ani     80H             ;Turn off all but the parity bit.
+       ora     e               ;[jd] let parity come from either (???)
+       mov     e,a             ;Save the parity bit.
+       mov     a,d             ;Get the char.
+       ani     7FH             ;Turn off the parity bit.
+       cmp     b               ;Is it the quote char?
+       jz      ptchr3          ;If so just go write it out.
+       cmp     c               ;[jd] maybe it's the 8-bit prefix character?
+       jz      ptchr3          ;[jd] then don't controllify.
+       mov     a,d             ;Get the char.
+       adi     40H             ;Make the character a control char again.
+       ani     7FH             ;Modulo 128.
+ptchr3:        ora     e               ;Or in the parity bit.
+       sta     temp3           ; save for a while
+       lda     remtxt          ; to screen or disk?
+       ana     a
+       lda     temp3
+       jz      ptch31          ; to disk
+       push    h
+       push    d
+       push    b
+       mov     e,a             ; to display
+       mvi     c,dconio
+       call    bdos
+       pop     b
+       pop     d
+       pop     h
+       jmp     ptchr1          ; continue
+
+ptch31:        lhld    bufpnt          ;Destination buffer.
+       mov     m,a             ;Store it.
+       inx     h
+       shld    bufpnt          ;Update the pointer
+       jmp     ptchr1          ;and loop to next char.
+
+ptchr9:        lxi     d,erms11        ; "?Disk full"
+       push    d               ;[MF] Save pointer
+       call    error3          ; put it on the error line
+       pop     d               ;[MF] Restore pointer
+       lxi     h,data          ;[MF] Where to put the message for "e" packet
+       lda     argblk          ;[MF] Get packet-number
+       call    countp          ;[MF]Increment it
+       sta     argblk          ;[MF] as packet to send
+       xra     a               ;[MF] Zero length of packet data
+       sta     temp1           ;[MF] ...
+ptch9a:        ldax    d               ;[MF] Get a character to copy
+       cpi     cr              ;[MF] No more to copy?
+       jz      ptch9b          ;[MF] Yes, we can send the packet
+       mov     m,a             ;[MF] No, copy the character
+       inx     d               ;[MF] and increment source/dest pointers
+       inx     h               ;[MF] ...
+       lda     temp1           ;[MF] Get character count
+       inr     a               ;[MF] and increment it
+       sta     temp1           ;[MF] ...
+       jmp     ptch9a          ;[MF] Copy entire error message
+ptch9b:        mvi     m,0             ;[MF]Put in a zero
+       lda     temp1           ;[MF] Get number of characters in the message
+       sta     argblk+1        ;[MF] and store as number of packet data chars
+       mvi     a,'E'           ;[MF] Make it an error packet
+       call    spack           ;[MF] Send the error packet
+       nop                     ;[MF] Don't really care if
+       nop                     ;[MF] the send fails since we're
+       nop                     ;[MF] bombing off anyway
+       ret                     ; take error return.
+;\f
+;       Fill a data packet from file
+;       called by: sfile, sdata
+
+gtchr: lda     squote          ;Get the quote char.
+       mov     c,a             ;Keep quote char in c.
+       lda     curchk          ;Get current block check type
+       sui     '1'             ;Get the extra overhead
+       mov     b,a             ;Get a copy
+       lda     spsiz           ;Get the maximum packet size.
+       sui     5               ;Subtract the overhead.
+       sub     b               ;Determine max packet length
+       sta     temp1           ;This is the number of chars we are to get.
+       lxi     h,filbuf        ;Where to put the data.
+       shld    cbfptr          ;Remember where we are.
+       mvi     b,0             ;No chars.
+gtchr1:        lda     temp1
+       dcr     a               ;Decrement the number of chars left.
+       jp      gtchr2          ;Go on if there is more than one left.
+       mov     a,b             ;Return the count in A.
+       jmp     rskp
+
+gtchr2:        sta     temp1
+       lda     chrcnt          ;Space left in the DMA.
+       dcr     a
+;* Can improve order here.
+       jm      gtchr3
+       sta     chrcnt
+       jmp     gtchr4
+
+gtchr3:        call    inbuf           ;Get another buffer full.
+       jmp     gtch30          ; If no more return what we got.
+       jmp     gtchr4          ;If we got some, proceed.
+
+gtch30:        mov     a,b             ;Return the count in A.
+       ora     a               ;Get any chars?
+       jnz     rskp            ;If so return them.
+       jmp     gtceof          ;If not, say we found the end of the file.
+
+gtchr4:        lhld    bufpnt          ;Position in DMA.
+       mov     a,m             ;Get a char from the file.
+       inx     h
+       shld    bufpnt
+       mov     d,a             ;Save the char.
+       ani     80H             ;Turn off all but parity.
+       mov     e,a             ;Save the parity bit.
+       jz      gtch4a          ;[jd] no parity, skip this check...
+       lda     quot8           ;[jd] doing eighth-bit quoting?
+       ora     a
+       jz      gtch4a          ;[jd] no, just proceed normally
+       lda     temp1           ;[jd] get space remaining
+       cpi     2               ;[jd] 3 chrs left (one cnted already)?
+       jm      gtchr9          ;[jd] no, skip this
+       dcr     a               ;[jd] decrement space remaining
+       sta     temp1           ;[jd] put back.
+       lhld    cbfptr          ;[jd] Position in character buffer.
+       lda     qbchr           ;[jd] get quote character
+       mov     m,a             ;]jd] Put the quote char in the buffer.
+       inx     h               ;[jd] increment destination buffer pointer
+       shld    cbfptr          ;[jd] store the pointer back
+       inr     b               ;[jd] Increment the char count.
+       mvi     e,0             ;[jd] no parity bit to OR in.
+;[jd] fall thru...
+
+gtch4a:        mov     a,d             ;Restore the char.
+       ani     7FH             ;Turn off the parity.
+       mov     d,a             ;[jd] save here for later...
+       cpi     space           ;Compare to a space.
+       jm      gtchr5          ;If less then its a control char, handle it.
+       cpi     del             ;Is the char a delete?
+       jz      gtchr5          ;Go quote it.
+       lda     quot8           ; Are we doing 8th-bit quoting?
+       ora     a
+       jz      gtch4c          ; if not, skip this test and restore character.
+       lda     qbchr           ; get 8th-bit quote character
+       cmp     d               ; same as current character?
+       jz      gtch4b          ; yes, have to quote it...
+gtch4c:        mov     a,d             ; no. get character back again.
+       cmp     c               ;Is it the quote char?
+       jnz     gtchr8          ;If not proceed.
+gtch4b:        lxi     h,temp1         ;[jd] point to char count
+       dcr     m               ;[jd] decrement (know room for at least one)
+       lhld    cbfptr          ;Position in character buffer.
+       mov     m,c             ;Put the (quote) char in the buffer.
+       inx     h
+       shld    cbfptr
+       inr     b               ;Increment the char count.
+       mov     a,d             ;[jd] restore character again
+       jmp     gtchr8
+
+gtchr5:        
+       ;[gnn] ignore parity for checking
+;       ora     e              ;Turn on the parity bit.
+
+       cpi     ('Z'-100O)      ;Is it a ^Z?
+       jnz     gtchr7          ;If not just proceed.
+       lda     cpmflg          ;Was the file created by CPM...
+       cpi     1               ;in ASCII-mode ?
+       jz      gtch52          ;Control-Z stops text
+       cpi     2               ;in BINARY mode?
+       jz      gtchr6          ;Yes, pass the ^Z
+;At this point file-mode is DEFAULT.
+;If the rest of the record is filled with ^Zs, we're at EOF, otherwise
+;its a regular character.
+       lhld    bufpnt          ;since CHRCNT is ZERO at EOF-time
+       lda     chrcnt          ;(set by INBUF5 B.G.E)
+       mov     d,a             ;Get the number of chars left in the DMA.
+gtch51:        dcr     d
+       mov     a,d
+       jp      gtch53          ;Any chars left?
+gtch52:        xra     a               ;If not, get a zero.
+       sta     chrcnt          ;Say no more chars in buffer.
+       mov     a,b             ;Return the count in A.
+       jmp     rskp
+
+;Scan rest of buffer for non ^Z -- If we find a non ^Z, fall into gtchr6.
+;If we get to the end of the buffer before finding a non ^Z, fall into gtch52.
+gtch53:        mov     a,m             ;Get the next char.
+       inx     h               ;Move the pointer.
+       cpi     ('Z'-100O)      ;Is it a ^Z?
+       jz      gtch51          ;If so see if the rest are.
+
+gtchr6:        mvi     a,('Z'-100O)    ;Restore the ^Z.
+gtchr7:        sta     temp2           ;Save the char.
+       lxi     h,temp1         ;Point to the char total remaining.
+       dcr     m               ;Decrement it.
+       lhld    cbfptr          ;Position in character buffer.
+       mov     m,c             ;Put the quote in the buffer.
+       inx     h
+       shld    cbfptr
+       inr     b               ;Increment the char count.
+       lda     temp2           ;Get the control char back.
+       adi     40H             ;Make the non-control.
+       ani     7fH             ;Modulo 200 octal.
+gtchr8:        lhld    cbfptr          ;Position in character buffer.
+       ora     e               ;Or in the parity bit.
+       mov     m,a             ;Put the char in the buffer.
+       inx     h
+       shld    cbfptr
+       inr     b               ;Increment the char count.
+       jmp     gtchr1          ;Go around again.
+
+gtchr9:        ;[jd] not enough room left in buffer...
+       lhld    bufpnt
+       dcx     h
+       shld    bufpnt          ;[jd] back up over last character
+       lxi     h,chrcnt        ;[jd] point to character count
+       inr     m               ;[jd] increment it
+       mov     a,b             ;[jd] count of chars transferred
+       jmp     rskp            ;[jd] return it
+
+gtceof:        mvi     a,0FFH          ;Get a minus one.
+       ret
+;\f
+
+; Little code to allow some expansion of code without changing
+;  every futher address, only up to the end of this file.
+;   TO BE REMOVED FRO RELEASE!
+
+;      org ($+100h) AND 0FF00H
+
+IF     lasm
+       LINK    CPSPK2          ;[obs] Link to part two of the packet file
+ENDIF  ;lasm
diff --git a/cpspk2.asm b/cpspk2.asm
new file mode 100644 (file)
index 0000000..b246967
--- /dev/null
@@ -0,0 +1,1336 @@
+; CPSPK2.ASM
+;       KERMIT - (Celtic for "FREE")
+;
+;       This is the CP/M-80 implementation of the Columbia University
+;       KERMIT file transfer protocol.
+;
+;       Version 4.0
+;
+;       Copyright June 1981,1982,1983,1984
+;       Columbia University
+;
+; Originally written by Bill Catchings of the Columbia University Center for
+; Computing Activities, 612 W. 115th St., New York, NY 10025.
+;
+; Contributions by Frank da Cruz, Daphne Tzoar, Bernie Eiben,
+; Bruce Tanner, Nick Bush, Greg Small, Kimmo Laaksonen, Jeff Damens, and many
+; others. 
+;
+;       This file contains the (system-independent) routines that implement
+;       the KERMIT protocol, and the commands that use them:
+;       RECEIVE, SEND, FINISH, and LOGOUT.
+;
+; revision history:
+;
+;edit 11, 21-Mar-1991 by MF. After "inchr7", close TAKE-file (if any) so
+;      ^C will halt all processing (including commands from TAKE-files)
+;      and put the user back at Kermit command-level.
+;edit 10, 3-Jan-1991 by MF. Modify routine "inchr" after label "inchr5" to
+;      not take retry (nonskip) return if ^X/^Z seen on the Console. This
+;      will prevent multiple copies of packets being sent if user aborts
+;      some files in a stream being sent via ^X and is a better fix to this
+;      problem than flushing comm input before sending the "Z" packet
+;      requesting the remote Kermit to discard the current file being
+;      received (as implemented in CPSPK1.ASM edit of 2-jan-1991).
+;edit 9, 14-Dec-1990 by MF. Modified "gofil" routine to allow for
+;      specification of a drive in the local filespec for GET and
+;      RECEIVE commands. Thus commands such as
+;      GET HELLO.TXT B:GOODBYE.TXT
+;      and
+;      RECEIVE B:GOODBYE.TXT
+;      now work as expected.
+;edit 8, 22-Oct-1990 by MF.  Fixed bug in completion-message routine
+;      "finmes" wherein the completion message was not printed if the
+;      terminal was set to QUIET because the message pointer was clobbered
+;      by prcrlf.
+;edit 7, 14-Sep-1990 by MF.  Add hooks for SET COLLISION command.
+;      Eliminate commented-out old file warning rename routine.
+;      Clear communication input buffers (call flsmdm) before
+;      BYE, FINISH and LOGOUT commands.
+;edit 6, 9-Sep-1990 by MF.  Implemented fixes in CPKERM.BWR for
+;      garbage printout during quiet transfers and for file existence/
+;      rename algorithm.
+;      Also implemented hooks for Remote commands.
+; edit 5, 18 June 1990 by Russell Lang [rjl@monu1.cc.monash.edu.au]
+;      When trying to generate a unique file name on receive, zero
+;      the attribute bits between file opening attempts.  This is
+;      to fix a bug which caused the unique file name to have the
+;      attributes of the already existing file.  If the attribute
+;      was R/O, a bdos error occured later when an attempt was made
+;      to write to the file.
+;
+; edit 4, 27 October, 1987 By OBSchou.  Changed the rename routine to 
+;      be more like the MSDOS issue.
+;
+; edit 3, 28 July, by OBSchou.  Added traps to NOT print to screen during
+;      file transfers if quietd is non zero (ie we SET TERMINAL QUIET)
+;      This hopefully speeds up transfers in systems spending an age
+;      updating the screen.
+;
+; edit 2, 8 April, 1987 by OBSchou.  Minor edit to put drive and user number
+;      in the "filename" field on the transfer screen.  This means that the
+;      offset on the line foe the file name proper has moved along 4 space.  
+;      Also, it writes 15 spaces AFER the xxd: string to clear the field 
+;      of any prevous file.  Needed for thos terminals that cannot
+;      clear to end of line...
+;
+; edit 1, 28 January, 1987 by OBSchou.
+;      Hived off about 1/2 of CPSPKT.ASM to form two (smaller => easier
+;      to handle) files.  
+;
+;
+
+pk2ver:        db      'CPSPK2.ASM (11)  21-Mar-1991$'     ; name, edit number, date
+
+
+;
+;       Get the file name (including host to micro translation)
+;       called by: rfile
+
+gofil: xra     a
+       sta     fcb             ;Set the drive to default to current.
+       lxi     h,data          ;Get the address of the file name.
+; allow use of local name if one was given [gnn]
+       lda     remlen          ;[gnn] 
+       ora     a               ;[gnn] anything there?
+       jz      gofil0          ;[gnn]  no, use the one in the data packet
+       lxi     h,remnam        ;[gnn] yes, use this instead
+       lda     remnam+1        ;[MF]Get 2nd char of local filename
+       cpi     ':'             ;[MF]Was a drive specified?
+       jnz     gofil0          ;[MF]No, proceed as of old
+       mov     a,m             ;[MF]Yes, get drive
+       ani     5fh             ;[MF]Force uppercase
+       sui     'A'-1           ;[MF]Make valid drive for fcb
+       sta     fcb             ;[MF]and store in fcb
+       inx     h               ;[MF]Skip drive and delimiter
+       inx     h               ;[MF]...
+gofil0:                                ;[gnn]  continue to set up the file [gnn]
+;
+       shld    datptr          ;Store the address.
+       lxi     h,fcb+1         ;Address of the FCB.
+       shld    fcbptr          ;Save it.
+       xra     a
+       sta     temp1           ;Initialize the char count.
+       sta     temp2
+       mvi     b,' '
+gofil1:        mov     m,b             ;Blank the FCB.
+       inx     h
+       inr     a
+;       cpi     0CH             ;Twelve?[5a]
+       cpi     0BH             ; Eleven? [5a]
+       jm      gofil1
+       mvi     m,0             ; [5a] Specify extent 0
+gofil2:        lhld    datptr          ;Get the NAME field.
+       mov     a,m
+       cpi     'a'             ;Force upper case
+       jm      gofl2a          ;
+       ani     5FH             ;
+gofl2a:        inx     h
+       cpi     '.'             ;Seperator?
+       jnz     gofil3
+       shld    datptr          ;[jd] update ptr (moved from above)
+       lxi     h,fcb+9H
+       shld    fcbptr
+       lda     temp1
+       sta     temp2
+       mvi     a,9H
+       sta     temp1
+       jmp     gofil6
+
+gofil3:        ora     a               ;Trailing null?
+       jz      gofil7          ;Then we're done.
+       shld    datptr          ;[jd] no, can update ptr now.
+       lhld    fcbptr
+       mov     m,a
+       inx     h
+       shld    fcbptr
+       lda     temp1           ;Get the char count.
+       inr     a
+       sta     temp1
+       cpi     8H              ;Are we finished with this field?
+       jm      gofil2
+gofil4:        sta     temp2
+       lhld    datptr
+       mov     a,m
+       inx     h
+       shld    datptr
+       ora     a
+       jz      gofil7
+       cpi     '.'             ;Is this the terminator?
+       jnz     gofil4          ;Go until we find it.
+gofil6:        lhld    datptr          ;Get the TYPE field.
+       mov     a,m
+       cpi     'a'             ;Force upper case
+       jm      gofl6a          ;
+       ani     5FH             ;
+gofl6a:        ora     a               ;Trailing null?
+       jz      gofil7          ;Then we're done.
+;[jd] move above two lines so we don't increment pointer if char is null
+       inx     h
+       shld    datptr
+       lhld    fcbptr
+       mov     m,a
+       inx     h
+       shld    fcbptr
+       lda     temp1           ;Get the char count.
+       inr     a
+       sta     temp1
+       cpi     0CH             ;Are we finished with this field?
+       jm      gofil6
+gofil7:        lhld    datptr
+       mvi     m,'$'           ;Put in a dollar sign for printing.
+       lda     quietd          ; quiet display?
+       ana     a
+       jnz     gofi70          ; yes, so skip it.
+       call    scrfln          ;Position cursor
+gofi70:        lxi     d,data          ;Print the file name
+       lda     getrxflg        ;[obs 8] are we doing a get or receive?
+       ana     a               ;[obs 8]
+       jz      gofi7a          ;[obs 8] if zero, receive
+       lxi     d,remnam        ;[obs 8]
+gofi7a:                ;[obs 8]
+
+       call    prtstr
+gofi7b:        xra     a               ;[MF]Zero "discard" flag
+       sta     dscflg          ;[MF]...
+       lda     flwflg          ;Is file warning on?
+       ora     a
+       jz      gofil9          ;If not, just proceed.
+       mvi     c,openf         ;See if the file exists.
+       lxi     d,fcb
+       call    bdos
+       cpi     0FFH            ;Does it exist?
+       jz      gofil9          ;If not create it.
+;
+       lda     flwflg          ;[MF]Get flag again
+       cpi     3               ;[MF]SET COLLISION DISCARD?
+       jnz     gofi7h          ;[MF]No
+       mvi     a,0ffh          ;[MF]Yes, order rejection of the file
+       sta     dscflg          ;[MF]...
+       jmp     rskp            ;[MF]and pretend successful open
+gofi7h:        push    psw             ;[MF]Save Collision status
+       lxi     d,infms5
+       call    error3
+       pop     psw             ;[MF]Restore Collision status
+       cpi     1               ;[MF]SET COLLISION RENAME?
+       jz      gofi7i          ;[MF]Yes, same as SET WARNING ON
+                               ;[MF]If we come here, SET COLLISION BACKUP
+       lxi     h,fcb           ;[MF]Copy original fcb to a safe place
+       lxi     d,colfcb        ;[MF]...
+       lxi     b,33            ;[MF]...
+       call    mover           ;[MF]...
+                               ;[MF]and fall into rename code
+gofi7i:                                ;[MF]
+;
+;      Replacement  file name renamer routine.  Incomming
+;      files are renamed in this manner:
+;      original file name:     filex.ext
+;      first rename:           filex001.ext
+;      ...             ...
+;      ninth rename            filex009.ext
+;      10th rename             fail - would we really want 10
+;                              files of the same name??
+;
+;
+;      1)
+;      Assume that we need to "rename" the file, so lets make sure
+;      that there is a full. 8 character filename. (We make it if 
+;      it does not already exist)
+;              1a) If full file name, last character is to be replaced
+;              by a zero.  This gives us up to no#ine renames.
+;      2)open file
+;              2a)If exists, increment last character by one
+;              2b)if = '9' then abort
+;              2c)If does not exist, got 2)
+;      3)we have a valid 'renamed' file
+;
+;Part 1) - fill out filename part 
+
+       mvi     c,8             ; max 8 characters to test for
+       mvi     a,'0'           ; spaces to be replaced by a zero.
+       lxi     h,fcb+8         ; start at the end
+gofi7c:        mov     m,a             ; put a zero in here
+       dcr     c               ; come to the end?
+       jz      gofi7d          ; should not have, but just in case...
+       dcx     h               ; previous chararcter
+       mov     a,m             ; get it
+       cpi     ' '             ; if this character a space as well, zero it
+       mvi     a,'0'           ; set it to ascii zero just in case...
+       jz      gofi7c          ;
+;
+; Part 2) open the file (if success, then it exists)
+
+gofi7d:
+;zero the attribute bits.  [rjl@monu1.cc.monash.edu.au]
+       lxi     h,fcb+1         ;[rjl]
+       mvi     c,11            ;[rjl]
+gofi7z:        mov     a,m             ;[rjl]
+       ani     07fh            ;[rjl]
+       mov     m,a             ;[rjl]
+       inx     h               ;[rjl]
+       dcr     c               ;[rjl]
+       jnz     gofi7z          ;[rjl]
+       lxi     d,fcb
+       mvi     c,openf
+       call    BDOS
+       inr     a               ; if 0ffh returned, error (ie does not exist)
+       jz      gofi7e
+       lda     fcb+8           ; get last character
+       inr     a
+       sta     fcb+8
+       cpi     '9'+1           ; more than '9' => too far, lets give up.
+       jnz     gofi7d          ; else try again
+;Giving up, so lets exit
+       lxi     d,erms16        ;
+       call    prtstr
+       ret             ; return to error routine
+
+gofi7e:        lxi     d,fnbuf         ; make the file name into a character string
+       lxi     h,fcb+1         ; point to source file name, less drive name
+       mvi     c,8             ; 11 characters (8+3) + dot to copy across
+;
+gofi7f:        mov     a,m             ; get character
+       stax    d
+       inx     h
+       inx     d
+       dcr     c
+       jnz     gofi7f          ; loop until all done
+
+       mvi     a,'.'           ; then the dot
+       stax    d
+       inx     d
+
+       mvi     c,3             ; then the file extention
+
+gofi7g:        mov     a,m
+       stax    d
+       inx     h
+       inx     d
+       dcr     c
+       jnz     gofi7g          ; loop until extention copied across
+
+       mvi     a,'$'           ; dollar terminate string
+       stax    d
+       lxi     d,fnbuf         ;[MF]Point to string
+       call    prtstr          ; write string to console
+
+       lda     flwflg          ;[MF]Get warning (SET COLLISION) flag
+       cpi     2               ;[MF]SET COLLISION BACKUP?
+       jnz     gofil9          ;[MF]No
+       lxi     h,fcb           ;[MF]Yes, get new filename fcb
+       lxi     d,colfcb+16     ;[MF]Where to copy to for rename
+       lxi     b,16            ;[MF]Copy 16 bytes
+       call    mover           ;[MF]...
+       lxi     d,colfcb        ;[MF]Point to rename fcb
+       mvi     c,renam         ;[MF]Rename function
+       call    bdos            ;[MF]Try to rename original file
+       cpi     0ffh            ;[MF]Did we win?
+       jnz     gofl82          ;[MF]Yes
+       lxi     d,erms16        ;[MF]No, complain and bomb
+       jmp     error3          ;[MF]...
+gofl82:        lxi     h,colfcb        ;[MF]Now recopy original filename into fcb
+       lxi     d,fcb           ;[MF]to create new file with original name
+       lxi     b,16            ;[MF]...
+       call    mover           ;[MF]...
+;
+;
+;Now lets make the file (create it)
+
+gofil9:        call    makfil          ; Create the file.
+       jmp     gofl91          ; Disk was full.
+       jmp     rskp            ; Success.
+    
+gofl91:        lxi     d,erms11
+       call    error3
+       ret
+;\f
+;       This is the FINISH command.  It tells the remote KERSRV to exit.
+;       here from kermit
+
+finish:        call    cfmcmd
+       call    selmdm          ;[MF]Select modem
+       call    flsmdm          ;[MF]Flush buffers
+       call    selcon          ;[MF]Select keyboard again
+       xra     a
+       sta     numtry          ;Inititialize count.
+       mvi     a,'1'           ;Reset block check type to single character
+       sta     curchk          ; .  .  .
+
+finsh1:        lda     numtry          ;How many times have we tried?
+       cpi     maxtry          ;Too many times?
+       jm      finsh3          ;No, try it.
+finsh2:        lxi     d,erms18        ;Say we couldn't do it.
+       call    prtstr
+       jmp     kermit          ;Go home.
+
+finsh3:        inr     a               ;Increment the number of tries.
+       sta     numtry
+       xra     a
+       sta     argblk          ;Make it packet number zero.
+       mvi     a,1
+       sta     argblk+1        ;One piece of data.
+       lxi     h,data
+       mvi     m,'F'           ;Finish running Kermit.
+       mvi     a,'G'           ;Generic command packet.
+       call    spack
+       jmp     finsh2          ; Tell the user and die.
+       call    rpack           ;Get an acknowledgement.
+       jmp     finsh1          ; Go try again.
+       cpi     'Y'             ;ACK?
+       jz      kermit          ;Yes, we are done.
+       cpi     'E'             ;Is it an error packet?
+       jnz     finsh1          ;Try sending the packet again.
+       call    error1          ;Print the error message.
+       jmp     kermit
+;\f
+;       This is the LOGOUT command.  It tells the remote KERSRV to logout.
+;       here from: kermit
+
+logout:        call    cfmcmd
+       call    logo            ;Send the logout packet.
+       jmp     kermit          ;Go get another command
+       jmp     kermit          ; whether we succeed or not.
+
+;       do logout processing.
+;       called by: bye, logout
+
+logo:  call    selmdm          ;[MF]Select modem
+       call    flsmdm          ;[MF]Flush buffers
+       call    selcon          ;[MF]Select keyboard again
+       xra     a
+       sta     numtry          ;Inititialize count.
+       mvi     a,'1'           ;Reset block check type to single character
+       sta     curchk          ; .  .  .
+
+logo1: lda     numtry          ;How many times have we tried?
+       cpi     maxtry          ;Too many times?
+       jm      logo3           ;No, try it.
+logo2: lxi     d,erms19        ;Say we couldn't do it.
+       call    prtstr
+       ret             ;Finished.
+
+logo3: inr     a               ;Increment the number of tries.
+       sta     numtry
+       xra     a
+       sta     argblk          ;Make it packet number zero.
+       mvi     a,1
+       sta     argblk+1        ;One piece of data.
+       lxi     h,data
+       mvi     m,'L'           ;Logout the remote host.
+       mvi     a,'G'           ;Generic command packet.
+       call    spack
+       jmp     logo2           ; Tell the user and die.
+       call    rpack           ;Get an acknowledgement
+       jmp     logo1           ; Go try again.
+       cpi     'Y'             ;ACK?
+       jz      rskp            ;Yes, we are done.
+       cpi     'E'             ;Is it an error packet?
+       jnz     logo1           ;Try sending the packet again.
+       call    error1          ;Print the error message.
+       ret             ;All done.
+;\f
+;       Packet routines
+
+;       Send_Packet
+;       This routine assembles a packet from the arguments given and sends it
+;       to the host.
+;
+;       Expects the following:
+;               A        - Type of packet (D,Y,N,S,R,E,F,Z,T)
+;               ARGBLK   - Packet sequence number
+;               ARGBLK+1 - Number of data characters
+;       Returns: nonskip if failure
+;                skip if success
+;       called by: read, rinit, rfile, rdata, sinit, sfile, sdata, seof, seot,
+;                  finish, logout, nak, ackp
+
+spack: sta     argblk+2
+       lxi     h,packet        ;Get address of the send packet.
+       lda     sndsop          ;[gnn] send start-of-pkt char.
+       mov     m,a             ;Put in the packet.
+       inx     h               ;Point to next char.
+       lda     curchk          ;Get current checksum type
+       sui     '1'             ;Determine extra length of checksum
+       mov     b,a             ;Copy length
+       lda     argblk+1        ;Get the number of data chars.
+       adi     ' '+3           ;Real packet character count made printable.
+       add     b               ;Determine overall length
+       mov     m,a             ;Put in the packet.
+       inx     h               ;Point to next char.
+       lxi     b,0             ;Zero the checksum AC.
+       mov     c,a             ;Start the checksum.
+       lda     argblk          ;Get the packet number.
+       adi     ' '             ;Add a space so the number is printable.
+       mov     m,a             ;Put in the packet.
+       inx     h               ;Point to next char.
+       add     c
+       mov     c,a             ;Add the packet number to the checksum.
+       mvi     a,0             ;Clear A (Cannot be XRA A, since we can't
+                               ; touch carry flag)
+       adc     b               ;Get high order portion of checksum
+       mov     b,a             ;Copy back to B
+       lda     argblk+2        ;Get the packet type.
+       mov     m,a             ;Put in the packet.
+       inx     h               ;Point to next char.
+       add     c
+       mov     c,a             ;Add the packet number to the checksum.
+       mvi     a,0             ;Clear A
+       adc     b               ;Get high order portion of checksum
+       mov     b,a             ;Copy back to B
+spack2:        lda     argblk+1        ;Get the packet size.
+       ora     a               ;Are there any chars of data?
+       jz      spack3          ; No, finish up.
+       dcr     a               ;Decrement the char count.
+       sta     argblk+1        ;Put it back.
+       mov     a,m             ;Get the next char.
+       inx     h               ;Point to next char.
+       add     c
+       mov     c,a             ;Add the packet number to the checksum.
+       mvi     a,0             ;Clear A
+       adc     b               ;Get high order portion of checksum
+       mov     b,a             ;Copy back to B
+       jmp     spack2          ;Go try again.
+
+spack3:        lda     curchk          ;Get the current checksum type
+       cpi     '2'             ;Two character?
+       jz      spack4          ;Yes, go handle it
+       jnc     spack5          ;No, go handle CRC if '3'
+       mov     a,c             ;Get the character total.
+       ani     0C0H            ;Turn off all but the two high order bits.
+                               ;Shift them into the low order position.
+       rlc             ;Two left rotates same as 6 rights
+       rlc             ; .  .  .
+       add     c               ;Add it to the old bits.
+       ani     3FH             ;Turn off the two high order bits.  (MOD 64)
+       adi     ' '             ;Add a space so the number is printable.
+       mov     m,a             ;Put in the packet.
+       inx     h               ;Point to next char.
+       jmp     spack7          ;Go store eol character
+
+;Here for 3 character CRC-CCITT
+
+spack5:        mvi     m,0             ;Store a null for current end
+       push    h               ;Save H
+       lxi     h,packet+1      ;Point to first checksumed character
+       call    crcclc          ;Calculate the CRC
+       pop     h               ;Restore the pointer
+       mov     c,e             ;Get low order half for later
+       mov     b,d             ;Copy the high order
+       mov     a,d             ;Get the high order portion
+       rlc             ;Shift off low 4 bits
+       rlc             ; .  .  .
+       rlc             ; .  .  .
+       rlc             ; .  .  .
+       ani     0FH             ;Keep only low 4 bits
+       adi     ' '             ;Put into printing range
+       mov     m,a             ;Store the character
+       inx     h               ;Point to next position
+
+;Here for two character checksum
+
+spack4:        mov     a,b             ;Get high order portion
+       ani     0FH             ;Only keep last four bits
+       rlc             ;Shift up two bits
+       rlc             ; . .  .
+       mov     b,a             ;Copy back into safe place
+       mov     a,c             ;Get low order half
+       rlc             ;Shift  high two bits
+       rlc             ;to low two bits
+       ani     03H             ;Keep only two low bits
+       ora     b               ;Get high order portion in
+       adi     ' '             ;Convert to printing character range
+       mov     m,a             ;Store the character
+       inx     h               ;Point to next character
+       mov     a,c             ;get low order portion
+       ani     3FH             ;Keep only six bits
+       adi     ' '             ;Convert to printing range
+       mov     m,a             ;Store it
+       inx     h               ;Bump the pointer
+
+spack7:        lda     dbgflg
+       ora     a               ; is debugging enabled?
+       jz      spack8
+       push    h               ; yes. save address of end of packet
+       mvi     m,0             ; null-terminate the packet for display
+       lda     quietd          ; a quiet display?
+       ana     a
+       jnz     spac7a          ; so dont say a thing
+       call    sppos           ; position cursor
+       lxi     h,packet+1      ; print the packet
+       call    dmptxt
+       lda     prnflg          ; is the printer on too?
+       ana     a
+       jz      spac7a
+       lxi     h,sstatm                ; print state
+       call    printm          ; dumptext but to printer
+       lda     state
+       mov     e,a
+       call    outprn
+       lxi     h,princr        ; cr lf to printer
+       call    printm
+       lxi     h,spackm
+       call    printm
+       lxi     h,packet+1
+       call    printm
+       lxi     h,princr
+       call    printm
+       lxi     h,princr
+       call    printm
+
+spac7a:        pop     h               ; restore address of end of packet
+spack8:        lda     seol            ;Get the EOL the other host wants.
+       mov     m,a             ;Put in the packet.
+       inx     h               ;Point to next char.
+       xra     a               ;Get a null.
+       mov     m,a             ;Put in the packet.
+;       Write out the packet.
+outpkt:        call    selmdm          ; Set up for output to comm port if iobyt
+       lda     spad            ;Get the number of padding chars.
+       sta     temp1
+outpk2:        lda     temp1           ;Get the count.
+       dcr     a
+       ora     a
+       jm      outpk6          ;If none left proceed.
+       sta     temp1
+       lda     spadch          ;Get the padding char.
+       call    setpar          ;Set parity appropriately
+       mov     e,a             ;Put the char in right AC.
+       call    outmdm          ;Output it.
+       jmp     outpk2
+
+outpk6:        lxi     h,packet        ; Point to the packet.
+outlup:        mov     a,m             ; Get the next character.
+       ora     a               ; Is it a null?
+       jz      outlud          ; If so return success.
+       call    setpar          ; Set parity for the character
+       mov     e,a             ; Put it in right AC
+       call    outmdm          ; and output it.
+; TAC trap: If this character is the TAC intercept character, and the TAC
+; trap is enabled, we have to output it twice.  If the TAC trap is enabled,
+; tacflg contains the intercept character.  (The current character cannot
+; be NUL, so we don't have to worry about doubling nulls in the message)
+       lda     tacflg          ; get current intercept character, or zero.
+       cmp     m               ; compare against current data character.
+       jnz     outpk8          ; if different, do nothing.
+       call    setpar          ; match. set appropriate parity,
+       mov     e,a             ;  put it in the right register,
+       call    outmdm          ;  and output it a second time.
+outpk8:
+       inx     h               ; Increment the char pointer.
+       jmp     outlup
+
+outlud:        call    selcon          ; select console
+       jmp     rskp            ; and return success
+;\f
+;       Receive_Packet
+;       This routine waits for a packet to arrive from the host.  It reads
+;       characters until it finds a SOH.  It then reads the packet into packet.
+;
+;       Returns:  nonskip if failure (checksum wrong or packet trashed)
+;          skip if success, with
+;               A        - message type
+;               ARGBLK   - message number
+;               ARGBLK+1 - length of data
+;       called by: rinit, rfile, rdata,
+;                  sinit, sfile, sdata, seof, seot, finish, logout
+
+rpack: call    inpkt           ;Read up to the end-of-line character
+       jmp     r               ; Return bad.
+rpack0:        call    getchr          ;Get a character.
+       jmp     rpack           ; Hit eol;null line;just start over.
+       lxi     h,rcvsop        ;[gnn] Is it receive start-of-pkt char.
+       cmp     m               ;[gnn]
+       jnz     rpack0          ; No, go until it is.
+rpack1:        call    getchr          ;Get a character.
+       jmp     r               ; Hit end of line, return bad.
+       lxi     h,rcvsop        ;[gnn] Is it receive start-of-pkt char.
+       cmp     m               ;[gnn]
+       jz      rpack1          ; Yes, then go start over.
+       sta     packet+1        ;Store in packet also
+       mov     c,a             ;Start the checksum.
+       lda     curchk          ;Get block check type
+       sui     '1'             ;Determine extra length of block check
+       mov     b,a             ;Get a copy
+       mov     a,c             ;Get back length character
+       sui     ' '+3           ;Get the real data count.
+       sub     b               ;Get total length
+       sta     argblk+1
+       mvi     b,0             ;Clear high order half of checksum
+       call    getchr          ;Get a character.
+       jmp     r               ; Hit end of line, return bad.
+       lxi     h,rcvsop        ;[gnn] Is it receive start-of-pkt char.
+       cmp     m               ;[gnn]
+       jz      rpack1          ; Yes, then go start over.
+       sta     argblk
+       sta     packet+2        ;Save also in packet
+       add     c
+       mov     c,a             ;Add the character to the checksum.
+       mvi     a,0             ;Clear A
+       adc     b               ;Get high order portion of checksum
+       mov     b,a             ;Copy back to B
+       lda     argblk
+       sui     ' '             ;Get the real packet number.
+       sta     argblk
+       call    getchr          ;Get a character.
+       jmp     r               ; Hit end of line, return bad.
+       lxi     h,rcvsop        ;[gnn] Is it receive start-of-pkt char.
+       cmp     m               ;[gnn]
+       jz      rpack1          ; Yes, then go start over.
+       sta     temp1           ;Save the message type.
+       sta     packet+3        ;Save in packet
+       add     c
+       mov     c,a             ;Add the character to the checksum.
+       mvi     a,0             ;Clear A
+       adc     b               ;Get high order portion of checksum
+       mov     b,a             ;Copy back to B
+       lda     argblk+1        ;Get the number of data characters.
+       sta     temp2
+       lxi     h,data          ;Point to the data buffer.
+       shld    datptr
+rpack2:        lda     temp2
+       sui     1               ;Any data characters?
+       jm      rpack3          ; If not go get the checksum.
+       sta     temp2
+       call    getchr          ;Get a character.
+       jmp     r               ; Hit end of line, return bad.
+       lxi     h,rcvsop        ;[gnn] Is it receive start-of-pkt char.
+       cmp     m               ;[gnn]
+       jz      rpack1          ; Yes, then go start over.
+       lhld    datptr
+       mov     m,a             ;Put the char into the packet.
+       inx     h               ;Point to the next character.
+       shld    datptr
+       add     c
+       mov     c,a             ;Add the character to the checksum.
+       mvi     a,0             ;Clear A
+       adc     b               ;Get high order portion of checksum
+       mov     b,a             ;Copy back to B
+       jmp     rpack2          ;Go get another.
+
+rpack3:        call    getchr          ;Get a character.
+       jmp     r               ; Hit end of line, return bad.
+       lxi     h,rcvsop        ;[gnn] Is it receive start-of-pkt char.
+       cmp     m               ;[gnn]
+       jz      rpack1          ; Yes, then go start over.
+       sui     ' '             ;Turn the char back into a number.
+       sta     temp3
+;Determine type of checksum
+
+       lda     curchk          ;Get the current checksum type
+       cpi     '2'             ;1, 2 or 3 character?
+       jz      rpack4          ;If zero, 2 character
+       jnc     rpack5          ;Go handle 3 character
+       mov     a,c             ;Get the character total.
+       ani     0C0H            ;Turn off all but the two high order bits.
+                               ;Shift them into the low order position.
+       rlc             ;Two left rotates same as six rights
+       rlc             ; .  .  .
+       add     c               ;Add it to the old bits.
+       ani     3FH             ;Turn off the two high order bits.  (MOD 64)
+       mov     b,a
+       lda     temp3           ;Get the real received checksum.
+       cmp     b               ;Are they equal?
+       jz      rpack7          ;If so, proceed.
+rpack9:        call    updrtr          ;If not, update the number of retries.
+       ret             ;Return error.
+
+;Here for three character CRC-CCITT
+
+rpack5:        lhld    datptr          ;Get the address of the data
+       mvi     m,0             ;Store a zero in the buffer to terminate packet
+       lxi     h,packet+1      ;Point at start of checksummed region
+       call    crcclc          ;Calculate the CRC
+       mov     c,e             ;Save low order half for later
+       mov     b,d             ;Also copy high order
+       mov     a,d             ;Get high byte
+       rlc             ;Want high four bits
+       rlc             ; .  .  .
+       rlc             ;And shift two more
+       rlc             ; .  .  .
+       ani     0FH             ;Keep only 4 bits
+       mov     d,a             ;Back into D
+       lda     temp3           ;Get first value back
+       cmp     d               ;Correct?
+       jnz     rpack9          ;No, punt
+       call    getchr          ;Get a character.
+       jmp     r               ; Hit end of line, return bad.
+       lxi     h,rcvsop        ;[gnn] Is it receive start-of-pkt char.
+       cmp     m               ;[gnn]
+       jz      rpack1          ; Yes, then go start over.
+       sui     ' '             ;Remove space offset
+       sta     temp3           ;Store for later check
+       ;...
+
+;Here for a two character checksum and last two characters of CRC
+
+rpack4:        mov     a,b             ;Get high order portion
+       ani     0FH             ;Only four bits
+       rlc             ;Shift up two bits
+       rlc             ; .  .  .
+       mov     b,a             ;Save back in B
+       mov     a,c             ;Get low order
+       rlc             ;move two high bits to low bits
+       rlc             ; .  .  .
+       ani     03H             ;Save only low two bits
+       ora     b               ;Get other 4 bits
+       mov     b,a             ;Save back in B
+       lda     temp3           ;Get this portion of checksum
+       cmp     b               ;Check first half
+       jnz     rpack9          ;If bad, go give up
+       call    getchr          ;Get a character.
+       jmp     r               ; Hit end of line, return bad.
+       lxi     h,rcvsop        ;[gnn] Is it receive start-of-pkt char.
+       cmp     m               ;[gnn]
+       jz      rpack1          ; Yes, then go start over.
+       sui     ' '             ;Remove space offset
+       mov     b,a             ;Save in safe place
+       mov     a,c             ;Get low 8 bits of checksum
+       ani     3FH             ;Keep only 6 bits
+       cmp     b               ;Correct value
+       jnz     rpack9          ;Bad, give up
+rpack7:        lhld    datptr
+       mvi     m,0             ;Put a null at the end of the data.
+       lda     temp1           ;Get the type.
+       jmp     rskp
+;\f
+;       inpkt - receive and buffer packet
+;       returns: nonskip if error (timeout)
+;               skip if success; packet starts at recpkt (which holds the SOH)
+;               and is terminated by a null.
+;               console is selected in either case.
+;       called by: rpack
+
+inpkt: lxi     h,recpkt        ;Point to the beginning of the packet.
+       shld    pktptr
+inpkt1:        call    inchr           ;Get first character
+       jmp     r               ;Return failure
+       lxi     h,rcvsop        ;[gnn] Is it receive start-of-pkt char.
+       cmp     m               ;[gnn]
+       jnz     inpkt1          ;if not, ignore leading junk
+       jmp     inpkt3          ;else go put it in packet
+
+inpkt2:        call    inchr           ;Get a character.
+       jmp     r               ; Return failure.
+       lxi     h,rcvsop        ;[gnn] Is it receive start-of-pkt char.
+       cmp     m               ;[gnn]
+       jnz     inpkt3          ;if not continue
+       lxi     h,recpkt        ;else throw away what we've got so far
+       shld    pktptr          ;
+inpkt3:        lhld    pktptr          ;
+       mov     m,a             ;Put the char in the packet.
+       inx     h
+       shld    pktptr
+       mov     b,a
+       lxi     d,-recpkx       ;Start over if packet buffer overflow
+       dad     d               ;
+       jc      inpkt           ;buffer overflow
+       lda     reol            ;Get the EOL char.
+       cmp     b
+       jnz     inpkt2          ;If not loop for another.
+;[gnn]                  ***  added by Godfrey Nix   Nottingham University ***
+;[gnn]                  to allow Kermit server to echo our packets back
+       lxi     h,recpkt+3      ;[gnn] point to packet type
+       lda     packet+3        ;[gnn] get the one we sent
+       cmp     m               ;[gnn] are they the same?
+       jz      inpkt           ;[gnn] yes, get another packet
+;[gnn]                  *** end of patch *****
+ ;...
+       ;...
+
+;Begin IBM change/fdc
+;This moved from OUTPK7 -- it appears that waiting until we're
+;ready to send a packet before looking for turnaround character
+;is long enough for it to get lost.  Better to look now.
+
+       lda     ibmflg          ;Is this the IBM?
+       ora     a
+       jz      inpkt6          ;If not then proceed.
+       lda     state           ;Check if this is the Send-Init packet.
+       cpi     'S'
+       jz      inpkt6          ;If so don't wait for the XON.
+inpkt5:        call    inchr           ;Wait for the turn around char.
+       jmp     inpkt6
+       cpi     xon             ;Is it the IBM turn around character?
+       jnz     inpkt5          ;If not, go until it is.
+inpkt6:        lhld    pktptr          ;Reload packet pointer
+;End IBM change/fdc.
+       dcx     h               ;Back up to end of line character
+       mvi     m,0             ;Replace it with a null to stop rpack:
+       call    selcon          ;We've got the packet. Return to console.
+
+       lda     dbgflg          ; Is debugging enabled?
+       ora     a
+       jz      inpkt7
+       inx     h               ; Point to next char.
+       lda     quietd          ; a quiet display?
+       ana     a
+       jnz     inpkt7          ; so dont say a thing
+       call    rppos           ; position cursor
+       lxi     h,recpkt+1      ; print the packet
+       call    dmptxt
+
+       lda     prnflg          ; is the printer on too?
+       ana     a
+       jz      inpkt7
+       lxi     h,rstatm                ; print state
+       call    printm          ; dumptext but to printer
+       lda     state
+       mov     e,a
+       call    outprn
+       lxi     h,princr        ; cr lf to printer
+       call    printm
+       lxi     h,rpackm
+       call    printm
+       lxi     h,recpkt+1
+       call    printm
+       lxi     h,princr
+       call    printm
+       lxi     h,princr
+       call    printm
+
+
+inpkt7:        lxi     h,recpkt
+       shld    pktptr          ;Save the packet pointer.
+       jmp     rskp            ;If so we are done.
+
+;       getchr - get next character from buffered packet.
+;       returns nonskip at end of packet.
+;       called by: rpack
+
+getchr:        lhld    pktptr          ;Get the packet pointer.
+       mov     a,m             ;Get the char.
+       inx     h
+       shld    pktptr
+       ora     a               ;Is it the null we put at the end of the packet?
+       jnz     rskp            ;If not return retskp.
+       ret             ;If so return failure.
+;\f
+;
+;       inchr - character input loop for file transfer
+;       returns: nonskip if timeout or character typed on console
+;                       (console selected)
+;               skip with character from modem in A (parity stripped
+;                       if necessary; modem selected)
+;               preserves bc, de, hl in either case.
+;       called by: inpkt
+
+inchr: push    h               ; save hl and bc
+       push    b
+       lhld    timout          ;Get initial value for timeout
+       shld    timval          ;[jd] 
+inchr0:        call    selmdm          ;select modem
+       call    inpmdm          ;Try to get a character from the modem
+       ora     a
+       jz      inchr2          ;if zero, nothing there.
+       mov     b,a
+       lda     parity          ;Is the parity none?
+       cpi     parnon
+       mov     a,b
+       jz      inchr1          ;If so just return.
+       ani     7FH             ;Turn off the parity bit.
+inchr1:        pop     b               ;restore registers
+       pop     h
+       jmp     rskp            ;take skip return, character in A
+
+inchr2:        call    selcon          ;select console
+       call    inpcon          ; Try to get a character from the console
+       ora     a
+       jz      inchr6          ;If not go do timer thing
+       cpi     cr              ;Is it a carriage return?
+       jz      inchr4          ;If so return
+       cpi     ('Z'-100O)      ;Control-Z?
+       jz      inchr5          ;Yes, go flag it
+       cpi     ('C'-100O)      ;Control-C?
+       jz      inchr7          ;re-enter, he wants to get out
+       cpi     ('X'-100O)      ;Control-X?
+       jnz     inchr6          ;No, ignore it. do timer thing.
+inchr5:        adi     100O            ;Convert to printing range
+       sta     czseen          ;Flag we saw a control-Z
+       jmp     inchr6          ;[MF] and do timer thing
+inchr4:        pop     b               ; restore registers
+       pop     h
+       ret             ;And return
+
+inchr6:        lda     timflg          ;[jd] pick up timer flag
+       ora     a               ;[jd] are we allowed to use timer?
+       jz      inchr0          ;[jd] no, don't time out
+       lhld    timval          ; decrement fuzzy time-out
+       dcx     h               ;
+       shld    timval          ;((timout-1) * loop time)
+       mov     a,h             ;(Retry if not time-out)
+       ora     l               ;
+       jnz     inchr0          ;
+       call    updrtr          ;Count as retry (?)
+       pop     b               ;restore registers
+       pop     h
+       ret             ;and return to do retry
+
+inchr7:        call    clrtop          ;[hh] clear screen and home cursor
+       lda     takflg          ;[MF]Take-file in progress?
+       ani     1               ;[MF]...
+       cnz     closet          ;[MF]Yes, close it and reset TAKE-flag
+                               ;[MF]so all processing is halted
+       jmp     kermit          ;[hh] then re-enter kermit
+
+;\f
+;       CRCCLC - Routine to calculate a CRC-CCITT for a string.
+;
+;       This routine will calculate a CRC using the CCITT polynomial for
+;       a string.
+;
+;       call with: HL/ Address of null-terminated string
+;       16-bit CRC value is returned in DE.
+;       Registers BC and HL are preserved.
+;
+;       called by: spack, rpack
+
+crcclc:        push    h               ;Save HL
+       push    b               ;And BC
+       lxi     d,0             ;Initial CRC value is 0
+
+crccl0:        mov     a,m             ;Get a character
+       ora     a               ;Check if zero
+       jz      crccl1          ;If so, all done
+       push    h               ;Save the pointer
+       xra     e               ;Add in with previous value
+       mov     e,a             ;Get a copy
+       ani     0FH             ;Get last 4 bits of combined value
+       mov     c,a             ;Get into C
+       mvi     b,0             ;And make high order zero
+       lxi     h,crctb2        ;Point at low order table
+       dad     b               ;Point to correct entry
+       dad     b               ; .  .  .
+       push    h               ;Save the address
+       mov     a,e             ;Get combined value back again
+       rrc             ;Shift over to make index
+       rrc             ; .  .  .
+       rrc             ; .  .  .
+       ani     1EH             ;Keep only 4 bits
+       mov     c,a             ;Set up to offset table
+       lxi     h,crctab        ;Point at high order table
+       dad     b               ;Correct entry
+       mov     a,m             ;Get low order portion of entry
+       xra     d               ;XOR with previous high order half
+       inx     h               ;Point to high order byte
+       mov     d,m             ;Get into D
+       pop     h               ;Get back pointer to other table entry
+       xra     m               ;Include with new high order half
+       mov     e,a             ;Copy new low order portion
+       inx     h               ;Point to other portion
+       mov     a,m             ;Get the other portion of the table entry
+       xra     d               ;Include with other high order portion
+       mov     d,a             ;Move back into D
+
+       pop     h               ;And H
+       inx     h               ;Point to next character
+       jmp     crccl0          ;Go get next character
+
+crccl1:        pop     b               ;Restore B
+       pop     h               ;And HL
+
+       ret             ;And return, DE=CRC-CCITT
+
+CRCTAB:        DW      00000H
+       DW      01081H
+       DW      02102H
+       DW      03183H
+       DW      04204H
+       DW      05285H
+       DW      06306H
+       DW      07387H
+       DW      08408H
+       DW      09489H
+       DW      0A50AH
+       DW      0B58BH
+       DW      0C60CH
+       DW      0D68DH
+       DW      0E70EH
+       DW      0F78FH
+
+CRCTB2:        DW      00000H
+       DW      01189H
+       DW      02312H
+       DW      0329BH
+       DW      04624H
+       DW      057ADH
+       DW      06536H
+       DW      074BFH
+       DW      08C48H
+       DW      09DC1H
+       DW      0AF5AH
+       DW      0BED3H
+       DW      0CA6CH
+       DW      0DBE5H
+       DW      0E97EH
+       DW      0F8F7H
+;\f
+;       This is where we go if we get an error during a protocol communication.
+;       error prints the error packet on line 6 or so, and aborts the
+;       transfer.
+;         called by: rinit, rfile, rdata, sinit, sfile, sdata, seof, seot
+;       error1 print CRLF followed by the error packet.
+;         called by: finish, logout
+;       error2 just prints the error packet.
+;       error3 positions cursor and prints error message specified in DE.
+;         called by: rinit, rfile, rdata, sinit, sfile, sdata, seof,
+;                    seot, parwrn, gofil, outbuf
+
+error: lda     quietd          ; a quiet display?
+       ana     a
+       jnz     error0          ; so dont say a thing
+       lda     remtxt          ;[MF]Doing a remote command?
+       ora     a               ;[MF]...
+       jnz     error0          ;[MF]Yes, don't position cursor
+       call    screrr          ;Position the cursor.
+error0:        mvi     a,'A'           ;Set the state to abort.
+       sta     state
+       jmp     error2
+
+error1:        lxi     d,crlf          ;Print a CRLF.
+       lda     quietd          ; a quiet display?
+       ana     a
+       jnz     error2          ; so dont say a thing
+               call    prtstr
+error2:        lda     argblk+1        ;Get the length of the data.
+       mov     c,a
+       mvi     b,0             ;Put it into BC
+       lxi     h,data          ;Get the address of the data.
+       dad     b               ;Get to the end of the string.
+       mvi     m,'$'           ;Put a dollar sign at the end.
+       lxi     d,data          ;Print error message
+       lda     remtxt          ;[MF]Doing a remote command?
+       ora     a               ;[MF]...
+       jnz     errr2a          ;[MF]Yes, print message, quiet or not!
+       lda     quietd          ; a quiet display?
+       ana     a
+       rnz             ; so dont say a thing
+errr2a:        call    prtstr
+       ret
+
+error3:        lda     quietd          ; a quiet display?
+       ana     a
+       rnz             ; so dont say a thing
+       lda     remtxt          ;[MF]Doing a remote command?
+       ora     a               ;[MF]...
+       jnz     err3a           ;[MF]Yes, don't position cursor
+       push    d               ;Save the pointer to the message.
+       call    screrr          ;Position the cursor.
+       pop     d               ;Get the pointer back.
+err3a: call    prtstr          ;Print error message
+       ret
+;\f
+;       Set up for file transfer.
+;       called by read, send.
+
+init:  lxi     d,version       ; point at Kermit's version string
+       lda     quietd          ; a quiet display?
+       ana     a
+       jnz     init1           ; so dont say a thing
+       call    sysscr          ; fix up screen
+init1: call    selmdm          ; select modem
+       call    flsmdm          ; purge any pending data
+       call    selcon          ; select console again.
+       ret
+
+;       Set state to ABORT
+;       called by: rinit, rfile, rdata, sinit, sfile, sdata, seof, seot,
+;                  nak, ackp
+
+abort: mvi     a,'A'           ;Otherwise abort.
+       sta     state
+       ret
+
+;       nak - send NAK packet
+;       here from: rinit, rfile, rdata
+;       nak0 - update retry count and send NAK packet
+;       here from: rinit, rfile, rdata, tryagn
+
+nak0:  call    updrtr          ;Update number of retries.
+nak:   lda     pktnum          ;Get the packet number we're waiting for.
+       sta     argblk
+       xra     a               ;No data.
+       sta     argblk+1
+       mvi     a,'N'           ;NAK that packet.
+       call    spack
+       jmp     abort           ; Give up.
+       ret             ;Go around again.
+
+;       increment and display retry count
+;       called by: rfile, sinit, sfile, sdata, seof, seot,
+;                  nak, rpack, inchr, tryagn
+
+updrtr:        lhld    numrtr
+       inx     h               ;Increment the number of retries
+       shld    numrtr
+       lda     remtxt          ;[MF]Doing a remote server command?
+       ora     a               ;[MF]...
+       rnz             ;[MF]Yes, keep mum
+       lda     quietd          ; a quiet display?
+       ana     a
+       rnz             ; so dont say a thing
+       call    scrnrt          ;Position cursor
+       lhld    numrtr          ;[MF]
+call   nout            ;Write the number of retries.
+       ret
+
+;       [jd] this routine prints parity warnings.  All registers are
+;       saved except for a.
+;       called by: sdata
+
+parwrn:        push    b
+       push    d
+       push    h
+       lxi     d,inms25
+       call    error3
+       pop     h
+       pop     d
+       pop     b
+       ret
+;[jd] end of addition
+
+;       print message in status field.  address of message is in DE.
+;       called by: read, send
+
+finmes:        lda     quietd          ; a quiet display?
+       ana     a
+       jz      finme0          ; so do usual stuff
+       push    d               ;[MF]Save pointer to completion message
+       call    prcrlf          ; best do a new line
+       pop     d               ;[MF]Restore completion message pointer
+       call    prtstr          ; and send message
+       mvi     e,space         ; send a space or two
+       mvi     c,dconio
+       push    b
+       push    d
+       call    bdos
+       pop     d
+       pop     b
+       call    bdos
+       ret             ; and exit back
+;
+;else for screaming screens...
+
+finme0:        push    d               ;Save message.
+       call    scrst           ;Position cursor
+       pop     d               ;Print the termination message
+       call    prtstr
+       ret             ; may not want this **************
+
+       mvi     c,4             ;[2] copy across user no and drive
+       lxi     h,kerm1         ;[2] as we have the text already
+finme1:        mov     e,m
+       push    h               ;[2] conout probably destroys these
+       push    b
+       call    conout
+       pop     b
+       pop     h
+       inx     h               ;[2] next character
+       dcr     c               ;[2] ah, but have we done?
+       jnz     finme1          ;[2] nope
+       lxi     d,spac15        ;[2] send 15 spaces (clears previous filename)
+       call    prtstr          ;[2]
+       call    scrend          ;Position cursor for prompt
+       ret
+
+;       Compare expected packet number against received packet number.
+;       return with flags set (Z = packet number valid)
+;       called by: rfile, rdata, sinit, sfile, sdata, seof, seot
+
+compp: lda     pktnum          ;Get the packet Nr.
+       mov     b,a
+       lda     argblk
+       cmp     b
+       ret
+
+;       Increment the packet number, modulo 64.
+;       called by: rinit, rfile, rdata, sinit, sfile, sdata, seof, seot
+
+countp:        inr     a               ;Increment packet Nr.
+       ani     3FH             ;Turn off the two high order bits
+       sta     pktnum          ;Save modulo 64 of number
+       lhld    numpkt
+       inx     h               ;Increment Nr. of packets
+       shld    numpkt
+       ret
+
+;       Send an ACK-packet
+;       called by: rfile, rdata, tryagn
+
+ackp:  xra     a
+       sta     numtry          ;Reset number of retries
+       sta     argblk+1        ;No data. (The packet number is in argblk)
+       mvi     a,'Y'           ;Acknowledge packet
+       call    spack           ;Send packet
+       jmp     abort
+       ret
+
+;       ?
+;       called with A/ current retry count
+;       called by: rfile, rdata
+
+tryagn:        inr     a               ;Increment it.
+       sta     oldtry          ;Save the updated number of tries.
+       lda     pktnum          ;Get the present packet number.
+       dcr     a               ;Decrement
+       ani     3FH             ; modulo 64
+       mov     b,a
+       lda     argblk          ;Get the packet's number
+       cmp     b               ;Is the packet's number one less than now?
+       jnz     nak0            ;No, NAK it and try again.
+       call    updrtr          ;Update the number of retries.
+       call    ackp
+       ret
+
+;       Output a null-terminated string to the console.  We assume that the
+;       console has been selected.  Called with HL = address of string.
+;       called by: spack, inpkt
+
+dmptxt:        mov     a,m             ; get character from string
+       ora     a
+       rz              ; done if null
+       push    h               ; save string address
+       mov     e,a             ; move character to E for outcon
+       call    outcon          ; output character to console
+       pop     h               ; restore string address
+       inx     h               ; point past printed character
+       jmp     dmptxt          ; go output rest of string
+
+
+;       Output a null-terminated string to the PRINTER  We assume that the
+;       console has been selected.  Called with HL = address of string.
+;       called by: spack, inpkt
+
+printm:        mov     a,m             ; get character from string
+       ora     a
+       rz              ; done if null
+       push    h               ; save string address
+       mov     e,a             ; move character to E for outcon
+       call    outprn          ; output character to printer
+       pop     h               ; restore string address
+       inx     h               ; point past printed character
+       jmp     printm          ; go output rest of string
+
+
+;\f
+;       test if character in A is the start of header character.  We get
+;       the start of packet character from sohchr, which can be SET
+tstsoh:        push    b               ; save these registers for a bit
+       mov     c,a             ; we have to test if this is the character
+       lda     sohchr
+       cmp     c               ; if zero, then it is
+       mov     a,c             ; restore accumulator but not flags
+       pop     b
+       ret             ; return with flags set
+;
+
+
+; Little code to allow some expansion of code without changing
+;  every futher address, only up to the end of this file.
+;   TO BE REMOVED FRO RELEASE!
+
+;      org ($+100h) AND 0FF00H
+
+
+IF lasm
+       LINK    CPSREM
+ENDIF;lasm
diff --git a/cpsrem.asm b/cpsrem.asm
new file mode 100644 (file)
index 0000000..2f480b9
--- /dev/null
@@ -0,0 +1,1149 @@
+; CPSREM.ASM
+;       KERMIT - (Celtic for "FREE")
+;
+;       This is the CP/M-80 implementation of the Columbia University
+;       KERMIT file transfer protocol.
+;
+;       Version 4.0
+;
+;       Copyright June 1981,1982,1983,1984
+;       Columbia University
+;
+; Originally written by Bill Catchings of the Columbia University Center for
+; Computing Activities, 612 W. 115th St., New York, NY 10025.
+;
+; Contributions by Frank da Cruz, Daphne Tzoar, Bernie Eiben,
+; Bruce Tanner, Nick Bush, Greg Small, Kimmo Laaksonen, Jeff Damens, and many
+; others. 
+;
+;       This file contains the (system-independent) routines that implement
+;       the REMOTE commands of the KERMIT protocol.
+;
+; revision history:
+;
+;edit 13, 21-Mar-1991 by MF. Renamed REMOTE SET FILE COLLISION REPLACE to
+;      REMOTE SET FILE COLLISION OVERWRITE and modified the corresponding
+;      help text slightly.
+;edit 12, 13-Feb-1991 by MF. Simplified code at "remcl0" to get REMOTE
+;      command arguments by calling "cmgtch" in order to get command-line
+;      characters directly. This means that command-line characters are
+;      passed literally (except for prefixingand space-compression) to the
+;      remote Kermit and that one need not send "?" or <esc> as "\"-prefixed
+;      octal numbers in order to avoid immediate action by CP/M Kermit.
+;edit 11, 30-Jan-1991 by MF. Corrected code to always require entry of at least
+;      one argument in the REMOTE COPY, REMOTE DELETE (REMOTE ERASE),
+;      REMOTE MESSAGE, REMOTE RENAME and REMOTE TYPE commands. This is
+;      done by branching to KERMT3 (the "not confirmed" code) if the
+;      first argument isn't given. This should correct a bug which occurred
+;      in numerous places in which the character immediately following
+;      that specifying the flavor of a Generic command was not defined if
+;      the first of multiple (at least two) arguments was left blank but
+;      subsequent arguments were not. This should correct a problem
+;      encountered by Russell Lang of Monash University In Australia when
+;      he did a REMOTE MESSAGE command with a blank first argument (the
+;      user id) and a nonblank second argument (the message text) from
+;      CP/M Kermit to Ms-Kermit in Server mode.
+;edit 10, 14-Dec-1990 by MF.  Put "<<>>" around "x" or "F" packet replies
+;      to REMOTE commands as in VMS Bliss Kermit and eliminate unnecessary
+;      instruction before label remc2d.
+;edit 9, 1-Nov-1990 by MF.  Changed REMOTE CWD to REMOTE CD in the quest for
+;      uniformity of nomenclature (per request of FDC).
+;edit 8, 29-Oct-1990 by MF.  Corrected Remote command code to properly
+;      prefix control characters (repeat prefix (~) isn't done in CP/M
+;      yet).
+;edit 7, 17-Oct-1990 by MF.  Changed verb "REMOTE SEND-MESSAGE" to
+;      "REMOTE MESSAGE" to conform with the nomenclature suggested in
+;      Chapter 10 of the 6th edition of the Kermit Protocol Manual.
+;edit 6, 10-Oct-1990 by MF.  Corrected Remote command code to
+;      properly prefix the control-character prefix character and the
+;      eighth-bit quotation prefix character.  Remote Set commands
+;      now function correctly.
+;      Also change the REMOTE SET FILE COLLISION ASK value to 5 per
+;      Kermit Digest V12 #6 (though I still have no idea how the local
+;      Kermit is supposed to answer).
+;edit 5, 5-Oct-1990 by MF.  Coded many Remote Set commands.
+;      The commands I have omitted deal with Attribute packets which
+;      don't make much sense on a CP/M system.
+;      Note also that for those Remote Set commands which take a
+;      numeric argument, no range-checking is done here.
+;      Also note that, for now, REMOTE SET FILE-COLLISION ASK is
+;      equivalent to REMOTE SET FILE-COLLISION DISCARD because
+;      (a) that's what the Kermit Digest indicated and (b) no mechanism
+;      has been proposed for the Remote Kermit to query the Local Kermit.
+;edit 4, 29-Sep-1990 by MF.  Corrected code to ignore error packets in
+;      response to sending an "I" packet, per KPROTO.DOC
+;edit 3, 9-Sep-1990 by MF.  Extensively revised this file to implement
+;      Remote commands except for the following:
+;      REMOTE JOURNAL, REMOTE MAIL, REMOTE PRINT, REMOTE PROGRAM,
+;      REMOTE SET, REMOTE VARIABLE.
+;edit 2 ... MF Dunno where edit 2 went (shown in Version string).
+; edit 1: September 8th, 1987.  Created this file from bits of the two packet files.
+;      The commands supported by this system are all the REMOTE commands,
+;      to allow users to acces remote host systems via Kermit.  Added REMOTE
+;      command table and REMOTE DIR command.
+;
+;
+remver:        db      'CPSREM.ASM (13)  21-Mar-1991$' ; name, edit number, date
+
+;
+;  REMOTE command - quite similar to the SET command
+remote:        call selmdm             ;Select modem
+       call    flsmdm          ;Flush buffers
+       call    selcon          ;Back to keyboard
+       lxi     d,remtab        ; remote commands table
+       lxi     h,remhlp        ; remote help table
+       call    keycmd          ; get result
+       xchg
+       pchl            ; and do it
+
+
+
+
+; REMOTE command table.  Works the same way as every other table etc.
+;
+remtab:        db      19              ; nineteen commands so far
+       db      2,'CD$'
+       dw      remcd           ; remote cd command
+       db      4,'COPY$'
+       dw      remcpy          ; remote copy command
+       db      6,'DELETE$'
+       dw      remdel          ; remote delete command
+       db      9,'DIRECTORY$'
+               dw      remdir  ; remote directory command
+       db      10,'DISK-USAGE$'
+       dw      remdsk          ; remote disk-usage command
+       db      5,'ERASE$'
+       dw      remdel          ; remote erase command (same as delete)
+       db      6,'FINISH$'
+               dw      finish  ; same as finish
+       db      4,'HELP$'
+       dw      remhep          ; remote help command
+       db      4,'HOST$'
+       dw      remhos          ; remote host command
+       db      6,'KERMIT$'
+       dw      remker          ; remote Kermit command
+       db      5,'LOGIN$'
+       dw      remlgi          ; remote login
+       db      6,'LOGOUT$'
+               dw      logout  ; same as logout
+       db      7,'MESSAGE$'
+       dw      remmsg          ; remote message command
+       db      6,'RENAME$'
+       dw      remren          ; remote rename
+       db      3,'SET$'
+       dw      remset          ; remote set command
+       db      5,'SPACE$'
+       dw      remdsk          ; remote space command (same as disk-usage)
+       db      6,'STATUS$'
+       dw      remsta          ; remote status (of server) command
+       db      4,'TYPE$'
+       dw      remtyp          ; remote type command
+       db      3,'WHO$'
+       dw      remwho          ; remote who command
+
+remhlp:        db      cr,lf,'CD - change default directory for remote server'
+       db      ' operations'
+       db      cr,lf,'COPY - copy files on a remote system'
+       db      cr,lf,'DELETE - delete files on a remote system'
+       db      cr,lf,'DIRECTORY - list a directory on a remote system'
+       db      cr,lf,'DISK-USAGE - show disk usage on a remote system'
+       db      cr,lf,'FINISH - stop a remote server'
+       db      cr,lf,'HELP - get help from a remote server'
+       db      cr,lf,'HOST - execute a command on a remote system'
+       db      cr,lf,'KERMIT - tell a remote server to execute a Kermit '
+               db      'command'
+       db      cr,lf,'LOGIN - send user-identification to a remote server'
+       db      cr,lf,'LOGOUT -  stop and logout a remote server'
+       db      cr,lf,'MESSAGE - send a message to a remote system user'
+       db      cr,lf,'RENAME - rename files on a remote system'
+       db      cr,lf,'SET - set remote server parameters'
+       db      cr,lf,'SPACE - show disk-usage on a remote system'
+       db      cr,lf,'STATUS - Get status of a remote server'
+       db      cr,lf,'TYPE - type files on a remote system'
+       db      cr,lf,'WHO - show current users on a remote system'
+       db      '$'
+
+
+;Description of remote commands
+
+;
+;  Packets start with an I packet in place of S/R packet.  An X
+;      packet is the same as an F (filename) packet except the 'file'
+;      is not applicable.  Copy X packet data field to display.  Set
+;      options so that no data is written to disk during D packets. 
+;      (REMTXT <> 0)
+;
+;Packets:
+;      we      we      comments
+;      send    receive
+;      I
+;              ACK
+;      Command packet
+;              Ack or
+;              Init
+;      ACK
+;              X       Dummy header.
+;      ACK
+;              D       listing from remote end
+;      ACK             We got it
+;      ....
+;      ACK             last packet received ok
+;              Z
+;      ACK
+;              B
+;      ACK             end of transaction.
+;
+;**Note** If the Remote system gives a simple ack to the command packet,
+;that is, a "short reply" is given, the data, if any, in the packet
+;is displayed and the transaction ends.  The outline shown above is for a
+;"long reply".
+;
+; Remote commands
+;
+; Remote Copy - Copy file(s) on remote system
+;
+remcpy:        lxi     h,newfms        ;Second argument prompt
+       shld    rprmpt          ;...
+       mvi     a,'K'           ;Generic type
+remcp0:        sta     remdat          ;into packet
+       mvi     a,2             ;Packet has at least two characters
+       sta     rdl             ;...
+       mvi     a,'G'           ;Generic command
+       sta     rcom            ;...
+       lxi     d,remdat+2      ;Point to data buffer
+       call    remcli          ;Get filespec (if any) from command line
+       ora     a               ;Anything typed?
+         jz    kermt3          ;No, we must have an argument
+       mov     b,a             ;Save length
+       adi     space           ;Yes, make encoded field length
+       sta     remdat+1                ;and store in packet data area
+       lda     rdl             ;Get packet length so far
+       add     b               ;Count answer length
+       sta     rdl             ;and remember new packet size
+       lhld    rprmpt          ;Point to "new file" prompt
+       xchg            ;...
+       shld    rptr            ;Save data pointer
+       call    prompt          ;Prompt the user
+       lhld    rptr            ;Get data pointer again
+       inx     h               ;Skip encoded field-length
+       xchg            ;...
+       call    remcli          ;get user's answer
+       lhld    rptr            ;Restore pointer
+       mov     c,a             ;Save answer length
+       adi     space           ;Convert to encoded field length
+       mov     m,a             ;Put length in packet
+       lda     rdl             ;Get accumulated data length
+       add     c               ;plus data length
+       adi     1               ;plus field length character
+       sta     rdl             ;and remember it
+       jmp     remcom          ;and branch to common code
+;
+; Remote Cd - Change Directory
+;
+remcd: lxi     h,pswdms        ;Second argument prompt
+       shld    rprmpt          ;...
+       mvi     a,'C'           ;Generic cd
+remcd0:        sta     remdat          ;into packet
+       mvi     a,1             ;Packet is at least one character long
+       sta     rdl             ;...
+       mvi     a,'G'           ;Generic command
+       sta     rcom            ;...
+       lxi     d,remdat+2      ;Point to data buffer
+       call    remcli          ;Get filespec (if any) from command line
+       mov     b,a             ;Save answer length (may be zero)
+       adi     space           ;Make encoded field length
+       sta     remdat+1                ;and store in packet data area
+       lda     rdl             ;Get length so far
+       add     b               ;Count answer length
+       adi     1               ;and field length character
+       sta     rdl             ;and remember current packet-size
+       lda     remdat          ;Get generic packet flavor
+       cpi     'C'             ;Remote CD?
+       jnz     remcd1          ;No
+       mov     a,b             ;Get length of possible directory spec
+       ora     a               ;Did the user give a directory spec?
+       jz      remcom          ;No, we can process the command immediately
+       mvi     a,0ffH          ;Yes, password follows, make it not echo
+       sta     cmqflg          ;...
+remcd1:        lhld    rprmpt          ;Point to "password" prompt
+       xchg            ;...
+       shld    rptr            ;Save data pointer
+       mvi     a,0ffH          ;Allow blank password
+       sta     cmbflg          ;...
+       call    prompt          ;Prompt the user
+       lhld    rptr            ;Restore data pointer
+       xchg            ;...
+       inx     d               ;and increment it
+       call    remcli          ;Get user's answer
+       ora     a               ;Password given?
+         jz    remcom          ;No, proceed with command
+       mov     c,a             ;Yes, save answer length
+       adi     space           ;Convert to encoded field length
+       lhld    rptr            ;Get data pointer
+       mov     m,a             ;Put length in packet
+       lda     rdl             ;Get accumulated data length
+       adi     1               ;Count encoded field length
+       add     c               ;plus data length
+       sta     rdl             ;and remember packet-size
+       jmp     remcom          ;Branch to common code
+;
+; Remote Delete (Erase) command
+;
+remdel:        mvi     a,'E'           ;Delete (Erase) command
+remdl0:        sta     remdat          ;...
+       mvi     a,1             ;At least one character in packet
+       sta     rdl             ;...
+       mvi     a,'G'           ;Generic command
+       sta     rcom            ;...
+       lxi     d,remdat+2      ;Point to data field
+       call    remcli          ;Get filespec
+       mov     b,a             ;Save length
+       lda     remdat          ;Get packet type
+       cpi     'E'             ;If Generic Delete
+       jz      remdl1          ;We must have an argument
+       cpi     'T'             ;Ditto for Generic Type
+       jz      remdl1          ;...
+       mov     a,b             ;Else get back character count
+       ora     a               ;Answer typed?
+         jz    remcom          ;No, process packet as is
+remdl1:        mov     a,b             ;Get character count again
+       ora     a               ;Anything typed?
+       jz      kermt3          ;No, we must have an argument (Delete/Type)
+       adi     space           ;Yes, encode field length
+       sta     remdat+1                ;and put in packet
+       lda     rdl             ;Get packet length so far
+       add     b               ;Count length of filespec
+       adi     1               ;Count field length character
+       sta     rdl             ;and store packet length
+       jmp     remcom          ;and do our stuff
+;
+; Remote Directory command
+;
+remdir:        mvi     a,'D'           ;generic directory command
+       jmp     remdl0          ;Do common code
+;
+; Remote Disk-usage (Space) command
+;
+remdsk:        mvi     a,'U'           ;Disk-usage generic command
+       jmp     remdl0          ;Do common code
+;
+; Remote Help command
+;
+remhep:        mvi     a,'H'           ;generic help command
+       jmp     remdl0          ;Do common code
+;
+; Remote Host command
+;
+remhos:        mvi     a,'C'           ;Remote Host command
+remho0:        sta     rcom            ;...
+       xra     a               ;Zero packet length
+       sta     rdl             ;...
+       lxi     d,remdat                ;Point to packet data buffer
+       call    remcli          ;Get host command
+       ora     a               ;Anything typed?
+       jz      kermt3          ;No, don't let the user get away with this
+       sta     rdl             ;Yes, store packet length
+       jmp     remcom          ;and do the command
+;
+; Remote Kermit command
+;
+remker:        mvi     a,'K'           ;Remote Kermit command
+       jmp     remho0          ;Do common code
+;
+; Remote Login command
+;
+remlgi:        mvi     a,'G'           ;Generic command
+       sta     rcom            ;...
+       mvi     a,'I'           ;Generic type
+       sta     remdat          ;into packet
+       mvi     a,1             ;At least one character in packet
+       sta     rdl             ;...
+       lxi     d,remdat+2      ;Point to data buffer
+       call    remcli          ;Get userid (if any) from command line
+       ora     a               ;Userid typed?
+         jz    remcom          ;No, nothing more to do
+       mov     b,a             ;Yes, save length
+       adi     space           ;Make encoded field length
+       sta     remdat+1                ;and store in packet data area
+       lda     rdl             ;Get packet length
+       add     b               ;Count id length
+       adi     1               ;and field length character
+       sta     rdl             ;and remember accumulated length
+       xchg            ;Save data pointer
+       shld    rptr            ;...
+       mvi     a,0ffH          ;Allow blank answers
+       sta     cmbflg          ;...
+       sta     cmqflg          ;Passwords don't echo
+       lxi     d,pswdms        ;Point to "password" prompt
+       call    prompt          ;Prompt the user
+       lhld    rptr            ;Get data pointer
+       xchg            ;Put in DE
+       inx     d               ;Skip encoded field-length
+       call    remcli          ;Get password, if any
+       ora     a               ;Anything typed?
+         jz    remcom          ;No, do command immediately
+       mov     c,a             ;Yes, save answer length
+       adi     space           ;Convert to encoded field length
+       lhld    rptr            ;Get pointer
+       mov     m,a             ;Put length in packet
+       lda     rdl             ;Get accumulated data length
+       adi     1               ;Count encoded field length
+       add     c               ;Count "password" field length
+       sta     rdl             ;and remember new packet length
+       xchg            ;Save data pointer
+       shld    rptr            ;...
+       xra     a               ;Allow echoing again for "account" field
+       sta     cmqflg          ;...
+       lxi     d,acctms        ;Point to "account" prompt
+       call    prompt          ;Prompt the user
+       lhld    rptr            ;Get data pointer
+       xchg            ;into DE
+       inx     d               ;Skip encoded field length
+       call    remcli          ;Get "account" field, if any
+       ora     a               ;Anything typed?
+         jz    remcom          ;No, do the command now
+       mov     c,a             ;Yes, save length of answer
+       adi     space           ;Convert to encoded field length
+       lhld    rptr            ;Get data pointer
+       mov     m,a             ;Put length in packet
+       lda     rdl             ;Get accumulated data length
+       adi     1               ;Count encoded field length
+       add     c               ;plus "account" length
+       sta     rdl             ;and remember it
+       jmp     remcom          ;Branch to common code
+;
+; Remote Rename command
+;
+remren:        lxi     h,newfms        ;Second argument prompt
+       shld    rprmpt          ;...
+       mvi     a,'R'           ;generic rename
+       jmp     remcp0          ;Do common code
+;
+; Remote Message command
+;
+remmsg:        lxi     h,msgms         ;Second argument prompt
+       shld    rprmpt          ;...
+       mvi     a,'M'           ;generic message
+       jmp     remcp0          ;Do common code
+;
+;Remote Set command
+;
+remset:        mvi     a,6             ;Packet data area has at least six chars
+       sta     rdl             ;...
+       mvi     a,'S'           ;Remote Set command
+       sta     remdat          ;...
+       mvi     a,'G'           ;It's a generic command
+       sta     rcom            ;...
+       mvi     a,'#'           ;Encoded field-length for SET type
+       sta     remdat+1        ;which is three chars long
+       lxi     d,rmstab        ;Point to Set command table
+       lxi     h,rmshlp        ;and the help table
+       call    keycmd          ;Find out which command is to be executed
+       xchg            ;Put dispatch address in HL
+       pchl            ;Go do the command
+;
+; Common code for Remote Set commands that take an argument
+;
+remscm:        lxi     d,remdat+6      ;We get an argument from the user
+       mvi     a,cmtxt         ;...
+       call    comnd           ;...
+       jmp     kermt3          ;Couldn't get one.
+       ora     a               ;Did the user give one?
+       jz      kermt3          ;a blank answer isn't acceptable
+       mov     c,a             ;Save length of answer
+       adi     space           ;Convert to encoded field-length
+       sta     remdat+5        ;and put in packet data area
+       lda     rdl             ;Get current data length
+       add     c               ;Count length of answer
+       sta     rdl             ;and store new data length
+       call    cfmcmd          ;Get a "confirm"
+       jmp     remcom          ;Do common Remote command code
+;
+; Common code for Remote Set commands requiring another table lookup
+;
+remsc1:        call    chkkey          ;Get user's selection
+       sta     remdat+6        ;and put into the packet data area
+       mvi     a,'!'           ;Encoded field length for 1 char
+       sta     remdat+5        ;Put in packet
+       lda     rdl             ;Get accumulated packet data length
+       adi     1               ;Count length of answer (1 char)
+       sta     rdl             ;and store as new packet data length
+       jmp     remcom          ;Go do common Remote command processing
+;
+; Remote Status (of server) command
+;
+remsta:        call    cfmcmd          ;Get return
+       mvi     a,'Q'           ;Command type (Server Status)
+       sta     remdat          ;...
+       mvi     a,'G'           ;Generic Kermit command
+       sta     rcom            ;...
+       mvi     a,1             ;1 character in packet
+       sta     rdl             ;...
+       jmp     remcom          ;Do common code
+;
+; Remote Type command
+;
+remtyp:        mvi     a,'T'           ;generic type command
+       jmp     remdl0          ;Do common code
+;
+; Remote Who command
+;
+remwho:        lxi     h,optms         ;Second argument prompt
+       shld    rprmpt          ;...
+       mvi     a,'W'           ;generic who
+       jmp     remcd0          ;Do common code
+
+; Common code for Remote commands
+;
+remcom:
+       mvi     a,0ffH          ; Make sure returned info is sent
+       sta     remtxt          ;to the user's screen rather than to a file
+       lda     rcom            ;Get packet-type
+       cpi     'G'             ;Is it a generic command?
+       jnz     remc0e          ;No, go clear the screen
+       lda     remdat          ;Yes, get generic command type
+       cpi     'S'             ;Is it a Remote Set command?
+       jz      remc0f          ;Yes, don't clear the screen
+remc0e:        call    clrtop          ; clear the screen
+remc0f:        xra     a
+       sta     numtry          ; reset retries
+       sta     czseen
+       sta     pktnum
+       lxi     h,0
+       shld    numpkt
+       shld    numrtr          ; clear some variables
+
+       mvi     a,'1'           ; reset block check type
+       sta     curchk
+remcm0:        mvi     a,'I'           ; init state
+       sta     state
+       call    sinit           ; do sendinit with I packet (??)
+       lda     state           ; now see if we are in the 'X' state
+       cpi     'X'
+       jz      remco0          ;Yup, all is in order
+       cpi     'A'             ;No, in abort state?
+       jnz     remcm0          ;No, try I-packet again
+       jmp     kermit          ;Yes, like Danny Boy, we must die.
+                               ;If we get this far, either the "I" packet
+                               ;was understood or the Server couldn't
+                               ;handle it and we ignored the error.
+                               ;In either case, we can proceed.
+
+
+
+remco0:        xra     a
+       sta     numtry          ; reset retries
+       sta     czseen
+       sta     pktnum
+       lxi     h,0
+       shld    numpkt
+       shld    numrtr          ; clear some variables
+       mvi     a,'1'           ;Make sure we use
+       sta     curchk          ;1-character checksum
+       lda     rdl             ;Get packet-length (number of bytes to copy)
+       ora     a               ;Anything to copy?
+         jz    remcm1          ;No
+       sta     temp1           ;Yes, save loop counter
+       lda     spsiz           ;Get max packet size
+       sui     5               ;less overhead
+       sta     temp2           ;gives max chars we can send
+       lxi     d,remdat                ;Copy from private buffer
+       lxi     h,data          ;to packet data area
+       lda     qbchr           ;Get eightgh-bit quoting prefix char
+       mov     b,a             ;Save it
+       lda     squote          ;Get control-char quoting char
+       mov     c,a             ;and save it
+remc0a:        lda     temp2           ;Get characters to go in packet
+       dcr     a               ;and decrement it
+       sta     temp2           ;...
+       jm      remc0x          ;We can't copy any more
+       ldax    d               ;Get a packet data character
+       cpi     space           ;Is it a control char?
+       jm      remc0b          ;Yes, quote it
+       cmp     c               ;Is it the control-char prefix?
+       jz      remc0b          ;Yes, quote it
+       lda     quot8           ;No, is eighth-bit quoting in effect?
+       ora     a               ;...
+       jz      remc0c          ;No, just copy the character
+       ldax    d               ;Get character again
+       cmp     b               ;Is it the eighth-bit quote char?
+       jnz     remc0d          ;No, just copy it
+remc0b:        mov     m,c             ;Yes, quote the character
+       inx     h               ;Increment the dest. pointer
+       lda     temp2           ;Get chars to go
+       dcr     a               ;Decrement
+       sta     temp2           ;...
+       jm      remc0x          ;Can't copy any more
+       lda     rdl             ;Count quote prefix
+       inr     a               ;...
+       sta     rdl             ;...
+remc0c:        ldax    d               ;Get character again
+       cpi     space           ;If not a control char,
+       jp      remc0d          ;just copy the character, else
+       adi     40H             ;Convert to printing character
+       ani     7fH             ;modulo 128
+remc0d:        mov     m,a             ;Copy the character
+       inx     h               ;Increment the pointers
+       inx     d               ;...
+remc0x:        lda     temp1           ;Get loop counter
+       dcr     a               ;and decrement it
+       sta     temp1           ;...
+       jnz     remc0a          ;Copy entire packet data area
+;
+remcm1:        xra     a
+       sta     argblk          ; set packet no zero
+       lda     rdl             ;Number of bytes in packet
+       sta     argblk+1        ;into argument block
+       lda     rcom            ;Remote command
+       call    spack           ;Send the packet
+       jmp     kermt3          ;Nogo, die!
+       jmp     remco2          ;Try to get an answer
+
+remco1:        call    nak0            ;Nak packet
+;
+
+remco2:        lda     numtry          ;Get number of retries
+       inr     a               ; update retries
+       cpi     maxtry          ;To many retries?
+       jm      remc2a          ;No
+       lxi     d,erms28        ;Yes, complain
+       call    prtstr          ;...
+       jmp     kermit          ;and abort
+
+remc2a:        sta     numtry
+       call    rpack           ;Get a packet
+       jmp     remco1          ;Couldn't get one.
+       cpi     'E'             ;Error packet?
+       jnz     remc2b          ;No
+       lda     rcom            ;What kind of packet did we send?
+       cpi     'G'             ;If it wasn't generic,
+       jnz     remc2f          ;there is no need to start a new message line
+       lda     remdat          ;Packet was generic
+       cpi     'S'             ;Was it a Remote Set?
+       cz      prcrlf          ;Yes, start a new line since the screen
+                               ;isn't blank and we would clobber the command-
+                               ;line otherwise
+remc2f:        call    error0          ;Yes, inform the user
+       jmp     kermit          ;and abort to main command loop
+remc2b:        cpi     'S'             ;Send-init?
+       jnz     remc2c          ;No
+       call    rini2a          ;Initialize parameters
+       lda     state           ;Get state
+       cpi     'A'             ;If abort,
+       jz      kermit          ;Go back to main command loop
+       mvi     a,'X'           ;Set state to text-display
+       sta     state           ;...
+       jmp     read2           ;Get more packets
+remc2c:        cpi     'N'             ;Nacked packet?
+       jz      remco2          ;Yes, try again
+       sta     state           ;Save packet type
+       call    selcon          ;Select Console
+       lxi     h,data          ;Point to data
+       lda     argblk+1        ;Anything in packet data?
+       ora     a               ;...
+       jz      remco6          ;No
+       push    h               ;Yes, save pointer
+       push    psw             ;and character count
+       mvi     e,'<'           ;Type "<<" as in VMSKermit
+       push    d               ;...
+       call    outcon          ;...
+       pop     d               ;...
+       call    outcon          ;...
+       pop     psw             ;Restore character counter
+       pop     h               ;and data pointer
+remc2d:        ora     a               ;...
+       jz      remc2e          ;No more characters
+       dcr     a               ;Decrement loop counter
+mov    e,m             ;Get character
+       inx     h               ;Increment pointer
+       push    psw             ;Save loop counter
+       push    h               ;Save data pointer
+       call    outcon          ;Type on Console
+       pop     h               ;Restore pointer
+       pop     psw             ;Restore loop counter
+       jmp     remc2d          ;Type all packet data
+remc2e:        mvi     e,'>'           ;Type ">>" as in VMSKermit
+       push    d               ;...
+       call    outcon          ;...
+       pop     d               ;...
+       call    outcon          ;...
+       call    prcrlf          ;End the line
+remco6:        lda     state           ;Get packet type again
+       cpi     'Y'             ;If simple ack,
+       jz      kermit          ;Done, else
+       call    ackp            ;Acknoledge the packet
+       call    countp          ;Count the packet
+       mvi     a,'D'           ;Set to data-receive
+       sta     state           ;...
+       jmp     read2           ; do the same as read a file, but echo
+                               ; to the screen.. Dont close non-open files.
+;
+;
+;REMCLI - Get command-line for Remote commands
+;
+remcli:        xra     a               ;Zero accumulated length
+       sta     rcl             ;...
+       mov     b,a             ;[12]...
+;
+;[MF][12]Eliminate following code which calls "comnd" in favor of code which
+;[MF][12]calls "cmgtch" directly so that characters are sent without
+;[MF][12]alteration or inadvertent action ("?" or <esc>). The only thing
+;[MF][12]lost is the ability to produce any ASCII character via
+;[MF][12]octal numbers prefixed with "\" but this isn't used much in remote
+;[MF][12]commands anyway.
+;
+;remcl0:       mvi     a,cmtxt         ;We get arbitrary text
+;      call    comnd           ;from the command-line
+;      jmp     kermt3          ;We couldn't get any.
+;      ora     a               ;Anything given?
+;      jz      remcl1          ;No, done
+;      push    b               ;Save BC
+;      mov     c,a             ;Save length
+;      lda     rcl             ;Get accumulated length
+;      add     c               ;plus current word length
+;      adi     1               ;plus a space
+;      sta     rcl             ;and save accumulated length
+;      mvi     a,space         ;Put in a space separator
+;      stax    d               ;...
+;      inx     d               ;Increment pointer
+;      pop     b               ;Restore BC
+;      jmp     remcl0          ;Get text to end-of-line
+;remcl1:       lda     rcl             ;Get accumulated length
+;      ora     a               ;Anything typed?
+;      rz              ;No
+;      dcr     a               ;Yes, don't count final space
+;      push    psw             ;Save count
+;      dcx     d               ;Point to final space
+;      xra     a               ;Zap it
+;      stax    d               ;...
+;      pop     psw             ;Restore count
+;
+;[MF][12]Simplified code follows
+;
+remcl0:        call    cmgtch          ;[12]Get a character from the user
+       ani     7fh             ;[12]Turn off minus bit
+       cpi     cr              ;[12]If end-of-line,
+       jz      remclx          ;[12]We're done
+       cpi     lf              ;[12]...
+       jz      remclx          ;[12]...
+       stax    d               ;[12]else store the character
+       inr     b               ;[12]and count it
+       inx     d               ;[12]Increment character buffer pointer
+       cpi     esc             ;[12]is character an <esc>?
+       jz      remcl2          ;[12]Yes
+       cpi     ff              ;[12]an <ff>?
+       jz      remcl1          ;[12]Yes, diddle command buffer pointer
+       cpi     '?'             ;[12]a "?"?
+       jnz     remcl0          ;[12]No, just get more characters
+remcl1:        push    h               ;[12]Protect HL
+       lhld    cmdptr          ;[12]get "cmgtch"'s character pointer
+       inx     h               ;[12]and reverse the action at "cmgtc4"
+                               ;[12]since we don't need a "confirm" and
+                               ;[12]infinite loops are beaucoup bad news
+       shld    cmdptr          ;[12]...
+       pop     h               ;[12]Restore HL
+remcl2:        push    psw             ;[12]Save the character
+       xra     a               ;[12]Zero the action flag so we get input
+       sta     cmaflg          ;[12]to end-of-line without special action
+       pop     psw             ;[12]Restore the character
+       jmp     remcl0          ;[12]Get more characters
+remclx:        mov     a,b             ;[12]Get accumulated text length
+       sta     rcl             ;[12]and remember it
+;
+       ret             ;Return
+;
+;Remote set values
+;
+;  REMOTE SET FILE TYPE                    300   0 = TEXT, 1 = BINARY
+;  REMOTE SET FILE NAMES                   301   0 = CONVERTED, 1 = LITERAL
+;  REMOTE SET FILE COLLISION               302   0 = RENAME,  1 = OVERWRITE,
+;                                                2 = BACKUP,  3 = APPEND,
+;                                                4 = DISCARD, 5 = ASK
+;  REMOTE SET FILE REPLACE                 303   0 = PRESERVE, 1 = DEFAULT
+;  REMOTE SET FILE INCOMPLETE              310   0 = DISCARD, 1 = KEEP
+;  REMOTE SET INCOMPLETE (same as above)
+;  REMOTE SET BLOCK-CHECK                  400   number (1, 2, or 3)
+;  REMOTE SET RECEIVE PACKET-LENGTH        401   number (10-9024)
+;  REMOTE SET RECEIVE TIMEOUT              402   number (any, 0 = no timeout)
+;  REMOTE SET RETRY                        403   number (any, 0 = no limit)
+;  REMOTE SET SERVER TIMEOUT               404   number (any, 0 = no timeout)
+;REMOTE SET FILE BLOCKSIZE       311  number
+;REMOTE SET FILE RECORD-LENGTH   312  number
+;REMOTE SET FILE RECORD-FORMAT   313  F (fixed), V (variable), etc...
+;This is just for the record, to assign these numbers to these commands
+;for somebody who needed them.  Details to be filled in later.
+;
+;Remote Set command table
+;
+rmstab:        db      7               ;seven entries
+       db      16,'BLOCK-CHECK-TYPE$'
+       dw      remsbc          ;Remote Set Block Check
+       db      4,'FILE$'
+       dw      remsfl          ;Remote Set File
+       db      10,'INCOMPLETE$'
+       dw      remsfi          ;Remote Set (file) Incomplete
+       db      7,'RECEIVE$'
+       dw      remsrc          ;Remote Set Receive
+       db      7,'REPLACE$'
+       dw      remsfr          ;Remote Set (file) Replace
+       db      5,'RETRY$'
+       dw      remsry          ;Remote Set Retry
+       db      14,'SERVER-TIMEOUT$'
+       dw      remsst          ;Remote Set Server Timeout
+;
+rmshlp:        db      cr,lf,'BLOCK-CHECK-TYPE for a remote server'
+       db      cr,lf,'FILE parameters for a remote server'
+       db      cr,lf,'INCOMPLETE file disposition for a remote server'
+       db      cr,lf,'RECEIVE parameters for a remote server'
+       db      cr,lf,'REPLACE file attribute handling for a remote server'
+       db      cr,lf,'RETRY maximum for a remote server'
+       db      cr,lf,'SERVER-TIMEOUT interval for a remote server'
+       db      '$'
+;
+;Remote Set File tables
+;
+rsftab:        db      8               ;eight entries
+       db      10,'BLOCK-SIZE$'
+       dw      remsbs          ;Remote Set File Block-size command
+       db      9,'COLLISION$'
+       dw      remsfc          ;Remote Set File Collision command
+       db      10,'INCOMPLETE$'
+       dw      remsfi          ;Remote Set File Incomplete command
+       db      5,'NAMES$'
+       dw      remsfn          ;Remote Set File Names command
+       db      13,'RECORD-FORMAT$'
+       dw      remsrf          ;Remote Set File Record-format
+       db      13,'RECORD-LENGTH$'
+       dw      remsrl          ;Remote Set File Record-length
+       db      7,'REPLACE$'
+       dw      remsfr          ;Remote Set File Replace command
+       db      4,'TYPE$'
+       dw      remsft          ;Remote Set File Type command
+;
+rsfhlp:        db      cr,lf,'BLOCK-SIZE of files for a remote server'
+       db      cr,lf,'COLLISION action on filename conflicts for a remote'
+       db      ' server'
+       db      cr,lf,'INCOMPLETE file disposition for a remote server'
+       db      cr,lf,'NAMES translation of files for a remote server'
+       db      cr,lf,'RECORD-FORMAT of files for a remote server'
+       db      cr,lf,'RECORD-LENGTH for a remote server'
+       db      cr,lf,'REPLACE file attribute handling for a remote server'
+       db      cr,lf,'TYPE of files for a remote server'
+       db      '$'
+;
+;Remote Set File Record-format tables
+;
+rcftab:        db      2               ;two entries
+       db      5,'FIXED$'
+       db      'F','F'         ;Remote Set File Record-format Fixed command
+       db      8,'VARIABLE$'
+       db      'V','V'         ;Remote Set File Record-format Variable cmd
+;
+rcfhlp:        db      cr,lf,'FIXED    VARIABLE'
+       db      '$'
+;
+;Remote Set Receive tables
+;
+rrctab:        db      2               ;two entries
+       db      13,'PACKET-LENGTH$'
+       dw      remrpl          ;Remote Set Receive Packet-length command
+       db      7,'TIMEOUT$'
+       dw      remsrt          ;Remote Set Receive Timeout command
+;
+rrchlp:        db      cr,lf,'PACKET-length    TIMEOUT'
+       db      '$'
+;
+;Remote Set File-collision table
+;
+rfctab:        db      6               ;six entries
+       db      6,'APPEND$'
+       db      '3','3'         ;Set collision append
+       db      3,'ASK$'
+       db      '5','5'         ;Set collision ask
+       db      6,'BACKUP$'
+       db      '2','2'         ;Set collision backup
+       db      7,'DISCARD$'
+       db      '4','4'         ;Set collision discard
+       db      9,'OVERWRITE$'
+       db      '1','1'         ;Set collision overwrite
+       db      6,'RENAME$'
+       db      '0','0'         ;Set collision rename
+;
+rfchlp:        db      cr,lf,'ASK about existing files on a remote system'
+       db      cr,lf,'APPEND to existing files on a remote system'
+       db      cr,lf,'BACKUP (rename) existing files on a remote system'
+       db      cr,lf,'DISCARD new versions of existing files on a'
+       db      ' remote system'
+       db      cr,lf,'OVERWRITE existing files on a remote system'
+       db      cr,lf,'RENAME new versions of existing files on a'
+       db      ' remote system'
+       db      '$'
+;
+;Remote Set File-Incomplete tables
+;
+rfitab:        db      2               ;2 entries
+       db      7,'DISCARD$'
+       db      '0','0'         ;Remote Set File Incomplete Discard
+       db      4,'KEEP$'
+       db      '1','1'         ;Remote Set File Incomplete Keep
+;
+rfihlp:        db      cr,lf,'DISCARD  KEEP'
+       db      '$'
+;
+;Remote Set File-Names tables
+;
+rfntab:        db      2               ;two entries
+       db      9,'CONVERTED$'
+       db      '0','0'         ;Remote Set File Names Converted
+       db      7,'LITERAL$'
+       db      '1','1'         ;Remote Set File Names Literal
+;
+rfnhlp:        db      cr,lf,'CONVERTED        LITERAL'
+       db      '$'
+;
+;Remote Set File Replace tables
+;
+rfrtab:        db      2               ;two entries
+       db      8,'PRESERVE$'
+       db      '0','0'         ;Remote Set File Replace Preserve
+       db      7,'DEFAULT$'
+       db      '1','1'         ;Remote Set File Replace Default
+;
+rfrhlp:        db      cr,lf,'PRESERVE DEFAULT'
+       db      '$'
+;
+;Remote Set File Type tables
+;
+rfttab:        db      2               ;two entries
+       db      6,'BINARY$'
+       db      '1','1'         ;Remote Set File Type Binary
+       db      4,'TEXT$'
+       db      '0','0'         ;Remote Set File Type Text
+;
+rfthlp:        db      cr,lf,'BINARY   TEXT'
+       db      '$'
+;
+; Remote Set Block-check
+;
+remsbc:
+IF lasm
+       lxi     h,'40'          ;1st 2 chars of "400"
+ENDIF ;lasm
+IF NOT lasm
+       lxi     h,'04'
+ENDIF ;NOT lasm
+       shld    remdat+2        ;Store in correct order
+       mvi     a,'0'           ;Put last char of type in buffer
+       sta     remdat+4        ;...
+       lxi     d,blktab        ;Point to block-check table
+       lxi     h,blkhlp        ;and help table
+       jmp     remsc1          ;Do common code
+;
+;Remote Set File command
+;
+remsfl:        lxi     d,rsftab        ;Point to Remote Set File tables
+       lxi     h,rsfhlp        ;...
+remsf0:        call    keycmd          ;Get user's selection
+       xchg            ;Put dispatch address in HL
+       pchl            ;and obey the user's most fervent desires
+;
+;Remote Set Receive command
+;
+remsrc:        lxi     d,rrctab        ;Point to the appropriate tables
+       lxi     h,rrchlp        ;...
+       jmp     remsf0          ;and do command
+;
+;Remote Set Block-size command
+;
+remsbs:
+IF lasm
+       lxi     h,'31'          ;1st 2 chars of Set code
+ENDIF ;lasm
+IF NOT lasm
+       lxi     h,'13'
+ENDIF ;NOT lasm
+       shld    remdat+2        ;Store chars in correct order
+       mvi     a,'1'           ;Put last char in buffer
+       sta     remdat+4        ;...
+       jmp     remscm          ;and do common Remote Set code
+;
+;Remote Set File-collision command
+;
+remsfc:
+IF lasm
+       lxi     h,'30'          ;Put set type code in buffer
+ENDIF ;lasm
+IF NOT lasm
+       lxi     h,'03'
+ENDIF ;NOT lasm
+       shld    remdat+2        ;...
+       mvi     a,'2'           ;...
+       sta     remdat+4                ;...
+       lxi     d,rfctab        ;Point to tables
+       lxi     h,rfchlp        ;...
+       jmp     remsc1          ;and do common code
+;
+;Remote Set File Incomplete command
+;
+remsfi:
+IF lasm
+       lxi     h,'31'          ;Establish command keyword code
+ENDIF ;lasm
+IF NOT lasm
+       lxi     h,'13'
+ENDIF ;NOT lasm
+       shld    remdat+2        ;...
+       mvi     a,'0'           ;...
+       sta     remdat+4        ;...
+       lxi     d,rfitab        ;Point to tables
+       lxi     h,rfihlp        ;...
+       jmp     remsc1          ;and do common code
+;
+;Remote Set File-Names command
+;
+remsfn:
+IF lasm
+       lxi     h,'30'          ;Set command code
+ENDIF ;lasm
+IF NOT lasm
+       lxi     h,'03'
+ENDIF ;NOT lasm
+       shld    remdat+2        ;...
+       mvi     a,'1'           ;...
+       sta     remdat+4        ;...
+       lxi     d,rfntab        ;Point to the appropriate tables
+       lxi     h,rfnhlp        ;...
+       jmp     remsc1          ;and do common code
+;
+;Remote Set File Record Format command
+;
+remsrf:
+IF lasm
+       lxi     h,'31'          ;Set command code
+ENDIF ;lasm
+IF NOT lasm
+       lxi     h,'13'
+ENDIF ;NOT lasm
+       shld    remdat+2        ;...
+       mvi     a,'3'           ;...
+       sta     remdat+4        ;...
+       lxi     d,rcftab        ;Point to proper tables
+       lxi     h,rcfhlp        ;...
+       jmp     remsc1          ;and do common code
+;
+;Remote Set File Record Length command
+;
+remsrl:
+IF lasm
+       lxi     h,'31'          ;Set command code
+ENDIF ;lasm
+IF NOT lasm
+       lxi     h,'13'
+ENDIF ;NOT lasm
+       shld    remdat+2        ;...
+       mvi     a,'2'           ;...
+       sta     remdat+4        ;...
+       jmp     remscm          ;and do common code
+;
+;Remote Set File Replace command
+;
+remsfr:
+IF lasm
+       lxi     h,'30'          ;Set command code
+ENDIF ;lasm
+IF NOT lasm
+       lxi     h,'03'
+ENDIF ;NOT lasm
+       shld    remdat+2        ;...
+       mvi     a,'3'           ;...
+       sta     remdat+4        ;...
+       lxi     d,rfrtab        ;Point to tables
+       lxi     h,rfrhlp        ;...
+       jmp     remsc1          ;and do common code
+;
+;Remote Set File Type command
+;
+remsft:
+IF lasm
+       lxi     h,'30'          ;Set command code
+ENDIF ;lasm
+IF NOT lasm
+       lxi     h,'03'
+ENDIF ;NOT lasm
+       shld    remdat+2        ;...
+       mvi     a,'0'           ;...
+       sta     remdat+4        ;...
+       lxi     d,rfttab        ;Point to tables
+       lxi     h,rfthlp        ;...
+       jmp     remsc1          ;and go to common code
+;
+;Remote Set Receive Packet-length command
+;
+remrpl:
+IF lasm
+       lxi     h,'40'          ;Set command code
+ENDIF ;lasm
+IF NOT lasm
+       lxi     h,'04'
+ENDIF ;NOT lasm
+       shld    remdat+2        ;...
+       mvi     a,'1'           ;...
+       sta     remdat+4        ;...
+       jmp     remscm          ;and do common code
+;
+;Remote Set Receive Timeout command
+;
+remsrt:
+IF lasm
+       lxi     h,'40'          ;Set code
+ENDIF ;lasm
+IF NOT lasm
+       lxi     h,'04'
+ENDIF ;NOT lasm
+       shld    remdat+2        ;...
+       mvi     a,'2'           ;...
+       sta     remdat+4        ;...
+       jmp     remscm          ;and do common code
+;
+;Remote Set Retry command
+;
+remsry:
+IF lasm
+       lxi     h,'40'          ;Set code
+ENDIF ;lasm
+IF NOT lasm
+       lxi     h,'04'
+ENDIF ;NOT lasm
+       shld    remdat+2        ;...
+       mvi     a,'3'           ;...
+       sta     remdat+4        ;...
+       jmp     remscm          ;Go to common code
+;
+;Remote Set Server Timeout command
+;
+remsst:
+IF lasm
+       lxi     h,'40'          ;Set code
+ENDIF ;lasm
+IF NOT lasm
+       lxi     h,'04'
+ENDIF ;NOT lasm
+       shld    remdat+2        ;...
+       mvi     a,'4'           ;...
+       sta     remdat+4        ;...
+       jmp     remscm          ;Do common code
+
+
+
+
+
+; Little code to allow some expansion of code without changing
+;  every futher address, only up to the end of this file.
+;   TO BE REMOVED FOR RELEASE
+
+;      ORG     ($+100H) AND 0FF00H
+
+
+IF lasm
+       LINK    CPSSER          
+ENDIF  ;lasm
diff --git a/cpsser.asm b/cpsser.asm
new file mode 100644 (file)
index 0000000..d49ebe0
--- /dev/null
@@ -0,0 +1,44 @@
+; CPSSER.ASM
+;       KERMIT - (Celtic for "FREE")
+;
+;       This is the CP/M-80 implementation of the Columbia University
+;       KERMIT file transfer protocol.
+;
+;       Version 4.0
+;
+;       Copyright June 1981,1982,1983,1984
+;       Columbia University
+;
+; Originally written by Bill Catchings of the Columbia University Center for
+; Computing Activities, 612 W. 115th St., New York, NY 10025.
+;
+; Contributions by Frank da Cruz, Daphne Tzoar, Bernie Eiben,
+; Bruce Tanner, Nick Bush, Greg Small, Kimmo Laaksonen, Jeff Damens, and many
+; others. 
+;
+;       This file contains the (system-independent) routines that implement
+;       the SERVER part of the KERMIT protocol.
+;
+; revision history:
+;
+;
+; edit 1: September, 1987.  Created CPSSER.ASM from bits from the two CPSPK?
+;      files.  
+;      The code herein is to allow remote systems to communicate to 
+;      this Kermit running in SERVER mode.  Note that not every server 
+;      command will be supported, mind...
+;
+server:        db      'CPSSER.ASM (1)  8-SEP-87$'     ; name, edit number, date
+
+
+
+; Little code to allow some expansion of code without changing
+;  every futher address, only up to the end of this file.
+;   TO BE REMOVED FOR RELEASE!
+
+;      org ($+100h) AND 0FF00H
+
+
+IF lasm
+       LINK    CPSTT
+ENDIF;lasm
diff --git a/cpstt.asm b/cpstt.asm
new file mode 100644 (file)
index 0000000..41a30af
--- /dev/null
+++ b/cpstt.asm
@@ -0,0 +1,862 @@
+; CPSTT.ASM
+;       KERMIT - (Celtic for "FREE")
+;
+;       This is the CP/M-80 implementation of the Columbia University
+;       KERMIT file transfer protocol.
+;
+;       Version 4.0
+;
+;       Copyright June 1981,1982,1983,1984,1985
+;       Columbia University
+;
+; Originally written by Bill Catchings of the Columbia University Center for
+; Computing Activities, 612 W. 115th St., New York, NY 10025.
+;
+; Contributions by Frank da Cruz, Daphne Tzoar, Bernie Eiben,
+; Bruce Tanner, Nick Bush, Greg Small, Kimmo Laaksonen, Jeff Damens, and many
+; others. 
+;
+;       This file contains the code for the TRANSMIT and CONNECT commands,
+;       which communicate with a host which is not running KERMIT.
+;
+; revision history:
+;
+;edit 12, 31-Jan-1991 by MF. Delete call to "inbuf" after "xmit1" in
+;      the TRANSMIT command. "getfil" initializes various counters so that
+;      when "in1chr" is first called, "inbuf" will be called immediately
+;      and will read sectors of the file to be transmitted from disk.
+;      This, along with a fix to "in1chr" in CPSUTL.ASM, fixes a bug
+;      discovered by Lance Tagliapietra of the University of Wisconsin at
+;      Platteville wherein the TRANSMIT command was failing to transmit some
+;      characters in files over one sector in length. See CPSUTL.ASM,
+;      edit 29.
+; edit 11, 10 September, a987, by OBSchou.  Modified TRANSMIT command
+;      to TRANSMIT <file> <string>
+;
+; edit 10, 27 August, 1987 by OBSchou.  Fixed bugs in Transmit, but I may
+;      be introducing problems for IBM/CMS or half duplex systems.  What
+;      does this combination do??
+;
+; edit 9 30 March, 1987 by OBSchou to replace the TRANSMIT routine.
+;      Syntax is now TRANSMIT file after a previous 
+;      INPUT <wait time> <string to wait for>
+;
+; edit 8 19 June, 1986 by OBSchou.  Modified the interupt testing routine
+;       to see if the command was a 'D' (Drop the line), in which case also
+;       do a 'C', ie disconnect.  This is really a little too much of a
+;       system dependent thing.
+;       For now, Ill leave it here, and possibly move it later.
+;
+; edit 7 30 May 1986 OBSchou.  Moved xon/xoff control (ie XON/OFF sent to host)
+;       out to CPSUTL so that ther printer routine can use it too.
+;
+; edit 6 30 April, 1986 by OBSchou.
+;       Fixed transmit bug, so as soon as the protocol character is 
+;       received from the host is received then another line is sent.
+;       added in a comchr (ds 1) to save the character read from the comm 
+;       line in prtchr, and is restored in a on return.
+;
+; edit 5 7 March, 1986 by OBSchou Loughborough University.  
+;       Need to save the E register before calling outmdm (in CPSSYS.ASM)
+;       if doing Half duplex.  Push/pop DE should sort this problem
+;
+; edit 4: 13-Jan-85 by Vanya J.Cooper Pima Commun. College Tel: 602-884-6809
+;
+;pcc002 28-Dec-84       modules:cp4tt,cp4utl
+;       Add connect mode <esc>P command to toggle printer on
+;       and off.  Conflicts with "official" recommended commands
+;       in protocol manual, but I don't think CP/M will ever get
+;       a PUSH command.
+;
+;pcc003-pcc005  2-Jan-85        vjc     modules:cp4mit,cp4tt,cp4utl
+;       These edits must all be installed together and change the way
+;       logging is handled.  The log file spec is moved to a separate
+;       fcb, and not opened until an actual CONNECT command is given.
+;       This takes care of a NASTY bug that if you used any other file
+;       command between the LOG and CONNECT, the log file would get
+;       written over the last file used.  This also allows logging to
+;       be "permanently" enabled until an CLOSE (new command) for all
+;       CONNECT sessions, like most other kermits do.  If a log file
+;       already exists, it will be appended to.  Also add two new
+;       CONNECT mode commands <esc>Q to suspend logging and <esc>R to
+;       resume.  <esc>R means something else during TRANSMIT, but
+;       logging is never on then, so there shouldn't be any conflict.
+;       I also changed the write code, so that it can handle one more
+;       character after the XOFF is send to stop the host.  This allows
+;       a little "slop" for systems that don't stop immediately (such
+;       as TOPS10), but it didn't help much.
+;
+;pcc008 2-Jan-85        vjc     modules:cp4def,cp4tt,cp4utl
+;       Keyboard input during CONNECT mode can get locked out if
+;       there is enough input from the modem port to keep prtchr
+;       busy.  This can happen for example, if the printer is running
+;       at the same speed as the modem line, leaving you helpless to
+;       turn it off or abort the host.  Add a fairness count, so that
+;       at least every prfair characters we look at console input.
+;
+;pcc012 4-Jan-85        vjc     modules:cp4mit,cp4tt,cp4utl
+;       Use the big buffer for the log file.  Move the log file back
+;       into the common fcb and only save the drive, name, and
+;       extension between connects.  Add new routines to cp4utl to
+;       create or append to an existing file, and to conditionally
+;       advance buffers only if in memory.  Remove edit pcc003 that
+;       allows one more character after the xoff, since it didn't
+;       really work very well and does not fit in well with the way
+;       the buffer advancing routines are set up.  If someone still
+;       thinks this would be useful, it could be put back in with a
+;       little more work.
+;       
+;       While testing this edit, I also noticed another bug that
+;       the command parsing routines do not limit or check the
+;       length of command lines or file specs, trashing what ever
+;       comes after them.  Currently because of where the fcb and
+;       command buffer are located, this does not usually cause a
+;       problem, but could if an extremely long line was typed in,
+;       or in the future multiple fcbs defined elsewhere in memory
+;       were used.  Maybe this should be put on the bug list
+;       somewhere.
+;
+; edit 3: July 27, 1984
+;       Allow assembly with LASM: to CP4TT is linked by CP4PKT, and links
+;       to CP4CPM; remove exclamation points so as not to confuse LASM.
+;       Add Toad Hall TACtrap to TRANSMIT command (TAC intercept character
+;       is only doubled if it's data; when typed by the user, they're not
+;       automatically doubled)
+;
+; edit 2: June 7, 1984
+;       formatting and documentation; add module version number; make sure
+;       console is selected when leaving intchr.
+;
+; edit 1: May, 1984
+;       extracted from CPMBASE.M80 version 3.9; modifications are described
+;       in the accompanying .UPD file.
+
+ttver: db      'CPSTT.ASM  (12) 31-Jan-1991$'
+
+;       This is the TRANSMIT command.  It attempts to send a file, even
+;       though there is no KERMIT on the other side.
+;       here from: kermit
+;
+; [OBS] I have replaced the routine, so that TRANSMIT <filename> <wait string>
+; will send a line at a time to the host in a manner similar to MSKERMIT
+;
+;
+xmit:  mvi     a,cmofi         ;Parse an input file spec (non-wild).
+       lxi     d,fcb           ;Give the address for the FCB.
+       call    comnd
+       jmp     kermit          ;Give up on bad parse.
+;
+       lxi     d,stbuff        ; where to put the string
+       mvi     a,cmtxt         ; get text
+       call    comnd
+       jmp     kermit          ; not quite correct...
+       sta     strcnt          ; string count returned in a
+       ana     a               ; if its zero, make it 1 character (CR)
+       jnz     xmit0
+       mvi     a,1
+       sta     strcnt
+       mvi     a,cr
+       sta     stbuff
+;
+xmit0: call    cfmcmd
+       call    getfil          ;Open file.
+       cpi     0FFH            ;Succeed?
+       jnz     xmit1
+       lxi     d,erms15
+       call    prtstr          ;Display error msg.
+       jmp     kermit
+
+;
+; New TRANSMIT routine - transmit a file, line by line, to a remote host
+;      waiting each time for one or more characters to be returned
+;      as a remote host prompt.  It could be as simple as a CR or LF
+;      character.  Repeat until the complete file has been sent, then
+;      close the transmitted file, and drop into the connect state so the
+;      user can tidy up at the host end.
+;get the file to send, open it up, and read first sector from disk
+
+xmit1: lxi     d,inms19        ; say we are send a file to the host
+       call    prtstr
+
+       xra     a
+       sta     repcnt          ; clear the host prompt chars. counter 
+       sta     starc           ; clear star count
+;[MF][12]Delete the following call to "inbuf" as the call to "getfil"
+;[MF][12]above will have initialized counters and flags so that when
+;[MF][12]"in1chr" is called, "inbuf" will be called immediately and will
+;[MF][12]immediately read from disk. Counters and flags will then be
+;[MF][12]properly set up to read all characters of the file to be
+;[MF][12]transmitted.
+;      call    inbuf           ; read one sector from disk
+;      jmp     xmtex           ; exit if error
+
+
+xmt10: xra     a               ; clear retransmit flag and count etc
+       sta     rexbfl          ; retransmit flag (1=> retransmit)
+       sta     rexcnt          ; character counter
+
+xmt1:  call    xmt1ch          ; send a character
+       ani     7fh             ; strip any parity
+       cpi     cr              ; have we reached the end of the line
+       jnz     xmt1            ; nope, loop around again
+
+; Now wait for a string back from the host.  Compare with STRING buffer
+;
+       xra     a               ; clear the character count
+       sta     rexcnt
+;
+       call    selcon          ; sent a line, send a star to console
+       mvi     e,'*'
+       call    outcon
+       lda     starc           ; update star count
+       inr     a
+       sta     starc
+       cpi     60              ; sent 60 stars?
+       jnz     xmt1a           ; nope...
+       xra     a
+       sta     starc
+       call    prcrlf
+xmt1a:
+
+xmt3:  lda     eoflag          ; have we hit end of file?
+       ana     a
+       jnz     xmtex           ; yup, so quit.
+       xra     a
+       sta     repcnt          ; clear the host prompt chars.counter
+xmt2:  call    rd1chl          ; read a character from the line
+       ani     7fh             ; set flags
+       jnz     xmt4            ; Not zero => we have a character from host
+       call    ckchr           ; see if *WE* have a character from console
+       push    psw             ; restore to modem
+       call    selmdm
+       pop     psw
+       ani     7fh             ; stip parity (should not be there)
+       jnz     xmt2a           ; if a null, try again
+       lda     strcnt          ; if the string length is zero, dont wait.
+       ana     a
+       jz      xmt1            ; so loop back again
+       jmp     xmt4            ; else test for xon/off and incomming string
+
+xmt2a: cpi     cntlc           ; do we want to abort?
+       jz      xmtex           ; in which case drop through to connect mode
+       cpi     cntlz           ; if control z exit back to command loop
+       jnz     xmt2b           ; else try for other characters
+       lxi     d,fcb           ; close file before exiting to command loop
+       mvi     c,closf
+       call    bdos
+       jmp     kermit
+
+xmt2b: cpi     cr              ; a cr => resend last line
+       jnz     xmt2            ; nope, then ignore it
+       mvi     a,1
+       sta     rexbfl          ; else we want to resend the line.
+       jmp     xmt1
+
+xmt4:  jmp     xmt6            ; skit xoff test for now...*****************
+
+       cpi     xoff            ; xoff from host?
+       jnz     xmt6
+xmt5:  call    rd1chl          ; else see if XOFF comming
+       ani     7fh
+       jnz     xmt6            ; assume an xoff
+       call    ckchr           ; anything at console?
+       push    psw
+       call    selmdm
+       pop     psw
+       ani     7fh
+       cpi     cntlc           ; control-c == abort & play terminal
+       jz      xmtex
+       ana     a               ; anything else?
+       jz      xmt5            ;loop again
+
+xmt6:  mov     e,a             ; save it for a while
+       lda     repcnt          ; see if this character matches with one in buffer
+       lxi     h,stbuff        ; point to string buffer
+       add     l               ; make hl = hl + a
+       mov     l,a
+       mvi     a,0
+       adc     h
+       mov     h,a             ; not using xra, as that clears the Carry flag
+       mov     a,e             ; get the character back again
+       cmp     m               ; is it = to what we expect?
+       jnz     xmt3            ; no, clear counter and try again
+       lda     repcnt          ; yes, then update the pointer, and ...
+       inr     a               ; ... see if we have received all ...
+       sta     repcnt          ; ... we should have received
+       mov     e,a             ; save length into E again
+       lda     strcnt          ; get the length to compare
+       sub     e               ; if (e) > string length, we have it
+       jz      xmt10           ; so send next line (clear counters etc)
+       jmp     xmt2            ; else wait for a little longer
+
+
+;
+; Routine below sends a character to the line.  It sends up to a CR, and then
+;      it waits for a reply.  This routine is called from xmt1, so if at 
+;      end of file, return.  Then XMT1 will drop through
+;      to connect.
+xmt1ch:        ; send a character from the xmtbuf to the line
+       call    selmdm          ; just in case it uses it
+       lda     eoflag          ; have we hit end of file
+       ana     a               ; set flags
+       jnz     xmt1c1          ; no, so dont...
+       mvi     a,cr            ; load up a carriage return
+xmt1c1:        call    get1xc          ; get the character to send
+       cpi     lf              ; dont send line feeds
+;      jz      xmt1c1
+       cpi     cntlz           ; if control z, then we are at end of the file
+       jz      xmtex           ; so close the file and drop into telcon
+       cpi     20h             ; control character?
+       jp      xmt11           ; no, so ok
+       cpi     cr              ; cr, and tabs ok to send
+       jz      xmt11
+       cpi     tab
+       jz      xmt11
+       jmp     xmt1c1          ; else try for another character
+
+xmt11: call    setpar          ; else set parity etc
+       push    psw             ; we want to keep this for a while
+       mov     e,a             ; we need character in e
+       call    outmdm
+       pop     psw             ; restore the character we sent
+       mov     e,a             ; now, if a TAC is set on..
+       lda     tacflg
+       ana     a               
+       mov     a,e             ; (return must have sent character in a)
+       jz      xmt1c2          ; test for xon/off
+       lda     tacchr          ;... get the tac character
+       cmp     e               ; do we send it again?
+       jnz     xmt1c2          ; test for xon/off
+       push    psw             ; save character for return. Already set E...
+       call    outmdm
+       pop     psw
+
+xmt1c2:        ret
+
+get1xc:        ; get a character from the sector or re-transmit buffer read 
+;      into a.  Read a new sector if we run out.
+;
+; First, see if we do a retransmit
+       lda     rexbfl
+       ana     a               ; if zero, a genuine line
+       jz      get1x1
+; have to retransmit a line
+       lxi     h,rexbuf
+       lda     rexcnt          ; add counter to buffer base
+       mvi     d,0
+       mov     e,a
+       dad     d
+       inr     a               ; update pointer
+       sta     rexcnt
+       mov     a,m             ; get next character to send
+       ret                     ; and exit
+
+get1x1:        call    in1chr          ; get a character from the file. 
+       mov     c,a             ; save it to the retransmit buffer
+       lda     rexcnt
+       mov     e,a
+       mvi     d,0
+       lxi     h,rexbuf
+       dad     d               ; point to next position
+       inr     a
+       sta     rexcnt          ; update the character pointer
+       mov     a,c             ; restore character to a
+       mov     m,c             ; get character to c
+       ret
+
+
+
+; read a character from the line.
+rd1chl:        
+       call    selmdm          ; select the modem
+       call    inpmdm          ; get input from the modem
+       ani     7fh             ; strip parity
+                               ; may UPPERCASE-ify if case sensitivity off
+       ret                     ; return to caller
+
+;  End of transmit routine.  Close input file name, and say we are dropping
+;  throught to telnet.  Note that if eof not found, it is assumed that
+;  this is the ABORT exit.
+
+xmtex:
+       lxi     d,fcb           ; close the transmitted file
+       mvi     c,closf
+       call    bdos
+       call    selcon          ; make sure we are talking to the console
+
+       lda     eoflag          ; end of file or abort exit?
+       lxi     d,inms22        ; assume eof...
+       ana     a
+       jz      xmtex1
+       lxi     d,inms29        ; we were wrong, its an abort.
+xmtex1:        jmp     telnt1          ; and drop through to connect mode
+                               ; telnet does the printing
+
+
+
+;\f
+;   telnet - the CONNECT command.
+;       here from: kermit
+;   telnt1 - entry to connect mode from TRANSMIT command
+;       here from: xend
+
+telnet:        call    cfmcmd
+       lxi     d,infms7        ;Output start of message
+; enter here from TRANSMIT command.
+telnt1:        call    prtstr
+       call    escpr           ;Print the escape char.
+       lxi     d,infms8        ;Output some more of the message
+       call    prtstr
+       call    escpr           ;Print the escape char again.
+       lxi     d,inms8a        ;Print the remainder of the message
+       call    prtstr
+       call    syscon          ;do system-dependent stuff
+       lda     logflg          ;[pcc005] Want a log?
+       ora     a               ;[pcc005]
+       cnz     logopn          ;[pcc005] Open if so
+
+chrlup:        call    prtchr          ;See if char at port (send to console).
+       call    conchr          ;See if char at console (send to port).
+       jmp     kermit          ;requested to end session - go to command loop.
+       jmp     chrlup          ;Go do it again.
+;\f
+;
+;       prtchr - copy characters from comm line to console
+;       returns: nonskip, console selected.
+;       called by: xnext, rexmit, telnet
+;
+
+prtchr:        call    selmdm          ; select modem port
+       call    inpmdm          ; try to get a character from it
+       push    psw             ; restore to console
+       call    selcon          ; select console
+       pop     psw             ; restore the (possible character) read
+       ora     a               ; test character
+       jnz     prtch0          ; if non-zero, process it.
+       sta     prtcnt          ;[pcc008] zero out prt fairness count
+       ret                     ; return.
+
+prtch0:        ani     7FH             ; drop parity bit.
+       sta     comchr          ;[6] save it in case we need it again
+       lda     vtflg           ;[9] get the vt52 emulation flag
+       cpi     vtdefe          ;[9] are we doing external emulation?
+       lda     comchr          ;[9] collect character again
+       jz      extern          ;[9] jup, go do it.
+
+       ana     a               ; set flags.  it may be a null
+       jz      prtchr          ; ignore null (filler)
+       cpi     del             ; ignore delete, too
+       jz      prtchr
+       cpi     xon             ;Is it an XON?
+       jz      prtxon          ;yes
+       cpi     xoff            ;Is it an XOFF?
+       jz      prtxof          ;yes
+       mov     e,a             ;Set the char aside.
+       lda     vtflg           ;Get the VT52 emulation flag.
+       cpi     vtdefv          ;Is the flag set for VT52 (ie 1)
+                               ;0 = none
+                               ;1 = VT52
+                               ;2 = external
+                               ;3 = dumb (traps non printing chars)
+                               ;0ffh not possible by local code (Will change)
+       jnz     prtch1          ;If not, don't do this stuff.
+       lda     escflg          ;Get the escape flag.
+       ora     a               ;Are we working on an escape sequence?
+       jz      prtch2          ;If not, continue.
+       call    vt52            ;If so, work on it some more
+       jmp     prtchr          ;try for more characters.
+
+prtch2:        mov     a,e             ;normal text.
+       cpi     esc             ;Is the char an escape?
+       jnz     prtch1          ;If not skip on.
+       mvi     a,1
+       sta     escflg          ;Set the escape flag: escape seen.
+       jmp     prtchr          ;Get another char...
+
+prtch1:        cpi     vtdefe          ; are we doing external emulation?
+       jnz     prtch3          ; assume we continue on
+       lxi     h,extern+1      ; get address of external emulator
+       mov     a,h             ; se if address = 0 (not implemented)
+       ora     l
+       jz      prtch3          ; not external, assume we just carry on
+       pchl                    ; go do external emulation.  RET back to caller
+
+prtch3:        cpi     vtdefd          ; are we trapping all non printing characters?
+       jnz     prtch4          ; nope, something else
+       lda     comchr          ; Dumb terminal.  Lets test the character
+       cpi     cr              ; cr then ok
+       jz      prtch4          ; its ok
+       cpi     lf              ; lf then ok
+       jz      prtch4
+       cpi     tab
+       jz      prtch4          ; assume tabs are expanded
+       cpi     space           ; if less than 20H ignore it
+       rm                      ; return if a control character
+
+prtch4:        call    sysflt          ; ok to print this character (in E)?
+       ora     a
+       jz      prtchr          ; no, skip it.
+       lda     logflg          ;Get the log flag.
+       cpi     81H             ;[pcc003] Are we logging
+       cz      logit           ;[pcc003] Do so if needed
+       call    selcon          ; select console
+       lda     prnflg          ;Get Print parallel flag
+       ora     a
+       cnz     outlpt          ; output to printer if flag set
+       call    outcon          ; output to console.
+       lxi     h,prtcnt        ;[pcc008] point to prt fairness count
+       inr     m               ;[pcc008] bump
+       mov     a,m             ;[pcc008] get it in a
+       cpi     prfair+1        ;[pcc008] time to be fair?
+       jm      prtchr          ;[pcc008] no, go around again.
+       mvi     m,0             ;[pcc008] reset count
+       lda     comchr          ;[6] restore that character read from comm line
+       ret                     ;[pcc008] and return
+
+; I don't think we want to print xon/xoff - this should be
+; flow control only across the link between us and the host.
+; (besides, IBM host xon's don't make sense to most micros)
+; remember xon/xoff state in xofflg (zero = xon, non-zero = xoff)
+prtxon:        xra     a               ;Yes, reset XOFF flag
+prtxof:        sta     xofflg
+       jmp     prtchr          ; look for another character
+;\f;[pcc005] Log file routines
+
+;[pcc005]
+;    logopn - open the log file
+;       Open the log file and append to it if it already exists
+;       or create one if not.
+
+logopn:        
+       mvi     a,ctrlz         ;[9] ignore control-z in log files
+       cmp     e               ;[9] well, was it?
+       rz                      ;[9] yes, to ignore it.
+       lxi     h,lognam        ;[pcc012] copy name
+       lxi     d,fcb           ;[pcc012] to fcb
+       lxi     b,12            ;[pcc012] 12 bytes
+       call    mover           ;[pcc012] copy it
+       call    appfil          ;[pcc012] open file for appending
+       jmp     logerr          ;[pcc012] error
+       lxi     h,logflg        ;[pcc005] point to log flag
+       mvi     a,80H           ;[pcc005] file open flag
+       ora     m               ;[pcc005] or in contents of logflg
+       mov     m,a             ;[pcc005] and store back
+       lxi     d,inms28        ;[pcc005] assume logging is on
+       cpi     81H             ;[pcc005] check
+       jz      prtstr          ;[pcc005] print msg if true
+       lxi     d,inms27        ;[pcc005] no, must be suspended
+       jmp     prtstr          ;[pcc005] print and return
+
+;
+;       logit - output character in E to log file.
+;       we assume the host recognizes xon/xoff. (we probably shouldn't)
+;       modem port is selected.
+;       preserves de
+;       called by: prtchr
+
+logit: lxi     h,chrcnt        ;[pcc012] point to buffer count
+       dcr     m               ;[pcc012] and decrement
+       jp      logit1          ;[pcc012] continue if ok
+       push    d               ;[pcc012] save de
+       call    outadv          ;[pcc012] advance buffer if in memory
+       call    logwrt          ;[pcc012] sigh, time to write to disk
+       pop     d               ;[pcc012] restore de
+       lda     logflg          ;[pcc012] get logging flag
+       ora     a               ;[pcc012] Did we quit because of an error
+       rz                      ;[pcc012] return now if so
+logit1:        lhld    bufpnt          ;[pcc012] get buffer pointer
+       mov     m,e             ;Store the char.
+       inx     h
+       shld    bufpnt
+       ret                     ;[pcc012] and return
+
+;[pcc012]
+;  logwrt - write to log file with XON/XOFF since it may take a while.
+
+logwrt:        call    sndxoff         ;[7] send and xoff to host
+       call    outbuf          ;[pcc012] output the buffer and advance
+       call    logerr          ;[pcc005] quit if error
+       call    sndxon          ;[send an xon to host
+       ret                     ;[pcc012]
+
+;[pcc005]
+;       logcls - Close the log file and reset the flag
+
+logcls:        lxi     d,infms6        ;[pcc005] Tell user we are closing file.
+       call    prtstr          ;[pcc005]
+       call    clofil          ;[pcc012] and do it
+       jmp     logerr          ;[pcc005] jump if error
+       lxi     h,logflg        ;[pcc005] point to flag
+       mov     a,m             ;[pcc005] get it
+       ani     7FH             ;[pcc005] clear the open bit
+       mov     m,a             ;[pcc005] and store back
+       ret                     ;[pcc005]
+
+;[pcc005]
+;    logerr - here on a variety of logging errors
+;       just close the file and disable logging
+;       called from logopn,logptr,logcls
+
+logerr:        lxi     d,erms22        ;[pcc005] Error message
+       call    prtstr          ;[pcc005] print it
+       mvi     c,closf         ;[pcc005] Close the file.
+       lxi     d,fcb           ;[pcc012]
+       call    bdos            ;[pcc005] 
+       xra     a               ;[pcc005] clear logflg
+       sta     logflg          ;[pcc005] so don't try again
+       ret                     ;[pcc005]
+;\f
+;
+;       VT52 emulation.
+;       called by: prtchr
+;       A/ contents of escflg (guaranteed non-zero)
+;       E/ current character
+;       modem is selected.
+;
+vt52:  cpi     1               ; first character after escape?
+       jnz     vt52y           ; no, must be doing cursor positioning.
+;
+;       E contains the character that followed the escape.
+;       valid characters are:
+;       A - cursor up
+;       B - cursor down
+;       C - cursor right
+;       D - cursor left
+;       F - enter graphics mode (hard to do on a non-vt52)
+;       G - exit graphics mode
+;       H - home
+;       I - reverse linefeed
+;       J - erase to end of screen
+;       K - erase to end of line
+;       Y - cursor positioning leadin
+;       Z - identify terminal as VT52
+;       [ - enter hold-screen mode (not supported)
+;       \ - exit hold-screen mode (not supported)
+;       > - enter alternate-keypad mode? (not supported)
+;       = - exit alternate-keypad mode? (not supported)
+;
+;       Invalid sequences are handled as the VT52 does - the escape and
+;       the following character are swallowed, never to be seen again.
+;       For <esc>E, the translation table may contain just '$' (no action),
+;       or may be used as clear-and-home, as in the Heath/Zenith H19.
+;
+       mov     a,e             ; get the second character of the sequence.
+       cpi     'Y'             ; if cursor lead-in handle it.
+       jnz     vt52a           ; if not, go on.
+       mvi     a,2             ; state = 2: row follows.
+       sta     escflg          ; update the flag.
+       ret                     ; back for another character
+
+vt52a: cpi     'Z'             ; VT52 ID query?
+       jz      vt52id          ; yes. claim to be one.
+       cpi     'A'             ;Less than an 'A'?
+       jm      vtig            ;Yes - ignore.
+       cpi     'K'+1           ;Greater than 'K'?
+       jp      vtig            ;Yes - ignore.
+       sui     'A'             ;Else make into index.
+       rlc                     ;Multiply by four.
+       rlc                     ;(Shift left twice.)
+       lhld    pttab           ;Load base addr of table.
+       mov     e,a             ;Move a into de pair.
+       mvi     d,00H           ;Zero out high byte.
+       dad     d               ;Double add index+offset.
+       xchg                    ;Exchange de with hl.
+       call    selcon          ; select console
+       call    prtstr          ;and syscall.
+vtig:                          ;Ignore escape sequence.
+       xra     a               ;Reset the ol' escape flag.
+       sta     escflg
+       ret                     ;Return home.
+
+; here for <esc>Z.  Tell the host we're a VT52. (Sure we are...)
+vt52id:        mvi     a,esc           ; response is escape...
+       call    setpar          ; (need correct parity)
+       mov     e,a
+       call    outmdm          ; (console already selected)
+       mvi     a,'/'           ; ... slash ...
+       call    setpar          ; (with parity)
+       mov     e,a
+       call    outmdm
+       mvi     a,'K'           ; ... K.
+       call    setpar
+       mov     e,a
+       call    outmdm
+       jmp     vtig            ; clear escape-sequence flag and return.
+
+; here when escflg isn't 0 or 1 - processing cursor positioning sequence.
+vt52y: cpi     2               ; looking for row? (y-coordinate)
+       jnz     vt52x           ; no, must be column.
+       mov     a,e             ; yes. get coordinate
+       sui     (' '-1)         ; convert from ascii (1 = top line)
+       sta     vtyval          ; store for later
+       mvi     a,3             ; advance to next state (x coord)
+       sta     escflg          ; store it
+       ret                     ; try for another character
+
+; here when escflag isn't 0, 1, or 2 - it must be 3. (right?)
+; E holds the last character of the cursor positioning sequence.
+vt52x: xra     a               ; end of escape sequence, reset state.
+       sta     escflg
+       mov     a,e             ; get column (' ' is left margin)
+       sui     (' '-1)         ; make left margin be one
+       mov     c,a             ; stash column in c
+       lda     vtyval          ; get row number
+       mov     b,a             ;  in b
+       call    selcon          ; select console
+       call    csrpos          ; call system-dependent cursor positioner
+       ret                     ; all through.
+;\f
+;
+;       conchr - copy character from console to comm line, processing
+;       (kermit's) escape sequences.
+;       Enter and exit with console selected.
+;       nonskip return: transparent mode terminated.
+;       skip return:    still in transparent mode.
+;       called by: rexmit, telnet
+
+conchr:        call    inpcon          ;Try to get a character from the console
+       ani     07FH            ;Keep only 7 bits
+       jz      rskp            ;Null means nothing there.
+       mov     e,a             ;Move the char for comparison.
+       sta     lstchr          ;Save it
+       lda     escchr          ;Get the escape char.
+       cmp     e               ;Is it an escape char?
+       jz      intchr          ;If so go process it.
+       call    selmdm          ; select the modem
+       mov     a,e             ;Get the char.
+       call    setpar          ;Set parity (if any).
+       mov     e,a             ;Restore it.
+       push    d               ; need to save e in case we are half dplx [5]
+       call    outmdm          ;Output the char to the port.
+       pop     d               ; Just in case we are half dplx [5]
+       call    selcon          ; reselect console
+       lda     ecoflg          ;Get the echo flag.
+       ora     a               ;Is it turned on?
+       jz      rskp            ;If not we're done here.
+       mov     a,e             ;Get the char.
+       ani     7FH             ;Turn off the parity bit.
+       mov     e,a
+       call    outcon          ; echo the character.
+       jmp     rskp            ; use skip return
+;\f
+;       transparent escape character has been typed. dispatch on second
+;       character. (console is still selected)
+;       here from: conchr
+
+intchr:        call    inpcon          ; get another character from the console
+       ora     a               ; zero means no character available yet.
+       jz      intchr          ; If so, loop until we get a char.
+       mov     b,a             ;Save the actual char.
+       cpi     ctrlc           ;is it Control-C?
+       jz      contc           ;yes
+       ani     137O            ;Convert to upper case.
+       cpi     'C'             ;Is it close?
+       jnz     intch0          ;If not proceed.
+contc: lxi     d,infms9        ;Say we are back.
+       call    prtstr
+       call    syscls          ; call system-dependent close routine
+       lda     logflg          ;Get the log flag.
+       ora     a               ;[pcc005] Check if open
+       cm      logcls          ;[pcc005] Close if needed
+       ret
+
+;Here if not a 'C' or '^C'
+
+intch0:        cpi     'S'             ;Is it status?
+       jnz     inch01          ;If not, proceed.
+       call    stat01          ;Print out the status stuff.
+       call    prcrlf          ;[pcc011] add a crlf
+       jmp     rskp            ;return from conchr
+
+inch01:
+inch03:        mov     a,b             ;Get the char.
+       cpi     '?'             ;Is it a help request?
+       jnz     intch1          ;If not, go to the next check.
+inch3a:        lda     logflg          ;[pcc003] Logging flag
+       ora     a               ;[pcc003] see if active
+       jp      inch04          ;[pcc005] jump if no file open
+       lxi     d,loghlp        ;[pcc003] yes, tell about R AND Q
+       call    prtstr          ;[pcc003]
+inch04:        lxi     d,inthlp        ;If so, get the address of the help message.
+       call    prtstr
+       call    sysinh          ; print system-dependent help message
+       lxi     d,inhlp1        ; Tell about doubling the escape character
+       call    prtstr
+       call    escpr           ;Print escape character
+       lxi     d,inhlp2        ;Print the rest
+       call    prtstr
+       jmp     intchr          ;Get another char.
+
+intch1:        mov     a,b             ;Get the character.
+       cpi     '0'             ;Is it '0', to send a null?
+       jnz     intch3          ;No.
+       xra     a               ;Yes, send an ASCII zero.
+       call    setpar          ; with the correct parity
+       mov     e,a
+       call    selmdm          ; (to the modem...)
+       call    outmdm
+       call    selcon          ; return with console selected
+       jmp     rskp
+
+intch3:        lda     escchr          ;Get the escape char.
+       cmp     b               ;Is it the escape char?
+       jnz     intch4          ;[pcc002] jump if not
+       mov     a,b             ;Get the char.
+       call    setpar
+       mov     e,a             ;Restore it.
+       call    selmdm
+       call    outmdm          ;Output it.
+       call    selcon          ;We promised console would be selected...
+       jmp     rskp            ;Return, we are done here.
+intch4:        mov     a,b             ;[pcc002] get it again
+       ani     137o            ;[pcc002] in upper case
+       cpi     'P'             ;[pcc002] toggle printer?
+       jnz     intch5          ;[pcc003] nope
+       lda     prnflg          ;[pcc002] get printer flag
+       xri     01h             ;[pcc002] complement it
+       sta     prnflg          ;[pcc002] and put back
+       jmp     rskp            ;[pcc002]
+intch5:        lda     logflg          ;[pcc003] get log flag
+       ora     a               ;[pcc003] See if open
+       jp      intch7          ;[pcc003] no, skip R and Q
+       mov     a,b             ;[pcc003] get back chr
+       ani     137o            ;[pcc003] make upper case
+       cpi     'R'             ;[pcc003] Is it R
+       jnz     intch6          ;[pcc003] Jump if not
+       mvi     a,81H           ;[pcc003] set flag for logging
+       sta     logflg          ;[pcc003] put it back
+       lxi     d,inms28        ;[pcc003] message
+       call    prtstr          ;[pcc003]
+       jmp     rskp            ;[pcc003] done
+intch6:        cpi     'Q'             ;[pcc003] Quit logging?
+       jnz     intch7          ;[pcc003] no
+       mvi     a,82H           ;[pcc003] flag for open, but suspended
+       sta     logflg          ;[pcc003] store away
+       lxi     d,inms27        ;[pcc003] keep them informed
+       call    prtstr          ;[pcc003]
+       jmp     rskp            ;[pcc003]
+intch7:                                ;[pcc003]
+
+intchz:        mov     a,b             ; not recognized. get saved copy back.
+       push    psw             ;[8] save as we will want to test for 'D'
+       call    sysint          ; interpret system-dependent sequences
+       jmp     intchy          ;  done. [10] Now see if D.  If so, do a C.
+       pop     psw             ;[10] tidy stack
+       mvi     e,'G'-100O      ;Otherwise send a beep.
+       call    outcon          ; to the console.
+       jmp     rskp
+
+intchy:        pop     psw             ;[10] adjust stack
+       ani     5fh             ;[10] strip parity, make it upper case
+       cpi     'D'             ;[10] was it a D?
+       jz      contc           ;[10] yup, so to the equivalent of an escape-C
+       jmp     rskp
+;\f
+; Little code to allow some expansion of code without changing
+;  every futher address, only up to the end of this file.
+;   TO BE REMOVED FOR RELEASE!
+
+;      org ($+100h) AND 0FF00H
+IF lasm
+       LINK    CPSCPM
+ENDIF;lasm
diff --git a/cpsutl.asm b/cpsutl.asm
new file mode 100644 (file)
index 0000000..3081232
--- /dev/null
@@ -0,0 +1,1227 @@
+; CPSUTL.ASM
+;       KERMIT - (Celtic for "FREE")
+;
+;       This is the CP/M-80 implementation of the Columbia University
+;       KERMIT file transfer protocol.
+;
+;       Version 4.0
+;
+;       Copyright June 1981,1982,1983,1984,1985
+;       Columbia University
+;
+; Originally written by Bill Catchings of the Columbia University Center for
+; Computing Activities, 612 W. 115th St., New York, NY 10025.
+;
+; Contributions by Frank da Cruz, Daphne Tzoar, Bernie Eiben,
+; Bruce Tanner, Nick Bush, Greg Small, Kimmo Laaksonen, Jeff Damens, and many
+; others. 
+;
+;       Utility routines, pure and impure data.
+;
+; revision history:
+;
+;edit 31, 21-Mar-1991 by MF. Implement edit 30 without checking takflg after
+;      "r1tch1" as we are **always** TAKEing from a file if we get to that
+;      point in the code. Makes for simplicity.
+;edit 30, 27-Feb-1991 by MF. When TAKEing characters from a TAKE-file,
+;      view semicolons as normal characters (not command separators).
+;      This will allow such commands as REMOTE DELETE *.*;* to work
+;      properly from TAKE-files without having to revert to old code in
+;      cpsrem.asm at "remcl0" to decode Remote command arguments. TAKE-files
+;      ought not (in my opinion) to have multiple commands per line anyway.
+;edit 29, 30-Jan-1991 by MF. Fix bug in IN1CHR which decremented "chrcnt"
+;      once too often after a call to INBUF (which predecrements it
+;      already). This, along with a fix in CPSTT.ASM, fixes a bug in the
+;      TRANSMIT command wherein certain characters in the file were not
+;      being transmitted. This bug was reported to me by Lance Tagliapietra
+;      of the University of Wisconsin at Platteville, WI (Email:
+;      <TAGLANCE@ucs.UWPLATT.EDU>).
+;      (he suggested not predecrementing "chrcnt" in INBUF" but this
+;      breaks code in routine "GTCHR" from CPSPK1.ASM so it's better
+;      to modify IN1CHR in this module and XMIT in CPSTT.ASM).
+;edit 28, 30-Nov-1990 by MF. Modify routine "p20ln" to use "pausit" routine
+;      rather than explicitly checking for Console input to eliminate
+;      redundant code. Also fix spelling in "p20ln"'s comments.
+;edit 27, 9-Sep-90 by MF.  Put RET in routine PAUSIT per CPKERM.BWR.
+; edit 26, September, 1987.  Added pause-it routine to wait for a user keysroke.
+;
+; edit 25, August 19, 1987 by OBSchou.  Fixed a few bugs here and there.
+;
+; edit 24, April 8, 1987 by OBSchou.  Added routine to return one character
+;      from a section of several sectors worth of file.  This routine needed
+;      for TRANSMIT.
+;
+; edit 23, March 11, 1986 by OBSchou for Richard Russell
+;      Bug in the TAKE code, such that a new sector was read in after 256
+;      bytes, and not the CPM value.  A jnz is now jp in the test to see if 
+;      the file buffer has bben exhausted.  Many thanks for finding this 
+;      bug.  I have never used TAKE files more than 128 bytes long.
+;
+; edit 22, January 28, 1986 by OBSchou.
+;      split off the data areas from CPSUTL to CPSDAT.ASM  (All in line
+;      with keeping individual files relatively small)
+;
+; edit 21 August, 1986 by OBSchou.  Sorted a few more bugs in printer buffer
+;       etc.  Have yet to try this with a real printer  The code, apart from 
+;       actually printing works OK.
+;
+; edit 26  20 August, 1986 by OBSchou for Godfrey Nix:
+;       edit 8-Aug-86  by Godfrey N. Nix   [gnn]  Nottingham University
+;       Added two extra bytes for storage of the send and receive
+;       start-of-packet characters. Used by CP4PKT, and altered
+;       by SET option in CP4MIT. Also added message strings for 
+;       use by show routines. Added remote filename buffer and length byte.
+;
+; edit 11: June 20, 1986 by OBSchou.  Added multi-fcbs for the DIR command
+;       together with some bug clearing and new routines.  Had to move
+;       the overlay to 5000h as we ran out of space...
+;
+; edit 10: June 16, 1986 OBSchou.  Added a pseudo clock and check for printer
+;       ready whenever one enters BDOS...  This may slow things down a little
+;       but adds in (hopefully) pseudo background printing...
+;
+; edit 9 30-May-86 OBSchou.  Added XON/XOFF routines here for the world 
+;       at large to use.  Also added two new entries in the overlay tables.  
+;       One to give the address of the family of machines using the overlay, 
+;       the other to the routine for giving printer status.
+;
+; edit 8: 27-May-86 OBSchou.  Added code to check BDOS calls for info from
+;       the console.  If so, and the take flag (takflg) is set then we 
+;       substitute our own characters.  Simple, a little tatty...
+;       Also added bits for SET CASE-SENSITIVE and SET FLOW=CONTROL, and 
+;       removed the XMIT rubbish.  This is a prelude to better TRANSMIT
+;
+; edit 7: 22 April, 1986 by OBSchou Lohghborough University
+;       Prlude to more changee, this time make overlay address to 4000h
+;       May revert back to ($+0ffh) AND 0ff00h as address for overlay.
+;       This gives us space to make quite a few modifications to the system
+;       dependent part without much fear of having to change this overlay
+;       address.  Should also fix the Osborne problem of having to have io 
+;       routines ii memory above 16k.  I know I should not be introducing
+;       such system dependent rot here, but it wont be too difficult to fill
+;       memory to 4000h.
+;
+; edit 6: February 6, 1985
+;       Added a storage location for the port value (PORT, just below
+;       SPEED) which is used by the port status routine, and moved the
+;       printer copy flag (PRNFLG:) into the communications area so
+;       that the machine dependant overlay can toggle it. [Hal Hostetler]
+;       Added ffussy flag for filename checking.  Generate the version
+;       string from 'verno', which is set in CP4KER, because CP4KER has the
+;       list of modules and their edit numbers. [Charles Carvalho]
+;
+; edit 5: 13-Jan-85 by Vanya J.Cooper Pima Commun. College Tel: 602-884-6809
+;
+;pcc002 28-Dec-84       modules:cp4tt,cp4utl
+;       Add connect mode <esc>P command to toggle printer on
+;       and off.  Conflicts with "official" recommended commands
+;       in protocol manual, but I don't think CP/M will ever get
+;       a PUSH command.
+;
+;pcc003-pcc005  2-Jan-85        vjc     modules:cp4mit,cp4tt,cp4utl
+;       These edits must all be installed together and change the way
+;       logging is handled.  The log file spec is moved to a separate
+;       fcb, and not opened until an actual CONNECT command is given.
+;       This takes care of a NASTY bug that if you used any other file
+;       command between the LOG and CONNECT, the log file would get
+;       written over the last file used.  This also allows logging to
+;       be "permanently" enabled until an CLOSE (new command) for all
+;       CONNECT sessions, like most other kermits do.  If a log file
+;       already exists, it will be appended to.  Also add two new
+;       CONNECT mode commands <esc>Q to suspend logging and <esc>R to
+;       resume.  <esc>R means something else during TRANSMIT, but
+;       logging is never on then, so there shouldn't be any conflict.
+;       I also changed the write code, so that it can handle one more
+;       character after the XOFF is send to stop the host.  This allows
+;       a little "slop" for systems that don't stop immediately (such
+;       as TOPS10), but it didn't help much.
+;
+;pcc006 2-jan-85        VJC     modules:cp4cmd,cp4utl
+;       Problems with "?" in filespecs.  On reparse, may cause action
+;       flag to be reset at wrong point, requiring multiple <CR>'s
+;       to terminate the line or other weird stuff.  Also need to
+;       check flag and complain if wild-cards illegal.
+;
+;pcc008 2-Jan-85        vjc     modules:cp4def,cp4tt,cp4utl
+;       Keyboard input during CONNECT mode can get locked out if
+;       there is enough input from the modem port to keep prtchr
+;       busy.  This can happen for example, if the printer is running
+;       at the same speed as the modem line, leaving you helpless to
+;       turn it off or abort the host.  Add a fairness count, so that
+;       at least every prfair characters we look at console input.
+;
+;pcc012 4-Jan-85        vjc     modules:cp4mit,cp4tt,cp4utl
+;       Use the big buffer for the log file.  Move the log file back
+;       into the common fcb and only save the drive, name, and
+;       extension between connects.  Add new routines to cp4utl to
+;       create or append to an existing file, and to conditionally
+;       advance buffers only if in memory.  Remove edit pcc003 that
+;       allows one more character after the xoff, since it didn't
+;       really work very well and does not fit in well with the way
+;       the buffer advancing routines are set up.  If someone still
+;       thinks this would be useful, it could be put back in with a
+;       little more work.
+;       
+;       While testing this edit, I also noticed another bug that
+;       the command parsing routines do not limit or check the
+;       length of command lines or file specs, trashing what ever
+;       comes after them.  Currently because of where the fcb and
+;       command buffer are located, this does not usually cause a
+;       problem, but could if an extremely long line was typed in,
+;       or in the future multiple fcbs defined elsewhere in memory
+;       were used.  Maybe this should be put on the bug list
+;       somewhere.
+;
+;pcc013 8-Jan-85        vjc     modules:cp4mit,cp4utl,cp4typ
+;       Replace CLOSE command to cancel session logging to SET
+;       LOGGING ON/OFF.  This seems to fit in with the command
+;       structure better.  Default the log file to KERMIT.LOG
+;       incase no previous LOG command.  Logging is also enabled
+;       by LOG command, as before.
+;
+; edit 4: September 9, 1984
+;       Move command tables and associated help text to CP4MIT.  Add
+;       makfil/clofil routines and modify outbuf to write files in big
+;       chunks.  Update Kermit's version to 4.03.
+;
+; edit 3: August 21, 1984
+;       Make inbuf read files in big chunks to minimize disk start/stop
+;       delays.  Buffer size and address is specified by system-dependent
+;       overlay.
+;
+; edit 2: August 3, 1984
+;       move "mover" to CP4SYS to allow use of Z80 block move instruction.
+;
+; edit 1: July 27, 1984
+;       extracted from CP4MIT.M80 edit 2, as part of LASM support.  This is
+;       the last file linked for the system-independent code.
+;
+utlver:        db      'CPSUTL.ASM (31) 21-Mar-1991$'
+
+;       Set the parity for a character in A.
+;       called by: spack, rexmit, logit, vt52, conchr, intchr
+
+setpar:        push    h               ;Save HL.
+       push    b
+       lxi     h,parity
+       mov     c,m             ;Get the parity routine.
+       mvi     b,0
+       lxi     h,parjmp        ;Get the first address.
+       dad     b
+       pchl
+
+parjmp:        jmp     even
+       jmp     mark
+       jmp     none
+       jmp     odd
+       jmp     spacep
+
+none:  jmp     parret          ;Don't touch the parity bit.
+
+even:  ani     7FH             ;Strip parity.
+       jpe     parret          ;Already even, leave it.
+       ori     80H             ;Make it even parity.
+       jmp     parret
+
+mark:  ori     80H             ;Turn on the parity bit.
+       jmp     parret
+
+odd:   ani     7FH             ;Strip parity.
+       jpo     parret          ;Already odd, leave it.
+       ori     80H             ;Make it odd parity.
+       jmp     parret
+
+spacep:        ani     7FH             ;Turn off the parity bit.
+       jmp     parret
+
+parret:        pop     b
+       pop     h               ;Restore HL.
+       ret
+;\f
+;       Print the escape char.
+;       called by: stat01, telnet, intchr
+
+escpr: lda     escchr          ;Get the escape char.
+escpr1:        cpi     ' '             ;Is it a control char?
+       jp      escpr2
+       push    psw             ; save the character
+       lxi     d,inms10        ;Output "Control-".
+       call    prtstr
+       pop     psw             ; restore the character
+       ori     100O            ;De-controlify.
+escpr2:        mvi     c,conout        ;Output the char
+       mov     e,a
+       call    bdos
+       ret
+
+;       fetch keyword; if unsuccessful, return to command level.
+;       called by: kermit, setcom
+
+keycmd:        mvi     a,cmkey
+       call    comnd
+       jmp     keycm2          ;no match
+       ret
+
+keycm2:        lxi     d,ermes1        ;"Unrecognized Command"
+       call    prtstr
+       jmp     kermit          ;Do it again.
+
+;       request confirmation; if unsuccessful, return to command level
+;       called by: bye, exit, help, log, setcom, show, status, send,
+;               finish, logout, telnet
+
+cfmcmd:        mvi     a,cmcfm
+       call    comnd
+       jmp     kermt3          ;"Not confirmed"
+       ret
+;\f
+
+;       This routine prints the number in HL on the screen in decimal.
+;       Uses all ACs.
+;       called by: cp4sys, read, send, updrtr, dir, user
+
+nout:  mvi     a,'0'           ; fill tempx with zeros
+       call    filltmp
+
+       lxi     b,-10           ;Get some useful constants.
+nout1: lxi     d,-1
+
+nout2: dad     b               ;Subtract as many 10s as possible.
+       inx     d               ;Count them.
+       jc      nout2           ;If some left keep going.
+       push    h               ;save remainder - 10
+       xchg            ;Swap the remainder and the quotient.
+       mov     a,h             ;Get the number of 10s found.
+       ora     l               ;check for quotient non zero
+       cnz     nout1           ;If non zero, recurse.
+       pop     h               ;Get the remainder - 10
+       mov     a,l             ;in a
+       adi     '0'+10          ;Make the number printable and add the 10 back
+       call    shiftmp         ; cycle temp registers
+       sta     temp1           ; and save digit
+       mov     e,a             ;Output the digit.
+       lda     nquiet          ; are we to be quiet?
+       ana     a
+       rnz             ; yup, so return here rather than frm bdos
+       mvi     c,conout
+       jmp     bdos
+
+; prcrlf - print a CR/LF.  (Saves no registers.) [Toad Hall]
+; prtstr - print string pointed to by DE (now in overlay section.. see prtstx)
+;       called by: lots of places.
+prcrlf:        lxi     d,crlf          ;Point to the CR/LF
+       jmp     prtstr          ; Use the one in the overlay
+
+; prtstx is funtionally the same as prtstr in the overaly but is here as 
+;      we may need a print a string routine in case the overlay is
+;      either incorrect version or simply not present.
+prtstx:                                ; PRTSTR moved to overlay, but we do need the
+                               ; same function for writing the sign-on
+                               ; message and error message if the overlay
+                               ;is not present.  Thence prtstx
+       mvi     c,prstr         ; output string
+       jmp     bdos            ;a CALL followed by a RET becomes a JMP
+
+
+;       Jumping to this location is like retskp.  It assumes the instruction
+;       after the call is a jmp addr.
+;       here from: many places.
+rskp:  pop     h               ;Get the return address.
+       inx     h               ;Increment by three.
+       inx     h
+       inx     h
+       pchl
+
+;       Jumping here is the same as a ret.  'jmp r' is used after routines
+;       that have skip returns, where the non-skip instruction must be 3 bytes.
+;       here from: many places.
+r:     ret
+
+; Pause-it routine.  Informs the user to press any key to continue
+;      and then waits for a key input.  Called by the any routine 
+;      with more than, say, 20 lines of output.
+
+pausit:        lxi     d,anymes        ; ask user to press any key to continue
+       call    prtstr
+pausi1:        call    ckcon           ; see if a key typed
+       ana     a
+       jz      pausi1          ; loop until a key has been pressed.
+
+       ret
+
+;\f
+;       Open a file for reading (with inbuf).  The filename is already
+;       in fcb; upon return, the end of file flag is cleared and chrcnt
+;       is set to zero, so inbuf will be called to get a buffer when we
+;       next attempt to get a character.
+;       called by: sinit, seof
+
+getfil:        xra     a
+       sta     chrcnt          ;Buffer is empty.
+       sta     seccnt          ;No sectors buffered.
+       sta     eoflag          ;Not the end of file.
+       sta     endsts          ;No EOF/error pending.
+       sta     fcb+0CH         ;Zero the extent.
+       sta     fcb+0EH         ;Must be zero for MAKEF or OPENF.
+       sta     fcb+20H         ;Zero the current record.
+       mvi     c,openf         ;Open the file.
+       lxi     d,fcb
+       call    bdos
+       ret
+
+;       Get next sector.  If necessary, read some more from disk.
+;       preserves bc, de, hl
+;       returns nonskip if EOF or error;
+;       returns skip with chrcnt and bufpnt updated if success.
+;       called by: gtchr, get1xc (from xmt/transmit)
+
+inbuf: lda     eoflag          ;Have we reached the end?
+       ora     a
+       rnz             ;Return if so.
+       push    b
+       push    d
+       push    h
+inbuf1:        lda     seccnt          ; Do we have any sectors left?
+       ora     a
+       jz      inbuf3          ; If not, go get some more.
+inbuf2:        lhld    nxtbuf          ; Yes.  Get address of next sector
+       shld    bufpnt          ; Update current buffer pointer
+       lxi     b,bufsiz        ; Get number of bytes in sector
+       dad     b               ; Update HL to point to next sector
+       shld    nxtbuf          ; Save for next time
+       dcr     a               ; Decrement count of buffered sectors
+       sta     seccnt          ; Put it back
+       mvi     a,bufsiz-1      ; Number of bytes in buffer (pre-decremented)
+       sta     chrcnt          ; Store for our caller
+       pop     h
+       pop     d
+       pop     b
+       jmp     rskp            ; Return success
+
+; We don't have any sectors buffered.  If we've already hit an error or
+; EOF, return that status to the user.
+
+inbuf3:        lda     endsts          ; Check status from previous read
+       ora     a
+       jz      inbuf4          ; It was OK.  Get some more sectors.
+       sta     eoflag          ; End of file or error.  Set the flag.
+       xra     a
+       sta     chrcnt          ; Say no characters in buffer.
+       pop     h
+       pop     d
+       pop     b
+       ret             ; Return failure
+
+; Read sectors until we fill the buffer or get an error or EOF, then return
+; the first buffer to the user.  (seccnt is zero)
+
+inbuf4:        lhld    bufadr          ; Get address of big buffer
+       shld    nxtbuf          ; Store as next buffer address to give user
+inbuf5:        shld    bufpnt          ; Store as next buffer address to read into
+       xchg            ; Move buffer address to DE
+       mvi     c,setdma        ; Tell CP/M where to put the data
+       call    bdos            ;  ...
+       mvi     c,readf         ; Read a record.
+       lxi     d,fcb
+       call    bdos
+       sta     endsts          ; Save ending status
+       ora     a               ; 00H => read O.K
+       jnz     inbuf6          ; EOF/error: stop reading.
+       lxi     h,seccnt        ; Success.  Get addr of sector count
+       inr     m               ; Bump sector count by one
+       lda     bufsec          ; Get max number of sectors in buffer
+       cmp     m               ; Are we there yet?
+       jz      inbuf7          ; Yes, can't read any more.
+       lhld    bufpnt          ; No, try for another.  Get buffer address,
+       lxi     d,bufsiz        ;  and size of sector,
+       dad     d               ;  giving next buffer address in HL
+       jmp     inbuf5          ; Go read another sector.
+
+; We hit EOF or got an error.  Put the DMA address back where it belongs,
+; then go see if we have any sectors (before the one that got the error)
+; to return to the caller.  Nxtbuf points to the first good sector, if
+; any; seccnt contains the count of good sectors.
+
+inbuf6:        call    rstdma
+       jmp     inbuf1          ; Go see if we have some data to return
+
+; We've filled the big buffer.  Reset the DMA address, then go return a
+; sector to the caller.  nxtbuf points to the beginning of the buffer;
+; seccnt contains the number of sectors successfully read (except that
+; if we've read 256 sectors, seccnt contains zero, so we can't just go
+; to inbuf1).
+
+inbuf7:        call    rstdma          ;[pcc012]
+       lda     seccnt          ; Get sector count again.
+       jmp     inbuf2          ; Return a sector.
+
+; IN1CHR - get a single character from the file.  Taken code from old
+;      TRANSMIT routine.
+in1chr:
+       lda     eoflag          ;EOF encountered?
+       ora     a
+       rnz             ; Yes, finish.
+       lxi     d,cmdbuf        ; Use comnd buffer as line buffer.
+       lhld    bufpnt          ; Get current buffer pointer.
+       lda     chrcnt          ; Get current byte count
+       mov     b,a             ;  in B
+in1ch1:        dcr     b               ; Assume there's a character there
+       jp      in1ch2          ; If there was, proceed.
+       call    inbuf           ; There wasn't.  Try for another buffer.
+       jmp     in1che          ; End of file.
+       lhld    bufpnt          ; Got another buffer.  Get new pointer in HL
+       lda     chrcnt          ;  and new byte count
+       mov     b,a             ;  in B
+;[MF]The modification below was made 30-Jan-1991 per report from
+;[MF]Lance Tagliapietra from the University of Wisconsin at Platteville
+;[MF]The following instruction should not be executed as the character counter
+;[MF]has already been decremented by INBUF.
+;      dcr     b               ; we are reading in a character, so less one
+in1ch2:        mov     a,b             ; save new count
+       sta     chrcnt
+       mov     a,m             ; Get a character from disk buffer.
+       inx     h
+       shld    bufpnt          ; save new pointer
+       ani     7FH             ; Mask 7 bits.
+       jz      in1ch1          ; Skip nulls.
+       ret             ; character in a
+
+
+in1che:        mvi     a,0ffh          ; dubious about this one...
+       sta     eoflag
+       ret             ; set end of file flag...?????
+
+;\f;[pcc012]
+;   appfil - Create or append to an existing file.  File name is in FCB.
+;       Non-skip return if could not be done.  Skip return with file
+;       open and bufpnt pointing to end of file.
+;       called by logopn
+appfil:        xra     a               ;[pcc012] zero out stuff for open
+       sta     fcb+0CH         ;[pcc012] extent
+       sta     fcb+0EH         ;[pcc012] Must be zero for MAKEF or OPENF.
+       sta     fcb+20H         ;[pcc012] Zero the current record.
+       mvi     c,openf         ;[pcc012] Try to open the file
+       lxi     d,fcb           ;[pcc012]
+       call    bdos            ;[pcc012]
+       cpi     0FFH            ;[pcc012] Did we find it?
+       jz      makfi1          ;[pcc012] If not, go create it
+       mvi     c,cflsz         ;[pcc012] Compute the file size
+       lxi     d,fcb           ;[pcc012]
+       call    bdos            ;[pcc012]
+       lhld    fcb+21H         ;[pcc012] random record pointer
+       mov     a,h             ;[pcc012] See if zero length file
+       ora     l               ;[pcc012]
+       jz      makfi2          ;[pcc012] set up pointers if null file
+       dcx     h               ;[pcc012] backup to last record written
+       shld    fcb+21H         ;[pcc012] store rec ptr back
+       lhld    bufadr          ;[pcc012] get buffer address
+       xchg            ;[pcc012] to DE
+       mvi     c,setdma        ;[pcc012] set dma address
+       call    bdos            ;[pcc012] for read
+       mvi     c,rrand         ;[pcc012] read the last block
+       lxi     d,fcb           ;[pcc012]
+       call    bdos            ;[pcc012]
+       ora     a               ;[pcc012] check results
+       jnz     rstdma          ;[pcc012] reset dma and return if error
+       lhld    bufadr          ;[pcc012] get address again
+       lxi     d,bufsiz        ;[pcc012] and and size
+       mvi     a,'Z'-40H       ;[pcc012] control-Z for comparison
+appcz: cmp     m               ;[pcc012] Is this the EOF?
+       jz      appxit          ;[pcc012] Jump if yes
+       inx     h               ;[pcc012] no, bump
+       dcr     e               ;[pcc012] and grind
+       jnz     appcz           ;[pcc012] until find or buffer empty
+appxit:        shld    bufpnt          ;[pcc012] store buffer pointer
+       dad     d               ;[pcc012] compute next buffer adr
+       shld    nxtbuf          ;[pcc012] and store
+       mov     a,e             ;[pcc012] updated chr count
+       sta     chrcnt          ;[pcc012]
+       xra     a               ;[pcc012] reset sector count
+       sta     seccnt          ;[pcc012]
+       call    rstdma          ;[pcc012] reset normal dma
+       jmp     rskp            ;[pcc012] and give good return
+
+;       Create a file, deleting any previous version.  The filename is in
+;       fcb.
+;       Returns nonskip if file could not be created.
+;       If successful, takes skip return with bufpnt and chrcnt initialized
+;       for output; buffers should be output via outbuf.
+;       called by: gofil
+makfil:        mvi     c,delf          ; delete the file if it exists.
+       lxi     d,fcb
+       call    bdos
+       xra     a
+       sta     fcb+0CH         ; zero the extent.
+       sta     fcb+0EH         ; must be zero for MAKEF or OPENF.
+       sta     fcb+20H         ; zero the current record.
+;[pcc012] here from appfil above if file does not exist
+makfi1:        mvi     c,makef         ;[pcc012] now create it.
+       lxi     d,fcb
+       call    bdos
+       cpi     0FFH            ; is the disk full?
+       rz              ; take error return if so.
+; success. set up pointers and counters for multisector buffering.
+;[pcc012] also here from appfil if found zero length file
+makfi2:        lhld    bufadr          ;[pcc012] find beginning of buffer space.
+       shld    bufpnt          ; make it current buffer.
+       lxi     d,bufsiz        ; get sector size.
+       dad     d               ; find beginning of next buffer.
+       shld    nxtbuf          ; store for later.
+       mov     a,e             ; store buffer size
+       sta     chrcnt          ;  for caller.
+       xra     a
+       sta     seccnt          ; no sectors stored yet.
+       jmp     rskp            ; take success return.
+
+;[pcc012]
+;   outadv - conditionally advance output buffer if disk write not needed.
+;       preserves BC
+;       skip return with with next output buffer set up
+;       non-skip return if memory buffer full and must write to disk.
+;       called by:logit
+
+outadv:        push    b               ;[pcc012] save BC as advertised
+       lxi     h,seccnt        ;[pcc012] point to sectors buffered
+       inr     m               ;[pcc012] count this one
+       lda     bufsec          ;[pcc012] how many we can hold
+       cmp     m               ;[pcc012] check if full
+       jnz     outbf2          ;[pcc012] continue if not
+       dcr     m               ;[pcc012] full, un-advance sector count
+       pop     b               ;[pcc012] restore bc
+       ret             ;[pcc012] and give non-skip return
+
+;       get a fresh output buffer, flushing big buffer if necessary.
+;       returns nonskip if disk full.
+;       if successful, returns skip with bufpnt and chrcnt updated.  Note
+;       that chrcnt holds one less than the buffer size.
+;       preserves BC.
+;       called by: ptchr,logwrt
+
+outbuf:        push    b
+       lxi     h,seccnt        ; count another buffered sector
+       inr     m               ;  ...
+       lda     bufsec          ; get number of sectors we can hold
+       cmp     m               ; full?
+       jnz     outbf2          ; if not, set up pointers and return
+       call    outmbf          ; flush the big buffer
+       jmp     outbf9          ; disk error.
+;[pcc012] also here from outadv to advance buffer
+outbf2:        lhld    nxtbuf          ; get pointer to fresh buffer
+       shld    bufpnt          ; store for caller
+       lxi     d,bufsiz        ; advance our pointer to next buffer
+       dad     d
+       shld    nxtbuf
+       mvi     a,bufsiz-1      ; get buffer size (pre-decremented)
+       sta     chrcnt          ; store for caller
+       pop     b
+       jmp     rskp            ; return success.
+
+outbf9:        pop     b               ; clean up stack
+       ret             ; and take error return.
+
+;       flush incore output buffers.
+;       returns nonskip if disk full.
+;       if successful, returns skip with nxtbuf reset to start of buffer and
+;       seccnt zero.
+;       destroys all ac's.
+;       called by: outbuf, clofil.
+
+outmbf:        lhld    bufadr          ; get start of buffer
+       shld    nxtbuf          ; store for next fill cycle
+       shld    bufpnt          ; store for empty loop
+outmb2:        lhld    bufpnt          ; get address of current sector
+       xchg            ;  into DE
+       lxi     h,bufsiz        ; advance HL to next sector
+       dad     d               ;  ...
+       shld    bufpnt          ;  and store for later
+       mvi     c,setdma
+       call    bdos            ; point CP/M at current sector
+       lxi     d,fcb
+       mvi     c,writef
+       call    bdos            ; output the sector
+       ora     a               ; test for error (A non-zero)
+       jnz     rstdma          ;[pcc012] reset dma and take nonskip return if so
+       lxi     h,seccnt
+       dcr     m               ; count down buffered sectors
+       jnz     outmb2          ; loop if more saved
+       call    rstdma          ;[pcc012] restore normal dma
+       jmp     rskp            ; return success.
+
+;       output current buffer, flush incore buffers, and close output file.
+;       returns nonskip if disk full; skip if successful.
+;       called by: rdata
+
+clofil:
+       lda     chrcnt          ; get the number of chars left in the buffer.
+       cpi     bufsiz          ; Virgin buffer?
+       jz      clofl3          ; yes, don't output it.
+       lhld    bufpnt          ; get the buffer pointer.
+clofl1:        dcr     a               ; lower the count.
+       jm      clofl2          ; if full then stop.
+       mvi     m,'Z'-100O      ; put in a ^Z for EOF.
+       inx     h               ; point to the next space.
+       jmp     clofl1
+
+clofl2:        call    outbuf          ; output the last buffer.
+       jmp     r               ; give up if the disk is full.
+clofl3:        lda     seccnt          ; any sectors buffered in memory?
+       ora     a
+       jz      clofl4          ; if not, don't try to flush.
+       call    outmbf          ; flush buffers
+       jmp     r               ; disk full.
+clofl4:        mvi     c,closf         ; close up the file.
+       lxi     d,fcb
+       call    bdos
+       jmp     rskp            ; return success.
+
+
+; Reset DMA address to the default buffer
+; called from inbuf,appfil,outmbf
+rstdma:        lxi     d,buff          ;[pcc012]
+       mvi     c,setdma        ;[pcc012]
+       jmp     bdos            ;[pcc012]
+
+; [8] Intercept BDOS calls to check for console input
+; This leads to simple trapping for input from disk rather than from the
+; keyboard, alowing commands to be stored in a TAKE file.
+; Printer is tested for readiness, and the second fuzzy clock is updated.
+bdos:  ;call   print           ; print a character to the printer if needed
+       ;call   clock           ; update the clock
+       push    psw             ; we will need this register
+       lda     takflg          ; are we taking from a 
+       ana     a               ; file or from command line
+       jz      notake          ; no, so do usual BDOS stuff
+       mov     a,c             ; get bdos function
+       cpi     conin           ; is it console in?
+       jz      bd1in           ; get a single character
+       cpi     dconio          ; direct console in or out?
+       jz      bd1io           ; test further for inpu or output
+       cpi     rdstr           ; read the console buffer?
+       jz      bdcbuf          ; then do it
+       cpi     consta          ; get the console status?
+       jz      bdcst           ; anything left in buffer?
+notake:        pop     psw             ; else we have a kosher BDOS call
+       jmp     0005h           ; Absolute address = BDOS entry point
+;
+bd1in: ; get a single character from take file
+       pop     psw             ; restore stack
+       call    r1tchr          ; read a single take character
+       ret             ; and return.  We dont expand tabs, 
+                               ; check for xon/off or backspaces.  
+                               ;Make sure the take file is error free?
+;
+bd1io: ;get or put a single character from/to console
+       mov     a,e             ; get e.  If 0ffh then input else output
+       inr     a               ; if 0 then input
+       jnz     notake          ; its for output, so let notake restore stack
+       pop     psw             ; otherwise we do it
+       call    r1tchr          ; read a single take character
+       ret             ; and return from out BDOS
+;
+bdcbuf:        ; read a line of edited (?) input from the console
+       pop     psw             ; restore stack
+       inx     d               ; point to nc
+bdosc1:        call    r1tchr          ; get a character
+       cpi     cr              ; if a cr then return
+       jz      nomore
+       cpi     lf              ; ignore line feeds
+       jz      bdosc1          ; so get another character
+       push    psw             ; we will want it later
+       mvi     h,0
+       ldax    d               ; get nc, the no of characters in buffer
+       mov     l,a             ; now use as index from  de+2
+       mvi     h,0
+       inx     d               ; de is now de + 2
+       dad     d
+       pop     psw             ; Told you we will want this
+       mov     m,a
+       dcx     d               ; point again to nc
+       xchg            ; make hl point to memory
+       inr     m               ; update pointer nc
+       xchg            ; restore it
+       jmp     bdosc1
+nomore:        dcx     d               ; restore de to point to buffer
+       ret
+
+bdcst: ; get the console status.  Returns a 00 if at eof
+       pop     psw
+       push    h               ; now save de, hl for return
+       push    d               ;
+       lxi     d,takdma        ; make a point to next byte...
+       lhld    takptr          ; pointer from dma address.  There will always
+       dad     d               ; be at least one byte, as the buffer is 
+       mov     a,m             ; ...
+       pop     d               ; filled only if a read empties it.
+       pop     h               ; restore hl, de
+       cpi     cntlz           ; end of file?
+       mvi     a,0ffh          ; say there is
+       rnz             ; if it is not a cntl z
+       jmp     closet          ; otherwise, close take file etc
+
+r1tchr:                ; read a single character from the take file or command line
+       push    h
+       push    d               ; save in case of return
+       lda     takflg          ; see if character is to come from file or line
+       ani     1               ; if bit zero set, from take file
+       jz      r1lchr          ; get character from the command line
+       lxi     d,takdma
+       lhld    takptr          ; get next data byte
+       dad     d
+       mov     a,m
+       lhld    takptr          ; cos it's destroyed with dad
+       inx     h
+       shld    takptr          ; update pointer
+       call    p1tchr          ; print it (so the user sees it)
+       push    psw             ; save the read data for a while
+       mov     a,l             ; if l = 0 then read another sector
+       ana     a
+       jp      r1tch1          ;[23] was jnz. jp => 128 byte sectors
+       call    rnsect          ;read next sector
+r1tch1:        pop     psw             ; now, is this a cntl-z.. in whic case
+       pop     d               ; also these...
+       pop     h
+       cpi     lf              ; skip if a line feed
+       jz      r1tchr          ;
+;[MF][31][30]Following lines commented out so semicolons are not considered
+;[MF][31][30]command separators and thus are considered part of the command
+;[MF][31][30]so commands like REMOTE DELETE *.*;* work correctly.
+;      cpi     semico          ; see if its a semicolon
+;      jnz     r1tch2          ; no, ignore it
+;      mvi     a,cr            ; else say its a cr (in case of command lines)
+r1tch2:        cpi     cntlz           ; end of file??
+       rnz
+
+
+c1tchr:        call    closet          ; close file etc, then
+       mvi     a,cr            ; fake a carriage return chr 
+                               ;       ( => clears kermit comnd line)
+c1tch1:        ret             ; and hope that editing etc not required.
+
+r1lchr:                ; read a single character from the command line
+       lxi     d,cbuff         ; point to buffer
+       lda     cbptr           ; get pointer for next character
+       mov     l,a
+       lda     cbuff           ; get total number of characters there
+       cmp     l               ; ... less current character
+       jp      r1lch1          ; if positive, we have more characters
+       lda     takflg          ; no more, so reset command line bit (bit 4)
+       ani     0efh
+       sta     takflg
+       mvi     a,cntlz         ; fudge an end of file
+       push    psw             ; save for common exit (r1tch1)
+       jmp     r1tch1
+;
+r1lch1:        mov     a,l             ; get count back again
+       mvi     h,0
+       dad     d               ; get offset to character
+       inr     a
+       sta     cbptr
+       mov     a,m             ; get next character
+       cpi     semico          ; if a semicolon, make it a carriage return
+       jnz     r1lch2
+       mvi     a,cr
+r1lch2:        call    p1tchr          ; send a copy to the console
+       push    psw             ; save it for r1tch1
+       jmp     r1tch1          ; common exit
+
+
+; rnsect - read the next take sector from disk to the take dma address
+; if there is no more then close the file too
+rnsect:        push    b
+       push    d
+       push    h               ; save in case we need these later
+       mvi     c,setdma
+       lxi     d,takdma        ; set a next read from disk
+       call    bdos            ; recursive...
+       mvi     c,readf
+       lxi     d,takfcb
+       call    bdos
+       ana     a
+       cnz     closet          ; if returned value not zero, assume eof
+       lxi     h,0
+       shld    takptr          ; pointer restored
+       call    rstdma          ; reset the dma address for fussy routines (this one)
+       pop     h
+       pop     d
+       pop     b
+       ret
+
+; closet - close the take file and set the take flag to 0 (ie no takes)
+;
+closet:        lda     takflg          ; reset the take file bit (bit 0)
+       ani     0feh
+       sta     takflg          ; close the take file, and restore the flag
+       mvi     c,closf
+       lxi     d,takfcb
+       call    bdos
+       call    rstdma          ; in case we did not do it above, reset dma
+       ret
+
+;
+; clock - is a 32 bit counter incremented every BDOS call.  It serves as a
+;       timer of sorts and allows a background clock to tick away..
+clock: push    psw             ; we need flags and hl
+       push    h
+       lhld    clkbit          ; get the counter
+       inx     h               ;
+       shld    clkbit
+       mov     a,h
+       ora     l               ; do we need to update the next lot of clock bits?
+       jnz     clockx
+       lhld    clkbit+2        ; if carry up the top 16 bits
+       inx     h
+       shld    clkbit+2
+clockx:        pop     h
+       pop     psw
+       ret
+
+;       p1tchr - print a character in accumulator directly to the console
+;       bypassing the bdos trap above.
+
+p1tchr:        cpi     lf              ; if a lf ignore it
+       jz      p1tchx
+       cpi     cr              ; ditto carriage returns
+       jz      p1tchx
+       cpi     cntlz           ; control z
+       jz      p1tchx          ; then dont write it out
+       push    psw             ; we do not want to loose it, do we?
+       push    b
+       push    d
+       push    h               ; 'cos you never know what bdos does...
+       mov     e,a
+       mvi     c,conout        ; direct console io
+       call    5               ; absolute address as we skip the trap
+       pop     h
+       pop     d
+       pop     b               ; ... and we need some of these regs.
+       pop     psw             ; 
+p1tchx:        ret             ; and return
+
+
+
+; outprn - This routine sends charactes to the printer if the latter is ready,
+;       or to a buffer if the printer is not ready.  If the buffer is nearly
+;       full, an XOFF is sent to the host, asking it to be quiet.  The buffer
+;       is emptied by a series of calls in the connect state only.   
+;       If the buffer is made nearly empty, then an XON is sent to the host.
+;
+outprn:        mov     a,e             ; get the character to send back to a
+       sta     prntmp          ; we need all registers.
+       jmp     outprx          ; -testing-testing-testing- avoid buffer
+;
+outp0: call    tstfree         ; see how many spaces free
+       cpi     2               ; (free spaces in a on return)
+       jp      outp1           ; enough free spaces, so keep going
+       call    print           ; else see if we can print summat
+       jmp     outp0           ; and try again
+;
+outp1: cpi     4               ; common test - if three or less then send xoff
+       cm      sndxoff
+outpr2:        mov     a,b             ; inc ptr and check for wrap around
+       call    wrapt
+       mov     b,a             ; input pointer to b
+       sta     prnbuf+1        ; save the new pointer away
+       lxi     h,prnbuf+2      ; point to first real data entry in buffer
+       call    inchl           ; add offset in a to hl
+       lda     prntmp          ; get th character to save away
+       mov     m,a             ; save the data away
+       ret
+
+; outprx - send character in a to the printer. (We have checked to see if
+;       the printer is ready)
+;       called by outprn, print
+outprx:        mov     e,a             ; character has to be in e register
+       call    outlpt          ; send it to printer
+       ret             ; assume we print it
+
+; TSTFREE - see how many free spacse there are in the buffer
+;        - returns with free space in a, ip pointer in b, op pointer in c
+szecyc equ     127             ; 128 bytes in buffer (less for debugging)
+;
+tstfree:
+       lda     prnbuf          ; get output pointer
+       mov     c,a             ;.. to c
+       lda     prnbuf+1        ; and input pointer ...
+       mov     b,a             ; ... to b
+;
+;
+; Now comes the tricky bit.  We must establish whether there is less than 
+;   three characters left in the buffer.  There are two conditions to test for
+;   1)  the input pointer is a higher value than the output pointer
+;   2)  the input pointer has been wrapped round and is less than the output pointer
+; ie
+;         |-------|-------|---------------------------------------------|
+; Buffer  |o/p ptr|i/p ptr|  Buffer proper filling --->                 |
+;         |-------|-------|------|-------------|-----------|------------|
+;                              i/p2          o/p         i/p1
+;
+;  If ip = ip1 then if 
+;                       (size of buffer - ip ptr + op ptr) < 3 send xoff
+;  If ip = ip2 then if 
+;                       (op ptr - input ptr ) < 3 send xoff
+;
+; First decide whice one applies
+
+       mov     a,b             ; get ip ptr 
+       sub     c               ; see if op ptr > ip ptr (case 2)
+       jm      outp2           ; yup, so do case two
+       mvi     a,szecyc        ; else do buffer - ip + op
+       sub     b
+       add     c
+       jmp     outpx           ; do common test
+outp2: mov     a,c             ; get op pointer
+       sub     b               ; less input pointer
+outpx: ret             ; with free space in a
+;
+;
+;
+; print - get a character from the buffer and print it if the printer 
+;       is ready for it.  If the buffer clears more than 3 spare characters
+;       and an xoff has been sent, then send an xon again.
+print: push    h               ; save for rainy days
+       push    d
+       push    b
+       push    psw             ; .. as we may need flags etc....
+       lda     initflg         ; First check if the system has initialised
+       ana     a
+       jz      printx          ; If system not set up then skip
+;       nop
+;       nop
+;       nop                     ; debugging only...
+       call    ckprtr          ; check to see if printer is ready...
+       ana     a               ; not zero => ok
+       jz      printx          ; else skipit.
+;       nop
+;       nop
+;       nop                     ; skip the jump for debugging
+       lxi     h,prnbuf
+       mov     a,m             ; get input pointer
+       inx     h               ; test against output pointer
+       cmp     m               ; if = then buffer empty
+       jz      printx          ; so quit
+       dcx     h               ;pointer to output pointer
+       call    wrapt           ; check for wrap around
+       sta     prnbuf          ; save new pointer
+       inx     h
+       inx     h               ;
+       call    inchl           ; add output pointer to hl
+       mov     c,m             ; get byte
+       lda     hosths          ; have we told host to be quiet?
+       cpi     xoff            ; if = xoff then we have
+       jnz     print1          ; nope, so just print it.. 
+       push    b               ; save the character to print
+       call    tstfree         ; see how many free bytes in buffer
+       pop     b
+       cpi     4               ; 3 characters left?
+       jz      printx
+       push    b
+       call    sndxon          ; send an xon to host and wake it up.
+       pop     b
+print1:        mov     a,c             ; we are gonna print a character, so ...
+       call    outprx          ; get it to a (as required by outprx) and print it
+printx:
+       pop     psw
+       pop     b
+       pop     d
+       pop     h               ; restore regs.
+       ret
+
+;
+; Utilities for the cyclical buffer.  Returns a 0ffh if printer ready, 
+;       else 0h.  Called by outprn, print
+
+ckprtr:        
+       call    lptstat         ; no registers saved
+;       mvi     a,0             ; FOR DEBUGGING PURPOSES
+;       nop
+       ret
+;
+
+inchl: push    psw             ; we do maths through this register
+       add     l
+       mov     l,a
+       mvi     a,0
+       adc     h
+       mov     h,a
+       pop     psw             ; hl = a + hl
+       ret
+
+; wrapt - checks the offset in a with the limits of the buffer.
+;       returns next address or if wrap around then 0 (start of buffer)
+wrapt: push    b
+       inr     a
+       mov     b,a             ; save new a into b for now
+       mvi     a,szecyc        ; test for size of buffer
+       sub     b
+       mov     a,b
+       pop     b               ; restore bc regs again
+       rnz
+       xra     a               ; if wrap around, then reset pointer
+       ret             ; return with next address pointer to in a
+
+; sndxoff - send an xoff to the host and save the xoff character in hosths
+;      saves all regs.  is called by logwrt, outprn
+sndxoff:
+       push    psw
+       push    b
+       push    d
+       push    h               ; some calling routines may be sensitive...
+       lda     floctl          ; are we doing flow control?
+       ana     a
+       jz      sndxf           ; no, so dont bother.
+       mvi     a,xoff          ;^S to stop the host while we write the buffer.
+       sta     hosths          ; save it so we know we have sent it
+       call    setpar          ; set correct parity...
+       mov     e,a
+       call    outmdm          ; output it.
+       lxi     d,ofsnt         ; say we have sent an xoff
+       call    prtstr
+sndxf: pop     h
+       pop     d
+       pop     b
+       pop     psw             ; some routines touchy
+       ret
+ofsnt: db      cr,lf,'[XOFF sent to host]',cr,lf,'$'
+
+; sndxon - send an xon to the host and clear the hosths flag.  saves everything
+;       called by logwrt, print
+sndxon:        push    psw
+       push    b
+       push    d
+       push    h
+       lda     floctl          ; are we doing flow control?
+       ana     a
+       jz      sndxn
+       xra     a
+       sta     hosths          ; no xoff to hos any more
+       mvi     a,xon           ;^Q to restart the host
+       call    setpar          ; set appropriate parity
+       mov     e,a
+       call    outmdm          ; send it.
+       lxi     d,onsnt
+       call    prtstr          ; say xon sent to host...
+sndxn: pop     h
+       pop     d
+       pop     b
+       pop     psw
+       ret             ; shame we dont do a pushall/popall subroutine...
+onsnt: db      cr,lf,'[XON sent to host]',cr,lf,'$'
+;
+;       Routines to clear (or rather fill) TEMPnnn space with the data in A
+;       and to shift it all along one (filltmp an shiftmp respectively)
+filltmp:
+       push    b
+       push    d
+       push    h               ; save all
+       lxi     h,temp1
+       mvi     b,10            ; ten locations to fill
+fillp: mov     m,a
+       inx     h
+       dcr     b               ; loop til all done
+       jnz     fillp
+       pop     h
+       pop     d
+       pop     b               ; restore all
+       ret
+
+shiftmp:
+       push    psw             ; save all again
+       push    b
+       push    d
+       push    h
+       lxi     d,temp9
+       lxi     h,temp10
+       mvi     b,9             ; shift nine times
+shiftl:        ldax    d               ; from tempx
+       mov     m,a             ; to tempx+1
+       dcx     d
+       dcx     h               ; mover does not work as that increments
+       dcr     b
+       jnz     shiftl
+       pop     h
+       pop     d
+       pop     b
+       pop     psw
+       ret             ; else all done
+
+;       getun - get the user number to temp1 (lsd) and temp2 (msd)
+;
+getun: mvi     a,0ffh          ; tell nout to be quiet
+       sta     nquiet
+       mvi     c,usrcod
+       mvi     e,0ffh          ; get current user from bdos
+       call    bdos
+       mov     l,a             ; put into hl
+       mvi     h,0
+       call    nout            ; decimalise it (decimalise???)
+       xra     a
+       sta     nquiet          ; let nout print again
+       ret
+
+;      ckcon - Do a direct console IO (read) to see if there is any input
+;      returns with a=0 (no input) or character (input received)
+;      Assume that all regs may be destroy.
+ckcon: mvi     e,0ffh          ; direct console input
+       mvi     c,dconio
+       call    bdos
+       ret             ; and return with wahtever returned in a
+
+
+
+;
+; subbc - Subtract the unsigned number in bc from the unsigned number
+;      in HL with the answer in HL.  Flags altered, all 
+;      other registers left intact.
+subbc: sta     temp1           ; hl = hl - bc.. we need the accumulator
+       mov     a,l
+       sub     c
+       mov     l,a
+       mov     a,h
+       sbb     b
+       mov     h,a
+       lda     temp1           ; restore loop counter but not flags
+       ret
+
+; P20LN - Routine to print a string at (DE) and count the number of
+;      line feeds. Pause after 20 lines printed.
+p20ln: xra     a               ; clear the line counter
+       sta     lincnt
+p20ln1:        ldax    d               ; get character to print
+       inx     d
+       cpi     '$'             ; if a dollar we have done
+       rz
+       push    d
+       push    psw             ; save pointer and character to print
+       mov     e,a
+       call    outcon          ; send character
+       pop     psw
+       pop     d               ; restore pointers etc
+       cpi     lf              ; was that last character a line feed?
+       jnz     p20ln1          ; no, so carry on
+       lda     lincnt          ; yup, so update counter
+       inr     a
+       sta     lincnt
+       cpi     20              ; 20 lines printed?
+       jnz     p20ln1          ; not yet
+       push    d               ; we need DE
+;      lxi     d,anymes        ; pause a while [MF]removed
+;      call    prtstr          ; write the message [MF]
+;p20ln2:       call    ckcon           ; wait for any input [MF]
+;      ana     a               ;[MF]
+;      jz      p20ln2          ;[MF]
+       call    pausit          ;[MF] pause a while
+       pop     d
+       jmp     p20ln           ; and continue
+
+
+; Little code to allow some expansion of code without changing
+;  every futher address, only up to the end of this file.
+;   TO BE REMOVED FOR RELEASE!
+
+;      org ($+100h) AND 0FF00H
+
+; link to the data area (was part of CPSUTL.ASM)
+
+IF lasm
+       LINK    CPSDAT
+ENDIF  ;lasm
diff --git a/cpswld.asm b/cpswld.asm
new file mode 100644 (file)
index 0000000..8be6558
--- /dev/null
@@ -0,0 +1,222 @@
+; CPSWLD.ASM
+;       KERMIT - (Celtic for "FREE")
+;
+;       This is the CP/M-80 implementation of the Columbia University
+;       KERMIT file transfer protocol.
+;
+;       Version 4.0
+;
+;       Copyright June 1981,1982,1983,1984
+;       Columbia University
+;
+; Originally written by Bill Catchings of the Columbia University Center for
+; Computing Activities, 612 W. 115th St., New York, NY 10025.
+;
+; Contributions by Frank da Cruz, Daphne Tzoar, Bernie Eiben,
+; Bruce Tanner, Nick Bush, Greg Small, Kimmo Laaksonen, Jeff Damens, and many
+; others. 
+;
+;       Multi-file access subroutine.  Allows processing of multiple files
+;       (i.e., *.ASM) from disk.  This routine builds the proper name in the
+;       FCB each time it is called.  This command would be used in such pro-
+;       grams such as modem transfer, tape save, etc. in which you want to
+;       process single or multiple files.
+;       Note that it will fail if more than 256 entries match the wildcard.
+;
+; revision history:
+; edit 4: June 20, 1986, by OBSchou.  Added stuff at top and tail of routine
+;       to support multiple FCBs.  If the routine get to mfn01 (Search for next)
+;       then the next file found gets its fcb added to the buffer.  Once no 
+;       more files have been found, the mfflg3 flag is set non-zero. 
+;       The first thing to test on entry is whether a disk access
+;       is needed.  Either way, the routine should return the next file name
+;       in the fcb, or return with the carry flag set if there are no more
+;       files to do.  Once there is a carry flag set for the return, all 
+;       temporary flags are reset. Get all that?
+;
+; edit 3: July 27, 1984
+;       support LASM: remove exclamation points, link to CP4CMD.
+;
+; edit 2: June 7, 1984 (CJC)
+;       formatting and documentation; add module version string; redo movfcb,
+;       in preparation for moving DMA buffer (later...).
+;
+; edit 1: May, 1984 (CJC)
+;       extracted from CPMBASE.M80 version 3.9; modifications are described
+;       in the accompanying .UPD file.
+;
+wldver:        db      'CPSWLD.ASM (4)  20-Jun-86$'
+
+;       The FCB will be set up with the next name, ready to do normal 
+;       processing (OPEN, READ, etc.) when routine is called.
+;
+;       Carry is set if no more names can be found
+;
+;       MFFLG1 is count/switch [0 for first time thru, pos for all others]
+;       MFFLG2 is counted down for each successive GETNEXT file call
+;       MFFLG3 is set to the last remaining FCBs buffered once Search for next
+;               file fails with files in the buffer.
+;
+;       Technique used is to repeat SFIRST/SNEXT sequence N+1 times for each
+;       successive call, till sequence fails. CP/M does NOT allow disk-handling
+;       between SFIRST and SNEXT.
+;       called by: send, seof, dir
+
+mfname:        ora     a               ; clear carry
+       push    b               ;Save registers
+       push    d
+       push    h
+       jmp     mfnam0          ; skip over the next bit (which is entered from elsewhere)
+
+;[4] Get the FCB counter and see if we have any fcbs already.
+mfnam1:        lxi     h,fcb0
+       shld    xfcbptr         ; reset the pointer if we are to return an FCB
+
+mfnam0:        lda     fcbcnt
+       ana     a               ; if none, then we may have to get some from disk
+       jz      mfn00           ; see later on
+       lhld    xfcbptr         ; we have some, so give the next one to the user
+       lxi     d,fcb           ; move from (hl) to (de) for length bc
+       lxi     b,12
+       call    mover
+       xra     a
+       sta     fcbext          ; clear fcb extents and such
+       sta     fcbrno          ; like record number
+       lhld    xfcbptr         ; point to next fcb
+       lxi     d,fcblen
+       dad     d               ; yup
+       shld    xfcbptr
+       lda     fcbcnt
+       dcr     a
+       sta     fcbcnt          ; decrease the number of fcbs we have
+       xra     a               ; clear carry
+       jmp     mffix1          ; and exit as if were all done
+
+mfn00: lda     mfflg3          ; no more FCBs for the user, any more on disk?
+       ana     a
+       jnz     mffix2          ; no, then set the carry flag to say so.
+       lxi     h,fcb0          ; now reset the fcb pointers and counter
+       shld    xfcbptr
+       xra     a
+       sta     fcbcnt
+;[4] end of this addition.  See below as well.
+
+
+       mvi     c,setdma        ;Init DMA addr, FCB
+       lxi     d,80H
+       call    bdos
+       xra     a               ;A = 0
+       sta     fcbext          ;clear extension
+       lda     mfflg1          ;find out if "second" call in row
+       ora     a
+       jnz     mfn01           ;Were here before
+       sta     mfflg2
+       lxi     h,fcb
+       lxi     d,mfreq
+       lxi     b,12
+       call    mover           ;.from FCB to MFREQ
+       mvi     c,SFIRST        ;Search first
+       lxi     d,fcb
+       call    bdos
+       jmp     mfn02           ;and check results
+
+mfn01: dcr     a
+       sta     mfflg2          ;store down-counter
+       lxi     h,mfreq         ;SFIRST REQ name
+       lxi     d,fcb
+       lxi     b,12
+       call    mover           ;.from MFREQ to FCB
+       mvi     c,sfirst        ;Search first old one,we got it before
+       lxi     d,fcb
+       call    bdos            ;no error's expected -we got that before
+mfn01a:
+       mvi     c,snext         ;Search next
+       call    bdos
+mfn02: push    psw
+       lda     mfflg2          ;get "repeat file counter"
+       ora     a
+       jz      mfn02a          ;if zero, check if SNEXT had ERROR
+       dcr     a               ;count down
+       sta     mfflg2          ;store back
+       pop     psw             ;no error-check, we got it before
+       jmp     mfn01a          ;next SNEXT
+
+mfn02a:        pop     psw
+       ora     a
+       jm      mffi2a          ;No (more) found
+       call    movfcb          ;move data to fcb
+       lda     mfreq           ;the original disk-designator
+       sta     fcb             ;back into fcb
+       lda     mfflg1          ;get file-flag
+       inr     a               ;increment
+       sta     mfflg1          ;and store for next go-around
+       mvi     a,0             ;Setup FCB
+       sta     fcbext          ;clean up FCB for OPEN etc
+       sta     fcbrno
+       lhld    xfcbptr         ;[4] like here 
+       xchg
+       lxi     h,fcb           ;[4] from fcb space
+       lxi     b,12
+       call    mover
+       lhld    xfcbptr         ;[4] now lets update the pointers
+       lxi     d,fcblen
+       dad     d
+       shld    xfcbptr         ;[4] new pointer
+       lda     fcbcnt          ;[4] now the fcb counter
+       inr     a
+       sta     fcbcnt
+       cpi     maxfcb          ;[4] any more spare space?
+       jp      mfnam1          ;[4] nope, so get first fcb and return
+       lxi     d,fcb           ; else restore the file to serach for
+       lxi     h,mfreq
+       lxi     b,12            ; copy the original fcb to fcb
+       call    mover
+       jmp     mfn01a          ; and look for next match.
+
+mffix1:        pop     h               ;restore registers
+       pop     d
+       pop     b
+       ret                     ;and return
+
+mffi2a:
+       sta     mfflg3          ;[4] no more FCBs from disks to be had, but
+       lda     fcbcnt          ;[4]we have some in the buffer, havet we?
+       ana     a
+       jnz     mfnam1          ;[4] yes, so all's ok.  Get an fcb and return,
+
+mffix2:        xra     a
+       sta     mfflg3          ;[4] clear the new flag (=no more fcbs at all)
+       sta     mfflg2          ;[4] may as well do the others, as we're not comming again
+       sta     mfflg1          ;[4]
+       stc                     ;set carry
+       jmp     mffix1          ;return with CARRY set
+
+;       copy directory entry to FCB
+;       called with A/ entry number in directory (0-3)
+;                   directory block in DMA buffer (buff)
+
+movfcb:        add     a
+       add     a
+       add     a
+       add     a
+       add     a               ;* 32
+       mov     c,a             ; copy offset to bc
+       mvi     b,0             ; (high byte is zero)
+       lxi     h,buff          ; get start of disk buffer
+       dad     b               ; calculate start of directory entry
+       lxi     d,fcb
+       lxi     b,12
+       call    mover
+       ret
+
+;       Data storage for MFNAME (multi-file access)
+mfreq: DS      12              ;Requested name
+mfflg1:        DB      0               ;First time thru flag for MFNAME
+mfflg2:        DB      0               ;Down counter for MFNAME
+mfflg3:        DB      0               ;[4] Non zero if no more FCBs from disk,
+                               ;[4] but we still have some in buffer
+;\f
+IF lasm
+       LINK    CPSCMD
+ENDIF;lasm
+
diff --git a/cpva65.hex b/cpva65.hex
new file mode 100644 (file)
index 0000000..342443c
--- /dev/null
@@ -0,0 +1,65 @@
+:10700000AC0006009972B672C32773C33773C347C7
+:1070100073C35173C32873C33173C32973C35B73C1
+:10702000C35973C30000C30000C39273C38873C302
+:107030008273C39873C3F871C3D471C3C871C3BCDE
+:1070400071C3C271C3DD71C3E671C3EF71C3AC70AC
+:10705000C3DB72C3DC72C3DD72C3DE72C3FB72C3F7
+:107060001F73C32573C32673C32673C32771C36AF3
+:1070700073C34F71C32572C31472C2730000000042
+:10708000000000000010011DFFFFFFFF00000001D5
+:107090000000000650500805000000000D0D2323DD
+:0770A00031004080000101F6
+:1070AC00CDE0700E07CD050032DF700E0CCD050063
+:1070BC007D32DE70113372CD1472119E73CD147249
+:1070CC00CD117221EE7322A3703E4032A570CDD04B
+:0270DC0072C977
+:1070E0002A01001103001922087111030019220B53
+:1070F0007111030019220E7111030019221171116F
+:107100001E0019221371C9C30000C30000C3000090
+:10711000C30000C300000E14064605C21A710DC25A
+:1071200018713DC21671C9D511AC73CD1472D1CD91
+:1071300014721E5BCD3173119E73CD1472114A729D
+:10714000CD14723A8D70B7C8118272CD1472C93ADB
+:10715000DE70FE30FA86713A5C00B7CA62713DC3D8
+:1071600067710E19CD05005F0E2ECD05000603AF29
+:107170000E032183002B7E1F770DC2757105C26F30
+:10718000715E2356EBC90E1BCD0500EB2AA77023B9
+:10719000010000D51A1E0817DA9C7103572B7DB425
+:1071A000CAAD717A1DC29771D113C39371D1696051
+:1071B0003AAA70D603C8293DC2B671C9011404C3E6
+:1071C0006A73011405C36A73010C06CD6A7311EA70
+:1071D00073C31472010107CD6A73C3CE7101010834
+:1071E000CD6A73C3CE71010809CD6A73C3CE710134
+:1071F000080BCD6A73C3CE713A8D70B7CA057201A0
+:10720000010DC30872010109CD6A7311E673C3143D
+:1072100072113072E5D5C50E09CD0500C1D1E1C9A5
+:10722000E1232323E97E1223130B78B1C22572C90F
+:107230000D0A24636F6E6669677572656420666FF8
+:10724000722024207769746820245D0D0A0D0A4E8F
+:10725000756D626572206F66207061636B65747313
+:107260003A0D0A4E756D626572206F662072657404
+:10727000726965733A0D0A46696C65206E616D65C9
+:107280003A240D0A0D0A0D0A527061636B3A0D0A19
+:107290000D0A537061636B3A244350585357542E70
+:1072A00041534D20283130292020372D4A616E2D41
+:1072B0003139393120244350584150502E41534DDB
+:1072C00020283229202032322D6A756C2D3837243F
+:1072D0003E0332ACE03E1532ACE0C9C9C9C911E584
+:1072E00072CD1472C90D0A4220205472616E736D02
+:1072F0006974206120425245414B24E65FFE42CA38
+:107300000573C320723AACE0E602CA05733E15F677
+:107310006032ACE03E19CD16713E1532ACE0C97B4F
+:10732000C97BC97BC9C9C9C9C90E061EFFCD0500E5
+:10733000C90E06CD0500C9E521ACE07EE602CA3BD8
+:107340007321ADE073E1C93AACE0E601C83AADE0C3
+:10735000C9CD4773B7C25173C9AFC9D5CD2373A780
+:10736000CA68730E05CD0500D1C9C511BF73CD1410
+:1073700072E17CC61F5FE5CD3173E17DC61F5FC33F
+:10738000317311BC73C314721E20CD31731E08C338
+:10739000317311B873C3147211B473C31472417092
+:1073A000706C652049492043502F4D241E1B590DF8
+:1073B0000A2020241E1B59240D1B54240808241BBA
+:1073C0003D240B2400000A240000062400002400B1
+:1073D00000002400000024000000240000001E24FF
+:0E73E00000000B2400001B5924001B54240045
+:0000000000
diff --git a/cpvacc.hex b/cpvacc.hex
new file mode 100644 (file)
index 0000000..579b59e
--- /dev/null
@@ -0,0 +1,64 @@
+:10700000AC00060000721D72C30F73C31F73C32A46
+:1070100073C33273C31073C31973C31173C33C7347
+:10702000C33A73C30000C30000C35A73C35073C391
+:107030004B73C36073C3B871C3B871C3B871C3A9CC
+:1070400071C3AE71C3B871C3BB71C3C171C3AC703E
+:10705000C33A72C33B72C33C72C33D72C35A72C31C
+:107060008572C38B72C38C72C30E73C33371C390AA
+:1070700073C33C71C3DB71C3CA710000BA72E97299
+:10708000000000000010FF1CFFFFFFFF00000001D8
+:107090000000000650500805000000000D0D2323DD
+:0770A00031004080000101F6
+:1070AC00CDEC700E07CD050032EB700E0CCD05004B
+:1070BC007D32EA7011E971CDCA71116673CDCA7156
+:1070CC0011F971CDCA71119173CDCA71CDC77121EE
+:0E70DC00E47322A3703E4032A570CD3972C914
+:1070EC002A0100110300192214711103001922172F
+:1070FC007111030019221A7111030019221D71114B
+:10710C001E0019221F71C9C30000C30000C3000078
+:10711C00C30000C300000E28064605C226710DC22E
+:10712C0024713DC22271C9D511BC73CDCA71D1C9AC
+:10713C003AEA70FE30FA73713A5C00B7CA4F713D8F
+:10714C00C354710E19CD05005F0E2ECD050006033C
+:10715C00AF0E032183002B7E1F770DC2627105C217
+:10716C005C715E2356EBC90E1BCD0500EB2AA77094
+:10717C0023010000D51A1E0817DA897103572B7DDD
+:10718C00B4CA9A717A1DC28471D113C38071D1694A
+:10719C00603AAA70D603C8293DC2A371C91E20C388
+:1071AC0019731E20CD19731E25C31973C3C7711112
+:1071BC00D073C3CA7111DA73C3CA7111E671E5D504
+:1071CC00C50E09CD0500C1D1E1C9E1232323E97E18
+:1071DC001223130B78B1C2DB71C90D0A24636F6ED5
+:1071EC006669677572656420666F72202420776902
+:1071FC00746820244350585357542E41534D202823
+:10720C003130292020372D4A616E2D31393931200A
+:10721C00244350585359532E41534D202834302970
+:10722C00202032382D4175672D38392024C9C9C921
+:10723C00C9114472CDCA71C90D0A42202054726121
+:10724C006E736D6974206120425245414B24E65F98
+:10725C00FE42CA6472C3D6713E01D342DB42E601E0
+:10726C00CA64723E05D3423EFAD3423E1ECD227111
+:10727C003E05D3423EEAD342C97BC97BC97BC9C90F
+:10728C007B329C723E14CD9D723A9C72CD9D72C91C
+:10729D00D3903E01D323DBA007DAA372DB80F5AFD9
+:1072AD00D323DBA007DAAF72F13202EEC906043147
+:1072BD00323030242828043234303024141403336F
+:1072CD00303024A0A00434383030240A0A0336307C
+:1072DD003024505004393630302405050D0A202055
+:1072ED0033303020203630302020313230302020E5
+:1072FD0032343030202034383030202039363030A0
+:10730D0024C9C9C90E061EFFCD0500C90E06CD053F
+:10731D0000C9DB42E604CA1F737BD340C9DB42E6DA
+:10732D0001C8DB40C9CD2A73B7C23273C9AFC9D505
+:10733D00CD8972A7CA49730E05CD0500D1C91E08A6
+:10734D00C319731E20CD19731E08C3197311CB7386
+:10735D00C3CA7111E671C3CA714163747269782031
+:10736D0043502F4D244350585644552E41534D20D4
+:10737D0020283629202031322D4F63742D31393993
+:10738D00302024C947656E65726963202844756D88
+:10739D00622920435254205465726D696E616C20D0
+:1073AD00747970652073656C656374656420240D54
+:1073BD000A5374617274696E67202E2E2E245E55E9
+:1073CD000D0A240D0A525061636B3A20240D0A53A5
+:0773DD005061636B3A2024AC
+:0000000000
diff --git a/cpvadv.hex b/cpvadv.hex
new file mode 100644 (file)
index 0000000..dfccf48
--- /dev/null
@@ -0,0 +1,71 @@
+:10700000AC0006009972B672C39873C3A773C3B27B
+:1070100073C3BA73C39873C3A173C39973C3C4739F
+:10702000C3C273C30000C30000C3F673C3EC73C3D1
+:10703000EB73C3FC73C3F871C3D471C3C871C3BC11
+:1070400071C3C271C3DD71C3E671C3EF71C3AC70AC
+:10705000C3EA72C3EB72C3EC72C3ED72C30A73C3AB
+:107060002973C33373C33473C39773C32771C3D3F3
+:1070700073C34F71C32572C314722474387367735A
+:10708000000000000010011CFFFFFFFF00000001D6
+:107090000000000650500805000000000D0D2323DD
+:0770A00031004080000101F6
+:1070AC00CDE0700E07CD050032DF700E0CCD050063
+:1070BC007D32DE70113372CD1472110274CD1472E4
+:1070CC00CD117221507422A3703E4032A570CDD3E5
+:0270DC0072C977
+:1070E0002A01001103001922087111030019220B53
+:1070F0007111030019220E7111030019221171116F
+:107100001E0019221371C9C30000C30000C3000090
+:10711000C30000C300000E28064605C21A710DC246
+:1071200018713DC21671C9D5111774CD1472D1CD25
+:1071300014721E5BCDA173110274CD1472114A72C8
+:10714000CD14723A8D70B7C8118272CD1472C93ADB
+:10715000DE70FE30FA86713A5C00B7CA62713DC3D8
+:1071600067710E19CD05005F0E2ECD05000603AF29
+:107170000E032183002B7E1F770DC2757105C26F30
+:10718000715E2356EBC90E1BCD0500EB2AA77023B9
+:10719000010000D51A1E0817DA9C7103572B7DB425
+:1071A000CAAD717A1DC29771D113C39371D1696051
+:1071B0003AAA70D603C8293DC2B671C9011404C3E6
+:1071C000D373011405C3D373010C06CDD373114CD3
+:1071D00074C31472010107CDD373C3CE71010108CA
+:1071E000CDD373C3CE71010809CDD373C3CE710162
+:1071F000080BCDD373C3CE713A8D70B7CA05720137
+:10720000010DC30872010109CDD373114874C31471
+:1072100072113072E5D5C50E09CD0500C1D1E1C9A5
+:10722000E1232323E97E1223130B78B1C22572C90F
+:107230000D0A24636F6E6669677572656420666FF8
+:10724000722024207769746820245D0D0A0D0A4E8F
+:10725000756D626572206F66207061636B65747313
+:107260003A0D0A4E756D626572206F662072657404
+:10727000726965733A0D0A46696C65206E616D65C9
+:107280003A240D0A0D0A0D0A527061636B3A0D0A19
+:107290000D0A537061636B3A244350585357542E70
+:1072A00041534D20283130292020372D4A616E2D41
+:1072B0003139393120244350584E4F522E41534DCD
+:1072C0002020283429202031362D4A616E2D313975
+:1072D0003931243E40D351217070228870EBCD3477
+:1072E000733E4ED3513E37D351C9C9C9C911F47247
+:1072F000CD1472C90D0A4220205472616E736D69FB
+:1073000074206120425245414B24E65FFE42CA147C
+:1073100073C32072DB51E604CA14733E3FD3513E5F
+:1073200019CD16713E37D351C97BFE04C0AFC97B5E
+:10733000C97BC9C97BD358C90604313230302470A7
+:1073400070043234303024787803333030244040B5
+:107350000434383030247C7C0336303024606004C0
+:1073600039363030247E7E0D0A2020203330302004
+:107370002020203630302020202031323030202094
+:10738000202032343030202020203438303020206B
+:1073900020203936303024C9C90E061EFFCD050025
+:1073A000C90E06CD0500C9DB51E601CAA7737BD320
+:1073B00050C9DB51E602C8DB50C9CDB273B7C2BABF
+:1073C00073C9AFC9D5CD3173A7CAD1730E05CD0529
+:1073D00000D1C9C5112174CD1472E17CC61F5FE5CF
+:1073E000CDA173E17DC61F5FC3A173C91E20CDA1CE
+:1073F000731E08C3A173111E74C31472111C74C3CD
+:1074000014724E6F727468205374617220416476F6
+:10741000616E7461676524040D0A092404240D0E4D
+:10742000241B3D240B2400000A2400000C2400002F
+:10743000082400000424000012240000132400008B
+:107440001E2400000B2400000F2400000E24000066
+:0000000000
diff --git a/cpvamp.hex b/cpvamp.hex
new file mode 100644 (file)
index 0000000..a50feff
--- /dev/null
@@ -0,0 +1,72 @@
+:10700000AC00060000723772C38C73C39B73C3A6B7
+:1070100073C3AE73C38C73C39573C38D73C3B873DB
+:10702000C3B673C30000C30000C3D373C3C973C323
+:10703000C473C3D973C3B871C3B871C3B871C3A9DA
+:1070400071C3AE71C3B871C3BB71C3C171C3AC703E
+:10705000C36A72C36B72C37572C37672C3BE72C3E6
+:10706000FE72C30073C30173C38B73C33371C31048
+:1070700074C33C71C3DB71C3CA710000367365739E
+:10708000000000000010FF1CFFFFFFFF00000001D8
+:107090000000000650500805000000000D0D2323DD
+:0770A00031004080000101F6
+:1070AC00CDEC700E07CD050032EB700E0CCD05004B
+:1070BC007D32EA7011E971CDCA7111DF73CDCA71DD
+:1070CC0011F971CDCA71111174CDCA71CDC771216D
+:0E70DC00647422A3703E4032A570CD5272C97A
+:1070EC002A0100110300192214711103001922172F
+:1070FC007111030019221A7111030019221D71114B
+:10710C001E0019221F71C9C30000C30000C3000078
+:10711C00C30000C300000E14064605C226710DC242
+:10712C0024713DC22271C9D5113C74CDCA71D1C92B
+:10713C003AEA70FE30FA73713A5C00B7CA4F713D8F
+:10714C00C354710E19CD05005F0E2ECD050006033C
+:10715C00AF0E032183002B7E1F770DC2627105C217
+:10716C005C715E2356EBC90E1BCD0500EB2AA77094
+:10717C0023010000D51A1E0817DA897103572B7DDD
+:10718C00B4CA9A717A1DC28471D113C38071D1694A
+:10719C00603AAA70D603C8293DC2A371C91E20C388
+:1071AC0095731E20CD95731E25C39573C3C771119E
+:1071BC005074C3CA71115A74C3CA7111E671E5D502
+:1071CC00C50E09CD0500C1D1E1C9E1232323E97E18
+:1071DC001223130B78B1C2DB71C90D0A24636F6ED5
+:1071EC006669677572656420666F72202420776902
+:1071FC00746820244350585357542E41534D202823
+:10720C003130292020372D4A616E2D31393931200A
+:10721C00244350585359532E41534D20283335296C
+:10722C002030312D4465632D38362443505842426A
+:10723C00492E41534D202834292020372D4A616E88
+:10724C002D31393931241160720E0A1A13D38C0D79
+:10725C00C25772C918180444010003C105EAC911C8
+:10726C007272CDCA71C90D0A24C9117D72CDCA7151
+:10727C00C90D0A4220205472616E736D69742061CD
+:10728C0020425245414B0D0A48202048616E6775DB
+:10729C0070207573696E67204454520D0A57202074
+:1072AC00576970652073637265656E20636C6561E8
+:1072BC007224E65FFE42CAD972FE48CAD272FE57E9
+:1072CC00CAD973C3D671160A1EFFC3E872169A1E6A
+:1072DC001E3E01D38CDB8CE601CADD723E05D38CDD
+:1072EC003E6AB2D38C7BCD22713E05D38C3EEAD361
+:1072FC008CC97BC9C91E3FCD2F733E47773A897025
+:10730C0023771E50CD2F733E3FA6773A8870B73E39
+:10731C0080CA22733E40B677212E73E51E36CD2FE0
+:10732C0073E9C92A0100160019C90604313230303C
+:10733C0024016804323430302401340333303024D7
+:10734C0000D0043438303024011A03363030240194
+:10735C00D0043936303024010D0D0A202020333072
+:10736C003020203630302020313230302020323462
+:10737C00303020203438303020203936303024C999
+:10738C00C90E061EFFCD0500C90E06CD0500C9DBD2
+:10739C008CE604CA9B737BD388C9DB8CE601C8DB03
+:1073AC0088C9CDA673B7C2AE73C9AFC9D5A7CAC2B7
+:1073BC00730E05CD0500D1C91E08C395731E20CDD3
+:1073CC0095731E08C39573114B74C3CA7111E67182
+:1073DC00C3CA71416D70726F204C6974746C6520F6
+:1073EC00426F617264244350585644552E41534D9C
+:1073FC002020283629202031322D4F63742D31392D
+:10740C0039302024C947656E65726963202844753C
+:10741C006D622920435254205465726D696E616C03
+:10742C0020747970652073656C65637465642024C1
+:10743C000D0A5374617274696E67202E2E2E245EB1
+:10744C00550D0A240D0A525061636B3A20240D0A23
+:08745C00535061636B3A2024D8
+:0000000000
diff --git a/cpvapl.hex b/cpvapl.hex
new file mode 100644 (file)
index 0000000..39953f4
--- /dev/null
@@ -0,0 +1,75 @@
+:10700000AC0006009972B672C3C873C3D873C3E8E4
+:1070100073C3F273C3C973C3D273C3CA73C3FC739C
+:10702000C3FA73C30000C30000C33374C32974C31D
+:107030002374C33974C3F871C3D471C3C871C3BC9A
+:1070400071C3C271C3DD71C3E671C3EF71C3AC70AC
+:10705000C3E972C3EA72C3EB72C3EC72C3EE72C3CC
+:10706000F372C3F972C3FA72C3C773C32771C30B38
+:1070700074C34F71C32572C31472637404736B734A
+:10708000000000000010011DFFFFFFFF00000001D5
+:107090000000000650500805000000000D0D2323DD
+:0770A00031004080000101F6
+:1070AC00CDE0700E07CD050032DF700E0CCD050063
+:1070BC007D32DE70113372CD1472113F74CD1472A7
+:1070CC00CD1172218F7422A3703E4032A570CDD0A9
+:0270DC0072C977
+:1070E0002A01001103001922087111030019220B53
+:1070F0007111030019220E7111030019221171116F
+:107100001E0019221371C9C30000C30000C3000090
+:10711000C30000C300000E14064605C21A710DC25A
+:1071200018713DC21671C9D5114D74CD1472D1CDEF
+:1071300014721E5BCDD273113F74CD1472114A725A
+:10714000CD14723A8D70B7C8118272CD1472C93ADB
+:10715000DE70FE30FA86713A5C00B7CA62713DC3D8
+:1071600067710E19CD05005F0E2ECD05000603AF29
+:107170000E032183002B7E1F770DC2757105C26F30
+:10718000715E2356EBC90E1BCD0500EB2AA77023B9
+:10719000010000D51A1E0817DA9C7103572B7DB425
+:1071A000CAAD717A1DC29771D113C39371D1696051
+:1071B0003AAA70D603C8293DC2B671C9011404C3E6
+:1071C0000B74011405C30B74010C06CD0B74118BE9
+:1071D00074C31472010107CD0B74C3CE7101010891
+:1071E000CD0B74C3CE71010809CD0B74C3CE7101F0
+:1071F000080BCD0B74C3CE713A8D70B7CA057201FE
+:10720000010DC30872010109CD0B74118774C314F9
+:1072100072113072E5D5C50E09CD0500C1D1E1C9A5
+:10722000E1232323E97E1223130B78B1C22572C90F
+:107230000D0A24636F6E6669677572656420666FF8
+:10724000722024207769746820245D0D0A0D0A4E8F
+:10725000756D626572206F66207061636B65747313
+:107260003A0D0A4E756D626572206F662072657404
+:10727000726965733A0D0A46696C65206E616D65C9
+:107280003A240D0A0D0A0D0A527061636B3A0D0A19
+:107290000D0A537061636B3A244350585357542E70
+:1072A00041534D20283130292020372D4A616E2D41
+:1072B0003139393120244350584150502E41534DDB
+:1072C00020283229202032322D6A756C2D3837243F
+:1072D0003AABE0E60F3288703289703E0B32A9E09B
+:1072E00032AAE03E1832ABE0C9C9C9C9C924E65F79
+:1072F000C320727BC97BC97BC9C93AABE0E6F0B356
+:1073000032ABE0C90D033131302403030431323094
+:1073100030240808053133342E3524040403313574
+:10732000302405050431383030240909053139325B
+:107330003030240F0F0432343030240A0A03333043
+:10734000302406060433363030240B0B0434383036
+:1073500030240C0C03363030240707043732303029
+:10736000240D0D0439363030240E0E0D0A20203144
+:107370003130202020203133342E3520203135305B
+:107380002020202033303020202020363030202094
+:107390002031323030202020313830300D0A203278
+:1073A0003430302020203336303020202034383024
+:1073B0003020202037323030202020393630302025
+:1073C00020313932303024C9C9C90E061EFFCD051F
+:1073D00000C90E06CD0500C9E521A9E07EE610CA68
+:1073E000DC7321A8E073E1C93AA9E0E608C83AA82D
+:1073F000E0C9CDE873B7C2F273C9AFC9D5CDF77292
+:10740000A7CA09740E05CD0500D1C9C5116074CD98
+:107410001472E17CC61F5FE5CDD273E17DC61F5FAC
+:10742000C3D273115D74C314721E20CDD2731E08B3
+:10743000C3D273115974C31472115574C3147241B9
+:1074400070706C652049492043502F4D241E1B59F4
+:107450000D0A2020241E1B59240D1B542408082427
+:107460001B3D240B2400000A2400000624000024F5
+:107470000000002400000024000000240000001E82
+:0F7480002400000B2400001B5924001B5424007F
+:0000000000
diff --git a/cpvapm.hex b/cpvapm.hex
new file mode 100644 (file)
index 0000000..9b4e18f
--- /dev/null
@@ -0,0 +1,79 @@
+:10700000AC0006008872A572C3FD73C30D74C31D66
+:1070100074C32774C3FE73C30774C3FF73C331748F
+:10702000C32F74C30000C30000C36874C35E74C37D
+:107030005874C36E74C3E771C3C371C3B771C3AB74
+:1070400071C3B171C3CC71C3D571C3DE71C3AC70F0
+:10705000C3C072C3C172C3C773C3C873C3E273C36F
+:10706000F173C3F773C3FC73C3FC73C31671C340DE
+:1070700074C33E71C31472C303729874000000009D
+:10708000000000000010011DFFFFFFFF00000001D5
+:107090000000000650500805000000000D0D2323DD
+:0770A00031004080000101F6
+:1070AC00CDE0700E07CD050032DF700E0CCD050063
+:1070BC007D32DE70112272CD0372117474CD0372A5
+:1070CC00CD007221C47422A3703E4032A570CDBF96
+:0270DC0072C977
+:1070E0002A01001103001922087111030019220B53
+:1070F0007111030019220E7111030019221171116F
+:107100001E0019221371C9C30000C30000C3000090
+:10711000C30000C30000D5118274CD0372D1CD032A
+:10712000721E5BCD0774117474CD0372113972CD68
+:1071300003723A8D70B7C8117172CD0372C93ADE0D
+:1071400070FE30FA75713A5C00B7CA51713DC35692
+:10715000710E19CD05005F0E2ECD05000603AF0E92
+:10716000032183002B7E1F770DC2647105C25E71FF
+:107170005E2356EBC90E1BCD0500EB2AA770230139
+:107180000000D51A1E0817DA8B7103572B7DB4CA7D
+:107190009C717A1DC28671D113C38271D169603A24
+:1071A000AA70D603C8293DC2A571C9011404C34001
+:1071B00074011405C34074010C06CD407411C074F1
+:1071C000C30372010107CD4074C3BD71010108CD35
+:1071D0004074C3BD71010809CD4074C3BD7101087D
+:1071E0000BCD4074C3BD713A8D70B7CAF471010103
+:1071F0000DC3F771010109CD407411BC74C3037252
+:10720000111F72E5D5C50E09CD0500C1D1E1C9E157
+:10721000232323E97E1223130B78B1C21472C90D04
+:107220000A24636F6E6669677572656420666F72A3
+:107230002024207769746820245D0D0A0D0A4E759C
+:107240006D626572206F66207061636B6574733A5E
+:107250000D0A4E756D626572206F662072657472DC
+:107260006965733A0D0A46696C65206E616D653A11
+:10727000240D0A0D0A0D0A527061636B3A0D0A0D56
+:107280000A537061636B3A244350585357542E414C
+:10729000534D20283130292020372D4A616E2D3161
+:1072A00039393120244350584150502E41534D20FC
+:1072B000283229202032322D6A756C2D383724C9A6
+:1072C000C9CDC872C30501C93AA7E03AA6E0E604F1
+:1072D000CA0F72AF32A5E001E803CDB3733E8F321F
+:1072E0006B733E8D32A5E03E0332A7E03E1132A71C
+:1072F000E001C409CDB373116C73CD03720E01CDDF
+:107300000500F5FE30DA3573FE3AD23573E60FC26A
+:1073100014733E0A5F3E0D32A5E0013D00CDB3730C
+:107320003E8D32A5E0012700CDB3731DC215730158
+:107330005802CDB373F1FE0DC2FD72117D73CD0302
+:10734000720E061EFFCD0500B7C266733AA7E03A7B
+:10735000A6E0E604C241733A6B7332A5E011A47350
+:10736000CD0372C30F72AF32A5E0C9004E756D62D6
+:10737000657220746F204469616C3A20240D0A41C3
+:1073800077616974696E6720436172726965722EF4
+:107390002E2E2E28616E79206B65792061626F72C6
+:1073A000747329240D0A436F6E6E65637465642ED1
+:1073B0000D0A24C5D5041E7E1DC2B8730DC2B67356
+:1073C00005C2B673D1C1C9C911CF73CD0372C90D3E
+:1073D0000A44202044726F7020746865206C696EC6
+:1073E0006524E65FFE44C2EE73AF32A5E0C9C30F69
+:1073F000727BC97BC97BC9AF32A5E0C9C9C9C90EB7
+:10740000061EFFCD0500C90E06CD0500C9E521A663
+:10741000E07EE602CA117421A7E073E1C93AA6E052
+:10742000E601C83AA7E0C9CD1D74B7C22774C9AF39
+:10743000C9D5CDF573A7CA3E740E05CD0500D1C9D7
+:10744000C5119574CD0372E17CC61F5FE5CD07744D
+:10745000E17DC61F5FC30774119274C303721E20BF
+:10746000CD07741E08C30774118E74C30372118A8A
+:1074700074C303724170706C652049492043502FDA
+:107480004D241E1B590D0A2020241E1B59240D1BA0
+:1074900054240808241B3D240B2400000A24000067
+:1074A0000624000024000000240000002400000046
+:1074B000240000001E2400000B2400001B5924009F
+:0474C0001B54240035
+:0000000000
diff --git a/cpvbb2.hex b/cpvbb2.hex
new file mode 100644 (file)
index 0000000..78fff5c
--- /dev/null
@@ -0,0 +1,71 @@
+:10700000AC00060000723772C38073C38F73C39ADB
+:1070100073C3A273C38073C38973C38173C3AC7317
+:10702000C3AA73C30000C30000C3C773C3BD73C347
+:10703000B873C3CD73C3B871C3B871C3B871C3A9F2
+:1070400071C3AE71C3B871C3BB71C3C171C3AC703E
+:10705000C36A72C36B72C37572C37672C3BE72C3E6
+:10706000FE72C30073C30173C37F73C33371C3FE66
+:1070700073C33C71C3DB71C3CA7100000B734C73E3
+:10708000000000000010FF1CFFFFFFFF00000001D8
+:107090000000000650500805000000000D0D2323DD
+:0770A00031004080000101F6
+:1070AC00CDEC700E07CD050032EB700E0CCD05004B
+:1070BC007D32EA7011E971CDCA7111D373CDCA71E9
+:1070CC0011F971CDCA7111FF73CDCA71CDC7712180
+:0E70DC00527422A3703E4032A570CD5272C98C
+:1070EC002A0100110300192214711103001922172F
+:1070FC007111030019221A7111030019221D71114B
+:10710C001E0019221F71C9C30000C30000C3000078
+:10711C00C30000C300000E28064605C226710DC22E
+:10712C0024713DC22271C9D5112A74CDCA71D1C93D
+:10713C003AEA70FE30FA73713A5C00B7CA4F713D8F
+:10714C00C354710E19CD05005F0E2ECD050006033C
+:10715C00AF0E032183002B7E1F770DC2627105C217
+:10716C005C715E2356EBC90E1BCD0500EB2AA77094
+:10717C0023010000D51A1E0817DA897103572B7DDD
+:10718C00B4CA9A717A1DC28471D113C38071D1694A
+:10719C00603AAA70D603C8293DC2A371C91E20C388
+:1071AC0089731E20CD89731E25C38973C3C77111C2
+:1071BC003E74C3CA71114874C3CA7111E671E5D526
+:1071CC00C50E09CD0500C1D1E1C9E1232323E97E18
+:1071DC001223130B78B1C2DB71C90D0A24636F6ED5
+:1071EC006669677572656420666F72202420776902
+:1071FC00746820244350585357542E41534D202823
+:10720C003130292020372D4A616E2D31393931200A
+:10721C00244350585359532E41534D20283335296C
+:10722C002030312D4465632D38362443505842426A
+:10723C00492E41534D202834292020372D4A616E88
+:10724C002D31393931241160720E0A1A13D3810D84
+:10725C00C25772C918180444010003C105EAC911C8
+:10726C007272CDCA71C90D0A24C9117D72CDCA7151
+:10727C00C90D0A4220205472616E736D69742061CD
+:10728C0020425245414B0D0A48202048616E6775DB
+:10729C0070207573696E67204454520D0A57202074
+:1072AC00576970652073637265656E20636C6561E8
+:1072BC007224E65FFE42CAD972FE48CAD272FE57E9
+:1072CC00CACD73C3D671160A1EFFC3E872169A1E76
+:1072DC001E3E01D381DB81E601CADD723E05D381FE
+:1072EC003E6AB2D3817BCD22713E05D3813EEAD377
+:1072FC0081C97BC9C9F33E47D3897BD389FBC908B4
+:10730C00043132303024202005313932303024021F
+:10731C000204323430302410100333303024808097
+:10732C00053338343030240101043438303024082B
+:10733C0008033630302440400439363030240404FD
+:10734C000D0A2020203330302020203630302020F1
+:10735C00313230302020323430302020343830304C
+:10736C002020393630302031393230302033383427
+:10737C00303024C9C90E061EFFCD0500C90E06CD3E
+:10738C000500C9DB81E604CA8F737BD380C9DB811E
+:10739C00E601C8DB80C9CD9A73B7C2A273C9AFC965
+:1073AC00D5A7CAB6730E05CD0500D1C91E08C38971
+:1073BC00731E20CD89731E08C38973113974C3CA17
+:1073CC007111E671C3CA7142696720426F617264C0
+:1073DC00204949244350585644552E41534D2020A2
+:1073EC00283629202031322D4F63742D3139393014
+:1073FC002024C947656E65726963202844756D62E7
+:10740C002920435254205465726D696E616C20744E
+:10741C007970652073656C656374656420240D0A4E
+:10742C005374617274696E67202E2E2E245E550D76
+:10743C000A240D0A525061636B3A20240D0A5350F2
+:06744C0061636B3A20248D
+:0000000000
diff --git a/cpvbbc.hex b/cpvbbc.hex
new file mode 100644 (file)
index 0000000..36cbba3
--- /dev/null
@@ -0,0 +1,83 @@
+:10700000AC0006009872B572C33F74C35B74C3676B
+:1070100074C37074C34674C35674C34D74C37F7411
+:10702000C37874C30000C30000C3B074C3A674C3A4
+:10703000A574C3B674C3F771C3D371C3C771C3BB9F
+:1070400071C3C171C3DC71C3E571C3EE71C3AC70B0
+:10705000C30773C30D73C30E73C30F73C32C73C302
+:107060007C73C38273C38373C30674C32671C38DD9
+:1070700074C34E71C32472C31372D5749073CE73EC
+:10708000267410740010011CFFFFFFFF00000001B8
+:107090000000000650500805000000000D0D2323DD
+:0770A00031004080000101F6
+:1070AC00CDDF700E07CD0500323E740E0CCD050001
+:1070BC007D32DE70113272CD137211BC74CD13722D
+:1070CC00CD107221037522A3703E4032A570CDD134
+:0270DC0072C977
+:1070DF002A01001103001922077111030019220A56
+:1070EF007111030019220D71110300192210711172
+:1070FF001E0019221271C9C30000C30000C3000093
+:10710F00C30000C300000E3C064605C219710DC234
+:10711F0017713DC21571C9D511C674CD1372D1CD7A
+:10712F0013721E5BCD567411BC74CD13721149725C
+:10713F00CD13723A8D70B7C8118172CD1372C93ADF
+:10714F00DE70FE30FA85713A5C00B7CA61713DC3DB
+:10715F0066710E19CD05005F0E2ECD05000603AF2B
+:10716F000E032183002B7E1F770DC2747105C26E33
+:10717F00715E2356EBC90E1BCD0500EB2AA77023BA
+:10718F00010000D51A1E0817DA9B7103572B7DB427
+:10719F00CAAC717A1DC29671D113C39271D1696055
+:1071AF003AAA70D603C8293DC2B571C9011404C3E8
+:1071BF008D74011405C38D74010C06CD8D7411FEF1
+:1071CF0074C31372010107CD8D74C3CD7101010812
+:1071DF00CD8D74C3CD71010809CD8D74C3CD7101EF
+:1071EF00080BCD8D74C3CD713A8D70B7CA0472017F
+:1071FF00010DC30772010109CD8D7411F974C31309
+:10720F0072112F72E5D5C50E09CD0500C1D1E1C9A7
+:10721F00E1232323E97E1223130B78B1C22472C911
+:10722F000D0A24636F6E6669677572656420666FF9
+:10723F00722024207769746820245D0D0A0D0A4E90
+:10724F00756D626572206F66207061636B65747314
+:10725F003A0D0A4E756D626572206F662072657405
+:10726F00726965733A0D0A46696C65206E616D65CA
+:10727F003A240D0A0D0A0D0A527061636B3A0D0A1A
+:10728F000D0A537061636B3A244350585357542E71
+:10729F0041534D20283130292020372D4A616E2D42
+:1072AF003139393120244350585359532E41534DBE
+:1072BF002028343029202032382D4175672D383958
+:1072CF002024110373CD13723E01CDC8FF3EF2216E
+:1072DF0000FFCDF4FF7DE6071F1FD2EE72F602A767
+:1072EF00F2F472F604E607EE073C328870328970CA
+:1072FF005FCD8373160324C93E00CDC8FFC9C9C92A
+:10730F00111673CD1372C90D0A4220205472616E8B
+:10731F00736D6974206120425245414B24E65FFE34
+:10732F0042CA3673C31F723E962E08CDF4FF7CE619
+:10733F0002CA3673214EFE3E40CD68733E9C2160DB
+:10734F009FCDF4FF3E19CD15713E9C2600CDF4FF65
+:10735F00214EFE3EC0CD6873C9227773327B7321F5
+:08736F0077733E06CDF1FFC962
+:10737C007BC97BC97BC9C96B3E07CDF4FF6B3E084B
+:10738C00CDF4FFC908043132303024040403313504
+:10739C0030240202053139323030240808043234EA
+:1073AC0030302405050333303024030304343830E3
+:1073BC0030240606023735240101043936303024D6
+:1073CC0007070D0A202020373520202031353020AA
+:1073DC002020333030202020313230302020203219
+:1073EC0034303020202034383030202020393630D2
+:1073FC00302020203139323030247E323D74237ECF
+:10740C00323C74C90D0A434F4D4D554E49434154BE
+:10741C00494F4E5320706F727424010E434F4D4DE3
+:10742C00554E49434154494F4E532439744204003C
+:10743C000442813A3D74320300C93A3E743203006F
+:10744C00C9CD0671B7C8CD0971C94BCD0C71C9E551
+:10745C00C53A3C744FCD0500C1E1C9CD0671B7C822
+:10746C00CD0971C9CD6774B7C27074C9CD1271CD15
+:10747C001271C9D5CD8073A7CA8B744BCD0F71D146
+:10748C00C9C511D274CD1372E17CC61F5FE5CD5610
+:10749C0074E17DC61F5FC35674C91E20CD56741E81
+:1074AC0008C3567411CE74C3137211CC74C3137207
+:1074BC0042424320285A383029240C1B3D213024C9
+:1074CC000C240D1B40241B3D240B2400000A24001B
+:1074DC000009240000082400000C240000240000F3
+:1074EC0000240000001E240000240000001B3F2488
+:0774FC0000001B402400000A
+:0000000000
diff --git a/cpvbee.hex b/cpvbee.hex
new file mode 100644 (file)
index 0000000..323e26d
--- /dev/null
@@ -0,0 +1,134 @@
+:10700000AC0006009972D072C33774C34674C3587B
+:1070100074C35C74C33774C34074C33874C3687476
+:10702000C36474C30000C30000C39B74C39174C3E2
+:107030008B74C3A174C3F871C3D471C3C871C3BCCA
+:1070400071C3C271C3DD71C3E671C3EF71C3AC70AC
+:10705000C3FE72C30473C30E73C30F73C36A73C3D7
+:107060009673C39873C39973C33674C32771C3737C
+:1070700074C34F71C32572C31472C0749D73F673C9
+:10708000000000000010001DFFFFFFFF00000001D6
+:107090000000000650500805000000000D0D2323DD
+:0770A00031004080000101F6
+:1070AC00CDE0700E07CD050032DF700E0CCD050063
+:1070BC007D32DE70113372CD147211A774CD14723F
+:1070CC00CD1172214E8022A3703E4032A570CDEAC4
+:0270DC0072C977
+:1070E0002A01001103001922087111030019220B53
+:1070F0007111030019220E7111030019221171116F
+:107100001E0019221371C9C30000C30000C3000090
+:10711000C30000C300000E21064605C21A710DC24D
+:1071200018713DC21671C9D511B074CD1472D1CD8C
+:1071300014721E5BCD407411A774CD1472114A7283
+:10714000CD14723A8D70B7C8118272CD1472C93ADB
+:10715000DE70FE30FA86713A5C00B7CA62713DC3D8
+:1071600067710E19CD05005F0E2ECD05000603AF29
+:107170000E032183002B7E1F770DC2757105C26F30
+:10718000715E2356EBC90E1BCD0500EB2AA77023B9
+:10719000010000D51A1E0817DA9C7103572B7DB425
+:1071A000CAAD717A1DC29771D113C39371D1696051
+:1071B0003AAA70D603C8293DC2B671C9011404C3E6
+:1071C0007374011405C37374010C06CD737411E854
+:1071D00074C31472010107CD7374C3CE7101010829
+:1071E000CD7374C3CE71010809CD7374C3CE710120
+:1071F000080BCD7374C3CE713A8D70B7CA05720196
+:10720000010DC30872010109CD737411E474C31434
+:1072100072113072E5D5C50E09CD0500C1D1E1C9A5
+:10722000E1232323E97E1223130B78B1C22572C90F
+:107230000D0A24636F6E6669677572656420666FF8
+:10724000722024207769746820245D0D0A0D0A4E8F
+:10725000756D626572206F66207061636B65747313
+:107260003A0D0A4E756D626572206F662072657404
+:10727000726965733A0D0A46696C65206E616D65C9
+:107280003A240D0A0D0A0D0A527061636B3A0D0A19
+:107290000D0A537061636B3A244350585357542E70
+:1072A00041534D20283130292020372D4A616E2D41
+:1072B0003139393120244350585359532E41534DBD
+:1072C00020283335292030312D4465632D3836246C
+:1072D0004350584245452E41534D20283129202006
+:1072E00030312D5365702D3930242120762288705D
+:1072F000EBCD5876ED57323E783E75ED47C93A3EB4
+:1073000078ED47C9110B73CD1472C90D0A24C91148
+:107310001673CD1472C90D0A4220205472616E7327
+:107320006D6974206120425245414B2028302E3334
+:1073300073290D0A4C20205472616E736D6974209C
+:1073400061204C4F4E4720425245414B2028312E60
+:107350003873290D0A5720205769706520736372AE
+:1073600065656E20636C65617224E65FFE42CA83C8
+:1073700073FE4CCA7E73FE57CAA174C320721EB43A
+:10738000C385731E1EDB02E6DFD3027BCD1671DBE5
+:1073900002F620D302C97BC9C9CD5876C90B033187
+:1073A00031302410760431323030243076073132D7
+:1073B00030302F37352438760331353024187604B1
+:1073C0003234303024407603333030242076043495
+:1073D000383030244876033630302428760237356A
+:1073E0002400760737352F313230302408760439BF
+:1073F0003630302450760D0A3735202037352F317E
+:1074000032303020203131302020313530202033CF
+:1074100030302020363030202031323030202031C2
+:107420003230302F3735203234303020343830305D
+:10743000203936303024C9C90E061EFFCD0500C9DB
+:107440000E06CD0500C9F5C5D5E57B215374E52AA7
+:107450004C78E9E1D1C1F1C9CDF177C9CD5874B704
+:10746000C25C74C93A4178C9D5A7CA71747BCD2F63
+:1074700078D1C9C511BD74CD1472E17CC61F5FE51A
+:10748000CD4074E17DC61F5FC3407411BB74C3144B
+:10749000721E20CD40741E08C3407411B774C3140B
+:1074A0007211B574C314724D6963726F626565249D
+:1074B0001A0D0A09241A240D1B542408241B3D24E8
+:1074C0000B2400000A2400000C2400000824000003
+:1074D0001A24000024000000240000001E240000E4
+:0C74E0000B2400001B5924001B54240046
+:10750000217883772178837721788377217883772F
+:10751000217883772178837721788377217883771F
+:10752000217883772178837721788377217883770F
+:1075300021788377217883772178837721788377FF
+:1075400021788377217883772178837721788377EF
+:1075500021788377217883772178837721788377DF
+:1075600021788377217883772178837721788377CF
+:1075700021788377217883772178837721788377BF
+:1075800021788377217883772178837721788377AF
+:10759000217883772178837721788377217883779F
+:1075A000217883772178837721788377217883778F
+:1075B000217883772178837721788377217883777F
+:1075C000217883772178837721788377217883776F
+:1075D000217883772178837721788377217883775F
+:1075E000217883772178837721788377217883774F
+:1075F000217883772178837721788377217883773F
+:107600007C0D3707A8FF8C767C0D3707C2016676A4
+:107610008109370505D98C763B071704029E8C76C5
+:107620001A048602034B8C768B02BF0102228C76F1
+:10763000C3015A01030D8C76C3015A017C0D667695
+:107640005E01280102038C762C010F012C01667665
+:10765000130101011301667621467806081A772383
+:107660001305C25D76C9060AF3DB02E6DF4FB77980
+:10767000D27576F620D3022A4A782DC27A7625C2B0
+:107680007A76377B1F5F05C26F76FBC97B060821C0
+:1076900000000F4F7D176F7C17677905C292760641
+:1076A00004377D176F7C176705C2A1763EFF323F16
+:1076B000781628DB02E6DF471E00DB02F608CABAAE
+:1076C00076D309F3CD05773A3F78B7C20377DB026B
+:1076D000F610CAE0762A46782DC2D87625C2D8762A
+:1076E0002A4478EB2A42781B7AB3C2F07611FF075E
+:1076F0007D936F7C9A67B5CA0377EB224478114E6D
+:10770000781971FBC9CD21773A4A783DC20B773A97
+:107710004B783D0000000000C212777AB3C20577B3
+:10772000C97AB7CA5277E603C24877297CE620B007
+:10773000D302157BB7CA6B77E603C26177DB02E63B
+:1077400010D601791F4F1DC9B7B7B7B7B7F600C339
+:107750003277B7B7B7B7B7B7B7B7B7B7B7B7C333F6
+:1077600077B7B7B7B7B7F600C34677DB02E610CAFC
+:107770007B771E24AF323F78F607C9B7B7B7B7B7E4
+:10778000C34777F5C5D5E5DB02E610CAEA77D3092A
+:107790002A48782DC2937725C293771E082A467807
+:1077A0002DC2A07725C2A077DB02E610D601791F93
+:1077B0004F1DC29D77DB02E610CAC7772A46782D97
+:1077C000C2BF7725C2BF772A4478EB2A42781B7A5A
+:1077D000B3C2D77711FF077D936F7C9A67B5CAEA6A
+:1077E00077EB224478114E781971E1D1C1F1FBEDAC
+:1077F0004DD5E52A4278EB2A44787D936F7C9A67D1
+:10780000B5C20778E1D1C9F51B7AB3C2117811FF6F
+:1078100007F1EB224278114E78195EF6FF7BC30424
+:10782000783240783E003241783A4078FBED4DE5C1
+:10783000214178CB46C2337836FFD300E1C900003E
+:0E7840000000FF07FF070000000000008C762C
+:0000000000
diff --git a/cpvbns.hex b/cpvbns.hex
new file mode 100644 (file)
index 0000000..4799ce8
--- /dev/null
@@ -0,0 +1,53 @@
+:10700000AC00060000721D72C34D72C35C72C36790
+:1070100072C36F72C34D72C35672C34E72C379721C
+:10702000C37772C30000C30000C39772C38D72C3DD
+:107030008872C39D72C3B871C3B871C3B871C3A954
+:1070400071C3AE71C3B871C3BB71C3C171C3AC703E
+:10705000C33B72C33C72C33D72C33E72C34072C332
+:107060004572C34B72C34C72C34C72C33371C3DEDF
+:1070700072C33C71C3DB71C3CA7100000000000021
+:10708000000000000010FF1CFFFFFFFF00000001D8
+:107090000000000650500805000000000D0D2323DD
+:0770A00031004080000101F6
+:1070AC00CDEC700E07CD050032EB700E0CCD05004B
+:1070BC007D32EA7011E971CDCA7111A372CDCA711A
+:1070CC0011F971CDCA7111DF72CDCA71CDC77121A1
+:0E70DC00327322A3703E4032A570CD3A72C9C5
+:1070EC002A0100110300192214711103001922172F
+:1070FC007111030019221A7111030019221D71114B
+:10710C001E0019221F71C9C30000C30000C3000078
+:10711C00C30000C300000E28064605C226710DC22E
+:10712C0024713DC22271C9D5110A73CDCA71D1C95E
+:10713C003AEA70FE30FA73713A5C00B7CA4F713D8F
+:10714C00C354710E19CD05005F0E2ECD050006033C
+:10715C00AF0E032183002B7E1F770DC2627105C217
+:10716C005C715E2356EBC90E1BCD0500EB2AA77094
+:10717C0023010000D51A1E0817DA897103572B7DDD
+:10718C00B4CA9A717A1DC28471D113C38071D1694A
+:10719C00603AAA70D603C8293DC2A371C91E20C388
+:1071AC0056721E20CD56721E25C35672C3C771115E
+:1071BC001E73C3CA71112873C3CA7111E671E5D568
+:1071CC00C50E09CD0500C1D1E1C9E1232323E97E18
+:1071DC001223130B78B1C2DB71C90D0A24636F6ED5
+:1071EC006669677572656420666F72202420776902
+:1071FC00746820244350585357542E41534D202823
+:10720C003130292020372D4A616E2D31393931200A
+:10721C00244350584E4F522E41534D202028342990
+:10722C00202031362D4A616E2D3139393124C9C9AE
+:10723C00C9C9C924E65FC3D6717BC97BC97BC9C9DF
+:10724C00C9C90E061EFFCD0500C90E06CD0500C925
+:10725C00DB05E601CA5C727BD304C9DB05E602C818
+:10726C00DB04C9CD6772B7C26F72C9AFC9D5CD493E
+:10727C0072A7CA86720E05CD0500D1C91E08C35669
+:10728C00721E20CD56721E08C35672111973C3CAD2
+:10729C007111E671C3CA714E6F7274687374617246
+:1072AC00207573696E67207072696E7465722070D8
+:1072BC006F7274244350585644552E41534D202020
+:1072CC00283629202031322D4F63742D3139393035
+:1072DC002024C947656E65726963202844756D6208
+:1072EC002920435254205465726D696E616C207470
+:1072FC007970652073656C656374656420240D0A70
+:10730C005374617274696E67202E2E2E245E550D97
+:10731C000A240D0A525061636B3A20240D0A535013
+:06732C0061636B3A2024AE
+:0000000000
diff --git a/cpvbra.hex b/cpvbra.hex
new file mode 100644 (file)
index 0000000..f85d305
--- /dev/null
@@ -0,0 +1,81 @@
+:10700000AC0006009972B672C31F74C32F74C33AE2
+:1070100074C34274C32074C32974C32174C34E74EF
+:10702000C34A74C30000C30000C38474C37A74C32A
+:107030007574C38A74C3F871C3D471C3C871C3BCF7
+:1070400071C3C271C3DD71C3E671C3EF71C3AC70AC
+:10705000C3E072C3E172C3E272C3E372C30073C3DD
+:107060001F73C32573C32673C31E74C32771C35D07
+:1070700074C34F71C32572C31472BE743273AD737F
+:10708000000000000010011DFFFFFFFF00000001D5
+:107090000000000650500805000000000D0D2323DD
+:0770A00031004080000101F6
+:1070AC00CDE0700E07CD050032DF700E0CCD050063
+:1070BC007D32DE70113372CD1472119474CD147252
+:1070CC00CD117221EC7422A3703E4032A570CDD448
+:0270DC0072C977
+:1070E0002A01001103001922087111030019220B53
+:1070F0007111030019220E7111030019221171116F
+:107100001E0019221371C9C30000C30000C3000090
+:10711000C30000C300000E28064605C21A710DC246
+:1071200018713DC21671C9D511A874CD1472D1CD94
+:1071300014721E5BCD2974119474CD1472114A72AD
+:10714000CD14723A8D70B7C8118272CD1472C93ADB
+:10715000DE70FE30FA86713A5C00B7CA62713DC3D8
+:1071600067710E19CD05005F0E2ECD05000603AF29
+:107170000E032183002B7E1F770DC2757105C26F30
+:10718000715E2356EBC90E1BCD0500EB2AA77023B9
+:10719000010000D51A1E0817DA9C7103572B7DB425
+:1071A000CAAD717A1DC29771D113C39371D1696051
+:1071B0003AAA70D603C8293DC2B671C9011404C3E6
+:1071C0005D74011405C35D74010C06CD5D7411E797
+:1071D00074C31472010107CD5D74C3CE710101083F
+:1071E000CD5D74C3CE71010809CD5D74C3CE71014C
+:1071F000080BCD5D74C3CE713A8D70B7CA057201AC
+:10720000010DC30872010109CD5D7411E274C3144C
+:1072100072113072E5D5C50E09CD0500C1D1E1C9A5
+:10722000E1232323E97E1223130B78B1C22572C90F
+:107230000D0A24636F6E6669677572656420666FF8
+:10724000722024207769746820245D0D0A0D0A4E8F
+:10725000756D626572206F66207061636B65747313
+:107260003A0D0A4E756D626572206F662072657404
+:10727000726965733A0D0A46696C65206E616D65C9
+:107280003A240D0A0D0A0D0A527061636B3A0D0A19
+:107290000D0A537061636B3A244350585357542E70
+:1072A00041534D20283130292020372D4A616E2D41
+:1072B000313939312024435058544F522E41534DC7
+:1072C00020283529202031302D4A616E2D31393961
+:1072D000312020243A00EFE60F328870328970C9DD
+:1072E000C9C9C911EA72CD1472C90D0A42202054CD
+:1072F00072616E736D6974206120425245414B2466
+:10730000E65FFE42CA0A73C32072DB41E604CA0A82
+:10731000733E3FD3413E19CD16713E37D341C97BF1
+:10732000C97BC97BC9C93A00EFE6F0B33200EFD39D
+:1073300060C910033131302402020431323030246C
+:107340000707053133342E35240303033135302448
+:107350000404043138303024080805313932303023
+:10736000240F0F0432303030240909043234303015
+:10737000240A0A0333303024050504333630302420
+:107380000B0B0434383030240C0C02353024000050
+:10739000033630302406060437323030240D0D0217
+:1073A00037352401010439363030240E0E0D0A2001
+:1073B000202035302020202020373520202020316B
+:1073C0003130202020203133342E3520203135300B
+:1073D0002020202033303020202020363030202044
+:1073E00020313230300D0A20313830302020203228
+:1073F00030303020202032343030202020333630DE
+:1074000030202020343830302020203732303020D7
+:107410002020393630302020313932303024C9C96B
+:10742000C90E061EFFCD0500C90E06CD0500C9DB3D
+:1074300041E601CA2F747BD340C9DB41E602C8DBB9
+:1074400040C9CD3A74B7C24274C9CD1371C9D5CD04
+:107450002373A7CA5B740E05CD0500D1C9C511BB46
+:1074600074CD1472E17CC61F5FE5CD2974E17DC641
+:107470001F5FC329741E08C329741E20CD29741EE2
+:1074800008C3297411B674C3147211B174C3147291
+:107490001B212400496E74657274656320537570F6
+:1074A0006572427261696E24011B7E6B0D0A0909C7
+:1074B00024011B7E6B240D1B7E4B241B59240B24A3
+:1074C00000000A240000062400002400000024001C
+:1074D00000002400000024000000012400000B2410
+:0C74E00000001B7E6B24001B7E4B240070
+:0000000000
diff --git a/cpvbrm.hex b/cpvbrm.hex
new file mode 100644 (file)
index 0000000..44cd190
--- /dev/null
@@ -0,0 +1,82 @@
+:10700000AC0006009972B672C32974C33974C344C4
+:1070100074C34C74C32A74C33374C32B74C35874BD
+:10702000C35474C30000C30000C38E74C38474C30C
+:107030007F74C39474C3F871C3D471C3C871C3BCE3
+:1070400071C3C271C3DD71C3E671C3EF71C3AC70AC
+:10705000C3E472C3E572C3E672C3E772C30473C3C9
+:107060002373C32973C32A73C32874C32771C367E7
+:1070700074C34F71C32572C31472C8743C73B77361
+:10708000000000000010011DFFFFFFFF00000001D5
+:107090000000000650500805000000000D0D2323DD
+:0770A00031004080000101F6
+:1070AC00CDE0700E07CD050032DF700E0CCD050063
+:1070BC007D32DE70113372CD1472119E74CD147248
+:1070CC00CD117221F67422A3703E4032A570CDD43E
+:0270DC0072C977
+:1070E0002A01001103001922087111030019220B53
+:1070F0007111030019220E7111030019221171116F
+:107100001E0019221371C9C30000C30000C3000090
+:10711000C30000C300000E28064605C21A710DC246
+:1071200018713DC21671C9D511B274CD1472D1CD8A
+:1071300014721E5BCD3374119E74CD1472114A7299
+:10714000CD14723A8D70B7C8118272CD1472C93ADB
+:10715000DE70FE30FA86713A5C00B7CA62713DC3D8
+:1071600067710E19CD05005F0E2ECD05000603AF29
+:107170000E032183002B7E1F770DC2757105C26F30
+:10718000715E2356EBC90E1BCD0500EB2AA77023B9
+:10719000010000D51A1E0817DA9C7103572B7DB425
+:1071A000CAAD717A1DC29771D113C39371D1696051
+:1071B0003AAA70D603C8293DC2B671C9011404C3E6
+:1071C0006774011405C36774010C06CD677411F16F
+:1071D00074C31472010107CD6774C3CE7101010835
+:1071E000CD6774C3CE71010809CD6774C3CE710138
+:1071F000080BCD6774C3CE713A8D70B7CA057201A2
+:10720000010DC30872010109CD677411EC74C31438
+:1072100072113072E5D5C50E09CD0500C1D1E1C9A5
+:10722000E1232323E97E1223130B78B1C22572C90F
+:107230000D0A24636F6E6669677572656420666FF8
+:10724000722024207769746820245D0D0A0D0A4E8F
+:10725000756D626572206F66207061636B65747313
+:107260003A0D0A4E756D626572206F662072657404
+:10727000726965733A0D0A46696C65206E616D65C9
+:107280003A240D0A0D0A0D0A527061636B3A0D0A19
+:107290000D0A537061636B3A244350585357542E70
+:1072A00041534D20283130292020372D4A616E2D41
+:1072B000313939312024435058544F522E41534DC7
+:1072C00020283529202031302D4A616E2D31393961
+:1072D000312020243A00EFE6F00F0F0F0F328870B4
+:1072E000328970C9C9C9C911EE72CD1472C90D0AAB
+:1072F0004220205472616E736D6974206120425285
+:1073000045414B24E65FFE42CA0E73C32072DB592F
+:10731000E604CA0E733E3FD3593E19CD16713E376F
+:10732000D359C97BC97BC97BC9C93A00EFE60F575E
+:107330007B07070707B23200EFD360C91003313172
+:10734000302402020431323030240707053133344F
+:107350002E3524030303313530240404043138303E
+:1073600030240808053139323030240F0F04323010
+:1073700030302409090432343030240A0A0333300F
+:10738000302405050433363030240B0B04343830F8
+:1073900030240C0C02353024000003363030240633
+:1073A000060437323030240D0D0237352401010434
+:1073B00039363030240E0E0D0A20202035302020A2
+:1073C000202020373520202020313130202020205F
+:1073D0003133342E352020313530202020203330F9
+:1073E0003020202020363030202020313230300D27
+:1073F0000A20313830302020203230303020202018
+:1074000032343030202020333630302020203438C1
+:1074100030302020203732303020202039363030B4
+:107420002020313932303024C9C9C90E061EFFCDA3
+:107430000500C90E06CD0500C9DB59E601CA39743D
+:107440007BD358C9DB59E602C8DB58C9CD4474B7B1
+:10745000C24C74C9CD1371C9D5CD2773A7CA657441
+:107460000E05CD0500D1C9C511C574CD1472E17CDE
+:10747000C61F5FE5CD3374E17DC61F5FC333741E45
+:1074800008C333741E20CD33741E08C3337411C077
+:1074900074C3147211BB74C314721B212400496E8F
+:1074A00074657274656320537570657242726169A8
+:1074B0006E24011B7E6B0D0A090924011B7E6B24BF
+:1074C0000D1B7E4B241B59240B2400000A240000B2
+:1074D0000624000024000000240000002400000016
+:1074E00024000000012400000B2400001B7E6B24FC
+:0674F000001B7E4B24008E
+:0000000000
diff --git a/cpvca2.hex b/cpvca2.hex
new file mode 100644 (file)
index 0000000..533a7af
--- /dev/null
@@ -0,0 +1,86 @@
+:10700000AC0006009872B572C36274C37E74C38A02
+:1070100074C39374C36974C37974C37074C39F7465
+:10702000C39B74C30000C30000C3D474C3CA74C339
+:10703000C574C3DA74C3F771C3D371C3C771C3BB5B
+:1070400071C3C171C3DC71C3E571C3EE71C3AC70B0
+:10705000C34173C34273C34373C34473C34C73C309
+:107060005173C35773C35873C35674C32671C3ADEA
+:1070700074C34E71C32472C313720B756A73E573C4
+:10708000000000000010011DFFFFFFFF00000001D5
+:107090000000000650500805000000000D0D2323DD
+:0770A00031004080000101F6
+:1070AC00CDDF700E07CD050032D0720E0CCD050071
+:1070BC007D32DE70113272CD137211ED74CD1372FC
+:1070CC00CD107221377522A3703E4032A570CDD100
+:0270DC0072C977
+:1070DF002A01001103001922077111030019220A56
+:1070EF007111030019220D71110300192210711172
+:1070FF001E0019221271C9C30000C30000C3000093
+:10710F00C30000C300000E28064605C219710DC248
+:10711F0017713DC21571C9D511FA74CD1372D1CD46
+:10712F0013721E5BCD797411ED74CD137211497208
+:10713F00CD13723A8D70B7C8118172CD1372C93ADF
+:10714F00DE70FE30FA85713A5C00B7CA61713DC3DB
+:10715F0066710E19CD05005F0E2ECD05000603AF2B
+:10716F000E032183002B7E1F770DC2747105C26E33
+:10717F00715E2356EBC90E1BCD0500EB2AA77023BA
+:10718F00010000D51A1E0817DA9B7103572B7DB427
+:10719F00CAAC717A1DC29671D113C39271D1696055
+:1071AF003AAA70D603C8293DC2B571C9011404C3E8
+:1071BF00AD74011405C3AD74010C06CDAD7411335C
+:1071CF0075C31372010107CDAD74C3CD71010108F1
+:1071DF00CDAD74C3CD71010809CDAD74C3CD7101AF
+:1071EF00080BCDAD74C3CD713A8D70B7CA0472015F
+:1071FF00010DC30772010109CDAD74112F75C313B2
+:10720F0072112F72E5D5C50E09CD0500C1D1E1C9A7
+:10721F00E1232323E97E1223130B78B1C22472C911
+:10722F000D0A24636F6E6669677572656420666FF9
+:10723F00722024207769746820245D0D0A0D0A4E90
+:10724F00756D626572206F66207061636B65747314
+:10725F003A0D0A4E756D626572206F662072657405
+:10726F00726965733A0D0A46696C65206E616D65CA
+:10727F003A240D0A0D0A0D0A527061636B3A0D0A1A
+:10728F000D0A537061636B3A244350585357542E71
+:10729F0041534D20283130292020372D4A616E2D42
+:1072AF003139393120244350584349462E41534DEB
+:1072BF0020283229202031342D4A756C2D38372063
+:1072CF0024003E8132D0722A4700116F00192263C9
+:1072DF0073232323222073110F0019222F732A45A2
+:1072EF0000111200195E2356D5237E326873237E58
+:1072FF00326973110900195E2356237E3266732398
+:10730F007E326773EBE53E00772377233E9977E173
+:10731F00CD1F73E1E53E00772377233E9977E1CDCB
+:10732F002E732A68737E3288703289705F57CD58FA
+:10733F0073C9C9C9C9114B73CD1372C924E65FC391
+:10734F001F727BC97BC97BC9C92A66737B77EB2AFE
+:10735F00687377CD6273C9000000001003313130BC
+:10736F002402020431323030240707053133342E22
+:10737F00352403030331353024040404313830300D
+:10738F00240808053139323030240F0F04323030E1
+:10739F00302409090432343030240A0A03333030E0
+:1073AF002405050433363030240B0B0434383030C9
+:1073BF00240C0C023530240000033630302406062E
+:1073CF000437323030240D0D0237352401010439D2
+:1073DF00363030240E0E0D0A20202035302020208C
+:1073EF00202037352020202031313020202020311F
+:1073FF0033342E35202031353020202020333030CB
+:10740F0020202020363030202020313230300D0A1D
+:10741F0020313830302020203230303020202032C0
+:10742F003430302020203336303020202034383094
+:10743F003020202037323030202020393630302095
+:10744F00203139323030247E326174237E326074C1
+:10745F00C904803A6174320300C93AD07232030012
+:10746F00C9CD0671B7C8CD0971C94BCD0C71C9E52E
+:10747F00C53A60744FCD0500C1E1C9CD0671B7C8DB
+:10748F00CD0971C9CD8A74B7C29374C9CD1271C9B0
+:10749F00D5CD5573A7CAAB744BCD0F71D1C9C511DB
+:1074AF000875CD1372E17DC61F5FE5CD7974E17C60
+:1074BF00C61F5FC379741E08CD79741E20CD7974F1
+:1074CF001E08C37974110175C31372110575C313A7
+:1074DF007220436966657220313838362024204384
+:1074EF0069666572203138383620241B4A0D0A0927
+:1074FF0009241B5E4B241B4A241B50241B412400D0
+:10750F001B4024001B4324001B4424001B4A000083
+:10751F0024000000240000001B4824001B4024000E
+:08752F001B4224001B4B240049
+:0000000000
diff --git a/cpvca3.hex b/cpvca3.hex
new file mode 100644 (file)
index 0000000..c032aa8
--- /dev/null
@@ -0,0 +1,84 @@
+:10700000AC0006009972B672C35774C36774C3713B
+:1070100074C37E74C35874C36174C35974C38A74CF
+:10702000C38674C30000C30000C3BB74C3B174C380
+:10703000AC74C3C174C3F871C3D471C3C871C3BC89
+:1070400071C3C271C3DD71C3E671C3EF71C3AC70AC
+:10705000C34173C34273C34373C34473C34C73C309
+:107060005173C35773C35873C35674C32771C39402
+:1070700074C34F71C32572C31472F2746A73E573DB
+:10708000000000000010011DFFFFFFFF00000001D5
+:107090000000000650500805000000000D0D2323DD
+:0770A00031004080000101F6
+:1070AC00CDE0700E07CD050032DF700E0CCD050063
+:1070BC007D32DE70113372CD147211D474CD147212
+:1070CC00CD1172211E7522A3703E4032A570CDD118
+:0270DC0072C977
+:1070E0002A01001103001922087111030019220B53
+:1070F0007111030019220E7111030019221171116F
+:107100001E0019221371C9C30000C30000C3000090
+:10711000C30000C300000E28064605C21A710DC246
+:1071200018713DC21671C9D511E174CD1472D1CD5B
+:1071300014721E5BCD617411D474CD1472114A7235
+:10714000CD14723A8D70B7C8118272CD1472C93ADB
+:10715000DE70FE30FA86713A5C00B7CA62713DC3D8
+:1071600067710E19CD05005F0E2ECD05000603AF29
+:107170000E032183002B7E1F770DC2757105C26F30
+:10718000715E2356EBC90E1BCD0500EB2AA77023B9
+:10719000010000D51A1E0817DA9C7103572B7DB425
+:1071A000CAAD717A1DC29771D113C39371D1696051
+:1071B0003AAA70D603C8293DC2B671C9011404C3E6
+:1071C0009474011405C39474010C06CD9474111ABF
+:1071D00075C31472010107CD9474C3CE7101010807
+:1071E000CD9474C3CE71010809CD9474C3CE7101DE
+:1071F000080BCD9474C3CE713A8D70B7CA05720175
+:10720000010DC30872010109CD9474111675C314E0
+:1072100072113072E5D5C50E09CD0500C1D1E1C9A5
+:10722000E1232323E97E1223130B78B1C22572C90F
+:107230000D0A24636F6E6669677572656420666FF8
+:10724000722024207769746820245D0D0A0D0A4E8F
+:10725000756D626572206F66207061636B65747313
+:107260003A0D0A4E756D626572206F662072657404
+:10727000726965733A0D0A46696C65206E616D65C9
+:107280003A240D0A0D0A0D0A527061636B3A0D0A19
+:107290000D0A537061636B3A244350585357542E70
+:1072A00041534D20283130292020372D4A616E2D41
+:1072B0003139393120244350584349462E41534DEA
+:1072C00020283229202031342D4A756C2D38372062
+:1072D000243E8132DF702A4700116F001922637348
+:1072E000232323222073110F0019222F732A450014
+:1072F000111200195E2356D5237E326873237E3225
+:107300006973110900195E2356237E326673237E4A
+:10731000326773EBE53E00772377233E9977E1CD23
+:107320001F73E1E53E00772377233E9977E1CD2E69
+:10733000732A68737E3288703289705F57CD5873B4
+:10734000C9C9C9C9114B73CD1472C924E65FC320E2
+:10735000727BC97BC97BC9C92A66737B77EB2A68B4
+:107360007377CD6273C900000000100331313024FF
+:1073700002020431323030240707053133342E3510
+:10738000240303033135302404040431383030241D
+:107390000808053139323030240F0F0432303030D4
+:1073A0002409090432343030240A0A0333303024EB
+:1073B00005050433363030240B0B043438303024C8
+:1073C0000C0C02353024000003363030240606044D
+:1073D00037323030240D0D0237352401010439369F
+:1073E0003030240E0E0D0A202020353020202020A1
+:1073F000203735202020203131302020202031330B
+:10740000342E3520203135302020202033303020DC
+:10741000202020363030202020313230300D0A201C
+:1074200031383030202020323030302020203234AB
+:107430003030202020333630302020203438303097
+:1074400020202037323030202020393630302020A4
+:10745000313932303024C9C9C90E061EFFCD0500AE
+:10746000C90E06CD0500C9E5C50E04CD0500C1E174
+:10747000C90E07CD0500B7C80E03CD0500C9CD71F3
+:1074800074B7C27E74C9CD1371C9D5CD5573A7CA5F
+:107490009274D1C9C511EF74CD1472E17DC61F5F1E
+:1074A000E5CD6174E17CC61F5FC361741E08CD61C8
+:1074B000741E20CD61741E08C3617411E874C31476
+:1074C0007211EC74C31472204369666572203138FE
+:1074D00038362024204369666572203138383620DA
+:1074E000241B4A0D0A0909241B5E4B241B4A241B3A
+:1074F00050241B4124001B4024001B4324001B4438
+:1075000024001B4A000024000000240000001B4847
+:0E75100024001B4024001B4224001B4B2400BF
+:0000000000
diff --git a/cpvci3.hex b/cpvci3.hex
new file mode 100644 (file)
index 0000000..81c5a62
--- /dev/null
@@ -0,0 +1,86 @@
+:10700000AC0006009972B672C33874C34874C35298
+:1070100074C35F74C33974C34274C33A74C36B746A
+:10702000C36774C30000C30000C39C74C39274C3DD
+:107030008D74C3A274C3F871C3D471C3C871C3BCC7
+:1070400071C3C271C3DD71C3E671C3EF71C3AC70AC
+:10705000C3DD72C3E472C3E572C3E672C30373C3D4
+:107060001473C31A73C31B73C33774C32771C375F7
+:1070700074C34F71C32572C31472EC744B73C6731F
+:10708000000000000010011DFFFFFFFF00000001D5
+:107090000000000650500805000000000D0D2323DD
+:0770A00031004080000101F6
+:1070AC00CDE0700E07CD050032DF700E0CCD050063
+:1070BC007D32DE70113372CD147211CE74CD147218
+:1070CC00CD1172213F7522A3703E4032A570CDD1F7
+:0270DC0072C977
+:1070E0002A01001103001922087111030019220B53
+:1070F0007111030019220E7111030019221171116F
+:107100001E0019221371C9C30000C30000C3000090
+:10711000C30000C300000E28064605C21A710DC246
+:1071200018713DC21671C9D511DB74CD1472D1CD61
+:1071300014721E5BCD427411CE74CD1472114A725A
+:10714000CD14723A8D70B7C8118272CD1472C93ADB
+:10715000DE70FE30FA86713A5C00B7CA62713DC3D8
+:1071600067710E19CD05005F0E2ECD05000603AF29
+:107170000E032183002B7E1F770DC2757105C26F30
+:10718000715E2356EBC90E1BCD0500EB2AA77023B9
+:10719000010000D51A1E0817DA9C7103572B7DB425
+:1071A000CAAD717A1DC29771D113C39371D1696051
+:1071B0003AAA70D603C8293DC2B671C9011404C3E6
+:1071C0007574011405C37574010C06CD7574111422
+:1071D00075C31472010107CD7574C3CE7101010826
+:1071E000CD7574C3CE71010809CD7574C3CE71011C
+:1071F000080BCD7574C3CE713A8D70B7CA05720194
+:10720000010DC30872010109CD7574111075C31405
+:1072100072113072E5D5C50E09CD0500C1D1E1C9A5
+:10722000E1232323E97E1223130B78B1C22572C90F
+:107230000D0A24636F6E6669677572656420666FF8
+:10724000722024207769746820245D0D0A0D0A4E8F
+:10725000756D626572206F66207061636B65747313
+:107260003A0D0A4E756D626572206F662072657404
+:10727000726965733A0D0A46696C65206E616D65C9
+:107280003A240D0A0D0A0D0A527061636B3A0D0A19
+:107290000D0A537061636B3A244350585357542E70
+:1072A00041534D20283130292020372D4A616E2D41
+:1072B0003139393120244350584349462E41534DEA
+:1072C00020283229202031342D4A756C2D38372062
+:1072D000243E8132DF70111875CD1472C9113075DA
+:1072E000CD1472C9C9C911ED72CD1472C90D0A420B
+:1072F00020205472616E736D697420612042524582
+:10730000414B24E65FFE42CA0D73C32072113B75E8
+:10731000CD1472C97BC97BC97BC9C9D5114873CD4E
+:107320001472F13CF5CD3073F1CD3073CD1172C9CB
+:107330003DCA4073F51E4E0E06CD0500F1C33073F5
+:107340001E590E06CD0500C91B3F241003313130F4
+:107350002402020431323030240707053133342E41
+:10736000352403030331353024040404313830302C
+:10737000240808053139323030240F0F0432303000
+:10738000302409090432343030240A0A03333030FF
+:107390002405050433363030240B0B0434383030E8
+:1073A000240C0C023530240000033630302406064D
+:1073B0000437323030240D0D0237352401010439F1
+:1073C000363030240E0E0D0A2020203530202020AB
+:1073D000202037352020202031313020202020313E
+:1073E00033342E35202031353020202020333030EA
+:1073F00020202020363030202020313230300D0A3D
+:1074000020313830302020203230303020202032DF
+:1074100034303020202033363030202020343830B3
+:1074200030202020373230302020203936303020B4
+:1074300020313932303024C9C9C90E061EFFCD05AE
+:1074400000C90E06CD0500C9E5C50E04CD0500C175
+:10745000E1C90E07CD0500B7C80E03CD0500C9CDA3
+:107460005274B7C25F74C9CD1371C9D5CD1873A753
+:10747000CA7374D1C9C511E974CD1472E17DC61FF8
+:107480005FE5CD4274E17CC61F5FC342741E08CD28
+:1074900042741E20CD42741E08C3427411E274C3AC
+:1074A000147211E674C31472436966657220313830
+:1074B000383620285061726974792073657420749D
+:1074C0006F207370616365206F6E6C79292420438F
+:1074D00069666572203138383620241B4A0D0A0946
+:1074E00009241B5E4B241B4A241B50241B412400EF
+:1074F0001B4024001B4324001B4424001B4A0000A3
+:1075000024000000240000001B4824001B4024002D
+:107510001B4224001B4B24001B2F1B2A5B1B251B1B
+:107520002A7E781B2A281B3F20204E4E4E590D24C0
+:0F7530001B261B2A291B2A5D1B5C241B2A2224D5
+:0000000000
diff --git a/cpvcif.hex b/cpvcif.hex
new file mode 100644 (file)
index 0000000..58e314b
--- /dev/null
@@ -0,0 +1,88 @@
+:10700000AC0006009872B572C34374C35F74C36B5F
+:1070100074C37474C34A74C35A74C35174C3807400
+:10702000C37C74C30000C30000C3B574C3AB74C396
+:10703000A674C3BB74C3F771C3D371C3C771C3BB99
+:1070400071C3C171C3DC71C3E571C3EE71C3AC70B0
+:10705000C3DD72C3E472C3E572C3E672C30373C3D4
+:107060001473C31A73C31B73C33774C32671C38EDF
+:1070700074C34E71C32472C3137205754B73C67308
+:10708000000000000010011DFFFFFFFF00000001D5
+:107090000000000650500805000000000D0D2323DD
+:0770A00031004080000101F6
+:1070AC00CDDF700E07CD050032D0720E0CCD050071
+:1070BC007D32DE70113272CD137211E774CD137202
+:1070CC00CD107221587522A3703E4032A570CDD1DF
+:0270DC0072C977
+:1070DF002A01001103001922077111030019220A56
+:1070EF007111030019220D71110300192210711172
+:1070FF001E0019221271C9C30000C30000C3000093
+:10710F00C30000C300000E28064605C219710DC248
+:10711F0017713DC21571C9D511F474CD1372D1CD4C
+:10712F0013721E5BCD5A7411E774CD13721149722D
+:10713F00CD13723A8D70B7C8118172CD1372C93ADF
+:10714F00DE70FE30FA85713A5C00B7CA61713DC3DB
+:10715F0066710E19CD05005F0E2ECD05000603AF2B
+:10716F000E032183002B7E1F770DC2747105C26E33
+:10717F00715E2356EBC90E1BCD0500EB2AA77023BA
+:10718F00010000D51A1E0817DA9B7103572B7DB427
+:10719F00CAAC717A1DC29671D113C39271D1696055
+:1071AF003AAA70D603C8293DC2B571C9011404C3E8
+:1071BF008E74011405C38E74010C06CD8E74112DBF
+:1071CF0075C31372010107CD8E74C3CD7101010810
+:1071DF00CD8E74C3CD71010809CD8E74C3CD7101ED
+:1071EF00080BCD8E74C3CD713A8D70B7CA0472017E
+:1071FF00010DC30772010109CD8E74112975C313D7
+:10720F0072112F72E5D5C50E09CD0500C1D1E1C9A7
+:10721F00E1232323E97E1223130B78B1C22472C911
+:10722F000D0A24636F6E6669677572656420666FF9
+:10723F00722024207769746820245D0D0A0D0A4E90
+:10724F00756D626572206F66207061636B65747314
+:10725F003A0D0A4E756D626572206F662072657405
+:10726F00726965733A0D0A46696C65206E616D65CA
+:10727F003A240D0A0D0A0D0A527061636B3A0D0A1A
+:10728F000D0A537061636B3A244350585357542E71
+:10729F0041534D20283130292020372D4A616E2D42
+:1072AF003139393120244350584349462E41534DEB
+:1072BF0020283229202031342D4A756C2D38372063
+:1072CF0024003E8132D072113175CD1372C911492C
+:1072DF0075CD1372C9C9C911ED72CD1372C90D0ADB
+:1072EF004220205472616E736D6974206120425286
+:1072FF0045414B24E65FFE42CA0D73C31F72115402
+:10730F0075CD1372C97BC97BC97BC9C9D5114873A8
+:10731F00CD1372F13CF5CD3073F1CD3073CD1072CA
+:10732F00C93DCA4073F51E4E0E06CD0500F1C330A0
+:10733F00731E590E06CD0500C91B3F2410033131B2
+:10734F003024020204313230302407070531333440
+:10735F002E3524030303313530240404043138302F
+:10736F0030240808053139323030240F0F04323001
+:10737F0030302409090432343030240A0A03333000
+:10738F00302405050433363030240B0B04343830E9
+:10739F0030240C0C02353024000003363030240624
+:1073AF00060437323030240D0D0237352401010425
+:1073BF0039363030240E0E0D0A2020203530202093
+:1073CF002020203735202020203131302020202050
+:1073DF003133342E352020313530202020203330EA
+:1073EF003020202020363030202020313230300D18
+:1073FF000A20313830302020203230303020202009
+:10740F0032343030202020333630302020203438B2
+:10741F0030302020203732303020202039363030A5
+:10742F0020203139323030247E324274237E324173
+:10743F0074C904803A4274320300C93AD0723203DD
+:10744F0000C9CD0671B7C8CD0971C94BCD0C71C933
+:10745F00E5C53A41744FCD0500C1E1C9CD0671B7FD
+:10746F00C8CD0971C9CD6B74B7C27474C9CD12710F
+:10747F00C9D5CD1873A7CA8C744BCD0F71D1C9C59F
+:10748F00110275CD1372E17DC61F5FE5CD5A74E110
+:10749F007CC61F5FC35A741E08CD5A741E20CD5A66
+:1074AF00741E08C35A7411FB74C3137211FF74C393
+:1074BF00137243696665722031383836202850615F
+:1074CF00726974792073657420746F2073706163AF
+:1074DF0065206F6E6C7929242043696665722031AF
+:1074EF0038383620241B4A0D0A0909241B5E4B2409
+:1074FF001B4A241B50241B4124001B4024001B4308
+:10750F0024001B4424001B4A000024000000240018
+:10751F0000001B4824001B4024001B4224001B4B6F
+:10752F0024001B2F1B2A5B1B251B2A7E781B2A2856
+:10753F001B3F20204E4E4E590D241B261B2A291B64
+:09754F002A5D1B5C241B2A222486
+:0000000000
diff --git a/cpvcom.hex b/cpvcom.hex
new file mode 100644 (file)
index 0000000..97fdd86
--- /dev/null
@@ -0,0 +1,57 @@
+:10700000AC00060000721D72C39672C3A572C3B0B5
+:1070100072C3B872C39672C39F72C39772C3C272AF
+:10702000C3C072C30000C30000C3E072C3D672C302
+:10703000D172C3E672C3B871C3B871C3B871C3A9C2
+:1070400071C3AE71C3B871C3BB71C3C171C3AC703E
+:10705000C34F72C35072C35172C35272C36F72C3B3
+:107060008E72C39472C39572C39572C33371C31E7B
+:1070700073C33C71C3DB71C3CA7100000000000020
+:10708000000000000010FF1CFFFFFFFF00000001D8
+:107090000000000650500805000000000D0D2323DD
+:0770A00031004080000101F6
+:1070AC00CDEC700E07CD050032EB700E0CCD05004B
+:1070BC007D32EA7011E971CDCA7111EC72CDCA71D1
+:1070CC0011F971CDCA71111F73CDCA71CDC7712160
+:0E70DC00727322A3703E4032A570CD3A72C985
+:1070EC002A0100110300192214711103001922172F
+:1070FC007111030019221A7111030019221D71114B
+:10710C001E0019221F71C9C30000C30000C3000078
+:10711C00C30000C300000E28064605C226710DC22E
+:10712C0024713DC22271C9D5114A73CDCA71D1C91E
+:10713C003AEA70FE30FA73713A5C00B7CA4F713D8F
+:10714C00C354710E19CD05005F0E2ECD050006033C
+:10715C00AF0E032183002B7E1F770DC2627105C217
+:10716C005C715E2356EBC90E1BCD0500EB2AA77094
+:10717C0023010000D51A1E0817DA897103572B7DDD
+:10718C00B4CA9A717A1DC28471D113C38071D1694A
+:10719C00603AAA70D603C8293DC2A371C91E20C388
+:1071AC009F721E20CD9F721E25C39F72C3C7711183
+:1071BC005E73C3CA71116873C3CA7111E671E5D5E8
+:1071CC00C50E09CD0500C1D1E1C9E1232323E97E18
+:1071DC001223130B78B1C2DB71C90D0A24636F6ED5
+:1071EC006669677572656420666F72202420776902
+:1071FC00746820244350585357542E41534D202823
+:10720C003130292020372D4A616E2D31393931200A
+:10721C00244350584E4F522E41534D202028342990
+:10722C00202031362D4A616E2D31393931243E8082
+:10723C00D3033E80D3033E40D3033E4ED3033E37AD
+:10724C00D303C9C9C9C9115972CDCA71C90D0A4232
+:10725C0020205472616E736D697420612042524516
+:10726C00414B24E65FFE42CA7972C3D671DB03E65A
+:10727C0004CA79723E3FD3033E19CD22713E37D3F7
+:10728C0003C97BC97BC97BC9C9C9C90E061EFFCD01
+:10729C000500C90E06CD0500C9DB03E601CAA572BF
+:1072AC007BD302C9DB03E602C8DB02C9CDB072B7DF
+:1072BC00C2B872C9AFC9D5CD9272A7CACF720E052A
+:1072CC00CD0500D1C91E08C39F721E20CD9F721E12
+:1072DC0008C39F72115973C3CA7111E671C3CA7185
+:1072EC00436F6D61727420436F6D6D756E69636170
+:1072FC00746F72244350585644552E41534D2020E0
+:10730C00283629202031322D4F63742D31393930F4
+:10731C002024C947656E65726963202844756D62C7
+:10732C002920435254205465726D696E616C20742F
+:10733C007970652073656C656374656420240D0A2F
+:10734C005374617274696E67202E2E2E245E550D57
+:10735C000A240D0A525061636B3A20240D0A5350D3
+:06736C0061636B3A20246E
+:0000000000
diff --git a/cpvcp3.hex b/cpvcp3.hex
new file mode 100644 (file)
index 0000000..c604570
--- /dev/null
@@ -0,0 +1,52 @@
+:10700000AC00060000721D72C34C72C35C72C36692
+:1070100072C37372C34D72C35672C34E72C37D7214
+:10702000C37B72C30000C30000C39B72C39172C3D1
+:107030008C72C3A172C3B871C3B871C3B871C3A94C
+:1070400071C3AE71C3B871C3BB71C3C171C3AC703E
+:10705000C33A72C33B72C33C72C33D72C33F72C337
+:107060004472C34A72C34B72C34B72C33371C3C5FC
+:1070700072C33C71C3DB71C3CA7100000000000021
+:10708000000000000010FF1CFFFFFFFF00000001D8
+:107090000000000650500805000000000D0D2323DD
+:0770A00031004080000101F6
+:1070AC00CDEC700E07CD050032EB700E0CCD05004B
+:1070BC007D32EA7011E971CDCA7111F172CDCA71CC
+:1070CC0011F971CDCA7111C672CDCA71CDC77121BA
+:0E70DC00297322A3703E4032A570CD3972C9CF
+:1070EC002A0100110300192214711103001922172F
+:1070FC007111030019221A7111030019221D71114B
+:10710C001E0019221F71C9C30000C30000C3000078
+:10711C00C30000C300000E14064605C226710DC242
+:10712C0024713DC22271C9D5110173CDCA71D1C967
+:10713C003AEA70FE30FA73713A5C00B7CA4F713D8F
+:10714C00C354710E19CD05005F0E2ECD050006033C
+:10715C00AF0E032183002B7E1F770DC2627105C217
+:10716C005C715E2356EBC90E1BCD0500EB2AA77094
+:10717C0023010000D51A1E0817DA897103572B7DDD
+:10718C00B4CA9A717A1DC28471D113C38071D1694A
+:10719C00603AAA70D603C8293DC2A371C91E20C388
+:1071AC0056721E20CD56721E25C35672C3C771115E
+:1071BC001573C3CA71111F73C3CA7111E671E5D57A
+:1071CC00C50E09CD0500C1D1E1C9E1232323E97E18
+:1071DC001223130B78B1C2DB71C90D0A24636F6ED5
+:1071EC006669677572656420666F72202420776902
+:1071FC00746820244350585357542E41534D202823
+:10720C003130292020372D4A616E2D31393931200A
+:10721C00244350585359532E41534D202834302970
+:10722C00202032382D4175672D38392024C9C9C921
+:10723C00C9C924E65FC3D6717BC97BC97BC9C9C9DF
+:10724C00C9C90E061EFFCD0500C90E06CD0500C925
+:10725C00E5C50E04CD0500C1E1C90E07CD0500B78B
+:10726C00C80E03CD0500C9CD6672B7C27372C9AF23
+:10727C00C9D5CD4872A7CA8A720E05CD0500D1C9F1
+:10728C001E08C356721E20CD56721E08C3567211AC
+:10729C001073C3CA7111E671C3CA71435058564476
+:1072AC00552E41534D2020283629202031322D4F88
+:1072BC0063742D313939302024C947656E65726984
+:1072CC0063202844756D6229204352542054657202
+:1072DC006D696E616C20747970652073656C656383
+:1072EC00746564202447656E657269632043502F72
+:1072FC004D2D3830240D0A5374617274696E6720F9
+:10730C002E2E2E245E550D0A240D0A525061636BED
+:0D731C003A20240D0A535061636B3A20247F
+:0000000000
diff --git a/cpvcpc.hex b/cpvcpc.hex
new file mode 100644 (file)
index 0000000..c08bc1e
--- /dev/null
@@ -0,0 +1,134 @@
+:10700000AC0006009972B672C3EB76C31A77C33030
+:1070100077C35277C3EB76C3F476C3EC76C3947729
+:10702000C36874C30000C30000C3C277C3B877C38A
+:10703000B377C3C877C3F871C3D471C3C871C3BC75
+:1070400071C3C271C3DD71C3E671C3EF71C3AC70AC
+:10705000C37074C37E74C38874C38974C3D174C38A
+:107060001B75C31D75C31E75C3EA76C32771C39B09
+:1070700077C34F71C32572C314720C785B75ED75BD
+:10708000000000000010001CFFFFFFFF00000001D7
+:107090000000000650500805000000000D0D2323DD
+:0770A00031004080000101F6
+:1070AC00CDE0700E07CD050032DF700E0CCD050063
+:1070BC007D32DE70113372CD147211CE77CD147215
+:1070CC00CD117221387822A3703E4032A570CDD2FA
+:0270DC0072C977
+:1070E0002A01001103001922087111030019220B53
+:1070F0007111030019220E7111030019221171116F
+:107100001E0019221371C9C30000C30000C3000090
+:10711000C30000C300000E21064605C21A710DC24D
+:1071200018713DC21671C9D511E977CD1472D1CD50
+:1071300014721E5BCDF47611CE77CD1472114A72A3
+:10714000CD14723A8D70B7C8118272CD1472C93ADB
+:10715000DE70FE30FA86713A5C00B7CA62713DC3D8
+:1071600067710E19CD05005F0E2ECD05000603AF29
+:107170000E032183002B7E1F770DC2757105C26F30
+:10718000715E2356EBC90E1BCD0500EB2AA77023B9
+:10719000010000D51A1E0817DA9C7103572B7DB425
+:1071A000CAAD717A1DC29771D113C39371D1696051
+:1071B0003AAA70D603C8293DC2B671C9011404C3E6
+:1071C0009B77011405C39B77010C06CD9B77113487
+:1071D00078C31472010107CD9B77C3CE71010108FA
+:1071E000CD9B77C3CE71010809CD9B77C3CE7101CA
+:1071F000080BCD9B77C3CE713A8D70B7CA0572016B
+:10720000010DC30872010109CD9B77113078C314B9
+:1072100072113072E5D5C50E09CD0500C1D1E1C9A5
+:10722000E1232323E97E1223130B78B1C22572C90F
+:107230000D0A24636F6E6669677572656420666FF8
+:10724000722024207769746820245D0D0A0D0A4E8F
+:10725000756D626572206F66207061636B65747313
+:107260003A0D0A4E756D626572206F662072657404
+:10727000726965733A0D0A46696C65206E616D65C9
+:107280003A240D0A0D0A0D0A527061636B3A0D0A19
+:107290000D0A537061636B3A244350585357542E70
+:1072A00041534D20283130292020372D4A616E2D41
+:1072B0003139393120244350585043572E41534DD2
+:1072C00020283929202032322D4A616E2D3139395A
+:1072D00031240E0CCD05007DFE31CAE87211F47325
+:1072E000CD14720E00CD05002A010011570019229D
+:1072F0006C742A01001103001922577419225A7460
+:1073000019225D741922607419192263742A01000C
+:10731000112A00192269742A01001133001922660A
+:1073200074CD6B74E300FE01C2367311AE73CD14DD
+:10733000720E00CD0500CD6B74E600AFB1C24B7389
+:10734000112574CD14720E00CD0500CD6B74BC00F8
+:10735000E578B9CA6473FE08C2697379FE02C2692E
+:1073600073010000C5E1228870E17DD6050F0F0F83
+:10737000326F74CD6B74BC00326E74CD6B74E300ED
+:1073800078B7CAA273FE01C2907379FE04FAA273A1
+:10739000CD6B74BC00EEFF3CF602EEFF3CCD6B748F
+:1073A000B60021388822A3703E4032A570C94572CC
+:1073B000726F72202D20202054686973204B6572F3
+:1073C0006D69742077696C6C206F6E6C79207275B2
+:1073D0006E206F6E2074686520416D7374726164F5
+:1073E00020435043203436342F3636342F36313252
+:1073F000380D0A244572726F72202D20496E636F1A
+:1074000072726563742043502F4D207665727369E4
+:107410006F6E2C206E656564732043502F4D2033B2
+:107420002E780D0A244572726F72202D2020204E76
+:107430006F2053494F206F7074696F6E20666974B6
+:1074400074656420746F2074686973206D6163686B
+:10745000696E650D0A24C30000C30000C30000C3A9
+:0E7460000000C30000C30000C30000C3000012
+:10747000CD6B74BC003A6E74CD6B74B600C91185C7
+:1074800074CD1472C90D0A24C9119074CD1472C937
+:107490000D0A4220205472616E736D697420612060
+:1074A000425245414B0D0A48202048616E67757075
+:1074B000207573696E67204454520D0A5720205777
+:1074C0006970652073637265656E20636C656172B7
+:1074D00024E65FFE42CAEC74FE48CAE574FE57CA51
+:1074E000C877C32072160A1EFFC3FE74169A1E1EAA
+:1074F0003E0101DDFAED79ED78E601CAF0743E0552
+:10750000ED793A6F74B2ED797BCD16713E0501DDF0
+:10751000FAED793A6F74F68AED79C97BC9C9D5E17C
+:107520007CB7C22B75210208C35575FE11C2367592
+:10753000210802C35575FE10C255753E3601DFFBAA
+:10754000ED7901DCFB7CED7978ED7901DCFB7CEDFC
+:107550007978ED79C9CD6B74B900C9120331313036
+:10756000240303043132303024080807313230302C
+:107570002F3735240000053133342E35240404031D
+:1075800031353024050504313830302409090531FE
+:1075900039323030240F0F0432343030240A0A03D9
+:1075A00033303024060605333132353024101004D0
+:1075B00033363030240B0B0434383030240C0C02BA
+:1075C00035302401010336303024070704373230C8
+:1075D00030240D0D0237352402020737352F3132A2
+:1075E00030302411110439363030240E0E0D0A0AC1
+:1075F0004E6F726D616C2072617465733A20353024
+:10760000202020203735202020203131302020201C
+:107610003133342E352031353020202033303020A6
+:1076200020203630300D0A2020202020202020204D
+:1076300020202020203132303020203138303020BE
+:10764000203234303020203336303020203438306F
+:107650003020203732303020203936303020203171
+:10766000393230300D0A0A486967682073706565E1
+:107670006420203A20333132353020286F6E6C7907
+:10768000206265747765656E20416D737472616404
+:1076900073290D0A0A53706C6974207261746573E2
+:1076A000203A20313230302F3735202852783D3182
+:1076B0003230302C2054783D20203735290D0A20D7
+:1076C0002020202020202020202020202037352F7F
+:1076D00031323030202852783D202037352C20544C
+:1076E000783D31323030290D0A24C9C9CD5674B7DE
+:1076F000C8C359747BFE09CAFE764BC35C74CD6B5C
+:1077000074BF007DE607EEFFC609B7C83DF50E2041
+:10771000CD5C74CD6A77F1C30A77C5CD607701DDA2
+:10772000FAED78E604CA1B777B01DCFAED79C1C972
+:10773000CD6A772A5E777CB5C82B225E772A5A7786
+:107740004E11C987197CE60F6711387819225A77CC
+:1077500079C9CD3077B7C25277C938783878000008
+:10776000D5C5E5CD6A77E1C1D1C901DDFAED78E68D
+:1077700001C801DCFAED782A5C777711C987197C9A
+:10778000E60F6711387819225C772A5E7723225E2C
+:1077900077C36A77D54BCD5F74D1C9C5110978CD50
+:1077A0001472E17CC61F5FE5CDF476E17DC61F5FF4
+:1077B000C3F4761E08C3F4761E20CDF4761E08C3EB
+:1077C000F476110578C31472110078C31472416DF8
+:1077D0007374726164204350432077697468204356
+:1077E000502F4D20506C7573241B481B4A0D0A20E6
+:1077F0002020202020202020202020202020202485
+:107800001B481B4A240D1B4B241B59241B412400DD
+:107810001B4224001B4324001B4424001B4524005E
+:1078200024000000240000001B4824001B49240001
+:087830001B4A24001B4B24003D
+:0000000000
diff --git a/cpvcps.hex b/cpvcps.hex
new file mode 100644 (file)
index 0000000..2ac8789
--- /dev/null
@@ -0,0 +1,82 @@
+:10700000AC0006009972B672C33874C34874C35892
+:1070100074C36274C33974C34274C33A74C36C7466
+:10702000C36A74C30000C30000C3A374C39974C3CC
+:107030009374C3A974C3F871C3D471C3C871C3BCBA
+:1070400071C3C271C3DD71C3E671C3EF71C3AC70AC
+:10705000C3DB72C3DC72C3DD72C3DE72C3FB72C3F7
+:107060002773C32D73C32E73C33774C32771C37BB8
+:1070700074C34F71C32572C31472D3744F73CA7330
+:10708000000000000010011DFFFFFFFF00000001D5
+:107090000000000650500805000000000D0D2323DD
+:0770A00031004080000101F6
+:1070AC00CDE0700E07CD050032DF700E0CCD050063
+:1070BC007D32DE70113372CD147211AF74CD147237
+:1070CC00CD117221FF7422A3703E4032A570CDD039
+:0270DC0072C977
+:1070E0002A01001103001922087111030019220B53
+:1070F0007111030019220E7111030019221171116F
+:107100001E0019221371C9C30000C30000C3000090
+:10711000C30000C300000E14064605C21A710DC25A
+:1071200018713DC21671C9D511BD74CD1472D1CD7F
+:1071300014721E5BCD427411AF74CD1472114A7279
+:10714000CD14723A8D70B7C8118272CD1472C93ADB
+:10715000DE70FE30FA86713A5C00B7CA62713DC3D8
+:1071600067710E19CD05005F0E2ECD05000603AF29
+:107170000E032183002B7E1F770DC2757105C26F30
+:10718000715E2356EBC90E1BCD0500EB2AA77023B9
+:10719000010000D51A1E0817DA9C7103572B7DB425
+:1071A000CAAD717A1DC29771D113C39371D1696051
+:1071B0003AAA70D603C8293DC2B671C9011404C3E6
+:1071C0007B74011405C37B74010C06CD7B7411FB29
+:1071D00074C31472010107CD7B74C3CE7101010821
+:1071E000CD7B74C3CE71010809CD7B74C3CE710110
+:1071F000080BCD7B74C3CE713A8D70B7CA0572018E
+:10720000010DC30872010109CD7B7411F774C31419
+:1072100072113072E5D5C50E09CD0500C1D1E1C9A5
+:10722000E1232323E97E1223130B78B1C22572C90F
+:107230000D0A24636F6E6669677572656420666FF8
+:10724000722024207769746820245D0D0A0D0A4E8F
+:10725000756D626572206F66207061636B65747313
+:107260003A0D0A4E756D626572206F662072657404
+:10727000726965733A0D0A46696C65206E616D65C9
+:107280003A240D0A0D0A0D0A527061636B3A0D0A19
+:107290000D0A537061636B3A244350585357542E70
+:1072A00041534D20283130292020372D4A616E2D41
+:1072B0003139393120244350584150502E41534DDB
+:1072C00020283229202032322D6A756C2D3837243F
+:1072D000213737228870EBCD2E73C9C9C9C911E592
+:1072E00072CD1472C90D0A4220205472616E736D02
+:1072F0006974206120425245414B24E65FFE42CA38
+:107300000573C320723AFBE2E604CA05733E80327D
+:10731000FEE23E3F32FBE23E19CD16713E3732FBB4
+:10732000E23E0032FEE2C97BC97BC97BC9C93E800F
+:1073300032FEE23AFBE23E4E32FAE23E043DC23D0C
+:10734000737B32FAE23E3732FBE2AF32FEE2C91023
+:1073500003313130243232043132303024373705B2
+:107360003133342E3524333303313530243434046F
+:1073700031383030243838053139323030243F3F0D
+:1073800004323030302439390432343030243A3A3F
+:10739000033330302435350433363030243B3B045E
+:1073A00034383030243C3C02353024303003363021
+:1073B000302436360437323030243D3D0237352410
+:1073C00031310439363030243E3E0D0A202020353C
+:1073D000302020202037352020203131302020203F
+:1073E000203133342E3520203135302020202033F9
+:1073F00030302020202036303020202031323030F4
+:107400000D0A203138303020203230303020203208
+:1074100034303020202033363030202020343830B3
+:1074200030202020373230302020203936303020B4
+:1074300020313932303024C9C9C90E061EFFCD05AE
+:1074400000C90E06CD0500C9E521FBE27EE601CAB2
+:107450004C7421FAE273E1C93AFBE2E602C83AFA57
+:10746000E2C9CD5874B7C26274C9AFC9D5CD2B7308
+:10747000A7CA79740E05CD0500D1C9C511D074CD48
+:107480001472E17CC61F5FE5CD4274E17DC61F5FCB
+:10749000C3427411CD74C314721E20CD42741E08F1
+:1074A000C3427411C974C3147211C574C3147241F8
+:1074B00070706C652049492043502F4D241E1B5984
+:1074C0000D0A2020241E1B59240D1B5424080824B7
+:1074D0001B3D240B2400000A240000062400002485
+:1074E0000000002400000024000000240000001E12
+:0F74F0002400000B2400001B5924001B5424000F
+:0000000000
diff --git a/cpvcpt.hex b/cpvcpt.hex
new file mode 100644 (file)
index 0000000..3c35e9b
--- /dev/null
@@ -0,0 +1,87 @@
+:10700000AC000600A572C272C36274C37274C37D01
+:1070100074C38574C36374C36C74C36474C38F74A2
+:10702000C38D74C30000C30000C3AD74C3A374C395
+:107030009E74C3B374C30472C3E071C3D471C3C874
+:1070400071C3CE71C3E971C3F271C3FB71C3AC707C
+:10705000C3F572C3FE72C33E73C33F73C35C73C395
+:107060007B73C38173C38273C36174C33371C3F40D
+:1070700074C35B71C33172C3207224758673F77356
+:10708000000000000010011CFFFFFFFF00000001D6
+:107090000000000650500805000000000D0D2323DD
+:0770A00031004080000101F6
+:1070AC00CDEC700E07CD050032EB700E0CCD05004B
+:1070BC007D32EA70113F72CD207211B974CD2072FD
+:1070CC00114F72CD2072110C75CD2072CD1D722115
+:0E70DC00507522A3703E4032A570CDDE72C901
+:1070EC002A0100110300192214711103001922172F
+:1070FC007111030019221A7111030019221D71114B
+:10710C001E0019221F71C9C30000C30000C3000078
+:10711C00C30000C300000E14064605C226710DC242
+:10712C0024713DC22271C9D5111275CD2072D1CDF9
+:10713C0020721E5BCD6C7411B974CD207211567215
+:10714C00CD20723A8D70B7C8118E72CD2072C93AAB
+:10715C00EA70FE30FA92713A5C00B7CA6E713DC3A8
+:10716C0073710E19CD05005F0E2ECD05000603AF11
+:10717C000E032183002B7E1F770DC2817105C27B0C
+:10718C00715E2356EBC90E1BCD0500EB2AA77023AD
+:10719C00010000D51A1E0817DAA87103572B7DB40D
+:1071AC00CAB9717A1DC2A371D113C39F71D1696021
+:1071BC003AAA70D603C8293DC2C271C9011404C3CE
+:1071CC00F474011405C3F474010C06CDF474114C61
+:1071DC0075C32072010107CDF474C3DA7101010883
+:1071EC00CDF474C3DA71010809CDF474C3DA7101FA
+:1071FC00080BCDF474C3DA713A8D70B7CA117201F1
+:10720C00010DC31472010109CDF474114875C3202A
+:10721C0072113C72E5D5C50E09CD0500C1D1E1C98D
+:10722C00E1232323E97E1223130B78B1C23172C9F7
+:10723C000D0A24636F6E6669677572656420666FEC
+:10724C00722024207769746820245D0D0A0D0A4E83
+:10725C00756D626572206F66207061636B65747307
+:10726C003A0D0A4E756D626572206F6620726574F8
+:10727C00726965733A0D0A46696C65206E616D65BD
+:10728C003A240D0A0D0A0D0A527061636B3A0D0A0D
+:10729C000D0A537061636B3A244350585357542E64
+:1072AC0041534D20283130292020372D4A616E2D35
+:1072BC003139393120244350585359532E41534DB1
+:1072CC002028343029202032382D4175672D38394B
+:1072DC0020243E80D34C210F0F228870EBCD82737B
+:1072EC003E4ED34A3E37D34AC93E80D34C3E00D3A0
+:1072FC004CC9110573CD2072C920285573650943FB
+:10730C004F4445202B205348494654202B20312FE5
+:10731C003220206B657920746F2067656E65726111
+:10732C007465206120436F6E74726F6C2D5C290D37
+:10733C000A24C9114673CD2072C90D0A422020546B
+:10734C0072616E736D6974206120425245414B2409
+:10735C00E65FFE42CA6673C32C72DB4AE604CA6659
+:10736C00733E3FD34A3E19CD22713E37D34AC97B77
+:10737C00C97BC97BC9C97BD34CC90F0331313024BC
+:10738C0003030431323030240909053133342E35EE
+:10739C0024040403313530240505043138303024FD
+:1073AC000A0A0432343030240B0B033330302406F9
+:1073BC00060433363030240C0C0434383030240DB1
+:1073CC000D02353024010103363030240707043711
+:1073DC00323030240E0E023735240202033930309D
+:1073EC002408080439363030240F0F0D0A202020D1
+:1073FC0035302020202020373520202020313130FE
+:10740C00202020203133342E3520203135302020DF
+:10741C0020203330302020202036303020202020F7
+:10742C003930300D0A2031323030202020313830C4
+:10743C0030202020323430302020203336303020A1
+:10744C00202034383030202020373230302020209B
+:10745C003936303024C9C9C90E061EFFCD0500C906
+:10746C000E06CD0500C9DB4AE601CA72747BD34B0C
+:10747C00C9DB4AE602C8DB4BC9CD7D74B7C2857443
+:10748C00C9AFC9D5CD7F73A7CA9C740E05CD0500B5
+:10749C00D1C91E08C36C741E20CD6C741E08C36C3D
+:1074AC0074111C75C32072111875C320724350548B
+:1074BC002D3835787820756E64657220436F6D7049
+:1074CC007550616B2043502F4D24435058564455F2
+:1074DC002E41534D2020283629202031322D4F6348
+:1074EC00742D313939302024C5112075CD2072E12D
+:1074FC007CC61F5FE5CD6C74E17DC61F5FC36C74E9
+:10750C0041444D3341241A00000D0A241A00002472
+:10751C001B5924000D1B3D240B2400000A240000E1
+:10752C000C240000082400001A0000242400000091
+:10753C00240000001E2400000B2400002400000086
+:04754C002400000017
+:0000000000
diff --git a/cpvcro.hex b/cpvcro.hex
new file mode 100644 (file)
index 0000000..056a1e0
--- /dev/null
@@ -0,0 +1,59 @@
+:10700000AC00060000721D72C3C172C3D172C3DC32
+:1070100072C3E472C3C272C3CB72C3C372C3EE72D3
+:10702000C3EC72C30000C30000C30C73C30273C37C
+:10703000FD72C31273C3B871C3B871C3B871C3A969
+:1070400071C3AE71C3B871C3BB71C3C171C3AC703E
+:10705000C34872C34972C34A72C34B72C34D72C3F1
+:107060005272C35872C35972C3C072C33371C348DA
+:1070700073C33C71C3DB71C3CA7100005D7293724C
+:10708000000000000010FF1CFFFFFFFF00000001D8
+:107090000000000650500805000000000D0D2323DD
+:0770A00031004080000101F6
+:1070AC00CDEC700E07CD050032EB700E0CCD05004B
+:1070BC007D32EA7011E971CDCA71111873CDCA71A4
+:1070CC0011F971CDCA71114973CDCA71CDC7712136
+:0E70DC009C7322A3703E4032A570CD3972C95C
+:1070EC002A0100110300192214711103001922172F
+:1070FC007111030019221A7111030019221D71114B
+:10710C001E0019221F71C9C30000C30000C3000078
+:10711C00C30000C300000E14064605C226710DC242
+:10712C0024713DC22271C9D5117473CDCA71D1C9F4
+:10713C003AEA70FE30FA73713A5C00B7CA4F713D8F
+:10714C00C354710E19CD05005F0E2ECD050006033C
+:10715C00AF0E032183002B7E1F770DC2627105C217
+:10716C005C715E2356EBC90E1BCD0500EB2AA77094
+:10717C0023010000D51A1E0817DA897103572B7DDD
+:10718C00B4CA9A717A1DC28471D113C38071D1694A
+:10719C00603AAA70D603C8293DC2A371C91E20C388
+:1071AC00CB721E20CDCB721E25C3CB72C3C77111FF
+:1071BC008873C3CA71119273C3CA7111E671E5D594
+:1071CC00C50E09CD0500C1D1E1C9E1232323E97E18
+:1071DC001223130B78B1C2DB71C90D0A24636F6ED5
+:1071EC006669677572656420666F72202420776902
+:1071FC00746820244350585357542E41534D202823
+:10720C003130292020372D4A616E2D31393931200A
+:10721C00244350585359532E41534D202834302970
+:10722C00202032382D4175672D383920243E01D36A
+:10723C00223E90D320328870328970C9C9C9C9C91D
+:10724C0024E65FC3D6717BC97BC97BC9C97BD320BC
+:10725C00C907033131302401010431323030248824
+:10726C0088033135302482820432343030249090BB
+:10727C0003333030248484043438303024A0A00408
+:10728C003936303024C0C00D0A2020203131302056
+:10729C002020313530202020333030202031323046
+:1072AC003020203234303020203438303020203917
+:1072BC0036303024C9C9C90E061EFFCD0500C90ED3
+:1072CC0006CD0500C9DB20E680CAD1727BD321C96B
+:1072DC00DB20E640C8DB21C9CDDC72B7C2E472C941
+:1072EC00AFC9D5CD5672A7CAFB720E05CD0500D11C
+:1072FC00C91E08C3CB721E20CDCB721E08C3CB7225
+:10730C00118373C3CA7111E671C3CA7143726F6D75
+:10731C00656D636F202854552D41525429244350D8
+:10732C00585644552E41534D2020283629202031C3
+:10733C00322D4F63742D313939302024C947656E95
+:10734C0065726963202844756D622920435254206C
+:10735C005465726D696E616C20747970652073650B
+:10736C006C656374656420240D0A537461727469CE
+:10737C006E67202E2E2E245E550D0A240D0A5250B7
+:10738C0061636B3A20240D0A535061636B3A2024DD
+:0000000000
diff --git a/cpvdel.hex b/cpvdel.hex
new file mode 100644 (file)
index 0000000..6f9ea5f
--- /dev/null
@@ -0,0 +1,68 @@
+:10700000AC00060000721D72C34673C35673C361A1
+:1070100073C36973C34773C35073C34873C3737334
+:10702000C37173C30000C30000C39173C38773C3EC
+:107030008273C39773C3B871C3B871C3B871C3A95E
+:1070400071C3AE71C3B871C3BB71C3C171C3AC703E
+:10705000C34472C34572C34672C34772C34972C305
+:107060004E72C35472C35572C34573C33371C3CFD9
+:1070700073C33C71C3DB71C3CA7100005972D4720F
+:10708000000000000010FF1CFFFFFFFF00000001D8
+:107090000000000650500805000000000D0D2323DD
+:0770A00031004080000101F6
+:1070AC00CDEC700E07CD050032EB700E0CCD05004B
+:1070BC007D32EA7011E971CDCA71119D73CDCA711F
+:1070CC0011F971CDCA7111D073CDCA71CDC77121AF
+:0E70DC00237422A3703E4032A570CD3972C9D4
+:1070EC002A0100110300192214711103001922172F
+:1070FC007111030019221A7111030019221D71114B
+:10710C001E0019221F71C9C30000C30000C3000078
+:10711C00C30000C300000E14064605C226710DC242
+:10712C0024713DC22271C9D511FB73CDCA71D1C96D
+:10713C003AEA70FE30FA73713A5C00B7CA4F713D8F
+:10714C00C354710E19CD05005F0E2ECD050006033C
+:10715C00AF0E032183002B7E1F770DC2627105C217
+:10716C005C715E2356EBC90E1BCD0500EB2AA77094
+:10717C0023010000D51A1E0817DA897103572B7DDD
+:10718C00B4CA9A717A1DC28471D113C38071D1694A
+:10719C00603AAA70D603C8293DC2A371C91E20C388
+:1071AC0050731E20CD50731E25C35073C3C771116D
+:1071BC000F74C3CA71111974C3CA7111E671E5D584
+:1071CC00C50E09CD0500C1D1E1C9E1232323E97E18
+:1071DC001223130B78B1C2DB71C90D0A24636F6ED5
+:1071EC006669677572656420666F72202420776902
+:1071FC00746820244350585357542E41534D202823
+:10720C003130292020372D4A616E2D31393931200A
+:10721C00244350585359532E41534D202834302970
+:10722C00202032382D4175672D383920243E07D364
+:10723C0029328870328970C9C9C9C9C924E65FC3AB
+:10724C00D6717BC97BC97BC9C97BD329C9100331D2
+:10725C003130240202043132303024070705313337
+:10726C00342E35240303033135302404040431381F
+:10727C003030240808053139323030240F0F0432F5
+:10728C003030302409090432343030240A0A0333F4
+:10729C0030302405050433363030240B0B043438DD
+:1072AC003030240C0C0235302400000336303024EE
+:1072BC0006060437323030240D0D02373524010117
+:1072CC000439363030240E0E0D0A202020353020A3
+:1072DC002020202037352020202031313020202044
+:1072EC00203133342E3520203135302020202033EE
+:1072FC0030302020202036303020202031323030E9
+:10730C000D0A20313830302020203230303020200F
+:10731C0020323430302020203336303020202034BE
+:10732C003830302020203732303020202039363091
+:10733C00302020313932303024C9C9C90E061EFF25
+:10734C00CD0500C90E06CD0500C9DB23E601CA56E2
+:10735C00737BD322C9DB23E602C8DB22C9CD617360
+:10736C00B7C26973C9AFC9D5CD5272A7CA80730EA3
+:10737C0005CD0500D1C91E08C350731E20CD507316
+:10738C001E08C35073110A74C3CA7111E671C3CAC3
+:10739C007144696769636F6D702044656C706869CE
+:1073AC0020313030244350585644552E41534D20F3
+:1073BC0020283629202031322D4F63742D31393954
+:1073CC00302024C947656E65726963202844756D49
+:1073DC00622920435254205465726D696E616C2091
+:1073EC00747970652073656C656374656420240D15
+:1073FC000A5374617274696E67202E2E2E245E55AA
+:10740C000D0A240D0A525061636B3A20240D0A5365
+:07741C005061636B3A20246C
+:0000000000
diff --git a/cpvdis.hex b/cpvdis.hex
new file mode 100644 (file)
index 0000000..62885a0
--- /dev/null
@@ -0,0 +1,73 @@
+:10700000AC00060000721D72C38F73C39F73C3AAC6
+:1070100073C3B273C39073C39973C39173C3BC73C7
+:10702000C3BA73C30000C30000C3DA73C3D073C311
+:10703000CB73C3E073C3B871C3B871C3B871C3A9CC
+:1070400071C3AE71C3B871C3BB71C3C171C3AC703E
+:10705000C37272C37372C37472C37572C3B472C3E2
+:10706000F272C3F872C3F972C38E73C33371C3254E
+:1070700074C33C71C3DB71C3CA71000018735B73C6
+:10708000000000000010FF1CFFFFFFFF00000001D8
+:107090000000000650500805000000000D0D2323DD
+:0770A00031004080000101F6
+:1070AC00CDEC700E07CD050032EB700E0CCD05004B
+:1070BC007D32EA7011E971CDCA7111E673CDCA71D6
+:1070CC0011F971CDCA71112674CDCA71CDC7712158
+:0E70DC00797422A3703E4032A570CD3972C97E
+:1070EC002A0100110300192214711103001922172F
+:1070FC007111030019221A7111030019221D71114B
+:10710C001E0019221F71C9C30000C30000C3000078
+:10711C00C30000C300000E28064605C226710DC22E
+:10712C0024713DC22271C9D5115174CDCA71D1C916
+:10713C003AEA70FE30FA73713A5C00B7CA4F713D8F
+:10714C00C354710E19CD05005F0E2ECD050006033C
+:10715C00AF0E032183002B7E1F770DC2627105C217
+:10716C005C715E2356EBC90E1BCD0500EB2AA77094
+:10717C0023010000D51A1E0817DA897103572B7DDD
+:10718C00B4CA9A717A1DC28471D113C38071D1694A
+:10719C00603AAA70D603C8293DC2A371C91E20C388
+:1071AC0099731E20CD99731E25C39973C3C7711192
+:1071BC006574C3CA71116F74C3CA7111E671E5D5D8
+:1071CC00C50E09CD0500C1D1E1C9E1232323E97E18
+:1071DC001223130B78B1C2DB71C90D0A24636F6ED5
+:1071EC006669677572656420666F72202420776902
+:1071FC00746820244350585357542E41534D202823
+:10720C003130292020372D4A616E2D31393931200A
+:10721C00244350585359532E41534D202834302970
+:10722C00202032382D4175672D383920243E0CD35F
+:10723C00043E0BD3043E0DD3043E00D3043E0ED3C8
+:10724C00043E03D3043E0BD3043E52D3043E04D37A
+:10725C00043E44D3043E03D3043E71D3043E05D311
+:10726C00043EEAD304C9C9C9C9117C72CDCA71C91B
+:10727C000D0A42205472616E736D69742061203363
+:10728C0030306D7320425245414B0D0A4C205472E4
+:10729C00616E736D697420612035207365636F6E48
+:1072AC006420425245414B24E65FFE42CAC972FE3D
+:1072BC004CCAC372C3D671D51611C3CC72D5160184
+:1072CC003E01D304DB04E601CACC723E05D3043E76
+:1072DC00FAD3043E1ECD227115C2DF72D13E05D306
+:1072EC00043EEAD304C97BC97BC97BC9C93E0CD314
+:1072FC00047BD3043E0DD3047AD3043E0ED3043E58
+:10730C0003D3043E0BD3043E52D304C909033131D9
+:10731C0030246E0404313230302402010331353014
+:10732C00243F030432343030243200033330302411
+:10733C009F0104343830302418000336303024CE0A
+:10734C00000237352481060439363030240B000D09
+:10735C000A202037352020313130202031353020A3
+:10736C002033303020203630302020313230302065
+:10737C002032343030202034383030202039363030
+:10738C003024C9C9C90E061EFFCD0500C90E06CD95
+:10739C000500C9DB04E604CA9F737BD305C9DB0473
+:1073AC00E601C8DB05C9CDAA73B7C2B273C9AFC9B0
+:1073BC00D5CDF672A7CAC9730E05CD0500D1C91E6D
+:1073CC0008C399731E20CD99731E08C3997311605D
+:1073DC0074C3CA7111E671C3CA71446973636F7661
+:1073EC00657279207573696E672038335520626F2A
+:1073FC0061726420706F727420422443505856445A
+:10740C00552E41534D2020283629202031322D4F26
+:10741C0063742D313939302024C947656E65726922
+:10742C0063202844756D62292043525420546572A0
+:10743C006D696E616C20747970652073656C656321
+:10744C0074656420240D0A5374617274696E67202C
+:10745C002E2E2E245E550D0A240D0A525061636B9C
+:0D746C003A20240D0A535061636B3A20242E
+:0000000000
diff --git a/cpvdm2.hex b/cpvdm2.hex
new file mode 100644 (file)
index 0000000..fb20248
--- /dev/null
@@ -0,0 +1,70 @@
+:10700000AC0006009872B572C35B73C37773C38319
+:1070100073C38C73C36273C37273C36973C39B738B
+:10702000C39473C30000C30000C3D773C3CD73C33D
+:10703000C873C3DD73C3F771C3D371C3C771C3BB57
+:1070400071C3C171C3DC71C3E571C3EE71C3AC70B0
+:10705000C3D972C3E172C3E272C3E372C30073C3E4
+:107060001B73C32173C32273C32273C32671C3A9C5
+:1070700073C34E71C32472C31372127400000000F4
+:1070800042732C730010001CFFFFFFFF0000000183
+:107090000000000650500805000000000D0D2323DD
+:0770A00031004080000101F6
+:1070AC00CDDF700E07CD0500325A730E0CCD0500E6
+:1070BC007D32DE70113272CD137211E373CD137207
+:1070CC00CD1072213E7422A3703E4032A570CDD1FA
+:0270DC0072C977
+:1070DF002A01001103001922077111030019220A56
+:1070EF007111030019220D71110300192210711172
+:1070FF001E0019221271C9C30000C30000C3000093
+:10710F00C30000C300000E14064605C219710DC25C
+:10711F0017713DC21571C9D511F673CD1372D1CD4B
+:10712F0013721E5BCD727311E373CD13721149721B
+:10713F00CD13723A8D70B7C8118172CD1372C93ADF
+:10714F00DE70FE30FA85713A5C00B7CA61713DC3DB
+:10715F0066710E19CD05005F0E2ECD05000603AF2B
+:10716F000E032183002B7E1F770DC2747105C26E33
+:10717F00715E2356EBC90E1BCD0500EB2AA77023BA
+:10718F00010000D51A1E0817DA9B7103572B7DB427
+:10719F00CAAC717A1DC29671D113C39271D1696055
+:1071AF003AAA70D603C8293DC2B571C9011404C3E8
+:1071BF00A973011405C3A973010C06CDA973113A64
+:1071CF0074C31372010107CDA973C3CD71010108F7
+:1071DF00CDA973C3CD71010809CDA973C3CD7101B9
+:1071EF00080BCDA973C3CD713A8D70B7CA04720164
+:1071FF00010DC30772010109CDA973113674C313B1
+:10720F0072112F72E5D5C50E09CD0500C1D1E1C9A7
+:10721F00E1232323E97E1223130B78B1C22472C911
+:10722F000D0A24636F6E6669677572656420666FF9
+:10723F00722024207769746820245D0D0A0D0A4E90
+:10724F00756D626572206F66207061636B65747314
+:10725F003A0D0A4E756D626572206F662072657405
+:10726F00726965733A0D0A46696C65206E616D65CA
+:10727F003A240D0A0D0A0D0A527061636B3A0D0A1A
+:10728F000D0A537061636B3A244350585357542E71
+:10729F0041534D20283130292020372D4A616E2D42
+:1072AF003139393120244350585359532E41534DBE
+:1072BF002028343029202032382D4175672D383958
+:1072CF002024010201CD1373C9C9010200CD13732C
+:1072DF00C9C9C9C911EA72CD1372C90D0A4220205A
+:1072EF005472616E736D6974206120425245414B37
+:1072FF0024E65FFE42CA0A73C31F72010206CD1352
+:10730F007301001E2A0100113F0019E97BC97BC9D7
+:10731F007BC9C97E325973237E325873C90D0A4314
+:10732F004F4D4D554E49434154494F4E5320706F69
+:10733F00727424010E434F4D4D554E4943415449EC
+:10734F004F4E532455734204000442813A5973320D
+:10735F000300C93A5A73320300C9CD0671B7C8CDBD
+:10736F000971C94BCD0C71C9E5C53A58734FCD059D
+:10737F0000C1E1C9CD0671B7C8CD0971C9CD8373FD
+:10738F00B7C28C73C9CD1271CD1271C9D5CD1F7310
+:10739F00A7CAA7734BCD0F71D1C9C5110F74CD13E8
+:1073AF0072E1E56C2600CD08011E3BCD7273E1261C
+:1073BF0000CD08011E48C372731E08C372731E20CE
+:1073CF00CD72731E08C37273110A74C31372110343
+:1073DF0074C313724445436D61746520494920435A
+:1073EF00502F4D2D3830241B3C1B5B481B5B4A0D27
+:1073FF000A0909241B5B481B5B4A240D1B5B4B24AA
+:10740F001B5B241B5B41241B5B42241B5B43241B24
+:10741F005B44242400000024000000240000001B13
+:0F742F005B48241B4D24001B5B4A241B5B4B2432
+:0000000000
diff --git a/cpvdmv.hex b/cpvdmv.hex
new file mode 100644 (file)
index 0000000..e9169ad
--- /dev/null
@@ -0,0 +1,72 @@
+:10700000AC00060000721D72C38173C39173C39CF0
+:1070100073C3A473C38273C38B73C38373C3B0730B
+:10702000C3AC73C30000C30000C3CE73C3C473C337
+:10703000BF73C3D473C3B871C3B871C3B871C3A9E4
+:1070400071C3AE71C3B871C3BB71C3C171C3AC703E
+:10705000C33C72C33D72C33E72C33F72C35C72C312
+:107060007B72C38172C38272C38073C33371C30FD7
+:1070700074C33C71C3DB71C3CA71000094720F7397
+:10708000000000000010FF1CFFFFFFFF00000001D8
+:107090000000000650500805000000000D0D2323DD
+:0770A00031004080000101F6
+:1070AC00CDEC700E07CD050032EB700E0CCD05004B
+:1070BC007D32EA7011E971CDCA7111DA73CDCA71E2
+:1070CC0011F971CDCA71111074CDCA71CDC771216E
+:0E70DC00637422A3703E4032A570CD3B72C992
+:1070EC002A0100110300192214711103001922172F
+:1070FC007111030019221A7111030019221D71114B
+:10710C001E0019221F71C9C30000C30000C3000078
+:10711C00C30000C300000E14064605C226710DC242
+:10712C0024713DC22271C9D5113B74CDCA71D1C92C
+:10713C003AEA70FE30FA73713A5C00B7CA4F713D8F
+:10714C00C354710E19CD05005F0E2ECD050006033C
+:10715C00AF0E032183002B7E1F770DC2627105C217
+:10716C005C715E2356EBC90E1BCD0500EB2AA77094
+:10717C0023010000D51A1E0817DA897103572B7DDD
+:10718C00B4CA9A717A1DC28471D113C38071D1694A
+:10719C00603AAA70D603C8293DC2A371C91E20C388
+:1071AC008B731E20CD8B731E25C38B73C3C77111BC
+:1071BC004F74C3CA71115974C3CA7111E671E5D504
+:1071CC00C50E09CD0500C1D1E1C9E1232323E97E18
+:1071DC001223130B78B1C2DB71C90D0A24636F6ED5
+:1071EC006669677572656420666F72202420776902
+:1071FC00746820244350585357542E41534D202823
+:10720C003130292020372D4A616E2D31393931200A
+:10721C0024435058544F522E41534D202835292089
+:10722C002031302D4A616E2D31393931202024C95D
+:10723C00C9C9C9114672CDCA71C90D0A4220205460
+:10724C0072616E736D6974206120425245414B240A
+:10725C00E65FFE42CA6672C3D671DB71E604CA668B
+:10726C00723E2FD3773E64CD22713E27D377C97BF4
+:10727C00C97BC97BC9C93E00D3773E4ED3763E70DD
+:10728C0083D3763E27D377C91003313130240202E1
+:10729C000431323030240707053133342E352403C2
+:1072AC000303313530240404043138303024080809
+:1072BC00053139323030240F0F043230303024098C
+:1072CC00090432343030240A0A03333030240505E3
+:1072DC000433363030240B0B0434383030240C0C8F
+:1072EC0002353024000003363030240606043732D1
+:1072FC003030240D0D02373524010104393630307D
+:10730C00240E0E0D0A20202035302020202020377E
+:10731C003520202020313130202020203133342ED4
+:10732C0035202031353020202020333030202020D3
+:10733C0020363030202020313230300D0A203138C8
+:10734C003030202020323030302020203234303089
+:10735C00202020333630302020203438303020208C
+:10736C00203732303020202039363030202031394F
+:10737C0032303024C9C9C90E061EFFCD0500C90E16
+:10738C0006CD0500C9DB71E601CA91737BD374C9C4
+:10739C00DB71E602C8DB70C9CD9C73B7C2A473C99C
+:1073AC00CD1F71C9D5CD7F72A7CABD730E05CD0592
+:1073BC0000D1C91E08C38B731E20CD8B731E08C34E
+:1073CC008B73114A74C3CA7111E671C3CA714E43EF
+:1073DC0052204465636973696F6E4D617465205604
+:1073EC00241B2124004350585644552E41534D2004
+:1073FC0020283629202031322D4F63742D31393914
+:10740C00302024C947656E65726963202844756D08
+:10741C00622920435254205465726D696E616C2050
+:10742C00747970652073656C656374656420240DD4
+:10743C000A5374617274696E67202E2E2E245E5569
+:10744C000D0A240D0A525061636B3A20240D0A5325
+:07745C005061636B3A20242C
+:0000000000
diff --git a/cpvgen.hex b/cpvgen.hex
new file mode 100644 (file)
index 0000000..201057f
--- /dev/null
@@ -0,0 +1,62 @@
+:10700000AC000600FF711C72C3DD72C3F972C305C8
+:1070100073C30E73C3E472C3F472C3EB72C31D7304
+:10702000C31673C30000C30000C33A73C33073C3F5
+:107030002B73C34073C3B771C3B771C3B771C3A810
+:1070400071C3AD71C3B771C3BA71C3C071C3AC7042
+:10705000C33972C33A72C33B72C33C72C33E72C33C
+:107060004372C34972C34A72C34A72C33271C36462
+:1070700073C33B71C3DA71C3C97100000000000023
+:107080009D7254720010FF1CFFFFFFFF0000000103
+:107090000000000650500805000000000D0D2323DD
+:0770A00031004080000101F6
+:1070AC00CDEB700E07CD050032DC720E0CCD050059
+:1070BC007D32EA7011E871CDC971119073CDC9712F
+:1070CC0011F871CDC971116573CDC971CDC671211E
+:0E70DC00C87322A3703E4032A570CD3872C931
+:1070EB002A01001103001922137111030019221632
+:1070FB00711103001922197111030019221C71114E
+:10710B001E0019221E71C9C30000C30000C300007A
+:10711B00C30000C300000E14064605C225710DC244
+:10712B0023713DC22171C9D511A073CDC971D1C9CC
+:10713B003AEA70FE30FA72713A5C00B7CA4E713D92
+:10714B00C353710E19CD05005F0E2ECD050006033E
+:10715B00AF0E032183002B7E1F770DC2617105C219
+:10716B005B715E2356EBC90E1BCD0500EB2AA77096
+:10717B0023010000D51A1E0817DA887103572B7DDF
+:10718B00B4CA99717A1DC28371D113C37F71D1694E
+:10719B00603AAA70D603C8293DC2A271C91E20C38A
+:1071AB00F4721E20CDF4721E25C3F472C3C6711186
+:1071BB00B473C3C97111BE73C3C97111E571E5D540
+:1071CB00C50E09CD0500C1D1E1C9E1232323E97E19
+:1071DB001223130B78B1C2DA71C90D0A24636F6ED7
+:1071EB006669677572656420666F72202420776903
+:1071FB00746820244350585357542E41534D202824
+:10720B003130292020372D4A616E2D31393931200B
+:10721B00244350585359532E41534D202834302971
+:10722B00202032382D4175672D38392024C9C9C922
+:10723B00C9C924E65FC3D5717BC97BC97BC9C97E2C
+:10724B0032DB72237E32DA72C90D0A435254206448
+:10725B0065766963650D0A505452206465766963DF
+:10726B00650D0A545459206465766963650D0A559A
+:10727B004331206465766963650D0A55523120648C
+:10728B0065766963650D0A555232206465766963CC
+:10729B006524060343525424C8720350545224CB22
+:1072AB00720354545924CE720355433124D17203C3
+:1072BB0055523124D4720355523224D772550200E1
+:1072CB005604000002005702006A04007E0400040A
+:1072DB0056953ADB72320300C93ADC72320300C9AD
+:1072EB00CD1271B7C8CD1571C94BCD1871C9E5C594
+:1072FB003ADA724FCD0500C1E1C9CD1271B7C8CDD5
+:10730B001571C9CD0573B7C20E73C9CD1E71CD1ED4
+:10731B0071C9D5CD4772A7CA29734BCD1B71D1C982
+:10732B001E08C3F4721E20CDF4721E08C3F4721132
+:10733B00AF73C3C97111E571C3C97143505856443A
+:10734B00552E41534D2020283629202031322D4FE8
+:10735B0063742D313939302024C947656E657269E4
+:10736B0063202844756D6229204352542054657262
+:10737B006D696E616C20747970652073656C6563E3
+:10738B00746564202447656E657269632043502FD2
+:10739B004D2D3830240D0A5374617274696E672059
+:1073AB002E2E2E245E550D0A240D0A525061636B4E
+:0D73BB003A20240D0A535061636B3A2024E0
+:0000000000
diff --git a/cpvgni.hex b/cpvgni.hex
new file mode 100644 (file)
index 0000000..04e5bfb
--- /dev/null
@@ -0,0 +1,82 @@
+:10700000AC0006009972B672C33974C34974C35494
+:1070100074C35C74C33A74C34374C33B74C366746F
+:10702000C36474C30000C30000C39C74C39274C3E0
+:107030008D74C3A274C3F871C3D471C3C871C3BCC7
+:1070400071C3C271C3DD71C3E671C3EF71C3AC70AC
+:10705000C3E372C3E472C3E572C3E672C30373C3CE
+:107060002373C32973C32A73C33874C32771C375C9
+:1070700074C34F71C32572C31472CF743B73BF7353
+:10708000000000000010011DFFFFFFFF00000001D5
+:107090000000000650500805000000000D0D2323DD
+:0770A00031004080000101F6
+:1070AC00CDE0700E07CD050032DF700E0CCD050063
+:1070BC007D32DE70113372CD147211A874CD14723E
+:1070CC00CD117221FB7422A3703E4032A570CDD13C
+:0270DC0072C977
+:1070E0002A01001103001922087111030019220B53
+:1070F0007111030019220E7111030019221171116F
+:107100001E0019221371C9C30000C30000C3000090
+:10711000C30000C300000E28064605C21A710DC246
+:1071200018713DC21671C9D511B774CD1472D1CD85
+:1071300014721E5BCD437411A874CD1472114A727F
+:10714000CD14723A8D70B7C8118272CD1472C93ADB
+:10715000DE70FE30FA86713A5C00B7CA62713DC3D8
+:1071600067710E19CD05005F0E2ECD05000603AF29
+:107170000E032183002B7E1F770DC2757105C26F30
+:10718000715E2356EBC90E1BCD0500EB2AA77023B9
+:10719000010000D51A1E0817DA9C7103572B7DB425
+:1071A000CAAD717A1DC29771D113C39371D1696051
+:1071B0003AAA70D603C8293DC2B671C9011404C3E6
+:1071C0007574011405C37574010C06CD757411F73F
+:1071D00074C31472010107CD7574C3CE7101010827
+:1071E000CD7574C3CE71010809CD7574C3CE71011C
+:1071F000080BCD7574C3CE713A8D70B7CA05720194
+:10720000010DC30872010109CD757411F374C31423
+:1072100072113072E5D5C50E09CD0500C1D1E1C9A5
+:10722000E1232323E97E1223130B78B1C22572C90F
+:107230000D0A24636F6E6669677572656420666FF8
+:10724000722024207769746820245D0D0A0D0A4E8F
+:10725000756D626572206F66207061636B65747313
+:107260003A0D0A4E756D626572206F662072657404
+:10727000726965733A0D0A46696C65206E616D65C9
+:107280003A240D0A0D0A0D0A527061636B3A0D0A19
+:107290000D0A537061636B3A244350585357542E70
+:1072A00041534D20283130292020372D4A616E2D41
+:1072B000313939312024435058474E492E41534DDE
+:1072C0002020283329202032372D4F63742D383762
+:1072D000243E83D3EB3E14D3E83E00D3E93A3A731D
+:1072E000D3EBC9C9C9C911ED72CD1472C90D0A42D7
+:1072F00020205472616E736D697420612042524582
+:10730000414B24E65FFE42CA0D73C32072DBEDE6FB
+:1073100020CA0D733E40D3EB3E19CD16713A3A7335
+:10732000D3EDC97BC97BC97BC9C93E83D3EB7AD373
+:10733000E87BD3E93A3A73D3EBC903110331313017
+:107340002406D104313230302400A0053133342EEC
+:1073500035240594033135302405000431383030AC
+:1073600024006B05313932303024000A04323030C9
+:107370003024006004323430302400500333303085
+:10738000240280043336303024003505333834305D
+:1073900030240005043438303024002802353024ED
+:1073A0000F000336303024014004373230302400DF
+:1073B0001B023735240A0004393630302400140DFE
+:1073C0000A20202035302020202020203735202082
+:1073D0002020313130202020203133342E35202020
+:1073E000313530202020203330302020202036300E
+:1073F00030202020313230300D0A2031383030201A
+:1074000020203230303020202032343030202020F4
+:1074100033363030202020343830302020203732AE
+:107420003030202020393630302020313932303091
+:107430002020333834303024C9C9C90E061EFFCD90
+:107440000500C90E06CD0500C9DBEDE620CA49746A
+:107450007BD3E8C9DBEDE601C8DBE8C9CD5474B7DE
+:10746000C25C74C9AFC9D5CD2773A7CA73740E05A2
+:10747000CD0500D1C9C511CC74CD1472E17CC61FF5
+:107480005FE5CD4374E17DC61F5FC343741E08C32F
+:1074900043741E20CD43741E08C3437411C974C3C2
+:1074A000147211C774C31472456163612047656E1D
+:1074B000696520494949241A0D0A202020202020EE
+:1074C000202020202020241A240D18241B3D240BCA
+:1074D0002400000A2400000C240000082400001AE4
+:1074E0002400001B5224001B5324001E2400000B08
+:0B74F0002400001924000018240000F4
+:0000000000
diff --git a/cpvh89.hex b/cpvh89.hex
new file mode 100644 (file)
index 0000000..661c733
--- /dev/null
@@ -0,0 +1,90 @@
+:10700000AC0006009972B672C3AC74C3BC74C3C73B
+:1070100074C3CF74C3AD74C3B674C3AE74C3DB742E
+:10702000C3D774C30000C30000C31175C30775C381
+:107030000275C31775C3F871C3D471C3C871C3BCDB
+:1070400071C3C271C3DD71C3E671C3EF71C3AC70AC
+:10705000C31973C31A73C31B73C31C73C34B73C3AA
+:107060007E73C38473C38873C3AB74C32771C3EACD
+:1070700074C34F71C32572C314724275A173347403
+:10708000000000000010001CFFFFFFFF00000001D7
+:107090000000000650500805000000000D0D2323DD
+:0770A00031004080000101F6
+:1070AC00CDE0700E07CD050032DF700E0CCD050063
+:1070BC007D32DE70113372CD1472111D75CD1472C8
+:1070CC00CD1172216E7522A3703E4032A570CDD2C7
+:0270DC0072C977
+:1070E0002A01001103001922087111030019220B53
+:1070F0007111030019220E7111030019221171116F
+:107100001E0019221371C9C30000C30000C3000090
+:10711000C30000C300000E14064605C21A710DC25A
+:1071200018713DC21671C9D5112D75CD1472D1CD0E
+:1071300014721E5BCDB674111D75CD1472114A7296
+:10714000CD14723A8D70B7C8118272CD1472C93ADB
+:10715000DE70FE30FA86713A5C00B7CA62713DC3D8
+:1071600067710E19CD05005F0E2ECD05000603AF29
+:107170000E032183002B7E1F770DC2757105C26F30
+:10718000715E2356EBC90E1BCD0500EB2AA77023B9
+:10719000010000D51A1E0817DA9C7103572B7DB425
+:1071A000CAAD717A1DC29771D113C39371D1696051
+:1071B0003AAA70D603C8293DC2B671C9011404C3E6
+:1071C000EA74011405C3EA74010C06CDEA74116A6D
+:1071D00075C31472010107CDEA74C3CE71010108B1
+:1071E000CDEA74C3CE71010809CDEA74C3CE710132
+:1071F000080BCDEA74C3CE713A8D70B7CA0572011F
+:10720000010DC30872010109CDEA74116675C3143A
+:1072100072113072E5D5C50E09CD0500C1D1E1C9A5
+:10722000E1232323E97E1223130B78B1C22572C90F
+:107230000D0A24636F6E6669677572656420666FF8
+:10724000722024207769746820245D0D0A0D0A4E8F
+:10725000756D626572206F66207061636B65747313
+:107260003A0D0A4E756D626572206F662072657404
+:10727000726965733A0D0A46696C65206E616D65C9
+:107280003A240D0A0D0A0D0A527061636B3A0D0A19
+:107290000D0A537061636B3A244350585357542E70
+:1072A00041534D20283130292020372D4A616E2D41
+:1072B0003139393120244350584845412E41534DEE
+:1072C00020283429202033312D4175672D3139385C
+:1072D0003924CDF372DBDBF680D3DBDBD832887068
+:1072E000DBD93289703E03D3DBDBDCF601D3DCCDA6
+:1072F0000273C9DBD9321773AFD3D9DBDCF610D3F5
+:10730000DCC9DBD83E07CD1671DBD8DBDCE6EFD37A
+:07731000DC3A1773D3D9C961
+:10731800C9C9C9C9112373CD1472C90D0A422020E5
+:107328005472616E736D6974206120425245414BFD
+:107338000D0A44202044726F7020746865206C69BF
+:107348006E6524E65FFE44C26473DBDCE6FED3DCD4
+:107358003E32CD1671DBDCF601D3DCC9FE42CA6CC5
+:1073680073C32072DBDBF640D3DB3E1ECD1671DB28
+:10737800DBE6BFD3DBC97BC97BC97BC9CD5273C9E7
+:10738800CDF372DBDBF680D3DB7BD3D87AD3D9DBC2
+:10739800DBE67FD3DBCD0273C91303313130241709
+:1073A800040431323030246000053133342E352462
+:1073B8005903043138303024400005313932303037
+:1073C80024060003323030244002043234303024A2
+:1073D8003000033330302480010433363030242029
+:1073E80000053338343030240300033435302400AA
+:1073F80001043438303024180002353024000905DF
+:1074080035363030302402000336303024C00004D2
+:107418003732303024100002373524000603393063
+:10742800302480000439363030240C000D0A202026
+:1074380020203530202020203735202020313130C1
+:10744800203133342E352020203230302020203394
+:107458003030202020343530202020363030202095
+:10746800203930302020313230300D0A2020313898
+:107478003030202032343030202033363030202055
+:107488003438303020203732303020203936303010
+:1074980020313932303020333834303020353630EE
+:1074A800303024C9C9C90E061EFFCD0500C90E0615
+:1074B800CD0500C9DBDDE620CABC747BD3D8C9DBA7
+:1074C800DDE601C8DBD8C9CDC774B7C2CF74C9CD52
+:1074D8001371C9D5CD8273A7CAE8740E05CD05000E
+:1074E800D1C9C5113F75CD1472E17CC61F5FE5CDCA
+:1074F800B674E17DC61F5FC3B6741E08C3B6741E9A
+:1075080020CDB6741E08C3B674113B75C31472112E
+:107518003675C3147248656174682F5A656E69744C
+:1075280068203839241B481B4A0D0A0909241B48BE
+:107538001B4A240D1B4B241B59241B4124001B42AE
+:1075480024001B4324001B4424001B4524001B4625
+:1075580024001B4724001B4824001B4924001B4A05
+:0675680024001B4B24006F
+:0000000000
diff --git a/cpvh8q.hex b/cpvh8q.hex
new file mode 100644 (file)
index 0000000..7171b7a
--- /dev/null
@@ -0,0 +1,69 @@
+:10700000AC0006009972B672C35873C36873C37339
+:1070100073C37B73C35973C36273C35A73C38773D8
+:10702000C38373C30000C30000C3BD73C3B373C382
+:10703000AE73C3C373C3F871C3D471C3C871C3BC87
+:1070400071C3C271C3DD71C3E671C3EF71C3AC70AC
+:10705000C3EE72C3EF72C3F072C3F172C3F372C3B3
+:10706000F872C3FE72C3FF72C35773C32771C3960E
+:1070700073C34F71C32572C31472FA7303733273EF
+:10708000000000000010001CFFFFFFFF00000001D7
+:107090000000000650500805000000000D0D2323DD
+:0770A00031004080000101F6
+:1070AC00CDE0700E07CD050032DF700E0CCD050063
+:1070BC007D32DE70113372CD147211C973CD14721E
+:1070CC00CD117221267422A3703E4032A570CDD210
+:0270DC0072C977
+:1070E0002A01001103001922087111030019220B53
+:1070F0007111030019220E7111030019221171116F
+:107100001E0019221371C9C30000C30000C3000090
+:10711000C30000C300000E14064605C21A710DC25A
+:1071200018713DC21671C9D511E573CD1472D1CD58
+:1071300014721E5BCD627311C973CD1472114A7241
+:10714000CD14723A8D70B7C8118272CD1472C93ADB
+:10715000DE70FE30FA86713A5C00B7CA62713DC3D8
+:1071600067710E19CD05005F0E2ECD05000603AF29
+:107170000E032183002B7E1F770DC2757105C26F30
+:10718000715E2356EBC90E1BCD0500EB2AA77023B9
+:10719000010000D51A1E0817DA9C7103572B7DB425
+:1071A000CAAD717A1DC29771D113C39371D1696051
+:1071B0003AAA70D603C8293DC2B671C9011404C3E6
+:1071C0009673011405C39673010C06CD96731122B4
+:1071D00074C31472010107CD9673C3CE7101010807
+:1071E000CD9673C3CE71010809CD9673C3CE7101DC
+:1071F000080BCD9673C3CE713A8D70B7CA05720174
+:10720000010DC30872010109CD9673111E74C314D8
+:1072100072113072E5D5C50E09CD0500C1D1E1C9A5
+:10722000E1232323E97E1223130B78B1C22572C90F
+:107230000D0A24636F6E6669677572656420666FF8
+:10724000722024207769746820245D0D0A0D0A4E8F
+:10725000756D626572206F66207061636B65747313
+:107260003A0D0A4E756D626572206F662072657404
+:10727000726965733A0D0A46696C65206E616D65C9
+:107280003A240D0A0D0A0D0A527061636B3A0D0A19
+:107290000D0A537061636B3A244350585357542E70
+:1072A00041534D20283130292020372D4A616E2D41
+:1072B0003139393120244350584845412E41534DEE
+:1072C00020283429202033312D4175672D3139385C
+:1072D00039241180013E10D3DC3E80D3DB7AD3D930
+:1072E0007BD3D83E03D3DBDBD83E09D3DCC9C9C985
+:1072F000C9C924E65FC320727BC97BC97BC9C9CDDC
+:10730000D572C9060333303024018003363030246F
+:1073100000C0043132303024006004323430302474
+:10732000003004343830302400180439363030242A
+:10733000000C0D0A20333030202020363030202041
+:107340003132303020203234303020203438303068
+:1073500020203936303024C9C9C90E061EFFCD059C
+:1073600000C90E06CD0500C9DBDDE620CA68737BC7
+:10737000D3D8C9DBDDE601C8DBD8C9CD7373B7C28A
+:107380007B73C9CD1371C9D5CDFC72A7CA94730E96
+:1073900005CD0500D1C9C511F773CD1472E17CC6C6
+:1073A0001F5FE5CD6273E17DC61F5FC362731E0878
+:1073B000C362731E20CD62731E08C3627311F37320
+:1073C000C3147211EE73C314724865617468204867
+:1073D000382077697468207175616420492F4F20C7
+:1073E00063617264241B481B4A0D0A0909241B4867
+:1073F0001B4A240D1B4B241B59241B4124001B42F8
+:1074000024001B4324001B4424001B4524001B466E
+:1074100024001B4724001B4824001B4924001B4A4E
+:0674200024001B4B2400B8
+:0000000000
diff --git a/cpvhor.hex b/cpvhor.hex
new file mode 100644 (file)
index 0000000..202991a
--- /dev/null
@@ -0,0 +1,57 @@
+:10700000AC00060000721D72C39672C3A572C3B0B5
+:1070100072C3B872C39672C39F72C39772C3C272AF
+:10702000C3C072C30000C30000C3E072C3D672C302
+:10703000D172C3E672C3B871C3B871C3B871C3A9C2
+:1070400071C3AE71C3B871C3BB71C3C171C3AC703E
+:10705000C34F72C35072C35172C35272C36F72C3B3
+:107060008E72C39472C39572C39572C33371C31C7D
+:1070700073C33C71C3DB71C3CA7100000000000020
+:10708000000000000010FF1CFFFFFFFF00000001D8
+:107090000000000650500805000000000D0D2323DD
+:0770A00031004080000101F6
+:1070AC00CDEC700E07CD050032EB700E0CCD05004B
+:1070BC007D32EA7011E971CDCA7111EC72CDCA71D1
+:1070CC0011F971CDCA71111D73CDCA71CDC7712162
+:0E70DC00707322A3703E4032A570CD3A72C987
+:1070EC002A0100110300192214711103001922172F
+:1070FC007111030019221A7111030019221D71114B
+:10710C001E0019221F71C9C30000C30000C3000078
+:10711C00C30000C300000E28064605C226710DC22E
+:10712C0024713DC22271C9D5114873CDCA71D1C920
+:10713C003AEA70FE30FA73713A5C00B7CA4F713D8F
+:10714C00C354710E19CD05005F0E2ECD050006033C
+:10715C00AF0E032183002B7E1F770DC2627105C217
+:10716C005C715E2356EBC90E1BCD0500EB2AA77094
+:10717C0023010000D51A1E0817DA897103572B7DDD
+:10718C00B4CA9A717A1DC28471D113C38071D1694A
+:10719C00603AAA70D603C8293DC2A371C91E20C388
+:1071AC009F721E20CD9F721E25C39F72C3C7711183
+:1071BC005C73C3CA71116673C3CA7111E671E5D5EC
+:1071CC00C50E09CD0500C1D1E1C9E1232323E97E18
+:1071DC001223130B78B1C2DB71C90D0A24636F6ED5
+:1071EC006669677572656420666F72202420776902
+:1071FC00746820244350585357542E41534D202823
+:10720C003130292020372D4A616E2D31393931200A
+:10721C00244350584E4F522E41534D202028342990
+:10722C00202031362D4A616E2D31393931243E8082
+:10723C00D3053E80D3053E40D3053E4ED3053E37A5
+:10724C00D305C9C9C9C9115972CDCA71C90D0A4230
+:10725C0020205472616E736D697420612042524516
+:10726C00414B24E65FFE42CA7972C3D671DB05E658
+:10727C0004CA79723E3FD3053E19CD22713E37D3F5
+:10728C0005C97BC97BC97BC9C9C9C90E061EFFCDFF
+:10729C000500C90E06CD0500C9DB05E601CAA572BD
+:1072AC007BD304C9DB05E602C8DB04C9CDB072B7D9
+:1072BC00C2B872C9AFC9D5CD9272A7CACF720E052A
+:1072CC00CD0500D1C91E08C39F721E20CD9F721E12
+:1072DC0008C39F72115773C3CA7111E671C3CA7187
+:1072EC004E6F7274687374617220486F72697A6F32
+:1072FC006E244350585644552E41534D2020283669
+:10730C0029202031322D4F63742D3139393020240E
+:10731C00C947656E65726963202844756D622920C2
+:10732C00435254205465726D696E616C207479708F
+:10733C00652073656C656374656420240D0A537451
+:10734C00617274696E67202E2E2E245E550D0A24F0
+:10735C000D0A525061636B3A20240D0A535061633D
+:04736C006B3A202434
+:0000000000
diff --git a/cpvhp1.hex b/cpvhp1.hex
new file mode 100644 (file)
index 0000000..e8e0a0e
--- /dev/null
@@ -0,0 +1,80 @@
+:10700000AC0006009972B672C38173C39173C39BBF
+:1070100073C3A973C38273C38B73C38373C3B37303
+:10702000C3B173C30000C30000C3F273C3E873C3EA
+:10703000E373C3F873C3F871C3D471C3C871C3BC1D
+:1070400071C3C271C3DD71C3E671C3EF71C3AC70AC
+:10705000C30673C32273C32373C32473C32673C3CA
+:107060002B73C33173C33273C33273C32771C3C26B
+:1070700073C34F71C32572C31472267400000000DD
+:1070800063733F730010001CFFFFFFFF000000014F
+:107090000000000650500805000000000D0D2323DD
+:0770A00031004080000101F6
+:1070AC00CDE0700E07CD050032DF700E0CCD050063
+:1070BC007D32DE70113372CD147211FE73CD1472E9
+:1070CC00CD117221DD7422A3703E4032A570CDD259
+:0270DC0072C977
+:1070E0002A01001103001922087111030019220B53
+:1070F0007111030019220E7111030019221171116F
+:107100001E0019221371C9C30000C30000C3000090
+:10711000C30000C300000E28064605C21A710DC246
+:1071200018713DC21671C9D5111074CD1472D1CD2C
+:1071300014721E5BCD8B7311FE73CD1472114A72E3
+:10714000CD14723A8D70B7C8118272CD1472C93ADB
+:10715000DE70FE30FA86713A5C00B7CA62713DC3D8
+:1071600067710E19CD05005F0E2ECD05000603AF29
+:107170000E032183002B7E1F770DC2757105C26F30
+:10718000715E2356EBC90E1BCD0500EB2AA77023B9
+:10719000010000D51A1E0817DA9C7103572B7DB425
+:1071A000CAAD717A1DC29771D113C39371D1696051
+:1071B0003AAA70D603C8293DC2B671C9011404C3E6
+:1071C000C273011405C3C273010C06CDC273114E04
+:1071D00074C31472010107CDC273C3CE71010108DB
+:1071E000CDC273C3CE71010809CDC273C3CE710184
+:1071F000080BCDC273C3CE713A8D70B7CA05720148
+:10720000010DC30872010109CDC273114A74C31480
+:1072100072113072E5D5C50E09CD0500C1D1E1C9A5
+:10722000E1232323E97E1223130B78B1C22572C90F
+:107230000D0A24636F6E6669677572656420666FF8
+:10724000722024207769746820245D0D0A0D0A4E8F
+:10725000756D626572206F66207061636B65747313
+:107260003A0D0A4E756D626572206F662072657404
+:10727000726965733A0D0A46696C65206E616D65C9
+:107280003A240D0A0D0A0D0A527061636B3A0D0A19
+:107290000D0A537061636B3A244350585357542E70
+:1072A00041534D20283130292020372D4A616E2D41
+:1072B0003139393120244350585359532E41534DBD
+:1072C0002028343029202032382D4175672D383957
+:1072D000202401FF73CD050011D87401FF7ECD0578
+:1072E000002ADB7422D4743E0132D97421D3742273
+:1072F000DB7411D87401FF7ECD0500215274228AFF
+:1073000070EBCD1472C901FF74CD05002AD474222C
+:10731000DB7411D87401FF7ECD050011A874CD1463
+:1073200072C9C9C9C924E65FC320727BC97BC97B06
+:10733000C9C9F5C5D5E5EBCD1472E1D1C1F1C90DCF
+:107340000A436F6D6D756E69636174696F6E73204A
+:10735000706F72740D0A5072696E74657220706F6E
+:10736000727424020E434F4D4D554E4943415449CA
+:107370004F4E53245274075052494E544552247D67
+:1073800074C9C90E061EFFCD0500C90E06CD050045
+:10739000C9E5C50E04CD0500C1E1C901FF70CD05E9
+:1073A00000B7C80E03CD0500C9CD9B73B7C2A97342
+:1073B000C9AFC9D5CD2F73A7CAC0730E05CD0500BF
+:1073C000D1C9050DC5112274CD1472E1E56C2600FA
+:1073D000CD08011E72CD8B73E12600CD08011E433E
+:1073E000C38B731E08C38B731E20CD8B731E08C303
+:1073F0008B73111E74C31472111974C31472485024
+:107400002D31323520536572696573203130302457
+:107410001B481B4A0D0A0909241B481B4A240D1B43
+:107420004B241B2661241B4124001B4224001B43C8
+:1074300024001B4424001B4A2400240000002400D4
+:1074400000001B4824001B4D24001B4A24001B4B3A
+:1074500024001B2669313073313864394D1B26698D
+:107460003273323564394D1B2669313073313664DD
+:10747000324D1B26693073323564324D241B266928
+:10748000313073313664394D1B26693073323564BF
+:10749000394D1B2669313073313864324D1B2669F2
+:1074A0003273323564324D241B26693073323564B1
+:1074B000394D1B2669313073313664394D1B2669CD
+:1074C0003273323564394D1B26693130733138647B
+:0D74D000394D24CD000078C90700C300002D
+:0000000000
diff --git a/cpvhp1.txt b/cpvhp1.txt
new file mode 100644 (file)
index 0000000..cf164cd
--- /dev/null
@@ -0,0 +1,99 @@
+. From BPA
+. Postmark:30-Aug-89:08:08:48
+. To MAILER
+. Expires:29-Sep-89:08:07:29
+. Subject: bitnet%"fdccu@cuvma"
+Re:  Version of CP/M Kermit for the HP-125
+
+Below, delimited by lines of asterisks, you will find an Intel .HEX-formated
+version of the system-dependent part of CP/M Kermit, Version 4.09, for the
+HP-125 Business Assistant computer running HP's modified CP/M Version 2.2.
+I suggest that it be called CPVHP1.TXT.  I can also send the sources in
+separate messages if you wish.  Sorry it took so long but other projects
+were pressing.
+You may reach me by sending mail on Bitnet to mailer@uwalocke with the
+subject "dec10%bpa".  Cheers!
+-- Mike Freeman, Bonneville Power Administration; P.O. Box 491; Vancouver,
+WA 98666 Routine MORF (Telephone (206)690-2307) --
+************************************************************************
+:10600000AB0006009862B362C37D63C38D63C39720
+:1060100063C3A563C37E63C38763C37F63C3AF6387
+:10602000C3AD63C30000C30000C3EE63C3E463C336
+:10603000DF63C3F463C3F761C3D361C3C761C3BB89
+:1060400061C3C161C3DC61C3E561C3EE61C3AB6021
+:10605000C30263C31E63C31F63C32063C32263C33E
+:106060002763C32D63C32E63C32E63C32661C3BEE0
+:1060700063C34E61C32462C3136222640000000044
+:106080005F633B630010001CFFFFFFFF0000000187
+:1060900000000640400805000000000D0D232331DC
+:0660A00000408000010138
+:1060AB00CDDF600E07CD050032DE600E0CCD050096
+:1060BB007D32DD60113262CD136211FA63CD136252
+:1060CB00CD106221D96422A2603E4032A460CDCEB5
+:0260DB0062C998
+:1060DF002A01001103001922076111030019220A76
+:1060EF006111030019220D611103001922106111B2
+:1060FF001E0019221261C9C30000C30000C30000B3
+:10610F00C30000C300000E28064605C219610DC268
+:10611F0017613DC21561C9D5110C64CD1362D1CD84
+:10612F0013621E5BCD876311FA63CD13621149624F
+:10613F00CD13623A8D60B7C8118162CD1362C93A2F
+:10614F00DD60FE30FA85613A5C00B7CA61613DC31C
+:10615F0066610E19CD05005F0E2ECD05000603AF4B
+:10616F000E032183002B7E1F770DC2746105C26E53
+:10617F00615E2356EBC90E1BCD0500EB2AA66023EB
+:10618F00010000D51A1E0817DA9B6103572B7DB447
+:10619F00CAAC617A1DC29661D113C39261D1696095
+:1061AF003AA960D603C8293DC2B561C9011404C319
+:1061BF00BE63011405C3BE63010C06CDBE63114A55
+:1061CF0064C31362010107CDBE63C3CD6101010832
+:1061DF00CDBE63C3CD61010809CDBE63C3CD6101DF
+:1061EF00080BCDBE63C3CD613A8D60B7CA0462019F
+:1061FF00010DC30762010109CDBE63114664C313CC
+:10620F0062112F62E5D5C50E09CD0500C1D1E1C9D7
+:10621F00E1232323E97E1223130B78B1C22462C931
+:10622F000D0A24636F6E6669677572656420666F09
+:10623F00722024207769746820245D0D0A0D0A4EA0
+:10624F00756D626572206F66207061636B65747324
+:10625F003A0D0A4E756D626572206F662072657415
+:10626F00726965733A0D0A46696C65206E616D65DA
+:10627F003A240D0A0D0A0D0A527061636B3A0D0A2A
+:10628F000D0A537061636B3A244350585357542E81
+:10629F0041534D20283629202031362D4A756C2D3B
+:1062AF00383720244350585359532E41534D2028EB
+:1062BF003339292020342D4175672D38372024019B
+:1062CF00FF73CD050011D46401FF7ECD05002AD7E1
+:1062DF006422D0643E0132D56421CF6422D7641189
+:1062EF00D46401FF7ECD0500214E64228A60EBCD80
+:1062FF001362C901FF74CD05002AD06422D764113F
+:10630F00D46401FF7ECD050011A464CD1362C9C909
+:10631F00C9C924E65FC31F627BC97BC97BC9C9F5A5
+:10632F00C5D5E5EBCD1362E1D1C1F1C90D0A436FBC
+:10633F006D6D756E69636174696F6E7320706F72C6
+:10634F00740D0A5072696E74657220706F727424C6
+:10635F00020E434F4D4D554E49434154494F4E53F5
+:10636F00244E64075052494E544552247964C9C98A
+:10637F000E061EFFCD0500C90E06CD0500C9E5C5E9
+:10638F000E04CD0500C1E1C901FF70CD0500B7C8EE
+:10639F000E03CD0500C9CD9763B7C2A563C9AFC9B9
+:1063AF00D5CD2B63A7CABC630E05CD0500D1C9059A
+:1063BF000DC5111E64CD1362E1E56C2600CD0801F9
+:1063CF001E72CD8763E12600CD08011E43C387638C
+:1063DF001E08C387631E20CD87631E08C387631102
+:1063EF001A64C31362111564C3136248502D3132FE
+:1063FF00352053657269657320313030241B481B7B
+:10640F004A0D0A0909241B481B4A240D1B4B241B48
+:10641F002661241B4124001B4224001B4324001B24
+:10642F004424001B4A240024000000240000001B09
+:10643F004824001B4D24001B4A24001B4B24001B27
+:10644F002669313073313864394D1B266932733206
+:10645F003564394D1B2669313073313664324D1B2B
+:10646F0026693073323564324D241B2669313073FF
+:10647F00313664394D1B26693073323564394D1B03
+:10648F002669313073313864324D1B2669327332CD
+:10649F003564324D241B26693073323564394D1BF8
+:1064AF002669313073313664394D1B2669327332A8
+:1064BF003564394D1B2669313073313864394D24B9
+:0A64CF00CD000078C90700C30000EB
+:0000000000
+************************************************************************
diff --git a/cpvkpr.hex b/cpvkpr.hex
new file mode 100644 (file)
index 0000000..9e6b859
--- /dev/null
@@ -0,0 +1,86 @@
+:10700000AC0006009972D072C38B74C39A74C3A586
+:1070100074C3AD74C38B74C39474C38C74C3B774DA
+:10702000C3B574C30000C30000C3EB74C3E174C3F1
+:10703000DB74C3F174C3F871C3D471C3C871C3BC2A
+:1070400071C3C271C3DD71C3E671C3EF71C3AC70AC
+:10705000C30373C30473C30E73C30F73C35773C3E4
+:107060009773C39973C39A73C38A74C32771C3C3D5
+:1070700074C34F71C32572C3147214759E7319744F
+:10708000000000000010011CFFFFFFFF00000001D6
+:107090000000000650500805000000000D0D2323DD
+:0770A00031004080000101F6
+:1070AC00CDE0700E07CD050032DF700E0CCD050063
+:1070BC007D32DE70113372CD147211F774CD1472EF
+:1070CC00CD117221407522A3703E4032A570CDEBDC
+:0270DC0072C977
+:1070E0002A01001103001922087111030019220B53
+:1070F0007111030019220E7111030019221171116F
+:107100001E0019221371C9C30000C30000C3000090
+:10711000C30000C300000E19064605C21A710DC255
+:1071200018713DC21671C9D5110175CD1472D1CD3A
+:1071300014721E5BCD947411F774CD1472114A72DF
+:10714000CD14723A8D70B7C8118272CD1472C93ADB
+:10715000DE70FE30FA86713A5C00B7CA62713DC3D8
+:1071600067710E19CD05005F0E2ECD05000603AF29
+:107170000E032183002B7E1F770DC2757105C26F30
+:10718000715E2356EBC90E1BCD0500EB2AA77023B9
+:10719000010000D51A1E0817DA9C7103572B7DB425
+:1071A000CAAD717A1DC29771D113C39371D1696051
+:1071B0003AAA70D603C8293DC2B671C9011404C3E6
+:1071C000C374011405C3C374010C06CDC374113C10
+:1071D00075C31472010107CDC374C3CE71010108D8
+:1071E000CDC374C3CE71010809CDC374C3CE710180
+:1071F000080BCDC374C3CE713A8D70B7CA05720146
+:10720000010DC30872010109CDC374113875C3148F
+:1072100072113072E5D5C50E09CD0500C1D1E1C9A5
+:10722000E1232323E97E1223130B78B1C22572C90F
+:107230000D0A24636F6E6669677572656420666FF8
+:10724000722024207769746820245D0D0A0D0A4E8F
+:10725000756D626572206F66207061636B65747313
+:107260003A0D0A4E756D626572206F662072657404
+:10727000726965733A0D0A46696C65206E616D65C9
+:107280003A240D0A0D0A0D0A527061636B3A0D0A19
+:107290000D0A537061636B3A244350585357542E70
+:1072A00041534D20283130292020372D4A616E2D41
+:1072B0003139393120244350585359532E41534DBD
+:1072C00020283335292030312D4465632D3836246C
+:1072D0004350584242492E41534D20283429202002
+:1072E000372D4A616E2D313939312411F9720E0A68
+:1072F0001A13D3060DC2F072C91818044401000312
+:10730000C105EAC9110B73CD1472C90D0A24C91144
+:107310001673CD1472C90D0A4220205472616E7327
+:107320006D6974206120425245414B0D0A4820206E
+:1073300048616E677570207573696E67204454529A
+:107340000D0A572020576970652073637265656E5A
+:1073500020636C65617224E65FFE42CA7273FE4868
+:10736000CA6B73FE57CAF174C32072160A1EFFC39C
+:107370008173169A1E1E3E01D306DB06E601CA760D
+:10738000733E05D3063E6AB2D3067BCD16713E0529
+:10739000D3063EEAD306C97BC9C97BD300C9100313
+:1073A00031313024020204313230302407070531F4
+:1073B00033342E35240303033135302404040431DF
+:1073C000383030240808053139323030240F0F04AA
+:1073D000323030302409090432343030240A0A03B0
+:1073E0003330302405050433363030240B0B04349D
+:1073F000383030240C0C0235302400000336303095
+:107400002406060437323030240D0D0237352401AE
+:10741000010439363030240E0E0D0A20202035307C
+:1074200020202020203735202020203131302020FE
+:1074300020203133342E35202031353020202020BB
+:1074400033303020202020363030202020313230A0
+:10745000300D0A20313830302020203230303020BA
+:10746000202032343030202020333630302020208D
+:107470003438303020202037323030202020393648
+:1074800030302020313932303024C9C90E061EFF79
+:10749000CD0500C90E06CD0500C9DB06E604CA9A73
+:1074A000747BD304C9DB06E601C8DB04C9CDA5742F
+:1074B000B7C2AD74C9AFC9D5A7CAC1740E05CD0591
+:1074C00000D1C9C5110C75CD1472E17CC61F5FE5F2
+:1074D000CD9474E17DC61F5FC39474110F75C314FE
+:1074E000721E20CD94741E08C39474110975C314C0
+:1074F00072110775C314724B617970726F2049491C
+:10750000241A0D0A0909241A240D18241B3D2408E5
+:10751000200808240B2400000A2400000C2400008A
+:10752000082400001A2400001B4724001B412400EB
+:107530001E2400001B45240017240000182400000E
+:0000000000
diff --git a/cpvlbo.hex b/cpvlbo.hex
new file mode 100644 (file)
index 0000000..1848f55
--- /dev/null
@@ -0,0 +1,90 @@
+:10700000AC0006009972B672C3AC74C3BC74C3CC36
+:1070100074C3D674C3AD74C3B674C3AE74C3E07422
+:10702000C3DE74C30000C30000C31C75C31275C364
+:107030000775C32275C3F871C3D471C3C871C3BCCB
+:1070400071C3C271C3DD71C3E671C3EF71C3AC70AC
+:10705000C30373C30473C30573C30673C33573C318
+:107060006C73C37273C37673C36774C32771C3EF42
+:1070700074C34F71C32572C314724A757B73F67360
+:10708000A1748C740010011CFFFFFFFF00000001C1
+:107090000000000650500805000000000D0D2323DD
+:0770A00031004080000101F6
+:1070AC00CDE0700E07CD050032DF700E0CCD050063
+:1070BC007D32DE70113372CD1472112875CD1472BD
+:1070CC00CD117221767522A3703E4032A570CDD2BF
+:0270DC0072C977
+:1070E0002A01001103001922087111030019220B53
+:1070F0007111030019220E7111030019221171116F
+:107100001E0019221371C9C30000C30000C3000090
+:10711000C30000C300000E14064605C21A710DC25A
+:1071200018713DC21671C9D5113475CD1472D1CD07
+:1071300014721E5BCDB674112875CD1472114A728B
+:10714000CD14723A8D70B7C8118272CD1472C93ADB
+:10715000DE70FE30FA86713A5C00B7CA62713DC3D8
+:1071600067710E19CD05005F0E2ECD05000603AF29
+:107170000E032183002B7E1F770DC2757105C26F30
+:10718000715E2356EBC90E1BCD0500EB2AA77023B9
+:10719000010000D51A1E0817DA9C7103572B7DB425
+:1071A000CAAD717A1DC29771D113C39371D1696051
+:1071B0003AAA70D603C8293DC2B671C9011404C3E6
+:1071C000EF74011405C3EF74010C06CDEF74117256
+:1071D00075C31472010107CDEF74C3CE71010108AC
+:1071E000CDEF74C3CE71010809CDEF74C3CE710128
+:1071F000080BCDEF74C3CE713A8D70B7CA0572011A
+:10720000010DC30872010109CDEF74116E75C3142D
+:1072100072113072E5D5C50E09CD0500C1D1E1C9A5
+:10722000E1232323E97E1223130B78B1C22572C90F
+:107230000D0A24636F6E6669677572656420666FF8
+:10724000722024207769746820245D0D0A0D0A4E8F
+:10725000756D626572206F66207061636B65747313
+:107260003A0D0A4E756D626572206F662072657404
+:10727000726965733A0D0A46696C65206E616D65C9
+:107280003A240D0A0D0A0D0A527061636B3A0D0A19
+:107290000D0A537061636B3A244350585357542E70
+:1072A00041534D20283130292020372D4A616E2D41
+:1072B0003139393120244350585359532E41534DBD
+:1072C0002028343029202032382D4175672D383957
+:1072D000202411F8720E0A1A1332E5F732E7F70D7F
+:1072E000C2D7723E0532D0F732D4F73288703EE40E
+:1072F000328A703ED0328B7018180444010003C1EA
+:1073000005EAC9C9C9C9110D73CD1472C90D0A4264
+:1073100020205472616E736D697420612042524561
+:10732000414B0D0A44202044726F70207468652020
+:107330006C696E6524E65FFE42CA4473FE44CA4E21
+:1073400073C320723E05CD68733EFAC355733E0584
+:10735000CD68733E6ACD68733E1ECD16713E05CD75
+:1073600068733EEACD6873C932E5F7C97BC97BC94A
+:107370007BC9CD4E73C97B32D0F7C9100331313090
+:107380002402020431323030240707053133342E11
+:1073900035240303033135302404040431383030FC
+:1073A000240808053139323030240F0F04323030D0
+:1073B000302409090432343030240A0A03333030CF
+:1073C0002405050433363030240B0B0434383030B8
+:1073D000240C0C023530240000033630302406061D
+:1073E0000437323030240D0D0237352401010439C1
+:1073F000363030240E0E0D0A20202035302020207B
+:10740000202037352020202031313020202020310D
+:1074100033342E35202031353020202020333030B9
+:1074200020202020363030202020313230300D0A0C
+:1074300020313830302020203230303020202032AF
+:107440003430302020203336303020202034383083
+:107450003020202037323030202020393630302084
+:10746000203139323030247D32C77432D374328ABD
+:10747000703C32BE7432CD743269737C32867432A1
+:107480007873328B703AD0F7328870C90D0A525334
+:107490002D32333220706F72742041206F7220427F
+:1074A0002402014124E4D0014224E6D4C9C90E06D5
+:1074B0001EFFCD0500C90E06CD0500C9E521E5F783
+:1074C0007EE604CAC07421E4F773E1C93AE5F7E641
+:1074D00001C83AE4F7C9CDCC74B7C2D674C9AFC9F4
+:1074E000D5CD7073A7CAED740E05CD0500D1C9C501
+:1074F000114275CD1472E17CC61F5FE5CDB674E113
+:107500007DC61F5FC3B674114575C314721E08C3D0
+:10751000B6741E20CDB6741E08C3B674113E75C372
+:107520001472113B75C314724C6F626F204D415839
+:107530002D3830241B2A0D0A0909241B2A240D1B6F
+:1075400052241B3D2408200808240B2400000A2490
+:1075500000000C240000082400001B2A2400240042
+:107560000000240000001E2400001B4524001B59BD
+:0675700024001B5424005E
+:0000000000
diff --git a/cpvmdi.hex b/cpvmdi.hex
new file mode 100644 (file)
index 0000000..c28f906
--- /dev/null
@@ -0,0 +1,68 @@
+:10700000AC00060000721D72C33973C35773C362AC
+:1070100073C36A73C34173C35173C34973C3747336
+:10702000C37273C30000C30000C39273C38873C3E9
+:107030008373C39873C3B871C3B871C3B871C3A95C
+:1070400071C3AE71C3B871C3BB71C3C171C3AC703E
+:10705000C34372C34472C34572C34672C34872C30A
+:107060004D72C35372C35472C33873C33371C3CEEA
+:1070700073C33C71C3DB71C3CA7100007772DC72E9
+:10708000000000000010FF1CFFFFFFFF00000001D8
+:107090000000000650500805000000000D0D2323DD
+:0770A00031004080000101F6
+:1070AC00CDEC700E07CD050032EB700E0CCD05004B
+:1070BC007D32EA7011E971CDCA71119E73CDCA711E
+:1070CC0011F971CDCA7111CF73CDCA71CDC77121B0
+:0E70DC00227422A3703E4032A570CD3972C9D5
+:1070EC002A0100110300192214711103001922172F
+:1070FC007111030019221A7111030019221D71114B
+:10710C001E0019221F71C9C30000C30000C3000078
+:10711C00C30000C300000E14064605C226710DC242
+:10712C0024713DC22271C9D511FA73CDCA71D1C96E
+:10713C003AEA70FE30FA73713A5C00B7CA4F713D8F
+:10714C00C354710E19CD05005F0E2ECD050006033C
+:10715C00AF0E032183002B7E1F770DC2627105C217
+:10716C005C715E2356EBC90E1BCD0500EB2AA77094
+:10717C0023010000D51A1E0817DA897103572B7DDD
+:10718C00B4CA9A717A1DC28471D113C38071D1694A
+:10719C00603AAA70D603C8293DC2A371C91E20C388
+:1071AC0051731E20CD51731E25C35173C3C771116A
+:1071BC000E74C3CA71111874C3CA7111E671E5D586
+:1071CC00C50E09CD0500C1D1E1C9E1232323E97E18
+:1071DC001223130B78B1C2DB71C90D0A24636F6ED5
+:1071EC006669677572656420666F72202420776902
+:1071FC00746820244350585357542E41534D202823
+:10720C003130292020372D4A616E2D31393931200A
+:10721C00244350585359532E41534D202834302970
+:10722C00202032382D4175672D38392024216000FB
+:10723C00228870CD5472C9C9C9C9C924E65FC3D6A6
+:10724C00717BC97BC97BC9C9CD39733E87D34B2AA6
+:10725C008870EB7AD3497BD3483E07D34BAFD349E5
+:10726C00D34DDB4EDB4DDB48DB48C90D03313130F0
+:10727C0024170404313230302460000331353024BB
+:10728C0000030531393230302406000432343030FA
+:10729C00243000033330302480010533383430304F
+:1072AC0024030003343530242001043438303024D6
+:1072BC0018000535363030302402000336303024C7
+:1072CC00C0000237352400060439363030240C0057
+:1072DC000D0A20202037352020202031313020206D
+:1072EC002020313530202020203330302020202029
+:1072FC0034353020202020363030202020313230E0
+:10730C00300D0A20323430302020203438303020F8
+:10731C0020203936303020203139323030202033A3
+:10732C00383430302020353630303024C93A010022
+:10733C00F603D34FC93A0100F601D34FC90E061E0E
+:10734C00FFCD0500C90E06CD0500C9DB4DE620CAF0
+:10735C0057737BD348C9DB4DE601C8DB48C9CD6206
+:10736C0073B7C26A73C9AFC9D5CD5172A7CA81733D
+:10737C000E05CD0500D1C91E08C351731E20CD5179
+:10738C00731E08C35173110974C3CA7111E671C31A
+:10739C00CA714D6F72726F77204465636973696F40
+:1073AC006E2049244350585644552E41534D2020AD
+:1073BC00283629202031322D4F63742D3139393044
+:1073CC002024C947656E65726963202844756D6217
+:1073DC002920435254205465726D696E616C20747F
+:1073EC007970652073656C656374656420240D0A7F
+:1073FC005374617274696E67202E2E2E245E550DA7
+:10740C000A240D0A525061636B3A20240D0A535022
+:06741C0061636B3A2024BD
+:0000000000
diff --git a/cpvmik.hex b/cpvmik.hex
new file mode 100644 (file)
index 0000000..0408658
--- /dev/null
@@ -0,0 +1,78 @@
+:10700000AC0006009872B572C3EF73C30B74C3175C
+:1070100074C32074C3F673C30674C3FD73C32F74A3
+:10702000C32874C30000C30000C36474C35A74C38C
+:107030005574C36A74C3F771C3D371C3C771C3BB3B
+:1070400071C3C171C3DC71C3E571C3EE71C3AC70B0
+:10705000C3FA72C30B73C30C73C30D73C30F73C333
+:107060001473C31E73C31F73C3B673C32671C33DAA
+:1070700074C34E71C32472C31372887440738373D4
+:10708000D673C0730010011CFFFFFFFF000000015A
+:107090000000000650500805000000000D0D2323DD
+:0770A00031004080000101F6
+:1070AC00CDDF700E07CD050032EE730E0CCD050052
+:1070BC007D32DE70113272CD1372117074CD137279
+:1070CC00CD107221B47422A3703E4032A570CDD184
+:0270DC0072C977
+:1070DF002A01001103001922077111030019220A56
+:1070EF007111030019220D71110300192210711172
+:1070FF001E0019221271C9C30000C30000C3000093
+:10710F00C30000C300000E14064605C219710DC25C
+:10711F0017713DC21571C9D5117B74CD1372D1CDC5
+:10712F0013721E5BCD0674117074CD1372114972F8
+:10713F00CD13723A8D70B7C8118172CD1372C93ADF
+:10714F00DE70FE30FA85713A5C00B7CA61713DC3DB
+:10715F0066710E19CD05005F0E2ECD05000603AF2B
+:10716F000E032183002B7E1F770DC2747105C26E33
+:10717F00715E2356EBC90E1BCD0500EB2AA77023BA
+:10718F00010000D51A1E0817DA9B7103572B7DB427
+:10719F00CAAC717A1DC29671D113C39271D1696055
+:1071AF003AAA70D603C8293DC2B571C9011404C3E8
+:1071BF003D74011405C33D74010C06CD3D7411B02F
+:1071CF0074C31372010107CD3D74C3CD7101010862
+:1071DF00CD3D74C3CD71010809CD3D74C3CD71018F
+:1071EF00080BCD3D74C3CD713A8D70B7CA047201CF
+:1071FF00010DC30772010109CD3D7411AC74C313A6
+:10720F0072112F72E5D5C50E09CD0500C1D1E1C9A7
+:10721F00E1232323E97E1223130B78B1C22472C911
+:10722F000D0A24636F6E6669677572656420666FF9
+:10723F00722024207769746820245D0D0A0D0A4E90
+:10724F00756D626572206F66207061636B65747314
+:10725F003A0D0A4E756D626572206F662072657405
+:10726F00726965733A0D0A46696C65206E616D65CA
+:10727F003A240D0A0D0A0D0A527061636B3A0D0A1A
+:10728F000D0A537061636B3A244350585357542E71
+:10729F0041534D20283130292020372D4A616E2D42
+:1072AF003139393120244350585359532E41534DBE
+:1072BF002028343029202032382D4175672D383958
+:1072CF00202411F2720E072112FFCDE1723EFF3220
+:1072DF00F2F1F31A77130DC2E272FBC9034105AA4B
+:1072EF00044F0003CF05EA044400C911EB720E07E7
+:1072FF002112FFCDE1723E7F32F2F1C9C9C9C92413
+:10730F00E65FC31F727BFE0FC0AFC97BC97BC9C9C4
+:10731F00F32130FF72732131FF727306003E02BBFF
+:10732F00F2347306083E042112FF773E44B077FB18
+:10733F00C90903313130246903043132303024500C
+:10734F0000033135302480020432343030242800D9
+:10735F000333303024400104343830302414000318
+:10736F0036303024A000023735240005043936307A
+:10737F0030240A000D0A20203735202031313020EB
+:10738F00203135302020333030202036303020204F
+:10739F003132303020203234303020203438303009
+:1073AF00202039363030247E32ED73237E32EC7359
+:1073BF00C90D0A434F4D4D554E49434154494F4E08
+:1073CF005320706F727424010E434F4D4D554E492B
+:1073DF00434154494F4E5324E973B2040004B28120
+:1073EF003AED73320300C93AEE73320300C9CD068A
+:1073FF0071B7C8CD0971C94BCD0C71C9E5C53AEC50
+:10740F00734FCD0500C1E1C9CD0671B7C8CD097164
+:10741F00C9CD1774B7C22074C9CD1271CD1271C9FD
+:10742F00D5CD1C73A7CA3B744BCD0F71D1C9C511F4
+:10743F008574CD1372E17CC61F5FE5CD0674E17DC7
+:10744F00C61F5FC306741E08C306741E20CD0674C4
+:10745F001E08C30674118274C31372118074C31390
+:10746F00724D696B726F4D696B6B6F241A0D0A0940
+:10747F00241A240D1C241B3D240B2400000A240075
+:10748F00000C240000082400001A2400002400002F
+:10749F0000240000001E240000240000001C240013
+:0574AF00001C24000098
+:0000000000
diff --git a/cpvmm.hex b/cpvmm.hex
new file mode 100644 (file)
index 0000000..e5e4ac9
--- /dev/null
+++ b/cpvmm.hex
@@ -0,0 +1,72 @@
+:10700000AC00060000721D72C37A73C38A73C39505
+:1070100073C39D73C37B73C38473C37C73C3A77330
+:10702000C3A573C30000C30000C3C573C3BB73C350
+:10703000B673C3CB73C3B871C3B871C3B871C3A9F6
+:1070400071C3AE71C3B871C3BB71C3C171C3AC703E
+:10705000C33A72C33B72C33C72C33D72C35A72C31C
+:107060008572C38B72C38C72C37973C33371C30CC3
+:1070700074C33C71C3DB71C3CA71000090720B739F
+:10708000000000000010FF1CFFFFFFFF00000001D8
+:107090000000000650500805000000000D0D2323DD
+:0770A00031004080000101F6
+:1070AC00CDEC700E07CD050032EB700E0CCD05004B
+:1070BC007D32EA7011E971CDCA7111D173CDCA71EB
+:1070CC0011F971CDCA71110D74CDCA71CDC7712171
+:0E70DC00607422A3703E4032A570CD3972C997
+:1070EC002A0100110300192214711103001922172F
+:1070FC007111030019221A7111030019221D71114B
+:10710C001E0019221F71C9C30000C30000C3000078
+:10711C00C30000C300000E28064605C226710DC22E
+:10712C0024713DC22271C9D5113874CDCA71D1C92F
+:10713C003AEA70FE30FA73713A5C00B7CA4F713D8F
+:10714C00C354710E19CD05005F0E2ECD050006033C
+:10715C00AF0E032183002B7E1F770DC2627105C217
+:10716C005C715E2356EBC90E1BCD0500EB2AA77094
+:10717C0023010000D51A1E0817DA897103572B7DDD
+:10718C00B4CA9A717A1DC28471D113C38071D1694A
+:10719C00603AAA70D603C8293DC2A371C91E20C388
+:1071AC0084731E20CD84731E25C38473C3C77111D1
+:1071BC004C74C3CA71115674C3CA7111E671E5D50A
+:1071CC00C50E09CD0500C1D1E1C9E1232323E97E18
+:1071DC001223130B78B1C2DB71C90D0A24636F6ED5
+:1071EC006669677572656420666F72202420776902
+:1071FC00746820244350585357542E41534D202823
+:10720C003130292020372D4A616E2D31393931200A
+:10721C00244350585359532E41534D202834302970
+:10722C00202032382D4175672D38392024C9C9C921
+:10723C00C9114472CDCA71C90D0A42202054726121
+:10724C006E736D6974206120425245414B24E65F98
+:10725C00FE42CA6472C3D6713E01D38BDB8BE6014E
+:10726C00CA64723E05D38B3EFAD38B3E1ECD22717F
+:10727C003E05D38B3EEAD38BC97BC97BC97BC9C97D
+:10728C007BD393C9100331313024E2E20431323024
+:10729C003024E7E7053133342E3524E3E30331356D
+:1072AC003024E4E4043138303024E8E80531393254
+:1072BC00303024EFEF043230303024E9E90432343A
+:1072CC00303024EAEA0333303024E5E50433363039
+:1072DC003024EBEB043438303024ECEC0235302421
+:1072EC00E0E00336303024E6E6043732303024ED6B
+:1072FC00ED02373524E1E1043936303024EEEE0D61
+:10730C000A20202035302020373520202020313114
+:10731C0030202020203133342E35202031353020C0
+:10732C0020202033303020202020363030202020E8
+:10733C00313230300D0A20313830302020203230BC
+:10734C003030202020323430302020203336303082
+:10735C00202020343830302020203732303020208C
+:10736C0020393630302020313932303024C9C9C967
+:10737C000E061EFFCD0500C90E06CD0500C9DB8B20
+:10738C00E604CA8A737BD389C9DB8BE601C8DB8927
+:10739C00C9CD9573B7C29D73C9AFC9D5CD8972A735
+:1073AC00CAB4730E05CD0500D1C91E08C384731E63
+:1073BC0020CD84731E08C38473114774C3CA711122
+:1073CC00E671C3CA71504D43204D6963726F6D6194
+:1073DC007465207573696E6720706F727420492F05
+:1073EC004F244350585644552E41534D2020283697
+:1073FC0029202031322D4F63742D3139393020241E
+:10740C00C947656E65726963202844756D622920D1
+:10741C00435254205465726D696E616C207479709E
+:10742C00652073656C656374656420240D0A537460
+:10743C00617274696E67202E2E2E245E550D0A24FF
+:10744C000D0A525061636B3A20240D0A535061634C
+:04745C006B3A202443
+:0000000000
diff --git a/cpvmrl.hex b/cpvmrl.hex
new file mode 100644 (file)
index 0000000..13cdef5
--- /dev/null
@@ -0,0 +1,58 @@
+:10700000AC00060000721D72C36672C37672C3863E
+:1070100072C3A572C36772C37172C36872C3B1725F
+:10702000C3AD72C30000C30000C3CA72C3C072C341
+:10703000BB72C3D072C3B871C3B871C3B871C3A9EE
+:1070400071C3AE71C3B871C3BB71C3C171C3AC703E
+:10705000C33D72C33E72C34072C34172C35872C310
+:107060005E72C36472C36572C36672C33371C33424
+:1070700073C33C71C3DB71C3CA7100000000000020
+:10708000000000000010FF1CFFFFFFFF00000001D8
+:107090000000000650500805000000000D0D2323DD
+:0770A00031004080000101F6
+:1070AC00CDEC700E07CD050032EB700E0CCD05004B
+:1070BC007D32EA7011E971CDCA7111D672CDCA71E7
+:1070CC0011F971CDCA71113573CDCA71CDC771214A
+:0E70DC00887322A3703E4032A570CD3972C970
+:1070EC002A0100110300192214711103001922172F
+:1070FC007111030019221A7111030019221D71114B
+:10710C001E0019221F71C9C30000C30000C3000078
+:10711C00C30000C300000E32064605C226710DC224
+:10712C0024713DC22271C9D5116073CDCA71D1C908
+:10713C003AEA70FE30FA73713A5C00B7CA4F713D8F
+:10714C00C354710E19CD05005F0E2ECD050006033C
+:10715C00AF0E032183002B7E1F770DC2627105C217
+:10716C005C715E2356EBC90E1BCD0500EB2AA77094
+:10717C0023010000D51A1E0817DA897103572B7DDD
+:10718C00B4CA9A717A1DC28471D113C38071D1694A
+:10719C00603AAA70D603C8293DC2A371C91E20C388
+:1071AC0071721E20CD71721E25C37172C3C771110D
+:1071BC007473C3CA71117E73C3CA7111E671E5D5BC
+:1071CC00C50E09CD0500C1D1E1C9E1232323E97E18
+:1071DC001223130B78B1C2DB71C90D0A24636F6ED5
+:1071EC006669677572656420666F72202420776902
+:1071FC00746820244350585357542E41534D202823
+:10720C003130292020372D4A616E2D31393931200A
+:10721C00244350584D524C2E41534D202832292096
+:0E722C002032322D4A756E2D3837202024C9AD
+:10723D00C9C924C9C90D0A4220205472616E736DEB
+:10724D006974206120425245414B24E65FC3D671DB
+:10725D00C97BC97BC97BC9C9C9C9C9CD5DF5B7C8CA
+:10726D00CD6EF5C94BCD7FF5C9F5E5D5C54B3E01C5
+:10727D0057CDA2F6C1D1E1F1C93A32FAB7C83E01F4
+:10728D0057CD51F6F5F33E003232FA32D3F23AD4FD
+:10729D00F232D5F2FB00F1C9CD8672B7C2A572C923
+:1072AD00CD1F71C9D5CD6272A7CAB972D1C91E08D9
+:1072BD00C371721E20CD71721E08C37172116F736E
+:1072CD00C3CA7111E671C3CA714254204D65726C07
+:1072DD00696E204D323231352C20706F727420540E
+:1072ED005459313A2C2073657474696E6773207527
+:1072FD006E6368616E6765642E2454657374206DCA
+:10730D006573736167650D0A244350585644552EB5
+:10731D0041534D2020283629202031322D4F6374C2
+:10732D002D313939302024C947656E657269632066
+:10733D002844756D622920435254205465726D693D
+:10734D006E616C20747970652073656C656374650E
+:10735D006420240D0A5374617274696E67202E2E99
+:10736D002E245E550D0A240D0A525061636B3A208E
+:0B737D00240D0A535061636B3A20247A
+:0000000000
diff --git a/cpvns.hex b/cpvns.hex
new file mode 100644 (file)
index 0000000..446d9f1
--- /dev/null
+++ b/cpvns.hex
@@ -0,0 +1,60 @@
+:10700000AC00060000721D72C3CE72C3DD72C3E80D
+:1070100072C3F072C3CE72C3D772C3CF72C3FA7297
+:10702000C3F872C30000C30000C31873C30E73C358
+:107030000973C31E73C3B871C3B871C3B871C3A950
+:1070400071C3AE71C3B871C3BB71C3C171C3AC703E
+:10705000C34572C34672C34772C34872C34A72C300
+:107060004F72C35572C35672C3CD72C33371C354CA
+:1070700073C33C71C3DB71C3CA7100005A72997249
+:10708000000000000010FF1CFFFFFFFF00000001D8
+:107090000000000650500805000000000D0D2323DD
+:0770A00031004080000101F6
+:1070AC00CDEC700E07CD050032EB700E0CCD05004B
+:1070BC007D32EA7011E971CDCA71112473CDCA7198
+:1070CC0011F971CDCA71115573CDCA71CDC771212A
+:0E70DC00A87322A3703E4032A570CD3A72C94F
+:1070EC002A0100110300192214711103001922172F
+:1070FC007111030019221A7111030019221D71114B
+:10710C001E0019221F71C9C30000C30000C3000078
+:10711C00C30000C300000E28064605C226710DC22E
+:10712C0024713DC22271C9D5118073CDCA71D1C9E8
+:10713C003AEA70FE30FA73713A5C00B7CA4F713D8F
+:10714C00C354710E19CD05005F0E2ECD050006033C
+:10715C00AF0E032183002B7E1F770DC2627105C217
+:10716C005C715E2356EBC90E1BCD0500EB2AA77094
+:10717C0023010000D51A1E0817DA897103572B7DDD
+:10718C00B4CA9A717A1DC28471D113C38071D1694A
+:10719C00603AAA70D603C8293DC2A371C91E20C388
+:1071AC00D7721E20CDD7721E25C3D772C3C77111DB
+:1071BC009473C3CA71119E73C3CA7111E671E5D57C
+:1071CC00C50E09CD0500C1D1E1C9E1232323E97E18
+:1071DC001223130B78B1C2DB71C90D0A24636F6ED5
+:1071EC006669677572656420666F72202420776902
+:1071FC00746820244350585357542E41534D202823
+:10720C003130292020372D4A616E2D31393931200A
+:10721C00244350584E4F522E41534D202028342990
+:10722C00202031362D4A616E2D31393931243E04FE
+:10723C00D31C328870328970C9C9C9C9C924E65FA8
+:10724C00C3D6717BC97BC97BC9C97BD31CC9080355
+:10725C003131302407070431323030240404053135
+:10726C00393230302400000432343030240303032C
+:10727C00333030240606043438303024020203360E
+:10728C00303024050504393630302401010D0A2034
+:10729C002020313130202020333030202020363057
+:1072AC003020203132303030202032343030202029
+:1072BC0034383030202039363030203139323030CB
+:1072CC0024C9C90E061EFFCD0500C90E06CD05004A
+:1072DC00C9DB1FE601CADD727BD31EC9DB1FE602C8
+:1072EC00C8DB1EC9CDE872B7C2F072C9AFC9D5CD23
+:1072FC005372A7CA07730E05CD0500D1C91E08C36A
+:10730C00D7721E20CDD7721E08C3D772118F73C3CC
+:10731C00CA7111E671C3CA714E6F7274687374616D
+:10732C007220486F72697A6F6E24435058564455D8
+:10733C002E41534D2020283629202031322D4F63E9
+:10734C00742D313939302024C947656E65726963F3
+:10735C00202844756D622920435254205465726D67
+:10736C00696E616C20747970652073656C656374EB
+:10737C00656420240D0A5374617274696E67202E43
+:10738C002E2E245E550D0A240D0A525061636B3A61
+:0C739C0020240D0A535061636B3A20243A
+:0000000000
diff --git a/cpvosb.hex b/cpvosb.hex
new file mode 100644 (file)
index 0000000..d350bd4
--- /dev/null
@@ -0,0 +1,69 @@
+:10700000AC0006009972B672C37273C38273C38EEA
+:1070100073C39873C37373C37C73C37473C3A27352
+:10702000C3A073C30000C30000C3D973C3CF73C32D
+:10703000C973C3DF73C3F871C3D471C3C871C3BC50
+:1070400071C3C271C3DD71C3E671C3EF71C3AC70AC
+:10705000C31673C31773C32773C33773C33973C39B
+:107060003E73C34473C34573C37173C32771C3B104
+:1070700073C34F71C32572C3147200745273627369
+:10708000000000000010011CFFFFFFFF00000001D6
+:107090000000000650500805000000000D0D2323DD
+:0770A00031004080000101F6
+:1070AC00CDE0700E07CD050032DF700E0CCD050063
+:1070BC007D32DE70113372CD147211E573CD147202
+:1070CC00CD1172212C7422A3703E4032A570CDD20A
+:0270DC0072C977
+:1070E0002A01001103001922087111030019220B53
+:1070F0007111030019220E7111030019221171116F
+:107100001E0019221371C9C30000C30000C3000090
+:10711000C30000C300000E19064605C21A710DC255
+:1071200018713DC21671C9D511EF73CD1472D1CD4E
+:1071300014721E5BCD7C7311E573CD1472114A720B
+:10714000CD14723A8D70B7C8118272CD1472C93ADB
+:10715000DE70FE30FA86713A5C00B7CA62713DC3D8
+:1071600067710E19CD05005F0E2ECD05000603AF29
+:107170000E032183002B7E1F770DC2757105C26F30
+:10718000715E2356EBC90E1BCD0500EB2AA77023B9
+:10719000010000D51A1E0817DA9C7103572B7DB425
+:1071A000CAAD717A1DC29771D113C39371D1696051
+:1071B0003AAA70D603C8293DC2B671C9011404C3E6
+:1071C000B173011405C3B173010C06CDB17311285D
+:1071D00074C31472010107CDB173C3CE71010108EC
+:1071E000CDB173C3CE71010809CDB173C3CE7101A6
+:1071F000080BCDB173C3CE713A8D70B7CA05720159
+:10720000010DC30872010109CDB173112474C314B7
+:1072100072113072E5D5C50E09CD0500C1D1E1C9A5
+:10722000E1232323E97E1223130B78B1C22572C90F
+:107230000D0A24636F6E6669677572656420666FF8
+:10724000722024207769746820245D0D0A0D0A4E8F
+:10725000756D626572206F66207061636B65747313
+:107260003A0D0A4E756D626572206F662072657404
+:10727000726965733A0D0A46696C65206E616D65C9
+:107280003A240D0A0D0A0D0A527061636B3A0D0A19
+:107290000D0A537061636B3A244350585357542E70
+:1072A00041534D20283130292020372D4A616E2D41
+:1072B0003139393120244350585359532E41534DBD
+:1072C0002028343029202032382D4175672D383957
+:1072D00020243AC1EFE6013E56CADE723E5532889E
+:1072E00070328970575FCD4573F3D3003A002AD3CB
+:1072F00001FBC9F3D30032002AC30C73F3D3003A65
+:10730000012AD301FBC9F3D30032012AD3013E0184
+:107310003208EFFBC9C9C92A01002E0011850019E6
+:107320005E2356EB367FC92A01002E001185001915
+:107330005E2356EB3608C9C924E65FC320727BC9B9
+:107340007BC97BC9C93E57CDF3720CC24A737BC35C
+:10735000F372020431323030245555033330302477
+:1073600056560D0A20203330300D0A20313230308D
+:1073700024C9C9C90E061EFFCD0500C90E06CD05DC
+:1073800000C9CDE972E602CA82737BC30673CDE9F8
+:1073900072E601C8CDFC72C9CD8E73B7C29873C9AD
+:1073A000AFC9D5CD4273A7CAAF730E05CD0500D1C5
+:1073B000C9C511FD73CD1472E17CC61F5FE5CD7C9C
+:1073C00073E17DC61F5FC37C7311FA73C314721E11
+:1073D00020CD7C731E08C37C7311F673C314721125
+:1073E000F473C314724F73626F726E652031241A86
+:1073F0000D0A09241A240D1B54240808241B3D24BB
+:107400000B2400000A2400000C24000008240000C3
+:107410001A24000024000000240000001E240000A4
+:0C7420000B2400001B5424001B5424000B
+:0000000000
diff --git a/cpvosi.hex b/cpvosi.hex
new file mode 100644 (file)
index 0000000..419948d
--- /dev/null
@@ -0,0 +1,48 @@
+:10700000AC000600F4711172C34072C35072C360C9
+:1070100072C36A72C34172C34A72C34272C374724A
+:10702000C37272C30000C30000C39372C38972C3EA
+:107030008472C39972C3AC71C3AC71C3AC71C39D8C
+:1070400071C3A271C3AC71C3AF71C3B571C3AC706E
+:10705000C32E72C32F72C33072C33172C33372C373
+:107060003872C33E72C33F72C33F72C32771C3837A
+:1070700072C33071C3CF71C3BE7100000000000045
+:10708000000000000010011DFFFFFFFF00000001D5
+:107090000000000650500805000000000D0D2323DD
+:0770A00031004080000101F6
+:1070AC00CDE0700E07CD050032DF700E0CCD050063
+:1070BC007D32DE7011DD71CDBE71119F72CDBE714E
+:1070CC00CDBB7121D77222A3703E4032A570CD2D5D
+:0270DC0072C977
+:1070E0002A01001103001922087111030019220B53
+:1070F0007111030019220E7111030019221171116F
+:107100001E0019221371C9C30000C30000C3000090
+:10711000C30000C300000E14064605C21A710DC25A
+:1071200018713DC21671C9D511AF72CDBE71D1C9EA
+:107130003ADE70FE30FA67713A5C00B7CA43713DBF
+:10714000C348710E19CD05005F0E2ECD0500060354
+:10715000AF0E032183002B7E1F770DC2567105C22F
+:1071600050715E2356EBC90E1BCD0500EB2AA770AC
+:1071700023010000D51A1E0817DA7D7103572B7DF5
+:10718000B4CA8E717A1DC27871D113C37471D1697A
+:10719000603AAA70D603C8293DC29771C91E20C3A0
+:1071A0004A721E20CD4A721E25C34A72C3BB71119A
+:1071B000C372C3BE7111CD72C3BE7111DA71E5D550
+:1071C000C50E09CD0500C1D1E1C9E1232323E97E24
+:1071D0001223130B78B1C2CF71C90D0A24636F6EED
+:1071E0006669677572656420666F7220242077690E
+:1071F000746820244350585357542E41534D20282F
+:107200003130292020372D4A616E2D313939312016
+:10721000244350585359532E41534D20283430297C
+:10722000202032382D4175672D38392024C9C9C92D
+:10723000C9C924E65FC3CA717BC97BC97BC9C9C9F7
+:10724000C9C90E061EFFCD0500C90E06CD0500C931
+:10725000E52100CF7EE602CA54722101CF73E1C955
+:107260003A00CFE601C83A01CFC9CD6072B7C26A11
+:1072700072C9AFC9D5CD3C72A7CA81720E05CD05C2
+:1072800000D1C9C91E08C34A721E20CD4A721E0809
+:10729000C34A7211BE72C3BE7111DA71C3BE714F9F
+:1072A00068696F20536369656E7469666963240D4C
+:1072B0000A5374617274696E67202E2E2E245E55F7
+:1072C0000D0A240D0A525061636B3A20240D0A53B3
+:0772D0005061636B3A2024BA
+:0000000000
diff --git a/cpvpci.hex b/cpvpci.hex
new file mode 100644 (file)
index 0000000..fde2ab1
--- /dev/null
@@ -0,0 +1,73 @@
+:10700000AC00060000721D72C38D73C39D73C3A8CC
+:1070100073C3B073C38E73C39773C38F73C3BC73CF
+:10702000C3B873C30000C30000C3DA73C3D073C313
+:10703000CB73C3E073C3B871C3B871C3B871C3A9CC
+:1070400071C3AE71C3B871C3BB71C3C171C3AC703E
+:10705000C34A72C34B72C34C72C34D72C36A72C3CC
+:107060008972C38F72C39072C38C73C33371C3218F
+:1070700074C33C71C3DB71C3CA710000A0721B737F
+:10708000000000000010FF1CFFFFFFFF00000001D8
+:107090000000000650500805000000000D0D2323DD
+:0770A00031004080000101F6
+:1070AC00CDEC700E07CD050032EB700E0CCD05004B
+:1070BC007D32EA7011E971CDCA7111E673CDCA71D6
+:1070CC0011F971CDCA71112274CDCA71CDC771215C
+:0E70DC00757422A3703E4032A570CD3B72C980
+:1070EC002A0100110300192214711103001922172F
+:1070FC007111030019221A7111030019221D71114B
+:10710C001E0019221F71C9C30000C30000C3000078
+:10711C00C30000C300000E14064605C226710DC242
+:10712C0024713DC22271C9D5114D74CDCA71D1C91A
+:10713C003AEA70FE30FA73713A5C00B7CA4F713D8F
+:10714C00C354710E19CD05005F0E2ECD050006033C
+:10715C00AF0E032183002B7E1F770DC2627105C217
+:10716C005C715E2356EBC90E1BCD0500EB2AA77094
+:10717C0023010000D51A1E0817DA897103572B7DDD
+:10718C00B4CA9A717A1DC28471D113C38071D1694A
+:10719C00603AAA70D603C8293DC2A371C91E20C388
+:1071AC0097731E20CD97731E25C39773C3C7711198
+:1071BC006174C3CA71116B74C3CA7111E671E5D5E0
+:1071CC00C50E09CD0500C1D1E1C9E1232323E97E18
+:1071DC001223130B78B1C2DB71C90D0A24636F6ED5
+:1071EC006669677572656420666F72202420776902
+:1071FC00746820244350585357542E41534D202823
+:10720C003130292020372D4A616E2D31393931200A
+:10721C0024435058544F522E41534D202835292089
+:10722C002031302D4A616E2D31393931202024DB4B
+:10723C00073E4ED3063E37D3063E27D307C9C9C9EE
+:10724C00C9115472CDCA71C90D0A42202054726101
+:10725C006E736D6974206120425245414B24E65F88
+:10726C00FE42CA7472C3D671DB05E604CA74723E60
+:10727C002FD3073E64CD22713E27D307C97BC97B30
+:10728C00C97BC9C9DB073E4ED3063E3083D3063ECD
+:10729C0027D307C9100331313024020204313230B4
+:1072AC0030240707053133342E35240303033135DD
+:1072BC0030240404043138303024080805313932C4
+:1072CC003030240F0F0432303030240909043234AA
+:1072DC003030240A0A0333303024050504333630A9
+:1072EC0030240B0B0434383030240C0C0235302491
+:1072FC000000033630302406060437323030240DBB
+:10730C000D0237352401010439363030240E0E0DB0
+:10731C000A20202035302020202020373520202026
+:10732C0020313130202020203133342E35202031B3
+:10733C0035302020202033303020202020363030B3
+:10734C00202020313230300D0A20313830302020CE
+:10735C002032303030202020323430302020203386
+:10736C003630302020203438303020202037323056
+:10737C003020202039363030202031393230302442
+:10738C00C9C9C90E061EFFCD0500C90E06CD0500E4
+:10739C00C9DB05E601CA9D737BD304C9DB05E60294
+:1073AC00C8DB04C9CDA873B7C2B073C9CD1F71C9EE
+:1073BC00D5CD8D72A7CAC9730E05CD0500D1C91ED6
+:1073CC0008C397731E20CD97731E08C39773115C67
+:1073DC0074C3CA7111E671C3CA714974686163617F
+:1073EC0020496E74657273797374656D73205331B3
+:1073FC003030241B2124004350585644552E415301
+:10740C004D2020283629202031322D4F63742D3108
+:10741C003939302024C947656E6572696320284468
+:10742C00756D622920435254205465726D696E61EA
+:10743C006C20747970652073656C65637465642069
+:10744C00240D0A5374617274696E67202E2E2E24DB
+:10745C005E550D0A240D0A525061636B3A20240DBF
+:09746C000A535061636B3A2024BD
+:0000000000
diff --git a/cpvpcw.hex b/cpvpcw.hex
new file mode 100644 (file)
index 0000000..cb7cf24
--- /dev/null
@@ -0,0 +1,137 @@
+:10700000AC0006009972B672C32177C35077C35E95
+:1070100077C38077C32177C32A77C32277C3BD772D
+:10702000C36574C30000C30000C3F577C3EB77C327
+:10703000DC77C3FB77C3F871C3D471C3C871C3BC19
+:1070400071C3C271C3DD71C3E671C3EF71C3AC70AC
+:10705000C36D74C37B74C3C474C3C574C30D75C3DB
+:107060005175C35375C35475C32077C32771C3C407
+:1070700077C34F71C32572C314724078917523761C
+:10708000000000000010001CFFFFFFFF00000001D7
+:107090000000000650500805000000000D0D2323DD
+:0770A00031004080000101F6
+:1070AC00CDE0700E07CD050032DF700E0CCD050063
+:1070BC007D32DE70113372CD1472110178CD1472E1
+:1070CC00CD1172216C7822A3703E4032A570CDD2C6
+:0270DC0072C977
+:1070E0002A01001103001922087111030019220B53
+:1070F0007111030019220E7111030019221171116F
+:107100001E0019221371C9C30000C30000C3000090
+:10711000C30000C300000E21064605C21A710DC24D
+:1071200018713DC21671C9D5111D78CD1472D1CD1B
+:1071300014721E5BCD2A77110178CD1472114A7238
+:10714000CD14723A8D70B7C8118272CD1472C93ADB
+:10715000DE70FE30FA86713A5C00B7CA62713DC3D8
+:1071600067710E19CD05005F0E2ECD05000603AF29
+:107170000E032183002B7E1F770DC2757105C26F30
+:10718000715E2356EBC90E1BCD0500EB2AA77023B9
+:10719000010000D51A1E0817DA9C7103572B7DB425
+:1071A000CAAD717A1DC29771D113C39371D1696051
+:1071B0003AAA70D603C8293DC2B671C9011404C3E6
+:1071C000C477011405C3C477010C06CDC4771168D8
+:1071D00078C31472010107CDC477C3CE71010108D1
+:1071E000CDC477C3CE71010809CDC477C3CE710178
+:1071F000080BCDC477C3CE713A8D70B7CA05720142
+:10720000010DC30872010109CDC477116478C3145C
+:1072100072113072E5D5C50E09CD0500C1D1E1C9A5
+:10722000E1232323E97E1223130B78B1C22572C90F
+:107230000D0A24636F6E6669677572656420666FF8
+:10724000722024207769746820245D0D0A0D0A4E8F
+:10725000756D626572206F66207061636B65747313
+:107260003A0D0A4E756D626572206F662072657404
+:10727000726965733A0D0A46696C65206E616D65C9
+:107280003A240D0A0D0A0D0A527061636B3A0D0A19
+:107290000D0A537061636B3A244350585357542E70
+:1072A00041534D20283130292020372D4A616E2D41
+:1072B0003139393120244350585043572E41534DD2
+:1072C00020283929202032322D4A616E2D3139395A
+:1072D00031240E0CCD05007DFE31CAE87211F17328
+:1072E000CD14720E00CD05002A010011570019229D
+:1072F00069742A0100110300192254741922577469
+:1073000019225A7419225D7419192260742A010015
+:10731000112A00192266742A010011330019226310
+:1073200074CD6874E300FE00C2367311AE73CD14E1
+:10733000720E00CD0500CD6874E600AFB1C24B738C
+:10734000112274CD14720E00CD0500CD6874BC00FE
+:10735000E578B9CA6473FE08C2697379FE02C2692E
+:1073600073010000C5E1228870E17DD6050F0F0F83
+:10737000326C74CD6874BC00326B74CD6874E300F9
+:1073800078B7CAA273FE01C2907379FE04FAA273A1
+:10739000CD6874BC00EEFF3CF602EEFF3CCD687495
+:1073A000B600216C8822A3703E4032A570C9457298
+:1073B000726F72202D20202054686973204B6572F3
+:1073C0006D69742077696C6C206F6E6C79207275B2
+:1073D0006E206F6E2074686520416D7374726164F5
+:1073E0002050435720383235362F383531320D0A88
+:1073F000244572726F72202D20496E636F72726520
+:1074000063742043502F4D2076657273696F6E2C24
+:10741000206E656564732043502F4D20332E780D08
+:107420000A244572726F72202D2020204E6F205347
+:10743000494F206F7074696F6E206669747465645B
+:1074400020746F2074686973206D616368696E656C
+:107450000D0A24C30000C30000C30000C30000C322
+:0B7460000000C30000C30000C30000D8
+:10746D00CD6874BC003A6B74CD6874B600C91182D6
+:10747D0074CD1472C92855736520626F78656420C8
+:10748D006D696E7573206B6579206E6578742074E7
+:10749D006F2073706163652062617220746F206765
+:1074AD00656E6572617465206120436F6E74726FD5
+:1074BD006C2D5C290D0A24C911CC74CD1472C90D23
+:1074CD000A4220205472616E736D697420612042EE
+:1074DD005245414B0D0A48202048616E677570205A
+:1074ED007573696E67204454520D0A5720205769F1
+:1074FD0070652073637265656E20636C65617224BF
+:10750D00E65FFE42CA2875FE48CA2175FE57CAFBC2
+:10751D0077C32072160A1EFFC33775169A1E1E3EBC
+:10752D0001D3E1DBE1E601CA2C753E05D3E13A6CEE
+:10753D0074B2D3E17BCD16713E05D3E13A6C74F68E
+:10754D008AD3E1C97BC9C9D5E17CB7C26175210276
+:10755D0008C38B75FE11C26C75210802C38B75FEB5
+:10756D0010C28B753E3601E700ED7901E4007CED2C
+:10757D007978ED7901E4007CED7978ED79C9CD6804
+:10758D0074B900C912033131302403030431323090
+:10759D003024080807313230302F373524000005EC
+:1075AD003133342E352404040331353024050504DC
+:1075BD0031383030240909053139323030240F0F7C
+:1075CD000432343030240A0A0333303024060605E1
+:1075DD0033313235302410100433363030240B0B58
+:1075ED000434383030240C0C0235302401010336BC
+:1075FD0030302407070437323030240D0D02373573
+:10760D002402020737352F3132303024111104395D
+:10761D00363030240E0E0D0A0A4E6F726D616C20DD
+:10762D0072617465733A2035302020202037352063
+:10763D002020203131302020203133342E3520319F
+:10764D0035302020203330302020203630300D0AC8
+:10765D0020202020202020202020202020203132FA
+:10766D00303020203138303020203234303020205E
+:10767D00333630302020343830302020373230301F
+:10768D00202039363030202031393230300D0A0A81
+:10769D004869676820737065656420203A2033312E
+:1076AD0032353020286F6E6C792062657477656590
+:1076BD006E20416D737472616473290D0A0A5370E3
+:1076CD006C6974207261746573203A2031323030E8
+:1076DD002F3735202852783D313230302C205478D8
+:1076ED003D20203735290D0A202020202020202064
+:1076FD0020202020202037352F31323030202852C5
+:10770D00783D202037352C2054783D3132303029CA
+:10771D000D0A24C9C9CD5374B7C8C356747BFE096D
+:10772D00CA34774BC35974CD6874BF007DE607EE3C
+:10773D00FFC609B7C83DF50E20CD5974CD9877F128
+:10774D00C34077CD8E77DBE1E604CA50777BD3E07B
+:10775D00C9CD98772A8C777CB5C82B228C772A884F
+:10776D00774E119587197CE60F67116C7819228871
+:10777D007779C9CD5E77B7C28077C96C786C7800A0
+:10778D0000D5C5E5CD9877E1C1D1C9CD6274B7C833
+:10779D00CD5F742A8A7777119587197CE60F67116B
+:1077AD006C7819228A772A8C7723228C77C3987765
+:1077BD00D54BCD5C74D1C9C5113D78CD1472E17C2A
+:1077CD00C61F5FE5CD2A77E17DC61F5FC32A7711FE
+:1077DD00E277CD1472082008241E08C32A771E20D4
+:1077ED00CD2A771E08C32A77113978C31472113444
+:1077FD0078C31472416D73747261642050435720C5
+:10780D00776974682053494F206F7074696F6E24C7
+:10781D001B481B4A0D0A202020202020202020203C
+:10782D00202020202020241B481B4A240D1B4B24E4
+:10783D001B59241B4124001B4224001B4324001B05
+:10784D004424001B45240024000000240000001BDC
+:0F785D004824001B4924001B4A24001B4B240015
+:0000000000
diff --git a/cpvpro.hex b/cpvpro.hex
new file mode 100644 (file)
index 0000000..45920c3
--- /dev/null
@@ -0,0 +1,80 @@
+:10700000AC00060000721D72C3D373C3E373C3FCEC
+:1070100073C31074C3D473C3DD73C3D573C31A743D
+:10702000C31874C30000C30000C34E74C34474C3C8
+:107030003F74C35474C3B871C3B871C3B871C3A9E2
+:1070400071C3AE71C3B871C3BB71C3C171C3AC703E
+:10705000C33B72C33C72C33D72C33E72C36D72C305
+:10706000DF72C3E572C3E972C3D273C33371C389DC
+:1070700074C33C71C3DB71C3CA710000FA727573CB
+:10708000000000000010FF1CFFFFFFFF00000001D8
+:107090000000000650500805000000000D0D2323DD
+:0770A00031004080000101F6
+:1070AC00CDEC700E07CD050032EB700E0CCD05004B
+:1070BC007D32EA7011E971CDCA71115A74CDCA7161
+:1070CC0011F971CDCA71118A74CDCA71CDC77121F4
+:0E70DC00DD7422A3703E4032A570CD3A72C919
+:1070EC002A0100110300192214711103001922172F
+:1070FC007111030019221A7111030019221D71114B
+:10710C001E0019221F71C9C30000C30000C3000078
+:10711C00C30000C300000E14064605C226710DC242
+:10712C0024713DC22271C9D511B574CDCA71D1C9B2
+:10713C003AEA70FE30FA73713A5C00B7CA4F713D8F
+:10714C00C354710E19CD05005F0E2ECD050006033C
+:10715C00AF0E032183002B7E1F770DC2627105C217
+:10716C005C715E2356EBC90E1BCD0500EB2AA77094
+:10717C0023010000D51A1E0817DA897103572B7DDD
+:10718C00B4CA9A717A1DC28471D113C38071D1694A
+:10719C00603AAA70D603C8293DC2A371C91E20C388
+:1071AC00DD731E20CDDD731E25C3DD73C3C77111C6
+:1071BC00C974C3CA7111D374C3CA7111E671E5D510
+:1071CC00C50E09CD0500C1D1E1C9E1232323E97E18
+:1071DC001223130B78B1C2DB71C90D0A24636F6ED5
+:1071EC006669677572656420666F72202420776902
+:1071FC00746820244350585357542E41534D202823
+:10720C003130292020372D4A616E2D31393931200A
+:10721C002443505850524F2E41534D202832292090
+:10722C002031362D4F63742D313939302024C9C9A2
+:10723C00C9C9114572CDCA71C90D0A44202D2064EB
+:10724C00726F7020746865206C696E650D0A42203F
+:10725C002D2073656E64206120627265616B0D0A6E
+:10726C0024E65FFE44C27B72AFD31332CF73C9FEE8
+:10727C0042CA8172C93E07F3D317DB13F608D31346
+:10728C00FB3E1ECD22713E07F3D317DB13E6F7F658
+:10729C0010D313FBC3D6713ACF73B7CAB9723E077A
+:1072AC00F3D317DB13FBE607FE07CAD671F33E07D1
+:1072BC00D3173E10D313D313D313DB133AD173D399
+:1072CC00123AD073D3123E37D313FB3EFF32CF7337
+:1072DC00C3D6717BC97BC97BC9CD7472C93A88701E
+:1072EC004721D0737EE6F0B077AF32CF73C9080375
+:1072FC003131302402020431323030240707053199
+:10730C0033342E3524030303313530240404043183
+:10731C00383030240808053139323030240F0F044E
+:10732C00323030302409090432343030240A0A0354
+:10733C003330302405050433363030240B0B043441
+:10734C00383030240C0C0235302400000336303039
+:10735C002406060437323030240D0D023735240153
+:10736C00010439363030240E0E0D0A35302020370A
+:10737C00352020313130202031333420202031355C
+:10738C003020203330302020363030202031323045
+:10739C00300D0A313830302020323030302020325D
+:1073AC003430302020333630302020343830302008
+:1073BC0020373230302020393630302020313932ED
+:1073CC0030302400374EC9C9C90E061EFFCD05004A
+:1073DC00C90E06CD0500C9F33E07D317DB11E60134
+:1073EC00DB11FBCAE373F33E07D3177BD310FBC946
+:1073FC00F33E07D317DB11FBE602C83E07F3D317A6
+:10740C00DB10FBC9CDFC73B7C21074C9AFC9D5CDA5
+:10741C00E372A7CA27740E05CD0500D1F33E07D33E
+:10742C0017DB11FBE601CA2874F33E07D3177BD395
+:10743C0010FBC91E08CDDD731E20CDDD731E08C3E5
+:10744C00DD7311C474C3CA7111E671C3CA715B4395
+:10745C006F6D707570726F204946342D375D244303
+:10746C0050585644552E41534D2020283629202063
+:10747C0031322D4F63742D313939302024C9476591
+:10748C006E65726963202844756D622920435254DD
+:10749C00205465726D696E616C207479706520730F
+:1074AC00656C656374656420240D0A537461727491
+:1074BC00696E67202E2E2E245E550D0A240D0A525D
+:1074CC005061636B3A20240D0A535061636B3A2070
+:0174DC00248B
+:0000000000
diff --git a/cpvpx8.hex b/cpvpx8.hex
new file mode 100644 (file)
index 0000000..c8ea212
--- /dev/null
@@ -0,0 +1,82 @@
+:10700000AC000600BF72DC72C33374C34374C35751
+:1070100074C36B74C33474C33D74C33574C3757463
+:10702000C37374C30000C30000C3AB74C3A174C3B3
+:107030009C74C3B174C3F871C3D471C3C871C3BCA9
+:1070400071C3C271C3DD71C3E671C3EF71C3AC70AC
+:10705000C35E73C36273C36373C36473C38173C357
+:107060009973C39F73C3A073C33274C32771C3845E
+:1070700074C34F71C33172C31472CF74AD73F373A1
+:10708000000000000010011CFFFFFFFF00000001D6
+:107090000000000650500805000000000D0D2323DD
+:0770A00031004080000101F6
+:1070AC00CDE0700E07CD050032DF700E0CCD050063
+:1070BC007D32DE70113F72CD147211B774CD147223
+:1070CC00CD117221FB7422A3703E4032A570CDF815
+:0270DC0072C977
+:1070E0002A01001103001922087111030019220B53
+:1070F0007111030019220E7111030019221171116F
+:107100001E0019221371C9C30000C30000C3000090
+:10711000C30000C300000E14064605C21A710DC25A
+:1071200018713DC21671C9D511C274CD1472D1CD7A
+:1071300014721E5BCD3D7411B774CD14721156726A
+:10714000CD14723A8D70B7C811A872CD1472C93AB5
+:10715000DE70FE30FA86713A5C00B7CA62713DC3D8
+:1071600067710E19CD05005F0E2ECD05000603AF29
+:107170000E032183002B7E1F770DC2757105C26F30
+:10718000715E2356EBC90E1BCD0500EB2AA77023B9
+:10719000010000D51A1E0817DA9C7103572B7DB425
+:1071A000CAAD717A1DC29771D113C39371D1696051
+:1071B0003AAA70D603C8293DC2B671C9011402C3E8
+:1071C0008474013B01C38474013302CD847411F7CC
+:1071D00074C31472010103CD8474C3CE7101010420
+:1071E000CD8474C3CE71010805CD8474C3CE710102
+:1071F0000807CD8474C3CE713A8D70B7CA05720189
+:107200000109C30872010105CD847411F374C3141C
+:1072100072113C72E5D5C51A13FE24CA2872D55FD7
+:107220004FCD3D74D1C31772C1D1E1C9E1232323EE
+:10723000E97E1223130B78B1C23172C90D0A24639F
+:107240006F6E6669677572656420666F72202420B0
+:107250007769746820245D202020202020202020B1
+:1072600020204E756D626572206F662072657472A3
+:107270006965733A0D0A4E756D626572206F6620FE
+:107280007061636B6574733A2020202020202020D9
+:107290002020202020202020202020202046696C33
+:1072A00065206E616D653A240D0A0D0A0D0A527053
+:1072B00061636B3A0D0A0D0A537061636B3A2443A4
+:1072C00050585357542E41534D20283130292020F7
+:1072D000372D4A616E2D31393931202443505853AE
+:1072E00059532E41534D2028343029202032382D37
+:1072F0004175672D383920243AA9F6325873676FE3
+:107300002288702A060011FB9CB7ED52225673CDDD
+:107310002B730650C33E730630C33E730660C33EF4
+:10732000730640C33E730690C33E73215473114BE2
+:1073300073010900CD31720610C33E730620214B44
+:1073400073115100E52A010019E3C9000000000093
+:1073500000000000FB94000000030001CFC9CD3CF9
+:1073600073C9C9C9116B73CD1472C90D0A422020AB
+:107370005472616E736D6974206120425245414BB5
+:1073800024E65FFE42CA8B73C32C723E3FD30D3E90
+:1073900019CD16713E37D30DC97BC97BC97BC9C9CD
+:1073A000D5CD3C73D17B325873CD2B73C9090331D2
+:1073B00031302402020431323030240A0A033135DC
+:1073C00030240404053139323030240F0F043234B4
+:1073D0003030240C0C0333303024060604343830AB
+:1073E00030240D0D0336303024080804393630308F
+:1073F000240E0E0D0A20202031303020202031357F
+:107400003020202033303020202036303020202003
+:1074100031323030202020323430302020203438B7
+:1074200030302020203936303020202031393230A1
+:107430003024C9C9C90E061EFFCD0500C90E06CDF0
+:107440000500C9E5C5D5CD2173B7CA4674D14BD562
+:10745000CD1C73D1C1E1C9CD2673E664C26874CD79
+:107460001773B7C8CD1273C93E00C9CD5774B7C2E0
+:107470006B74C9AFC9D5CD9D73A7CA82740E05CDF3
+:107480000500D1C9C511CC74CD1472E17CC61F5F53
+:10749000E5CD3D74E17DC61F5FC33D741E08C33D4D
+:1074A000741E20CD3D741E08C33D7411C874C314EE
+:1074B0007211C574C314724570736F6E2050582DCD
+:1074C00038241B2A241B2A240D1B54241B3D241E54
+:1074D0002400001F2400001C2400001D2400001BA9
+:1074E0002A240024000000240000000B2400001EB9
+:0B74F0002400001B5924001B54240042
+:0000000000
diff --git a/cpvpx8.hlp b/cpvpx8.hlp
new file mode 100644 (file)
index 0000000..b700e58
--- /dev/null
@@ -0,0 +1,23 @@
+Date: Thu, 29 Sep 88 12:40:49 EDT
+From: Peter Jones <MAINT@UQAM.BITNET>
+Subject: EPSON PX8 Support
+Keywords: EPSON PX8
+
+     I would like to draw your attention to a letter published in the "Chaos
+Manor Mail" section of "Byte" magazine, July 1988, Volume 13, Number 7,page
+36, column 1, entitled "Calling All PX-8 Orphans".  This letter gives a couple
+of places where one can still get PX-8 support:
+
+1)   Synderscope International
+     1594 Hilltop Dr., El Cajon, CA 92020
+     (619)-442-3789 (bulletin board)
+
+2)   DAK Industries
+     8200 Remmet Ave., Canoga Park, CA 91304
+
+3)   Bulletin board: (313)-538-6968
+
+     I believe people ordering the PX-8 version of KERMIT would appreciate
+receiving this information with their documentation.  I personally have not
+tried contacting any of these people yet, so I don't know how useful these
+addresses are.
diff --git a/cpvrmf.hex b/cpvrmf.hex
new file mode 100644 (file)
index 0000000..d4770b7
--- /dev/null
@@ -0,0 +1,71 @@
+:10700000AC0006009972B672C38B73C3A373C3AE90
+:1070100073C3B673C38C73C39573C38D73C3C073CB
+:10702000C3BE73C30000C30000C3F273C3E873C3DD
+:10703000E773C3F873C3F871C3D471C3C871C3BC19
+:1070400071C3C271C3DD71C3E671C3EF71C3AC70AC
+:10705000C3D872C3D972C3DA72C3DB72C3F872C306
+:107060001773C31D73C31E73C38A73C32771C3CF42
+:1070700073C34F71C32572C3147220742373597381
+:10708000000000000010011CFFFFFFFF00000001D6
+:107090000000000650500805000000000D0D2323DD
+:0770A00031004080000101F6
+:1070AC00CDE0700E07CD050032DF700E0CCD050063
+:1070BC007D32DE70113372CD147211FE73CD1472E9
+:1070CC00CD1172214C7422A3703E4032A570CDD2EA
+:0270DC0072C977
+:1070E0002A01001103001922087111030019220B53
+:1070F0007111030019220E7111030019221171116F
+:107100001E0019221371C9C30000C30000C3000090
+:10711000C30000C300000E28064605C21A710DC246
+:1071200018713DC21671C9D5111574CD1472D1CD27
+:1071300014721E5BCD957311FE73CD1472114A72D9
+:10714000CD14723A8D70B7C8118272CD1472C93ADB
+:10715000DE70FE30FA86713A5C00B7CA62713DC3D8
+:1071600067710E19CD05005F0E2ECD05000603AF29
+:107170000E032183002B7E1F770DC2757105C26F30
+:10718000715E2356EBC90E1BCD0500EB2AA77023B9
+:10719000010000D51A1E0817DA9C7103572B7DB425
+:1071A000CAAD717A1DC29771D113C39371D1696051
+:1071B0003AAA70D603C8293DC2B671C9011404C3E6
+:1071C000CF73011405C3CF73010C06CDCF731148E3
+:1071D00074C31472010107CDCF73C3CE71010108CE
+:1071E000CDCF73C3CE71010809CDCF73C3CE71016A
+:1071F000080BCDCF73C3CE713A8D70B7CA0572013B
+:10720000010DC30872010109CDCF73114474C31479
+:1072100072113072E5D5C50E09CD0500C1D1E1C9A5
+:10722000E1232323E97E1223130B78B1C22572C90F
+:107230000D0A24636F6E6669677572656420666FF8
+:10724000722024207769746820245D0D0A0D0A4E8F
+:10725000756D626572206F66207061636B65747313
+:107260003A0D0A4E756D626572206F662072657404
+:10727000726965733A0D0A46696C65206E616D65C9
+:107280003A240D0A0D0A0D0A527061636B3A0D0A19
+:107290000D0A537061636B3A244350585357542E70
+:1072A00041534D20283130292020372D4A616E2D41
+:1072B0003139393120244350585359532E41534DBD
+:1072C0002028343029202032382D4175672D383957
+:1072D00020241E11CD9573C9C9C9C911E272CD14FC
+:1072E00072C90D0A4220205472616E736D69742058
+:1072F0006120425245414B24E65FFE42CA0273C3FD
+:107300002072DBE9E604CA02733E3FD3E93E19CDA1
+:1073100016713E37D3E9C97BC97BC97BC9C93E0415
+:10732000F729C907033131302400000431323030ED
+:107330002403030432343030240404033330302473
+:10734000010104343830302405050336303024027E
+:107350000204393630302406060D0A20202031314F
+:1073600030202020333030202020363030202020A4
+:107370003132303020202032343030202020343858
+:1073800030302020203936303024C9C9C90E061EBD
+:10739000FFCD0500C97BFE0DC29D731E0E0E06CDEE
+:1073A0000500C9DBE9E601CAA3737BD3E8C9DBE9C1
+:1073B000E602C8DBE8C9CDAE73B7C2B673C9AFC9C0
+:1073C000D5CD1B73A7CACD730E05CD0500D1C9C598
+:1073D000111E74CD1472E17CC61F5FE5CD9573E17B
+:1073E0007DC61F5FC39573C91E20CD95731E08C34C
+:1073F0009573111B74C31472111974C314725265FE
+:10740000736561726368204D616368696E6573209E
+:107410003338305A241F0D09241F240E1924162432
+:107420000B2400000A240000182400000824000097
+:107430001F24000024000000240000001D24000080
+:0C744000240000001E240000192400009D
+:0000000000
diff --git a/cpvrmm.hex b/cpvrmm.hex
new file mode 100644 (file)
index 0000000..6629bda
--- /dev/null
@@ -0,0 +1,71 @@
+:10700000AC0006009972B672C38B73C3A373C3AE90
+:1070100073C3B673C38C73C39573C38D73C3C073CB
+:10702000C3BE73C30000C30000C3F273C3E873C3DD
+:10703000E773C3F873C3F871C3D471C3C871C3BC19
+:1070400071C3C271C3DD71C3E671C3EF71C3AC70AC
+:10705000C3D872C3D972C3DA72C3DB72C3F872C306
+:107060001773C31D73C31E73C38A73C32771C3CF42
+:1070700073C34F71C32572C3147220742373597381
+:10708000000000000010011CFFFFFFFF00000001D6
+:107090000000000650500805000000000D0D2323DD
+:0770A00031004080000101F6
+:1070AC00CDE0700E07CD050032DF700E0CCD050063
+:1070BC007D32DE70113372CD147211FE73CD1472E9
+:1070CC00CD1172214C7422A3703E4032A570CDD2EA
+:0270DC0072C977
+:1070E0002A01001103001922087111030019220B53
+:1070F0007111030019220E7111030019221171116F
+:107100001E0019221371C9C30000C30000C3000090
+:10711000C30000C300000E28064605C21A710DC246
+:1071200018713DC21671C9D5111574CD1472D1CD27
+:1071300014721E5BCD957311FE73CD1472114A72D9
+:10714000CD14723A8D70B7C8118272CD1472C93ADB
+:10715000DE70FE30FA86713A5C00B7CA62713DC3D8
+:1071600067710E19CD05005F0E2ECD05000603AF29
+:107170000E032183002B7E1F770DC2757105C26F30
+:10718000715E2356EBC90E1BCD0500EB2AA77023B9
+:10719000010000D51A1E0817DA9C7103572B7DB425
+:1071A000CAAD717A1DC29771D113C39371D1696051
+:1071B0003AAA70D603C8293DC2B671C9011404C3E6
+:1071C000CF73011405C3CF73010C06CDCF731148E3
+:1071D00074C31472010107CDCF73C3CE71010108CE
+:1071E000CDCF73C3CE71010809CDCF73C3CE71016A
+:1071F000080BCDCF73C3CE713A8D70B7CA0572013B
+:10720000010DC30872010109CDCF73114474C31479
+:1072100072113072E5D5C50E09CD0500C1D1E1C9A5
+:10722000E1232323E97E1223130B78B1C22572C90F
+:107230000D0A24636F6E6669677572656420666FF8
+:10724000722024207769746820245D0D0A0D0A4E8F
+:10725000756D626572206F66207061636B65747313
+:107260003A0D0A4E756D626572206F662072657404
+:10727000726965733A0D0A46696C65206E616D65C9
+:107280003A240D0A0D0A0D0A527061636B3A0D0A19
+:107290000D0A537061636B3A244350585357542E70
+:1072A00041534D20283130292020372D4A616E2D41
+:1072B0003139393120244350585359532E41534DBD
+:1072C0002028343029202032382D4175672D383957
+:1072D00020241E11CD9573C9C9C9C911E272CD14FC
+:1072E00072C90D0A4220205472616E736D69742058
+:1072F0006120425245414B24E65FFE42CA0273C3FD
+:107300002072DBC9E604CA02733E3FD3C93E19CDE1
+:1073100016713E37D3C9C97BC97BC97BC9C93E0435
+:10732000F729C907033131302400000431323030ED
+:107330002403030432343030240404033330302473
+:10734000010104343830302405050336303024027E
+:107350000204393630302406060D0A20202031314F
+:1073600030202020333030202020363030202020A4
+:107370003132303020202032343030202020343858
+:1073800030302020203936303024C9C9C90E061EBD
+:10739000FFCD0500C97BFE0DC29D731E0E0E06CDEE
+:1073A0000500C9DBC9E601CAA3737BD3C8C9DBC921
+:1073B000E602C8DBC8C9CDAE73B7C2B673C9AFC9E0
+:1073C000D5CD1B73A7CACD730E05CD0500D1C9C598
+:1073D000111E74CD1472E17CC61F5FE5CD9573E17B
+:1073E0007DC61F5FC39573C91E20CD95731E08C34C
+:1073F0009573111B74C31472111974C314725265FE
+:10740000736561726368204D616368696E6573209E
+:107410003338305A241F0D09241F240E1924162432
+:107420000B2400000A240000182400000824000097
+:107430001F24000024000000240000001D24000080
+:0C744000240000001E240000192400009D
+:0000000000
diff --git a/cpvrob.hex b/cpvrob.hex
new file mode 100644 (file)
index 0000000..2d6f45c
--- /dev/null
@@ -0,0 +1,77 @@
+:10700000AC0006009872B572C3C873C3E473C3F0D2
+:1070100073C3F973C3CF73C3DF73C3D673C3087469
+:10702000C30174C30000C30000C34474C33A74C3F3
+:107030003574C34A74C3F771C3D371C3C771C3BB7B
+:1070400071C3C171C3DC71C3E571C3EE71C3AC70B0
+:10705000C3D272C3D372C3FE72C3FF72C31C73C3A5
+:107060004273C34873C34973C34973C32671C316BC
+:1070700074C34E71C32472C313727874000000008D
+:10708000927358730010001CFFFFFFFF0000000107
+:107090000000000650500805000000000D0D2323DD
+:0770A00031004080000101F6
+:1070AC00CDDF700E07CD050032C7730E0CCD050079
+:1070BC007D32DE70113272CD1372115074CD137299
+:1070CC00CD107221A47422A3703E4032A570CDD194
+:0270DC0072C977
+:1070DF002A01001103001922077111030019220A56
+:1070EF007111030019220D71110300192210711172
+:1070FF001E0019221271C9C30000C30000C3000093
+:10710F00C30000C300000E14064605C219710DC25C
+:10711F0017713DC21571C9D5115C74CD1372D1CDE4
+:10712F0013721E5BCDDF73115074CD137211497240
+:10713F00CD13723A8D70B7C8118172CD1372C93ADF
+:10714F00DE70FE30FA85713A5C00B7CA61713DC3DB
+:10715F0066710E19CD05005F0E2ECD05000603AF2B
+:10716F000E032183002B7E1F770DC2747105C26E33
+:10717F00715E2356EBC90E1BCD0500EB2AA77023BA
+:10718F00010000D51A1E0817DA9B7103572B7DB427
+:10719F00CAAC717A1DC29671D113C39271D1696055
+:1071AF003AAA70D603C8293DC2B571C9011404C3E8
+:1071BF001674011405C31674010C06CD167411A0B4
+:1071CF0074C31372010107CD1674C3CD7101010889
+:1071DF00CD1674C3CD71010809CD1674C3CD7101DD
+:1071EF00080BCD1674C3CD713A8D70B7CA047201F6
+:1071FF00010DC30772010109CD1674119C74C313DD
+:10720F0072112F72E5D5C50E09CD0500C1D1E1C9A7
+:10721F00E1232323E97E1223130B78B1C22472C911
+:10722F000D0A24636F6E6669677572656420666FF9
+:10723F00722024207769746820245D0D0A0D0A4E90
+:10724F00756D626572206F66207061636B65747314
+:10725F003A0D0A4E756D626572206F662072657405
+:10726F00726965733A0D0A46696C65206E616D65CA
+:10727F003A240D0A0D0A0D0A527061636B3A0D0A1A
+:10728F000D0A537061636B3A244350585357542E71
+:10729F0041534D20283130292020372D4A616E2D42
+:1072AF003139393120244350585359532E41534DBE
+:1072BF002028343029202032382D4175672D383958
+:1072CF002024C9C911DA72CD1372C92028547970DC
+:1072DF0065204C656674204172726F7720746F2041
+:1072EF0073656E64204354524C2D53290D0A24C9E3
+:1072FF00110673CD1372C90D0A4220205472616EAC
+:10730F00736D6974206120425245414B24E65FFE44
+:10731F0042CA2673C31F722164963AC4734F3E0A42
+:10732F00ED792B7DB4C231733AC4734F3E37ED798B
+:10733F00D341C97BC97BC97BC9C97E32C673237E42
+:10734F0032C573237E32C473C90D0A434F4D4D5559
+:10735F004E49434154494F4E5320706F72740D0A7A
+:10736F0047454E4552414C20707572706F736520C2
+:10737F00706F72740D0A5052494E54455220706FFF
+:10738F00727424030E434F4D4D554E49434154499A
+:10739F004F4E5324BB730747454E4552414C24BEB5
+:1073AF0073075052494E54455224C17356045957CE
+:1073BF000251540249590456953AC673320300C913
+:1073CF003AC773320300C9CD0671B7C8CD0971C969
+:1073DF004BCD0C71C9E5C53AC5734FCD0500C1E161
+:1073EF00C9CD0671B7C8CD0971C9CDF073B7C2F950
+:1073FF0073C9CD1271CD1271C9D5CD4673A7CA14F9
+:10740F00744BCD0F71D1C9C5117574CD1372E1E5F0
+:10741F006C2600CD08011E3BCDDF73E12600CD08A1
+:10742F00011E48C3DF731E08C3DF731E20CDDF7339
+:10743F001E08C3DF73117074C31372116974C31301
+:10744F0072565431383020526F62696E241B3C1BC8
+:10745F005B481B5B4A0D0A0909241B5B481B5B4AEF
+:10746F00240D1B5B4B241B5B241B5B41241B5B42CA
+:10747F00241B5B43241B5B442424000000240000D6
+:10748F0000240000001B5B48241B4D24001B5B4A9B
+:05749F00241B5B4B24DF
+:0000000000
diff --git a/cpvsan.hex b/cpvsan.hex
new file mode 100644 (file)
index 0000000..928b582
--- /dev/null
@@ -0,0 +1,62 @@
+:10700000AC0006009972B672C3E972C3F972C30488
+:1070100073C30C73C3EA72C3F372C3EB72C3167308
+:10702000C31473C30000C30000C34D73C34373C3D1
+:107030003E73C35373C3F871C3D471C3C871C3BC67
+:1070400071C3C271C3DD71C3E671C3EF71C3AC70AC
+:10705000C3D272C3D372C3D472C3D572C3DD72C339
+:10706000E072C3E672C3E772C3E872C32771C32537
+:1070700073C34F71C32572C3147291730000000073
+:10708000000000000010011CFFFFFFFF00000001D6
+:107090000000000650500805000000000D0D2323DD
+:0770A00031004080000101F6
+:1070AC00CDE0700E07CD050032DF700E0CCD050063
+:1070BC007D32DE70113372CD1472116073CD147287
+:1070CC00CD117221BF7322A3703E4032A570CDD179
+:0270DC0072C977
+:1070E0002A01001103001922087111030019220B53
+:1070F0007111030019220E7111030019221171116F
+:107100001E0019221371C9C30000C30000C3000090
+:10711000C30000C300000E14064605C21A710DC25A
+:1071200018713DC21671C9D5115973CD1472D1CDE4
+:1071300014721E5BCDF372116073CD1472114A721A
+:10714000CD14723A8D70B7C8118272CD1472C93ADB
+:10715000DE70FE30FA86713A5C00B7CA62713DC3D8
+:1071600067710E19CD05005F0E2ECD05000603AF29
+:107170000E032183002B7E1F770DC2757105C26F30
+:10718000715E2356EBC90E1BCD0500EB2AA77023B9
+:10719000010000D51A1E0817DA9C7103572B7DB425
+:1071A000CAAD717A1DC29771D113C39371D1696051
+:1071B0003AAA70D603C8293DC2B671C9011404C3E6
+:1071C0002573011405C32573010C06CD257311BB6E
+:1071D00073C31472010107CD2573C3CE7101010879
+:1071E000CD2573C3CE71010809CD2573C3CE7101BE
+:1071F000080BCD2573C3CE713A8D70B7CA057201E5
+:10720000010DC30872010109CD257311B773C314B1
+:1072100072113072E5D5C50E09CD0500C1D1E1C9A5
+:10722000E1232323E97E1223130B78B1C22572C90F
+:107230000D0A24636F6E6669677572656420666FF8
+:10724000722024207769746820245D0D0A0D0A4E8F
+:10725000756D626572206F66207061636B65747313
+:107260003A0D0A4E756D626572206F662072657404
+:10727000726965733A0D0A46696C65206E616D65C9
+:107280003A240D0A0D0A0D0A527061636B3A0D0A19
+:107290000D0A537061636B3A244350585357542E70
+:1072A00041534D20283130292020372D4A616E2D41
+:1072B00031393931202443505853594F2E41534DC1
+:1072C00020283129202032372D4F63742D38372064
+:1072D00024C9C9C9C911DC72CD1472C924E65FC9B9
+:1072E0007BC97BC97BC9C9C9C9C9C90E061EFFCDE7
+:1072F0000500C90E06CD0500C9DBDDE601CAF9723D
+:107300007BD3DCC9DBDDE602C8DBDCC9CD0473B7A7
+:10731000C20C73C9AFC9D5CDE472A7CA23730E05D9
+:10732000CD0500D1C9C5118D73CD1472E17CC61F86
+:107330005FE5CDF372E17DC61F5FC3F372C91E081E
+:10734000CDF3721E20CDF3721E08C3F37211857344
+:10735000C31472118873C314721B451B480D0A09AC
+:107360004B45524D49542D38302056332E39205B31
+:1073700053414E594F204D42432D313130305D0D38
+:107380000A241B4B241B50241B451B48241B3D2453
+:10739000001B4100001B4200001B4400001B430077
+:1073A000001B45000000000000000000001B48001A
+:0F73B000001B411B4300001B4A00001B4B000049
+:0000000000
diff --git a/cpvsb6.hex b/cpvsb6.hex
new file mode 100644 (file)
index 0000000..438cdb4
--- /dev/null
@@ -0,0 +1,96 @@
+:10700000AC00060000721D72C3F374C30375C31095
+:1070100075C32775C3F474C3FD74C3F574C33375A6
+:10702000C32F75C30000C30000C34C75C34275C3B2
+:107030003D75C35275C3B871C3B871C3B871C3A9E4
+:1070400071C3AE71C3B871C3BB71C3C171C3AC703E
+:10705000C35A72C37272C37472C37572C39772C318
+:10706000D872C3DE72C3DF72C3F274C33371C390CC
+:1070700075C33C71C3DB71C3CA7100007174B9740C
+:10708000000000000010FF1CFFFFFFFF00000001D8
+:107090000000000650500805000000000D0D2323DD
+:0770A00031004080000101F6
+:1070AC00CDEC700E07CD050032EB700E0CCD05004B
+:1070BC007D32EA7011E971CDCA71115875CDCA7162
+:1070CC0011F971CDCA71119175CDCA71CDC77121EC
+:0E70DC00E47522A3703E4032A570CD3672C915
+:1070EC002A0100110300192214711103001922172F
+:1070FC007111030019221A7111030019221D71114B
+:10710C001E0019221F71C9C30000C30000C3000078
+:10711C00C30000C300000E3C064605C226710DC21A
+:10712C0024713DC22271C9D511BC75CDCA71D1C9AA
+:10713C003AEA70FE30FA73713A5C00B7CA4F713D8F
+:10714C00C354710E19CD05005F0E2ECD050006033C
+:10715C00AF0E032183002B7E1F770DC2627105C217
+:10716C005C715E2356EBC90E1BCD0500EB2AA77094
+:10717C0023010000D51A1E0817DA897103572B7DDD
+:10718C00B4CA9A717A1DC28471D113C38071D1694A
+:10719C00603AAA70D603C8293DC2A371C91E20C388
+:1071AC00FD741E20CDFD741E25C3FD74C3C7711163
+:1071BC00D075C3CA7111DA75C3CA7111E671E5D500
+:1071CC00C50E09CD0500C1D1E1C9E1232323E97E18
+:1071DC001223130B78B1C2DB71C90D0A24636F6ED5
+:1071EC006669677572656420666F72202420776902
+:1071FC00746820244350585357542E41534D202823
+:10720C003130292020372D4A616E2D31393931200A
+:10721C002443505853422E41534D202832292020CC
+:10722C0032322D4A756C2D383724215772ED3800C7
+:10723C007723ED38027723ED38047726082E0822C1
+:0B724C008870219E733608CDE573C9E1
+:10725A002157727EED3900237EED3902237EED3906
+:10726A0004ED3804ED3804C9C924C9117C72CDCAA9
+:10727A0071C90D0A5620204379636C6520706F72BC
+:10728A007420706172616D657465727324FE56CAEA
+:10729A00A472FE76CAA472C3D671219E737EC601F9
+:1072AA00FE0DC2B1723E0177B73D07074F060021B6
+:1072BA009F732309E511D372CDCA71D1CDCA711159
+:1072CA00D572CDCA71CDE573C93C243E24C97BC9A8
+:1072DA007BC97BC9C9112473CDCA7111DC730E0A2B
+:1072EA00CD050021DD737EB7CAE573FE03C20D73B7
+:1072FA0023237EE65F7711DD73219F73CD1274B766
+:10730A00C21673118973CDCA71C3DF72C6030F0F18
+:10731A00E60F219E7377CDE573C90D0A456E746534
+:10732A0072206269742F636861722C2070617269BD
+:10733A0074792C20616E642073746F702062697492
+:10734A00732072657175697265642E0D0A28426927
+:10735A007420372F38202020506172697479204EAA
+:10736A002F4F2F4520202053746F7020312F322049
+:10737A00202D2043522073616D6529203A20240D67
+:10738A000A496E76616C696420706172616D657418
+:10739A00657273240830374E3124374E3224374F02
+:1073AA003124374F32243745312437453224384E79
+:1073BA003124384E3224384F3124384F322438455C
+:1073CA00312438453224000112130203040516172A
+:1073DA0006070603384E3224242424219E737E3D58
+:1073EA0021D07306004F097E47E610218870864F28
+:1073FA0078E607C660ED390079ED39023E00ED39CD
+:10740A0004ED3804ED3804C97EB7CA6774326D7466
+:10741A004723226974EB7EB7CA6774326E744F23AE
+:10742A00226B747891DA67743C4FAF326F74216FB4
+:10743A0074343A6E74472A6B74EB2A69741ABEC2A2
+:10744A00557405CA63742313C347740DCA67742A33
+:0F745A00697423226974C338743A6F74C997C96F
+:10747000C9090431323030240B0B03313530240E6E
+:107480000E053139323030240101043234303024D9
+:107490000A0A03333030240D0D05333834303024DC
+:1074A0000000043438303024090903363030240C0D
+:1074B0000C04393630302408080D0A2020203135DC
+:1074C0003020203330302020363030202031323010
+:1074D00030202032343030202034383030202039F1
+:1074E00036303020203139323030202033383430BB
+:1074F0003024C9C9C90E061EFFCD0500C90E06CD30
+:107500000500C9ED3804E602CA03757BED3906C9EA
+:10751000219600ED3804E680CA1F75ED3808C92BA6
+:1075200067B5C21375C9C9CD1075B7C22775C9CD66
+:107530001F71C9D5CDDC72A7CA3B75D1C91E08C35E
+:10754000FD741E20CDFD741E08C3FD7411CB75C3E0
+:10755000CA7111E671C3CA714D6963726F4D696E6C
+:10756000742053422031383020202836204D487A6C
+:1075700029244350585644552E41534D2020283637
+:1075800029202031322D4F63742D31393930202498
+:10759000C947656E65726963202844756D6229204C
+:1075A000435254205465726D696E616C2074797019
+:1075B000652073656C656374656420240D0A5374DB
+:1075C000617274696E67202E2E2E245E550D0A247A
+:1075D0000D0A525061636B3A20240D0A53506163C7
+:0475E0006B3A2024BE
+:0000000000
diff --git a/cpvsb9.hex b/cpvsb9.hex
new file mode 100644 (file)
index 0000000..b16b7c7
--- /dev/null
@@ -0,0 +1,94 @@
+:10700000AC00060000721D72C3D774C3E774C3F4EA
+:1070100074C30B75C3D874C3E174C3D974C3177533
+:10702000C31375C30000C30000C33075C32675C306
+:107030002175C33675C3B871C3B871C3B871C3A91C
+:1070400071C3AE71C3B871C3BB71C3C171C3AC703E
+:10705000C35A72C37272C37472C37572C39772C318
+:10706000D872C3DE72C3DF72C3D674C33371C37404
+:1070700075C33C71C3DB71C3CA7100007174A9741C
+:10708000000000000010FF1CFFFFFFFF00000001D8
+:107090000000000650500805000000000D0D2323DD
+:0770A00031004080000101F6
+:1070AC00CDEC700E07CD050032EB700E0CCD05004B
+:1070BC007D32EA7011E971CDCA71113C75CDCA717E
+:1070CC0011F971CDCA71117575CDCA71CDC7712108
+:0E70DC00C87522A3703E4032A570CD3672C931
+:1070EC002A0100110300192214711103001922172F
+:1070FC007111030019221A7111030019221D71114B
+:10710C001E0019221F71C9C30000C30000C3000078
+:10711C00C30000C300000E5A064605C226710DC2FC
+:10712C0024713DC22271C9D511A075CDCA71D1C9C6
+:10713C003AEA70FE30FA73713A5C00B7CA4F713D8F
+:10714C00C354710E19CD05005F0E2ECD050006033C
+:10715C00AF0E032183002B7E1F770DC2627105C217
+:10716C005C715E2356EBC90E1BCD0500EB2AA77094
+:10717C0023010000D51A1E0817DA897103572B7DDD
+:10718C00B4CA9A717A1DC28471D113C38071D1694A
+:10719C00603AAA70D603C8293DC2A371C91E20C388
+:1071AC00E1741E20CDE1741E25C3E174C3C77111B7
+:1071BC00B475C3CA7111BE75C3CA7111E671E5D538
+:1071CC00C50E09CD0500C1D1E1C9E1232323E97E18
+:1071DC001223130B78B1C2DB71C90D0A24636F6ED5
+:1071EC006669677572656420666F72202420776902
+:1071FC00746820244350585357542E41534D202823
+:10720C003130292020372D4A616E2D31393931200A
+:10721C002443505853422E41534D202832292020CC
+:10722C0032322D4A756C2D383724215772ED3800C7
+:10723C007723ED38027723ED38047726212E21228F
+:0B724C008870219E733608CDE573C9E1
+:10725A002157727EED3900237EED3902237EED3906
+:10726A0004ED3804ED3804C9C924C9117C72CDCAA9
+:10727A0071C90D0A5620204379636C6520706F72BC
+:10728A007420706172616D657465727324FE56CAEA
+:10729A00A472FE76CAA472C3D671219E737EC601F9
+:1072AA00FE0DC2B1723E0177B73D07074F060021B6
+:1072BA009F732309E511D372CDCA71D1CDCA711159
+:1072CA00D572CDCA71CDE573C93C243E24C97BC9A8
+:1072DA007BC97BC9C9112473CDCA7111DC730E0A2B
+:1072EA00CD050021DD737EB7CAE573FE03C20D73B7
+:1072FA0023237EE65F7711DD73219F73CD1274B766
+:10730A00C21673118973CDCA71C3DF72C6030F0F18
+:10731A00E60F219E7377CDE573C90D0A456E746534
+:10732A0072206269742F636861722C2070617269BD
+:10733A0074792C20616E642073746F702062697492
+:10734A00732072657175697265642E0D0A28426927
+:10735A007420372F38202020506172697479204EAA
+:10736A002F4F2F4520202053746F7020312F322049
+:10737A00202D2043522073616D6529203A20240D67
+:10738A000A496E76616C696420706172616D657418
+:10739A00657273240830374E3124374E3224374F02
+:1073AA003124374F32243745312437453224384E79
+:1073BA003124384E3224384F3124384F322438455C
+:1073CA00312438453224000112130203040516172A
+:1073DA0006070603384E3224242424219E737E3D58
+:1073EA0021D07306004F097E47E610218870864F28
+:1073FA0078E607C660ED390079ED39023E00ED39CD
+:10740A0004ED3804ED3804C97EB7CA6774326D7466
+:10741A004723226974EB7EB7CA6774326E744F23AE
+:10742A00226B747891DA67743C4FAF326F74216FB4
+:10743A0074343A6E74472A6B74EB2A69741ABEC2A2
+:10744A00557405CA63742313C347740DCA67742A33
+:0F745A00697423226974C338743A6F74C997C96F
+:10747000C907043132303024242405313932303008
+:1074800024202004323430302423230333303024AA
+:107490002626043438303024222203363030242586
+:1074A0002504393630302421210D0A2020203330A4
+:1074B000302020363030202031323030202032341D
+:1074C0003030202034383030202039363030202001
+:1074D000313932303024C9C9C90E061EFFCD05002E
+:1074E000C90E06CD0500C9ED3804E602CAE7747B73
+:1074F000ED3906C9219600ED3804E680CA0375ED22
+:107500003808C92B67B5C2F774C9C9CDF474B7C2BE
+:107510000B75C9CD1F71C9D5CDDC72A7CA1F75D136
+:10752000C91E08C3E1741E20CDE1741E08C3E174B6
+:1075300011AF75C3CA7111E671C3CA714D69637227
+:107540006F4D696E74205342203138302020283925
+:10755000204D487A29244350585644552E41534DC6
+:107560002020283629202031322D4F63742D3139C7
+:1075700039302024C947656E6572696320284475D7
+:107580006D622920435254205465726D696E616C9E
+:1075900020747970652073656C656374656420245C
+:1075A0000D0A5374617274696E67202E2E2E245E4C
+:1075B000550D0A240D0A525061636B3A20240D0ABE
+:0875C000535061636B3A202473
+:0000000000
diff --git a/cpvscn.hex b/cpvscn.hex
new file mode 100644 (file)
index 0000000..c38c55b
--- /dev/null
@@ -0,0 +1,86 @@
+:10700000AC0006009972B672C36B74C37B74C37B09
+:1070100074C38374C36C74C37574C36D74C38F7489
+:10702000C38B74C30000C30000C3C574C3BB74C367
+:10703000B674C3CB74C3F871C3D471C3C871C3BC75
+:1070400071C3C271C3DD71C3E671C3EF71C3AC70AC
+:10705000C31973C31A73C31B73C31C73C34B73C3AA
+:107060007E73C38473C38873C36A74C32771C39E5A
+:1070700074C34F71C32572C314720575A1730D7467
+:10708000000000000010011CFFFFFFFF00000001D6
+:107090000000000650500805000000000D0D2323DD
+:0770A00031004080000101F6
+:1070AC00CDE0700E07CD050032DF700E0CCD050063
+:1070BC007D32DE70113372CD147211D174CD147215
+:1070CC00CD117221317522A3703E4032A570CDD204
+:0270DC0072C977
+:1070E0002A01001103001922087111030019220B53
+:1070F0007111030019220E7111030019221171116F
+:107100001E0019221371C9C30000C30000C3000090
+:10711000C30000C300000E19064605C21A710DC255
+:1071200018713DC21671C9D511F874CD1472D1CD44
+:1071300014721E5BCD757411D174CD1472114A7224
+:10714000CD14723A8D70B7C8118272CD1472C93ADB
+:10715000DE70FE30FA86713A5C00B7CA62713DC3D8
+:1071600067710E19CD05005F0E2ECD05000603AF29
+:107170000E032183002B7E1F770DC2757105C26F30
+:10718000715E2356EBC90E1BCD0500EB2AA77023B9
+:10719000010000D51A1E0817DA9C7103572B7DB425
+:1071A000CAAD717A1DC29771D113C39371D1696051
+:1071B0003AAA70D603C8293DC2B671C9011404C3E6
+:1071C0009E74011405C39E74010C06CD9E74112D8E
+:1071D00075C31472010107CD9E74C3CE71010108FD
+:1071E000CD9E74C3CE71010809CD9E74C3CE7101CA
+:1071F000080BCD9E74C3CE713A8D70B7CA0572016B
+:10720000010DC30872010109CD9E74112975C314C3
+:1072100072113072E5D5C50E09CD0500C1D1E1C9A5
+:10722000E1232323E97E1223130B78B1C22572C90F
+:107230000D0A24636F6E6669677572656420666FF8
+:10724000722024207769746820245D0D0A0D0A4E8F
+:10725000756D626572206F66207061636B65747313
+:107260003A0D0A4E756D626572206F662072657404
+:10727000726965733A0D0A46696C65206E616D65C9
+:107280003A240D0A0D0A0D0A527061636B3A0D0A19
+:107290000D0A537061636B3A244350585357542E70
+:1072A00041534D20283130292020372D4A616E2D41
+:1072B0003139393120244350584845412E41534DEE
+:1072C00020283429202033312D4175672D3139385C
+:1072D0003924CDF372DB0BF680D30BDB08328870D8
+:1072E000DB093289703E03D30BDB0CF601D30CCDE6
+:1072F0000273C9DB09321773AFD309DB0CF610D365
+:107300000CC9DB083E07CD1671DB08DB0CE6EFD3BA
+:077310000C3A1773D309C901
+:10731800C9C9C9C9112373CD1472C90D0A422020E5
+:107328005472616E736D6974206120425245414BFD
+:107338000D0A44202044726F7020746865206C69BF
+:107348006E6524E65FFE44C26473DB0CE6FED30C74
+:107358003E32CD1671DB0CF601D30CC9FE42CA6C65
+:1073680073C32072DB0BF640D30B3E1ECD1671DBC8
+:107378000BE6BFD30BC97BC97BC97BC9CD5273C987
+:10738800CDF372DB0BF680D30B7BD3087AD309DB02
+:107398000BE67FD30BCD0273C90E03313130247055
+:1073A800040431323030246800053133342E35245A
+:1073B800A1030431383030244500053139323030EA
+:1073C80024070004323430302434000333303024AE
+:1073D800A1010433363030242300043438303024FB
+:1073E8001A000235302464090336303024D00004F2
+:1073F80037323030241100023735248306043936F9
+:107408003030240D000D0A20202020353020202087
+:10741800203735202020313130203133342E3520AB
+:1074280020203330302020203630302020203132C8
+:1074380030300D0A202031383030202032343030BE
+:107448002020333630302020343830302020373276
+:107458003030202039363030202831393230303F32
+:107468002924C9C9C90E061EFFCD0500C90E06CDBF
+:107478000500C9DB0DE601C8DB08C9CD7B74B7C2BE
+:107488008374C9CD1371C9D5CD8273A7CA9C740EF4
+:1074980005CD0500D1C9C5110275CD1472E17CC6B0
+:1074A8001F5FE5CD7574E17DC61F5FC375741E0847
+:1074B800C375741E20CD75741E08C3757411FE74CF
+:1074C800C3147211FC74C314724F454D2053637278
+:1074D80065656E54797065723A20344D487A205A41
+:1074E80038302072756E6E696E67204F532F4D24A9
+:1074F8001A0D0A241A240D1B2A241B3D241E2400BD
+:10750800001F2400001C2400001D2400001A240071
+:10751800000000000000000000152400001E2400E8
+:09752800001B2524001B2A24008D
+:0000000000
diff --git a/cpvtel.hex b/cpvtel.hex
new file mode 100644 (file)
index 0000000..7a964a7
--- /dev/null
@@ -0,0 +1,82 @@
+:10700000AC0006009972B672C33974C34974C35494
+:1070100074C35C74C33A74C34374C33B74C368746D
+:10702000C36474C30000C30000C39E74C39474C3DC
+:107030008F74C3A474C3F871C3D471C3C871C3BCC3
+:1070400071C3C271C3DD71C3E671C3EF71C3AC70AC
+:10705000C3D372C3D472C3D572C3D672C3F372C31F
+:107060000B73C31173C31273C33874C32771C3770F
+:1070700074C34F71C32572C31472CC741D73B7737C
+:10708000000000000010001DFFFFFFFF00000001D6
+:107090000000000650500805000000000D0D2323DD
+:0770A00031004080000101F6
+:1070AC00CDE0700E07CD050032DF700E0CCD050063
+:1070BC007D32DE70113372CD147211AA74CD14723C
+:1070CC00CD117221F87422A3703E4032A570CDD23E
+:0270DC0072C977
+:1070E0002A01001103001922087111030019220B53
+:1070F0007111030019220E7111030019221171116F
+:107100001E0019221371C9C30000C30000C3000090
+:10711000C30000C300000E28064605C21A710DC246
+:1071200018713DC21671C9D511B774CD1472D1CD85
+:1071300014721E5BCD437411AA74CD1472114A727D
+:10714000CD14723A8D70B7C8118272CD1472C93ADB
+:10715000DE70FE30FA86713A5C00B7CA62713DC3D8
+:1071600067710E19CD05005F0E2ECD05000603AF29
+:107170000E032183002B7E1F770DC2757105C26F30
+:10718000715E2356EBC90E1BCD0500EB2AA77023B9
+:10719000010000D51A1E0817DA9C7103572B7DB425
+:1071A000CAAD717A1DC29771D113C39371D1696051
+:1071B0003AAA70D603C8293DC2B671C9011404C3E6
+:1071C0007774011405C37774010C06CD777411F43C
+:1071D00074C31472010107CD7774C3CE7101010825
+:1071E000CD7774C3CE71010809CD7774C3CE710118
+:1071F000080BCD7774C3CE713A8D70B7CA05720192
+:10720000010DC30872010109CD777411F074C31424
+:1072100072113072E5D5C50E09CD0500C1D1E1C9A5
+:10722000E1232323E97E1223130B78B1C22572C90F
+:107230000D0A24636F6E6669677572656420666FF8
+:10724000722024207769746820245D0D0A0D0A4E8F
+:10725000756D626572206F66207061636B65747313
+:107260003A0D0A4E756D626572206F662072657404
+:10727000726965733A0D0A46696C65206E616D65C9
+:107280003A240D0A0D0A0D0A527061636B3A0D0A19
+:107290000D0A537061636B3A244350585357542E70
+:1072A00041534D20283130292020372D4A616E2D41
+:1072B0003139393120244350584845412E41534DEE
+:1072C00020283429202033312D4175672D3139385C
+:1072D0003924C9C9C9C911DD72CD1472C90D0A4258
+:1072E00020205472616E736D697420612042524592
+:1072F000414B24E65FFE42CAFD72C320723E3FD37B
+:10730000213E1ECD16713E37D321C97BC97BC97B77
+:10731000C9C93E36D3037BD3007AD300C9140331E5
+:10732000313024C111043132303024A10105313310
+:10733000342E3524850E0331353024050D043137C4
+:107340003630241C0104313830302416010531391F
+:10735000323030241A000332303024C40904323071
+:10736000303024FA00043234303024D0000333307B
+:10737000302483060433353230248E000433363013
+:1073800030248B0004343830302468000235302437
+:107390001027033630302441030436322E35244082
+:1073A0001F0437323030244500023735240B1A04CD
+:1073B000393630302434000D0A202020203530208A
+:1073C00020202036322E3520202037352031313014
+:1073D0002020203133342E3520202031353020201C
+:1073E0002032303020202033303020202036303002
+:1073F000202020313230300D0A2020313736302025
+:1074000020313830302020323030302020323430BB
+:1074100030202033353230202033363030202034B5
+:1074200038303020373230300D0A202039363030B5
+:107430002020313932303024C9C9C90E061EFFCD93
+:107440000500C90E06CD0500C9DB21E601CA497455
+:107450007BD320C9DB21E602C8DB20C9CD5474B739
+:10746000C25C74C9CD1371C9D5CD0F73A7CA757429
+:107470000E05CD0500D1C9C511C974CD1472E17CCA
+:10748000C61F5FE5CD4374E17DC61F5FC343741E15
+:1074900008C343741E20CD43741E08C3437411C532
+:1074A00074C3147211C074C3147254656C636F6E2C
+:1074B000205A6F726261241B481B4A0D0A09092475
+:1074C0001B481B4A240D1B4B241B59241B41240021
+:1074D0001B4224001B4324001B4424001B452400A2
+:1074E0001B4624001B4724001B4824001B49240082
+:0874F0001B4A24001B4B240081
+:0000000000
diff --git a/cpvtet.hex b/cpvtet.hex
new file mode 100644 (file)
index 0000000..e0ca33b
--- /dev/null
@@ -0,0 +1,61 @@
+:10700000AC00060000721D72C3C872C3D872C3E31D
+:1070100072C3EB72C3C972C3D272C3CA72C3F572B0
+:10702000C3F372C30000C30000C31373C30973C367
+:107030000473C31973C3B871C3B871C3B871C3A95A
+:1070400071C3AE71C3B871C3BB71C3C171C3AC703E
+:10705000C33A72C34572C34672C34772C34972C30F
+:107060004E72C35472C35572C3C772C33371C359CE
+:1070700073C33C71C3DB71C3CA7100005E72967248
+:10708000000000000010FF1CFFFFFFFF00000001D8
+:107090000000000650500805000000000D0D2323DD
+:0770A00031004080000101F6
+:1070AC00CDEC700E07CD050032EB700E0CCD05004B
+:1070BC007D32EA7011E971CDCA71111F73CDCA719D
+:1070CC0011F971CDCA71115A73CDCA71CDC7712125
+:0E70DC00AD7322A3703E4032A570CD3972C94B
+:1070EC002A0100110300192214711103001922172F
+:1070FC007111030019221A7111030019221D71114B
+:10710C001E0019221F71C9C30000C30000C3000078
+:10711C00C30000C300000E14064605C226710DC242
+:10712C0024713DC22271C9D5118573CDCA71D1C9E3
+:10713C003AEA70FE30FA73713A5C00B7CA4F713D8F
+:10714C00C354710E19CD05005F0E2ECD050006033C
+:10715C00AF0E032183002B7E1F770DC2627105C217
+:10716C005C715E2356EBC90E1BCD0500EB2AA77094
+:10717C0023010000D51A1E0817DA897103572B7DDD
+:10718C00B4CA9A717A1DC28471D113C38071D1694A
+:10719C00603AAA70D603C8293DC2A371C91E20C388
+:1071AC00D2721E20CDD2721E25C3D272C3C77111EA
+:1071BC009973C3CA7111A373C3CA7111E671E5D572
+:1071CC00C50E09CD0500C1D1E1C9E1232323E97E18
+:1071DC001223130B78B1C2DB71C90D0A24636F6ED5
+:1071EC006669677572656420666F72202420776902
+:1071FC00746820244350585357542E41534D202823
+:10720C003130292020372D4A616E2D31393931200A
+:10721C00244350585359532E41534D202834302970
+:10722C00202032382D4175672D38392024C9F33E82
+:10723C0047D3083E08D308FBC9C9C9C924E65FC3B4
+:10724C00D6717BC97BC97BC9C9F37BD3087AD308B8
+:10725C00FBC9070431323030244740053139323014
+:10726C003024470404323430302447200333303088
+:10727C00244700043438303024471003363030248F
+:10728C00478004393630302447080D0A202020333B
+:10729C003030202020363030202031323030202049
+:1072AC002032343030202020343830302020203927
+:1072BC003630302020313932303024C9C9C90E065D
+:1072CC001EFFCD0500C90E06CD0500C9DB01E60485
+:1072DC00CAD8727BD300C9DB01E601C8DB00C9CD7B
+:1072EC00E372B7C2EB72C9AFC9D5CD5272A7CA024D
+:1072FC00730E05CD0500D1C91E08C3D2721E20CD58
+:10730C00D2721E08C3D272119473C3CA7111E67182
+:10731C00C3CA7154656C6574656B205359535445DD
+:10732C004D41535445522043502F4D2D383024435A
+:10733C0050585644552E41534D2020283629202094
+:10734C0031322D4F63742D313939302024C94765C2
+:10735C006E65726963202844756D6229204352540E
+:10736C00205465726D696E616C2074797065207340
+:10737C00656C656374656420240D0A5374617274C2
+:10738C00696E67202E2E2E245E550D0A240D0A528E
+:10739C005061636B3A20240D0A535061636B3A20A1
+:0173AC0024BC
+:0000000000
diff --git a/cpvtlb.hex b/cpvtlb.hex
new file mode 100644 (file)
index 0000000..93daefd
--- /dev/null
@@ -0,0 +1,65 @@
+:10700000AC0006009972B672C32773C33773C342CC
+:1070100073C34A73C32873C33173C32973C35473CF
+:10702000C35273C30000C30000C38A73C38073C319
+:107030007B73C39073C3F871C3D471C3C871C3BCED
+:1070400071C3C271C3DD71C3E671C3EF71C3AC70AC
+:10705000C3D372C3D472C31773C31873C31A73C371
+:107060001F73C32573C32673C32673C32771C363FA
+:1070700073C34F71C32572C31472BF730000000045
+:10708000000000000010011FFFFFFFFF00000001D3
+:107090000000000650500805000000000D0D2323DD
+:0770A00031004080000101F6
+:1070AC00CDE0700E07CD050032DF700E0CCD050063
+:1070BC007D32DE70113372CD1472119673CD147251
+:1070CC00CD117221EB7322A3703E4032A570CDD24C
+:0270DC0072C977
+:1070E0002A01001103001922087111030019220B53
+:1070F0007111030019220E7111030019221171116F
+:107100001E0019221371C9C30000C30000C3000090
+:10711000C30000C300000E14064605C21A710DC25A
+:1071200018713DC21671C9D511AE73CD1472D1CD8F
+:1071300014721E5BCD3173119673CD1472114A72A5
+:10714000CD14723A8D70B7C8118272CD1472C93ADB
+:10715000DE70FE30FA86713A5C00B7CA62713DC3D8
+:1071600067710E19CD05005F0E2ECD05000603AF29
+:107170000E032183002B7E1F770DC2757105C26F30
+:10718000715E2356EBC90E1BCD0500EB2AA77023B9
+:10719000010000D51A1E0817DA9C7103572B7DB425
+:1071A000CAAD717A1DC29771D113C39371D1696051
+:1071B0003AAA70D603C8293DC2B671C9011404C3E6
+:1071C0006373011405C36373010C06CD637311E788
+:1071D00073C31472010107CD6373C3CE710101083B
+:1071E000CD6373C3CE71010809CD6373C3CE710142
+:1071F000080BCD6373C3CE713A8D70B7CA057201A7
+:10720000010DC30872010109CD637311E373C31447
+:1072100072113072E5D5C50E09CD0500C1D1E1C9A5
+:10722000E1232323E97E1223130B78B1C22572C90F
+:107230000D0A24636F6E6669677572656420666FF8
+:10724000722024207769746820245D0D0A0D0A4E8F
+:10725000756D626572206F66207061636B65747313
+:107260003A0D0A4E756D626572206F662072657404
+:10727000726965733A0D0A46696C65206E616D65C9
+:107280003A240D0A0D0A0D0A527061636B3A0D0A19
+:107290000D0A537061636B3A244350585357542E70
+:1072A00041534D20283130292020372D4A616E2D41
+:1072B0003139393120244350585359532E41534DBD
+:1072C0002028343029202032382D4175672D383957
+:1072D0002024C9C911DB72CD1472C92028436F6EF6
+:1072E00074726F6C2D5F2069732074686520446F21
+:1072F000776E2D4172726F77206B6579206F6E20EB
+:10730000746865205452532D3830206B6579626F54
+:10731000617264290D0A24C9C924E65FC320727B07
+:10732000C97BC97BC9C9C9C9C90E061EFFCD0500E5
+:10733000C90E06CD0500C9DBF6E604CA37737BD358
+:10734000F4C9DBF6E601C8DBF4C9CD4273B7C24A23
+:1073500073C9AFC9D5CD2373A7CA61730E05CD0517
+:1073600000D1C9C511BC73CD1472E17CC61F5FE5A5
+:10737000CD3173E17DC61F5FC331731E08C3317306
+:107380001E20CD31731E08C3317311B873C314723C
+:1073900011B573C314725452532D3830204949200B
+:1073A0004C696665626F61742043502F4D241B3A0F
+:1073B0000D0A0909241B3A240D1B54241B3D240BE0
+:1073C0002400000A2400000C240000082400001BF4
+:1073D0003A240024000000240000001E2400000BBA
+:0B73E0002400001B5924001B54240053
+:0000000000
diff --git a/cpvtm4.hex b/cpvtm4.hex
new file mode 100644 (file)
index 0000000..d8385d7
--- /dev/null
@@ -0,0 +1,81 @@
+:10700000AC0006009972B672C32274C33274C33DD9
+:1070100074C34574C32374C32C74C32474C34F74E2
+:10702000C34D74C30000C30000C38574C37B74C325
+:107030007674C38B74C3F871C3D471C3C871C3BCF5
+:1070400071C3C271C3DD71C3E671C3EF71C3AC70AC
+:10705000C3DB72C3DC72C3DD72C3DE72C3FB72C3F7
+:107060001F73C32573C32673C32174C32771C35E03
+:1070700074C34F71C32572C31472B8743273AD7385
+:107080000000000000100118FFFFFFFF00000001DA
+:107090000000000650500805000000000D0D2323DD
+:0770A00031004080000101F6
+:1070AC00CDE0700E07CD050032DF700E0CCD050063
+:1070BC007D32DE70113372CD1472119174CD147255
+:1070CC00CD117221E47422A3703E4032A570CDCF55
+:0270DC0072C977
+:1070E0002A01001103001922087111030019220B53
+:1070F0007111030019220E7111030019221171116F
+:107100001E0019221371C9C30000C30000C3000090
+:10711000C30000C300000E28064605C21A710DC246
+:1071200018713DC21671C9D511A074CD1472D1CD9C
+:1071300014721E5BCD2C74119174CD1472114A72AD
+:10714000CD14723A8D70B7C8118272CD1472C93ADB
+:10715000DE70FE30FA86713A5C00B7CA62713DC3D8
+:1071600067710E19CD05005F0E2ECD05000603AF29
+:107170000E032183002B7E1F770DC2757105C26F30
+:10718000715E2356EBC90E1BCD0500EB2AA77023B9
+:10719000010000D51A1E0817DA9C7103572B7DB425
+:1071A000CAAD717A1DC29771D113C39371D1696051
+:1071B0003AAA70D603C8293DC2B671C9011404C3E6
+:1071C0005E74011405C35E74010C06CD5E7411E09B
+:1071D00074C31472010107CD5E74C3CE710101083E
+:1071E000CD5E74C3CE71010809CD5E74C3CE71014A
+:1071F000080BCD5E74C3CE713A8D70B7CA057201AB
+:10720000010DC30872010109CD5E7411DC74C31451
+:1072100072113072E5D5C50E09CD0500C1D1E1C9A5
+:10722000E1232323E97E1223130B78B1C22572C90F
+:107230000D0A24636F6E6669677572656420666FF8
+:10724000722024207769746820245D0D0A0D0A4E8F
+:10725000756D626572206F66207061636B65747313
+:107260003A0D0A4E756D626572206F662072657404
+:10727000726965733A0D0A46696C65206E616D65C9
+:107280003A240D0A0D0A0D0A527061636B3A0D0A19
+:107290000D0A537061636B3A244350585357542E70
+:1072A00041534D20283130292020372D4A616E2D41
+:1072B000313939312024435058544D342E41534DE7
+:1072C000202028352920382D4665622D3931243E6D
+:1072D000EED3E9D3E83A3173D3EAC9C9C9C911E594
+:1072E00072CD1472C90D0A4220205472616E736D02
+:1072F0006974206120425245414B24E65FFE42CA38
+:107300000573C32072DBEAE640CA05733E00D3E88A
+:10731000D3EA3E19CD16713A3173D3E8D3EAC97B6B
+:10732000C97BC97BC9C97BD3E93A3173D3E8D3EAB6
+:10733000C96C100331313024222204313230302420
+:107340007777053133342E35243333033135302408
+:1073500044440431383030248888053139323030A3
+:1073600024FFFF0432303030249999043234303015
+:1073700024AAAA0333303024555504333630302440
+:10738000BBBB043438303024CCCC02353024000070
+:1073900003363030246666043732303024DDDD02B7
+:1073A0003735241111043936303024EEEE0D0A2021
+:1073B000202035302020202020203735202020207C
+:1073C000313130202020203133342E35202031350A
+:1073D0003020202020333030202020203630302034
+:1073E0002020313230300D0A20313830302020203A
+:1073F00032303030202020323430302020203336DC
+:1074000030302020203438303020202037323030C7
+:1074100020202039363030202031393230302020C1
+:1074200024C9C9C90E061EFFCD0500C90E06CD052B
+:1074300000C9DBEAE640CA32747BD3EBC9DBEAE67B
+:1074400080C8DBEBC9CD3D74B7C24574C9AFC9D59F
+:10745000CD2373A7CA5C740E05CD0500D1C9C51133
+:10746000B574CD1472E17CC61F5FE5CD2C74E17D4F
+:10747000C61F5FC32C741E08C32C741E20CD2C7431
+:107480001E08C32C7411B274C3147211B074C314E7
+:107490007254616E6479204D6F64656C2049562486
+:1074A0001A0D0A2020202020202020202020202407
+:1074B0001A240D15241B3D240B2400000A2400006F
+:1074C0000C240000082400001A2400000F240000EF
+:1074D0000E2400001E2400000B24000019240000CC
+:0474E000152400006F
+:0000000000
diff --git a/cpvtpt.hex b/cpvtpt.hex
new file mode 100644 (file)
index 0000000..3a7cc74
--- /dev/null
@@ -0,0 +1,65 @@
+:10700000AC0006009972B672C32773C33773C342CC
+:1070100073C34A73C32873C33173C32973C35473CF
+:10702000C35273C30000C30000C38A73C38073C319
+:107030007B73C39073C3F871C3D471C3C871C3BCED
+:1070400071C3C271C3DD71C3E671C3EF71C3AC70AC
+:10705000C3D372C3D472C31773C31873C31A73C371
+:107060001F73C32573C32673C32673C32771C363FA
+:1070700073C34F71C32572C31472B773000000004D
+:10708000000000000010011FFFFFFFFF00000001D3
+:107090000000000650500805000000000D0D2323DD
+:0770A00031004080000101F6
+:1070AC00CDE0700E07CD050032DF700E0CCD050063
+:1070BC007D32DE70113372CD1472119673CD147251
+:1070CC00CD117221E37322A3703E4032A570CDD254
+:0270DC0072C977
+:1070E0002A01001103001922087111030019220B53
+:1070F0007111030019220E7111030019221171116F
+:107100001E0019221371C9C30000C30000C3000090
+:10711000C30000C300000E14064605C21A710DC25A
+:1071200018713DC21671C9D511A973CD1472D1CD94
+:1071300014721E5BCD3173119673CD1472114A72A5
+:10714000CD14723A8D70B7C8118272CD1472C93ADB
+:10715000DE70FE30FA86713A5C00B7CA62713DC3D8
+:1071600067710E19CD05005F0E2ECD05000603AF29
+:107170000E032183002B7E1F770DC2757105C26F30
+:10718000715E2356EBC90E1BCD0500EB2AA77023B9
+:10719000010000D51A1E0817DA9C7103572B7DB425
+:1071A000CAAD717A1DC29771D113C39371D1696051
+:1071B0003AAA70D603C8293DC2B671C9011404C3E6
+:1071C0006373011405C36373010C06CD637311DF90
+:1071D00073C31472010107CD6373C3CE710101083B
+:1071E000CD6373C3CE71010809CD6373C3CE710142
+:1071F000080BCD6373C3CE713A8D70B7CA057201A7
+:10720000010DC30872010109CD637311DB73C3144F
+:1072100072113072E5D5C50E09CD0500C1D1E1C9A5
+:10722000E1232323E97E1223130B78B1C22572C90F
+:107230000D0A24636F6E6669677572656420666FF8
+:10724000722024207769746820245D0D0A0D0A4E8F
+:10725000756D626572206F66207061636B65747313
+:107260003A0D0A4E756D626572206F662072657404
+:10727000726965733A0D0A46696C65206E616D65C9
+:107280003A240D0A0D0A0D0A527061636B3A0D0A19
+:107290000D0A537061636B3A244350585357542E70
+:1072A00041534D20283130292020372D4A616E2D41
+:1072B0003139393120244350585359532E41534DBD
+:1072C0002028343029202032382D4175672D383957
+:1072D0002024C9C911DB72CD1472C92028436F6EF6
+:1072E00074726F6C2D5F2069732074686520446F21
+:1072F000776E2D4172726F77206B6579206F6E20EB
+:10730000746865205452532D3830206B6579626F54
+:10731000617264290D0A24C9C924E65FC320727B07
+:10732000C97BC97BC9C9C9C9C90E061EFFCD0500E5
+:10733000C90E06CD0500C9DBF6E604CA37737BD358
+:10734000F4C9DBF6E601C8DBF4C9CD4273B7C24A23
+:1073500073C9AFC9D5CD2373A7CA61730E05CD0517
+:1073600000D1C9C511B473CD1472E17CC61F5FE5AD
+:10737000CD3173E17DC61F5FC331731E08C3317306
+:107380001E20CD31731E08C3317311B173C3147243
+:1073900011AF73C314725452532D38302049492011
+:1073A000502B542043502F4D240C0D0A0909240C56
+:1073B000240D01241B59241E2400001F2400001D3D
+:1073C0002400001C2400000C2400001124000014E0
+:1073D000240000062400001E2400000224000001F6
+:0373E00024000086
+:0000000000
diff --git a/cpvtrc.hex b/cpvtrc.hex
new file mode 100644 (file)
index 0000000..7b8d884
--- /dev/null
@@ -0,0 +1,103 @@
+:10700000AC000600A572C272C37974C38974C3A8A8
+:1070100074C3C474C37A74C38374C37B74C3F274BB
+:10702000C3CC74C30000C30000C33875C32E75C33E
+:107030002E75C33E75C3F871C3D471C3C871C3BC88
+:1070400071C3C271C3DD71C3E671C3EF71C3AC70AC
+:10705000C32373C32473C32573C32673C37173C35C
+:10706000D773C3F773C3F873C37874C32771C31698
+:1070700075C34F71C33172C31472A575057443741F
+:10708000000000000010011DFFFFFFFF00000001D5
+:107090000000000650500805000000000D0D2323DD
+:0770A00031004080000101F6
+:1070AC00CDE0700E07CD050032DF700E0CCD050063
+:1070BC007D32DE70113F72CD1472116A75CD14726F
+:1070CC00CD117221447622A3703E4032A570CDE0E2
+:0270DC0072C977
+:1070E0002A01001103001922087111030019220B53
+:1070F0007111030019220E7111030019221171116F
+:107100001E0019221371C9C30000C30000C3000090
+:10711000C30000C300000E28064605C21A710DC246
+:1071200018713DC21671C9D5119575CD1472D1CDA6
+:1071300014721E5BCD8374116A75CD147211567270
+:10714000CD14723A8D70B7C8118E72CD1472C93ACF
+:10715000DE70FE30FA86713A5C00B7CA62713DC3D8
+:1071600067710E19CD05005F0E2ECD05000603AF29
+:107170000E032183002B7E1F770DC2757105C26F30
+:10718000715E2356EBC90E1BCD0500EB2AA77023B9
+:10719000010000D51A1E0817DA9C7103572B7DB425
+:1071A000CAAD717A1DC29771D113C39371D1696051
+:1071B0003AAA70D603C8293DC2B671C9011404C3E6
+:1071C0001675011405C31675010C06CD167511CD83
+:1071D00075C31472010107CD1675C3CE7101010884
+:1071E000CD1675C3CE71010809CD1675C3CE7101D8
+:1071F000080BCD1675C3CE713A8D70B7CA057201F2
+:10720000010DC30872010109CD167511C975C314AA
+:1072100072113C72E5D5C51A13FE24CA2872D55FD7
+:107220004FCD8374D1C31772C1D1E1C9E1232323A8
+:10723000E97E1223130B78B1C23172C90D0A24639F
+:107240006F6E6669677572656420666F72202420B0
+:107250007769746820245D0D0A0D0A4E756D6265AC
+:1072600072206F66207061636B6574733A0D0A4E0D
+:10727000756D626572206F662072657472696573E0
+:107280003A0D0A46696C65206E616D653A240D0AF7
+:107290000D0A0D0A527061636B3A0D0A0D0A5370A4
+:1072A00061636B3A244350585357542E41534D2039
+:1072B000283130292020372D4A616E2D313939315E
+:1072C0002024435058544F522E41534D20283529E5
+:1072D000202031302D4A616E2D3139393120202462
+:1072E000E53EF22100FFCD44757DE607EE073C3216
+:1072F00088703289705FCDF8733E0F2E003E0321F7
+:107300000001CD44753E022E02CD44753E052E028D
+:10731000CD44753E062E00CD44753ECA2EFFCD44A9
+:1073200075E1C9C9C9C9112D73CD1472C90D0A42BD
+:1073300020205472616E736D697420612042524541
+:10734000414B0D0A442020446973636F6E6E656380
+:107350007420746865206D6F64656D2028546573B2
+:107360007420707572706F736573206F6E6C7929FD
+:1073700024E65FFE42CAA473FE44CA8073C32C7223
+:10738000118873CD1472AFC9070D0A5465737469FF
+:107390006E67206C696E652064726F707065642022
+:1073A0000D0A0724E53EE8210000CD4475E53E9C2A
+:1073B000217700CD4475E53E1ECD16713E962E0810
+:1073C0002600CD4475E126003E9CCD4475E12600A3
+:1073D0003EE8CD4475E1C97BC97BE67FFE7FC01ED8
+:1073E00008CD89741E20CD89741E08CD8974AFC95B
+:1073F0007BE67FFE0AC0C9C93E076BCD44753E08D7
+:107400006BCD4475C9080431323030240404033193
+:107410003530240202053139323030240808043274
+:10742000343030240505033330302403030434386A
+:107430003030240606023735240101043936303055
+:107440002407070D0A202020203735202020203156
+:107450003530202020203330302020313230302091
+:10746000203234303020203438303020203936304B
+:107470003020313932303024C9C9C90E061EFFCD43
+:107480000500C90E06CD0500C93A6975A7C29D74ED
+:10749000C5E5CDC3FF014BCDC9FFE1C1C9E53E8ABA
+:1074A0002E0263CD4475E1C9E53E8021FEFFCD4447
+:1074B000757CB5CABF743E91210100CD44757CE155
+:1074C000E67FC9C9CDA874B7C2C474C93E802EFC7A
+:1074D00026FFCD44757CFE0A3E00F03EFFC93E0506
+:1074E0002E01CD4475CD1371F53E052E02CD4475A8
+:1074F000F1C9D5CDF073A7CA14753E052E01CD4450
+:10750000750E05CD05003E052E02CD44753E062EB6
+:1075100000CD4475D1C9C511A275CD1472E17DC6E7
+:10752000FF5FE5CD8374E17CC6FF5FC383741E20DB
+:10753000CD83741E08C38374119B75C31472119F8D
+:1075400075C31472C547CDC0FF0F48CDC9FF4DCDDF
+:10755000C9FF4CCDC9FFCDC6FF6F326775CDC6FFE1
+:107560006732687578C1C9000000546F7263682083
+:10757000556E69636F726E20352024204D43502074
+:1075800076657273696F6E20312E30302020202492
+:107590001B212400240C0D0A090924240000000CDE
+:1075A00024001F24000B2400000A240000092400EA
+:1075B00000082400000C2400002400000024000027
+:1075C000001E2400000B2400002400000024000002
+:1075D00000202020202020202020202020202020CB
+:1075E00008080808080808080808080808080824FF
+:1075F0000D2020202020202020202020202020209E
+:10760000202020202020202020202020202020207A
+:10761000202020202020202020202020202020206A
+:10762000202020202020202020202020202020205A
+:10763000202020202020202020202020202020204A
+:0476400020080D24ED
+:0000000000
diff --git a/cpvud.hex b/cpvud.hex
new file mode 100644 (file)
index 0000000..99882af
--- /dev/null
+++ b/cpvud.hex
@@ -0,0 +1,52 @@
+:10700000AC00060000721D72C34C72C35C72C36791
+:1070100072C36F72C34D72C35672C34E72C379721C
+:10702000C37772C30000C30000C39772C38D72C3DD
+:107030008872C39D72C3B871C3B871C3B871C3A954
+:1070400071C3AE71C3B871C3BB71C3C171C3AC703E
+:10705000C33A72C33B72C33C72C33D72C33F72C337
+:107060004472C34A72C34B72C34B72C33371C3D1F0
+:1070700072C33C71C3DB71C3CA7100000000000021
+:10708000000000000010FF1CFFFFFFFF00000001D8
+:107090000000000650500805000000000D0D2323DD
+:0770A00031004080000101F6
+:1070AC00CDEC700E07CD050032EB700E0CCD05004B
+:1070BC007D32EA7011E971CDCA7111A372CDCA711A
+:1070CC0011F971CDCA7111D272CDCA71CDC77121AE
+:0E70DC00257322A3703E4032A570CD3972C9D3
+:1070EC002A0100110300192214711103001922172F
+:1070FC007111030019221A7111030019221D71114B
+:10710C001E0019221F71C9C30000C30000C3000078
+:10711C00C30000C300000E14064605C226710DC242
+:10712C0024713DC22271C9D511FD72CDCA71D1C96C
+:10713C003AEA70FE30FA73713A5C00B7CA4F713D8F
+:10714C00C354710E19CD05005F0E2ECD050006033C
+:10715C00AF0E032183002B7E1F770DC2627105C217
+:10716C005C715E2356EBC90E1BCD0500EB2AA77094
+:10717C0023010000D51A1E0817DA897103572B7DDD
+:10718C00B4CA9A717A1DC28471D113C38071D1694A
+:10719C00603AAA70D603C8293DC2A371C91E20C388
+:1071AC0056721E20CD56721E25C35672C3C771115E
+:1071BC001173C3CA71111B73C3CA7111E671E5D582
+:1071CC00C50E09CD0500C1D1E1C9E1232323E97E18
+:1071DC001223130B78B1C2DB71C90D0A24636F6ED5
+:1071EC006669677572656420666F72202420776902
+:1071FC00746820244350585357542E41534D202823
+:10720C003130292020372D4A616E2D31393931200A
+:10721C00244350585359532E41534D202834302970
+:10722C00202032382D4175672D38392024C9C9C921
+:10723C00C9C924E65FC3D6717BC97BC97BC9C9C9DF
+:10724C00C9C90E061EFFCD0500C90E06CD0500C925
+:10725C00DBFFE601CA5C727BD3FEC9DBFFE602C82A
+:10726C00DBFEC9CD6772B7C26F72C9AFC9D5CD4845
+:10727C0072A7CA86720E05CD0500D1C91E08C35669
+:10728C00721E20CD56721E08C35672110C73C3CADF
+:10729C007111E671C3CA714D6963726F446563699C
+:1072AC0073696F6E2049244350585644552E4153F0
+:1072BC004D2020283629202031322D4F63742D315A
+:1072CC003939302024C947656E65726963202844BA
+:1072DC00756D622920435254205465726D696E613C
+:1072EC006C20747970652073656C656374656420BB
+:1072FC00240D0A5374617274696E67202E2E2E242D
+:10730C005E550D0A240D0A525061636B3A20240D10
+:09731C000A535061636B3A20240E
+:0000000000
diff --git a/cpvusm.hex b/cpvusm.hex
new file mode 100644 (file)
index 0000000..ad15c91
--- /dev/null
@@ -0,0 +1,53 @@
+:10700000AC00060000721D72C34C72C35C72C36791
+:1070100072C36F72C34D72C35672C34E72C379721C
+:10702000C37772C30000C30000C39772C38D72C3DD
+:107030008872C39D72C3B871C3B871C3B871C3A954
+:1070400071C3AE71C3B871C3BB71C3C171C3AC703E
+:10705000C33A72C33B72C33C72C33D72C33F72C337
+:107060004472C34A72C34B72C34B72C33371C3E5DC
+:1070700072C33C71C3DB71C3CA7100000000000021
+:10708000000000000010FF1CFFFFFFFF00000001D8
+:107090000000000650500805000000000D0D2323DD
+:0770A00031004080000101F6
+:1070AC00CDEC700E07CD050032EB700E0CCD05004B
+:1070BC007D32EA7011E971CDCA7111A372CDCA711A
+:1070CC0011F971CDCA7111E672CDCA71CDC771219A
+:0E70DC00397322A3703E4032A570CD3972C9BF
+:1070EC002A0100110300192214711103001922172F
+:1070FC007111030019221A7111030019221D71114B
+:10710C001E0019221F71C9C30000C30000C3000078
+:10711C00C30000C300000E28064605C226710DC22E
+:10712C0024713DC22271C9D5111173CDCA71D1C957
+:10713C003AEA70FE30FA73713A5C00B7CA4F713D8F
+:10714C00C354710E19CD05005F0E2ECD050006033C
+:10715C00AF0E032183002B7E1F770DC2627105C217
+:10716C005C715E2356EBC90E1BCD0500EB2AA77094
+:10717C0023010000D51A1E0817DA897103572B7DDD
+:10718C00B4CA9A717A1DC28471D113C38071D1694A
+:10719C00603AAA70D603C8293DC2A371C91E20C388
+:1071AC0056721E20CD56721E25C35672C3C771115E
+:1071BC002573C3CA71112F73C3CA7111E671E5D55A
+:1071CC00C50E09CD0500C1D1E1C9E1232323E97E18
+:1071DC001223130B78B1C2DB71C90D0A24636F6ED5
+:1071EC006669677572656420666F72202420776902
+:1071FC00746820244350585357542E41534D202823
+:10720C003130292020372D4A616E2D31393931200A
+:10721C00244350585359532E41534D202834302970
+:10722C00202032382D4175672D38392024C9C9C921
+:10723C00C9C924E65FC3D6717BC97BC97BC9C9C9DF
+:10724C00C9C90E061EFFCD0500C90E06CD0500C925
+:10725C00DB01E604CA5C727BD300C9DB01E602C821
+:10726C00DB00C9CD6772B7C26F72C9AFC9D5CD4843
+:10727C0072A7CA86720E05CD0500D1C91E08C35669
+:10728C00721E20CD56721E08C35672112073C3CACB
+:10729C007111E671C3CA71552E20532E204D6963AE
+:1072AC00726F53616C6573207573696E67207072B1
+:1072BC00696E74657220706F727424435058564412
+:1072CC00552E41534D2020283629202031322D4F68
+:1072DC0063742D313939302024C947656E65726964
+:1072EC0063202844756D62292043525420546572E2
+:1072FC006D696E616C20747970652073656C656363
+:10730C0074656420240D0A5374617274696E67206D
+:10731C002E2E2E245E550D0A240D0A525061636BDD
+:0D732C003A20240D0A535061636B3A20246F
+:0000000000
diff --git a/cpvvec.hex b/cpvvec.hex
new file mode 100644 (file)
index 0000000..55f04b1
--- /dev/null
@@ -0,0 +1,60 @@
+:10700000AC0006009972B672C3E572C3F572C30094
+:1070100073C30873C3E672C3EF72C3E772C312731C
+:10702000C31073C30000C30000C34373C33973C3E9
+:107030003373C34973C3F871C3D471C3C871C3BC7C
+:1070400071C3C271C3DD71C3E671C3EF71C3AC70AC
+:10705000C3D372C3D472C3D572C3D672C3D872C33A
+:10706000DD72C3E372C3E472C3E472C32771C32148
+:1070700073C34F71C32572C314726F730000000095
+:10708000000000000010017EFFFFFFFF0000000174
+:107090000000000650500805000000000D0D2323DD
+:0770A00031004080000101F6
+:1070AC00CDE0700E07CD050032DF700E0CCD050063
+:1070BC007D32DE70113372CD1472114F73CD147298
+:1070CC00CD1172219B7322A3703E4032A570CDD29C
+:0270DC0072C977
+:1070E0002A01001103001922087111030019220B53
+:1070F0007111030019220E7111030019221171116F
+:107100001E0019221371C9C30000C30000C3000090
+:10711000C30000C300000E14064605C21A710DC25A
+:1071200018713DC21671C9D5115F73CD1472D1CDDE
+:1071300014721E5BCDEF72114F73CD1472114A722F
+:10714000CD14723A8D70B7C8118272CD1472C93ADB
+:10715000DE70FE30FA86713A5C00B7CA62713DC3D8
+:1071600067710E19CD05005F0E2ECD05000603AF29
+:107170000E032183002B7E1F770DC2757105C26F30
+:10718000715E2356EBC90E1BCD0500EB2AA77023B9
+:10719000010000D51A1E0817DA9C7103572B7DB425
+:1071A000CAAD717A1DC29771D113C39371D1696051
+:1071B0003AAA70D603C8293DC2B671C9011404C3E6
+:1071C0002173011405C32173010C06CD217311979E
+:1071D00073C31472010107CD2173C3CE710101087D
+:1071E000CD2173C3CE71010809CD2173C3CE7101C6
+:1071F000080BCD2173C3CE713A8D70B7CA057201E9
+:10720000010DC30872010109CD2173119373C314D9
+:1072100072113072E5D5C50E09CD0500C1D1E1C9A5
+:10722000E1232323E97E1223130B78B1C22572C90F
+:107230000D0A24636F6E6669677572656420666FF8
+:10724000722024207769746820245D0D0A0D0A4E8F
+:10725000756D626572206F66207061636B65747313
+:107260003A0D0A4E756D626572206F662072657404
+:10727000726965733A0D0A46696C65206E616D65C9
+:107280003A240D0A0D0A0D0A527061636B3A0D0A19
+:107290000D0A537061636B3A244350585357542E70
+:1072A00041534D20283130292020372D4A616E2D41
+:1072B0003139393120244350585359532E41534DBD
+:1072C0002028343029202032382D4175672D383957
+:1072D0002024C9C9C9C9C924E65FC320727BC97B00
+:1072E000C97BC9C9C9C9C90E061EFFCD0500C90E93
+:1072F00006CD0500C9DB05E601CAF5727BD304C9DA
+:10730000DB05E602C8DB04C9CD0073B7C20873C948
+:10731000AFC9D5CDE172A7CA1F730E05CD0500D147
+:10732000C9050DC51E1BCDEF72D1D5CDEF72D15A57
+:10733000C3EF72116A73C314721E20CDEF721E0860
+:10734000C3EF72116773C31472116573C31472565D
+:107350006563746F72204772617068696373240497
+:107360000D0A09092404240D1124082008082415F5
+:107370002400000A2400001A240000240000002435
+:10738000000000240000002400000002240000157A
+:0B739000240000102400001124000065
+:0000000000
diff --git a/cpvxer.hex b/cpvxer.hex
new file mode 100644 (file)
index 0000000..521773c
--- /dev/null
@@ -0,0 +1,86 @@
+:10700000AC0006009972D072C38B74C39A74C3A586
+:1070100074C3AD74C38B74C39474C38C74C3B774DA
+:10702000C3B574C30000C30000C3EB74C3E174C3F1
+:10703000DB74C3F174C3F871C3D471C3C871C3BC2A
+:1070400071C3C271C3DD71C3E671C3EF71C3AC70AC
+:10705000C30373C30473C30E73C30F73C35773C3E4
+:107060009773C39973C39A73C38A74C32771C3C3D5
+:1070700074C34F71C32572C3147214759E7319744F
+:10708000000000000010011DFFFFFFFF00000001D5
+:107090000000000650500805000000000D0D2323DD
+:0770A00031004080000101F6
+:1070AC00CDE0700E07CD050032DF700E0CCD050063
+:1070BC007D32DE70113372CD147211F774CD1472EF
+:1070CC00CD117221407522A3703E4032A570CDEBDC
+:0270DC0072C977
+:1070E0002A01001103001922087111030019220B53
+:1070F0007111030019220E7111030019221171116F
+:107100001E0019221371C9C30000C30000C3000090
+:10711000C30000C300000E19064605C21A710DC255
+:1071200018713DC21671C9D5110175CD1472D1CD3A
+:1071300014721E5BCD947411F774CD1472114A72DF
+:10714000CD14723A8D70B7C8118272CD1472C93ADB
+:10715000DE70FE30FA86713A5C00B7CA62713DC3D8
+:1071600067710E19CD05005F0E2ECD05000603AF29
+:107170000E032183002B7E1F770DC2757105C26F30
+:10718000715E2356EBC90E1BCD0500EB2AA77023B9
+:10719000010000D51A1E0817DA9C7103572B7DB425
+:1071A000CAAD717A1DC29771D113C39371D1696051
+:1071B0003AAA70D603C8293DC2B671C9011404C3E6
+:1071C000C374011405C3C374010C06CDC374113C10
+:1071D00075C31472010107CDC374C3CE71010108D8
+:1071E000CDC374C3CE71010809CDC374C3CE710180
+:1071F000080BCDC374C3CE713A8D70B7CA05720146
+:10720000010DC30872010109CDC374113875C3148F
+:1072100072113072E5D5C50E09CD0500C1D1E1C9A5
+:10722000E1232323E97E1223130B78B1C22572C90F
+:107230000D0A24636F6E6669677572656420666FF8
+:10724000722024207769746820245D0D0A0D0A4E8F
+:10725000756D626572206F66207061636B65747313
+:107260003A0D0A4E756D626572206F662072657404
+:10727000726965733A0D0A46696C65206E616D65C9
+:107280003A240D0A0D0A0D0A527061636B3A0D0A19
+:107290000D0A537061636B3A244350585357542E70
+:1072A00041534D20283130292020372D4A616E2D41
+:1072B0003139393120244350585359532E41534DBD
+:1072C00020283335292030312D4465632D3836246C
+:1072D0004350584242492E41534D20283429202002
+:1072E000372D4A616E2D313939312411F9720E0A68
+:1072F0001A13D3060DC2F072C91818044401000312
+:10730000C105EAC9110B73CD1472C90D0A24C91144
+:107310001673CD1472C90D0A4220205472616E7327
+:107320006D6974206120425245414B0D0A4820206E
+:1073300048616E677570207573696E67204454529A
+:107340000D0A572020576970652073637265656E5A
+:1073500020636C65617224E65FFE42CA7273FE4868
+:10736000CA6B73FE57CAF174C32072160A1EFFC39C
+:107370008173169A1E1E3E01D306DB06E601CA760D
+:10738000733E05D3063E6AB2D3067BCD16713E0529
+:10739000D3063EEAD306C97BC9C97BD300C9100313
+:1073A00031313024020204313230302407070531F4
+:1073B00033342E35240303033135302404040431DF
+:1073C000383030240808053139323030240F0F04AA
+:1073D000323030302409090432343030240A0A03B0
+:1073E0003330302405050433363030240B0B04349D
+:1073F000383030240C0C0235302400000336303095
+:107400002406060437323030240D0D0237352401AE
+:10741000010439363030240E0E0D0A20202035307C
+:1074200020202020203735202020203131302020FE
+:1074300020203133342E35202031353020202020BB
+:1074400033303020202020363030202020313230A0
+:10745000300D0A20313830302020203230303020BA
+:10746000202032343030202020333630302020208D
+:107470003438303020202037323030202020393648
+:1074800030302020313932303024C9C90E061EFF79
+:10749000CD0500C90E06CD0500C9DB06E604CA9A73
+:1074A000747BD304C9DB06E601C8DB04C9CDA5742F
+:1074B000B7C2AD74C9AFC9D5A7CAC1740E05CD0591
+:1074C00000D1C9C5110C75CD1472E17CC61F5FE5F2
+:1074D000CD9474E17DC61F5FC39474110F75C314FE
+:1074E000721E20CD94741E08C39474110975C314C0
+:1074F00072110775C314725865726F782038323074
+:10750000241A0D0A0909241A240D18241B3D2408E5
+:10751000200808240B2400000A2400000C2400008A
+:10752000082400001A2400002400000024000000A9
+:107530001E2400000B240000112400001824000069
+:0000000000
diff --git a/cpvz00.hex b/cpvz00.hex
new file mode 100644 (file)
index 0000000..9fb5ed9
--- /dev/null
@@ -0,0 +1,61 @@
+:10700000AC0006009972B672C3E672C3F672C30191
+:1070100073C30973C3E772C3F072C3E872C3157315
+:10702000C31173C30000C30000C34B73C34173C3D8
+:107030003C73C35173C3F871C3D471C3C871C3BC6B
+:1070400071C3C271C3DD71C3E671C3EF71C3AC70AC
+:10705000C3D372C3D472C3D572C3D672C3D872C33A
+:10706000DD72C3E372C3E472C3E572C32771C32444
+:1070700073C34F71C32572C3147284730000000080
+:10708000000000000010001CFFFFFFFF00000001D7
+:107090000000000650500805000000000D0D2323DD
+:0770A00031004080000101F6
+:1070AC00CDE0700E07CD050032DF700E0CCD050063
+:1070BC007D32DE70113372CD1472115773CD147290
+:1070CC00CD117221B07322A3703E4032A570CDD287
+:0270DC0072C977
+:1070E0002A01001103001922087111030019220B53
+:1070F0007111030019220E7111030019221171116F
+:107100001E0019221371C9C30000C30000C3000090
+:10711000C30000C300000E28064605C21A710DC246
+:1071200018713DC21671C9D5116F73CD1472D1CDCE
+:1071300014721E5BCDF072115773CD1472114A7226
+:10714000CD14723A8D70B7C8118272CD1472C93ADB
+:10715000DE70FE30FA86713A5C00B7CA62713DC3D8
+:1071600067710E19CD05005F0E2ECD05000603AF29
+:107170000E032183002B7E1F770DC2757105C26F30
+:10718000715E2356EBC90E1BCD0500EB2AA77023B9
+:10719000010000D51A1E0817DA9C7103572B7DB425
+:1071A000CAAD717A1DC29771D113C39371D1696051
+:1071B0003AAA70D603C8293DC2B671C9011404C3E6
+:1071C0002473011405C32473010C06CD247311AC80
+:1071D00073C31472010107CD2473C3CE710101087A
+:1071E000CD2473C3CE71010809CD2473C3CE7101C0
+:1071F000080BCD2473C3CE713A8D70B7CA057201E6
+:10720000010DC30872010109CD247311A873C314C1
+:1072100072113072E5D5C50E09CD0500C1D1E1C9A5
+:10722000E1232323E97E1223130B78B1C22572C90F
+:107230000D0A24636F6E6669677572656420666FF8
+:10724000722024207769746820245D0D0A0D0A4E8F
+:10725000756D626572206F66207061636B65747313
+:107260003A0D0A4E756D626572206F662072657404
+:10727000726965733A0D0A46696C65206E616D65C9
+:107280003A240D0A0D0A0D0A527061636B3A0D0A19
+:107290000D0A537061636B3A244350585357542E70
+:1072A00041534D20283130292020372D4A616E2D41
+:1072B0003139393120244350584845412E41534DEE
+:1072C00020283429202033312D4175672D3139385C
+:1072D0003924C9C9C9C9C924E65FC320727BC97BE7
+:1072E000C97BC9C9C9C9C9C90E061EFFCD0500C9D8
+:1072F0000E06CD0500C9DBEDE601CAF6727BD3ECC4
+:10730000C9DBEDE602C8DBECC9CD0173B7C2097376
+:10731000C9CD1371C9D5CDE172A7CA22730E05CDAF
+:107320000500D1C9C5118173CD1472E17CC61F5F00
+:10733000E5CDF072E17DC61F5FC3F0721E08C3F099
+:10734000721E20CDF0721E08C3F072117D73C3143B
+:1073500072117873C3147248656174682F5A656E30
+:10736000697468205A2D3130302043502F4D241B32
+:10737000481B4A0D0A0909241B481B4A240D1B4BB4
+:10738000241B59241B4124001B4224001B432400BE
+:107390001B4424001B4524001B4624001B472400DB
+:1073A0001B4824001B4924001B4A24001B4B2400BB
+:0000000000
diff --git a/cpvz80.hex b/cpvz80.hex
new file mode 100644 (file)
index 0000000..561778a
--- /dev/null
@@ -0,0 +1,52 @@
+:10700000AC0006000C722972C35672C36372C36867
+:1070100072C36D72C35672C35F72C35772C3777205
+:10702000C37572C30000C30000C39572C38B72C3E3
+:107030008672C39B72C3B871C3B871C3B871C3A958
+:1070400071C3AE71C3B871C3BB71C3C171C3AC703E
+:10705000C34472C34572C34672C34772C34872C306
+:107060004D72C35372C35472C35572C33371C3D0CC
+:1070700072C33C71C3E771C3CA7100000000000015
+:10708000000000000010FF1CFFFFFFFF00000001D8
+:107090000000000650500805000000000D0D2323DD
+:0770A00031004080000101F6
+:1070AC00CDEC700E07CD050032EB700E0CCD05004B
+:1070BC007D32EA7011F571CDCA7111A172CDCA7110
+:1070CC00110572CDCA7111D172CDCA71CDC77121A2
+:0E70DC00247322A3703E4032A570CD4372C9CA
+:1070EC002A0100110300192214711103001922172F
+:1070FC007111030019221A7111030019221D71114B
+:10710C001E0019221F71C9C30000C30000C3000078
+:10711C00C30000C300000E02064605C226710DC254
+:10712C0024713DC22271C9D511FC72CDCA71D1C96D
+:10713C003AEA70FE30FA73713A5C00B7CA4F713D8F
+:10714C00C354710E19CD05005F0E2ECD050006033C
+:10715C00AF0E032183002B7E1F770DC2627105C217
+:10716C005C715E2356EBC90E1BCD0500EB2AA77094
+:10717C0023010000D51A1E0817DA897103572B7DDD
+:10718C00B4CA9A717A1DC28471D113C38071D1694A
+:10719C00603AAA70D603C8293DC2A371C91E20C388
+:1071AC005F721E20CD5F721E25C35F72C3C7711143
+:1071BC001073C3CA71111A73C3CA7111F271E5D578
+:1071CC00C51A13FE24CADE71D55F4FCD5F72D1C3D1
+:1071DC00CD71C1D1E1C9E1232323E97E1223130B25
+:1071EC0078B1C2E771C90D0A24636F6E6669677561
+:1071FC0072656420666F722024207769746820247D
+:10720C004350585357542E41534D20283130292088
+:10721C0020372D4A616E2D31393931202443505895
+:10722C005A38302E41534D20202831292020322D20
+:10723C004465632D383724C9C9C9C9C9E65FC3E29F
+:10724C00717BC97BC97BC9C9C9C9C90E061EFFCDD3
+:10725C000500C94BC319714BCD12FFC9CD15FFA742
+:10726C00C9CD6872B7C26D72C9AFC9D5CD5172A7FD
+:10727C00CA84720E05CD0500D1C91E08C35F721EEB
+:10728C0020CD5F721E08C35F72110B73C3CA7111DC
+:10729C00F271C3CA715A38304D55206F6E20494275
+:1072AC004D20504320244350585644552E41534DA5
+:1072BC002020283629202031322D4F63742D31396E
+:1072CC0039302024C947656E65726963202844757E
+:1072DC006D622920435254205465726D696E616C45
+:1072EC0020747970652073656C6563746564202403
+:1072FC000D0A5374617274696E67202E2E2E245EF3
+:10730C00550D0A240D0A525061636B3A20240D0A64
+:08731C00535061636B3A202419
+:0000000000
diff --git a/cpxapp.asm b/cpxapp.asm
new file mode 100644 (file)
index 0000000..be4abd5
--- /dev/null
@@ -0,0 +1,749 @@
+IF NOT lasm
+.printx * CPXAPP.ASM *
+ENDIF  ;NOT lasm
+;       KERMIT - (Celtic for "FREE")
+;
+;       This is the CP/M-80 implementation of the Columbia University
+;       KERMIT file transfer protocol.
+;
+;       Version 4.0
+;
+;       Copyright June 1981,1982,1983,1984,1985
+;       Columbia University
+;
+; Originally written by Bill Catchings of the Columbia University Center for
+; Computing Activities, 612 W. 115th St., New York, NY 10025.
+;
+; Contributions by Frank da Cruz, Daphne Tzoar, Bernie Eiben,
+; Bruce Tanner, Nick Bush, Greg Small, Kimmo Laaksonen, Jeff Damens, and many
+; others.
+;
+;       This file contains the system-dependent code and data for KERMIT.
+;       It will be probably be broken into independent files to generate
+;       overlays for the various systems, one or more overlay possible
+;       from each file.  For now, we will leave it in one piece.
+;
+; revision history:
+; edit 2, 22 July, 1987 by OBSchou.  Massaged code to work with CPXCOM.ASM
+;
+; edit 1, 2nd June, 1987 by OBSchou.  Extracted all Apple related code.
+;
+;\f
+;      Family is the string used in VERSION to say which of several 
+;       smaller overlay files are used.  These are (will be) derived from 
+;       the juge CPXSYS.ASM file, in which case we will never get here.  
+;       Just a Dollar, but put a sting in for a family of machines.
+;
+family:        db      'CPXAPP.ASM (2)  22-jul-87$'    ; Used for family versions....
+;
+       
+IF apple
+.printx        * Assembling KERMIT-80 for the Apple ][ *
+ENDIF;apple
+IF apmmdm
+.printx        *   with Z80 Softcard & Micromodem II   *
+ENDIF;apmmdm
+IF ap6551
+.printx        *     with Z80 Softcard & 6551 ACIA     *
+ENDIF;ap6551
+IF ap6850;[32]
+.printx        *     with Z80 Softcard & 6850 ACIA     *
+ENDIF;ap6850 [32]
+IF apcps;[22]
+.printx        *     with Softcard & CPS Multifunction card     *
+ENDIF;apcps
+
+;
+
+IF ap6551 OR ap6850 OR apcps;[9] [14]
+                               ;jb eg. Apple SSC, Videx PSIO, Basis 108
+apslot EQU     2               ;jb set equal to slot containing serial card
+                               ;jb  set to 1 for Basis built-in port
+ENDIF;jb ap6551 [9] apcps ap6850 [14]
+IF ap6850      ;[14] offset in slot I/O space for ACIA registers
+               ;e.g. PACT=00,01: AIO-I=05,04: AIO-II=0D,0C: Aristocard=0B,0A
+apdat  EQU     0DH             ;data reg.=0E080h+apslot*10h*apdat
+apstat EQU     0CH             ;comm/stat reg.=0E080h+apslot*10h+apstat
+ENDIF;ap6850
+
+
+IF apmmdm
+;APPLE Slot 2 contains Micromodem II.
+MNPORT EQU     0E0A7H  ;Communications Port.
+mnprts EQU     0E0A6H  ;Communications Port Status.
+mnmodm EQU     0E0A5H  ;Modem Control Port.
+orgmod EQU     8EH     ;Modem Originate Mode.
+OUTPUT EQU     02H     ;Output Buffer Empty.
+INPUT  EQU     01H     ;Input Register Full.
+apinc1 EQU     03H     ;First Init Character for 6850 ACIA (Reset)
+apinc2 EQU     11H     ;Second Init Character for ACIA (8-bits)
+apoffh EQU     80H     ;Set if OFFHOOK
+AP300  EQU     1       ;300 Baud
+z80    EQU     TRUE    ;Z80 Softcard
+ENDIF;apmmdm
+
+IF ap6551              ;jb
+mnport EQU     0E088H+(10H*apslot)     ;jb Communications Port.
+mnprts EQU     0E089H+(10H*apslot)     ;jb Communications Port Status.
+mnprtc EQU     0E08BH+(10H*apslot)     ;jb Communications Control
+mnprtm EQU     0E08AH+(10H*apslot)     ;jb Communications Master (command)
+output EQU     10H             ;jb Output Buffer Empty.
+input  EQU     08H             ;jb Input Register Full.
+mncinb EQU     18H             ;jb Control Port Initialization Byte
+                               ;jb  (8-bit, no parity, 1-stop, 1200 baud)
+mnminb EQU     0BH             ;jb Master Port Initialization Byte
+                               ;jb  (DTR, RTS, no interrupts)
+z80    EQU     TRUE            ;Z80 Softcard
+ENDIF;ap6551
+
+IF ap6850 ;[32]
+mnport EQU     0E080H+(10H*apslot)+apdat       ;Communications Port.
+mnprts EQU     0E080H+(10H*apslot)+apstat      ;Communications Port Status.
+OUTPUT EQU     02H             ;Output Buffer Empty.
+INPUT  EQU     01H             ;Input Register Full.
+apinc1 EQU     03H             ;First Init Character for 6850 ACIA (Reset)
+apinc2 EQU     15H             ;Second Init Character for ACIA (8 data, 1 stop bit)
+z80    EQU     TRUE            ;Z80 Softcard
+ENDIF;[32] ap6850
+
+IF apcps               ;[22]
+mnport EQU     0E0FAH+(100H*apslot)    ; Communications Port.
+mnprts EQU     0E0FBH+(100H*apslot)    ; Communications Port Status.
+mnprtc EQU     0E0FEH+(100H*apslot)    ; Communications Control
+output EQU     1               ; Output Buffer Empty.
+input  EQU     2               ; Input Register Full.
+TxEmpty        EQU     04h             ; Transmitter empty flag
+apmod1 EQU     4EH             ; Mode Byte 1 (1 stop, no parity,8-bit, 16x)
+                               ; Mode Byte 2 is speed control byte
+apcmd  EQU     37H             ; Command Byte (RTS,Error reset,RxE,DTR,TxE)
+z80    EQU     TRUE            ;Z80 Softcard
+ENDIF;[22] apcps
+
+IF apple 
+defesc EQU     ']'-100O        ;The default escape character.
+ENDIF;apple 
+
+
+; default to VT52-EMULATION ON.
+
+vtval  EQU     1
+
+
+
+sysxin:                ; continuation of systemm dependent initialisation code
+
+IF ap6551
+       lda     mnprtc          ; read control port
+       ani     0fH             ; extract low order nybble
+       sta     speed           ; store as comm line speed
+       sta     speed+1         ;  (16 bits, to match speed table entries)
+       mvi     a,mnminb        ;jb initialization routine
+       sta     mnprts          ;jb
+       sta     mnprtm          ;jb initialize master (command) port
+       mvi     a,mncinb        ;jb
+       sta     mnprtc          ;jb initialize control port
+ENDIF;ap6551
+
+IF ap6850 ;[32]
+       mvi     a,apinc1        ;Init ACIA
+       sta     mnprts
+       mvi     a,apinc2        ;Set ACIA bits per character
+       sta     mnprts
+ENDIF;[32] ap6850
+
+IF apcps               ;[22]
+       lxi     h,3737h         ;Default 1200 baud
+       shld    speed           ;Store as port speed
+       xchg
+       call    sysspd          ;Initialise the port
+ENDIF;[22] apcps
+
+       ret                     ; return from system-dependent routine
+
+;\f
+
+;
+;       system-dependent termination processing
+;       If we've changed anything, this is our last chance to put it back.
+sysexit:
+
+       ret
+
+;
+;       system-dependent processing for start of CONNECT command
+;
+syscon:
+IF apmmdm
+       call    ckdial          ;See if dialing is required.
+        jmp    kermit          ;Go to command loop if aborted.
+ENDIF;apmmdm
+
+       ret
+
+conmsg:                ; Messages printed when entering transparent (CONNECT) mode:
+;\f
+
+IF apmmdm
+;This code was mostly taken from
+;       APMODEM.ASM V2.1
+;       Based on MODEM.ASM by Ward Christensen
+;       Modified for the Apple ][ by Gordon Banks 1-Jan-81
+;       Micromodem ][ dialer option by Dav Holle  2-Feb-81
+;       Code modified for KERMIT by Scott Robinson 14-Oct-82
+;
+;Come here to see if we need to dial a number.
+;
+ckdial:        lda     mnport          ;access the data port
+       lda     mnprts          ;check status
+       ani     4               ;do we already have carrier?
+       jz      rskp            ;Yes, just continue
+       xra     a               ;Hangup Phone for starters
+       sta     mnmodm
+       lxi     b,1000          ;Delay for a second
+       call    delay
+       mvi     a,8FH           ;orgmod+ap300+apoffh
+       sta     holdd           ;storing mode for after dialing
+       mvi     A,8DH           ;Go Offhook to start dialing sequence
+       sta     mnmodm
+       mvi     a,apinc1        ;Init ACIA
+       sta     mnport
+       mvi     a,apinc2        ;Set ACIA bits per character
+       sta     mnport
+
+       lxi     b,2500          ;wait 2.5 seconds for dial tone
+       call    delay
+       lxi     d,dialms        ;Ask the user for the number
+       call    prtstr
+;
+gtdial:        mvi     c,conin         ;Get a character
+       call    bdos
+       push    psw             ;save it
+       cpi     30H             ;is it big enough to dial?
+       jc      dialed          ;no
+       cpi     3AH             ;is it too big to dial?
+       jnc     dialed          ;yes
+       ani     0FH             ;ok, it's a digit, get its value
+       jnz     dialnz          ;dial nonzero digits as-is
+       mvi     A,10            ;dial zero as ten
+;
+dialnz:        mov     e,a             ;count pulses in E-reg
+dopuls:        mvi     a,0DH           ;put it on-hook
+       sta     mnmodm
+       lxi     b,61            ;61-millisec pulse
+       call    delay
+       mvi     a,8DH           ;take it off-hook again...
+       sta     mnmodm
+       lxi     b,39            ;39-millisec delay between pulses
+       call    delay
+       dcr     e               ;any more pulses to do?
+       jnz     dopuls          ;yep, do 'em
+       lxi     b,600           ;delay 600 msecs between digits
+       call    delay
+;
+dialed:        pop     psw             ;get back the char
+       cpi     cr              ;do we have a CR (done dialing)?
+       jnz     gtdial          ;no, keep on dialin'
+       lxi     d,dialm2
+       call    prtstr
+
+tictoc:        mvi     c,dconio        ;Direct console input.
+       mvi     e,0FFH
+       call    bdos
+       ora     a               ;Have a charcter?
+       jnz     nodial          ;If so we abort
+       lda     mnport          ;access the data port
+       lda     mnprts          ;get modem status
+       ani     4               ;carrier?
+       jnz     tictoc          ;No
+;
+       lda     holdd           ;get the old modem control byte
+       sta     mnmodm          ;turn our carrier on
+
+       lxi     d,dialm3
+       call    prtstr
+       jmp     rskp
+nodial:        xra     a               ;Hangup the modem.
+       sta     mnmodm
+       ret                     ;Return to abort the command.
+;
+holdd: db      0               ;Modem setup code
+dialms:        DB      'Number to Dial: $'
+dialm2:        DB      CR,LF,'Awaiting Carrier....(any key aborts)$'
+dialm3:        DB      cr,lf,'Connected.',CR,LF,'$'
+;
+;DELAY wait for the number of millisecs in B,C
+;
+delay: push    b               ;save B,C
+       push    d               ;save D,E
+       inr     b               ;bump B for later DCR
+;
+delay1:        mvi     e,126           ;delay count for 1 millisec (Apple Z80
+                               ;clock=2.041MHz)
+;
+delay2:        dcr     e               ;count
+       jnz     delay2          ;down
+;
+       dcr     c               ;more millisecs?
+       jnz     delay1          ;yes
+       dcr     b               ;no - more in hi byte?
+       jnz     delay1          ;yes
+       pop     d               ;no,    restore D,E
+       pop     b               ;       restore B,C
+       ret
+ENDIF;apmmdm
+;\f
+
+;
+;       syscls - system-dependent close routine
+;       called when exiting transparent session.
+;
+syscls:
+       ret
+;\f
+
+;
+;       sysinh - help for system-dependent special functions.
+;       called in response to <escape>?, after listing all the
+;       system-independent escape sequences.
+;
+sysinh:
+IF apmmdm OR apcps OR ap6850 ;
+       lxi     d,inhlps        ; we got options...
+       call    prtstr          ; print them.
+ENDIF  ;apmmdm OR apcps OR ap6850
+
+       ret
+
+
+;additional, system-dependent help for transparent mode
+; (two-character escape sequences)
+inhlps:
+
+IF apcps OR ap6850
+       db      cr,lf,'B  Transmit a BREAK'
+ENDIF;apcps OR ap6850
+
+IF apmmdm 
+       db      cr,lf,'D  Drop the line'
+ENDIF;apmmdm 
+
+       db      '$'                     ;[hh] table terminator
+
+;
+;       sysint - system dependent special functions
+;       called when transparent escape character has been typed;
+;       the second character of the sequence is in A (and in B).
+;       returns:
+;       non-skip: sequence has been processed
+;       skip:   sequence was not recognized
+sysint:        ani     137O            ; convert lower case to upper, for testing...
+IF apmmdm
+       cpi     'D'             ;Disconnect Modem?
+       jnz     intc00          ;No.
+       xra     a               ;Yes, hangup the modem
+       sta     mnmodm
+       ret                     ; command has been executed
+intc00:
+ENDIF;apmmdm
+
+IF ap6850 OR apcps             ; [22] [25] ... some more
+       cpi     'B'             ; send break?
+       jz      sendbr          ; yes, go do it.  return nonskip when through.
+ENDIF;[22] ap6850 OR apcps 
+
+       jmp     rskp            ; take skip return - command not recognized.
+
+
+;\f
+
+IF ap6850 ;[32]
+sendbr:
+;
+;       Ensure that the transmitter has finished sending buffered chars
+sndbr1:        lda     mnprts          ; get UART status
+       ani     output          ; everything sent?
+       jz      sndbr1          ; no, wait a bit more
+;
+; Begin sending a break
+       mvi     a,apinc2
+       ori     60h             ;transmit break level, CTS high
+       sta     mnprts
+;
+; Wait for 250 milliseconds (using hundredths second delay routine)
+       mvi     a,25
+       call    delay
+;
+; Resume normal operation
+       mvi     a,apinc2
+       sta     mnprts
+;
+       ret                     ;done
+ENDIF;[32] ap6850
+
+IF apcps               ;[22]
+sendbr:
+;
+;       Ensure that the transmitter has finished sending buffered chars
+sndbr1:        lda     mnprts          ; get UART status
+       ani     TxEmpty         ; everything sent?
+       jz      sndbr1          ; no, wait a bit more
+;
+;       Unmask command register
+       mvi     a,80h
+       sta     mnprtc
+;
+;       Begin sending a break by setting bit in UART command register
+       mvi     a,3Fh           ; Set TxEna, DTR, RxEna, SBreak, ErrRst, RTS
+       sta     mnprts
+;
+;       Wait for 250 milliseconds (using hundredths second delay routine)
+       mvi     a,25
+       call    delay
+;
+;       Resume normal operation by clearing the SendBreak command bit
+       mvi     a,37h           ;Set TxEna, DTR, RxEna, ErrRst, RTS
+       sta     mnprts
+;
+;       Remask command register
+       mvi     a,0
+       sta     mnprtc
+;
+       ret                     ;done
+ENDIF;[22] apcps
+
+;\f
+
+;
+;       sysflt - system-dependent filter
+;       called with character in E.
+;       if this character should not be printed, return with A = zero.
+;       preserves bc, de, hl.
+;       note: <xon>,<xoff>,<del>, and <nul> are always discarded.
+sysflt:
+       mov     a,e             ; get character for testing
+
+       ret
+
+;       mdmflt - modem filter [30]
+;       called with character to be sent to printer in E
+;       with parity set as appropriate.
+;       return with accumulator = 0 do do nothing,
+;                               <> 0 to send char in E.
+mdmflt:
+       mov     a,e             ;[30] get character to test
+       ret
+
+
+
+;       prtflt - printer filter [30]
+;       called with character to be sent to printer in E
+;       returns with a = 0 to do nothing
+;                    a <> 0 to print it.
+;
+;       this routine for those printer that automatically insert
+;       a lf on cr, or cr for lf.  Should this be shifted to 
+;       the system indep. stuff, in say 4.06?
+prtflt:
+       mov     a,e             ; [30] get character to test
+
+       ret
+
+
+;\f
+
+;
+; system-dependent processing for BYE command.
+;  for apmmdm, heath, and lobo, hang up the phone.
+sysbye:
+IF apmmdm
+       xra     a               ;Hangup our end, too.
+       sta     mnmodm
+ENDIF;apmmdm
+
+       ret
+;\f
+
+;       This is the system-dependent command to change the baud rate.
+;       DE contains the two-byte value from the baud rate table; this
+;       value is also stored in 'speed'.
+sysspd:
+
+; Set the speed for Apple with 6551 ACIA
+IF ap6551
+       lda     mnprtc          ;jb read control port
+       ani     0F0H            ;jb zap low order nybble
+       ora     e               ;jb put rate in low order nybble
+       sta     mnprtc          ;jb send to control port
+       ret
+ENDIF;ap6551
+
+; Set the speed for Apple with CPS Multifunction card
+IF apcps               ;[22]
+       mvi     a,80h
+       sta     mnprtc
+       lda     mnprts          ;read command register to reset 2651
+       mvi     a,apmod1        ;first mode byte
+       sta     mnport
+       mvi     a,4             ;waste some time before sending second byte
+spdwt: dcr     a               ; 4 T-states
+       jnz     spdwt           ; 10 T-states
+       mov     a,e             ;second mode byte is speed byte
+       sta     mnport
+       mvi     a,apcmd         ;command byte
+       sta     mnprts
+       xra     a
+       sta     mnprtc
+       ret
+ENDIF;[22] apcps
+
+
+IF ap6551                                      ;jb
+spdtbl:        db      0DH                             ;jb 13 entries
+       db      03H,'110$',     03H,03H ;jb
+       db      04H,'1200$',    08H,08H ;jb
+       db      05H,'134.5$',   04H,04H ;jb
+       db      03H,'150$',     05H,05H ;jb
+       db      04H,'1800$',    09H,09H ;jb
+       db      05H,'19200$',   0FH,0FH ;jb
+       db      04H,'2400$',    0AH,0AH ;jb
+       db      03H,'300$',     06H,06H ;jb
+       db      04H,'3600$',    0BH,0BH ;jb
+       db      04H,'4800$',    0CH,0CH ;jb
+       db      03H,'600$',     07H,07H ;jb
+       db      04H,'7200$',    0DH,0DH ;jb
+       db      04H,'9600$',    0EH,0EH ;jb
+
+sphtbl:        db      cr,lf,'  110    134.5  150    300    600   1200   1800'
+       db      cr,lf,' 2400   3600   4800   7200   9600  19200$'
+ENDIF;ap6551
+
+IF apcps               ;[22]
+spdtbl:        db      10H                             ; 16 entries
+       db      03H,'110$',     32h,32h
+       db      04H,'1200$',    37h,37h
+       db      05H,'134.5$',   33h,33h
+       db      03H,'150$',     34h,34h
+       db      04H,'1800$',    38h,38h
+       db      05H,'19200$',   3fh,3fh
+       db      04H,'2000$',    39h,39h
+       db      04H,'2400$',    3ah,3ah
+       db      03H,'300$',     35h,35h
+       db      04H,'3600$',    3bh,3bh
+       db      04H,'4800$',    3ch,3ch
+       db      02H,'50$',      30h,30h
+       db      03H,'600$',     36h,36h
+       db      04H,'7200$',    3dh,3dh
+       db      02H,'75$',      31h,31h
+       db      04H,'9600$',    3eh,3eh
+
+sphtbl:        db      cr,lf,'   50    75   110    134.5  150    300    600   1200'
+       db      cr,lf,' 1800  2000  2400   3600   4800   7200   9600  19200$'
+ENDIF;[22] apcps
+
+
+
+; The following conditionals were once a huge if not statement.  There
+; wasn't enough room to add the lobo to the list, so it had to be broken
+; into 2, which you can't do with an if not.  I redid it as two ifs and
+; applied them to those that wouldn't set baud. [Hal Hostetler]
+IF apmmdm OR ap6850 ;[32]
+spdtbl equ     0               ; SET BAUD not supported.
+sphtbl equ     0
+ENDIF;appmdm OR ap6850 [32]
+;
+;
+;       no ports available for Apple
+prttbl EQU     0               ;SET PORT not supported
+prhtbl EQU     0
+
+;
+;\f
+
+;       This is the system-dependent SET PORT command.
+;       HL contains the argument from the command table.
+sysprt:
+
+       ret
+;\f
+
+;
+;       selmdm - select modem port
+;       selcon - select console port
+;       selmdm is called before using inpmdm or outmdm;
+;       selcon is called before using inpcon or outcon.
+;       For iobyt systems, diddle the I/O byte to select console or comm port;
+;       For Decision I, switches Multi I/O board to console or modem serial
+;       port.  [Toad Hall]
+;       For the rest, does nothing.
+;       preserves bc, de, hl.
+selmdm:
+       ret
+
+selcon:
+       ret
+;\f
+
+;       Get character from console, or return zero.
+;       result is returned in A.  destroys bc, de, hl.
+;
+inpcon:
+       mvi     c,dconio        ;Direct console I/O BDOS call.
+       mvi     e,0FFH          ;Input.
+       call    BDOS
+       ret
+;\f
+
+;
+;       Output character in E to the console.
+;       destroys bc, de, hl
+;
+outcon:
+
+       mvi     c,dconio        ;Console output bdos call.
+       call    bdos            ;Output the char to the console.
+       ret
+;\f
+
+;
+;       outmdm - output a char from E to the modem.
+;               the parity bit has been set as necessary.
+;       returns nonskip; bc, de, hl preserved.
+outmdm:
+IF apple 
+       push    h
+outmd1:        lxi     h,mnprts        ;address of the port status register
+outmd2:        mov     a,m             ; get port status in A
+       ani     output          ;Loop till ready.
+       jz      outmd2
+outmd3:        lxi     h,mnport        ;address of port data register
+       mov     m,e             ; write the character
+       pop     h
+       ret
+ENDIF;apple 
+
+
+
+
+;\f
+
+;
+;       get character from modem; return zero if none available.
+;       for IOBYT systems, the modem port has already been selected.
+;       destroys bc, de, hl.
+inpmdm:
+IF apple 
+inpmd1:        lda     mnprts          ;Get the port status into A.
+       ani     input           ;See if the input ready bit is on.
+       rz                      ;If not then return.
+inpmd2:        lda     mnport          ;If so, get the char.
+ENDIF;apple
+
+
+ret                    ; return with character in A
+
+
+;
+;       flsmdm - flush comm line.
+;       Modem is selected.
+;       Currently, just gets characters until none are available.
+
+flsmdm:        call    inpmdm          ; Try to get a character
+       ora     a               ; Got one?
+       jnz     flsmdm          ; If so, try for another
+       ret                     ; Receiver is drained.  Return.
+;\f
+
+;
+;       lptstat - get the printer status. Return a=0ffh if ok, or 0 if not.
+lptstat:
+       xra     a
+       ret
+
+;
+;       outlpt - output character in E to printer
+;       console is selected.
+;       preserves de.
+outlpt:
+       push    d               ; save DE in either case
+       call    prtflt          ; go through printer filter [30]
+       ana     a               ; if A = 0 do nothing,
+       jz      outlp1          ; [30] if a=0 do nothing
+
+       mvi     c,lstout
+       call    bdos            ;Char to printer
+
+outlp1:        pop     d               ; restore saved register pair
+       ret
+;\f
+
+;
+;       Screen manipulation routines
+;       csrpos - move to row B, column C
+;
+;       csrpos for terminals that use a leadin sequence followed
+;        by (row + 31.) and (column + 31.)
+;
+csrpos:        push    b               ; save coordinates
+       lxi     d,curldn        ; get cursor leadin sequence
+       call    prtstr          ; print it
+       pop     h               ; restore coordinates
+       mov     a,h             ; get row
+       adi     (' '-1)         ; space is row one
+       mov     e,a
+       push    h
+       call    outcon          ; output row
+       pop     h
+       mov     a,l             ; get column
+       adi     (' '-1)         ; space is column one
+       mov     e,a
+       jmp     outcon          ; output it and return
+
+;
+; delchr - make delete look like a backspace.  Unless delete is a printing
+;       character, we just need to print a backspace. (we'll output clrspc
+;       afterwards)
+;       For Kaypro and Vector General, delete puts a blotch on the screen.
+;       For Apple and Osborne 1, delete moves but doesn't print.
+delchr:
+
+       lxi     d,delstr
+       jmp     prtstr
+
+; erase the character at the current cursor position
+clrspc:        mvi     e,' '
+       call    outcon
+       mvi     e,bs            ;get a backspace
+       jmp     outcon
+
+; erase the current line
+clrlin:        lxi     d,eralin
+       jmp     prtstr
+
+; erase the whole screen, and go home. preserves b (but not c)
+clrtop:        lxi     d,erascr
+       jmp     prtstr
+
+IF apple
+sysver:        db      'Apple II CP/M$'
+outlin:        db      ('^'-100O),esc,'Y',cr,lf,'  $'
+erascr:        db      ('^'-100O),esc,'Y$'     ;Clear screen and go home.
+eralin:        db      cr,esc,'T$'             ;Clear line.
+delstr:        db      bs,bs,'$'               ; Adjust for delete
+curldn:        db      esc,'=$'                ;Cursor lead-in
+ttab:                                  ;Table start location.
+ta:    db      ('K'-100O),'$',0,0      ;Cursor up.
+tb:    db      12O,'$',0,0             ;Cursor down.
+tc:    db      ('F'-100O),'$',0,0      ;Cursor right.
+td:    db      '$',0,0,0               ;(can't) Cursor left
+te:    db      '$',0,0,0               ;(can't) Clear display
+tf:    db      '$',0,0,0               ;(can't) Enter graphics mode
+tg:    db      '$',0,0,0               ;(can't) Exit graphics mode
+th:    db      ('^'-100O),'$',0,0      ;Cursor home.
+ti:    db      ('K'-100O),'$',0,0      ;Reverse linefeed.
+tj:    db      esc,'Y$',0              ;Clear to end of screen.
+tk:    db      esc,'T$',0              ;Clear to end of line.
+ENDIF;apple
+
+ovlend equ     $       ; End of overlay
+
+       END
diff --git a/cpxbbi.asm b/cpxbbi.asm
new file mode 100644 (file)
index 0000000..ffbdc14
--- /dev/null
@@ -0,0 +1,618 @@
+IF NOT lasm
+.printx * CPXBBI.ASM *
+ENDIF  ;NOT lasm
+;       KERMIT - (Celtic for "FREE")
+;
+;       This is the CP/M-80 implementation of the Columbia University
+;       KERMIT file transfer protocol.
+;
+;       Version 4.08
+;
+;       Copyright June 1981,1982,1983,1984,1985
+;       Columbia University
+;
+; Originally written by Bill Catchings of the Columbia University Center for
+; Computing Activities, 612 W. 115th St., New York, NY 10025.
+;
+; Contributions by Frank da Cruz, Daphne Tzoar, Bernie Eiben,
+; Bruce Tanner, Nick Bush, Greg Small, Kimmo Laaksonen, Jeff Damens, and many
+; others.
+;
+;
+;
+; revision history:
+;
+;edit 4, 7-Jan-1991 by MF. Added code to support the Ampro Little Board.
+;      The code was contributed by Jay S. Rouman; 913 North Drive;
+;      Mt. Pleasant, MI 48858 (voice (517)773-7887).
+; edit 3, 23 July by OBSchou to massage file to suit CPXCOM.ASM
+;
+; edit 2 23 May 1987 by C.J.MILES@UMRCC.
+;      Reorganised file to be similar in structure to that
+;      of the Amstrad sys-dep file. Added hangup in clear
+;      screen options in CONNECT mode.
+;
+; edit 1 10 May 1987 by Chris Miles (C.J.MILES@UMRCC)
+;        Removed Kaypro, Xerox and Big Board from CPXSYS.ASM
+;        and grouped them into this file as CPXBBI.ASM.
+;
+;
+;
+; Original code broken off and modified by:
+;
+; Chris Miles
+; 344, Claremont Road,
+; Rusholme,
+; MANCHESTER,
+; M14 6WB.
+;
+; Tel: (061) 226 7839
+;
+
+;
+;              *** MAIN CODE START ***
+;
+;
+; Keep module name, edit number, and last revision date in memory.
+
+sysedt: db      'CPXSYS.ASM (35) 01-Dec-86$'
+family: db     'CPXBBI.ASM (4)  7-Jan-1991$'
+
+
+; Assembly time message announcing which version we're building
+
+IF kpii
+.printx * Assembling Kaypro II KERMIT-80 *
+ENDIF
+
+IF xer820
+.printx * Assembling Xerox 820 KERMIT-80 *
+ENDIF
+
+IF bbII
+.printx * Assembling BigBoard II KERMIT-80 *
+ENDIF
+
+IF ampro
+.printx * Assembling Ampro Little Board KERMIT-80 *
+ENDIF
+
+z80    EQU     TRUE    ; They all use Z80s
+
+IF xer820
+defesc  EQU     ']'-100O        ;The default escape character for Xerox
+ENDIF;xer820
+
+IF kpII
+defesc  EQU     '\'-100O        ;The default escape character for Kaypro
+ENDIF;kpII
+
+; If one of the above, default to VT52-EMULATION ON.
+IF kpII OR xer820
+vtval   EQU     1
+ENDIF;kpII OR xer820
+
+
+;
+; Specific machine hardware information
+;
+IF bbI
+mnport  equ     04h             ; Modem data port
+mnprts  equ     06h             ; Modem status port
+output  equ     04h             ; Transmit buffer empty
+input   equ     01h             ; Receive data available
+baudrt  equ     00h             ; Baud rate port for channel A
+ENDIF;bbI
+
+
+IF bbII
+mnport  equ     80h             ; Modem data port (SIO channel A)
+mnprts  equ     81h             ; Modem status port
+output  equ     04h             ; Transmit buffer empty
+input   equ     01h             ; Receive data available
+baudrt  equ     89h             ; Baud rate port for channel A
+ENDIF;bbII
+
+IF ampro
+mnport  equ     88h             ; Modem data port (SIO channel B)
+mnprts  equ     8Ch             ; Modem status port
+output  equ     04h             ; Transmit buffer empty
+input   equ     01h             ; Receive data available
+baudrt  equ     50h             ; Baud rate port for channel B
+ENDIF;ampro
+;
+
+sysxin:                ;continuation of system initialisation code
+        lxi     d,siotbl        ; Load the address of the status able
+        mvi     c,siolen        ; Length of status table
+siolup:                        ; Loop back here for each command byte
+        ldax    d               ; Load the first byte into A
+        inx     d               ; Index the pointer
+        out     mnprts          ; Send it to the status port
+        dcr     c               ; Decrement the byte counter
+        jnz     siolup          ; Jump back for more commands
+        ret                     ; return from system-dependent routine
+
+; List of commands to set up SIO channel A for asynchronous operation.
+
+siotbl: DB      18H             ; Channel reset
+        DB      18H             ; another, in case register 0 wasn't selected
+        DB      04H             ; Select register 4
+        DB      44H             ; 1 stop bit, clock*16
+        DB      01H             ; Select register 1
+        DB      00H             ; No interrupts enabled
+        DB      03H             ; Select register 3
+        DB      0C1H            ; Rx enable, 8 bit Rx character
+        DB      05H             ; Select register 5
+        DB      0EAH            ; Tx enable, 8 bit Tx character,
+                                ;  raise DTR and RTS
+siolen  equ     $-siotbl        ; length of command list
+
+
+;
+; sysexit - System-dependent termination processing
+;          if we've changed anything, this is our last
+;          chance to put it back.
+;
+sysexit:
+        ret
+
+;
+; syscon - System-dependent processing for start
+;         of CONNECT command.
+;
+syscon:
+       lxi     d,conmsg
+       call    prtstr
+        ret
+
+conmsg:         ; Messages printed when entering transparent (CONNECT) mode:
+       db      cr,lf,'$'
+;
+; syscls - system-dependent close routine
+;          called when exiting transparent session.
+;
+syscls:
+        ret
+;
+; sysinh - help for system-dependent special functions.
+;          called in response to <escape>?, after listing
+;          all the system-independent escape sequences.
+;
+sysinh:
+        lxi     d,inhlps        ; we got options...
+        call    prtstr          ; print them.
+        ret
+
+
+; additional, system-dependent help for transparent mode
+; (two-character escape sequences)
+inhlps:
+        db      cr,lf,'B  Transmit a BREAK'
+       db      cr,lf,'H  Hangup using DTR'
+       db      cr,lf,'W  Wipe screen clear'
+       db      '$'
+
+; sysint - system dependent special functions
+;          called when transparent escape character has been typed;
+;          the second character of the sequence is in A (and in B).
+;          returns:-
+;                non-skip: sequence has been processed
+;                skip    : sequence was not recognized
+;
+sysint: ani     137O            ; convert lower case to upper, for testing...
+        cpi     'B'             ; send break ?
+        jz      sendbr          ; then jump to send break routine
+       cpi     'H'             ; hang up ?
+       jz      hangup          ; then jump to hangup routine
+       cpi     'W'             ; clear screen ?
+       jz      clrtop          ; then jump to clear screen routine
+        jmp     rskp            ; take skip return - command not recognized.
+
+;
+; Hangup and Break routines
+;
+hangup:
+       mvi     d,0ah           ; set up hangup bit mask
+       mvi     e,255           ; time for hangup is 2 1/2 secs
+       jmp     setbit          ; skip Tx empty test
+
+sendbr:
+       mvi     d,9ah           ; set up break bit mask
+       mvi     e,30            ; time for break is 300 ms
+
+sndbr1: mvi     a,1             ; select Read Register 1
+        out     mnprts
+        in      mnprts          ; read the contents
+        ani     1               ; test "all done" flag
+        jz      sndbr1          ; loop until it's nonzero.
+;
+; Next, set the break or DTR bit on the SIO
+;
+setbit:        
+       mvi     a,5             ; select Write Register 5
+        out     mnprts
+        mvi     a,6ah          ; Tx enable, 8 bit Tx character,
+       ora     d               ; OR with appropriate bit mask
+       out     mnprts          ; 
+;
+;       Now, delay for duration of hangup or break
+        mov     a,e            ; delay count
+        call    delay
+;
+;       Time's up. Put transmitter back in normal state and return.
+        mvi     a,5             ; select Write Register 5
+        out     mnprts
+        mvi     a,0eah         ; Tx enable, 8 bit Tx character,
+        out     mnprts          ;.
+        ret                     ; done.
+
+; sysflt - system-dependent filter
+;          called with character in E.
+;          if this character should not be printed, return with A = zero.
+;          preserves bc, de, hl.
+;          note: <xon>,<xoff>,<del>, and <nul> are always discarded.
+;
+sysflt:
+        mov     a,e             ; get character for testing
+       ret
+
+;
+; sysbye - system-dependent processing for BYE command.
+;
+sysbye:
+        ret
+;
+; This is the system-dependent command to change the baud rate.
+; DE contains the two-byte value from the baud rate table; this
+; value is also stored in 'speed'.
+;
+sysspd:
+
+; Set the speed for bigboard II
+IF bbII
+        di                      ; don't let anything between the data bytes
+        mvi     a,01000111b     ; get the command byte (load time constant)
+        out     baudrt          ; output it to CTC
+        mov     a,e             ; Get the parsed value.
+        out     baudrt          ; Tell the baud rate generator.
+        ei                      ; end of critical section
+        ret
+ENDIF;bbII
+
+
+; Set the speed for bigboard I
+IF bbI
+        mov     a,e             ; get the parsed value
+        out     baudrt          ; Tell the baud rate generator.
+        ret
+ENDIF;bbI
+
+; set the speed for the Ampro Little Board
+if ampro
+       mvi     e,3fh           ; offset to port b ctc 3f hex bytes
+       call    getbios
+       mvi     a,47h           ; counter mode,ctc reset,value follows
+       mov     m,a             ; store value
+       lda     speed+1         ; get ctc divisor
+       inx     h               ; location of ctc divisor
+       mov     m,a             ; store new divisor
+;
+; set up wr4 clock divisor according to mspeed
+;
+       mvi     e,50h           ; offset to dart wr4
+       call    getbios
+       mvi     a,3fh           ; mask for wr4 clock bits
+       ana     m               ; mask off bits
+       mov     m,a             ; and save to wr4
+       lda     speed           ; get clock flag
+       ora     a               ; set flags, zero = 300 bps
+       mvi     a,80h           ; x32 clock bit
+       jz      lbps            ; setup wr4 for 300 bps x32 clock
+;
+;  set up wr4 value for 1200 bps x16 clock 'hl' has wr4 loc
+;
+hbps:  mvi     a,40h           ; x16 clock
+;
+;  setup wr4 value for 300 bps x32 clock 'hl' has wr4 loc
+;
+lbps:  ora     m               ; set clock bits saving parity
+       mov     m,a             ; store new clock divisor to wr4 value
+;
+;  initialize sio/dart
+;
+intsio:        lxi     h,intend
+       push    h               ; set up for return
+       mvi     e,36h           ; offset to ioinit
+       call    getbios
+       pchl                    ; we pushed return address
+intend:        ret
+
+;
+;  return bios location in 'hl' called with offset in 'e'
+;
+getbios:
+       lhld    1               ; get bios location
+       mvi     d,0             ; clear 'd'
+       dad     d
+       ret
+;
+ENDIF;ampro
+
+;
+;       Speed tables
+; (Note that speed tables MUST be in alphabetical order for later
+; lookup procedures, and must begin with a value showing the total
+; number of entries.  The speed help tables are just for us poor
+; humans.
+
+;       db      string length,string,divisor (2 identical bytes or 1 word)
+; [Toad Hall]
+
+IF bbI
+spdtbl: db      10h                     ;16 entries
+        db      03h,'110$',     02h,02h
+        db      04h,'1200$',    07h,07h
+        db      05h,'134.5$',   03h,03h
+        db      03h,'150$',     04h,04h
+        db      04h,'1800$',    08h,08h
+        db      05h,'19200$',   0fh,0fh
+        db      04h,'2000$',    09h,09h
+        db      04h,'2400$',    0ah,0ah
+        db      03h,'300$',     05h,05h
+        db      04h,'3600$',    0bh,0bh
+        db      04h,'4800$',    0ch,0ch
+        db      02h,'50$',      00h,00h
+        db      03h,'600$',     06h,06h
+        db      04h,'7200$',    0dh,0dh
+        db      02h,'75$',      01h,01h
+        db      04h,'9600$',    0eh,0eh
+
+sphtbl: db      cr,lf,'   50     75    110    134.5  150    300    600   1200'
+        db      cr,lf,' 1800   2000   2400   3600   4800   7200   9600  19200$'
+ENDIF;bbI
+
+IF bbII
+spdtbl: db      8                       ; 8 entries
+        db      04h,'1200$',    20h,20h
+        db      05h,'19200$',   02h,02h
+        db      04h,'2400$',    10h,10h
+        db      03h,'300$',     80h,80h
+        db      05h,'38400$',   01h,01h
+        db      04h,'4800$',    08h,08h
+        db      03h,'600$',     40h,40h
+        db      04h,'9600$',    04h,04h
+
+sphtbl: db      cr,lf,'   300   600  1200  2400  4800  9600 19200 38400$'
+ENDIF;bbII
+
+
+IF ampro
+spdtbl: db      6                       ; 6 entries
+        db      04h,'1200$',    1,104
+        db      04h,'2400$',    1,52
+        db      03h,'300$',     0,208
+        db      04h,'4800$',    1,26
+        db      03h,'600$',     1,208
+        db      04h,'9600$',    1,13
+
+sphtbl: db      cr,lf,'   300  600  1200  2400  4800  9600$'
+ENDIF;ampro
+
+; This is the system-dependent SET PORT command.
+; HL contains the argument from the command table.
+;
+sysprt:
+        ret
+;
+
+prttbl  equ     0               ; SET PORT is not supported
+prhtbl  equ     0
+
+;
+; selmdm - select modem port
+; selcon - select console port
+; selmdm is called before using inpmdm or outmdm;
+; selcon is called before using inpcon or outcon.
+; preserves BC, DE, HL.
+;
+selmdm:
+selcon:
+        ret
+;
+; Get character from console, or return zero.
+; result is returned in A.  destroys bc, de, hl.
+;
+inpcon:
+        mvi     c,dconio        ;Direct console I/O BDOS call.
+        mvi     e,0FFH          ;Input.
+        call    BDOS
+        ret
+;
+;
+;       Output character in E to the console.
+;       destroys bc, de, hl
+;
+outcon:
+
+        mvi     c,dconio        ;Console output bdos call.
+        call    bdos            ;Output the char to the console.
+
+        ret
+;
+;
+;       outmdm - output a char from E to the modem.
+;               the parity bit has been set as necessary.
+;       returns nonskip; bc, de, hl preserved.
+outmdm:
+        in      mnprts          ;Get the output done flag.
+        ani     output          ;Is it set?
+        jz      outmdm          ;If not, loop until it is.
+        mov     a,e
+        out     mnport          ;Output it.
+        ret
+
+
+;
+;       get character from modem; return zero if none available.
+;       destroys bc, de, hl.
+inpmdm:
+        in      mnprts          ;Get the port status into A.
+        ani     input           ;See if the input ready bit is on.
+        rz                      ;If not then return.
+        in      mnport          ;If so, get the char.
+
+       ret                     ; return with character in A
+
+
+;
+;       flsmdm - flush comm line.
+;       Modem is selected.
+;       Currently, just gets characters until none are available.
+
+flsmdm: call    inpmdm          ; Try to get a character
+        ora     a               ; Got one?
+        jnz     flsmdm          ; If so, try for another
+        ret                     ; Receiver is drained.  Return.
+;
+;       lptstat - get the printer status. Return a=0ffh if ok, or 0 if not.
+lptstat:
+        xra     a               ; assume it is ok.. this may not be necessary
+        ret
+
+;
+;       outlpt - output character in E to printer
+;       console is selected.
+;       preserves de.
+outlpt:
+        push    d               ; save DE in either case
+        ana     a               ; if A = 0 do nothing,
+        jz      outlp1          ; [30] if a=0 do nothing
+        mvi     c,lstout
+        call    bdos            ;Char to printer
+outlp1: pop     d               ; restore saved register pair
+        ret
+;\f
+
+;
+;       Screen manipulation routines
+;       csrpos - move to row B, column C
+;
+;       csrpos for terminals that use a leadin sequence followed
+;        by (row + 31.) and (column + 31.)
+;
+IF NOT (bbII OR ampro)                 ;[obs I think ]
+csrpos: push    b               ; save coordinates
+        lxi     d,curldn        ; get cursor leadin sequence
+        call    prtstr          ; print it
+        pop     h               ; restore coordinates
+        mov     a,h             ; get row
+        adi     (' '-1)         ; space is row one
+        mov     e,a
+        push    h
+        call    outcon          ; output row
+        pop     h
+        mov     a,l             ; get column
+        adi     (' '-1)         ; space is column one
+        mov     e,a
+        jmp     outcon          ; output it and return
+ENDIF  ; NOT bbII OR ampro
+
+;
+; delchr - make delete look like a backspace.  Unless delete is a
+;          printing character, we just need to print a backspace
+;          (we'll output clrsp afterwards)
+delchr:
+
+IF bbI
+        lxi     d,delstr
+        jmp     prtstr
+ENDIF;bbI
+
+
+IF NOT bbI
+        mvi     e,bs            ;get a backspace
+        jmp     outcon
+ENDIF;NOT bbI
+
+; erase the character at the current cursor position
+clrspc: mvi     e,' '
+        call    outcon
+        mvi     e,bs            ;get a backspace
+        jmp     outcon
+
+; erase the current line
+clrlin: lxi     d,eralin
+        jmp     prtstr
+
+; erase the whole screen, and go home. preserves b (but not c)
+clrtop: lxi     d,erascr
+        jmp     prtstr
+
+; If its a BigBoard or Ampro, we need a terminal, so link to CPXVDU.ASM
+IF bbII
+sysver:        db      'Big Board II$'
+ENDIF;bbII
+
+IF ampro
+sysver:        db      'Ampro Little Board$'
+ENDIF;ampro
+
+IF (bbII AND lasm)     ; we need a terminal as well
+LINK CPXVDU.ASM
+ENDIF  ;(bbII AND lasm)
+
+IF (ampro AND lasm)    ; we need a terminal as well
+LINK CPXVDU.ASM
+ENDIF  ;(ampro AND lasm)
+
+;If here, we are Kaypro or Xerox 820, or if from M80, we should skip
+; a few lines if Bigboard.
+
+IF kpii
+sysver:
+ttytyp:        db      'Kaypro II$'
+outlin:        db      subt,cr,lf,tab,tab,'$'
+erascr:        db      subt,'$'                ;Clear screen and home.
+eralin:        db      cr,18H,'$'              ;Clear line.
+curldn:        db      esc,'=$'                ;Cursor lead-in
+delstr:        db      bs,' ',bs,bs,'$'        ; adjust for echoing delete character
+ttab:                                  ;Table start location.
+ta:    db      0BH,'$',0,0             ;Cursor up.
+tb:    db      0AH,'$',0,0             ;Cursor down.
+tc:    db      0CH,'$',0,0             ;Cursor right.
+td:    db      bs,'$',0,0              ;Cursor left
+te:    db      subt,'$',0,0            ;Clear display
+tf:    db      esc,'G$',0              ; Enter Graphics Mode (select Greek)
+tg:    db      esc,'A$',0              ; Exit Graphics mode (select ASCII)
+th:    db      1EH,'$',0,0             ; Cursor home.          [UTK016]
+ti:    db      esc,'E','$',0           ; Reverse linefeed. (insert line)
+tj:    db      'W'-100O,'$',0,0        ; Clear to end of screen.
+tk:    db      'X'-100O,'$',0,0        ; Clear to end of line.
+ENDIF ; kpii
+;\f
+
+IF xer820
+ttytyp:
+sysver:        db      'Xerox 820$'
+outlin:        db      subt,cr,lf,tab,tab,'$'
+erascr:        db      subt,'$'                ;Clear screen and home.
+eralin:        db      cr,18H,'$'              ;Clear line.
+curldn:        db      esc,'=$'                ;Cursor lead-in
+delstr:        db      bs,' ',bs,bs,'$'        ; adjust for echoing delete character
+ttab:                                  ;Table start location.
+ta:    db      0BH,'$',0,0             ;Cursor up.
+tb:    db      0AH,'$',0,0             ;Cursor down.
+tc:    db      0CH,'$',0,0             ;Cursor right.
+td:    db      bs,'$',0,0              ;Cursor left
+te:    db      subt,'$',0,0            ;Clear display
+tf:    db      '$',0,0,0               ; Enter Graphics Mode (can't)
+tg:    db      '$',0,0,0               ; Exit Graphics mode (can't)
+th:    db      1EH,'$',0,0             ; Cursor home.          [UTK016]
+ti:    db      0BH,'$',0,0             ; Reverse linefeed. (cursor up)
+tj:    db      11H,'$',0,0             ; Clear to end of screen.
+tk:    db      18H,'$',0,0             ; Clear to end of line.
+ENDIF ; xer820
+ovlend equ     $       ; End of overlay
+
+       END
diff --git a/cpxbee.asm b/cpxbee.asm
new file mode 100644 (file)
index 0000000..7333c2a
--- /dev/null
@@ -0,0 +1,996 @@
+IF NOT lasm
+.printx * CPXBEE.ASM *
+ENDIF  ;NOT lasm
+;       KERMIT - (Celtic for "FREE")
+;
+;       This is the CP/M-80 implementation of the Columbia University
+;       KERMIT file transfer protocol.
+;
+;       Version 4.09
+;
+;       Copyright June 1981,1982,1983,1984,1985
+;       Columbia University
+;
+; Originally written by Bill Catchings of the Columbia University Center for
+; Computing Activities, 612 W. 115th St., New York, NY 10025.
+;
+; Contributions by Frank da Cruz, Daphne Tzoar, Bernie Eiben,
+; Bruce Tanner, Nick Bush, Greg Small, Kimmo Laaksonen, Jeff Damens, and many
+; others.
+;
+;
+;
+; revision history:
+;
+; edit 1,  1st September 1990 
+;      Original version by Russell Lang <rjl@monu1.cc.monash.edu.au>
+;       The 'microbee' is designed and manufactured in Australia
+;       by Microbee Systems Ltd (previously Applied Technology).
+;      The microprocessor is a Z80 at 3.375MHz.
+;      The video screen is memory mapped from 0F000h to 0F7FFh, 
+;      with Programmable Characters 80-FF from 0F800h to 0FFFFh.  
+;      The serial and parallel ports are implemented using a Z80 PIO.
+;      The early model microbees were ROM-Basic computers with up
+;      to 32k of battery backed RAM.  Later models dropped the
+;      ROM-Basic and added disk drives and CP/M.  The disk systems
+;      include the 56k (64k) APC (5.25" drives), 64k Computer-In-A-Book 
+;      (3.5"), 128k Dynamic (5.25" or 3.5"), 256TC (3.5").
+;      
+;      This version of kermit was developed on a 56k APC.
+;      It has been tested on 56k, 64k, 128k and 256k Microbees.
+;
+;      The serial port is implemented in software NOT hardware.
+;      A special transmit routine allows simultaneous receiving
+;      for all speeds except 75/1200, 1200/75, 4800, 9600.
+;      The receive routine is interrupt driven with a 2 kbyte buffer.
+;      The 9600 bit/s speed is marginal on receive - if the transmitter
+;      is slightly fast (more than about 1%), the serial routine will 
+;      not have enough time to put the character in the buffer before 
+;      the next character arrives.
+
+
+;
+;              *** MAIN CODE START ***
+;
+;
+; Keep module name, edit number, and last revision date in memory.
+
+sysedt: db      'CPXSYS.ASM (35) 01-Dec-86$'
+family: db     'CPXBEE.ASM (1)  01-Sep-90$'
+
+
+; Assembly time message announcing which version we're building
+
+.printx * Assembling Microbee Kermit-80 *
+
+z80    EQU     TRUE    ; They all use Z80s
+
+defesc  EQU     ']'-100O        ;The default escape character for Microbee
+
+vtval  EQU     0       ; use default emulation which is adm3a superset
+
+;
+sysxin:                ;continuation of system initialisation code
+       ; set up baud rate
+       lxi     h,t300
+       shld    speed
+       xchg
+       call    setbaud
+       ; change the interrupt vector so that we intercept rs232 input
+       db      0EDh,57h        ;ld     a,i     ;get old interrupt reg
+       sta     oldint
+       mvi     a,int           ;new value
+       db      0EDh,47h        ;ld     i,a
+        ret                     ; return from system-dependent routine
+
+
+;
+; sysexit - System-dependent termination processing
+;          if we've changed anything, this is our last
+;          chance to put it back.
+;
+sysexit:
+       lda     oldint          ;restore old interrupt reg
+       db      0EDh,47h        ;ld     i,a
+        ret
+
+;
+; syscon - System-dependent processing for start
+;         of CONNECT command.
+;
+syscon:
+       lxi     d,conmsg
+       call    prtstr
+        ret
+
+conmsg:         ; Messages printed when entering transparent (CONNECT) mode:
+       db      cr,lf,'$'
+;
+; syscls - system-dependent close routine
+;          called when exiting transparent session.
+;
+syscls:
+        ret
+;
+; sysinh - help for system-dependent special functions.
+;          called in response to <escape>?, after listing
+;          all the system-independent escape sequences.
+;
+sysinh:
+        lxi     d,inhlps        ; we got options...
+        call    prtstr          ; print them.
+        ret
+
+
+; additional, system-dependent help for transparent mode
+; (two-character escape sequences)
+inhlps:
+        db      cr,lf,'B  Transmit a BREAK (0.3s)'
+       db      cr,lf,'L  Transmit a LONG BREAK (1.8s)'
+       db      cr,lf,'W  Wipe screen clear'
+       db      '$'
+
+; sysint - system dependent special functions
+;          called when transparent escape character has been typed;
+;          the second character of the sequence is in A (and in B).
+;          returns:-
+;                non-skip: sequence has been processed
+;                skip    : sequence was not recognized
+;
+sysint: ani     137O            ; convert lower case to upper, for testing...
+        cpi     'B'             ; send break ?
+        jz      sendbr          ; then jump to send break routine
+       cpi     'L'             ; long break ?
+       jz      longbr          ; then jump to long break routine
+       cpi     'W'             ; clear screen ?
+       jz      clrtop          ; then jump to clear screen routine
+        jmp     rskp            ; take skip return - command not recognized.
+
+;
+; Break routines
+;
+longbr:
+       mvi     e,180           ; time for long break is 1800 ms
+       jmp     setbit
+
+sendbr:
+       mvi     e,30            ; time for break is 300 ms
+
+setbit:        
+       in      portb
+       ani     0dfh            ; mask with tx bit
+       out     portb
+;
+;       Now, delay for duration of hangup or break
+        mov     a,e            ; delay count
+        call    delay
+;
+;       Time's up. Put transmitter back in normal state and return.
+       in      portb
+       ori     20h             ; mask with tx bit
+       out     portb
+        ret                     ; done.
+
+; sysflt - system-dependent filter
+;          called with character in E.
+;          if this character should not be printed, return with A = zero.
+;          preserves bc, de, hl.
+;          note: <xon>,<xoff>,<del>, and <nul> are always discarded.
+;
+sysflt:
+        mov     a,e             ; get character for testing
+       ret
+
+;
+; sysbye - system-dependent processing for BYE command.
+;
+sysbye:
+        ret
+
+;
+; This is the system-dependent command to change the baud rate.
+; DE contains the two-byte value from the baud rate table; this
+; value is also stored in 'speed'.
+;
+sysspd:
+       call    setbaud
+       ret
+
+;
+;       Speed tables
+; (Note that speed tables MUST be in alphabetical order for later
+; lookup procedures, and must begin with a value showing the total
+; number of entries.  The speed help tables are just for us poor
+; humans.
+
+;       db      string length,string,divisor (2 identical bytes or 1 word)
+; [Toad Hall]
+
+spdtbl:        db      11                      ;11 entries
+       db      03h,'110$'
+       dw      t110
+       db      04h,'1200$'
+       dw      t1200
+       db      07h,'1200/75$'
+       dw      t1275
+       db      03h,'150$'
+       dw      t150
+       db      04h,'2400$'
+       dw      t2400
+       db      03h,'300$'
+       dw      t300
+       db      04h,'4800$'
+       dw      t4800
+       db      03h,'600$'
+       dw      t600
+       db      02h,'75$'
+       dw      t75
+       db      07h,'75/1200$'
+       dw      t7512
+       db      04h,'9600$'
+       dw      t9600
+
+sphtbl:        db      cr,lf,'75  75/1200  110  150  300  600  1200  1200/75'
+       db      ' 2400 4800 9600$'
+
+
+;
+;      This is the system-dependent SET PORT command.
+sysprt:
+       ret
+
+prttbl equ     0               ; SET PORT is not supported
+prhtbl equ     0
+
+
+;
+; selmdm - select modem port
+; selcon - select console port
+; selmdm is called before using inpmdm or outmdm;
+; selcon is called before using inpcon or outcon.
+; preserves BC, DE, HL.
+;
+selmdm:
+selcon:
+        ret
+;
+; Get character from console, or return zero.
+; result is returned in A.  destroys bc, de, hl.
+;
+inpcon:
+        mvi     c,dconio        ;Direct console I/O BDOS call.
+        mvi     e,0FFH          ;Input.
+        call    BDOS
+        ret
+;
+;
+;       Output character in E to the console.
+;       destroys bc, de, hl
+;
+outcon:
+
+        mvi     c,dconio        ;Console output bdos call.
+        call    bdos            ;Output the char to the console.
+        ret
+
+
+
+;
+;
+;       outmdm - output a char from E to the modem.
+;               the parity bit has been set as necessary.
+;       returns nonskip; bc, de, hl preserved.
+outmdm:
+;
+       push    psw
+       push    b
+       push    d
+       push    h
+       mov     a,e
+       lxi     h,outm2 ; return address
+       push    h
+       lhld    txcall
+       pchl            ; send to rs232 port
+outm2: pop     h
+       pop     d
+       pop     b
+       pop     psw
+       ret
+
+
+;
+;       get character from modem; return zero if none available.
+;       bc, de, hl preserved.
+inpmdm:
+       call    rsin    ; get char if available
+       ret                     ; return with character in A
+
+
+;
+;       flsmdm - flush comm line.
+;       Modem is selected.
+;       Currently, just gets characters until none are available.
+flsmdm: call    inpmdm          ; Try to get a character
+        ora     a               ; Got one?
+        jnz     flsmdm          ; If so, try for another
+        ret                     ; Receiver is drained.  Return.
+
+;
+;       lptstat - get the printer status. Return a=0 if ok, or 0ffh if not.
+lptstat:
+       lda     pflag
+        ret
+
+;
+;       outlpt - output character in E to printer
+;       console is selected.
+;       preserves de.
+outlpt:
+        push    d               ; save DE in either case
+        ana     a               ; if A = 0 do nothing,
+        jz      outlp1          ; [30] if a=0 do nothing
+       mov     a,e
+       call    parout
+outlp1: pop     d               ; restore saved register pair
+        ret
+
+
+;
+;
+;       Screen manipulation routines
+;       csrpos - move to row B, column C
+;
+;       csrpos for terminals that use a leadin sequence followed
+;        by (row + 31.) and (column + 31.)
+;
+csrpos: push    b               ; save coordinates
+        lxi     d,curldn        ; get cursor leadin sequence
+        call    prtstr          ; print it
+        pop     h               ; restore coordinates
+        mov     a,h             ; get row
+        adi     (' '-1)         ; space is row one
+        mov     e,a
+        push    h
+        call    outcon          ; output row
+        pop     h
+        mov     a,l             ; get column
+        adi     (' '-1)         ; space is column one
+        mov     e,a
+        jmp     outcon          ; output it and return
+
+;
+; delchr - make delete look like a backspace.  Unless delete is a
+;          printing character, we just need to print a backspace
+;          (we'll output clrsp afterwards)
+delchr:
+        lxi     d,delstr
+        jmp     prtstr
+
+
+; erase the character at the current cursor position
+clrspc: mvi     e,' '
+        call    outcon
+        mvi     e,bs            ;get a backspace
+        jmp     outcon
+
+; erase the current line
+clrlin: lxi     d,eralin
+        jmp     prtstr
+
+; erase the whole screen, and go home
+clrtop: lxi     d,erascr
+        jmp     prtstr
+
+
+sysver:        db      'Microbee$'
+outlin:        db      1AH,cr,lf,tab,'$'       ;(Clear screen, home cursor)
+erascr:        db      1AH,'$'                 ;Clear screen and go home.
+eralin:        db      cr,esc,'T$'             ;Clear line.
+delstr:        db      bs,'$'                  ; Adjust for delete
+curldn:        db      esc,'=$'                ;Cursor lead-in
+ttab:                                  ;Table start location.
+ta:    db      ('K'-100O),'$',0,0      ;Cursor up.
+tb:    db      12O,'$',0,0             ;Cursor down.
+tc:    db      ('L'-100O),'$',0,0      ;Cursor right.
+td:    db      bs,'$',0,0              ;Cursor left.
+te:    db      subt,'$',0,0            ;Clear screen.
+tf:    db      '$',0,0,0               ;(can't) Enter graphics mode
+tg:    db      '$',0,0,0               ;(can't) Exit graphics mode
+th:    db      ('^'-100O),'$',0,0      ;Cursor home.
+ti:    db      ('K'-100O),'$',0,0      ;Reverse linefeed.
+tj:    db      esc,'Y$',0              ;Clear to end of screen.
+tk:    db      esc,'T$',0              ;Clear to end of line.
+
+
+;Microbee software serial port routines
+porta  equ     0
+portb  equ     2
+
+
+; interrupt vectors
+; We change the Z80 Interrupt register to point to these vectors.
+; Instead of trying to identify a particular Microbee system, 
+; we just put vectors here for all systems.
+;
+; known vectors are:
+;  48h : 56k (64k apc) - tested 19-Jun-1990
+;  48k : 64k           - tested 01-Sep-1990
+;  50h : dreamdisk (3rd party disk for Microbee)
+;  e0h : 128k          - tested 19-Jun-1990
+;  e0h : 256k          - tested 01-Sep-1990
+
+       org     ($ and 0ff00h) + 100h
+int    equ     $/256   ; byte for interrupt register
+
+       dw      inta    ; printer vector
+       dw      intb    ; rs232 vector
+       dw      inta
+       dw      intb
+       dw      inta
+       dw      intb
+       dw      inta
+       dw      intb
+       dw      inta
+       dw      intb
+       dw      inta
+       dw      intb
+       dw      inta
+       dw      intb
+       dw      inta
+       dw      intb
+       dw      inta
+       dw      intb
+       dw      inta
+       dw      intb
+       dw      inta
+       dw      intb
+       dw      inta
+       dw      intb
+       dw      inta
+       dw      intb
+       dw      inta
+       dw      intb
+       dw      inta
+       dw      intb
+       dw      inta
+       dw      intb
+       dw      inta
+       dw      intb
+       dw      inta
+       dw      intb
+       dw      inta
+       dw      intb
+       dw      inta
+       dw      intb
+       dw      inta
+       dw      intb
+       dw      inta
+       dw      intb
+       dw      inta
+       dw      intb
+       dw      inta
+       dw      intb
+       dw      inta
+       dw      intb
+       dw      inta
+       dw      intb
+       dw      inta
+       dw      intb
+       dw      inta
+       dw      intb
+       dw      inta
+       dw      intb
+       dw      inta
+       dw      intb
+       dw      inta
+       dw      intb
+       dw      inta
+       dw      intb
+       dw      inta
+       dw      intb
+       dw      inta
+       dw      intb
+       dw      inta
+       dw      intb
+       dw      inta
+       dw      intb
+       dw      inta
+       dw      intb
+       dw      inta
+       dw      intb
+       dw      inta
+       dw      intb
+       dw      inta
+       dw      intb
+       dw      inta
+       dw      intb
+       dw      inta
+       dw      intb
+       dw      inta
+       dw      intb
+       dw      inta
+       dw      intb
+       dw      inta
+       dw      intb
+       dw      inta
+       dw      intb
+       dw      inta
+       dw      intb
+       dw      inta
+       dw      intb
+       dw      inta
+       dw      intb
+       dw      inta
+       dw      intb
+       dw      inta
+       dw      intb
+       dw      inta
+       dw      intb
+       dw      inta
+       dw      intb
+       dw      inta
+       dw      intb
+       dw      inta
+       dw      intb
+       dw      inta
+       dw      intb
+       dw      inta
+       dw      intb
+       dw      inta
+       dw      intb
+       dw      inta
+       dw      intb
+       dw      inta
+       dw      intb
+       dw      inta
+       dw      intb
+       dw      inta
+       dw      intb
+       dw      inta
+       dw      intb
+       dw      inta
+       dw      intb
+       
+
+; tables for baud rates
+t75:   db      124,13  ; full delay
+       db      55,7    ; semi delay
+       db      168,255 ; txrx delay
+       dw      trout   ; address of subroutine to transmit char
+t7512: db      124,13  ; 75R/1200T
+       db      55,7
+       db      194,1   ; txout delay
+       dw      txout
+t110:  db      129,9
+       db      55,5
+       db      5,217   
+       dw      trout
+t150:  db      59,7
+       db      23,4
+       db      2,158
+       dw      trout
+t300:  db      26,4
+       db      134,2
+       db      3,75
+       dw      trout
+t600:  db      139,2
+       db      191,1
+       db      2,34
+       dw      trout
+t1200: db      195,1
+       db      90,1
+       db      3,13
+       dw      trout
+t1275: db      195,1   ; 1200R/75T
+       db      90,1
+       db      124,13
+       dw      txout
+t2400: db      94,1
+       db      40,1
+       db      2,3
+       dw      trout
+t4800: db      44,1
+       db      15,1
+       db      44,1
+       dw      txout
+t9600: db      19,1
+       db      1,1
+       db      19,1
+       dw      txout
+
+
+; copy table entries to locations used by serial routines
+setbaud:
+       lxi     h,fulldel
+       mvi     b,8
+setb2: ldax    d
+       mov     m,a
+       inx     h
+       inx     d
+       dcr     b
+       jnz     setb2
+       ret
+
+
+;transmit character in E
+; destroys all regs
+txout: mvi     b,ntotal        ;total number of bits to send
+       di
+       in      portb           ;c = portb with tx bit zeroed
+       ani     0dfh
+       mov     c,a
+       ora     a               ;carry=0 (start bit)
+txout2:        mov     a,c             ; 4T
+       jnc     txout4          ;10T skip if space
+       ori     20h             ; 3T (average)   set mark
+txout4:        out     portb           ;11T
+       lhld    txrxdel         ;16T
+txout6:        dcr     l               ;delay
+       jnz     txout6
+       dcr     h
+       jnz     txout6          ;  14*L + 14*H + 3584*(H-1)
+       stc                     ; 4T carry=1 (stop bit)
+       mov     a,e             ; 4T shift next bit to carry
+       rar                     ; 4T
+       mov     e,a             ; 4T
+       dcr     b               ; 4T
+       jnz     txout2          ;10T
+                               ;loop = 74T + (delay loop)
+       ei
+       ret
+
+       
+;
+;transmit character in E
+;simultaneous receive char if necessary
+trout: mov     a,e
+       mvi     b,ndata
+       lxi     h,0
+tro2:  rrc             ;shift tx char to hl
+       mov     c,a
+       mov     a,l
+       ral
+       mov     l,a
+       mov     a,h
+       ral
+       mov     h,a
+       mov     a,c     ;recover
+       dcr     b
+       jnz     tro2
+tro10: mvi     b,tqfudge ;adjust char in hl to align with
+                         ;tx bit of portb
+tro12: stc             ; pad out
+       mov     a,l
+       ral
+       mov     l,a
+       mov     a,h
+       ral
+       mov     h,a
+       dcr     b
+       jnz     tro12
+       mvi     a,0ffh  ;flag to say we are not receiving
+       sta     trtemp  ;save it
+       mvi     d,tqbit ;total number of qtr bits to send
+       in      portb   ;b = portb with tx bit zeroed
+       ani     0dfh
+       mov     b,a
+       mvi     e,0     ;we are not receiving yet
+tro14: in      portb
+       ori     8h      ;test CTS
+       jz      tro14   ;loop till Clear To Send
+       out     09h     ;Color Wait OFF
+       di
+       call    qbit
+       lda     trtemp  ;are we receiving
+       ora     a
+       jnz     tro22   ;skip if not
+       in      portb   ;is last bit a mark?
+       ori     10h
+       jz      tro18   ;skip if mark (don't wait for stop)
+       lhld    fulldel ;delay to stop bit
+tro16: dcr     l
+       jnz     tro16
+       dcr     h
+       jnz     tro16
+tro18: lhld    wptr            ; check buffer
+       xchg
+       lhld    rptr
+       dcx     d               ; decrement queue pointer
+       mov     a,d
+       ora     e
+       jnz     tro20           ; skip if no queue wrap around
+       lxi     d,maxque-1      ; wrap around
+tro20: mov     a,l             ; sub hl,de
+       sub     e
+       mov     l,a
+       mov     a,h
+       sbb     d
+       mov     h,a
+       ora     l               ; check for zero
+       jz      tro22           ; skip if buffer full
+       xchg
+       shld    wptr            ; update queue
+       lxi     d,rqueue
+       dad     d
+       mov     m,c             ; put char in queue
+tro22: ei
+       ret                     ;ret
+
+
+; routine for quarter bit timing
+; for transmit and simultaneous receive
+; total execution time is 223T + L*14T + H*34T
+qbit:  call    txrx    ;17T + 162T
+       lda     txrxdel ;13T
+qbit2: dcr     a       ; 4T
+       jnz     qbit2   ;10T
+       lda   txrxdel+1 ;13T
+qbit4: dcr     a       ; 4T
+       nop             ; 4T
+       nop             ; 4T
+       nop             ; 4T
+       nop             ; 4T
+       nop             ; 4T
+       jnz     qbit4   ;10T
+       mov     a,d     ; 4T Check if still sending or receiving
+       ora     e       ; 4T
+       jnz     qbit    ;10T
+       ret
+
+
+;simultaneous transmit/receive
+;do next quarter bit
+; regs: b = portb with tx bit zeroed
+;      c = character being received
+;      d = number of qtr bits remaining to send
+;      e = number of qtr bits remaining to receive (0 if not receiving)
+;      hl = character being transmitted
+;this subroutine always executes in 162T (or 163T)
+txrx:  mov     a,d     ; 4T qtr bits remaining to send
+       ora     a       ; 4T
+       jz      txrx12  ;10T skip if no bits remaining (may be receiving)
+       ani     03h     ; 7T a complete bit?
+       jnz     txrx10  ;10T skip if not
+       dad     h       ;11T shift tx bit to bit 5 of h
+       mov     a,h     ; 4T
+       ani     20h     ; 7T extract tx bit
+       ora     b       ; 4T combine with portb
+       out     portb   ;11T send it
+txrx2: dcr     d       ; 4T one less qtr bit to send
+                       ;76T total
+;now receive part
+txrx4: mov     a,e     ; 4T qtr bits remaining to receive
+       ora     a       ; 4T
+       jz      txrx16  ;10T skip if not receiving
+       ani     3h      ; 7T a complete bit?
+       jnz     txrx14  ;10T skip if not
+       in      portb   ;11T get input
+       ani     10h     ; 7T extract rx bit
+       sui     1       ; 7T bit to carry
+       mov     a,c     ; 4T bit to c
+       rar             ; 4T
+       mov     c,a     ; 4T
+txrx6: dcr     e       ; 4T one less qtr bit to receive
+txrx8: ret             ;10T
+                       ;86T total
+
+;come here if transmitting, but not a complete bit
+;delay to match up execution times
+txrx10:
+       ora     a       ; 4T
+       ora     a       ; 4T
+       ora     a       ; 4T
+       ora     a       ; 4T
+       ora     a       ; 4T
+       ori     00h     ; 7T
+       jmp     txrx2   ;10T
+
+;come here if not sending (but still receiving)
+;delay to match up execution times
+txrx12:        ora     a       ; 4T
+       ora     a       ; 4T
+       ora     a       ; 4T
+       ora     a       ; 4T
+       ora     a       ; 4T
+       ora     a       ; 4T
+       ora     a       ; 4T
+       ora     a       ; 4T
+       ora     a       ; 4T
+       ora     a       ; 4T
+       ora     a       ; 4T
+       ora     a       ; 4T
+       jmp     txrx4   ;10T
+
+;come here if receiving (but not a complete bit)
+;delay to match up execution time
+txrx14:        ora     a       ; 4T
+       ora     a       ; 4T
+       ora     a       ; 4T
+       ora     a       ; 4T
+       ora     a       ; 4T
+       ori     00h     ; 7T
+       jmp     txrx6   ;10T
+
+;come here if not receiving
+txrx16:        in      portb   ;11T check if start bit
+       ani     10h     ; 7T
+       jz      txrx18  ;10T skip if mark
+       mvi     e,rqbit ; 7T get quarter bit count for receive
+       xra     a       ; 4T
+       sta     trtemp  ;13T store flag to say we are receiving
+       ori     a       ; 7T delay (should be 6T)
+       ret             ;10T
+       
+txrx18:        ora     a       ; 4T
+       ora     a       ; 4T
+       ora     a       ; 4T
+       ora     a       ; 4T
+       ora     a       ; 4T
+       jmp     txrx8   ;10T
+
+
+
+
+; RS232 input interrupt routine
+; stores received character in queue
+;                              ;semi delay starts here
+intb:                          ;20T (approx.) for interrupt
+       push    psw             ;11T
+       push    b               ;11T
+       push    d               ;11T
+       push    h               ;11T
+       in      portb           ;11T
+       ani     10h             ; 7T test input for start bit
+       jz      intb16          ;10T skip if no start bit.
+       out     09h             ;11T
+       lhld    semidel         ;16T half bit delay
+intb2: dcr     l               ; 4T
+       jnz     intb2           ;10T  inner loop 14T*L
+       dcr     h               ; 4T
+       jnz     intb2           ;10T  outer loop (14*H + 256*14*(H-1))T
+       mvi     e,8             ; 6T number of data bits
+                               ;semi delay ends here (125T + delay loop)
+                               ;full delay starts here
+intb4: lhld    fulldel         ;16T  full bit delay
+intb6: dcr     l
+       jnz     intb6
+       dcr     h
+       jnz     intb6           ;  14*L + 14*H + 3584*(H-1)
+       in      portb           ;11T test input
+       ani     10h             ; 7T
+       sui     1               ; 7T input bit to carry
+       mov     a,c             ; 4T
+       rar                     ; 4T
+       mov     c,a             ; 4T and then to C
+       dcr     e               ; 4T bit count
+       jnz     intb4           ;10T  loop till all data bits collected
+                               ;full delay ends here (67T + delay loop)
+       in      portb
+       ani     10h
+       jz      intb12          ; skip if mark
+       lhld    fulldel         ; wait for stop bit
+intb10:        dcr     l
+       jnz     intb10
+       dcr     h
+       jnz     intb10
+intb12:        lhld    wptr            ; check buffer
+       xchg
+       lhld    rptr
+       dcx     d               ; decrement queue pointer
+       mov     a,d
+       ora     e
+       jnz     intb14          ; skip if no queue wrap around
+       lxi     d,maxque-1      ; wrap around
+intb14:        mov     a,l             ; sub hl,de
+       sub     e
+       mov     l,a
+       mov     a,h
+       sbb     d
+       mov     h,a
+       ora     l               ; check for zero
+       jz      intb16          ; skip if buffer full
+       xchg
+       shld    wptr            ; update queue
+       lxi     d,rqueue
+       dad     d
+       mov     m,c             ; put char in queue
+intb16:        pop     h
+       pop     d
+       pop     b
+       pop     psw
+       ei
+       db      0EDh,4Dh        ;reti
+
+;
+; get char from serial port buffer.
+; exit:  A=char  or  Z if no char
+rsin:  push    d
+       push    h
+       lhld    rptr
+       xchg
+       lhld    wptr
+       mov     a,l             ;sub hl,de
+       sub     e
+       mov     l,a
+       mov     a,h
+       sbb     d
+       mov     h,a
+       ora     l               ;check for zero
+       jnz     rsi4            ;get char
+rsi2:  pop     h
+       pop     d
+       ret
+
+rsi4:  push    psw
+       dcx     d               ; decrement queue pointer
+       mov     a,d
+       ora     e
+       jnz     rsi6            ; skip if no queue wrap around
+       lxi     d,maxque-1      ; wrap around
+rsi6:  pop     psw
+       xchg
+       shld    rptr
+       lxi     d,rqueue
+       dad     d
+       mov     e,m     ;get char from queue
+       ori     0ffh    ;set NZ
+       mov     a,e
+       jmp     rsi2
+
+; printer routines
+
+inta:  sta     ptemp
+       mvi     a,0
+       sta     pflag
+       lda     ptemp
+       ei
+       db      0EDh,4Dh        ;reti
+
+parout:        push    h
+       lxi     h,pflag
+par2:  db      0CBh,46h        ;bit    0,(hl)
+       jnz     par2
+       mvi     m,0ffh
+       out     porta
+       pop     h
+       ret
+
+; data storage
+
+oldint:                db      0       ; storage for old i reg
+trtemp:                db      0
+ptemp:         db      0       ;temp storage used by inta interrupt
+pflag:         db      0       ;0ffh if waiting for printer. 00h if ready
+
+;receive queue pointers
+maxque         equ     2048    ; receiver queue size
+rptr:          dw      maxque-1
+wptr:          dw      maxque-1
+
+;transmit
+ndata  equ     8       ; 8 data bits
+nstrt  equ     1       ; 1 start bit
+nstop  equ     1       ; 1 stop bit
+ntotal equ     nstrt+ndata+nstop
+rqbit  equ     4*(nstrt+ndata)         ;number of quarter bits to receive
+tqbit  equ     4*(nstrt+ndata+nstop)   ;number of quarter bits to transmit
+tqfudge        equ     13-nstrt-ndata
+
+;H=0 or L=0 behave as 256
+;receive delays.
+fulldel:       dw      0       ; 3584(H-1) + 14H + 14L + 67 cycles
+semidel:       dw      0       ; 3584(H-1) + 14H + 14L + 125 cycles
+;1/4 bit transmit and simultaneous tx/rx delay  34H + 14L + 223 cycles
+;or full bit delay  3584(H-1) + 14H + 14L + 74 cycles
+txrxdel:       dw      0       ;
+txcall:                dw      trout   ; address of subroutine to transmit char
+
+; receiver queue
+rqueue:                ds      maxque
+
+
+ovlend equ     $       ; End of overlay
+
+IF lasm
+       END
+ENDIF
diff --git a/cpxcif.asm b/cpxcif.asm
new file mode 100644 (file)
index 0000000..d4568c4
--- /dev/null
@@ -0,0 +1,746 @@
+IF NOT lasm
+.printx * CPXCIF.ASM *
+ENDIF  ;NOT lasm
+;       KERMIT - (Celtic for "FREE")
+;
+;       This is the CP/M-80 implementation of the Columbia University
+;       KERMIT file transfer protocol.
+;
+;       Version 4.0
+;
+;       Copyright June 1981,1982,1983,1984,1985
+;       Columbia University
+;
+; Originally written by Bill Catchings of the Columbia University Center for
+; Computing Activities, 612 W. 115th St., New York, NY 10025.
+;
+; Contributions by Frank da Cruz, Daphne Tzoar, Bernie Eiben,
+; Bruce Tanner, Nick Bush, Greg Small, Kimmo Laaksonen, Jeff Damens, and many
+; others.
+;
+;       This file contains the system dependent part for Cifer systems, and
+;       is based on code contributed by John Shearwood of Birmingham
+;       University.  This file was originally CPXTOR.ASM but now an 
+;       FAMILY file on its own.
+;
+;       This file has code that supports Cifer 1886/2886 systems, running 
+;       either CP/M Version 2.2 or 3.0, and driving the VL or AUX port.
+;       xxx is a three letter abbrev. for the system you are adding.
+;
+; revision history:
+;
+; edit 2, 21 July, 1987 by OBSchou to bring it into line for use with 
+;      CPXCOM.ASM.
+;
+; edit 1, 14 July by OBSchou for John Shearwood of Birmingham University, UK.
+;      His edits ar based on the former CPXTOR.ASM family file.
+;
+;      edit 4, Apr 7 1987, JA Shearwood.  Add support for Cifer Aux port.
+;      edit 2, Mar 17 1987, JA Shearwood Add support for Cifer CP/M Plus
+;
+; Keep module name, edit number, and last revision date in memory.
+family: db      'CPXCIF.ASM (2)  14-Jul-87 $'
+;\f
+; Assembly time message to let me know I'm building the right version.
+; LASM generates an 'S' error along with the message, which is messy, but
+; better than trying to put everything inside a IF m80 OR mac80 conditional,
+; because LASM doesn't like nested IF's, either.
+
+IF cifer
+.printx * Assembling Kermit-80 for Cifer 1886 *
+ENDIF
+
+IF cifer3
+.printx * with CP/M Plus
+ENDIF
+
+IF cifaux
+.printx * with AUX port
+ENDIF
+
+;\f
+;=========================================================================
+;       I/O Byte assignments (2-bit fields for 4 devices at loc 3)
+;
+;bits 6+7               LIST field
+;       0               LIST is Teletype device (TTY:)
+;       1               LIST is CRT device (CRT:)
+;       2               LIST is Lineprinter (LPT:)
+;       3               LIST is user defined (UL1:)
+;
+;bits 4+5               PUNCH field
+;       0               PUNCH is Teletype device (TTY:)
+;       1               PUNCH is high speed punch (PUN:)
+;       2               PUNCH is user defined #1 (UP1:)
+;       3               PUNCH is user defined #2 (UP2:)
+;
+;bits 2+3               READER field
+;       0               READER is Teletype device (TTY:)
+;       1               READER is high speed reader (RDR:)
+;       2               READER is user defined #1 (UR1:)
+;       3               READER is user defined #2 (UR2:)
+;
+;bits 0+1               CONSOLE field
+;       0               CONSOLE is console printer (TTY:)
+;       1               CONSOLE is CRT device (CRT:)
+;       2               CONSOLE is in Batch-mode (BAT:);READER = Input,
+;                       LIST = Output
+;       3               CONSOLE is user defined (UC1:)
+;
+;=========================================================================
+
+iobyte  EQU     03H     ;Location of I/O byte
+
+IF cifer        ;[13]
+batio   equ     80h             ; tty: as console
+defio   equ     81h             ; crt: as console
+z80     SET     TRUE           ; although it really is...
+ENDIF;cifer [13]
+
+defesc EQU     ']'-100O        ;The default escape character.
+
+; Select initial setting for VT-52 emulation flag.
+vtval   EQU    1
+
+IF iobyt       ; only CP/M 2.2 and VL port use coniob in CPXCOM
+               ; rest use this one
+coniob:        db      0               ; default console bit pattern
+ENDIF  ;iobyt
+
+
+
+sysxin:        ;system initialisation not covered by sysinit
+       mvi     a,defio
+       sta     coniob
+
+IF cifer AND NOT cifaux                ; [JAS] Not if AUX port
+        lxi     d,ciferi
+        call    prtstr
+ENDIF   ;cifer AND NOT cifaux
+
+IF cifaux                      ; [JAS] Only Aux Port
+        lhld    00047h         ; Get address of CIOPS table
+        lxi     d,6fh
+        dad     d              ; Calculate address of SETLNSPD
+        shld    cifiop
+        inx     h
+        inx     h
+        inx     h
+        shld    ciflod         ; Next entry LODEF
+        lxi     d,81h-72h
+        dad     d              ; Calculate address of LIDEF
+        shld    ciflid
+        lhld    00045h         ; Get address of SYSPTRS table
+        lxi     d,12h          ; Offset for LIDEF pointer
+        dad     d              ; Add to table address
+        mov     e,m            ; Get low byte LIDEF pointer
+        inx     h
+        mov     d,m            ; Get high byte LIDEF pointer
+        push    d
+        inx     h              ; LIPARM pointer next
+        mov     a,m            ; Get low byte of LIPARM pointer
+        sta     ciptbl         ; Keep
+        inx     h
+        mov     a,m            ; Get high byte
+        sta     ciptbl+1       ; Keep
+        lxi     d,1eh-15h      ; Offset to LODEF
+        dad     d
+        mov     e,m            ; Low byte
+        inx     h
+        mov     d,m            ; High byte
+        inx     h              ; LOPARM is next entry
+        mov     a,m
+        sta     coptbl         ; Keep low byte LOPARM
+        inx     h
+        mov     a,m
+        sta     coptbl+1       ; Keep high byte
+; Now set up port for no parity 8 bits xon/xoff protocol both ways
+        xchg                   ; LODEF into hl register
+        push    h              ; Needed later
+        mvi     a,0
+        mov     m,a            ; Clear byte 0
+        inx     h
+        mov     m,a            ; Clear byte 1
+        inx     h
+        mvi     a,099h         ; XON/XOFF protocol, 8bits, no parity
+        mov     m,a            ; Flag into byte 2
+        pop     h              ; Restore address of LODEF
+ciflod  equ     $+1
+        call    $              ; LODEF routine (poked above)
+        pop     h              ; LIDEF (PUSHed from de earlier)
+        push    h              ; Needed later
+        mvi     a,0
+        mov     m,a            ; Clear byte 0
+        inx     h
+        mov     m,a            ; Clear byte 1
+        inx     h
+        mvi     a,099h         ; XON/XOFF protocol, 8bits, no parity
+        mov     m,a            ; Flag into byte 2
+        pop     h              ; Restore address of LIDEF
+ciflid  equ     $+1
+        call    $              ; LIDEF routine (poked above)
+        lhld    ciptbl         ; Get current input speed
+        mov     a,m
+        sta     speed
+        sta     speed+1
+        mov     e,a
+        mov     d,a
+        call    sysspd         ; Make sure ip and op are the same
+ENDIF; cifer AND cifaux 
+
+        ret                     ; return from system-dependent routine
+
+;\f
+;
+;       system-dependent termination processing
+;       If we've changed anything, this is our last chance to put it back.
+sysexit:
+
+IF cifer AND NOT cifaux
+        lxi     d,cifero
+        call    prtstr
+ENDIF;cifer AND NOT cifaux
+
+        ret
+
+;
+;       system-dependent processing for start of CONNECT command
+;
+syscon:
+        ret
+
+conmsg:         ; Messages printed when entering transparent (CONNECT) mode:
+;\f
+;
+;       syscls - system-dependent close routine
+;       called when exiting transparent session.
+;
+syscls:
+        ret
+;\f
+;
+;       sysinh - help for system-dependent special functions.
+;       called in response to <escape>?, after listing all the
+;       system-independent escape sequences.
+;
+sysinh:        lxi     d,inhlps        ; we got options...
+       call    prtstr          ; print them.
+
+        ret
+
+
+;additional, system-dependent help for transparent mode
+; (two-character escape sequences)
+inhlps:
+
+; [16] [18] have added super brain and Torch to the list of Breaking machines.
+
+IF (cifer AND NOT cifaux)
+        db      cr,lf,'B  Transmit a BREAK'
+ENDIF   ;(cifer AND NOT cifaux)
+        db      '$'                     ;[hh] table terminator
+
+;
+;       sysint - system dependent special functions
+;       called when transparent escape character has been typed;
+;       the second character of the sequence is in A (and in B).
+;       returns:
+;       non-skip: sequence has been processed
+;       skip:   sequence was not recognized
+sysint: ani     137O            ; convert lower case to upper, for testing...
+
+; [19] have added superbrain and torch to the list
+
+IF (cifer AND NOT cifaux)
+        cpi     'B'             ; send break?
+        jz      sendbr          ; yes, go do it.  return nonskip when through.
+ENDIF   ;(cifer AND NOT cifaux)
+
+        jmp     rskp            ; take skip return - command not recognized.
+
+;\f
+
+IF (cifer AND NOT cifaux)
+sendbr: lxi     d,brkmes        ; send a break by sending esc * "
+        call    prtstr          ; send to screen => breaks to port
+        ret
+ENDIF;cifer
+
+;      sysflt - system-dependent filter.
+;      called with the character in E.
+;       preserves bc, de, hl.
+;       note: <xon>,<xoff>,<del>, and <nul> are always discarded.
+sysflt:
+        mov     a,e             ; get character for testing
+        ret
+
+;       mdmflt - modem filter [30]
+;       called with character to be sent to printer in E
+;       with parity set as appropriate.
+;       return with accumulator = 0 do do nothing,
+;                               <> 0 to send char in E.
+mdmflt:
+        mov     a,e             ;[30] get character to test
+        ret
+
+
+
+;       prtflt - printer filter [30]
+;       called with character to be sent to printer in E
+;       returns with a = 0 to do nothing
+;                    a <> 0 to print it.
+;
+;       this routine for those printer that automatically insert
+;       a lf on cr, or cr for lf.  Should this be shifted to 
+;       the system indep. stuff, in say 4.06?
+prtflt:
+        mov     a,e             ; [30] get character to test
+        ret
+
+
+;\f
+;
+; system-dependent processing for BYE command.
+;  for apmmdm, heath, and lobo, hang up the phone.
+sysbye:
+        ret
+;\f
+;       This is the system-dependent command to change the baud rate.
+;       DE contains the two-byte value from the baud rate table; this
+;       value is also stored in 'speed'.
+sysspd:
+
+IF (cifer AND NOT cifaux); This one is wierd.. 
+                               ; send an escape string to the screen to set rate.
+        push    d               ; Save the data returned
+        lxi     d,cifbrt                ; send the start of the escape string (esc ?)
+        call    prtstr          ;
+        pop     psw             ; get data into a (and flags>..)
+        inr     a               ; need to send (a+1-1) 'N' to screen
+        push    psw             ; we will need the data again
+        call    cifnos          ; send a set of Ns to the screen
+        pop     psw             ; (which then sets the VL line on the screen 
+        call    cifnos          ; processor card)
+        call    prcrlf          ; cr will terminate.. a crlf is handy
+        ret
+
+cifnos: dcr     a               ; if result = 0 then done
+        jz      cifno1          ; if done then say 'Y' for yes.
+        push    psw
+        mvi     e,'N'           ; else send a string of Ns to screen processor
+        mvi     c,dconio
+        call    bdos
+        pop     psw
+        jmp     cifnos
+cifno1: mvi     e,'Y'
+        mvi     c,dconio
+        call    bdos
+        ret                     ; sent a sring of 0 or more N then a Y
+
+cifbrt: db      esc,'?$'        ; start setting baud rate string
+ENDIF ;cifer AND NOT cifaux
+
+IF cifaux; [JAS] Set baud rate by massaging LIPARM/LOPARM and calling
+                               ;CIOPS routine
+; Set up speed byte in first location of tables
+        lhld    coptbl         ; Now sort out baud rate
+        mov     a,e            ; That's output speed
+        mov     m,a
+        xchg
+        lhld    ciptbl
+        mov     m,a            ; Input speed
+; Call CIOPS routine SETLNSPD with tables in appropriate rp's
+cifiop  equ     $+1
+        call    $              ; Poked by sysinit
+        ret
+
+coptbl: dw      0
+ciptbl: dw      0
+ENDIF; cifaux
+
+;\f
+;       Speed tables
+; (Note that speed tables MUST be in alphabetical order for later
+; lookup procedures, and must begin with a value showing the total
+; number of entries.  The speed help tables are just for us poor
+; humans.
+
+;       db      string length,string,divisor (2 identical bytes or 1 word)
+; [Toad Hall]
+
+IF cifer 
+spdtbl: db      10h                     ;16 entries
+        db      03h,'110$',     02h,02h
+        db      04h,'1200$',    07h,07h
+        db      05h,'134.5$',   03h,03h
+        db      03h,'150$',     04h,04h
+        db      04h,'1800$',    08h,08h
+        db      05h,'19200$',   0fh,0fh
+        db      04h,'2000$',    09h,09h
+        db      04h,'2400$',    0ah,0ah
+        db      03h,'300$',     05h,05h
+        db      04h,'3600$',    0bh,0bh
+        db      04h,'4800$',    0ch,0ch
+        db      02h,'50$',      00h,00h
+        db      03h,'600$',     06h,06h
+        db      04h,'7200$',    0dh,0dh
+        db      02h,'75$',      01h,01h
+        db      04h,'9600$',    0eh,0eh
+
+sphtbl: db      cr,lf,'   50     75    110    134.5  150    300    600   1200'
+        db      cr,lf,' 1800   2000   2400   3600   4800   7200   9600  19200$'
+ENDIF;cifer 
+
+; The following conditionals were once a huge if not statement.  There
+; wasn't enough room to add the lobo to the list, so it had to be broken
+; into 2, which you can't do with an if not.  I redid it as two ifs and
+; applied them to those that wouldn't set baud. [Hal Hostetler]
+;\f
+;       This is the system-dependent SET PORT command.
+;       HL contains the argument from the command table.
+sysprt:
+IF iobyt
+        mov     a,m             ;Get the I/O byte
+        sta     prtiob          ;Save the desired IO byte for this port
+        inx     h               ;Point at next entry
+        mov     a,m             ;Get the output function
+        sta     prtfun          ;Save it
+ENDIF;iobyt
+
+        ret
+;\f
+;
+;
+;       Port tables for GENERIC CPM 2.2
+IF gener
+; help text
+prhtbl: db      cr,lf,'CRT device'
+        db      cr,lf,'PTR device'
+        db      cr,lf,'TTY device'
+        db      cr,lf,'UC1 device'
+        db      cr,lf,'UR1 device'
+        db      cr,lf,'UR2 device$'
+
+; command table
+prttbl: db      06H             ;Six devices to choose from
+        db      03H,'CRT$'
+                dw      crtptb
+        db      03H,'PTR$'
+                dw      ptrptb
+        db      03H,'TTY$'
+                dw      ttyptb
+        db      03H,'UC1$'
+                dw      uc1ptb
+        db      03H,'UR1$'
+                dw      ur1ptb
+        db      03H,'UR2$'
+                dw      ur2ptb
+
+; port entry table
+; table entries are:
+;       db      iobyte-value, BDOS output function, reserved
+crtptb: db      crtio,conout,0
+ptrptb: db      ptrio,punout,0
+ttyptb: db      ttyio,conout,0
+uc1ptb: db      uc1io,conout,0
+ur1ptb: db      ur1io,punout,0
+ur2ptb: db      ur2io,punout,0
+ENDIF;gener
+
+;\f
+;
+IF cifer                        ; no ports yet...
+prttbl   EQU     0
+prhtbl   EQU     0               ;
+ENDIF; cifer
+
+IF iobyt
+prtfun: db      punout          ;Function to use for output to comm port
+prtiob: db      batio           ;I/O byte to use for communicating
+ENDIF;iobyt
+
+IF NOT (iobyt OR lobo OR cifer)          ;[hh]
+prttbl  equ     0               ; SET PORT is not supported
+prhtbl  equ     0
+ENDIF;NOT (iobyt OR lobo OR cifer)
+
+;\f
+;
+;       selmdm - select modem port
+;       selcon - select console port
+;       selmdm is called before using inpmdm or outmdm;
+;       selcon is called before using inpcon or outcon.
+;       For iobyt systems, diddle the I/O byte to select console or comm port;
+;       For Decision I, switches Multi I/O board to console or modem serial
+;       port.  [Toad Hall]
+;       For the rest, does nothing.
+;       preserves bc, de, hl.
+selmdm:
+IF iobyt
+        lda     prtiob          ;Set up for output to go to the comm port
+        sta     iobyte          ;Switch byte directly
+ENDIF;iobyt
+
+        ret
+
+selcon:
+IF iobyt
+        lda     coniob          ;Set up for output to go to the console port
+        sta     iobyte          ;Switch directly
+ENDIF;iobyt
+
+        ret
+;\f
+;       Get character from console, or return zero.
+;       result is returned in A.  destroys bc, de, hl.
+;
+inpcon:
+IF NOT iobyt
+        mvi     c,dconio        ;Direct console I/O BDOS call.
+        mvi     e,0FFH          ;Input.
+        call    BDOS
+ENDIF;NOT iobyt
+
+IF iobyt
+        call    bconst          ;Get the status
+        ora     a               ;Anything there?
+        rz                      ;No, forget it
+        call    bconin          ;Yes, get the character
+ENDIF;iobyt
+        ret
+;\f
+;
+;       Output character in E to the console.
+;       destroys bc, de, hl
+;
+outcon:
+
+IF NOT iobyt
+        mvi     c,dconio        ;Console output bdos call.
+        call    bdos            ;Output the char to the console.
+ENDIF;NOT iobyt
+
+IF iobyt
+        mov     c,e             ;Character
+        call    bcnout          ;to Console
+ENDIF;iobyt
+        ret
+;\f
+;
+;       outmdm - output a char from E to the modem.
+;               the parity bit has been set as necessary.
+;       returns nonskip; bc, de, hl preserved.
+outmdm:
+IF inout
+        in      mnprts          ;Get the output done flag.
+        ani     output          ;Is it set?
+        jz      outmdm          ;If not, loop until it is.
+        mov     a,e
+        out     mnport          ;Output it.
+        ret
+ENDIF;inout
+
+IF iobyt
+;**** Note that we enter from outpkt with the I/O byte already set up for
+;  output to go to the comm port
+        push    h
+        push    b
+        lda     prtfun          ;Get the output function
+        mov     c,a             ;Into C
+        call    bdos            ;And output the character
+        pop     b
+        pop     h
+        ret
+ENDIF;iobyt
+
+IF cifer3                      ; [JAS]
+        push    h
+        push    b
+        mvi     c,auxout        ;Output to the aux output device
+        call    bdos
+        pop     b
+        pop     h
+        ret
+ENDIF;cifer3
+
+
+;\f
+;
+;       get character from modem; return zero if none available.
+;       for IOBYT systems, the modem port has already been selected.
+;       destroys bc, de, hl.
+inpmdm:
+IF iobyt
+        call    bconst          ;Is Char at COMM-Port?
+        ora     a               ;something there?
+        rz                      ; return if nothing there
+        call    bconin          ; data present. read data.
+ENDIF;iobyt
+
+IF inout
+;Note: modem port should already be selected for mdI.  [Toad Hall]
+        in      mnprts          ;Get the port status into A.
+        ani     input           ;See if the input ready bit is on.
+        rz                      ;If not then return.
+        in      mnport          ;If so, get the char.
+ENDIF;inout
+
+IF cifer3                      ; [JAS]
+        mvi     c,auxist
+        call    bdos            ;is char at auxin?
+        ora     a               ;something there?
+        rz                      ;no
+        mvi     c,auxin
+        call    bdos            ;read char from auxin
+ENDIF;cifer3
+
+ret                     ; return with character in A
+
+
+;
+;       flsmdm - flush comm line.
+;       Modem is selected.
+;       Currently, just gets characters until none are available.
+
+flsmdm: call    inpmdm          ; Try to get a character
+        ora     a               ; Got one?
+        jnz     flsmdm          ; If so, try for another
+        ret                     ; Receiver is drained.  Return.
+
+
+;\f
+;
+;       lptstat - get the printer status. Return a=0 if ok, or 0ffh if not.
+lptstat:
+IF iobyte       ;[33]
+        call    bprtst          ; get status
+ENDIF   ;iobyte[33]
+IF NOT iobyte   ;[33]
+        xra     a               ; assume it is ok.. this may not be necessary
+ENDIF   ;iobyte [33]
+        ret
+;\f
+;
+;       outlpt - output character in E to printer
+;       console is selected.
+;       preserves de.
+outlpt:
+        push    d               ; save DE in either case
+        call    prtflt          ; go through printer filter [30]
+        ana     a               ; if A = 0 do nothing,
+        jz      outlp1          ; [30] if a=0 do nothing
+
+IF NOT iobyte
+        mvi     c,lstout
+        call    bdos            ;Char to printer
+ENDIF;NOT iobyt
+IF iobyt
+        mov     c,e
+        call    blsout
+ENDIF;iobyt
+
+outlp1: pop     d               ; restore saved register pair
+        ret
+;\f
+;
+;       Screen manipulation routines
+;       csrpos - move to row B, column C
+;
+;       csrpos for terminals that use a leadin sequence followed
+;        by (row + 31.) and (column + 31.)
+;
+IF cifer                        ; [14] cifer does it colums then rows.. swap b and c
+csrpos: push    b               ; save coordinates
+        lxi     d,curldn        ; get cursor leadin sequence
+        call    prtstr          ; print it
+        pop     h               ; restore coordinates
+        mov     a,l             ; [obs] get column
+        adi     (' '-1)         ; space is column one
+        mov     e,a
+        push    h
+        call    outcon          ; output row
+        pop     h
+        mov     a,h             ; [obs] get row
+        adi     (' '-1)         ; space is row one
+        mov     e,a
+        jmp     outcon          ; output it and return
+ENDIF; cifer 
+
+;
+;
+; delchr - make delete look like a backspace.  Unless delete is a printing
+;       character, we just need to print a backspace. (we'll output clrspc
+;       afterwards)
+;       For Kaypro and Vector General, delete puts a blotch on the screen.
+;       For Apple and Osborne 1, delete moves but doesn't print.
+delchr:
+       mvi     e,bs
+       call    outcon
+
+; erase the character at the current cursor position
+clrspc: mvi     e,' '
+        call    outcon
+        mvi     e,bs            ;get a backspace
+        jmp     outcon
+
+; erase the current line
+clrlin: lxi     d,eralin
+        jmp     prtstr
+
+; erase the whole screen, and go home. preserves b (but not c)
+clrtop: lxi     d,erascr
+        jmp     prtstr
+
+
+IF cifer AND NOT cifaux        ;[13]
+ttytyp: db      'Cifer 1886 (Parity set to space only)$'
+ENDIF; cifer AND NOT cifaux
+
+IF cifaux                      ;JAS
+ttytyp: db      ' Cifer 1886 $'
+ENDIF; cifaux
+
+IF cifer                       ;[JAS]
+sysver: db      ' Cifer 1886 $'         ;
+outlin: db      esc,'J',cr,lf,tab,tab,'$'
+eralin: db      esc,'^K$'               ;Clear to end of line.
+erascr: db      esc,'J$'                ;Clear screen and go home.
+curldn: db      esc,'P$'                ;Cursor lead-in
+ttab:                                   ;Table start location.
+ta:     db      esc,'A$',0              ;Cursor up.
+tb:     db      esc,'@$',0              ;Cursor down.
+tc:     db      esc,'C$',0              ;Cursor right.
+td:     db      esc,'D$',0              ;Cursor left.
+te:     db      esc,'J',0,0             ;Clear screen and home cursor
+tf:     db      '$',0,0,0               ;(can't) Enter Graphics mode
+tg:     db      '$',0,0,0               ;(can't) Exit Graphics mode
+th:     db      esc,'H$',0              ;Cursor home.
+ti:     db      esc,'@$',0              ;reverse linfeed
+tj:     db      esc,'B$',0              ;Clear to end of screen
+tk:     db      esc,'K$',0              ;Clear to end of line.
+ENDIF;cifer
+;
+IF cifer AND NOT cifaux                        ;[JAS]
+; Setup string for the Cifer.. called as a prtstr param. from sysinit
+ciferi: db      esc,'/'                 ;Setup cifer for on line
+        db      esc,'*['                ; direct mode on
+        db      esc,'%'                 ; protocol on host line on
+        db      esc,'*~x'               ; protocol is xon/xoff
+        db      esc,'*('                ; protocol out on host is xon/xoff
+        db      esc,'?  NNNY',cr        ; set VL port to space parity
+                                        ; It cannot do NONE.. Thanks a lot
+        db      '$'                     ; all done
+; Finish string for the Cifer.. called as a prtstr param. from sysexit
+cifero: db      esc,'&'                        ; Host input protocol off
+        db      esc,'*)'               ; Host output protocol off
+        db      esc,'*]'               ; Direct mode off
+        db      esc,'\'                        ; Setup cifer for off line
+        db      '$'
+; Break string for cifer VL port.
+brkmes: db      esc,'*"$'               ;Send a break command string
+ENDIF;cifer AND NOT cifaux     [13]
+
+ovlend equ     $       ; End of overlay
+
+       END
+\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a
diff --git a/cpxcom.asm b/cpxcom.asm
new file mode 100644 (file)
index 0000000..7c3034e
--- /dev/null
@@ -0,0 +1,486 @@
+IF NOT lasm
+.printx * CPXCOM.ASM *
+ENDIF  ; NOT lasm
+;       KERMIT - (Celtic for "FREE")
+;
+;       This is the CP/M-80 implementation of the Columbia University
+;       KERMIT file transfer protocol.
+;
+;       Version 4.0
+;
+;       Copyright June 1981,1982,1983,1984,1985
+;       Columbia University
+;
+; Originally written by Bill Catchings of the Columbia University Center for
+; Computing Activities, 612 W. 115th St., New York, NY 10025.
+;
+; Contributions by Frank da Cruz, Daphne Tzoar, Bernie Eiben,
+; Bruce Tanner, Nick Bush, Greg Small, Kimmo Laaksonen, Jeff Damens, and many
+; others.
+;
+;       This file contains part common code required for most if not all
+;      systems.  Specifiacally, SYSINIT, INIADR, MOVER, and DELAY to name
+;      the most important ones.
+;
+; revision history:
+;
+; edit 1, 21st July 1987 by OBSchou.  Regretably, I have had to include
+;      some system dependent IFs, mainly for CRT, TORCH and OSI.  Inclusion
+;      here means simpler family files later on. (Regrettably, the delay
+;      loop for APMMDM differs too.)
+;
+; Set the fuzzy timeout value.  Range is 1 (VERY short) through 0ffffH to zero
+; (maximum).  The actual duration is a function of the loop length and the
+; processor speed.  For now, we'll make it zero for everybody, but feel free
+; to change it for your system.
+; [OBS] make it a little less than max, say 1000H.  More useful.
+fuzval  EQU     1000H
+
+;
+;       System-dependent initialization
+;       Called once at program start.
+sysinit:
+;
+; [13]  Had to move this call to here, as the prtstr routine needs this
+; before the config message is sent out.  It has only been moved.
+;
+       call    iniadr  ;Initialize the BIOS addresses
+       mvi     c,gtiob ;Get current I/O byte
+       call    bdos    ;From CP/M
+       sta     coniob  ;Remember where console is
+       mvi     c,getvnm        ; get the BDOS version number (e.g. 22H, 31H)
+       call    bdos
+       mov     a,l
+       sta     bdosvr          ; and store it away for future reference
+       lxi     d,cfgmsg        ; "configured for "
+       call    prtstr
+       lxi     d,sysver        ; get configuration we're configured for
+       call    prtstr          ; print it.
+;
+;       If we're set up to do special terminal handling, say what kind
+;       of terminal we expect... (unless it's the generic 'crt')
+IF termin
+       lxi     d,witmsg        ; " with "
+       call    prtstr
+       lxi     d,ttytyp        ; terminal type
+       call    prtstr
+ENDIF;termin
+       call    prcrlf          ; print CR/LF
+;
+; now, to work...
+;
+; locate large buffer for multi-sector I/O
+; What we want to do here is find the ccp.  Space between ovlend and the ccp
+; is available for buffering, except we don't want to use more than maxsec
+; buffers (if we use too many, the remote end could time out while we're
+; writing to disk).  maxsec is system-dependent, but for now we'll just
+; use 8Kbytes.  If you get retransmissions and other protocol errors after
+; transferring the first maxsec sectors, lower maxsec.
+
+maxsec EQU     (8*1024)/bufsiz ; 8K / number of bytes per sector
+
+       lxi     h,ovlend        ; get start of buffer
+       shld    bufadr          ; store in linkage section
+       mvi     a,maxsec        ; get size of buffer, in sectors
+       sta     bufsec          ; store that, too.
+
+       call    sysxin          ; call system specific init code
+
+       ret                     ; return from system-dependent routine
+
+bdosvr:        ds      1               ; space to save the BDOS version number
+IF NOT iobyt
+coniob:        ds      1               ; space to save copy of IO byte
+ENDIF  ;NOT iobyt
+;\f
+;       This one is hopefully the last "improvement" in view of GENERIC
+;Kermit. It uses for Character-I/O the BIOS-routines ( instead of the
+;"normal" BDOS routines. What does it give us (hopefully) : More speed,
+;higher chance of success ( I/O byte implemented in BIOS [if at all]),
+;but no "extra" device handling - that's done by BDOS.
+;
+;       How do we "get" the call-adresses?  Location 0 has a JMP Warm-Boot
+;in CP/M which points into the second location of the BIOS JMP-Vector.  The
+;next three locations of the JMP-Vector point to the CONSTAT,CONIN,CONOUT
+;BIOS-routines.  CONOUT wants the character in C.
+;
+;- Bernie Eiben
+
+iniadr:        lhld    1               ;get BIOS Warmstart-address
+       lxi     d,3             ;next adress is CONSTAT in BIOS
+       dad     d
+       shld    bconst+1        ;stuff it into the call-instruction
+       lxi     d,3             ;next adress is CONIN in BIOS
+       dad     d
+       shld    bconin+1        ;
+       lxi     d,3             ;next adress is CONOUT in BIOS
+       dad     d
+       shld    bcnout+1
+       lxi     d,3             ;next address is LIST in BIOS
+       dad     d
+       shld    blsout+1
+       lxi     d,10*3          ; get printer status routine
+       dad     d
+       shld    bprtst
+       ret                     ;And return
+
+bconst:        jmp     $-$             ;Call BIOS directly (filled in by iniadr)
+
+bconin:        jmp     $-$             ;Call BIOS directly (filled in by iniadr)
+
+bcnout:        jmp     $-$             ;Call BIOS directly (filled in by iniadr)
+
+blsout:        jmp     $-$             ; ....
+
+bprtst:        jmp     $-$             ; Call BIOS directly for printer status
+
+IF NOT apmmdm  ; Shame about this, but the Apple needs a different delay
+;
+;[cjc]  Delay routine.  Called with time (hundredths of seconds) in A.
+;       The inner loop delays 1001 T-states, assuming no wait states are
+;       inserted; this is repeated CPUSPD times, for a total delay of just
+;       over 0.01 second. (CPUSPD should be set to the system clock rate,
+;       in units of 100KHz: for an unmodified Kaypro II, that's 25 for
+;       2.5 MHz.  Some enterprising soul could determine whether or not the
+;       Kaypro actually inserts a wait state on instruction fetch (a common
+;       practice); if so, the magic number at delay2 needs to be decreased.
+;       (We also neglect to consider time spent at interrupt level).
+;
+;       called by: sendbr
+;       destroys BC
+
+delay: mvi     c,cpuspd        ; Number of times to wait 1000 T-states to
+                               ;  make .01 second delay
+delay2:        mvi     b,70            ; Number of times to execute inner loop to
+                               ;  make 1000 T-state delay
+delay3:        dcr     b               ; 4 T-states (* 70 * cpuspd)
+       jnz     delay3          ; 10 T-states (* 70 * cpuspd)
+       dcr     c               ; 4 T-states (* cpuspd)
+       jnz     delay2          ; 10 T-states (* cpuspd)
+                               ; total delay: ((14 * 70) + 14) * cpuspd
+                               ;  = 1001 * cpuspd
+       dcr     a               ; 4 T-states
+       jnz     delay           ; 10 T-states
+       ret                     ; grand total: ((1001 * cpuspd) + 14) * a
+ENDIF  ; NOT apmmdm
+;\f
+;
+;       Set up screen display for file transfer
+;       called with kermit version in DE
+;
+sysscr: push    d               ; save version for a bit
+        lxi     d,outlin        ; clear screen, position cursor
+        call    prtstr          ; do it
+        pop     d               ; get Kermit's version
+IF NOT (osi OR crt)             ; got cursor control?
+        call    prtstr          ; print it
+        mvi     e,'['           ; open bracket
+        call    outcon          ; print it (close bracket is in outln2)
+        lxi     d,sysver        ; get name and version of system module
+        call    prtstr
+        lxi     d,outln2        ; yes, print field names
+        call    prtstr
+        lda     dbgflg          ; is debugging enabled?
+        ora     a
+        rz                      ; finished if no debugging
+        lxi     d,outln3        ; set up debugging fields
+        call    prtstr
+ENDIF;NOT (osi OR crt)
+        ret
+;\f
+;       Calculate free space for current drive
+;       returns value in HL
+sysspc:
+        lda     bdosvr          ;cpm3's alloc vect may be in another bank
+        cpi     30H             ;cpm3 or later?
+        jm      cp2spc          ;no: use cp/m 2 algorithm
+        lda     fcb             ;If no drive, get
+        ora     a               ; logged in drive
+        jz      dir180
+        dcr     a               ;FCB drive A=1 normalize to be A=0
+        jmp     dir18a
+
+dir180: mvi     c,rddrv
+        call    bdos
+dir18a: mov     e,a             ;drive in e
+        mvi     c,getfs         ;get free space BDOS funct
+        call    bdos            ;returns free recs (3 bytes in buff..buff+2)
+        mvi     b,3             ;conv recs to K by 3 bit shift
+dir18b: xra     a               ;clear carry
+        mvi     c,3             ;for 3 bytes
+        lxi     h,buff+3        ;point to addr + 1
+dir18c: dcx     h               ;point to less sig. byte
+        mov     a,m             ;get byte
+        rar                     ;carry -> A -> carry
+        mov     m,a             ;put back byte
+        dcr     c               ;for all bytes (carry not mod)
+        jnz     dir18c
+        dcr     b               ;shift 1 bit 3 times
+        jnz     dir18b
+        mov     e,m             ;get least sig byte
+        inx     h
+        mov     d,m             ;get most sig byte
+        xchg                    ;get K free in HL
+        ret
+
+; the rest are CP/M 2.2 systems, so use the alloc vector
+cp2spc: mvi     c,getalv        ;Address of CP/M Allocation Vector
+        call    bdos
+        xchg                    ;Get its length
+        lhld    bmax
+        inx     h
+        lxi     b,0             ;Initialize Block count to zero
+dir19:  push    d               ;Save allocation address
+        ldax    d
+        mvi     e,8             ;set to process 8 blocks
+dir20:  ral                     ;Test bit
+        jc      dir20a
+        inx     b
+dir20a: mov     d,a             ;Save bits
+        dcx     h
+        mov     a,l
+        ora     h
+        jz      dir21           ;Quit if out of blocks
+        mov     a,d             ;Restore bits
+        dcr     e               ;count down 8 bits
+        jnz     dir20           ;do another bit
+        pop     d               ;Bump to next count of Allocation Vector
+        inx     d
+        jmp     dir19           ;process it
+
+dir21:  pop     d               ;Clear Allocation vector from stack
+        mov     l,c             ;Copy block to 'HL'
+        mov     h,b
+        lda     bshiftf         ;Get Block Shift Factor
+        sui     3               ;Convert from records to thousands
+        rz                      ;Skip shifts if 1K blocks
+dir22:  dad     h               ;Multiply blocks by 'K per Block'
+        dcr     a
+        jnz     dir22
+        ret
+
+;      +----|----|----|----|----|----|----|...
+;    1 |
+;    2 |                Kermit-80 v4.0 [system]
+;    3 |
+;    4 |Number of packets: ____
+;    5 |Number of retries: ____
+;    6 |File name: ____________
+;    7 |<error>...
+;    8 |<status>...
+;    9 |RPack: ___(if debugging)...
+;   10 |
+;   11 |SPack: ___(if debugging)...
+;   12 |
+;   13 |Kermit-80  A:>  (when finished)
+;
+; For the PX-8, the display looks like:
+;           5    10   15   20   25   30   35   40   45   50   55
+;      +----|----|----|----|----|----|----|----|----|----|----|----|----
+;    1 |Kermit-80 v4.05 [Epson PX-8]            Number of retries: ____
+;    2 |Number of packets: ____                 File name: ________.___
+;    3 |<error>...
+;    4 |<status>...
+;    5 |RPack: ___ (if debugging)...
+;    6 |
+;    7 |SPack: ___ (if debugging)...
+;    8 |
+;    9 |Kermit-80 A:> (when finished)
+;
+
+IF NOT px8 ; [29]
+nppos   EQU     4*100h+20
+rtpos   EQU     5*100h+20
+fnpos   EQU     6*100h+12
+errlin  EQU     7
+stlin   EQU     8
+rplin   EQU     9
+splin   EQU     11
+prplin  EQU     13
+ENDIF ; NOT px8
+
+IF px8
+nppos   EQU     2*100h+20
+rtpos   EQU     1*100h+59
+fnpos   EQU     2*100h+51
+errlin  EQU     3
+stlin   EQU     4
+rplin   EQU     5
+splin   EQU     7
+prplin  EQU     9
+ENDIF ; px8 [29]
+
+
+IF NOT (osi OR crt );[26]
+scrnp:  lxi     b,nppos
+        jmp     csrpos
+
+scrnrt: lxi     b,rtpos
+        jmp     csrpos
+
+scrfln: lxi     b,fnpos
+        call    csrpos
+clreol:
+        lxi     d,tk
+        jmp     prtstr
+
+screrr: lxi     b,errlin*100H+1
+        call    csrpos
+        jmp     clreol
+
+scrst:  lxi     b,stlin*100H+1
+        call    csrpos
+        jmp     clreol
+
+rppos:  lxi     b,rplin*100H+8
+        call    csrpos
+        jmp     clreol
+
+sppos:  lxi     b,splin*100H+8
+        call    csrpos
+        jmp     clreol
+
+; [29] Modify scrend to make the cursor line conditional on use of debugging
+; This means that in most cases the entire file transfer will fit on PX-8 lcd
+scrend: lda     dbgflg
+        ora     a
+        jz      scr1nd
+        lxi     b,prplin*100H+1 ; debugging in use [29]
+        jmp     scr2nd
+scr1nd: lxi     b,rplin*100H+1  ; no debugging
+scr2nd: call    csrpos
+clreos: lxi     d,tj
+        jmp     prtstr
+; [29]  and nop out the rest for now...
+;
+;scrend:        lxi     b,prplin*100H+1
+;       call    csrpos
+;clreos:        lxi     d,tj
+;       jmp     prtstr
+ENDIF;NOT (osi OR crt ) [26]
+
+
+IF osi OR crt   ; no cursor control
+scrnp:  mvi     e,' '
+        jmp     outcon
+
+scrnrt: mvi     e,' '
+        call    outcon
+        mvi     e,'%'
+        jmp     outcon
+
+scrfln:
+screrr:
+scrst:
+scrend: jmp     prcrlf          ;Print CR/LF    [Toad Hall]
+
+rppos:  lxi     d,prpack
+        jmp     prtstr
+
+sppos:  lxi     d,pspack
+        jmp     prtstr
+ENDIF;osi OR crt
+
+; Some frequently-used routines (duplicates of those in CPSMIT):
+;       prcrlf - output a CR/LF
+;       prtstr - output string in DE
+;       rskp - return, skipping over error return
+prcrlf: lxi     d,crlf
+prtstr:
+;  [17] added this  to avoid prtstr.. emulate function 9 call.
+;      Works on most machines.
+IF (torch OR px8 OR z80mu)
+;
+;       Modified print string as the CP/N (for Nut) system traps control
+;       characters in a function 9 call.. rot its cotton socks.
+        push    h
+        push    d
+        push    b
+prtst1:
+        ldax    d
+        inx     d
+        cpi     '$'             ; if a dollar then end of string
+        jz      prtst2
+        push    d
+        mov     e,a
+       mov     c,a             ; also to c if its via conout in BIOS
+        call    outcon          ; send it to the screen
+        pop     d
+        jmp     prtst1
+
+prtst2: pop     b
+        pop     d
+        pop     h
+        ret                     ; regs restored.. just in case
+ENDIF  ;(torch OR px8 OR z80mu)
+
+IF NOT (torch OR px8 or z80mu)         ;ie any machine that can send ctrl chrs via dos call 9
+       PUSH    H
+       PUSH    D
+        push    b
+        mvi     c,9     ; Dos call 9 (print a string)
+        call    bdos
+        pop     b
+       POP     D
+       POP     H
+        ret             ; all done for good machines
+ENDIF   ;NOT (torch OR px8 OR z80mu)
+
+;
+;      rskp - return to calling address + 3.
+rskp:   pop     h               ; Get the return address
+        inx     h               ; Increment by three
+        inx     h
+        inx     h
+        pchl
+
+;       Copy block of data
+;       source in HL, destination in DE, byte count in BC
+;       called by: cpxsys, mfname
+;
+mover:
+;IF NOT z80              ; 8080's have to do it the hard way
+;OBS assume its an 8080 for now - this will work on Z80s anyway.
+        mov     a,m
+        stax    d
+        inx     h
+        inx     d
+        dcx     b
+        mov     a,b
+        ora     c
+        jnz     mover
+;ENDIF;NOT z80
+;IF z80
+;       db      0EDh,0B0h       ; Z80 LDIR instruction
+;ENDIF;z80
+        ret
+
+;
+;       Miscellaneous messages
+;
+crlf:   db      cr,lf,'$'
+cfgmsg: db      'configured for $'
+witmsg:        db      ' with $'       ; Its included if we get here ('with terminal')
+
+IF NOT (osi OR crt OR px8)     ; [29] got cursor control?
+outln2:        db      ']',cr,lf,cr,lf,'Number of packets:'
+       db      cr,lf,'Number of retries:'
+       db      cr,lf,'File name:$'
+ENDIF;NOT (osi OR crt OR px8)
+
+IF px8 ; [29]
+outln2:        db      ']           Number of retries:', cr, lf
+       db      'Number of packets:                     File name:$'
+ENDIF ; px8 [29]
+
+IF NOT (osi OR crt) ; [29]
+outln3:        db      cr,lf,cr,lf     ; debugging messages
+       db      cr,lf,'Rpack:'
+       db      cr,lf           ; Blank line in case of long packet
+       db      cr,lf,'Spack:$'
+ENDIF ; NOT (osi OR crt) [29]
+
+IF lasm
+LINK CPXSWT.ASM
+ENDIF  ;lasm
+
diff --git a/cpxgni.asm b/cpxgni.asm
new file mode 100644 (file)
index 0000000..615103f
--- /dev/null
@@ -0,0 +1,440 @@
+; CPXGNI.ASM
+;       KERMIT - (Celtic for "FREE")
+;
+;       This is the CP/M-80 implementation of the Columbia University
+;       KERMIT file transfer protocol.
+;
+;       Version 4.0
+;
+;       Copyright June 1981,1982,1983,1984,1985
+;       Columbia University
+;
+; Originally written by Bill Catchings of the Columbia University Center for
+; Computing Activities, 612 W. 115th St., New York, NY 10025.
+;
+; Contributions by Frank da Cruz, Daphne Tzoar, Bernie Eiben,
+; Bruce Tanner, Nick Bush, Greg Small, Kimmo Laaksonen, Jeff Damens, and many
+; others.
+;
+;       This file contains the system-dependent code and data for various
+;       Genie 3  CPM kermit 
+;
+; This has the Family name of CPXGNI.ASM.
+;
+; revision history (last edit first)
+; edit 3: 27 October, a987 by OBSchou.  Massaged file to suit V4.09 structure.
+;
+; Edit 2: Aug 27 1987 GDS Put in code for BREAK and fillited out
+;         a lot of unnecessary IF's
+;
+;Edit 1: Nov. 28, 1986 Geof Smith Clinical Research centre Harrow UK.
+
+.printx * Assembling for Eaca Genie 3 *
+;
+drtime  EQU     05H     ;Default receive time out interval.
+;
+; the basics...
+;
+mnport EQU 0E8H
+mnprts EQU 0EDH
+output EQU 20H
+input  EQU 01H
+lctrl  EQU 0EBH
+divlsb EQU 0E8H
+divmsb EQU 0E9H
+z80    EQU TRUE
+brkval EQU 40H
+
+defesc EQU ']'-100O ;The default escape character.
+
+
+;Select initial setting for VT-52 emulation flag.
+
+; default to VT52-EMULATION ON.
+;
+vtval   EQU     1
+;
+;\f
+
+;      Family is the string used in VERSION to say which of several 
+;       smaller overlay files are used.  These are (will be) derived from 
+;       the huge CP4SYS.ASM file, in which case we will never get here.  
+;       Just a Dollar, but put a sting in for a family of machines.
+;
+family:db      'CPXGNI.ASM  (3)  27-Oct-87$'    ; Used for family versions....
+
+
+
+;
+;       System-dependent initialization
+;       Called once at program start.
+sysxin:
+;
+                       ;Set up 9600 bd, 8bit words, no parity 1stop bit
+
+       mvi     a,83H           ;enable DLAB by setting bit 7
+       out     lctrl           ;and outputting to control port
+       mvi     a,14H           ;get word = 20 decimal
+       out     divlsb          ;and put it out
+       mvi     a,00H           ;as two separate
+       out     divmsb          ;bytes
+       lda     pstore          ;get parity etc
+       out     lctrl           ;do it resetting DLAB at same time
+
+       ret                     ; return from system-dependent routine
+
+
+;
+;       system-dependent termination processing
+;       If we've changed anything, this is our last chance to put it back.
+sysexit:
+
+        ret
+
+;
+;       system-dependent processing for start of CONNECT command
+;
+syscon:
+        ret
+
+conmsg:         ; Messages printed when entering transparent (CONNECT) mode:
+;\f
+
+
+;
+;       syscls - system-dependent close routine
+;       called when exiting transparent session.
+;
+syscls:
+       ret
+;\f
+
+
+;
+;       sysinh - help for system-dependent special functions.
+;       called in response to <escape>?, after listing all the
+;       system-independent escape sequences.
+;
+sysinh:
+        lxi     d,inhlps        ; we got options...
+        call    prtstr          ; print them.
+        ret
+
+
+;additional, system-dependent help for transparent mode
+; (two-character escape sequences)
+inhlps:
+
+        db      cr,lf,'B  Transmit a BREAK'
+
+        db      '$'                     ;[hh] table terminator
+
+;
+;       sysint - system dependent special functions
+;       called when transparent escape character has been typed;
+;       the second character of the sequence is in A (and in B).
+;       returns:
+;       non-skip: sequence has been processed
+;       skip:   sequence was not recognized
+sysint: ani     137O            ; convert lower case to upper, for testing...
+        cpi     'B'             ; send break?
+        jz      sendbr          ; yes, go do it.  return nonskip when through.
+
+        jmp     rskp            ; take skip return - command not recognized.
+
+
+;-------------------------------------------------------------------------------
+sendbr:
+;
+;       Ensure that the transmitter has finished sending buffered chars
+sndbr1: in      mnprts          ; get UART status
+        ani     output         ; everything sent?
+        jz      sndbr1          ; no, wait a bit more
+;
+;       Begin sending a break by setting bit in UART command register
+        mvi     a,brkval           ;  SBreak, 
+        out     lctrl
+;
+;       Wait for 250 milliseconds (using hundredths second delay routine)
+        mvi     a,25
+        call    delay
+;
+;       Resume normal operation by clearing the SendBreak command bit
+        lda pstore                  ;and restoring value from parity store
+        out mnprts
+;
+        ret                     ;done
+
+;
+;\f
+
+;
+;       sysflt - system-dependent filter
+;       called with character in E.
+;       if this character should not be printed, return with A = zero.
+;       preserves bc, de, hl.
+;       note: <xon>,<xoff>,<del>, and <nul> are always discarded.
+sysflt:
+        mov     a,e             ; get character for testing
+        ret
+
+;       mdmflt - modem filter [30]
+;       called with character to be sent to modem in E
+;       with parity set as appropriate.
+;       return with accumulator = 0 do do nothing,
+;                               <> 0 to send char in E.
+mdmflt:        mov     a,e             ; get character to a
+        ret
+
+
+
+;       prtflt - printer filter [30]
+;       called with character to be sent to printer in E
+;       returns with a = 0 to do nothing
+;                    a <> 0 to print it.
+;
+;       this routine for those printer that automatically insert
+;       a lf on cr, or cr for lf.  Should this be shifted to 
+;       the system indep. stuff, in say 4.06?
+prtflt:
+        mov     a,e             ; [30] get character to test
+        ret
+
+
+;\f
+
+
+;
+; system-dependent processing for BYE command.
+;  for apmmdm, heath, and lobo, hang up the phone.
+sysbye:
+        ret
+;\f
+
+
+;       This is the system-dependent command to change the baud rate.
+;       DE contains the two-byte value from the baud rate table; this
+;       value is also stored in 'speed'.
+sysspd:
+
+                       ;Set up baud rate 8bit words, no parity 1stop bit
+     mvi a,83H     ;enable DLAB by setting bit 7
+     out lctrl     ;and outputting to control port
+     mov a,d         ;get LSB
+     out divlsb     ;and put it out
+     mov a,e       ;get MSB
+     out divmsb     ;output it as well
+     lda pstore     ;get parity etc
+     out lctrl     ;do it resetting DLAB at same time
+     ret
+
+pstore:     db 03H  ;Default value for parity word length and stop bits
+
+spdtbl: db    11h               ;17 entries
+     db     03h,'110$',     06H,0D1H
+     db     04h,'1200$',     00H,0A0H
+     db     05h,'134.5$',     05H,94H
+     db     03h,'150$',     05H,00H
+     db     04h,'1800$',     00H,6BH
+     db     05h,'19200$',     00H,0AH
+     db     04h,'2000$',     00H,60H
+     db     04h,'2400$',     00H,50H
+     db     03h,'300$',     02H,80H
+     db     04h,'3600$',     00H,35H
+     db     05h,'38400$',    00H,05H
+     db     04h,'4800$',     00H,28H
+     db     02h,'50$',     0FH,00H
+     db     03h,'600$',     01H,40H
+     db     04h,'7200$',     00H,1BH
+     db     02h,'75$',     0AH,00H
+     db     04h,'9600$',     00H,14H
+
+sphtbl: db     cr,lf,'   50      75    110    134.5  150    300    600   1200'
+     db     cr,lf,' 1800   2000   2400   3600   4800   7200   9600  19200  38400$'
+
+;       This is the system-dependent SET PORT command.
+;       HL contains the argument from the command table.
+sysprt:
+
+        ret
+;
+prttbl  equ     0               ; SET PORT not supported
+prhtbl  equ     0
+
+;\f
+
+;
+;       selmdm - select modem port
+;       selcon - select console port
+;       selmdm is called before using inpmdm or outmdm;
+;       selcon is called before using inpcon or outcon.
+;       For iobyt systems, diddle the I/O byte to select console or comm port;
+;       For Decision I, switches Multi I/O board to console or modem serial
+;       port.  [Toad Hall]
+;       For the rest, does nothing.
+;       preserves bc, de, hl.
+selmdm:
+        ret
+
+selcon:
+        ret
+;\f
+
+
+;       Get character from console, or return zero.
+;       result is returned in A.  destroys bc, de, hl.
+;
+inpcon:
+        mvi     c,dconio        ;Direct console I/O BDOS call.
+        mvi     e,0FFH          ;Input.
+        call    BDOS
+
+        ret
+;
+;       Output character in E to the console.
+;       destroys bc, de, hl
+;
+outcon:
+
+        mvi     c,dconio        ;Console output bdos call.
+        call    bdos            ;Output the char to the console.
+
+        ret
+;
+;
+;       outmdm - output a char from E to the modem.
+;               the parity bit has been set as necessary.
+;       returns nonskip; bc, de, hl preserved.
+outmdm:
+
+        in      mnprts          ;Get the output done flag.
+        ani     output          ;Is it set?
+        jz      outmdm          ;If not, loop until it is.
+        mov     a,e
+        out     mnport          ;Output it.
+        ret
+
+;--------------------------------------------------------------------------
+;
+;       get character from modem; return zero if none available.
+;       for IOBYT systems, the modem port has already been selected.
+;       destroys bc, de, hl.
+inpmdm:
+;Note: modem port should already be selected for mdI.  [Toad Hall]
+        in      mnprts          ;Get the port status into A.
+        ani     input           ;See if the input ready bit is on.
+        rz                      ;If not then return.
+        in      mnport          ;If so, get the char.
+        ret                     ; return with character in A
+
+
+;
+;       flsmdm - flush comm line.
+;       Modem is selected.
+;       Currently, just gets characters until none are available.
+
+flsmdm: call    inpmdm          ; Try to get a character
+        ora     a               ; Got one?
+        jnz     flsmdm          ; If so, try for another
+        ret                     ; Receiver is drained.  Return.
+;-----------------------------------------------------------------------------
+;
+;       lptstat - get the printer status. Return a=0 if ok, or 0ffh if not.
+lptstat:
+        xra     a               ; assume it is ok.. this may not be necessary
+        ret
+
+;
+;       outlpt - output character in E to printer
+;       console is selected.
+;       preserves de.
+outlpt:
+        push    d               ; save DE in either case
+        call    prtflt          ; go through printer filter [30]
+        ana     a               ; if A = 0 do nothing,
+        jz      outlp1          ; [30] if a=0 do nothing
+
+        mvi     c,lstout
+        call    bdos            ;Char to printer
+outlp1: pop     d               ; restore saved register pair
+        ret
+;------------------------------------------------------------------------------
+;
+;       Screen manipulation routines
+;       csrpos - move to row B, column C
+;
+;       csrpos for terminals that use a leadin sequence followed
+;        by (row + 31.) and (column + 31.)
+;
+csrpos: push    b               ; save coordinates
+        lxi     d,curldn        ; get cursor leadin sequence
+        call    prtstr          ; print it
+        pop     h               ; restore coordinates
+        mov     a,h             ; get row
+        adi     (' '-1)         ; space is row one
+        mov     e,a
+        push    h
+        call    outcon          ; output row
+        pop     h
+        mov     a,l             ; get column
+        adi     (' '-1)         ; space is column one
+        mov     e,a
+        jmp     outcon          ; output it and return
+
+;
+; delchr - make delete look like a backspace.  Unless delete is a printing
+;       character, we just need to print a backspace. (we'll output clrspc
+;       afterwards)
+;       For Kaypro and Vector General, delete puts a blotch on the screen.
+;       For Apple and Osborne 1, delete moves but doesn't print.
+delchr:
+
+        mvi     e,bs            ;get a backspace
+        jmp     outcon
+
+; erase the character at the current cursor position
+clrspc: mvi     e,' '
+        call    outcon
+        mvi     e,bs            ;get a backspace
+        jmp     outcon
+
+; erase the current line
+clrlin: lxi     d,eralin
+        jmp     prtstr
+
+; erase the whole screen, and go home. preserves b (but not c)
+clrtop: lxi     d,erascr
+        jmp     prtstr
+
+;[2] I see no real saving in having all screens in separate file and
+;therefore have included screen definition here and commented out
+;the link to VDU file
+;
+;Specific definitions for the Genie III screen
+;
+sysver: db 'Eaca Genie III$'
+outlin: db 1aH,cr,lf,'            $'
+erascr: db 1AH,'$'
+eralin: db cr,18H,'$'
+curldn: db esc,'=$'
+ttab:
+ta:     db 0BH,'$',0,0                    ;Cursor up
+tb:     db 0AH,'$',0,0                    ;Cursor down
+tc:     db 0CH,'$',0,0                    ;Cursor right
+td:     db 08H,'$',0,0                    ;Cursor left
+te:     db 1AH,'$',0,0                    ;Clear display
+tf:     db esc,'R$',0                    ;Reverse on
+tg:     db esc,'S$',0                    ;Reverse off
+th:     db 1EH,'$',0,0                    ;Cursor home
+ti:     db 0BH,'$',0,0                    ;Reverse linefeed
+tj:     db 19H,'$',0,0                    ;Clear to end of screen
+tk:     db 18H,'$',0,0                    ;Clear to end of line
+
+ovlend equ $           ;End of overlay
+
+END
+\1a
+\1a
+\1a
+\1a
+
diff --git a/cpxhea.asm b/cpxhea.asm
new file mode 100644 (file)
index 0000000..e78d9df
--- /dev/null
@@ -0,0 +1,921 @@
+IF NOT lasm
+.printx * CPXHEA.ASM *
+ENDIF  ;NOT lasm
+;       KERMIT - (Celtic for "FREE")
+;
+;       This is the CP/M-80 implementation of the Columbia University
+;       KERMIT file transfer protocol.
+;
+;       Version 4.0
+;
+;       Copyright June 1981,1982,1983,1984,1985
+;       Columbia University
+;
+; Originally written by Bill Catchings of the Columbia University Center for
+; Computing Activities, 612 W. 115th St., New York, NY 10025.
+;
+; Contributions by Frank da Cruz, Daphne Tzoar, Bernie Eiben,
+; Bruce Tanner, Nick Bush, Greg Small, Kimmo Laaksonen, Jeff Damens, and many
+; others.
+;
+;       This file contains the system-dependent code and data for KERMIT
+;       specific to the Heath/Zenith H89 and Z100, the Telcon Zorba,
+;       and the OEM ScreenTyper.  All but the latter use VT52 (or a
+;       replica thereof) for screen output; the ScreenTyper uses the
+;       same serial port chip as the H89 (an Intel 8250).
+;
+; revision history:
+;
+; Edit 4, 31-Aug-1989 by Mike Freeman, 301 N.E. 107th Street; Vancouver wa
+;      98685 USA; Telephone (206)574-8221:  Added Baud-rate Selection and
+;      Break-sending ability for the Telcon Zorba portable.
+;
+; edit 3, 22 July, 1987 by OBSchou to massage code to conform to new set 
+;      of overlay files (stripping out common code to CPXCOM.ASM)
+;
+; edit 2 by OBSchou to add in old Kermit-80 V3.5 heath-8 code, formerly
+;      in CPM directory.  Entry from CP/M file:
+;
+;      This file contains an upgrade to the CPMBASE.M80 KERMIT 
+;      to allow setting and display of baud rates, a bug fix in 
+;      telnet, and an extension of the HELP to show GET (which works 
+;      in this release, on the H8). Look for the new symbol "h8quad" 
+;      (for the heath quad i/o board that it uses) in the conditionals. 
+;      Note that the Heath H8 is NOT the same machine as the H89. The H89 
+;      code does not run 'as is' on the H8, and does NOT initialize the 
+;      UART. Also there was a bug in the telnet section that is fixed 
+;      here, though I expect that it has already been found and fixed 
+;      by now - this is from the DECUS FALL 83 tape. The comments were 
+;      stripped out of this file to make it small enough for my H8 to 
+;      assemble, however, I have put the first section back in to make 
+;      it easier for you to identify. Thanks for a nice product to use 
+;      and work on. Major insertions are heavily commented, edit as needed.
+;
+;      This modification done by John Mealing, InteCom Inc, 601 Intecom Dr.,
+;      Allen, TX 75002 (214)797-9141, x-2493, 5 Nov 84.
+;
+;      [OBSchou notes: This is the header, and the bugs in telnet are 
+;      unknown.  telnet routine has been substantially changed anyway with
+;      4.08-4.09 revision.  As for the major insertions: they probably went
+;      with the 4.xx re-write.  I am unable to test this version: can 
+;      anyone else do so??]
+;
+;
+; edit 01 5th Mar 1987 by M J Carter, Nottingham Uni [majoc]
+;       Split off from CPXSYS.ASM, in order to install support for
+;       the OEM ScreenTyper.  I can't test anything other than the
+;       ScreenTyper as I haven't the hardware.  Any offers?
+;               Thanks are due to Paul Bartlett of John Elmer
+;       Electronics Ltd, who provided me with his modified sources
+;       for (a slightly antiquated) CP/M 4.05 Kermit on which this
+;       is based.
+;       
+; Keep module name, edit number, and last revision date in memory.
+;sysedt:        db      'CPXSYS.ASM (35) 01-Dec-86 $'
+; [majoc 870305] Now in CPXFRK.  I'll have to consult on this ...
+;
+;\f
+;
+; Assembly time message to let me know I'm building the right version.
+; LASM generates an 'S' error along with the message, which is messy, but
+; better than trying to put everything inside a IF m80 OR mac80 conditional,
+; because LASM doesn't like nested IF's, either.
+
+IF heath
+.printx * Assembling KERMIT-80 for the Heath/Zenith 89 *
+ENDIF
+
+IF h8quad
+.printx * Assembling KERMIT-80 for the Heath-8 with Quad IO board *
+ENDIF
+
+IF z100
+.printx * Assembling KERMIT-80 for the Heath/Zenith Z100 *
+ENDIF
+
+IF telcon
+.printx * Assembling KERMIT-80 for the Telcon Zorba *
+ENDIF
+
+IF scntpr
+.printx * Assembling KERMIT-80 for the OEM ScreenTyper *
+ENDIF
+;
+
+;\f
+
+IF heath
+mnport  EQU     330O    ;Modem data port
+ENDIF ; heath
+
+IF h8quad
+mnport  EQU     330O            ;all port addresses can be set by user -
+mnprts  EQU     mnport + 05     ;   in octal cause heath wrote documents that
+output  EQU     20H             ;   way -- relative addressing on the UART
+input   EQU     01H             ;   registers, just to be nice
+baudls  EQU     mnport          ;ls baud divisor latch when DALB set
+baudms  EQU     mnport + 1      ;ms baud divisor latch when DALB set
+linctl  EQU     mnport + 3      ;line control register
+modctl  EQU     mnport + 4      ;MODEM control register
+dalbon  EQU     80H             ;enables speed selection
+linset  EQU     03H             ;force hardware 8 bit, even parity
+;
+; The line control register (linctl) is bit mapped as follows:
+;       bit #   function           value
+;       0,1     select word size   00 -> 5 bit,   10 -> 7 bit
+;                                  01 -> 6 bit,   11 -> 8 bit
+;       2       select stop bits   0 -> 1 stop bit,  1 -> 1 1/2 for 5 bit,
+;                                                    1 -> 2 for 6 bit words
+;       3       parity enable      0 -> no parity,  1 -> parity as set by 4
+;       4       Even parity select 0 -> Odd parity,   1 -> Even parity
+;       5       Stick parity       1 -> Parity of bit 4 is inverted
+;       6       Break control      1 -> output forced to spacing (break)
+;       7       DALB               1 -> access divisor latches to set baud rate
+;
+; The value in linset is loaded into linctl when KERMIT comes up.
+;
+ms300   EQU     001O            ;set for 300 baud as default
+ls300   EQU     200O
+rtsoff  EQU     20O             ;direct control of modem lines
+rtson   EQU     11O
+z80    EQU     FALSE           ;[2] or is it?
+ENDIF  ;h8quad
+
+IF scntpr
+mnport  EQU     8       ;Modem data port
+ENDIF ; scntpr
+IF heath OR scntpr
+
+;       Definitions for the 8250 ACE
+
+acerbr  EQU     0       ; ACE Receiver Buffer Register offset (R/O) (DLAB = 0)
+acethr  EQU     0       ; ACE Transmitter Holding Register offset (W/O)
+acedll  EQU     0       ; ACE Divisor Latch (Low)       (DLAB = 1)
+acedlh  EQU     1       ; ACE Divisor Latch (High)      (DLAB = 1)
+aceier  EQU     1       ; ACE Interrupt Enable Register (DLAB = 0)
+aceiir  EQU     2       ; ACE Interrupt Identification Register
+acelcr  EQU     3       ; ACE Line Control Register
+acemcr  EQU     4       ; ACE Modem Control Register
+acelsr  EQU     5       ; ACE Line Status Register offset
+acemsr  EQU     6       ; ACE Modem Status Register
+
+ace8bw  EQU     00000011b ; 8 bit words
+acesb   EQU     01000000b ; set break
+acedla  EQU     10000000b ; divisor latch access
+acedtr  EQU     00000001b ; data terminal ready
+aceloo  EQU     00010000b ; loopback mode
+acedr   EQU     00000001b ; data ready
+acethe  EQU     00100000b ; transmitter holding register empty
+
+;mnport EQU     330O    ;Modem data port
+; [35a: majoc 870305] Shifted up above joint IF, to save nesting.
+mnprts  EQU     mnport+acelsr   ;Modem status port
+output  EQU     acethe  ;Transmitter empty
+input   EQU     acedr   ;Input data available
+z80     EQU     TRUE    ;H89 uses the Z80
+ENDIF;heath OR scntpr
+
+IF z100
+mnport  EQU     0ECH    ;Modem data port
+mnprts  EQU     0EDH    ;Modem status port
+output  EQU     01H     ;Transmitter empty
+input   EQU     02H     ;Input data available
+z80     EQU     FALSE   ;[hh] this one's an 8085.
+ENDIF;z100
+
+
+IF telcon
+MNPORT  EQU     20H     ;Modem data port
+MNPRTS  EQU     21H     ;Modem status port
+OUTPUT  EQU     01H     ;Transmitter empty
+INPUT   EQU     02H     ;Input data available
+BRPORT EQU     00H             ;8254-2 Baud Rate Generator Timer for Port A
+COMMND EQU     03H             ;8254-2 Timer Control Port
+z80     EQU     TRUE           ;[MF]A real Z80
+ENDIF;telcon
+;\f
+
+IF telcon 
+defesc  EQU     ']'-100O        ;The default escape character.
+ENDIF;telcon
+
+IF heath OR h8quad OR z100 OR scntpr
+defesc  EQU     '\'-100O        ;The default is Control \ -- it's easier B.E.
+ENDIF;heath OR h8quad OR z100 OR scntpr
+
+; Select initial setting for VT-52 emulation flag.
+IF (heath OR h8quad OR z100 OR telcon)
+vtval   EQU     0               ;  we don't need VT52 emulation
+ENDIF;heath OR h8quad OR z100 OR telcon OR vt52 [OBS question - ok for h8quad?]
+; If none of the above, default to VT52-EMULATION ON.
+IF scntpr
+vtval   EQU     1               ;  we do VT52 emulation
+ENDIF;scntpr
+
+
+;\f
+;       Family is the string used in VERSION to say which of several 
+;       smaller overlay files are used.  These are (will be) derived from 
+;       the juge CPXSYS.ASM file, in which case we will never get here.  
+;       Just a Dollar, but put a sting in for a family of machines.
+;
+family: db      'CPXHEA.ASM (4)  31-Aug-1989$' ; Used for family versions....
+
+;\f
+sysxin:                ; continuation of initialisation code
+IF heath OR scntpr
+;
+;       System dependent startup for H89 and OEM ScreenTyper
+;
+
+        call    mdmofl          ; keep the line safe from garbage
+
+;       First, tell Kermit the modem port's current speed
+        in      mnport+acelcr
+        ori     acedla
+        out     mnport+acelcr   ; access the ACE's divisor latch
+        in      mnport+acedll   ; get the low byte
+        sta     speed
+        in      mnport+acedlh   ; and the high byte
+        sta     speed+1
+
+;       Now set up the port for Kermit
+        mvi     a,ace8bw        ; 8 data bits, 1 stop bit, no parity
+        out     mnport+acelcr
+        in      mnport+acemcr
+        ori     acedtr          ; raise DTR (just in case)
+        out     mnport+acemcr
+        call    mdmonl          ; and put the ACE back on line
+        ret
+
+;       Take the ACE off line before modifying its state
+mdmofl:
+        in      mnport+aceier   ; save the ACE's interrupt state
+        sta     iersav
+        xra     a
+        out     mnport+aceier   ; and disable ACE interrupts
+        in      mnport+acemcr   ; now put the ACE in loopback mode
+        ori     aceloo
+        out     mnport+acemcr
+        ret
+
+;       Put the ACE back on line
+mdmonl:
+        in      mnport          ; flush left-over garbage in the receive buffer
+        mvi     a,7             ; wait about 2 300-baud character times
+        call    delay
+        in      mnport          ; and flush more garbage
+        in      mnport+acemcr   ; take the ACE out of loopback mode
+        ani     0FFH-aceloo
+        out     mnport+acemcr
+        lda     iersav
+        out     mnport+aceier   ; and restore the ACE's interrupt state
+        ret
+
+iersav: ds      1
+ENDIF;heath OR scntpr
+
+IF h8quad
+h8init: lxi    d,180h          ; [2] set up for 300 baud
+h8baud: mvi     a,rtsoff        ;disable modem for now
+        out     modctl
+        mvi     a,dalbon        ;set for UART speed programming
+        out     linctl
+       mov     a,d             ; [2] get ms bits for rate
+        out     baudms
+       mov     a,e             ; [2] get ls bits for rate
+        out     baudls
+        mvi     a,linset        ;force 8 bit, no parity and clear dalb
+        out     linctl
+        in      mnport          ;clear the recieve side
+        mvi     a,rtson         ;get ready
+        out     modctl          ;modem is on and ready to go
+ENDIF                           ;h8quad
+
+        ret                     ; return from system-dependent routine
+
+;\f
+;
+;       system-dependent termination processing
+;       If we've changed anything, this is our last chance to put it back.
+sysexit:
+        ret
+
+;
+;       system-dependent processing for start of CONNECT command
+;
+syscon:
+        ret
+
+conmsg:         ; Messages printed when entering transparent (CONNECT) mode:
+;\f
+;
+;       syscls - system-dependent close routine
+;       called when exiting transparent session.
+;
+syscls:
+        ret
+;\f
+;
+;       sysinh - help for system-dependent special functions.
+;       called in response to <escape>?, after listing all the
+;       system-independent escape sequences.
+;
+sysinh:
+IF heath OR scntpr  OR telcon;[4]
+        lxi     d,inhlps        ; we got options...
+        call    prtstr          ; print them.
+ENDIF;heath OR scntpr  OR telcon
+
+        ret
+
+
+;additional, system-dependent help for transparent mode
+; (two-character escape sequences)
+inhlps:
+IF heath OR scntpr  OR telcon;[4]
+        db      cr,lf,'B  Transmit a BREAK'
+ENDIF;heath OR scntpr  OR telcon
+
+IF heath OR scntpr 
+        db      cr,lf,'D  Drop the line'
+ENDIF;heath OR scntpr 
+
+        db      '$'                     ;[hh] table terminator
+
+;
+;       sysint - system dependent special functions
+;       called when transparent escape character has been typed;
+;       the second character of the sequence is in A (and in B).
+;       returns:
+;       non-skip: sequence has been processed
+;       skip:   sequence was not recognized
+sysint: ani     137O            ; convert lower case to upper, for testing...
+
+IF heath OR scntpr
+        cpi     'D'             ; drop line?
+        jnz     intc00          ; no:  try next function character
+
+mdmdrp: in      mnport+acemcr   ; (we also get here from sysbye)
+        ani     0FFH-acedtr
+        out     mnport+acemcr   ; yes: drop DTR
+        mvi     a,50            ;      for half a second
+        call    delay
+        in      mnport+acemcr
+        ori     acedtr
+        out     mnport+acemcr   ;      and then restore it
+        ret
+intc00:
+ENDIF;heath OR scntpr
+
+IF heath OR scntpr OR telcon;[4]
+        cpi     'B'             ; send break?
+        jz      sendbr          ; yes, go do it.  return nonskip when through.
+ENDIF;heath OR scntpr OR telcon
+      jmp     rskp            ; take skip return - command not recognized.
+
+
+;\f
+IF heath OR scntpr
+;
+;       Send BREAK on H89 or ScreenTyper
+;
+sendbr: in      mnport+acelcr
+        ori     acesb
+        out     mnport+acelcr   ; set ACE break condition
+        mvi     a,30
+        call    delay           ; wait 300 milliseconds
+        in      mnport+acelcr
+        ani     0FFH-acesb
+        out     mnport+acelcr   ; and clear ACE break condition
+        ret
+
+ENDIF;heath OR scntpr
+;
+IF telcon                      ;[4]
+;
+;      Send break on Telcon Zorba
+;
+sendbr:        mvi     a,3fH           ;DTR normal, break on
+       out     mnprts          ;Set break on
+       mvi     a,30            ;Wait 300 ms
+       call    delay           ;...
+       mvi     a,37h           ;DTR normal, tx, rx enabled
+       out     mnprts          ;Restore normal condition
+       ret                     ;and return
+;
+ENDIF ;telcon
+
+;\f
+;
+;       sysflt - system-dependent filter
+;       called with character in E.
+;       if this character should not be printed, return with A = zero.
+;       preserves bc, de, hl.
+;       note: <xon>,<xoff>,<del>, and <nul> are always discarded.
+sysflt:
+        mov     a,e             ; get character for testing
+        ret
+
+;       mdmflt - modem filter [30]
+;       called with character to be sent to printer in E
+;       with parity set as appropriate.
+;       return with accumulator = 0 do do nothing,
+;                               <> 0 to send char in E.
+mdmflt:
+        mov     a,e             ;[30] get character to test
+        ret
+
+
+
+;       prtflt - printer filter [30]
+;       called with character to be sent to printer in E
+;       returns with a = 0 to do nothing
+;                    a <> 0 to print it.
+;
+;       this routine for those printer that automatically insert
+;       a lf on cr, or cr for lf.  Should this be shifted to 
+;       the system indep. stuff, in say 4.06?
+prtflt:
+        mov     a,e             ; [30] get character to test
+        ret
+
+
+;\f
+;
+; system-dependent processing for BYE command.
+;  for apmmdm, heath, scntpr, and lobo, hang up the phone.
+sysbye:
+IF heath OR scntpr
+        call    mdmdrp          ;  Sleazy but effective
+ENDIF;heath OR scntpr
+
+        ret
+;\f
+;       This is the system-dependent command to change the baud rate.
+;       DE contains the two-byte value from the baud rate table; this
+;       value is also stored in 'speed'.
+sysspd:
+
+IF heath OR scntpr
+;
+;       Set speed for H89
+;
+        call    mdmofl          ; keep the line safe from garbage
+        in      mnport+acelcr
+        ori     acedla
+        out     mnport+acelcr   ; access the ACE's divisor latch
+        mov     a,e             ; low byte of speed is in E
+        out     mnport+acedll   ; set the low byte
+        mov     a,d             ; high byte of speed is in D
+        out     mnport+acedlh   ; set the high byte
+        in      mnport+acelcr
+        ani     0FFH-acedla
+        out     mnport+acelcr   ; de-access the ACE's divisor latch
+        call    mdmonl          ; and put the ACE back on line
+ENDIF;heath OR scntpr
+
+IF h8quad      ;[2][obs] A bit of guesswork this.  Enter with date in de
+       call    h8baud          ; [2] routine is in initialisation bit
+ENDIF  ; h8quad[2]
+;
+IF telcon                      ;[4]
+       MVI     A,36H           ;Set square wave
+       OUT     COMMND          ;...
+       MOV     A,E             ;Get LSB of Baud rate
+       OUT     BRPORT          ;Send to generator
+       MOV     A,D             ;Get msb of baud rate
+       OUT     BRPORT          ;Send to Baud rate generator
+ENDIF ;telcon
+;
+       ret
+
+;
+;\f
+;       Speed tables
+; (Note that speed tables MUST be in alphabetical order for later
+; lookup procedures, and must begin with a value showing the total
+; number of entries.  The speed help tables are just for us poor
+; humans.
+;
+;       db      string length,string,divisor (2 identical bytes or 1 word)
+; [Toad Hall]
+
+IF heath
+;
+;       Speed selection table for H89  (OK, so I got a little carried away...)
+;
+
+spdtbl: db      19              ; 19 entries
+        db      3,'110$'
+        dw      1047
+        db      4,'1200$'
+        dw      96
+        db      5,'134.5$'
+        dw      857
+        db      4,'1800$'
+        dw      64
+        db      5,'19200$'
+        dw      6
+        db      3,'200$'
+        dw      576
+        db      4,'2400$'
+        dw      48
+        db      3,'300$'
+        dw      384
+        db      4,'3600$'
+        dw      32
+        db      5,'38400$'
+        dw      3
+        db      3,'450$'
+        dw      256
+        db      4,'4800$'
+        dw      24
+        db      2,'50$'
+        dw      2304
+        db      5,'56000$'
+        dw      2
+        db      3,'600$'
+        dw      192
+        db      4,'7200$'
+        dw      16
+        db      2,'75$'
+        dw      1536
+        db      3,'900$'
+        dw      128
+        db      4,'9600$'
+        dw      12
+
+sphtbl: db      cr,lf
+        db      '    50    75   110 134.5   200   300   450   600   900  1200'
+        db      cr,lf,'  1800  2400  3600  4800  7200  9600 19200 38400 56000$'
+ENDIF;heath
+
+IF h8quad
+spdtbl:        db      6       ;[2] 6 entries
+        db      3,'300$',      1,80h   ; divisor for 300 baud
+        db      3,'600$',      0,0c0h
+        db      4,'1200$',     0,60h
+        db      4,'2400$',     0,30h
+        db      4,'4800$',     0,18h
+        db      4,'9600$',     0,0ch
+;
+; The strings to display the speed selected from the table above
+;
+sphtbl:        db      cr,lf,' 300   600  1200  2400  4800  9600$'
+ENDIF                                   ;h8quad
+
+IF scntpr
+; [35a: majoc 870305]
+;
+;       Speed selection table for ScreenTyper
+;
+
+spdtbl: db      14              ; 14 entries
+        db      3,'110$'
+        dw      470H
+        db      4,'1200$'
+        dw      68H
+        db      5,'134.5$'
+        dw      3a1H
+        db      4,'1800$'
+        dw      45H
+        db      5,'19200$'      ; This was in PB's table, but not in the
+        dw      7H              ; accompanying text string.  Oversight?
+;       db      3,'200$'
+;       dw      576
+        db      4,'2400$'
+        dw      34H
+        db      3,'300$'
+        dw      1a1H
+        db      4,'3600$'
+        dw      23H
+;       db      5,'38400$'
+;       dw      3
+;       db      3,'450$'
+;       dw      256
+        db      4,'4800$'
+        dw      1aH
+        db      2,'50$'
+        dw      964H
+;       db      5,'56000$'
+;       dw      2
+        db      3,'600$'
+        dw      0d0H
+        db      4,'7200$'
+        dw      11H
+        db      2,'75$'
+        dw      683H
+;       db      3,'900$'
+;       dw      128
+        db      4,'9600$'
+        dw      0dH
+
+sphtbl: db      cr,lf,'    50    75   110 134.5   300   600   1200'
+        db      cr,lf,'  1800  2400  3600  4800  7200  9600 (19200?)$'
+ENDIF;scntpr
+;
+IF telcon                      ;[4]
+;
+;      Speed selection tables for the Telcon Zorba (I overdid it, also)
+;
+;      **NOTE** that when Kermit is first executed, the baud rate is
+;      unknown to Kermit, having been set by CP/M upon cold-boot, SETUP.COM,
+;      another communications program, etc.  The easiest way to insure that
+;      the baud rate is known upon Kermit start-up is to set it
+;      in KERMIT.INI.
+;
+spdtbl:        db      20              ;[4]Number of entries (some of these
+                               ;speeds are *weird* but the Zorba
+                               ;supports them so I'll put them in
+       db      3,'110$'
+       dw      4545
+       db      4,'1200$'
+       dw      417
+       db      5,'134.5$'
+       dw      3717
+       db      3,'150$'
+       dw      3333
+       db      4,'1760$'
+       dw      284
+       db      4,'1800$'
+       dw      278
+       db      5,'19200$'
+       dw      26
+       db      3,'200$'
+       dw      2500
+       db      4,'2000$'
+       dw      250
+       db      4,'2400$'
+       dw      208
+       db      3,'300$'
+       dw      1667
+       db      4,'3520$'
+       dw      142
+       db      4,'3600$'
+       dw      139
+       db      4,'4800$'
+       dw      104
+       db      2,'50$'
+       dw      10000
+       db      3,'600$'
+       dw      833
+       db      4,'62.5$'
+       dw      8000
+       db      4,'7200$'
+       dw      69
+       db      2,'75$'
+       dw      6667
+       db      4,'9600$'
+       dw      52
+;
+;      Help table
+;
+sphtbl: db      cr,lf
+        db      '    50    62.5   75 110   134.5   150   200   300   600   1200'
+        db      cr,lf,'  1760  1800  2000  2400  3520  3600  4800 7200'
+       db      cr,lf,'  9600  19200$'
+;
+ENDIF ;Telcon
+
+; The following conditionals were once a huge if not statement.  There
+; wasn't enough room to add the lobo to the list, so it had to be broken
+; into 2, which you can't do with an if not.  I redid it as two ifs and
+; applied them to those that wouldn't set baud. [Hal Hostetler]
+IF z100 
+spdtbl  equ     0               ; SET BAUD not supported.
+sphtbl  equ     0
+ENDIF;z100 
+;
+;\f
+;       This is the system-dependent SET PORT command.
+;       HL contains the argument from the command table.
+sysprt:
+        ret
+;
+prttbl  equ     0               ; SET PORT is not supported
+prhtbl  equ     0
+;
+;\f
+;
+;       selmdm - select modem port
+;       selcon - select console port
+;       selmdm is called before using inpmdm or outmdm;
+;       selcon is called before using inpcon or outcon.
+;       For iobyt systems, diddle the I/O byte to select console or comm port;
+;       For Decision I, switches Multi I/O board to console or modem serial
+;       port.  [Toad Hall]
+;       For the rest, does nothing.
+;       preserves bc, de, hl.
+selmdm:
+        ret
+
+selcon:
+        ret
+
+;       Get character from console, or return zero.
+;       result is returned in A.  destroys bc, de, hl.
+;
+inpcon:
+IF NOT iobyt
+        mvi     c,dconio        ;Direct console I/O BDOS call.
+        mvi     e,0FFH          ;Input.
+        call    BDOS
+ENDIF;NOT iobyt
+
+       ret
+;\f
+;
+;       Output character in E to the console.
+;       destroys bc, de, hl
+;
+outcon:
+IF NOT iobyt
+        mvi     c,dconio        ;Console output bdos call.
+        call    bdos            ;Output the char to the console.
+ENDIF;NOT iobyt
+        ret
+;\f
+;
+;       outmdm - output a char from E to the modem.
+;               the parity bit has been set as necessary.
+;       returns nonskip; bc, de, hl preserved.
+outmdm:
+IF inout
+        in      mnprts          ;Get the output done flag.
+        ani     output          ;Is it set?
+        jz      outmdm          ;If not, loop until it is.
+        mov     a,e
+        out     mnport          ;Output it.
+        ret
+ENDIF;inout
+
+IF iobyt
+;**** Note that we enter from outpkt with the I/O byte already set up for
+;  output to go to the comm port
+        push    h
+        push    b
+        lda     prtfun          ;Get the output function
+        mov     c,a             ;Into C
+        call    bdos            ;And output the character
+        pop     b
+        pop     h
+        ret
+ENDIF;iobyt
+
+;\f
+;
+;       get character from modem; return zero if none available.
+;       for IOBYT systems, the modem port has already been selected.
+;       destroys bc, de, hl.
+inpmdm:
+IF NOT iobyt   ;[2] this routine not in submitted file, so I guess 
+               ; guess this is what it is supposed to do.
+       in      mnprts          ; input status port
+       ani     input           ; anything t read in?
+       rz                      ; nope
+       in      mnport          ; else read in the data
+       ret                     ; return with character in A
+ENDIF ; NOT iobyte [2]
+
+;
+;       flsmdm - flush comm line.
+;       Modem is selected.
+;       Currently, just gets characters until none are available.
+
+flsmdm: call    inpmdm          ; Try to get a character
+        ora     a               ; Got one?
+        jnz     flsmdm          ; If so, try for another
+        ret                     ; Receiver is drained.  Return.
+;\f
+;
+;       lptstat - get the printer status. Return a=0ffh if ok, or 0 if not.
+lptstat:
+        call   bprtst          ; assume it is ok.. this may not be necessary
+        ret
+
+;
+;       outlpt - output character in E to printer
+;       console is selected.
+;       preserves de.
+outlpt:
+        push    d               ; save DE in either case
+        call    prtflt          ; go through printer filter [30]
+        ana     a               ; if A = 0 do nothing,
+        jz      outlp1          ; [30] if a=0 do nothing
+
+IF NOT iobyt
+        mvi     c,lstout
+        call    bdos            ;Char to printer
+ENDIF;NOT iobyt
+outlp1: pop     d               ; restore saved register pair
+        ret
+;\f
+;
+;       Screen manipulation routines
+;       csrpos - move to row B, column C
+;
+;       csrpos for terminals that use a leadin sequence followed
+;        by (row + 31.) and (column + 31.)
+;
+csrpos: push    b               ; save coordinates
+        lxi     d,curldn        ; get cursor leadin sequence
+        call    prtstr          ; print it
+        pop     h               ; restore coordinates
+        mov     a,h             ; get row
+        adi     (' '-1)         ; space is row one
+        mov     e,a
+        push    h
+        call    outcon          ; output row
+        pop     h
+        mov     a,l             ; get column
+        adi     (' '-1)         ; space is column one
+        mov     e,a
+        jmp     outcon          ; output it and return
+
+;
+; delchr - make delete look like a backspace.  Unless delete is a printing
+;       character, we just need to print a backspace. (we'll output clrspc
+;       afterwards)
+;       For Kaypro and Vector General, delete puts a blotch on the screen.
+;       For Apple and Osborne 1, delete moves but doesn't print.
+delchr:
+        mvi     e,bs            ;get a backspace
+        jmp     outcon
+
+; erase the character at the current cursor position
+clrspc: mvi     e,' '
+        call    outcon
+        mvi     e,bs            ;get a backspace
+        jmp     outcon
+
+; erase the current line
+clrlin: lxi     d,eralin
+        jmp     prtstr
+
+; erase the whole screen, and go home. preserves b (but not c)
+clrtop: lxi     d,erascr
+        jmp     prtstr
+
+IF telcon
+sysver: db      'Telcon Zorba$'
+ENDIF;telcon
+
+IF heath
+sysver: db      'Heath/Zenith 89$'
+ENDIF;heath
+
+IF h8quad
+sysver:        db      'Heath H8 with quad I/O card$'
+ENDIF
+
+IF z100
+sysver: db      'Heath/Zenith Z-100 CP/M$'
+ENDIF;z100
+
+IF scntpr
+; [35a: majoc 870305]
+sysver: db      'OEM ScreenTyper: 4MHz Z80 running OS/M$'
+ENDIF;scntpr
+
+IF heath OR h8quad OR z100 OR telcon
+outlin: db      esc,'H',esc,'J',cr,lf,tab,tab,'$'
+erascr: db      esc,'H',esc,'J$'        ;Clear screen and go home.
+eralin: db      cr,esc,'K$'             ;Clear line.
+curldn: db      esc,'Y$'                ;cursor leadin
+ttab:                                   ;Table start location.
+ta:     db      esc,'A$',0              ;Cursor up.
+tb:     db      esc,'B$',0              ;Cursor down.
+tc:     db      esc,'C$',0              ;Cursor right.
+td:     db      esc,'D$',0              ;Cursor left
+te:     db      esc,'E$',0              ;Clear display
+tf:     db      esc,'F$',0              ;Enter Graphics Mode
+tg:     db      esc,'G$',0              ;Exit Graphics mode
+th:     db      esc,'H$',0              ;Cursor home.
+ti:     db      esc,'I$',0              ;Reverse linefeed.
+tj:     db      esc,'J$',0              ;Clear to end of screen.
+tk:     db      esc,'K$',0              ;Clear to end of line.
+ENDIF;heath OR h8quad OR z100 OR telcon
+;
+
+IF scntpr       ; [35a: majoc 870305]
+outlin: db      1aH,    cr, lf, '$'
+erascr: db      1aH,    '$'             ;Clear screen and go home.
+eralin: db      cr,esc,'*$'             ;Clear line.
+curldn: db      esc,'=$'                ;cursor leadin
+ttab:                                   ;Table start location.
+ta:     db      1eH,'$',0,0             ;Cursor up.
+tb:     db      1fH,'$',0,0             ;Cursor down.
+tc:     db      1cH,'$',0,0             ;Cursor right.
+td:     db      1dH,'$',0,0             ;Cursor left
+te:     db      1aH,'$',0,0             ;Clear display
+tf:     db      0,0,0,0                 ;(Can't)Enter Graphics Mode
+tg:     db      0,0,0,0                 ;(Can't)Exit Graphics mode
+th:     db      15H,'$',0,0             ;Cursor home.
+ti:     db      1eH,'$',0,0             ;Reverse linefeed.
+tj:     db      esc,'%$',0              ;Clear to end of screen.
+tk:     db      esc,'*$',0              ;Clear to end of line.
+ENDIF;scntpr
+
+ovlend  EQU     $       ; End of overlay
+       END             ; Phew ... [majoc 870305]
diff --git a/cpxlnk.asm b/cpxlnk.asm
new file mode 100644 (file)
index 0000000..30dd080
--- /dev/null
@@ -0,0 +1,206 @@
+; CPXLNK.ASM
+;       KERMIT - (Celtic for "FREE")
+;
+;       This is the CP/M-80 implementation of the Columbia University
+;       KERMIT file transfer protocol.
+;
+;       Version 4.0
+;
+;       Copyright June 1981,1982,1983,1984
+;       Columbia University
+;
+; Originally written by Bill Catchings of the Columbia University Center for
+; Computing Activities, 612 W. 115th St., New York, NY 10025.
+;
+; Contributions by Frank da Cruz, Daphne Tzoar, Bernie Eiben,
+; Bruce Tanner, Nick Bush, Greg Small, Kimmo Laaksonen, Jeff Damens, and many
+; others. 
+;
+;       This file describes the areas used to communicate between KERMIT
+;       and the customizing overlay.  It is included by the overlay.
+;       This file should be changed only to reflect changes in the
+;       system-independent portion of Kermit (enhancements, I hope).
+;
+; revision history:
+;edit 8, 14-Sep-1990 by MF.  Added variable "incflg" to hold incomplete-
+;      file status for SET INCOMPLETE-FILES command.
+; edit 7: 8 April, 1987 by OBSchou.  Added a new entry EXTERN to leap off to
+;      code written by the user to emulate any terminal they want.  All 
+;      characters are sent here in stead of conout during connect state.  
+;      In due course, Ill trap all prtstrs and dconio as well.
+;
+; edit 6: May 30, 1986 by OBSchou.  Added two more entries to the link area:
+;       first to point to a "family" string giving the family name of the 
+;       system.  If the older CP4SYS.ASM still has the code, then the 
+;       string is null.  Secondly, a JMP to give printer status (should be 
+;       a BIOS function).  If 0 then printer is ready, if 0ffh then printer 
+;       busy.  This makes version 4.07 incompatable with 4.05
+;
+; edit 5: February 6, 1985
+;       Added a storage variable, "PORT", for the port-in-use value 
+;       required for the port status routine (same purpose as SPEED).
+;       Also moved the printer copy flag (PRNFLG:) into the commun-
+;       ications storage area so machine dependant overlay can access it.
+;       [Hal Hostetler]
+;       Also, replace assembly-time conditional "ffussy" with run-time
+;       switch (CJC).
+;
+; edit 4: August 21, 1984 (CJC)
+;       Define a use for the third word of the linkage section: it points
+;       to the version string for CP4SYS.ASM.  Add flsmdm, to flush comm line
+;       on startup.  Add bufadr and bufsec for multiple-sector buffer support.
+;       Shift the entry section up two bytes so we can exit cleanly from DDT.
+;
+; edit 3: August 3, 1984 (CJC)
+;       put "mover" in CP4SYS, so we can do a Z80 block move if so inclined.
+;
+; edit 2: July 10, 1984 (CJC)
+;       integrate Toad Hall changes for LASM compatibility: CP4LNK is linked
+;       by CP4DEF, and links CP4SYS.
+;
+; edit 1: May, 1984 (CJC)
+;       extracted from CPMBASE.M80 version 3.9; modifications are described
+;       in the accompanying .UPD file.
+;
+
+;       Define the entry section.  These addresses contain jumps to
+;       useful routines in KERMIT.  To show we know what we're doing,
+;       we store the length of this section (entsiz) in our linkage
+;       section.  I didn't use ORG and DS because I don't want zeroes
+;       generated for all the space between here and the actual start
+;       of cp4sys.
+entry  equ     105H    ; start of entry section
+kermit equ     entry+0 ; reentry address
+nout   equ     entry+3 ; output HL in decimal
+entsiz equ     2*3     ; 2 entries, so far.
+;
+;       End of entry section.
+;
+;       Linkage section.  This block (through the definition of lnksiz)
+;       is used by Kermit to reach the routines and data in the overlay.
+;       The section length is stored at the beginning of the overlay
+;       area so Kermit can verify that the overlay section is (a) present,
+;       (b) in the right place, and (c) the same size as (and therefore
+;       presumably the same as) the linkage section Kermit is expecting.
+;
+       ASEG
+       ORG     OVLADR
+;
+lnkflg:        dw      lnksiz  ; linkage information for consistency check.
+       dw      entsiz  ; length of entry table, for same.
+       dw      swtver  ; address of switcher.  CPXSYS now a family
+       dw      family  ;*NEW* for V4.08. Address of the family string
+;
+;       hooks for system-dependent routines:
+;
+; Input/output routines. 
+;
+       jmp     selmdm  ; select modem for I/O
+       jmp     outmdm  ; output character in E to modem
+       jmp     inpmdm  ; read character from modem. return character or 0 in A.
+       jmp     flsmdm  ; flush pending input from modem
+       jmp     selcon  ; select console for I/O
+       jmp     outcon  ; output character in E to console
+       jmp     inpcon  ; read char from console. return character or 0 in A
+       jmp     outlpt  ; output character in E to printer
+       jmp     lptstat ;*NEW*  get the status for the printer. 
+                       ; 0=>ok, 0ffh=> not ok
+       jmp     0       ;*NEW for 4.09* Terminal Emulation code (optional)
+                       ; If terminal is set to EXTERNAL and this address
+                       ; has been filled, then user uses their own code.
+xbdos: jmp     0       ;*NEW* Address of the BDOS trap in the independent 
+                       ; code. Use this enty for BDOS calls if you want 
+                       ; the printer handler to work properly.
+
+; screen formatting routines
+       jmp     clrlin  ; erase current line
+       jmp     clrspc  ; erase current position (after backspace)
+       jmp     delchr  ; make delete look like backspace
+       jmp     clrtop  ; erase screen and go home
+;
+; these routines are called to display a field on the screen.
+       jmp     scrend  ; move to prompt field
+       jmp     screrr  ; move to error message field
+       jmp     scrfln  ; move to filename field
+       jmp     scrnp   ; move to packet count field
+       jmp     scrnrt  ; move to retry count field
+       jmp     scrst   ; move to status field
+       jmp     rppos   ; move to receive packet field (debug)
+       jmp     sppos   ; move to send packet field (debug)
+;
+       jmp     sysinit ; program initialization
+       jmp     sysexit ; program termination
+       jmp     syscon  ; remote session initialization
+       jmp     syscls  ; return to local command level
+       jmp     sysinh  ; help text for interrupt (escape) extensions
+       jmp     sysint  ; interrupt (escape) extensions, including break
+       jmp     sysflt  ; filter for incoming characters.
+                       ;  called with character in E.
+       jmp     sysbye  ; terminate remote session
+       jmp     sysspd  ; baud rate change routine.
+                       ; called with value from table in DE
+       jmp     sysprt  ; port change routine.
+                       ; called with value from table in HL
+       jmp     sysscr  ; screen setup for file transfer
+                       ; called with Kermit's version string in DE
+       jmp     csrpos  ; move cursor to row B, column C
+       jmp     sysspc  ; calculate free space for current drive
+       jmp     mover   ; do block move
+       jmp     prtstr  ; *** NEW *** Link from system indep equivalent
+;
+;       Local parameter values
+;
+pttab: dw      ttab    ; points to local equivalents to VT52 escape sequences
+spdtab:        dw      spdtbl  ; address of baud rate command table, or zero
+spdhlp:        dw      sphtbl  ; address of baud rate help table, or zero
+prttab:        dw      prttbl  ; address of port command table, or zero
+prthlp:        dw      prhtbl  ; address of port help table, or zero
+timout:        dw      fuzval  ; Fuzzy timeout.
+vtflg: db      vtval   ; VT52 emulation flag
+escchr:        db      defesc  ; Storage for the escape character.
+speed: dw      0FFFFH  ; storage for the baud rate (initially unknown)
+port:  dw      0FFFFH  ; storage for port value (initially unknown) [hh]
+prnflg:        db      0       ; printer copy flag [hh]
+dbgflg:        db      0       ; debugging flag
+ecoflg:        db      0       ; Local echo flag (default off).
+flwflg:        db      1       ; File warning flag (default on).
+ibmflg:        db      0       ; IBM flag (default off).
+cpmflg:        db      0       ;[bt] file-mode flag (default is DEFAULT)
+incflg:        db      0               ;[MF]incomplete-file flag (default is DISCARD)
+parity:        db      defpar  ; Parity.
+spsiz: db      dspsiz  ; Send packet size.
+rpsiz: db      drpsiz  ; Receive packet size.
+stime: db      dstime  ; Send time out.
+rtime: db      drtime  ; Receive time out.
+spad:  db      dspad   ; Send padding.
+rpad:  db      drpad   ; Receive padding.
+spadch:        db      dspadc  ; Send padding char.
+rpadch:        db      drpadc  ; Receive padding char.
+seol:  db      dseol   ; Send EOL char.
+reol:  db      dreol   ; Receive EOL char.
+squote:        db      dsquot  ; Send quote char.
+rquote:        db      drquot  ; Receive quote char.
+chktyp:        db      dschkt  ; Checksum type desired
+tacflg:                        ; TACtrap status:
+IF     tac
+       db      tacval  ; when non-zero, is current TAC intercept character;
+ENDIF;tac
+IF     NOT tac
+       db      0       ; when zero, TACtrap is off.
+ENDIF;tac
+tacchr:        db      tacval  ; Desired TAC intercept character (even when off)
+bufadr:        dw      buff    ; Address of possibly multi-sector buffer for I/O
+bufsec:        db      1       ; Number of sectors big buffer can hold (0 means 256)
+ffussy:        db      1       ; if nonzero, don't permit <>.,;?*[] in CP/M filespec.
+; space used by directory command; here because space calculation is
+;  (operating) system-dependent
+bmax:  ds      2       ; highest block number on drive
+bmask: ds      1       ; (records/block)-1
+bshiftf: ds    1       ; number of shifts to multiply by rec/block
+nnams: ds      1       ; counter for filenames per line
+
+lnksiz equ     $-lnkflg ; length of linkage section, for consistency check.
+
+IF lasm                        ; If we're assembling with LASM,
+       LINK    CPXCOM  ;  get the next section.
+ENDIF;lasm
diff --git a/cpxmrl.asm b/cpxmrl.asm
new file mode 100644 (file)
index 0000000..31d6849
--- /dev/null
@@ -0,0 +1,454 @@
+IF NOT lasm
+.printx * CPXMRL.ASM *
+ENDIF  ; NOT lasm
+;       KERMIT - (Celtic for "FREE")
+;
+;       This is the CP/M-80 implementation of the Columbia University
+;       KERMIT file transfer protocol.
+;
+;       Version 4.0
+;
+;       Copyright June 1981,1982,1983,1984,1985
+;       Columbia University
+;
+; Originally written by Bill Catchings of the Columbia University Center for
+; Computing Activities, 612 W. 115th St., New York, NY 10025.
+;
+; Contributions by Frank da Cruz, Daphne Tzoar, Bernie Eiben,
+; Bruce Tanner, Nick Bush, Greg Small, Kimmo Laaksonen, Jeff Damens, and many
+; others.
+;
+; CPXMRL.ASM created 16 July, 1987 from submitted code by William Rose.
+;
+;      Kermit system dependent file for Rair Black Box (British Telecom
+;      Merlin, ICL PC etc) originally submitted by William Rose, and
+;      modified by OBSchou to work with the Kermit-80 V4.08 and later 
+;      files.  Wills original overlay file a stripped down CPXSYS.ASM
+;      file.
+;
+; KERSYS.ASM - version 0.6A dated 17 Jun 87.
+;
+; Cutdown CP4SYS.ASM for Telecom Merlin M2215 only. (ICL PC, Rair Black Box)
+;
+; This uses TTY1: only, and cannot alter it's parameters.  It resets the 
+; interrupt flag to prevent use of the buffer, and is generally a kludge.
+; However it runs at 4800 baud, and tidying the code might get 9600.
+;
+; Revision History (Last entry first)
+;
+; edit 2, 22 July by OBSchou to massage frile to fit with CPXCOM.ASM
+;
+; edit 1, 17 July by OBSchou for Will Rose, to make file suitable for V4.08
+;      overlay etc.
+;
+; Keep module name, edit number, and last revision date in memory.
+;
+family:        db      'CPXMRL.ASM (2)  22-Jun-87  $'  ; Telecom Merlin added
+
+;
+; Assembly time message to let me know I'm building the right version.
+;
+
+IF m2215
+ .printx * Assembling Kermit-80 for Merlin M2215 *
+ENDIF
+
+IF m2215       ;equates removed because interrupts stopped port access 
+;iobase        equ     14h             ; base address of TTY1
+;mnport        equ     iobase          ; rx and tx data ports
+;mnprts        equ     iobase+1        ; status port
+;mnmode        equ     iobase+2        ; mode port
+;mncmd equ     iobase+3        ; PCI command port
+;txrdy equ     1               ; tx ready bit set if free
+;output        equ     txrdy
+;rxrdy equ     2               ; RX ready bit
+;input equ     rxrdy
+z80    equ     false           ; For Merlin M2215
+ENDIF
+
+
+sysxin:                ; Continue system initialisation fro sysinit
+
+IF FALSE                       ; unable to penetrate the 8085 interrupts
+       in      mncmd           ; clear command register counter
+       mvi     a,4eh           ; 0100$1110 - 1 stop bit, 8 data bits,
+                               ; / by 16 counter
+       out     mnmode
+       mvi     a,30h+7         ; 0011$0000 - select internal rate generator
+                               ; use 1200 baud by default
+       out     mnmode
+       mvi     a,27h           ; 0010$0111 - enable tx and rx, RTS and DTR low
+       out     mncmd
+       mvi     h, 12
+       mvi     l, 12
+       shld    speed           ; to show its been set up
+
+ENDIF
+
+       ret
+
+porbuf:        ds      3               ; original port settings
+
+;
+;      system-dependent KERMIT termination processing
+;      If we've changed anything, this is our last chance to put it back.
+;
+sysexit:
+       ret
+
+;
+;      system-dependent processing for start of CONNECT command
+;
+syscon:
+       ret
+
+conmsg:                ; Messages printed when entering transparent (CONNECT) mode:
+
+       db      '$'
+
+;
+;      syscls - system-dependent close routine
+;      called when exiting transparent session.
+;
+syscls:
+       ret
+
+;
+;      sysinh - help for system-dependent special functions.
+;      called in response to <escape>?, after listing all the
+;      system-independent escape sequences.
+;
+sysinh:
+                               ; still can't pentrate interrupts
+       ret
+
+; Additional, system-dependent help for transparent mode
+; (two-character escape sequences)
+;
+inhlps:
+
+IF m2215
+       db      cr, lf, 'B  Transmit a BREAK'
+ENDIF
+
+       db      '$'                     ; string terminator
+
+;
+;      sysint - system dependent special functions
+;      called when transparent escape character has been typed;
+;      the second character of the sequence is in A (and in B).
+;      returns:
+;      non-skip: sequence has been processed
+;      skip:   seqence was not recognized
+;
+sysint:        ani     137O            ; convert lower case to upper, for testing...
+
+IF FALSE                       ; as always
+       cpi     'B'             ; send break ?
+       jz      sendbr
+ENDIF
+       jmp     rskp            ; take skip return - command not recognised
+
+; Actual commands
+
+IF FALSE                       ;as always
+sendbr:
+       in      mnprts
+       ani     04h             ; make sure shift reg is clear
+       jz      sendbr
+
+       mvi     a,2fh           ; set for a break
+       out     mncmd
+       mvi     a,100           ; wait a bit
+       call    delay
+       mvi     a,27h           ; restore mode
+       out     mncmd
+
+       ret
+ENDIF
+
+       ret
+
+;
+;      sysflt - system-dependent filter
+;      called with character in E.
+;      if this character should not be printed, return with A = zero.
+;      preserves bc, de, hl.
+;      note: <xon>,<xoff>,<del>, and <nul> are always discarded.
+;
+sysflt:
+       mov     a,e             ; get character for testing
+       ret
+
+;
+;      mdmflt - modem filter
+;      called with character to be sent to printer in E
+;      with parity set as appropriate.
+;      return with accumulator = 0 do do nothing,
+;                              <> 0 to send char in E.
+mdmflt:
+       mov     a,e             ; get character to test
+       ret
+
+;
+;      prtflt - printer filter
+;      called with character to be sent to printer in E
+;      returns with a = 0 to do nothing
+;                   a <> 0 to print it.
+;
+;      this routine for those printer that automatically insert
+;      a lf on cr, or cr for lf.  Should this be shifted to 
+;      the system indep. stuff, in say 4.06?
+;
+prtflt:
+       mov     a,e             ; get character to test
+
+IF FALSE                       ; strip out lf from printer stream
+       ani     7fh             ; make sure it is parity less
+       cpi     lf              ; is it a line feed?
+       rnz                     ; no, print it
+;      xra     a               ; yes, don't.
+       
+ENDIF
+
+       ret
+
+;
+; system-dependent processing for BYE command.
+;
+sysbye:
+       ret
+
+;
+;      This is the system-dependent command to change the baud rate.
+;      DE contains the two-byte value from the baud rate table; both
+;      bytes of this value are also stored in 'speed'.
+;
+sysspd:
+
+IF FALSE                       ; as always
+       in      mncmd           ; clear register counter
+       mvi     a,4eh           ; set for 1 stop, 8 data bits
+       out     mnmode          ; save in mode 1 port
+       mvi     a,30h           ; set bits for rate etc..
+       add     e               ; add baud rate (bits 0 - 3)
+       out     mnmode          ; set mode port 2
+       mvi     a,27h           ; set tx/rx ready, RTS CTS active
+       out     mncmd
+       ret
+ENDIF
+       ret                     ; if routine not supported
+;
+;      Speed tables
+; (Note that speed tables MUST be in alphabetical order for later
+; lookup procedures, and must begin with a value showing the total
+; number of entries.  The speed help tables are just for us poor
+; humans.
+;
+;      db      string length, string, divisor (2 bytes or 1 word, ab)
+;              the data byte a is return in A and E, and b in D
+;              only byte 'a' is the key for the table
+
+IF FALSE                       ; as always
+spdtbl:        db      16              ; sixteen entries for PCI
+       db      3,'110$',       2,2
+       db      4,'1200$',      7,7
+       db      3,'134$',       3,3
+       db      3,'150$',       4,4
+       db      4,'1800$',      8,8
+       db      5,'19200$',     15,15
+       db      4,'2000$',      9,9
+       db      4,'2400$',      10,10
+       db      3,'300$',       5,5
+       db      4,'3600$',      11,11
+       db      4,'4800$',      12,12
+       db      2,'50$',        0,0
+       db      3,'600$',       6,6
+       db      4,'7200$',      13,13
+       db      2,'75$',        1,1
+       db      4,'9600$',      14,14
+
+sphtbl:        db      '     50     75    110    134    150    300    600   1200   '
+       db      cr,lf,'1800   2000   2400   3600   4800   7200   9600  19200$'
+ENDIF
+
+IF m2215
+spdtbl equ     0               ; routine unsupported
+sphtbl equ     0
+ENDIF
+
+;
+;      This is the system-dependent SET PORT command.
+;      HL contains the argument from the command table.
+;
+sysprt:
+
+IF m2215
+prttbl equ     0               ; SET PORT is not supported
+prhtbl equ     0               ; Merlin M2215 could, I suppose
+ENDIF
+
+;
+;      selmdm - select modem port
+;      selcon - select console port
+;      selmdm is called before using inpmdm or outmdm;
+;      selcon is called before using inpcon or outcon.
+;      For iobyt systems, diddle the I/O byte to select console or comm port;
+;      For the rest, does nothing.
+;      preserves bc, de, hl.
+;
+selmdm:
+       ret
+
+selcon:
+       ret
+
+;
+;      Get character from console, or return zero.
+;      result is returned in A.  destroys bc, de, hl.
+;
+inpcon:
+       call    0f55dh          ;CONST BIOS vector
+       ora     a               ;set flags
+       rz
+       call    0f56eh          ;CONIN BIOS vector
+       ret
+
+;
+;      Output character in E to the console.
+;      destroys bc, de, hl
+;
+outcon:
+       mov     c, e
+       call    0f57fh          ;CONOUT BIOS vector
+       ret
+
+;
+;      outmdm - output a char from E to the modem.
+;              the parity bit has been set as necessary.
+;      returns nonskip; bc, de, hl preserved.
+;
+outmdm:
+
+IF m2215
+       push    psw
+       push    h
+       push    d
+       push    b
+
+       mov     c, e
+       mvi     a, 1            ; ie: tty1:
+       mov     d, a
+       call    0f6a2h          ;PUN BIOS vector
+
+       pop     b
+       pop     d
+       pop     h
+       pop     psw
+ENDIF
+       
+       ret
+
+;
+;      for IOBYT systems, the modem port has already been selected.
+;      destroys bc, de, hl.
+;
+inpmdm:
+
+IF m2215
+                               ; check status
+       lda     0fa32h          ; ie. tty1:
+       ora     a
+       rz
+
+       mvi     a, 1            ; RDR BIOS vector
+       mov     d, a
+       call    0f651h
+;      ani     7fh
+
+       push    a
+       di
+       mvi     a, 0
+       sta     0fa32h          ; remove interrupt flag
+       sta     0f2d3h          ; zero buffer counter
+       lda     0f2d4h
+       sta     0f2d5h
+       ei
+       nop
+       pop     a
+
+       ret
+ENDIF
+
+;
+;      flsmdm - flush comm line.
+;      Modem is selected.
+;      Currently, just gets characters until none are available.
+;
+flsmdm:
+
+       call    inpmdm          ; Try to get a character
+       ora     a               ; Got one?
+       jnz     flsmdm          ; If so, try for another
+       ret                     ; Receiver is drained.  Return.
+
+
+;\f
+
+;
+;       lptstat - get the printer status. Return a=0 if ok, or 0ffh if not.
+lptstat:
+IF iobyte       ;[33]
+        call    bprtst          ; get status
+ENDIF   ;iobyte[33]
+
+IF NOT iobyte   ;[33]
+        xra     a               ; assume it is ok.. this may not be necessary
+ENDIF   ;iobyte [33]
+        ret
+;
+;      outlpt - output character in E to printer
+;      console is selected.
+;      preserves de.
+;
+outlpt:
+       push    d               ; save DE in either case
+       call    prtflt          ; go through printer filter [30]
+       ana     a               ; if A = 0 do nothing,
+       jz      outlp1          ; if a=0 do nothing
+
+outlp1:        pop     d               ; restore saved register pair
+       ret
+
+; delchr - make delete look like a backspace.  Unless delete is a printing
+;      character, we just need to print a backspace. (we'll output clrspc
+;      afterwards)
+delchr:
+
+       mvi     e,bs            ;get a backspace
+       jmp     outcon
+
+; erase the character at the current cursor position
+clrspc:        mvi     e,' '
+       call    outcon
+       mvi     e,bs            ;get a backspace
+       jmp     outcon
+
+; erase the current line
+clrlin:        lxi     d,eralin
+       jmp     prtstr
+
+; erase the whole screen, and go home. preserves b (but not c)
+clrtop:        lxi     d,erascr
+       jmp     prtstr
+
+
+IF m2215
+sysver:        db      'BT Merlin M2215, port TTY1:, settings unchanged.$'
+ENDIF
+
+tstmsg:        db      'Test message',cr,lf,'$'
+
+IF lasm
+LINK CPXVDU.ASM        ; link to the Terminal definition tables
+ENDIF  ;lasm
diff --git a/cpxnor.asm b/cpxnor.asm
new file mode 100644 (file)
index 0000000..2648060
--- /dev/null
@@ -0,0 +1,587 @@
+IF NOT LASM
+.printx * CPXNOR.ASM *
+ENDIF  ;NOT lasm
+;       KERMIT - (Celtic for "FREE")
+;
+;       This is the CP/M-80 implementation of the Columbia University
+;       KERMIT file transfer protocol.
+;
+;       Version 4.0
+;
+;       Copyright June 1981,1982,1983,1984,1985
+;       Columbia University
+;
+; Originally written by Bill Catchings of the Columbia University Center for
+; Computing Activities, 612 W. 115th St., New York, NY 10025.
+;
+; Contributions by Frank da Cruz, Daphne Tzoar, Bernie Eiben,
+; Bruce Tanner, Nick Bush, Greg Small, Kimmo Laaksonen, Jeff Damens, and many
+; others.
+;
+;       This file contains the system-dependent code and data for various
+;       NorthStar KERMITs.  This has the Family name of CPXNOR.ASM.
+;
+; revision history (last edit first)
+;
+;edit 4, 16-Jan-1991 by MF. Fixed a bug in OUTCON wherein the final RET
+;      was missing (bug reported by David P. Arnot of Scottish
+;      Agricultural College).
+;edit 3, 12-Oct-1990 by MF.  Added a semicolon before the comment
+;      beginning "Family is the string so we don't get errors
+; edit 2, 23 July, 1987 by OBSchou to massage file to suit CPXCOM.ASM.
+;
+; edit 1:  1 June, 1986 by OBSchou, Loughborogh University, UK.
+;       Hived off northstar and Comart system dependent modules from 
+;       CPXSYS.ASM.  This assembles ok, but I cannot test it.  Any comments?
+
+
+IF norths
+.printx        * Assembling for NorthStar Horizon with HSIO-4 board *
+ENDIF;norths
+
+IF horizon     ;[25]
+.printx        * Assembling KERMIT-80 for the NorthStar Horizon *
+ENDIF;horizon
+
+IF advant      ;[22]
+.printx        * Assembling kermit-80 for North Star Advantage *
+ENDIF  ;[22]
+
+IF basicns     ;[29]
+.printx        * Assembling KERMIT-80 for the Northstar Horizon using printer port *
+ENDIF  ;basicns [29]
+
+IF comart
+.printx        * Assembling KERMIT-80 for Comart Communicator *
+ENDIF ; comart
+
+; the basics...
+IF norths ;The basic Northstar Horizon BIOS does not access ports 2-5
+port0d equ     02h             ;Port 0 data (console)
+port0s equ     03h             ;Port 0 status
+port1d equ     04h             ;Port 1 data (printer)
+port1s equ     05h             ;Port 1 status
+
+port2b equ     10h             ;Port 2 baud
+port2i equ     11h             ;Port 2 interrupt mask
+port2d equ     12h             ;Port 2 data
+port2s equ     13h             ;Port 2 status
+
+port3b equ     14h             ;Port 3 baud
+port3i equ     15h             ;Port 3 interrupt mask
+port3d equ     16h             ;Port 3 data
+port3s equ     17h             ;Port 3 status
+
+port4b equ     18h             ;Port 4 baud
+port4i equ     19h             ;Port 4 interrupt mask
+port4d equ     1Ah             ;Port 4 data
+port4s equ     1Bh             ;Port 4 status
+
+port5b equ     1Ch             ;Port 5 baud
+port5i equ     1Dh             ;Port 5 interrupt mask
+port5d equ     1Eh             ;Port 5 data
+port5s equ     1Fh             ;Port 5 status
+
+NS19K2 EQU     00H             ;19.2 kilobaud
+NS9600 EQU     01H             ;9600 baud
+NS4800 EQU     02H             ;4800 baud
+NS2400 EQU     03H             ;2400 baud
+NS1200 EQU     04H             ;1200 baud
+NS0600 EQU     05H             ; 600 baud
+NS0300 EQU     06H             ; 300 baud
+NS0110 EQU     07H             ; 110 baud
+;; Set to use port 5 at 1200 baud
+mnport equ     port5d          ;Data port
+mnprts equ     port5s          ;Status port
+baudrt equ     port5b          ;Baud rate port
+baudini        equ     ns1200          ;Initial baud rate
+output EQU     1               ;Bit of UART status for transmitter ready
+input  EQU     2               ;Bit of UART status for receiver ready
+z80    EQU     TRUE            ;This one's a Z80.
+ENDIF;norths
+
+IF basicns     ;[29]
+mnport equ     04h             ;printer port data
+mnprts equ     05h             ; printer port status
+output equ     1               ;transmitter ready
+input  equ     2               ;receiver ready
+z80    equ     FALSE           ; not important
+ENDIF  ;basicns [29]
+
+IF horizon             ;[25]
+mnport EQU     004H    ;Modem data port
+mnprts EQU     005H    ;Modem status port
+output EQU     01H     ;Transmitter empty
+input  EQU     02H     ;Input data available
+TxEmpty        EQU     04h     ;Transmitter empty
+;Note:  Needs terminal definition (vt100, vt52, tvi925, adm3a or crt above)
+z80    EQU     TRUE    ;This one's a Z80.
+ENDIF;horizon
+
+IF advant      ;[22]
+vtval  EQU     1               ; we do emulation of VT52s
+slot   EQU     1               ;SIO card slot
+mnport EQU     (6-slot)*16     ;Modem data port
+mnprts EQU     mnport+1        ;Modem status port
+baudrt EQU     mnport+8        ;Baud rate register
+output EQU     01H             ;Transmitter buffer empty
+input  EQU     02H             ;Input data available
+TxEmpty        EQU     04h             ;Transmitter empty flag
+z80    EQU     TRUE
+ENDIF;[22] advant
+
+IF comart              ;[25]
+mnport EQU     002H    ;Modem data port
+mnprts EQU     003H    ;Modem status port
+output EQU     01H     ;Transmitter empty
+input  EQU     02H     ;Input data available
+TxEmpty        EQU     04h     ;Transmitter empty
+;Note:  Needs terminal definition (vt100, vt52, tvi925, adm3a or crt above)
+z80    EQU     TRUE    ;This one's a Z80.
+ENDIF;comart
+
+
+IF advant
+defesc EQU     '\'-100O
+ENDIF;advant
+
+;\f
+;      Family is the string used in VERSION to say which of several 
+;       smaller overlay files are used.  These are (will be) derived from 
+;       the juge CP4SYS.ASM file, in which case we will never get here.  
+;       Just a Dollar, but put a sting in for a family of machines.
+;
+family:        db      'CPXNOR.ASM  (4)  16-Jan-1991$'    ; Used for family versions....
+
+
+
+sysxin:                ; continuation of system dependent initialisation code
+IF advant      ;[22]
+       mvi     a,40h
+       out     mnprts          ; Reset USART
+       lxi     h,7070h         ; Default to 1200 baud
+       shld    speed           ; store current speed
+       xchg
+       call    sysspd          ; set default baud rate
+       mvi     a,4Eh           ; Set UART mode to async 16x clock, 8 data
+       out     mnprts          ;    bits, no parity, and 1 stop bit
+       mvi     a,37h           ; Set command to Tx enable, DTR on, Rx enable,
+       out     mnprts          ;    break off, error reset, and RTS on
+ENDIF;[22] advant
+
+IF norths
+       mvi     a,baudini       ;Get initial speed
+       out     baudrt
+       sta     speed           ;save for status display
+       sta     speed+1
+ENDIF;norths
+
+IF comart OR horizon           ;[25]
+; The PD8251/PD8251A is reset by three successive 00 Hex or two
+; successive 80 Hex command instructions followed by a software
+; reset command instruction (40 Hex).
+       mvi     a,80h           ; Send UART reset
+       out     mnprts
+       mvi     a,80h
+       out     mnprts
+       mvi     a,40h
+       out     mnprts
+       mvi     a,4Eh           ; Set UART mode to async 16x clock, 8 data
+       out     mnprts          ;    bits, no parity, and 1 stop bit
+       mvi     a,37h           ; Set command to Tx enable, DTR on, Rx enable,
+       out     mnprts          ;    break off, error reset, and RTS on
+ENDIF;comart OR horizon
+
+
+       ret                     ; return from system-dependent routine
+;\f
+
+;
+;       system-dependent termination processing
+;       If we've changed anything, this is our last chance to put it back.
+sysexit:
+
+       ret
+
+;
+;       system-dependent processing for start of CONNECT command
+;
+syscon:
+       ret
+
+conmsg:                ; Messages printed when entering transparent (CONNECT) mode:
+;\f
+
+;
+;       syscls - system-dependent close routine
+;       called when exiting transparent session.
+;
+syscls:
+       ret
+;\f
+
+;
+;       sysinh - help for system-dependent special functions.
+;       called in response to <escape>?, after listing all the
+;       system-independent escape sequences.
+;
+sysinh:
+IF advant OR comart OR horizon ; some more
+       lxi     d,inhlps        ; we got options...
+       call    prtstr          ; print them.
+ENDIF;[22] advant OR comart OR horizon [29]
+
+       ret
+
+
+;additional, system-dependent help for transparent mode
+; (two-character escape sequences)
+inhlps:
+
+; [16] [18] have added super brain and Torch to the list of Breaking machines.
+IF advant OR comart OR horizon ; ... some more
+       db      cr,lf,'B  Transmit a BREAK'
+ENDIF;[22] advant OR comart OR horizon
+
+       db      '$'                     ;[hh] table terminator
+
+;
+;       sysint - system dependent special functions
+;       called when transparent escape character has been typed;
+;       the second character of the sequence is in A (and in B).
+;       returns:
+;       non-skip: sequence has been processed
+;       skip:   sequence was not recognized
+sysint:        ani     137O            ; convert lower case to upper, for testing...
+IF advant OR comart OR horizon ; [22] [25] ... some more
+       cpi     'B'             ; send break?
+       jz      sendbr          ; yes, go do it.  return nonskip when through.
+ENDIF;advant OR comart OR horizon [32]
+
+       jmp     rskp            ; take skip return - command not recognized.
+
+
+;\f
+
+IF advant OR comart OR horizon ;[lmj] 
+sendbr:
+;
+;       Ensure that the transmitter has finished sending buffered chars
+sndbr1:        in      mnprts          ; get UART status
+       ani     TxEmpty         ; everything sent?
+       jz      sndbr1          ; no, wait a bit more
+;
+;       Begin sending a break by setting bit in UART command register
+       mvi     a,3Fh           ; Set TxEna, DTR, RxEna, SBreak, ErrRst, RTS
+       out     mnprts
+;
+;       Wait for 250 milliseconds (using hundredths second delay routine)
+       mvi     a,25
+       call    delay
+;
+;       Resume normal operation by clearing the SendBreak command bit
+       mvi     a,37h           ;Set TxEna, DTR, RxEna, ErrRst, RTS
+       out     mnprts
+;
+       ret                     ;done
+ENDIF;advant OR comart OR horizon
+
+;\f
+
+;
+;       sysflt - system-dependent filter
+;       called with character in E.
+;       if this character should not be printed, return with A = zero.
+;       preserves bc, de, hl.
+;       note: <xon>,<xoff>,<del>, and <nul> are always discarded.
+sysflt:
+       mov     a,e             ; get character for testing
+IF advant      ;[22]
+       cpi     'D'-100O        ;Control-D's reset video
+       rnz                     ; if not control-D, it's ok.
+       xra     a               ; don't allow control-D out.
+ENDIF;[22] advant
+       ret
+
+;       mdmflt - modem filter [30]
+;       called with character to be sent to printer in E
+;       with parity set as appropriate.
+;       return with accumulator = 0 do do nothing,
+;                               <> 0 to send char in E.
+mdmflt:
+       mov     a,e             ;[30] get character to test
+       ret
+
+
+
+;       prtflt - printer filter [30]
+;       called with character to be sent to printer in E
+;       returns with a = 0 to do nothing
+;                    a <> 0 to print it.
+;
+;       this routine for those printer that automatically insert
+;       a lf on cr, or cr for lf.  Should this be shifted to 
+;       the system indep. stuff, in say 4.06?
+prtflt:
+       mov     a,e             ; [30] get character to test
+       ret
+
+
+;\f
+
+;
+; system-dependent processing for BYE command.
+;  for apmmdm, heath, and lobo, hang up the phone.
+sysbye:
+       ret
+;\f
+
+;       This is the system-dependent command to change the baud rate.
+;       DE contains the two-byte value from the baud rate table; this
+;       value is also stored in 'speed'.
+sysspd:
+IF norths OR advant ;
+       mov     a,e             ; get the parsed value
+       out     baudrt          ; Tell the baud rate generator.
+       ret
+ENDIF;norths OR advant 
+
+IF advant      ;[22]
+spdtbl:        db      6                       ; 6 entries
+       db      04,'1200$',     70h,70h
+       db      04,'2400$',     78h,78h
+       db      03,'300$',      40h,40h
+       db      04,'4800$',     7Ch,7Ch
+       db      03,'600$',      60h,60h
+       db      04,'9600$',     7Eh,7Eh
+
+sphtbl:        db      cr,lf,'   300    600    1200    2400    4800    9600$'
+ENDIF;[22] advant
+
+
+IF norths
+spdtbl:        db      8               ; 8 entries
+       db      3,'110$',       07H,07H
+       db      4,'1200$',      04H,04H
+       db      5,'19200$',     00H,00H
+       db      4,'2400$',      03H,03H
+       db      3,'300$',       06H,06H
+       db      4,'4800$',      02H,02H
+       db      3,'600$',       05H,05H
+       db      4,'9600$',      01H,01H
+
+
+sphtbl:        db      cr,lf
+       db      '   110   300   600  12000  2400  4800  9600 19200$'
+ENDIF;norths
+
+; The following conditionals were once a huge if not statement.  There
+; wasn't enough room to add the lobo to the list, so it had to be broken
+; into 2, which you can't do with an if not.  I redid it as two ifs and
+; applied them to those that wouldn't set baud. [Hal Hostetler]
+IF NOT (advant OR norths)
+spdtbl EQU     0               ;[hh] SET BAUD not supported.
+sphtbl EQU     0               ;[hh] ran out of room above...
+ENDIF  ;NOT (advant OR norths)
+;
+;\f
+
+;       This is the system-dependent SET PORT command.
+;       HL contains the argument from the command table.
+sysprt:
+       ret
+
+prttbl equ     0               ; SET PORT not supported
+prhtbl equ     0
+;\f
+
+;
+;       selmdm - select modem port
+;       selcon - select console port
+;       selmdm is called before using inpmdm or outmdm;
+;       selcon is called before using inpcon or outcon.
+;       For iobyt systems, diddle the I/O byte to select console or comm port;
+;       For Decision I, switches Multi I/O board to console or modem serial
+;       port.  [Toad Hall]
+;       For the rest, does nothing.
+;       preserves bc, de, hl.
+selmdm:
+selcon:
+       ret
+;\f
+
+;       Get character from console, or return zero.
+;       result is returned in A.  destroys bc, de, hl.
+;
+inpcon:
+       mvi     c,dconio        ;Direct console I/O BDOS call.
+       mvi     e,0FFH          ;Input.
+       call    BDOS
+       ret
+;\f
+
+;
+;       Output character in E to the console.
+;       destroys bc, de, hl
+;
+outcon:
+       mvi     c,dconio        ;Console output bdos call.
+       call    bdos            ;Output the char to the console.
+       ret                     ;[MF]per David P. Arnot
+;\f
+
+;
+;       outmdm - output a char from E to the modem.
+;               the parity bit has been set as necessary.
+;       returns nonskip; bc, de, hl preserved.
+outmdm:
+       in      mnprts          ;Get the output done flag.
+       ani     output          ;Is it set?
+       jz      outmdm          ;If not, loop until it is.
+       mov     a,e
+       out     mnport          ;Output it.
+       ret
+;\f
+
+;
+;       get character from modem; return zero if none available.
+;       for IOBYT systems, the modem port has already been selected.
+;       destroys bc, de, hl.
+inpmdm:
+;Note: modem port should already be selected for mdI.  [Toad Hall]
+       in      mnprts          ;Get the port status into A.
+       ani     input           ;See if the input ready bit is on.
+       rz                      ;If not then return.
+       in      mnport          ;If so, get the char.
+       ret                     ; return with character in A
+
+
+;
+;       flsmdm - flush comm line.
+;       Modem is selected.
+;       Currently, just gets characters until none are available.
+
+flsmdm:        call    inpmdm          ; Try to get a character
+       ora     a               ; Got one?
+       jnz     flsmdm          ; If so, try for another
+       ret                     ; Receiver is drained.  Return.
+;\f
+
+;
+;       lptstat - get the printer status. Return a=0ffh if ok, or 0 if not.
+lptstat:
+       xra     a               ; assume it is ok.. this may not be necessary
+       ret
+
+;
+;       outlpt - output character in E to printer
+;       console is selected.
+;       preserves de.
+outlpt:
+       push    d               ; save DE in either case
+       call    prtflt          ; go through printer filter [30]
+       ana     a               ; if A = 0 do nothing,
+       jz      outlp1          ; [30] if a=0 do nothing
+       mvi     c,lstout
+       call    bdos            ;Char to printer
+outlp1:        pop     d               ; restore saved register pair
+       ret
+IF advant      ; all others require terminals
+;\f
+
+;
+;       Screen manipulation routines
+;       csrpos - move to row B, column C
+;
+;       csrpos for terminals that use a leadin sequence followed
+;        by (row + 31.) and (column + 31.)
+;
+csrpos:        push    b               ; save coordinates
+       lxi     d,curldn        ; get cursor leadin sequence
+       call    prtstr          ; print it
+       pop     h               ; restore coordinates
+       mov     a,h             ; get row
+       adi     (' '-1)         ; space is row one
+       mov     e,a
+       push    h
+       call    outcon          ; output row
+       pop     h
+       mov     a,l             ; get column
+       adi     (' '-1)         ; space is column one
+       mov     e,a
+       jmp     outcon          ; output it and return
+ENDIF  ;advant
+
+;
+; delchr - make delete look like a backspace.  Unless delete is a printing
+;       character, we just need to print a backspace. (we'll output clrspc
+;       afterwards)
+;       For Kaypro and Vector General, delete puts a blotch on the screen.
+;       For Apple and Osborne 1, delete moves but doesn't print.
+delchr:
+IF advant              ;[22]
+       ret
+ENDIF;advant 
+IF NOT (advant );[22]
+       mvi     e,bs            ;get a backspace
+       jmp     outcon
+ENDIF;NOT (advant) [22]
+
+; erase the character at the current cursor position
+clrspc:        mvi     e,' '
+       call    outcon
+       mvi     e,bs            ;get a backspace
+       jmp     outcon
+
+; erase the current line
+clrlin:        lxi     d,eralin
+       jmp     prtstr
+
+; erase the whole screen, and go home. preserves b (but not c)
+clrtop:        lxi     d,erascr
+       jmp     prtstr
+
+
+IF norths
+sysver:        db      'Northstar Horizon$'
+ENDIF;norths
+
+IF basicns     ;[29]
+sysver:        db      'Northstar using printer port$'
+ENDIF  ;basicns [29]
+
+IF comart      ;[25]
+sysver:        db      'Comart Communicator$'
+ENDIF;comart
+
+IF horizon     ;[25]
+sysver:        db      'Northstar Horizon$'
+ENDIF;horizon
+
+IF advant      ;[22]
+sysver:        db      'North Star Advantage$'
+outlin:        db      04H,cr,lf,tab,'$'
+erascr:        db      04H,'$'                 ;Clear screen and go home.
+eralin:        db      cr,0EH,'$'              ;Clear line.
+curldn:        db      esc,'=$'                ;cursor leadin
+ttab:                                  ;Table start location.
+ta:    db      0BH,'$',0,0             ;Cursor up.
+tb:    db      0AH,'$',0,0             ;Cursor down.
+tc:    db      0CH,'$',0,0             ;Cursor right.
+td:    db      bs,'$',0,0              ;Cursor left
+te:    db      04H,'$',0,0             ;Clear display
+tf:    db      12H,'$',0,0             ;Enter Graphics Mode
+tg:    db      13H,'$',0,0             ;Exit Graphics mode
+th:    db      1EH,'$',0,0             ;Cursor home.
+ti:    db      0BH,'$',0,0             ;Reverse linefeed.
+tj:    db      0FH,'$',0,0             ;Clear to end of screen.
+tk:    db      0EH,'$',0,0             ;Clear to end of line.
+ENDIF;[22] advant
+IF lasm AND (NOT advant)
+LINK CPXVDU.ASM
+ENDIF   ;lasm - m80 will INCLUDE CPXVDU.ASM
+
+IF lasm        ; here if not a terminal selected and in LASM
+ovlend equ     $
+       END
+ENDIF  ;lasm
diff --git a/cpxpcw.asm b/cpxpcw.asm
new file mode 100644 (file)
index 0000000..554fd61
--- /dev/null
@@ -0,0 +1,912 @@
+IF NOT lasm
+.printx * CPXPCW.ASM *
+ENDIF  ;NOT lasm
+;
+; KERMIT - (Celtic for "FREE")
+;
+; This is the CP/M-80 implementation of the Columbia University
+; KERMIT file transfer protocol.
+;
+; Version 4.08
+;
+; Copyright June 1981,1982,1983,1984,1985
+; Columbia University
+;
+; Originally written by Bill Catchings of the Columbia University Center for
+; Computing Activities, 612 W. 115th St., New York, NY 10025.
+;
+; This file contains the system-dependent code and data for KERMIT
+; on the Amstrad range of personal computers.
+;
+;
+; Revision history:
+;
+;edit 9, 22-Jan-1991 by MF. Added "sysinit" code at "init04" from Kermit
+;      version 4.08 which had been left out of version 4.09 to reserve
+;      space for the Amstrad's I/O buffers. Amstrad Kermit now stores
+;      files correctly (version 4.09 had garbled files). Again,
+;      this fix comes from Mr. D. P. Arnot of the Scottish Agricultural
+;      College in the UK.
+;edit 8, 16-Jan-1991 by MF. Added a "bs" left out of "delstr" per
+;      instruction from David P. Arnot of Scottish Agricultural
+;      College, Auchincruive, Ayr, UK.
+;      E-mail:  <D.P.Arnot@edinburgh.ac.uk>
+; edit 7, 22 July 1987 by OBSchou to massage code to fit with CPXCOM.ASM
+;      Had to rename bcnout to bcnot as the former label clashed with
+;      one of the same name in CPXCOM.ASM.  Sorry, folks.
+;
+; edit 6, 14th July, 1987 by OBSchou for Phillip Wade, Hull University
+;      Computer Centre.  Change to delchr routine for PCW machines, 
+;      as character 127 decimal is a printing character on 
+;      the Amstrad PCW.  The routine has been replaced 
+;      by a bs,space,bs,bs string. (OBS Comment - why a total of THREE bs?)
+;
+; edit 5 9 May 1987 by C.J.MILES@UK.AC.UMRCC
+;      Hangup phone and clear screen options added to
+;      terminal mode.
+;
+; edit 4 23 March 1987 by C.J.MILES@UK.AC.UMRCC
+;      Use direct input drom SIO for CPC machines instead
+;      of using BDOS. Improvement reduces time for file
+;      transfer to 65% of time used by BDOS method.
+;      Add reverse Prestel baud rate.
+;
+; edit 3 20 March 1987 by Chris Miles (C.J.MILES@UK.AC.UMRCC)
+;      (Greater Manchester Archaeological Unit, Manchester Univ.).
+;      Added support for Amstrad CPC CP/M Plus machines,
+;      Added 31250 baud rate option,
+;      Bug fixed in sending BREAK,
+;      Bug fixed in 1200/75 baud setup
+;      Machine and CP/M version checks added.
+;
+; edit 2 11 Febuary, 1987 by OBSchou for Ian Young.
+;      Changes to the send break routine to change two lines of code from
+;              ori     018h            ; send break, Tx enable
+;      and     ori     0008h           ; Tx enable 
+;
+;      to      ori     01ah            ; send break, Tx enable, RTS
+;      and     ori     00ah            ; Tx enable, RTS
+;
+;      This is a bug fix to hopefully keep RTS actve during breaks.
+;
+; [Ed. (OBSchou) 21/1/87.
+; This file linked FROM cpxsys.asm, so do NOT rename this
+; file.  The diffculty of needing a HUGE CPXSYS.ASM file on your floppy
+; only to act as a switcher remains, but hopefully will be better in 
+; the future.  If you ARE stuck, then rename this CPXSYS.ASM but add the
+; label SYSEDT: to the FAMILY label.  A bit messy.]
+;
+;
+; The "author" of this system-dependent file is:
+;
+;  Ian A. Young
+;  Lattice Logic Ltd
+;  9 Wemyss Place
+;  Edinburgh
+;
+; Some other addresses:
+;
+;  ian@latlog.uucp
+;  ...seismo!mcvax!ukc!latlog!ian
+; or c/o OBSchou@uk.ac.lut.multics
+;
+; ... although much of the code concerned was written by others.
+;
+
+
+; Keep module name, edit number, and last revision date in memory.
+
+;sysedt:       db      'CPXSYS.ASM (36) 20-Mar-87$'
+family:        db      'CPXPCW.ASM (9)  22-Jan-1991$'
+
+
+;
+; Assembly-time message announcing which version we are building
+;
+
+IF pcw
+.printx        * Assembling Amstrad PCW Kermit-80 *
+ENDIF
+
+IF cpc
+.printx        * Assembling Amstrad CPC Kermit-80 *
+ENDIF
+
+;
+; Miscellany of parameter settings
+;
+z80    EQU     TRUE            ; all Amstrads have a Z80.
+defesc EQU     '\'-100O        ; The default escape character.
+vtval  EQU     0               ; we don't need VT52 emulation
+
+;
+; Amstrad CPC machines use 16 bit I/O address decoding and therefore
+; the Z80 instructions OUT (C),A and IN A,(C) must be defined.
+;
+outc   EQU     79edh           ; IN    A,(C)
+inpc   EQU     78edh           ; OUT   (C),A
+
+;
+; hardware information
+;
+; There is a Z80-DART (Mostek/SGS 8470) at I/O addresses E0..E3 (PCW)
+; and FADC..FADD (CPC), and a 8253 programmable divider running it at
+; E4..E7 (PCW) and FBDC..FBDF (CPC)
+;
+
+input  EQU     01h             ; input data available
+output EQU     04h             ; output buffer ready
+
+IF pcw
+mnport EQU     0E0h            ; data register for SIO
+mnprts EQU     0E1h            ; control register for SIO
+ctc0   EQU     0E4h            ; 8253 load counter 0
+ctc1   EQU     0E5h            ; 8253 load counter 1
+ctcmod EQU     0E7h            ; 8253 write mode word
+ENDIF
+
+IF cpc
+mnport EQU     0FADCh          ; data register for SIO
+mnprts EQU     0FADDh          ; control register for SIO
+ctc0   EQU     0FBDCh          ; 8253 load counter 0
+ctc1   EQU     0FBDDh          ; 8253 load counter 1
+ctcmod EQU     0FBDFh          ; 8253 write mode word
+ENDIF
+
+;
+; SIO input buffering
+;
+siosz  EQU     4096            ; size of SIO input buffer
+siomsk EQU     4095            ; mask for wrapping buffer round
+
+;
+; Extended BIOS jump-block addresses; reached through USERF
+;
+sainit EQU     00B6h           ; initialise SIO
+sabaud EQU     00B9h           ; set baud rate
+saparm EQU     00BCh           ; fetch SIO parameters
+teask  EQU     00BFh           ; find out cursor position
+cdvers EQU     00E3h           ; get version numbers
+cdinfo EQU     00E6h           ; get BIOS system information
+
+;
+; System-dependent initialization
+; Called once at program start.
+sysxin:                ; continuation of system initialzation 
+;
+; check for correct CP/M version
+;
+       mvi     c,12            ; get CP/M version BDOS call
+       call    bdos
+       mov     a,l             ; check if CP/M Plus
+       cpi     31h
+       jz      init08
+       lxi     d,wrong2        ; point to error message
+       call    prtstr
+       mvi     c,0             ; warm boot
+       call    bdos
+;
+init08:                ;[OBS] Moved the Cinfigured for message out as
+               ;[OBS]   it is in CPXCOM.ASM
+;
+; get addresses of BIOS routines
+;
+; BIOS USERF is used to get to extended BIOS routines
+;
+       lhld    1               ; warm boot vector
+       lxi     d,87            ; offset to USERF vector
+       dad     d               ; DE now has USERF vector address
+       shld    userf+1         ; ready for jumping to...
+;
+; BIOS routines for fast character I/O
+;
+       lhld    1               ; warm boot vector (#1)
+       lxi     d,3
+       dad     d               ; next is #2, CONST
+       shld    bcnst+1
+       dad     d               ; next is #3, CONIN
+       shld    bcnin+1
+       dad     d               ; next is #4, CONOUT
+       shld    bcnot+1         ;[obs] Was bcnout, but this conflicts
+                               ;[obs] with a label in CPXCOM.ASM
+       dad     d               ; next is #5, LIST
+       shld    blist+1
+       dad     d               ; next is #6, AUXOUT
+       dad     d               ; next is #7, AUXIN
+       shld    baxin+1
+       lhld    1               ; warm boot vector again
+       lxi     d,002Ah         ; offset to LISTST (#15)
+       dad     d
+       shld    lptstat+1
+       lhld    1               ; warm boot vector again
+       lxi     d,0033h         ; offset to AUXIST (#18)
+       dad     d
+       shld    baxist+1
+;
+; check if running on correct Amstrad
+;
+       call    userf
+       dw      cdvers
+IF pcw
+       cpi     0
+ENDIF
+IF cpc
+       cpi     1
+ENDIF
+       jnz     init06
+       lxi     d,wrong1        ; point to error message
+       call    prtstr
+       mvi     c,0
+       call    bdos
+;
+; verify presence of SIO board by asking the BIOS.
+;
+init06:        call    userf           ; C gets 00 if not fitted
+       dw      cdinfo
+       xra     a               ; a <- 0
+       ora     c               ; zero => no serial port
+       jnz     init03          ; non-zero => OK
+       lxi     d,nosio         ; snooty message...
+       call    prtstr
+       mvi     c,0             ; warm boot out of here
+       call    bdos
+init03:
+;
+; find initial baud rate and other information
+;
+       call    userf           ; gives B=rx baud, C=tx baud, D=stop bits,
+                               ; E=parity, H=rx bits, L=tx bits.
+       dw      saparm          ; get SIO parameters
+       push    h               ; save bit settings
+       mov     a,b             ; if TX and RX speeds same, they are OK
+       cmp     c
+       jz      init01
+       cpi     8               ; rx=1200?
+       jnz     init02          ; no, can't be Prestel
+       mov     a,c
+       cpi     2               ; tx=75?
+       jnz     init02          ; no, can't be Prestel
+       lxi     b,0             ; otherwise 1200/75 comes out as 0s.
+init01:        push    b               ; assign value to SPEED
+       pop     h
+       shld    speed
+init02:                                ; here if we leave it as is
+       pop     h               ; get bit settings
+       mov     a,l             ; no of TX data bits set
+       sui     5               ; make into 00, 01, 10, 11.
+       rrc
+       rrc
+       rrc
+       sta     txbits          ; we may need it later
+;
+; set handshake mode: there are two parts to this, interrupts and
+; hardware handshake. The MODE byte used by the firmware expresses
+; this combination as -(int*2 + hand*1).  Thus, both options on would
+; be (-3) or 0FDh.
+;
+; Here, we set the interrupt part of the mode on; it helps the BIOS cope.
+; Unfortunately, >sigh<, according to Soft971, this will only work
+; if you have BIOS V1.4 or higher.  I have no idea what would happen
+; if we tried random hanshake mode flags with lower versions, so we
+; just skip over if it would be dangerous...
+;
+       call    userf           ; fetch all parameters
+       dw      saparm
+       sta     orgmode         ; remember original mode for later
+
+       call    userf           ; get BIOS version to B,C
+       dw      cdvers
+       mov     a,b             ; BIOS major version number (eg 1)
+       ora     a               ; if zero, too low...
+       jz      init04
+       cpi     1               ; if not 1, definitely OK
+       jnz     init05
+       mov     a,c             ; otherwise, its 1.X; want >= 4
+       cpi     4
+       jm      init04          ; <4 => too low
+
+init05:        call    userf           ; get the original flags back
+       dw      saparm
+       xri     0FFh            ; make mode into bit mask
+       inr     a
+       ori     2               ; set interrupt mode
+       xri     0FFh            ; turn back into mode value
+       inr     a
+       call    userf           ; feed change back to BIOS
+       dw      sainit
+init04:                                ; come here if not setting mode
+
+; Locate large buffers for multi-sector I/O and SIO input buffering.
+; Space above ovlend is available for buffers; we have pretty well the machine
+; to ourselves in an Amstrad PCW because they all gave 61K TPAs. We don't even
+; bother to perform any checking.
+; We don't want to use more than maxsec for disk buffers because
+; if we use too many, the remote end could time out while we're
+; writing to disk.  maxsec is system-dependent, but for now we'll just
+; use 8Kbytes.  If you get retransmissions and other protocol errors after
+; transferring the first maxsec sectors, lower maxsec.
+;
+maxsec  EQU     (8*1024)/bufsiz ; 8K / number of bytes per sector
+
+        lxi     h,ovlend+siosz  ; get start of buffer
+        shld    bufadr          ; store in linkage section
+        mvi     a,maxsec        ; get size of buffer, in sectors
+        sta     bufsec          ; store that, too.
+
+
+        ret                     ; return from system-dependent routine
+
+;
+; message complaining about wrong Amstrad machine
+;
+wrong1:        db      'Error -   This Kermit will only run on the Amstrad '
+IF pcw
+       db      'PCW 8256/8512'
+ENDIF
+IF cpc
+       db      'CPC 464/664/6128'
+ENDIF
+       db      cr,lf,'$'
+;
+; message complaining about version of CP/M being used
+;
+wrong2:        db      'Error - Incorrect CP/M version, needs CP/M 3.x'
+       db      cr,lf,'$' 
+;
+; message complaining of no SIO board
+;
+nosio: db      'Error -   No SIO option fitted to this machine'
+       db      cr,     lf, '$'
+
+;
+; jumps to BIOS character I/O routines.
+; Addresses filled in by initialisation code above.
+;
+bcnst: jmp     $-$             ; console status
+bcnin: jmp     $-$             ; console input
+bcnot: jmp     $-$             ; console output [obs - was bcnout]
+blist: jmp     $-$             ; printer output
+baxin: jmp     $-$             ; aux port input
+baxist:        jmp     $-$             ; aux port status
+lptstat:jmp    $-$             ; printer status
+
+;
+; Other BIOS routines
+;
+userf: jmp     $-$             ; call extended BIOS function
+
+;
+; saved value of some original parameters
+;
+orgmode:ds     1
+txbits:        ds      1
+
+;
+; system-dependent termination processing
+; If we've changed anything, this is our last chance to put it back.
+sysexit:
+       call    userf           ; fetch firmware parameters
+       dw      saparm
+       lda     orgmode         ; replace with original mode
+       call    userf           ; inform BIOS
+       dw      sainit
+       ret
+
+;
+; system-dependent processing for start of CONNECT command
+;
+syscon:
+       lxi     d,conmsg        ; how to get escape char message
+       call    prtstr
+       ret
+
+conmsg:                ; Messages printed when entering transparent (CONNECT) mode:
+IF pcw
+       db      '(Use boxed minus key next to space bar to generate a Control-\)'
+ENDIF
+       db      cr,lf,'$'
+
+;
+; syscls - system-dependent close routine
+; called when exiting transparent session.
+;
+syscls:
+       ret
+
+;
+; sysinh - help for system-dependent special functions.
+; called in response to <escape>?, after listing all the
+; system-independent escape sequences.
+;
+sysinh:
+       lxi     d,inhlps        ; we got options...
+       call    prtstr          ; print them.
+       ret
+
+;
+; additional, system-dependent help for transparent mode
+; (two-character escape sequences)
+;
+inhlps:
+       db      cr,lf,'B  Transmit a BREAK'
+       db      cr,lf,'H  Hangup using DTR'
+       db      cr,lf,'W  Wipe screen clear'
+       db      '$'                     ;[hh] table terminator
+
+;
+; sysint - system dependent special functions
+; called when transparent escape character has been typed;
+; the second character of the sequence is in A (and in B).
+; returns:
+;         non-skip: sequence has been processed
+;         skip    : sequence was not recognized
+;
+sysint:        ani     137O            ; convert lower case to upper, for testing...
+       cpi     'B'             ; send break ?
+       jz      sendbr          ; yes, go do it.  return nonskip when through.
+       cpi     'H'             ; hang up ?
+       jz      hangup
+       cpi     'W'             ; clear screen ?
+       jz      clrtop
+       jmp     rskp            ; take skip return - command not recognized.
+
+;
+; Hangup (drop DTR) and Break send routine
+;
+
+hangup:
+       mvi     d,0ah           ; set up hangup bit mask
+       mvi     e,255           ; time for hangup is 2 1/2 secs
+       jmp     setbit          ; skip Tx empty test
+
+sendbr:
+       mvi     d,9ah           ; set up break bit mask
+       mvi     e,30            ; time for break is 300 ms
+
+sndbr1:        mvi     a,1             ; select Read Register 1
+
+IF pcw ; allow 8 bit I/O instructions
+       out     mnprts
+       in      mnprts          ; read the contents
+ENDIF
+
+IF cpc ; use 16 bit I/O instructions
+       lxi     b,mnprts
+       dw      outc            ; OUT   (C),A
+       dw      inpc            ; IN    A,(C)
+ENDIF
+
+       ani     1               ; test "all done" flag
+       jz      sndbr1          ; loop until it's nonzero.
+;
+; Next, set the break or hangup bit on the SIO.
+;
+setbit:
+       mvi     a,5             ; select Write Register 5
+IF pcw
+       out     mnprts
+ENDIF
+IF cpc
+       dw      outc            ; OUT   (C),A
+ENDIF
+       lda     txbits          ; get txbits (already in correct bit positions)
+       ora     d               ; send break, Tx Enable, RTS
+IF pcw
+       out     mnprts
+ENDIF
+IF cpc
+       dw      outc            ; OUT   (C),A
+ENDIF
+
+;
+; Now, delay for duration of hangup or break
+;
+       mov     a,e             ; delay count
+       call    delay
+;
+; Time's up. Put transmitter back in normal state and return.
+;
+       mvi     a,5             ; select Write Register 5
+IF pcw
+       out     mnprts
+ENDIF
+IF cpc
+       lxi     b,mnprts
+       dw      outc            ; OUT   (C),A
+ENDIF
+       lda     txbits          ; get txbits again
+       ori     8ah             ; Reset break, Tx Enable, RTS
+IF pcw
+       out     mnprts
+ENDIF
+IF cpc 
+       dw      outc            ; OUT   (C),A
+ENDIF
+       ret                     ; done.
+
+;
+; sysflt - system-dependent filter
+; called with character in E.
+; if this character should not be printed, return with A = zero.
+; preserves bc, de, hl.
+; note: <xon>,<xoff>,<del>, and <nul> are always discarded.
+;
+sysflt:
+       mov     a,e             ; get character for testing
+       ret
+;
+; system-dependent processing for BYE command.
+;
+sysbye:
+       ret
+
+;
+; This is the system-dependent command to change the baud rate.
+; DE contains the two-byte value from the baud rate table; this
+; value is also stored in 'speed'.
+;
+sysspd:
+       push    d               ; move to HL for firmware
+       pop     h
+       mov     a,h             ; if h=0 then Prestel rates
+       ora     a
+       jnz     spd01           ; if not 1200/75 then skip
+       lxi     h,0802H         ; else set 1200/75 into HL
+       jmp     spd03           ; jump to normal setup
+
+spd01: cpi     11h             ; if h=11h then reverse Prestel
+       jnz     spd02           ; if not 75/1200 then skip
+       lxi     h,0208h         ; else set 75/1200 into HL
+       jmp     spd03           ; jump to normal setup
+
+spd02: cpi     10h             ; if h=10h then 31250 baud
+       jnz     spd03           ; if not 31250 then skip to normal setup
+       mvi     a,36h           ; set 8253 for mode 2 binary count
+       lxi     b,ctcmod        ; output to CTC mode register
+       dw      outc
+       lxi     b,ctc0          ; select transmit clock
+       mov     a,4             ; timer value for 31250 (04h)
+       dw      outc
+       mov     a,0             ; timer value for 31250 (04h)
+       dw      outc
+       lxi     b,ctc0          ; select receive clock
+       mov     a,4             ; timer value for 31250 (04h)
+       dw      outc
+       mov     a,0             ; timer value for 31250 (04h)
+       dw      outc
+       ret
+
+spd03: call    userf           ; set whatever we have now...
+       dw      sabaud          ; using BIOS routine
+       ret
+
+;
+; Speed tables
+; (Note that speed tables MUST be in alphabetical order for later
+; lookup procedures, and must begin with a value showing the total
+; number of entries.  The speed help tables are just for us poor
+; humans.
+;
+; db string length,string,divisor (2 identical bytes or 1 word)
+;
+spdtbl:        db      12h                     ;18 entries
+       db      03h,'110$', 03h,03h
+       db      04h,'1200$', 08h,08h
+       db      07h,'1200/75$', 00h,00h ; real values faked up when required
+       db      05h,'134.5$', 04h,04h
+       db      03h,'150$', 05h,05h
+       db      04h,'1800$', 09h,09h
+       db      05h,'19200$', 0fh,0fh
+       db      04h,'2400$', 0ah,0ah
+       db      03h,'300$', 06h,06h
+       db      05h,'31250$',10h,10h    ; flag to direct setup routine
+       db      04h,'3600$', 0bh,0bh
+       db      04h,'4800$', 0ch,0ch
+       db      02h,'50$', 01h,01h
+       db      03h,'600$', 07h,07h
+       db      04h,'7200$', 0dh,0dh
+       db      02h,'75$', 02h,02h
+       db      07h,'75/1200$',11h,11h  ; real values faked up when required
+       db      04h,'9600$', 0eh,0eh
+
+sphtbl:        db      cr,lf,lf
+       db      'Normal rates: 50    75    110   134.5 150   300   600'
+       db      cr,lf
+       db      '              1200  1800  2400  3600  4800  7200  9600  19200'
+       db      cr,lf,lf
+       db      'High speed  : 31250 (only between Amstrads)'
+       db      cr,lf,lf
+       db      'Split rates : 1200/75 (Rx=1200, Tx=  75)'
+       db      cr,lf
+       db      '              75/1200 (Rx=  75, Tx=1200)'
+       db      cr,lf,'$'
+
+;
+; This is the system-dependent SET PORT command.
+; HL contains the argument from the command table.
+;
+sysprt:
+       ret
+
+prttbl equ     0               ; SET PORT is not supported
+prhtbl equ     0
+
+;
+; selmdm - select modem port
+; selcon - select console port
+; selmdm is called before using inpmdm or outmdm;
+; selcon is called before using inpcon or outcon.
+; preserves bc, de, hl.
+;
+selmdm:
+selcon:
+       ret
+
+;
+; Get character from console, or return zero.
+; result is returned in A.  destroys bc, de, hl.
+;
+inpcon:
+       call    bcnst           ; get console status
+       ora     a               ; anything there?
+       rz                      ; no, forget it
+       jmp     bcnin           ; yes, get the character
+
+;
+; Output character in E to the console.
+; destroys bc, de, hl
+;
+outcon:
+       mov     a,e             ; TAB?
+       cpi     tab
+       jz      out001
+       mov     c,e             ; set correct arg register
+       jmp     bcnot           ; output to console via BIOS [obs was bcnout]
+
+;
+; perform tab expansion ourselves
+;
+out001:        call    userf           ; get column in L
+       dw      teask
+       mov     a,l             ; a <- column 0..n
+       ani     7               ; column 0..7
+       xri     0FFh            ; not(col 0..7)
+       adi     9               ; a is 8-(colf7)
+out002:        ora     a               ; any left?
+       rz                      ; return if not
+       dcr     a               ; one less now, anyhow
+       push    psw             ; save over BIOS call (just in case)
+       mvi     c,' '           ; print one space
+       call    bcnot           ;[obs was bcnout]
+       call    suck            ; in case any stuff coming in
+       pop     psw             ; fetch count back
+       jmp     out002          ; and go round again
+
+;
+; outmdm - output a char from E to the modem.
+;  the parity bit has been set as necessary.
+; returns nonskip; bc, de, hl preserved.
+outmdm:
+IF cpc
+       push    b               ; save BC for CPC 16 bit I/O
+ENDIF
+outmd1:
+       call    xsuck           ; keep checking for incoming characters
+IF pcw
+       in      mnprts          ; get the output done flag.
+ENDIF
+IF cpc
+       lxi     b,mnprts
+       dw      inpc            ; IN    A,(C)
+ENDIF
+       ani     output          ; is it set?
+       jz      outmd1          ; if not, loop until it is.
+       mov     a,e
+IF pcw
+       out     mnport          ; output it.
+ENDIF
+IF cpc
+       lxi     b,mnport
+       dw      outc            ; OUT   (C),A
+       pop     b               ; restore BC
+ENDIF
+       ret
+
+;
+; get character from modem; return zero if none available.
+; destroys bc, de, hl.
+;
+inpmdm:
+       call    suck            ; get any characters pending
+       lhld    sioct           ; count of chars in buffer
+       mov     a,h             ; or together to get result
+       ora     l
+       rz                      ; not got any, return now
+
+       dcx     h               ; down count
+       shld    sioct
+
+       lhld    siord           ; read pointer
+       mov     c,m             ; fetch character ** NB TO C FOR NOW **
+
+       lxi     d,1-ovlend      ; bump pointer, subtract base
+       dad     d
+       mov     a,h             ; mask high byte of offset
+       ani     siomsk/256
+       mov     h,a
+       lxi     d,ovlend        ; add in base again
+       dad     d
+       shld    siord
+
+       mov     a,c             ; get to proper register
+       ret
+
+;
+; flsmdm - flush comm line.
+; Modem is selected.
+; Currently, just gets characters until none are available.
+
+flsmdm:        call    inpmdm          ; Try to get a character
+       ora     a               ; Got one?
+       jnz     flsmdm          ; If so, try for another
+       ret                     ; Receiver is drained.  Return.
+
+;
+; SIO input buffer handling.  The buffer pointers are held as pointers into
+; the buffer. The read pointer
+; is to the next unused character, the write pointer to the next unused space.
+;
+siord: dw      ovlend          ; next char to read
+siowr: dw      ovlend          ; next char to write
+sioct: dw      0               ; number in buffer
+
+xsuck: push    d               ; save regs version of suck
+       push    b
+       push    h
+       call    suck
+       pop     h
+       pop     b
+       pop     d
+       ret
+
+;
+; suck
+;
+; this routine is called whenever it would be possible that some
+; characters might be available in the SIO device; they are all
+; transferred (there may be up to 4 pending) to the buffer.
+;
+; all registers are destroyed
+;
+suck:
+IF pcw
+       call    baxist          ; check input status via BDOS
+       ora     a               ; check if zero
+ENDIF
+IF cpc
+       lxi     b,mnprts        ; get input status directly
+       dw      inpc            ; IN A,(C)
+       ani     input           ; mask for Rx ready
+ENDIF
+       rz                      ; return if no
+
+IF pcw
+       call    baxin           ; fetch character via BDOS
+ENDIF
+IF cpc
+       lxi     b,mnport        ; fetch character directly from SIO
+       dw      inpc            ; IN A,(C)
+ENDIF
+
+       lhld    siowr           ; write pointer
+       mov     m,a             ; put character
+
+       lxi     d,1-ovlend      ; take off base, bump pointer
+       dad     d
+       mov     a,h             ; top byte of offset
+       ani     siomsk/256      ; masked off
+       mov     h,a
+       lxi     d,ovlend        ; add on base again
+       dad     d
+       shld    siowr           ; replace pointer
+
+       lhld    sioct           ; bump count in buffer
+       inx     h
+       shld    sioct
+
+       jmp     suck            ; go round in case any more
+
+;
+; outlpt - output character in E to printer
+; console is selected.
+; preserves de.
+outlpt:
+       push    d               ; save DE in either case
+       mov     c,e             ; correct arg register
+       call    blist
+       pop     d               ; restore saved register pair
+       ret
+
+;
+; Screen manipulation routines
+; csrpos - move to row B, column C
+;
+; csrpos for terminals that use a leadin sequence followed
+;  by (row + 31.) and (column + 31.)
+;  or (row) and (column)
+;
+csrpos:        push    b               ; save coordinates
+       lxi     d,curldn        ; get cursor leadin sequence
+       call    prtstr          ; print it
+       pop     h               ; restore coordinates
+       mov     a,h             ; get row
+       adi     (' '-1)         ; space is row one
+       mov     e,a
+       push    h
+       call    outcon          ; output row
+       pop     h
+       mov     a,l             ; get column
+       adi     (' '-1)         ; space is column one
+       mov     e,a
+       jmp     outcon          ; output it and return
+
+;
+; delchr - make delete look like a backspace.  Unless delete is a printing
+; character, we just need to print a backspace. (we'll output clrspc
+; afterwards)
+; For Kaypro and Vector General, delete puts a blotch on the screen.
+; For Apple and Osborne 1, delete moves but doesn't print.
+delchr:
+IF pcw ;[6] OBS for Phillip Wade
+       lxi     d,delstr        ;[5] send a string rather than a single character
+       call    prtstr
+
+delstr:        db      bs,' ',bs,'$'   ;[OBS] Was bs,space,bs,bs
+ENDIF  ;pcw
+
+       mvi     e,bs            ;get a backspace
+       jmp     outcon
+
+; erase the character at the current cursor position
+clrspc:        mvi     e,' '
+       call    outcon
+       mvi     e,bs            ;get a backspace
+       jmp     outcon
+
+; erase the current line
+clrlin:        lxi     d,eralin
+       jmp     prtstr
+
+; erase the whole screen, and go home. preserves b (but not c)
+clrtop:        lxi     d,erascr
+       jmp     prtstr
+
+
+IF pcw
+sysver:        db      'Amstrad PCW with SIO option$'
+ENDIF
+IF cpc
+sysver:        db      'Amstrad CPC with CP/M Plus$'
+ENDIF
+
+outlin:        db      esc,'H',esc,'J',cr,lf,'                $'
+
+erascr:        db      esc,'H',esc,'J$'        ;Clear screen and go home.
+eralin:        db      cr,esc,'K$'             ;Clear line.
+curldn:        db      esc,'Y$'                ;cursor leadin
+ttab:                                  ;Table start location.
+ta:    db      esc,'A$',0              ;Cursor up.
+tb:    db      esc,'B$',0              ;Cursor down.
+tc:    db      esc,'C$',0              ;Cursor right.
+td:    db      esc,'D$',0              ;Cursor left
+te:    db      esc,'E$',0              ;Clear display
+tf:    db      '$',0,0,0               ;Enter Graphics Mode
+tg:    db      '$',0,0,0               ;Exit Graphics mode
+th:    db      esc,'H$',0              ;Cursor home.
+ti:    db      esc,'I$',0              ;Reverse linefeed.
+tj:    db      esc,'J$',0              ;Clear to end of screen.
+tk:    db      esc,'K$',0              ;Clear to end of line.
+
+ovlend equ     $       ; End of overlay
+
+       END
diff --git a/cpxpro.asm b/cpxpro.asm
new file mode 100644 (file)
index 0000000..9099b04
--- /dev/null
@@ -0,0 +1,561 @@
+IF NOT lasm
+.printx * CPXPRO.ASM *
+ENDIF  ;NOT lasm
+;       KERMIT - (Celtic for "FREE")
+;
+;       This is the CP/M-80 implementation of the Columbia University
+;       KERMIT file transfer protocol.
+;
+;       Version 4.0
+;
+;       Copyright June 1981,1982,1983,1984,1985
+;       Columbia University
+;
+; Originally written by Bill Catchings of the Columbia University Center for
+; Computing Activities, 612 W. 115th St., New York, NY 10025.
+;
+; Contributions by Frank da Cruz, Daphne Tzoar, Bernie Eiben,
+; Bruce Tanner, Nick Bush, Greg Small, Kimmo Laaksonen, Jeff Damens, and many
+; others.
+;
+; revision history:
+;
+;edit 2, 16-Oct-1990 by MF.  Reformatted speed tables according to
+;      current usage and reworked sysspd routine accordingly.
+;      Also eliminated cursor-positioning routines as we now link to
+;      cpxvdu.asm.  Reworked version message according to current usage.
+;edit 1, 17 November, 1987, by OBSchou.  Extracted Compupro code
+;      from CPMPRO.ASM and massaged fort CP/M kermit V4.09
+;
+; Modifications to KERMIT-80 for use with Compupro Interfacer 3/4 "[gv]"
+;
+; Guy Valiquette, M.D.
+; Black Bldg. Rm 322
+; Dept. of Neurology
+; College of Physicians & Surgeons
+; Columbia University
+; 630 W. 168th Street
+; New York, NY 10032
+; (212) 694-3965
+;
+; I/O routines for Interfacer 3/4 board
+; Allow sending break with <ESC> B while CONNECTed
+; Terminal control sequences for Wyse Technology WY-100
+; Add calls to "hangup" subroutine in EXIT and BYE to hang-up phone if
+;      using a smart modem by disabling UART (and withdrawing DTR signal)
+;
+;
+; Using KERMIT with Compupro Interfacer 3/4:
+;      - Set compro below to TRUE, all other to FALSE
+;      - Select the ABSOLUTE USER number you want with the user EQUate
+;      - Select the terminal control string set needed (or write your
+;        own if not there)
+;      - Note that I had to use a kludge to get the signon message right.
+;        Code in KERMIT as I found it did not, nor could it, work.  Search
+;        for the section of code under:  IF compro AND wy100  and imitate.
+;      - If you have a smart modem, CONNECT puts you in contact with your
+;        modem.  Use your usual "wake-up" character sequence to dial out.
+;        You can CONNECT and return to KERMIT repeateadly without hanging up
+;        UNLESS you change the baud rate, execute the BYE command or EXIT.
+;      - Baud rate set up in code to use 1200 baud as default. Can easily
+;        be changed to 300 (or whatever). The byte defined at label "baudrt"
+;        is the mode register 2 used to initialize the UART on first CONNECT.
+;        The low order nibble of this byte is the baud rate.  Refer to the
+;        Compupro manual to set whatever default baud rate desired by changing
+;        this low nibble at  baudrt db 0011$xxxxb.
+;
+; Note: "Wrapup" work (outlined below) to clean up code not done since
+;      new version of KERMIT is due out in a few weeks (says fdc)
+; 
+; WRAPUP:
+;      - outchri modification done for IF inout ONLY
+;      - stchr routine implemented for IF inout ONLY
+;        and used by outchr only
+;
+;
+; Keep module name, edit number, and last revision date in memory.
+family: db      'CPXPRO.ASM (2)  16-Oct-1990 $'
+;
+; Assembly time message to let me know I'm building the right version.
+; LASM generates an 'S' error along with the message, which is messy, but
+; better than trying to put everything inside a IF m80 OR mac80 conditional,
+; because LASM doesn't like nested IF's, either.
+
+IF compro
+.printx * Assembling Kermit-80 for Compupro Interfacer 4 (or 3) *
+ENDIF
+
+iobyte  EQU     03H     ;Location of I/O byte
+
+IF compro
+if4    EQU     10H             ;standard base address of Interfacer 4/3 board
+datap  EQU     if4+0           ;data port (read/write)
+stat   EQU     if4+1           ;status port (read/write)
+mode   EQU     if4+2           ;mode registers (read/write)
+command        EQU     if4+3           ;command register (read/write)
+txint  EQU     if4+4           ;transmit interrupts status/mask (read/write)
+rxint  EQU     if4+5           ;receive interrupts status/mask (read/write)
+;              if4+6            not used
+usersel        EQU     if4+7           ;absolute user number select register
+output EQU     1
+input  EQU     2
+; Note: tested with CP/M Ver2.2, and Racal-Vadic Auto Dial VA212 modem
+;      and USRobotics Password modems. [gv]
+user   EQU     7               ;ABSOLUTE user number on IF4 or IF3
+; Also remember to select a terminal!!!
+ENDIF;compro
+;\f
+
+sysxin:        ;system initialisation not covered by sysinit
+        ret                     ; return from system-dependent routine
+
+;
+;
+;       system-dependent termination processing
+;       If we've changed anything, this is our last chance to put it back.
+sysexit:
+        ret
+
+;
+;       system-dependent processing for start of CONNECT command
+;
+syscon:
+        ret
+
+;
+;
+;       syscls - system-dependent close routine
+;       called when exiting transparent session.
+;
+syscls:
+        ret
+;
+;
+;       sysinh - help for system-dependent special functions.
+;       called in response to <escape>?, after listing all the
+;       system-independent escape sequences.
+;
+sysinh:        
+       lxi     d,inhlps        ; we got options...
+       call    prtstr          ; print them.
+        ret
+inhlps:
+
+       db      cr,lf,'D - drop the line'
+       db      cr,lf,'B - send a break'
+       db      cr,lf
+        db      '$'                     ;[hh] table terminator
+
+;
+;       sysint - system dependent special functions
+;       called when transparent escape character has been typed;
+;       the second character of the sequence is in A (and in B).
+;       returns:
+;       non-skip: sequence has been processed
+;       skip:   sequence was not recognized
+sysint:
+       ani     137O            ; convert lower case to upper, for testing...
+
+       cpi     'D'             ;Disconnect modem?
+       jnz     intc00          ;no
+hangup:        xra     a               ;get a null byte
+       out     command         ;disable UART
+       sta     ckdialf         ;pull down flag to reinitialize UART
+       ret                     ;most smart modems will hang up on loosing DTR
+intc00:
+       cpi     'B'             ; Send a reak?
+       jz      sendbr
+        ret
+
+
+;send a break
+sendbr:        mvi     a,user          ;select our UART
+       di                      ;quiet
+       out     usersel         ;select it
+       in      command         ;get current command byte
+       ori     00001000b       ;set "send break" bit
+       out     command         ;send to UART
+       ei
+
+               ;now for 300 msec timing loop (at 4 MHz, 0 wait state)
+       mvi     a,30            ;[obs] call delay for 300 ms
+       call    delay
+
+       mvi     a,user          ;now, go back to UART
+       di                      ;quiet
+       out     usersel
+       in      command         ;get current command
+       ani     11110111b       ;reset "send break" bit
+       ori     00010000b       ;and set "reset errors" command bit (in case)
+       out     command         ;send back to UART
+       ei
+       jmp     rskp
+
+
+ckdial:
+       lda     ckdialf         ;check flag that forces reinitialization
+       ora     a               ;test it
+       jz      ckdial0         ;must redo it
+       mvi     a,user          ;user number
+       di
+       out     usersel         ;select it
+       in      command         ;get current command register
+       ei
+       ani     00000111b       ;mask for normal operating mode
+                               ;(DTR on, RX and TX both enabled)
+       cpi     00000111b       ;is it?
+       jz      rskp            ;UART is on, start terminal emulation
+; else initialize UART...
+ckdial0:di
+       mvi     a,user          ;select user
+       out     usersel
+       mvi     a,0001$0000b    ;reset errors command
+       out     command         ;send to command register
+       out     command
+       out     command         ;...make sure it got it
+       in      command         ;confirm
+       lda     moderg1         ;get mode register 1
+       out     mode            ;send it
+       lda     moderg2         ;get mode register 2
+       out     mode            ;send it
+       mvi     a,0011$0111b    ;command register to start things
+       out     command         ;send it
+       ei                      ;turn interrupts back on
+       mvi     a,0ffh          ;get a non-zero byte
+       sta     ckdialf         ;pull down flag
+;
+       jmp     rskp            ;start terminal emulation
+
+
+;      sysflt - system-dependent filter.
+;      called with the character in E.
+;       preserves bc, de, hl.
+;       note: <xon>,<xoff>,<del>, and <nul> are always discarded.
+sysflt:
+        mov     a,e             ; get character for testing
+        ret
+
+;       mdmflt - modem filter [30]
+;       called with character to be sent to printer in E
+;       with parity set as appropriate.
+;       return with accumulator = 0 do do nothing,
+;                               <> 0 to send char in E.
+mdmflt:
+        mov     a,e             ;[30] get character to test
+        ret
+
+
+;       prtflt - printer filter [30]
+;       called with character to be sent to printer in E
+;       returns with a = 0 to do nothing
+;                    a <> 0 to print it.
+;
+;       this routine for those printer that automatically insert
+;       a lf on cr, or cr for lf.  Should this be shifted to 
+;       the system indep. stuff, in say 4.06?
+prtflt:
+        mov     a,e             ; [30] get character to test
+        ret
+
+
+;
+;
+; system-dependent processing for BYE command.
+;  for apmmdm, heath, and lobo, hang up the phone.
+sysbye:
+
+       call    hangup
+        ret
+;
+;       This is the system-dependent command to change the baud rate.
+;       DE contains the two-byte value from the baud rate table; this
+;       value is also stored in 'speed'.
+sysspd:
+
+
+IF compro
+       lda     speed           ;[MF]Get requested baud-rate
+        mov     b,a             ;Save the number.
+       lxi     h,baudrt        ;point to current baud rate
+       mov     a,m             ;get it
+       ani     0f0h            ;keep high nibble
+       ora     b               ;merge back baud rate
+       mov     m,a             ;store back
+       xra     a               ;clear A
+       sta     ckdialf         ;put up flag to force reinitialization
+       ret                     ;...at next connect
+
+ENDIF;compro
+
+
+;\f
+
+;       Speed tables
+; (Note that speed tables MUST be in alphabetical order for later
+; lookup procedures, and must begin with a value showing the total
+; number of entries.  The speed help tables are just for us poor
+; humans.
+
+;       db      string length,string,divisor (2 identical bytes or 1 word)
+; [Toad Hall]
+
+spdtbl:        db      8               ;[MF]8 entries in speed table
+       db      3,'110$'
+       db      02h,02h         ;[MF]110 baud
+       db      4,'1200$'
+       db      07h,07h         ;[MF]1200 baud
+       db      5,'134.5$'
+       db      03h,03h         ;[MF]134.5 baud
+       db      3,'150$'
+       db      04h,04h         ;[MF]150 baud
+       db      4,'1800$'
+       db      08h,08h         ;[MF]1800 baud
+       db      5,'19200$'
+       db      0fh,0fh         ;[MF]19200 baud
+       db      4,'2000$'
+       db      09h,09h         ;[MF]2000 baud
+       db      4,'2400$'
+       db      0ah,0ah         ;[MF]2400 baud
+       db      3,'300$'
+       db      05h,05h         ;[MF]300 baud
+       db      4,'3600$'
+       db      0bh,0bh         ;[MF]3600 baud
+       db      4,'4800$'
+       db      0ch,0ch         ;[MF]4800 baud
+       db      2,'50$'
+       db      00h,00h         ;[MF]50 baud
+       db      3,'600$'
+       db      06h,06h         ;[MF]600 baud
+       db      4,'7200$'
+       db      0dh,0dh         ;[MF]7200 baud
+       db      2,'75$'
+       db      01h,01h         ;[MF]75 baud
+       db      4,'9600$'
+       db      0eh,0eh         ;[MF]9600 baud
+
+sphtbl:        db      cr,lf,'50  75  110  134   150  300  600  1200'
+       db      cr,lf,'1800  2000  2400  3600  4800  7200  9600  19200$'
+
+ckdialf:db     0                       ;force UART initialization on entry
+baudrt:        db      0011$0111b      ;default baud rate: 1200 baud
+moderg1:db     0100$1110b      ;default mode register 1:
+                               ; -asynch, 8 data bits, 1 stop bit,
+                               ; -parity odd, disabled
+moderg2        EQU     baudrt
+ENDIF;compro
+;\f
+
+;
+; The following conditionals were once a huge if not statement.  There
+; wasn't enough room to add the lobo to the list, so it had to be broken
+; into 2, which you can't do with an if not.  I redid it as two ifs and
+; applied them to those that wouldn't set baud. [Hal Hostetler]
+;       This is the system-dependent SET PORT command.
+;       HL contains the argument from the command table.
+sysprt:
+        ret
+;
+;
+;      Port table not applicable
+prttbl   EQU     0
+prhtbl   EQU     0               ;
+
+;
+;
+;       selmdm - select modem port
+;       selcon - select console port
+;       selmdm is called before using inpmdm or outmdm;
+;       selcon is called before using inpcon or outcon.
+;       For iobyt systems, diddle the I/O byte to select console or comm port;
+;       For Decision I, switches Multi I/O board to console or modem serial
+;       port.  [Toad Hall]
+;       For the rest, does nothing.
+;       preserves bc, de, hl.
+selmdm:
+        ret
+
+selcon:
+        ret
+;
+;       Get character from console, or return zero.
+;       result is returned in A.  destroys bc, de, hl.
+;
+inpcon:
+        mvi     c,dconio        ;Direct console I/O BDOS call.
+        mvi     e,0FFH          ;Input.
+        call    BDOS
+        ret
+;
+;
+;       Output character in E to the console.
+;       destroys bc, de, hl
+;
+outcon:
+        mvi     c,dconio        ;Console output bdos call.
+        call    bdos            ;Output the char to the console.
+        ret
+;
+;
+;       outmdm - output a char from E to the modem.
+;               the parity bit has been set as necessary.
+;       returns nonskip; bc, de, hl preserved.
+outmdm:
+;************************System Dependent****************************
+;
+; Addition by [gv], 16/7/84
+;      Return the status of the modem port:
+;              Z flag set if NO input available
+;              C flag set in NOT output ready
+;      Destroys A and flags, preserves all other registers
+;
+stchr:
+       di
+       mvi     a,user
+       out     usersel
+       in      stat
+       ani     output
+       in      stat
+       ei
+       jz      outmdm          ;not output ready, try again
+; else...
+       di                      ;no interrupts
+       mvi     a,user
+       out     usersel
+       mov     a,e             ;get back character
+       out     datap
+       ei
+       ret
+
+;\f
+
+;
+;
+;       get character from modem; return zero if none available.
+;       for IOBYT systems, the modem port has already been selected.
+;       destroys bc, de, hl.
+inpmdm:
+;
+       di
+       mvi     a,user
+       out     usersel
+       in      stat
+       ei
+       ani     input           ;test for input status (C flag reset by ANI n)
+       rz                      ; no input available
+;
+;************************System Dependent****************************
+;
+; Addition by [gv], 16/7/84
+;      get a character "raw" (i.e. just get it in A)
+;
+; Note: MUST have character ready before call, use stchr
+       mvi     a,user
+       di
+       out     usersel
+       in      datap
+       ei
+       ret
+;
+;\f
+
+;
+;       flsmdm - flush comm line.
+;       Modem is selected.
+;       Currently, just gets characters until none are available.
+
+flsmdm: call    inpmdm          ; Try to get a character
+        ora     a               ; Got one?
+        jnz     flsmdm          ; If so, try for another
+        ret                     ; Receiver is drained.  Return.
+
+
+;
+;
+;       lptstat - get the printer status. Return a=0 if ok, or 0ffh if not.
+lptstat:
+        xra     a               ; assume it is ok.. this may not be necessary
+        ret
+;
+;
+;       outlpt - output character in E to printer
+;       console is selected.
+;       preserves de.
+outlpt:
+        push    d               ; save DE in either case
+        call    prtflt          ; go through printer filter [30]
+        ana     a               ; if A = 0 do nothing,
+        jz      outlp1          ; [30] if a=0 do nothing
+        mvi     c,lstout
+        call    bdos            ;Char to printer
+outlp1: pop     d               ; restore saved register pair
+
+
+
+IF inout
+prtout:
+ENDIF ;inout
+IF compro AND inout
+       di
+       mvi     a,user
+       out     usersel
+       in      stat
+       ei
+ENDIF;compro AND inout
+IF (NOT compro) AND inout
+        in      mnprts          ;Get the output ready flag.
+ENDIF;(NOT compro) AND inout
+IF inout
+        ani     output          ;Is it set?
+        jz      prtout          ;If so, loop until it isn't.
+ENDIF ;inout
+IF compro AND inout
+       di
+       mvi     a,user
+       out     usersel
+       mov     a,e
+       out     datap
+       ei
+ENDIF;compro AND inout
+IF (NOT compro) AND inout
+        mov     a,e             ;Get the char to output.
+prtou2: out     mnport          ;Output it.
+ENDIF;(NOT compro) AND inout
+        ret
+
+
+;\f
+
+;
+;       Screen manipulation routines
+;
+; delchr - make delete look like a backspace.  Unless delete is a printing
+;       character, we just need to print a backspace. (we'll output clrspc
+;       afterwards)
+;       For Kaypro and Vector General, delete puts a blotch on the screen.
+;       For Apple and Osborne 1, delete moves but doesn't print.
+delchr:
+       mvi     e,bs
+       call    outcon
+
+; erase the character at the current cursor position
+clrspc: mvi     e,' '
+        call    outcon
+        mvi     e,bs            ;get a backspace
+        jmp     outcon
+
+; erase the current line
+clrlin: lxi     d,eralin
+        jmp     prtstr
+
+; erase the whole screen, and go home. preserves b (but not c)
+clrtop: lxi     d,erascr
+        jmp     prtstr
+
+
+IF compro; [gv]
+sysver:        db      '[Compupro IF4-',user+'0',']$'
+ENDIF;compro
+
+IF lasm
+LINK   CPXVDU.ASM
+ENDIF ;lasm
diff --git a/cpxsb.asm b/cpxsb.asm
new file mode 100644 (file)
index 0000000..3beefe7
--- /dev/null
+++ b/cpxsb.asm
@@ -0,0 +1,696 @@
+IF NOT lasm
+.printx * CPXSB.ASM *
+ENDIF  ;NOT lasm
+;       KERMIT - (Celtic for "FREE")
+;
+;       This is the CP/M-80 implementation of the Columbia University
+;       KERMIT file transfer protocol.
+;
+;       Version 4.0
+;
+;       Copyright June 1981,1982,1983,1984,1985
+;       Columbia University
+;
+; Originally written by Bill Catchings of the Columbia University Center for
+; Computing Activities, 612 W. 115th St., New York, NY 10025.
+;
+; Contributions by Frank da Cruz, Daphne Tzoar, Bernie Eiben,
+; Bruce Tanner, Nick Bush, Greg Small, Kimmo Laaksonen, Jeff Damens, and many
+; others.
+;
+;      This file created 16 July, 1987 by OBSchou from code submitted
+;      by William Rose for the Micromint SB180 systems (as featured in
+;      BYTE magazine, 1986).  This file has been modified to fit in with
+;      Kermit-80 V4.08 etc.  His file KERSYS.ASM is a stripped down version
+;      of CPXSYS.ASM (formerly CP4SYS.ASM).
+;
+; revision history:
+; KERSYS.ASM - version 0.8 dated 13 Jul 87.
+;
+; Cutdown CP4SYS.ASM for SB-180/Ampro 230.
+;
+;
+; While this is a single CPU version (to ease editing) the assembler
+; conditionals have been kept to identify machine specific code.
+;
+; Note that the baud setting routine also sets parity, but this does not
+; change the parity given by Kermit's 'stat' command.  I assume that the
+; main body of the program does its own parity check.
+;
+; Revision history (last entry first)
+;
+; edit 2, 22 July by OBSchou to massage file to fit with CPXCOM.ASM.
+;
+; edit 1, 15 July, 1987 by OBSchou for William Rose who submitted
+;      the code for Kermit-80 V 4.05.  Modified code as appropriate 
+;      for 4.08 compatability.
+;
+
+delfac EQU     150     ; Delay factor in SB-180 input loop - a fudge
+
+;
+; Keep module name, edit number, and last revision date in memory.
+;
+;sysedt:       db      'KERSYS.ASM (03) 12-FEB-87 $'   ; last SB-180 revision
+;sysedt:       db      'KERSYS.ASM (04) 12-APR-87 $'   ; Telecom Merlin added
+;sysedt:       db      'KERSYS.ASM (5)  9-May-87 $'    ; Minor tidying
+;sysedt:       db      'KERSYS.ASM (6A) 17-Jun-87 $'   ; BT Merlin M2215 only
+;sysedt:       db      'KERSYS.ASM (7)  19-Jun-87 $'   ; SB-180 only
+;sysedt:       db      'KERSYS.ASM (8)  13-Jul-87 $'   ; 6/9 MHz version
+family:        db      'CPXSB.ASM (2)  22-Jul-87$'     ; First entry for V4.08/9
+
+;
+; Assembly time message to let me know I'm building the right version.
+;
+
+IF sb180
+.printx * Assembling Kermit-80 for Micromint SB-180 *
+ENDIF
+
+
+IF sb180
+mnctrla        EQU     000H    ;Modem control port - CNTLA0
+mnctrlb        EQU     002H    ;Modem control port - CNTLB0
+mnstat EQU     004H    ;Modem status port - STAT0
+mntxdat        EQU     006H    ;Modem output port - TDR0
+mnrddat        EQU     008H    ;Modem input port - RDR0
+output EQU     002H    ;Transmit data register empty mask - TDRE
+input  EQU     080H    ;Receive data register full mask - RDRF
+z80    EQU     TRUE    ;This one's an HD64180, but Z80 will do 
+ENDIF
+
+
+sysxin:                ; continuation of system initialisation from sysinit
+
+IF sb180
+       lxi     h, porbuf       ; park the original settings
+       db      0EDh, 038h, mnctrla     ; HD64180 code IN0 g,(m)
+       mov     m, a
+       inx     h
+       db      0EDh, 038h, mnctrlb
+       mov     m, a
+       inx     h
+       db      0EDh, 038h, mnstat
+       mov     m, a
+ENDIF
+                               ; re-initialise for KERMIT
+IF sb6
+       mvi     h, 08h          ; 0000$1001 - 9600 baud, (even) parity
+       mvi     l, 08h          ; 'speed' is two bytes
+ENDIF
+
+IF sb9
+       mvi     h, 21h          ; 0010$0001 - 9600 baud, (even) parity
+       mvi     l, 21h          ; 'speed' is two bytes
+ENDIF
+
+IF sb180
+       shld    speed
+       lxi     h, parind
+       mvi     m, 8            ; index for 8 bits, no parity, 2 stop
+       call    setpor
+ENDIF
+
+       ret
+
+porbuf:        ds      3               ; original port settings
+   
+;
+;      system-dependent KERMIT termination processing
+;      If we've changed anything, this is our last chance to put it back.
+;
+sysexit:
+
+IF sb180
+       lxi     h, porbuf
+       mov     a, m            ; output parity
+       db      0EDh, 039h, mnctrla     ; HD64180 code OUT0 (m),g
+       inx     h
+       mov     a, m            ; output baud rate
+       db      0EDh, 039h, mnctrlb
+       inx     h
+       mov     a, m            ; output to clear error flags 
+       db      0EDh, 039h, mnstat
+                               ; read twice to reset DCD0 ?
+       db      0EDh, 038h, mnstat
+       db      0EDh, 038h, mnstat
+ENDIF
+
+       ret
+
+;
+;      system-dependent processing for start of CONNECT command
+;
+syscon:
+       ret
+
+conmsg:                ; Messages printed when entering transparent (CONNECT) mode:
+
+       db      '$'
+
+;
+;      syscls - system-dependent close routine
+;      called when exiting transparent session.
+;
+syscls:
+       ret
+
+;
+;      sysinh - help for system-dependent special functions.
+;      called in response to <escape>?, after listing all the
+;      system-independent escape sequences.
+;
+sysinh:
+
+IF sb180 
+       lxi     d, inhlps
+       call    prtstr
+ENDIF
+
+       ret
+
+; Additional, system-dependent help for transparent mode
+; (two-character escape sequences)
+inhlps:
+
+IF sb180
+       db      cr, lf, 'V  Cycle port parameters'
+ENDIF
+
+       db      '$'                     ; string terminator
+
+;
+;      sysint - system dependent special functions
+;      called when transparent escape character has been typed;
+;      the second character of the sequence is in A (and in B).
+;      returns:
+;      non-skip: sequence has been processed
+;      skip:   seqence was not recognized
+;
+sysint:
+;      ani     137O            ; convert lower case to upper, for testing...
+                               ; does this work?
+IF sb180
+       cpi     'V'             ; cycle port ?
+       jz pcycl
+       cpi     'v'
+       jz pcycl
+ENDIF
+
+       jmp     rskp            ; take skip return - command not recognised
+
+; Actual commands
+
+IF sb180
+pcycl:
+       lxi     h, parind       ; increment parval, modulo 12
+       mov     a, m
+       adi     1
+       cpi     13
+       jnz     pcy1
+       mvi     a, 1
+pcy1:  mov     m, a            ; update the storage
+                               ; get index of name in parstr
+       ora     a               ; clear flags
+       dcr     a
+       rlc
+       rlc
+       mov     c, a
+       mvi     b, 0
+       lxi     h, parstr
+       inx     h
+       dad     b
+       push    h
+       lxi     d, cgmsg1
+       call    prtstr
+       pop     d
+       call    prtstr
+       lxi     d, cgmsg2
+       call    prtstr
+       call    setpor          ; reset the port
+
+       ret
+
+cgmsg1:        db      '<$'
+cgmsg2: db     '>$'
+ENDIF
+
+       ret
+
+;
+;      Delay routine.  Called with time (hundredths of seconds) in A.
+;      The inner loop delays 1001 T-states, assuming no wait states are
+;      inserted; this is repeated CPUSPD times, for a total delay of just
+;      over 0.01 second. (CPUSPD should be set to the system clock rate,
+;      in units of 100KHz: for an unmodified Kaypro II, that's 25 for
+;      2.5 MHz.  Some enterprising soul could determine whether or not the
+;      Kaypro actually inserts a wait state on instruction fetch (a common
+;      practice); if so, the magic number at delay2 needs to be decreased.
+;      (We also neglect to consider time spent at interrupt level).
+;
+;      called by: sendbr
+;      destroys BC
+;
+;delay:        mvi     c,cpuspd        ; Number of times to wait 1000 T-states to
+;                              ;  make .01 second delay
+;delay2:       mvi     b,70            ; Number of times to execute inner loop to
+;                              ;  make 1000 T-state delay
+;delay3:       dcr     b               ; 4 T-states (* 70 * cpuspd)
+;      jnz     delay3          ; 10 T-states (* 70 * cpuspd)
+;      dcr     c               ; 4 T-states (* cpuspd)
+;      jnz     delay2          ; 10 T-states (* cpuspd)
+;                              ; total delay: ((14 * 70) + 14) * cpuspd
+;                              ;  = 1001 * cpuspd
+;      dcr     a               ; 4 T-states
+;      jnz     delay           ; 10 T-states
+;
+;      ret                     ; grand total: ((1001 * cpuspd) + 14) * a
+
+;
+;      sysflt - system-dependent filter
+;      called with character in E.
+;      if this character should not be printed, return with A = zero.
+;      preserves bc, de, hl.
+;      note: <xon>,<xoff>,<del>, and <nul> are always discarded.
+;
+sysflt:
+       mov     a,e             ; get character for testing
+       ret
+
+;
+;      mdmflt - modem filter
+;      called with character to be sent to printer in E
+;      with parity set as appropriate.
+;      return with accumulator = 0 do do nothing,
+;                              <> 0 to send char in E.
+mdmflt:
+       mov     a,e             ; get character to test
+       ret
+
+;
+;      prtflt - printer filter
+;      called with character to be sent to printer in E
+;      returns with a = 0 to do nothing
+;                   a <> 0 to print it.
+;
+;      this routine for those printer that automatically insert
+;      a lf on cr, or cr for lf.  Should this be shifted to 
+;      the system indep. stuff, in say 4.06?
+;
+prtflt:
+       mov     a,e             ; get character to test
+
+IF FALSE                       ; strip out lf from printer stream
+       ani     7fh             ; make sure it is parity less
+       cpi     lf              ; is it a line feed?
+       rnz                     ; no, print it
+;      xra     a               ; yes, don't.
+       
+ENDIF
+
+       ret
+
+;
+; system-dependent processing for BYE command.
+;
+sysbye:
+       ret
+
+;
+;      This is the system-dependent command to change the baud rate.
+;      DE contains the two-byte value from the baud rate table; both
+;      bytes of this value are also stored in 'speed'.
+;
+sysspd:
+
+IF sb180
+       lxi     d, prtmsg       ; ask for variables
+       call    prtstr
+
+       lxi     d, tbuf         ; get suitable string
+       mvi     c, 10
+       call    bdos
+
+       lxi     h, tbuf1
+       mov     a, m
+       ora     a
+       jz      setpor          ; leave unchanged if string zero length
+
+       cpi     3               ; check given length
+       jnz     spd1            ; error - wrong length
+       inx     h
+       inx     h
+       mov     a, m
+       ani     137O            ; convert parity code to upper case
+       mov     m, a
+
+       lxi     d, tbuf1        ; get index of given parameter
+       lxi     h, parstr
+       call    sposn
+       ora     a
+       jnz     spd2            ; or fall through if error
+spd1:  lxi     d, invmsg       ; invalid input - try again
+       call    prtstr
+       jmp     sysspd
+
+spd2:  adi     3               ; get index to parval table
+       rrc                     ; by dividing by 4 
+       rrc
+       ani     15              ; mask out high bits
+       lxi     h, parind
+       mov     m, a            ; and store it
+       call    setpor          ; set up port iaw index and speed bytes
+
+       ret
+
+prtmsg:        db      cr,lf,'Enter bit/char, parity, and stop bits required.'
+       db      cr,lf,'(Bit 7/8   Parity N/O/E   Stop 1/2  - CR same) : $'
+invmsg: db     cr,lf,'Invalid parameters$'
+
+parind:        db      8               ; default <8N2> index
+parstr:        db      48,'7N1$7N2$7O1$7O2$7E1$7E2$'
+       db         '8N1$8N2$8O1$8O2$8E1$8E2$'
+parval:        db      0,1,16+2,16+3,2,3
+       db      4,5,16+6,16+7,6,7
+tbuf   db      6
+tbuf1  db      3,'8N2','$$$$'
+
+;
+; Set up the port using the table index in parind and the speed byte
+;
+setpor:
+       lxi     h, parind
+       mov     a, m
+       dcr     a
+       lxi     h, parval       ; table base
+       mvi     b, 0
+       mov     c, a
+       dad     b               ; HL points at parameter value
+       mov     a, m
+       mov     b, a            ; park parval
+
+       ani     16              ; the parity switch bit
+       lxi     h, speed
+       add     m               ; this is now the baud rate byte
+       mov     c, a            ; park it
+
+       mov     a, b            ; sort out the parameter byte
+       ani     7               ; b/p/s only wanted
+       adi     96              ; RE, TE enable
+       db      0EDh,039h,mnctrla       ; output parity etc.
+       mov     a, c
+       db      0EDh,039h,mnctrlb       ; output baud rate
+       mvi     a, 0
+       db      0EDh,039h,mnstat        ; clear status
+       db      0EDh,038h,mnstat        ; read twice to reset DCD0
+       db      0EDh,038h,mnstat
+       ret
+
+;
+; Find substring position - Leventhal page 293, modified
+; enter with subtring in DE and string in HL
+; returns index in A or 0 for failure
+;
+sposn:
+       mov     a, m            ; exit if either string length zero
+       ora     a
+       jz      notfnd
+       sta     slen
+       mov     b, a
+       inx     h
+       shld    string
+       xchg
+       mov     a, m
+       ora     a
+       jz      notfnd
+       sta     sublen
+       mov     c, a
+       inx     h
+       shld    substg
+       mov     a, b
+
+; no of searches = stringlen - substrlen + 1
+; if substr longer than string quit immediately
+
+       sub     c
+       jc      notfnd
+       inr     a
+       mov     c, a
+       xra     a
+       sta     index
+
+; search until remaining string shorter than substring
+
+slp1:  lxi     h, index
+       inr     m
+       lda     sublen
+       mov     b, a
+       lhld    substg
+       xchg
+       lhld    string
+
+; try to match substring starting at index
+
+cmplp: ldax    d
+       cmp     m
+       jnz     slp2
+       dcr     b
+       jz      found
+       inx     h
+       inx     d
+       jmp     cmplp
+
+; arrive here if match fails
+
+slp2:  dcr     c
+       jz      notfnd
+       lhld    string
+       inx     h
+       shld    string
+       jmp     slp1
+
+; found, return index
+
+found: lda     index
+       ret
+
+; not found, return zero
+
+notfnd:        sub     a
+       ret
+
+string:        ds      2
+substg:        ds      2
+slen:  ds      1
+sublen:        ds      1
+index: ds      1
+ENDIF
+
+       ret
+
+;
+;      Speed tables
+; (Note that speed tables MUST be in alphabetical order for later
+; lookup procedures, and must begin with a value showing the total
+; number of entries.  The speed help tables are just for us poor
+; humans.
+;
+;      db      string length, string, divisor (2 bytes or 1 word, ab)
+;              the data byte a is return in A and E, and b in D
+;              only byte 'a' is the key for the table
+
+IF sb6
+spdtbl:        db      9                       ; 9 entries
+       db      04h,'1200$',    0Bh,0Bh
+       db      03h,'150$',     0Eh,0Eh
+       db      05h,'19200$',   01h,01h
+       db      04h,'2400$',    0Ah,0Ah
+       db      03h,'300$',     0Dh,0Dh
+       db      05h,'38400$',   00h,00h
+       db      04h,'4800$',    09h,09h
+       db      03h,'600$',     0Ch,0Ch
+       db      04h,'9600$',    08h,08h
+
+sphtbl: db     cr,lf
+       db '   150  300  600  1200  2400  4800  9600  19200  38400$'
+ENDIF
+
+IF sb9
+spdtbl:        db      7                       ; 7 entries
+       db      04h,'1200$',    24h,24h
+       db      05h,'19200$',   20h,20h
+       db      04h,'2400$',    23h,23h
+       db      03h,'300$',     26h,26h
+       db      04h,'4800$',    22h,22h
+       db      03h,'600$',     25h,25h
+       db      04h,'9600$',    21h,21h
+
+sphtbl: db     cr,lf
+       db '   300  600  1200  2400  4800  9600  19200$'
+ENDIF
+
+
+;
+;      This is the system-dependent SET PORT command.
+;      HL contains the argument from the command table.
+;
+sysprt:
+       ret
+
+IF sb180
+prttbl EQU     0               ; SET PORT is not supported
+prhtbl EQU     0
+ENDIF
+
+;
+;      selmdm - select modem port
+;      selcon - select console port
+;      selmdm is called before using inpmdm or outmdm;
+;      selcon is called before using inpcon or outcon.
+;      For iobyt systems, diddle the I/O byte to select console or comm port;
+;      For the rest, does nothing.
+;      preserves bc, de, hl.
+;
+selmdm:
+       ret
+
+selcon:
+       ret
+
+;
+;      Get character from console, or return zero.
+;      result is returned in A.  destroys bc, de, hl.
+;
+inpcon:
+       mvi     c,dconio        ;Direct console I/O BDOS call.
+       mvi     e,0FFH          ;Input.
+       call    BDOS
+
+       ret
+
+;
+;      Output character in E to the console.
+;      destroys bc, de, hl
+;
+outcon:
+       mvi     c,dconio        ;Console output bdos call.
+       call    bdos            ;Output the char to the console.
+
+       ret
+
+;
+;      outmdm - output a char from E to the modem.
+;              the parity bit has been set as necessary.
+;      returns nonskip; bc, de, hl preserved.
+;
+outmdm:
+
+IF sb180
+       db      0EDh,038h,mnstat
+       ani     output          ; check status
+       jz      outmdm          ; wait until port is available
+       mov     a, e
+       db      0EDh,039h,mntxdat       ; transmit
+ENDIF
+
+       ret
+
+;
+;      get character from modem; return zero if none available.
+;      for IOBYT systems, the modem port has already been selected.
+;      destroys bc, de, hl.
+;
+inpmdm:
+
+IF sb180
+       lxi     h, delfac       ; loops to give delay
+inpm1: db      0EDh,038h,mnstat
+       ani     input           ; check status  
+       jz      inpm2
+       db      0EDh,038h,mnrddat       ; get a byte
+       ret
+
+inpm2: dcx     h               ; no data
+       mov     h, a
+       ora     l
+       jnz     inpm1           ; still tries left
+       ret                     ; with zero in A
+ENDIF
+
+       ret
+
+;
+;      flsmdm - flush comm line.
+;      Modem is selected.
+;      Currently, just gets characters until none are available.
+;
+flsmdm:
+       call    inpmdm          ; Try to get a character
+       ora     a               ; Got one?
+       jnz     flsmdm          ; If so, try for another
+       ret                     ; Receiver is drained.  Return.
+
+;\f
+
+;
+;       lptstat - get the printer status. Return a=0 if ok, or 0ffh if not.
+lptstat:
+IF iobyte       ;[33]
+        call    bprtst          ; get status
+ENDIF   ;iobyte[33]
+IF NOT iobyte   ;[33]
+        xra     a               ; assume it is ok.. this may not be necessary
+ENDIF   ;iobyte [33]
+        ret
+;
+;      outlpt - output character in E to printer
+;      console is selected.
+;      preserves de.
+;
+outlpt:
+       push    d               ; save DE in either case
+       call    prtflt          ; go through printer filter [30]
+       ana     a               ; if A = 0 do nothing,
+       jz      outlp1          ; if a=0 do nothing
+
+outlp1:        pop     d               ; restore saved register pair
+       ret
+
+; delchr - make delete look like a backspace.  Unless delete is a printing
+;      character, we just need to print a backspace. (we'll output clrspc
+;      afterwards)
+delchr:
+
+       mvi     e,bs            ;get a backspace
+       jmp     outcon
+
+; erase the character at the current cursor position
+clrspc:        mvi     e,' '
+       call    outcon
+       mvi     e,bs            ;get a backspace
+       jmp     outcon
+
+; erase the current line
+clrlin:        lxi     d,eralin
+       jmp     prtstr
+
+; erase the whole screen, and go home. preserves b (but not c)
+clrtop:        lxi     d,erascr
+       jmp     prtstr
+
+IF sb180
+sysver:        db      'MicroMint SB 180 '
+ENDIF
+
+IF sb6
+       db      ' (6 MHz)'
+ENDIF
+
+IF sb9
+       db      ' (9 MHz)'
+ENDIF
+       db      '$'
+
+IF lasm
+LINK CPXVDU.ASM                ; get terminal defs etc
+ENDIF  ;lasm
diff --git a/cpxswt.asm b/cpxswt.asm
new file mode 100644 (file)
index 0000000..32b0d11
--- /dev/null
@@ -0,0 +1,294 @@
+IF NOT lasm
+.printx * CPXSWT.ASM *
+ENDIF  ; NOT lasm
+;       KERMIT - (Celtic for "FREE")
+;
+;       This is the CP/M-80 implementation of the Columbia University
+;       KERMIT file transfer protocol.
+;
+;       Version 4.0
+;
+;       Copyright June 1981,1982,1983,1984,1985
+;       Columbia University
+;
+; Originally written by Bill Catchings of the Columbia University Center for
+; Computing Activities, 612 W. 115th St., New York, NY 10025.
+;
+; Contributions by Frank da Cruz, Daphne Tzoar, Bernie Eiben,
+; Bruce Tanner, Nick Bush, Greg Small, Kimmo Laaksonen, Jeff Damens, and many
+; others.
+;
+;      This file is a simple family or system file switcher, selecting
+;      one of several family files, or selectin CPXSYS.ASM (now modified)
+;      if a family file does not exist.
+;
+;
+; revision history:
+;
+;edit 10, 7-Jan-1991 by MF. Added code by Jay S. Rouman to support the
+;      Ampro Little Board (see CPXBBI.ASM) and PRINTX for the HP-125.
+; edit 9, 1st September 1990 by Russell Lang, rjl@monu1.cc.monash.edu.au.
+;      Added Microbee support.
+; edit 8, 2 December by OBSchou.  Added Z80MU "system" to allow kermit-80
+;      debugging on a PC!
+;
+; edit 7, 27 October, 1987 by OBSchou.  Added bits for Sanyo, Compupro, 
+;      Genie and TRS-80 M4.
+;
+; edit 6, 16 July, 1987 for Will Rose, who has submitted code for
+;      Micromint SB180 (6 and 9 Mhz) and a BT Merlin (alias RAIR)
+;
+; edit 5, 15 July, 1987 by OBSchou for David Moore, who has submitted
+;      code for a Teletek SYSTEMASTER and for ADM22 terminals.
+;
+; edit 4, 14 July 1987 by OBSchou for JA Shearwood of Birmingham University,
+;      Chris Miles of Manchester University.  Added a Cifer family file
+;      for John, and added a BigBoard-Kaypro-Xerox family file for Chris
+;      Finally, added in new family file for Heath, telcon, z100 and scntpr
+;      systems for Martin Carter of Nottingham University.
+;
+; edit 3, 6 April, 1986 by OBSchou.
+;      Added in switching for NCR Desision Mate V and Amstrad CPC 664/6128
+;      systems.
+;
+; edit 2, March 16, 1987 by OBSchou.
+;       added in support for m80 macro assembler.
+;
+; edit 1 28 January, 1987 by OBSchou.
+;      Take out the series of printx etx and selection of systems and
+;      leave this with only the system dep. code for systems without
+;      a family file.  Hopefully, this file will go alltogether in time.
+;
+; Keep module name, edit number, and last revision date in memory.
+swtver:        db      'CPXSWT.ASM (10)  7-Jan-1991 $'
+;\f
+; Assembly time message to let me know I'm building the right version.
+; LASM generates an 'S' error along with the message, which is messy, but
+; better than trying to put everything inside a IF m80 OR mac80 conditional,
+; because LASM doesn't like nested IF's, either.
+
+
+IF (torfam AND lasm)
+;Link to the module with the code for Superbrains, Torch, Cifer and pci2651
+LINK CPXTOR.ASM                ; also NCR DMV systems
+ENDIF;(torfam AND lasm) - m80 use: INCLUDE from CPXTYP.ASM
+
+IF (ciffam AND LASM)
+; Link to the Cifer family file.  (Cifer code previously on CPXTOR.ASM)
+LINK CPXCIF.ASM                ; Cifer family file
+ENDIF  ;(ciffam AND lasm) - m80 use: INCLUDE from CPXTYP.ASM
+
+IF (appfam AND lasm) ;[33] apple frogs as a separate family..
+; Link to the APPLE family...
+LINK CPXAPP.ASM
+ENDIF ;(appfam AND lasm) - m80 use: INCLUDE from CPXTYP.ASM
+
+IF (norfam AND lasm); Link to the Northstar family (and Comart)
+; Link to the NorthStar family file
+LINK CPXNOR.ASM
+ENDIF; (norfam AND lasm) - m80 use: INCLUDE from CPXTYP.ASM
+
+IF (pcwfam AND lasm) ;[35] Amstrad PCW 8256/8512  or CPC systems
+; Link to the Amstrad PCW family
+LINK CPXPCW.ASM
+ENDIF ;(cpwfam AND lasm) - m80 use: INCLUDE from CPXTYP.ASM
+
+IF (bbifam AND lasm) ;Bigboard, Kaypro and Xerox 820 file
+; Link to the Bigboard family
+.printx * Linking to the BigBoard family *
+LINK CPXBBI.ASM
+ENDIF ;(bbifam AND lasm) - m80 use: INCLUDE from CPXTYP.ASM
+
+IF (heafam AND lasm)   ; heath, z100, telcon, and scntpr systems
+; Link to the Heath-telcon-screentyper family
+.printx * Linking to the Heath-telcon-screentyper family *
+LINK CPXHEA.ASM
+ENDIF  ;(heafam) - m80 use: INCLUDE from CPXTYP.ASM
+
+IF (sbfam AND lasm)
+; Link to the SB180 Family file
+,printx * Linking to the SB180 Family file *
+LINK CPXSB.ASM
+ENDIF  ; (sbfam AND lasm) - m80 use: INCLUDE from CPXTYP.ASM
+
+IF (m2215 AND lasm)
+; Link to the RAIR/ BT Merlin code
+.printx * Linking to the Merlin/Rair code *
+LINK CPXMRL.ASM
+ENDIF  ; (m2215 AND lasm) - m80 use: INCLUDE from CPXTYP.ASM
+
+IF (sanfam AND lasm)
+; Link to the Sanyo code
+.printx * linking to the sanyo code *
+LINK CPXSYO.ASM
+ENDIF  ; (sanfam AND lasm) - m80 use: INCLUDE from CPXTYP.ASM
+
+IF (comfam AND lasm)
+; Link to the compupro code
+.printx * linking to the Compupro code *
+LINK CPXPRO.ASM
+ENDIF  ; (comfam AND lasm) - m80 use: INCLUDE from CPXTYP.ASM
+
+IF (genfam AND lasm)
+; Link to the Genie family code
+.printx * linking to the Genie code *
+LINK CPXGNI.ASM
+ENDIF  ; (genfam AND lasm) - m80 use: INCLUDE from CPXTYP.ASM
+
+IF (trsfam AND lasm)
+; Link to the TRS-80 family file
+.printx * linking to the TRS family file*
+LINK CPXTM4.ASM
+ENDIF  ; (trsfam AND lasm) - m80 use: INCLUDE from CPXTYP.ASM
+
+IF (z80fam AND lasm)
+; Link to the Z80MU family file
+.printx * linking to the Z80MU family file*
+LINK CPXZ80.ASM
+ENDIF  ; (z80fam AND lasm) - m80 use: INCLUDE from CPXTYP.ASM
+
+IF (beefam AND lasm)
+; Link to the Microbee family file
+.printx * linking to the Microbee family file *
+LINK CPXBEE.ASM
+ENDIF  ; (beefam AND lasm) - m80 use: INCLUDE from CPXTYP.ASM
+
+
+; If we have come here, we are assembling the CPXSYS.ASM file
+
+IF robin
+.printx        * Assembling KERMIT-80 for the DEC VT180 *
+ENDIF
+
+IF vector
+.printx        * Assembling KERMIT-80 for the Vector Graphics *
+ENDIF
+
+IF osi
+.printx        * Assembling KERMIT-80 for the Ohio Scientific *
+ENDIF
+
+IF heath
+.printx        * Assembling KERMIT-80 for the Heath/Zenith 89 *
+ENDIF
+
+IF z100
+.printx        * Assembling KERMIT-80 for the Heath/Zenith Z100 *
+ENDIF
+
+IF trs80
+.printx        * Assembling KERMIT-80 for the TRS-80 II *
+ENDIF
+
+IF osbrn1
+.printx        * Assembling KERMIT-80 for the Osborne 1 *
+ENDIF
+
+IF telcon
+.printx        * Assembling KERMIT-80 for the Telcon Zorba *
+ENDIF
+
+IF dmII
+.printx        * Assembling KERMIT-80 for the DECmate II *
+ENDIF
+
+IF gener
+.printx        * Assembling Generic KERMIT-80 *
+ENDIF
+
+IF cpm3
+.printx        * Assembling Generic KERMIT-80 for CP/M 3.0 *
+ENDIF
+
+IF hp125
+.printx * Assembling Kermit-80 for the HP-125 Series 100 *
+ENDIF ;hp125
+
+IF kpii
+.printx        * Assembling Kaypro II KERMIT-80 *
+ENDIF
+
+IF xer820                      ;[pcc001]
+.printx        * Assembling Xerox 820 KERMIT-80 *
+ENDIF                          ;[pcc001]
+
+IF bbII
+.printx        * Assembling BigBoard II KERMIT-80 *
+ENDIF
+
+IF ampro
+.printx        * Assembling Ampro Little Board KERMIT-80 *
+ENDIF
+
+IF mdI
+.printx        * Assembling for Morrow Decision I *
+ENDIF  ;mdI  [Toad Hall]
+
+IF mmdI
+.printx        * Assembling for Morrow Micro Decision I *
+ENDIF  ;mmdI
+
+IF mikko
+.printx        * Assembling MikroMikko Kermit-80 *
+ENDIF
+
+IF delphi      ;[7]
+.printx        * Assembling Digicomp Delphi 100 Kermit-80 *
+ENDIF          ;[7]
+
+IF cpt85xx
+.printx        * Assembling CPT-85xx (under CompuPak CP/M) Kermit-80 *
+ENDIF
+
+IF cmemco      ;[25]
+.printx        * Assembling KERMIT-80 for the Cromemco (TU-ART) *
+ENDIF;cmemco
+
+IF bbc ;[22]
+.printx        * Assembling Kermit-80 for BBC with Z80 co-processor *
+ENDIF  ;[22]
+
+IF rm380z      ;[22]
+.printx        * Assembling Kermit-80 for Research Machines 380Z *
+ENDIF  ;[22]
+
+IF px8         ;[29]
+.printx        * Assembling Kermit-80 for Epson PX-8 *
+ENDIF  ;px8 [29]
+
+IF mmate       ;[29]
+.printx        * Assembling KERMIT-80 for the PMC MicroMate *
+ENDIF  ;mmate [29]
+
+IF disc        ;[29]
+.printx        * Assembling KERMIT-80 for the A. C. E. Discovery *
+ENDIF  ;disc [29]
+
+IF s1008       ;[29]
+.printx        * Assembling KERMIT-80 for the MicroSales s1008 *
+ENDIF  ;s1008 [29]
+
+IF access      ;[29]
+.printx        * Assembling Kermit-80 for the ACCESS-MATRIX computer *
+ENDIF  ;access [29]
+
+IF lobo                ;[hh]
+.printx        * Assembling Kermit-80 for the Lobo MAX-80 *
+ENDIF;lobo [hh]
+
+IF teletek
+.printx * Assembling Kermit-80 for the Teletek *
+ENDIF  ;teletek
+
+;
+;
+; If here, we have not linked to a family, so link to CPXSYS.ASM
+IF lasm
+       LINK    CPXSYS.ASM
+ENDIF  ;lasm
+;
+; If we are using m80, then the CPXSYS.ASM file will be INCLUDED from CPXTYP
+;
+
+
+
diff --git a/cpxsy2.asm b/cpxsy2.asm
new file mode 100644 (file)
index 0000000..a420d37
--- /dev/null
@@ -0,0 +1,1364 @@
+IF NOT lasm
+.printx * CPXSY2.ASM *
+ENDIF  ;NOT lasm
+;       KERMIT - (Celtic for "FREE")
+;
+;       This is the CP/M-80 implementation of the Columbia University
+;       KERMIT file transfer protocol.
+;
+;       Version 4.0
+;
+;       Copyright June 1981,1982,1983,1984,1985
+;       Columbia University
+;
+; Originally written by Bill Catchings of the Columbia University Center for
+; Computing Activities, 612 W. 115th St., New York, NY 10025.
+;
+; Contributions by Frank da Cruz, Daphne Tzoar, Bernie Eiben,
+; Bruce Tanner, Nick Bush, Greg Small, Kimmo Laaksonen, Jeff Damens, and many
+; others.
+;
+;       This file contains the system-dependent code and data for KERMIT.
+;       It will be probably be broken into independent files to generate
+;       overlays for the various systems, one or more overlay possible
+;       from each file.  For now, we will leave it in one piece.
+;
+; revision history:
+;
+;
+;\f       This is the system-dependent command to change the baud rate.
+;       DE contains the two-byte value from the baud rate table; this
+;       value is also stored in 'speed'.
+sysspd:
+
+
+IF px8 ; [29]
+        push    d
+        call    rsclose        ; baud rate can only be set on opening rs232
+        pop     d
+        mov     a, e
+        sta     px8blk+4       ; set param block
+        call    rsopen         ; to set rate
+        ret
+ENDIF ; px8 [29]
+
+; Set the speed for the Osborne I
+IF osbrn1
+        mvi     a,osbin1        ;Reset the ACIA
+        call    osstst          ;Write the control port
+osbs1:  inr     c               ;Waiting loop
+        jnz     osbs1
+        mov     a,e             ; get the specified speed
+        jmp     osstst          ;Write the control reg.
+ENDIF;osbrn1
+
+;[hh] set the speed for a lobo MAX-80
+IF lobo
+        mov     a,e             ;[hh] get the parsed value
+setbd:  sta     baudrt          ;[hh] and send it to the baud rate port
+        ret                     ;[hh]
+ENDIF;lobo
+
+; Set the speed for bigboard I or the delphi or the CPT-85xx
+; or Cromemco (TU-ART)
+IF delphi OR cpt85xx OR cmemco OR mmate ;[22] [29]
+        mov     a,e             ; get the parsed value
+        out     baudrt          ; Tell the baud rate generator.
+        ret
+ENDIF;delphi OR cpt85xx OR cmemco OR mmate [22] [29]
+
+;[22] Set the speed for Acorn BBC
+IF bbc
+        mov     l,e
+        mvi     a,7             ;Set receive baud rate
+        call    osbyte          ;*FX7,?e
+        mov     l,e
+        mvi     a,8             ;Set transmit baud rate
+        call    osbyte          ;*FX8,?e
+        ret
+ENDIF;[22] bbc
+
+;[22] Set speed for RM 380Z
+IF rm380z
+        mvi     a,4             ;device type (SI/O4) in A
+        rst     6               ; EMT
+        db      29h             ;     SETLST
+        ret
+ENDIF;[22] rm380z
+
+; Set the speed for MicroMikko.  DE is baud rate multiplier
+IF mikko
+        di
+        lxi     h,txclk
+        mov     m,d             ;LSB first (swapped in memory)
+        mov     m,e             ;MSB last
+        lxi     h,rxclk
+        mov     m,d
+        mov     m,e
+        mvi     b,0             ;"modifier" for 1 stop bit
+        mvi     a,2             ;Test MSB of speed >2 (110 bps or less)
+        cmp     e
+        jp      miksp1
+        mvi     b,00001000B     ;"modifier" for 2 stop bits
+miksp1: mvi     a,4             ;Select SIO Reg 4
+        lxi     h,sioac
+        mov     m,a
+        mvi     a,sion4         ;Get values
+        ora     b               ;Add modifier
+        mov     m,a             ;Set value (stop bits)
+        ei
+        ret
+ENDIF;mikko
+
+
+; Set the speed for the Decision I
+IF mdI
+        call    selmdm          ;Let's be absolutely sure, huh?
+        mvi     a,dlab+wls1+wls0+stb ;Set data latch access bit
+        out     lcr             ;Out to Line Control Register
+        lhld    speed           ;Load baudrate multiplier
+        xchg
+        mov     a,d             ;Get low order byte for baud rate
+        out     dlm             ;Out to the MSB divisor port
+        mov     a,e             ;...and the high order byte
+        out     dll             ;Out to the LSB divisor port
+        mvi     a,wls1+wls0+stb ;Enable Divisor Access Latch
+        out     lcr             ;Out to ACE Line Control Register
+        xra     a               ;Clear A
+        out     ier             ;Set no interrupts
+        out     lsr             ;Clear status
+        in      msr             ;Clear Modem Status Register
+        in      lsr             ;Clear Line Status Register
+        in      rbr             ;Clear Receiver Buffers
+        in      rbr
+        ret
+ENDIF   ;mdI    [Toad Hall]
+
+IF teletek
+       di
+       mov     a,e             ; first speed byte
+       out     baudrt
+       mov     a,d             ; second speed byte
+       out     baudrt
+       ei
+       ret
+ENDIF  ;teletek
+
+IF access       ;[29]
+        mov     a,e             ;Get the parsed time constant
+;The following code is derived from the Access  initialization code
+        sta     savspd          ;Save  the time constant
+        mvi     a,14h           ;Code for 'monitor' to set channel A baudrate
+        call    monitor
+        lda     savspd          ;Get the time constant
+        call    monitor         ; and send it to the CRT
+        ret
+savspd: ds      1
+monitor:                        ;Routine to do CRT functions
+        out     90h             ;Output the data to the CRT
+        mvi     a,1             ;Set DRDY true
+        out     23h
+mon1:   in      0a0h            ;Wait for CACK* true
+        rlc
+        jc      mon1
+        in      80h             ;Read the input data latch
+        push    psw             ;Save the input data
+        xra     a               ;Set DRDY false
+        out     23h
+mon2:   in      0a0h            ;Wait for CACK* false
+        rlc
+        jc      mon2
+        pop     psw
+        sta     0ee02h          ;Save the input data
+        ret
+ENDIF;access [29]
+
+
+IF disc ;[29]
+; Assuming that parsing of value from speed table puts low order
+; byte of time constant in the e register and high byte in d.
+        mvi     a,12            ;Register 12
+        out     mnprts
+        mov     a,e             ;Low order byte of time constant
+        out     mnprts
+        mvi     a,13            ;Register 13
+        out     mnprts
+        mov     a,d             ;High order byte of time constant
+        out     mnprts
+        mvi     a,14            ;Register 14
+        out     mnprts
+        mvi     a,3             ;Enable baud rate generator
+        out     mnprts
+        mvi     a,11            ;Register 11
+        out     mnprts
+        mvi     a,52h           ;no Xtal, tclk=rclk=/trxc out=br gen
+        out     mnprts
+        ret
+ENDIF;disc [29]
+;\f       Speed tables
+; (Note that speed tables MUST be in alphabetical order for later
+; lookup procedures, and must begin with a value showing the total
+; number of entries.  The speed help tables are just for us poor
+; humans.
+
+;       db      string length,string,divisor (2 identical bytes or 1 word)
+; [Toad Hall]
+
+IF delphi OR lobo    ;[hh]
+spdtbl: db      10h                     ;16 entries
+        db      03h,'110$',     02h,02h
+        db      04h,'1200$',    07h,07h
+        db      05h,'134.5$',   03h,03h
+        db      03h,'150$',     04h,04h
+        db      04h,'1800$',    08h,08h
+        db      05h,'19200$',   0fh,0fh
+        db      04h,'2000$',    09h,09h
+        db      04h,'2400$',    0ah,0ah
+        db      03h,'300$',     05h,05h
+        db      04h,'3600$',    0bh,0bh
+        db      04h,'4800$',    0ch,0ch
+        db      02h,'50$',      00h,00h
+        db      03h,'600$',     06h,06h
+        db      04h,'7200$',    0dh,0dh
+        db      02h,'75$',      01h,01h
+        db      04h,'9600$',    0eh,0eh
+
+sphtbl: db      cr,lf,'   50     75    110    134.5  150    300    600   1200'
+        db      cr,lf,' 1800   2000   2400   3600   4800   7200   9600  19200$'
+ENDIF;delphi OR lobo    ;[hh]
+
+IF cpt85xx
+spdtbl: db      15                      ; 15 entries
+        db      03,'110$',      03h,03h
+        db      04,'1200$',     09h,09h
+        db      05,'134.5$',    04h,04h
+        db      03,'150$',      05h,05h
+        db      04,'1800$',     0Ah,0Ah
+        db      04,'2400$',     0Bh,0Bh
+        db      03,'300$',      06h,06h
+        db      04,'3600$',     0Ch,0Ch
+        db      04,'4800$',     0Dh,0Dh
+        db      02,'50$',       01h,01h
+        db      03,'600$',      07h,07h
+        db      04,'7200$',     0Eh,0Eh
+        db      02,'75$',       02h,02h
+        db      03,'900$',      08h,08h
+        db      04,'9600$',     0Fh,0Fh
+
+sphtbl: db      cr,lf,'   50     75    110    134.5  150    300    600    900'
+        db      cr,lf,' 1200   1800   2400   3600   4800   7200   9600$'
+ENDIF;cpt85xx
+
+IF bbc          ;[22]
+spdtbl: db      8                       ; 8 entries
+        db      04,'1200$',     04h,04h
+        db      03,'150$',      02h,02h
+        db      05,'19200$',    08h,08h
+        db      04,'2400$',     05h,05h
+        db      03,'300$',      03h,03h
+        db      04,'4800$',     06h,06h
+        db      02,'75$',       01h,01h
+        db      04,'9600$',     07h,07h
+
+sphtbl: db      cr,lf,'   75   150   300   1200   2400   4800   9600   19200$'
+ENDIF;[22] bbc
+
+IF rm380z       ;[22]
+spdtbl: db      7                       ; 7 entries
+        db      03,'110$',      00h,00h
+        db      04,'1200$',     03h,03h
+        db      04,'2400$',     04h,04h
+        db      03,'300$',      01h,01h
+        db      04,'4800$',     05h,05h
+        db      03,'600$',      02h,02h
+        db      04,'9600$',     06h,06h
+
+sphtbl: db      cr,lf,'   110   300   600   1200   2400   4800   9600$'
+ENDIF;[22] rm380z
+
+IF px8 ; [29]
+spdtbl: db      9                       ; 9 entries
+        db      03,'110$',      02h,02h
+        db      04,'1200$',     0ah,0ah
+        db      03,'150$',      04h,04h
+        db      05,'19200$',    0fh,0fh
+        db      04,'2400$',     0ch,0ch
+        db      03,'300$',      06h,06h
+        db      04,'4800$',     0dh,0dh
+        db      03,'600$',      08h,08h
+        db      04,'9600$',     0eh,0eh
+sphtbl: db      cr, lf
+        db  '   100   150   300   600   1200   2400   4800   9600   19200$'
+ENDIF ; px8 [29]
+
+IF mikko
+spdtbl: db      9h                      ;9 entries
+        db      03h,'110$'
+        dw      0369h
+        db      04h,'1200$'
+        dw      0050h
+        db      03h,'150$'
+        dw      0280h
+        db      04h,'2400$'
+        dw      0028h
+        db      03h,'300$'
+        dw      0140h
+        db      04h,'4800$'
+        dw      0014h
+        db      03h,'600$'
+        dw      00A0H
+        db      02h,'75$'
+        dw      0500h
+        db      04h,'9600$'
+        dw      000ah
+
+sphtbl: db      cr,lf,'  75  110  150  300  600  1200  2400  4800  9600$'
+ENDIF;mikko
+
+IF osbrn1
+spdtbl: db      02h                     ;2 entries
+        db      04h,'1200$',    OSBI12,OSBI12
+        db      03h,'300$',     OSBI03,OSBI03
+
+sphtbl: db      cr,lf,'  300',cr,lf,' 1200$'
+ENDIF;osbrn1
+
+
+IF mdI
+spdtbl: db      0dh                     ; 13 entries
+        db      03h,  '110$'
+                dw              1047
+        db      04h, '1200$'
+                dw              96
+        db      03h,  '150$'
+                dw              768
+        db      05h,'19200$'
+                dw              6
+        db      04h, '2400$'
+                dw              48
+        db      03h,  '300$'
+                dw              384
+        db      05h,'38400$'
+                dw              3
+        db      03h,  '450$'
+                dw              288
+        db      04h, '4800$'
+                dw              24
+        db      05h,'56000$'
+                dw              2
+        db      03h,  '600$'
+                dw              192
+        db      02h,   '75$'
+                dw              1536
+        db      04h, '9600$'
+                dw              12
+
+sphtbl: db      cr,lf,'   75    110    150    300    450    600   1200'
+        db      cr,lf,' 2400   4800   9600  19200  38400  56000$'
+
+;(Lord knows what you'll be communicating with at 56000 baud, but the
+;Multi-I/O board literature says it'll do it, so what the heck....
+;might as well throw it in here just to show off...sure hope the
+;port don't melt...)
+
+ENDIF   ;mdI    [Toad Hall]
+
+IF cmemco                       ;[25]
+spdtbl: db      7               ; 7 entries
+        db      3,'110$',       01H,01H
+        db      4,'1200$',      88H,88H
+        db      3,'150$',       82H,82H
+        db      4,'2400$',      90H,90H
+        db      3,'300$',       84H,84H
+        db      4,'4800$',      0A0H,0A0H
+        db      4,'9600$',      0C0H,0C0H
+
+sphtbl: db      cr,lf
+        db      '   110   150   300  1200  2400  4800  9600$'
+ENDIF;cmemco
+
+IF access ;Similar to bbI with different values [29]
+spdtbl: db      6h                      ;6 entries
+        db      04h,'1200$',    28h,28h
+        db      04h,'2400$',    14h,14h
+        db      03h,'300$',     0a0h,0a0h
+        db      04h,'4800$',    0ah,0ah
+        db      03h,'600$',     50h,50h
+        db      04h,'9600$',    5,5
+
+sphtbl: db      cr,lf,'  300  600  1200  2400  4800  9600$'
+ENDIF;access [29]
+
+IF mmate        ;[29]
+spdtbl: db      10h                     ;16 entries
+        db      03h,'110$',     0e2h,0e2h
+        db      04h,'1200$',    0e7h,0e7h
+        db      05h,'134.5$',   0e3h,0e3h
+        db      03h,'150$',     0e4h,0e4h
+        db      04h,'1800$',    0e8h,0e8h
+        db      05h,'19200$',   0efh,0efh
+        db      04h,'2000$',    0e9h,0e9h
+        db      04h,'2400$',    0eah,0eah
+        db      03h,'300$',     0e5h,0e5h
+        db      04h,'3600$',    0ebh,0ebh
+        db      04h,'4800$',    0ech,0ech
+        db      02h,'50$',      0e0h,0e0h
+        db      03h,'600$',     0e6h,0e6h
+        db      04h,'7200$',    0edh,0edh
+        db      02h,'75$',      0e1h,0e1h
+        db      04h,'9600$',    0eeh,0eeh
+
+sphtbl: db      cr,lf,'   50  75    110    134.5  150    300    600   1200'
+        db      cr,lf,' 1800   2000   2400   3600   4800   7200   9600  19200$'
+ENDIF;mmate [29]
+
+IF disc ;[29]
+; Similar to mikko table but with different time constant values
+spdtbl: db      9h                      ;9 entries
+        db      03h,'110$'
+        dw      1134
+        db      04h,'1200$'
+        dw      102h
+        db      03h,'150$'
+        dw      831
+        db      04h,'2400$'
+        dw      50
+        db      03h,'300$'
+        dw      415
+        db      04h,'4800$'
+        dw      24
+        db      03h,'600$'
+        dw      206
+        db      02h,'75$'
+        dw      1665
+        db      04h,'9600$'
+        dw      11
+
+sphtbl: db      cr,lf,'  75  110  150  300  600  1200  2400  4800  9600$'
+ENDIF;disc      [29]
+
+IF teletek
+spdtbl:        db      7               ; 7 entries
+       db      4, '1200$',     47h,40h
+       db      5,'19200$',     47h,04h
+       db      4, '2400$',     47h,20h
+       db      3,  '300$',     47h,00h
+       db      4, '4800$',     47h,10h
+       db      3,  '600$',     47h,80h
+       db      4, '9600$',     47h,08h
+
+sphtbl:        db      cr,lf
+       db      '   300   600  1200   2400   4800   9600  19200$'
+ENDIF  ;teletk
+
+
+; The following conditionals were once a huge if not statement.  There
+; wasn't enough room to add the lobo to the list, so it had to be broken
+; into 2, which you can't do with an if not.  I redid it as two ifs and
+; applied them to those that wouldn't set baud. [Hal Hostetler]
+IF robin OR gener OR dmII OR vector OR trs80;[32]
+spdtbl  equ     0               ; SET BAUD not supported.
+sphtbl  equ     0
+ENDIF;robin OR gener OR dmII OR vector OR trs80 
+;
+IF mmdI OR osi OR cpm3 OR S1008 ; [29]
+spdtbl  EQU     0               ;[hh] SET BAUD not supported.
+sphtbl  EQU     0               ;[hh] ran out of room above...
+ENDIF;mmdI OR osi OR cpm3 OR S1008 [29]
+;
+IF hp125                       ;[MF]
+spdtbl  equ     0               ; SET BAUD not supported.
+sphtbl  equ     0
+ENDIF;hp125 [MF]
+;
+;\f       This is the system-dependent SET PORT command.
+;       HL contains the argument from the command table.
+sysprt:
+IF lobo ;[hh]
+        mov     a,l             ;[hh] get the data port value and store at
+        sta     outmd3+1        ;[hh] the two places we use...
+        sta     inpmd2+1        ;[hh] MNPORT in the overlay
+        sta     port            ;[hh] inform program of the change in ports
+        inr     a               ;[hh] status port = data port + 1 in the Lobo
+        sta     outmd1+1        ;[hh] store it at the three places...
+        sta     inpmd1+1        ;[hh] we use MNPRTS...
+        sta     outctl+1        ;[hh] in the overlay
+        mov     a,h             ;[hh] now get the baud rate port value
+        sta     getbd+1         ;[hh] store it in the two places we use...
+        sta     setbd+1         ;[hh] BAUDRT in the overlay
+        sta     port+1          ;[hh] don't need to, but keeps it consistant
+getbd:  lda     baudrt          ;[hh] get baud rate value from port
+        sta     speed           ;[hh] tell STAT. baud rate for each port
+                                ;[hh] is independant of the other
+ENDIF   ;lobo
+
+IF iobyt
+        mov     a,m             ;Get the I/O byte
+        sta     prtiob          ;Save the desired IO byte for this port
+        inx     h               ;Point at next entry
+        mov     a,m             ;Get the output function
+        sta     prtfun          ;Save it
+ENDIF;iobyt
+
+IF iobyt AND robin
+        inx     h               ;Point at next entry
+        mov     a,m             ;Get the hardware address for the port
+        sta     prtadr          ;Store it
+ENDIF;iobyt AND robin
+;
+IF hp125                       ;[MF]
+       push    psw
+       push    b
+       push    d
+       push    h
+       xchg                    ;Put port connect sequence address in DE
+       call    prtstr          ;Connect proper port
+       pop     h
+       pop     d
+       pop     b
+       pop     psw
+ENDIF;hp125 [MF]
+;
+        ret
+;\f
+;       Port tables for Lobo MAX-80
+IF lobo ;[hh]
+; help text
+prhtbl: db      cr,lf,'RS-232 port A or B$'
+;
+; command table
+prttbl: db      02H                     ;[hh] two entries
+        db      01H,'A$',0E4H,0D0H
+        db      01H,'B$',0E6H,0D4H
+ENDIF   ;lobo
+;\f
+;       Port tables for GENERIC CPM 2.2
+IF gener
+; help text
+prhtbl: db      cr,lf,'CRT device'
+        db      cr,lf,'PTR device'
+        db      cr,lf,'TTY device'
+        db      cr,lf,'UC1 device'
+        db      cr,lf,'UR1 device'
+        db      cr,lf,'UR2 device$'
+
+; command table
+prttbl: db      06H             ;Six devices to choose from
+        db      03H,'CRT$'
+                dw      crtptb
+        db      03H,'PTR$'
+                dw      ptrptb
+        db      03H,'TTY$'
+                dw      ttyptb
+        db      03H,'UC1$'
+                dw      uc1ptb
+        db      03H,'UR1$'
+                dw      ur1ptb
+        db      03H,'UR2$'
+                dw      ur2ptb
+
+; port entry table
+; table entries are:
+;       db      iobyte-value, BDOS output function, reserved
+crtptb: db      crtio,conout,0
+ptrptb: db      ptrio,punout,0
+ttyptb: db      ttyio,conout,0
+uc1ptb: db      uc1io,conout,0
+ur1ptb: db      ur1io,punout,0
+ur2ptb: db      ur2io,punout,0
+ENDIF;gener
+
+;\f
+;       Port tables for DECmate II or MicroMikko or Acorn BBC
+;
+IF dmII OR mikko OR bbc ;[22]
+; help text
+prhtbl: db      cr,lf,'COMMUNICATIONS port$'
+
+; command table
+prttbl: db      01H             ;Only one port known at this point
+        db      0EH,'COMMUNICATIONS$'
+                dw      comptb  ;address of info
+
+; port entry table
+; table entries are:
+;       db      iobyte-value, BDOS output function, reserved
+comptb: db      batio,punout,0
+
+ENDIF;[22] dmII OR mikko OR bbc
+;\f
+;       Port tables for Robin
+;
+IF robin
+; help text
+prhtbl: db      cr,lf,'COMMUNICATIONS port'
+        db      cr,lf,'GENERAL purpose port'
+        db      cr,lf,'PRINTER port$'
+
+; command table
+prttbl: db      03H             ;Three entries
+        db      0EH,'COMMUNICATIONS$'
+                dw      comptb
+        db      07H,'GENERAL$'
+                dw      gppptb
+        db      07H,'PRINTER$'
+                dw      prnptb
+
+; port entry table
+; table entries are:
+;       db      iobyte-value, BDOS output function, hardware port address
+;                                                   (control/status)
+;
+;At present, the hardware port address is only used for sending a break.
+comptb: db      batio,punout,comtst
+gppptb: db      gppio,conout,gentst
+prnptb: db      lptio,conout,prntst
+
+prtadr: db      comtst          ;space for current hardware port address
+ENDIF;robin
+
+IF iobyt
+prtfun: db      punout          ;Function to use for output to comm port
+prtiob: db      batio           ;I/O byte to use for communicating
+coniob: db      defio           ;I/O byte to use for console
+ENDIF;iobyt
+;
+IF hp125                       ;[MF]
+; Help table
+prhtbl:        db      cr,lf,'Communications port'
+       db      cr,lf,'Printer port$'
+; command table
+prttbl:        db      02H             ;2 entries
+       db      0eH,'COMMUNICATIONS$'
+       dw      mapon1
+       db      07H,'PRINTER$'
+       dw      mapon2
+;Port table entries are the addresses of the escape sequences to connect
+;the ports.
+;
+ENDIF;hp125 [MF]
+
+IF NOT (iobyt OR lobo OR hp125)          ;[hh] [MF]
+prttbl  equ     0               ; SET PORT is not supported
+prhtbl  equ     0
+ENDIF;NOT iobyt OR lobo OR hp125 [MF]
+;\f
+;       selmdm - select modem port
+;       selcon - select console port
+;       selmdm is called before using inpmdm or outmdm;
+;       selcon is called before using inpcon or outcon.
+;       For iobyt systems, diddle the I/O byte to select console or comm port;
+;       For Decision I, switches Multi I/O board to console or modem serial
+;       port.  [Toad Hall]
+;       For the rest, does nothing.
+;       preserves bc, de, hl.
+selmdm:
+IF iobyt
+       lda     prtiob          ;Set up for output to go to the comm port
+        sta     iobyte          ;Switch byte directly
+ENDIF;iobyt
+
+IF mdI
+        lda     group
+        ori     mdmgrp          ;Mask modem serial port
+        out     grpsel
+ENDIF;mdI  [Toad Hall]
+
+        ret
+
+selcon:
+IF iobyt
+        lda     coniob          ;Set up for output to go to the console port
+        sta     iobyte          ;Switch directly
+ENDIF;iobyt
+
+IF mdI
+        lda     group
+        ori     congrp          ;Mask console serial port (1)
+        out     grpsel
+ENDIF;mdI  [Toad Hall]
+
+        ret
+;\f       Get character from console, or return zero.
+;       result is returned in A.  destroys bc, de, hl.
+;
+inpcon:
+IF NOT iobyt
+        mvi     c,dconio        ;Direct console I/O BDOS call.
+        mvi     e,0FFH          ;Input.
+        call    BDOS
+ENDIF;NOT iobyt
+
+IF iobyt
+        call    bconst          ;Get the status
+        ora     a               ;Anything there?
+        rz                      ;No, forget it
+        call    bconin          ;Yes, get the character
+ENDIF;iobyt
+        ret
+;\f
+;       Output character in E to the console.
+;       destroys bc, de, hl
+;
+outcon:
+
+IF rm380z       ;[22]
+        mov     a,e
+        cpi     cr              ;cr produces cr + lf
+        jnz     outcn1
+        mvi     e,'N'-100O      ;Control-N produces cr only
+outcn1:                         ;continue
+ENDIF;[22] rm380z
+
+IF NOT iobyt
+        mvi     c,dconio        ;Console output bdos call.
+        call    bdos            ;Output the char to the console.
+ENDIF;NOT iobyt
+
+IF iobyt
+        mov     c,e             ;Character
+        call    bcnout          ;to Console
+ENDIF;iobyt
+        ret
+;\f
+;       outmdm - output a char from E to the modem.
+;               the parity bit has been set as necessary.
+;       returns nonskip; bc, de, hl preserved.
+outmdm:
+IF osi OR lobo         ;[hh]
+        push    h
+outmd1: lxi     h,mnprts        ;address of the port status register
+outmd2: mov     a,m             ; get port status in A
+        ani     output          ;Loop till ready.
+        jz      outmd2
+outmd3: lxi     h,mnport        ;address of port data register
+        mov     m,e             ; write the character
+        pop     h
+        ret
+ENDIF;osi OR lobo
+
+IF osbrn1
+        call    osldst          ;Read the status port
+        ani     output          ;Loop till ready.
+        jz      outmdm
+        mov     a,e
+        jmp     osstda          ;Write to the data port
+ENDIF;osbrn1
+
+IF px8 ; [29]
+        push    h
+        push    b
+        push    d
+outmd1: call    rsoutst         ; get the output status
+        ora     a
+        jz      outmd1          ; check if output enabled
+        pop     d
+        mov     c, e            ; char in C
+        push    d
+        call    rsput
+        pop     d
+        pop     b
+        pop     h
+        ret
+ENDIF; px8 [29]
+
+IF inout
+        in      mnprts          ;Get the output done flag.
+        ani     output          ;Is it set?
+        jz      outmdm          ;If not, loop until it is.
+        mov     a,e
+        out     mnport          ;Output it.
+        ret
+ENDIF;inout
+
+IF iobyt
+;**** Note that we enter from outpkt with the I/O byte already set up for
+;  output to go to the comm port
+        push    h
+        push    b
+        lda     prtfun          ;Get the output function
+        mov     c,a             ;Into C
+        call    bdos            ;And output the character
+        pop     b
+        pop     h
+        ret
+ENDIF;iobyt
+
+IF cpm3 OR hp125 ;[MF]
+        push    h
+        push    b
+        mvi     c,auxout        ;Output to the aux output device
+        call    bdos
+        pop     b
+        pop     h
+        ret
+ENDIF;cpm3 OR hp125 [MF]
+
+;\forg  $+100h AND 0FF00h       ; get rid of phase error
+
+;
+;       get character from modem; return zero if none available.
+;       for IOBYT systems, the modem port has already been selected.
+;       destroys bc, de, hl.
+inpmdm:
+IF iobyt
+        call    bconst          ;Is Char at COMM-Port?
+        ora     a               ;something there?
+        rz                      ; return if nothing there
+        call    bconin          ; data present. read data.
+ENDIF;iobyt
+
+IF cpm3
+        mvi     c,auxist
+        call    bdos            ;is char at auxin?
+        ora     a               ;something there?
+        rz                      ;no
+        mvi     c,auxin
+        call    bdos            ;read char from auxin
+ENDIF;cpm3
+;
+IF hp125                       ;[MF]
+       lxi     b,70ffh         ;SEt subfunction to get RDR (auxin) status
+        call    bdos            ;is char at RDR?
+        ora     a               ;something there?
+        rz                      ;no
+        mvi     c,auxin
+        call    bdos            ;read char from RDR
+ENDIF;hp125 [MF]
+
+IF osi OR lobo         ;[hh]
+inpmd1: lda     mnprts          ;Get the port status into A.
+        ani     input           ;See if the input ready bit is on.
+        rz                      ;If not then return.
+inpmd2: lda     mnport          ;If so, get the char.
+ENDIF;osi OR lobo 
+
+IF osbrn1
+        call    osldst          ;Read the status port
+        ani     input           ;Something there?
+        rz                      ;Nope
+        call    osldda          ;Read the data port
+ENDIF;osbrn1
+
+IF inout
+;Note: modem port should already be selected for mdI.  [Toad Hall]
+        in      mnprts          ;Get the port status into A.
+        ani     input           ;See if the input ready bit is on.
+        rz                      ;If not then return.
+        in      mnport          ;If so, get the char.
+ENDIF;inout
+
+IF px8 ; [29]
+        call    rserst          ; check error status
+        ani     64h             ; this assumes 'not open' cannot occur
+        jnz     inpmd1          ; error has occurred!
+        call    rsinst          ; any chars outstanding?
+        ora     a
+        rz                      ; exit if none
+        call    rsget           ; get char in A
+        ret
+; return the 'no char outstanding' indication on error
+inpmd1: mvi     a, 0
+ENDIF; px8 [29]
+
+       ret                     ; return with character in A
+
+
+;
+;       flsmdm - flush comm line.
+;       Modem is selected.
+;       Currently, just gets characters until none are available.
+
+flsmdm: call    inpmdm          ; Try to get a character
+        ora     a               ; Got one?
+        jnz     flsmdm          ; If so, try for another
+        ret                     ; Receiver is drained.  Return.
+;\f
+;       lptstat - get the printer status. Return a=0ffh if ok, or 0 if not.
+lptstat:
+IF iobyt                        ;[33]
+        call    bprtst          ;
+call    bprtst          ; get status
+ENDIF   ;iobyt[33]
+IF NOT iobyt    ;[33]
+        xra     a               ; assume it is ok.. this may not be necessary
+ENDIF   ;iobyt [33]
+        ret
+
+;
+;       outlpt - output character in E to printer
+;       console is selected.
+;       preserves de.
+outlpt:
+        push    d               ; save DE in either case
+        call    prtflt          ; go through printer filter [30]
+        ana     a               ; if A = 0 do nothing,
+        jz      outlp1          ; [30] if a=0 do nothing
+
+IF NOT iobyt
+        mvi     c,lstout
+        call    bdos            ;Char to printer
+ENDIF;NOT iobyt
+IF iobyt
+        mov     c,e
+        call    blsout
+ENDIF;iobyt
+
+outlp1: pop     d               ; restore saved register pair
+        ret
+;\f
+;       Screen manipulation routines
+;       csrpos - move to row B, column C
+;
+;       csrpos for terminals that use a leadin sequence followed
+;        by (row + 31.) and (column + 31.)
+;
+IF NOT (robin OR dmII OR osi OR vector OR termin OR hp125)
+                               ;[MF] Terminals code in CPXVDU
+csrpos: push    b               ; save coordinates
+        lxi     d,curldn        ; get cursor leadin sequence
+        call    prtstr          ; print it
+        pop     h               ; restore coordinates
+        mov     a,h             ; get row
+        adi     (' '-1)         ; space is row one
+        mov     e,a
+        push    h
+        call    outcon          ; output row
+        pop     h
+        mov     a,l             ; get column
+        adi     (' '-1)         ; space is column one
+        mov     e,a
+        jmp     outcon          ; output it and return
+ENDIF;NOT (robin OR dmII OR osi OR vector OR termin OR hp125)[MF]
+;
+;
+;
+;       csrpos for ANSI terminals
+;
+IF robin OR dmII 
+csrpos: push    b               ; save coordinates
+        lxi     d,curldn        ; get cursor leadin sequence
+        call    prtstr          ; print it
+        pop     h               ; peek at coordinates
+        push    h               ;  then save away again
+        mov     l,h             ; l = row
+        mvi     h,0             ; hl = row
+        call    nout            ; output in decimal
+        mvi     e,';'           ; follow with semicolon
+        call    outcon          ; print it
+        pop     h               ; restore column
+        mvi     h,0             ; hl = column
+        call    nout
+        mvi     e,'H'           ; terminate with 'move cursor' command
+        jmp     outcon          ; output it and return
+ENDIF;robin OR dmII 
+;
+;       csrpos for the HP-125 [MF]
+;
+IF hp125                               ;[MF]
+csrpos:        dcr     b               ;HP-125 uses zero-based addressing
+       dcr     c               ;...
+ push    b               ; save coordinates
+        lxi     d,curldn        ; get cursor leadin sequence
+        call    prtstr          ; print it
+        pop     h               ; peek at coordinates
+        push    h               ;  then save away again
+        mov     l,h             ; l = row
+        mvi     h,0             ; hl = row
+        call    nout            ; output in decimal
+        mvi     e,'R'+20h      ;Say it was a row
+        call    outcon          ; print it
+        pop     h               ; restore column
+        mvi     h,0             ; hl = column
+        call    nout
+        mvi     e,'C'           ; terminate with 'move cursor' command
+        jmp     outcon          ; output it and return
+ENDIF;hp125 [MF]
+;
+;       csrpos for the Vector General.  It's weird.
+;
+IF vector
+csrpos: dcr     b               ; vector uses zero-based addressing?
+        dcr     c
+        push    b               ; save coordinates
+        mvi     e,esc           ; print an escape
+        call    outcon
+        pop     d               ; peek at coordinates
+        push    d
+        call    outcon          ; output column
+        pop     d
+        mov     e,d             ; get row
+        jmp     outcon          ; output and return
+ENDIF;vector
+
+IF osi                                 ; systems without cursor positioning
+csrpos: ret                     ; dummy routine referenced by linkage section
+ENDIF;osi
+
+
+;
+; delchr - make delete look like a backspace.  Unless delete is a printing
+;       character, we just need to print a backspace. (we'll output clrspc
+;       afterwards)
+;       For Kaypro and Vector General, delete puts a blotch on the screen.
+;       For Apple and Osborne 1, delete moves but doesn't print.
+delchr:
+
+IF vector OR osbrn1 OR lobo
+        lxi     d,delstr
+        jmp     prtstr
+ENDIF  ;vector OR osbrn1 OR lobo
+
+IF bbc OR rm380z      ;[22]
+        ret
+ENDIF;bbc OR rm380z
+
+IF NOT (vector OR osbrn1 OR bbc OR rm380z);[22]
+        mvi     e,bs            ;get a backspace
+        jmp     outcon
+ENDIF;NOT (vector OR osbrn1 OR bbc OR rm380z [22]
+
+; erase the character at the current cursor position
+clrspc: mvi     e,' '
+        call    outcon
+        mvi     e,bs            ;get a backspace
+        jmp     outcon
+
+; erase the current line
+clrlin: lxi     d,eralin
+        jmp     prtstr
+
+; erase the whole screen, and go home. preserves b (but not c)
+clrtop: lxi     d,erascr
+        jmp     prtstr
+
+
+IF robin
+sysver:        db      'VT180 Robin$'
+ENDIF;robin
+
+IF dmII
+sysver:        db      'DECmate II CP/M-80$'
+ENDIF;dmII
+
+IF delphi      ; [7] new system
+sysver:        db      'Digicomp Delphi 100$'
+endif;delphi
+
+IF access
+sysver:        db      'Actrix CP/M$'
+endif;
+
+IF teletek
+sysver:        db      'Teletek SYSTEMASTER CP/M-80$'
+ENDIF  ;teletek
+
+IF cpt85xx
+sysver:        db      'CPT-85xx under CompuPak CP/M$'
+ENDIF;cpt85xx
+
+IF mdI
+sysver:        db      'Morrow Decision I$'
+ENDIF;mdI  [Toad Hall]
+
+IF mmdI
+sysver:        db      'MicroDecision I$'
+ENDIF;mmdI
+
+IF osi
+sysver:        db      'Ohio Scientific$'
+ENDIF;osi
+
+IF mmate       ;[29]
+sysver:        db      'PMC Micromate using port I/O$'
+ENDIF;mmate [29]
+
+IF disc                ;[29]
+sysver:        db      'Discovery using 83U board port B$'
+ENDIF  ;disc [29]
+
+IF s1008       ;[29]
+sysver:        db 'U. S. MicroSales using printer port$'
+ENDIF ;s1008 [29]
+
+IF cmemco      ;[25]
+sysver:        db      'Cromemco (TU-ART)$'
+ENDIF;cmemco
+;
+IF robin OR dmII
+; Note that we cannot support Graphics Mode or the H19 erase-screen command
+; (<esc>E), because the sequences are more than three bytes.
+defesc EQU     '\'-100O        ;Still Control-\ (just ran out of room...)
+vtval  EQU     0               ; we probably don't want VT52 emulation
+outlin:        db      esc,3CH,esc,'[H',esc,'[J',cr,lf,tab,tab,'$'
+erascr:        db      esc,'[H',esc,'[J$'      ;Clear screen and go home.
+eralin:        db      cr,esc,'[K$'            ;Clear line.
+curldn:        db      esc,'[$'                ; Cursor leadin
+ttab:
+ta:    db      esc,'[A$'               ; Cursor up.
+tb:    db      esc,'[B$'               ; Cursor down.
+tc:    db      esc,'[C$'               ; Cursor right.
+td:    db      esc,'[D$'               ; Cursor left
+te:    db      '$',0,0,0               ; (can't) Clear display
+tf:    db      '$',0,0,0               ; (don't) Enter Graphics Mode
+tg:    db      '$',0,0,0               ; (don't) Exit Graphics mode
+th:    db      esc,'[H$'               ; Cursor home.
+ti:    db      esc,'M$',0              ; Reverse linefeed.
+tj:    db      esc,'[J$'               ; Clear to end of screen.
+tk:    db      esc,'[K$'               ; Clear to end of line.
+ENDIF;robin OR dmII
+
+IF mikko
+sysver:        db      'MikroMikko$'
+outlin:        db      subt,cr,lf,tab,'$'
+erascr:        db      subt,'$'                ;Clear screen and go home.
+eralin:        db      cr,1CH,'$'              ;Clear line.
+curldn:        db      esc,'=$'                ;cursor leadin
+ttab:                                  ;Table start location.
+ta:    db      0BH,'$',0,0             ;Cursor up.
+tb:    db      0AH,'$',0,0             ;Cursor down.
+tc:    db      0CH,'$',0,0             ;Cursor right.
+td:    db      bs,'$',0,0              ;Cursor left
+te:    db      subt,'$',0,0            ;Clear display
+tf:    db      '$',0,0,0               ;(can't) Enter Graphics Mode
+tg:    db      '$',0,0,0               ;(can't) Exit Graphics mode
+th:    db      1EH,'$',0,0             ;Cursor home.
+ti:    db      '$',0,0,0               ;(can't) Reverse linefeed.
+tj:    db      1cH,'$',0,0             ;Clear to end of screen.
+tk:    db      1cH,'$',0,0             ;Clear to end of line.
+ENDIF;mikko
+;\f
+IF bbc         ;[22]
+sysver:        db      'BBC (Z80)$'
+outlin:        db      0CH,esc,'=',21H,30H,'$'
+erascr:        db      0CH,'$'                 ;Clear screen and go home.
+eralin:        db      cr,esc,'@$'             ;Clear line.
+curldn:        db      esc,'=$'                ;cursor leadin
+ttab:                                  ;Table start location.
+ta:    db      0BH,'$',0,0             ;Cursor up.
+tb:    db      0AH,'$',0,0             ;Cursor down.
+tc:    db      tab,'$',0,0             ;Cursor right.
+td:    db      bs,'$',0,0              ;Cursor left
+te:    db      0CH,'$',0,0             ;Clear display
+tf:    db      '$',0,0,0               ;(can't) Enter Graphics Mode
+tg:    db      '$',0,0,0               ;(can't) Exit Graphics mode
+th:    db      1EH,'$',0,0             ;Cursor home.
+ti:    db      '$',0,0,0               ;(can't) Reverse linefeed.
+tj:    db      esc,'?$',0,0            ;Clear to end of screen.
+tk:    db      esc,'@$',0,0            ;Clear to end of line.
+ENDIF;[22] bbc
+;\f
+IF rm380z      ;[22]
+sysver:        db      'Research Machines 380Z$'
+outlin:        db      1FH,cr,tab,'$'
+erascr:        db      1FH,'$'                 ;Clear screen and go home.
+eralin:        db      0EH,19H,'$'             ;Clear line.
+curldn:        db      16H,'$'                 ;cursor leadin
+ttab:                                  ;Table start location.
+ta:    db      0BH,'$',0,0             ;Cursor up.
+tb:    db      0AH,'$',0,0             ;Cursor down.
+tc:    db      18H,'$',0,0             ;Cursor right.
+td:    db      bs,'$',0,0              ;Cursor left
+te:    db      1FH,'$',0,0             ;Clear display
+tf:    db      '$',0,0,0               ;(can't) Enter Graphics Mode
+tg:    db      '$',0,0,0               ;(can't) Exit Graphics mode
+th:    db      1DH,'$',0,0             ;Cursor home.
+ti:    db      '$',0,0,0               ;(can't) Reverse linefeed.
+tj:    db      1EH,'$',0,0             ;Clear to end of screen.
+tk:    db      19H,'$',0,0             ;Clear to end of line.
+ENDIF;[22] rm380z
+
+IF lobo        ;[hh]
+sysver:        db      'Lobo MAX-80$'
+outlin:        db      esc,'*',cr,lf,tab,tab,'$'
+erascr:        db      esc,'*$'                ;[hh] clear screen and home cursor
+eralin:        db      cr,esc,'R$'             ;[hh] clear line
+curldn:        db      esc,'=$'                ;[hh] cursor lead-in string
+delstr:        db      bs,' ',bs,bs,'$'        ;[hh] ??adjust for echoing delete
+ttab:                                  ;[hh] table start location
+ta:    db      0BH,'$',0,0             ;[hh] cursor up
+tb:    db      0AH,'$',0,0             ;[hh] cursor down
+tc:    db      0CH,'$',0,0             ;[hh] cursor right
+td:    db      08H,'$',0,0             ;[hh] cursor left
+te:    db      esc,'*$',0              ;[hh] clear display (homes cursor)
+tf:    db      '$',0,0,0               ;[hh] (can't) enter graphics mode
+tg:    db      '$',0,0,0               ;[hh] (can't) exit graphics mode
+th:    db      01EH,'$',0,0            ;[hh] home cursor
+ti:    db      esc,'E$',0              ;[hh] reverse linefeed (insert line)
+tj:    db      esc,'Y$',0              ;[hh] clear to end of screen
+tk:    db      esc,'T$',0              ;[hh] clear to end of line
+ENDIF  ;lobo
+
+IF px8 ; [29]
+sysver:        db      'Epson PX-8$'
+outlin:        db      esc,'*$'
+erascr:        db      esc,'*$'    ; clear screen and home
+eralin:        db      cr,esc,'T$' ; clear line
+curldn:        db      esc,'=$'    ; cursor lead in
+ttab:                      ; table start location
+ta:    db      30,'$',0,0  ; cursor up
+tb:    db      31,'$',0,0  ; cursor down
+tc:    db      28,'$',0,0  ; cursor right
+td:    db      29,'$',0,0  ; cursor left
+te:    db      esc,'*$',0  ; clear display
+tf:    db      '$',0,0,0   ; can't enter graphics graphics mode
+tg:    db      '$',0,0,0   ; can't exit graphics mode
+th:    db      11,'$',0,0  ; home cursor
+ti:    db      30,'$',0,0  ; reverse linefeed
+tj:    db      esc,'Y$',0  ; erase to end of screen
+tk:    db      esc,'T$',0  ; erase to end of line
+ENDIF ; px8 [29]
+
+;\f
+IF osbrn1
+sysver:        db      'Osborne 1$'
+outlin:        db      1AH,cr,lf,tab,'$'       ;(Clear screen, home cursor)
+erascr:        db      1AH,'$'                 ;Clear screen and go home.
+eralin:        db      cr,esc,'T$'             ;Clear line.
+delstr:        db      bs,bs,'$'               ; Adjust for delete
+curldn:        db      esc,'=$'                ;Cursor lead-in
+ttab:                                  ;Table start location.
+ta:    db      ('K'-100O),'$',0,0      ;Cursor up.
+tb:    db      12O,'$',0,0             ;Cursor down.
+tc:    db      ('L'-100O),'$',0,0      ;Cursor right.
+td:    db      bs,'$',0,0              ;Cursor left.
+te:    db      subt,'$',0,0            ;Clear screen.
+tf:    db      '$',0,0,0               ;(can't) Enter graphics mode
+tg:    db      '$',0,0,0               ;(can't) Exit graphics mode
+th:    db      ('^'-100O),'$',0,0      ;Cursor home.
+ti:    db      ('K'-100O),'$',0,0      ;Reverse linefeed.
+tj:    db      esc,'T$',0              ;(can't) Clear to end of screen.
+tk:    db      esc,'T$',0              ;Clear to end of line.
+ENDIF;osbrn1
+;\f
+IF vector
+sysver:        db      'Vector Graphics$'
+outlin:        db      ('D'-100O),cr,lf,tab,tab,'$'
+erascr:        db      ('D'-100O),'$'          ;Clear screen and go home.
+eralin:        db      cr,('Q'-100O),'$'       ;Clear line.
+delstr:        db      bs,' ',bs,bs,'$'        ; adjust for echoing delete character
+ttab:                                  ;Table start location.
+ta:    db      ('U'-100O),'$',0,0      ;Cursor up.
+tb:    db      12O,'$',0,0             ;Cursor down.
+tc:    db      ('Z'-100O),'$',0,0      ;Cursor right.
+td:    db      '$',0,0,0               ;(can't) Cursor left
+te:    db      '$',0,0,0               ;(can't) Clear display
+tf:    db      '$',0,0,0               ;(can't) Enter graphics mode
+tg:    db      '$',0,0,0               ;(can't) Exit graphics mode
+th:    db      ('B'-100O),'$',0,0      ;Cursor home.
+ti:    db      ('U'-100O),'$',0,0      ;Reverse linefeed.
+tj:    db      ('P'-100O),'$',0,0      ;Clear to end of screen.
+tk:    db      ('Q'-100O),'$',0,0      ;Clear to end of line.
+ENDIF;vector
+
+IF trs80lb
+sysver:        db      'TRS-80 II Lifeboat CP/M$'
+outlin:        db      esc,':',cr,lf,tab,tab,'$'
+erascr:        db      esc,':$'                ;Clear screen and go home.
+eralin:        db      cr,esc,'T$'             ;Clear line.
+curldn:        db      esc,'=$'                ;Cursor lead-in
+ttab:                                  ;Table start location.
+ta:    db      0BH,'$',0,0             ;Cursor up.
+tb:    db      0AH,'$',0,0             ;Cursor down.
+tc:    db      0CH,'$',0,0             ;Cursor right.
+td:    db      bs,'$',0,0              ;Cursor left
+te:    db      esc,':$',0              ;Clear display
+tf:    db      '$',0,0,0               ;(can't) Enter Graphics Mode
+tg:    db      '$',0,0,0               ;(can't) Exit Graphics mode
+th:    db      1EH,'$',0,0             ;Cursor home.
+ti:    db      0BH,'$',0,0             ;Reverse linefeed.
+tj:    db      esc,'Y$',0              ;Clear to end of screen.
+tk:    db      esc,'T$',0              ;Clear to end of line.
+ENDIF;trs80lb
+;\f
+IF trs80pt
+sysver:        db      'TRS-80 II P+T CP/M$'
+outlin:        db      0CH,cr,lf,tab,tab,'$'
+erascr:        db      0CH,'$'                 ;Clear screen and go home.
+eralin:        db      cr,01H,'$'              ;Clear line.
+curldn:        db      esc,'Y$'                ;Cursor lead-in
+ttab:  ;Table start location           ;Must be 4 bytes each
+ta:    db      1EH,'$',0,0             ;Cursor up.
+tb:    db      1FH,'$',0,0             ;Cursor down.
+tc:    db      1DH,'$',0,0             ;Cursor right.
+td:    db      1CH,'$',0,0             ;Cursor left
+te:    db      0CH,'$',0,0             ;Clear display
+tf:    db      11H,'$',0,0             ;Enter Graphics Mode
+tg:    db      14H,'$',0,0             ;Exit Graphics mode
+th:    db      06H,'$',0,0             ;Cursor home.
+ti:    db      1EH,'$',0,0             ;Reverse linefeed.
+tj:    db      02H,'$',0,0             ;Clear to end of screen.
+tk:    db      01H,'$',0,0             ;Clear to end of line.
+ENDIF;trs80pt
+
+IF osi
+outlin:        db      cr,lf,'Starting ...$'
+erascr equ     crlf                    ;"Home & clear" (best we can do).
+eralin:        db      '^U',cr,lf,'$'          ;Clear line.
+prpack:        db      cr,lf,'RPack: $'
+pspack:        db      cr,lf,'SPack: $'
+ttab   equ     0                       ; no VT52 table
+ENDIF;osi
+;
+IF hp125                       ;[MF]
+defesc EQU     '\'-100O        ;Still Control-\ (just ran out of room...)
+vtval  EQU     0               ; we probably don't want VT52 emulation
+;
+sysver:        db      'HP-125 Series 100$'
+;
+outlin:        db      esc,'H',esc,'J',cr,lf,tab,tab,'$'
+erascr:        db      esc,'H',esc,'J$'        ;Clear screen and go home.
+eralin:        db      cr,esc,'K$'             ;Clear line.
+curldn:        db      esc,'&a$'               ;Cursor leadin
+ttab:                                  ;Table start location.
+ta:    db      esc,'A$',0              ;Cursor up.
+tb:    db      esc,'B$',0              ;Cursor down.
+tc:    db      esc,'C$',0              ;Cursor right.
+td:    db      esc,'D$',0              ;Cursor left
+te:    db      esc,'J$',0              ;Clear display
+tf:    db      '$',0,0,0               ;[hh] (can't) enter graphics mode
+tg:    db      '$',0,0,0               ;[hh] (can't) exit graphics mode
+th:    db      esc,'H$',0              ;Cursor home.
+ti:    db      esc,'M$',0              ;Reverse linefeed.
+tj:    db      esc,'J$',0              ;Clear to end of screen.
+tk:    db      esc,'K$',0              ;Clear to end of line.
+;
+;
+; Escape sequences to map CP/M Reader/Punch to Data Comm input/output,
+;      respectively and to turn off these mappings
+;
+mapon1:        db      esc,'&i10s18d9M'
+       db      esc,'&i2s25d9M'
+       db      esc,'&i10s16d2M'
+       db      esc,'&i0s25d2M$';Esc. sequences to turn off DAtacomm2/turn
+                               ;on Data Comm 1
+mapon2:        db      esc,'&i10s16d9M'
+       db      esc,'&i0s25d9M'
+       db      esc,'&i10s18d2M'
+       db      esc,'&i2s25d2M$';Esc. sequences to turn off Datacomm1/turn
+                               ;on Datacomm 2
+mapoff:        db      esc,'&i0s25d9M'
+       db      esc,'&i10s16d9M'
+       db      esc,'&i2s25d9M'
+       db      esc,'&i10s18d9M$'
+;
+readin:        call    $-$             ;Read character into b
+       mov     a,b             ;Get 8-bit character
+       ret                     ;and return
+;
+jbuf:  db      7               ;bios dispatch table vector argument block
+       db      0               ;to read RDR routine address
+       db      0c3h            ;...
+       dw      0               ;...
+;
+ENDIF;hp125 ;[MF]
+
+IF lasm and termin     ; if no terminal, no need to link
+LINK CPXVDU.ASM
+ENDIF  ; lasm and termin
+
+ovlend EQU     $
+
+IF lasm
+       END     ; If m80 then this ignored
+ENDIF  ; lasm
diff --git a/cpxsyo.asm b/cpxsyo.asm
new file mode 100644 (file)
index 0000000..5b1cb0e
--- /dev/null
@@ -0,0 +1,389 @@
+IF NOT lasm
+.printx * CPXSYO.ASM *
+ENDIF  ;NOT lasm
+;       KERMIT - (Celtic for "FREE")
+;
+;       This is the CP/M-80 implementation of the Columbia University
+;       KERMIT file transfer protocol.
+;
+;       Version 4.0
+;
+;       Copyright June 1981,1982,1983,1984,1985
+;       Columbia University
+;
+; Originally written by Bill Catchings of the Columbia University Center for
+; Computing Activities, 612 W. 115th St., New York, NY 10025.
+;
+; Contributions by Frank da Cruz, Daphne Tzoar, Bernie Eiben,
+; Bruce Tanner, Nick Bush, Greg Small, Kimmo Laaksonen, Jeff Damens, and many
+; others.
+;
+;       This file contains the system dependent part for Sanyo MBC 1100
+;      systems, and has been extracted from the CPMSYO.ASM code (kermit
+;      version 3.5)
+;
+; revision history:
+;
+; edit 1, 27 October, 1987, by OBSchou.  Extracted Sanyo code from CPMSYO.ASM
+;      and massaged fort CP/M kermit V4.09
+;
+; Keep module name, edit number, and last revision date in memory.
+family: db      'CPXSYO.ASM (1)  27-Oct-87 $'
+;\f
+
+; Assembly time message to let me know I'm building the right version.
+; LASM generates an 'S' error along with the message, which is messy, but
+; better than trying to put everything inside a IF m80 OR mac80 conditional,
+; because LASM doesn't like nested IF's, either.
+
+IF sanyo
+.printx * Assembling Kermit-80 for Sanyo MBC 1100 *
+ENDIF
+
+iobyte  EQU     03H     ;Location of I/O byte
+
+if sanyo
+baudrt EQU     0DAH    ;BAUD RATE MEMORY LOCATION
+MNPORT EQU     0DCH    ;COMMUNICATIONS PORT
+MNPRTS EQU     0DDH    ;COMMUNICATIONS PORT STATUS
+OUTPUT EQU     01H     ;OUTPUT READY BIT
+INPUT  EQU     02H     ;INPUT READY BIT
+ENDIF;SANYO
+
+defesc EQU     '\'-100O        ;The default escape character.
+
+; Select initial setting for VT-52 emulation flag.
+vtval   EQU    1
+
+
+sysxin:        ;system initialisation not covered by sysinit
+        ret                     ; return from system-dependent routine
+
+;\f
+
+;
+;       system-dependent termination processing
+;       If we've changed anything, this is our last chance to put it back.
+sysexit:
+        ret
+
+;
+;       system-dependent processing for start of CONNECT command
+;
+syscon:
+        ret
+
+;\f
+
+;
+;       syscls - system-dependent close routine
+;       called when exiting transparent session.
+;
+syscls:
+        ret
+;\f
+
+;
+;       sysinh - help for system-dependent special functions.
+;       called in response to <escape>?, after listing all the
+;       system-independent escape sequences.
+;
+sysinh:        
+       lxi     d,inhlps        ; we got options...
+       call    prtstr          ; print them.
+        ret
+inhlps:
+        db      '$'                     ;[hh] table terminator
+
+;
+;       sysint - system dependent special functions
+;       called when transparent escape character has been typed;
+;       the second character of the sequence is in A (and in B).
+;       returns:
+;       non-skip: sequence has been processed
+;       skip:   sequence was not recognized
+sysint:
+       ani     137O            ; convert lower case to upper, for testing...
+        ret
+
+;      sysflt - system-dependent filter.
+;      called with the character in E.
+;       preserves bc, de, hl.
+;       note: <xon>,<xoff>,<del>, and <nul> are always discarded.
+sysflt:
+        mov     a,e             ; get character for testing
+        ret
+
+;       mdmflt - modem filter [30]
+;       called with character to be sent to printer in E
+;       with parity set as appropriate.
+;       return with accumulator = 0 do do nothing,
+;                               <> 0 to send char in E.
+mdmflt:
+        mov     a,e             ;[30] get character to test
+        ret
+
+
+;       prtflt - printer filter [30]
+;       called with character to be sent to printer in E
+;       returns with a = 0 to do nothing
+;                    a <> 0 to print it.
+;
+;       this routine for those printer that automatically insert
+;       a lf on cr, or cr for lf.  Should this be shifted to 
+;       the system indep. stuff, in say 4.06?
+prtflt:
+        mov     a,e             ; [30] get character to test
+        ret
+
+
+;\f
+
+;
+; system-dependent processing for BYE command.
+;  for apmmdm, heath, and lobo, hang up the phone.
+sysbye:
+        ret
+;\f
+
+;       This is the system-dependent command to change the baud rate.
+;       DE contains the two-byte value from the baud rate table; this
+;       value is also stored in 'speed'.
+sysspd:
+        ret
+
+;\f
+
+;       Speed tables
+; (Note that speed tables MUST be in alphabetical order for later
+; lookup procedures, and must begin with a value showing the total
+; number of entries.  The speed help tables are just for us poor
+; humans.
+
+;       db      string length,string,divisor (2 identical bytes or 1 word)
+; [Toad Hall]
+
+IF sanyo       
+spdtbl EQU     0       ; No speed table for the Sanyo
+sphtbl EQU     0       ; ditto help for speed.
+
+; The following conditionals were once a huge if not statement.  There
+; wasn't enough room to add the lobo to the list, so it had to be broken
+; into 2, which you can't do with an if not.  I redid it as two ifs and
+; applied them to those that wouldn't set baud. [Hal Hostetler]
+;\f
+
+;       This is the system-dependent SET PORT command.
+;       HL contains the argument from the command table.
+sysprt:
+        ret
+;\f
+
+;
+;      Port table not applicable tot he Sanyo...
+prttbl   EQU     0
+prhtbl   EQU     0               ;
+
+;\f
+
+;
+;       selmdm - select modem port
+;       selcon - select console port
+;       selmdm is called before using inpmdm or outmdm;
+;       selcon is called before using inpcon or outcon.
+;       For iobyt systems, diddle the I/O byte to select console or comm port;
+;       For Decision I, switches Multi I/O board to console or modem serial
+;       port.  [Toad Hall]
+;       For the rest, does nothing.
+;       preserves bc, de, hl.
+selmdm:
+        ret
+
+selcon:
+        ret
+;\f
+
+;       Get character from console, or return zero.
+;       result is returned in A.  destroys bc, de, hl.
+;
+inpcon:
+        mvi     c,dconio        ;Direct console I/O BDOS call.
+        mvi     e,0FFH          ;Input.
+        call    BDOS
+        ret
+;\f
+
+;
+;       Output character in E to the console.
+;       destroys bc, de, hl
+;
+outcon:
+        mvi     c,dconio        ;Console output bdos call.
+        call    bdos            ;Output the char to the console.
+        ret
+;\f
+
+;
+;       outmdm - output a char from E to the modem.
+;               the parity bit has been set as necessary.
+;       returns nonskip; bc, de, hl preserved.
+outmdm:
+IF inout
+        in      mnprts          ;Get the output done flag.
+        ani     output          ;Is it set?
+        jz      outmdm          ;If not, loop until it is.
+        mov     a,e
+        out     mnport          ;Output it.
+        ret
+ENDIF;inout
+
+;\f
+
+;
+;       get character from modem; return zero if none available.
+;       for IOBYT systems, the modem port has already been selected.
+;       destroys bc, de, hl.
+inpmdm:
+IF inout
+;Note: modem port should already be selected for mdI.  [Toad Hall]
+        in      mnprts          ;Get the port status into A.
+        ani     input           ;See if the input ready bit is on.
+        rz                      ;If not then return.
+        in      mnport          ;If so, get the char.
+ENDIF;inout
+       ret                     ; return with character in A
+
+
+;
+;       flsmdm - flush comm line.
+;       Modem is selected.
+;       Currently, just gets characters until none are available.
+
+flsmdm: call    inpmdm          ; Try to get a character
+        ora     a               ; Got one?
+        jnz     flsmdm          ; If so, try for another
+        ret                     ; Receiver is drained.  Return.
+
+
+;\f
+
+;
+;       lptstat - get the printer status. Return a=0 if ok, or 0ffh if not.
+lptstat:
+        xra     a               ; assume it is ok.. this may not be necessary
+        ret
+;\f
+
+;
+;       outlpt - output character in E to printer
+;       console is selected.
+;       preserves de.
+outlpt:
+        push    d               ; save DE in either case
+        call    prtflt          ; go through printer filter [30]
+        ana     a               ; if A = 0 do nothing,
+        jz      outlp1          ; [30] if a=0 do nothing
+        mvi     c,lstout
+        call    bdos            ;Char to printer
+outlp1: pop     d               ; restore saved register pair
+        ret
+;\f
+
+;
+;       Screen manipulation routines
+;       csrpos - move to row B, column C
+;
+;       csrpos for terminals that use a leadin sequence followed
+;        by (row + 31.) and (column + 31.)
+;
+csrpos: push    b               ; save coordinates
+        lxi     d,curldn        ; get cursor leadin sequence
+        call    prtstr          ; print it
+        pop     h               ; restore coordinates
+        mov     a,h             ; get row
+        adi     (' '-1)         ; space is row one
+        mov     e,a
+        push    h
+        call    outcon          ; output row
+        pop     h
+        mov     a,l             ; get column
+        adi     (' '-1)         ; space is column one
+        mov     e,a
+        jmp     outcon          ; output it and return
+ENDIF;NOT (robin OR dmII OR osi OR vector OR termin)
+
+       ret             ; Can the Sany do cursor opsitioning??
+
+;
+;
+; delchr - make delete look like a backspace.  Unless delete is a printing
+;       character, we just need to print a backspace. (we'll output clrspc
+;       afterwards)
+;       For Kaypro and Vector General, delete puts a blotch on the screen.
+;       For Apple and Osborne 1, delete moves but doesn't print.
+delchr:
+       mvi     e,bs
+       call    outcon
+
+; erase the character at the current cursor position
+clrspc: mvi     e,' '
+        call    outcon
+        mvi     e,bs            ;get a backspace
+        jmp     outcon
+
+; erase the current line
+clrlin: lxi     d,eralin
+        jmp     prtstr
+
+; erase the whole screen, and go home. preserves b (but not c)
+clrtop: lxi     d,erascr
+        jmp     prtstr
+
+
+
+IF SANYO
+outlin:        DB      ESC,'E',ESC,'H',CR,LF,TAB       ;WHATEVER
+sysver:        DB      'KERMIT-80 V3.9 [SANYO MBC-1100]',CR,LF,'$' ;VERSION HEADING
+DELSTR:        DB      ESC,'K','$'                     ;WHATS A STRING?
+eralin:        DB      ESC,'P','$'                     ;CLEAR SPACE
+;CLRLIN:       DB      ESC,'K','$'                     ;CLEAR LINE
+erascr:        DB      ESC,'E',ESC,'H','$'             ;CLEAR SCREEN AND CURSOR HOME
+curldn:        db      esc,'=','$',0                   ;cursor lead in
+;SCRNP:                DB      ESC,'=',24H,25H,'$'             ;SPOT FOR SCREEN PACKETS
+;SCRNRT:       DB      ESC,'=',25H,25H,'$'             ;SPOT FOR # OF RETRIES
+;SCRFLN:       DB      ESC,'=',26H,25H,'$'             ;SPOT FOR FILE NAME
+;SCRST:                DB      ESC,'=',28H,25H,'$'             ;SPOT FOR STATUS
+;SCREND:       DB      ESC,'=',2AH,25H,'$'             ;SPOT FOR PROMPT
+;SCRERR:       DB      ESC,'=',2DH,25H,'$'             ;SPOT FOR ERRORS
+ttab:                                          ;NO TRANSLATION TABLE
+ta:    DB      ESC,'A',0,0                     ;CURSOR UP
+tb:    DB      ESC,'B',0,0                     ;CURSOR DOWN
+tc:    DB      ESC,'D',0,0                     ;CURSOR RIGHT
+td:    DB      ESC,'C',0,0                     ;CURSOR LEFT
+te:    DB      ESC,'E',0,0                     ;CLEAR SCREEN
+tf:    DB      0,0,0,0                         ;WHAT???
+tg:    DB      0,0,0,0                         ;WHAT???
+th:    DB      ESC,'H',0,0                     ;CURSOR HOME
+ti:    DB      ESC,'A',ESC,'C',0,0             ;REVERSE LINEFEED??
+tj:    DB      ESC,'J',0,0                     ;CLEAR TO END OF SCREEN
+tk:    DB      ESC,'K',0,0                     ;CLEAR TO END OF LINE
+ENDIF;SANYO
+
+ovlend equ     $       ; End of overlay
+
+       END
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+
diff --git a/cpxsys.asm b/cpxsys.asm
new file mode 100644 (file)
index 0000000..0b179b9
--- /dev/null
@@ -0,0 +1,1386 @@
+IF NOT lasm
+.printx * CPXSYS.ASM *
+ENDIF  ;NOT lasm
+;      KERMIT - (Celtic for "FREE")
+;
+;      This is the CP/M-80 implementation of the Columbia University
+;      KERMIT file transfer protocol.
+;
+;      Version 4.0
+;
+;      Copyright June 1981,1982,1983,1984,1985
+;      Columbia University
+;
+; Originally written by Bill Catchings of the Columbia University Center for
+; Computing Activities, 612 W. 115th St., New York, NY 10025.
+;
+; Contributions by Frank da Cruz, Daphne Tzoar, Bernie Eiben,
+; Bruce Tanner, Nick Bush, Greg Small, Kimmo Laaksonen, Jeff Damens, and many
+; others.
+;
+;      This file contains the system-dependent code and data for KERMIT.
+;      It will be probably be broken into independent files to generate
+;      overlays for the various systems, one or more overlay possible
+;      from each file.  For now, we will leave it in one piece.
+;
+; revision history:
+;
+;
+; Edit 40, 28-Aug-89 by Mike Freeman of Bonneville Power Administration,
+;      P.O. Box 491, Vancouver WA 98666 USA, Telephone (206)690-2307:
+;      Home address:  301 N.E. 107th Street; Vancouver, WA 98685 USA
+;      Home telephone:  (206)574-8221
+;      added support for Hewlett-Packard HP-125 Business Assistant computer
+;      running a HP-modified CP/M Version 2.2; communications on
+;      DAta Comm 1 or Data Comm 2 (8th-bit quoting must be used on
+;      Data Comm 2 to transfer binary files as Data Comm 2 only supports
+;      a 7-bit data path); printer cannot be used with communications on
+;      Data Comm 2 (the printer port).
+; edit 39, 4 August, 1987b by OBSchou for Charles Lasner re. DECMATE II
+;      fixes to set xon/off control off for the duration of Kermit-80.
+;
+;      His header reads:
+;
+;      IBM mode restore program
+;
+;      This routine must be run after using CP4DMF (and KERMIT-80) to restore
+;      the normal handling of XON/XOFF; the user may also elect to cold-boot
+;      the DECMATE instead.
+;
+;      acknowledgments and limitations.
+;
+;      This program is based on DECMATE specific implementation details
+;      provided by Walt Lamia of DEC. It is of course, specific to DECMATE
+;      implementations of CP/M-80 for DECMATE II, III, III-plus, etc.
+;
+;      usage consists of merely:
+;
+;      CP4DMF                  run xon/xoff disable program
+;      KERMIT80                then run kermit
+;      <KERMIT-80 commands used normally here, including SET IBM ON>
+;      CP4DMU                  run this program to restore normal XON
+;
+;      unless CP4DMU is run following KERMIT-80, the normal handling of
+;      XON/XOFF provided by KERMIT-80 will not work (cold boot is another
+;      alternative).
+;
+;      [Note - These edits now included in the init/de-init code]
+;
+; edit 38, 23 July, 1987 by OBSchou.  Moved out commonly used code 
+;      to CPXCOM.ASM, and adjusted this (ond other family) files accordingly.
+;      Also filtered out code now in other family files.
+;
+; edit 37 , 15 July 1987 by OBSchou for David Moore, who has submitted 
+;      code for Teletek SYSTEMASTER (teletek) and for an ADM 22 terminal.
+;
+; edit 36 28 Jan 87 by OBSchou.
+;      Removed the printx etc and should only have this file if a system
+;      does not have a family file.
+;
+; edit 35 1st Dec 1986 by OBSchou.  Added test for Amstrad PCW range (PCW)
+;      Links to CPXPCW.ASM, which was submitted by Ian Young, Lattice 
+;      Logic Systems.
+;
+; edit 34 20 August by OBSchou for Brian Robertson, Aberdeen University:
+;      I have discovered a bug in my code for the BBC/Z80 version of Kermit.  
+;      At startup the transmitter baud rate is read from the serial ULA.  
+;      The TX and RX baud rates are then reset to this value and the 
+;      value is stored in location 'baud:' for the STATUS (or SHOW) 
+;      command.  That is how it is supposed to work !  Unfortunately 
+;      my code at present "misreads" the initial TX baud rate  - there 
+;      is some bit manipulation that needs to be done to extract the 
+;      correct value.
+;
+; edit 33 30-May-86 OBSchou.  Added two new enties to the overly.  One for 
+;      printer status and the other for the address of the family of 
+;      computer using the overlay.  If it is still in CPXSYS.ASM then it 
+;      is a dollar only.
+;
+;edit 32, 27 May, 1986 by OBSchou Loughborough University for
+;      B Robertson, Aberdeen Univ. Computing Centre. Any mistakes my fault.
+;      Add support for APPLE II with serial cards based on the 6850 ACIA.
+;      Mod 380Z support to allow both MDS (5 1/4" discs) and FDS (8" discs)
+;      configurations.
+;
+; edit 31, 22 April, 1986, OBSchou.  
+;      Kermit version 4.06 starts here. All previous edits have been 
+;      put aside (leave in a BWR file?).  Hived off some definitions 
+;      to the CPSDEF.ASM file as that is where they belong.  
+;      Start on splitting off individual 
+;      systems from this huge file.  It is done using the LINK facility 
+;      LASM.  We link to a collection of systems under CPXxxx.ASM.
+;      I have started with the systems I know, the Torch, Cifer and 
+;      pci2651.  These will all be held under CPXTOR.ASM
+;
+;
+; Keep module name, edit number, and last revision date in memory.
+family:        db      'CPXSYS.ASM (40)  28-Aug-89 $'  ; now a family...
+;
+
+
+; Processor speed in units of 100KHz
+; for cpt85xx, advance, apple,bbc,px8 & rm380z timing loop [12]
+IF rm380z 
+cpuspd SET     40              ; 4.0 MHz CPU
+ENDIF; rm380z 
+
+IF disc        OR mmate OR s1008 OR access 
+cpuspd SET     40              ; 4.0 MHz CPU
+ENDIF  ;disc OR mmate OR s1008 OR access 
+
+IF bbc ;[9]
+cpuspd SET     60              ; BBC with 6Mhz Z80
+ENDIF;bbc
+
+
+; the basics...
+
+IF gener
+batio  EQU     056H    ;I/O byte CON=BAT,LIST=CRT,READER=RDR,PUNCH=PTP
+defio  EQU     095H    ;I/O byte CON=CRT,LIST=LPT,READER=RDR,PUNCH=PTP
+crtio  equ     01010101B       ; use CRT: device
+ptrio  equ     01010110B       ; use PTR: device
+ttyio  equ     00000000B       ; use TTY: device
+uc1io  equ     01010111B       ; use UC1: device
+ur1io  equ     01101010B       ; use UR1: device
+ur2io  equ     01111110B       ; use UR2: device
+ENDIF;gener
+
+IF robin
+batio  EQU     056H    ;I/O byte CON=BAT,LIST=CRT,READER=RDR,PUNCH=PTP
+defio  EQU     095H    ;I/O byte CON=CRT,LIST=LPT,READER=RDR,PUNCH=PTP
+lptio  EQU     054H    ;I/O byte CON=TTY,LIST=CRT,READER=PTR,PUNCH=PTP
+gppio  EQU     057H    ;I/O byte CON=UC1,LIST=CRT,READER=RDR,PUNCH=PTP
+ENDIF;robin
+
+
+IF dmII        OR bbc  ;[22]
+batio  EQU     042H    ;I/O byte CON=BAT,LIST=CRT,READER=RDR
+defio  EQU     081H    ;I/O byte CON=CRT,LIST=LPT,READER=RDR
+ENDIF;dmII
+
+IF mikko
+batio  EQU     10110010B ; I/O byte console => serial line
+defio  EQU     10000001B ; I/O byte console => CRT and Keyboard
+ENDIF;mikko
+;\f
+IF lobo        ;[hh]
+mnport EQU     0F7E4H  ;Modem data port A
+mnprts EQU     0F7E5H  ;Modem status/conrtol port A
+baudrt EQU     0F7D0H  ;Baud rate port A
+output EQU     04H     ;Transmit buffer empty
+input  EQU     01H     ;Receive data available
+z80    SET     TRUE    ;a good z80, here
+ENDIF;lobo
+
+IF osi
+mnport EQU     0CF01H  ;Modem data port
+mnprts EQU     0CF00H  ;Modem status port
+output EQU     02H     ;Transmitter empty
+input  EQU     01H     ;Input data available
+z80    SET     FALSE   ;I don't know...
+ENDIF;osi
+
+IF vector
+mnport EQU     04H     ;Modem data port
+mnprts EQU     05H     ;Modem status port
+output EQU     01H     ;Transmitter empty
+input  EQU     02H     ;Input data available
+z80    SET     FALSE   ;I don't know...
+ENDIF;vector
+
+IF delphi              ;[7]
+mnport EQU     22H     ;[7] Modem data port
+mnprts EQU     23H     ;[7] Modem status port
+output EQU     01H     ;[7] Transmitter empty
+input  EQU     02H     ;[7] Input data available
+baudrt equ     29h     ;[7] Baud rate port for channel 2 (default)
+z80    SET     true    ;[7] We're using the z80 side of the dual processor
+ENDIF;[7] delphi
+
+IF trs80
+;NEEDS display definition (e.g. trs80lb or trs80pt)
+mnport EQU     0F4H    ;Modem data port (0F5H for port B)
+mnprts EQU     0F6H    ;Modem status port (0F7H for port B)
+output EQU     04H     ;Transmitter empty
+input  EQU     01H     ;Input data available
+z80    SET     TRUE    ;[hh] All TRS-80's but the CoCo
+ENDIF;trs80
+
+IF teletek
+mnport EQU     00H     ;Modem data port (02 for port B (console))
+mnprts EQU     01H     ;Modem status port (03 for port B (console))
+baudrt EQU     08H     ;ctc0 control port (09 for port B (console))
+output EQU     04H     ;Transmitter empty
+input  EQU     01H     ;Input data available
+z80    SET     TRUE    ;All Teleteks
+ENDIF;teletek
+
+IF osbrn1
+;Osborne 1 uses 6850 ACIA, but memory mapped.  Derived from Apple.
+BAUDRT EQU     0EFC1H  ;Memory location where baud rates are stored.
+OSTOP  EQU     4000H   ;Where we move OSMOVE to at startup
+OSPORT EQU     2A01H   ;Communications Port.
+OSPRTS EQU     2A00H   ;Communications Port Status.
+OUTPUT EQU     02H     ;Output Buffer Empty.
+INPUT  EQU     01H     ;Input Register Full.
+OSBIN1 EQU     57H     ;First Init Character for 6850 ACIA (Reset)
+;(I would have thought 03, but prom code writes 57 there)
+OSBI12 EQU     55H     ;Second Init Character for ACIA (8-bits, 1200)
+OSBI03 EQU     56H     ;Second init char. for ACIA (8 bits, 300)
+;(don't ask.. I don't know why SETUP writes 55 and 56 either)
+z80    SET     TRUE    ;[hh] a z80 here, also
+ENDIF;osbrn1
+
+IF robin
+;Those definitions below that are commented out are just for information
+;***** NOT generally found in distributed documentation ****
+
+;pbausl EQU    90H     ;The Baud-Rate register.
+prntst EQU     49H     ;Printer
+;prndat EQU    48H
+contst EQU     41H     ;Console
+;condat EQU    40H
+gentst EQU     51H     ;General port.
+;gendat EQU    50H
+comtst EQU     59H     ;COMM-Port
+;comdat EQU    58H
+;output EQU    01H     ;Output ready bit.
+;input EQU     02H     ;Input ready bit.
+z80    SET     TRUE    ; This one's a Z80.
+ENDIF;robin
+
+IF s1008       ;[29]
+mnport equ     00              ;printer port data
+mnprts equ     01              ;printer port status
+output equ     4               ;transmitter ready
+input  equ     2               ;receiver ready
+z80    equ     FALSE           ;not important
+ENDIF;s1008 [29]
+
+IF mmate       ;[29]
+mnport EQU     89H             ;MODEM data port
+mnprts EQU     8BH             ;MODEM status/control port
+output EQU     04H             ;Transmit buffer empty, ready to send
+input  EQU     01H             ;Receive data available
+baudrt EQU     93H             ;MODEM baud rate port
+                       ;NOTE - also used for console
+z80    SET     TRUE
+ENDIF;mmate [29]
+
+IF disc        ;[29]
+mnport EQU     05              ;Discovery 83U port B data
+mnprts EQU     04              ;Discovery 83U port B status/command
+output EQU     04              ;Transmit buffer empty
+input  EQU     01              ;Receiver ready
+z80    SET     TRUE
+ENDIF;disc [29]
+
+IF cmemco              ;[25]
+tuart  EQU     020H    ;TU-ART address
+mnport EQU     tuart+1 ;Modem data port
+mnprts EQU     tuart   ;Modem status port
+output EQU     080H    ;Transmitter empty
+input  EQU     040H    ;Input data available
+baudrt EQU     tuart   ;Baud rate port
+;Note: Needs terminal definition 
+z80    SET     TRUE    ;This one's a Z80.
+ENDIF;cmemco
+
+IF cpt85xx
+baudrt EQU     4Ch             ; Baud rate generater (National MM5307)
+mnport EQU     4Bh             ; Comm port data register (Intel 8251)
+mnprts EQU     4Ah             ; Comm port command/status register
+output EQU     01h             ; Transmitter buffer empty flag
+input  EQU     02h             ; Reciver buffer full flag
+TxEmpty        EQU     04h             ; Transmitter empty flag
+z80    SET     FALSE           ; It's really an 8080 [or 8085 ... same thing]
+ENDIF;cpt85xx
+
+IF mmdI        ;Morrow MicroDecision - the single-board one
+mnport EQU     0FEH    ;Morrow Printer UART data port
+mnprts EQU     0FFH    ;Morrow Printer UART command/status
+output EQU     01H     ;Output ready bit.
+input  EQU     02H     ;Input  ready bit.
+;Note: Needs terminal definition 
+z80    SET     FALSE   ;I don't know...
+ENDIF;mmdI
+
+IF bbc         ;[22]
+osbyte EQU     0FFF4H  ; OS entry point
+osword EQU     0FFF1H  ; "    "     "
+term   EQU     0FFC8H  ;Terminal mode OS entry
+z80    SET     TRUE
+ENDIF;[22] bbc
+
+;Two types of 380Z system
+IF rm380zm             ;[27] MDS - 5 1/4" discs
+mnport EQU     0C8H    ;Modem data port
+mnprts EQU     0C9H    ;Modem status port
+ENDIF;[32] rm380zm
+
+IF rm380zf     ;[32] FDS - 8" discs
+mnport EQU     0E8H    ;Modem data port
+mnprts EQU     0E9H    ;Modem status port
+ENDIF;[32] rm380zf
+
+IF rm380z      ;[32] Common to both systems
+output EQU     01H     ;Transmitter buffer empty
+input  EQU     02H     ;Input data available
+TxEmpty        EQU     04h     ;Transmitter empty flag
+z80    SET     TRUE
+ENDIF;[22] rm380z
+
+IF px8 ; [29]
+z80    SET     TRUE
+mnprts EQU     0dh     ; used in sending a break
+ENDIF  ;px8 [29]
+
+IF mdI ;Morrow Decision I - the big sucker
+mnport equ     48H             ; Modem data port.
+mnprts equ     4DH             ; Modem status port.
+output equ     20H             ; Transmitter empty.
+input  equ     1               ; Input data available.
+mbase  equ     48H             ; Base address of Multi I/O port
+                               ;   selector area.
+grpsel equ     4FH             ; Group select port.
+rbr    equ     48H             ; Read Data Buffer.
+group  equ     1               ; Multi I/O Group byte for serial ports.
+congrp equ     1               ; Serial Port 1 for console
+mdmgrp equ     3               ; Serial Port 3 for modem.
+
+; Following are needed for baud rate changes...[Toad Hall]
+
+dlm    equ     49H             ; Baud Rate Divisor (Most Sig Bit)
+dll    equ     48H             ; Baud Rate Divisor (Least Sig Bit)
+ier    equ     49H             ; Interrupt Enable Register
+lcr    equ     4BH             ; Line Control Register
+lsr    equ     4DH             ; Line Status Register
+msr    equ     4EH             ; Modem Status Register
+dlab   equ     80H             ; Divisor Latch Access Bit
+wls0   equ     1               ; Word Length Select Bit 0
+wls1   equ     2               ; Word Length Select Bit 1 for 8 bit word
+stb    equ     4               ; Stop bit count - 2 stop bits
+imask  equ     0               ; Interrupt mask (all disabled)
+z80    SET     TRUE            ; This one's a Z80.
+ENDIF  ;mdI   NOTE: needs terminal definition. [Toad Hall]
+
+IF mikko
+sioac  EQU     0FF12H          ;SIO channel A register(s) address
+sioo3  EQU     01000001B       ;SIO Write Reg. 3 original setup (?)
+                               ;RX 7 bits,synch mode bits 0,RX enable
+sion3  EQU     11001111B       ;SIO Write Reg. 3 KERMIT setup
+                               ;RX 8 bits,synch mode bits 0,RX enable
+sioo4  EQU     01001111B       ;SIO Write Reg. 4 original setup (?)
+                               ;X16 clock,8 bit synch(ignored),
+                               ;2stop bits,par even(on)
+sion4  EQU     01000100B       ;SIO Write Reg. 4 KERMIT setup
+                               ;X16 clock,8 bit synch(ignored),
+                               ;1stop bit,par off
+sioo5  EQU     10101010B       ;SIO Write Reg. 5 original setup (?)
+                               ;DTR,TX 7 bits,TX enable,RTS
+sion5  EQU     11101010B       ;SIO Write Reg. 5 KERMIT setup
+                               ;DTR,TX 8 bits,TX enable,RTS
+txclk  EQU     0FF30H  ;Baud rate generator (CTC) for transmitter
+rxclk  EQU     0FF31H  ;Baud rate generator (CTC) for receiver
+chmask EQU     0F1F2H  ;Mask byte address for SIO ch. A reception
+z80    SET     TRUE    ;It's got a SIO and a CTC, it must be a Z80
+ENDIF;mikko
+
+
+IF access      ;[29]
+mnport EQU     40H     ;Modem data port A
+mnprts EQU     42H     ;Modem status/conrtol port A
+output EQU     04H     ;Transmit buffer empty
+input  EQU     01H     ;Receive data available
+z80    SET     TRUE    ;a good z80, here
+ENDIF;access [29]
+
+
+IF robin OR dmII
+z80    SET     TRUE    ; This one's a Z80
+ENDIF;robin OR dmII
+
+IF hp125                       ;[MF]
+z80    SET     TRUE            ;HP-125 uses a Z80
+ENDIF;hp125 [MF]
+
+IF gener OR cpm3       ; To be truly generic, we must assume 8080.
+z80    SET     FALSE
+ENDIF;gener OR cpm3
+;\f
+IF osi
+defesc EQU     ']'-100O        ;The default escape character.
+ENDIF; osi 
+
+IF vector
+defesc EQU     '~'             ;Vector can't type ']'.
+ENDIF;vector
+
+IF mikko OR osbrn1 OR lobo
+defesc EQU     '\'-100O        ;The default is Control \ -- it's easier B.E.
+ENDIF;mikko OR osbrn1 OR lobo
+
+IF cpt85xx
+defesc EQU     '\'-100O        ;Still Control-\ (just ran out of room...)
+ENDIF;cpt85xx
+
+IF bbc OR rm380z OR px8 OR access OR S1008     ;[22] [29]
+defesc EQU     '\'-100O        ;Still Control-\ (just ran out of room...)
+ENDIF  ;bbc OR rm380z OR px8 OR access OR s1008[29]
+
+IF trs80
+defesc EQU     '_'-100O        ;CTRL-_ (Down-arrow on TRS-80 keyboard)
+ENDIF;trs80
+
+; Select initial setting for VT-52 emulation flag.
+
+IF vt52 ; If console looks like (or is) VT52
+vtval  EQU     0               ;  we don't need VT52 emulation
+ENDIF;vt52
+
+; If none of the above, default to VT52-EMULATION ON.
+IF NOT (crt OR vt52 OR robin OR dmII OR vt100 OR hp125);[MF]
+vtval  EQU     1
+ENDIF;NOT (crt OR vt52 OR robin OR dmII OR vt100 OR hp125)[MF]
+
+
+;      sysxin  - system dependent initialisation code, called from SYSINIT
+;
+sysxin:
+
+IF dmII
+; edit added by OBSchou for C. Lasner. If this dont work, tell me whats
+;      wrong, as I have no DMII or IBM to play with
+;
+;      IBM mode fixup program
+;
+;      This routine must be run before attempting to use KERMIT-80 with half
+;      duplex KERMIT implementations such as CMS-KERMIT, as the 6120 processor
+;      will otherwise "swallow" the XON character.
+;
+;      acknowledgments and limitations.
+;
+;      This program is based on DECMATE specific implementation details
+;      provided by Walt Lamia of DEC. It is of course, specific to DECMATE
+;      implementations of CP/M-80 for DECMATE II, III, III-plus, etc.
+;
+;      usage consists of merely:
+;
+;      CP4DMF                  run this program
+;      KERMIT80                then run kermit
+;      <KERMIT-80 commands used normally here, including SET IBM ON>
+;      CP4DMU                  run companion program to restore normal XON
+;
+;      unless CP4DMU is run following KERMIT-80, the normal handling of
+;      XON/XOFF provided by KERMIT-80 will not work (cold boot is another
+;      alternative).
+;
+;      CP4DMF.ASM
+;
+;      last edit:      12-jun-87       20:00:00        Charles J. Lasner (CJL)
+
+;oboff equ     3fh             ; offset of outbyt routine for 6120
+;prtctl        equ     02h             ; port control
+nocoxon        equ     001h            ; turn off comm. output XON
+
+       lxi     b,(nocoxon * 100h) + prtctl ; c/prtctl, b/no out. xon
+       call    outbyt
+       ret                     ; and return
+
+;outbyt has been catered for (in break routine)
+ENDIF  ;dmII
+
+IF osbrn1      ;(Note now no longer needs code > 4000h as it is already there
+;      lxi     d,ostop         ;where we're moving it to
+;      lxi     h,osmove        ;what we're moving
+;      mvi     b,osmct         ;How many bytes we're moving
+;      call    mover
+       lda     baudrt          ; Find out what speed is current
+       ani     1
+       mvi     a,osbi03        ; assume 300 baud
+       jz      osstr1
+       mvi     a,osbi12        ; nope, it's 1200.
+osstr1:        sta     speed           ; save initial speed
+       sta     speed+1         ;  as 16 bits, to match speed table entries
+       mov     d,a
+       mov     e,a             ; get initial speed in DE
+       call    sysspd          ;set up parity etc.
+ENDIF;osbrn1
+
+IF cpt85xx
+       mvi     a,80h           ; Send UART reset [force idle] by setting
+       out     baudrt          ;    bit 7 of baud rate I/O port
+       lxi     H,0f0fh         ; Clear reset and default to 9600 baud [23]
+       shld    speed           ; store current speed
+       xchg
+       call    sysspd          ; set default baud rate
+       mvi     a,4Eh           ; Set UART mode to async 16x clock, 8 data
+       out     mnprts          ;    bits, no parity, and 1 stop bit
+       mvi     a,37h           ; Set command to Tx enable, DTR on, Rx enable,
+       out     mnprts          ;    break off, error reset, and RTS on
+ENDIF  ; cpt85x
+
+IF bbc         ;[22]
+       lxi     d,modstr        ; Set MODE 3
+       call    prtstr
+       mvi     a,1             ; Set terminal mode on
+       call    term
+       mvi     a,0F2H          ; Read current transmit speed
+       lxi     h,0FF00H        ; .. 3 lsb of ULA register
+       call    osbyte          ;   FX242,0,255
+       mov     a,l
+       ani     7               ; Mask of 3 lsb
+;
+; Edit of July 22, 1986 by B Robertson, Aberdeen Univ. Computing Centre.
+; Correct bug in sysinit for BBC  -  reads the initial baud rate at
+; start up incorrectly.
+;
+;
+       rar                     ; Reverse order of 3 lsb
+       rar                     ; Bit2 now in bit0
+       jnc     binit1          ;
+       ori     2               ; Restore bit1
+binit1:        ana     a               ; Set sign bit as appropriate
+       jp      binit2          ;
+       ori     4               ; Bit0 now in bit2
+binit2:        ani     7               ; Mask off unwanted bits
+; End of Edit
+
+       xri     7               ; Stored as 2's complement
+       inr     a
+       sta     speed           ; Store 16 bit value
+       sta     speed+1
+       mov     e,a             ; Ensure RX and TX speeds are the same
+       call    sysspd
+ENDIF;[22] bbc
+
+IF rm380z      ;[22]
+       mvi     e,11h           ;Output ctrl-Q to clear autopaging
+       call    outcon
+ENDIF;[22] rm380z
+
+
+IF lobo        ;[hh]
+       lxi     d,siotbl        ;[hh] address of status table
+       mvi     c,siolen        ;[hh] length of the table
+siolup:        ;[hh] loop here for each command byte
+       ldax    d               ;[hh] load first byte into A
+       inx     d               ;[hh] index pointer to next bute
+       sta     mnprts          ;[hh] send it to status port A
+       sta     mnprts+2        ;[hh] and to status port B
+       dcr     c               ;[hh] decrement the counter
+       jnz     siolup          ;[hh] loop back for more commands
+       mvi     a,05H           ;[hh] value for 300 baud
+       sta     baudrt          ;[hh] starting default for port A
+       sta     baudrt+4        ;[hh] and for port B
+       sta     speed           ;[hh] tell program they're set
+       mvi     a,0E4H          ;[hh] value for port A
+       sta     port            ;[hh] tell program we've set this, too
+       mvi     a,0D0H          ;[hh] port A baud rate value
+       sta     port+1          ;[hh] save this as well, for consistancy
+ENDIF  ;lobo
+
+IF mikko
+       lxi     d,mintbl        ;Address of KERMIT Reg values (what)
+       mvi     c,minlen        ;Length of table (how many)
+       lxi     h,sioac         ;Send data to ch. A SIO registers (to where)
+       call    movmik
+       mvi     a,0FFH          ;Set ch. A mask to use all bits
+       sta     chmask
+ENDIF;mikko
+
+IF mdI
+       lxi     h,96            ;Default 1200 baud modem port speed
+       shld    speed           ;Store as modem port speed
+       call    sysspd          ;Initialize the port
+ENDIF;mdI  [Toad Hall]
+
+IF cmemco                      ;[25]
+       mvi     a,01h           ; Reset TU-ART
+       out     tuart+2
+       mvi     a,90h           ; Set default baud rate (2400), and 1 stop bit
+       out     tuart
+       sta     speed           ; save for status display
+       sta     speed+1
+ENDIF;cmemco
+
+IF delphi                      ;[7]
+;
+;      shove the default baud rate (1200) in to the Delphi port address
+;      for the baud rate generator on port 2, the default port; save this
+;      value so we can tell what speed is selected.
+;
+       mvi     a,07h           ;[7] get value for 1200 baud
+       out     baudrt          ;[7] set it for port 2
+       sta     speed           ;[7] save for status display
+       sta     speed+1
+ENDIF;[7] delphi
+
+IF px8 ; [29]
+       lda     0f6a9h          ; get baud rate value set by CONFIG
+       sta     px8blk+4        ; put into parameter block
+       mov     h, a            ; initialise global speed indicator
+       mov     l, a
+       shld    speed
+       lhld    6               ; base of CP/M
+; buffer starts at ovlend+8192, immediately after sector buffer
+; We must also allow (800h) for the CCP as Kermit exits with a RET
+       lxi     d, ovlend+8192+800h  ; calc buffer length
+       ora     a               ; clear carry
+       db      0edh, 52h       ; sbc hl, de
+       shld    px8blk+2
+       call    rsopen
+ENDIF ; px8 [29]
+
+IF disc        ;[29]
+;Initialization sequence for Discovery 83U port B
+;Sets port to 9600 baud, 8 data bits, 1 stop bit, no parity
+       mvi     a,12            ;Register 12
+       out     mnprts
+       mvi     a,11            ;Low byte of time constant for 9600
+       out     mnprts
+       mvi     a,13            ;Register 13
+       out     mnprts
+       mvi     a,0             ;High byte of time constant for 9600
+       out     mnprts
+       mvi     a,14            ;Register 14
+       out     mnprts
+       mvi     a,3             ;Enable baud rate generator
+       out     mnprts
+       mvi     a,11            ;Register 11
+       out     mnprts
+       mvi     a,52h           ;No Xtal, tclk=rclk=/trxc out=br gen
+       out     mnprts
+       mvi     a,4             ;Register 4
+       out     mnprts
+       mvi     a,44h           ;16x clock, 1 stop, no parity
+       out     mnprts
+       mvi     a,3             ;Register 3
+       out     mnprts
+       mvi     a,71h           ;rx 8 bit/ch, autoenable, rx enable
+       out     mnprts
+       mvi     a,5             ;Register 5
+       out     mnprts
+       mvi     a,0eah          ;tx 8 bit/ch, tx enable, rts
+       out     mnprts
+ENDIF;disc [29]
+;
+;\f
+IF mikko                       ;currently for MIKROMIKKO only
+; copy command block into memory-mapped SIO.
+movmik:        di                      ;disable interrupts
+movmk1:        ldax    d               ;Get a register value
+       mov     m,a             ;Output it
+       inx     d               ;Next value
+       dcr     c               ;Decrement counter
+       jnz     movmk1          ;Repeat until done
+       ei
+       ret
+ENDIF;mikko
+
+;\f
+IF osbrn1
+osmove:
+osflag equ     0EF08H          ;Osborne 1 Bank-2 flag
+;
+; return modem status in A
+;
+OSLDST:
+       DI
+       OUT     0
+       LDA     osprts          ;Read the status port
+       OUT     1
+       EI
+       ret
+;
+; set modem status from A
+;
+OSSTST:
+       DI
+       OUT     0
+       STA     osprts  ;Write the control port
+       jmp     osstex
+;
+; read character from modem into A
+;
+OSLDDA:
+       DI
+       OUT     0
+       LDA     osport
+       OUT     1
+       EI
+       ret
+;
+;      output character in A to modem
+;
+OSSTDA:
+       DI
+       OUT     0
+       STA     osport
+osstex:
+       OUT     1
+       mvi     a,1
+       sta     osflag
+       EI
+       ret
+ENDIF;osbrn1
+
+IF lobo
+; List of commands to set up SIO channel A for asynchronous operation.
+siotbl:        DB      18H             ; Channel reset
+       DB      18H             ; another, in case register 0 wasn't selected
+       DB      04H             ; Select register 4
+       DB      44H             ; 1 stop bit, clock*16
+       DB      01H             ; Select register 1
+       DB      00H             ; No interrupts enabled
+       DB      03H             ; Select register 3
+       DB      0C1H            ; Rx enable, 8 bit Rx character
+       DB      05H             ; Select register 5
+       DB      0EAH            ; Tx enable, 8 bit Tx character,
+                               ;  raise DTR and RTS
+siolen equ     $-siotbl        ; length of command list
+ENDIF;lobo
+
+IF mikko
+; command list to set SIO chip back to normal state
+miotbl:        db      3               ;reg. 3
+       db      sioo3
+       db      5               ;reg. 5
+       db      sioo5
+       db      4               ;reg. 4
+       db      sioo4
+       db      0               ;reselect reg. 0
+miolen equ     $-miotbl        ;MikroMikko SIO table length (original values)
+
+; command list to set up SIO chip for operation with Kermit
+mintbl:        db      3               ;reg. 3
+       db      sion3
+       db      5               ;reg. 5
+       db      sion5
+       db      4               ;reg. 4
+       db      sion4
+       db      0               ;reselect reg. 0
+minlen equ     $-mintbl        ;MikroMikko SIO table length (KERMIT values)
+ENDIF;mikko
+
+
+IF bbc         ;[22]
+modstr:        db      16h,03h,'$'     ; String to put screen into MODE 3
+ENDIF
+
+IF px8 ; [29]
+rsget: mvi     b, 50h
+       jmp     rsiox
+rsinst:        mvi     b, 30h
+       jmp     rsiox
+rsput: mvi     b, 60h
+       jmp     rsiox
+rsoutst:mvi    b, 40h
+       jmp     rsiox
+rserst:        mvi     b, 90h
+       jmp     rsiox
+rsopen:        lxi     h, px8blk       ; copy px8blk to px8prm
+       lxi     d, px8prm
+       lxi     b, 9
+       call    mover
+       mvi     b, 10h          ; open code
+       jmp     rsiox
+rsclose:mvi    b, 20h          ; close code
+rsiox: lxi     h, px8prm
+       lxi     d, 51h          ; offset into BIOS jump table
+       push    h
+       lhld    1               ; start of BIOS
+       dad     d
+       xthl                    ; entry point on stack, px8prm addr in hl
+       ret                     ; jump indirect
+
+px8prm:        dw      0, 0
+       db      0, 0, 0, 0, 0   ; the param area is overwritten in rsopen
+px8blk:        dw      ovlend+8192     ; buffer address
+       dw      0               ; buffer size - overwritten
+       db      0               ; baud rate - overwritten
+       db      3               ; 8 bits/char
+       db      0               ; no parity, it is done internally
+       db      1               ; 1 stop bit
+       db      0cfh            ; special bits - activate xon/xoff
+; The documentation suggests that the xon/xoff bit is bit 4, i.e the pattern
+; should be 0efh, but the top bit is omitted from the diagram. I will try
+; clearing both bit 4 and bit 5.
+ENDIF ; px8 [29]
+
+IF hp125                       ;[MF]
+       lxi     b,73ffh         ;Prepare Data Comm 1 to
+       call    bdos            ;Transfer eight-bit data
+       lxi     d,jbuf          ;Point to bios jump-table vector
+       lxi     b,7effh         ;Set up special subfunction code to
+       call    bdos            ;Get rdr routine address
+       lhld    jbuf+3          ;Remember this address
+       shld    readin+1        ;for our eight-bit rdr routine
+       mvi     a,1             ;We want to write into the bios jump table
+       sta     jbuf+1          ;...
+       lxi     h,readin        ;Point to our rdr routine (all 8 bits)
+       shld    jbuf+3          ;as new RDR routine
+       lxi     d,jbuf          ;Point to jump vector argument block
+       lxi     b,7effh         ;Set subfunction code to
+       call    bdos            ;Substitute our rdr routine in dispatch table
+       lxi     h,mapon1        ;Make Data Comm 1 the default port
+       shld    port            ;at program-start
+       xchg                    ;Put in DE
+       call    prtstr          ;Print escape sequences to connect
+                               ;DAta Comm 1 to rdr/punch
+ENDIF ;hp125 [MF]
+
+       ret                     ; end of sysxin
+
+;\f
+;      system-dependent termination processing
+;      If we've changed anything, this is our last chance to put it back.
+sysexit:
+
+IF dmII
+; Edited by OBSchou for Charles Lasner.         His bug fix now in Kermit-80:
+;
+;      IBM mode restore program
+;
+;      This routine must be run after using CP4DMF (and KERMIT-80) to restore
+;      the normal handling of XON/XOFF; the user may also elect to cold-boot
+;      the DECMATE instead.
+;
+;      acknowledgments and limitations.
+;
+;      This program is based on DECMATE specific implementation details
+;      provided by Walt Lamia of DEC. It is of course, specific to DECMATE
+;      implementations of CP/M-80 for DECMATE II, III, III-plus, etc.
+;
+;      usage consists of merely:
+;
+;      CP4DMF                  run xon/xoff disable program
+;      KERMIT80                then run kermit
+;      <KERMIT-80 commands used normally here, including SET IBM ON>
+;      CP4DMU                  run this program to restore normal XON
+;
+;      unless CP4DMU is run following KERMIT-80, the normal handling of
+;      XON/XOFF provided by KERMIT-80 will not work (cold boot is another
+;      alternative).
+;
+;      CP4DMF.ASM
+;
+;      last edit:      12-jun-87       20:00:00        Charles J. Lasner (CJL)
+;
+coxon  equ     000h            ; enable comm. output XON
+;oboff equ     3fh             ; offset of outbyt routine for 6120
+;prtctl        equ     02h             ; port control
+
+
+       lxi     b,(coxon * 100h) + prtctl ; c/prtctl, b/with out. xon
+       call    outbyt          ;[OBS] declared elswhere
+       ret                     ; and return
+
+ENDIF  ;dmII
+
+IF mikko
+       lxi     d,miotbl        ;Load the adress of original reg values
+       mvi     c,miolen        ;Length of table
+       lxi     h,sioac         ;Send data to ch A SIO registers
+       call    movmik
+       mvi     a,07FH          ;Set ch A mask to use just 7 bits
+       sta     chmask
+ENDIF;mikko
+
+IF teletek
+;Note - This code was handwritten onto the lising I was sent, with the 
+;      comment that David had just thought of the code, so it was 
+;      not on the listing. If you have problems I suggest you 
+;      comment out these few lines.
+;Bertil Schou.
+;
+       di
+       mvi     a,47h           ; reset baud rate to 9600
+       out     baudrt
+       mvi     a,08h
+       out     baudrt
+       ei
+ENDIF  ;teletek
+
+IF cpt85xx
+       mvi     a,80h           ; Reset (force idle) the 8251 UART via bit 7
+       out     baudrt          ;    of the baud rate generater port
+       mvi     a,00h           ; and turn off the baud rate generater
+       out     baudrt
+ENDIF;cpt85xx
+
+IF bbc ;[22]
+       mvi     a,0             ; Turn off terminal mode
+       call    term
+ENDIF;[22] bbc
+
+IF px8 ;[29]
+       call    rsclose
+ENDIF  ;px8 [29]
+
+IF hp125                       ;[MF]
+       lxi     b,74ffh         ;Set subfunction code to
+       call    bdos            ;Reset Data Comm 1 for 7-bit data
+       lhld    readin+1        ;Get original rdr routine address
+       shld    jbuf+3          ;and store in jump vector
+       lxi     d,jbuf          ;Point to jump vector
+       lxi     b,7effh         ;Set subfunction code to
+       call    bdos            ;Put original rdr routine back in bios
+                               ;dispatch table
+       lxi     d,mapoff        ;Point to escape sequences to
+       call    prtstr          ;Turn off Data Comm 1/2 mappings
+ENDIF ;hp125 [MF]
+
+       ret
+
+;
+;      system-dependent processing for start of CONNECT command
+;
+syscon:
+IF robin OR trs80 OR cpt85xx   ;For Robin/TRS80/CPT-85xx, add some more info
+       lxi     d,conmsg        ; about obscure key combinations
+       call    prtstr
+ENDIF;robin OR trs80 OR cpt85xx
+
+IF osbrn1                      ;*** This is Software dependent ***
+       lhld    1               ;Modify back-arrow code to DELETE
+       mvi     l,0             ;Get BIOS-start address
+       lxi     d,85H           ;Adress for key-code = XX85H
+       dad     d
+       mov     e,m             ;Get it in DE
+       inx     h
+       mov     d,m
+       xchg                    ;Memory pointer to HL
+       mvi     m,del           ;modify the code
+ENDIF;osbrn1
+       ret
+
+conmsg:                ; Messages printed when entering transparent (CONNECT) mode:
+IF robin       ;  for Robin, control-S key is hidden
+       db      ' (Type Left Arrow to send CTRL-S)',cr,lf,'$'
+ENDIF;robin
+IF trs80       ;  for TRS-80, the preferred escape key is hidden
+       db      ' (Control-_ is the Down-Arrow key on the TRS-80 keyboard)'
+       db      cr,lf,'$'
+ENDIF;trs80
+IF cpt85xx     ;  for CPT-85xx, some graphics map "funny" to keyboard in CP/M
+       db      ' (Use  CODE + SHIFT + 1/2  key to generate a Control-\)'
+       db      cr,lf,'$'
+ENDIF;cpt85xx
+;\f
+;      syscls - system-dependent close routine
+;      called when exiting transparent session.
+;
+syscls:
+IF osbrn1
+       lhld    1               ;Modify back-arrow code to BACKSPACE
+       mvi     l,0             ;Get BIOS address
+       lxi     d,85H           ;Address for key-code =XX85H
+       dad     d
+       mov     e,m             ;Get it in DE
+       inx     h
+       mov     d,m
+       xchg                    ;Address to HL
+       mvi     m,bs            ;Modify code
+ENDIF;osbrn1
+       ret
+;\f
+;      sysinh - help for system-dependent special functions.
+;      called in response to <escape>?, after listing all the
+;      system-independent escape sequences.
+;
+sysinh:
+IF robin OR dmII OR cpt85xx OR lobo 
+       lxi     d,inhlps        ; we got options...
+       call    prtstr          ; print them.
+ENDIF;robin OR dmII OR cpt85xx OR lobo 
+
+IF bbc OR rm380z ; some more
+       lxi     d,inhlps        ; we got options...
+       call    prtstr          ; print them.
+ENDIF;[22] bbc OR rm380z 
+
+IF px8 OR access OR mmate OR disc ;and more...
+       lxi     d,inhlps        ; we got options...
+       call    prtstr          ; print them.
+ENDIF  ;px8 OR access OR mmate OR disc 
+
+       ret
+
+
+;additional, system-dependent help for transparent mode
+; (two-character escape sequences)
+inhlps:
+
+IF robin OR dmII OR cpt85xx OR lobo
+       db      cr,lf,'B  Transmit a BREAK'
+ENDIF;robin OR dmII OR cpt85xx OR lobo 
+
+IF bbc OR rm380z 
+       db      cr,lf,'B  Transmit a BREAK'
+ENDIF;bbc OR rm380z 
+
+IF px8 OR access OR mmate 
+       db      cr,lf,'B  Transmit a BREAK'
+ENDIF  ;px8 OR access OR mmate 
+
+IF disc        ;[29] [32]
+       db      cr,lf,'B Transmit a 300ms BREAK'
+       db      cr,lf,'L Transmit a 5 second BREAK'
+ENDIF;disc [29]
+
+IF lobo
+       db      cr,lf,'D  Drop the line'
+ENDIF;lobo
+
+       db      '$'                     ;[hh] table terminator
+
+;
+;      sysint - system dependent special functions
+;      called when transparent escape character has been typed;
+;      the second character of the sequence is in A (and in B).
+;      returns:
+;      non-skip: sequence has been processed
+;      skip:   sequence was not recognized
+
+sysint:        ani     137O            ; convert lower case to upper, for testing...
+
+IF robin OR dmII OR cpt85xx OR lobo 
+       cpi     'B'             ; send break?
+       jz      sendbr          ; yes, go do it.  return nonskip when through.
+ENDIF;robin OR dmII OR cpt85xx OR lobo 
+
+IF bbc OR rm380z ; [22] [25] ... some more
+       cpi     'B'             ; send break?
+       jz      sendbr          ; yes, go do it.  return nonskip when through.
+ENDIF; bbc OR rm380z 
+
+IF px8 OR access OR    mmate ;[28] [29] and anothers
+       cpi     'B'             ; send break?
+       jz      sendbr          ; yes, go do it.  return nonskip when through.
+ENDIF  ; px8 OR access OR mmate [28] [29]
+
+IF lobo        ;[hh]
+       cpi     'D'             ;[hh] disconnect?
+       jz      discon          ;[hh] yes, go do it. nonskip return when done.
+ENDIF  ;lobo
+
+IF disc        ;[29]
+       cpi     'B'             ;Send short break?
+       jz      sendbr
+       cpi     'L'             ;Send long break?
+       jz      sendlbr
+ENDIF;disc [29]
+
+       jmp     rskp            ; take skip return - command not recognized.
+
+
+;\f
+IF robin ;Definitions & code to send a BREAK (ungenerically, no other way).
+
+comctl equ     59h             ;VT180 communications port
+crtctl equ     41h             ;VT180 crt port
+
+;VT180 serial port command bits
+
+txe    equ     1               ;transmit enable
+dtr    equ     2               ;dtr on
+rxe    equ     4               ;rx enable
+sndbrk equ     8
+rerr   equ     10h             ;reset error
+rts    equ     20h             ;RTS on
+reset  equ     40h             ;port reset
+
+;Send a break to the communications port.
+;
+
+sendbr:        lxi     h,38500         ;250 ms(?)
+       lda     prtadr          ;Get address of selected port
+       mov     c,a             ;Into C
+       mvi     a,sndbrk+dtr
+;      OUT     C,A             ;Want to send to port addressed by C
+       db      0EDH,079H       ;Op code for above instruction
+sndbr1:        dcx     h               ;timing loop...
+       mov     a,l
+       ora     h
+       jnz     sndbr1          ;...until over
+       lda     prtadr          ;Get the address for the port
+       mov     c,a             ;Into C
+       mvi     a,txe+dtr+rxe+rerr+rts  ;enable tr/rc, dtr, reset error
+;      out     c,a             ;Z-80 only instruction
+       db      0EDH,079H       ;Op code for above instruction
+       out     contst          ;reset ports
+       ret
+ENDIF;robin
+;\f
+IF dmII                                ;[jd] this added to send break on DECmate
+
+; DECmate command codes for 6120 I/O processor
+oboff  equ     3fh             ; offset of outbyt routine for 6120
+prtctl equ     02h             ; port control
+brdat  equ     06h             ; data to tell 6120 to send a break
+brdur  equ     30              ; duration, 30 = 300 ms.
+
+sendbr:        lxi     b,(brdat * 100h) + prtctl ; c/prtctl, b/brdat
+       call    outbyt
+       lxi     b,brdur*100h            ; b/duration, c/0
+;      fall through into outbyt
+
+outbyt:        lhld    1               ; get warm boot address
+       lxi     d,oboff         ; offset of outbyt routine
+       dad     d               ; compute address
+       pchl                    ; branch there (a callret)
+
+ENDIF;dmII
+;\f
+IF access OR mmate ;[cjc] send break on Kaypro [29]
+; Officially, a "break" is 300 milliseconds of "space" (idle line is
+; "mark").  (or maybe 200 milliseconds; I forget.)  The timing isn't
+; usually that critical, but we'll make an attempt, at least.  Sending
+; too long a break can cause some modems to hang up.
+
+sendbr:
+;      First, make sure the transmitter is really empty.  (The SIO sets
+;      "transmitter buffer empty" when it can accept another character;
+;      the previous character is still being shifted onto the line.
+;      Another status bit, "all done", is set to indicate that the
+;      transmitter is really idle.
+sndbr1:        mvi     a,1             ; select Read Register 1
+       out     mnprts
+       in      mnprts          ; read the contents
+       ani     1               ; test "all done" flag
+       jz      sndbr1          ; loop until it's nonzero.
+;
+;      Next, set the "send break" bit to start the transmitter spacing.
+       mvi     a,5             ; select Write Register 5
+       out     mnprts
+       mvi     a,0FAH          ; Tx enable, 8 bit Tx character, Send Break,
+       out     mnprts          ;  DTR and RTS on.
+;
+;      Now, delay for 30 hundredths of a second
+       mvi     a,30            ; delay count
+       call    delay
+;
+;      Time's up. Put transmitter back in normal state (data byte is the
+;      same as the one in siotbl: for Write Register 5) and return.
+       mvi     a,5             ; select Write Register 5
+       out     mnprts
+       mvi     a,0EAH          ; Tx enable, 8 bit Tx character,
+       out     mnprts          ;  DTR and RTS on.
+       ret                     ; done.
+ENDIF;access OR mmate [29]
+
+IF lobo        ;[hh]   This routine sends a break tone or disconnects a modem
+;              (those that respond to it) by setting the DTR line low
+;              for 300 ms.
+;
+sendbr:        mvi     a,05H           ;[hh] write register 5
+       call    outctl          ;[hh] send it to control port
+       mvi     a,0FAH          ;[hh] value to send break tone
+       jmp     sndbr1          ;[hh]
+;
+discon:        mvi     a,05H           ;[hh] write register 5
+       call    outctl          ;[hh] send it to the control port
+       mvi     a,06AH          ;[hh] DTR off and break tone on
+sndbr1:        call    outctl          ;[hh] send to control port
+       mvi     a,30            ;[hh] delay count for 300 ms.
+       call    delay           ;[hh] wait a while...
+       mvi     a,05H           ;[hh] write register 5
+       call    outctl          ;[hh] get it's attention
+       mvi     a,0EAH          ;[hh] normal 8 bits, DTR on, RTS on, etc.
+       call    outctl          ;[hh] restore SIO
+       ret
+;
+outctl:        sta     mnprts          ;[hh]
+       ret
+ENDIF  ;lobo
+;\f
+IF cpt85xx OR rm380z ;[lmj] [22] [25]
+sendbr:
+;
+;      Ensure that the transmitter has finished sending buffered chars
+sndbr1:        in      mnprts          ; get UART status
+       ani     TxEmpty         ; everything sent?
+       jz      sndbr1          ; no, wait a bit more
+;
+;      Begin sending a break by setting bit in UART command register
+       mvi     a,3Fh           ; Set TxEna, DTR, RxEna, SBreak, ErrRst, RTS
+       out     mnprts
+;
+;      Wait for 250 milliseconds (using hundredths second delay routine)
+       mvi     a,25
+       call    delay
+;
+;      Resume normal operation by clearing the SendBreak command bit
+       mvi     a,37h           ;Set TxEna, DTR, RxEna, ErrRst, RTS
+       out     mnprts
+;
+       ret                     ;done
+ENDIF;cpt85xx OR rm380z 
+
+IF px8 ; [29]
+sendbr:        mvi     a, 3fh  ; set break bit
+       out     mnprts
+       mvi     a, 25
+       call    delay   ; wait 250 msec
+       mvi     a, 37h  ; clear break bit
+       out     mnprts
+       ret
+ENDIF ; px8 [29]
+
+;\f
+IF bbc         ;[22]
+sendbr:
+;
+;      Ensure that the transmitter has finished sending buffered chars
+sndbr1:        mvi     a,96h           ; get ACIA status
+       mvi     l,8
+       call    osbyte          ; *FX150,8
+       mov     a,h
+       ani     2               ; everything sent?
+       jz      sndbr1          ; no, wait a bit more
+;
+;      Disable centisecond clock (system VIA) which interferes with break
+       lxi     h,0FE4Eh        ; system VIA interrupt enable register
+       mvi     a,40H           ; disable timer 1
+       call    wrtiom          ; write to I/O processor memory
+;
+;      Begin sending a break by setting bit in ACIA control register
+       mvi     a,9Ch
+       lxi     h,9F60h         ; Set Rxint, Txint, Break, RTS
+       call    osbyte          ; *FX 156,96,159
+;
+;      Wait for 250 milliseconds (using hundredths second delay routine)
+       mvi     a,25
+       call    delay
+;
+;      Resume normal operation by returning old control byte
+       mvi     a,9Ch
+       mvi     h,0             ;Set TxEna, DTR, RxEna, ErrRst, RTS
+       call    osbyte          ; *FX 156,oldvalue,0
+;
+;      Enable centisecond clock (system VIA)
+       lxi     h,0FE4Eh        ; system VIA interrupt enable register
+       mvi     a,0C0H          ; enable timer 1
+       call    wrtiom          ; write to I/O processor memory
+;
+       ret                     ;done
+;
+;      Routine to write byte in A to I/O processor memory address
+;      given by HL
+wrtiom:
+       shld    parblk          ; store address to parameter block
+       sta     parblk+4        ; store data
+       lxi     h,parblk        ; load hl with address of param block
+       mvi     a,6             ; write I/O processor memory
+       call    osword          ; go do it
+       ret
+;
+parblk:        DS      5               ; reserve space for parameter block
+ENDIF;bbc [22]
+;\f
+IF disc        ;[29]
+; This is almost an exact copy of the bbI sendbr routine.
+; Modifications to include a long break have been made.
+;
+; Officially, a "break" is 300 milliseconds of "space" (idle line is
+; "mark").  (or maybe 200 milliseconds; I forget.)  The timing isn't
+; usually that critical, but we'll make an attempt, at least.  Sending
+; too long a break can cause some modems to hang up.
+
+sendlbr:
+       push    d       ;save d, this may not be necessary, but safe
+       mvi     d,17    ;do short break 17 times (approx. 5 sec.)
+       jmp     sndbr1
+sendbr:
+       push d
+       mvi     d,1     ;On short break, do only once
+; First, make sure the transmitter is really empty.  (The SIO sets
+; "transmitter buffer empty" when it can accept another character;
+; the previous character is still being shifted onto the line.
+; Another status bit, "all done", is set to indicate that the
+; transmitter is really idle.
+sndbr1:        mvi     a,1             ; select Read Register 1
+       out     mnprts
+       in      mnprts          ; read the contents
+       ani     1               ; test "all done" flag
+       jz      sndbr1          ; loop until it's nonzero.
+;
+; Next, set the "send break" bit to start the transmitter spacing.
+       mvi     a,5             ; select Write Register 5
+       out     mnprts
+       mvi     a,0FAH          ; Tx enable, 8 bit Tx character, Send Break,
+       out     mnprts          ;  DTR and RTS on.
+;
+; Now, delay for 30*d hundredths of a second
+sendbr2:
+       mvi     a,30            ; delay count
+       call    delay
+; The following has been added to allow doing .03 delay d times
+       dcr     d               ; decrement # of times to do loop
+       jnz     sendbr2         ; if not done, do again
+       pop     d               ; reload d
+;
+; Time's up. Put transmitter back in normal state (data byte is the
+; same as the one in siotbl: for Write Register 5) and return.
+       mvi     a,5             ; select Write Register 5
+       out     mnprts
+       mvi     a,0EAH          ; Tx enable, 8 bit Tx character,
+       out     mnprts          ;  DTR and RTS on.
+       ret                     ; done.
+ENDIF  ;disc [29]
+
+
+;
+;      sysflt - system-dependent filter
+;      called with character in E.
+;      if this character should not be printed, return with A = zero.
+;      preserves bc, de, hl.
+;      note: <xon>,<xoff>,<del>, and <nul> are always discarded.
+sysflt:
+       mov     a,e             ; get character for testing
+IF mikko
+       cpi     'O'-100O        ;Control-O's lock keyboard
+       rnz                     ; if not control-O, it's ok.
+       xra     a               ; don't allow control-O out.
+ENDIF;mikko
+
+       ret
+
+;      mdmflt - modem filter [30]
+;      called with character to be sent to printer in E
+;      with parity set as appropriate.
+;      return with accumulator = 0 do do nothing,
+;                              <> 0 to send char in E.
+mdmflt:
+       mov     a,e             ;[30] get character to test
+       ret
+
+
+
+;      prtflt - printer filter [30]
+;      called with character to be sent to printer in E
+;      returns with a = 0 to do nothing
+;                   a <> 0 to print it.
+;
+;      this routine for those printer that automatically insert
+;      a lf on cr, or cr for lf.  Should this be shifted to 
+;      the system indep. stuff, in say 4.06?
+prtflt:
+       mov     a,e             ; [30] get character to test
+       ret
+
+
+;\f
+; system-dependent processing for BYE command.
+;  for lobo, hang up the phone.
+sysbye:
+IF lobo ;[hh]
+       call    discon          ;[hh] force modem to hang up
+ENDIF;lobo
+       ret
+
+IF lasm
+       LINK    CPXSY2.ASM      ; If m80 then this ignored
+ENDIF  ; lasm
diff --git a/cpxtm4.asm b/cpxtm4.asm
new file mode 100644 (file)
index 0000000..bb933ee
--- /dev/null
@@ -0,0 +1,490 @@
+;CPXTM4.ASM
+;       KERMIT - (Celtic for "FREE")
+;
+;       This is the CP/M-80 implementation of the Columbia University
+;       KERMIT file transfer protocol.
+;
+;       Version 4.0
+;
+;       Copyright June 1981,1982,1983,1984,1985
+;       Columbia University
+;
+; Originally written by Bill Catchings of the Columbia University Center for
+; Computing Activities, 612 W. 115th St., New York, NY 10025.
+;
+; Contributions by Frank da Cruz, Daphne Tzoar, Bernie Eiben,
+; Bruce Tanner, Nick Bush, Greg Small, Kimmo Laaksonen, Jeff Damens, and many
+; others.
+;
+;       This file contains the system-dependent code and data for various
+;       Tandy Model 4 running under Montezuma Micro CPM
+;
+; This has the Family name of CPXTM4.ASM.
+;
+; revision history (last edit first)
+;
+; edit 5,  8-Feb-1991 by Lance Tagliapietra of the University of Wisconsin-
+;       Platteville. Corrected error in the VT52 translation table for
+;       clearing from the cursor to the end of the line.
+;
+; edit 4, 27 October, 1987 by OBSchou.  Massaged into format suitable
+;       for overlay version 4.09
+;
+; Edit 3: Sept 5 1987 GDS Transformed code from Genie III to Tandy Model 4
+;
+; Edit 2: Aug 27 1987 GDS Put in code for BREAK and fillited out
+;         a lot of unnecessary IF's
+;
+;Edit 1: Nov. 28, 1986 Geof Smith Clinical Research centre Harrow UK.
+.printx * Assembling for Tandy Model 4*
+;
+drtime  EQU     05H     ;Default receive time out interval.
+;
+; the basics...
+;
+mnport EQU 0EBH
+mnprts EQU 0EAH
+output EQU 40H
+input  EQU 80H
+lctrl  EQU 0E8H
+baudpt EQU 0E9H
+z80    EQU TRUE
+brkval EQU 0H
+inout  EQU TRUE
+defesc EQU 'X'-100O ;The default escape character.
+;Select initial setting for VT-52 emulation flag.
+; default to VT52-EMULATION ON.
+;
+vtval   EQU     1
+;
+;
+;       Family is the string used in VERSION to say which of several
+;       smaller overlay files are used.  These are (will be) derived from
+;       the huge CP4SYS.ASM file, in which case we will never get here.
+;       Just a Dollar, but put a sting in for a family of machines.
+;
+family: db      'CPXTM4.ASM  (5) 8-Feb-91$'     ; Used for family versions....
+;
+;       System-dependent initialization
+;       Called once at program start.
+sysxin:
+;
+                        ;Set up 9600 bd, 8bit words, no parity 1stop bit
+        mvi     a,0EEH          ;Get byte for desired baud (9600 = CC) and
+        out     baudpt          ;and put it out of baud port
+        out     lctrl           ;latch control port with anything
+        lda     pstore          ;get parity etc and put it out of
+        out     mnprts          ;port
+        ret                     ; return from system-dependent routine
+;
+;
+;       system-dependent termination processing
+;       If we've changed anything, this is our last chance to put it back.
+sysexit:
+        ret
+;
+;       system-dependent processing for start of CONNECT command
+;
+syscon:
+        ret
+conmsg:         ; Messages printed when entering transparent (CONNECT) mode:
+;-------------------------------------------------------------------------------
+;   --
+;
+;       syscls - system-dependent close routine
+;       called when exiting transparent session.
+;
+syscls:
+       ret
+;-------------------------------------------------------------------------------
+;   ---
+;
+;       sysinh - help for system-dependent special functions.
+;       called in response to <escape>?, after listing all the
+;       system-independent escape sequences.
+;
+sysinh:
+        lxi     d,inhlps        ; we got options...
+        call    prtstr          ; print them.
+        ret
+;additional, system-dependent help for transparent mode
+; (two-character escape sequences)
+inhlps:
+        db      cr,lf,'B  Transmit a BREAK'
+        db      '$'                     ;[hh] table terminator
+;
+;       sysint - system dependent special functions
+;       called when transparent escape character has been typed;
+;       the second character of the sequence is in A (and in B).
+;       returns:
+;       non-skip: sequence has been processed
+;       skip:   sequence was not recognized
+sysint: ani     137O            ; convert lower case to upper, for testing...
+        cpi     'B'             ; send break?
+        jz      sendbr          ; yes, go do it.  return nonskip when through.
+        jmp     rskp            ; take skip return - command not recognized.
+;-------------------------------------------------------------------------------
+sendbr:
+;
+;       Ensure that the transmitter has finished sending buffered chars
+sndbr1: in      mnprts          ; get UART status
+        ani     output         ; everything sent?
+        jz      sndbr1          ; no, wait a bit more
+;
+;       Begin sending a break by setting bit in UART command register
+        mvi     a,brkval           ;  SBreak,
+        out     lctrl
+        out     mnprts
+;
+;       Wait for 250 milliseconds (using hundredths second delay routine)
+        mvi     a,25
+        call    delay
+;
+;       Resume normal operation by clearing the SendBreak command bit
+        lda     pstore            ;get parity etc value
+        out     lctrl               ;latch control port
+        out     mnprts              ;and set values
+;
+        ret                     ;done
+;
+;
+;
+;       sysflt - system-dependent filter
+;       called with character in E.
+;       if this character should not be printed, return with A = zero.
+;       preserves bc, de, hl.
+;       note: <xon>,<xoff>,<del>, and <nul> are always discarded.
+sysflt:
+        mov     a,e             ; get character for testing
+        ret
+;       mdmflt - modem filter [30]
+;       called with character to be sent to modem in E
+;       with parity set as appropriate.
+;       return with accumulator = 0 do do nothing,
+;                               <> 0 to send char in E.
+mdmflt: mov     a,e
+        ret
+;       prtflt - printer filter [30]
+;       called with character to be sent to printer in E
+;       returns with a = 0 to do nothing
+;                    a <> 0 to print it.
+;
+;       this routine for those printer that automatically insert
+;       a lf on cr, or cr for lf.  Should this be shifted to
+;       the system indep. stuff, in say 4.06?
+prtflt:
+        mov     a,e             ; [30] get character to test
+        ret
+;
+;
+; system-dependent processing for BYE command.
+;  for apmmdm, heath, and lobo, hang up the phone.
+sysbye:
+        ret
+;
+;       This is the system-dependent command to change the baud rate.
+;       DE contains the two-byte value from the baud rate table; this
+;       value is also stored in 'speed'.
+sysspd:
+                        ;Set up baud rate 8bit words, no parity 1stop bit
+        mov     a,e             ;get get speed into a
+        out     baudpt          ;output it as well
+        lda     pstore          ;get parity etc
+        out     lctrl           ;do it resetting DLAB at same time
+        out     mnprts
+        ret
+pstore:     db 6CH  ;Default value for parity word length and stop bits
+spdtbl: db    10h               ;17 entries
+     db     03h,'110$',     22H,22H
+     db     04h,'1200$',     77H,77H
+     db     05h,'134.5$',     33H,33H
+     db     03h,'150$',     44H,44H
+     db     04h,'1800$',     88H,88H
+     db     05h,'19200$',    0FFH,0FFH
+     db     04h,'2000$',     99H,99H
+     db     04h,'2400$',    0AAH,0AAH
+     db     03h,'300$',     55H,55H
+     db     04h,'3600$',    0BBH,0BBH
+     db     04h,'4800$',    0CCH,0CCH
+     db     02h,'50$',     00H,00H
+     db     03h,'600$',     66H,66H
+     db     04h,'7200$',    0DDH,0DDH
+     db     02h,'75$',     11H,11H
+     db     04h,'9600$',    0EEH,0EEH
+sphtbl: db     cr,lf,'   50      75    110    134.5  150    300    600   1200'
+     db     cr,lf,' 1800   2000   2400   3600   4800   7200   9600  19200  $'
+;       This is the system-dependent SET PORT command.
+;       HL contains the argument from the command table.
+sysprt:
+        ret
+;
+prttbl  equ     0               ; SET PORT not supported
+prhtbl  equ     0
+;
+;
+;       selmdm - select modem port
+;       selcon - select console port
+;       selmdm is called before using inpmdm or outmdm;
+;       selcon is called before using inpcon or outcon.
+;       For iobyt systems, diddle the I/O byte to select console or comm port;
+;       For Decision I, switches Multi I/O board to console or modem serial
+;       port.  [Toad Hall]
+;       For the rest, does nothing.
+;       preserves bc, de, hl.
+selmdm:
+        ret
+selcon:
+        ret
+;
+;       Get character from console, or return zero.
+;       result is returned in A.  destroys bc, de, hl.
+;
+inpcon:
+        mvi     c,dconio        ;Direct console I/O BDOS call.
+        mvi     e,0FFH          ;Input.
+        call    BDOS
+        ret
+;
+;       Output character in E to the console.
+;       destroys bc, de, hl
+;
+outcon:
+        mvi     c,dconio        ;Console output bdos call.
+        call    bdos            ;Output the char to the console.
+        ret
+;
+;
+;       outmdm - output a char from E to the modem.
+;               the parity bit has been set as necessary.
+;       returns nonskip; bc, de, hl preserved.
+outmdm:
+        in      mnprts          ;Get the output done flag.
+        ani     output          ;Is it set?
+        jz      outmdm          ;If not, loop until it is.
+        mov     a,e
+        out     mnport          ;Output it.
+        ret
+;--------------------------------------------------------------------------
+;
+;       get character from modem; return zero if none available.
+;       for IOBYT systems, the modem port has already been selected.
+;       destroys bc, de, hl.
+inpmdm:
+;Note: modem port should already be selected for mdI.  [Toad Hall]
+        in      mnprts          ;Get the port status into A.
+        ani     input           ;See if the input ready bit is on.
+        rz                      ;If not then return.
+        in      mnport          ;If so, get the char.
+        ret                     ; return with character in A
+;
+;       flsmdm - flush comm line.
+;       Modem is selected.
+;       Currently, just gets characters until none are available.
+flsmdm: call    inpmdm          ; Try to get a character
+        ora     a               ; Got one?
+        jnz     flsmdm          ; If so, try for another
+        ret                     ; Receiver is drained.  Return.
+;-----------------------------------------------------------------------------
+;
+;       lptstat - get the printer status. Return a=0 if ok, or 0ffh if not.
+lptstat:
+        xra     a               ; assume it is ok.. this may not be necessary
+        ret
+;
+;       outlpt - output character in E to printer
+;       console is selected.
+;       preserves de.
+outlpt:
+        push    d               ; save DE in either case
+        call    prtflt          ; go through printer filter [30]
+        ana     a               ; if A = 0 do nothing,
+        jz      outlp1          ; [30] if a=0 do nothing
+        mvi     c,lstout
+        call    bdos            ;Char to printer
+outlp1: pop     d               ; restore saved register pair
+        ret
+;------------------------------------------------------------------------------
+;
+;       Screen manipulation routines
+;       csrpos - move to row B, column C
+;
+;       csrpos for terminals that use a leadin sequence followed
+;        by (row + 31.) and (column + 31.)
+;
+csrpos: push    b               ; save coordinates
+        lxi     d,curldn        ; get cursor leadin sequence
+        call    prtstr          ; print it
+        pop     h               ; restore coordinates
+        mov     a,h             ; get row
+        adi     (' '-1)         ; space is row one
+        mov     e,a
+        push    h
+        call    outcon          ; output row
+        pop     h
+        mov     a,l             ; get column
+        adi     (' '-1)         ; space is column one
+        mov     e,a
+        jmp     outcon          ; output it and return
+;
+; delchr - make delete look like a backspace.  Unless delete is a printing
+;       character, we just need to print a backspace. (we'll output clrspc
+;       afterwards)
+;       For Kaypro and Vector General, delete puts a blotch on the screen.
+;       For Apple and Osborne 1, delete moves but doesn't print.
+delchr:
+        mvi     e,bs            ;get a backspace
+        jmp     outcon
+; erase the character at the current cursor position
+clrspc: mvi     e,' '
+        call    outcon
+        mvi     e,bs            ;get a backspace
+        jmp     outcon
+; erase the current line
+clrlin: lxi     d,eralin
+        jmp     prtstr
+; erase the whole screen, and go home. preserves b (but not c)
+clrtop: lxi     d,erascr
+        jmp     prtstr
+;[2] I see no real saving in having all screens in separate file and
+;therefore have included screen definition here and commented out
+;the link to VDU file
+;
+;
+;Specific definitions for the Model IV screen
+;
+sysver: db 'Tandy Model IV$'
+outlin: db 1aH,cr,lf,'            $'
+erascr: db 1AH,'$'
+eralin: db cr,15H,'$'
+curldn: db esc,'=$'
+ttab:
+ta:     db 0BH,'$',0,0                    ;Cursor up
+tb:     db 0AH,'$',0,0                    ;Cursor down
+tc:     db 0CH,'$',0,0                    ;Cursor right
+td:     db 08H,'$',0,0                    ;Cursor left
+te:     db 1AH,'$',0,0                    ;Clear display
+tf:     db 0FH,'$',0,0                    ;Reverse on
+tg:     db 0EH,'$',0,0                    ;Reverse off
+th:     db 1EH,'$',0,0                    ;Cursor home
+ti:     db 0BH,'$',0,0                    ;Reverse linefeed
+tj:     db 19H,'$',0,0                    ;Clear to end of screen
+tk:     db 15H,'$',0,0                    ;Clear to end of line
+ovlend equ $           ;End of overlay
+        END
diff --git a/cpxtor.asm b/cpxtor.asm
new file mode 100644 (file)
index 0000000..51b653a
--- /dev/null
@@ -0,0 +1,1229 @@
+IF NOT lasm
+.printx * CPXTOR.ASM *
+ENDIF  ;NOT lasm
+;       KERMIT - (Celtic for "FREE")
+;
+;       This is the CP/M-80 implementation of the Columbia University
+;       KERMIT file transfer protocol.
+;
+;       Version 4.0
+;
+;       Copyright June 1981,1982,1983,1984,1985
+;       Columbia University
+;
+; Originally written by Bill Catchings of the Columbia University Center for
+; Computing Activities, 612 W. 115th St., New York, NY 10025.
+;
+; Contributions by Frank da Cruz, Daphne Tzoar, Bernie Eiben,
+; Bruce Tanner, Nick Bush, Greg Small, Kimmo Laaksonen, Jeff Damens, and many
+; others.
+;
+;       This file contains the system dependent part for Torch, Superbrains, 
+;       PCI2651 (Loughborough 8" Standard CP/M system) and Cifer computers.
+;
+;       This is the first attempt to break the huge CPXSYS.ASM file
+;       into smaller system dependent files.  To start with I will bunch
+;       several micros to one class.
+;
+;       Please name system dependent files in the form CPXxxx.ASM where
+;       xxx is a three letter abbrev. for the system you are adding.
+;
+; revision history:
+;
+;edit 5, 10-Jan-1991 by MF. Removed references to assembly switch ker09.
+; edit 4, 21 July, 1987 by OBSchou.  Removed routines no in CPXCOM.ASM
+;
+; edit 3, 8 April, 1987 by OBSchou.  Moved the VDU declarations for the
+;      Torch, superbrain and Cifer from CPXVDU.ASM.  Also added code to
+;      see if the MCP/CCCP ROM versions on the Torch is less or grater than
+;      1.  Less than 1 => poor screen control.  Finally adjusted the 
+;      positioning of the filename to cope with a user number and drive 
+;      in the filename field
+;
+;
+; edit 2, 20 March, 1987 by C.J.MILES@UK.AC.UMRCC.  Added support for 
+;      NCR Decision Mate V (2651 USART)
+;
+; edit 1, 22 April, 1986, OBSchou.  Start on splitting off individual 
+;       systems from this huge file.  It is done using the LINK facility 
+;       LASM.  We link to a collection of systems under CPXxxx.ASM.
+;       I have started with the systems I know, the Torch, Cifer and 
+;       pci2651.  These will all be held under CPXTOR.ASM
+;
+;
+; Keep module name, edit number, and last revision date in memory.
+family: db      'CPXTOR.ASM (5)  10-Jan-1991  $'
+;\f
+; Assembly time message to let me know I'm building the right version.
+; LASM generates an 'S' error along with the message, which is messy, but
+; better than trying to put everything inside a IF m80 OR mac80 conditional,
+; because LASM doesn't like nested IF's, either.
+
+IF ncrdmv
+.printx * Assembling KERMIT-80 for the N.C.R. Decision Mate V *
+ENDIF
+
+IF brain
+.printx * Assembling KERMIT-80 for the Intertec Superbrain *
+ENDIF
+
+IF brainm
+.printx * With main port selected
+ENDIF
+IF braina
+.printx * With Aux port
+ENDIF
+
+IF pci2651      ;
+.printx * assembling Kermit-80 for 2651 PCI as comms device *
+ENDIF
+
+IF torch
+.printx * Assembling Kermit-80 for Torch Unicorn 5 *
+ENDIF
+; *******This should be in the original CPXSYS.ASM file
+;\f
+;=========================================================================
+;       I/O Byte assignments (2-bit fields for 4 devices at loc 3)
+;
+;bits 6+7               LIST field
+;       0               LIST is Teletype device (TTY:)
+;       1               LIST is CRT device (CRT:)
+;       2               LIST is Lineprinter (LPT:)
+;       3               LIST is user defined (UL1:)
+;
+;bits 4+5               PUNCH field
+;       0               PUNCH is Teletype device (TTY:)
+;       1               PUNCH is high speed punch (PUN:)
+;       2               PUNCH is user defined #1 (UP1:)
+;       3               PUNCH is user defined #2 (UP2:)
+;
+;bits 2+3               READER field
+;       0               READER is Teletype device (TTY:)
+;       1               READER is high speed reader (RDR:)
+;       2               READER is user defined #1 (UR1:)
+;       3               READER is user defined #2 (UR2:)
+;
+;bits 0+1               CONSOLE field
+;       0               CONSOLE is console printer (TTY:)
+;       1               CONSOLE is CRT device (CRT:)
+;       2               CONSOLE is in Batch-mode (BAT:);READER = Input,
+;                       LIST = Output
+;       3               CONSOLE is user defined (UC1:)
+;
+;=========================================================================
+
+iobyte  EQU     03H     ;Location of I/O byte
+
+
+; [13] modifed to use either main or aux port.  Should really
+;       be selected by set port, but this is urgent, so no frills
+IF brain
+baudst  EQU     60H     ;
+baudrt  EQU     0EF00H  ;Memory location where baud rates are stored.
+output  EQU     01H     ;Transmitter ready
+input   EQU     02H     ;Input data available
+TxEmpty EQU     04h     ;Transmitter empty
+z80     SET     TRUE    ;I don't know...
+ENDIF;brain
+IF brainm               ; Superbrain and main ports
+mnport  EQU     58H     ;Modem data port
+mnprts  EQU     59H     ;Modem status port
+ENDIF   ;brainm
+IF braina               ; Superbrain and aux port
+mnport  EQU     40H     ;Modem data port
+mnprts  EQU     41H     ;Modem status port
+ENDIF   ;braina [13]
+
+IF ncrdmv
+iobase equ     70h             ; base address of PCI device
+modrx  equ     70h             ; Rx data port
+mnprts equ     71h             ; status port
+mnmodr equ     72h             ; mode register read
+mncmdr equ     73h             ; command register read
+modtx  equ     74h             ; Tx data port
+mnmodw equ     76h             ; mode register write
+mncmdw equ     77h             ; command register write
+txrdy  equ     1
+output equ     txrdy
+rxrdy  equ     2
+input  equ     rxrdy
+baudini        equ     0ah             ; initial baud to 2400
+z80    SET     true
+cpuspd SET     40
+ENDIF
+
+IF pci2651                      ;[28]
+iobase  equ     04h             ; base address of PCI device
+mnport  equ     iobase          ; rx and tx data ports
+mnprts  equ     iobase+1        ; status port
+mnmode  equ     iobase+2        ; mode port
+mncmd   equ     iobase+3        ; PCI command port
+
+txrdy   equ     1               ; tx ready bit set if free
+output  equ     txrdy
+rxrdy   equ     2               ; RX ready bit
+input   equ     rxrdy
+baudini equ     7               ; 7 => 1200 baud by default
+z80     SET     true            ; For Ithica intersystems it is
+cpuspd  SET     40              ; and running at four megs
+ENDIF                           ;[28]
+
+IF torch        ;[13]
+z80     SET     TRUE
+;                       [32] baudini removed as now read current baud rate
+;               settings from base processor.
+
+;baudini        equ     707h    ; Initial Baud rate = 1200 baud
+                        ; Entry to be of form x0xh where x is
+                        ; the value x in the FX 7,x and FX 8,x
+                        ; funtion calls.  4= 1200 baud, 7 = 9600
+                        ; 2 = 300 baud.
+ENDIF
+
+IF brain OR torch
+defesc  EQU     ']'-100O        ;The default escape character.
+ENDIF;brain OR torch
+
+; If none of the above, default to VT52-EMULATION ON.
+IF NOT crt 
+vtval   EQU     1
+ENDIF;NOT crt
+
+
+sysxin:
+
+IF brainm                       ;[25]
+        lda     baudrt          ; fetch current baud rate
+        ani     0F0H            ; extract left nibble
+        rrc                     ; shift right 4 places
+        rrc
+        rrc
+        rrc
+        sta     speed           ; store as comm port speed
+        sta     speed+1         ;  (16 bits, to match speed table entries)
+ENDIF;brainm
+
+IF braina                       ;[25]
+        lda     baudrt          ; fetch current baud rate
+        ani     00FH            ; extract right nibble
+        sta     speed           ; store as comm port speed
+        sta     speed+1         ;  (16 bits, to match speed table entries)
+ENDIF;braina
+
+IF torch                        ; [13] [32]
+        push    h
+        mvi     a,0f2h          ; nick code from BBC initialisation
+        lxi     h,0ff00h
+        call    osbyte          ; Read current speed setting
+        mov     a,l
+        ani     7
+        xri     7               ; Store as two's complement
+        inr     a
+        sta     speed
+        sta     speed+1
+        mov     e,a
+        call    sysspd          ; Make sure they are both the same!
+        mvi     a,15            ; Flush all internal buffers [32]
+        mvi     l,0
+;       call    osbyte
+        mvi     a,3
+        lxi     h,0100h         ; *FX 3,0,1 Enable RS423
+        call    osbyte
+        mvi     a,2             ; Select keyboard, Enable RS423 input
+        mvi     l,2
+        call    osbyte
+        mvi     a,5             ; Select serial printer [32]
+        mvi     l,2
+        call    osbyte          ; [30]
+        mvi     a,6             ; Must be able to send LF [30]
+        mvi     l,0
+        call    osbyte          ; [30]
+       mvi     a,202           ; FX 202,255 set lower case on
+       mvi     l,255
+       call    osbyte
+        pop     h
+
+; Now see what version of MCP CCP roms.  Assume >1, else copy a few of the 
+;      older Torch VDU declares over the new ones.
+;
+;      lda     0ffffh          ; Address 0ffffh has single byte Version no.
+;      push    psw             ; save for a rainy day
+;      ani     0F0h            ; get ms digit of MCP version
+;      rra                     ; move right 4 places
+;      rra
+;      rra
+;      rra
+;      ani     0fh
+;      adi     30h             ; make it a number
+;      sta     mcpver
+;      pop     psw             ; its raining...
+;      push    psw             ; ... its pouring...
+;      ani     0fh             ; get ls digit
+;      adi     30h             ; make it ascii number
+;      sta     mcpver+2
+;      pop     psw             ; restore psw
+;      cpi     10h             ; Version 1.00 or less?
+;      jp      init2           ; yes, so skip next bit
+;      lxi     h,ooutli        ; from old string table
+;      lxi     d,ttab          ; to new ttab
+;      lxi     b,60            ; 60 bytes to move
+;      call    mover
+init2: 
+
+IF ncrdmv
+       mvi     a,00            ; clear out command register
+       out     mncmdw
+       mvi     a,4eh           ; 1 stop bit, 8 data bits, / by 16 counter
+       out     mnmodw
+       mvi     a,70h+baudini   ; baud rate and select internal rate gen.
+       out     mnmodw
+       mvi     a,27h           ; enable tx and rx, RTS and DTR low
+       out     mncmdw
+ENDIF  ; ncrdmv
+
+IF pci2651              ;[28]
+        in      mncmd           ; clearw command reg counter
+        mvi     a,4eh           ; 1 stop bit, 8 data bits, / by 16 counter
+        out     mnmode
+        mvi     a,30h+baudini   ; baud rate and select internal rate gen.
+        out     mnmode
+        mvi     a,27h           ; enable tx and rx, RTS and DTR low
+        out     mncmd
+ENDIF   ; pci2651 [28]
+
+        ret                     ; return from system-dependent routine
+
+;\f
+;
+;       system-dependent termination processing
+;       If we've changed anything, this is our last chance to put it back.
+sysexit:
+        ret
+
+;
+;       system-dependent processing for start of CONNECT command
+;
+syscon:
+        ret
+
+conmsg:         ; Messages printed when entering transparent (CONNECT) mode:
+;\f
+;
+;       syscls - system-dependent close routine
+;       called when exiting transparent session.
+;
+syscls:
+        ret
+;\f
+;
+;       sysinh - help for system-dependent special functions.
+;       called in response to <escape>?, after listing all the
+;       system-independent escape sequences.
+;
+sysinh:
+IF torch OR brain OR pci2651 OR ncrdmv
+        lxi     d,inhlps        ; we got options...
+        call    prtstr          ; print them.
+ENDIF;torch OR brain OR pci2651 OR ncrdmv
+
+        ret
+
+
+;additional, system-dependent help for transparent mode
+; (two-character escape sequences)
+inhlps:
+
+; [16] [18] have added super brain and Torch to the list of Breaking machines.
+
+IF pci2651 OR brain OR torch OR ncrdmv
+        db      cr,lf,'B  Transmit a BREAK'
+ENDIF   ;pci2651 OR brain OR torch OR ncrdmv
+
+IF torch ; added this simply to debug the escape cokebottle D for the apple
+        db      cr,lf,'D  Disconnect the modem (Test purposes only)'
+ENDIF;Torch
+
+        db      '$'                     ;[hh] table terminator
+
+;
+;       sysint - system dependent special functions
+;       called when transparent escape character has been typed;
+;       the second character of the sequence is in A (and in B).
+;       returns:
+;       non-skip: sequence has been processed
+;       skip:   sequence was not recognized
+sysint: ani     137O            ; convert lower case to upper, for testing...
+
+; [19] have added superbrain and torch to the list
+
+IF brain OR pci2651 OR torch OR ncrdmv
+        cpi     'B'             ; send break?
+        jz      sendbr          ; yes, go do it.  return nonskip when through.
+ENDIF   ;brain OR pci2651 OR torch OR ncrdmv
+
+IF Torch; added bit for doing a D...
+        cpi     'D'             ;drop the line...
+        jz      dropln
+ENDIF ;torch
+
+        jmp     rskp            ; take skip return - command not recognized.
+
+
+IF torch
+dropln: lxi     d,dropm         ; tell user line is dropped..
+        call    prtstr
+        xra     a               ; destroy A
+        ret
+dropm:  db      bell,cr,lf,'Testing line dropped ',cr,lf,bell
+        db      '$'
+ENDIF ;torch and dropping them there lines..
+
+;\f
+
+IF brain 
+sendbr:
+;
+;       Ensure that the transmitter has finished sending buffered chars
+sndbr1: in      mnprts          ; get UART status
+        ani     TxEmpty         ; everything sent?
+        jz      sndbr1          ; no, wait a bit more
+;
+;       Begin sending a break by setting bit in UART command register
+        mvi     a,3Fh           ; Set TxEna, DTR, RxEna, SBreak, ErrRst, RTS
+        out     mnprts
+;
+;       Wait for 250 milliseconds (using hundredths second delay routine)
+        mvi     a,25
+        call    delay
+;
+;       Resume normal operation by clearing the SendBreak command bit
+        mvi     a,37h           ;Set TxEna, DTR, RxEna, ErrRst, RTS
+        out     mnprts
+;
+        ret                     ;done
+ENDIF;brain 
+
+IF torch ; [18] [27] [30] [32]
+; Send a break.  
+;
+; [30]  Dumping of 6502 code not yet used, but may be for later versions of 
+; the Torch CCCP Rom in the BBC.  This works, so I leave it for now.
+
+sendbr:
+        push    h               ;save for a monsoon
+        mvi     a,0e8h
+        lxi     h,0             ; turn interrupts off
+        call    osbyte
+        push    h
+;
+        mvi     a,9ch           ; OSBYTE call 9c is read/write 6850 cntl prt
+        lxi     h,0077h         ; H = 6502 Y reg, L = 6502 X reg
+        call    osbyte          ; returned new val. = (old value AND Y)XOR X
+        push    h               ; save it for return
+;
+        mvi     a,30
+        call    delay           ; do a delay
+;
+; now clear rx register
+;
+        mvi     a,96h           ; do a read sheila address 08h
+        mvi     l,8
+        mvi     h,0
+        call    osbyte          ; read sheila 08h = 6850 rx reg
+;
+; restore 6850 regs...
+;
+        pop     h               ; restore previous cntl reg
+                                ; old x reg in l, so leave it there
+;       mov     l,h
+        mvi     h,0
+        mvi     a,9ch           ; write previous value to 6850
+        call    osbyte
+;
+; and Beebs interrupt mask
+;
+        pop     h               ; get interrupt mask
+                                ; Once again, old X in L so leave it alone
+;       mov     l,h
+        mvi     h,0
+        mvi     a,0e8h
+        call    osbyte          ; restore interrupts mask
+;
+        pop     h
+        ret                     ; its raining again, so exit
+ENDIF   ; torch [18] [32]
+
+IF ncrdmv
+sendbr:        in      mnprts          ; get status
+       ani     04h             ; make sure shift register is empty
+       jz      sendbr
+
+       mvi     a,2fh           ; force a break
+       out     mncmdw
+       mvi     a,100           ; set delay period
+       call    delay
+       mvi     a,27h           ; restore command register
+       out     mncmdw
+       ret
+ENDIF  ; ncrdmv
+
+IF pci2651      ;[28]
+sendbr: in      mnprts
+        ani     04h             ; make sure shift reg is clear
+        jz      sendbr
+
+        mvi     a,2fh           ; set foe a break
+        out     mncmd
+        mvi     a,100           ; wait a bit
+        call    delay
+        mvi     a,27h           ; restore mode
+        out     mncmd
+        ret
+ENDIF   ;pci2651 [28]
+
+;
+;       sysflt - system-dependent filter
+;       called with character in E.
+;       if this character should not be printed, return with A = zero.
+;       preserves bc, de, hl.
+;       note: <xon>,<xoff>,<del>, and <nul> are always discarded.
+sysflt:
+        mov     a,e             ; get character for testing
+        ret
+
+;       mdmflt - modem filter [30]
+;       called with character to be sent to printer in E
+;       with parity set as appropriate.
+;       return with accumulator = 0 do do nothing,
+;                               <> 0 to send char in E.
+mdmflt:
+        mov     a,e             ;[30] get character to test
+IF torch        ;[30] map del to bs,space,bs
+        ani     7fh             ; strip parity
+        cpi     7fh             ; is it the delete character
+        rnz                     ; no, then a <> 0 so print it
+        mvi     e,bs            ; else load a backspace
+        call    outmdm          ; little recursion...
+        mvi     e,' '           ; then a space
+        call    outmdm          ; backspace, space, now another...
+        mvi     e,bs            ; backspace
+        call    outmdm          ;
+        xra     a               ; clear a => on return do nowt.
+ENDIF   ;torch [30]
+        ret
+
+
+
+;       prtflt - printer filter [30]
+;       called with character to be sent to printer in E
+;       returns with a = 0 to do nothing
+;                    a <> 0 to print it.
+;
+;       this routine for those printer that automatically insert
+;       a lf on cr, or cr for lf.  Should this be shifted to 
+;       the system indep. stuff, in say 4.06?
+prtflt:
+        mov     a,e             ; [30] get character to test
+IF torch        ; strip out lf from printer stream
+        ani     7fh             ; make sure it is parity less
+        cpi     lf              ; is it a line feed?
+        rnz                     ; no, print it
+;       xra     a               ; yes, don't.
+        
+ENDIF   ;torch [30]
+        ret
+
+
+;\f
+;
+; system-dependent processing for BYE command.
+;  for apmmdm, heath, and lobo, hang up the phone.
+sysbye:
+        ret
+;\f
+;       This is the system-dependent command to change the baud rate.
+;       DE contains the two-byte value from the baud rate table; this
+;       value is also stored in 'speed'.
+sysspd:
+
+; Set the speed for the Brain (Main Port)
+IF brainm                       ;[25]
+        lda     baudrt          ;Get the present baud rates.
+        ani     0fH             ;turn off the left
+        mov     d,a             ;Set it aside.
+        mov     a,e             ;Get the new baud rate.
+        rlc                     ;Shift left 4 places.
+        rlc
+        rlc
+        rlc
+        ora     d               ; combine with the old baud rate
+        sta     baudrt          ;Store the new baud rates.
+        out     baudst          ;Set the baud rates.
+        ret
+ENDIF;brainm
+
+; Set the speed for the Brain (Aux Port)
+IF braina                       ;[25]
+        lda     baudrt          ;Get the present baud rates.
+        ani     0f0H            ;turn off the right
+        ora     e               ; combine with the new baud rate
+        sta     baudrt          ;Store the new baud rates.
+        out     baudst          ;Set the baud rates.
+        ret
+ENDIF;braina
+
+If torch        ; Set speed for Torch [14] [32]
+        mvi     a,7             ; Osbyte call to set rx rate
+        mov     l,e
+        call    osbyte          ; 
+        mvi     a,8             ; set up for tx rate to be set
+        mov     l,e
+        call    osbyte
+        ret                     ; and now, all rates should be different
+
+ENDIF   ;torch  [14] [32]
+
+IF ncrdmv      ; Set baud rate for NCR Decision Mate V
+       mvi     a,00            ; clear command register
+       out     mncmdw
+       mvi     a,4eh           ; set for 1 stop, 8 data bits
+        out     mnmodw         ; save in mode 1 port
+        mvi     a,70h          ; set bits for rate etc..
+        add     e              ; add baud rate (bits 0 - 3)
+        out     mnmodw         ; set mode port 2
+        mvi     a,27h          ; set tx/rx ready, RTS CTS active
+        out     mncmdw
+        ret
+ENDIF   ; ncrdmv
+
+
+IF pci2651      ; Set baud for PCI [28]
+        in      mncmd           ; Clear register counter
+        mvi     a,4eh           ; set for 1 stop, 8 data bits
+        out     mnmode          ; save in mode 1 port
+        mvi     a,30h           ; set bits for rate etc..
+        add     e               ; add baud rate (bits 0 - 3)
+        out     mnmode          ; set mode port 2
+        mvi     a,27h           ; set tx/rx ready, RTS CTS active
+        out     mncmd
+        ret
+ENDIF   ;pci2651 [28]
+
+;\f
+;       Speed tables
+; (Note that speed tables MUST be in alphabetical order for later
+; lookup procedures, and must begin with a value showing the total
+; number of entries.  The speed help tables are just for us poor
+; humans.
+
+;       db      string length,string,divisor (2 identical bytes or 1 word)
+; [Toad Hall]
+
+IF brain OR pci2651 OR ncrdmv
+spdtbl: db      10h                     ;16 entries
+        db      03h,'110$',     02h,02h
+        db      04h,'1200$',    07h,07h
+        db      05h,'134.5$',   03h,03h
+        db      03h,'150$',     04h,04h
+        db      04h,'1800$',    08h,08h
+        db      05h,'19200$',   0fh,0fh
+        db      04h,'2000$',    09h,09h
+        db      04h,'2400$',    0ah,0ah
+        db      03h,'300$',     05h,05h
+        db      04h,'3600$',    0bh,0bh
+        db      04h,'4800$',    0ch,0ch
+        db      02h,'50$',      00h,00h
+        db      03h,'600$',     06h,06h
+        db      04h,'7200$',    0dh,0dh
+        db      02h,'75$',      01h,01h
+        db      04h,'9600$',    0eh,0eh
+
+sphtbl: db      cr,lf,'   50     75    110    134.5  150    300    600   1200'
+        db      cr,lf,' 1800   2000   2400   3600   4800   7200   9600  19200$'
+ENDIF;brain OR pci2651 OR ncrdmv
+
+IF torch        ;[17]
+spdtbl: db      8               ; 8 entries
+        db      4,'1200$',      4,4
+        db      3,'150$',       2,2
+        db      5,'19200$',     8,8
+        db      4,'2400$',      5,5
+        db      3,'300$',       3,3
+        db      4,'4800$',      6,6
+        db      2,'75$',        1,1
+        db      4,'9600$',      7,7
+
+sphtbl: db      cr,lf,'    75    150    300  1200  2400  4800  9600 19200$'
+ENDIF;torch [17]
+
+
+; The following conditionals were once a huge if not statement.  There
+; wasn't enough room to add the lobo to the list, so it had to be broken
+; into 2, which you can't do with an if not.  I redid it as two ifs and
+; applied them to those that wouldn't set baud. [Hal Hostetler]
+;\f
+;       This is the system-dependent SET PORT command.
+;       HL contains the argument from the command table.
+sysprt:
+IF iobyt
+        mov     a,m             ;Get the I/O byte
+        sta     prtiob          ;Save the desired IO byte for this port
+        inx     h               ;Point at next entry
+        mov     a,m             ;Get the output function
+        sta     prtfun          ;Save it
+ENDIF;iobyt
+
+        ret
+;\f
+;
+;
+;       Port tables for GENERIC CPM 2.2
+IF gener
+; help text
+prhtbl: db      cr,lf,'CRT device'
+        db      cr,lf,'PTR device'
+        db      cr,lf,'TTY device'
+        db      cr,lf,'UC1 device'
+        db      cr,lf,'UR1 device'
+        db      cr,lf,'UR2 device$'
+
+; command table
+prttbl: db      06H             ;Six devices to choose from
+        db      03H,'CRT$'
+                dw      crtptb
+        db      03H,'PTR$'
+                dw      ptrptb
+        db      03H,'TTY$'
+                dw      ttyptb
+        db      03H,'UC1$'
+                dw      uc1ptb
+        db      03H,'UR1$'
+                dw      ur1ptb
+        db      03H,'UR2$'
+                dw      ur2ptb
+
+; port entry table
+; table entries are:
+;       db      iobyte-value, BDOS output function, reserved
+crtptb: db      crtio,conout,0
+ptrptb: db      ptrio,punout,0
+ttyptb: db      ttyio,conout,0
+uc1ptb: db      uc1io,conout,0
+ur1ptb: db      ur1io,punout,0
+ur2ptb: db      ur2io,punout,0
+ENDIF;gener
+
+;\f
+;
+IF iobyt
+prtfun: db      punout          ;Function to use for output to comm port
+prtiob: db      batio           ;I/O byte to use for communicating
+coniob: db      defio           ;I/O byte to use for console
+ENDIF;iobyt
+
+IF NOT iobyt
+prttbl  equ     0               ; SET PORT is not supported
+prhtbl  equ     0
+ENDIF;NOT iobyt
+;\f
+;
+;       selmdm - select modem port
+;       selcon - select console port
+;       selmdm is called before using inpmdm or outmdm;
+;       selcon is called before using inpcon or outcon.
+;       For iobyt systems, diddle the I/O byte to select console or comm port;
+;       For Decision I, switches Multi I/O board to console or modem serial
+;       port.  [Toad Hall]
+;       For the rest, does nothing.
+;       preserves bc, de, hl.
+selmdm:
+IF iobyt
+        lda     prtiob          ;Set up for output to go to the comm port
+        sta     iobyte          ;Switch byte directly
+ENDIF;iobyt
+        ret
+
+selcon:
+IF iobyt
+        lda     coniob          ;Set up for output to go to the console port
+        sta     iobyte          ;Switch directly
+ENDIF;iobyt
+
+        ret
+;\f
+;       Get character from console, or return zero.
+;       result is returned in A.  destroys bc, de, hl.
+;
+inpcon:
+IF NOT iobyt
+        mvi     c,dconio        ;Direct console I/O BDOS call.
+        mvi     e,0FFH          ;Input.
+        call    BDOS
+ENDIF;NOT iobyt
+
+IF iobyt
+        call    bconst          ;Get the status
+        ora     a               ;Anything there?
+        rz                      ;No, forget it
+        call    bconin          ;Yes, get the character
+ENDIF;iobyt
+        ret
+;\f
+;
+;       Output character in E to the console.
+;       destroys bc, de, hl
+;
+outcon:
+
+IF NOT iobyt
+        mvi     c,dconio        ;Console output bdos call.
+        call    bdos            ;Output the char to the console.
+ENDIF;NOT iobyt
+
+IF iobyt
+        mov     c,e             ;Character
+        call    bcnout          ;to Console
+ENDIF;iobyt
+        ret
+;\f
+;
+;       outmdm - output a char from E to the modem.
+;               the parity bit has been set as necessary.
+;       returns nonskip; bc, de, hl preserved.
+outmdm:
+IF inout AND NOT ncrdmv
+        in      mnprts          ;Get the output done flag.
+        ani     output          ;Is it set?
+        jz      outmdm          ;If not, loop until it is.
+        mov     a,e
+        out     mnport          ;Output it.
+        ret
+ENDIF;inout AND NOT ncrdmv
+
+IF inout AND ncrdmv
+       in      mnprts          ;Get the output done flag
+       ani     output          ;Set ?
+       jz      outmdm          ;Loop until it is
+       mov     a,e
+       out     modtx           ;output char
+       ret
+ENDIF;inout AND ncrdmv
+
+IF iobyt
+;**** Note that we enter from outpkt with the I/O byte already set up for
+;  output to go to the comm port
+        push    h
+        push    b
+        lda     prtfun          ;Get the output function
+        mov     c,a             ;Into C
+        call    bdos            ;And output the character
+        pop     b
+        pop     h
+        ret
+ENDIF;iobyt
+
+
+IF torch        ; [32] [13] Torch stuff.  Requires some bit bashing
+                ; via the BBC host computer (io computer)
+                ; see also decription of osbyte later on
+outdat:
+        lda     prinuse         ; get the printer in use flag
+        ana     a               ; if set, then must use traditional osbyte,
+        jnz     outda2          ; else...
+        push    b
+        push    h               ; Preserve registers [32]
+        call    tx
+        db      1               ; MCP send to printer command
+        mov     c,e             ; Byte to send is in E [32]
+        call    txbyte
+        pop     h
+        pop     b
+        ret
+
+outda2:                         ; Preserve registers [32]
+        push    h
+        mvi     a,138           ; Osbyte insert byte into buffer
+        mvi     l,2
+        mov     h,e             ; get the byte to be sent s-l-o-w-l-y
+        call    osbyte
+        pop     h               ; Restore registers and exit
+        ret
+
+ENDIF   ;[13]
+
+;\f
+;
+;       get character from modem; return zero if none available.
+;       for IOBYT systems, the modem port has already been selected.
+;       destroys bc, de, hl.
+inpmdm:
+IF iobyt
+        call    bconst          ;Is Char at COMM-Port?
+        ora     a               ;something there?
+        rz                      ; return if nothing there
+        call    bconin          ; data present. read data.
+ENDIF;iobyt
+
+IF inout AND NOT ncrdmv
+;Note: modem port should already be selected for mdI.  [Toad Hall]
+        in      mnprts          ;Get the port status into A.
+        ani     input           ;See if the input ready bit is on.
+        rz                      ;If not then return.
+        in      mnport          ;If so, get the char.
+ENDIF;inout AND NOT ncrdmv
+
+IF inout AND ncrdmv
+       in      mnprts          ;Get input port status
+       ani     input           ;Mask input RDY bit
+       rz                      ;return if no char
+       in      modrx           ;get the char
+ENDIF;inout AND ncrdmv
+IF torch                        ; [32] [13] torch input
+indat:
+        push    h
+        mvi     a,128
+        lxi     h,0fffeh        ; Read buffer status
+        call    osbyte
+        mov     a,h             ; HL has number of characters
+        ora     l               ; in the buffer
+        jz      indatq          ; None, so skip fetch 
+        mvi     a,145           ; Get character from input buffer [32]
+        lxi     h,1
+        call    osbyte          ; Result returned in 'Y', rather H
+        mov     a,h
+indatq:
+        pop     h
+        ani     7fh
+        ret                     ; rx data in A
+ENDIF ;torch [13] [32]
+
+ret                     ; return with character in A
+
+
+;
+;       flsmdm - flush comm line.
+;       Modem is selected.
+;       Currently, just gets characters until none are available.
+
+flsmdm: call    inpmdm          ; Try to get a character
+        ora     a               ; Got one?
+        jnz     flsmdm          ; If so, try for another
+        ret                     ; Receiver is drained.  Return.
+
+
+;\f
+;
+;       lptstat - get the printer status. Return a=0 if ok, or 0ffh if not.
+lptstat:
+IF torch
+       mvi     a,80h           ; read chars remaining in printer buffer
+       mvi     l,252           ; do osbyte 80H, X=252 (printer buffer)
+       mvi     h,0ffh
+       call    osbyte
+       mov     a,h
+       cpi     10              ; 10 characters left?
+       mvi     a,0             ; if pos, yes r better
+       rp
+       mvi     a,0ffh
+       ret
+ENDIF  ;torch
+
+IF torch
+       mvi     a,5             ; got to select the real printer (par. port)
+       mvi     l,1             ; ie FX 5,1
+       call    osbyte
+ENDIF  ;torch
+
+IF iobyte       ;[33]
+        call    bprtst          ; get status
+ENDIF   ;iobyte[33]
+
+IF torch
+       push    psw
+       mvi     a,5             ; restore serial line = printer
+       mvi     l,2             ; ie FX 5,2
+       call    osbyte
+       pop     psw             ; return with code in a
+ENDIF  ;torch
+
+
+IF NOT iobyte   ;[33]
+        xra     a               ; assume it is ok.. this may not be necessary
+ENDIF   ;iobyte [33]
+        ret
+;\f
+;
+;       outlpt - output character in E to printer
+;       console is selected.
+;       preserves de.
+outlpt:
+        push    d               ; save DE in either case
+        call    prtflt          ; go through printer filter [30]
+        ana     a               ; if A = 0 do nothing,
+        jz      outlp1          ; [30] if a=0 do nothing
+
+IF torch        ;[30] Must set printer routed to par port
+        mvi     a,5             ; fx 5,1 (parallel port selected for printer)
+        mvi     l,1             ; Modified for new osbyte form [32]
+        call    osbyte
+ENDIF   ;torch [30]
+
+IF NOT iobyt
+        mvi     c,lstout
+        call    bdos            ;Char to printer
+ENDIF;NOT iobyt
+IF iobyt
+        mov     c,e
+        call    blsout
+ENDIF;iobyt
+IF torch        ; re-route printer to serial port => faster tx bytes to line [30]
+        mvi     a,5             ; Modified for new Osbyte form [32]
+        mvi     l,2             ;fx 5,2
+        call    osbyte
+        mvi     a,6
+        mvi     l,0             ;fx 6,0
+        call    osbyte
+ENDIF   ;torch [30]
+
+outlp1: pop     d               ; restore saved register pair
+        ret
+;\f
+;
+;       Screen manipulation routines
+;       csrpos - move to row B, column C
+;
+;       csrpos for terminals that use a leadin sequence followed
+;        by (row + 31.) and (column + 31.)
+;
+IF brain
+csrpos: push    b               ; save coordinates
+        lxi     d,curldn        ; get cursor leadin sequence
+        call    prtstr          ; print it
+        pop     h               ; restore coordinates
+        mov     a,h             ; get row
+        adi     (' '-1)         ; space is row one
+        mov     e,a
+        push    h
+        call    outcon          ; output row
+        pop     h
+        mov     a,l             ; get column
+        adi     (' '-1)         ; space is column one
+        mov     e,a
+        jmp     outcon          ; output it and return
+ENDIF;brain
+;
+;
+IF torch
+csrpos: push    b               ; save coordinates
+        lxi     d,curldn        ; get cursor leadin sequence
+        call    prtstr          ; print it
+        pop     h               ; restore coordinates
+        mov     a,l             ; [obs] get column
+        adi     0ffh            ; NULL is column one
+        mov     e,a
+        push    h
+        call    outcon          ; output row
+        pop     h
+        mov     a,h             ; [obs] get row
+        adi     0ffh            ; NULL (ie decrement) is row one
+        mov     e,a
+        jmp     outcon          ; output it and return
+ENDIF;torch 
+;
+;
+; delchr - make delete look like a backspace.  Unless delete is a printing
+;       character, we just need to print a backspace. (we'll output clrspc
+;       afterwards)
+;       For Kaypro and Vector General, delete puts a blotch on the screen.
+;       For Apple and Osborne 1, delete moves but doesn't print.
+delchr:
+
+
+IF NOT torch ;[22]
+        mvi     e,bs            ;get a backspace
+        jmp     outcon
+ENDIF;NOT torch
+
+; erase the character at the current cursor position
+clrspc: mvi     e,' '
+        call    outcon
+        mvi     e,bs            ;get a backspace
+        jmp     outcon
+
+; erase the current line
+clrlin: lxi     d,eralin
+        jmp     prtstr
+
+; erase the whole screen, and go home. preserves b (but not c)
+clrtop: lxi     d,erascr
+        jmp     prtstr
+
+
+IF torch        ;[13]
+;
+; OSBYTE call from Torch to BBC Base Processor.
+;
+;               A register has osbyte type
+;               H register has equivalent Y register of 6502
+;               L register has equivalent X register of 6502
+;
+;               Results (X and Y) are returned in HL respectively
+;
+;
+
+usrimm  equ     0ffc0h          ; MCP user function [32]
+tx      equ     0ffc3h          ; tx routine to talk to base board proc.
+rx      equ     0ffc6h          ; rx ditto
+txbyte  equ     0ffc9h          ; send C to base processor [32]
+
+osbyte:                         ; Osbyte rewritten [32]
+        push    b               ; Keep these
+        mov     b,a             ; Local copy - use in a moment
+        call    usrimm          ; MCP osbyte function
+        db      15
+        mov     c,b             ; Osbyte function
+        call    txbyte
+        mov     c,l             ; 6502 X register
+        call    txbyte
+        mov     c,h             ; 6502 Y register
+        call    txbyte
+        call    rx              ; fetch results
+        mov     l,a             ; X returned
+        sta     xx              ; save just in case...
+        call    rx
+        mov     h,a             ; Y returned
+        sta     yy
+        mov     a,b             ; return A as called
+        pop     b
+        ret                     
+
+xx:     db      0
+yy:     db      0               ; temporary space
+
+prinuse:db      0               ; 0=> fast tx, <>0 => slow tx to serial pt. [30]
+
+ENDIF   ;torch [13]
+
+IF pci2651     ; whatever version
+sysver:        db      'Ithaca Intersystems S100$'
+ENDIF  ;pci2651
+
+IF ncrdmv      ; whatever version
+sysver:        db      'NCR DecisionMate V$'
+ENDIF  ;ncrdmv
+
+IF torch       ; whatever version
+ttytyp:
+sysver:        db      'Torch Unicorn 5 '
+       db      '$'     ; stop here for now, otherwise say..
+       db      ' MCP version '
+       db      '1.00   $'      ; or whatever...
+ENDIF  ;torch
+
+; Assume MCP - CCCP ROMS greater than 1
+;mcpver:       db      'x.x $'
+;outlin:       db      esc,'*',cr,lf,tab,'$'
+;eralin:       db      cr,esc,'&$'             ;Clear to end of line.
+;erascr:       db      esc,'*$'                ;Clear screen and go home.
+;curldn:       db      esc,'=$'                ;Cursor lead-in
+;ttab:                                 ;Table start location.
+;ta:   
+       db      esc,'!$',0              ;Cursor up.
+;tb:   db      0ah,'$',0,0             ;Cursor down.
+;tc:   db      esc,'+$',0              ;Cursor right.
+;td:   db      08h,'$',0,0             ;Cursor left.
+;te:   db      esc,'*$',0              ;Clear screen and home cursor
+;tf:   db      '$',0,0,0               ;(can't) Enter Graphics mode
+;tg:   db      '$',0,0,0               ;(can't) Exit Graphics mode
+;th:   db      esc,'>$',0              ;Cursor home.
+;ti:   db      '$',0,0,0               ;(Can't) reverse linefeed
+;tj:   db      esc,'%$',0              ; Clear to end of screen
+;tk:   db      esc,'&$',0              ; Clear to end of line.
+
+
+;Older message for MCP - CCCP verstion less than 1
+;ooutli:       db      0ch,cr,lf,tab,tab,'$';
+;oerali:       db      '$',0,0,0               ;Clear to end of line.
+;oerasc:       db      0ch,'$',0               ;Clear screen and go home.
+;ocurld:       db      1fh,'$',0               ;Cursor lead-in
+;ottab:                                        ;Table start location.
+;      db      0bh,'$',0,0             ;Cursor up.
+;      db      0ah,'$',0,0             ;Cursor down.
+;      db      09h,'$',0,0             ;Cursor right.
+;      db      08h,'$',0,0             ;Cursor left.
+;      db      0ch,'$',0,0             ;Clear screen and home cursor
+;      db      '$',0,0,0               ;(can't) Enter Graphics mode
+;      db      '$',0,0,0               ;(can't) Exit Graphics mode
+;      db      1eh,'$',0,0             ;Cursor home.
+;      db      0bh,'$',0,0             ;reverse linfeed
+;      db      '$',0,0,0               ;(Can't) Clear to end of screen
+;      db      '$',0,0,0               ;(Can't) Clear to end of line.
+;
+;Specials
+;spac15:       db      '               '
+;      db      bs,bs,bs,bs,bs,bs,bs,bs,bs,bs,bs,bs,bs,bs,bs,'$';
+;spac80:       db      cr
+;      db      '                                        '
+;      db      '                                        '
+;      db      bs,cr,'$'       ;80 spaces, bs and then back to line start
+;
+
+IF torch       ; Should be IF ker08 AND torch...
+       db      '$'                     ; to terminate the ID string
+outlin:        db      0ch,cr,lf,tab,tab,'$'
+eralin:        db      '$',0,0,0               ;Clear to end of line.
+erascr:        db      0ch,'$',0               ;Clear screen and go home.
+curldn:        db      1fh,'$',0               ;Cursor lead-in
+ttab:                                  ;Table start location.
+ta:    db      0bh,'$',0,0             ;Cursor up.
+tb:    db      0ah,'$',0,0             ;Cursor down.
+tc:    db      09h,'$',0,0             ;Cursor right.
+td:    db      08h,'$',0,0             ;Cursor left.
+te:    db      0ch,'$',0,0             ;Clear screen and home cursor
+tf:    db      '$',0,0,0               ;(can't) Enter Graphics mode
+tg:    db      '$',0,0,0               ;(can't) Exit Graphics mode
+th:    db      1eh,'$',0,0             ;Cursor home.
+ti:    db      0bh,'$',0,0             ;reverse linfeed
+tj:    db      '$',0,0,0               ;(Can't) Clear to end of screen
+tk:    db      '$',0,0,0               ;(Can't) Clear to end of line.
+
+;Specials
+spac15:        db      '               '
+       db      bs,bs,bs,bs,bs,bs,bs,bs,bs,bs,bs,bs,bs,bs,bs,'$';
+spac80:        db      cr
+       db      '                                        '
+       db      '                                        '
+       db      bs,cr,'$'       ;80 spaces, bs and then back to line start
+
+ENDIF;ker08 AND torch     [13]
+
+IF brain
+sysver:        db      'Intertec SuperBrain$'
+outlin:        db      ('A'-100O),esc,'~k',cr,lf,tab,tab,'$'
+erascr:        db      ('A'-100O),esc,'~k$'    ;Clear screen and go home.
+eralin:        db      cr,esc,'~K$'            ;Clear line.
+curldn:        db      esc,'Y$'                ; leadin for cursor positioning
+ttab:                                  ;Table start location.
+ta:    db      ('K'-100O),'$',0,0      ;Cursor up.
+tb:    db      12O,'$',0,0             ;Cursor down.
+tc:    db      ('F'-100O),'$',0,0      ;Cursor right.
+td:    db      '$',0,0,0               ;(can't) Cursor left
+te:    db      '$',0,0,0               ;(can't) Clear display
+tf:    db      '$',0,0,0               ;(can't) Enter graphics mode
+tg:    db      '$',0,0,0               ;(can't) Exit graphics mode
+th:    db      ('A'-100O),'$',0,0      ;Cursor home.
+ti:    db      ('K'-100O),'$',0,0      ;Reverse linefeed.
+tj:    db      esc,'~k$',0             ;Clear to end of screen.
+tk:    db      esc,'~K$',0             ;Clear to end of line.
+ENDIF;brain
+
+IF lasm and not termin ; we dont want CPXVDU
+ovlend equ     $               ;Overlay end - start buffer
+       end
+ENDIF  ;lasm and not termin
+
+IF lasm; we want a terminal
+LINK CPXVDU.ASM
+ENDIF  ;lasm
+\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a
diff --git a/cpxtyp.asm b/cpxtyp.asm
new file mode 100644 (file)
index 0000000..28b65b3
--- /dev/null
@@ -0,0 +1,722 @@
+; CPXTYP.ASM
+;       KERMIT - (Celtic for "FREE")
+;
+;       This is the CP/M-80 implementation of the Columbia University
+;       KERMIT file transfer protocol.
+;
+;       Version 4.0
+;
+;       Copyright June 1981,1982,1983,1984,1985
+;       Columbia University
+;
+; Originally written by Bill Catchings of the Columbia University Center for
+; Computing Activities, 612 W. 115th St., New York, NY 10025.
+;
+; Contributions by Frank da Cruz, Daphne Tzoar, Bernie Eiben,
+; Bruce Tanner, Nick Bush, Greg Small, Kimmo Laaksonen, Jeff Damens, and many
+; others.
+;
+;       This is the header file for building the system-dependent overlay
+;       for KERMIT.  It contains the definitions used to select the target
+;       system, and collects (via INCLUDE or LINK directives) the remaining
+;       code.  If the target system is one of the supported systems
+;       described below, then this is the only file that needs to be
+;       edited.
+;
+; revision history:
+;
+;edit 34, 10-Jan-1991 by MF. Put in "terminal required" notation for
+;      more machines that need terminals.
+;edit 33, 9-Jan-1991 by MF. Put in "terminal required" notation for Access
+;      Matrix and eliminated an extra "sysfam set FALSE" when torfam set TRUE
+;edit 32, 7-Jan-1991 by MF. Added code by Jay. S. Rouman to support the
+;      Ampro Little Board (see CPXBBI.ASM).
+;      Also put in a couple of missing .printx's
+;edit 31, 2-Nov-1990 by MF.  Moved overlay address to 7000H.
+;edit 30, 14-Sep-1990 by MF. Added INCOMPLETE-FILE flag for SET
+;      INCOMPLETE-FILE
+;edit 29, 11-Sep-1990 by MF.  Moved overlay address for version 4.10.
+;      to 6C00H.
+; edit 28, 1st September 1990 by Russell Lang, rjl@monu1.cc.monash.edu.au
+;      Added support for MicroBee (CPXBEE.ASM).
+;
+; edit 27, 28-Aug-89 by Mike Freeman, Bonneville Power Administration,
+;      P.O. Box 491, Vancouver WA 98666 USA:  add support for Hewlett-
+;      Packard HP-125 "Business Assistant" computer using a HP-modified
+       ;CP/M Version 2.2.
+;
+; edit 26, 2 December, by OBSchou.  Added code for CP/M-80 Kermit to
+;      run on an IBM-PC under Z80MU.  Perverse??  No, its to allow testing
+;      of independent code on a PC running CP/M kermit.
+;
+; edit 25, 27 October, 1987 by OBSchou.  Merged in Sanyo, CompuPro, Genie
+;      and TRS Model 4 code, and added four new families.
+;      CPXSYO.ASM for the Sanyo, CPXPRO.ASM for the Compupro,
+;      CPXTRS.ASM for the TRS-80 Model 4, CPXGNI.ASM for the Genie.
+;      Many thanks to G. Smith for these latter two systems.   Also
+;      added the WYSE 100 Terminal type to the VDU table.
+;
+; edit 24, 17 July, 1987 by OBSchou.  Added (hopefully) code from
+;      CP/M Kermit 3.5 (WOW) for the Heath 8. (h8quad)  The actual code
+;      has been put into the CPXHEA.ASM family file, but I do not actually
+;      *KNOW* if this new version works.  Anyone willing to test it out??
+;
+; edit 23 16 July, 1987 for for Will Rose:
+;      edit of 15 Jan 1987 by C W Rose
+;      Added code for Micromint SB180 and Ampro 230 terminal.
+;
+;      edit of 10 Apr 87 by C W Rose
+;      Amended code for pci2651 to handle Telecom Merlin M2215.
+;      (8085 at 5 MHz, 2651 USART, port TTY1:, Ampro 230 terminal equivalent).
+;      
+;      edit of 13 Jul 1987 by C W Rose
+;       Added Micromint SB180 with 6/9 MHz. option.
+;
+; edit 22, 15th July, 1987 by OBSchou for David Moore.  
+;      David submitted a paper copy of Kermit 4.05 overlay for a Teletek
+;      system:  I have (hopefully) correctly appended his code.  He also
+;      send in the code for ADM 22 terminals.
+;
+; edit 21, 14 July, 1986 by OBSchou for John Shearwood of Birmingham 
+;      University.  His edits:
+;      edit of Apr 7th, 1987 by JA Shearwood.  Added entry for Cifer Aux port
+;      edit of Mar 24 1987 by JA Shearwood, Birmingham.  Added code for Cifer
+;      1886 with CP/M Plus
+;
+;      Also added in code from Chris Miles:
+;      edit of 19 May 26, 1987 by C.J.MILES@UMRCC.
+;      Kaypro II, Xerox 820 and Big Board II code seperated
+;      from CPXSYS.ASM and put in a new family file called
+;      CPXBBI.ASM.
+;
+;      Finally added code from MJ Carter of Nottingham University:
+;      edit 16a of 5th Mar 1987 by M J Carter, Nottingham Uni [majoc], to add
+;       entry for OEM ScreenTyper (scntpr).  See also CPXFRK.ASM ("fork"),
+;       the tail end of CPXLNK.ASM, and the Heath-Zenith family file
+;       CPXHEA.ASM (heath, z100, telcon, and scntpr).
+;
+;      [Note: Martins CPXFRK is another version of CPXSWT.ASM]
+;
+;
+; edit 20, 21 May 1987 by OBSchou for Colin Burns of the Institute 
+;      of Neurological Sciences, Glasgow.  Added flag for Hazeltine 1500
+;      VDU (h1500)
+;
+; edit 19, 6th April, 1987 by OBSchou.
+;      Added in EQUs for Amstrad 664 and 6128 machines (CPC) and NCR
+;      Decsision mate V, bot sets of code submitted by Chris Miles of
+;      Manchester University.  NCR code is similar to the PCI2651 code, so
+;      NCRDMV chains to CPXTOR.ASM.  CPC cahins to the modified CPXPCW file
+;      as submitted by Chris.  *** NOTE *** All Amstrad versions require
+;      CP/M 3, so the 664 version must both have the system upgraded to 
+;      CP/M 3 and have an aditional RAM pack.  All Amstrad systems require
+;      a serial interface.
+;
+; edit 18, 30 March, 1986. OBSchou.
+;      * * * Here Begineth kermit-80 Version 4.09 * * *
+;
+;      Biggest change is the overlay address has been moved (again) to 6000h
+;      and the files have all been diced into families.  M80 (almost) back 
+;      in, though I have found some bugs.  Will worry about those later.
+;      CPXSYS.ASM (CP4SYS.ASM in V4.05) now is a family file as well.  
+;
+;      Comments and all that would be much appreciated.
+;
+;      Bertil Schou,
+;      The Computer Centre,
+;      Loughborough University of Technology, 
+;      Loughborough
+;      Leicestershire,  LE11 3TU
+;      Great Britain
+;
+;      tel (0509) 222313
+;      E-Mail (Janet) OBSchou at LOUGHBOROUGH.MULTICS
+;
+;
+; edit 17, March 15, by OBSchou to add in support for M80 Macro Assembler.
+;       Now its a little messy using the M80 Assembler,asn we have family files
+;       and how are we gonna tell M80 what files to use?
+;       Sort of Simple: we generate a set of EQUs that only INCLUDE the family
+;       file being assembled.  I hope.
+;
+; edit 16 Dec 1st, 1986 by OBSchou.  Added entry for Amstrad PCW range (PCW)
+;      Code in Family file CPXPCW.ASM, submitted by Ian Young of Lattice 
+;      Logic Systems.
+;
+; Edit 15 June 20 1986.  Had to chand org address to 5000h to give room for
+;       multi-fcb space for DIR command and other additions in the system
+;       indepentent part.  This starts Kermit-80 version 4.08...
+;
+; Edit 14: March 20, 1986 by OBSchou Loughborough University for 
+;       B Robertson, Aberdeen Univ. Computing Centre.
+;       Add support for APPLE II with serial cards based on the 6850 ACIA.
+;       Mod 380Z support to allow both MDS (5 1/4" discs) and FDS (8" discs)
+;       configurations.  Any mistakes on this merge all my fault (OBSchou)
+;
+; edit 13 22 April, 1986 by OBSchou Loughborough University
+;       Changed org address to 4000h to allow for mods to the system
+;       independent part for kermit version 4.06
+;
+; edit 12 5 Febuary, 1986 by OBSchou
+;       merged in conditionals for Epson PX8 (px8). Code from Tony Addyman
+;       Salford University, England.
+;       Added code from other contibutors for Basic Northstar (basicns), 
+;       Access-Matrix (access), US Micro Sales s1008 (s1008),
+;       Micro Mate (mmate), A.C.E. Discovery (disc).  
+;       These I cannot test: please send comments back if these are buggy.
+;
+; edit 11 29 January 1985 by OBSchou @ multics.lut.ac.uk
+;       added in code for 2651 USART for use with CP/M and a VDU
+;
+; edit 10: 21 November, 1985 by ajcole @ leeds.ai
+;       Merged in support for the following:
+;       North Star Horizon without SIO-4 (horizon)
+;       Comart Communicator (comart)
+;       Cromemco TU-ART interface (cmemco)
+;       TVI912/920 VDUs (tvi912)
+;
+; edit 9 24 October by OBSchou.  Merged code from B Robertson from
+;       Aberdeen University.  He writes:
+;       September 20, 1985 by B Robertson, Aberdeen Univ. Computing Centre.
+;       Add support for Research Machines 380Z, North Star Advantage, Acorn
+;       BBC with Z80 co-processor and APPLE II with Mountain Computers CPS
+;       Multifunction card.
+;
+; edit 8: 11 October, 1985 by OBSchou
+;       tidied up code around Superbrain main/aux port business
+;
+; edit 7: 11 June, 1985 by O B Schou, Loughborough University of Tech.
+;       Loughborough, Leics, England.
+;       Added code for Torch (Second processor to BBC-B) and Cifer 1886
+;       Hopefully this code will work with Torchpacks, and Cifer 26xx
+;       and 28xx series computers.  Edits marked by OBS
+;
+; edit 6: 9-Feb-85 by CJC
+;       Merge Northstar Horizon, Lobo MAX, and Xerox 820 changes:
+;       13-Dec-84 Add Northstar Horizon with SIO-4 board, port 5 at 1200 [CSM]
+;       13-Jan-85 by Vanya J.Cooper Pima Commun. College Tel: 602-884-6809
+;
+;pcc001 27-Dec-84       vjc     modules: cp4sys,cp4typ
+;       Add conditional for Xerox 820.  I thought at first I could
+;       live with the kaypro conditional, but it's enough of a pain
+;       that I added it back in.  The clear-to-end-of-screen char
+;       is different,  breaking many programs in VT52 mode, and the
+;       default escape char control-\, is not at all obvious how
+;       to type on the 820 keyboard.  If you muddle through the
+;       key translation table, it turns out to be control-comma.
+;       Rather than OR xer820 all the occurances of kpII conditionals
+;       I added a bbI conditional for all common code for the big
+;       board I based machines that is automatically turned on by
+;       either kpII or xer820.  This will also make it easier in
+;       the future if another flavor of bigboard is added.
+;
+;pcc010 2-Jan-85        vjc     modules:cp4pkt,cp4typ
+;       Control-C during send or recieve clobbers some of the screen
+;       and doesn't look nice.  Position the cursor to end of screen
+;       before returning to main loop.
+;
+;pcc013 8-Jan-85        vjc     modules:cp4mit,cp4utl,cp4typ
+;       Replace CLOSE command to cancel session logging to SET
+;       LOGGING ON/OFF.  This seems to fit in with the command
+;       structure better.  Default the log file to KERMIT.LOG
+;       incase no previous LOG command.  Logging is also enabled
+;       by LOG command, as before.
+;
+; edit 5: October 13, 1984 by L M Jones, JCC, for New York Botanical Garden
+;       Add support for CPT-85xx series of word processors when running CP/M.
+;
+; edit 4: August 29, 1984 by Bdale Garbee @ CMU
+;       Add support for Digicomp Delphi 100 and Netronics Smartvid terminal.
+;
+; edit 3: July 27, 1984 (CJC)
+;       Shuffle files around for easier assembly by both M80 and LASM.
+;
+; edit 2: June 4, 1984 [Toad Hall]
+;       Added Morrow Decision I (the big S100 bus sucker, not the
+;       little single motherboard one); added Toad Hall TACTrap to deal
+;       with those working through a TAC and its intercept character.
+;
+; edit 1: May, 1984 (CJC)
+;       extracted from CPMBASE.M80 version 3.9; modifications are described
+;       in the accompanying .UPD file.
+;
+
+FALSE  EQU     0
+TRUE   EQU     NOT FALSE
+
+;
+; Assembler type.  Define the appropriate one TRUE, the rest FALSE.  (We can't
+; use ASM, because it cannot handle multiple input files)
+mac80  EQU     FALSE           ; For assembly via MAC80 cross-assembler.
+m80    EQU     FALSE           ; For assembly via Microsoft's M80.
+lasm   EQU     TRUE            ; For assembly via LASM, a public-domain
+                               ; assembler.
+;
+;       Address at which the overlay should be loaded.  This will not
+;       change often (no more than once per version of KERMIT); it should
+;       be updated when a new version of KERMIT is released.
+;
+
+ovladr EQU     7000H           ; [18] address = 6c00h for Kermit v4.10
+                               ;[MF]...
+
+cpsker EQU     FALSE           ; building the system-dependent part...
+
+; SET some options to FALSE, then SET  them TRUE if needed
+iobyt  SET     FALSE           ;assume we dont want IOBYTE..
+inout  SET     FALSE           ;... or IN/OUT code
+termin SET     FALSE           ; we are not using a terminal
+; Also set the CPU speed to a default 2.0 Mhz
+cpuspd SET     20              ; default to 2 Mhz, in case we dont know
+; Assume kit is Z80 based, and set z80 false for non z80 systems.
+;z80   SET     TRUE
+
+;Which CP/M system hardware are we building KERMIT-80 for?
+;One of the following should be TRUE, the rest FALSE:
+;
+;We have basically three "classes" of systems:
+
+;Systems supporting the IO-redirection via I/O-Byte
+
+bbc    EQU     FALSE           ;[9] Acorn BBC model B
+;added code by JAS
+cifer2  EQU     FALSE          ; Cifer 1886 using io byte flipping [OBS]
+cifer3  EQU    FALSE           ; Cifer 1886 with CP/M Plus [JAS]
+                               ;  (Not IOBYTE but easier to keep together)
+cifaux  EQU     FALSE          ; One of above Cifers using AUX port else VL port
+dmII   EQU     FALSE           ;"Generic" KERMIT-80 for DECMATE II.
+gener  EQU     FALSE           ;"Generic" Kermit-80, CP/M calls only.
+                               ; (terminal required)
+mikko  EQU     FALSE           ;"Generic" KERMIT-80 for MikroMikko
+robin  EQU     FALSE           ;DEC VT180 = Generic + VT100 screen control
+
+;.. \and Systems supporting direct IN / OUT handling of ports
+advant EQU     FALSE           ;[10] North Star Advantage
+access EQU     FALSE           ; Access Matrix .. uses port J5 [12]
+                               ; (terminal required) [MF]
+ampro  EQU     FALSE           ; Ampro Little Board (terminal required)
+basicns        EQU     FALSE           ; Basic Northstar using printer port (CRT req.)
+bbII   EQU     FALSE           ;BigBoard II (terminal required)
+brainm EQU     FALSE           ;Select Superbrain Main port  **[obs]
+braina EQU     FALSE           ;Select Superbrain AUX port  **[obs]
+comart EQU     FALSE           ;[10] Comart Communicator
+                               ; (terminal required)
+compro EQU     FALSE           ;Compupro Interfacer 4 (or 3) [gv]
+                               ; (terminal required) [MF]
+cpt85xx        EQU     FALSE           ;CPT-85xx word processor w/CPM (set ADM3A TRUE)
+cmemco EQU     FALSE           ;[10] Cromemco (TU-ART) (terminal required)
+delphi EQU     FALSE           ;Digicomp Delphi 100 (terminal required)
+disc   EQU     FALSE           ; Action Computer Enterprises "Discovery"
+                               ; Port B on an 83U user board (CRT required)
+genie  EQU     FALSE           ;Eaca Genie III
+h8quad EQU     FALSE           ;[24] Entry for heath-8.  NOT same as H-89
+heath   EQU     FALSE          ;For Heath/Zenith H89.
+kpII   EQU     FALSE           ;Kaypro-II
+horizon        EQU     FALSE           ;[10] North Star Horizon (mother-board)
+                               ; (terminal required)
+m2215  EQU     FALSE           ; BT Merlin [23] - uses 2651, Terminal rqd
+mmate  EQU     FALSE           ; PMC - 101 MicroMate (Crt required)
+mmdI   EQU     FALSE           ;Morrow Micro Decision I (terminal required)
+mdI    EQU     FALSE           ;Morrow Decision I (the big sucker)
+                               ; (terminal required) [Toad Hall]
+ncrdmv EQU     FALSE           ; NCR Desision Mate V. (2651 USART) (Term rqd.)
+norths EQU     FALSE           ;[CSM] NorthStar Horizon with HSIO-4 board
+                               ; (terminal required)
+pci2651        EQU     FALSE           ; CP/M with 2651 USART.  Needs VDU. [11]
+rm380zm        EQU     FALSE           ;[14] Research Machines 380Z MDS (5.25" discs)
+rm380zf        EQU     FALSE           ;[14] Research Machines 380Z FDS (8" discs)
+s1008  EQU     FALSE           ; US Micro Sales s1008 (Terminal required)
+sb6    EQU     FALSE           ; SB180 6/9 MHz cpu speed conditionals -
+sb9    EQU     FALSE           ;   set one of these to TRUE, - it will
+                               ;   automatically set sb180 TRUE
+                               ; (terminal reqd for Sb-180 systems)
+scntpr  EQU     FALSE          ; [majoc 870305] For OEM ScreenTyper
+sanyo  EQU     FALSE           ;For sanyo mbc-1100 series
+telcon EQU     FALSE           ;For TELCON Zorba portable
+teletek        EQU     FALSE           ; Teletek SYSTEMASTER (terminal rqd)
+trs80lb        EQU     FALSE           ;For Lifeboat 2.25C CP/M Display
+trs80pt        EQU     FALSE           ;For Pickles + Trout CP/M Display
+trsm4  EQU     FALSE           ;TRS80 Model 4 under Montezuma Micro CPM 2.2
+vector EQU     FALSE           ;For Vector Graphics.
+xer820 EQU     FALSE           ;[pcc001] Xerox 820
+z100    EQU     FALSE          ;For Z-100 under CP/M-85.
+
+;.. and Systems doing neither...
+apmmdm EQU     FALSE           ;jb Micromodem II in slot 2
+ap6551 EQU     FALSE           ;jb apple with 6551 ACIA in serial interface
+ap6850 EQU     FALSE           ;[14] Apple with 6850 ACIA in serial interface
+                               ;[14] e.g PACT, SSM AIO, Aristocard
+apcps  EQU     FALSE           ;[9] Apple with CP multifunction card
+cpc    EQU     FALSE           ; Amstrad CPC CP/M Plus computers
+cpm3   EQU     FALSE           ;"Generic" Kermit-80 for CP/M 3.0 (CP/M Plus)
+                               ; (terminal required)
+lobo   EQU     FALSE           ;Lobo Max-80
+osi    EQU     FALSE           ;For Ohio Scientific.
+osbrn1 EQU     FALSE           ;For Osborne 1
+pcw    EQU     FALSE           ; Amstrad PCW 8256/8512 computers
+px8    EQU     FALSE           ;[12] For Epson PX-8
+torch  EQU     FALSE           ;[obs] Torch does comms via Beeb as IO processor
+z80mu  EQU     FALSE           ; CP/M-80 Kermit under z80mu emulator on PC
+hp125  EQU     FALSE           ;[MF]HP-125 Business Assistant, 8-bit data
+                               ; path thru Data Comm 1, 7-bit data path
+                               ; thru Data Comm 2 (requires 8th-bit quoting
+                               ; for binary transfers on Data Comm 2)
+                               ; set VT52 TRUE
+mbee   EQU     FALSE           ; Microbee Systems - Microbee 
+
+;.. and for Micros, like the MDI, which have "terminals of choice", you must
+;select one of these in addition to selecting the micro itself.
+;Also select a terminal for "gener" and "cpm3": use "crt" for the TRUE generic.
+crt    EQU     FALSE           ;Basic CRT, no cursor positioning
+adm3a  EQU     FALSE           ;Adm3a Display (or CPT built-in display)
+adm22  EQU     FALSE           ;ADM 22 terminal
+h1500  EQU     FALSE           ;Hazeltine 1500
+smrtvd EQU     FALSE           ;Netronics Smartvid terminal.
+soroq  EQU     FALSE           ;Soroq IQ-120.. this a guess [OBS]
+am230  EQU     FALSE           ;Ampro 230 [13]
+tvi912 EQU     FALSE           ;[10] TVI912/920
+tvi925 EQU     FALSE           ;TVI925 Display
+                               ; (works for Freedom 100 also)  [Toad Hall]
+vt52   EQU     FALSE           ;VT52 or equivalent (or H19)
+vt100  EQU     FALSE           ;VT100 or equivalent
+wyse   EQU     FALSE           ;Wyse 100 terminal
+;
+; Several systems are basically the same, with very slight variations,
+;      so use common code.  List these sysems below
+;
+cifer  EQU     cifer2 OR cifer3        ; DO NOT TOUCH THIS LINE
+brain  EQU     brainm OR braina        ;For Intertec SuperBrain. **[obs]
+;
+; flag 380Z system if either selected
+;
+rm380z EQU rm380zm OR rm380zf ;[14]
+;
+trs80  EQU     trs80lb OR trs80pt ; if either, flag TRS-80 system.
+bbI    EQU     kpII OR xer820  ;[pcc001] flag for bigboard I
+sb180  EQU     sb6 OR sb9      ; Micromint SB180 (BYTE Oct 85)
+;
+; flag apple system if either selected
+;
+apple  EQU     apmmdm OR ap6551 OR ap6850 OR apcps
+;
+; also set termin(al) TRUE if any terminal selected (crt included)
+termin SET     crt OR adm3a OR adm22 OR h1500 OR smrtvd OR am230
+termin SET     termin OR tvi912 OR tvi925 OR vt52 OR vt100
+termin SET     termin OR wyse OR soroq
+
+; Now set iobyt or inout TRUE for those systems doing so
+; IOBYTE systems...
+IF robin OR dmII OR gener OR mikko OR cifer2 OR bbc;[**obs]
+iobyt  SET     TRUE            ;Short conditional for above
+ENDIF;robin OR dmII OR gener OR cifer2 OR bbc
+
+; INOUT systems...
+IF brain OR vector OR sanyo or compro
+inout  SET     TRUE            ;Short conditional for above
+ENDIF;brain OR vector OR sanyo OR compro
+
+IF heath OR h8quad OR z100 OR trs80 OR telcon OR bbI
+inout  SET     TRUE            ;Short conditional for above
+ENDIF;heath OR h8quad OR z100 OR trs80 OR telcon OR bbI
+
+IF bbII        OR mmdI OR mdI OR delphi OR cpt85xx OR norths   ;running out of room
+inout  SET     TRUE            ;Short conditional for above
+ENDIF;bbII OR mmdI OR mdI OR delphi OR cpt85xx OR norths
+
+IF advant OR rm380z OR comart OR horizon OR cmemco     ;[9] [10] more room here
+inout  SET     TRUE            ;Short conditional for above
+ENDIF;advant OR rm380z OR comart OR horizon OR cmemco
+
+IF pci2651 OR m2215 OR sb180 OR ncrdmv OR teletek;[11] and even more room
+inout  SET     TRUE            ;Short conditional for above
+ENDIF  ;pci2651 OR m2215 OR sb180 OR ncrdmv OR teletek [11]
+
+IF access OR basicns OR        s1008 OR mmate OR disc ; [12]
+inout  SET     TRUE            ;Short conditional for above
+ENDIF ; access OR basicns OR s1008 OR mmate OR disc [12]
+
+IF genie OR trsm4 OR ampro
+inout  SET     TRUE            ;Short conditional for above
+ENDIF ; genie OR trsm4 OR ampro
+
+
+; Toad Hall TAC Trap:  If you're going through a TAC, it will
+; cough on its Intercept Character (usually a @ (* - 40H)).  Sending it
+; twice forces the TAC to recognize it as a valid ASCII character,
+; and it'll send only one on to the host.  If you've SET the TACTrap
+; to OFF, it will be a null character, and nothing will happen.  If you
+; set it on, it will be your selected TAC intercept character (or will
+; default to the common intercept char, '@'.
+; If you never expect to have to work through such a beastie, just set
+; TAC to false and forget all this mess.  [Toad Hall]
+
+tac    EQU     FALSE           ; gonna work through a TAC?
+tacval EQU     '@'             ;Typical TAC intercept character
+
+; Processor speed in units of 100KHz
+; for bbII, kpII, cpt85xx, advance, apple,bbc,px8 & rm380z timing loop [12]
+; We have to set these before CPXCOM to make sure we update the CPU speed.
+
+; The following systems I have no idea of cpu speed. Can anyone oblige??
+;      robin, dmII, mikko, vector, heath, h8quad, z100, scntpr
+;      trs80 (both), telcon, mmdI, mdI, delphi, ncrdmv,
+;      cromemco, teletek, osi, lobo
+
+IF z80mu
+cpuspd SET     2               ; a PC is about 200khz Z80 equivalent
+ENDIF; z80mu
+
+IF apple OR cpt85xx OR px8 OR heath OR h8quad ;[9] [12] What rate is heath?
+cpuspd SET     20              ; Apple Softcard, CPT-85xx: 2.0 MHz
+                               ; ('cause of integral video?)
+ENDIF; apple OR cpt85xx OR px8 OR heath OR h8quad [12]
+
+IF kpII        OR xer820 OR scntpr OR osbrn1 ;[9] What speed is scntpr??
+cpuspd SET     25              ; original Kaypro II,Xerox 820: 2.5 MHz
+ENDIF;kpII OR xer820 OR scntpr OR osbrn1
+
+IF PCW or CPC
+cpuspd SET     33              ; all 4MHz but insterted wait states
+                               ; reduce to an effective 3.3 MHz.
+ENDIF  ;pcw OR cpc
+
+IF brain OR advant OR bbII OR torch OR z100 OR genie OR trsm4
+cpuspd SET     40              ; 4.0 MHz CPU
+ENDIF; brain OR advant OR bbII OR torch OR z100 OR genie OR trsm4
+
+IF cifer OR rm380z OR comart OR horizon OR norths
+cpuspd SET     40              ; 4.0 MHz CPU
+ENDIF; cifer OR rm380z OR comart OR horizon OR norths
+
+IF disc        OR mmate OR s1008 OR access OR basicns ;[29] This is a guess.. Most are 4Mhz
+cpuspd SET     40              ; 4.0 MHz CPU
+ENDIF  ;disc OR mmate OR s1008 OR access OR basicns [29]
+
+IF m2215
+cpuspd SET     50              ; BT Merlin Rair Black Box is 8085 at 5 Mhz
+ENDIF  ;m2215
+
+IF bbc or sb6
+cpuspd SET     60              ; BBC or SB-180 with 6Mhz Z80/61480
+ENDIF;bbc OR sb6
+
+IF sb9
+cpuspd SET     90              ; SB-180 with 9 Mhz clock
+ENDIF;sb9
+
+IF hp125 OR telcon
+cpuspd SET     40              ;[MF]HP125 or TELCON
+ENDIF;hp125 OR telcon 
+
+IF mbee
+cpuspd SET     33              ; Microbee has 3.375MHz Z80
+ENDIF; mbee
+
+; Set Z80 flag FALSE for non Z80 or unknown CPU systems
+IF     FALSE                   ; assume all systems are not z80 based
+;z80   SET     FALSE
+ENDIF  ;FALSE
+
+; Now, lets see what family we are assembling for.  Reset all 
+;      family file to FALSE
+
+torfam  SET     FALSE          ; not Torch family file
+ciffam SET     FALSE           ; not Cifer kit
+appfam SET     FALSE           ; not Apples
+norfam SET     FALSE           ; not North Star kit
+pcwfam SET     FALSE           ; not Amstrad PCW kit
+bbifam SET     FALSE           ; not the BBI family
+heafam SET     FALSE           ; not Heath, Z100, telcon,or screentyper
+sbfam  SET     FALSE           ; not an SB180 system
+merfam SET     FALSE           ; not a BT Merlin system
+sanfam SET     FALSE           ; not a Sanyo
+comfam SET     FALSE           ; not a compupro
+genfam SET     FALSE           ; not a genie
+trsfam SET     FALSE           ; not a trs-80 Model 4
+z80fam SET     FALSE           ; not z80mu system
+beefam SET     FALSE           ; not a Microbee system
+sysfam SET     TRUE            ; ... but assume the worst, and its in
+                               ; the CPXSYS.ASM file
+
+
+IF      (torch OR pci2651 OR ncrdmv OR brain)   ;[15]
+torfam  SET     TRUE            ; we are to use the Torch family file
+.printx * torfam set TRUE *
+;(Yeah, I know, there are more than Torch systems in it)
+ENDIF  ;(torch OR pci2651 OR ncrdmv OR brain) [15]
+
+IF      (cifer)
+ciffam SET     TRUE            ; we are to use the cifer family file
+.printx * ciffam set TRUE *
+ENDIF  ;cifer
+
+IF      apple   ;[15]
+appfam SET     TRUE            ; apples
+.printx * appfam set TRUE *
+ENDIF   ;apple [15]
+
+IF      (horizon OR basicns OR norths OR advant OR comart) ;[15]
+norfam SET     TRUE            ; north star kit
+.printx * norfam set TRUE *
+ENDIF   ;(horizon OR basicns OR norths OR advant OR comart) [15]
+
+IF      (pcw OR cpc)   ;[15]
+pcwfam SET     TRUE            ; Amstrad PCW kit
+.printx * pcwfam set TRUE *
+ENDIF   ;pcw OR cpc [15]
+
+IF      (kpII OR xer820 OR bbII OR ampro)
+bbifam SET     TRUE            ; The Bigboard, Kaypro, Xerox and Ampro family
+.printx * bbifam set TRUE *
+ENDIF  ;(kpII or xer820 OR bbII OR ampro)
+
+IF (heath OR h8quad OR telcon OR z100 OR scntpr)
+heafam SET     TRUE            ; Doing Heath, z100, telcon, or screentyper
+.printx * heafam set TRUE *
+ENDIF   ;(heath OR h8quad OR telcon OR z100 OR scntpr)
+
+IF sb180
+sbfam  SET     TRUE            ; doing an SB180 system
+.printx * sbfam set TRUE *
+ENDIF  ; sb180
+
+IF m2215
+merfam SET     TRUE            ; doing a BT Merlin system
+.printx * merfam set TRUE *
+ENDIF  ; m2215
+
+IF sanyo
+sanfam SET     TRUE            ; doing a Sanyo MBC-1100 system
+.printx * sanfam set TRUE *
+ENDIF  ; sanyo
+
+IF compro
+comfam SET     TRUE            ; doing a Compupro system
+.printx * comfam set TRUE *
+ENDIF  ; compro
+
+IF genie
+genfam SET     TRUE            ; doing a Genie system
+.printx * genfam set TRUE *
+ENDIF  ; genie
+
+IF trsm4
+trsfam SET     TRUE            ; doing a TRS-80 M4 system
+.printx * trsfam set TRUE *
+ENDIF  ; trs4m
+
+IF z80mu
+z80fam SET     TRUE            ; doing a z80mu emulation
+.printx * z80fam set TRUE *
+ENDIF  ; z80mu
+
+IF mbee
+beefam SET     TRUE            ; doing a Microbee system
+.printx * beefam set TRUE *
+ENDIF  ; mbee
+
+; Now, if none of the above, then its the older CPXSYS.ASM file we want
+
+IF (torfam OR ciffam OR appfam OR norfam OR sanfam OR comfam) AND sysfam
+sysfam SET     FALSE           ; Were not doing the CPXSYS.ASM file
+.printx * sysfam set FALSE *
+ENDIF  ; (torfam OR ciffam OR appfam OR norfam OR sanfam OR comfam) AND sysfam
+
+IF (pcwfam OR bbifam OR heafam OR sbfam OR merfam) AND sysfam
+sysfam SET     FALSE           ; Were not doing the CPXSYS.ASM file
+.printx * sysfam set FALSE *
+ENDIF  ; (pcwfam OR bbifam OR heafam OR sbfam OR merfam) AND sysfam
+
+IF (genfam OR trsfam OR z80fam OR beefam) AND sysfam
+sysfam SET     FALSE           ; Were not doing the CPXSYS.ASM file
+.printx * sysfam set FALSE *
+ENDIF  ; (genfam OR trsfam OR z80fam OR mbeefam) AND sysfam
+
+IF sysfam
+.printx * sysfam set TRUE *
+ENDIF
+
+IF lasm
+       LINK    CPSDEF          ; Use the system independent declares
+ENDIF;lasm  [Toad Hall]
+
+; If we're still here, must be M80 or MAC80.  Collect the rest of
+; the sources.
+.sfcond
+
+
+        INCLUDE CPSDEF.ASM      ; common definitions
+        INCLUDE CPXLNK.ASM      ; linkage area description
+       INCLUDE CPXCOM.ASM      ; include common code
+        INCLUDE CPXSWT.ASM      ; this wont do much, but will announce machine
+
+IF      torfam                  ;[15]
+        INCLUDE CPXTOR.ASM      ; we are assembling for Torch, Cifer etc
+ENDIF   ;torfam                 [15]
+
+IF     ciffam
+       INCLUDE CPXCIF.ASM      ; we are assembling for a Cifer
+ENDIF  ;ciffam
+
+IF      appfam                  ;[15]
+        INCLUDE CPXAPP.ASM      ; we are assembling for an apple
+ENDIF   ;appfam                 [15]
+
+IF      norfam                  ;[15]
+        INCLUDE CPXNOR.ASM      ; we are assembling a NortStar machine
+ENDIF   ;norfam                 [15]
+
+IF      pcwfam                  ;[15]
+        INCLUDE CPXPCW.ASM      ; we are assembling for the Amstrad PCW machine
+ENDIF   ;pcwfam                 [15]
+
+IF      bbifam
+        INCLUDE CPXBBI.ASM     ; assembling for BigBoard, Kaypro, Xerox
+                               ; & Ampro Little Board
+ENDIF   ;bbifam
+
+IF      sysfam                  ;[15]
+        INCLUDE CPXSYS.ASM      ; system-dependent code and tables (Part 1)
+        INCLUDE CPXSY2.ASM      ; system-dependent code and tables (Part 2)
+ENDIF   ;sysfam                 [15]
+
+IF     heafam
+       INCLUDE CPXHEA.ASM
+ENDIF  ;heafam
+
+IF     m2215
+       INCLUDE CPXMRL.ASM
+ENDIF  ;m2215
+
+IF     sbfam
+       INCLUDE CPXSB.ASM
+ENDIF  ;sbfam
+
+IF     sanfam
+       INCLUDE CPXSYO.ASM
+ENDIF  ;sanfam
+
+IF     comfam
+       INCLUDE CPXPRO.ASM
+ENDIF  ;comfam
+
+IF     genfam
+       INCLUDE CPXGNI.ASM
+ENDIF  ;genfam
+
+IF     trsfam
+       INCLUDE CPXTM4.ASM
+ENDIF  ;trsfam
+
+IF     z80fam
+       INCLUDE CPXZ80.ASM
+ENDIF  ;z80fam
+
+IF     beefam
+       INCLUDE CPXBEE.ASM
+ENDIF  ;beefam
+
+IF termin                      ; any terminal selected?
+        INCLUDE CPXVDU.ASM      ;[15] Just in case we need a VDU...
+ENDIF  ;termin
+        END
diff --git a/cpxvdu.asm b/cpxvdu.asm
new file mode 100644 (file)
index 0000000..332fd8f
--- /dev/null
@@ -0,0 +1,462 @@
+IF NOT lasm
+.printx * CPXVDU.ASM *
+ENDIF  ;NOT lasm
+;       KERMIT - (Celtic for "FREE")
+;
+;       This is the CP/M-80 implementation of the Columbia University
+;       KERMIT file transfer protocol.
+;
+;       Version 4.0
+;
+;       Copyright June 1981,1982,1983,1984
+;       Columbia University
+;
+; Originally written by Bill Catchings of the Columbia University Center for
+; Computing Activities, 612 W. 115th St., New York, NY 10025.
+;
+; Contributions by Frank da Cruz, Daphne Tzoar, Bernie Eiben,
+; Bruce Tanner, Nick Bush, Greg Small, Kimmo Laaksonen, Jeff Damens, and many
+; others. 
+;
+;edit 6, 12-Oct-1990 by MF.  Added a semicolon to the comment "If we
+;      need cursor ..." so it isn't seen as an undefined symbol
+; edit 5, 20 July by OBSchou.  Put in the cursor positioning code for 
+;      all the terminal supported, and moved the vtval EQUs and defesc EQUs
+;      here if the system requires andn external terminal.  If the system 
+;      has a 'built in' terminal (ie own scrteen driver) you will not come
+;      to this file, so you must declare these three lables etc in your
+;      own code.
+;      This will allow only those systems requiring a terminal to require
+;      CPXVDU.ASM during assembly.
+;
+; edit 4, 16 July, 1987 by OBSchou for will Rose.
+;      Added code for Ampro 230 terminal
+;
+; edit 3, 15 July, 1987 by OBSchou for David Moore.  Added adm22 terminal
+;      codes.
+;
+; edit 2 21 May, 1987 by OBSchou.  Added in definitions for Hazeltine 1500
+;      submitted by Colin Burns of the Institute of Neurological Sciences
+;      in Glasgow.
+; edit 1 ???  date. Split the terminal codes off from the CPXSYS.ASM file
+;
+vduver:        db      'CPXVDU.ASM  (6)  12-Oct-1990 $' ;file, edit version,, date.
+
+
+; First, print out what terminal (if any) we are assembling for
+
+IF crt
+.printx        * generic CRT selected *
+ENDIF
+
+IF adm3a
+.printx        * ADM3A selected *
+ENDIF
+
+IF adm22
+.printx        * ADM22 selected *
+ENDIF
+
+IF smrtvd      ;[7]
+.printx        * Netronics Smartvid-80 selected *
+ENDIF          ;[7]
+
+IF tvi912
+.printx        * TVI912/920 selected *
+ENDIF
+
+IF tvi925
+.printx        * TVI925 selected *
+ENDIF
+
+IF vt52
+.printx        * VT52 selected *
+ENDIF
+
+IF vt100
+.printx        * VT100 selected *
+ENDIF
+
+IF am230
+.printx * Ampro 230 terminal selected *
+ENDIF
+
+IF wyse
+.printx * Wyse 100 terminal selected *
+ENDIF
+;
+
+;\f
+; If we need cursor positioning, here is the code to do it 
+;
+;       Screen manipulation routines
+;       csrpos - move to row B, column C
+;
+;       csrpos for terminals that use a leadin sequence followed
+;        by (row + 31.) and (column + 31.)
+;
+IF NOT (vt100 OR crt OR h1500)
+csrpos: push    b               ; save coordinates
+        lxi     d,curldn        ; get cursor leadin sequence
+        call    prtstr          ; print it
+        pop     h               ; restore coordinates
+        mov     a,h             ; get row
+        adi     (' '-1)         ; space is row one
+        mov     e,a
+        push    h
+        call    outcon          ; output row
+        pop     h
+        mov     a,l             ; get column
+        adi     (' '-1)         ; space is column one
+        mov     e,a
+        jmp     outcon          ; output it and return
+ENDIF;NOT (vt100 OR crt OR h1500)
+;
+;
+;
+;
+;       csrpos for ANSI terminals
+;
+IF vt100
+csrpos: push    b               ; save coordinates
+        lxi     d,curldn        ; get cursor leadin sequence
+        call    prtstr          ; print it
+        pop     h               ; peek at coordinates
+        push    h               ;  then save away again
+        mov     l,h             ; l = row
+        mvi     h,0             ; hl = row
+        call    nout            ; output in decimal
+        mvi     e,';'           ; follow with semicolon
+        call    outcon          ; print it
+        pop     h               ; restore column
+        mvi     h,0             ; hl = column
+        call    nout
+        mvi     e,'H'           ; terminate with 'move cursor' command
+        jmp     outcon          ; output it and return
+ENDIF;vt100
+
+;Definition for Hazeltine 1500  does things a little strange.
+;
+IF h1500
+csrpos: push    b               ; save coordinates
+        lxi     d,curldn        ; get cursor leadin sequence
+        call    prtstr          ; print it
+        pop     h               ; restore coordinates
+        mov     a,l             ; get col
+        nop
+       nop
+;      adi     (' '-1)         ; space is row one
+        mov     e,a
+        push    h
+        call    outcon          ; output row
+        pop     h
+        mov     a,h             ; get row
+        adi     (' '-1)         ; space is column one
+        mov     e,a
+        jmp     outcon          ; output it and return
+ENDIF; h1500
+
+
+IF crt                         ; systems without cursor positioning
+csrpos: ret                    ; dummy routine referenced by linkage section
+ENDIF;crt
+;
+;
+;
+; Now for the rest of CPXVDU.ASM
+;
+;
+;
+IF crt         ;Set flags etc for systems with CRT selected
+defesc  EQU     '\'-100O        ;Still Control-\ (just ran out of room...)
+vtval   EQU     0FFH            ;  we can't support VT52 emulation
+ttytyp:        db      'Generic (Dumb) CRT Terminal type selected $'
+ENDIF;crt
+
+;\f
+
+IF vt52                ; DEC VT52
+ttytyp:        db      'VT52$'
+ENDIF;vt52
+
+IF vt52
+vtval  EQU     0       ; we don't need VT52 emulation
+defesc EQU     '\'-100O        ;Still Control-\ (just ran out of room...)
+outlin:        db      esc,'H',esc,'J',cr,lf,tab,tab,'$'
+erascr:        db      esc,'H',esc,'J$'        ;Clear screen and go home.
+eralin:        db      cr,esc,'K$'             ;Clear line.
+curldn:        db      esc,'Y$'                ;cursor leadin
+ttab:                                  ;Table start location.
+ta:    db      esc,'A$',0              ;Cursor up.
+tb:    db      esc,'B$',0              ;Cursor down.
+tc:    db      esc,'C$',0              ;Cursor right.
+td:    db      esc,'D$',0              ;Cursor left
+te:    db      esc,'E$',0              ;Clear display
+tf:    db      esc,'F$',0              ;Enter Graphics Mode
+tg:    db      esc,'G$',0              ;Exit Graphics mode
+th:    db      esc,'H$',0              ;Cursor home.
+ti:    db      esc,'I$',0              ;Reverse linefeed.
+tj:    db      esc,'J$',0              ;Clear to end of screen.
+tk:    db      esc,'K$',0              ;Clear to end of line.
+ENDIF;vt52
+;\f
+
+IF adm22
+vtval  EQU     1               ; we can do VT52 emulation
+defesc EQU     '\'-100O        ;Still Control-\ (just ran out of room...)
+ttytyp:        db      'ADM22$'
+outlin:        db      1ah,cr,lf,tab,tab,'$'
+erascr:        db      1ah,'$'                 ;Clear screen and go home.
+eralin:        db      esc,'>$'                ;Clear line.
+curldn:        db      esc,'=$'                ;Cursor lead-in
+ttab:                                  ;Table start location.
+ta:    db      0BH,'$',0,0             ;Cursor up.
+tb:    db      lf,'$',0,0              ;Cursor down.
+tc:    db      0CH,'$',0,0             ;Cursor right.
+td:    db      bs,'$',0,0              ;Cursor left
+te:    db      1ah,':$',0              ;Clear display
+tf:    db      '$',0,0,0               ;(can't) Enter Graphics Mode
+tg:    db      '$',0,0,0               ;(can't) Exit Graphics mode
+th:    db      1EH,'$',0,0             ;Cursor home.
+ti:    db      0BH,'$',0,0             ;Reverse linefeed.
+tj:    db      esc,'Y$',0              ;Clear to end of screen.
+tk:    db      esc,'T$',0              ;Clear to end of line.
+ENDIF;adm22
+;\f
+
+IF am230
+; Select initial setting for VT-52 emulation flag.
+vtval  EQU     1
+defesc EQU     '\'-100O        ;The default is Control-\ -- it's easier 
+ttytyp:        db      'Am230$'
+outlin:        db      'Z'-64,0,0,cr,lf,'$'
+erascr:        db      'Z'-64,0,0,'$'          ;Clear screen and home
+eralin:        db      esc,'R$',0              ;Erase line
+curldn:        db      cr,esc,'=$'             ;Cursor lead-in
+ttab:  ;Table start location           ;(MUST be 4 bytes each)
+ta:    db      'K'-64,'$',0,0          ;Cursor up, stop at top
+tb:    db      'V'-64,'$',0,0          ;Cursor down, stop at bottom
+tc:    db      'L'-64,'$',0,0          ;Cursor right, stop at right
+td:    db      'H'-64,'$',0,0          ;Cursor left, stop at left
+te:    db      'Z'-64,0,0,'$'          ;Clear display (2 pad nulls)
+tf:    db      '$',0,0,0               ;(can't) Enter Graphics mode
+tg:    db      '$',0,0,0               ;(can't) Exit Graphics mode
+th:    db      1EH,'$',0,0             ;Cursor home
+ti:    db      esc,'j$',0              ;Reverse linefeed, scroll
+tj:    db      esc,'Y$',0              ;Clear to end of sreen
+tk:    db      esc,'T$',0              ;Clear to end of line
+ENDIF
+;
+;\f
+
+
+IF vt100
+ttytyp:        db      'VT100$'
+ENDIF;vt100
+
+
+IF vt100
+; Note that we cannot support Graphics Mode or the H19 erase-screen command
+; (<esc>E), because the sequences are more than three bytes.
+defesc EQU     '\'-100O        ;Still Control-\ (just ran out of room...)
+vtval  EQU     0               ; we probably don't want VT52 emulation
+outlin:        db      esc,3CH,esc,'[H',esc,'[J',cr,lf,tab,tab,'$'
+erascr:        db      esc,'[H',esc,'[J$'      ;Clear screen and go home.
+eralin:        db      cr,esc,'[K$'            ;Clear line.
+curldn:        db      esc,'[$'                ; Cursor leadin
+ttab:
+ta:    db      esc,'[A$'               ; Cursor up.
+tb:    db      esc,'[B$'               ; Cursor down.
+tc:    db      esc,'[C$'               ; Cursor right.
+td:    db      esc,'[D$'               ; Cursor left
+te:    db      '$',0,0,0               ; (can't) Clear display
+tf:    db      '$',0,0,0               ; (don't) Enter Graphics Mode
+tg:    db      '$',0,0,0               ; (don't) Exit Graphics mode
+th:    db      esc,'[H$'               ; Cursor home.
+ti:    db      esc,'M$',0              ; Reverse linefeed.
+tj:    db      esc,'[J$'               ; Clear to end of screen.
+tk:    db      esc,'[K$'               ; Clear to end of line.
+ENDIF;vt100
+;\f
+
+IF gener or cpm3
+sysver:        db      'Generic CP/M-80$'
+ENDIF;gener or cpm3
+
+
+IF soroq                       ;[29]  Should this not be with terminals.....
+ttytyp:        db      'Soroc IQ-120$'
+outlin:        db      1EH,esc,'Y',cr,lf,tab,tab,'$'
+erascr:        db      1EH,esc,'Y$'  ;clear screen and home cursor
+eralin:        db      cr,esc,'T$'  ;clear line
+curldn:        db      esc,'=$'  ;cursor lead-in string
+delstr:        db      bs,' ',bs,bs,'$' ;??adjust for echoing delete
+ttab:                                  ;table start location
+ta:    db      0BH,'$',0               ;cursor up
+tb:    db      0AH,'$',0               ;cursor down
+tc:    db      0CH,'$',0               ;cursor right
+td:    db      08H,'$',0               ;cursor left
+te:    db      esc,'*$',0              ;clear display (homes cursor)
+tf:    db      esc,')$',0              ;enter inverse video mode
+tg:    db      esc,'($',0              ;exit inverse video mode
+th:    db      01EH,'$',0              ;home cursor
+ti:    db      0BH,'$',0               ;reverse linefeed (insert line)
+tj:    db      esc,'Y$',0              ;clear to end of screen
+tk:    db      esc,'T$',0              ;clear to end of line
+ENDIF;soroq
+
+IF crt
+outlin:        db      cr,lf,'Starting ...$'
+erascr equ     crlf                    ;"Home & clear" (best we can do).
+eralin:        db      '^U',cr,lf,'$'          ;Clear line.
+prpack:        db      cr,lf,'RPack: $'
+pspack:        db      cr,lf,'SPack: $'
+ttab   equ     0                       ; no VT52 table
+ENDIF;crt
+;\f
+
+IF tvi912
+vtval  EQU     1               ; we do emulation
+defesc  EQU     '\'-100O        ;Still Control-\ (just ran out of room...)
+ttytyp:        db      'TVI912/920$'
+outlin:        db      'Z'-64,0,0,cr,lf,'$'
+erascr:        db      'Z'-64,0,0,'$'          ;Clear screen and home
+eralin:        db      esc,'Y$',0              ;Clear to end of sreen
+curldn:        db      cr,esc,'=$'             ;Cursor lead-in
+ttab:  ;Table start location           ;(MUST be 4 bytes each)
+ta:    db      'K'-64,'$',0,0          ;Cursor up, stop at top
+tb:    db      'J'-64,'$',0,0          ;Cursor down, stop at bottom
+tc:    db      'L'-64,'$',0,0          ;Cursor right, stop at right
+td:    db      'H'-64,'$',0,0          ;Cursor left, stop at left
+te:    db      'Z'-64,0,0,'$'          ;Clear display (2 pad nulls)
+tf:    db      '$',0,0,0               ;(can't) Enter Graphics mode
+tg:    db      '$',0,0,0               ;(can't) Exit Graphics mode
+th:    db      1EH,'$',0,0             ;Cursor home
+ti:    db      esc,'j$',0              ;Reverse linefeed, scroll
+tj:    db      esc,'Y$',0              ;Clear to end of sreen
+tk:    db      esc,'T$',0              ;Clear to end of line
+ENDIF;tvi912
+;
+;\f
+
+IF tvi925
+;(incidentally, works fine for Freedom 100 also  [Toad Hall])
+;adm3a entry and tvi925 entry separated to remove warning message.
+vtval  EQU     1               ; we VT52 emulation
+defesc  EQU     '\'-100O        ;Still Control-\ (just ran out of room...)
+ttytyp:        db      'TVI925$'
+outlin:        db      'Z'-64,0,0,cr,lf,'$'
+erascr:        db      'Z'-64,0,0,'$'          ;Clear screen and home
+eralin:        db      esc,'Y$',0              ;Clear to end of sreen
+curldn:        db      cr,esc,'=$'             ;Cursor lead-in
+ttab:  ;Table start location           ;(MUST be 4 bytes each)
+ta:    db      'K'-64,'$',0,0          ;Cursor up, stop at top
+tb:    db      'V'-64,'$',0,0          ;Cursor down, stop at bottom
+tc:    db      'L'-64,'$',0,0          ;Cursor right, stop at right
+td:    db      'H'-64,'$',0,0          ;Cursor left, stop at left
+te:    db      'Z'-64,0,0,'$'          ;Clear display (2 pad nulls)
+tf:    db      '$',0,0,0               ;(can't) Enter Graphics mode
+tg:    db      '$',0,0,0               ;(can't) Exit Graphics mode
+th:    db      1EH,'$',0,0             ;Cursor home
+ti:    db      esc,'j$',0              ;Reverse linefeed, scroll
+tj:    db      esc,'Y$',0              ;Clear to end of sreen
+tk:    db      esc,'T$',0              ;Clear to end of line
+ENDIF;tvi925
+;
+;\f
+
+IF adm3a
+defesc  EQU     '\'-100O        ;Still Control-\ (just ran out of room...)
+ttytyp:        db      'ADM3A$'
+outlin:        db      'Z'-64,0,0,cr,lf,'$'
+erascr:        db      'Z'-64,0,0,'$'          ;Clear screen and home
+eralin:        db      esc,'Y$',0              ;Clear to end of sreen
+curldn:        db      cr,esc,'=$'             ;Cursor lead-in
+ttab:  ;Table start location           ;(MUST be 4 bytes each)
+ta:    db      'K'-64,'$',0,0          ;Cursor up, stop at top
+tb:    db      'J'-64,'$',0,0          ;Cursor down CTRL-J
+tc:    db      'L'-64,'$',0,0          ;Cursor right, stop at right
+td:    db      'H'-64,'$',0,0          ;Cursor left, stop at left
+te:    db      'Z'-64,0,0,'$'          ;Clear display (2 pad nulls)
+tf:    db      '$',0,0,0               ;(can't) Enter Graphics mode
+tg:    db      '$',0,0,0               ;(can't) Exit Graphics mode
+th:    db      1EH,'$',0,0             ;Cursor home
+ti:    db      'K'-64,'$',0,0          ;Reverse linefeed
+tj:    db      '$',0,0,0               ;(can't) Clear to end of screen
+tk:    db      '$',0,0,0               ;(can't) Clear to end of line
+ENDIF;adm3a
+
+
+IF smrtvd      ; [7] new terminal
+vtval  EQU     1               ; we do VT52 emulation
+defesc EQU     '\'-100O        ; escpae character, ok?
+ttytyp:        db      'Smartvid-80$'
+outlin:        db      esc,'+',cr,lf,tab,tab,'$'
+eralin:        db      cr,esc,'T$'                     ;Clear to end of line.
+erascr:        db      esc,'+$'                        ;Clear screen and go home.
+curldn:        db      esc,'=$'                        ;Cursor lead-in
+ttab:                                  ;Table start location.
+ta:    db      ('K'-100O),'$',0,0      ;Cursor up.
+tb:    db      12O,'$',0,0             ;Cursor down.
+tc:    db      ('A'-100O),'$',0,0      ;Cursor right.
+td:    db      ('H'-100O),'$',0,0      ;Cursor left.
+te:    db      ('L'-100O),'$',0,0      ;Clear screen and home cursor
+tf:    db      '$',0,0,0               ;(can't) Enter Graphics mode
+tg:    db      '$',0,0,0               ;(can't) Exit Graphics mode
+th:    db      ('Z'-100O),'$',0,0      ;Cursor home.
+ti:    db      ('K'-100O),'$',0,0      ;Reverse linefeed.
+tj:    db      esc,'Y$',0              ;Clear to end of screen.
+tk:    db      esc,'T$',0              ;Clear to end of line.
+ENDIF;smrtvd
+
+IF h1500
+vtval  EQU     1               ; we can do VT52 emulation
+defesc EQU     '\'-100O        ;Still Control-\ (just ran out of room...)
+ttytyp:        db      'Hazeltine$'
+outlin:        db      7eh,1ch,7eh,12h,'$'
+erascr:        db      7eh,1ch,7eh,12h,'$'     ;Clear screen and home
+eralin:        db      7eh,13h,'$',0           ;Clear to end of sreen
+curldn:        db      7eh,11h,'$',0           ;Cursor lead-in
+ttab:  ;Table start location           ;(MUST be 4 bytes each)
+ta:    db      7eh,0ch,'$',0           ;Cursor up, stop at top
+tb:    db      7eh,0bh,'$',0           ;Cursor down CTRL-J
+tc:    db      10h,'$',0,0             ;Cursor right, stop at right
+td:    db      8h,'$',0,0              ;Cursor left, stop at left
+te:    db      7eh,1ch,'$',0           ;Clear display (2 pad nulls)
+tf:    db      '$',0,0,0               ;(can't) Enter Graphics mode
+tg:    db      '$',0,0,0               ;(can't) Exit Graphics mode
+th:    db      7eh,0ch,'$',0           ;Cursor home
+ti:    db      7eh,0ch,'$',0           ;Reverse linefeed
+tj:    db      '$',0,0,0               ;(can't) Clear to end of screen
+tk:    db      7eh,0fh,'$',0           ;Clear to end of line
+ENDIF;h1500
+
+IF wyse ;[gv]
+vtval  equ     1               ; we can do VT52 emulation
+defesc EQU     '\'             ;Still Control-\ (just ran out of room...)
+ttytyp:        db      ' [Wyse 100]',cr,lf,'$'
+outlin: db      esc,'+$',0              ;Clear screen and home
+erascr: db      esc,'+$',0              ;Clear screen and home
+eralin: db      esc,'Y$',0              ;Clear to end of sreen
+curldn: db      cr,esc,'=$'             ;Cursor lead-in
+ttab:   ;Table start location           ;(MUST be 4 bytes each)
+ta:     db      03h,'$',0,0             ;Cursor up, stop at top
+tb:     db      lf,'$',0,0              ;Cursor down, stop at bottom
+tc:     db      ff,'$',0,0              ;Cursor right, stop at right
+td:     db      bs,'$',0,0              ;Cursor left, stop at left
+te:     db      sub,0,0,'$'             ;Clear display (2 pad nulls)
+tf:     db      '$',0,0,0               ;Enter Graphics mode NONE
+tg:     db      '$',0,0,0               ;Exit Graphics mode NONE
+th:     db      1eh,'$',0,0             ;Cursor home
+ti:     db      esc,'v$',0              ;Reverse linefeed, scroll ???
+tj:     db      esc,'Y$',0              ;Clear to end of sreen
+tk:     db      esc,'T$',0              ;Clear to end of line
+ENDIF;wyse
+
+
+
+ovlend equ     $       ; End of overlay
+
+IF lasm                ;Not really needed, as M80 ignores END in include files
+       END
+ENDIF  ;lasm
diff --git a/cpxz80.asm b/cpxz80.asm
new file mode 100644 (file)
index 0000000..9e80e8b
--- /dev/null
@@ -0,0 +1,350 @@
+IF NOT LASM
+.printx * CPXZ80.ASM *
+ENDIF  ;NOT lasm
+;       KERMIT - (Celtic for "FREE")
+;
+;       This is the CP/M-80 implementation of the Columbia University
+;       KERMIT file transfer protocol.
+;
+;       Version 4.0
+;
+;       Copyright June 1981,1982,1983,1984,1985
+;       Columbia University
+;
+; Originally written by Bill Catchings of the Columbia University Center for
+; Computing Activities, 612 W. 115th St., New York, NY 10025.
+;
+; Contributions by Frank da Cruz, Daphne Tzoar, Bernie Eiben,
+; Bruce Tanner, Nick Bush, Greg Small, Kimmo Laaksonen, Jeff Damens, and many
+; others.
+;
+;       This file contains the system-dependent code and data for
+;      Kermit-80 emulated on an IBM PC or clone running Z80MU.
+;
+; revision history (last edit first)
+;
+; edit 1, 2 December, 1987.  Built code for Z80MU emulation.  Uses BIOS
+;      calls to 0FF12-15 to read/write from/to the PC COM1 port.
+;
+
+.printx        * Assembling for Z80MU system *
+
+;\f
+;      Family is the string used in VERSION to say which of several 
+;       smaller overlay files are used.  These are (will be) derived from 
+;       the juge CP4SYS.ASM file, in which case we will never get here.  
+;       Just a Dollar, but put a sting in for a family of machines.
+;
+family:        db      'CPXZ80.ASM  (1)  2-Dec-87$'    ; Used for family versions....
+
+
+
+sysxin:                ; continuation of system dependent initialisation code
+       ret                     ; return from system-dependent routine
+;
+;
+;       system-dependent termination processing
+;       If we've changed anything, this is our last chance to put it back.
+sysexit:
+       ret
+
+;
+;       system-dependent processing for start of CONNECT command
+;
+syscon:
+       ret
+
+conmsg:                ; Messages printed when entering transparent (CONNECT) mode:
+;
+;
+;       syscls - system-dependent close routine
+;       called when exiting transparent session.
+;
+syscls:
+       ret
+;
+;       sysinh - help for system-dependent special functions.
+;       called in response to <escape>?, after listing all the
+;       system-independent escape sequences.
+;
+sysinh:
+       ret
+
+;
+;       sysint - system dependent special functions
+;       called when transparent escape character has been typed;
+;       the second character of the sequence is in A (and in B).
+;       returns:
+;       non-skip: sequence has been processed
+;       skip:   sequence was not recognized
+sysint:        ani     137O            ; convert lower case to upper, for testing...
+       jmp     rskp            ; take skip return - command not recognized.
+
+
+;
+;
+;       sysflt - system-dependent filter
+;       called with character in E.
+;       if this character should not be printed, return with A = zero.
+;       preserves bc, de, hl.
+;       note: <xon>,<xoff>,<del>, and <nul> are always discarded.
+sysflt:
+       mov     a,e             ; get character for testing
+       ret
+
+;       mdmflt - modem filter [30]
+;       called with character to be sent to printer in E
+;       with parity set as appropriate.
+;       return with accumulator = 0 do do nothing,
+;                               <> 0 to send char in E.
+mdmflt:
+       mov     a,e             ;[30] get character to test
+       ret
+
+
+
+;       prtflt - printer filter [30]
+;       called with character to be sent to printer in E
+;       returns with a = 0 to do nothing
+;                    a <> 0 to print it.
+;
+;       this routine for those printer that automatically insert
+;       a lf on cr, or cr for lf.  Should this be shifted to 
+;       the system indep. stuff, in say 4.06?
+prtflt:
+       mov     a,e             ; [30] get character to test
+       ret
+
+
+;
+; system-dependent processing for BYE command.
+;  for apmmdm, heath, and lobo, hang up the phone.
+sysbye:
+       ret
+;
+;
+;       This is the system-dependent command to change the baud rate.
+;       DE contains the two-byte value from the baud rate table; this
+;       value is also stored in 'speed'.
+sysspd:
+       ret
+;
+;
+; The following conditionals were once a huge if not statement.  There
+; wasn't enough room to add the lobo to the list, so it had to be broken
+; into 2, which you can't do with an if not.  I redid it as two ifs and
+; applied them to those that wouldn't set baud. [Hal Hostetler]
+spdtbl EQU     0               ;[hh] SET BAUD not supported.
+sphtbl EQU     0               ;[hh] ran out of room above...
+;
+;
+;       This is the system-dependent SET PORT command.
+;       HL contains the argument from the command table.
+sysprt:
+       ret
+
+prttbl equ     0               ; SET PORT not supported
+prhtbl equ     0
+;\f
+
+;
+;       selmdm - select modem port
+;       selcon - select console port
+;       selmdm is called before using inpmdm or outmdm;
+;       selcon is called before using inpcon or outcon.
+;       For iobyt systems, diddle the I/O byte to select console or comm port;
+;       For Decision I, switches Multi I/O board to console or modem serial
+;       port.  [Toad Hall]
+;       For the rest, does nothing.
+;       preserves bc, de, hl.
+selmdm:
+selcon:
+       ret
+;\f
+
+;       Get character from console, or return zero.
+;       result is returned in A.  destroys bc, de, hl.
+;
+inpcon:
+       mvi     c,dconio        ;Direct console I/O BDOS call.
+       mvi     e,0FFH          ;Input.
+       call    BDOS
+       ret
+;\f
+
+;
+;       Output character in E to the console.
+;       destroys bc, de, hl
+;
+outcon:
+       mov     c,e             ;Console output via BIOS
+       jmp     bcnout
+;\f
+
+;
+;       outmdm - output a char from E to the modem.
+;               the parity bit has been set as necessary.
+;       returns nonskip; bc, de, hl preserved.
+outmdm:
+       mov     c,e             ; get char to c
+       call    0ff12h          ; send to com1 via PC BIOS
+       ret
+;
+;
+;       get character from modem; return zero if none available.
+;       for IOBYT systems, the modem port has already been selected.
+;       destroys bc, de, hl.
+inpmdm:
+;Note: modem port should already be selected for mdI.  [Toad Hall]
+       call    0ff15h          ;Get the port status into A.
+       ana     a               ;See if the is non-null.
+       ret                     ; return with character or NULL in A.
+
+
+;
+;       flsmdm - flush comm line.
+;       Modem is selected.
+;       Currently, just gets characters until none are available.
+
+flsmdm:        call    inpmdm          ; Try to get a character
+       ora     a               ; Got one?
+       jnz     flsmdm          ; If so, try for another
+       ret                     ; Receiver is drained.  Return.
+;\f
+
+;
+;       lptstat - get the printer status. Return a=0ffh if ok, or 0 if not.
+lptstat:
+       xra     a               ; assume it is ok.. this may not be necessary
+       ret
+
+;
+;       outlpt - output character in E to printer
+;       console is selected.
+;       preserves de.
+outlpt:
+       push    d               ; save DE in either case
+       call    prtflt          ; go through printer filter [30]
+       ana     a               ; if A = 0 do nothing,
+       jz      outlp1          ; [30] if a=0 do nothing
+       mvi     c,lstout
+       call    bdos            ;Char to printer
+outlp1:        pop     d               ; restore saved register pair
+       ret
+
+;
+; delchr - make delete look like a backspace.  Unless delete is a printing
+;       character, we just need to print a backspace. (we'll output clrspc
+;       afterwards)
+;       For Kaypro and Vector General, delete puts a blotch on the screen.
+;       For Apple and Osborne 1, delete moves but doesn't print.
+delchr:
+       mvi     e,bs            ;get a backspace
+       jmp     outcon
+
+; erase the character at the current cursor position
+clrspc:        mvi     e,' '
+       call    outcon
+       mvi     e,bs            ;get a backspace
+       jmp     outcon
+
+; erase the current line
+clrlin:        lxi     d,eralin
+       jmp     prtstr
+
+; erase the whole screen, and go home. preserves b (but not c)
+clrtop:        lxi     d,erascr
+       jmp     prtstr
+
+
+sysver:        db      'Z80MU on IBM PC $'
+IF lasm 
+LINK CPXVDU.ASM
+ENDIF   ;lasm - m80 will INCLUDE CPXVDU.ASM
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+\1a
+
diff --git a/cpzspa.txt b/cpzspa.txt
new file mode 100644 (file)
index 0000000..0dcdb69
--- /dev/null
@@ -0,0 +1,92 @@
+.pl66
+                      Tabspace utility for 
+               CP/M-80 Kermit (Kermit-80) support.
+
+I have written this utilty simply to help me.  No other excuses.
+
+I am forever getting updates or new systems to add to the CP/M-80 
+version of Kermit (Kermit-80) from folk who send me these updates 
+via  Electronic  Mail.   I  am thankful that it is already  in  a 
+machine readable form.
+
+However,  our  Mutton-head  mainframe substitutes a single  space 
+character  for every tab character it receives,  so a lot of  the 
+submissions  need  considerable massaging before I  can  actually 
+merge these additions to the rest of Kermit-80.
+
+Therefore,  I issued Kermit-80 with all tabs replaced by  spaces, 
+in  the  hope that any further doantions have spaces  instead  of 
+tabs.   Unfortunately,  this  does  not  work  in  practice,  and 
+everyone is complaining about the size of the source files (often 
+as  much  as  30% larger as a single tab character is now  up  to 
+eight space characters!)
+
+So  I wrote this program in the hope that people submitting stuff 
+to  me run their sources through this de-tabber to make  my  life 
+easier.
+
+As  a bonus,  TABSAPACE will do the reverse,  and replace  spaces 
+with tabs.  With a couple of exceptions...  (See below)
+
+To  run  the  program,  type TABSPACE and wait  for  the  sign-on 
+message   ("Tabspace loaded,  Version 1 22-Jan-87"   for the time 
+being).  Tabspace will ask for the filename to be "massaged", and 
+whether  you  want  to expand or compress  files  (ie  substitute 
+spaces for tabs, or tabs for spaces respectively).  
+
+Once  started,  it will plough through the file specified (if  it 
+exists)  and apply the tabs/spaces replacement as  required.   It 
+will also strip out any parity bits.
+
+Tabspace  actually opens two files when it works:  one input file 
+of  the  type <filename>.<extention> as specified  by  you.   The 
+second is the same <filename> but with a $$$ extention.
+
+Once  the  file  has been massaged,  the original  file  will  be 
+deleted,  and the .$$$ file renamed to your original file.   This 
+should  be relatively safe,  as you will not get to the stage  of 
+delete  and  rename  if  you  have disk  space  or  file  closing 
+problem.   However, I suggest you try applying Tabspace to COPIES 
+of your software!
+
+Couple of other points:
+Tabspace   uses  memory  to  buffer  several  logical  128   byte 
+"sectors",  both on read and writing.   An equate for MAXRAM sets 
+the maximum amount of memory available to Tabspace after CP/M and 
+Tabspace itself have nabbed their memory,  and is initally set to 
+16  Kbytes.   (I reasoned that if you are going to run  Kermit-80 
+version  4.08  or later you should have at least this  amount  of 
+free  memory!)  If you have more memory,  you can adjust this  to 
+some larger value,  say 52 for a 62k system (ie 62K - 8k (CP/M) - 
+2k (Tabspace) = 52k)
+
+I used the Public Domain assembler LASM to assemble  Tabspace;  I 
+have no idea if any other assembles will work.   Anyway,  LASM is 
+the ONLY assembler now used for Kermit-80 assembly.
+
+Tabspace  will expand tabs after a semicolon in a comment  field, 
+but will not replace tabs for multiple spaces after a  semicolon.  
+I ran into som real problems early on, and decided that spaces in 
+comment fields would be ok, so I left it in.
+
+Any  comments  or  contributions for  Tabspace  and/or  Kermit-80 
+please send them to me (with tabs expanded!) as:
+
+
+OBSchou @ UK.AC.LOUGHBOROUGH.MULTICS                   or
+
+Kermit @ UK.AC.LOUGHBOROUGH.MULTICS                    or
+
+Bertil Schou,
+The Computer Centre,
+Loughborough Universirty of Technology,
+Loughborough,
+Leics. LE11 3TU                                        or
+
++ 509 -222313 (Direct Dial)
+
+
+
+Many thanks for your co-operation,  
+
+Bertil Schou.
diff --git a/lasm.hex b/lasm.hex
new file mode 100644 (file)
index 0000000..5115dee
--- /dev/null
+++ b/lasm.hex
@@ -0,0 +1,353 @@
+:10010000314D17C39A024C494E4B41534D20415338
+:10011000204F4620372F30362F38310D0000000099
+:1001200000205245534541524348202020202020A2
+:10013000534944585245463144303020243100025E
+:10014000C5C51130010E09CD0500C12107007E3D56
+:1001500090571E00D521000278B1CA65010B7E12AE
+:100160001300004D3400000000004D34000000007A
+:100170000007C27A01E37E23E36F7D176FD283010C
+:100180001A000000000001D12E00E90000004153D8
+:100190004D00671BC93E0CD3013E08D301DB0107AC
+:1001A00007071FDAA900009D08DB03E67FC921507D
+:1001B000524E00712A821D444DCDA1070E3ACD86C4
+:1001C000070E20CD860700001D32841D3A601D21D8
+:1001D00048455800F40821DE1C3A841DBED2ED08C3
+:1001E0002A841D260001DF0000100000000021818C
+:1001F00001BEC8775F0E0ECD0500C9237EFE20CA62
+:100200000502DE41C93A8101C97ECD4A047E23FE42
+:100210000DC209023E0ACD4A04C9115C0006091A42
+:10022000FE3FCA210377231305C21F02C9D5060862
+:10023000131ACD4A0405C230023E0DCD4A043E0ACF
+:10024000CD4A04D10E0FCD0500FEFFC0211F06CD03
+:100250000902C300000E10CD0500FEFFC0218F066D
+:10026000CD0902C300000E13C305000E16CD050014
+:10027000FEFFC0213606CD0902C300003A8201CD3F
+:10028000EE01C93A8301FE19C8FE17C93A8301CDB0
+:10029000EE01C93A8401CDEE01C9210601CD090262
+:1002A0003A6C0032A2163A5D00FE20CA21030E19F4
+:1002B000CD0500328101216400CDFB01328201CDE8
+:1002C000FB01328401CDFB01328301218501CD1A6E
+:1002D0000221A601CD1A02CD8302CAEC02CD8C0206
+:1002E00011A601CD660211A601CD6B023A8401FE72
+:1002F00019CAA21021C701E5E5CD1A02CD9302D19A
+:10030000CD6602D1CD6B02C3A21021001022E801FC
+:10031000AF32910132A501CD7C02118501CD2D02B4
+:10032000C9214906CD0902C300007ABCC07BBDC902
+:10033000C5D5E52AE801110010CD2A03C27F03CDFF
+:100340007C0221000022E8010620214D17C5E50EA0
+:1003500014118501CD0500E1C1B70E80C2730311F0
+:1003600080000E801A7713230DC2640305C24D036B
+:10037000C37F03FE03D29603361A230DC2780311FE
+:100380004D172AE801E52322E801E1197EFE0ACC97
+:100390009115E1D1C1C9216006CD0902C30000C594
+:1003A000473A8301FE19CABD03FE1778C2B603CDD2
+:1003B0004A04C3BD03C5D5E5CDBF03E1D1C1C92AF8
+:1003C000EA01EB214D271977EB2322EA01EB21000B
+:1003D00004CD2A03C0CD8C0221000022EA01214D68
+:1003E0002711A60106087EFE1AC8C5D50E80118009
+:1003F000007E1223130DC2F103D1D5E50E15CD05F4
+:1004000000E1D1C1B7C20D0405C8C3E603217706D8
+:10041000CD0902C3E304C5D5E5CD2004E1D1C1C9AE
+:100420002AEC01EB214D2B1977EB2322EC01EB2178
+:100430000008CD2A03C0CD930221000022EC012147
+:100440004D2B11C7010610C3E603C5D5E50E025FAB
+:10045000CD0500E1D1C1C94FCD9F033AA316FE20BF
+:10046000C83A8301FE17C879CD4A04C93A1C012154
+:10047000A316B7CA8104477ECD570423783DC372C3
+:1004800004321C013E0DCD57043E0ACD570421A372
+:10049000163E783620233DC29304C94721A3167E19
+:1004A000FE20C070C9CD8302CABB042AEA017DB414
+:1004B000CABB043E1ACD9F03C3AB043A8401FE19A4
+:1004C000CAE3043A7001B7C41E072A6601226E010E
+:1004D000CD1E072AEC017DB4CAE3043E1ACD1604F2
+:1004E000C3D304CD8302CAF204CD8C0211A601CD80
+:1004F00055023A8401FE19CA0305CD930211C701C2
+:10050000CD55023AA216B7CA16063D32830121AF75
+:1005100001110E060603CD1F02AF32B20132C60131
+:10052000CD8C0211A601D5CD6602D1CD6B02210082
+:100530000022EA01210E06CD0902CD4305CD9C051E
+:10054000C316060641110C06CD57050478FE5BC2A2
+:100550004805AF121312C9214F34CD6705D8CC79A5
+:1005600005CD8D05C35A053A6301953A64019CD8BF
+:100570007EE60F4F237E90B7C97AB3CA85052B7DDF
+:1005800012137C1223E5CD9305545DE1C9CD93058B
+:100590002323C97806000947232323C92A0C067C94
+:1005A000B5CADE057EE60F5F160023E519234E234C
+:1005B0007ECDF80579CDF805CDD905E11C7ECDB508
+:1005C00003231DC2BD053E0DCDB5033E0ACDB503C7
+:1005D00023237E23666FC39F053E20C3B5032AEA0B
+:1005E000017DB4CAEE053E1ACD9F03C3DE05CD8C56
+:1005F0000211A601CD5502C9F51F1F1F1FCD01060F
+:10060000F1E60FC69027CE4027C3B503000053592B
+:100610004D424F4C530D21A206CD0902C300004E9E
+:100620006F20736F757263652066696C65207072E8
+:100630006573656E740D4E6F206469726563746FC7
+:1006400072792073706163650D536F7572636520F5
+:1006500066696C65206E616D65206572726F720DE2
+:10066000536F757263652066696C6520726561649D
+:10067000206572726F720D4F7574707574206669A3
+:100680006C65207772697465206572726F720D43B4
+:10069000616E6E6F7420636C6F73652066696C6544
+:1006A000730D456E64206F6620617373656D626CB7
+:1006B000790DC5473A8401FE1978CAFE06D5F521A1
+:1006C00070017EB7CAEA06FE10DAD206CD1E07C355
+:1006D000EA062A6601EB2A6E014F0600097BBDC2BD
+:1006E000E7067ABCCAF006CD1E072A6601226E0113
+:1006F0002170015E34160021710119F177D1C1C951
+:10070000F50F0F0F0FE60FCD1507F1F5E60FCD151D
+:1007100007F18257C9C69027CE4027C316043E3A38
+:10072000CD16042170015EAF57772A6E017BCD0094
+:10073000077CCD00077DCD0007AFCD00077BB7CA92
+:100740004E072171017E23CD00071DC24507AF92E0
+:10075000CD00073E0DCD16043E0ACD1604C900009B
+:1007600000CD3003F5FE0DCA8507FE0ACA85073A9B
+:100770001C01FE78D285075F16003C321C0121A3C4
+:100780001619F177C9F1C9CD9E07325F07321C01F6
+:100790003E0A325E07CD6C043E10321C01C9AF32F6
+:1007A0002001326007C92120017EFE40DAB40736FD
+:1007B00000CD7A095E16003423193A5F0777C97EA7
+:1007C000FE24C0AF77C93A5F07D630FE0A17E601AC
+:1007D000C9CDC607C03A5F07D641FE0617E601C974
+:1007E0003A5F07D641FE1A17E601C9CDE007C0CD32
+:1007F000C607C93A5F07FE61D8FE7BD0E65F325F6D
+:1008000007C9CD6107325F07F53A1D01FE03C4F346
+:1008100007F1C9FE0DC8FE1AC8FE21C9AF321D017D
+:10082000CD9E073A5F07FE09CA5008FE3BCA3D0845
+:10083000FE2AC249083A5E07FE0AC24908CD0208EC
+:10084000CD1308CA5608C33D08F620FE20C256083C
+:10085000CD0208C32308CDE007CA61083E01C39555
+:1008600008CDC607CA6C083E02C395083A5F07FE6A
+:1008700027C27D08AF325F073E03C39508FE0AC258
+:1008800093083A6501B7C46C0421A31636203E10C4
+:10089000321C013E04321D013A5F07325E07B7C4C5
+:1008A000A607CD02083A1D01FE04C8FE03C4F307E3
+:1008B000215F073A1D01FE01C2C808CDBF07CA98D3
+:1008C00008CDEB07C8C39808FE02C25E09CDBF077A
+:1008D000CA9808CDD107C298083A5F07FE4FCAE60A
+:1008E00008FE51C2EB083E08C3F208FE48C2FC08ED
+:1008F0003E10326007AF325F07C317093A5E07FE4A
+:1009000042C209093E02C31009FE443E0AC214094C
+:1009100021200135326007210000221E0121200123
+:100920004E237E23FE41D22E09D630C33009D6375E
+:10093000E5C54F216007BED4740906007E2A1E015A
+:10094000EB210000B7CA53091FD24D0919EB29EB5F
+:10095000C3440909221E01C1E10DC22209C93A5F3F
+:1009600007FE0DCA7A09FE27C29808CD0208FE27A5
+:10097000C0C39808F53E56C38009F53E4FC38009B1
+:10098000C5E5CD9B04E1C1F1C900214D330680AF1F
+:100990007723772305C29009210000226C01C92129
+:1009A000200146AF238605C2A409E67F328909C922
+:1009B000472A6C0123237EE6F0B077C92A6C012315
+:1009C000237EE60F3CC92A6C017DB4C9CD9F092165
+:1009D00020017EFE11DADA0936102189095E16003F
+:1009E000214D3319195E23666B226C01CDC609C8EF
+:1009F000CDBC09212001BEC20F0A4723EB2A6C019E
+:100A00002323231ABEC20F0A132305C2030AC92ACD
+:100A10006C015E2356EBC3E9092120015E16002A12
+:100A20006301226C011911050019EB2A06007B9560
+:100A30007A9CEBD26F0A2263012A6C01EB218909AF
+:100A40004E0600214D3309094E2346722B73EB717C
+:100A500023701120011AFE11DA5D0A3E10473D2372
+:100A60007723131A7705C2610AAF23772377C92149
+:100A7000780ACD0902C3A50453796D626F6C2074A6
+:100A800061626C65206F766572666C6F770D171703
+:100A90001717E6F0472A6C0123237EE60FB077C9CB
+:100AA0002A6C0123237E1F1F1F1FE60FC9CDBC091F
+:100AB0002A6C015F160019232323C9E5CDAD0AD1A5
+:100AC000732372C9CDAD0A5E2356EBC9E70AF70A54
+:100AD000090BA50BD10BE00B1009340B03E00B0045
+:100AE0000C120C7A0C900C0D28292A2B2C2D2F413E
+:100AF00042434445484C4D4442444944534457457D
+:100B0000494946494E4F525350414349414443415C
+:100B10004444414449414E41414E44414E49434D74
+:100B200041434D43434D5043504944414144414466
+:100B3000444352444358454E44455155484C54490A
+:100B40004E52494E584A4D504C44414C58494D4FD5
+:100B5000444D4F564D56494E4F504E4F544F5241B3
+:100B60004F52474F52494F5554504F505053575280
+:100B7000414C524152524554524C435252435253AB
+:100B80005453424253424953455453484C5348529C
+:100B9000535441535443535542535549584F525857
+:100BA000524158524943414C4C4C4441584C484C9A
+:100BB000444C494E4B5043484C5055534853484C75
+:100BC000445350484C53544158584348475854484C
+:100BD0004C454E4449464D4143524F5449544C456F
+:100BE0000F0A0C140D1E005005460E0A0646015051
+:100BF0001007100010011002100310041005100659
+:100C0000110113F31102110313FB110821DB0A2850
+:100C100010061ACE1D881D801AC61DA009321AE6BC
+:100C2000132F133F1DB81AFE132715091E051F0B9E
+:100C30001104110713761E041F0317C31C3A140175
+:100C40000250184019061300083C1DB0110A1AF68C
+:100C500021D316C110061317131F13C91307130F3F
+:100C600020C71D981ADE110B035004501C32133795
+:100C70001D901AD60B281DA81AEE17CD1B0A1C2A88
+:100C8000110613E916C51C2213F91B0213EB13E31B
+:100C900011051109110C4E5A5A204E434320504F52
+:100CA000504550204D201EFF040E00AF78811FBB21
+:100CB000CAE70C5FE5D5C5E54248160021000019DA
+:100CC00005C2BF0CD1191121011ABE1323C2D90CC0
+:100CD0000DC2C90CC1D1E17BC9C1D1E1DAE30C4B32
+:100CE000C3AB0C43C3AB0CAF3CC93A21010117C2E3
+:100CF000FE4AC806C4FE43C80113C0FE52C93A20CA
+:100D000001FE04D2300DFE03CA150DFE02C2300DE5
+:100D1000212301362001080011960C2122011ABE60
+:100D200013C2280D1A23BEC813040DC21B0D0CC913
+:100D3000AF3CC93A20014F3D5F1600D5FE05D27D7C
+:100D40000D21D80A194621CC0A19195623666A5171
+:100D5000CDA60CC2680DD121DD0A19195E23566F8C
+:100D6000260029197E2346C9D1CDEA0CC0C5CDFE87
+:100D70000C78C1C0B7171717B04779BFC9D1AF3CBE
+:100D8000C900BEC9EB2AB3177D937C9AEBC9CD8409
+:100D90000BD022B317C93A4E17FE01D0E52100004F
+:100DA000CD840BE1C9CD0000EB21A70D7EFE10DA4A
+:100DB000B70DCD9A1036007E34344F060021960DC3
+:100DC00009732372C9F521A60D7EFE0ADAD40D3609
+:100DD00000CD9A105E160034F121820D1977218C16
+:100DE0000D1970C921A70D7EB7C2F30DCD9A102140
+:100DF0000000C935354E060021960D094E2366695F
+:100E0000C9CDE40DEBCDE40DC96F26002911160EF6
+:100E1000195E23666BE99E0EA70EAE0EB40EC00ED1
+:100E2000D40EDB0EE50EEE0EF50E010F0D0F9A102F
+:100E3000CD010E7AB7C23C0E7BFE11D8CD9A103E82
+:100E400010C9AF956F3E009C67C9CD010EEB2280A3
+:100E50000E21820E3611010000C5AF7B175F7A1795
+:100E60005735E1C83E00CE002944852A800E954FB3
+:100E7000789C47C5D2790E09E321820E3FC35B0EF1
+:100E80000E1000444D210000AF781F47791F4FDA44
+:100E9000970EB0C8C3980E19EB29EBC3880ECD018D
+:100EA0000ECD830EC3A80DCD4A0EEBC3A80DCD4ABF
+:100EB0000EC3A80DCD300EB7CAA80D293DC3B70E7D
+:100EC000CD300EB7CAA80DF5AF7C1F677D1F6FF13F
+:100ED0003DC3C30ECD010E19C3A80DCD010EEBCD40
+:100EE000420EC3D70ECDE40DCD420EC3A80DCDE406
+:100EF0000D23C3E80ECD010E7AA4677BA56FC3A8AE
+:100F00000DCD010E7AB4677BB56FC3A80DCD010E70
+:100F10007AAC677BAD6FC3A80D3A1D01FE04C03AE1
+:100F20002101FE0DC8FE3BC8FE2CC8FE21C9AF3210
+:100F3000A60D32A70D3D32810D210000226101CDA9
+:100F4000190FC2720F21A60D7EB7CA5D0F355F1D46
+:100F5000160021820D197ECD090EC3450F3AA70D4B
+:100F6000FE02C49A103AA316FE20C02A960D2261F2
+:100F700001C93AA316FE20C294103A1D01FE03C215
+:100F80009E0F3A2001B7CC9A10FE03D49A10160097
+:100F90002121015E233DCA9A0F56EBC38610FE0243
+:100FA000C2A90F2A1E01C38610CD330DC24610FE02
+:100FB00010D23B10FE0C4F3A810DC2CA0FB7CC9A2B
+:100FC000103EFF32810D79C31810B7C22310C53A05
+:100FD000A60DB7CAF30F5F1D1600218C0D197EB840
+:100FE000DAF30F21A60D7321820D197ECD090EC1F2
+:100FF000C3CE0FC179FE0DC2181021A60D7EB7CA4F
+:1010000011103D775F160021820D197EFE0CCA1467
+:1010100010CD9A10AFC31D10CDC50D3EFF32810D0E
+:10102000C3941079FE05CA9410FE06C233103C4FDB
+:10103000C3CE0FFE08C49A10C3CE0FFE11CC9A1077
+:10104000682600C386103A1D01FE04C265103A21CD
+:1010500001FE24CA5F10CD9A10210000C386102A19
+:101060006801C38610CDCC09CDC609C279103E50A7
+:10107000CD9B04CD190AC38310CDA00AE6073E55C7
+:10108000CC9B04CDC40A3A810DB7CC9A10AF328103
+:101090000DCDA80DCD1C08C33F0FE53E45CD9B04EB
+:1010A000E1C9AF326501CD8A09CD8707218501CD20
+:1010B0001A02CD0A03AF327001210000229D1622D0
+:1010C0006601226801229F16CD1C083A1D01FE020E
+:1010D000CAC810FE04C2E9103A2101FE2AC2AA14AD
+:1010E000CDB215C2F514C3CB14FE01C2F514CD3335
+:1010F0000DCA3C11CDCC09CDC609C20A11CD190AC1
+:101100003A6501B7C48916C31811CDA00AFE06C2FC
+:101110001811CD9516C3CB142A9D167DB4C48F1615
+:101120002A6C01229D16CD1C083A1D01FE04C2CB7B
+:10113000103A2101FE3AC2CB10C3C810FE11C250B2
+:10114000135816001B214F1119195E23666BE967AE
+:1011500011B511CC11EA11211224129712B9120003
+:1011600013061320134713CDBC15CD1C083A1D01DF
+:10117000FE03C298113A20013DCA98114704042188
+:10118000210105CA9211C54623E5CDFA15E1C1C377
+:101190008211CD1C08C3A711CD2E0F2A61017CB787
+:1011A000C4831645CDFA15CDAB15CD3314FE2CCA2C
+:1011B0006A11C3AA14CDBC15CD5816CD4A14EB2A1A
+:1011C000680119226801226601C3AA14CDBC15CD9D
+:1011D0004A14E545CDFA15E144CDFA15CDAB15CD50
+:1011E0003314FE2CCACF11C3AA14CDBC15CD58168A
+:1011F0003AA316FE20C2AA14CD4A143AA316FE2022
+:10120000C20612229F163E2032A316CD1C083A1D9C
+:1012100001FE04C2F5143A2101FE0AC2F514C3040A
+:1012200015C34A13CD1C082186011121013A200162
+:10123000B7CA7112473E09B8DA7112904F1A771384
+:101240002305C23D120DCA4F12362023C34512CDCD
+:101250001C083A5F07FE1ACA7112FE0AC24F12CD6D
+:101260000A03CD1C08C3C81070230DC23D12C34F22
+:1012700012217D12CD0902CD6C04C300002B2B4539
+:1012800052524F5220494E204C494E4B204F504510
+:1012900052414E442B2B0DCDB215CAF5142A6801CC
+:1012A000E5CD4A14226801CDBC15CD5B1621A916E7
+:1012B000363DE1226801C3AA14CDBC15CD4A143ACB
+:1012C000A316FE20C2AA147D1FDAAA14CD1C083A68
+:1012D0001D01FE04C2E7123A2101FE1A3E42CC9BD8
+:1012E00004CA0415C3CC12FE01C2CC12CD330DC208
+:1012F000CC12FE11C2CC1278FE05C2CC12C34A1326
+:10130000CD9516C3AA14CD4A143AA316FE20C2AA3C
+:1013100014226801226601CDBC15CD5816C3AA144B
+:10132000CDB215CAF514CDA00AFE05C48F163E0530
+:10133000CD8E0ACD4A14E5CDB215E1CDBB0A210010
+:1013400000229D16C3AA14CD9516CD1C08C3AA145D
+:10135000D613FE21D2F5145F160021641319195E0D
+:1013600023666BE982138B1397139D13B113BA1382
+:10137000C913D913E213F113FA1301140814171443
+:101380001E14CDFA15CD1C08C32A14CD7514CD90AA
+:1013900014CD8A14C32A14CD7514C32A14CD6B142A
+:1013A000FE38CAAA13E608C46F1679E630B0C32720
+:1013B00014CDFA15CD8A14C32A14CD6B14B047CDC1
+:1013C0009014CD6014B0C32714CD6B14B0CDF915B3
+:1013D000CD9014CD8414C32A14CDFA15CD8414C332
+:1013E0002A14CD6B14E628C46F1679E610B0C32713
+:1013F00014CDFA15CD8A14C32A14CD6014B0C327B6
+:1014000014CD6B14B0C32714CD6B14E608C46F164B
+:1014100079E630B0C32714CD6B14B0C32714CDFACE
+:1014200015CD8414C32A14CDF915CDBC15CDAB153B
+:10143000C3AA143A1D01FE04C483163A2101FE2CEE
+:10144000C8FE3BC8FE0DC48316C9C5CD1C08CD2EF1
+:101450000F2A6101C1C9CD4A147CB7C479167DC970
+:10146000CD5614FE08D47916E607C9CD60141717B7
+:1014700017E6384FC9CD6B14E608C46F1679E6300D
+:10148000B0C3F915CD5614C3F915CD4A14C32616A9
+:10149000F5C53A1D01FE04C2A2143A2101FE2CCA70
+:1014A000A7143E43CD9B04C1F1C9CDBC153A1D0123
+:1014B000FE04C2F5143A2101FE0DC2C314CD1C086E
+:1014C000C3C810FE3BC2EB14CDBC15CD1C083A1DA1
+:1014D00001FE04C2CB143A2101FE0ACAC810FE1A4A
+:1014E000CA0415FE21CAC810C3CB14FE21CAC810F5
+:1014F000FE1ACA04153E53CD9B04C3CB147B956FD3
+:101500007A9C67C92165017E34B7CAA910CD1C0831
+:10151000CD581621A816360D21A416CD09022A632E
+:1015200001EB2A6A01CDFD14E52A0600EB2A6A01C7
+:10153000CDFD145C1600E1CD4D0EEBCD5B1621A860
+:1015400016114F151AB7CA5D15772313C3441548F2
+:101550002075736520666163746F720D0021A51696
+:10156000CD09022A9F16226601217815237EFE20CE
+:10157000CA6C15CD0902C3A50420202020202020FC
+:10158000696E707574206C696E6573207265616434
+:101590000D3A6501B73E0AC8217E157EF6303C77CC
+:1015A000FE3A3E0AD836302BC39B152A66012268C4
+:1015B00001C92A9D16226C01CDC609C9CDB215C834
+:1015C000210000229D163A6501B7C2E315CDA00A9D
+:1015D000F5E607C48F16F1F601CD8E0A2A6801CD13
+:1015E000BB0AC9CDA00AE607CC8916CDC40AEB2AEE
+:1015F0006801CD2A03C48916C9473A6501B778CA7C
+:101600001E16C5CDB2063AA416FE202A6801CC5B90
+:10161000163AA116FE10C1D21E1678CD48162A66BB
+:101620000123226601C9E545CDFA15E144C3FA1547
+:10163000C630FE3AD8C607C9CD301621A1165E16AF
+:10164000003421A3161977C9F51F1F1F1FE60FCD00
+:101650003816F1E60FC338162A6801EB21A116E50A
+:1016600036017AD5CD4816D17BCD4816E134C9F57F
+:10167000C53E52CD9B04C1F1C9F5E53E56CD9B0454
+:10168000E1F1C9F53E44C39816F53E50C39816F5EE
+:101690003E4CC39816F53E4ECD9B04F1C9000000A8
+:1016A000000000000000000000000000000000003A
+:1016B000000000000000000000000000000000002A
+:1016C000000000000000000000000000000000001A
+:1016D000000000000000000000000000000000000A
+:1016E00000000000000000000000000000000000FA
+:1016F00000000000000000000000000000000000EA
+:00010001FE
diff --git a/lasm.txt b/lasm.txt
new file mode 100644 (file)
index 0000000..178d840
--- /dev/null
+++ b/lasm.txt
@@ -0,0 +1,149 @@
+*****************************************************************
+*                                                               *
+*  10/01/81                                                     *
+*                                                               *
+*  LASM is an update of LINKASM, with the minor change that     *
+*  it prints the name of each linked file before it is opened.  *
+*  This helps track progress, and helps find misspelled names.  *
+*                                                               *
+*                                         -Ward Christensen     *
+*                                                               *
+*****************************************************************
+
+LINKASM.COM
+01/07/80       by Ward Christensen
+
+OVERVIEW:
+       LINKASM is based on CP/M assembler 1.0, and is
+compatible with 1.0, 1.3, and 1.4 assemblers.  (2.0? Dunno.)
+               ----------------
+LINKASM is a rewrite of CP/M 1.0 ASM.COM, incorporating:
+
+*      A new pseudo-op code, LINK.
+*      Smaller .COM file size (6K vs 8K).
+*      Faster execution via larger ASM, HEX, and PRN buffers
+*      Corrections to properly handle lower case DB values.
+*      Prints the number of source lines read
+*      Produces a symbol table for use under SID
+
+       The LINK pseudo-op allows a file to "chain" to the 
+next .ASM file, thereby allowing very large source files to
+be processed without having to PIP them together.
+
+RESTRICTIONS:
+       All the linked .ASM files must be on the same disk.
+       Nested IFs are not handled (ASM.COM didn't either)
+Note that you can use IF to conditionally link to the next
+module:
+
+       IF      CLOCK
+       LINK    CLOCKRTN
+       ENDIF
+;
+       IF      NOT CLOCK
+       LINK    OTHERRTN
+       ENDIF
+
+       For example, if CLOCK is true, then LINK CLOCKRTN
+(i.e. CLOCKRTN.ASM) will take place, and the assembler
+will never see the ENDIF.  This is not a problem as the
+next encountered IF will be handled properly.
+               ----------------
+USAGE:
+       LINKASM is totally compatible with ASM.COM, and
+you may therefore replace ASM.  Its performance will be
+slightly better than ASM.COM, and it takes less space on
+disk (6K vs 8K).
+       Execute it just like ASM.COM, i.e. 
+       
+       LINKASM name.p1p2p3
+
+where: p1 is the .ASM file disk (A, B, ...)
+       p2 is the .HEX file disk (A, B, ... or Z for none)
+       p3 is the .PRN file disk (A, B, ... or Z for none,
+               or X for the console)
+
+       The default is the logged in disk for all 3.
+
+       If you wish to write a symbol table file, follow
+the command line with the disk to be written to (A, B, ...)
+then a colon.  For example, to assemble FOO from the A:
+disk, put the .HEX on the A: disk, send the .SYM file to
+B:, and the listing to the console:
+
+       LINKASM FOO.AAX B:
+
+       To assemble it doing everything on the A: disk
+(assuming A: is the logged in disk):
+
+       LINKASM FOO A:
+
+       The ":" must be specified after the .SYM disk.  The 
+.SYM file is "partially" sorted, i.e. all Axxxx then all Bxxxx
+etc.  SID fully scans the symbol table anyway, so sorting
+it is not necessary, so I did this quick sort hack just to
+make it eaiser for YOU to find a symbol.
+               ----------------
+       The LINK pseudo ops take a single operand: the name
+of an .ASM file to be processed next.  For example:
+----------------
+A:TEST1.ASM:
+
+       ORG     100H
+       LXI     H,MSG
+       MVI     C,9
+       CALL    BDOS
+       RET
+       LINK    TEST2
+----------------
+A:TEST2.ASM:
+
+MSG    DB      'Linked'
+BDOS   EQU     5
+----------------
+       Then assemble it:
+
+A>LINKASM TEST1.AZX
+LINKASM AS OF 7/13/79
+
+
+ 0100                  ORG     100H
+ 0100 210901           LXI     H,MSG
+ 0103 0E09             MVI     C,9
+ 0105 CD0500           CALL    BDOS
+ 0108 C9               RET
+                        LINK   TEST2
+ 0109 4C696E6B65MSG     DB     'Linked'
+ 0005 =                BDOS    EQU     5
+010F
+000H use factor
+8 input lines read
+End of assembly
+
+               ----------------
+       I will make one apology for LINKASM - I neglected
+to put in an error message saying the name of the missing
+file, if you should accidentally LINK to a non-existant file. 
+It just says the source file is not present.
+       If necessary, you can find the name which was
+being searched for.  It's in memory at 186H.  If you have
+a PROM monitor, you can examine it.  If not, do the following
+BEFORE executing any more COM programs following the LINKASM:
+
+       SAVE 1 BADNAME.COM      Save 100-1ff to disk     
+       DDT BADNAME.COM         Bring in under DDT (or SID)
+       D186,190                Dump the name
+       ^C                      Reboot (some people use G0)
+       ERA BADNAME.COM         ERA the temporary file.
+
+Sorry for that hack, but I thought it better to put LINKASM
+in the CP/M UG with that problem, rather than holding it
+back "trying to make it perfect".
+               ----------------
+I have not encountered any problems using LINKASM as my
+main assembler for about the last 6 months.  Among other
+things, I use it to assemble CBBS.ASM which, with its 14
+or so LINKed files, is over 6000 lines.  It takes about 5 1/2
+minutes, as I recall (HEX and SYM, no PRN).
+
+                               Ward Christensen
diff --git a/m80unv.mac b/m80unv.mac
new file mode 100644 (file)
index 0000000..a0e3b25
Binary files /dev/null and b/m80unv.mac differ
diff --git a/m80v6.doc b/m80v6.doc
new file mode 100644 (file)
index 0000000..296da91
Binary files /dev/null and b/m80v6.doc differ
diff --git a/m80v7.doc b/m80v7.doc
new file mode 100644 (file)
index 0000000..c22a5fc
Binary files /dev/null and b/m80v7.doc differ
diff --git a/m80v7.msg b/m80v7.msg
new file mode 100644 (file)
index 0000000..351d98c
Binary files /dev/null and b/m80v7.msg differ
diff --git a/mac80.cmd b/mac80.cmd
new file mode 100644 (file)
index 0000000..fbfc672
Binary files /dev/null and b/mac80.cmd differ
diff --git a/mac80.doc b/mac80.doc
new file mode 100644 (file)
index 0000000..dc29615
Binary files /dev/null and b/mac80.doc differ
diff --git a/mac80.mac b/mac80.mac
new file mode 100644 (file)
index 0000000..6b11f05
--- /dev/null
+++ b/mac80.mac
@@ -0,0 +1,412 @@
+;MAC80 - An 8085 cross assembler for the DECsystem-10
+
+;      Copyright 1976,1977,1978,1983
+;      Bruce Tanner / Cerritos College
+;      11110 Alondra Blvd.
+;      Norwalk, CA 90650
+
+
+       SEARCH M80UNV,JOBDAT,MACTEN
+       TITLE.  (M80,MAC80,8085 Cross Assembler)
+       M80TTL
+       M80137
+
+       SUBTTL  COMMAND SCANNER
+
+       TWOSEG
+       RELOC   400000
+
+MAC80: TDZA    F,F             ;CLEAR FLAGS
+       MOVSI   F,FL.CCL        ;CCL ENTRY
+       SETZM   SVJBFF          ;ZERO AT START
+START::        RESET                   ;RESET ALL I/O
+       MOVE    P,PDP           ;SET UP PDL
+       SKIPE   T1,SVJBFF       ;1ST TIME THRU?
+       JRST    .+4             ;NO--RESET .JBFF
+       MOVE    T1,.JBFF        ;YES--GET .JBFF
+       MOVEM   T1,SVJBFF       ;AND SAVE IT
+       JRST    .+4             ;AND SKIP THE CORE CONTRACTION
+       MOVEM   T1,.JBFF        ;RESET FIRST FREE
+       CORE    T1,             ;SHRINK CORE BACK DOWN
+         JRST  CORERR          ;IMPROBABLE
+       SETZB   P2,LOOKIT       ;TEMP (P2) & 1ST LOC OF TEMP STORAGE
+       MOVE    T1,[FILNAM,,FILNAM+1]   ;REST OF TEMP STORAGE
+       BLT     T1,ENDLOW       ;BBLLLIIIITTTTT!
+       SETZM   SYMTAB##        ;START OF STORAGE
+       MOVE    T1,[SYMTAB,,SYMTAB+1]
+       BLT     T1,ENDHGH##     ;BLIT
+       MOVE    P1,[POINT 6,P2] ;TEMP POINTER
+       TLNE    F,FL.CCL        ;CCL INPUT?
+       JRST    CCLIN           ;YES
+STAR:  OUTSTR  ASTER           ;HERE IF TTY INPUT
+       PUSHJ   P,INCH          ;GET CHAR
+       CAIL    I,40            ;SPECIAL CHAR?
+       JRST    LOOP1           ;NO--PROCESS
+       CAIN    I,"Z"-100       ;TTY EOF?
+       EXIT    1,              ;YES
+       CLRBFI                  ;CLEAR BUFFER
+       JRST    STAR            ;& TRY AGAIN
+\fINITMP:       SETZ    P2,             ;CLEAR P2
+       MOVE    P1,[POINT 6,P2] ;RESTORE BYTE POINTER
+
+LOOP:  PUSHJ   P,INCH          ;GET CHARACTER FROM WHEREVER
+       JUMPE   I,XIT           ;NULL--END OF THE LINE.
+LOOP1: CAIN    I,40            ;SPACE?
+       JRST    LOOP            ;YES, IGNORE
+       CAIN    I,":"
+       JRST    LOADEV          ;IF COLON-LOAD THE DEVICE
+       CAIE    I,"="
+       CAIN    I,"_"
+       JRST    BACK            ;IF _ OR = STORE REL OR LIST FILE NAME
+       CAIN    I,","
+       JRST    LODRL1          ;IF , STORE REL FILE NAME
+       CAIN    I,"!"
+       JRST    RUNAME          ;IF ! RUN THE PROGRAM
+       CAIN    I,"."
+       JRST    LODFIL          ;IF . LOAD THE FILE NAME
+       CAIN    I,"["
+       JRST    LODPPN          ;IF [ STORE EXT & PROCESS PPN
+       CAIE    I,")"
+       CAIN    I,"]"
+       JRST    LOOP            ;IGNORE ]
+       CAIGE   I,40
+       JRST    DONE            ;IF BREAK, WE'RE DONE
+       CAIE    I,"("
+       CAIN    I,"/"
+       JRST    SWITCH          ;IF A SWITCH, SAVE IT
+       SUBI    I,40            ;CONVERT TO SIXBIT
+       TLNE    P1,770000       ;> 6 CHAR?
+       IDPB    I,P1            ;NO STUFF
+       JRST    LOOP            ;LOOP
+
+LOADEV:        SKIPE   DEVICE          ;IF DEVICE ALREADY FULL
+       JRST    TWODEV          ;HOLLER
+       MOVEM   P2,DEVICE       ;STORE DEVICE
+       JRST    INITMP          ;INIT TEMP & LOOP
+
+LODFIL:        SKIPE   FILNAM          ;FILE NAME ALREADY THERE?
+       JRST    TWOFIL          ;YES
+       MOVEM   P2,FILNAM       ;STORE FILE NAME
+       JRST    INITMP          ;& LOOP
+
+SWITCH:        PUSHJ   P,INCH          ;GET THE SWITCH
+       CAILE   I,140           ;LC?
+       SUBI    I,40            ;FORCE UPPER CASE SWITCH
+       CAIN    I,"C"           ;CREF?
+       JRST    [SETOM  CREFSW          ;YES
+               TRO     F,FR.LST        ;CREF IMPLIES LIST
+               JRST    LOOP]
+       CAIN    I,"S"           ;SYMBOLS?
+       SETOM   SYMBSW          ;YES
+       JRST    LOOP
+
+\fBACK: TRNN    F,FR.LST        ;IF LISTING,
+       JRST    LODRL1+1        ;LOAD REL FILE
+       SKIPN   T1,FILNAM       ;SKIP & LOAD IF FILE NAME THERE
+       MOVE    T1,P2           ;ELSE LOAD TEMP
+       MOVEM   T1,LSTNAM       ;LOAD LIST FILE NAME
+       SETZM   FILNAM          ;CLEAR OLD FILE NAME
+       CAME    P2,LSTNAM       ;DID WE LOAD TEMP ALREADY?
+       MOVEM   P2,LSTEXT       ;NO-TEMP CONTAINS LST EXT.
+       MOVE    T1,DEVICE       ;LOAD THE DEVICE
+       MOVEM   T1,LSTDEV       ;TRANSFER
+       SETZM   DEVICE          ;AND CLEAR DEVICE
+       JRST    INITMP          ;LOOP
+
+LODRL1:        TRO     F,FR.LST        ;COMMA INPLIES LIST FILE
+       SKIPN   T1,FILNAM       ;SKIP & LOAD IF FILE NAME THERE
+       MOVE    T1,P2           ;ELSE LOAD TEMP
+       MOVEM   T1,RELNAM       ;LOAD RELFILE NAME
+       SETZM   FILNAM          ;CLEAR FILE NAME
+       CAME    P2,RELNAM       ;DID WE LOAD TEMP?
+       MOVEM   P2,RELEXT       ;NO-LOAD RELFILE EXT.
+       SKIPN   T1,DEVICE
+       MOVE    T1,[SIXBIT/DSK/]
+       MOVEM   T1,OBJDEV
+       SETZM   DEVICE
+       JRST    INITMP          ;LOOP
+
+LODPPN:        SETZ    T1,
+       SKIPE   PPN
+       JRST    TWOPPN
+       PUSHJ   P,GETOCT
+       CAIE    I,","
+       JRST    ILLDEL
+       HRLZM   T1,PPN
+       SETZ    T1,
+       PUSHJ   P,GETOCT
+       HRRM    T1,PPN
+       JRST    LOOP1
+
+DONE:  PUSHJ   P,INCH
+       CAIN    I,CR
+       PUSHJ   P,INCH
+       SKIPN   T1,DEVICE       ;IF DEVICE IS OMITTED...
+       HRLZI   T1,'DSK'        ;... "DSK" IS ASSUMED
+       MOVEM   T1,DEVICE       ;STORE THE DEVICE
+       SKIPE   FILNAM          ;IF THERE IS A FILE NAME
+       JRST    TSTEXT          ;SEE IF THERE IS AN EXTENSION
+       SKIPN   T1,P2           ;IS THERE SOMETHING IN TEMP?
+       JRST    START           ;NO - BAD SYNTAX
+       MOVEM   T1,FILNAM       ;MOVE WHATEVER
+       JRST    DO.IO           ;AND START DOING THE I/O
+\fTSTEXT:       SKIPN   FILEXT          ;ALREADY FILE EXTENSION?
+       HLLZM   P2,FILEXT       ;NO--STORE TEMP
+DO.IO: MOVEI   T1,0            ;ASCII
+       SETZ    T4,
+       MOVE    T2,DEVICE       ;INPUT DEVICE
+       HRRZI   T3,IBUF
+       OPEN    SRC,T1
+         JRST  NODEV
+       MOVEI   T1,0            ;ASCII
+       SETZ    T4,
+       MOVE    T2,DEVICE       ;INPUT DEVICE
+       HRRZI   T3,MBUF
+       OPEN    LIB,T1
+         JRST  NODEV
+RELOOK:        MOVE    T1,FILNAM
+       MOVE    T2,FILEXT
+       SETZ    T3,
+       MOVE    T4,PPN
+       LOOKUP  SRC,T1
+         JRST  NOFILE
+       TRNN    F,FR.LST        ;NEED A LIST FILE?
+       JRST    NOLST           ;NO
+       SETZ    T1,
+       SKIPN   T2,LSTDEV
+       MOVSI   T2,'DSK'
+       HRLZI   T3,LBUF
+       OPEN    LST,T1
+         JRST  NODEV
+       SKIPN   T1,LSTNAM
+       MOVE    T1,FILNAM
+       SKIPN   T2,LSTEXT
+       MOVSI   T2,'LST'
+       SETZB   T3,T4
+       ENTER   LST,T1          ;MAKE THE LISTFILE
+         JRST  ENTERR
+NOLST: SKIPN   SYMBSW          ;IF NO SYMBOL FILE
+       JRST    NOSYM           ;SKIP THIS
+       SETZ    T1,
+       SKIPN   T2,SYMDEV
+       MOVSI   T2,'DSK'
+       HRLZI   T3,SBUF
+       OPEN    SYM,T1
+         JRST  NODEV
+       SKIPN   T1,SYMNAM
+       MOVE    T1,FILNAM
+       SKIPN   T2,SYMEXT
+       MOVSI   T2,'SYM'
+       SETZB   T3,T4
+       ENTER   SYM,T1          ;MAKE THE SYMBOL FILE
+         JRST  ENTERR
+NOSYM: TLNN    F,FL.CCL
+       JRST    MAC80A##
+       OUTSTR  [ASCIZ/MAC80:   /]
+       MOVE    T1,FILNAM       ;GET THE FILENAME
+       PUSHJ   P,TYPE          ;TYPE IT
+       OUTSTR  [ASCIZ/
+/]
+       SETZ    P2,
+       MOVEM   P3,TMPPTR       ;SAVE TMPCOR BUFFER POINTER
+       JRST    MAC80A
+
+GETOCT:        PUSHJ   P,INCH
+       CAIN    I,40
+       JRST    GETOCT
+       CAIG    I,"7"
+       CAIGE   I,"0"
+       POPJ    P,
+       IMULI   T1,10
+       ADDI    T1,-60(I)
+       JRST    GETOCT
+\fOPNOBJ::PUSH  P,T2
+       PUSH    P,T3
+       PUSH    P,T4
+       SETZ    T4,
+       SKIPN   T2,OBJDEV       ;DEVICE
+       MOVSI   T2,'DSK'
+       MOVSI   T3,OBUF
+       OPEN    OBJ,T1
+         JRST  NODEV
+       SKIPN   T1,RELNAM
+       MOVE    T1,FILNAM
+       SKIPN   T2,RELEXT
+       MOVSI   T2,'HEX'
+       SETZB   T3,T4
+       ENTER   OBJ,T1
+         JRST  ENTERR
+       POP     P,T4
+       POP     P,T3
+       POP     P,T2
+       POPJ    P,
+
+RUNAME:        PUSHJ   P,INCH
+       CAIN    I,15
+       PUSHJ   P,INCH
+       MOVEI   T1,T2
+       HRLI    T1,1
+       SKIPN   T2,DEVICE
+       MOVSI   T2,'SYS'
+       MOVE    T3,P2
+       SETZB   T4,T4+1
+       SETZB   T4+2,T4+3
+       RUN     T1,
+       HALT
+
+\fINCH: TLNN    F,FL.CCL        ;CCL INPUT?
+       JRST    .+3             ;NO, SKIP
+       ILDB    I,P3            ;GET TMPCOR CHAR
+       JRST    .+2             ;JUST IN CASE...
+       INCHWL  I               ;GET TTY CHAR.
+       CAIL    I,140           ;IF LOWER CASE,
+       SUBI    I,40            ;CONVERT TO UPPER CASE
+       POPJ    P,              ;RETURN
+
+TYPE:  MOVE    T2,[POINT 6,T1]
+       TLNN    T2,770000
+       POPJ    P,
+       ILDB    T3,T2
+       JUMPE   T3,.-2
+       ADDI    T3,40
+       OUTCHR  T3
+       JRST    TYPE+1
+
+NODEV: MOVE    T1,T2
+       OUTSTR  [ASCIZ/Cannot OPEN device /]
+       PUSHJ   P,TYPE
+       OUTSTR  [BYTE (7) 15,12,0,0,0]
+       JRST    START
+
+ENTERR:        OUTSTR  [ASCIZ/ENTER error for file /]
+       PUSH    P,T2
+       PUSHJ   P,TYPE
+       POP     P,T2
+       HLRZ    T1,T2
+       JUMPE   T1,.+3
+       OUTCHR  ["."]
+       PUSHJ   P,TYPE
+       OUTSTR  [BYTE (7) 15,12,0]
+       JRST    START
+
+NOFILE::SKIPE  FILEXT
+       JRST    .+4
+       MOVSI   T1,'M80'
+       MOVEM   T1,FILEXT
+       JRST    RELOOK
+       MOVE    T1,FILNAM
+       OUTSTR  [ASCIZ/No such file /]
+       PUSHJ   P,TYPE
+       MOVE    T1,FILEXT
+       JUMPE   T1,.+3
+       OUTCHR  ["."]
+       PUSHJ   P,TYPE
+       OUTSTR  [BYTE (7) 15,12,0,0,0]
+       JRST    START
+\fTWODEV:       OUTSTR  [ASCIZ/Two devices
+/]
+       JRST    CSTART
+
+TWOFIL:        OUTSTR  [ASCIZ/Two file names
+/]
+       JRST    CSTART
+
+TWOPPN:        OUTSTR  [ASCIZ/Two PPNs
+/]
+       JRST    CSTART
+
+ILLDEL:        OUTSTR  [ASCIZ/Illegal delimiter in PPN
+/]
+
+CSTART:        TLNN    F,FL.CCL        ;CCL INPUT?
+       CLRBFI                  ;SHOULDN'T BE
+       JRST    START           ;RESTART SCAN
+
+CORERR:        OUTSTR  [ASCIZ/?Cannot shrink core
+/]
+       JRST    CSTART
+
+ASTER: ASCIZ /
+*/
+
+XIT:   EXIT    1,              ;EXIT GRACEFULLY
+       EXIT                    ;NO SO GRACEFULLY
+\fCCLIN:        SKIPE   P3,TMPPTR       ;WAS THERE A TMPCOR BUFFER POINTER?
+       JRST    INITMP          ;YES--LOADED & GONE
+       MOVE    T1,[2,,TMPBLK]  ;NO, GET TMPCOR FILE (1 IS READ)
+       TMPCOR  T1,
+       PUSHJ   P,NOTEMP
+       MOVE    P3,[POINT 7,TBUF]
+       JRST    INITMP
+
+NOTEMP:        MOVEI   T1,17           ;NO TMPCOR--TRY DISK
+       MOVSI   T2,'DSK'
+       SETZB   T3,T4
+       OPEN    TMPC,T1         ;OPEN DISK
+         JRST  NODEV
+       PJOB    T1,             ;GET JOB NUMBER
+       SETZ    T3,
+       IDIVI   T1,12           ;AND CONVERT
+       TRO     T2,20           ;TO TMPDISK FILE NAME
+       LSHC    T2,-6           ;BY THE TRIED & TRUE METHOD
+       TLNN    T3,77
+       JRST    .-4
+       MOVE    T1,T3
+       HRRI    T1,'MAC'
+       MOVSI   T2,'TMP'        ;NNNMAC.TMP
+       SETZB   T3,T4
+       LOOKUP  TMPC,T1         ;LOOKUP
+         JRST  MAC80           ;NO CCL FILE, ASSUME TTY INPUT
+       INPUT   TMPC,TMPBLK+1   ;PUT INTO TMPCOR BUFFER
+       SETZ    T1,
+       RENAME  TMPC,T1         ;DELETE TMPDSK FILE
+        OUTSTR NOREN           ;FAILURE
+       RELEAS  TMPC,
+       POPJ    P,              ;BACK
+
+
+NOREN: ASCIZ/Cannot delete temp disk file
+/
+
+PDP:   IOWD 100,PDL
+
+TMPBLK:        SIXBIT  /MAC/
+       IOWD 30,TBUF
+       0
+
+       XLIST
+       LIT
+       LIST
+\f      RELOC   0
+
+TBUF:  BLOCK 30        ;DONT CLEAR TMPCOR BUFFER
+TMPPTR:        BLOCK 1         ;HOLDS TMPCOR BYTE POINTER
+SVJBFF:        BLOCK 1         ;SAVE .JBFF
+                       ;CLEAR REST OF TABLE SPACE
+LOOKIT:
+FILNAM::BLOCK 1
+FILEXT::BLOCK 1
+       BLOCK 1
+PPN::  BLOCK 1
+OBJDEV::BLOCK 1
+RELNAM:        BLOCK 1
+RELEXT:        BLOCK 1
+LSTNAM:        BLOCK 1
+LSTEXT:        BLOCK 1
+SYMNAM:        BLOCK 1
+SYMEXT:        BLOCK 1
+DEVICE:        BLOCK 1
+LSTDEV:        BLOCK 1
+SYMDEV:        BLOCK 1
+PDL:   BLOCK 40        ;PDL STORAGE
+IBUF:: BLOCK 3
+OBUF:: BLOCK 3         ;BUFFER HEADERS
+LBUF:: BLOCK 3         ;LISTING FILE
+SBUF:: BLOCK 3         ;SYMBOL FILE
+MBUF:: BLOCK 3         ;MACLIB
+CREFSW::BLOCK 1                ;NON-ZERO IF CROSS REFERENCE LISTING REQUESTED
+SYMBSW::BLOCK 1                ;NON-ZERO IF SYMBOL TABLE DUMP REQUESTED
+ENDLOW:        BLOCK 1         ;TOP OF STORAGE
+
+       END     MAC80
+\0\0
\ No newline at end of file
diff --git a/mac80a.mac b/mac80a.mac
new file mode 100644 (file)
index 0000000..da2e1f0
--- /dev/null
@@ -0,0 +1,2731 @@
+;MAC80 - An 8085 cross assembler for the DECsystem-10
+
+;      Copyright 1976,1977,1978,1983
+;      Bruce Tanner / Cerritos College
+;      11110 Alondra Blvd.
+;      Norwalk, CA 90650
+
+       SEARCH  M80UNV,MACTEN
+
+       TITLE.  (M80,MAC80A,8085 Cross Assembler)
+       M80TTL
+       M80PTX
+
+       TWOSEG
+       RELOC   400000
+
+       EXTERN IBUF,OBUF,LBUF,SBUF,MBUF,NOFILE,FILNAM,FILEXT,PPN,OPNOBJ
+       EXTERN CREFSW,SYMBSW
+
+MAC80A::MOVE   T1,[PUSHJ P,UUO]
+       MOVEM   T1,.JB41##
+       MOVE    T1,[IOWD 20,MACSTK]
+       MOVEM   T1,MACPDL
+       MOVE    T1,[IOWD 20,ARGSTK]
+       MOVEM   T1,ARGPDL
+       MOVEI   T1,-1
+       MOVEM   T1,INVECT
+       MOVE    T1,[POINT 7,MACARG]
+       MOVEM   T1,ARGPTR
+       MOVEI   T1,1
+       MOVEM   T1,PAGENO
+       SETZM   LOCSYM
+       MOVEI   T1,PAGEMX
+       MOVEM   T1,PAGESZ
+       SETOM   STARTA
+       SETZB   E,LBTP
+       SETZ    BC,
+       SETZM   ORGXR
+       TDO     F,[FL.LNR,,FR.PS1!FR.HEX]
+RESTAR:        TRNE    F,FR.PS1        ;PASS1?
+       JRST    PASS1           ;YES
+       OUTSTR  [ASCIZ/Pass 2
+/]
+       SETZM   PC
+       SETZM   LINENO
+       SETZM   LOCSYM
+       MOVEI   T1,PAGEMX
+       MOVEM   T1,PAGESZ
+       PUSHJ   P,GTDATE
+       PUSHJ   P,DOHEAD        ;OUTPUT THE HEADINGS
+;      JRST    MAIN.           ;JUMP TO THE MAIN LINE
+\fMAIN.:        TRZ     F,FR.LOP        ;CLEAR LIST OP FLAG
+       TRZE    F,FR.END        ;IF END
+       JRST    ENDIT           ;FINI
+       PUSHJ   P,INCH          ;SNEAK A LOOK FOR FF
+       TRNN    F,FR.LIB        ;IF NOT IN MACLIB
+       PUSHJ   P,DOLINO        ;PRINT LINE #
+       PUSHJ   P,TOKEN1        ;GET TOKEN WITH 1ST CHAR IN I
+       JRST    MAIN1
+
+DUNTAG:        TRZE    F,FR.END        ;DONE?
+       JRST    ENDIT           ;YES
+       PUSHJ   P,TOKEN         ;GET A TOKEN
+MAIN1: PUSHJ   P,IFPOP         ;AN "IF" TYPE PSEUDO OP?
+       JRST    NOTEST          ;YES
+       TRNE    F,FR.OFF        ;ASSEMBLING?
+       JRST    FLUSHX          ;NO
+NOTEST:        JUMPN   TOK,.+4         ;SKIP IF SOMETHING
+       CAIE    I,CR            ;EOL?
+       CAIN    I,SEMICO        ;COMMENT?
+       JRST    FLUSHX          ;YES
+       CAIN    I,COLON         ;TAG?
+       JRST    DOTAG           ;YES
+       PUSHJ   P,SRCHOP        ;SEARCH OPCODE
+       JRST    [PUSHJ  P,SETMAC
+               JRST    MAIN.]
+       MOVE    OP,OPCTAB(X)    ;STORE THE OPCODE
+       MOVE    P1,TYPLSH(X)    ;GET TYPE,,SHIFT
+       TLNE    P1,T.POP        ;PSEUDO OP?
+       JRST    [PUSHJ  P,PSEUDO        ;YUP
+               JRST    MAIN.]
+       TLNE    P1,T.1BYT       ;JUST OPCODE?
+       JRST    ONEOP           ;1 BYTE INSTRUCTION
+       TLNE    P1,T.NREG       ;USES REGISTER?
+       JRST    BYTE3           ;NO REGISTER
+DOREG: PUSHJ   P,TOKEN         ;GET THE NEXT TOKEN
+       PUSHJ   P,EVAL          ;EVALUATE THE TOKEN
+       CAIL    T1,10           ;LEGAL REGISTER?
+       WARN    W.REG           ;NO.
+       ANDI    T1,7            ;MAKE LEGAL
+       TRNE    P1,4            ;REGISTER PAIR?
+       LSH     T1,-1           ;YES, MAKE 2 BITS WIDE
+       LSH     T1,(P1)         ;SHIFT ACCORDING TO LSH(X)
+       OR      OP,T1           ;MERGE
+       TLZE    P1,T.MOV        ;A MOVE?
+       JRST    [TRZ    P1,-1   ;YES - CLEAR LSH
+               JRST    DOREG]  ;AND MERGE OTHER REG
+       TLNE    P1,T.2BYT!T.3BYT        ;2 OR 3 BYTE INSTR?
+       JRST    BYTE3           ;GO ON AND DO DATA BYTES
+ONEOP: PUSHJ   P,OUTOP         ;OUTPUT THE ONE BYTE
+       PUSHJ   P,SPACE4
+       PUSHJ   P,SPACE4
+FLUSHX:        PUSHJ   P,FLUSH         ;FLUSH THE REST OF THE LINE
+       JRST    MAIN.
+\fBYTE3:        PUSHJ   P,LSTPC         ;OUTPUT THE OPCODE
+       MOVE    T1,OP
+       PUSHJ   P,LSTOP
+       PUSHJ   P,TOKEN         ;GET THE DATA BYTE(S)
+       JUMPN   TOK,NOTMT       ;NOT EMPTY
+       CAIE    I,15            ;BREAK ON EOL?
+       CAIN    I,SEMICO
+       WARN    W.MT            ;DEFENSIVE CODE
+NOTMT: PUSHJ   P,DODATA        ;COMP. EFFECTIVE ADDR
+       MOVE    T1,OP
+       PUSHJ   P,LSTOP         ;OUTPUT THE LOWER 8 BITS
+       LSH     OP,-10          ;SHIFT DOWN
+       TLNE    P1,T.2BYT       ;JUST 1 DATA BYTE?
+       JRST    NOP1
+       MOVE    T1,OP
+       PUSHJ   P,LSTOP         ;OUTPUT UPPER 8 BITS
+NOP1:
+IFN FTREL,<
+       SETZ    T1,             ;CLEAR FOR TEST
+       TRZE    F,FR.REL        ;RELOCATABLE?
+       MOVEI   T1,"'"          ;FLAG AS
+       TRZE    F,FR.EXT        ;EXTERNAL?
+       MOVEI   T1,"*"          ;INDICATOR
+       SKIPE   T1              ;ANYTHING THERE?
+       PUSHJ   P,LOUCH         ;YES, PRINT IT
+> ;END IFN FTREL
+       TLNE    P1,T.2BYT       ;NEED SPACES?
+       PUSHJ   P,SPACE4        ;YES
+       JRST    FLUSHX          ;LOOP
+
+SPACE4:        TRNE    F,FR.HEX
+       POPJ    P,
+       MOVEI   T1,SPACE
+       REPEAT 4,<
+       PUSHJ   P,LOUCH>
+       POPJ    P,
+\f;EVAL TOKEN IN TOK (AND REST OF EXPR IF ANY) RETURN VALUE IN OP
+
+DODATA:        TRZ     F,FR.UND        ;CLEAR STATUS
+       SETZM   EXPLVL          ;INIT EXPR LEVEL
+       MOVE    T4,[IOWD 20,OPSTK]
+       PUSH    T4,[DOLLAR]     ;FLAG TOP OF STACK
+       SETZ    T2,             ;CLEAR FLAG
+       PUSH    P,T2
+       JRST    DODT12          ;JUMP IN
+
+DODAT1:        CAIE    I,COMMA
+       CAIN    I,SEMICO        ;KNOWN TERMINATORS?
+       JRST    DODAT4          ;YES
+       CAIE    I,")"           ;END OF EXPR
+       CAIN    I,CR            ;OR EOL?
+       JRST    DODAT4          ;YES
+       CAIE    I,"<"           ;SPECIAL CASE TEST FOR <=,>=,<>
+       CAIN    I,">"
+       PUSHJ   P,OP2CH         ;CHECK FOR 2 CHAR OPCODE
+       PUSH    T4,I            ;SAVE ON OP STACK
+       CAIE    I,SPACE
+       CAIN    I,TAB           ;IF SPACE OR TAB
+       CAIA                    ;KEEP LOOKING FOR OP
+       JRST    DODT10          ;HAVE OP ON STACK, GET 2ND ARG
+       POP     T4,(T4)         ;OP IS JUST SPACE OR TAB
+       PUSHJ   P,TOKEN         ;GET OP TOKEN
+       JUMPE   TOK,DODAT1      ;OP IS BREAK, DODAT1 WILL DO IT
+       PUSH    T4,TOK          ;SAVE OP AS 6BIT TOKEN
+                               ;AT THIS POINT I MAY CONTAIN UNARY OP.
+       CAIE    I,SPACE
+       CAIN    I,TAB           ;BETTER CONTAIN SPACE
+       JRST    DODT10
+       CAIN    I,MINUS         ;UNARY MINUS?
+       JRST    [PUSH   P,T2
+               JRST    DODT21] ;YES
+       CAIE    I,"("           ;THIS IS THE ONLY NON BLANK THING ALLOWED
+       ERROR   F.ILEX
+DODT10:        PUSH    P,T2
+       CAIE    I,"("           ;DON'T LET TOKEN BUST INTO EXPR
+       PUSHJ   P,TOKEN         ;GET NEXT TOKEN
+DODT12:        SKIPE   TOK             ;IF NO TOKEN
+       JRST    DODT20
+       CAIN    I,MINUS         ;THEN THIS IS A UNARY MINUS
+DODT21:        MOVEI   I,"@"           ;SPECIAL SYMBOL FOR UNARY MINUS
+DODT20:        CAME    TOK,[SIXBIT/NOT/]       ;THE OTHER UNARY OPERATOR?
+       CAMN    TOK,[SIXBIT/HIGH/]
+       JRST    DODT23                  ;YES
+       CAME    TOK,[SIXBIT/LOW/]
+       CAMN    TOK,[SIXBIT/LO/]
+       JRST    DODT23
+       CAME    TOK,[SIXBIT/NUL/]
+       CAMN    TOK,[SIXBIT/NULL/]
+       JRST    DODT23
+       JRST    DODT22          ;NO, SKIP
+
+DODT23:        POP     P,T2            ;RESTORE T2
+       PUSH    T4,TOK          ;SAVE OP
+       SETZB   T1,TOK          ;CLEAR TOK IN CASE NOT(EXPR)
+       SETZ    TOK+1,
+       PUSH    P,T1            ;SAVE DUMMY ARG (DUMMY NOT FOO)
+       JRST    DODT10          ;NOW GET A TOKEN
+\fDODT22:       PUSHJ   P,EVALD         ;EVAL TOKEN (OR EXPR)
+       POP     P,T2
+DODT13:        PUSH    P,I             ;SAVE I
+       MOVE    I,(T4)          ;GET LAST OP
+       CAIN    I,DOLLAR        ;NO LAST OP?
+       JRST    DODT14          ;SKIP
+       PUSHJ   P,DINDEX        ;GET INDEX IN T3
+       MOVE    OP,PRIOR(T3)    ;GET PRIORITY OF LAST OP IN T3 (1 IS HIGEST)
+       MOVE    I,-1(T4)        ;GET OP PREVIOUS TO LAST OP
+       CAIN    I,DOLLAR        ;NOT THERE?
+       JRST    DODT14          ;SKIP
+       PUSHJ   P,DINDEX        ;GET INDEX OF THIS ONE
+       CAML    OP,PRIOR(T3)    ;CAN WE EVAL YET?
+       JRST    DODT15          ;YES
+;NOTE: THIS IMPLIES LEFT-TO-RIGHT SCAN OF EQUAL PRI. UNARY OPS MAY NOT BE PUT TOGETHER.
+DODT14:        POP     P,I             ;DONE WITH I
+       PUSH    P,T1            ;SAVE VALUE ON STACK
+       TRNN    F,FR.REL!FR.EXT ;ABS?
+       TRO     T2,1            ;FLAG ABS
+       TRNE    F,FR.REL        ;RELOC?
+       TRC     T2,2            ;ABS & REL = REL; REL & REL = ABS
+       TRNE    F,FR.EXT        ;EXTERNAL?
+       ADDI    T2,10
+       JRST    DODAT1          ;KEEP GOING
+
+DODT15:        POP     P,I             ;DONE WITH I (DODT13)
+       MOVEM   T1,SAVREG       ;SAVE T1
+       POP     T4,SAVREG+1     ;& LAST OPERATOR
+       POP     P,T1
+       POP     P,OP
+       MOVEM   I,SAVREG+2
+       POP     T4,I            ;GET CURRENT OP
+       PUSHJ   P,DINDEX
+       XCT     EXPXCT(T3)      ;DOIT TOIT
+       PUSH    P,OP            ;SAVE NEW VALUE BACK ON STACK
+       MOVE    I,SAVREG+2      ;RESTORE I
+       PUSH    T4,SAVREG+1     ;PUT BACK LAST OP
+       MOVE    T1,SAVREG       ;RESTORE LAST ARG
+       JRST    DODT13          ;SEE IF WE CAN COMPRESS MORE
+\fDODAT4:       CAIE    I,")"           ;IF EOE
+       JRST    .+4
+       SOSGE   EXPLVL          ;IF WE WERE AT TOP LEVEL..
+       ERROR   F.PARN
+       JRST    .+3
+       SKIPE   EXPLVL          ;THE REST BETTER BE AT TOP LEVEL
+       ERROR   F.PARN
+       POP     P,OP            ;GET VALUE
+       MOVEM   I,SAVREG+3      ;SAVE I
+DODAT5:        POP     T4,I            ;GET OP
+       CAIN    I,DOLLAR        ;ALL DONE?
+       JRST    DODATX          ;YES
+       MOVE    T1,OP
+       POP     P,OP            ;GET 2ND ARG
+       PUSHJ   P,DINDEX        ;GET INDEX IN T3
+       XCT     EXPXCT(T3)      ;DO IT
+       JRST    DODAT5          ;LOOP
+
+DODATX:        MOVE    I,SAVREG+3      ;RESTORE I
+       ANDI    OP,177777       ;JUST 16 BITS
+       MOVE    T1,OP           ;GET NUMBER
+       CAIN    T2,10           ;ONE EXTERN?
+       JRST    DODAT3          ;YES
+       CAILE   T2,3            ;1 (ABS) OR 2 OR 3 (REL) ?
+       ERROR   F.EXT           ;NO POLISH FIXUPS IN THIS ASSEMBLER
+DODAT3:        TRZ     F,FR.REL!FR.EXT ;CLEAR STATUS OF LAST TOKEN
+IFN FTREL,<
+       TRNE    T2,2            ;IF REL
+       TRO     F,FR.REL        ;FLAG
+       CAIN    T2,10           ;IF EXTERN
+       TRO     F,FR.EXT        ;FLAG
+       TRNN    F,FR.PS1        ;IF PASS1
+       SKIPN   T2              ;OR NON-RELOCATABLE
+       POPJ    P,              ;RETURN
+       TRNE    F,FR.HEX        ;IF OCTAL FORMAT
+       TRNE    F,FR.EXT        ;OR EXTERN
+       POPJ    P,              ;EXIT
+       CAIE    T2,1            ;IF FLAGED AS ABS,
+       TRNE    F,FR.ORG        ;OR NOT RELOCATING
+       POPJ    P,
+       EXCH    T1,RELPTR
+       MOVE    T2,PC
+       MOVEM   T2,RELTAB(T1)   ;SAVE PC FOR NEXT LINK
+       AOJ     T1,             ;BUMP POINTER
+       EXCH    T1,RELPTR
+>      ;END IFN FTREL
+       POPJ    P,              ;RETURN
+
+OP2CH: PUSH    P,T1
+       PUSH    P,T2
+       MOVE    T1,I            ;SAVE I
+       MOVE    T2,I
+       SUBI    T2,40           ;SIXBIT
+       LSH     T2,^D30         ;SHIFT TO 1ST BYTE
+       PUSHJ   P,SNEAK         ;LOOK AT THE NEXT CHARACTER
+       SKIPE   TOK             ;NON-BREAK?
+       JRST    OLDI            ;YES, NOT A 2 CHAR OPCODE
+       MOVE    I,SNEAKI        ;GET THE BREAK CHAR
+       SUBI    I,40            ;SIXBIT
+       DPB     I,[POINT 6,T2,11]
+       CAIE    I,'>'
+       CAIN    I,'='           ;GOOD 2ND CHAR?
+       PUSHJ   P,INCH          ;YES, USE IT
+NEWI:  SKIPA   I,T2
+OLDI:  MOVE    I,T1            ;RESTORE I
+       POP     P,T2
+       POP     P,T1
+       POPJ    P,
+
+\f      DEFINE OPRMAC,<
+E      "+",<ADD OP,T1>,4
+E      "-",<SUB OP,T1>,4
+E      "@",<MOVN OP,T1>,2
+E      "*",<IMUL OP,T1>,3
+E      "/",<PUSHJ P,EXDIV>,3
+E      "\",<PUSHJ P,EXMOD>,3
+E      "&",<AND OP,T1>,6
+E      "!",<OR OP,T1>,5
+E      "_",<LSH OP,(T1)>,6
+E      "#",<SETCM OP,T1>,2
+E      'AND   ',<AND OP,T1>,6
+E      'OR    ',<OR OP,T1>,7
+E      'MOD   ',<PUSHJ P,EXMOD>,1
+E      'XOR   ',<XOR OP,T1>,7
+E      'SHR   ',<PUSHJ P,EXSHR>,3
+E      'SHL   ',<LSH OP,(T1)>,3
+E      'NOT   ',<SETCM OP,T1>,2
+E      'HIGH  ',<LDB OP,[POINT 8,T1,27]>,10
+E      'LOW   ',<LDB OP,[POINT 8,T1,35]>,10
+E      'LO    ',<LDB OP,[POINT 8,T1,35]>,10
+E      'EQ    ',<PUSHJ P,RELEQ>,5
+E      "=",<PUSHJ P,RELEQ>,5
+E      'NE    ',<PUSHJ P,RELNE>,5
+E      '<>    ',<PUSHJ P,RELNE>,5
+E      'LT    ',<PUSHJ P,RELLT>,5
+E      "<",<PUSHJ P,RELLT>,5
+E      'GT    ',<PUSHJ P,RELGT>,5
+E      ">",<PUSHJ P,RELGT>,5
+E      'GE    ',<PUSHJ P,RELGE>,5
+E      <BYTE (6) 36,35>,<PUSHJ P,RELGE>,5
+E      'LE    ',<PUSHJ P,RELLE>,5
+E      <BYTE (6) 34,35>,<PUSHJ P,RELLE>,5
+E      'NUL   ',<PUSHJ P,DONULL>,1
+E      'NULL  ',<PUSHJ P,DONULL>,1
+>
+
+       DEFINE E(CHAR,INSTR,PRI),<
+       CHAR>
+
+OPRTAB:        XLIST
+       OPRMAC
+       LIST
+OPRTBL==.-OPRTAB
+\f      DEFINE E(CHAR,INSTR,PRI),<
+       INSTR>
+
+EXPXCT:        XLIST
+       OPRMAC
+       LIST
+       ERROR   F.ILEX          ;EXECUTED IF OP IS NOT IN OPRMAC
+
+       DEFINE E(CHAR,INSTR,PRI),<
+       EXP     PRI>
+
+PRIOR: XLIST
+       OPRMAC
+       LIST
+\fEXDIV:        PUSH    P,OP+1
+       IDIV    OP,T1
+       POP     P,OP+1
+       POPJ    P,
+
+EXMOD: PUSH    P,OP+1
+       IDIV    OP,T1
+       MOVE    OP,OP+1
+       POP     P,OP+1
+       POPJ    P,
+
+EXSHR: MOVNS   T1
+       LSH     OP,(T1)
+       POPJ    P,
+
+RELEQ: CAME    OP,T1
+FALSE: TDZA    OP,OP           ;0 = FALSE
+TRUE:  SETO    OP,             ;-1 = TRUE
+       POPJ    P,
+
+RELNE: CAMN    OP,T1
+       JRST    FALSE
+       JRST    TRUE
+
+RELLT: CAML    OP,T1
+       JRST    FALSE
+       JRST    TRUE
+
+RELLE: CAMLE   OP,T1
+       JRST    FALSE
+       JRST    TRUE
+
+RELGT: CAMG    OP,T1
+       JRST    FALSE
+       JRST    TRUE
+
+RELGE: CAMGE   OP,T1
+       JRST    FALSE
+       JRST    TRUE
+
+;NULL = LOCAL SYMBOL GENERATED FOR MISSING ARG, WHICH IS UNDEFINED
+
+DONULL:        TLNN    T1,S.UNDF       ;IS THIS SYMBOL UNDEFINED?
+       JRST    FALSE           ;NO
+       SETZ    E,              ;YES, IT'S NULL; IGNORE THE 'UNDEFINED' ERROR
+       JRST    TRUE
+
+EVALD: CAIE    I,"("           ;A WHOLE EXPR?
+       JRST    EVAL            ;NO, JUST EVAL
+       AOS     EXPLVL          ;FLAG WHICH LEVEL WE'RE IN
+       SETZ    I,              ;GET RID IF PAREN FOR TEST @ DODT10+1
+       PUSH    T4,[DOLLAR]     ;DON'T PLOW THROUGH UPPER LEVEL STUFF
+       PUSHJ   P,DODT10        ;MUNCH ON (EXPR)
+       CAIE    I,CR
+       CAIN    I,SEMICO        ;IF ERROR ON EOL, DODAT4 ALREADY HOLLERED
+       POPJ    P,              ;RETAIN THIS BREAK FOR ANY OTHER LEVELS
+       CAIE    I,")"           ;SHOULD END ON )
+       ERROR   F.ILEX
+       JRST    INCH            ;GET THE BREAK CHAR
+
+DINDEX:        MOVSI   T3,-OPRTBL
+       CAME    I,OPRTAB(T3)
+       AOBJN   T3,.-1
+       SKIPL   T3
+       ERROR   F.ILEX          ;NOT IN TABLE
+       POPJ    P,
+\fTOKEN:        CAIE    I,CR
+       PUSHJ   P,INCH
+TOKEN1:        CAIE    I,SPACE         ;FLUSH LEADING SPACES & TABS
+       CAIN    I,TAB
+       JRST    TOKEN
+       SETZB   TOK,TOK+1
+       MOVE    T1,[POINT 6,TOK]
+       CAIN    I,DOLLAR        ;SPECIAL TEST FOR $
+       POPJ    P,              ;LEADING DOLLAR SIGN IS ASSEMBLER PC
+       CAIA
+TOKENL:        PUSHJ   P,INCH
+       PUSHJ   P,BREAK         ;BREAK CHARACTER?
+       POPJ    P,
+       ;REMOVE THE NEXT 2 LINES FOR $ TO BE A SIGNIFICANT LABEL CHARACTER
+       CAIN    I,DOLLAR        ;IS IT A DOLLAR?
+       JRST    TOKENL          ;YES, THEY ARE NOISE CHARACTERS
+       CAIL    I,"A"+40        ;IF LOWER CASE
+       SUBI    I,40            ;MAKE UPPER CASE
+       SUBI    I,40            ;CONVERT TO SIXBIT
+       CAMN    T1,[600,,TOK+1] ;TOK,TOK+1 FULL?
+       JRST    TOKENW          ;YES, THROW OUT READ OF TOKEN
+       IDPB    I,T1            ;PUT IN TOK
+       JRST    TOKENL
+
+TOKENW:        PUSHJ   P,INCH          ;WASTE REST OF TOKEN
+       PUSHJ   P,BREAK
+       CAIA
+       JRST    TOKENW
+       TRNN    F,FR.SNK        ;DON'T GET UPSET ABOUT OVERFLOW OF '...'
+       WARN    W.TOK
+       POPJ    P,
+
+BREAK: CAIG    I,"Z"
+       CAIGE   I,"A"           ;A-Z?
+       CAIA
+       JRST    SCPOPJ
+       CAIG    I,"9"
+       CAIGE   I,"0"           ;0-9?
+       CAIA
+       JRST    SCPOPJ          ;YES
+       CAIG    I,"Z"+40        ;LC?
+       CAIGE   I,"A"+40
+       CAIA
+       JRST    SCPOPJ
+       CAIE    I,"@"           ;@
+       CAIN    I,"?"           ;AND ? ARE LEGAL
+       JRST    SCPOPJ
+       CAIN    I,DOLLAR        ;$ IS NOW A LEGAL SYMBOL CHARACTER
+       JRST    SCPOPJ
+       POPJ    P,
+
+FLUSHL:        CAIN    I,LF            ;IF ALREADY FLUSHED..
+       JRST    LCRLF           ;NEW LINE
+FLUSH: CAIN    I,LF
+       POPJ    P,
+       PUSHJ   P,INCH          ;GET NEXT CHARACTER
+       JRST    FLUSH           ;LOOP
+\f;BINARY SEARCH OPNTAB
+SRCHOP:        SETO    T1,             ;RANGE START
+       MOVEI   T2,OPTABL       ;RANGE END
+SRCH1: MOVE    T3,T2           ;GET END
+       SUB     T3,T1           ;GET LENGTH OF RANGE
+       IDIVI   T3,2            ;GET 1/2 RANGE
+       JUMPE   T3,SRCH10       ;NOT THERE
+       ADD     T3,T1           ;GET OFFSET INTO RANGE
+       MOVE    X,T3            ;GET IN X
+       CAMN    TOK,OPNTAB(X)   ;MATCH? (ALL TOKENS IN OPNTAB ARE LE 6 CHAR)
+       JRST    SCPOPJ          ;YES, SKIP RET
+       CAML    TOK,OPNTAB(X)
+       MOVE    T1,T3           ;SET NEW RANGE
+       CAMG    TOK,OPNTAB(X)
+       MOVE    T2,T3
+       JRST    SRCH1           ;NO, LOOP
+
+SRCH10:        MOVEI   X,OPTABL        ;POINT TO NULL ENTRY
+       TRZE    F,FR.EVL        ;FROM EVAL?
+       POPJ    P,              ;YES, QUIT NOW.
+       DMOVE   T2,TOK          ;SAVE TOKEN
+       PUSHJ   P,SNEAK         ;SEE IF MACRO DEFINITION
+       CAMN    TOK,[SIXBIT/MACRO/]     ;IS IT?
+       JRST    SRCHOK
+       CAME    TOK,[SIXBIT/EQU/]
+       CAMN    TOK,[SIXBIT/SET/]
+       JRST    SRCHOK
+       JRST    TSTMAC          ;NO, SEE IF IT IS A MACRO ITSELF
+
+SRCHOK:        PUSHJ   P,TOKEN         ;GET NEXT TOKEN
+       CAME    TOK,[SIXBIT/EQU/]       ;NOTE: EQU & SET ARE IDENTICAL
+       CAMN    TOK,[SIXBIT/SET/]       ;GOOD GUYS?
+       JRST    EQUAL           ;YES
+       CAMN    TOK,[SIXBIT/MACRO/]
+       JRST    DOMAC
+TSTMAC:        DMOVE   TOK,T2          ;PUT BACK TOKEN
+       PUSHJ   P,SRCSYM        ;CHECK FOR MACRO
+        JRST   SRCERR          ;NO MACRO
+       TLNE    T1,S.MAC        ;MACRO?
+       POPJ    P,              ;YES, SET UP MACRO
+SRCERR:        ERROR   F.ILOP          ;NO. UNKNOWN OPCODE
+       PUSHJ   P,FLUSH         ;WASTE REST
+       JRST    SCPOPJ
+\fPSEUDO:       MOVSI   X,-PTABL        ;TABLE LENGTH
+       CAME    TOK,PTAB(X)     ;MATCH?
+       AOBJN   X,.-1           ;LOOP
+       JRST    @PDISP(X)       ;DISPATCH
+
+       DEFINE  PMAC,<
+       PX      ORG
+       PX      DS
+       PX      DB,DC
+       PX      DZ,DC
+       PX      DW,DC
+       PX      OPT,OPTION
+       PX      PHASE
+       PX      IFE,DOIFE
+       PX      IFN,DOIFN
+       PX      IF,DOIFN
+       PX      ELSE
+       PX      ENDIF
+       PX      PRINTX
+       PX      TITLE,DOTITL
+       PX      SUBTTL,DOSUBT
+       PX      PAGE,DOPAGE
+       PX      MACLIB
+       PX      REPT
+       PX      EXITM
+IFN FTREL,<
+       PX      INT,DOINT
+       PX      EXT,DOEXT
+>
+       PX      END,DOEND
+>
+
+       DEFINE  PX(NAME,ADDR),<
+       SIXBIT/NAME/>
+
+PTAB:  XLIST
+       PMAC
+       LIST
+       PTABL==.-PTAB
+
+       DEFINE  PX(NAME,ADDR),<
+       IFB     <ADDR>,<JRST    NAME>
+       IFNB    <ADDR>,<JRST    ADDR>>
+
+PDISP: XLIST
+       PMAC
+       JRST    CPOPJ           ;IN CASE UNDEF OPCODE
+       LIST
+
+IFPOP: CAME    TOK,[SIXBIT/IFE/]
+       CAMN    TOK,[SIXBIT/IFN/]
+       POPJ    P,
+       CAME    TOK,[SIXBIT/ENDIF/]
+       CAMN    TOK,[SIXBIT/END/]
+       POPJ    P,
+       CAME    TOK,[SIXBIT/IF/]
+       CAMN    TOK,[SIXBIT/ELSE/]
+       POPJ    P,
+       AOS     (P)
+       POPJ    P,
+\fORG:  TRO     F,FR.ORG        ;FLAG NO RELOCATION
+       PUSHJ   P,TOKEN         ;GET ORG ARG
+       PUSHJ   P,DODATA        ;GET THE NUMBER
+       MOVEM   OP,PC           ;RESET PC
+       TRNN    F,FR.PS1        ;SKIP IF PASS1
+       JRST    FLUSH           ;NOPE, DONE
+       MOVE    T1,ORGXR        ;GET INDEX
+       MOVEM   BC,ORGBLK(T1)   ;STORE BYTE COUNT
+       SKIPE   BC              ;IF BLOCK WAS VALID,
+       ADDI    T1,2            ;BUMP ORIGIN INDEX
+       MOVEM   OP,ORGBLK+1(T1) ;SAVE NEW START ADDRESS
+       MOVEM   T1,ORGXR        ;SAVE INDEX
+       SETZ    BC,             ;NO BYTES IN NEW BLOCK
+       JRST    FLUSH           ;FLUSH
+
+DOEND: TRO     F,FR.END        ;SAY WE'RE DONE
+       CAIN    I,CR            ;JUST "END" & NO START ADDRESS?
+       JRST    FLUSH           ;YES, FLUSH LINE.
+       PUSHJ   P,TOKEN         ;GET END ADDRESS
+       PUSHJ   P,DODATA        ;GET VALUE IF ANY
+       MOVEM   OP,STARTA
+       PUSHJ   P,NOPC          ;LIST START ADDRESS
+IFN FTREL,<
+       MOVEI   T1,"'"
+       TRZE    F,FR.REL        ;RELOC?
+       PUSHJ   P,LOUCH         ;YES
+       TRZN    F,FR.EXT        ;EXTERNAL?
+       JRST    FLUSH           ;NO, DONE
+       SETOM   STARTA          ;YES. THIS IS ILLEGAL
+       WARN    W.EXSA
+> ;END IFN FTREL
+       JRST    FLUSH
+
+DS:    PUSHJ   P,TOKEN         ;GET BLOCK ARG
+       PUSHJ   P,DODATA
+       PUSHJ   P,LSTPC
+       TRO     F,FR.LOP
+       MOVEI   T1,TAB
+       TRNN    F,FR.HEX
+       PUSHJ   P,LOUCH
+       MOVE    T1,PC           ;SAVE OLD PC
+       ADDM    T1,OP           ;NEW PC
+       JRST    ORG+3           ;DS MEANS NEW BLOCK
+
+PHASE: PUSHJ   P,TOKEN
+       PUSHJ   P,DODATA
+       MOVEM   OP,PC
+       TRO     F,FR.ORG        ;NO RELOCATION
+       JRST    FLUSH
+
+PRINTX:        TRNE    F,FR.PS1        ;IF ON PASS1
+       JRST    FLUSH           ;SKIP IT
+PX1:   PUSHJ   P,INCH
+       OUTCHR  I
+       CAIE    I,LF
+       JRST    PX1
+       POPJ    P,
+\fDC:   MOVE    T4,[POINT 10,STRING]    ;SET UP OPCODE OUTPUT
+       MOVE    T2,T4           ;AND INPUT
+       PUSH    P,T2            ;SAVE IT
+DC0:   PUSHJ   P,TOKEN         ;GET ARG(S)
+       CAIE    I,"'"
+       CAIN    I,QUOTE
+       JRST    [MOVEM  I,DELIM ;SAVE QUOTE
+               PUSHJ   P,SNEAK ;SEE IF SINGLE CHAR
+               TLNE    TOK,7777
+               JRST    DC4     ;NO, DO QUOTED STRING
+               MOVE    I,SNEAKI
+               CAME    I,DELIM ;AND MUST END ON SAME QUOTE
+               JRST    DC4
+               SETZB   TOK,TOK+1
+               JRST    .+1]    ;DO EXPR
+       PUSH    P,T4            ;DODATA DESTROYS T4
+       PUSHJ   P,DODATA
+       POP     P,T4
+       MOVE    T2,OP           ;SAVE IT
+       ANDI    OP,377          ;LOWER 8 BITS
+       IDPB    OP,T4           ;SAVE OP
+       MOVE    OP,T2           ;GET BACK ALL OF OP
+       AOS     BYTCNT          ;COUNT TOTAL BYTES IN
+       AOS     PC              ;FIX PC FOR EVAL
+       AOS     XTRAPC          ;FOR FIXUP
+       TLNN    P1,T.DW         ;WHOLE WORD?
+       JRST    DC1             ;NO
+       LSH     OP,-10
+       ANDI    OP,377          ;JUST DATA BITS
+       TRZE    F,FR.REL        ;IF RELOC
+       TRO     OP,400          ;FLAG
+       TRZE    F,FR.EXT        ;IF EXT
+       TRO     OP,1000         ;FLAG
+       IDPB    OP,T4
+       AOS     BYTCNT
+       AOS     PC
+       AOS     XTRAPC
+DC1:   CAIN    I,COMMA         ;CONTINUE?
+       JRST    DC0             ;YES
+       CAIE    I,TAB           ;LEADING SPACE?
+       CAIN    I,SPACE
+       JRST    [PUSHJ P,INCH
+               JRST    DC1]    ;YES, EAT IT
+       POP     P,OP            ;GET START BYTE POINTER
+       SETZ    TOK,            ;RESET COUNTER
+       SKIPN   BYTCNT          ;ANY BYTES IN THERE?
+       JRST    DCX0            ;NO
+       SOSGE   XTRAPC
+       JRST    DC2
+       SOS     PC
+       JRST    .-3
+\fDC2:  SETZM   XTRAPC
+       PUSHJ   P,LSTPC         ;LIST PC
+       MOVEI   TOK,3           ;TOKEN NOT INUSE NOW
+       TLNE    P1,T.DW         ;WORDS?
+       MOVEI   TOK,2           ;YES
+DC3:   ILDB    T1,OP
+       PUSH    P,T1            ;SAVE IT
+       PUSHJ   P,LSTOP         ;OUTPUT OP WITHOUT UPDATING PC
+       POP     P,T1
+       SOSG    BYTCNT          ;ONE LESS BYTE IN STRING
+       JRST    DCX             ;ALL GONE
+       SOJG    TOK,DC3         ;LOOP FOR 2 OR 3 BYTES
+IFN FTREL,<
+       TRNE    T1,400          ;IF RELOCATABLE
+       JRST    [MOVEI  T1,"'"  ;FLAG
+               PUSHJ   P,LOUCH
+               JRST    .+1]
+       TRNE    T1,1000         ;IF EXTERNAL
+       JRST    [MOVEI  T1,"*"
+               PUSHJ   P,LOUCH
+               JRST    .+1]
+>
+       PUSHJ   P,FLUSHL        ;PRINT <TAB> LINE OF SOURCE (OR NEW LINE)
+       JRST    DC2             ;DO ANOTHER LINE
+
+DCX:   SOJ     TOK,            ;COUNT BYTE PRINTED
+IFN FTREL,<
+       MOVE    T3,T1           ;GET FLAGS
+       SETZ    T1,
+       TRNE    T3,400          ;RELOC WORD?
+       MOVEI   T1,"'"
+       TRNE    T3,1000         ;EXTERN?
+       MOVEI   T1,"*"
+       CAIE    T1,"'"
+       CAIN    T1,"*"
+       PUSHJ   P,LOUCH         ;OUTPUT IF ' OR *
+> ;END IFN FTREL
+DCX0:  TLNN    P1,T.DZ         ;NEED A LAST ZERO?
+       JRST    DCX2            ;NO
+       JUMPN   TOK,DCX1        ;JUMP IF PC ALREADY PRINTED
+       CAIN    I,LF
+       PUSHJ   P,LCRLF
+       CAIN    I,CR            ;ON A CR?
+       PUSHJ   P,INCH          ;FLUSH LINE
+       PUSHJ   P,LSTPC         ;LIST PC
+       MOVEI   TOK,3
+       TLNE    P1,T.DW         ;WORDS?
+       MOVEI   TOK,2
+DCX1:  SETZ    T1,
+       PUSHJ   P,LSTOP         ;LIST ZERO
+       SOJ     TOK,            ;COUNT DOWN
+DCX2:  JUMPE   TOK,FLUSHL      ;DONE
+       PUSHJ   P,SPACE4        ;SPACE OUT
+       SOJG    TOK,.-1         ;LOOP
+       JRST    FLUSHL          ;DONE
+\fDC4:  PUSHJ   P,INCH          ;GET LIT
+       CAMN    I,DELIM         ;END QUOTE?
+       JRST    [PUSHJ P,INCH
+               JRST    DC1]
+       IDPB    I,T4            ;SAVE CHAR
+       AOS     BYTCNT
+       CAIE    I,CR            ;EOL?
+       CAIN    I,LF
+       CAIA                    ;YES
+       JRST    DC4             ;NO
+DC6:   MOVE    TOK,BYTCNT      ;GET COUNT OF BYTES READY TO GO
+       CAIGE   TOK,3           ;ENOUGH FOR A LINE?
+       JRST    DC4             ;NO
+       MOVEI   TOK,3           ;SET UP BYTES/LINE
+       PUSHJ   P,LSTPC         ;DO PC
+       POP     P,OP            ;GET BYTE POINTER
+DC7:   ILDB    T1,OP           ;GET BYTE
+       SOS     BYTCNT          ;COUNT DOWN
+       PUSH    P,T1
+       PUSHJ   P,LSTOP         ;LIST IT
+       POP     P,T1
+       SOJG    TOK,DC7
+       PUSH    P,OP            ;SAVE IT
+       CAIN    I,CR            ;GOT HERE VIA CR?
+       JRST    DC4             ;YES, CAUSE LINE TO BE PRINTED
+       JRST    DC6             ;JUST BYTES FOR A WHILE
+
+IFN FTREL,<
+DOINT: SKIPA   T2,[XWD S.INT,0]
+DOEXT: MOVSI   T2,S.EXT
+       PUSHJ   P,TOKEN         ;GET TOKEN
+       PUSHJ   P,SRCSYM        ;FIND IT (OR EMPTY LOC)
+        DMOVEM TOK,(S)         ;NOT THERE, STUFF IT
+       IORM    T2,2(S)         ;FLAG SYMBOL
+       TLNE    T2,S.EXT        ;EXTERNAL?
+       HLLOS   2(S)            ;YES, MAKE RH -1 (FOR END OF CHAIN)
+       CAIN    I,COMMA         ;MORE TO COME?
+       JRST    DOEXT+1         ;YES
+       JRST    FLUSH           ;NO
+>
+\fDOMAC:        DMOVE   TOK,T2          ;GET MACRO NAME
+DOMAC0:        POP     P,(P)           ;CAME VIA JRST FROM SUBROUTINE
+       TRO     F,FR.NRF        ;WE WANT TO KNOW IF MACRO WAS NEVER REFERENCED
+       PUSHJ   P,SRCSYM        ;FIND IN SYMBOL TABLE
+        DMOVEM TOK,(S)         ;SAVE IT
+       PUSHJ   P,SYMDEF        ;LINE DEFINED ON
+       MOVSI   T1,S.MAC        ;FLAG AS A MACRO REFERENCE
+       IORM    T1,2(S)         ;PUT IN SYMBOL TABLE
+       MOVE    T2,[MACDUM,,MACDUM+1]
+       SETZM   MACDUM
+       BLT     T2,MACDND       ;CLEAR MACRO ARG TABLE
+       MOVEI   T1,2            ;INDICATE NOT A REPT
+       MOVEM   T1,EOMFLG
+       SETZ    T2,             ;MACDUM INDEX
+       PUSH    P,S
+DOMAC4:        PUSHJ   P,TOKEN
+       DMOVEM  TOK,MACDUM(T2)  ;SAVE DUMMY ARG NAME
+       JUMPE   TOK,DOMC4A      ;SINCE NULL ENTRY MEANS END, IGNORE REST
+       CAIE    I,COMMA         ;MORE?
+       JRST    DOMC4A          ;NO, SKIP
+       AOJ     T2,
+       AOJA    T2,DOMAC4       ;LOOP UNTIL NO MORE ARGS
+DOMC4A:        POP     P,S
+DOMC4B:        PUSHJ   P,FLUSH         ;WASTE REST OF THE LINE
+       MOVE    T1,.JBFF##      ;GET JOBFF
+       HRRM    T1,2(S)         ;SAVE HOME OF MACRO
+       MOVE    T2,T1
+       HRLI    T2,(POINT 7,0)  ;POINTER TO MACRO BODY
+DOMAC1:        PUSHJ   P,INCH
+DOMAC3:        HRRZI   T1,1(T2)        ;GET ADDRESS PART OF POINTER (+1)
+       PUSHJ   P,MEMXPN        ;SEE IF MEMORY NEEDS TO BE EXPANDED
+       CAIE    I,SEMICO        ;";"?
+       JRST    DOM10           ;NO
+       LDB     I,T2            ;GET LAST CHAR
+       CAIE    I,SEMICO        ;DOUBLE ;;?
+       JRST    DOM11           ;NO
+       SOJ     T2,             ;BACKUP BTP
+DOM9:  ILDB    I,T2
+       CAIN    I,SEMICO
+       JRST    DOM12           ;FOUND IT
+       CAIE    I,TAB           ;TRY TO ELIMINATE TRAILING TABS
+       CAIN    SPACE           ;OR SPACES
+       JRST    DOM9
+       MOVEM   T2,SAVREG       ;SAVE FOR A WHILE
+       JRST    DOM9
+
+MEMXPN:        CAMG    T1,.JBREL##     ;WILL T1 FIT IN CORE?
+       POPJ    P,              ;YES, EXIT
+       PUSH    P,T1            ;SAVE T1
+       CORE    T1,
+        ERROR  F.NCOR
+       POP     P,T1            ;RESTORE T1
+       POPJ    P,
+\fDOM12:        PUSHJ   P,FLUSH         ;WASTE COMMENT
+       MOVE    T2,SAVREG       ;GET POINTER
+       MOVEI   I,CR
+       IDPB    I,T2            ;STUFF CR
+       SKIPA   I,[LF]          ;SET UP LF
+DOM11: MOVEI   I,SEMICO        ;PUT BACK ;
+DOM10: SKIPG   MACLEV          ;PASS THRU CONCAT INSIDE MACRO DEF
+       CAIE    I,"'"           ;CONCATENATE?
+       IDPB    I,T2            ;STUFF IT
+       CAIE    I,LF            ;END OF LINE
+       JRST    DOMAC6
+       TRZ     F,FR.MCM        ;FLAG END OF ANY POSSIBLE COMMENT
+       JRST    DOMC2A          ;CHECK FOR ENDM, ETC.
+
+DOMAC6:        PUSHJ   P,BREAK         ;IS IT WORTHWHILE TO LOOK FOR NEXT TOKEN?
+       JRST    DOMAC2          ;YES
+       JRST    DOMAC1          ;NO
+
+DOMAC5:        SOSL    MACLEV          ;IN A NESTED MACRO?
+       JRST    DOMAC1          ;YES
+       SETZM   MACLEV          ;DON'T LEAVE IT NEG.
+       LDB     I,T2            ;GET LAST CHAR OF MACRO
+       CAIN    I,12            ;END WITH LF?
+       JRST    DOMC5A          ;YES, SKIP
+       MOVEI   I,15
+       IDPB    I,T2
+       MOVEI   I,12            ;END MACRO TEXT WITH CRLF
+       IDPB    I,T2
+DOMC5A:        MOVEI   I,177
+       IDPB    I,T2
+       MOVE    I,EOMFLG        ;177,2 IS END OF MACRO
+       IDPB    I,T2
+       SETZ    I,
+       IDPB    I,T2            ;END WITH NULL
+       AOJ     T2,             ;POINT TO 1ST FREE WORD
+       HRRM    T2,.JBFF##      ;UPDATE JOBFF
+       MOVE    T1,EOMFLG       ;ARE WE FROM REPT?
+       CAIN    T1,3
+       POPJ    P,              ;YES, GO BACK TO REPT CODE
+       TRNE    F,FR.PS1        ;PASS1?
+       JRST    FPASS1          ;FLUSH REST OF LINE, RETURN TO NORMAL INPUT
+       JRST    FLUSHX          ;FOR PASS2
+
+DOMAC2:        CAIN    I,SEMICO
+       TRO     F,FR.MCM        ;FLAG IGNORE REST OF LINE
+       CAIN    I,QUOTE
+       TRC     F,FR.MQT        ;TOGGLE QUOTE IN MACRO
+       TRNE    F,FR.MCM        ;IN COMMENT?
+       JRST    DOMAC1          ;YES
+DOMC2A:        PUSHJ   P,DOMC13        ;GET NEXT TOKEN
+DOMAC7:        JUMPE   TOK,DOMAC1      ;NOTHING THERE
+       CAMN    TOK,[SIXBIT/ENDM/];END OF MACRO?
+       JRST    DOMAC5          ;YES
+       CAME    TOK,[SIXBIT/REPT/]
+       CAMN    TOK,[SIXBIT/MACRO/]     ;NESTING A MACRO?
+       JRST    [TRNN   F,FR.MCM!FR.MQT ;IN COMMENT OR QUOTE?
+               AOS     MACLEV  ;NO, COUNT LEVEL OF NEST
+               JRST    DOMAC1]
+       CAMN    TOK,[SIXBIT/LOCAL/]     ;LOCAL SYMBOL?
+               JRST    DOMAC9          ;YES
+       MOVSI   T3,-MACDML
+DOMC7A:        SKIPN   MACDUM(T3)
+       JRST    DOMAC1
+       CAMN    TOK,MACDUM(T3)
+       CAME    TOK+1,MACDUM+1(T3)      ;WHAT? NO DOUBLE WORD COMPARE?
+       CAIA
+       JRST    DOMAC8
+       AOBJN   T3,.+1
+       AOBJN   T3,DOMC7A
+       JUMPGE  T3,DOMAC1
+DOMAC8:        PUSHJ   P,TOKEN
+       PUSH    P,I
+       MOVEI   I,177
+       IDPB    I,T2
+       HRRZS   T3
+       LSH     T3,-1           ;ACCOUNT FOR DOUBLE SIZE TOKENS
+       MOVEI   I,100(T3)
+       IDPB    I,T2
+       POP     P,I
+       JRST    DOMAC3
+
+DOMAC9:        SKIPG   MACLEV          ;IN A MACRO?
+       TRNE    F,FR.MCM!FR.MQT ;IN COMMENT OR QUOTE?
+       JRST    DOMAC1          ;YES, IGNORE IT
+       PUSHJ   P,TOKEN         ;EAT "LOCAL"
+       MOVSI   T3,-MACDML
+DOMC9A:        SKIPN   MACDUM(T3)      ;FIND FIRST FREE MACDUM ENTRY
+       JRST    DOMC9B
+       AOBJN   T3,.+1
+       AOBJN   T3,DOMC9A
+       ERROR   F.TMMA          ;TOO MANY MACRO ARGS (MAKE MACDUM BIGGER)
+
+DOMC9B:        PUSHJ   P,TOKEN
+       DMOVEM  TOK,MACDUM(T3)  ;SAVE LOCAL SYMBOL
+       CAIN    I,","           ;MORE LOCALS?
+       JRST    DOMC9A          ;YES
+       CAIN    I,CR            ;THROW OUT REST OF LINE
+       JRST    DOMAC3
+       PUSHJ   P,INCH
+       JRST    .-3
+
+DOMC13:        HRRZ    T1,INVECT       ;GET INVECT POINTER
+       CAIG    T1,BAKPTR
+       CAIGE   T1,BAKBUF       ;POINTS TO BAKBUF?? (IF SO, DON'T SNEAK)
+       PJRST   SNEAK           ;LOOK AT NEXT TOKEN
+       PUSH    P,INVECT        ;SAVE POINTER
+       ILDB    I,INVECT
+       POP     P,INVECT
+       CAIE    I,177           ;END OF BAKBUF?
+       JRST    [POP    P,(P)   ;WASTE RETURN ADDR
+               JRST    DOMAC1] ;JUST PROCESS CHARACTER
+       MOVE    T1,MACPDL
+       POP     T1,INVECT       ;RESTORE OLD POINTER
+       MOVEM   T1,MACPDL
+       JRST    SNEAK           ;AND GET A NEW TOKEN
+
+\fEQUAL:        DMOVE   TOK,T2          ;RESET TOKEN
+       TLO     P1,T.EQU        ;SINCE EQU IS NOT IN OPNTAB
+       TRO     F,FR.NRF        ;DEFINITION IS NOT REFERENCE
+       PUSHJ   P,SRCSYM
+        DMOVEM TOK,(S)         ;LOAD SYMBOL IF NOT THERE
+       PUSH    P,S             ;SAVE S
+       PUSHJ   P,TOKEN         ;GET ARG
+       PUSHJ   P,DODATA        ;GET VALUE
+       POP     P,S             ;RESTORE S
+       HRRM    OP,2(S)         ;SET SYMBOL TABLE VALUE
+       PUSHJ   P,SYMDEF        ;FLAG LINE DEFINED ON
+       TRNN    F,FR.UND        ;IS EXPR UNDEFINED?
+       JRST    EQU1            ;NO, SKIP
+       MOVE    T1,2(S)         ;GET FLAGS
+       TLO     T1,S.UNDF       ;FLAG UNDEFINED
+       HLLZM   T1,2(S)         ;PUT BACK, CLEAR VALUE OF EQU
+       SETZ    OP,             ;A LITTLE HINT THAT ALL IS NOT OK
+       JRST    EQU2            ;SKIP
+
+EQU1:  MOVE    T1,2(S)         ;GET FLAGS &C
+       TLZ     T1,S.UNDF!S.MAC ;MAKE SURE THAT THIS SYMBOL IS NOT UNDEFINED
+       MOVEM   T1,2(S)         ;FOR CIRCULAR EQU MESS
+EQU2:  POP     P,(P)           ;CAME VIA PUSHJ,..
+       TRNN    F,FR.LIB        ;SKIP OUTPUT IF IN MACLIB
+       PUSHJ   P,NOPC
+       TRNE    F,FR.PS1        ;PASS1?
+       JRST    FPASS1          ;YES
+       JRST    FLUSHX          ;NO
+
+OPTION:        PUSHJ   P,TOKEN
+       CAMN    TOK,[SIXBIT/HEX/]
+       TRO     F,FR.HEX
+       CAMN    TOK,[SIXBIT/OCT/]
+       TRZ     F,FR.HEX
+       CAMN    TOK,[SIXBIT/SMAC/]
+       TLO     F,FL.SUP
+       CAMN    TOK,[SIXBIT/LMAC/]
+       TLZ     F,FL.SUP
+       CAIN    I,COMMA
+       JRST    OPTION
+       JRST    FLUSH
+
+MACLIB:        PUSHJ   P,TOKEN         ;GET LIBRARY NAME
+       SKIPN   T1,TOK          ;FILE NAME
+       JRST    FLUSH           ;IF NO NAME, FLUSH
+       MOVSI   T2,'LIB'        ;EXT IS .LIB
+       SETZB   T3,T4           ;IN DEFAULT PATH
+       LOOKUP  LIB,T1          ;LOOKUP FILE
+        JRST   [OUTSTR [ASCIZ/MACLIB file not found
+/]
+               JRST    FLUSH]
+       PUSHJ   P,FLUSH         ;THROW OUT REST OF MACLIB LINE
+       MOVE    T1,MACPDL
+       PUSH    T1,INVECT       ;SAVE INPUT VECTOR
+       MOVEM   T1,MACPDL
+       MOVEI   T1,-2           ;SIGNAL MACLIB INPUT
+       MOVEM   T1,INVECT
+       TRO     F,FR.LIB        ;FLAG IN MACLIB
+       POPJ    P,              ;RETURN
+
+DOPAGE:        PUSHJ   P,TOKEN
+       PUSHJ   P,DODATA
+               SKIPE   OP              ;IF ARG GIVEN FOR PAGE
+       MOVEM   OP,PAGESZ       ;SAVE IT AS THE NEW PAGE SIZE
+       HLLOS   LINCTR          ;FORCE A PAGE BREAK
+       JRST    FLUSH
+
+EXITM: HRRZ    T1,INVECT       ;FIRST CHECK TO SEE IF WE'RE IN A MACRO
+       CAIE    T1,-1           ;SOURCE?
+       CAIN    T1,-2           ;MACLIB?
+       JRST    EXITX           ;YES, ERROR
+       CAIG    T1,BAKPTR
+       CAIGE   T1,BAKBUF       ;POINTS TO BAKBUF?
+       JRST    EXITM1          ;NO, MUST POINT TO MACRO
+       PUSHJ   P,EXITM1        ;YES, GET RID OF IT
+       JRST    EXITM           ;AND CHECK AGAIN TO SEE IT THIS IS A MACRO
+
+EXITM1:        PUSHJ   P,FLUSH         ;MAKE EVERYTHING LOOK NICE
+       MOVE    T1,MACPDL       ;GET THE INVECT STACK
+       POP     T1,INVECT       ;BAIL OUT OF THE MACRO
+       MOVEM   T1,MACPDL
+       POPJ    P,              ;ALL DONE
+
+EXITX: WARN    W.EXM           ;WARN THAT WE'RE NOT IN A MACRO
+       JRST    FLUSH
+
+REPT:  PUSHJ   P,TOKEN
+       PUSHJ   P,DODATA        ;GET THE REPT VALUE
+       MOVEM   OP,REPCNT       ;SAVE IT
+       MOVE    T2,[MACDUM,,MACDUM+1]
+       SETZM   MACDUM
+       BLT     T2,MACDND       ;CLEAR MACRO ARG TABLE
+       MOVEI   T1,3            ;INDICATE REPT AND NOT MACRO
+       MOVEM   T1,EOMFLG
+       MOVEI   S,REPADR-2      ;FAKE UP SYMTAB POINTER
+       PUSHJ   P,DOMC4B        ;MAKE IT A MACRO IN REPBUF
+       SKIPN   REPCNT          ;IF REPT 0
+       POPJ    P,              ;FORGET IT
+       PUSHJ   P,SETARG        ;SET UP MACARG IN CASE LOCALS USED
+       MOVEI   I,177
+       IDPB    I,T1
+       MOVEI   I,1
+       IDPB    I,T1
+       SETZ    I,
+       IDPB    I,T1            ;END WITH NULL
+       PUSHJ   P,FLUSH
+       MOVE    T1,MACPDL
+       PUSH    T1,INVECT       ;SAVE INPUT VECTOR ON SPECIAL STACK
+       MOVE    T2,REPADR       ;POINT TO REPT
+       HRLI    T2,(POINT 7,0)
+       MOVEM   T2,INVECT
+       MOVEM   T1,MACPDL
+       POPJ    P,
+
+
+
+DOIFN: PUSHJ   P,TOKEN
+       PUSHJ   P,DODATA
+       AOS     IFLEVL          ;ONE MORE IF
+       TRNE    F,FR.OFF        ;ALREADY OFF?
+       JRST    FLUSH
+       SKIPE   OP              ;GOING OFF?
+       JRST    FLUSH           ;NO
+TRNOFF:        MOVE    T1,IFLEVL
+       MOVEM   T1,OFFLVL       ;YES, SAVE LEVEL OF OFF
+       TRO     F,FR.OFF        ;SHUT OFF
+       JRST    FLUSH           ;RETURN
+\fDOIFE:        PUSHJ   P,TOKEN
+       PUSHJ   P,DODATA
+       AOS     IFLEVL
+       TRNE    F,FR.OFF
+       JRST    FLUSH
+       SKIPN   OP
+       JRST    FLUSH
+       JRST    TRNOFF          ;TURN OFF
+
+ELSE:  TRNN    F,FR.OFF        ;ARE WE OFF?
+       JRST    TRNOFF          ;NO, TURN OFF
+       MOVE    T1,OFFLVL       ;GET OFF LEVEL
+       CAMN    T1,IFLEVL       ;TURNED OFF AT THIS LEVEL?
+       TRZ     F,FR.OFF        ;YES, TURN BACK ON
+       JRST    FLUSH           ;FLUSH & RETURN
+
+ENDIF: TRNN    F,FR.OFF        ;OFF ALREADY?
+       JRST    ENDI2           ;NO, JUST DECR. & LEAVE
+       MOVE    T1,OFFLVL       ;GET OFF LEVEL
+       CAMN    T1,IFLEVL       ;WAS TURNED OFF AT THIS LEVEL?
+       TRZ     F,FR.OFF        ;YES, TURN BACK ON
+ENDI2: SOSGE   IFLEVL          ;COUNT DOWN IF LEVELS
+       WARN    W.IF1           ;THERE WERE NO LEVELS!
+       SKIPGE  IFLEVL          ;IF MESSED UP,
+       SETZM   IFLEVL          ;FIX
+       JRST    FLUSH
+
+DOTITL:        MOVE    T1,[POINT 7,TITL]
+       MOVEI   T2,^D66
+       PUSHJ   P,INCH
+       CAIN    I,15
+       JRST    FLUSH
+       IDPB    I,T1
+       SOJG    T2,.-4
+       JRST    FLUSH
+
+DOSUBT:        CAIA                    ;TRY BREAK CHARACTER FIRST
+       PUSHJ   P,INCH          ;GET DELIMITER
+       CAIE    I,TAB
+       CAIN    I,SPACE
+       JRST    .-3             ;FORGET SPACES
+       MOVE    T2,I
+       MOVE    T3,[POINT 7,SUBTTL]
+       MOVEI   T4,SUBTLN
+SUB2:  PUSHJ   P,INCH
+       CAMN    I,T2            ;END OF STRING?
+       JRST    FLUSH           ;YES
+       SOSLE   T4
+       IDPB    I,T3            ;STUFF
+       JRST    SUB2
+\fEVAL: TRZ     F,FR.REL!FR.EXT ;INIT
+       SETZ    T1,             ;CLEAR OUTPUT
+       JUMPN   TOK,DOSYM       ;JUMP IF TOK NOT ZERO
+       CAIE    I,"'"           ;INTEL QUOTE
+       CAIN    I,QUOTE
+       JRST    DOQUOT          ;LITERAL CHARACTER
+       CAIE    I,DOLLAR
+       CAIN    I,PERIOD
+       CAIA
+       POPJ    P,              ;MUST BE ZERO
+       MOVE    T1,PC           ;DOLLAR IS PC
+       TRO     F,FR.REL        ;DOLLAR IS ALSO RELOCATABLE
+       PUSH    P,T2
+       TLNE    P1,T.DB!T.DW!T.EQU      ;FROM DB,DW OR EQU?
+       CAIA                    ;NO, SKIP OVER SOJ
+       SOJ     T1,             ;INDICATE THE PC OF THE INSTRUCTION
+       POP     P,T2
+       JRST    INCH            ;EAT DOLLAR
+
+DOSYM: PUSHJ   P,GETNUM        ;EVALUATE NUMERICALLY
+        POPJ   P,              ;RETURN WITH NUMBER IN T1
+       PUSHJ   P,SRCSYM        ;NOT NUMBER,SEARCH SYMBOL TABLE
+        JRST   .+3             ;NOT THERE
+       HRRZS   T1
+       POPJ    P,              ;RETURN WITH VALUE IN T1
+
+       PUSH    P,T2
+       PUSH    P,T3
+       PUSH    P,T4
+       TRO     F,FR.EVL        ;TELL SRCHOP NOT TO FLAG ERROR
+       PUSHJ   P,SRCHOP        ;CHECK FOR OPCODE
+        JRST   DOSYM3          ;NO OP
+       TRZ     F,FR.EVL        ;CLEAR FLAG
+       MOVE    T2,OPCTAB(X)    ;GET OPCODE
+       MOVE    T3,TYPLSH(X)    ;GET TYPE
+       TLNE    T3,T.POP        ;PSEUDO OP?
+       JRST    DOSYM3          ;YES, DONE
+       TLNE    T3,T.NREG       ;USES REGISTER?
+       JRST    DOSYM1          ;NO
+       ;CONT.
+\fDOSYM2:       CAIN    I,")"           ;END OF EXPR?
+       JRST    DOSYM1          ;YES
+       PUSH    P,T2
+       PUSH    P,T3
+       PUSHJ   P,TOKEN
+       PUSHJ   P,EVAL
+       CAILE   T1,7
+       WARN    W.REG
+       ANDI    T1,7
+       POP     P,T3
+       POP     P,T2
+       TRNE    T3,4
+       LSH     T1,-1
+       LSH     T1,(T3)
+       OR      T2,T1
+       TLZE    T3,T.MOV        ;A MOVE?
+       JRST    [TRZ T3,-1
+               JRST    DOSYM2]
+DOSYM1:
+REPEAT 0,<                     ;DON'T GET FUSSY ABOUT OPCODES AS DATA
+       CAIN    I,")"           ;EOE?
+       JRST    DOSYM4          ;YES
+       WARN    W.ILO1          ;ONLY GENERATE 1 BYTE OF DATA
+>; END REPEAT 0
+DOSYM4:        MOVE    T1,T2
+       POP     P,T4
+       POP     P,T3
+       POP     P,T2
+       POPJ    P,
+
+DOSYM3:        POP     P,T4
+       POP     P,T3
+       POP     P,T2
+       SKIPE   (S)             ;NO SYMBOL?
+       JRST    FLUNDF          ;SYMBOL ALREADY UNDEFINED
+       DMOVEM  TOK,(S)         ;SAVE SYMBOL
+       MOVSI   T1,S.UNDF       ;FLAG UNDEFINED
+       MOVEM   T1,2(S)
+FLUNDF:        PUSHJ   P,SRCSYM        ;REFERENCE SYMBOL
+       JFCL                    ;NOT FOUND?
+       TRO     F,FR.UND        ;FLAG UNDEFINED SYMBOL
+       TRNN    F,FR.PS1        ;SKIP IF PASS1
+       ERROR   F.UNDF          ;REALLY IS UNDEFINED
+       POPJ    P,              ;BURP UP
+
+DOQUOT:        PUSHJ   P,INCH          ;GET THE NEXT CHARACTER
+       MOVE    T1,I            ;JUST SAVE IT
+       PUSHJ   P,INCH          ;EAT TRAILING QUOTE
+       CAIE    I,"'"
+       CAIN    I,QUOTE
+       JRST    .+4             ;OK THEN
+       LSH     T1,10           ;SHIFT OVER
+       ADD     T1,I            ;MERGE
+       JRST    .-6
+       PUSH    P,T1            ;SAVE T1
+       PUSHJ   P,TOKEN         ;LOAD UP LIKE TOKEN
+       POP     P,T1            ;RESTORE T1
+       POPJ    P,              ;RETURN
+\f;SEARCH SYMBOL TABLE FOR ENTRY IN TOK.
+;NON-SKIP RETURN:      SYMBOL UNDEFINED. S CONTAINS 1ST FREE ENTRY
+;SKIP RETURN:  T1 CONTAINS VALUE OF SYMBOL. S POINTS TO ENTRY IN SYMTAB
+;SYMTAB ENTRY: SIXBIT/NAME/
+;              SIXBIT/MORE NAME/
+;              FLAGS,,VALUE    ;SEE M80UNV FOR FLAGS (S.????)
+;              LINE#,,LINK TO NEXT LINE#       ;1B0 SET IF DEFINED ON LINE#
+;              0,,LINK TO OVERFLOW ; 0 IF NO MORE ENTRIES
+
+SRCSYM:        TRZ     F,FR.REL!FR.EXT
+       MOVSI   S,-PRELEN       ;GET LENGTH OF PRE DEFINED TABLE
+       HRRI    S,PRETAB        ;ADDRESS OF PERMANENT SYMBOLS
+SRCS1: CAMN    TOK,(S)         ;MATCH?
+       JRST    PREMAT
+       AOBJN   S,.+1
+       AOBJN   S,SRCS1         ;NO, LOOP
+                               ;LOOK IN REGULAR SYMBOL TABLE
+       PUSH    P,T2            ;DON'T DESTROY T2
+       MOVE    T2,[POINT 6,TOK];THIS ASSUMES SYMSIZ IS FAIRLY CLOSE TO 64
+       SETZ    T1,
+       TLNN    T2,770000       ;ONLY HASH ON 1ST WORD OF SYMBOL
+       JRST    .+4
+       ILDB    S,T2
+       ADD     T1,S
+       JRST    .-4
+       IDIVI   T1,SYMSIZ       ;GET TOKEN MODULO TABLE LENGTH
+       MOVE    T1,T2
+       POP     P,T2
+       IMULI   T1,5            ;5 WORDS/ENTRY
+       MOVEI   S,SYMTAB(T1)    ;GET HASHED TABLE LOCATION
+SRCL:  CAMN    TOK,(S)
+       CAME    TOK+1,1(S)
+       CAIA
+       JRST    SRCF
+       SKIPN   (S)             ;EMPTY?
+       POPJ    P,              ;YES, RETURN WITH S SET UP
+       SKIPN   4(S)            ;LINK THERE?
+       JRST    MAKLNK          ;NO. MAKE NEW ENTRY & RETURN
+       HRRZ    S,4(S)          ;NEW LINK
+       JRST    SRCL            ;LOOP
+
+PREMAT:        MOVE    T1,1(S)         ;GET FLAGS,VALUE
+       JRST    SCPOPJ          ;SKIP RETURN
+
+MAKLNK:        MOVE    T1,.JBFF##      ;GET JOBFF
+       HRRM    T1,4(S)         ;MAKE NEW LINK
+       HRRM    T1,S
+       ADDI    T1,5            ;MAKE NEW JOBFF
+       PUSHJ   P,MEMXPN        ;EXPAND CORE IF NECESSARY
+       MOVEM   T1,.JBFF##      ;STUFF IT
+       POPJ    P,              ;DONE
+\fSRCF: MOVE    T1,2(S)         ;GET FLAGS,VALUE
+       PUSH    P,T2            ;SAVE T2
+       MOVE    T2,T1           ;IN T2
+       TLNE    T2,S.EXT        ;EXTERNAL?
+       HRR     T2,PC           ;YES, SAVE CURRENT PC FOR NEXT SYMBOL
+       TRZN    F,FR.NRF        ;A REFERENCEABLE SYMBOL?
+       TLO     T2,S.REF        ;YES, REFERENCE SYMBOL
+       MOVEM   T2,2(S)         ;SAVE FLAGS,VALUE
+       TRNE    F,FR.PS1        ;PASS1?
+       JRST    SRCX            ;YES, NO REF ON PASS1
+       TRNN    F,FR.LST        ;LISTING REFERENCES?
+       JRST    SRCX            ;NO USE GATHERING THEM THEN
+       SKIPE   3(S)            ;NO REFERENCE?
+       JRST    NXTREF          ;NO
+       HRLZ    T2,LINENO       ;GET CURRENT LINENO
+       MOVEM   T2,3(S)         ;SAVE IN LH
+       JRST    SRCX            ;DONE
+
+NXTREF:        PUSH    P,T1            ;SAVE T1
+       PUSH    P,T3            ;AND T3
+       MOVEI   T1,3(S)         ;GET ADDRESS
+       MOVE    T2,3(S)         ;GET LINE,,LINK
+SRCLNK:        HLRZ    T3,T2           ;GET LINE NUMBER IN CHAIN
+       ANDI    T3,377777       ;JUST LINE NUMBER
+       CAMN    T3,LINENO       ;IS LINENO ALREADY IN CHAIN?
+       JRST    SRCX0           ;YES, QUIT NOW
+       TRNN    T2,-1           ;ANY LINK?
+       JRST    SRCI            ;NO, END OF CHAIN
+       HRRZ    T1,T2           ;SAVE LINK
+       MOVE    T2,(T1)         ;FOLLOW LINK
+       JRST    SRCLNK          ;LOOP TO END OF CHAIN
+\fSRCI: HRR     T2,.JBFF##      ;GET FIRST FREE AS LINK
+       MOVEM   T2,(T1)         ;SAVE WITH NEW LINK
+       HRRZ    T1,T2           ;LINK ADDRESS IN T1
+       MOVE    T2,LINENO       ;GET LINE NUMBER
+       HRLZM   T2,(T1)         ;STORE IT
+       AOJ     T1,             ;NEW JOBFF
+       PUSHJ   P,MEMXPN        ;EXPAND CORE
+       MOVEM   T1,.JBFF##
+SRCX0: POP     P,T3            ;RESTORE T3
+       POP     P,T1            ;RESTORE T1
+SRCX:  POP     P,T2
+       TLNE    T1,S.UNDF       ;UNDEFINED SYMBOL?
+       POPJ    P,              ;YES, TIME TO LEAVE
+       TLZE    T1,S.REL        ;RELOCATABLE?
+       TRO     F,FR.REL        ;YES, FLAG IT
+       TLZE    T1,S.EXT        ;EXTERNAL?
+       TRO     F,FR.EXT        ;YES
+SCPOPJ:        AOS     (P)             ;CAUSE SKIP RETURN
+CPOPJ: POPJ    P,              ;RETURN
+
+;SNEAK ROUTINE. WHILE FR.SNK IS ON INCH WILL COPY ALL INPUT VIA BAKPTR
+;WHEN DONE, SNEAK WILL TELL INCH THAT THE PREVIOUS INPUT IS NOW A MACRO
+;IN EFFECT, NO INPUT WAS DONE (EXCEPT THAT TOK CONTAINS THE NEXT TOKEN)
+
+SNEAK: TRO     F,FR.SNK        ;SAY WE'RE SNEAKING AROUND
+       PUSH    P,I
+       PUSH    P,T1
+       PUSH    P,T2
+       MOVE    T2,[POINT 7,BAKBUF]     ;SET UP POINTER FOR INCH
+       MOVEM   T2,BAKPTR       ;SAVE IT
+       PUSHJ   P,TOKEN         ;GET TOKEN
+       MOVEM   I,SNEAKI        ;SAVE THE BREAK CHARACTER
+       MOVEI   T1,177
+       IDPB    T1,BAKPTR       ;STORE "END OF BAKBUF"
+       MOVEI   T1,1
+       IDPB    T1,BAKPTR
+       MOVE    T1,MACPDL       ;GET MACPDL
+       HRRZ    T2,INVECT       ;GET INVECT POINTER
+       CAIG    T2,BAKPTR
+       CAIGE   T2,BAKBUF       ;POINTS TO BAKBUF?? (IF SO, DON'T SAVE)
+       PUSH    T1,INVECT       ;SAVE OLD POINTER
+       MOVE    T2,[POINT 7,BAKBUF]     ;POINT TO BACKUP BUFFER
+       MOVEM   T2,BAKPTR       ;HELP OUT THE OTHER FOLKS WHO USE BAKPTR
+       MOVEM   T2,INVECT       ;SOURCE IS NOW IN BAKBUF
+       MOVEM   T1,MACPDL       ;PUT PDL BACK IN STORAGE
+       TRZ     F,FR.SNK        ;DONE SNEAKING
+       POP     P,T2
+       POP     P,T1
+       POP     P,I
+       POPJ    P,              ;DONE
+\fGETNUM:       MOVE    T3,[POINT 6,TOK]
+       SETZ    T1,             ;CLEAR TOTAL
+       ILDB    T2,T3           ;GET THE 1ST CHARACTER
+       CAIG    T2,'9'
+       CAIGE   T2,'0'          ;NUMERIC?
+       JRST    SCPOPJ          ;NO - SHOULDN'T BE HERE
+       PUSH    P,T4            ;SAVE T4
+       PUSH    P,I             ;AND I
+GETN1: JUMPE   T2,GETN2        ;END OF TOKEN
+       MOVE    T4,T3           ;SAVE POINTER TO LAST CHAR
+       ILDB    T2,T3           ;GET NEXT CHAR
+       JRST    GETN1           ;LOOP
+
+GETN2: MOVE    T3,T4           ;GET BACK POINTER
+       LDB     T4,T3           ;GET LAST CHARACTER
+       MOVEI   I,^D10          ;ASSUME DECIMAL
+       CAIE    T4,'O'
+       CAIN    T4,'Q'          ;OCTAL
+       MOVEI   I,10
+       CAIN    T4,'H'          ;HEX
+       MOVEI   I,20
+       CAIN    T4,'B'          ;BINARY
+       MOVEI   I,2
+       CAIE    T4,'D'          ;GET RID OF THE LAST CHARACTER
+       CAIN    T4,'H'          ;IF IT IS A RADIX CHARACTER
+       DPB     T1,T3
+       CAIE    T4,'Q'
+       CAIN    T4,'O'
+       DPB     T1,T3
+       CAIN    T4,'B'
+       DPB     T1,T3
+       MOVE    T3,[POINT 6,TOK]
+GETNL: CAMN    T3,[600,,TOK+1]
+       JRST    GETNX
+       ILDB    T2,T3           ;GET A CHARACTER
+       JUMPE   T2,GETNX        ;DONE. NORMAL RETURN
+       CAIN    T2,'$'          ;DUMMY DOLLAR?
+       JRST    GETNL           ;YES, IGNORE IT
+       IMUL    T1,I            ;SHIFT TOTAL BY RADIX
+       CAILE   T2,'9'          ;IF GREATER THAN DECIMAL
+       SUBI    T2,'A'-'9'-1    ;THROW OUT OFFSET
+       ADDI    T1,-20(T2)
+       JRST    GETNL
+
+GETNX: POP     P,I
+       POP     P,T4
+       POPJ    P,
+
+
+SETARG:        MOVE    T2,ARGPDL
+       PUSH    T2,ARGPTR       ;SAVE CURRENT MACRO'S ARGS
+       MOVEM   T2,ARGPDL
+       MOVE    T1,ARGPTR
+       ILDB    T2,T1           ;SEARCH FOR END OF CURRENT MACRO'S ARGS
+       SKIPE   T2
+       JRST    .-2
+       MOVEM   T1,ARGPTR       ;SAVE START OF THIS MACRO'S ARGS
+       POPJ    P,
+
+SETMAC:        PUSHJ   P,SETARG
+SETM00:        CAIE    I,TAB
+       CAIN    I,SPACE
+       JRST    [PUSHJ  P,INCH
+               JRST    SETM00]
+       CAIA
+SETM0: PUSHJ   P,INCH
+       PUSHJ   P,BREAK
+       JRST    SETM1
+       IDPB    I,T1
+       JRST    SETM0
+\fSETM1:        CAIE    I,QUOTE
+       CAIN    I,"'"
+       JRST    SETM3           ;DO QUOTED STRING
+       CAIN    I,"<"           ;START EXPR?
+       JRST    SETM4           ;YES
+STM1.5:        PUSH    P,I
+       MOVEI   I,177
+       IDPB    I,T1
+       MOVEI   I,1
+       IDPB    I,T1
+       POP     P,I
+       CAIN    I,","           ;ANOTHER ARG?
+       JRST    SETM0           ;YES
+SETM2: SETZ    I,
+       IDPB    I,T1            ;END WITH NULL
+       PUSHJ   P,FLUSH
+       MOVE    T1,MACPDL
+       PUSH    T1,INVECT       ;SAVE INPUT VECTOR ON SPECIAL STACK
+       MOVE    T2,2(S)         ;GET POINTER TO MACRO
+       HRLI    T2,(POINT 7,0)
+       MOVEM   T2,INVECT
+       MOVEM   T1,MACPDL
+       POPJ    P,
+
+SETM3: MOVEM   I,DELIM
+       IDPB    I,T1
+       PUSHJ   P,INCH
+       CAIE    I,CR
+       CAIN    I,LF
+       JRST    SETM1
+       CAME    I,DELIM
+       JRST    SETM3
+       IDPB    I,T1
+       JRST    STM1.5
+
+SETM4: PUSHJ   P,INCH
+       TRNE    F,FR.END        ;END IS ONLY ABNORMAL EXIT
+       JRST    STM1.5
+       CAIN    I,">"
+       JRST    [PUSHJ  P,INCH
+               JRST    STM1.5]
+       IDPB    I,T1
+       JRST    SETM4
+\fINCH: PUSH    P,T1            ;SAVE T1
+INCH1: MOVE    T1,INVECT       ;GET VECTOR
+       CAIN    T1,-1           ;DEFAULT TO SOURCE?
+       JRST    INCHS           ;YES
+       CAIN    T1,-2           ;DEFAULT TO LIBRARY?
+       JRST    INCHL           ;YES
+INCHM0:        ILDB    I,INVECT        ;GET CHARACTER FROM MACRO BODY
+       SKIPN   I               ;IS THERE A MACRO ARG?
+       PUSHJ   P,DOLSYM        ;NEEDS LOCAL SYMBOL HERE
+       CAIN    I,177
+       JRST    INCHM3
+       TRNE    F,FR.LIB        ;IN MACLIB?
+       JRST    TPOPJ           ;YES, FINISHED
+       HRRZ    T1,INVECT       ;GET INVECT POINTER
+       CAIG    T1,BAKPTR
+       CAIGE   T1,BAKBUF       ;IN MACRO?
+       TLNN    F,FL.SUP        ;YES, IS FL.SUP ON?
+       JRST    INCHX           ;NO
+       IDPB    I,BAKPTR        ;YES, SAVE CHAR HERE
+TPOPJ: POP     P,T1
+       POPJ    P,              ;SUPPRESS ALL THIS FOOLISHNESS
+
+INCHM3:        ILDB    I,INVECT        ;GET CODE
+       CAIE    I,1
+       CAIN    I,2             ;END OF MACRO?
+       JRST    INCHM1          ;YES
+       CAIN    I,3             ;END OF REPT?
+       JRST    INCHM5          ;YES
+       MOVE    T1,MACPDL
+       PUSH    T1,INVECT       ;SAVE OLD INVECT
+       MOVEM   T1,MACPDL
+       MOVE    T1,ARGPTR       ;INPUT IS FROM MACRO ARGS
+       MOVEM   T1,INVECT
+       MOVE    T1,I            ;PUT ARG POSITION IN T1
+       ANDI    T1,77
+       JUMPN   T1,INCHM4       ;SKIP SPECIAL TEST IF NOT 1ST ARG
+       PUSH    P,INVECT        ;SAVE INPUT VECTOR
+       ILDB    T1,INVECT
+       CAIN    T1,177          ;LOOKING FOR 1ST ARG AND NONE THERE?
+       PUSHJ   P,DOLSYM        ;MAKE A LOCAL SYMBOL FOR THE NULL ARG
+       POP     P,INVECT        ;RESTORE VECTOR
+       JRST    INCHM0          ;GO DOIT
+
+INCHM2:        JUMPE   T1,INCHM0       ;INVECT NOW POINTS TO RIGHT SPOT
+INCHM4:        ILDB    I,INVECT
+       SKIPN   I               ;END OF ARGS?
+       PUSHJ   P,DOLSYM        ;NEEDS LOCAL SYMBOL HERE
+       CAIE    I,177           ;END OF ARG?
+       JRST    INCHM4          ;NO, LOOP
+       ILDB    I,INVECT        ;GET ^A
+       SOJA    T1,INCHM2       ;SEE IF WE'RE AT THE RIGHT SPOT
+
+INCHM1:        MOVE    T1,MACPDL
+       POP     T1,INVECT       ;RESTORE OLD POINTER
+       MOVEM   T1,MACPDL
+       CAIE    I,2             ;END OF MACRO?
+       CAIN    I,3
+       JRST    [MOVE   T1,ARGPDL       ;RESTORE MACRO ARG CONTEXT
+               POP     T1,ARGPTR
+               MOVEM   T1,ARGPDL
+               JRST    INCH1]
+       JRST    INCH1
+
+DOLSYM:        PUSH    P,INVECT        ;SAVE THE INPUT VECTOR
+       MOVEI   I,"?"           ;START THE SYMBOL WITH "??"
+       DPB     I,INVECT
+       IDPB    I,INVECT
+       PUSH    P,T1            ;SAVE T1
+       PUSH    P,T2
+       MOVE    T1,LOCSYM       ;GET THE VALUE OF THE LOCAL SYMBOL
+       PUSHJ   P,DOSNUM        ;PUT THE NUMBER IN INVECT
+       AOS     LOCSYM          ;MAKE NEW SYMBOL VALUE
+       MOVEI   I,177
+       IDPB    I,INVECT
+       MOVEI   I,1             ;CAP OFF SYMBOL
+       IDPB    I,INVECT
+       SETZ    I,
+       IDPB    I,INVECT
+       POP     P,T2
+       POP     P,T1
+       POP     P,INVECT
+       LDB     I,INVECT        ;GET FIRST BYTE IN I
+       POPJ    P,
+
+DOSNUM:        IDIVI   T1,^D10         ;OUTPUT T1 AS DECIMAL NUMBER
+       JUMPE   T1,.+4
+       PUSH    P,T2
+       PUSHJ   P,DOSNUM
+       POP     P,T2
+       ADDI    T2,60
+       IDPB    T2,INVECT
+       POPJ    P,
+
+INCHM5:        SOSG    REPCNT          ;KNOCK DOWN REPT COUNT
+       JRST    INCHM1
+       MOVE    T2,ARGPTR       ;POINT TO ARGS
+       MOVEI   T1,177          ;START NEW REPT WITH A CLEAN START
+       IDPB    T1,T2
+       MOVEI   T1,1
+       IDPB    T1,T2
+       SETZ    T1,
+       IDPB    T1,T2
+       MOVE    T2,REPADR       ;POINT TO REPT
+       HRLI    T2,(POINT 7,0)
+       MOVEM   T2,INVECT
+       JRST    INCHM0          ;DOIT OVER AGAIN
+
+\fINCHL:        POP     P,T1
+INCHL1:        SOSGE   MBUF+2
+       JRST    INCHL2
+       ILDB    I,MBUF+1
+       JUMPE   I,INCHL1
+       TRNE    F,FR.SNK        ;IF SNEAKING,
+       IDPB    I,BAKPTR        ;SAVE CHARACTER
+       POPJ    P,              ;JUST RETURN WITHOUT LISTING
+
+INCHL2:        IN      LIB,
+       JRST    INCHL1
+       CLOSE   LIB,
+       TRZ     F,FR.LIB        ;FLAG END OF MACLIB
+       PUSH    P,T1
+       MOVE    T1,MACPDL
+       POP     T1,INVECT       ;RESTORE ORIGINAL INVECT BEFORE MACLIB
+       POP     P,T1
+       JRST    INCH            ;AND GET ANOTHER CHARACTER
+
+INCHS: SOSGE   IBUF+2
+       JRST    .+3
+       ILDB    I,IBUF+1
+       JRST    INCHX
+       IN      SRC,
+       JRST    INCHS
+ENDIT: TRZN    F,FR.PS1        ;PASS1?
+       JRST    WRAPUP          ;NO
+       TRZ     F,FR.END        ;TURN OFF END FROM PASS1 (SHOULD ALREADY BE OFF BUT ...)
+       SETZ    E,              ;FORGET ALL PASS1 ERRORS
+       TRZE    F,FR.OFF        ;ARE WE ASSEMBLING?
+       WARN    W.IF2           ;NO
+       SETZM   IFLEVL
+       SETZM   OFFLVL
+       MOVE    T1,ORGXR        ;GET INDEX
+       MOVEM   BC,ORGBLK(T1)   ;STORE COUNT
+       SETZ    T1,             ;YES
+       PUSHJ   P,OPNOBJ        ;OPEN OBJECT DEVICE
+       SETZM   ORGXR           ;RESET FOR OUTPUT
+       MOVE    T2,[POINT 7,TITL]
+       PUSHJ   P,NOALT3
+       MOVE    T2,[POINT 7,SUBTTL]
+       PUSHJ   P,NOALT3
+
+\fNOALT1:       PUSHJ   P,HEXHED        ;DO HEDDER
+       MOVE    T1,FILNAM##
+       MOVE    T2,FILEXT##
+       SETZ    T3,
+       MOVE    T4,PPN##
+       LOOKUP  SRC,T1
+         JRST  NOFILE##
+       JRST    RESTAR
+
+NOALT3:        ILDB    T1,T2
+       JUMPN   T1,[PUSHJ P,HEXOX
+               JRST    NOALT3]
+BCRLF: MOVEI   T1,15
+       PUSHJ   P,HEXOX
+       MOVEI   T1,12
+       JRST    HEXOX
+\fHEXHED:       PUSHJ   P,BCRLF
+IFN FTREL,<
+       MOVE    T1,RELPTR       ;GET SIZE OF RELTAB
+       CAIGE   T1,^D15         ;ENOUGH TO DO A LINE?
+       JRST    HEXH2           ;NO
+       MOVEI   T2,^D15         ;YES, DO 15
+       PUSHJ   P,TYPE04        ;DO RELOCATABLE TYPE
+HEXH2:>        ;END IFN FTREL
+       MOVE    T4,ORGXR        ;GET INDEX
+       MOVE    T1,ORGBLK(T4)   ;GET BYTE COUNT LEFT IN BLOCK
+       SUBI    T1,^D30         ;SUBTRACT WHAT WE'RE GOING TO USE
+       JUMPLE  T1,.+4          ;<= 30
+       MOVEM   T1,ORGBLK(T4)   ;SAVE REST
+       MOVEI   T1,^D30         ;30 BYTES
+       JRST    .+3
+       MOVE    T1,ORGBLK(T4)   ;GET WHAT'S LEFT
+       SETZM   ORGBLK(T4)      ;FLAG BLOCK EMPTY
+       MOVEM   T1,CHECK
+       MOVE    BC,T1           ;SAVE BYTES TO OUTPUT
+       JUMPE   BC,EOFBYT       ;JUMP IF TIME TO DO EOF STUFF
+       MOVEI   T1,":"          ;DO TYPE00 HEADER
+       PUSHJ   P,HEXOX
+       MOVE    T1,BC           ;GET BYTE COUNT
+       PUSHJ   P,HEXBYT        ;OUTPUT BYTE COUNT
+       MOVE    T1,ORGBLK+1(T4) ;GET START ADDRESS OF BLOCK
+       LSH     T1,-10          ;GET HIGH BYTE
+       ADDM    T1,CHECK
+       PUSHJ   P,HEXBYT        ;OUTPUT HIGH ADDRESS
+       MOVE    T1,ORGBLK+1(T4)
+       ADDM    T1,CHECK
+       PUSHJ   P,HEXBYT        ;OUTPUT LOW BYTE
+       MOVE    T1,ORGBLK+1(T4)
+       ADD     T1,BC           ;LAST S.A. + BYTE COUNT
+       MOVEM   T1,ORGBLK+1(T4) ;= NEW S.A.
+       SETZ    T1,             ;DATA (TYPE 00)
+       SKIPN   BC              ;IF DATA, SKIP
+       MOVEI   T1,1            ;IF EOF, (TYPE 01)
+       JRST    HEXBYT          ;OUTPUT RECORD TYPE
+\fIFN FTREL,<
+TYPE04:        TRNE    F,FR.ORG        ;RELOCATING?
+       POPJ    P,              ;NO
+       MOVEI   T1,DOLLAR       ;FLAG NON-INTEL RECORD
+       PUSHJ   P,HEXOX
+       MOVE    T1,T2           ;GET WORD COUNT
+       IMULI   T1,2            ;MAKE BYTE COUNT
+       MOVEM   T1,CHECK        ;CHECKSUM
+       PUSHJ   P,HEXBYT        ;OUTPUT
+       SETZ    T1,             ;NO START ADDRESS
+       PUSHJ   P,HEXBYT
+       PUSHJ   P,HEXBYT
+       MOVEI   T1,4            ;TYPE 04 (RELOCATABLE)
+       ADDM    T1,CHECK
+       PUSHJ   P,HEXBYT
+       SETZ    T3,             ;ZERO XR
+T04.1: MOVE    T1,RELTAB(T3)   ;GET ADDRESS
+       LSH     T1,-10
+       ADDM    T1,CHECK
+       PUSHJ   P,HEXBYT
+       MOVE    T1,RELTAB(T3)   ;GET LO ADDRESS
+       ANDI    T1,377
+       ADDM    T1,CHECK
+       PUSHJ   P,HEXBYT
+       AOJ     T3,
+       SOJG    T2,T04.1        ;LOOP
+       MOVE    T1,CHECK
+       ANDI    T1,377
+       MOVNS   T1
+       PUSHJ   P,HEXBYT        ;OUTPUT CHECKSUM
+       PUSHJ   P,BCRLF         ;CRLF
+
+       ;SHUFFLE CONTENTS OF RELTAB BACK TO BOTTOM
+       SETZ    T2,
+       SKIPN   T1,RELTAB(T3)
+       JRST    T04.2
+       MOVEM   T1,RELTAB(T2)
+       AOJ     T2,
+       AOJA    T3,.-4
+
+T04.2: MOVEM   T2,RELPTR       ;RESET POINTER
+       MOVSI   T3,RELTAB(T2)
+       HRRI    T3,RELTAB+1(T2)
+       SETZM   RELTAB(T2)
+       BLT     T3,RELEND
+       POPJ    P,
+>      ;END IFN FTREL
+\fEOFBYT:
+IFN FTREL,<
+       TRNN    F,FR.ORG        ;RELOCATING?
+       SKIPN   RELPTR          ;RELTAB EMPTY?
+       JRST    DOSYMT          ;DO SYMBOL TYPE
+       MOVE    T2,RELPTR       ;GET COUNT
+       CAIL    T2,^D15
+       MOVEI   T2,^D15         ;MAX 15 AT A TIME
+       PUSHJ   P,TYPE04        ;DO A LINE OF TYPE 04
+       JRST    EOFBYT          ;LOOP
+
+DOSYMT:        MOVEI   S,SYMTAB        ;XR
+EOFL:  CAIL    S,SYMEND        ;END ON SYMTAB?
+       JRST    TYPE01          ;YES
+       SKIPN   (S)             ;EMPTY?
+       JRST    EOFX            ;YES, SKIP
+       PUSH    P,S             ;SAVE POINTER
+       MOVE    T3,2(S)
+       TLNE    T3,S.INT!S.EXT  ;GOOD STUFF?
+       PUSHJ   P,TYPE02                ;YES
+       SKIPE   S,4(S)
+       JRST    .-4
+       POP     P,S
+EOFX:  ADDI    S,5
+       JRST    EOFL            ;LOOP
+
+TYPE02:        MOVEI   T1,DOLLAR       ;TYPE 2 OR 3 LEADER
+       PUSHJ   P,HEXOX
+       SETZM   CHECK
+       PUSH    P,T3
+       DMOVE   T2,(S)          ;GET NAME
+       MOVE    T4,[POINT 6,T2]
+T02.1: ILDB    T1,T4           ;GET BYTE
+       ADDI    T1,40           ;TO ASCII
+       ADDM    T1,CHECK
+       PUSHJ   P,HEXOX
+       CAME    T4,[600,,T3]    ;ALL 12?
+       JRST    T02.1           ;NO
+       POP     P,T3
+       TLNE    T3,S.INT        ;INTERNAL
+       MOVEI   T1,2            ;IS TYPE 02
+       TLNE    T3,S.EXT        ;EXTERNAL
+       MOVEI   T1,3            ;IS TYPE 03
+       PUSHJ   P,HEXBYT        ;OUTPUT SYMBOL TYPE
+       ADDM    T1,CHECK
+       HRRZ    T1,T3           ;GET VALUE
+       LSH     T1,-10          ;GET HIGH PART
+       ADDM    T1,CHECK
+       PUSHJ   P,HEXBYT
+       HRRZ    T1,T3
+       ANDI    T1,377
+       ADDM    T1,CHECK
+       PUSHJ   P,HEXBYT
+       MOVE    T1,CHECK
+       ANDI    T1,377
+       MOVNS   T1
+       PUSHJ   P,HEXBYT
+       PUSHJ   P,BCRLF
+       POPJ    P,
+>      ;END IFN FTREL
+\fTYPE01:       MOVEI   T1,":"          ;OUTPUT HEADER
+       PUSHJ   P,HEXOX
+       SETZ    T1,             ;LENGTH 0
+       PUSHJ   P,HEXBYT
+       MOVE    T1,STARTA       ;GET START ADDRESS
+       LSH     T1,-10
+       PUSHJ   P,HEXBYT
+       MOVE    T1,STARTA
+       ANDI    T1,377
+       PUSHJ   P,HEXBYT
+       MOVEI   T1,1            ;TYPE 01
+       PUSHJ   P,HEXBYT
+       JRST    BCRLF           ;CRLF
+
+INCHX: POP     P,T1
+       JUMPE   I,INCH          ;CAST OFF NULLS
+       TRNE    F,FR.SNK        ;IF SNEAKING,
+       JRST    [IDPB   I,BAKPTR        ;SAVE CHARACTER
+               POPJ    P,]             ;DON'T PRINT TWICE
+       TRNE    F,FR.PS1
+       JRST    PAS1IX          ;SKIP ALL PROCESSING OF CHARACTER IF PASS1
+       SKIPN   LBTP
+       MOVE    LBTP,[POINT 7,LINBLK]
+       CAIE    I,FF            ;DON'T GO PUTTING FF IN LINBLK!
+       IDPB    I,LBTP
+       CAIE    I,LF            ;IF LF,
+       CAIN    I,FF            ;OR FF,
+       CAIA                    ;SKIP INTO EOL ROUTINE
+        POPJ   P,              ;ELSE WE'RE DONE
+       PUSH    P,T1
+       PUSH    P,T2
+       CAIN    I,FF
+       JRST    DOFFX           ;IF FF, SKIP SOME STUFF
+       MOVEI   T1,TAB
+       TRNE    F,FR.LOP        ;IF CODE GENERATED
+       JRST    INCHX1          ;JUST ONE TAB
+       PUSHJ   P,DOLINO        ;PRINT LINE # AS A LAST RESORT
+       TRNE    F,FR.HEX
+       JRST    INCHX0
+       PUSHJ   P,LOUCH
+       PUSHJ   P,LOUCH
+INCHX0:        PUSHJ   P,LOUCH
+INCHX1:        PUSHJ   P,LOUCH
+       TRZ     F,FR.LIN        ;CLEAR LINE # PRINTED FLAG FOR NEXT LINE
+       MOVE    LBTP,[POINT 7,LINBLK]
+       ILDB    T1,LBTP
+       JUMPE   T1,CHKERR
+       PUSHJ   P,LOUCH
+       SKIPE   E
+       OUTCHR  T1
+       JRST    .-5
+\fCHKERR:       JUMPE   E,NOERR
+       HLRZ    T1,E
+       OUTCHR  T1
+       PUSHJ   P,LOUCH
+       MOVE    T2,ERRTAB-1(E)
+       MOVE    LBTP,[POINT 7,(T2)]
+       ILDB    T1,LBTP
+       JUMPE   T1,.+4
+       PUSHJ   P,LOUCH
+       OUTCHR  T1
+       JRST    .-4
+       PUSHJ   P,LCRLF
+       OUTSTR  CRLF
+       SETZ    E,
+NOERR: SETZM   LINBLK
+       MOVE    T1,[LINBLK,,LINBLK+1]
+       BLT     T1,LINEND
+       SETZ    LBTP,
+       MOVE    T1,LINCTR
+       CAMG    T1,PAGESZ       ;ON NEW PAGE?
+       JRST    NOFF            ;NO
+       JRST    DOFF            ;YES, WRITE HEADER
+
+DOFFX: AOS     PAGENO
+       SETZM   SUBPAG          ;REAL PAGES HAVE NO SUB PAGE MARK
+DOFF:  PUSHJ   P,DOHDFF        ;GO DO THE HEADING
+NOFF:  POP     P,T2
+       POP     P,T1
+PAS1IX:        CAIN    I,FF            ;IF FF,
+       JRST    INCH            ;EAT IT
+       POPJ    P,
+
+LOUCH: TRNE    F,FR.LST        ;IF NOT LISTING
+       TRNE    F,FR.PS1        ;OR ON PASS 1
+       POPJ    P,              ;FORGET IT
+       SOSGE   LBUF+2
+       JRST    LOUCH1
+       IDPB    T1,LBUF+1
+       CAIN    T1,LF
+       AOS     LINCTR
+
+       CAIN    T1,LF           ;LF DOESN'T CHANGE BOL
+       POPJ    P,
+       TRZ     F,FR.BOL        ;ASSUME REGULAR CHAR
+       CAIN    T1,CR           ;IF CR
+       TRO     F,FR.BOL        ;FLAG BOL
+       POPJ    P,
+
+LOUCH1:        OUTPUT  LST,
+       JRST    LOUCH
+
+\fOUTOP:        PUSHJ   P,LSTPC
+       MOVE    T1,OP
+       PUSHJ   P,LSTOP
+       POPJ    P,              ;RETURN
+
+NOPC:  MOVEI   T1,TAB
+       PUSHJ   P,LOUCH
+       TRNN    F,FR.HEX
+       PUSHJ   P,LOUCH
+       MOVE    T1,OP
+       SKIPGE  T1              ;IF NEGATIVE
+       SETZ    T1,             ;MAKE ZERO
+       MOVEI   T3,6
+       TRO     F,FR.LOP
+       PUSHJ   P,LSTNUM
+       TRNE    F,FR.HEX
+       POPJ    P,
+       MOVEI   T1,TAB
+       JRST    LOUCH
+
+HEXOX: SOSL    OBUF+2
+       JRST    [IDPB   T1,OBUF+1
+               POPJ    P,]
+       OUTPUT  OBJ,
+       JRST    HEXOX
+
+\fHEXOUT:       ADDM    T1,CHECK
+       PUSHJ   P,HEXBYT
+       SOJG    BC,CPOPJ
+       PUSH    P,T1
+       PUSH    P,T2
+       PUSH    P,T3
+       PUSH    P,T4
+       MOVE    T1,CHECK
+       ANDI    T1,377
+       MOVNS   T1
+       PUSHJ   P,HEXBYT
+       MOVE    T4,ORGXR        ;GET INDEX
+       SKIPN   ORGBLK(T4)      ;STILL GOOD BYTE COUNT?
+       ADDI    T4,2            ;NEXT BLOCK
+       MOVEM   T4,ORGXR        ;SAVE INDEX
+       PUSHJ   P,HEXHED        ;DO HEADER
+       POP     P,T4
+       POP     P,T3
+       POP     P,T2
+       POP     P,T1
+       POPJ    P,
+
+HEXBYT:        PUSH    P,T1
+       LSH     T1,-4
+       PUSHJ   P,NYBBLE        ;OUTPUT HIGH NYBBLE
+       POP     P,T1
+       PUSH    P,T1
+       PUSHJ   P,NYBBLE
+       POP     P,T1
+       POPJ    P,
+
+NYBBLE:        ANDI    T1,17
+       CAILE   T1,^D9
+       JRST    .+3
+       ADDI    T1,60
+       JRST    HEXOX
+       ADDI    T1,"A"-^D10
+       JRST    HEXOX
+
+WRAPUP:
+IFN FTCREF,<
+       PUSHJ   P,PRTSYM        ;PRINT SYMBOL TABLE
+>
+       RELEAS  SYM,
+       RELEAS  LST,
+       RELEAS  OBJ,
+IFN FTSTAT,<
+       TLNE    F,FL.LNR        ;LIST NON-REF SYMBOLS?
+       PUSHJ   P,REFLOP        ;YES
+>
+       AND     F,[XWD FL.CCL,0];CLEAR ALL FLAGS BUT FL.CCL
+       JRST    START##
+\fIFN FTSTAT,<
+
+;PRINT ALL DEFINED BUT NOT REFERENCED SYMBOLS
+
+REFLOP:        MOVEI   S,SYMTAB
+RLOOP4:        CAIN    S,SYMEND        ;END OF TABLE?
+       POPJ    P,              ;DONE
+       SKIPN   (S)             ;IF EMPTY
+       JRST    RLOOP5          ;GET NEXT
+       PUSH    P,S             ;SAVE IT
+       PUSHJ   P,RLINK         ;RUN OUT THIS BRANCH
+       POP     P,S             ;DONE
+RLOOP5:        ADDI    S,5             ;GET NEXT
+       JRST    RLOOP4          ;LOOP
+
+RLINK: MOVE    T2,2(S)
+       TLNN    T2,S.REF!S.MAC  ;IS SYMBOL REFERENCED OR A MACRO?
+       JRST    RLOOP0          ;NO
+RLOOP: SKIPN   S,4(S)          ;IS THERE A LINK?
+       POPJ    P,              ;NO
+       JRST    RLINK
+
+RLOOP0:        SKIPN   (S)
+       JRST    RLOOP
+       TRON    F,FL.HED
+       OUTSTR  [ASCIZ/Unreferenced labels:
+/]
+       MOVE    T4,[POINT 6,(S)]
+RLOOP1:        ILDB    T2,T4
+       JUMPE   T2,RLOOP2
+       ADDI    T2,40
+       OUTCHR  T2
+       CAME    T4,[600+S,,1]
+       JRST    RLOOP1
+RLOOP2:        OUTSTR  [ASCIZ/
+/]
+       JRST    RLOOP
+>      ;END IFN FTSTAT
+\fIFN FTCREF,<
+PRTSYM:        SKIPN   CREFSW          ;CREF?
+       SKIPE   SYMBSW          ;OR SYMBOL FILE?
+       CAIA                    ;YES, SKIP
+       POPJ    P,              ;DON'T BE SILLY THEN
+       SETZB   BC,E            ;CLEAR COUNTER
+       SETOM   PAGENO          ;FLAG SYMBOL TABLE PAGE
+       MOVEI   T1,1            ;SYMBOL TABLE ALWAYS STARTS WITH SUBPAGE
+       MOVEM   T1,SUBPAG       ;NUMBER 1
+       SKIPE   CREFSW          ;CREF?
+       PUSHJ   P,DOHDFX        ;PRINT NEW HEADER
+PRTS:  HRLOI   T1,377777       ;+INFINITY
+       SETZ    P1,
+       MOVEI   S,SYMTAB
+PRT0:  SKIPN   (S)             ;EMPTY?
+       AOJA    P1,PRT1         ;YES
+       PUSH    P,S             ;SAVE S
+       PUSHJ   P,PRT10         ;CHECK OUT THIS BRANCH
+       POP     P,S
+PRT1:  ADDI    S,5             ;NEXT LINK
+       CAIE    S,SYMEND        ;ALL DONE?
+       JRST    PRT0            ;NO, LOOP
+       SKIPE   T1              ;QUIT IF WE GOT TO BLANK SYMBOLS
+       CAMN    T1,[377777,,-1] ;NO SYMBOLS SMALLER THAN +INFINITY?
+       JRST    PRTX            ;DONE
+       AOJ     BC,             ;COUNT IT
+       MOVE    S,T2
+       SKIPN   CREFSW          ;IF NOT CREF
+       JRST    PRT1B           ;DON'T PRINT STUFF
+       DMOVE   T2,(S)          ;GET SMALLEST SYMBOL
+       PUSHJ   P,PUTSIX        ;FOR LISTING
+       MOVEI   T1,TAB
+       PUSHJ   P,LOUCH
+       MOVE    T1,2(S)         ;GET FLAGS,VALUE
+       TLNE    T1,S.UNDF       ;UNDEFINED?
+       JRST    [MOVEI  T2,[ASCIZ/Undf/]
+               PUSHJ   P,PUTSTR
+               JRST    PRT4]
+       TLNE    T1,S.MAC
+       JRST    [MOVEI  T2,[ASCIZ/Macro/]
+               PUSHJ   P,PUTSTR
+               JRST    PRT4]
+       HRRZ    T1,2(S)         ;JUST VALUE
+       MOVEI   T3,6
+       PUSHJ   P,LSTNUM        ;PRINT IT
+PRT1B: SKIPN   SYMBSW          ;DOING SYMBOL FILE?
+       JRST    PRT4            ;NO
+       MOVE    T1,SYMTYP       ;GET 10 OR 20
+       JUMPE   T1,PRT1A        ;NEITHER, START OF FILE
+       ADD     T1,SYMCNT
+       ANDI    T1,7770         ;CUT TO TAB STOP
+       MOVEM   T1,SYMCNT
+       CAIL    T1,MAXSYM       ;GOT TO END OF LINE?
+       JRST    [PUSHJ  P,SCRLF
+               SETZM   SYMCNT
+               JRST    PRT1A]
+       MOVEI   T1,TAB          ;END WITH A TAB
+       PUSHJ   P,SOUCH
+       MOVEI   T1,TAB
+       MOVE    T2,SYMTYP       ;GET TYPE
+       CAIN    T2,20           ;NEED 2 TABS?
+       PUSHJ   P,SOUCH         ;YES
+PRT1A: HRRZ    T1,2(S)         ;GET FLAGS,VALUE
+       PUSHJ   P,SYMNUM
+       MOVEI   T1,SPACE
+       PUSHJ   P,SOUCH
+       MOVEI   T1,5            ;COUNT 4 DIGITS AND A SPACE
+       ADDM    T1,SYMCNT
+       DMOVE   T2,(S)          ;GET SMALLEST SYMBOL
+       PUSHJ   P,PUTSSX        ;FOR SYMBOL FILE
+       MOVEI   T1,10           ;ACCOUNT FOR TAB
+       MOVE    T2,(S)          ;CHECK FOR SHORT SYMBOLS
+       TLNN    T2,77           ;1 OR 2 CHAR SYMBOL?
+       MOVEI   T1,20           ;YES
+       MOVE    T2,1(S)         ;CHECK FOR LONG SYMBOLS
+       TRNE    T2,77           ;12 CHAR SYMBOL?
+       MOVEI   T1,20           ;YES
+       MOVEM   T1,SYMTYP       ;SAVE 'TYPE' 10 (NORMAL) OR 20 (SHORT OR LONG)
+IFN FTREL,<
+       SETZ    T1,
+       MOVE    T2,2(S)         ;GET FLAGS
+       TLNE    T2,S.REL
+       MOVEI   T1,"'"          ;FLAG RELOC
+       TLNE    T2,S.EXT!S.INT
+       MOVEI   T1,"*"
+       SKIPE   T1
+       PUSHJ   P,LOUCH
+> ;END IFN FTREL
+\fPRT4: SKIPN   CREFSW          ;IF NOT CREF
+       JRST    PRT9A           ;JUST FLAG SYMBOL AND LOOP
+       MOVE    T2,3(S)         ;GET LINE,,LINK
+PRT3:  MOVEI   T4,^D13         ;MAX ENTRIES/LINE
+PRT2:  PUSH    P,T2
+       MOVEI   T1,TAB
+       PUSHJ   P,LOUCH
+       HLRZS   T2
+       TRZ     T2,(1B0)        ;CLEAR FLAG
+       MOVEI   T1,SPACE
+       CAIG    T2,^D999
+       PUSHJ   P,LOUCH
+       CAIG    T2,^D99
+       PUSHJ   P,LOUCH
+       CAIG    T2,^D9
+       PUSHJ   P,LOUCH
+       MOVE    T1,T2
+       PUSHJ   P,PUTDEC
+       POP     P,T2
+       TLNN    T2,(1B0)        ;FLAG?
+       JRST    .+3             ;NO
+       MOVEI   T1,"#"
+       PUSHJ   P,LOUCH
+       HRRZS   T2              ;GET LINK
+       JUMPE   T2,PRT9         ;DONE WITH CHAIN
+       MOVE    T2,(T2)         ;GET LINE,,LINK
+       SOJG    T4,PRT2         ;LOOP FOR LINE
+       PUSHJ   P,LCRLF         ;END THE LINE
+       MOVE    T1,LINCTR
+       CAMLE   T1,PAGESZ       ;IF ON NEW PAGE,
+       PUSHJ   P,DOHDFF        ;DO HEADER
+       MOVEI   T1,TAB
+       PUSHJ   P,LOUCH
+       PUSHJ   P,LOUCH
+       JRST    PRT3
+
+PRT9:  PUSHJ   P,LCRLF
+       MOVE    T1,LINCTR
+       CAMLE   T1,PAGESZ       ;IF ON NEW PAGE,
+       PUSHJ   P,DOHDFF        ;DO HEADER
+PRT9A: MOVE    T3,2(S)         ;GET FLAGS
+       TLO     T3,S.PRT        ;FLAG SYMBOL PRINTED
+       MOVEM   T3,2(S)
+       JRST    PRTS
+\fPRTX:
+       SKIPE   SYMBSW          ;IF SYMBOLS
+       PUSHJ   P,SCRLF         ;DO CRLF
+       SKIPN   CREFSW          ;IF NOT CREF
+       POPJ    P,              ;EXIT
+IFN FTSTAT,<
+       PUSHJ   P,LCRLF         ;NEW LINE
+       MOVE    T1,BC           ;GET COUNT OF SYMBOLS USED
+       PUSHJ   P,PUTDEC
+       MOVEI   T2,[ASCIZ/ symbols used
+/]
+       PUSHJ   P,PUTSTR
+       MOVE    T1,P1
+       PUSHJ   P,PUTDEC
+       MOVEI   T2,[ASCIZ/ empty slots in SYMTAB
+/]
+       PUSHJ   P,PUTSTR
+       CAIG    E,1
+       POPJ    P,
+       MOVE    T1,E
+       PUSHJ   P,PUTDEC
+       MOVEI   T2,[ASCIZ/ links in longest symbol search/]
+       PUSHJ   P,PUTSTR
+>      ;END IFN FTSTAT
+       JRST    LCRLF           ;CRLF
+
+PRT10: SETZ    T4,             ;COUNT OF LINKS IN THIS BRANCH
+       MOVE    T3,2(S)         ;GET FLAGS
+       TLNE    T3,S.PRT        ;WAS ALREADY USED?
+       JRST    PRT11           ;YES
+       CAMG    T1,(S)          ;GET SYMBOL THAT IS SMALLER
+       JRST    PRT11           ;(YES, WE ARE ONLY SORTING ON THE FIRST 6 CHARACTERS)
+       MOVE    T2,S            ;SAVE INDEX OF LEAST ALPHABETICAL SYMBOL
+       MOVE    T1,(S)          ;NEW MATCH SYMBOL
+PRT11: AOJ     T4,
+       SKIPE   S,4(S)          ;GET NEXT LINK
+       JRST    PRT10+1         ;GO ON
+       CAMLE   T4,E            ;GT MAX?
+       MOVE    E,T4            ;NEW MAX
+       POPJ    P,              ;NO LINK
+>      ;END IFN FTCREF
+\fLSTNUM:       TRNE    F,FR.HEX        ;HEX OUTPUT?
+       JRST    LSTHEX          ;YES
+       IDIVI   T1,10           ;NO
+       SOJLE   T3,.+4
+       PUSH    P,T2
+       PUSHJ   P,LSTNUM
+       POP     P,T2
+       MOVEI   T1,60(T2)
+LSTN1: PUSHJ   P,LOUCH
+       POPJ    P,
+
+
+LSTHEX:        IMULI   T3,2            ;MULT BY 2/3
+       PUSH    P,T4
+       IDIVI   T3,3
+       POP     P,T4
+LSTH1: IDIVI   T1,20
+       SOJLE   T3,LSTH2
+       PUSH    P,T2
+       PUSHJ   P,LSTH1
+       POP     P,T2
+LSTH2: CAILE   T2,11
+       JRST    LSTH3
+       MOVEI   T1,60(T2)
+       JRST    LSTN1
+
+LSTH3: MOVEI   T1,"A"-^D10(T2)
+       JRST    LSTN1
+
+SYMNUM:        MOVEI   T3,4
+SYMH1: IDIVI   T1,20
+       SOJLE   T3,SYMH2
+       PUSH    P,T2
+       PUSHJ   P,SYMH1
+       POP     P,T2
+SYMH2: CAILE   T2,11
+       JRST    SYMH3
+       MOVEI   T1,60(T2)
+       CAIA
+SYMH3: MOVEI   T1,"A"-^D10(T2)
+SOUCH: SOSGE   SBUF+2
+       JRST    SOUCH1
+       IDPB    T1,SBUF+1
+       POPJ    P,
+SOUCH1:        OUTPUT  SYM,
+       JRST    SOUCH
+
+SCRLF: MOVEI   T1,CR
+       PUSHJ   P,SOUCH
+       MOVEI   T1,LF
+       JRST    SOUCH
+\f;LSTPC   LIST THE PC AND A TAB
+
+LSTPC: TRNE    F,FR.PS1        ;PASS1?
+       POPJ    P,              ;YES
+       PUSHJ   P,DOLINO        ;IN CASE AT DC?
+       TRZ     F,FR.LIN        ;LISTING PC CLEARS FR.LIN
+       MOVEI   T3,6
+       MOVE    T1,PC
+       PUSHJ   P,LSTNUM
+       TRNE    F,FR.HEX        ;HEX?
+       JRST    LSTPC1          ;YES
+       MOVEI   T1,"="
+       PUSHJ   P,LOUCH
+       MOVEI   T3,3            ;3 FIGURES
+       MOVE    T1,PC           ;GET PC
+       LSH     T1,-10
+       PUSHJ   P,LSTNUM        ;OUTPUT THE PC
+       MOVEI   T1,"/"
+       PUSHJ   P,LOUCH
+       MOVE    T1,PC
+       ANDI    T1,377
+       MOVEI   T3,3
+       PUSHJ   P,LSTNUM
+LSTPC1:
+IFN FTREL,<
+       TRNE    F,FR.ORG        ;RELOCATING?
+       JRST    LSTPC2          ;NO
+       MOVEI   T1,"'"
+       PUSHJ   P,LOUCH
+> ;END IFN FTREL
+LSTPC2:        MOVEI   T1,TAB
+       PUSHJ   P,LOUCH         ;OUTPUT ANOTHER TAB
+       POPJ    P,
+
+LCRLF: TRNE    F,FR.PS1
+       POPJ    P,
+       MOVEI   T1,CR
+       PUSHJ   P,LOUCH
+       MOVEI   T1,LF
+       JRST    LOUCH
+\f;LSTOP        ENTER THE BYTE IN T1 IN THE OBJ FILE
+;      PRINT THE BYTE [AND A SPACE IF OCT]
+
+LSTOP: TRNE    F,FR.PS1
+       JRST    LSTOP1
+       TRO     F,FR.LOP
+       MOVEI   T3,3
+       PUSH    P,T2
+       ANDI    T1,377
+       PUSHJ   P,HEXOUT
+       PUSHJ   P,LSTNUM        ;OUTPUT BYTE
+       MOVEI   T1,SPACE
+       TRNN    F,FR.HEX
+       PUSHJ   P,LOUCH
+       POP     P,T2
+LSTOP1:        AOS     PC
+       TRNE    F,FR.PS1
+       AOJ     BC,
+       POPJ    P,
+
+DOTAG: TRO     F,FR.NRF        ;DEFINITION IS NOT REFERENCE
+       PUSHJ   P,EVAL
+       PUSHJ   P,SYMDEF        ;FLAG DEFINITION
+       HRRZS   T1              ;CLEAR FLAGS
+       CAME    T1,PC
+       ERROR   F.MULT
+       JRST    DUNTAG
+
+SYMDEF:        TRNE    F,FR.PS1        ;PASS1?
+       POPJ    P,              ;YES
+       TRNN    F,FR.LST        ;LISTING?
+       POPJ    P,              ;NO
+       CAIGE   S,SYMTAB        ;POINTS TO SYMTAB?
+       POPJ    P,              ;NO. PROB POINTS TO PRETAB
+       PUSH    P,T1
+       PUSH    P,T2
+       MOVE    T1,3(S)         ;GET LINE,,LINK
+       MOVEI   T2,3(S)         ;GET 1ST POINTER
+DEFS0: TRNN    T1,-1           ;END OF CHAIN?
+       JRST    DEFS1           ;YES
+       MOVE    T2,T1
+       MOVE    T1,(T2)         ;LINK
+       JRST    DEFS0           ;LOOP
+
+DEFS1: TLO     T1,(1B0)        ;FLAG DEFINITION
+       MOVEM   T1,(T2)         ;PUT BACK
+       POP     P,T2
+       POP     P,T1
+       POPJ    P,
+\f
+DOHDFF:        SKIPN   PAGESZ          ;IF PAGE = 0
+       POPJ    P,              ;DON'T DO ANY HEADERS
+DOHDFX:        MOVEI   T1,FF
+       PUSHJ   P,LOUCH         ;FORCE NEW PAGE
+DOHEAD:        PUSH    P,T1            ;SAVE ACS
+       PUSH    P,T2
+       PUSH    P,T3
+       MOVEI   T1,1
+       MOVEM   T1,LINCTR       ;SET LINE COUNT TO 1
+       MOVE    T2,[POINT 7,TITL]
+       MOVEI   T3,^D66
+       ILDB    T1,T2
+       JUMPE   T1,.+3
+       PUSHJ   P,LOUCH
+       SOJG    T3,.-3
+       MOVEI   T1,11           ;LOAD A <TAB>
+       SKIPE   TITL            ;NOT IF NO TITLE
+       PUSHJ   P,LOUCH         ;OUTPUT IT
+       MOVEI   T2,HEAD0
+       PUSHJ   P,PUTSTR
+       MOVEI   T2,M80VER
+       PUSHJ   P,PUTOCT
+       MOVEI   T1,M80MIN
+       JUMPE   T1,.+3
+       MOVEI   T1,"@"(T1)
+       PUSHJ   P,LOUCH
+       MOVEI   T1,"("
+       PUSHJ   P,LOUCH
+       MOVEI   T2,M80EDT
+       PUSHJ   P,PUTOCT
+       MOVEI   T2,[ASCIZ/) /]
+       PUSHJ   P,PUTSTR
+       SKIPL   PAGENO
+       MOVEI   T2,HEAD1
+       SKIPG   PAGENO
+       MOVEI   T2,HEAD3
+       PUSHJ   P,PUTSTR
+       MOVEI   T2,DATE         ;SO WHAT IF WE STARTED AT 11:59 DEC 31
+       PUSHJ   P,PUTSTR        ;WE STILL USE THE DATE OF THE START OF THE RUN
+       MOVEI   T2,HEAD2
+       PUSHJ   P,PUTSTR
+       SKIPL   T1,PAGENO
+       PUSHJ   P,PUTDEC
+       SKIPL   PAGENO
+       JRST    .+3
+       MOVEI   T1,"S"          ;INDICATE SYMBOL TABLE PAGE
+       PUSHJ   P,LOUCH
+       SKIPN   SUBPAG
+       JRST    NOSUB
+       MOVEI   T1,"-"
+       PUSHJ   P,LOUCH
+       MOVE    T1,SUBPAG
+       PUSHJ   P,PUTDEC
+NOSUB: AOS     SUBPAG          ;BUMP SUBPAGE COUNTER HERE
+       PUSHJ   P,LCRLF
+\f      MOVE    T2,[POINT 6,FILNAM]     ;LOAD THE SOURCE FILE NAME
+DOH1:  ILDB    T1,T2
+       JUMPE   T1,.+5
+       ADDI    T1,40
+       PUSHJ   P,LOUCH
+       TLNE    T2,770K
+       JRST    DOH1
+       MOVEI   T1,"."          ;LOAD A "."
+       PUSHJ   P,LOUCH         ;AND OUTPUT IT
+       HLLZ    T2,FILEXT       ;LOAD THE SOURCE FILE EXT.
+       SETZ    T3,
+       PUSHJ   P,PUTSIX        ;PRINT IT
+       PUSHJ   P,LCRLF
+       PUSHJ   P,LCRLF
+       POP     P,T3
+       POP     P,T2
+       POP     P,T1
+       POPJ    P,
+
+PUTSTR:        HRLI    T2,(POINT 7,0)  ;MAKE A BTP
+       ILDB    T1,T2           ;LOAD THE BYTE
+       JUMPE   T1,CPOPJ        ;IF LAST BYTE, RETURN
+       PUSHJ   P,LOUCH         ;OUTPUT IT
+       JRST    .-3             ;AND LOOP
+
+PUTOCT:        MOVE    T3,[POINT 3,T2] ;LOAD THE BTP
+       ILDB    T1,T3           ;LOAD THE BYTE
+       JUMPE   T1,.-1          ;IGNORE LEADING ZEROS
+       CAIA
+       ILDB    T1,T3
+       ADDI    T1,60           ;MAKE IT ASCII
+       PUSHJ   P,LOUCH         ;OUTPUT IT
+       TLNE    T3,770K         ;LAST BYTE?
+       JRST    .-4             ;NO, THEN LOOP
+       POPJ    P,              ;YES, RETURN
+
+PUTDEC:        IDIVI   T1,^D10         ;DIVIDE BY RADIX
+       JUMPE   T1,.+4          ;IF NULL, DO RETURN LOOP
+       PUSH    P,T2            ;SAVE T2
+       PUSHJ   P,PUTDEC        ;RECURSIVE CALL
+       POP     P,T2            ;RESTORE T2
+       MOVEI   T1,60(T2)       ;MAKE ASCII
+       JRST    LOUCH           ;OUTPUT AND LOOP RETURN
+
+CRLF:  ASCIZ/
+/
+HEAD0: ASCIZ   \MAC80 \
+HEAD1: ASCIZ   \8085 Cross Assembler  \
+HEAD2: ASCIZ   \  Page \
+HEAD3: ASCIZ   \Symbol Table  \
+\fGTDATE:       MOVE    T3,[POINT 7,DATE]
+       PUSH    P,I             ;SAVE I
+       MOVE    T1,[60,,11]     ;LOAD THE DAY
+       GETTAB  T1,             ;NOW
+        JRST   IPOPJ           ;PA1050 DIES ON THIS GETTAB
+       PUSHJ   P,GETDEC        ;MAKE DECIMAL ASCII
+       MOVEI   T1,"-"
+       IDPB    T1,T3           ;DEPOSIT A HYPHEN
+       MOVE    I,[57,,11]      ;LOAD THE MONTH
+       GETTAB  I,
+       JFCL
+       MOVE    T2,[POINT 7,MONTAB-1(I)]        ;SET BTP
+       ILDB    T1,T2           ;LOAD THE BYTE
+       JUMPE   T1,.+3
+       IDPB    T1,T3           ;DEPOSIT THE BYTE
+       JRST    .-3             ;AND LOOP
+       MOVEI   T1,"-"
+       IDPB    T1,T3           ;DEPOSIT ANOTHER BYTE
+       MOVE    T1,[56,,11]     ;LOAD THE YEAR
+       GETTAB  T1,
+       JFCL
+       SUBI    T1,^D1900       ;LAST TWO ONLY
+       PUSHJ   P,GETDEC        ;DEPOSIT IT
+       MOVEI   T1,SPACE        ;LOAD AND OUTPUT A SPACE
+       IDPB    T1,T3
+       IDPB    T1,T3           ;2 SPACES
+       MOVE    T1,[61,,11]     ;LOAD THE HOUR
+       GETTAB  T1,
+       JFCL
+       PUSHJ   P,GETDEC        ;AND DEPOSIT IT
+       MOVEI   T1,":"          ;LOAD AND OUTPUT A COLON
+       IDPB    T1,T3
+       MOVE    T1,[62,,11]     ;LOAD MINUTES
+       GETTAB  T1,
+       JFCL
+       CAIL    T1,^D10         ;TWO DIGITS?
+       JRST    .+5             ;YES, THEN DO IT
+       PUSH    P,T1            ;SAVE T1
+       MOVEI   T1,"0"          ;LOAD AND OUTPUT A ZERO
+       IDPB    T1,T3
+       POP     P,T1            ;RESTORE T1
+       PUSHJ   P,GETDEC        ;AND OUTPUT IT
+IPOPJ: POP     P,I             ;RESTORE I
+       POPJ    P,              ;RETURN
+
+GETDEC:        IDIVI   T1,^D10         ;DIVIDE BY RADIX
+       JUMPE   T1,.+4          ;IF DONE, JUMP OUT OF LOOP
+       PUSH    P,T2            ;SAVE T2
+       PUSHJ   P,GETDEC        ;AND LOOP
+       POP     P,T2            ;RESTORE T2
+       MOVEI   T1,60(T2)       ;MAKE ASCII
+       IDPB    T1,T3           ;DEPOSIT IT
+       POPJ    P,              ;LOOP RETURN
+\fPUTSIX:       MOVE    T4,[POINT 6,T2]
+       ILDB    T1,T4
+       ADDI    T1,40
+       PUSHJ   P,LOUCH
+       CAME    T4,[600,,T3]
+       JRST    .-4
+       POPJ    P,
+
+PUTSSX:        MOVE    T4,[POINT 6,T2]
+       ILDB    T1,T4
+       JUMPE   T1,CPOPJ
+       ADDI    T1,40
+       PUSHJ   P,SOUCH
+       AOS     SYMCNT
+       CAME    T4,[600,,T3]
+       JRST    PUTSSX+1
+       POPJ    P,
+
+DOLINO:        TROE    F,FR.LIN        ;ALREADY PRINTED?
+       POPJ    P,              ;YES, DONE
+       PUSH    P,T1
+       PUSH    P,T2
+       TRNN    F,FR.BOL        ;AT START OF LINE?
+       PUSHJ   P,LCRLF         ;FIXUP BUG IN DC LOGIC (HORRORS)
+       MOVE    T1,LINCTR       ;GET LINE COUNT
+       CAMLE   T1,PAGESZ       ;TEST IN CASE IN DC? CODE
+       PUSHJ   P,DOHDFF        ;IF EXPANSION OF DB OVERFLOWS PAGE
+       AOS     T1,LINENO       ;GET LINE #
+       MOVEI   T2,SPACE
+       EXCH    T1,T2
+       CAIG    T2,^D999
+       PUSHJ   P,LOUCH
+       CAIG    T2,^D99
+       PUSHJ   P,LOUCH
+       CAIG    T2,^D9
+       PUSHJ   P,LOUCH
+       EXCH    T1,T2
+       PUSHJ   P,PUTDEC        ;PRINT IT
+       MOVE    T2,MACPDL
+       PUSH    T2,INVECT
+DOLIN2:        HRRZ    T1,(T2)         ;IS THIS A SOURCE LINE?
+       CAIN    T1,-1           ;..
+       JRST    DOLIN1          ;YES, SKIP
+       CAIG    T1,BAKPTR
+       CAIGE   T1,BAKBUF       ;CAME FROM BAKBUF?
+       JRST    [MOVEI  T1,"M"  ;NO, FLAG AS A MACRO EXPANSION LINE
+               PUSHJ   P,LOUCH
+               JRST    DOLIN1]
+       SOJA    T2,DOLIN2
+
+DOLIN1:        MOVEI   T1,TAB
+       PUSHJ   P,LOUCH         ;& A TAB
+       POP     P,T2
+       POP     P,T1
+       POPJ    P,
+
+MONTAB:        ASCIZ   /Jan/
+       ASCIZ   /Feb/
+       ASCIZ   /Mar/
+       ASCIZ   /Apr/
+       ASCIZ   /May/
+       ASCIZ   /Jun/
+       ASCIZ   /Jul/
+       ASCIZ   /Aug/
+       ASCIZ   /Sep/
+       ASCIZ   /Oct/
+       ASCIZ   /Nov/
+       ASCIZ   /Dec/
+       ;ADD NEW MONTHS HERE
+\fPASS1:        TRZE    F,FR.END        ;DONE?
+       JRST    ENDIT           ;YES
+       PUSHJ   P,TOKEN
+       PUSHJ   P,IFPOP         ;IF OR FRIENDS?
+       JRST    NOP1T           ;YES
+       TRNE    F,FR.OFF
+       JRST    FPASS1
+NOP1T: JUMPN   TOK,.+4
+       CAIE    I,CR
+       CAIN    I,SEMICO        ;END OF LINE?
+       JRST    FPASS1          ;YES, DONE
+       CAIN    I,COLON         ;BEFORE A COLON?
+       JRST    LOASYM          ;YES, ITS A LABEL
+       PUSHJ   P,SRCHOP        ;GET INDEX TO OPCODE
+       JRST    [PUSHJ  P,SETMAC;SETUP MACRO
+               JRST    PASS1]
+       MOVE    P1,TYPLSH(X)
+       TLNE    P1,T.POP        ;PSEUDO OP?
+       JRST    [PUSHJ  P,PSEUDO        ;DOIT
+               JRST    PASS1]          ;LOOP BACK
+       AOS     PC              ;ONE BYTE
+       AOJ     BC,
+       TLNN    P1,T.2BYT!T.3BYT
+       JRST    .+3
+       AOS     PC              ;TWO BYTES
+       AOJ     BC,
+       TLNN    P1,T.3BYTE
+       JRST    .+3
+       AOS     PC              ;THREE BYTES
+       AOJ     BC,
+FPASS1:        PUSHJ   P,FLUSH
+       JRST    PASS1
+
+LOASYM:        PUSHJ   P,SRCSYM
+        DMOVEM TOK,(S)
+       HRR     T1,PC           ;FLAGS,PC
+       TRNN    F,FR.ORG        ;IF RELOCATING,
+       TLO     T1,S.REL        ;FLAG AS RELOCATABLE
+       TLZ     T1,S.UNDF       ;CLEAR UNDEFINED FLAG
+       CAIL    S,SYMTAB        ;SKIP IF ILLEGAL
+       MOVEM   T1,2(S)
+       JRST    PASS1
+
+UUO:   LDB     E,[POINT 9,.JBUUO##,8]
+       JRST    @UUOTAB-1(E)
+
+UUOTAB:        EUUO
+       WUUO
+
+WUUO:  MOVSI   E,"%"
+       JRST    EUUO+1
+
+EUUO:  MOVSI   E,"?"
+       HRR     E,.JBUUO
+       POPJ    P,
+
+\fDEFINE X(A,B,C,D),<
+       SIXBIT  /A/
+       >
+
+
+OPNTAB:        XLIST
+       OPTYPE
+       LIST
+
+       OPTABL==.-OPNTAB
+
+DEFINE X(A,B,C,D),<
+       EXP     B
+       >
+
+OPCTAB:        XLIST
+       OPTYPE
+       LIST
+
+DEFINE X(A,B,C,D),<
+       XWD     C,D
+       >
+
+TYPLSH:        XLIST
+       OPTYPE
+       T.POP,,0        ;SO THAT UNDEF OPCODES DON'T BUMP PC
+       LIST
+
+DEFINE W(A,B),<
+       [ASCIZ \B\]>
+
+ERRTAB:        XLIST
+       EFLAGS
+
+       LIT
+       LIST
+\f      RELOC   0
+
+PRETAB:        SIXBIT  /A/
+       EXP     7
+       SIXBIT  /B/
+       EXP     0
+       SIXBIT  /C/
+       EXP     1
+       SIXBIT  /D/
+       EXP     2
+       SIXBIT  /E/
+       EXP     3
+       SIXBIT  /H/
+       EXP     4
+       SIXBIT  /L/
+       EXP     5
+       SIXBIT  /M/
+       EXP     6
+       SIXBIT  /SP/
+       EXP     6
+       SIXBIT  /PSW/
+       EXP     6
+PRELEN==.-PRETAB
+
+SYMTAB::BLOCK  5*SYMSIZ
+SYMEND==.
+\fLINBLK:       BLOCK ^D40      ;HOLDS MAX OF 200 CHARACTER LINE
+LINEND==.-1
+STRING:        BLOCK 200       ;ROOM FOR 384 BYTES - 2 FULL PAGES OF GENERATED OUTPUT
+MACDUM:        BLOCK ^D40      ;HOLDS 20 DUMMY MACRO ARGS
+MACDML==.-MACDUM
+MACDND==.-1
+MACARG:        BLOCK ^D100     ;500 CHARACTERS OF MACRO ARGS
+MACAND==.-1
+ARGPTR:        0               ;POINTER TO MACARG
+ARGSTK:        BLOCK   20      ;POINTER TO ARGS OF NESTED MACROS
+ARGPDL:        0               ;POINTER TO ARGSTK
+REPCNT:        0               ;COUNT OF CURRENT REPT
+REPADR:        0               ;ADDRESS OF REPT STRING
+EOMFLG:        0               ;FLAG TO TELL THE DIFF BETWEED MACRO AND REPT
+PC:    0
+BYTCNT:        0
+XTRAPC:        0
+ORGXR: 0               ;INDEX INTO ORGBLK
+ORGBLK:        BLOCK 100       ;BYTE COUNT OF BLOCK
+                       ;START ADDRESS OF BLOCK
+MACSTK:        BLOCK 20        ;INVECT GETS PUSHED ON THIS WHEN A MACRO IS CALLED
+MACPDL:        0               ;POINTER TO MACSTK
+MACLEV:        0               ;LEVEL OF NESTING IN MACRO
+LOCSYM:        0               ;VALUE OF LOCAL SYMBOL
+OPSTK: BLOCK 20        ;PDL FOR POLISH STACK   (ENOUGH?)
+INVECT:        0               ;POINTS TO THE MACRO FROM WHICH INCH WILL GET ITS SOURCE
+BAKBUF:        BLOCK ^D100     ;HOLDS NEXT 100 WORDS IN BUFFER WHILE DOING SNEAK
+BAKPTR:        0               ;POINTER TO BAKBUF
+SNEAKI:        0               ;CONTENTS OF REG I WHEN DONE SNEAKING TOKEN
+SAVREG:        BLOCK 5         ;MISC. STORAGE WHEN STACK IS BUSY
+IFLEVL:        0               ;LEVEL OF CURRENT NESTED IF
+EXPLVL:        0               ;LEVEL OF CURRENT PAREN IN EXPRESSION
+OFFLVL:        0               ;IFLEVL THAT ASSEMBLY WAS TURNED OFF
+CHECK: 0               ;CHECKSUM
+STARTA:        0               ;START ADDRESS
+TITL:  BLOCK   20      ;TITLE BUFFER
+SUBTTL:        BLOCK   40
+SUBTLN==<.-SUBTTL>*5
+IFN FTREL,<
+RELPTR:        0
+RELTAB:        BLOCK ^D50      ;50 RELOC ADDRESSES (DUMPED WHEN GT 15)
+RELEND==.-1
+>
+LINENO:        0
+LINCTR:        0
+DELIM: 0               ;USED TO TELL " FROM ' IN DC & SETMAC CODE
+PAGENO:        0
+SUBPAG:        0
+SYMCNT:        0               ;NUMBER OF CHARACTERS PER LINE IN SYMBOL FILE
+SYMTYP:        0               ;'TYPE' OF LAST SYMBOL IN SYMBOL FILE
+PAGESZ:        0               ;SIZE OF PAGE - SET BY 'PAGE'
+DATE:  0
+       0
+       0
+ENDHGH::0
+
+       END
+\0\0\0\0
\ No newline at end of file
diff --git a/mload.asm b/mload.asm
new file mode 100644 (file)
index 0000000..668796a
--- /dev/null
+++ b/mload.asm
@@ -0,0 +1,1493 @@
+       title   'MLOAD MULTI-FILE HEX LOAD UTILITY'
+;
+;              *********************************
+;              *          MLOAD.ASM            *
+;              *   Multi-file Hex Load Utility *
+;              *          for CP/M             *
+;              *********************************
+;
+;
+;      Replacement for the cp/m "LOAD" program: this program
+;      fixes many of the problems associated with the "CP/M"
+;      load program, and adds many new features.
+;
+; ----------------
+;
+;      Rev 2.5
+;      03/10/88
+;      Property of NightOwl Software, Inc. Fort Atkinson, WI 53538
+;      Written by Ron Fowler, Nightowl Software, Inc.
+;
+; ----------------
+; Notice: this program is NOT public domain; copyright is retained by
+; NightOwl Software, Inc. of Fort Atkinson, WI ... All Rights Reserved.
+;
+; License is granted for free use and re-distribution this program, as
+; long as such use and re-distribution is done without profit.
+;
+; ----------------
+;
+; modification history:
+;
+; 2.5  (WOD)   This version corrects a bug that overlayed the first six
+;              bytes of the CCP.  The error did not show up unless a
+;              jump to the CCP was done without a warm boot since MLOAD
+;              used.  This source file has been modified here with
+;              concurrence of the author of MLOAD, Ron Fowler.
+;
+; 2.4  (RGF)   We apologize for this relatively insubstantial update,
+;              but someone has caused what we consider to be a problem,
+;              by making changes to the program, and re-releasing under
+;              the same version number.  The changes in this case were
+;              conversion of the opcode fields (but not the comments,
+;              can you believe that??) of every line to upper case! That
+;              totally invalidated the CRC of the source file, since there
+;              are now two different MLOAD 2.3's running around.
+;
+;              We DO NOT want these stupid mixed upper/lower case changes.
+;              Someone somewhere has decided that this is the way assembly
+;              language source should be, and we most VEHEMENTLY disagree.
+;              It's a pain in the neck to make changes to and we don't
+;              care to run our programs through conversion programs every
+;              time we make changes.
+;
+;              So ... leave the case of this file AS IS.  Any changes made
+;              to this program and not co-ordinated through us may very
+;              well endanger availability of source code when we make
+;              future updates.  'nuff said             --NightOwl Software
+;
+; 2.3  (RGF)   Trivial cosmetic changes
+; 2.2  (RGF)   Modified copyright notice to show new owner of the
+;              program.
+; 2.1  (RGF)   Fixed problem on disk-full when writing output file
+;              (mload previously didn't error out on a full disk)
+; 2.0  (RGF)   Added the ability to pre-load a non-hex file, allowing
+;              mload to be used to load hex file patches (obviating any
+;              need to use DDT).  The normal mload syntax is preserved.
+;              the first (and only the first) filespec (after the "=",
+;              if used) may be non-hex; the filetype must be specified.
+;              Examples:
+;
+;                      1)      mload ws.com,wspatch
+;                      2)      mload MEXTEST=MEX112.COM,MXO-US13
+;                      3)      mload ws.ovr,ovrpatch
+;
+;              The first example loads WS.COM, overlays it with
+;              wspatch.hex, and writes the output to WS.COM.  The
+;              second example loads MEX112.COM, overlays it with
+;              MXO-US13.HEX, and writes the output file to MEXTEST.COM.
+;              (note that the second example is the recommended technique,
+;              since it preserves the original file). The third example
+;              loads WS.OVR and patches it with the file "OVRPATCH.HEX".
+;
+;              Also added this rev: ZCPR2-style du specs are now fully
+;              supported, for both input and output files.  Thus, the
+;              following command lines are permissable:
+;
+;                      b3>mload a4:myfile.com=0:bigfil,b6:patch1,c9:patch2
+;                      a6>mload b5:=c3:mdm717.com,mdmpatch
+;
+;              After loading, an additional information line is now printed
+;              in the statistics report, which displays the true size of the
+;              saved image (the previous report was technically correct, but
+;              could result in confusion for certain kinds of files with
+;              imbedded "DS" and "ORG" statements in the original source code).
+;
+; 1.0 - 1.4    (RGF) change log removed to conserve space
+;
+;      originally written by ron fowler, fort atkinson, wisconsin
+;
+;
+;
+; For assembly with asm.com or mac (delete above title line if
+; assembling with asm.com).
+;
+; This program is a replacement for the cp/m "LOAD" program.
+; Why replace "LOAD"?  well... LOAD.COM has a few deficiencies.
+; For example, if your hex file's origin is above 100h, LOAD.COM
+; prepends blank space to the output file to insure it will work
+; as a CP/M transient. It cares not if the file is not intended
+; as a CP/M transient. it also doesn't like hex records with mixed
+; load addresses  (for example, one that loads below a previous record --
+; which is a perfectly legitimate happenstance).  Also, LOAD.COM
+; can load only one program at a time, and has no provision for
+; a load bias in the command specification. Finally, there is no
+; provision for user specification of the output file name.
+;
+;
+; Hence, this program....
+;
+;------------------------------------------------------------
+;
+; Syntax is as follows:
+;
+;      mload [<outnam=] <filename>[,<filename>...] [bias]
+;
+; where <outnam> is the (optional!;) output file name (only the drive
+; spec and primary filename may be specified; the output filetype is
+; derived exclusively from the 3-byte string at 103h within MLOAD),
+; <filename> specifies files to load and <bias> is the offset within
+; the saved image to apply when loading the file.
+;
+; MLOAD with no arguments prints a small help message -- this message
+; is also printed whenever a command line syntax error occurs.
+;
+; Filenames may contain drive/user specs, and must not contain wildcards.
+; Input filenames must be separated by commas, and a space is required
+; between the last filename and the optional bias.
+;
+; A load information summary is printed at the successful conclusion
+; of the load. Any errors in loading will generally include the name
+; of the file in question.
+;
+; If no output filename is specified, it will be derived from the first
+; input filename, with filetype of 'COM', if not otherwise specified
+; (this default filetype may be patched directly into mload via DDT
+; (or with MLOAD itself, using a patch file) -- its location is at 103H
+; in MLOAD.COM). Note that a command line of the form "C:=<FILENAME>"
+; will place the output file on the "C" drive with the same primary
+; filename as the input file.
+;
+; In its simplest form, MLOAD's syntax is identical to LOAD.COM; thus
+; there should be no problem in learning to use the new program.  The
+; only significant difference here is that, under LOAD.COM, all files
+; are output starting at 100h, even if they originate elsewhere.  MLOAD
+; outputs starting at the hex file origin (actually, the first hex rec-
+; ord specifies the output load address).  The bias option may be used
+; to override this.
+;
+; An example should clarify this.  Suppose you have a file that loads
+; at 1000h.  LOAD.COM would save an output file that begins at 100h and
+; loads past 1000h (to wherever the program ends).  MLOAD will save an
+; output file starting from 1000h only.  If, for some reason you need the
+; file to start at 100h in spite of its 1000h origin (i can think of sev-
+; eral circumstances where this would be necessary), you'd have to specify
+; a bias to mload.  thus, using this example, "MLOAD MYFILE 0F00" would do.
+;
+; Note that this program re-initializes itself each time it is run.
+; Thus, if your system supports a direct branch to the tpa (via a zero-length
+; .COM file, or the ZCPR "GO" command), you may safely re-execute MLOAD.
+;
+; Please report any bugs, bug fixes, or enhancements to
+;
+;              "FORT FONE FILE FOLDER" rcpm/cbbs
+;              Fort Atkinson, Wisconsin
+;              (414) 563-9932 (no ring back)
+;
+;                              --Ron Fowler
+;                                03/08/84   updated 1/31/85
+;
+;------------------------------------------------------------
+;
+; CP/M equates
+;
+warmbt equ     0               ;warm boot
+system equ     5               ;system entry (also top of mem pntr)
+dfcb   equ     5ch             ;default file control block
+ft     equ     9               ;fcb offset to filetype
+tbuf   equ     80h             ;default buffer
+tpa    equ     100h            ;transient program area
+eof    equ     1ah             ;cp/m end-of-file mark
+fcbsiz equ     33              ;size of file control block
+;
+; CP/M system calls
+;
+pcharf equ     2               ;print char
+seldf  equ     14              ;select disk drive
+openf  equ     15              ;open file
+closef equ     16              ;close file
+fsrchf equ     17              ;search for first
+fsrchn equ     18              ;search for next
+erasef equ     19              ;delete file
+readf  equ     20              ;read record
+writef equ     21              ;write record
+creatf equ     22              ;create file
+getdrf equ     25              ;return dflt drive #
+sdmaf  equ     26              ;set dma address
+gsuser equ     32              ;get/set user #
+rrand  equ     33              ;read random
+wrand  equ     34              ;write random
+filszf equ     35              ;compute file size
+srand  equ     36              ;set random
+;
+; ASCII character constants
+;
+cr     equ     13
+lf     equ     10
+bel    equ     7
+tab    equ     9
+;
+; without further ado...
+;
+       org     tpa
+;
+       jmp     begin           ;jump over default output filetype
+;
+; the default output filetype is located at 103h for easy patching
+;
+outtyp:        db      'COM'
+;
+begin: lxi     h,0             ;save system stackpointer
+       dad     sp
+       shld    spsave
+       lxi     sp,stack        ;load local stack
+       call    ilprnt          ;sign on
+       db      'MLOAD ver. 2.5   Copyright (C) 1983, 1984, 1985'
+       db      cr,lf
+       db      'by NightOwl Software, Inc.'
+       db      cr,lf,0
+       call    setup           ;initialize
+main:  call    nxtfil          ;parse and read next input file
+       jc      done            ;no more...
+       call    lodfil          ;yep, load it
+       call    closfl          ;close it (in case MP/M or TurboDOS)
+       jmp     main            ;maybe more
+done:  call    wrtfil          ;write the output file
+;
+; exit to cp/m
+;
+exit:  lxi     d,tbuf          ;restore dma address
+       mvi     c,sdmaf
+       call    bdos
+       lda     system+2        ;get top of memory pointer
+       sui     9               ;allow for ccp+slop
+       lxi     h,hiload+1      ;highest load address
+       sub     m               ;above ccp?
+       jc      warmbt          ;then warm-boot
+       lhld    spsave          ;nope, ccp still in memory
+       sphl                    ;restore its stack
+       ret                     ;return to ccp
+;
+; load program initialization
+;
+setup: lxi     h,varset        ;initialize variables
+       lxi     d,vars
+       mvi     b,varlen        ;by moving in default values
+       call    move
+       lhld    cmdptr          ;get first free mem pointer
+       xchg                    ;in de
+       lxi     h,tbuf          ;point to command tail bufr
+       mov     a,m             ;get its length
+       inx     h
+       ora     a               ;does it have any length?
+       jz      help            ;nope, go give usage help
+       mov     b,a             ;yep, get length to b
+       call    move            ;move cmd tail to buffer
+       xchg                    ;end of dest to hl
+       mvi     m,0             ;stuff a terminator
+       inx     h               ;point to first free memory
+       shld    filbuf          ;set up file buffer
+       xchg                    ;file bufr adrs to de
+       lhld    system+1        ;get top of memory pointer
+       xra     a               ;round system to page boundary
+       sub     e
+       mov     c,a             ;with result in bc
+       mov     a,h
+       sui     9               ;allow for ccp
+       sbb     d
+       mov     b,a
+       xchg                    ;buffer pointer to hl
+nitmem:        mvi     m,0             ;clear buffer
+       inx     h
+       dcx     b
+       mov     a,b
+       ora     c
+       jnz     nitmem
+;
+; look for a bias specification in command line
+;
+       lhld    cmdptr          ;point to command buffer-1
+       dcx     h
+       call    scanbk          ;scan past blanks
+       ora     a               ;no non-blank chars?
+       jz      help            ;then go print help text
+fndspc:        inx     h               ;point to next
+       mov     a,m             ;fetch it
+       ora     a               ;test it
+       rz                      ;line ended, return
+       cpi     ' '             ;nope, test for blank
+       jnz     fndspc          ;not blank, continue
+       call    scanbk          ;skip blanks
+       ora     a               ;end-of-line?
+       rz                      ;return if so
+;
+; hl points to bias in command line
+;
+       lxi     d,0             ;init bias
+       call    hexdig          ;insure a hex digit
+       jc      synerr          ;bad...
+hexlp: mov     a,m             ;no.  get next char
+       inx     h               ;skip over it
+       call    hexdig          ;test for hex digit
+       jnc     digok           ;jump if good hex digit
+       ora     a               ;must end on null terminator
+       jnz     synerr
+       xchg                    ;good end, get bias to hl
+       shld    bias            ;stuff it
+       ret                     ;done
+digok: xchg                    ;bias to hl
+       dad     h               ;skift left 4 to make room
+       dad     h               ;   for new hex digit
+       dad     h
+       dad     h
+       xchg                    ;back to de
+       add     e               ;add in new digit
+       mov     e,a
+       jnc     hexlp           ;jump if no 8-bit ovfl
+       inr     d               ;carry
+       jmp     hexlp
+;
+; parse next input name, and open resultant file
+;
+nxtfil:        lhld    cmdptr          ;get command line pointer
+next2: lxi     d,dfcb          ;destination fcb
+       call    fparse          ;parse a filename
+       cpi     '='             ;stopped on output specifier?
+       jnz     noteq
+       lda     outnam+2        ;insure no name yet specified
+       cpi     ' '
+       jnz     synerr          ;syntax error if already named
+       lda     outflg          ;already been here?
+       ora     a
+       jnz     synerr          ;can't be here twice
+       inr     a               ;flag that we've been here
+       sta     outflg
+       inr     b               ;insure no ambiguous output name
+       dcr     b
+       jnz     afnerr
+       inx     h               ;skip over '='
+       push    h               ;save cmd line pointer
+       lxi     h,dfcb-1        ;move the name to output name hold
+       lxi     d,outnam
+       mvi     b,13            ;drive spec too
+       call    move
+       pop     h               ;restore command line pointer
+       jmp     next2           ;go parse another
+noteq: cpi     ','             ;stopped on comma?
+       jz      gcomma          ;jump if so
+       mvi     m,0             ;nope, insure end of input
+       jmp     nxt2            ;don't advance over fake end
+gcomma:        inx     h               ;skip over comma
+nxt2:  shld    cmdptr          ;save new command line pntr
+       mov     a,b             ;get ambig char count
+       ora     a               ;test it
+       jnz     afnerr          ;allow no ambig characters
+       sta     bufptr          ;force a disk read
+       lxi     d,dfcb+1        ;look at parsed filename
+       ldax    d
+       cpi     ' '             ;blank? (input ended?)
+       stc                     ;get carry ready in case so
+       rz                      ;return cy if input gone
+       dcx     d               ;nope, point de to start of fcb
+open2: push    d               ;try to open the file
+       mvi     c,openf
+       call    bdos
+       pop     d
+       inr     a               ;return=0ffh?
+       jnz     openok          ;jump if not
+;
+; file not found: if filetype blank, set to 'hex' and try again
+;
+       lxi     h,dfcb+ft       ;point to file type
+       mov     a,m             ;anything there?
+       cpi     ' '
+       jnz     fnferr          ;yes, so file not found
+       mvi     m,'H'           ;nope, fill in 'hex'
+       inx     h
+       mvi     m,'E'
+       inx     h
+       mvi     m,'X'
+       jmp     open2           ;go try again
+;
+; here after a good file open
+;
+openok:        call    hexchk          ;is this a hex file?
+       rz                      ;if so, all done
+       lxi     h,comflg        ;no, get pointer to flag
+       mov     a,m             ;loading first file?
+       ora     a
+       rnz                     ;if not, ignore type, consider hex
+       inr     m               ;else, set the flag
+       ret
+;
+; load current file
+;
+lodfil:        lxi     h,comflg        ;loading a com file?
+       mov     a,m             ;get flag
+       ani     1
+       jnz     lodcom          ;jump if so
+       lhld    bias            ;else get bias on top of stack
+       push    h
+;
+; load a hex record
+;
+loadlp:        call    gnb             ;get next file byte
+       sbi     ':'             ;look for start-record mark
+       jnz     loadlp          ;scan until found
+       sta     cksum           ;got it, init checksum to zero
+       mov     d,a             ;upper byte of rec cnt=0
+       pop     b               ;retrieve bias adrs
+       push    b               ;save it again
+       call    ghbcks          ;get hex byte w/checksum
+       mov     e,a             ;de now has record length
+       ora     a               ;test it
+       jnz     notend          ;jump if len<>0 (not eof rec)
+       pop     h               ;all done
+       ret
+notend:        call    ghbcks          ;hi byte of rec ld adrs
+       mov     h,a             ;accumulate in hl
+       call    ghbcks          ;get lo byte
+       mov     l,a             ;put lo in l
+       lda     lodflg          ;test load flag
+       ora     a
+       cz      lodnit          ;not first record, initialize
+       push    h               ;save load address
+       dad     d               ;add in record length
+       dcx     h               ;make highest, not next
+       lda     hipc            ;a new high?
+       sub     l
+       lda     hipc+1
+       sbb     h
+       jnc     notgt           ;jump if not
+       shld    hipc            ;yep, update hipc
+       push    d               ;save reclen
+       xchg                    ;load adrs to de
+       lhld    offset          ;get offset to form true memory adrs
+       dad     d               ;add in offset
+       dad     b               ;and bias
+       shld    hiload          ;mark highest true memory load adrs
+       lda     system+2        ;validate against top-mem pointer
+       cmp     h
+       jc      memful          ;jump if out of memory
+       pop     d               ;restore reclen
+notgt: pop     h               ;restore load address
+       dad     b               ;add bias to load adrs
+       push    d               ;save record length
+       push    h
+       lhld    bytcnt          ;add record length to byte count
+       dad     d
+       shld    bytcnt
+       pop     h
+       xchg
+       lhld    offset          ;calculate true memory adrs
+       dad     d               ;hl=true loading adrs
+       pop     d               ;restore record length
+       call    ghbcks          ;skip unused byte of intel format
+;
+; move the record into memory
+;
+reclp: call    ghbcks          ;get hex byte
+       mov     m,a             ;store it in buffer
+       inx     h               ;point to next
+       dcr     e               ;count down
+       jnz     reclp           ;until record all read
+       call    ghbcks          ;get checksum byte
+       jnz     cserr           ;final add cksum should sum 0
+       jmp     loadlp          ;good load, go do nxt record
+;
+; get next hex byte from input, and
+; accumulate a checksum
+;
+ghbcks:        push    b               ;save em all
+       push    h
+       push    d
+       call    hexin           ;get hex byte
+       mov     b,a             ;save in b
+       lxi     h,cksum         ;add to checksum
+       mov     a,m
+       add     b
+       mov     m,a
+       mov     a,b             ;get byte back
+       pop     d               ;restore checksum
+       pop     h               ;restore other regs
+       pop     b
+       ret
+;
+; routine to get next byte from input...forms
+; byte from two ascii hex characters
+;
+hexin: call    gnb             ;get next input file byte
+       call    hexval          ;convert to binary w/validation
+       rlc                     ;move into ms nybble
+       rlc
+       rlc
+       rlc
+       ani     0f0h            ;kill possible garbage
+       push    psw             ;save it
+       call    gnb             ;get next byte
+       call    hexval          ;convert it, w/validation
+       pop     b               ;get back first
+       ora     b               ;or in second
+       ret                     ;good byte in a
+;
+; gnb - utility subroutine to get next
+;      byte from disk file
+gnb:   push    h               ;save all regs
+       push    d
+       push    b
+       lda     bufptr          ;get input bufr pointer
+       ani     7fh             ;wound back to 0?
+       jz      diskrd          ;go read sector if so
+gnb1:  mvi     d,0             ;else form 16 bit offset
+       mov     e,a
+       lxi     h,tbuf          ;from tbuf
+       dad     d               ;add in offset
+       mov     a,m             ;get next byte
+       cpi     eof             ;end of file?
+       jz      eoferr          ;error if so
+       lxi     h,bufptr        ;else bump buf ptr
+       inr     m
+       ora     a               ;return carry clear
+       pop     b               ;restore and return
+       pop     d
+       pop     h
+       ret
+;
+; read next sector from disk
+;
+diskrd:        mvi     c,readf         ;bdos "READ SEC" function
+       lxi     d,dfcb
+       call    bdos            ;read sector
+       ora     a
+       jnz     eoferr          ;error if phys end of file
+       sta     bufptr          ;store 0 as new buf ptr
+       jmp     gnb1            ;go re-join gnb code
+;
+; load a com file
+;
+lodcom:        inr     m               ;bump the comfile flag
+       lxi     h,tpa           ;set origin
+       call    lodnit          ;and initialize
+       xchg                    ;load address in de
+       lhld    bias            ;add in bias
+       dad     d
+       xchg
+       lhld    offset          ;and offset
+       dad     d
+       xchg                    ;de has absolute mem adrs of load
+;
+comlp: lxi     h,128           ;calculate next dma
+       dad     d
+       lda     system+2        ;check for space
+       cmp     h
+       jc      memful          ;jump if none
+       push    h               ;else save next dma
+       push    d               ;and this dma
+       mvi     c,sdmaf         ;set this dma
+       call    bdos
+       lxi     d,dfcb          ;read next record
+       mvi     c,readf
+       call    bdos
+       pop     h               ;recall this dma
+       pop     d               ;de=next dma
+       ora     a               ;end of read?
+       jnz     lodend          ;jump if so
+       lhld    comsiz          ;no, advance com byte count
+       lxi     b,128
+       dad     b
+       shld    comsiz
+       jmp     comlp           ;continue
+;
+lodend:        dcx     h               ;one less byte is highest
+       shld    hiload          ;set a new high
+       lhld    comsiz          ;hi pc=bytecount+100h
+       lxi     d,tpa
+       dad     d
+       xchg                    ;to de
+       lhld    bias            ;add in bias
+       dad     d
+       shld    hipc
+       lxi     d,tbuf          ;reset dma for hex files
+       mvi     c,sdmaf
+       call    bdos
+       ret
+;
+; write output file
+;
+wrtfil:        lxi     d,dfcb          ;point to fcb
+       push    d               ;save 2 copies of pointer
+       push    d
+       call    nitfcb          ;initialize output fcb
+       lxi     h,outnam        ;move output name in
+       dcx     d               ;point to user # (prior to fcb)
+       mvi     b,10            ;move user, drive, primary name
+       call    move
+       mov     a,m             ;output type blank?
+       cpi     ' '
+       jnz     wrtnb           ;jump if not
+       lxi     h,outtyp        ;yes, move dflt output filetype in
+wrtnb: mvi     b,3
+       call    move
+       pop     d               ;restore fcb pointer
+       mvi     c,erasef        ;erase any existing file
+       call    bdos
+       pop     d               ;restore fcb pointer
+       mvi     c,creatf        ;create a new file
+       call    bdos
+       inr     a               ;good create?
+       jz      dirful          ;goto directory full error if not
+       lhld    hiload          ;yep, get top of bufr pntr
+       xchg                    ;in de
+       lhld    filbuf          ;get start of bufr adrs
+       mov     a,e             ;calculate output file size
+       sub     l
+       mov     c,a             ;with result in bc
+       mov     a,d
+       sbb     h
+       mov     b,a
+       mov     a,b             ;test length
+       ora     c
+       jz      loderr          ;nothing to write???
+       lxi     d,dfcb          ;get fcb pointer
+wrlp:  push    b               ;save count
+       push    d               ;and fcb pointer
+       xchg                    ;get memory pointer to de
+       lxi     h,128           ;add in sector length for next pass
+       dad     d
+       xthl                    ;save next dma
+       push    h               ;above fcb
+       mvi     c,sdmaf         ;set transfer address
+       call    bdos
+       pop     d               ;fetch fcb pointer
+       push    d               ;save it again
+       mvi     c,writef        ;write a sector
+       call    bdos
+       ora     a               ;test result
+       jnz     dskful          ;disk full error...
+       lhld    reccnt          ;no,increment count of records
+       inx     h
+       shld    reccnt
+       pop     d               ;restore fcb pointer
+       pop     h               ;and memory write pointer
+       pop     b               ;and count
+       mov     a,c             ;subtract 128 (sec size) from count
+       sui     128
+       mov     c,a
+       jnc     wrlp            ;jump if some left
+       mov     a,b             ;hi-order borrow
+       sui     1               ;do it (can't "DCR B", doesn't affect cy)
+       mov     b,a             ;restore
+       jnc     wrlp            ;jump if more left
+       call    closfl          ;close output file
+;
+; report statistics to console
+;
+       call    ilprnt
+       db      'Loaded ',0
+       lhld    bytcnt          ;print # bytes
+       call    decout
+       call    ilprnt
+       db      ' bytes (',0
+       call    hexout
+       call    ilprnt
+       db      'H)',0
+       call    ilprnt
+       db      ' to file %',0
+       lda     comflg          ;did we load a comfile too?
+       ora     a
+       jz      notcom          ;jump if not
+       call    ilprnt
+       db      cr,lf,'Over a ',0
+       lhld    comsiz
+       call    decout
+       call    ilprnt
+       db      ' byte binary file',0
+notcom:        call    ilprnt
+       db      cr,lf,'Start address: ',0
+       lhld    lodadr          ;print loading address
+       call    hexout
+       call    ilprnt
+       db      'H  Ending address: ',0
+       lhld    hipc            ;print ending load address
+       call    hexout
+       call    ilprnt
+       db      'H  Bias: ',0
+       lhld    bias
+       call    hexout
+       call    ilprnt
+       db      'H',cr,lf,0
+       call    ilprnt
+       db      'Saved image size: ',0
+       lhld    reccnt          ;get count of image records
+       push    h               ;save it
+       mvi     b,7             ;convert to bytes
+xlp:   dad     h
+       dcr     b
+       jnz     xlp
+       call    decout          ;print it
+       call    ilprnt
+       db      ' bytes (',0
+       call    hexout          ;now in hex
+       call    ilprnt
+       db      'H, - ',0
+       pop     h               ;recall record count
+       call    decout          ;print it
+       call    ilprnt
+       db      ' records)',cr,lf,0
+       lhld    lodadr          ;fetch loading address
+       mov     a,l             ;test if =tpa
+       ora     a
+       jnz     nottpa          ;tpa always on page boundary
+       mov     a,h             ;lo ok, test hi
+       cpi     (tpa shr 8) and 0ffh
+       rz                      ;return if tpa
+nottpa:        call    ilprnt          ;not, so print warning msg
+       db      cr,lf,bel
+       db      '++ Warning: program origin NOT at 100H ++'
+       db      cr,lf,0
+       ret                     ;done
+;
+;      ***********************
+;      * utility subroutines *
+;      ***********************
+;
+;
+; routine to close any open file
+;
+closfl:        lxi     d,dfcb
+       mvi     c,closef
+       call    bdos
+       inr     a               ;test close result
+       jz      clserr          ;jump if error
+       ret
+;
+; print message in-line with code
+;
+ilprnt:        xthl                    ;message pntr to hl
+       call    prathl          ;print it
+       xthl                    ;restore and return
+       ret
+;
+; print msg pointed to by hl until null.  expand
+; '%' char to current filename.
+;
+prathl:        mov     a,m             ;fetch char
+       inx     h               ;point to next
+       ora     a               ;terminator?
+       rz                      ;then done
+       cpi     '%'             ;want filename?
+       jz      prtfn           ;go do it if so
+       call    type            ;nope, just print char
+       jmp     prathl          ;continue
+;
+prtfn: push    h               ;save pointer
+       push    b
+       lda     dfcb            ;fetch dr field of dfcb
+       ora     a               ;default drive?
+       jnz     prndf           ;jump if not
+       call    getdsk          ;get logged-in drive #
+       inr     a               ;make it one-relative (as in fcb)
+prndf: adi     'A'-1           ;make drive name printable
+       call    type            ;print it
+       lda     dfcb-1          ;get user #
+       cpi     0ffh            ;null?
+       cz      getusr          ;iff so, get current user
+       mov     l,a             ;to hl
+       mvi     h,0
+       call    decout          ;print it
+       mvi     a,':'           ;drive names followed by colon
+       call    type
+       lxi     h,dfcb+1        ;setup for name
+       mvi     b,8             ;print up to 8
+       call    prtnam
+       mvi     a,'.'           ;print dot
+       call    type
+       mvi     b,3             ;print filetype field
+       call    prtnam
+       pop     b
+       pop     h               ;restore and continue
+       jmp     prathl
+;
+; print file name .HL max length in b. don't print spaces
+;
+prtnam:        mov     a,m             ;fetch a char
+       cpi     ' '             ;blank?
+       jz      pwind           ;go wind if so
+       inx     h               ;nope, move to next
+       call    type            ;print it
+       dcr     b               ;count down
+       jnz     prtnam          ;continue
+       ret
+pwind: inx     h               ;skip remainder of blank name
+       dcr     b
+       jnz     pwind
+       ret
+;
+; print HL in decimal on console
+;
+decout:        push    h               ;save everybody
+       push    d
+       push    b
+       lxi     b,-10           ;conversion radix
+       lxi     d,-1
+declp: dad     b
+       inx     d
+       jc      declp
+       lxi     b,10
+       dad     b
+       xchg
+       mov     a,h
+       ora     l
+       cnz     decout          ;this is recursive
+       mov     a,e
+       adi     '0'
+       call    type
+       pop     b
+       pop     d
+       pop     h
+       ret
+;
+; newline on console
+;
+crlf:  mvi     a,cr
+       call    type
+       mvi     a,lf
+       jmp     type
+;
+; print hl on console in hex
+;
+hexout:        mov     a,h             ;get hi
+       call    hexbyt          ;print it
+       mov     a,l             ;get lo, fall into hexbyt
+;
+; type accumulator on console in hex
+;
+hexbyt:        push    psw             ;save byte
+       rar                     ;get ms nybble..
+       rar                     ;..into lo 4 bits
+       rar
+       rar
+       call    nybble
+       pop     psw             ;get back byte
+nybble:        ani     0fh             ;mask ms nybble
+       adi     90h             ;add offset
+       daa                     ;decimal adjust a-reg
+       aci     40h             ;add offset
+       daa                     ;fall into type
+;
+; type char in a on console
+;
+type:  push    h               ;save all
+       push    d
+       push    b
+       mov     e,a             ;cp/m outputs from e
+       mvi     c,pcharf
+       call    bdos
+       pop     b
+       pop     d
+       pop     h
+       ret
+;
+; move: from @hl to @de, count in b
+;
+move:  inr     b               ;up one
+movlp: dcr     b               ;count down
+       rz                      ;return if done
+       mov     a,m             ;not done, continue
+       stax    d
+       inx     h               ;pointers=pointers+1
+       inx     d
+       jmp     movlp
+;
+; scan to first non-blank char in string @hl
+;
+scanbk:        inx     h               ;next
+       mov     a,m             ;fetch it
+       cpi     ' '
+       jz      scanbk
+       ret
+;
+; get hex digit and validate
+;
+hexval:        call    hexdig          ;get hex digit
+       jc      formerr         ;jump if bad
+       ret
+;
+; get hex digit, return cy=1 if bad digit
+;
+hexdig:        cpi     '0'             ;lo boundary test
+       rc                      ;bad already?
+       cpi     '9'+1           ;no, test hi
+       jc      hexcvt          ;jump if numeric
+       cpi     'A'             ;test alpha
+       rc                      ;bad?
+       cpi     'F'+1           ;no, upper alpha bound
+       cmc                     ;pervert carry
+       rc                      ;bad?
+       sui     7               ;no, adjust to 0-f
+hexcvt:        ani     0fh             ;make it binary
+       ret
+;
+;      ******************
+;      * error handlers *
+;      ******************
+;
+synerr:        call    crlf
+       call    ilprnt
+       db      '      Command line syntax error',cr,lf,cr,lf,0
+       jmp     help            ;give help msg too
+;
+afnerr:        call    errxit          ;exit with message
+       db      'Ambiguous file name: % not allowed.',0
+;
+fnferr:        call    errxit
+       db      'File % not found.',0
+;
+dskful:        call    errxit
+       db      'Disk full.',0
+;
+dirful:        call    errxit
+       db      'Directory full.',0
+;
+eoferr:        call    errxit
+       db      'Premature end-of-file in %',0
+;
+cserr: call    errxit
+       db      'Checksum error in %',0
+;
+clserr:        call    errxit
+       db      'Can''t close %',0
+;
+memful:        call    errxit
+       db      'Memory full while loading %',0
+;
+formerr:call   errxit
+       db      'Format error in file %',0
+;
+loderr:        call    errxit
+       db      'Writing %, nothing loaded',0
+;
+help:  call    errxit          ;print help text
+       db      'MLOAD syntax:',cr,lf,cr,lf
+       db      'MLOAD [<OUTFIL>=] <FILE1>[,<FILE2>...] [<BIAS>]',cr,lf
+       db      tab,'    (brackets denote optional items)',cr,lf,cr,lf
+       db      tab,'<OUTFIL> is the optional output filename',cr,lf
+       db      tab,'<FILEn>  are input file(s)',cr,lf
+       db      tab,'<BIAS>   is a hex load offset within the output file'
+       db      cr,lf,cr,lf
+       db      tab,'<FILE1> may be an optional non-HEX file to be patched',cr,lf
+       db      tab,'by subsequently named HEX files (specifying',cr,lf
+       db      tab,'The filetype enables this function).'
+       db      cr,lf,cr,lf
+       db      'Note that ZCPR2-style drive/user notation may be used in all'
+       db      cr,lf
+       db      'file specifications (e.g., "B3:MYFILE.COM, "A14:MDM7.HEX").'
+       db      cr,lf,0
+;
+; general error handler
+;
+errxit:        call    crlf            ;new line
+       pop     h               ;fetch error msg pointer
+       call    prathl          ;print it
+       call    crlf
+       jmp     exit            ;done
+;
+; initialize load parameters
+;
+lodnit:        mvi     a,1             ;first record, set load flag
+       sta     lodflg
+       shld    lodadr          ;save load address
+       shld    hipc            ;and hi load
+       push    d               ;save record length
+       xchg                    ;de=load address
+       lhld    filbuf          ;get address of file buffer
+       mov     a,l             ;subtract load adrs from file buffer
+       sub     e
+       mov     l,a
+       mov     a,h
+       sbb     d
+       mov     h,a
+       shld    offset          ;save as load offset
+       push    d               ;save load address on stack
+       push    b               ;save bias
+       lxi     d,outnam+2      ;check output filename
+       ldax    d               ;(first char)
+       cpi     ' '
+       jnz     namskp          ;jump if so
+       lxi     h,dfcb+1        ;get first name pointer
+       mvi     b,8             ;(don't include drive spec)
+       call    move
+;
+; check for outflg=1 (presence of an "=").  note that the
+; filename may well be blank, and yet outflg <>0, for example
+; in the case of "A:=<FILENAME>" or "C4:=<FILENAME>". in
+; this case, we want to remember the drive/user specified, but
+; use the first input file to form the output name. otherwise,
+; we use the current drive/user.
+;
+       lda     outflg          ;was there an "="?
+       ora     a
+       jnz     namskp          ;jump if so
+       lxi     h,outnam        ;get destination pointer
+       call    getusr          ;get current user #
+       mov     m,a
+       inx     h               ;point to drive
+       call    getdsk          ;get it
+       inr     a               ;fcb's drive is 1-relative
+       mov     m,a
+namskp:        mvi     a,1             ;insure "=" cannot occur anymore
+       sta     outflg
+       pop     b               ;restore bias
+       pop     h               ;load address to hl
+       pop     d               ;restore record length
+       ret
+;
+;      *********************************
+;      * file name parsing subroutines *
+;      *********************************
+;
+; credit where credit's due:
+; --------------------------
+; these routines were lifted from bob van valzah's
+; "FAST" program.
+;
+;
+;
+;      *********************************
+;      * file name parsing subroutines *
+;      *********************************
+;
+;
+; getfn gets a file name from text pointed to by reg hl into
+; an fcb pointed to by reg de. leading delimeters are
+; ignored. allows drive spec of the form <du:> (drive/user).
+; this routine formats all 33 bytes of the fcb (but not ran rec).
+;
+; entry de     first byte of fcb
+; exit b=# of '?' in name
+; fcb-1= user # parsed (if specified) or 255
+;
+;
+fparse:        call    nitfcb          ;init 1st half of fcb
+       call    gstart          ;scan to first character of name
+       call    getdrv          ;get drive/user spec. if present
+       mov     a,b             ;get user # or 255
+       cpi     0ffh            ;255?
+       jz      fpars1          ;jump if so
+       dcx     d               ;back up to byte preceeding fcb
+       dcx     d
+       stax    d               ;stuff user #
+       inx     d               ;onward
+       inx     d
+fpars1:        call    getps           ;get primary and secondary name
+       ret
+;
+; nitfcb fills the fcb with dflt info - 0 in drive field
+; all-blank in name field, and 0 in ex,s1,s2,rc, disk
+; allocation map, and random record # fields
+;
+nitfcb:        push    h
+       push    d
+       call    getusr          ;init user field
+       pop     d
+       pop     h
+       push    d               ;save fcb loc
+       dcx     d
+       stax    d               ;init user # to currnt user #
+       inx     d
+       xchg                    ;move it to hl
+       mvi     m,0             ;drive=default
+       inx     h               ;bump to name field
+       mvi     b,11            ;zap all of name fld
+nitlp: mvi     m,' '
+       inx     h
+       dcr     b
+       jnz     nitlp
+       mvi     b,33-11         ;zero others, up to nr field
+zlp:   mvi     m,0
+       inx     h
+       dcr     b
+       jnz     zlp
+       xchg                    ;restore hl
+       pop     d               ;restore fcb pointer
+       ret
+;
+; gstart advances the text pointer (reg hl) to the first
+; non delimiter character (i.e. ignores blanks).  returns a
+; flag if end of line (00h or ';') is found while scaning.
+; exit hl      pointing to first non delimiter
+;      a       clobbered
+;      zero    set if end of line was found
+;
+gstart:        call    getch           ;see if pointing to delim?
+       rnz                     ;nope - return
+       ora     a               ;physical end?
+       rz                      ;yes - return w/flag
+       inx     h               ;nope - move over it
+       jmp     gstart          ;and try next char
+;
+; getdrv checks for the presence of a du: spec at the text
+; pointer, and if present formats drive into fcb and returns
+; user # in b.
+;
+; entry hl     text pointer
+;      de      pointer to first byte of fcb
+; exit hl      possibly updated text pointer
+;      de      pointer to second (primary name) byte of fcb
+;      b       user # if specified or 0ffh
+;
+getdrv:        mvi     b,0ffh          ;default no user #
+       push    h               ;save text pointer
+dscan: call    getch           ;get next char
+       inx     h               ;skip pointer over it
+       jnz     dscan           ;scan until delimiter
+       cpi     ':'             ;delimiter a colon?
+       inx     d               ;skip dr field in fcb in case not
+       pop     h               ;and restore text pointer
+       rnz                     ;return if no du: spec
+       mov     a,m             ;got one, get first char
+       call    cvtuc           ;may be drive name, cvt to upper case
+       cpi     'A'             ;alpha?
+       jc      isnum           ;jump to get user # if not
+       sui     'A'-1           ;yes, convert from ascii to #
+       dcx     d               ;back up fcb pointer to dr field
+       stax    d               ;store drive # into fcb
+       inx     d               ;pass pointer over drv
+       inx     h               ;skip drive spec in text
+isnum: mov     a,m             ;fetch next
+       inx     h
+       cpi     ':'             ;du delimiter?
+       rz                      ;done then
+       dcx     h               ;nope, back up text pointer
+       mvi     b,0             ;got a digit, init user value
+uloop: mov     a,b             ;get accumulated user #
+       add     a               ;* 10 for new digit
+       add     a
+       add     b
+       add     a
+       mov     b,a             ;back to b
+       mov     a,m             ;get text char
+       sui     '0'             ;make binary
+       add     b               ;add to user #
+       mov     b,a             ;updated user #
+       inx     h               ;skip over it
+       mov     a,m             ;get next
+       cpi     ':'             ;end of spec?
+       jnz     uloop           ;jump if not
+       inx     h               ;yep, return txt pointer past du:
+       ret
+;
+; getps gets the primary and secondary names into the fcb.
+; entry hl     text pointer
+; exit hl      character following secondary name (if present)
+;
+getps: mvi     c,8             ;max length of primary name
+       mvi     b,0             ;init count of '?'
+       call    getnam          ;pack primary name into fcb
+       mov     a,m             ;see if terminated by a period
+       cpi     '.'
+       rnz                     ;nope - secondary name not given
+                               ;return default (blanks)
+       inx     h               ;yup - move text pointer over period
+ftpoint:mov    a,c             ;yup - update fcb pointer to secondary
+       ora     a
+       jz      getft
+       inx     d
+       dcr     c
+       jmp     ftpoint
+getft: mvi     c,3             ;max length of secondary name
+       call    getnam          ;pack secondary name into fcb
+       ret
+;
+; getnam copies a name from the text pointer into the fcb for
+; a given maximum length or until a delimiter is found, which
+; ever occurs first.  if more than the maximum number of
+; characters is present, character are ignored until a
+; a delimiter is found.
+; entry hl     first character of name to be scanned
+;      de      pointer into fcb name field
+;      c       maximum length
+; exit hl      pointing to terminating delimiter
+;      de      next empty byte in fcb name field
+;      c       max length - number of characters transfered
+;
+getnam:        call    getch           ;are we pointing to a delimiter yet?
+       rz                      ;if so, name is transfered
+       inx     h               ;if not, move over character
+       cpi     '*'             ;ambigious file reference?
+       jz      ambig           ;if so, fill the rest of field with '?'
+       cpi     '?'             ;afn reference?
+       jnz     notqm           ;skip if not
+       inr     b               ;else bump afn count
+notqm: call    cvtuc           ;if not, convert to upper case
+       stax    d               ;and copy into name field
+       inx     d               ;increment name field pointer
+       dcr     c               ;if name field full?
+       jnz     getnam          ;nope - keep filling
+       jmp     getdel          ;yup - ignore until delimiter
+ambig: mvi     a,'?'           ;fill character for wild card match
+fillq: stax    d               ;fill until field is full
+       inx     d
+       inr     b               ;increment count of '?'
+       dcr     c
+       jnz     fillq           ;fall thru to ingore rest of name
+getdel:        call    getch           ;pointing to a delimiter?
+       rz                      ;yup - all done
+       inx     h               ;nope - ignore antoher one
+       jmp     getdel
+;
+; getch gets the character pointed to by the text pointer
+; and sets the zero flag if it is a delimiter.
+; entry hl     text pointer
+; exit hl      preserved
+;      a       character at text pointer
+;      z       set if a delimiter
+;
+getch: mov     a,m             ;get the character, test for delim
+;
+; global entry: test char in a for filename delimiter
+;
+fndelm:        cpi     '/'
+       rz
+       cpi     '.'
+       rz
+       cpi     ','
+       rz
+       cpi     ' '
+       rz
+       cpi     ':'
+       rz
+       cpi     '='
+       rz
+       ora     a               ;set zero flag on end of text
+       ret
+;
+; bdos entry: preserves bc, de.  if system call is a file
+;            function, this routine logs into the drive/
+;            user area specified, then logs back after
+;            the call.
+;
+bdos:  call    filfck          ;check for a file function
+       jnz     bdos1           ;jump if not a file function
+       call    getdu           ;get drive/user
+       shld    savedu
+       ldax    d               ;get fcb's drive
+       sta     fcbdrv          ;save it
+       dcr     a               ;make 0-relative
+       jm      bdos0           ;if not default drive, jump
+       mov     h,a             ;copy to h
+bdos0: xra     a               ;set fcb to default
+       stax    d
+       dcx     d               ;get fcb's user #
+       ldax    d
+       mov     l,a
+       inx     d               ;restore de
+       call    setdu           ;set fcb's user
+;
+; note that unspecified user # (value=0ffh) becomes
+; a getusr call, preventing ambiguity.
+;
+       call    bdos1           ;do user's system call
+       push    psw             ;save result
+       push    h
+       lda     fcbdrv          ;restore fcb's drive
+       stax    d
+       lhld    savedu          ;restore prior drive/user
+       call    setdu
+       pop     h               ;restore bdos result registers
+       pop     psw
+       ret
+;
+; local variables for bdos replacement routine
+;
+savedu:        dw      0               ;saved drive,user
+fcbdrv:        db      0               ;fcb's drive
+dmadr: dw      80h             ;current dma adrs
+;
+bdos1: push    d
+       push    b
+       mov     a,c             ;doing setdma?
+       cpi     sdmaf
+       jnz     bdos1a          ;jump if not
+       xchg                    ;yep, keep a record of dma addresses
+       shld    dmadr
+       xchg
+bdos1a:        call    system
+       pop     b
+       pop     d
+       ret
+;
+; get drive, user: h=drv, l=user
+;
+getdu: push    b               ;don't modify bc
+       push    d
+       mvi     c,gsuser        ;get user #
+       mvi     e,0ffh
+       call    bdos1
+       push    psw             ;save it
+       mvi     c,getdrf        ;get drive
+       call    bdos1
+       mov     h,a             ;drive returned in h
+       pop     psw
+       mov     l,a             ;user in l
+       pop     d
+       pop     b               ;restore caller's bc
+       ret
+;
+; set drive, user: h=drv, l=user
+;
+setdu: push    b               ;don't modify bc
+       push    d
+       push    h               ;save info
+       mov     e,h             ;drive to e
+       mvi     c,seldf         ;set it
+       call    bdos1
+       pop     h               ;recall info
+       push    h
+       mov     e,l             ;user # to e
+       mvi     c,gsuser
+       call    bdos1           ;set it
+       pop     h
+       pop     d
+       pop     b
+       ret
+;
+; check for file-function: open, close, read random, write
+;      random, read sequential, write sequential.
+;
+filfck:        mov     a,c             ;get function #
+       cpi     openf
+       rz
+       rc                      ;ignore lower function #'s
+       cpi     closef          ;(they're not file-related)
+       rz
+       cpi     readf
+       rz
+       cpi     writef
+       rz
+       cpi     rrand
+       rz
+       cpi     wrand
+       rz
+       cpi     fsrchf
+       rz
+       cpi     fsrchn
+       rz
+       cpi     erasef
+       rz
+       cpi     creatf
+       rz
+       cpi     filszf
+       rz
+       cpi     srand
+       ret
+;
+; convert char to upper case
+;
+cvtuc: cpi     'a'             ;check lo bound
+       rc
+       cpi     'z'+1           ;check hi
+       rnc
+       sui     20h             ;convert
+       ret
+;
+; check for hex filetype in fcb name
+;
+hexchk:        push    h
+       push    d
+       push    b
+       mvi     b,3             ;type is 3 chars
+       lxi     d,dfcb+9        ;point de to type field
+       lxi     h,hextyp        ;point hl to "COM"
+hexlop:        ldax    d
+       ani     7fh             ;ignore attributes
+       cmp     m
+       inx     h
+       inx     d
+       jnz     hexit           ;jump if not com
+       dcr     b
+       jnz     hexlop
+hexit: pop     b               ;z reg has result
+       pop     d
+       pop     h
+       ret
+;
+hextyp:        db      'HEX'
+;
+; routine to return user # without disturbing registers
+;
+getusr:        push    h
+       push    d
+       push    b
+       mvi     c,gsuser
+       mvi     e,0ffh
+       call    bdos
+       pop     b
+       pop     d
+       pop     h
+       ret
+;
+; routine to return drive # without disturbing registers
+;
+getdsk:        push    h
+       push    d
+       push    b
+       mvi     c,getdrf
+       call    bdos
+       pop     b
+       pop     d
+       pop     h
+       ret
+;
+; these are the initial values of the variables, and
+; are moved into the variables area by the setup routine.
+; if you add variables, be sure to add their intial value
+; into this table in the order corresponding to their
+; occurance in the variables section.
+;
+varset:        dw      0                       ;bias
+       dw      0                       ;hiload
+       dw      0                       ;hipc
+       db      0                       ;cksum
+       dw      cmdbuf                  ;cmdptr
+       db      0                       ;bufptr
+       db      0                       ;lodflg
+       dw      cmdbuf                  ;filbuf
+       dw      0                       ;offset
+       dw      0                       ;lodadr
+       db      0,0,'           '       ;outnam
+       dw      0                       ;reccnt
+       dw      0                       ;bytcnt
+       db      0                       ;comflg
+       dw      0                       ;comsiz
+       db      0                       ;outflg
+;
+varlen equ     $-varset        ;define length of init table
+;
+; working variables
+;
+vars   equ     $               ;define variables area start
+;
+bias:  ds      2               ;load offset
+hiload:        ds      2               ;highest true load address
+hipc:  ds      2               ;highest pc
+cksum: ds      1               ;record checksum
+cmdptr:        ds      2               ;command line pointer
+bufptr:        ds      1               ;input buffer pointer
+lodflg:        ds      1               ;something-loaded flag
+filbuf:        ds      2               ;file buffer location
+offset:        ds      2               ;load offset into buffer
+lodadr:        ds      2               ;load address
+outnam:        ds      13              ;output drive+name
+reccnt:        ds      2               ;output file record count
+bytcnt:        ds      2               ;output file bytes loaded  count
+comflg:        ds      1               ;flags com file encountered
+comsiz:        ds      2               ;size of a loaded com file
+outflg:        ds      1               ;flags an "=" present in cmd line
+;
+; end of working variables
+;
+;
+;
+; stack stuff
+;
+spsave:        ds      2               ;system stack pntr save
+;
+;
+       ds      100             ;50-level stack
+;
+stack  equ     $
+cmdbuf equ     $               ;command buffer location
+;
+;
+       end
diff --git a/mload.hex b/mload.hex
new file mode 100644 (file)
index 0000000..49ef993
--- /dev/null
+++ b/mload.hex
@@ -0,0 +1,173 @@
+:10010000C30601434F4D2100003922E30B31490C56
+:10011000CD87054D4C4F4144207665722E20322EFE
+:1001200035202020436F70797269676874202843F6
+:100130002920313938332C20313938342C203139C9
+:1001400038350D0A6279204E696768744F776C20E4
+:10015000536F6674776172652C20496E632E0D0AA9
+:1001600000CD8F01CD0A02DA7301CD8B02CD7A0565
+:10017000C36401CDBF031180000E1ACDBD0A3A073A
+:1001800000D60921C00B96DA00002AE30BF9C92139
+:10019000970B11BD0B0626CD3C062AC40BEB218024
+:1001A000007E23B7CA8F0747CD3C06EB36002322DB
+:1001B000C80BEB2A0600AF934F7CD6099A47EB3663
+:1001C00000230B78B1C2BF012AC40B2BCD4606B762
+:1001D000CA8F07237EB7C8FE20C2D301CD4606B71B
+:1001E000C8110000CD5506DA69067E23CD5506D22A
+:1001F000FB01B7C26906EB22BD0BC9EB29292929EE
+:10020000EB835FD2EA0114C3EA012AC40B115C003C
+:10021000CDDF09FE3DC241023AD00BFE20C2690685
+:100220003AE20BB7C269063C32E20B0405C29606FD
+:1002300023E5215B0011CE0B060DCD3C06E1C30D7D
+:1002400002FE2CCA4B023600C34C022322C40B7898
+:10025000B7C2960632C60B115D001AFE2037C81BC6
+:10026000D50E0FCDBD0AD13CC27F022165007EFEB6
+:1002700020C2BD063648233645233658C36002CD1A
+:100280005E0BC821DF0B7EB7C034C921DF0B7EE6D1
+:1002900001C264032ABD0BE5CD3103DE3AC29802E8
+:1002A00032C30B57C1C5CD09035FB7C2B002E1C964
+:1002B000CD090367CD09036F3AC70BB7CC9609E5A3
+:1002C000192B3AC10B953AC20B9CD2E20222C10B08
+:1002D000D5EB2ACA0B190922BF0B3A0700BCDA3941
+:1002E00007D1E109D5E52ADD0B1922DD0BE1EB2A67
+:1002F000CA0B19D1CD0903CD090377231DC2F7021B
+:10030000CD0903C21107C39802C5E5D5CD1B03472C
+:1003100021C30B7E807778D1E1C1C9CD3103CD4EA9
+:100320000607070707E6F0F5CD3103CD4E06C1B04D
+:10033000C9E5D5C53AC60BE67FCA520316005F2150
+:100340008000197EFE1ACAF30621C60B34B7C1D14C
+:10035000E1C90E14115C00CDBD0AB7C2F30632C666
+:100360000BC33C0334210001CD9609EB2ABD0B19C8
+:10037000EB2ACA0B19EB218000193A0700BCDA39C5
+:1003800007E5D50E1ACDBD0A115C000E14CDBD0ACD
+:10039000E1D1B7C2A3032AE00B0180000922E00BE0
+:1003A000C376032B22BF0B2AE00B11000119EB2AA5
+:1003B000BD0B1922C10B1180000E1ACDBD0AC91147
+:1003C0005C00D5D5CDF70921CE0B1B060ACD3C0626
+:1003D0007EFE20C2D9032103010603CD3C06D10EC7
+:1003E00013CDBD0AD10E16CDBD0A3CCAE0062ABF08
+:1003F0000BEB2AC80B7B954F7A9C4778B1CA7207E2
+:10040000115C00C5D5EB21800019E3E50E1ACDBDC6
+:100410000AD1D50E15CDBD0AB7C2D2062ADB0B23F1
+:1004200022DB0BD1E1C179D6804FD2030478D6010B
+:1004300047D20304CD7A05CD87054C6F61646564AE
+:1004400020002ADD0BCDED05CD870520627974658E
+:1004500073202800CD1906CD8705482900CD8705D2
+:1004600020746F2066696C652025003ADF0BB7CADF
+:100470009A04CD87050D0A4F766572206120002A07
+:10048000E00BCDED05CD87052062797465206269AA
+:100490006E6172792066696C6500CD87050D0A531F
+:1004A0007461727420616464726573733A20002A07
+:1004B000CC0BCD1906CD8705482020456E64696EAA
+:1004C0006720616464726573733A20002AC10BCDA2
+:1004D0001906CD8705482020426961733A20002A19
+:1004E000BD0BCD1906CD8705480D0A00CD870553F4
+:1004F0006176656420696D6167652073697A653A24
+:1005000020002ADB0BE506072905C20805CDED050D
+:10051000CD8705206279746573202800CD1906CD3A
+:100520008705482C202D2000E1CDED05CD87052045
+:100530007265636F726473290D0A002ACC0B7DB754
+:10054000C247057CFE01C8CD87050D0A072B2B206D
+:100550005761726E696E673A2070726F6772616D73
+:10056000206F726967696E204E4F5420617420318C
+:10057000303048202B2B0D0A00C9115C000E10CD25
+:10058000BD0A3CCA2807C9E3CD8D05E3C97E23B760
+:10059000C8FE25CA9C05CD2F06C38D05E5C53A5C6E
+:1005A00000B7C2A905CD8B0B3CC640CD2F063A5BE8
+:1005B00000FEFFCC7D0B6F2600CDED053E3ACD2F22
+:1005C00006215D000608CDD8053E2ECD2F06060378
+:1005D000CDD805C1E1C38D057EFE20CAE70523CD38
+:1005E0002F0605C2D805C92305C2E705C9E5D5C54B
+:1005F00001F6FF11FFFF0913DAF605010A0009EB06
+:100600007CB5C4ED057BC630CD2F06C1D1E1C93E16
+:100610000DCD2F063E0AC32F067CCD1E067DF51F8D
+:100620001F1F1FCD2706F1E60FC69027CE4027E5F6
+:10063000D5C55F0E02CDBD0AC1D1E1C90405C87E92
+:10064000122313C33D06237EFE20CA4606C9CD559C
+:1006500006DA5807C9FE30D8FE3ADA6606FE41D8F7
+:10066000FE473FD8D607E60FC9CD0F06CD87052038
+:100670002020202020436F6D6D616E64206C696EB8
+:10068000652073796E746178206572726F720D0ADD
+:100690000D0A00C38F07CD8909416D626967756FC7
+:1006A00075732066696C65206E616D653A20252042
+:1006B0006E6F7420616C6C6F7765642E00CD890954
+:1006C00046696C652025206E6F7420666F756E64B8
+:1006D0002E00CD89094469736B2066756C6C2E0001
+:1006E000CD89094469726563746F72792066756C8F
+:1006F0006C2E00CD89095072656D6174757265202C
+:10070000656E642D6F662D66696C6520696E2025A7
+:1007100000CD8909436865636B73756D20657272DE
+:100720006F7220696E202500CD890943616E2774A0
+:1007300020636C6F7365202500CD89094D656D6F51
+:1007400072792066756C6C207768696C65206C6FB7
+:100750006164696E67202500CD8909466F726D61FD
+:1007600074206572726F7220696E2066696C6520F4
+:100770002500CD890957726974696E6720252C2080
+:100780006E6F7468696E67206C6F6164656400CD1C
+:1007900089094D4C4F41442073796E7461783A0D4C
+:1007A0000A0D0A4D4C4F4144205B3C4F555446497D
+:1007B0004C3E3D5D203C46494C45313E5B2C3C4621
+:1007C000494C45323E2E2E2E5D205B3C4249415322
+:1007D0003E5D0D0A092020202028627261636B654E
+:1007E00074732064656E6F7465206F7074696F6ECA
+:1007F000616C206974656D73290D0A0D0A093C4FFF
+:10080000555446494C3E20697320746865206F70CA
+:1008100074696F6E616C206F757470757420666991
+:100820006C656E616D650D0A093C46494C456E3E2E
+:10083000202061726520696E7075742066696C6530
+:100840002873290D0A093C424941533E2020206962
+:1008500073206120686578206C6F6164206F666624
+:100860007365742077697468696E20746865206F99
+:1008700075747075742066696C650D0A0D0A093C03
+:1008800046494C45313E206D617920626520616E9C
+:10089000206F7074696F6E616C206E6F6E2D4845AD
+:1008A000582066696C6520746F20626520706174E1
+:1008B000636865640D0A09627920737562736571F6
+:1008C00075656E746C79206E616D6564204845585D
+:1008D0002066696C65732028737065636966796941
+:1008E0006E670D0A095468652066696C65747970D5
+:1008F0006520656E61626C6573207468697320663B
+:10090000756E6374696F6E292E0D0A0D0A4E6F7431
+:10091000652074686174205A435052322D73747983
+:100920006C652064726976652F75736572206E6FD1
+:10093000746174696F6E206D6179206265207573D2
+:10094000656420696E20616C6C0D0A66696C6520B7
+:1009500073706563696669636174696F6E7320287B
+:10096000652E672E2C202242333A4D5946494C457C
+:100970002E434F4D2C20224131343A4D444D372ED9
+:1009800048455822292E0D0A00CD0F06E1CD8D05D0
+:10099000CD0F06C376013E0132C70B22CC0B22C11C
+:1009A0000BD5EB2AC80B7D936F7C9A6722CA0BD5B7
+:1009B000C511D00B1AFE20C2D609215D000608CD54
+:1009C0003C063AE20BB7C2D60921CE0BCD7D0B77A0
+:1009D00023CD8B0B3C773E0132E20BC1E1D1C9CD77
+:1009E000F709CD1B0ACD250A78FEFFCAF3091B1BA8
+:1009F000121313CD5F0AC9E5D5CD7D0BD1E1D51B0F
+:100A00001213EB360023060B36202305C2080A0614
+:100A10001636002305C2110AEBD1C9CDA80AC0B70A
+:100A2000C823C31B0A06FFE5CDA80A23C2280AFE75
+:100A30003A13E1C07ECD550BFE41DA430AD6401B86
+:100A40001213237E23FE3AC82B06007887878087FF
+:100A5000477ED6308047237EFE3AC24B0A23C90E1A
+:100A6000080600CD7B0A7EFE2EC02379B7CA750A20
+:100A7000130DC36B0A0E03CD7B0AC9CDA80AC82388
+:100A8000FE2ACA970AFE3FC28B0A04CD550B1213E9
+:100A90000DC27B0AC3A00A3E3F1213040DC2990A7D
+:100AA000CDA80AC823C3A00A7EFE2FC8FE2EC8FE0A
+:100AB0002CC8FE20C8FE3AC8FE3DC8B7C9CD2F0BD2
+:100AC000C2F20ACD050B22ED0A1A32EF0A3DFAD224
+:100AD0000A67AF121B1A6F13CD1A0BCDF20AF5E598
+:100AE0003AEF0A122AED0ACD1A0BE1F1C900000013
+:100AF0008000D5C579FE1AC2FF0AEB22F00AEBCDC1
+:100B00000500C1D1C9C5D50E201EFFCDF20AF50ED4
+:100B100019CDF20A67F16FD1C1C9C5D5E55C0E0EDA
+:100B2000CDF20AE1E55D0E20CDF20AE1D1C1C9792D
+:100B3000FE0FC8D8FE10C8FE14C8FE15C8FE21C896
+:100B4000FE22C8FE11C8FE12C8FE13C8FE16C8FE5B
+:100B500023C8FE24C9FE61D8FE7BD0D620C9E5D5C6
+:100B6000C50603116500217A0B1AE67FBE2313C266
+:100B7000760B05C2690BC1D1E1C9484558E5D5C519
+:100B80000E201EFFCDBD0AC1D1E1C9E5D5C50E19A4
+:100B9000CDBD0AC1D1E1C900000000000000490C30
+:100BA0000000490C00000000000020202020202030
+:0D0BB0002020202020000000000000000098
+:0000000000
diff --git a/mload.txt b/mload.txt
new file mode 100644 (file)
index 0000000..879e9b8
--- /dev/null
+++ b/mload.txt
@@ -0,0 +1,138 @@
+                                 MLOAD
+
+Description:
+
+     MLOAD is a transient command used to convert a "HEX" file (the
+output of an assembler) into an executable "COM" file.
+
+     In its simplest form, MLOAD takes a program that is in valid Intel
+hexadecimal format machine code and converts it into a command file that
+can be executed.  The file becomes filename.COM (the hexadecimal file is
+filename.HEX).  This form may be used as a replacement to the Digital
+Research "LOAD" command.
+
+     The program may also be used to overlay portions of a "COM" file
+with patches assembled to a new "HEX" file.
+
+Syntax:
+
+     mload [<outnam=>][<file1.type>,]<file2>[,<file3...>] [bias]
+
+     <outnam> is the optional output file name.
+
+     <file1.type> is an optional non-HEX file to be patched by
+     subsequently named HEX files.  Specifying the filetype enables this
+     function.
+
+     <file2> specifies the file to be loaded, unless a file1.type has
+     been specified.  In that case, it specifies a HEX file to load.
+
+     <file3> specifies HEX file(s) to load.
+
+     <bias> is the offset within the saved image to apply when loading
+     the file.
+
+          MLOAD with no arguments prints a small help message.  This
+     message is also printed whenever a command line syntax error
+     occurs.
+
+          ZCPR-style du specifications are fully supported, for both
+     input and output files.  The following command lines are
+     permissible:
+
+         b3>mload a4:myfile.com=0:bigfil,b6:patch1,c9:patch2
+         a6>mload b5:=c3:mdm717.com,mdmpatch
+
+          Only the optional drive and user spec and the primary filename
+     may be specified.  The output filetype is derived exclusively from
+     the 3-byte string at 103h within MLOAD.
+
+          If no output filename is specified, it will be derived from
+     the first input filename, with filetype of "COM", if not otherwise
+     specified (this default filetype may be patched directly into MLOAD
+     via DDT or with MLOAD itself, using a patch file - its location is
+     at 103H in MLOAD.COM).  Note that a command line of the form
+     "C:=<FILENAME>" will place the output file on the "C" drive with
+     the same primary filename as the input file.
+
+         This feature obviating any need to use DDT.  The first (and
+     only the first) filespec (after the "=", if used) may be non-HEX
+     and the filetype must be specified.  Examples:
+
+         1.  "mload MYPROG" loads MYPROG.HEX and writes the output to
+     MYPROG.COM.
+
+         2.  "mload ws.com,wspatch" loads WS.COM, overlays it with
+     WSPATCH.HEX, and writes the output to WS.COM.
+
+         3.  "mload MEXTEST=MEX114.COM,MXO-US13" loads MEX114.COM,
+     overlays it with MXO-US13.HEX, and writes the output file to
+     MEXTEST.COM.  Note that this is the recommended technique because
+     it preserves the original file!
+
+         4.  "mload ws.ovr,ovrpatch" loads WS.OVR and patches it with
+     "OVRPATCH.HEX".
+
+          Filenames may contain drive/user specs, and must not contain
+     wildcards.  Input filenames must be separated by comas, and a
+     space is required between the last filename and the optional bias.
+
+     A load information summary is printed at the successful conclusion
+of the load.  Any errors in loading will generally include the name of
+the file in question.
+
+     This program is a replacement for the CP/M "LOAD" program.  Why
+replace "LOAD"?  well...  LOAD.COM has a few deficiencies.  For example,
+if the hex file's origin is above 100h, LOAD.COM prepends blank space
+to the output file to insure it will work as a CP/M transient.  It
+doesn't care if the file is not intended as a CP/M transient and it also
+doesn't like hex records with mixed load addresses.  For example, one
+that loads below a previous record; which is a perfectly legitimate
+happenstance.  Also, LOAD.COM can load only one program at a time, and
+has no provision for a load bias in the command specification.  Finally,
+there is no provision for user specification of the output file name.
+
+     In its simplest form, MLOAD's syntax is identical to LOAD.COM.
+There should be no problem in learning to use the new program.  The only
+significant difference here is that, under LOAD.COM, all files are
+output starting at 100h, even if they originate elsewhere.  MLOAD
+outputs starting at the hex file origin (actually, the first hex record
+specifies the output load address).  The bias option may be used to
+override this.
+
+     An example should clarify this.  Suppose you have a file that loads
+at 1000h.  LOAD.COM would save an output file that begins at 100h and
+loads past 1000h (to wherever the program ends).  MLOAD will save an
+output file starting from 1000h only.  If, for some reason, you need the
+file to start at 100h in spite of its 1000h origin (I can think of
+several circumstances where this would be necessary), you'd have to
+specify a bias to MLOAD.  Using this example, "MLOAD MYFILE 0F00"
+would do.
+
+     Note that this program re-initializes itself each time it is run.
+If your system supports a direct branch to the TPA (via a zero-length
+.COM file, or the ZCPR "GO" command), you may safely re-execute MLOAD.
+
+Error Messages:
+
+        Command line syntax error
+                Error in command line, re-enter and try again.
+        Ambiguous file name: <filename.ext> not allowed.
+                Ambiguous files are not allowed.
+        File <filename.ext> not found.
+                Input file could not be found, check spelling and try again.
+        Disk full.
+                No room on disk for output file.
+        Directory full.
+                No room in directory for output file.
+        Premature end-of-file in <filename.ext>
+                Error in input file, correct error, and try again.
+        Checksum error in <filename.ext>
+                Error in input file, correct error, and try again.
+        Can't close <filename.ext>
+                Problem closing file, disk may be in Read/Only status.
+        Memory full while loading <filename.ext>
+                Error in input file, correct error, and try again.
+        Format error in file <filename.ext>
+                Error in input file, correct error, and try again.
+        Writing <filename.ext>, nothing loaded