software: Added more and more
[pdp8.git] / sw / tools / KERMIT.PA
diff --git a/sw/tools/KERMIT.PA b/sw/tools/KERMIT.PA
new file mode 100644 (file)
index 0000000..d71cabb
--- /dev/null
@@ -0,0 +1,6721 @@
+/ MODIFIED SILENT VERSION, HACHTI 2008
+/      KERMIT FOR DEC 12-BIT MACHINES
+
+/      LAST EDIT:      06-SEP-1990     11:00:00        CJL
+
+       XLIST   OFF
+       IFNDEF  OFF     <OFF=   1>      /TURN LISTING OFF
+       IFNDEF  ON      <ON=    0>      /TURN LISTING ON
+       XLIST   ON;     IFZERO  1       <
+
+
+
+
+
+
+
+
+***     **** *********** *********    ***      *** *** *********** *****   ****
+***    ****  *********** **********   ****    **** *** *********** *****  ******
+***   ****    ***        ***    ****  ****    **** ***     ***       *** ***  ***
+***  ****     ***        ***     ***  *****  ***** ***     ***       *** **   ****
+*** ****      ***        ***     ***  *****  ***** ***     ***       *** **    ***
+*******       ***        ***    ****  ************ ***     ***       ***       **
+******       **********  **********   *** **** *** ***     *** ***** ***      **
+*******              **********  *********    *** **** *** ***     *** ***** ***     **
+*** ****      ***        *** ****     ***  **  *** ***     ***       ***    **
+***  ****     ***        ***  ****    ***  **  *** ***     ***       ***   **
+***   ****    ***        ***   ****   ***      *** ***     ***       ***  **
+***    ****   *********** ***   ****  ***      *** ***     ***       *** *********
+***     **** *********** ***     **** ***      *** ***     ***       *** *********
+                                       >       XLIST   ON
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+/      COPYRIGHT (C) 1989, 1990 BY THE TRUSTEES OF COLUMBIA UNIVERSITY IN THE CITY OF
+/      NEW YORK.
+
+
+
+/      PERMISSION IS  GRANTED  TO  ANY  INDIVIDUAL OR INSTITUTION TO COPY OR USE THIS
+/      DOCUMENT AND THE  PROGRAM(S) DESCRIBED IN IT, EXCEPT FOR EXPLICITLY COMMERCIAL
+/      PURPOSES.
+\f/     EDIT HISTORY.                                                   /014 CJL
+
+/      052     06-SEP-1990     BUG FIX.                        CHARLES LASNER (CJL)
+
+/              SENDING A FILE WHICH  EXACTLY  FILLS  THE LAST DATA PACKET AT THE
+/              END OF THE FILE WILL  CAUSE  THE  PACKET  TO  BE SENT TWICE.  THE
+/              ROUTINE DIDN'T CHECK FOR AN EMPTY OUTPUT BUFFER AT EOF.
+
+/      051     29-AUG-1990     BUG FIX.                        CJL
+
+/              PDP-8/A NOT IDENTIFIED CORRECTLY  IN  CPUID ROUTINE.  THE UPDATED
+/              PC IS WHAT IS LOADED  INTO  THE  AC  WHEN 7016 IS EXECUTED ON THE
+/              KK-8/A CPU.  THE ROUTINE WAS  CHECKING FOR THE NON-UPDATED VALUE.
+/              ALSO  NEW  DOCUMENTATION FOR PRE-CLEARING MEMORY FOR  BENEFIT  OF
+/              ENCODED BINARY FILES.
+\f/     050     06-SEP-1989     DECMATE I SUPPORT, ETC.         CJL
+
+/              THIS EDIT IMPLEMENTS DECMATE  I  SUPPORT USING THE DP278-A OR -B.
+/              A NEW CONDITIONAL 'PORT' SELECTS  WHICH  PORT  IS TO BE USED.  IF
+/              KERMIT-12 IS RUN ON DECMATE I  (WHILE  NOT  CONFIGURED FOR SERIAL
+/              PRINTER  PORT  COMMUNICATIONS;    SEE  EDIT  048.)   THEN  REMOTE
+/              COMMUNICATIONS TAKES PLACE ON THE PORT SELECTED AT  ASSEMBLY TIME
+/              ('PORT=0' OR 'PORT=1').    ADDED  BAUD  RATE PARAMETER 'BRATE' TO
+/              SELECT REMOTE COMMUNICATIONS BAUD  RATE  FROM THE STANDARD TABLE;
+/              DEFAULTS TO 1200 BAUD ('BRATE=7').
+/      049     30-AUG-1989     REMOTE FLOW CONTROL, ETC.       CJL
+
+/              THIS  EDIT  IMPLEMENTS FLOW CONTROL SUPPORT (IF FLOW  CONTROL  IS
+/              ENABLED) FOR THE REMOTE LINE WHILE SENDING PACKETS TO  THE REMOTE
+/              KERMIT REGARDLESS  OF  STATE.    PREVIOUSLY,  FLOW  CONTROL  ONLY
+/              APPLIED TO CONNECT  MODE.  LOCAL FLOW CONTROL (TOWARDS THE REMOTE
+/              KERMIT) IS UNNECESSARY AS  LOCAL  BUFFERS  FOR  REMOTE  INPUT ARE
+/              ALWAYS AVAILABLE.  CERTAIN ROUTINE  CHANGES  MADE  FOR BENEFIT OF
+/              DECMATE I SUPPORT IN A SUBSEQUENT EDIT.
+
+/      048     24-AUG-1989     DECMATE II, ETC. SUPPORT.       CJL
+
+/              ONCE-ONLY CODE ADDED  TO  IMPLEMENT DECMATE II, ETC.  REMOTE LINE
+/              SUPPORT  ON  SERIAL  COMMUNICATIONS   PORT.    SELECTED  PORT  IS
+/              INDICATED ON OPENING BANNER IF OPERATING ON DECMATE.
+
+/      THIS EDIT PROVIDES BASIC SUPPORT  OF  THE DECMATE II COMMUNICATIONS PORT AS AN
+/      AUTOMATIC FEATURE OF THE STANDARD RELEASE  OF  K12MIT.  AUTOMATIC DETECTION OF
+/      DECMATE II, ETC.  HARDWARE IS PERFORMED  UNLESS  THE  PDP-8-TYPE  REMOTE  LINE
+/      SUPPORT IS ASSEMBLED FOR THE SERIAL PRINTER AS  THE  REMOTE  LINE ('SPRINT' IS
+/      SET OR EQUIVALENT).
+
+/      THIS  EDIT INCORPORATES ALL OF THE  INFORMATION  TAKEN  FROM  VARIOUS  SOURCES
+/      REGARDING DECMATE PORT INITIALIZATION, ETC.  EVERY  ATTEMPT  HAS  BEEN MADE TO
+/      COMPLETELY  SET ALL APPROPRIATE REGISTERS, ETC.  FOR  DECMATE  II,  III,  III+
+/      OPERATION.  NO SUPPORT EXISTS FOR THE DECMATE III  BUILT-IN  MODEM  OPTION, AS
+/      EXPLICIT  DOCUMENTATION  IS NOT AVAILABLE (SOME OF THE INITIALIZATION CODE  IS
+/      APPARENTLY USED TO DISABLE THE MODEM).  THESE ROUTINES ARE ONLY  KNOWN TO WORK
+/      ON  THE DECMATE II, AS THE III (ESPECIALLY WITH OPTIONAL MODEM) AND  THE  III+
+/      HAVEN'T BEEN  AVAILABLE  TO  THE  AUTHOR FOR TESTING.  THE INITIALIZATION CODE
+/      WILL BE UPDATED  LATER  TO  INCLUDE  PANEL  REQUESTS,  ETC.    TO  CORRECT ANY
+/      PROBLEMS, ETC.  DECMATE-SPECIFIC  FEATURES  (SUCH  AS  SETUP COMMANDS) WILL BE
+/      ADDED LATER AND ENABLED FROM THESE ROUTINES.
+
+/      THIS EDIT INCORPORATES  NON-INTERRUPT  ROUTINES  WHICH HAVE BEEN TESTED AT THE
+/      MAXIMUM COMMUNICATIONS SPEED OF  THE  DECMATE  II  (19200  BAUD).    THEY WILL
+/      SUFFICE FOR ALL KERMIT IMPROVEMENTS  SHORT  OF  SLIDING  WINDOWS AT WHICH TIME
+/      INTERRUPT-DRIVEN I/O WILL BE REQUIRED.   (INTERRUPT-DRIVEN  I/O  IS ILLEGAL ON
+/      CERTAIN OS/8 SYSTEMS WHERE INTERRUPTS ARE HARMFUL  TO THE SYSTEM OR NON-SYSTEM
+/      HANDLERS.) 
+\f/     047     21-AUG-1989     CODE CLEANUP.                   CJL
+
+/              STREAM-LINED CONNECT MODE ROUTINES FOR MINIMUM USE OF IOTS.  THIS
+/              IS  IN  PREPARATION  FOR  EVENTUAL DECMATE II OPERATION,  AND  TO
+/              MINIMIZE  K12PCH  PATCH  FILE SIZE.  CERTAIN NON-CONNECT ROUTINES
+/              MOVED TO FACILIATE CONNECT ROUTINE REORGANIZATION. 
+
+/      046     15-AUG-1989     CODE CLEANUP.                   CJL
+
+/              ADDED NEW (NON-CONNECT) MODE COMMUNICATIONS ROUTINES FOR EVENTUAL
+/              DECMATE USE.  ELIMINATION OF 'IREM' AND 'IREMW' ROUTINES IN FAVOR
+/              OF 'COMIN'.   ELIMINATION  OF 'OREM' IN FAVOR OF 'COMOUT'.  ADDED
+/              STATUS UPDATE ROUTINE ('UPSTATUS')  FOR EVENTUAL DECMATE II, ETC.
+/              USAGE.  ELIMINATED PDP-8, DECMATE  I,  DECMATE  II  CONDITIONALS.
+/              REORGANIZED  SERIAL  LINE  CONDITIONALS  AND ADDED  NEW  'SPRINT'
+/              PARAMETER FOR SERIAL PRINTER  PORT  USAGE AS COMMUNICATIONS PORT.
+/              ADDED ONCE-ONLY CODE ADDED TO  AUTOMATICALLY  RECOGNIZE DECMATE I
+/              AND II OPERATION UNLESS ASSEMBLED FOR  REMOTE  COMMUNICATIONS  ON
+/              SERIAL  PRINTER  PORT  ('SPRINT'  SET).   UPDATED  K12PCH.PAL  TO
+/              CORRESPOND   TO  NEW  DEFINITIONS.    DEFINED  EVENTUALLY  NEEDED
+/              COMMUNICATIONS PORT  INSTRUCTIONS FOR DECMATE II;  ACTUAL DECMATE
+/              II OPERATION WILL  BE  DEFINED  IN A SUBSEQUENT EDIT.  DOCUMENTED
+/              NEW LOADING AND SAVING  INSTRUCTIONS  FOR  K12MIT  TO  ALLOW  FOR
+/              ONCE-ONLY CODE IN 10000-11777 WITHOUT  SWAPPING  THE CODE OUT FOR
+/              THE USR.  THIS ELIMINATES OVERHEAD  WHEN  LOADING  K12MIT, BUT IS
+/              DIFFERENT  FROM  THE FORMER INSTRUCTIONS WHICH ASSUMED  NO  OTHER
+/              USAGE OF 10000-11777 OTHER THAN THE (LOCKED-IN) USR.
+
+/      THIS EDIT  PROVIDES THE FRAMEWORK FOR AUTOMATIC DETECTION OF PROGRAM EXECUTION
+/      OF K12MIT ON  ANY  MEMBER  OF  THE  DECMATE  FAMILY  (I, II, III, III+).  WHEN
+/      6120-TYPE CPU DETECTION OCCURS,  THE  DECMATE I OR II-TYPE COMMUNICATIONS PORT
+/      INITIALIZE CODE IS AUTOMATICALLY SELECTED  AS  NECESSARY UNLESS THE PDP-8-TYPE
+/      ROUTINES ARE ASSEMBLED (WITH 'SPRINT' SET  OR  EQUIVALENT USER SETTINGS, ETC.)
+/      FOR THE VT-78-TYPE PRINTER PORT (32/33), IN  WHICH  CASE THE COMMUNICATIONS IS
+/      DONE VIA THE PRINTER PORT ON THE DECMATE (WHICH IS ALMOST PDP-8 COMPATIBLE AND
+/      IS ACCOMODATED AS SUCH).
+
+/      SUBSEQUENT EDITS SHOULD PROVIDE FOR A DECMATE I PARAMETER TO CONTROL  THE PORT
+/      SELECTION,  AS  THERE  ARE  AT  LEAST  TWO VARIANT OPTIONS BOARDS (DP-278A AND
+/      DP-278B) EACH CONSISTING OF TWO PORTS.
+\f/     045     12-AUG-1989     BUG FIX.                        CJL
+
+/              FINISH,  GET,  AND  RECEIVE  COMMANDS   FAIL  TO  ABORT  PROPERLY
+/              (ESPECIALLY AFTER THE SEND COMMAND HAS BEEN USED), AS THE CURRENT
+/              OPERATING MODE ('KMODE') IS NEVER PROPERLY SET,  OR  IS SET AFTER
+/              SEVERAL PACKETS HAVE BEEN SENT.  EACH COMMAND  NOW  SETS  ITS OWN
+/              OPERATING MODE BEFORE INITIATING ANY PACKETS.
+
+/      044     11-AUG-1989     CODE CLEANUP.                   CJL
+
+/              CHANGED  'CCMSG'  TO  'ABMSG'  WITH  CLEARER  MESSAGE.    CHANGED
+/              'CCFLAG'  TO  'ABFLAG' FOR CONSISTENCY.  CHANGED ABORT  CHARACTER
+/              FROM <^C> TO CHOICE OF <^X> OR <^Z> FOR  CONSISTENCY.  ELIMINATED
+/              'ITTY'  AND  'ITTYW'  ROUTINES  BY  USING  'CTLCTST'  AND 'INPUT'
+/              ROUTINES ALREADY  AVAILABLE  A/O EDIT 043.  ELIMINATED 'TCHAR' IN
+/              FAVOR OF 'INCHAR' AVAILABLE A/O EDIT 043.
+
+/      043     07-AUG-1989     CODE CLEANUP, ETC.              CJL
+
+/              REWRITE OF  CONSOLE SUPPORT ROUTINES INCLUDING FORCED-ECHO OUTPUT
+/              AND COLUMN COUNT FOR <HT> SIMULATION IN PREPARATION FOR IMPENDING
+/              USER-INTERFACE  REWRITE.     'SCRIBE',  'LININP',  AND  'ESCPRNT'
+/              ROUTINES NOW CALL  "P7ECHO" ROUTINE TO ENSURE PRINTING OF CRUCIAL
+/              MESSAGES.
+
+/      042     13-JUN-1989     CODE CLEANUP.                   CJL
+
+/              FIXED VARIOUS NAK-RELATED BUGS AND SEND-INIT PROBLEMS AS IN  K278
+/              (SOME  OF  THE K278 STUFF IS DEFICIENT!).  CALCULATION OF  PROPER
+/              SEQUENCE  NUMBER  FOR NAK CORRECTED OVER FORMER (K08MIT AND K278)
+/              VERSIONS.  ADDED ERROR MESSAGE FOR FULL-DISK PROBLEM.
+
+/      041     12-MAY-1989     BUG FIX.                        CJL
+
+/              VARIOUS  VERSIONS  (DECMATE)  WON'T  FUNCTION REMOTELY WHILE KL-8
+/              VERSIONS WORK  FINE.    ADDED  REMOTE LINE READ IOT TO INITIALIZE
+/              REMOTE  LINE  AT   STARTUP  TIME  FOR  VERSIONS  REQUIRING  THIS.
+/              CORRESPONDING CHANGES IN PATCH FILE MADE FOR REMOTE LINE READ IOT
+/              IN TWO PLACES.
+\f/     040     07-MAR-1989     COSMETIC CLEANUP.               CJL
+
+/              CLEANUP OF EDIT HISTORY AND OTHER COMMENTS.
+
+/      039     21-MAY-1988     CODE CLEANUP.                   CJL
+
+/              ADDED VARIABLE 'INIECHO' TO  ALLOW  DEFAULT CONNECT-MODE STATE TO
+/              BE HALF-DUPLEX ("SET LOCAL-ECHO ON").    MODIFIED  INPUT  SERVICE
+/              ERROR ADDRESSES TO SIMPLIFY ERROR TABLES.
+
+/      038     19-MAY-1988     CODE CLEANUP.                   CJL
+
+/              ELIMINATED  TRAILER FILES DURING ASSEMBLY BY  CREATING  VARIABLES
+/              'GENMSG' AND 'UMSG.' THIS ALLOWS THE HEADER  FILE  (PARAM.PA)  TO
+/              CONTAIN THE LOCAL MESSAGE TEXT WITHOUT SUBSEQUENT OVERLAY  (WHICH
+/              WAS WHY THERE FORMERLY WAS A TRAILER FILE CAPABILITY).    OVERLAY
+/              BY  K12PCH.BN  WILL  DEFAULT TO CREATION OF A DUMMY USER  MESSAGE
+/              (WITHIN K12PCH) ENCOURAGING LOCAL  CUSTOMIZATION.  K12MIT.BN WILL
+/              CONTAIN A NULL MESSAGE BY DEFAULT UNLESS CUSTOMIZED IN PARAM.PA.
+
+/      037     21-JAN-1988     BUG FIX.                        CJL
+
+/              RESET OS/8 DEVICE CONTROL WORD  TABLE TO DELETE TENTATIVE FILE IN
+/              CASE OF PRIOR INPUT SERVICE ERROR.
+
+/      036     20-JAN-1988     BUG FIX.                        CJL
+
+/              RESET 'OFFLG' WHEN DOING INPUT SERVICE IN CASE PRIOR ERRORS LEAVE
+/              THE FLAG SET.
+
+/      035     14-JAN-1988     USR RESIDENT CODING.            CJL
+
+/              CALLS TO USR NOW USE 10200 INSTEAD  OF  17700.   NO SWAP OVERHEAD
+/              WHEN OPENING OR CLOSING FILES.
+
+/      034     13-JAN-1988     CODE CLEANUP.                   CJL
+
+/              ALL  EIGHT-BIT  ORIENTED  CONSOLE  CODE ELIMINATED;  NOW  IGNORES
+/              PARITY (JUST SEVEN BITS).
+
+/      033     12-JAN-1988     CODE CLEANUP.                   CJL
+
+/              'TTYOUT' AND 'OTTY' ROUTINES ELIMINATED;  NOW USES 'P7CH' FOR ALL
+/              CONSOLE OUTPUT (EXCEPT FOR CONNECT MODE).
+
+/      032     12-JAN-1988     CODE CLEANUP.                   CJL
+
+/              VARIOUS  ROUTINES REWRITTEN TO ELIMINATE DEPENDENCIES ON CPU TYPE
+/              BEYOND THE CLASSIC PDP-8.
+\f/     031     11-JAN-1988     CODE CLEANUP.                   CJL
+
+/              ELIMINATED 'RTDISP'  AND  CHANGED CALLING CONVENTION FOR DISPATCH
+/              ROUTINE.  ALL  CALLERS  NOW  LOCAL  OR VIA LOCAL POINTERS.  ADDED
+/              SEVERAL  CONDITIONAL  PARAMETERS  AND    LABELS  FOR  BENEFIT  OF
+/              K12PCH.PAL.
+
+/      030     05-JAN-1988     CODE CLEANUP.                   CJL
+
+/              CHANGED LOWER/UPPER CASE CONDITIONAL ASSEMBLY PARAMETERS AND MORE
+/              EFFICIENT CODE.
+
+/      029     21-DEC-1987     CODE CLEANUP.                   CJL
+
+/              CHANGED CALLING CONVENTIONS FOR 'SCRIBE' AND SIMILAR ROUTINES AND
+/              REWROTE 'COMMAND' ROUTINE.
+
+/      028     15-DEC-1987     CODE CLEANUP.                   CJL
+
+/              COMPLETE REWRITE OF FILE LOOKUP ROUTINE.   'LUKUP' NOW USES FIELD
+/              ONE  BUFFER  AND  ITS OWN AUTO-INDEX REGISTER CONSERVING  PROGRAM
+/              SPACE.
+
+/      027     05-DEC-1987     CODE CLEANUP.                   CJL
+
+/              CHANGED  DISPATCH  ('DISPA0') ROUTINE TO USE 'SRCHTABLE' ROUTINE.
+/              ALL CALLS  MADE COMPATIBLE.  ELIMINATED 'SCANC' CODE.  ELIMINATED
+/              CODE WITHIN 'DPARS'  ROUTINE.    'LUKUP' ROUTINE NOW DOES ITS OWN
+/              DISK I/O.  ELIMINATED 'BLKIN' ROUTINE.
+
+/      026     27-NOV-1987     NEW CONNECT MODE CODE.          CJL
+
+/              TOTAL  REWRITE  OF ALL CONNECT MODE CONSOLE AND REMOTE INPUT  AND
+/              OUTPUT  TERMINAL  ROUTINES.  CONNECT IS NOW FULLY BUFFERED IN ALL
+/              DIRECTIONS.   IF  FLOW  CONTROL  IS  OBEYED, ANY BAUD RATE CAN BE
+/              ACCOMODATED BOTH LOCALLY  AND  REMOTE  (UP  TO  9600 BAUD TESTED,
+/              SHOULD WORK TO AT  LEAST  19200 BAUD BY INSPECTION).  TESTED WITH
+/              FAST VT-100 EMULATOR CONSOLE TO  PROVE  ESCAPE  SEQUENCES ARE NOT
+/              DROPPED WHEN LOCAL TERMINAL IS FASTER  THAN REMOTE LINE.  LIMITED
+/              USE OF SUBROUTINES TO IMPROVE HIGH BAUD  RATE  OPERATION.   ADDED
+/              TABLE-DRIVEN ERROR EXITROUTINE FOR SEND ROUTINES.
+
+/      THIS EDIT PROVIDES  FULLY  BUFFERED  INPUT/OUTPUT  ROUTINES FOR BOTH LOCAL AND
+/      REMOTE PORTS.  NO  INTERRUPTS  ARE  USED  FOR  MAXIMUM COMPATIBILITY WITH OS/8
+/      DEVICES (SOME OF WHICH ARE  INTOLERANT OF INTERRUPTS, SUCH AS TD-8/E).  REMOTE
+/      FLOW CONTROL (IF ENABLED) WILL SIGNAL BUFFER FILLING VIA <DC3> WHEN THE BUFFER
+/      IS 3/4 FULL.  WHEN THE BUFFER  REACHES 1/4 FULL, THE REMOTE WILL BE SENT <DC1>
+/      TO ALLOW FURTHER OUTPUT.  REMOTE FLOW CONTROL IS SUPPORTED IN BOTH DIRECTIONS;
+/      LOCAL FLOW CONTROL IS FROM THE KEYBOARD ONLY.
+
+/      WHILE THE CONSOLE OUTPUT IS PAUSED BY <DC3>, THE  BUFFER WILL FILL WITH OUTPUT
+/      CHARACTERS.  WHEN THE USER RELEASES THE CONSOLE WITH <DC1>,  THE  BUFFER  WILL
+/      RAPIDLY  EMPTY  (ASSUMING THE CONSOLE IS FASTER THAN THE REMOTE LINE).    THIS
+/      ALLOWS THE USER TO PAUSE THE CONSOLE WITHOUT BACKING UP THE REMOTE  LINE UP TO
+/      THE LIMITS OF BOTH LOCAL OUTPUT AND REMOTE INPUT BUFFERS.
+\f/     025     24-NOV-1987     NEW FEATURES AND CODE CLEANUP.  CJL
+
+/              PROPER  INTERRUPT  SETUP  FOR  <^C> AND <^P>, ECHO  STATE.    ALL
+/              MESSAGES  IN  NEW  FORMAT,  (SOME NEW ONES HAVE BETTER  CONTENT).
+/              ELIMINATED  'PRI6B' AND 'REM6B' ROUTINES.  NEW AND IMPROVED INPUT
+/              SERVICE ERROR  CODE  MOVED  TO  PROPER  PAGE.    REWROTE  CONNECT
+/              ROUTINES TO ALLOW  NON-INTERRUPT BUFFERED I/O LATER.  CREATED NEW
+/              VARIABLE 'ESCHAR' AND PARAMETER  'ESCAPE'  TO  SET DEFAULT ESCAPE
+/              CHARACTER.  ESCAPE CHARACTER CAN BE CHANGED IN MEMORY AND WILL BE
+/              USED  CORRECTLY  BY ALL ROUTINES.   ADDED  'ESCPRNT'  ROUTINE  TO
+/              HANDLE  ALL  CASES  (INCLUDING NON-CONTROL CHARACTERS).   DEFAULT
+/              ESCAPE  PARAMETER  VALUE  COMPATIBLE  WITH K08V2, BUT IS  A  USER
+/              PARAMETER,  CONFIGURED  AS  OTHER PARAMETERS DEFINED IN EDIT 017.
+/              CREATED  ESCAPE FUNCTION TABLE FOR EXPANSION LATER.  NOW SUPPORTS
+/              ESCAPE C(LOSE)  IN  UPPER  OR LOWER CASE, ESCAPE ESCAPE (SEND ONE
+/              ESCAPE CHARACTER).   ALL  BAD  ESCAPE  COMMANDS  WILL ISSUE <BEL>
+/              CHARACTER TO WARN USER  THAT COMMAND IS ILLEGAL AND OTHERWISE WAS
+/              IGNORED.  CREATED NEW VARIABLE  'ECHOFLAG' TO ALLOW LOCAL ECHO IN
+/              CONNECT MODE.
+
+/      024     19-NOV-1987     NEW FEATURES.                   CJL
+
+/              NEW  STARTUP MESSAGES AND HELP METHOD  VIA  COMMAND.    CPU  TYPE
+/              IDENTIFICATION TO ALLOW FUTURE VERSIONS TO CHECK  FOR  QUIRKS AND
+/              MODEL DEPENDENCIES.  THE DEFAULT PROMPT REFLECTS THE  ACTUAL  CPU
+/              TYPE (THUS "KERMIT-12>" ON PDP-12).  VERSION, REVISION, AND  DATE
+/              NOW EQUATED SYMBOLS.
+
+/      023     18-NOV-1987     NEW CONSOLE I/O PACKAGE.        CJL
+
+/              NEW  CONSOLE  I/O  ROUTINES  WITH  DC1/DC3  SUPPORT  FOR  CONSOLE
+/              TERMINAL MESSAGES NOT ASSOCIATED WITH ANY REMOTE ACTIVITY (NOT TO
+/              BE USED DURING CONNECT MODE).  USES FIELD ONE FOR MESSAGE TEXT TO
+/              ALLOW FOR MORE PROGRAM  SPACE.    THE  MESSAGES  ARE NOW GIVEN IN
+/              UPPER/LOWER SIXBIT FORMAT.  SUPPORT  FOR <^P> RESTART AND <^O> TO
+/              FLIP  ECHO.  UPPER-CASE CAN BE  FORCED  BY  CHANGING  A  VARIABLE
+/              ('UPONLY').
+
+/      022     17-NOV-1987     BUG FIX.                        CJL
+
+/              EXTRA-LONG INIT PACKETS CORRUPTING PROGRAM;  NOW  CHECKS  FOR AND
+/              IGNORES EXTRA CAPABILITIES BEYOND 'CAPAS' BYTE.
+\f/     021     17-NOV-1987     CODE CLEANUP.                   CJL
+
+/              REWROTE  TENTATIVE OUTPUT FILE LENGTH CODE FOR MORE  CONSISTENCY.
+/              RENAMED "FINISH" COMMAND CORRECTLY (FORMERLY "BYE").
+
+/      FORMER  CODE  REGARDING  THE  TENTATIVE  FILE  MAXIMUM  LENGTH WAS  ACCEPTABLY
+/      ORGANIZED  FOR  ORIGINAL  PS/8, OS/8 CONVENTIONS.  WITH THE EVOLUTION  OF  THE
+/      OPERATING  SYSTEM  INTO  OS/78  (VERSIONS  1-4) AND OS/278 (VERSIONS 1-2), THE
+/      ENTER OPERATION HAS BEEN CHANGED WITH DANGEROUS CONSEQUENCES.
+
+/      THE  ORIGINAL DEFINITION OF THE LENGTH RETURNED BY ENTER IS THE ACTUAL  LENGTH
+/      OF  THE LARGEST EMPTY (IN TWO'S COMPLEMENT FORM).  IF RECORD 7777 IS  PART  OF
+/      THE  ACTUAL  LARGEST  EMPTY (FULL SIZE DEVICE AND THE LARGEST EMPTY IS LAST ON
+/      THE  DEVICE),  THEN  THE  LENGTH RETURNED IS ONE LESS (THIS IS A LONG STANDING
+/      BUG).  SINCE THERE IS NO STRAIGHT-FORWARD WAY TO DETERMINE THIS, THE LENGTH IS
+/      ASSUMED TO BE CORRECT.
+
+/      TESTS WITH THE  DECUS  VERSION  OF  OS/278 (DM-101) REVEAL A DANGEROUS CHANGE:
+/      THE LENGTH RETURNED IS TWO LARGER THAN ACTUALLY EXISTS!
+
+/      TO COUNTERACT THIS, EDIT  010  INSERTED  A  DECREMENT  OF  TWO INTO THE LENGTH
+/      BEFORE PASSING IT BACK TO  THE  KERMIT FILE WRITING ROUTINE.  THE FILE WRITING
+/      ROUTINE THEN ADDS ONE TO THE LENGTH TO CREATE A "DANGER COUNT", I.E., IN TWO'S
+/      COMPLEMENT  NOTATION,  THIS IS THE AMOUNT THAT  WILL  INDICATE  FILE  OVERFLOW
+/      SHOULD IT REACH ZERO.
+
+/      THIS HAS NOW BEEN REORGANIZED TO ALLOW THE  ENTER  ROUTINE  TO  SET THE DANGER
+/      COUNT  DIRECTLY.  OS/8 USERS MUST ALLOW FOR THE  EXTRA  ROOM  (WHICH  MUST  BE
+/      PRESENT  BUT  WILL NOT BE USED), SINCE NO CHECK FOR  SYSTEM  VERSION  WILL  BE
+/      PERFORMED.
+
+/      020     16-NOV-1987     NEW ROUTINES AND CODE CLEANUP.  CJL
+
+/              REWROTE  ENTIRE  OUTPUT  FILE    PACK   ROUTINE.    NOW  SUPPORTS
+/              ASCII/BINARY  INTERNAL FILE MODE FOR  LATER  USE.    USES  OUTPUT
+/              BUFFER IN FIELD ONE (SAME DEFINITIONS  AS  INPUT BUFFER) TO ALLOW
+/              MORE PROGRAM SPACE.  END OF FILE  CONVENTION  IN  ASCII  MODE NOW
+/              INCLUDES  ENSURING  <^Z>  CHARACTER  PACKED  INTO FILE (OR  NOT).
+/              REWROTE  ENTIRE  OUTPUT  FILE  CLOSE  ROUTINE  TO  IMPLEMENT <^Z>
+/              SCHEME.  ELIMINATED SEPARATE OUTPUT FILE INITIALIZE ROUTINE;  USE
+/              SPECIAL ROUTINE CALL INSTEAD.  FIXED PACKET WRITE BUG.
+
+/      019     15-NOV-1987     NEW ROUTINES AND CODE CLEANUP.  CJL
+
+/              FIXED UNPACK <^Z> BUG.  REWROTE ENTIRE INPUT FILE UNPACK ROUTINE.
+/              NOW SUPPORTS ASCII/BINARY INTERNAL FILE MODE FOR LATER USE.  USES
+/              INPUT BUFFER IN FIELD ONE TO ALLOW  MORE  PROGRAM  SPACE.  BUFFER
+/              FIELD DEFINED VIA SYMBOLS TO ALLOW CHANGES IN THE FUTURE.  END OF
+/              FILE CONVENTION IN ASCII MODE NOW INCLUDES SENDING <^Z> CHARACTER
+/              OR  NOT.  ELIMINATED SEPARATE INPUT FILE INITIALIZE ROUTINE;  USE
+/              SPECIAL ROUTINE CALL INSTEAD.
+
+/      018     09-NOV-1987     BUG FIX AND CODE CLEANUP.       CJL
+
+/              FIXED RECEIVE BUG; NOW ALLOW DEV: ON RECEIVE.
+\f/     017     05-NOV-1987     NEW FEATURES.                   CJL
+
+/              CONDITIONAL ASSEMBLY  PARAMETERS  ADDED  FOR MACHINE TYPE (PDP-8,
+/              DECMATE I, DECMATE  II/III/III+),  REMOTE LINE AND LOCAL TERMINAL
+/              INTERFACE DEFINITIONS.
+
+/      016     05-NOV-1987     CODE CLEANUP.                   CJL
+
+/              OPTIMIZATION OF CODE, LITERALS, CONSTANTS.
+
+/      015     04-NOV-1987     BUG FIX.                        CJL
+
+/              INPUT SERVICE ROUTINE ERROR  DOES JMP INSTEAD OF JMS WHEN CALLING
+/              COMMON ERROR HANDLER.
+
+/      014     02-NOV-1987     SOURCE FILE CLEANUP.            CJL
+
+/              SOURCE FILE COSMETICALLY CLEANED UP  AND  RENAMED  TO  K12MIT.PAL
+/              WHICH CONFORMS WITH CUCCA NAMING CONVENTION.    NO  ACTUAL BINARY
+/              CODE CHANGES BEYOND K08V2.  THIS EDIT  HISTORY  ADDED.    ENTRIES
+/              PRIOR TO 014 TRANSCRIBED BY CJL.
+
+/      SINCE THE PDP-12 (AND OTHER 12-BIT DEC MACHINES)  IS  THE INTENDED ENVIRONMENT
+/      FOR THIS PROGRAM, IT IS NOW KNOWN AS KERMIT-12.
+
+/      ASSEMBLING  THE  SOURCE FILE PRODUCES BINARY IDENTICAL TO K08V2.PA  CONFIRMING
+/      THAT SOURCE CLEANUP DOESN'T DAMAGE THE CODING (K08V2 IS NOW OBSOLETE).
+
+/      013     01-OCT-1987     CHANGE TO VERSION 2.0.          R. SCHLERF (RICH)
+
+/              CHANGED  'RKIOT'/'RTIOT'    TO   43/44  REMOTE  LINE  IOT  (LOCAL
+/              PREFERENCE).  CHANGED  'ESCAPE'  CHARACTER  TO  ^]  ('CONX1') FOR
+/              GENERIC CONFORMITY.  ADDED  VERSION/COMMAND BANNER AT STARTUP FOR
+/              MINI-HELP.    INCORPORATED  K278  CHANGES  003-006,  009-010  (NO
+/              INTERRUPTS).  DELETED 'ERRMSG.' NOW USES  'STXERR'  AT 'CLOOP9'+2
+/              FOR PROGRAM SPACE.  TO CONFORM TO  GENERIC KERMIT, "BACK ON PDP8"
+/              MESSAGE  DELETED AND REPLACED WITH BEEP <^G>.   MESSAGE  "SENDING
+/              FILE  XXXXXX.XX  CREATED  ON  DD-MM-YY"  REDUCED TO "SENDING FILE
+/              XXXXXX.XX"  TO CONFORM TO GENERIC KERMIT.  PARITY BIT IS  IGNORED
+/              ON BOTH REMOTE AND TTY LINES.  OUTPUT PARITY IS SET TO SPACE.
+
+/      PROGRAM RENAMED TO K08V2.PA AND MADE AVAILABLE TO CUCCA BY:
+
+/      RICHARD SCHLERF (RICH)
+/      AMERICAN CYANAMID COMPANY
+/      MEDICAL RESEARCH DIVISION
+/      LEDERLE LABORATORIES
+/      BUILDING 190 ROOM 115H
+/      PEARL RIVER, NEW YORK  10965
+/      (914) 732-2186 (09:00 TO 16:00)
+
+/      SINCE  PRIMARY APPLICATION OF K08V2 IS FOR PDP-8 USAGE, THE MODIFICATIONS  NOT
+/      SPECIFIC TO DECMATE II/III FROM K278 WERE MOVED TO THE K08MIT VERSION.  FUTURE
+/      VERSIONS WILL  INCORPORATE  THE  DECMATE  FEATURES AND THUS OBSOLETE ALL OTHER
+/      VERSIONS AT THAT TIME.
+\f/     012     04-JUN-1986     PROGRAM FIX.                    SEPP STADELMANN (SSTA)
+
+/              RE-INITIALIZE VIA 'V30ST' AS ROM SETUP CLEARS COMPOSETABLE, ETC.
+
+/      04-JUN-1986 VERSION RELEASED  TO  CUCCA  BY  MARTYN HEMMINGS (DEC GERMANY) AND
+/      SEPP STADELMANN (DEC SWITZERLAND) OF:
+
+/      DIGITAL EQUIPMENT CORPORATION (DEC)
+/      146 MAIN STREET
+/      MAYNARD, MASS  01754
+/      (617) 897-5111
+
+/      CUCCA RENAMED FILES (KERMIT.PA AND KERCOM.PA) TO K278.PA AND K278COM.PA (WHICH
+/      DOESN'T REALLY CONFORM TO THE NAMING CONVENTION).
+
+/      CUCCA VERSION OF K278.PA FOUND TO BE DEFECTIVE.  FILE REPAIRED BY:
+
+/      CHARLES LASNER (CJL)
+/      CLA SYSTEMS
+/      72-55 METROPOLITAN AVENUE
+/      MIDDLE VILLAGE, NEW YORK  11379-2107
+/      (718) 894-6499
+
+/      REPAIRED FILE (K278.PA) NOW AVAILABLE AT CUCCA.
+
+/      PROGRAM IS NOW  THE DECMATE II/III (III-PLUS) KERMIT ONLY.  HOOKS WERE LEFT IN
+/      FOR PDP-8 VERSION, BUT  NOT  IMPLEMENTED.    K278  DOES  WORK  WITH ADDITIONAL
+/      IMPLEMENTATIONS OF KERMIT, BUT RECEIVE  COMMAND DOES NOT WORK.  PROGRAM YIELDS
+/      RECOVERABLE SYSTEM ERROR/HALT WHEN EXITING TO  FLOPPY-BASED DECMATE II SYSTEM.
+/      CONNECT MODE IS VT200 8-BIT WHICH CONFUSES EVEN/ODD PARITY SYSTEMS.  K278 DOES
+/      NOT SUPPORT SETUP KEY OF DECMATE, BUT IMPLEMENTS SETUP COMMAND.
+
+/      011     04-JUN-1986     NEW FEATURES.                   SSTA
+
+/              'PRQ3' CODE CONDITIONALS.  ROM SETUP COMMAND IMPLEMENTED FOR DMII/III.
+/              AUTOMATIC UPPERCASE SELECT ON RETURN FROM CONNECT.
+
+/      010     13-MAR-1986     BUG FIX.                        MARTYN HEMMINGS (MART)
+
+/              FULL DISK HANDLED WELL.
+
+/      009     13-MAR-1986     BUG FIX.                        MART
+
+/              CLEAN UP BREAK AND GET.
+\f/     008     12-MAR-1986     BUG FIX.                        MART
+
+/              CLEAR  INPUT  CHARACTERS  FROM  COMMUNICATIONS PORT WHEN IN  IDLE
+/              LOOP.
+
+/      007     11-MAR-1986     NEW FEATURES AND BUG FIX.       MARTYN HEMMINGS AND
+/                                                              SSEP STADELMANN
+/                                                              (MART+SSTA)
+
+/              INTERRUPT DRIVEN AND BUG FIX.
+
+/      006     10-MAR-1986     NEW FEATURE.                    MART+SSTA
+
+/              DEVICE PARSE ON GET.
+
+/      005     10-MAR-1986     BUG FIX.                        MART+SSTA
+
+/              NO DATE IN FILE WITH <^Z> INTACT.
+
+/      004     10-MAR-1986     NEW FEATURES AND BUG FIX.       MART+SSTA
+
+/              MAXIMUM  RECEIVE  BUFFER  FIXUP  ('RTERMI'),  15  SECOND TIME-OUT
+/              DURING CONNECT.
+
+/      003     10-MAR-1986     BUG FIX.                        SSTA
+
+/              TWO PAGE HANDLER FIX.
+
+/      K08MIT.PAL  COPIED  TO  DEC  ENGINEERING NETWORK (NODE LSMVAX::) ULTIMATELY TO
+/      EUROPE (NODE VIRGIN::) WHERE PROGRAM BECAME KERMIT.PAL AND KERCOM.PAL.
+
+/      KERMIT.PAL  AND KERCOM.PAL ARE TWO SOURCE FILES ASSEMBLED TOGETHER TO  PRODUCE
+/      THE RUNNING KERMIT-8.  *THEY ARE FOR THE DECMATE II/III/III-PLUS ONLY.*
+
+/      002     18-JUL-1985     ORIGINAL RELEASE.               RANDY HIPPE
+
+/      18-JUL-1985 VERSION RELEASED TO CUCCA BY JERRY SANDS AND RANDY HIPPE OF:
+
+/      BUREAU OF ENGRAVING, INC.
+/      3311 BROADWAY N.E.
+/      MINNEAPOLIS, MN  55413
+/      (612) 623-0900 X218
+
+/      CUCCA  RENAMED  FILE  (KER8.PAL)  TO  K08MIT.PAL  WHICH  CONFORMS  TO   NAMING
+/      CONVENTION OF KERMIT FILES.
+
+/      K08MIT SUPPORTS CONNECT, BYE (REALLY FIN), EXIT, SEND, GET, RECEIVE ONLY.
+
+/      PROGRAM PRONE  TO  GETTING  "CONFUSED" AND OUTPUTS FILE DATE ATTRIBUTE BOTH AS
+/      'CAPAS' BYTE FEATURE  AND  ASCII  TEXT INSERTED INTO CONTENTS OF FILE AHEAD OF
+/      FILE DATA.  COMMAND PROCESSOR ACCEPTS UPPER-CASE COMPLETE COMMANDS ONLY.  <^C>
+/      ABORT FEATURE TAKES VERY LONG TIME TO ACT (IF AT ALL!).  MANY KERMITS WILL NOT
+/      WORK WITH K08MIT;  HOWEVER, K08MIT WAS TESTED SUCCESSFULLY WITH KERMIT-20.
+
+/      001     30-JUL-1984     FIRST VERSION (KER8.PAL).       JERRY SANDS
+\f/     HARDWARE HINTS AND KINKS.
+
+
+/      KERMIT-12 REQUIRES THE FOLLOWING STANDARD OS/8 FAMILY CONFIGURATION:
+
+/      PDP-8 FAMILY MEMBER WITH AT LEAST 8K MEMORY.
+
+/      OS/8 SYSTEM DEVICE (WITH OS/8 FAMILY OPERATING SYSTEM RESIDENT).
+
+/      KL8-COMPATIBLE CONSOLE INTERFACE.
+
+/      7/8-BIT ASCII EXTERNAL CONSOLE TERMINAL DEVICE (TTY:).
+
+/      KL8-COMPATIBLE REMOTE INTERFACE TO OTHER KERMIT.
+
+/      NOTE:  ASSEMBLY  PARAMETERS  OF  KERMIT-12  ALLOW FOR LOCAL KERMIT CONTROLLING
+/      TERMINALS TO BE OTHER  THAN  THE  PRIMARY  OS/8  CONSOLE  DEVICE.   THE ACTUAL
+/      HARDWARE MUST STILL CONFORM TO  THE  SAME REQUIREMENTS (THE DEVICE CODES WOULD
+/      THEN BE USER-SPECIFIED AND DIFFER FROM  THE  STANDARD  03/04)  AS THE STANDARD
+/      CONSOLE INTERFACE AND TERMINAL.
+
+/      SPECIAL DECMATE CONSIDERATIONS:
+
+/      DECMATE  USAGE IS USUALLY OBTAINED BY  ASSEMBLING  FOR  THE  STANDARD  CONSOLE
+/      DEVICE  (03/04),  AS  THE  BUILT-IN  FIRMWARE/SLUSHWARE  OF  THE  DECMATES  IS
+/      SUFFICIENTLY COMPATIBLE WITH THE PDP-8 HARDWARE FOR KERMIT-12'S  REQUIREMENTS.
+/      (THE ONLY OTHER ACCEPTABLE CONSOLE DEVICE ON THE DECMATE IS THE PRINTER PORT.)
+
+/      DECMATE  REMOTE  COMMUNICATIONS  PORTS  ARE    *RADICALLY*    DIFFERENT   FROM
+/      KL8-COMPATIBLE PORTS.  THESE ARE HANDLED AUTOMATICALLY BY ONCE-ONLY CODE WHICH
+/      DETECTS  THE  USAGE  OF  KERMIT-12  ON  THE    SPECIFIC  DECMATE  SYSTEM,  AND
+/      SELF-CONFIGURATION AS APPROPRIATE.  THERE IS ONE EXCEPTION  TO THIS, NAMELY IF
+/      THE COMMUNICATIONS PORT CODE IS ASSEMBLED FOR THE PRINTER  PORT  (32/33), THEN
+/      THE PRINTER PORT, *NOT* THE COMMUNICATIONS PORT WILL BE USED.    THE  STANDARD
+/      ASSEMBLY  OF  KERMIT-12 IS FOR A PDP-8 WITH DEVICE 40/41 COMMUNICATIONS  PORT.
+/      THIS DESIGNATED VERSION WILL SELF-CONFIGURE WHEN EXECUTED ON A DECMATE.
+\f/     CONFIGURATION RESTRICTIONS:
+
+/      WHEN  INTERRUPTS  ARE SUPPORTED AGAIN, DEVICES SUCH AS THE TD-8/E WON'T  WORK.
+/      THE  NON-INTERRUPT  VERSION  SHOULD WORK TO 19200 BAUD ON THE PDP-8/E CPU,  SO
+/      THIS  SHOULD NOT BE A PROBLEM.  INTERRUPT-DRIVEN VERSIONS OF KERMIT-12 MUST BE
+/      RUN ONLY  ON  SYSTEMS  WHERE  *ALL*  INTENDED  DEVICES CAN HAVE THEIR HANDLERS
+/      INTERRUPTED BY THE CONSOLE AND REMOTE LINE INTERRUPT HANDLERS.  WHEN IN DOUBT,
+/      THE NON-INTERRUPT VERSION MUST BE USED (CURRENTLY THE ONLY VERSION).
+
+/      IF FLOW CONTROL IS  DISABLED  (DUE  TO  XON/XOFF  BEING  UNAVAILABLE) THEN THE
+/      CONSOLE BAUD RATE MUST MEET  OR  EXCEED  THE  REMOTE LINE RATE.  THE USER MUST
+/      TAKE MINIMAL CARE NOT TO OVERLOAD  THE  INTERNAL BUFFERS OF KERMIT-12, AS THIS
+/      WILL YIELD THE ERROR MESSAGE:  KEYBOARD INPUT ERROR!
+
+/      THIS IS NOT LIKELY TO OCCUR UNLESS  ONE  "PLAYS"  WITH  A  KEYBOARD  WHICH CAN
+/      GENERATE NUMEROUS ESCAPE SEQUENCES AS THE BUFFERS ARE  QUITE  ADEQUATE FOR ALL
+/      REASONABLE TERMINAL APPLICATIONS.  SIMILARLY, IF THE REMOTE LINE DOES NOT OBEY
+/      XON/XOFF  PROTOCOL  (WHILE  KERMIT-12  HAS  IT  ENABLED), THEN INTERNAL BUFFER
+/      OVERFLOW WILL YIELD THE ERROR MESSAGE:  REMOTE LINE INPUT ERROR!
+
+/      THESE ERRORS ARE EXTREMELY UNLIKELY AND CAN ONLY BE CREATED BY  MISUSE OF FLOW
+/      CONTROL (THE ONLY EXCEPTION TO THIS IS THE ATTEMPT TO USE KERMIT-12  WITH  THE
+/      CONSOLE  BAUD  RATE  SLOWER  THAN  THE REMOTE LINE BAUD RATE WITH FLOW CONTROL
+/      DISABLED).  IF FLOW CONTROL IS ENABLED AND OBEYED THEN THE BUFFERING OF REMOTE
+/      LINE INPUT  WILL  OCCUR  WHILE SHORT PAUSES OCCUR ON THE CONSOLE (ASSUMING THE
+/      USER FREEZES/UNFREEZES THE  DISPLAY OFTEN AND THE CONSOLE DISPLAY BAUD RATE IS
+/      FASTER THAN THE REMOTE LINE BAUD RATE) WITH PRACTICALLY NO REMOTE LINE DELAY.
+
+/      FLOW CONTROL IS NOT  YET  SUPPORTED  DURING KERMIT TRANSFERS.  SINCE KERMIT-12
+/      DOES  NOT SUPPORT SLIDING WINDOWS,  KERMIT-12  WILL  NEVER  GENERATE  OUTGOING
+/      XON/XOFF SEQUENCES.  FUTURE REVISIONS WILL  SUPPORT INCOMING XON/XOFF FROM THE
+/      REMOTE KERMIT.  XON/XOFF PROTOCOL DURING CONNECT  MODE IS COMPLETELY AVAILABLE
+/      AT THE USER'S OPTION.
+
+/      CONSOLE TERMINALS ARE REQUIRED TO SUPPORT "GLASS TTY:"  FEATURES,  I.E.    THE
+/      PRINTING ASCII CHARACTER SET (LOWER-CASE DESIRABLE) AND THE CONTROL CHARACTERS
+/      <CR>, <LF>, AND <BEL> (THE LAST FOR VARIOUS AUDIBLE REPORTS  ONLY).  TERMINALS
+/      LACKING LOWER-CASE  SUPPORT  SHOULD "FOLD" LOWER-CASE CHARACTERS TO UPPER-CASE
+/      AUTOMATICALLY.  TERMINALS  SUCH  AS  THE VT05 CAN HAVE THE KEYBOARD LOWER-CASE
+/      ENABLED, AS KERMIT-12 SUPPORTS  OPTIONAL  OUTPUT FOLDING.  THE UPPER-CASE ONLY
+/      OPTION SHOULD BE ENABLED FOR  TERMINALS WHICH IGNORE LOWER-CASE INPUT FROM THE
+/      HOST,  AS KERMIT-12 GENERATES NUMEROUS LOWER-CASE  MESSAGE  CHARACTERS  (WHICH
+/      BECOME UPPER-CASE IF THIS OPTION IS SET).   THE <BS> CHARACTER IS REQUIRED FOR
+/      VISUAL  RUBOUT  (<BS>  <SPACE>  <BS>)  ONLY.   FUTURE  VERSIONS  WILL  SUPPORT
+/      HARD-COPY BACKSPACE TO REMOVE THIS REQUIREMENT.  ALL TERMINAL  FEATURES  (SUCH
+/      AS ACTUAL VT-100 FUNCTIONALITY) ARE FREELY PASSED TO THE HOST  DURING  CONNECT
+/      MODE;  THE ONLY CHARACTER ACTUALLY RESERVED IS THE ESCAPE CHARACTER WHICH WILL
+/      BE  TREATED  AS  A SEVEN-BIT CHARACTER ONLY.  IF THE USER PRESSES  THE  ESCAPE
+/      CHARACTER TWICE,  THEN  THE  SEVEN-BIT REPRESENTATION OF THE CHARACTER IS SENT
+/      ONCE;  THERE  IS  NO  WAY  TO SEND THE ESCAPE CHARACTER WITH THE HIGH-BIT SET.
+/      SINCE THE ESCAPE CHARACTER  ITSELF  CAN  BE SET TO ALMOST ANY SEVEN-BIT VALUE,
+/      THIS SHOULD NOT BE A SERIOUS LIMITATION.  TERMINALS THAT DON'T "BEEP" WHEN THE
+/      <BEL> CHARACTER IS SENT SHOULD NOT  OUTPUT  A  PRINTABLE RENDITION OF THE <^G>
+/      CHARACTER, AS THIS WOULD DISRUPT THE TERMINAL OUTPUT AND INTERNAL COLUMN COUNT
+/      DURING VARIOUS MESSAGE SEQUENCES, ETC.
+\f/     KL-8/E INTERFACES SHOULD BE SETUP WITH THE FOLLOWING STANDARD SETTINGS:
+
+/      1 STOP BIT ABOVE 110 BAUD WITH 8 BITS DATA.
+
+/      FUNCTIONAL  BAUD RATES INCLUDE 110, 150, 300, 600,  1200,  2400,  4800,  9600,
+/      19200, 38400 AND 76800.  2400 BAUD REQUIRES A  REVISION  "B"  OR  BETTER M8650
+/      MODULE  (IF  ONE  USES  DEC'S  DOCUMENTATION  OF AVAILABLE SPLIT-LUG OPTIONS).
+/      ACTUAL  BAUD  RATES  UP TO APPROXIMATELY 100 KBAUD SHOULD WORK WHEN  KERMIT-12
+/      BECOMES  INTERRUPT-DRIVEN.    RATES  OTHER THAN 110 BAUD REQUIRE A 19.6608 MHZ
+/      BAUD-RATE OSCILLATOR.
+
+/      THE BAUD  RATES STATED ABOVE ARE ACTUALLY AVAILABLE ON THE KL-8/E, BUT REQUIRE
+/      A SINGLE SOLDER  JUMPER  TO  IMPLEMENT  THE  PROPER BAUD RATE ABOVE 2400 BAUD.
+/      CHANGING BAUD-RATE GENERATOR CRYSTALS  WILL  PRODUCE OTHER RATES AS NECESSARY.
+/      (SEND INQUIRIES  TO CLA SYSTEMS FOR INFORMATION REGARDING KL-8/E MODIFICATIONS
+/      INCLUDING UPGRADED BAUD-RATE  OSCILLATORS,  ETC.) KERMIT-12 HAS BEEN TESTED TO
+/      9600 BAUD AND SHOULD WORK TO 19200 BAUD (AS OF THE CURRENT VERSION).
+
+
+/      KL8-J/A INTERFACES SHOULD BE SETUP WITH THE FOLLOWING STANDARD SETTINGS:
+
+/      1 STOP BIT ABOVE 110 BAUD WITH 8 BITS DATA NO PARITY.
+
+/      FUTURE  VERSIONS  OF KERMIT-12 WILL SUPPORT VARIOUS SOFTWARE-GENERATED  PARITY
+/      OPTIONS.  THE FRAMING AND OVERRUN ERRORS CAN BE ENABLED AND WILL EVENTUALLY BE
+/      SUPPORTED (BUT THE PARITY GENERATOR SHOULD BE DISABLED TO PREVENT  INTERACTION
+/      WITH THE SOFTWARE USE OF PARITY GENERATION/DETECTION).
+
+/      ALL BAUD RATES ARE SUPPORTABLE:
+
+/      110, 150, 300, 600, 1200, 2400, 4800, 9600, 19200.
+
+/      19200 BAUD IS ACHIEVED BY CUTTING JUMPER "W2" AND ADDING JUMPER  "W5" AND THEN
+/      SETTING THE BOARD FOR WHAT IS NORMALLY 9600 BAUD.  A WESTERN DIGITAL TR-1602-B
+/      OR  EQUIVALENT  UART  IS  REQUIRED TO SUPPORT 19200 BAUD;  MOST OF THE  RECENT
+/      PRODUCTION  DEC M8655 BOARDS USE THE SMC COMM 2017 UART WHICH MEETS OR EXCEEDS
+/      THIS REQUIREMENT.   EARLY  M8655 BOARDS USE GI UARTS IN CERAMIC PACKAGES WHICH
+/      *CANNOT* BE USED AT 19200 BAUD (MANY ARE FLAKY AT 9600 BAUD!).
+
+/      RECEIVE BAUD RATE SHOULD  BE IDENTICAL TO TRANSMIT BAUD RATE.  (DO NOT SET THE
+/      RECEIVE=150 BAUD SWITCH!)
+\f/     OTHER INTERFACES:
+
+/      DKC-8/A (8/A OPTION BOARD #1)  INTERFACES  SHOULD  BE SETUP AS PER THE KL8-J/A
+/      SPECIFICATIONS INCLUDING THE REQUIREMENTS OF THE UART.  SOME DEC DOCUMENTATION
+/      INDICATED A PROHIBITION ON THE USE OF  19200 BAUD, BUT THIS IS OBVIATED BY THE
+/      USE OF THE SAME UARTS AS IN THE KL8-J/A.
+
+/      EARLIER DEVICES SUCH AS PT08, DP-12, KL-8/F OR DC02 (CHANNEL ZERO ONLY) SHOULD
+/      WORK CORRECTLY AS FACTORY WIRED (MOST OF THESE DEVICES  DO NOT SUPPORT OPTIONS
+/      KERMIT-12  WOULD  REQUIRE  TO  BE  DISABLED  ANYWAY.    THESE  INCLUDE  PARITY
+/      GENERATION,  FRAMING  ERROR  DETECTION,  ETC.).  TO UTILIZE THESE DEVICES, THE
+/      ASSEMBLY PARAMETERS  FOR  USER DEVICES AND THEIR RESPECTIVE DEVICE CODE VALUES
+/      SHOULD BE GIVEN  DURING  ASSEMBLY  (SEE ASSEMBLY INSTRUCTIONS).  PROPER DEVICE
+/      CODE VALUES MUST BE  OBTAINED  FOR  THE  SELECTED INTERFACE, AS THERE ARE MANY
+/      ACTUAL POSSIBILITIES.  (DP-12 DEVICES  ARE  GENERALLY DEVICE 40/41;  PT08/DC02
+/      INTERFACES ARE GENERALLY DEVICE 11/12, ETC.)
+\f/     ASSEMBLY INSTRUCTIONS.
+
+/      KERMIT-12 CAN BE ASSEMBLED BY EITHER OF TWO METHODS:
+
+
+/      P?S/8 METHOD:
+
+/      ASSUMING THE EXTENDED-LENGTH FILE KERM12 IS  THE  SOURCE  FILE,  THE FOLLOWING
+/      COMMAND WILL PRODUCE A FULLY ORNAMENTED LISTING:
+
+/      .PAL KB1,KB2,KB3,KB4<KERM12(ACEJLMNPQSX8)
+
+/      OPTION SWITCH BREAKDOWN:
+
+/      /A      ALL SYMBOLS IN SYMBOL PRINTOUT.
+
+/      /C      OPTIMIZE  CORE  DURING ASSEMBLY FOR MORE SYMBOLS,  LESS  BUFFERS.
+/              THIS OPTION SHOULD BE DELETED IF MORE THAN  8K  IS  AVAILABLE FOR
+/              ASSEMBLY.
+
+/      /E      FORGET LITERAL BOUNDARIES WHEN LEAVING THE CURRENT PAGE.
+
+/      /J      *DO NOT* TERMINATE TEXT STRINGS WITH EXTRA ZERO WORD.
+
+/      /L      PERFORM SECOND-PASS LISTING.
+
+/      /M      CHAIN TO MAP FOR BITMAP OUTPUT AT END OF ASSEMBLY.
+
+/      /N      ENABLE NEATNESS ADORNMENTS TO LISTING OUTPUT.
+
+/      /P      ENABLE PRINTER-ORIENTED (WIDE MODE) LISTING OUTPUT.
+
+/      /Q      ENABLE LITERALS ONLY, GENERATED LINKS ARE ERRORS.
+
+/      /S      ENABLE SYMBOL TABLE PRINTOUT.
+
+/      /X      ENABLE CROSS-REFERENCE OUTPUT AT END OF ASSEMBLY.
+
+/      /8      ENABLE FULL SYMBOL TABLE INCLUDING LINC MODE CROSS ASSEMBLY.
+
+/      THE NUMBER OF BINARY FILES REQUIRED (KB1, KB2, KB3, ETC.) IS  TO BE DETERMINED
+/      AT ASSEMBLY TIME, AS KERMIT-12 WILL TEND TO GROW LARGER AS FEATURES ARE ADDED.
+
+/      P?S/8 PAL IS THE PREFERRED METHOD  OF ASSEMBLING K12MIT DURING DEVELOPMENT DUE
+/      TO SUPERIOR ERROR DIAGNOSTICS AND OVERALL SPEED.   K12MIT COULD GROW TO A SIZE
+/      BEYOND THE CAPABILITIES OF OS/8 CREF.  THIS  LIMITATION  CANNOT  APPLY  TO THE
+/      P?S/8 DEVELOPMENT ENVIRONMENT.
+
+/      P?S/8 PAL CAN PRODUCE A LISTING OF K12MIT, BUT THE BINARY FILES CREATED BY THE
+/      ASSEMBLY  MUST BE TRANSFERRED TO AN OS/8 ENVIRONMENT FOR USE, SINCE K12MIT (AS
+/      SPECIFICALLY WRITTEN) IS FOR THE OS/8 FAMILY OF SYSTEMS ONLY.
+
+/      NOTE:  P?S/8 IS *NOT* A DEC PRODUCT;  IT IS SOLD COMMERCIALLY AND IS AVAILABLE
+/      FREE  OF  CHARGE (EXCEPT FOR MEDIA HANDLING CHARGES, ETC.) *ONLY* TO QUALIFIED
+/      INSTITUTIONS.  CONTACT CJL FOR ADDITIONAL INFORMATION ON ACQUIRING P?S/8.
+\f/     OS/8 FAMILY OF SYSTEMS METHOD:
+
+/      K12MIT.PA CAN BE ASSEMBLED WITH PAL8 VERSION B0 WHICH IS AVAILABLE FROM  DECUS
+/      AS PART OF THE OS/278 RELEASE.  PAL8 VERSION B0 WILL RUN ON  ANY  OS/8  FAMILY
+/      SYSTEM,  AS  IT  HAS  NO  HARDWARE  DEPENDENCIES  BEYOND  THE  ORIGINAL  PDP-8
+/      REQUIREMENT (NO BSW OR IAC ROTATE OR CAF OR R3L INSTRUCTIONS AS WAS INTENDED).
+/      THIS ALSO APPLIES TO CREF  VERSION B0 WHICH IS REQUIRED WHEN A CROSS-REFERENCE
+/      IS REQUESTED.  PAL8 VERSION B0  AND  CREF  VERSION B0 ARE AVAILABLE AS PART OF
+/      THE KERMIT-12 DISTRIBUTION AS K12PL8.ENC AND K12CRF.ENC RESPECTIVELY.  SEE THE
+/      DOCUMENTATION OF K12DEC FOR INFORMATION ON PRODUCING PAL8.SV  AND CREF.SV FROM
+/      THESE ENCODED FILES.
+
+/      ASSUMING CCL IS ENABLED, THE FOLLOWING COMMAND WILL PRODUCE A BINARY AND FULLY
+/      ORNAMENTED LISTING:
+
+/      .PAL DEV:K12MIT.BN,DEV:K12MIT.LS,DEV:KSCR.TM<DEV:PARAM.PA,DEV:K12MIT.PA(CEFMW)
+
+/      DEV:  IS THE APPLICABLE DEVICE WHERE THE FILES RESIDE.    STANDARD  EXTENSIONS
+/      ARE  ASSUMED  (.BN  FOR  BINARY, .LS FOR LISTING, .PA FOR PAL  SOURCE).    THE
+/      KSCR.TM  TEMPORARY  OUTPUT FILE SPECIFICATION IS OPTIONAL, BUT IS DEFAULTED TO
+/      SYS:CREFLS.TM IF  NOT  EXPLICITLY GIVEN.  MANY SYSTEM DEVICES ARE TOO SMALL TO
+/      SUPPORT THIS TEMPORARY  FILE,  THUS  THE  FILE  MAY  BE  DIRECTED  TO  ANOTHER
+/      AVAILABLE DEVICE WITH SUFFICIENT SPACE.
+
+/      THE PARAM.PA FILE IS OPTIONAL AND USED TO PASS SHORT USER PARAMETERS, ETC.  TO
+/      THE ASSEMBLY.
+
+/      OPTION SWITCH BREAKDOWN:
+
+/      /C      CHAIN TO CREF.SV TO PRODUCE A CROSS-REFERENCED LISTING FILE.
+
+/      /E      GENERATED LINKS ARE ERRORS.
+
+/      /F      *DO NOT* TERMINATE TEXT STRINGS WITH EXTRA ZERO WORD.
+
+/      /M      USE MAMMOTH SYMBOL TABLE OPTION FOR CREF.
+
+/      /W      FORGET LITERAL BOUNDARIES WHEN LEAVING THE CURRENT PAGE.
+
+/      LOADING INSTRUCTIONS:
+
+/      .LOAD DEV:K12CLR,K12MIT.BN      THIS LOADS THE BINARY CLEAR AND KERMIT
+/      .SAVE DEV K12MIT.SV=1           THIS SAVES THE CORE IMAGE
+
+/      THE  JOB STATUS WORD (=1) INDICATED THAT K12MIT.SV LOADS INTO 10000-11777, BUT
+/      SHOULD NOT BE SAVED/RESTORED  WHEN  THE  USR  IS  LOADED  OVER  THIS  AREA  OR
+/      DISMISSED (THE USR IS ACTUALLY  NEVER  DISMISSED  IN NORMAL K12MIT OPERATION).
+/      OTHER BITS MAY BE SET AT  THE  USER'S  OPTION,  BUT  ARE UNNECESSARY;  THE BIT
+/      INDICATED SERVES ONLY TO REDUCE SYSTEM OVERHEAD  REGARDING  THE DISPOSITION OF
+/      10000-11777.  THE  BINARY  FILE  K12CLR.BN  (CREATED  BY ASSEMBLING K12CLR.PA)
+/      LOADS ZEROES INTO ALL  OF  MEMORY  TO  CREATE A "CLEAN" CORE IMAGE FILE, WHICH
+/      MAKES THE ENCODED BINARY FILE SMALLER DUE TO REPEAT COMPRESSION.
+\f/     PASSING SHORT PARAMETER FILES.
+
+/      WHEN INSERTING A SHORT USER MODIFICATION FILE IN THE INPUT STREAM  (PARAM.PAL)
+/      THE FOLLOWING SHOULD BE NOTED:
+
+/      ALWAYS  PUT  THE  SHORT  PARAMETER  FILE  (CONTAINING EQUATED SYMBOLS SUCH  AS
+/      USER=1, ETC.) IN FRONT OF K12MIT.PAL.
+
+/      IF TTY:  IS USED FOR DIRECT TYPE-IN OF THESE  PARAMETERS, THE INFORMATION NEED
+/      ONLY BE TYPED ENDING WITH <^Z> DURING PASS 1.  SUBSEQUENT  PASSES  REQUIRE THE
+/      ENDING <^Z> ONLY.  IF THIS METHOD IS USED, A LISTING WITHOUT  THE  USER  INPUT
+/      WHICH  DID THE CUSTOMIZING OF KERMIT-12 CAN BE CREATED.  NOTE:  IF  BINARY  IS
+/      GENERATED BY THE CONTENTS OF THE PARAMETER FILE (SUCH AS USE OF THE LOCAL TEXT
+/      MESSAGE,  ETC.),  THE  INFORMATION MUST BE TYPED IN DURING PASS 2.  THE PASS 3
+/      LISTING MAY  CONTAIN  THE INFORMATION IF SO DESIRED, REQUIRING A REPETITION OF
+/      THE INPUT.   PASS  1  INPUT  OF  THE INFORMATION IS EFFECTIVELY IGNORED, AS NO
+/      DEFINITIONS ARE CREATED ('LCLMSG' IS DEFINED ELSEWHERE, ETC.).
+
+/      EXPERIENCED PDP-8 USERS NEW TO PAL8 VERSION B0 TAKE SPECIAL NOTICE:
+
+/      DUE TO HARDWARE LIMITATIONS OF THE DECMATES, THE KEYBOARD FLAG WILL BE CLEARED
+/      DURING PDP-8 PAL8 B0 OPERATION.  THE KL8E TTY:  HANDLER WILL NO LONGER BE ABLE
+/      TO BUFFER <^Z> DURING THE ASSEMBLY;  YOU MUST  WAIT UNTIL THE HANDLER ACCESSES
+/      THE KEYBOARD ON EACH PASS *THEN* PRESS <^Z> TO CONTINUE THE ASSEMBLY.
+
+
+/      CREATING A CUSTOM MESSAGE FROM THE PARAMETER FILE.
+
+/      IF  SO  DESIRED,  A CUSTOM LOCAL HEADER MESSAGE MAY BE ADDED BY INSERTING  THE
+/      FOLLOWING INTO THE PARAMETER FILE:
+
+/      BUFFLD= 10              /THESE PROBABLY
+/      FILBUFF=2000            /WON'T CHANGE!
+
+/      GENMSG= 0               /DON'T GENERATE STANDARD (NULL) MESSAGE
+/      UMSG=   0               /DON'T GENERATE STANDARD (DUMMY) USER MESSAGE
+
+/      FIELD   BUFFLD%10       /FIELD FOR TEXT MESSAGE
+
+/      *FILBUFFER              /LOCAL MESSAGE LOADS THERE
+
+/LCLMSG,TEXT   "%^I^NSERT ^L^OCAL ^M^ESSAGE ^H^ERE!%"
+
+/      ZBLOCK  LCLMSG+40-.     /ZERO REST OF MESSAGE AREA
+
+/      TEXT IS IN  UPPER/LOWER-CASE  SIXBIT  WITH  '^'  MEANING SHIFT CASE (INITIALLY
+/      LOWER-CASE) AND '%' MEANING <CR>, <LF>.
+\f/     OTHER METHODS:
+
+/      KERMIT-12  *CANNOT*  BE ASSEMBLED  BY  PAL10  (LAST  KNOWN  VERSION  OF  PDP-8
+/      CROSS-ASSEMBLER FOR TOPS10 (142)) BECAUSE IT LACKS CERTAIN FEATURES:
+
+/      DOES NOT SUPPORT 'RELOC' PSEUDO-OP.
+
+/      DOES NOT SUPPORT PAGE ZERO  REDEFINE  (CAUSES  "Z" ERROR ON SOURCE FILES WHICH
+/      DON'T HAVE ERRORS WHEN ASSEMBLED BY EITHER P?S/8 PAL OR OS/8 PAL8).
+
+/      INCORRECTLY HANDLES 'ZBLOCK' PSEUDO-OP (LEADS TO  "Q"  ERROR  ON  SOURCE FILES
+/      WHICH DON'T HAVE ERRORS WHEN ASSEMBLED BY EITHER P?S/8 PAL OR OS/8 PAL8).
+
+/      DOES NOT SUPPORT LITERAL "FORGETTING" (P?S/8 PAL OPTION /E OR OS/8 PAL8 OPTION
+/      /W) WHICH IS REQUIRED FOR DEFINING OVERLAY AREAS, ETC.
+
+/      DOES NOT SUPPORT TEXT WITHOUT ZERO WORD FILL (P?S/8 PAL OPTION /J OR OS/8 PAL8
+/      OPTION /F FULFILLS THIS REQUIREMENT) WHICH IS REQUIRED FOR TEXT MESSAGES.
+
+
+/      P?S/8 PAL IS AN IMPROPER SUPERSET OF PAL10.  PAL10 SUPPORTS MACRO-8 MODE AS AN
+/      OPTION AND AUTOMATIC FIELD DUMP BITMAPS;  ALL OTHER KNOWN PAL10 FEATURES EXIST
+/      IN  P?S/8  PAL  INCLUDING  THE  SUPPORT  OF  THE  AUTOMATIC FIELD DUMP  BITMAP
+/      PSEUDO-OPS ('ENBITS' AND 'NOBITS').
+
+/      OS/8  PAL8 (VERSION B0) IS A SUBSET OF P?S/8 PAL WHICH HAS  SEVERAL  SYNTACTIC
+/      QUIRKS (WHICH  ARE AVOIDABLE, BUT NONETHELESS ARE INCOMPATIBLE WITH BOTH P?S/8
+/      PAL  AND  PAL10    IN  CERTAIN  MINOR  WAYS);    REGARDLESS,  PAL8  LACKS  THE
+/      COMPATIBILITY PROBLEMS OF PAL10.
+
+/      MAINTAINING SOURCE COMPATIBILITY.
+
+/      KERMIT-12 SOURCE FILE CONVENTIONS DEMAND THE USE OF THE COMMON SUBSET OF P?S/8
+/      PAL AND OS/8 PAL8 (VERSION  B0).    CERTAIN  FORMS  OF  STATEMENTS  SHOULD  BE
+/      AVOIDED:
+
+/      TAD                     /NOT LEGAL IN PAL8
+/      0+TAD                   /NOT LEGAL IN PAL10, AND POSSIBLY WRONG IN PAL8
+/      TAD     (3)+1           /GENERATES SAME AS "TAD (3+1)" IN PAL8
+/      -A!-B                   /UNARY OPERATOR HANDLED WRONG IN PAL8
+/      I+N                     /NOT LEGAL IN PAL8
+/      N+I                     /NOT LEGAL IN PAL8
+/      I I                     /NOT LEGAL IN PAL8
+
+/      THIS  REQUIREMENT IS EASILY MET BY  KERMIT-12  AS  MOST  OF  THESE  CASES  ARE
+/      ESOTERIC QUIRKS AND NOT NEEDED FOR THIS ASSEMBLY.
+
+/      THE RESTRICTIONS OF PAL10 (EVEN THOUGH IT  HAS  OTHER DESIRABLE FEATURES, MOST
+/      OF WHICH IT SHARES WITH P?S/8 PAL) ARE  TOO SEVERE TO ALLOW USABLE ASSEMBLY OF
+/      THIS  PROGRAM.    BETTER  CROSS-ASSEMBLERS  MAY  EXIST  ELSEWHERE  WHICH   ARE
+/      SOURCE-COMPATIBLE WITH KERMIT-12.
+\f/     USE OF P?S/8 LANGUAGE EXTENSIONS.
+
+/      P?S/8 OFFERS SEVERAL USEFUL FEATURES OVER PAL8 (AND PAL10) WHICH MAY BE USEFUL
+/      FOR  ASSEMBLY  DEVELOPMENT OF KERMIT-12.  THESE INCLUDE LANGUAGE ELEMENTS SUCH
+/      AS "TAD (3)+1" HANDLED CORRECTLY, OR PSEUDO-OPS SUCH AS "PAUSE EXPR" WHERE THE
+/      VALUE OF 'EXPR'  WILL  BE  DISPLAYED ON THE SYSTEM CONSOLE DURING THE ASSEMBLY
+/      WHEN THAT POINT IN  THE  ASSEMBLY  IS  REACHED.   TO ACCESS THESE FEATURES AND
+/      STILL  PROVIDE COMPATIBILITY WITH PAL8  (VERSION  B0),  THE  FOLLOWING  CODING
+/      TECHNIQUE IS SUGGESTED:
+
+
+/      IFNDEF  PQS     <PQS=0> /WILL BE 0 ON PAL8, PAL10
+
+
+/      IFZERO  PQS     <       /DO PAL8, ETC. STUFF HERE
+
+/      FOO=    (TABLE)         /DEFINE POINTER TO ADDRESS OF TABLE
+
+/      TAD     FOO-1           /GET (POINTER TO ADDRESS OF TABLE)-1
+/      DCA     XR1             /SETUP AUTO-INDEX REGISTER
+
+/      WISH WE HAD PAUSE AND ERROR PSEUDO-OPS IN PAL8.
+
+/                      >       /END OF PAL8, ETC. VARIANT
+
+
+/      IFNZRO  PQS     <       /DO P?S/8 PAL STUFF HERE
+
+/      TAD     (TABLE)-1       /GET (POINTER TO ADDRESS OF TABLE)-1
+/      DCA     XR1             /SETUP AUTO-INDEX REGISTER
+
+/      IFNDEF  PASS    <PASS=0>/DEFINE PASS VARIABLE
+
+/      PASS=   PASS+1          /BUMP EVERY ASSEMBLER PASS
+
+/      PAUSE   PASS            /DISPLAY PASS NUMBER
+
+/      IFNZRO  .&4000  <
+
+/      ERROR   1234            /DISPLAY ERROR MESSAGE IF THERE ARE PROBLEMS
+
+/                      >
+
+/                      >       /END OF P?S/8 PAL VARIANT
+
+
+/      THIS ALLOWS TEMPORARY DEVELOPMENT FEATURES OR  PERMANENT ELEMENTS WHICH MAY BE
+/      MORE ELEGANTLY EXPRESSED IN P?S/8 PAL VARIANT  CODING, WHILE THE PAL8 (VERSION
+/      B0) VERSION CAN STILL BE USED (VIA DIRECT  OCTAL,  MULTIPLE EQUATE STATEMENTS,
+/      CONDITIONAL FLUSH AS IN THE ABOVE EXAMPLE, ETC.   AS  NECESSARY)  FOR STANDARD
+/      ASSEMBLY OF KERMIT-12.
+\f/     ASSEMBLY PARAMETERS.
+
+/      SEVERAL  PARAMETERS  MUST  BE  CHANGED  WITHIN  K12MIT.PA  (OR  PASSED TO  THE
+/      ASSEMBLER VIA A SHORT FILE INSERTED INTO THE ASSEMBLY STREAM BEFORE  THE  MAIN
+/      FILE):
+
+/      SETTING  KEY= [RECEIVE IOT CODE FOR  CONSOLE  KEYBOARD]  DEFINES  THE  CONSOLE
+/      KEYBOARD IOT CODE (DEFAULT IS 03).
+
+/      SETTING  TTY=  [TRANSMIT  IOT CODE FOR CONSOLE  OUTPUT]  CHANGES  THE  CONSOLE
+/      PRINTER IOT CODE (DEFAULT IS 04).
+
+/      THE FOLLOWING DEFINITIONS ARE  ESSENTIALLY  FOR  KL8-TYPE DEVICES ONLY, AS THE
+/      CODE DEMANDS KL8 HARDWARE COMPATIBILITY.    MODELS  OTHER  THAN PDP-8 (SUCH AS
+/      DECMATE) GENERALLY EITHER PLACE RESTRICTIONS ON  AVAILABLE  INTERFACES  (OTHER
+/      SOFTWARE DESIGNATES A SERIAL INTERFACE AS A  LOGICAL  PRINTER  PORT;  DECMATES
+/      SUPPORT A FIRMWARE "PRINT SCREEN" KEY WHICH ENFORCES  THIS.),  OR  DON'T ALLOW
+/      USABLE PLUG-IN OPTIONS.
+
+/      IGNORING BUILT-IN DECMATE SUPPORT, THE FOLLOWING PARAMETERS ARE ACTIVE:
+
+/      SETTING DEV30=  1       CREATES DEVICE 30/31 REMOTE LINE IOTS.
+
+/      SETTING DEV40=  1       CREATES DEVICE 40/41 REMOTE LINE IOTS.
+
+/      SETTING LEDERLE=1       CREATES DEVICE 43/44  REMOTE  LINE  IOTS (AND A CUSTOM
+/                              HEADER).
+
+/      SETTING ORIGNAL=1       CREATES  DEVICE  33/34  REMOTE   LINE  IOTS  (ORIGINAL
+/                              SETTINGS).
+
+/      SETTING SPRINT= 1       CREATES DEVICE 32/33 REMOTE LINE  IOTS (SERIAL PRINTER
+/                              PORT).
+
+/      SETTING USER=   1       CREATES DEVICE XX/XY REMOTE LINE IOTS.
+
+/      IF NONE OF THESE ARE SET, THEN DEV40=1 APPLIES BY DEFAULT.
+
+
+
+/      SETTING USER=   1       REQUIRES THE USER TO DEFINE TWO ADDITIONAL VALUES:
+
+/              XX=     [RECEIVE IOT DEVICE CODE] (DEFAULT IS 40).
+
+/              XY=     [TRANSMIT IOT DEVICE CODE] (DEFAULT IS 41).
+\f/     SETTING SPRINT= 1       INHIBITS THE BUILT-IN CHECK FOR DECMATE  OPERATION AND
+/                              USES    THE    SERIAL  PRINTER  PORT  FOUND  ON    ALL
+/                              WPS-8-CONFIGURED    PDP-8/E,  PDP-8/A  CONFIGURATIONS,
+/                              VT-78,  AND  ALL DECMATES (VT-278,  DECMATE  II,  III,
+/                              III+) FOR REMOTE COMMUNICATIONS.
+
+/      THE  USE OF THE SERIAL PRINTER PORT FOR REMOTE COMMUNICATIONS PURPOSES MAY  BE
+/      PROBLEMATIC DUE TO CONSIDERATIONS SUCH AS THE RS-232 CONNECTION TO THE PRINTER
+/      IS A  MODEM  (DCE), RATHER THAN A TERMINAL (DTE) (DECMATE II, ETC.  REQUIRES A
+/      GENDER CHANGER.), OR  THE SOFTWARE DESIGNATION OF THE PORT AS BEING ALLEDGEDLY
+/      *ONLY* FOR A PRINTER,  SUCH AS WHEN CERTAIN SYSTEMS SUPPORT THE "PRINT SCREEN"
+/      KEY AS A SCREEN DUMP  TO  THE  SERIAL PRINTER PORT, ETC.  THESE ISSUES ARE NOT
+/      RELEVANT TO KERMIT-12 OPERATION, AS THE "PRINT SCREEN" KEY IS NOT SUPPORTED BY
+/      KERMIT-12 IN THIS CONFIGURATION AS SUCH (FUTURE  VERSIONS  COULD  REDEFINE THE
+/      "PRINT SCREEN" KEY TO SUCH FUNCTIONS AS DUMP SCREEN TO A FILE, ETC.).
+
+/      SETTING BRATE= NN       SETS THE DEFAULT BAUD RATE (FOR  SYSTEMS  THAT SUPPORT
+/                              THIS  FEATURE)  FROM  A  TABLE  OF  VALUES  (0-15)  AS
+/                              FOLLOWS:
+
+/                              NN              BAUD RATE
+
+/                              00              50
+/                              01              75
+/                              02              110
+/                              03              134.5
+/                              04              150
+/                              05              300
+/                              06              600
+/                              07              1200
+/                              08              1800
+/                              09              2000
+/                              10              2400
+/                              11              3600
+/                              12              4800
+/                              13              7200
+/                              14              9600
+/                              15              19200
+
+/      SETTING ESCAPE= NNNN    SETS THE DEFAULT ESCAPE CHARACTER TO NNNN.
+
+/      SETTING FLOW=   1       ENABLES FLOW-CONTROL BY DEFAULT.
+/      SETTING FLOW=   0       DISABLES FLOW-CONTROL BY DEFAULT.
+
+/      SETTING FMODE=  0177    SETS THE DEFAULT FILE MODE TO ASCII.
+/      SETTING FMODE=  4377    SETS THE DEFAULT FILE MODE TO BINARY.
+\f/     SETTING GENMSG= 0       CAUSES  NO  BINARY TO BE GENERATED WHERE  'LCLMSG'  IS
+/                              DEFINED.  THIS ALLOWS THE PARAMETER FILE (PARAM.PA) OR
+/                              SUBSEQUENT  OVERLAY  BY  K12PCH.BN TO DEFINE THE LOCAL
+/                              HEADER MESSAGE.    THIS  PARAMETER  SHOULD  NOT BE SET
+/                              UNLESS ONE OF  THESE  METHODS IS USED, ELSE THE HEADER
+/                              MESSAGE  WILL BE UNDEFINED.    (NOTE:    IF  K12PCH.BN
+/                              GENERATES  A HEADER MESSAGE, THEN  THIS  PARAMETER  IS
+/                              UNIMPORTANT,  AS  K12PCH.BN  OVERLAYS  THE  BINARY  OF
+/                              K12MIT.)
+/      SETTING GENMSG= 1       CAUSES A HEADER MESSAGE TO BE GENERATED.  THE CONTENTS
+/                              OF  THE  MESSAGE  ARE CREATED BY SETTING LEDERLE=1  OR
+/                              UMSG=1.   IF EITHER IS ZERO, A DEFAULT (NULL)  MESSAGE
+/                              WILL BE GENERATED.
+
+/      SETTING ICLOSE= 1       ENSURES  A  <^Z>  AT  <EOF>  OF  ASCII  INPUT FILES BY
+/                              DEFAULT.
+/      SETTING ICLOSE= 0       CLOSES ASCII INPUT FILES AS RECEIVED BY DEFAULT.
+
+/      SETTING INIECHO=0       CAUSES A  FULL-DUPLEX CONNECT MODE STATE WITH NO LOCAL
+/                              CHARACTER ECHOING BY DEFAULT.
+/      SETTING INIECHO=1       CAUSES A HALF-DUPLEX  CONNECT  MODE  STATE  WITH LOCAL
+/                              ECHO OF ALL CONSOLE CHARACTERS BY DEFAULT.
+
+/      SETTING LOWER=  0       ALLOWS LOWER-CASE CONSOLE OUTPUT BY DEFAULT.
+/      SETTING LOWER=  -40     FOLDS  LOWER-CASE  CONSOLE  OUTPUT  TO  UPPER-CASE  BY
+/                              DEFAULT.
+
+/      SETTING OCLOSE= 0       PREVENTS DEFAULT SENDING OF <^Z>  AT  <EOF>  OF  ASCII
+/                              FILES.
+/      SETTING OCLOSE= 1       CAUSES  <^Z> TO BE SENT AT <EOF>  OF  ASCII  FILES  BY
+/                              DEFAULT.
+
+/      SETTING PORT=   0       CAUSES THE DP-278 PORT 0 TO BE USED  IF  KERMIT-12  IS
+/                              RUN ON A DECMATE 1 (ASSUMING SPRINT=0).
+/      SETTING PORT=   1       CAUSES  THE DP-278 PORT 1 TO BE USED IF  KERMIT-12  IS
+/                              RUN ON A DECMATE 1 (ASSUMING SPRINT=0).
+
+/      SETTING RETCNT= NNNN    SETS THE PACKET RETRY COUNT TO NNNN BY DEFAULT.
+/      SETTING UMSG=   0       PREVENTS THE  LOCAL  USER  HEADER  MESSAGE  FROM BEING
+/                              GENERATED.
+/      SETTING UMSG=   1       CAUSES THE LOCAL  USER HEADER MESSAGE TO BE GENERATED.
+/                              THE PARAMETER GENMSG=1 IS  REQUIRED  TO  BE  SET.  THE
+/                              SOURCE MUST BE MODIFIED LOCALLY  TO CHANGE THE MESSAGE
+/                              TEXT FROM "INSERT LOCAL USER MESSAGE  HERE!,"  AS THIS
+/                              IS THE DEFAULT CONTENTS.
+\f/     KERMIT-12 FOR THE FAMILY OF 12-BIT DEC MACHINES.
+
+/      BRIEF USAGE DESCRIPTION.
+
+/      KERMIT-12 IS AN IMPLEMENTATION OF THE KERMIT PROTOCOL FOR THE FAMILY OF 12-BIT
+/      DEC (AND COMPATIBLE) MACHINES GENERALLY KNOWN AS PDP-8 OR DECMATE.
+
+/      AS OF THE CURRENT IMPLEMENTATION, THE FOLLOWING COMMANDS ARE EFFECTIVE:
+
+/      1.      CONNECT (TO REMOTE SYSTEM AS TERMINAL).
+
+/      2.      SEND FILESPEC (TO REMOTE RECEIVER OR SERVER).
+
+/      3.      RECEIVE FILESPEC (FROM REMOTE SENDER).
+
+/      4.      GET FILESPEC (FROM REMOTE SERVER).
+
+/      5.      FINISH (SERVING).
+
+/      6.      SETUP (ON DECMATE II/III/III-PLUS ONLY). **** NOT IMPLEMENTED ****
+
+/      7.      EXIT (TO OPERATING SYSTEM).
+
+/      8.      HELP (DISPLAYS HELP MESSAGE).
+
+/      FILESPEC  MAY  BE  ANY LOCAL (OS/8) FILE-STRUCTURED DEVICE:FILENAME.EXTENSION,
+/      WHERE THE  FILENAME  AND  EXTENSION WILL BE TRUNCATED TO 6 ALPHANUMERICS AND 2
+/      ALPHANUMERICS RESPECTIVELY, AS  NECESSARY (THIS IS REFERRED TO AS 6.2 FILENAME
+/      FORMAT).  THE DEVICE:    FIELD  IS  OPTIONAL;   ALL COMMANDS USING THE DEVICE:
+/      FIELD FOR LOCAL DEVICE SPECIFICATION  WILL  USE  THIS  DEVICE AS THE SOURCE OR
+/      DESTINATION AS NECESSARY FOR THE LOCAL  FILES.    IF  THE  DEVICE:    FIELD IS
+/      OMITTED, THE DEFAULT DEVICE DSK:  WILL BE USED.  THE ACTUAL DEVICE USED MAY BE
+/      SELECTED BEFORE INVOKING KERMIT-12 BY USING THE OS/8 ASSIGN COMMAND:
+
+/      .ASSIGN DEV DSK
+
+/      WHERE DEV IS ANY AVAILABLE FILE-STRUCTURED DEVICE.
+
+/      KERMIT-12 USES AN UNUSUAL SCHEME FOR ITS PROMPT:    THE  ACTUAL DEFAULT PROMPT
+/      TEXT  IS  PARTIALLY  TAKEN  FROM  THE  ACTUAL MACHINE KERMIT-12  IS  CURRENTLY
+/      EXECUTING  ON.    FOR  EXAMPLE, IF KERMIT-12 HAS DETERMINED THE  CPU  TYPE  AS
+/      PDP-8/E, THE PROMPT WILL BE:
+
+/      KERMIT-8/E>
+
+/      THIS  ALLOWS KERMIT-12 USERS (WITH DIFFERENT CPU-TYPE MACHINES) TO DISTINGUISH
+/      MESSAGES ORIGINATING  FROM  THE  RESPECTIVE  SYSTEMS.    FUTURE  VERSIONS WILL
+/      SUPPORT USER PROMPT STRINGS TO ALLOW MORE DISTINCTIVE SYSTEM MESSAGES.
+
+/      THE HELP OR CONNECT COMMANDS MAY BE USED TO DETERMINE THE CURRENT CONNECT MODE
+/      ESCAPE CHARACTER.
+\f/     COMMAND RESTRICTIONS.
+
+/      THE  SEND  COMMAND  ALLOWS   DEVICE:FILENAME.EXTENSION  (6.2)  WITH  WILD-CARD
+/      SUBSTITUTION.  A * MAY  BE  GIVEN  FOR  AN  ENTIRE  FIELD  (EITHER FILENAME OR
+/      EXTENSION OR BOTH) ONLY.  A  ?    WILL  MATCH  ANY SINGLE CHARACTER WHICH MUST
+/      EXIST IN THE ACTUAL FILENAME OR EXTENSION,  UNLESS  RIGHT-MOST  IN  THE FIELD.
+/      ALL  MATCHING FILES WILL BE SENT.  NO  OUTBOUND  FILENAME  (AS-NAME)  FACILITY
+/      EXISTS AT THIS TIME.
+
+/      THE  RECEIVE  COMMAND  ALLOWS  OPTIONAL  DEVICE:   ONLY.   *THE  FILENAME  AND
+/      EXTENSION  ARE  NOT  ALLOWED*.  NAMES OF RECEIVED FILES WILL  BE  MODIFIED  IF
+/      NECESSARY  TO  CONFORM  TO  THE  6.2  FORMAT.   *IMPLEMENTATION RESTRICTION* :
+/      CERTAIN REMOTE  FILENAMES  CONTAINING  NON-ALPHANUMERIC  CHARACTERS  MAY CAUSE
+/      KERMIT-12 TO HASTILY ABORT THE TRANSMISSION AND RETURN TO COMMAND LEVEL.
+
+/      THE GET COMMAND  ALLOWS  OPTIONAL  DEVICE:    TO  DETERMINE DESTINATION OF THE
+/      INCOMING FILES.  THE  OUTBOUND  FILESPEC  MUST  CONFORM  TO  LOCAL CONVENTIONS
+/      (FILENAME AND EXTENSION ARE NOT  LIMITED  TO  6.2  FORMAT;  THE DEVICE:  FIELD
+/      WILL NOT BE SENT TO THE  REMOTE  KERMIT  UNLESS  IT  IS  ILLEGAL  WITHIN  OS/8
+/      SPECIFICATIONS, SUCH AS TOO MANY DEVICE LETTERS.    IN  THIS CASE, THE DEFAULT
+/      DEVICE DSK:  APPLIES, AND THE ENTIRE "DEVICE"  FIELD  IS  SENT  ALONG WITH ANY
+/      FILENAME  AND EXTENSION).  CERTAIN REMOTE SYSTEMS ARE INCOMPATIBLE  WITH  THIS
+/      IMPLEMENTATION,  AS  IMBEDDED  SPACES  OR  NON-ALPHANUMERIC CHARACTERS ARE NOT
+/      ALLOWED, EVEN  THOUGH  THEY  MAY  BE REQUIRED ON THE REMOTE SYSTEM.  WILD-CARD
+/      CHARACTERS ARE ALLOWED, BUT ONLY AS SPECIFIED IN THE SEND COMMAND ABOVE.
+
+/      <^X>  OR  <^Z>  CAN BE USED TO ABORT KERMIT TRANSMISSIONS (EVENTUALLY) BUT  IS
+/      NORMALLY  A  SLOW  PROCESS,  SINCE  THE CHECKING IS DONE BY A SOFTWARE TIMEOUT
+/      SCHEME.   AT  THE  PRESENT  TIME,  THERE  IS  NO DISTINCTION BETWEEN THESE THO
+/      CHARACTERS, SO IT  IS NOT POSSIBLE TO ABORT A SINGLE FILE; THE ENTIRE BATCH OF
+/      FILES INVOLVED IN THE TRANSFER IS ABORTED.
+
+/      DECMATE II/III/III-PLUS CONSIDERATIONS:
+
+/      FUNCTION KEYS SEND <ESC>  SEQUENCES SPECIFIED BY SLUSHWARE/FIRMWARE.  ALL SOFT
+/      FUNCTION KEYS ARE THEREFORE INEFFECTIVE  (EXCEPT  FOR HOLD SCREEN WHICH ALWAYS
+/      WORKS).
+
+/      CONNECT MODE RUNS IN 8-BIT MODE.
+
+/      THE COMPOSE KEY IS ENABLED FOR USE WITH A LOADED COMPOSE TABLE.
+
+/      ANY VALID DECMATE II/III/III-PLUS CHARACTER SET  IS  ALLOWED  WHILE IN CONNECT
+/      MODE  (MCS  TCS  LINE,  ETC.).    ALL   <ESC>  SEQUENCES  ARE  PASSED  TO  THE
+/      SLUSHWARE/FIRMWARE UNMODIFIED.
+
+/      KEYBOARD UPPER-CASE LOCK WILL ALWAYS BE AUTOMATICALLY APPLIED UPON RETURN FROM
+/      CONNECT MODE.
+\f/     DEFINITIONS.                                                    /017 CJL
+
+       *200                                    /FOR DEFINITIONS        /047 CJL
+
+/      REMOTE LINE PARAMETERS; SET ONLY ONE AS NECESSARY.              /046 CJL
+
+       IFNDEF  DEV30   <DEV30= 0>              /USE DEVICE 30/31 VALUES
+       IFNDEF  DEV40   <DEV40= 0>              /USE DEVICE 40/41 VALUES
+       IFNDEF  LEDERLE <LEDERLE=0>             /USE LEDERLE LABS VALUES
+       IFNDEF  ORIGNAL <ORIGNAL=0>             /USE ORIGINAL VALUES
+       IFNDEF  SPRINT  <SPRINT=0>              /USE DEVICE 32/33 VALUES
+       IFNDEF  USER    <USER=  0>              /USE USER-DEFINED VALUES
+
+       REMOTE= DEV30+DEV40+LEDERLE+ORIGNAL     /SET REMOTE LINE IOT CODE
+       REMOTE= REMOTE+SPRINT+USER              /SET REMOTE LINE IOT CODE
+
+       IFZERO  REMOTE  <DEV40= 1>              /DEFAULT TO DEVICE 40/41 VERSION
+
+/      DEV30 PARAMETERS.
+
+       IFNZRO  DEV30                   <
+
+       IFNDEF  REC     <REC=   30>             /DEVICE 30 INPUT
+       IFNDEF  SEN     <SEN=   31>             /DEVICE 31 OUTPUT
+
+                                       >
+
+/      DEV40 PARAMETERS (DEFAULT).
+
+       IFNZRO  DEV40                   <
+
+       IFNDEF  REC     <REC=   40>             /DEVICE 40 INPUT
+       IFNDEF  SEN     <SEN=   41>             /DEVICE 41 OUTPUT
+
+                                       >
+
+/      LEDERLE PARAMETERS.                                             /038 CJL
+
+       IFNZRO  LEDERLE                 <
+
+       IFNDEF  REC     <REC=   43>             /DEVICE 43 INPUT
+       IFNDEF  SEN     <SEN=   44>             /DEVICE 44 OUTPUT
+       IFNDEF  GENMSG  <GENMSG=1>              /GENERATE LOCAL HEADER MESSAGE
+       IFNDEF  UMSG    <UMSG=  0>              /DON'T GENERATE USER MESSAGE
+
+                                       >
+
+/      ORIGNAL PARAMETERS.
+
+       IFNZRO  ORIGNAL                 <
+
+       IFNDEF  REC     <REC=   33>             /DEVICE 33 INPUT
+       IFNDEF  SEN     <SEN=   34>             /DEVICE 34 OUTPUT
+
+                                       >
+\f/     SPRINT PARAMETERS.                                              /046 CJL
+
+       IFNZRO  SPRINT                  <
+
+       IFNDEF  REC     <REC=   32>             /DEVICE 32 INPUT
+       IFNDEF  SEN     <SEN=   33>             /DEVICE 33 OUTPUT
+
+                                       >
+
+/      USER PARAMETERS.
+
+       IFNZRO  USER                    <
+
+       IFNDEF  XX      <XX=    40>             /DEFAULT TO DEVICE 40
+       IFNDEF  XY      <XY=    41>             /DEFAULT TO DEVICE 41
+       IFNDEF  REC     <REC=   XX>             /DEVICE XX INPUT
+       IFNDEF  SEN     <SEN=   XY>             /DEVICE XY OUTPUT
+       IFNDEF  GENMSG  <GENMSG=1>              /GENERATE LOCAL HEADER MESSAGE
+       IFNDEF  UMSG    <UMSG=  1>              /GENERATE USER MESSAGE
+
+                                       >
+
+/      REMOTE LINE IOT DEFINITIONS.
+
+/      RECEIVE DEFINITIONS.
+
+       RKRBIOT=REC^10+6006                     /READ REMOTE, CLEAR FLAG
+       RKSFIOT=REC^10+6001                     /SKIP ON REMOTE INPUT FLAG
+
+/      TRANSMIT DEFINITIONS.
+
+       RSBIOT= SEN^10+6003                     /SET BAUD RATE FROM AC[8-11]
+       RTLSIOT=SEN^10+6006                     /TRANSMIT CHARACTER, CLEAR FLAG
+       RTSFIOT=SEN^10+6001                     /SKIP ON TRANSMIT FLAG
+
+/      CONSOLE TTY: DEFINITIONS.                                       /017 CJL
+
+/      KEYBOARD DEFINITIONS.                                           /017 CJL
+
+       IFNDEF  KEY     <KEY=   03>     /KEYBOARD DEVICE CODE
+
+       KCCIOT= KEY^10+6002             /CLEAR CONSOLE KEYBOARD FLAG, AC
+       KRBIOT= KEY^10+6006             /READ CONSOLE KEYBOARD BUFFER, CLEAR FLAG
+       KRSIOT= KEY^10+6004             /READ CONSOLE KEYBOARD BUFFER STATIC
+       KSFIOT= KEY^10+6001             /SKIP ON CONSOLE KEYBOARD FLAG
+
+/      TELEPRINTER DEFINITIONS.                                        /017 CJL
+
+       IFNDEF  TTY     <TTY=   04>     /TELEPRINTER DEVICE CODE
+
+       TLSIOT= TTY^10+6006             /PRINT CHARACTER, CLEAR FLAG
+       TSFIOT= TTY^10+6001             /SKIP ON TELEPRINTER FLAG
+\f/     DEFAULT ESCAPE CHARACTER DEFINITION.                            /025 CJL
+
+       IFNDEF  ESCAPE  <ESCAPE="]&37>  /DEFAULT IS CONTROL-]
+
+/      DEFAULT LOWER-CASE ENABLE DEFINITION.                           /030 CJL
+
+       IFNDEF  LOWER   <LOWER= 0/-40>  /LOWER-CASE IS ALLOWED AS IS
+                                       /CHANGE TO -40 IF LOWER-CASE
+                                       /SHOULD BE FOLDED TO UPPER-CASE
+
+/      DEFAULT RETRY COUNT DEFINITION.                                 /031 CJL
+
+       IFNDEF  RETCNT  <RETCNT=5>      /DEFAULT IS FIVE RETRIES
+
+/      DEFAULT FILE MODE DEFINITION.                                   /031 CJL
+
+       IFNDEF  FMODE   <FMODE= 4377>   /DEFAULT IS ASCII FILE MODE
+                                       /4377 IS BINARY FILE MODE
+
+/      DEFAULT FLOW-CONTROL MODE DEFINITION.                           /031 CJL
+
+       IFNDEF  FLOW    <FLOW=  1>      /DEFAULT IS FLOW-CONTROL ENABLED
+
+/      DEFAULT ASCII INPUT FILE <^Z> DISPOSITION.                      /031 CJL
+
+       IFNDEF  ICLOSE  <ICLOSE=1>      /ENSURE <^Z> AT ASCII <EOF>
+
+/      DEFAULT ASCII OUTPUT FILE <^Z> DISPOSITION.                     /031 CJL
+
+       IFNDEF  OCLOSE  <OCLOSE=0>      /<^Z> NOT SENT AT ASCII <EOF>
+
+/      DEFAULT LOCAL MESSAGE GENERATION DEFINITIONS.                   /038 CJL
+
+       IFNDEF  GENMSG  <GENMSG=1>      /DEFAULT IS TO GENERATE A MESSAGE
+       IFNDEF  UMSG    <UMSG=  0>      /DEFAULT IS NO DUMMY USER MESSAGE
+       IFNDEF  LEDERLE <LEDERLE=0>     /DEFAULT IS NO LEDERLE MESSAGE
+
+/      THE NULL MESSAGE WILL BE GENERATED BY DEFAULT.
+
+/      ECHO DEFINITION.                                                /039 CJL
+
+       IFNDEF  INIECHO <INIECHO=0>     /DEFAULT IS NO LOCAL ECHO
+
+/      DEFAULT DECMATE I PORT DEFINITION.                              /050 CJL
+
+       IFNDEF  PORT    <PORT=  0>      /DEFAULT IS PORT ZERO 
+
+/      DEFAULT BAUD RATE DEFINITION.                                   /050 CJL
+
+       IFNDEF  BRATE   <BRATE= 7>      /DEFAULT IS 1200 BAUD
+\f/     STATE DEFINITIONS.
+
+       STDAT=  "D&137                  /DATA
+       STACK=  "Y&137                  /ACK
+       STNAK=  "N&137                  /NAK
+       STSIN=  "S&137                  /SEND-INIT
+       STBRK=  "B&137                  /BREAK LINK
+       STFIL=  "F&137                  /FILENAME HEADER
+       STEOF=  "Z&137                  /END OF FILE OR REPLY
+       STERR=  "E&137                  /ERROR PACKET
+       STATT=  "A&137                  /FILE ATTRIBUTES
+       STRIN=  "R&137                  /RECEIVE-INIT
+       STEOT=  "B&137                  /BREAK TRANSMISSION
+       STGEN=  "G&137                  /KERMIT GENERIC COMMAND
+
+/      DEFAULT INIT PARAMETERS.
+
+       DEFCK=  "1&177                  /DEFAULT 1 CHARACTER CHECKSUM   /014 CJL
+       DEFEOL= 15+40                   /CR IS DEFAULT <EOL>
+       DEFQCTL= "#&177                 /"#" IS DEFAULT QCTL
+
+/      BUFFER DEFINITIONS.                                             /014 CJL
+
+       DECIMAL                         /MAKE IT EASIER                 /014 CJL
+
+       DEFMAXL=94                      /DEFAULT MAXIMUM PACKET SIZE
+
+       LINSIZ= 32                      /KEYBOARD LINE BUFFER SIZE
+
+       OCTAL                           /BACK TO NORMAL                 /014 CJL
+
+       BUFSIZE=200                     /128 CHARACTER RING BUFFERS     /026 CJL
+                                       /FOR NO-INTERRUPT CONNECT MODE
+\f/     CONTROL CHARACTER DEFINITIONS.                                  /023 CJL
+
+       CNTRLA= "A&37                   /<^A> DEFAULT MARK CHARACTER    /023 CJL
+       CNTRLB= "B&37                   /<^B>                           /046 CJL
+       CNTRLC= "C&37                   /<^C> PROGRAM EXIT CHARACTER    /023 CJL
+       CNTRLD= "D&37                   /<^D>                           /046 CJL
+       CNTRLE= "E&37                   /<^E>                           /046 CJL
+       CNTRLF= "F&37                   /<^F>                           /046 CJL
+       CNTRLG= "G&37                   /<^G> BELL CHARACTER            /023 CJL
+       CNTRLH= "H&37                   /<^H> BACKSPACE CHARACTER       /023 CJL
+       CNTRLI= "I&37                   /<^I> HORIZONTAL TAB CHARACTER  /043 CJL
+       CNTRLJ= "J&37                   /<^J> LINEFEED CHARACTER        /023 CJL
+       CNTRLK= "K&37                   /<^K> VERTICAL TAB CHARACTER    /046 CJL
+       CNTRLL= "L&37                   /<^L> FORM FEED CHARACTER       /046 CJL
+       CNTRLM= "M&37                   /<^M> CARRIAGE RETURN CHARACTER /023 CJL
+       CNTRLN= "N&37                   /<^N>                           /046 CJL
+       CNTRLO= "O&37                   /<^O> ECHO FLIP CHARACTER       /023 CJL
+       CNTRLP= "P&37                   /<^P> PROGRAM RESTART CHARACTER /023 CJL
+       CNTRLQ= "Q&37                   /<^Q> OUTPUT RESUME CHARACTER   /023 CJL
+       CNTRLR= "R&37                   /<^R>                           /046 CJL
+       CNTRLS= "S&37                   /<^S> OUTPUT WAIT CHARACTER     /023 CJL
+       CNTRLT= "T&37                   /<^T>                           /046 CJL
+       CNTRLU= "U&37                   /<^U>                           /046 CJL
+       CNTRLV= "V&37                   /<^V>                           /046 CJL
+       CNTRLW= "W&37                   /<^W>                           /046 CJL
+       CNTRLX= "X&37                   /<^X> FILE ABORT CHARACTER      /044 CJL
+       CNTRLY= "Y&37                   /<^Y>                           /046 CJL
+       CNTRLZ= "Z&37                   /<^Z> ABORT AND <EOF> CHARACTER /044 CJL
+       DELETE= 177                     /<DEL> DELETE OR <RO> CHARACTER /034 CJL
+       LOWERC= "C&177+40               /LOWER-CASE C (CLOSE CHARACTER) /025 CJL
+       UPPERC= "C&177                  /UPPER-CASE C (CLOSE CHARACTER) /025 CJL
+
+/      I/O AND FIELD DEFINITIONS.                                      /019 CJL
+
+       BUFFLD= 10                      /I/O BUFFER FIELD               /019 CJL
+       DIRFLD= 10                      /DIRECTORY LOOKUP BUFFER FIELD  /028 CJL
+       DMIFLD= 10                      /DECMATE ONCE-ONLY CODE FIELD   /046 CJL
+       MSGFLD= 10                      /TEXT MESSAGE FIELD             /023 CJL
+       PAGCNT= 2                       /I/O BUFFER SIZE IN PAGES       /019 CJL
+       PRGFLD= 00                      /PROGRAM FIELD                  /019 CJL
+       USRFLD= 10                      /USR FIELD                      /020 CJL
+
+/      OS/8 MONITOR DEFINITIONS.                                       /014 CJL
+
+       SBOOT=  7600                    /MONITOR EXIT LOCATION IS 07600 /014 CJL
+       USR=    7700                    /NON-LOCKED USR ENTRY POINT     /035 CJL
+\f/     USER SERVICE ROUTINE AND HANDLER DEFINITIONS.                   /020 CJL
+
+       CLOSE=  4                       /CLOSE TENTATIVE OUTPUT FILE    /020 CJL
+       ENTER=  3                       /ENTER TENTATIVE OUTPUT FILE    /020 CJL
+       FETCH=  1                       /FETCH HANDLER                  /020 CJL
+       INQUIRE=12                      /INQUIRE ABOUT HANDLER          /020 CJL
+       LOOKUP= 2                       /LOOKUP FILE                    /020 CJL
+       RESET=  13                      /RESET DEVICE CONTROL WORD TABLE/037 CJL
+       USRIN=  10                      /LOCK USR IN CORE               /020 CJL
+       WRITE=  4000                    /I/O CALL WRITE BIT             /020 CJL
+
+/      INSTRUCTION DEFINITIONS.
+
+       CLCL=   6136                    /CLEAR CLOCK FLAG (8/A, ETC.)   /046 CJL
+       CLSK=   6131                    /SKIP ON, CLEAR CLOCK FLAG      /046 CJL
+       CLSK8A= 6137                    /SKIP ON CLOCK FLAG (8/A, ETC.) /046 CJL
+       COM=    0017                    /COMPLEMENT AC
+       DCAC=   DCA     .               /CURRENT PAGE DCA INSTRUCTION   /047 CJL
+       IAAC=   6171                    /"A" REGISTER TO AC
+       IACA=   6167                    /AC TO "A" REGISTER
+       ISZC=   ISZ     .               /CURRENT PAGE ISZ INSTRUCTION   /050 CJL
+       JMPC=   JMP     .               /CURRENT PAGE JMP INSTRUCTION   /047 CJL
+       JMPIC=  JMP I   .               /CURRENT PAGE JMP I INSTRUCTION /047 CJL
+       JMSC=   JMS     .               /CURRENT PAGE JMS INSTRUCTION   /047 CJL
+       JMSIC=  JMS I   .               /CURRENT PAGE JMS I INSTRUCTION /047 CJL
+       LINC=   6141                    /GOTO LINC MODE
+       PDP=    0002                    /GOTO PDP-8 MODE
+       PRQ3=   6236                    /TYPE THREE PANEL REQUEST       /046 CJL
+       TADC=   TAD     .               /CURRENT PAGE TAD INSTRUCTION   /047 CJL
+       R3L=    7014                    /ROTATE AC (NOT LINK) LEFT 3    /046 CJL
+
+/      NUMERIC LOAD DEFINITIONS.                                       /014 CJL
+
+       NL0000= CLA                     /LOAD AC WITH 0000              /046 CJL
+       NL0001= CLA IAC                 /LOAD AC WITH 0001              /014 CJL
+       NL0002= CLA CLL CML RTL         /LOAD AC WITH 0002              /014 CJL
+       NL0003= CLA STL IAC RAL         /LOAD AC WITH 0003 (8/I ON UP)  /046 CJL
+       NL0004= CLA CLL IAC RTL         /LOAD AC WITH 0004 (8/I ON UP)  /046 CJL
+       NL0006= CLA STL IAC RTL         /LOAD AC WITH 0006 (8/I ON UP)  /046 CJL
+       NL0010= CLA IAC RAL RAR         /LOAD AC WITH 0010 (6120)       /024 CJL
+       NL0100= CLA IAC BSW             /LOAD AC WITH 0100 (8/E ON UP)  /024 CJL
+       NL3776= CLA CLL CMA RAR RAL     /LOAD AC WITH 3776 (8/I OR 8/L) /024 CJL
+       NL3777= CLA CLL CMA RAR         /LOAD AC WITH 3777              /046 CJL
+       NL4000= CLA CLL CML RAR         /LOAD AC WITH 4000              /014 CJL
+       NL5777= CLA CLL CMA RTR         /LOAD AC WITH 5777              /046 CJL
+       NL6000= CLA STL IAC RTR         /LOAD AC WITH 6000 (8/I ON UP)  /046 CJL
+       NL7775= CLA CLL CMA RTL         /LOAD AC WITH 7775              /014 CJL
+       NL7776= CLA CLL CMA RAL         /LOAD AC WITH 7776              /014 CJL
+       NL7777= CLA CMA                 /LOAD AC WITH 7777              /014 CJL
+\f/     DECMATE I COMMUNICATIONS PORT DEFINITIONS.                      /050 CJL
+
+       IPORT0= 30              /COMMUNICATIONS PORT 0 INPUT DEVICE CODE
+
+       RKFL0=  IPORT0^10+6000  /SET COMMUNICATIONS PORT 0 INPUT FLAG
+       RKSF0=  IPORT0^10+6001  /SKIP ON, CLEAR COMMUNICATIONS PORT 0 INPUT FLAG
+       RKCC0=  IPORT0^10+6002  /CLEAR AC
+       RKIE0=  IPORT0^10+6005  /PORT 0 INPUT INTERRUPT ENABLE PER AC[11]
+       RKRB0=  IPORT0^10+6006  /READ COMMUNICATIONS PORT 0 INTO AC
+
+       OPORT0= 31              /COMMUNICATIONS PORT 0 OUTPUT DEVICE CODE
+
+       RTFL0=  OPORT0^10+6000  /SET COMMUNICATIONS PORT 0 OUTPUT FLAG
+       RTSF0=  OPORT0^10+6001  /SKIP ON, CLEAR COMMUNICATIONS PORT 0 OUTPUT FLAG
+       RTCF0=  OPORT0^10+6002  /NOP
+       RTIE0=  OPORT0^10+6005  /PORT 0 OUTPUT INTERRUPT ENABLE PER AC[11]
+       RTLS0=  OPORT0^10+6006  /WRITE COMMUNICATIONS PORT 0 FROM AC
+
+       IPORT1= 34              /COMMUNICATIONS PORT 1 INPUT DEVICE CODE
+
+       RKFL1=  IPORT1^10+6000  /SET COMMUNICATIONS PORT 1 INPUT FLAG
+       RKSF1=  IPORT1^10+6001  /SKIP ON, CLEAR COMMUNICATIONS PORT 1 INPUT FLAG
+       RKCC1=  IPORT1^10+6002  /CLEAR AC
+       RKIE1=  IPORT1^10+6005  /PORT 1 INPUT INTERRUPT ENABLE PER AC[11]
+       RKRB1=  IPORT1^10+6006  /READ COMMUNICATIONS PORT 1 INTO AC
+
+       OPORT1= 35              /COMMUNICATIONS PORT 1 OUTPUT DEVICE CODE
+
+       RTFL1=  OPORT1^10+6000  /SET COMMUNICATIONS PORT 1 OUTPUT FLAG
+       RTSF1=  OPORT1^10+6001  /SKIP ON, CLEAR COMMUNICATIONS PORT 1 OUTPUT FLAG
+       RTCF1=  OPORT1^10+6002  /NOP
+       RTIE1=  OPORT1^10+6005  /PORT 1 OUTPUT INTERRUPT ENABLE PER AC[11]
+       RTLS1=  OPORT1^10+6006  /WRITE COMMUNICATIONS PORT 1 FROM AC
+
+       PCON=   36              /PORT STATUS AND CONTROL DEVICE CODE
+
+       SMFL=   PCON^10+6000    /SET MODEM CHANGE FLAG
+       MFSK=   PCON^10+6001    /SKIP ON, CLEAR MODEM CHANGE FLAG
+       WCON0=  PCON^10+6002    /WRITE COMMUNICATIONS PORT 0 CONTROL REGISTER
+       PSR=    PCON^10+6003    /READ PORT STATUS REGISTER
+       PMR=    PCON^10+6004    /READ PORT MODEM REGISTER
+       MFIE=   PCON^10+6005    /LOAD MODEM CHANGE INTERRUPT ENABLE PER AC[11]
+       WCON1=  PCON^10+6006    /WRITE COMMUNICATIONS PORT 1 CONTROL REGISTER
+       RACD=   PCON^10+6007    /RESET ACTIVE COMMUNICATIONS PORT PER AC[0]
+\f/     DECMATE II, ETC. COMMUNICATIONS PORT DEFINITIONS.               /046 CJL
+
+       PORTIN= 30              /COMMUNICATIONS PORT INPUT DEVICE CODE
+
+       IFL=    PORTIN^10+6000  /SET COMMUNICATIONS PORT INPUT/OUTPUT FLAG
+       ISF=    PORTIN^10+6001  /SKIP ON, CLEAR COMMUNICATIONS PORT INPUT/OUTPUT FLAG
+       ICF=    PORTIN^10+6002  /NOP (CLEAR THE AC?)
+       INOP1=  PORTIN^10+6003  /(NOP?)
+       IRS=    PORTIN^10+6004  /READ COMMUNICATIONS PORT RECEIVE BUFFER
+       IIE=    PORTIN^10+6005  /COMMUNICATIONS PORT I/O INTERRUPT ENABLE PER AC[11]
+       IRB=    PORTIN^10+6006  /READ COMMUNICATIONS PORT RECEIVE BUFFER
+       INOP2=  PORTIN^10+6007  /(NOP?)
+
+       PORTOUT=31              /COMMUNICATIONS PORT OUTPUT DEVICE CODE
+
+       DUMBFL= PORTOUT^10+6000 /SET COMMUNICATIONS PORT DUMMY FLAG
+       DUMBSF= PORTOUT^10+6001 /SKIP ON, CLEAR COMMUNICATIONS PORT DUMMY FLAG
+       DUMBCF= PORTOUT^10+6002 /NOP (CLEAR THE AC?)
+       ONOP1=  PORTOUT^10+6003 /(NOP?)
+       OPC=    PORTOUT^10+6004 /LOAD COMMUNICATIONS PORT TRANSMIT BUFFER
+       DUMBIE= PORTOUT^10+6005 /COMMUNICATIONS PORT DUMMY INTERRUPT ENABLE PER AC[11]
+       OLS=    PORTOUT^10+6006 /LOAD COMMUNICATIONS PORT TRANSMIT BUFFER
+       ONOP2=  PORTOUT^10+6007 /(NOP?)
+
+       PORTCON=36              /COMMUNICATIONS PORT CONTROL DEVICE CODE
+
+       MFL=    PORTCON^10+6000 /SET MODEM CHANGE FLAG
+       MSF=    PORTCON^10+6001 /SKIP ON, CLEAR MODEM CHANGE FLAG
+       MLC=    PORTCON^10+6002 /LOAD MODEM CONTROL REGISTER
+       MSB=    PORTCON^10+6003 /LOAD BAUD RATE REGISTER
+       MRS=    PORTCON^10+6004 /READ MODEM STATUS REGISTER
+       MIE=    PORTCON^10+6005 /MODEM CHANGE INTERRUPT ENABLE PER AC[11]
+       MPSCC=  PORTCON^10+6006 /ACCESS MULTIPROTOCOL SERIAL COMMUNICATIONS CONTROLLER
+       MPRESET=PORTCON^10+6007 /RESET MULTIPROTOCOL SERIAL COMMUNICATIONS CONTROLLER
+\f/     MISCELLANEOUS DEFINITIONS.                                      /014 CJL
+
+/      STATIC DATE CALCULATIONS.                                       /024 CJL
+
+/      THESE EQUATIONS CAUSE PRINTABLE  TEXT OF THE DATE PARTICULARS, WHICH ARE GIVEN
+/      IN OS/8 INTERNAL FORMAT.  PROGRAM MAINTAINENCE REQUIRES THE UPDATE OF VERSION,
+/      REVISION, REVDATE, AND REVDGRP.  REVDATE  AND  REVDGRP SHOULD BE OBTAINED FROM
+/      THE SYSTEM WHEN RELEASING A NEW VERSION  AFTER  FIRST  CORRECTLY  INVOKING THE
+/      SYSTEM DATE COMMAND.
+
+/      VERSION=[ANY NUMBER IN THE RANGE 00-143 (DECIMAL 00-99)]
+
+/      REVISIO=[ANY SIX-BIT ALPHA (A-Z); DO NOT FORGET &77]
+
+/      REVDATE=[THE CONTENTS OF 17666 (DATE WORD)]
+
+/      REVDGRP=[THE CONTENTS OF 07777 (ONLY BITS[3-4] ARE USED)]
+
+
+
+       IFNDEF  REVDATE <REVDATE=4464>  /REVISION DATE (LOCATION 17666)
+
+       IFNDEF  REVDGRP <REVDGRP=0400>  /REVISION 8 YEAR DATE GROUP (LOCATION 07777)
+
+       IFNDEF  REVISIO <REVISIO="G&77> /REVISION OF KERMIT-12
+
+       IFNDEF  VERSION <VERSION=12>    /VERSION OF KERMIT-12
+
+
+       DAY=    REVDATE&370%10          /REVISION DAY
+
+       DGROUP= REVDGRP&600%20          /REVISION DATE GROUP (WHICH 8 YEARS)
+
+       MONTH=  REVDATE&7400%400        /REVISION MONTH
+
+       YEAR=   REVDATE&7+DGROUP+106    /REVISION YEAR (SINCE 1900)
+\f      FIELD   PRGFLD%10       /STARTING FIELD                         /038 CJL
+
+       *0                      /START AT THE BEGINNING                 /014 CJL
+
+INTPC, .-.                     /PC FROM INTERRUPT (IF ANY)             /014 CJL
+       JMP I   INTPC           /RETURN WITH INTERRUPTS OFF             /014 CJL
+
+ABFLAG,        .-.                     /FILE ABORT FLAG                        /044 CJL
+TABLEJU,.-.                    /MATCHING VALUE FOR SRCHTABLE ROUTINE   /025 CJL
+
+       IFNZRO  .-4     <ERROR  .>                                      /014 CJL
+ODT,   ZBLOCK  7-.             /RESERVED FOR OS/8 ODT                  /014 CJL
+RATE,  BRATE                   /BAUD RATE                              /050 CJL
+
+       *10                     /GET TO AUTO-INDEX AREA                 /014 CJL
+
+XR0,   .-.                     /AUTO-INDEX ZERO                        /014 CJL
+XR1,   .-.                     /AUTO-INDEX ONE                         /014 CJL
+DIRXR, PORT                    /DIRECTORY LOOKUP DEDICATED AUTO-INDEX  /028 CJL
+                               /INITIALIZED FOR DECMATE I ONCE-ONLY    /050 CJL
+
+/      THE REMAINING LOCATIONS THROUGH  000017  MUST  BE USED DIRECTLY ONLY, SO AS TO
+/      NOT CAUSE INADVERTANT AUTO-INDEXING.
+
+/      COLUMN COUNTER FOR CONSOLE ROUTINES (NEVER USED INDIRECTLY).    /043 CJL
+
+COLUMN,        .-.                     /CONSOLE OUTPUT COLUMN COUNTER          /043 CJL
+
+/      CONSOLE TERMINAL ECHO SWITCH (NEVER USED INDIRECTLY).           /020 CJL
+
+ECHOSW,        0                       /0=ECHO, 4000=DON'T ECHO                /020 CJL
+
+/      LATEST (NON-CONNECT MODE) CHARACTER (NEVER USED INDIRECTLY).    /043 CJL
+
+INCHAR,        .-.                     /LATEST INPUT CHARACTER FROM CONSOLE    /043 CJL
+
+/      CURRENT KERMIT MODE (NEVER USED INDIRECTLY).                    /025 CJL
+
+KMODE, .-.                     /CURRENT MODE OF KERMIT                 /025 CJL
+
+/      KERMIT MODE FLAG VALUES.                                        /014 CJL
+
+/      MLINE=  1               /KERMIT IS ON-LINE
+       MSEND=  2               /KERMIT IS IN SEND MODE
+       MREC=   3               /KERMIT IS IN RECEIVE MODE
+
+/      LATEST CHARACTER SENT TO OUTPUT FILE (NEVER USED INDIRECTLY).   /020 CJL
+
+LATEST,        .-.                     /LATEST CHARACTER SENT TO OUTPUT FILE   /020 CJL
+\f      *20                     /GET PAST AUTO-INDEX AREA
+
+INFLAG,        .-.                     /DECMATE INPUT AVAILABLE FLAG           /046 CJL
+OUTFLAG,.-.                    /DECMATE OUTPUT AVAILABLE FLAG          /046 CJL
+TEMP,  0
+RCHAR, 0                       /REMOTE LINE CURRENT INPUT CHAR
+SCAN1, 0                       /
+SCAN2, 0                       /
+KEYDSP,        0                       /DISPATCH ADDRESS FOR KEYWORD MATCH
+BININP,        0                       /BINARY REGISTER FOR DECIMAL INPUT
+PTABLE,        0                       /
+LPTR,  0                       /HOLDS LINE POINTER
+STATE, 0                       /CURRENT STATE
+RETRY, -RETCNT                 /PACKET ERROR RETRY COUNTER             /031 CJL
+RTRYC, 0                       /USE THIS FOR ACTUAL COUNTER
+
+/      CURRENT PACKET I/O DATA.                                        /014 CJL
+
+PAKPTR,        0                       /POINTER TO OUTPUT PACKET POINTER
+PAKCKS,        0                       /HOLDS CURRENT OUTPUT PACKET CHECKSUM TOTAL
+CURSEQ,        0                       /CURRENT SEQ NUMBER
+QFLAG, 0                       /NON-ZERO WHEN NO CONTROL QUOTING
+
+/      RECEIVE "INIT" REGISTERS.                                       /014 CJL
+
+RMAXL, DEFMAXL+40              /MAX LENGTH FOR DATA PACKET (DEFAULT)
+RTIME, 0                       /TIME-OUT VALUE
+RNPAD, 0                       /NUMBER OF PADDING CHARS
+RPADC, 0                       /CHAR USED FOR PADDING
+REOL,  DEFEOL                  /TERMINATOR CHAR USED FOR END OF PACKET
+RQCTL, DEFQCTL                 /CONTROL CHAR PREFIX CHAR
+RQBIN, 0                       /PARITY CHAR PREFIX CHAR (CHARS GT 177)
+RCHKT, DEFCK                   /CHECKSUM TYPE  (DEFAULT TYPE 1)
+RREPT, 0                       /PREFIX CHAR FOR REPEATED CHARS
+RCAPAS,        0                       /EXTRA CAPABILITY BIT MASK
+
+/      ZBLOCK  4               /RESERVED FOR EXTRA CAPABILITIES        /022 CJL
+
+       INITEND=.               /END OF INIT REGISTERS                  /022 CJL
+
+HNDADR,        0                       /FILE DEVICE HANDLER ADDRESS
+FORCEP,        0                       /FLAG FOR FORCED OUTPUT OF PACKET WHEN THERE IS
+                               /  NO DATA (JUST SOH, LEN, SEQ, AND CHECKSUM)
+PRSERR,        0                       /HOLDS PARSE POSITION FOR REPORTING ERRORS
+PACK6P,        0                       /POINTER TO STORAGE OF 6 BIT CHARS
+PACK6F,        0                       /FLAG FOR WHICH BYTE TO STORE
+GET6P, 0                       /POINTER USED IN THE GET6 ROUTINE
+GET6F, 0                       /FLAG USED IN THE GET6 ROUTINE
+MOVE4, 0                       /COUNTER FOR "MOVE"
+INIFLG,        0                       /INIT DONE FLAG
+MQ,    .-.                     /"MQ" TEMPORARY REGISTER                /032 CJL
+\f/     FILE NAME PARSE REGISTERS.                                      /014 CJL
+
+FNPTR, 0                       /POINTER TO WHERE TO PUT A PARSED FILE NAME
+WILDF, 0                       /WILD CARD IN FILE NAME FLAG
+
+/      FILE INFORMATION.                                               /014 CJL
+
+FSBLK, 0                       /FILE START BLOCK
+FLEN,  0                       /FILE LENGTH
+DEVNUM,        0                       /PARSED DEVICE NUMBER HERE
+OFFLG, 0                       /OUTPUT FILE OPEN FLAG
+ODNAME,        0                       /POINTER TO USER SPECIFIED DEVICE FOR OUTPUT
+ODNUMB,        0                       /OUTPUT DEVICE NUMBER
+
+/      PARITY VARIABLES.                                               /014 CJL
+
+/MARK, 0200                    /SET BIT [8] FOR COMMAND INPUTS         /A013
+/PARITY,0                      /PARITY MASK (0=SPACE, 200=MARK)        /AM013
+
+/      INTERNAL FILE MODE FLAG.                                        /019 CJL
+
+FILMODE,FMODE                  /ASCII=0177, BINARY=4377                /019 CJL
+
+/      UPPER-CASE ONLY FLAG.                                           /023 CJL
+
+UPONLY,        LOWER                   /0=UPPER/LOWER CASE, -40=UPPER-CASE ONLY/030 CJL
+
+/      <^C> DISPATCH ADDRESS.                                          /023 CJL
+
+UCADDRE,SBOOT                  /<^C> ADDRESS SHOULD BE SET AS NECESSARY/023 CJL
+
+/      <^P> DISPATCH ADDRESS.                                          /023 CJL
+
+UPADDRE,CHKCLR                 /<^P> ADDRESS SHOULD BE SET AS NECESSARY/023 CJL
+
+/      ESCAPE CHARACTER FOR CONNECT MODE.                              /025 CJL
+
+ESCHAR,        ESCAPE                  /ESCAPE CHARACTER FOR CONNECT MODE      /025 CJL
+
+/      FLOW CONTROL FLAG.                                              /026 CJL
+
+FLOWFLA,-FLOW                  /0=NO FLOW CONTROL, 7777=FLOW CONTROL   /049 CJL
+                               /VIA <^S>/<^Q>
+
+/      KEYBOARD INPUT ERROR FLAG.                                      /026 CJL
+
+KEYERRO,.-.                    /0=NO ERROR, NON-ZERO=BAD CHARACTER     /026 CJL
+                               /OR BUFFER OVERRUN
+\f/     REMOTE LINE INPUT ERROR FLAG.                                   /026 CJL
+
+RINERRO,.-.                    /0=NO ERROR, NON-ZERO=BAD CHARACTER     /026 CJL
+                               /OR BUFFER OVERRUN
+
+/      REMOTE LINE OUTPUT FLOW CONTROL WAIT FLAG.                      /026 CJL
+
+REMWAIT,.-.                    /0=DON'T WAIT, 4000=WAIT FOR <^Q>       /026 CJL
+
+/      REMOTE INPUT WAIT FLAG.                                         /026 CJL
+
+/      FLAG STATES:
+
+/      VALUE                   ACTION
+
+/      0000                    BUFFER IS LESS THAN  3/4  FULL.   INPUT FREELY ALLOWED
+/                              WITHOUT FLOW CONTROL RESTRICTIONS.   IF BUFFER BECOMES
+/                              3/4 FULL AND FLOW CONTROL IS  IN  EFFECT  THEN  CHANGE
+/                              STATE TO 0001.
+
+/      0001                    BUFFER IS NOW 3/4 FULL.  OUTPUT  <^S>  TO  REMOTE  AND
+/                              THEN CHANGE STATE TO 4000.
+
+/      4000                    WAITING FOR BUFFER TO EMPTY TO LESS THAN 1/4 FULL.  IF
+/                              FLOW  CONTROL  IS BEING OBEYED, THEN BUFFER SHOULD NOW
+/                              BE EMPTYING.
+
+/      7777                    BUFFER  IS  NOW  LESS  THAN 1/4 FULL.  OUTPUT <^Q>  TO
+/                              REMOTE AND THEN CHANGE STATE TO 0000.
+
+RINWAIT,.-.                    /REMOTE INPUT WAIT FLAG                 /026 CJL
+
+/      REMOTE LINE OUTPUT BUFFER POINTERS.                             /026 CJL
+
+REMINSE,.-.                    /REMOTE OUTPUT INSERTION POINTER        /026 CJL
+REMREMO,.-.                    /REMOTE OUTPUT REMOVAL POINTER          /026 CJL
+\f/     POINTER FOR THE PACKET INPUT AND OUTPUT ROUTINES
+
+       SPACK=  JMS I   .       /SEND A PACKET TO REMOTE
+               SPACK0          /PUT IN A POINTER
+
+       FPACK=  JMS I   .       /FORMAT PACKET
+               FPACK0          /PUT IN THE POINTER
+
+       RPACK=  JMS I   .       /RECEIVE A PACKET FROM REMOTE
+               ILINK           /PUT IN A POINTER
+
+/      POINTERS FOR OUTPUT ROUTINES
+
+       PRI8B=  JMS I   .       /PRINT 8 BIT STRING ON TTY
+               PRI8B0          /PUT IN THE POINTER
+
+       REM8B=  JMS I   .       /SEND 8 BIT STRING DOWN REMOTE LINE
+               REM8B0          /PUT IN THE POINTER
+
+/      MISC.
+
+       PACK6=  JMS I   .       /DEFINE CALL TO ROUTINE
+               PACK60          /POINTER TO ROUTINE
+
+       GET6=   JMS I   .       /DEFINE THE INSTRUCTION
+               GET60           /PUT IN THE POINTER
+
+       MOVE=   JMS I   .       /DEFINE CALL TO MOVE ROUTINE
+               MOVE0           /POINTER
+
+       CLEAR=  JMS I   .       /DEFINE CALL FOR "CLEAR" ROUTINE
+               CLEAR0          /POINTER
+\f      PAGE                    /START ON NEW PAGE                      /A014 CJL
+
+/      KERMIT-12 PROGRAM STARTS HERE.                                  /A014 CJL
+
+CLOOP, JMP I   (INITIALIZE)    /**** INITIALIZED **** CLA CLL          /024 CJL
+       JMS I   [CRESET]        /RESET CONSOLE ROUTINE STUFF
+       DCA     ABFLAG          /CLEAR ABORT FLAG                       /044 CJL
+       DCA     REMWAIT         /CLEAR REMOTE FLOW CONTROL WAIT         /049 CJL
+CLDMZAP,JMS    DMINIT          /INITIALIZE DECMATE PORT                /048 CJL
+
+/      THE  PREVIOUS  INSTRUCTION  IS  FOR  DECMATE  OPERATION  ONLY.    THE  DEFAULT
+/      INSTRUCTION IS FOR KL8 INTERFACES ONLY.
+
+       *CLDMZAP                /OVERLAY DECMATE CODE                   /048 CJL
+
+CLDMZAP,NOP                    /DON'T INITIALIZE DECMATE PORT          /048 CJL
+       TAD     RATE            /GET BAUD RATE
+SETBAUD,MSB                    /SET REMOTE BAUD RATE                   /050 CJL
+
+/      THE PREVIOUS INSTRUCTION IS FOR DECMATE II OPERATION ONLY.      /050 CJL
+
+       *SETBAUD                /OVERLAY DECMATE II CODE                /050 CJL
+
+SETBAUD,NOP                    /NOT APPLICABLE ON DECMATE I            /050 CJL
+
+/      THE  PREVIOUS  INSTRUCTION  IS  FOR DECMATE I OPERATION  ONLY.    THE  DEFAULT
+/      INSTRUCTION IS FOR KL8 INTERFACES ONLY.
+
+       *SETBAUD                /OVERLAY DECMATE I CODE                 /050 CJL
+
+SETBAUD,RSBIOT                 /SET REMOTE BAUD RATE                   /050 CJL
+       JMS I   [SCRIBE]        /DO A                                   /025 CJL
+       CRLF                    /<CR>, <LF>                             /025 CJL
+       JMS I   [SCRIBE]        /GIVE THEM THE                          /025 CJL
+/      PRMTMSG                 /PROMPT MESSAGE                         /025 CJL
+       PRMT2
+       JMS I   (LININP)        /GET INPUT LINE FROM USER
+       TAD     (CMDTBL)        /GET ADDRESS OF PARSE TABLE             /M014 CJL
+       DCA     PTABLE          /STORE FOR PARSER
+       TAD     (LINBUF)        /GET INPUT LINE BUFFER ADDRESS          /M014 CJL
+
+CLOOP1,        JMS I   (KEYPRS)        /PARSE OFF A KEYWORD
+       JMP     CLOOP9          /NO MATCH ON KEYWORD
+       JMP     CLOOP           /END OF LINE DETECTED
+       DCA     LPTR            /STORE POINTER TO NEXT POS ON LINE
+       JMS I   KEYDSP          /DISPATCH TO SERVICE
+       JMP     CLOOP7          /ERROR RETURN FROM SERVICE DISPATCH
+       TAD     LPTR            /RE-GET COMMAND LINE POINTER
+       JMP     CLOOP1          /CONTINUE LINE PARSE
+
+CLOOP7,        SNA                     /SKIP IF A RETURNING MESSAGE PASSED     /029 CJL
+       JMP     CLOOP           /JUST GO BACK TO COMMAND LOOP           /029 CJL
+       DCA     RETARG          /STORE IN-LINE                          /029 CJL
+       JMS I   [SCRIBE]        /CALL MESSAGE PRINT ROUTINE
+RETARG,        .-.                     /WILL BE PASSED MESSAGE ADDRESS
+       JMP     CLOOP           /KEEP GOING
+\fCLOOP9,       JMS I   [SCRIBE]        /COMPLAIN OF                            /025 CJL
+       CMERMSG                 /BAD COMMAND                            /025 CJL
+       JMP     CLOOP           /GO AGAIN
+
+/      ROUTINE TO FORMAT A PACKET OF DATA
+/      CALL:   FPACK
+/              DATA ADDRESS (DATA MUST ALREADY BE CONTROL/QUOTED AND MUST
+/                            NOT BE LONGER THAN THE LARGEST PACKET)
+/              PACKET TYPE
+
+FPACK0,        0
+       CLA CLL                 /INSURE CLEAR AC
+       TAD I   FPACK0          /GET THE DATA ADDRESS
+       DCA     FP1             /STORE IN SOURCE POINTER
+       ISZ     FPACK0          /BUMP ARGUMENT POINTER
+       TAD I   FPACK0          /NOW GET TYPE
+       DCA I   (RSTYP)         /STORE
+       ISZ     FPACK0          /BUMP ARGUMENT POINTER
+       TAD     (RSDTA          /GET ADDRESS OF DATA BUFFER
+       DCA     FP2             /STORE IN DESTINATION POINTER
+
+       TAD     (40+3           /SET FOR LENGTH COUNTER
+       DCA I   (RSLEN)         /STORE IN PACKET
+       DCA     FP3             /INIT CHECKSUM
+       TAD     CURSEQ          /GET CURRENT SEQ NUMBER
+       AND     [77]            /MODULO 64                              /014/016 CJL
+       TAD     [40]            /TAKE CHAR(SEQUENCE NUMBER)             /014/016 CJL
+       DCA I   (RSSEQ)         /PUT INTO PACKET
+FPACK2,        TAD I   FP1             /GET A CHAR FROM SOURCE
+       SPA                     /SKIP IF NOT END
+       JMP     FPACK3          /END
+       TAD     FP3             /COMBINE WITH CHECKSUM
+       DCA     FP3             /AND RETURN
+       TAD I   FP1             /GET CHAR BACK AGAIN
+       DCA I   FP2             /NOW PUT INTO DESTINATION
+       ISZ I   (RSLEN)         /BUMP THE LENGTH
+       ISZ     FP1             /BUMP THE SOURCE POINTER
+       ISZ     FP2             /BUMP THE DESTINATION POINTER
+       JMP     FPACK2          /LOOP
+\fFPACK3,       CLA CLL                 /CLEAR THE AC
+       TAD     FP3             /GET CALCULATED CHECKSUM
+       TAD I   (RSLEN)         /INCLUDE THE LENGTH
+       TAD I   (RSSEQ)         /AND THE SEQUENCE
+       TAD I   (RSTYP)         /AND THE TYPE
+       JMS I   [CKSUM]         /GET IT CORRECT
+       DCA I   FP2             /STORE WITH PACKET
+       ISZ     FP2             /BUMP PACKET POINTER
+       TAD     REOL            /GET ANY END OF LINE TO INCLUDE
+       TAD     [-40]           /MAKE IT A REAL CHARACTER               /014/016 CJL
+       SNA                     /SKIP IF EOL CHAR REQUIRED
+       JMP     FPACK4          /NO EOL CHAR
+       DCA I   FP2             /STORE EOL CHAR WITH PACKET
+       ISZ     FP2             /BUMP POINTER
+FPACK4,        NL7777                  /SET -1                                 /032 CJL
+       DCA I   FP2             /PACKET NOW COMPLETE
+       TAD     RETRY           /SET UP RE-TRY COUNTER
+       DCA     RTRYC
+       ISZ     CURSEQ          /BUMP SEQUENCE NUMBER FOR NEXT TIME
+       NOP                     /PROTECT ISZ
+       JMP I   FPACK0          /RETURN
+
+FP1,   0                       /POINTER TO SOURCE DATA
+FP2,   0                       /POINTER TO PACKET BUFFER
+FP3,   0                       /RUNNING CHECKSUM
+
+/      DECMATE INITIALIZE ROUTINE.                             /048 CJL
+
+DMINIT,        .-.                     /DECMATE PORT INITIALIZE ROUTINE/048 CJL
+DMI01, TAD     DM234/(234)     /GET SCD ENABLE VALUE           /050 CJL
+DMI02, WCON0                   /WRITE CONTROL REGISTER 0 (1)   /050 CJL
+DMI03, NL0000                  /INDICATE PORT 0 (1)            /050 CJL
+DMI04, RACD                    /RESET THE ACTIVE PORT          /050 CJL
+DMI05, ISZ     DMWASTE         /WASTE                          /050 CJL
+DMI06, JMP     DMI05           /SOME TIME                      /050 CJL
+DMI07, ISZ     DMWASTE         /WASTE                          /050 CJL
+DMI08, JMP     DMI07           /SOME TIME                      /050 CJL
+DMI09, RTFL0                   /SET PORT 0 (1) OUTPUT FLAG     /050 CJL
+DMI10, TAD     DM2516/(2516)   /SETUP FOR 8 BITS, NO PARITY    /050 CJL
+DMI11, JMS     DMSEND          /SEND TO MODE REGISTER 1        /050 CJL
+DMI12, TAD     RATE            /GET BAUD RATE                  /050 CJL
+DMI13, TAD     DM2460/(2460)   /ADD ON CLOCK ENABLE VALUES     /050 CJL
+DMI14, JMS     DMSEND          /SEND TO MODE REGISTER 2        /050 CJL
+DMI15, TAD     DM3425/(3425)   /GET ENABLE AND RESET VALUE     /050 CJL
+DMI16, JMS     DMSEND          /SEND TO COMMAND REGISTER       /050 CJL
+DMI17, RKRB0                   /DO A DUMMY READ ON PORT 0 (1)  /050 CJL
+\f/     THE  PREVIOUS  INSTRUCTIONS  ARE  FOR  DECMATE  I OPERATION ONLY.  THE DEFAULT
+/      INSTRUCTIONS ARE FOR DECMATE II, ETC.  INTERFACES ONLY.
+
+       *DMI01                  /OVERLAY DECMATE I CODE         /050 CJL
+
+DMI01, ISZ     DMWASTE         /WASTE                          /048 CJL
+DMI02, JMP     DMI01           /SOME TIME                      /048 CJL
+DMI03, ISZ     DMWASTE         /WASTE                          /048 CJL
+DMI04, JMP     DMI03           /SOME TIME                      /048 CJL
+DMI05, ISF                     /SKIP ON AND CLEAR PORT FLAG    /048 CJL
+DM50,  50/NOP                  /JUST IN CASE                   /048 CJL
+DMI07, IRB                     /READ THE PORT BUFFER           /048 CJL
+DMI08, CLA                     /CLEAN UP                       /048 CJL
+DMI09, TAD     DM50/(50)       /GET OUTPUT INTERRUPT VALUE     /048 CJL
+DMI10, MPSCC                   /CLEAR OUTPUT INTERRUPT         /048 CJL
+DMI11, TAD     (60-50)         /GET ERROR RESET VALUE          /048 CJL
+DMI12, MPSCC                   /CLEAR OVERRUN ERRORS           /048 CJL
+DMI13, TAD     (70-60)         /SET END OF INTERRUPT VALUE     /048 CJL
+DMI14, MPSCC                   /CLEAR THE INTERRUPT            /048 CJL
+DMI15, DCA     OUTFLAG         /INDICATE OUTPUT IS AVAILABLE   /048 CJL
+DMI16, DCA     INFLAG          /CLEAR INPUT AVAILABLE FLAG     /048 CJL
+DMI17, JMP I   DMINIT          /RETURN                         /048 CJL
+
+/      DECMATE I INITIALIZE CODE CONTINUES HERE.               /050 CJL
+
+DMISET,        RTFL0                   /SET PORT 0 (1) OUTPUT FLAG     /050 CJL
+       CLA                     /CLEAN UP                       /050 CJL
+       JMP I   DMINIT          /RETURN                         /050 CJL
+
+DMSEND,        .-.                     /DECMATE I SEND ROUTINE         /050 CJL
+DMISKP,        RTSF0                   /SKIP ON PORT 0 (1) OUTPUT FLAG /050 CJL
+       JMP     DMISKP          /WAIT FOR IT                    /050 CJL
+DMIOUT,        RTLS0                   /SEND TO PORT 0 (1) REGISTER    /050 CJL
+       CLA                     /CLEAN UP                       /050 CJL
+       JMP I   DMSEND          /RETURN                         /050 CJL
+
+DMWASTE,.-.                    /TIMER TEMPORARY                /050 CJL
+DM234, 234                     /CONSTANT 0234                  /050 CJL
+DM2460,        2460                    /CONSTANT 2460                  /050 CJL
+DM2516,        2516                    /CONSTANT 2516                  /050 CJL
+DM3425,        3425                    /CONSTANT 3425                  /050 CJL
+
+       PAGE
+\f/     ROUTINE TO SEND THE FORMATTED PACKET                    /027 CJL
+/      ARGUMENTS:  CALL+1 NON-ZERO = AWAIT RESPONSE
+/                             ZERO = DO NOT AWAIT RESPONSE
+/                  CALL + 2 DISPATCH TABLE-2                   /027 CJL
+
+SPACK0,        0
+       REM8B;  RSBUF           /SEND PACKET JUST COMPLETED
+       TAD I   SPACK0          /DO WE GET A RESPONSE?
+       ISZ     SPACK0          /BUMP POINTER PAST ARGUMENT
+       SNA CLA                 /SKIP IF YES
+       JMP I   SPACK0          /ALL DONE HERE
+       RPACK                   /GET PACKET BACK FROM REMOTE
+       TAD I   SPACK0          /DID WE WANT A DISPATCH?
+       ISZ     SPACK0          /BUMP PAST ARGUMENT
+       SNA                     /SKIP IF YES
+       JMP I   SPACK0          /EXIT IF NO
+       DCA     SPACARG         /STORE IN-LINE                          /031 CJL
+       JMS     DISPATCH        /CALL DISPATCH ROUTINE                  /031 CJL
+SPACARG,.-.                    /WILL BE DISPATCH TABLE-2               /031 CJL
+       JMP I   SPACK0          /NOT FOUND, GOTTA RETURN
+
+/      CONSOLE RESET ROUTINE.                                          /024 CJL
+
+CRESET,        .-.                     /CONSOLE RESET ROUTINE
+       CLA CLL                 /CLEAN UP
+       DCA     ECHOSW          /ENABLE OUTPUT ECHO
+       TAD     (UPCPRT)        /ALLOW THEM TO
+       DCA     UCADDRESS       /RESTART VIA <^C>
+       TAD     [CLOOP]         /ALLOW THEM TO
+       DCA     UPADDRESS       /RESTART VIA <^P>
+       JMP I   CRESET          /RETURN
+
+/      ALTERNATE CONSOLE RESET ROUTINE.                                /025 CJL
+
+CREST2,        .-.                     /ALTERNATE CONSOLE RESET ROUTINE
+       JMS     CRESET          /CLEAR AC AND ENABLE OUTPUT ECHO
+       TAD     (KCCZAP)        /RENDER <^C>
+       DCA     UCADDRESS       /TOTALLY HARMLESS
+       TAD     (CHKCLR)        /MAKE <^P> PRINT "^P"
+       DCA     UPADDRESS       /AND THEN GO AWAY
+       JMP I   CREST2          /RETURN
+\f/     ROUTINE TO CLEAR WORDS OF MEMORY
+/      ENTER WITH:     AC = MINUS NUMBER OF WORDS TO CLEAR
+/                      MQ = ADDRESS OF WHERE TO START THE CLEAR
+
+CLEAR0,        0
+       DCA     CLEAR5          /STORE COUNT OF WORDS
+       TAD     MQ              /GET ADDRESS TO CLEAR                   /032 CJL
+       DCA     CLEAR6          /STORE IN POINTER
+       DCA I   CLEAR6          /ZERO A WORD
+       ISZ     CLEAR6          /BUMP POINTER
+       ISZ     CLEAR5          /BUMP COUNTER
+       JMP     .-3             /LOOP
+       JMP I   CLEAR0          /DONE
+
+CLEAR5,        0                       /TEMP FOR "CLEAR" ROUTINE
+CLEAR6,        0                       /TEMP FOR "CLEAR" ROUTINE
+
+/      ROUTINE TO DISPATCH TO ROUTINE BASED ON VALUE OF "RRTYP".       /027 CJL
+
+/      CALLING SEQUENCE:
+
+/      CLA                     /AC MUST BE CLEAR
+/      JMS     DISPATCH        /CALL ROUTINE
+/      ADDRESS-2               /DISPATCH TABLE ADDRESS-2
+/      NO MATCH RETURN         /RETURNS HERE WITH CLEAR AC IF NO MATCH
+
+/      CALL  WILL DISPATCH TO THE CORRESPONDING ROUTINE ON A MATCH IN  THE  SPECIFIED
+/      TABLE (WHICH ENDS WITH ZERO) WITH A CLEAR AC.
+
+DISPATC,.-.                    /MATCH "RRTYP" AND DISPATCH ROUTINE
+       CLA                     /JUST IN CASE                           /031 CJL
+       TAD I   DISPATCH        /GET PASSED ARGUMENT
+       ISZ     DISPATCH        /BUMP PAST THE ARGUMENT
+       DCA     DISPA2          /SAVE PASSED ARGUMENT IN-LINE
+       TAD I   (RRTYP)         /GET VALUE OF "RRTYP"
+       CIA                     /INVERT FOR TESTING
+       JMS I   [SRCHTABLE]     /CALL TABLE SEARCH ROUTINE
+DISPA2,        .-.                     /WILL BE TABLE ADDRESS-2
+       SNA CLA                 /SKIP IF MATCH FOUND
+       JMP I   DISPATCH        /RETURN ON NO MATCH
+       JMP I   TABLEJUMP       /DISPATCH TO MATCHING ADDRESS
+\f/     ROUTINE TO PUT CHARS INTO A BUFFER TO GET READY TO FORMAT A PACKET.
+/      ENTER WITH CHAR IN THE AC; IF THE CHAR NEEDS CONTROL QUOTING, IT WILL BE ADDED
+/      EXIT + 2 IF EVERYTHING IS OK
+/      EXIT + 1 IF BUFFER IS FULL
+
+OPBUF, 0                       /PUT CHARACTERS INTO BUFFER FOR PACKET ROUTINE
+       JMS I   (OPRE)          /CHECK FOR PREFIX
+       JMP     OPBUF1          /NO PREFIX
+       DCA     OP1             /SAVE CONVERTED CHAR
+       TAD     RQCTL           /GET QUOTE CHAR TO USE
+       DCA I   OP2             /PUT RETURNED PREFIX INTO BUFFER
+       ISZ     OP2             /BUMP POINTER
+       TAD     OP1             /GET BACK CONVERTED CHAR
+OPBUF1,        DCA I   OP2             /PUT INTO BUFFER
+       ISZ     OP2             /BUMP POINTER
+       NL7777                  /SET -1                                 /032 CJL
+       DCA I   OP2             /ALWAYS TERMINATE BUFFER
+       TAD     RMAXL           /GET MAX BUFFER LENGTH
+       TAD     (-40+HOLDBF-4   /
+       CIA
+       TAD     OP2             /COMPARE WITH WHAT WE HAVE
+       SPA CLA                 /SKIP IF NO ROOM
+       JMP     OPBUF2          /HAVE ROOM
+       JMS     INIOPB          /RESET BUFFER
+       JMP I   OPBUF           /TAKE RETURN + 1
+
+OPBUF2,        ISZ     OPBUF           /BUMP RETURN FOR BUFFER NOT FULL
+       JMP I   OPBUF           /DONE
+
+OP1,   0                       /TEMP LOCATION
+OP2,   HOLDBF                  /POINTER FOR HOLD BUFFER
+
+/      ROUTINE TO RE-SET THE HOLD BUFFER.
+
+INIOPB,        0
+       TAD     (HOLDBF         /RE-SET BUFFER POINTER
+       DCA     OP2
+       JMP I   INIOPB
+
+/      ROUTINE TO CALCULATE A 1 BYTE CHECKSUM.
+
+CKSUM, 0
+       DCA     CKSUM1          /STORE TEMP
+       TAD     CKSUM1          /GET BACK
+       RTR;RTR;RTR             /GET TWO HIGHEST INTO TWO LOWEST        /032 CJL
+       AND     (3              /KEEP ONLY BITS 0-1
+       TAD     CKSUM1          /GET ORIGINAL
+       AND     [77]            /KEEP ONLY BITS 0-5                     /016 CJL
+       TAD     [40]            /MAKE A CHAR(CHECKSUM)
+       JMP I   CKSUM           /DONE, RETURN IN AC
+
+CKSUM1,        0                       /TEMP FOR "CKSUM"
+\f      PAGE
+\f/     ROUTINE TO INPUT CHARS FROM REMOTE UNTIL A "SOH" CHAR IS FOUND.
+
+GETSOH,        0
+       JMS     COMIN           /GET A CHARACTER FROM THE REMOTE LINE   /046 CJL
+       JMP I   GETSOH          /TIME-OUT
+       AND     [177]           /IGNORE PARITY BIT                      /034 CJL
+       TAD     (-CNTRLA)       /COMPARE WITH "SOH"                     /034 CJL
+       SZA CLA                 /SKIP IF SAME
+       JMP     GETSOH+1        /LOOP TILL WE GET ONE
+       ISZ     GETSOH          /BUMP FOR GOOD RETURN
+       JMP I   GETSOH          /GOT ONE, DONE
+
+
+/      ROUTINE TO GET A CHAR FROM THE REMOTE LINE AND UPDATE CHECKSUM.
+
+GETIR, 0
+       JMS     COMIN           /GET A CHARACTER FROM THE REMOTE LINE   /046 CJL
+       JMP I   GETIR           /TIME-OUT RETURN
+       DCA     GETIR1          /STORE TEMP
+       TAD     GETIR1          /GET CHAR BACK
+       TAD I   (ILINK9)        /ADD CHECKSUM
+       DCA I   (ILINK9)        /RETURN UPDATED CHECKSUM
+       TAD     GETIR1          /RE-GET CURRENT INPUT CHAR
+       TAD     [-15]           /CHECK FOR A RETURN
+       SNA CLA                 /SKIP IF NOT A RETURN
+       JMP I   GETIR           /WAS A RETURN, TAKE EXIT + 1
+       TAD     GETIR1          /RE-GET CHAR FOR RETURN
+       ISZ     GETIR           /BUMP FOR GOOD RETURN
+       JMP I   GETIR           /AND RETURN IN THE AC
+
+GETIR1,        0                       /TEMP LOCAL TO "GETIR"
+\f/     REMOTE COMMUNICATIONS ROUTINES FOR NON-CONNECT USAGE.           /046 CJL
+
+/      REMOTE INPUT ROUTINE.                                           /046 CJL
+
+COMIN, .-.                     /REMOTE INPUT ROUTINE                   /046 CJL
+       CLA                     /CLEAN UP                               /046 CJL
+       TAD     [-15]           /SETUP THE                              /049 CJL
+       DCA     TIMEOUT         /TIME-OUT FACTOR                        /046 CJL
+INLUP, TAD     INFLAG          /IS INPUT AVAILABLE?                    /046 CJL
+
+/      THE ABOVE INSTRUCTION IS FOR DECMATE  II USE ONLY.  THE DEFAULT INSTRUCTION IS
+/      FOR KL8 INTERFACES.
+
+       *INLUP                  /OVERLAY DECMATE II CODE                /049 CJL
+
+INLUP, SKP                     /WE'RE NOT A DECMATE II                 /049 CJL
+       SNA CLA                 /SKIP IF INPUT AVAILABLE (ON DECMATE II)/049 CJL
+INSKIP,        JMP     NOTYET          /JUMP IF NOT                            /049 CJL
+INLUP1,        DCA     INFLAG          /CLEAR INPUT AVAILABILITY FLAG          /049 CJL
+INREAD,        IRB                     /GET THE CHARACTER                      /049 CJL
+
+/      THE ABOVE INSTRUCTIONS ARE FOR DECMATE II  USE ONLY.  THE DEFAULT INSTRUCTIONS
+/      ARE FOR KL8 INTERFACES.
+
+       *INSKIP                 /OVERLAY DECMATE II CODE                /049 CJL
+
+INSKIP,        RKSFIOT                 /INPUT FLAG UP?                         /049 CJL
+INLUP1,        JMP     NOTYET          /NO, CHECK FOR ABORT, ETC.              /049 CJL
+INREAD,        RKRBIOT                 /YES, READ IN THE CHARACTER             /049 CJL
+       AND     [177]           /JUST SEVEN-BIT                         /046 CJL
+       DCA     RCHAR           /SAVE THE CHARACTER                     /046 CJL
+       TAD     RCHAR           /GET IT BACK                            /046 CJL
+       ISZ     COMIN           /BUMP TO GOOD RETURN                    /046 CJL
+       JMP I   COMIN           /RETURN                                 /046 CJL
+
+/      COMES HERE IF INPUT NOT AVAILABLE.
+
+NOTYET,        JMS I   (CTLCTST)       /CHECK FOR <^C>, ETC.                   /044 CJL
+       TAD     [-CNTRLZ]       /COMPARE POSSIBLE CHARACTER TO <^Z>     /044 CJL
+       SZA                     /SKIP IF IT ALREADY MATCHES             /044 CJL
+       TAD     [-CNTRLX+CNTRLZ]/ELSE COMPARE TO <^X>                   /044 CJL
+       SNA CLA                 /SKIP IF NEITHER ABORT CHARACTER        /049 CJL
+       ISZ     ABFLAG          /SET ABORT FLAG                         /049 CJL
+       SKP                     /SKIP IF NOT TOO MANY TIMES             /049 CJL
+       JMP     .-2             /ENSURE FLAG SETTING                    /049 CJL
+\fINSTATU,JMS   UPSTATUS        /UPDATE THE PORT STATUS                 /049 CJL
+
+/      THE ABOVE INSTRUCTION IS FOR DECMATE  II USE ONLY.  THE DEFAULT INSTRUCTION IS
+/      FOR KL8 INTERFACES.
+
+       *INSTATUS               /OVERLAY DECMATE II CODE                /049 CJL
+
+INSTATU,NOP                    /WE'RE NOT A DECMATE II                 /049 CJL
+       ISZ     WASTIME         /WASTE SOME TIME                        /046 CJL
+       JMP     INLUP           /KEEP TRYING                            /046 CJL
+       ISZ     TIMEOUT         /WAITING TOO LONG?                      /046 CJL
+       JMP     INLUP           /NO, KEEP TRYING                        /046 CJL
+       JMP I   COMIN           /YES, TAKE ERROR RETURN                 /046 CJL
+
+/      FLOW-CONTROL STATUS ROUTINE.                                    /049 CJL
+
+GETFLOW,.-.                    /GET FLOW-CONTROL STATUS
+GETFL1,        JMS     UPSTATUS        /UPDATE THE CURRENT STATUS
+
+/      THE ABOVE INSTRUCTION IS FOR DECMATE II USE ONLY.   THE DEFAULT INSTRUCTION IS
+/      FOR KL8 INTERFACES.
+
+       *GETFL1                 /OVERLAY DECMATE II CODE
+
+GETFL1,        NOP                     /WE'RE NOT A DECMATE II
+       JMS I   (RINGET)        /GET REMOTE CHARACTER (IF ANY)
+       CLA                     /THROW IT AWAY
+       TAD     REMWAIT         /GET REMOTE FLOW STATUS
+       JMP I   GETFLOW         /RETURN
+
+/      REMOTE OUTPUT ROUTINE.                                          /046 CJL
+
+COMOUT,        .-.                     /REMOTE OUTPUT ROUTINE                  /046 CJL
+       DCA     OUTEMP          /SAVE PASSED VALUE                      /046 CJL
+CMRESET,TAD    [-15]           /SETUP THE                              /049 CJL
+       DCA     OTIME           /TIME-OUT COUNTER                       /049 CJL
+COMWAIT,JMS    GETFLOW         /GET REMOTE WAIT STATUS                 /049 CJL
+
+/      THE ABOVE INSTRUCTION IS FOR DECMATE USE ONLY.  THE DEFAULT INSTRUCTION IS FOR
+/      KL8 INTERFACES.
+
+       *COMWAIT                /OVERLAY DECMATE CODE                   /049 CJL
+
+COMWAIT,NL7777                 /SETUP FOR FLOW CONTROL FLAG LOAD       /049 CJL
+       AND     FLOWFLAG        /SHOULD WE WAIT FOR REMOTE FLOW CONTROL?/049 CJL
+       SNA CLA                 /SKIP IF SO                             /049 CJL
+       JMP     NOWAIT          /JUMP IF NOT                            /049 CJL
+\fFLOWAIT,JMS   GETFLOW         /GET REMOTE WAIT STATUS                 /049 CJL
+       SZA CLA                 /SKIP IF NOT WAITING                    /049 CJL
+       JMP     FLOWAIT         /JUMP IF STILL WAITING                  /049 CJL
+NOWAIT,        TAD     OUTFLAG         /CHECK IF OUTPUT IS AVAILABLE           /049 CJL
+CMOUT1,        SNA CLA                 /SKIP IF SO                             /049 CJL
+CMOUT2,        JMP     OWAIT           /JUMP IF NOT                            /049 CJL
+DM1AND,        DCA     OUTFLAG         /CLEAR OUTPUT AVAILABILITY FLAG         /049 CJL
+CMOUT3,        TAD     OUTEMP          /GET THE PASSED VALUE                   /049 CJL
+CMOUT4,        OLS                     /OUTPUT IT                              /049 CJL
+
+/      THE ABOVE INSTRUCTIONS ARE FOR DECMATE II  USE ONLY.  THE DEFAULT INSTRUCTIONS
+/      ARE FOR KL8 INTERFACES.
+
+       *NOWAIT                 /OVERLAY DECMATE II CODE                /049 CJL
+
+NOWAIT,        RTSFIOT                 /OUTPUT FLAG UP?                        /049 CJL
+CMOUT1,        JMP     OWAIT           /NO, WAIT FOR IT THERE                  /049 CJL
+
+/      THE ABOVE INSTRUCTION IS FOR DECMATE I USE  ONLY.   THE DEFAULT INSTRUCTION IS
+/      FOR KL8 INTERFACES.
+
+       *CMOUT1                 /OVERLAY DECMATE I CODE                 /049 CJL
+
+CMOUT1,        JMP     COMWAIT         /NO, WAIT FOR IT                        /049 CJL
+CMOUT2,        TAD     OUTEMP          /YES, GET PASSED VALUE                  /049 CJL
+DM1AND,        AND     [377]           /ENSURE EIGHT BITS (FOR DECMATE I)      /049 CJL
+
+/      THE ABOVE INSTRUCTION IS FOR DECMATE I USE ONLY.    THE DEFAULT INSTRUCTION IS
+/      FOR KL8 INTERFACES.
+
+       *DM1AND                 /OVERLAY DECMATE I CODE                 /049 CJL
+
+DM1AND,        SKP                     /WE'RE NOT A DECMATE I                  /049 CJL
+CMOUT3,        TAD     [400]           /FORCE OUTPUT WRITE FOR DECMATE I       /049 CJL
+CMOUT4,        RTLSIOT                 /OUTPUT THE CHARACTER                   /049 CJL
+       CLA                     /CLEAN UP                               /049 CJL
+       JMP I   COMOUT          /RETURN                                 /049 CJL
+
+/      COMES HERE IF OUTPUT NOT READY.                                 /049 CJL
+
+OWAIT, ISZ     OWASTE          /WASTE SOME TIME                        /049 CJL
+       JMP     COMWAIT         /KEEP TRYING                            /049 CJL
+       ISZ     OTIME           /WAITING TOO LONG?                      /049 CJL
+       JMP     COMWAIT         /NO, KEEP TRYING                        /049 CJL
+       JMS I   (DMINIT)        /YES, RESET EVERYTHING                  /049 CJL
+       JMP     CMRESET         /TRY, TRY AGAIN                         /049 CJL
+\f/     DECMATE II, ETC. STATUS UPDATE ROUTINE.                         /046 CJL
+
+UPSTATU,.-.                    /UPDATE THE STATUS ROUTINE              /046 CJL
+       ISF                     /COMMUNICATIONS PORT FLAG UP?           /046 CJL
+       JMP I   UPSTATUS        /NO, RETURN                             /046 CJL
+       NL4000                  /SETUP READ OF REGISTER ZERO            /046 CJL
+       MPSCC                   /TELL THE MPSCC CHIP                    /046 CJL
+       CLA                     /CLEAN UP                               /046 CJL
+       MPSCC                   /READ REGISTER ZERO NOW                 /046 CJL
+       AND     (5)             /JUST INPUT AND OUTPUT BITS             /046 CJL
+       CLL RAR                 /MOVE INPUT TO LINK                     /046 CJL
+       SNA CLA                 /SKIP IF OUTPUT INTERRUPT               /046 CJL
+       JMP     INCHK           /JUMP IF NOT                            /046 CJL
+       TAD     (050)           /GET OUTPUT CLEAR VALUE                 /046 CJL
+       MPSCC                   /CLEAR THE OUTPUT INTERRUPT             /046 CJL
+       DCA     OUTFLAG         /INDICATE OUTPUT AVAILABLE NOW          /046 CJL
+INCHK, CLA RAL                 /GET RECEIVE STATUS                     /046 CJL
+       SZA                     /SKIP IF INPUT NOT AVAILABLE RIGHT NOW  /046 CJL
+       DCA     INFLAG          /INDICATE NEW INPUT STATUS              /046 CJL
+       CLA                     /CLEAN UP EITHER WAY                    /046 CJL
+       TAD     (070)           /GET END OF INTERRUPT VALUE             /046 CJL
+       MPSCC                   /CLEAR THE INTERRUPT                    /046 CJL
+       CLA                     /CLEAN UP                               /046 CJL
+       JMP I   UPSTATUS        /RETURN                                 /046 CJL
+
+       AND377= AND     [377]   /INSTRUCTION CONSTANT                   /049 CJL
+       OUTEMP= COMIN           /OUTPUT ROUTINE TEMPORARY               /049 CJL
+       TIMEOUT=GETFLOW         /TIME-OUT TEMPORARY                     /049 CJL
+       WASTIME=COMOUT          /TIME-OUT TEMPORARY                     /049 CJL
+
+OTIME, .-.                     /TIME-OUT TEMPORARY                     /049 CJL
+OWASTE,        .-.                     /TIME-OUT TEMPORARY                     /049 CJL
+
+       PAGE
+
+/      HOLD BUFFER FOR CHAR OUTPUT
+
+       DECIMAL
+
+HOLDBF,        ZBLOCK  92
+
+       OCTAL
+\f/     ROUTINE TO CHECK FOR CONTROL PREFIX.
+/      ENTER WITH CHAR TO CHECK IN THE AC.
+/      EXIT + 1 WITH CHAR IN THE AC IF NO PREFIX QUOTING.
+/      EXIT + 2 WITH PROPER CHAR IN THE AC AND QUOTING IS REQUIRED.
+
+OPRE,  0                       /CHECK FOR CONTROL PREFIX ROUTINE
+       DCA     PRETEMP         /SAVE THE CHARACTER                     /032 CJL
+       TAD     QFLAG           /CHECK FOR IN CTRL QUOTE MODE
+       SZA CLA                 /SKIP IF YES
+       JMP     OPRE1           /NO QUOTE PREFIX
+       TAD     PRETEMP         /GET THE CHARACTER                      /032 CJL
+       AND     [7740]          /QUICK CHECK FOR <40                    /014/016 CJL
+       SNA CLA                 /SKIP IF NOT CONTROL
+       JMP     OPRE2           /PREFIX QUOTE
+       TAD     PRETEMP         /GET THE CHARACTER                      /032 CJL
+       TAD     (-177           /CHECK FOR "DELETE"
+       SNA CLA                 /SKIP IF NOT
+       JMP     OPRE2           /PREFIX QUOTE
+       TAD     PRETEMP         /GET THE CHARACTER                      /032 CJL
+       CIA                     /NEGATE FOR COMPARE
+       TAD     RQCTL           /SEE IF SAME AS QUOTE CHAR
+       SZA CLA                 /SKIP IF PREFIX QUOTE
+       JMP     OPRE1           /NO PREFIX QUOTE
+       TAD     RQCTL           /PREFIX WITH PREFIX
+       JMP     OPRE3           /PREFIX WITH THE PREFIX
+
+OPRE1, TAD     PRETEMP         /GET THE CHARACTER                      /032 CJL
+       JMP I   OPRE            /DONE
+
+OPRE2, TAD     PRETEMP         /GET THE CHARACTER                      /032 CJL
+       TAD     [100]           /MAKE IT PRINTABLE                      /016 CJL
+       AND     [177]           /IN CASE IT WAS 177                     /014/016 CJL
+
+OPRE3, ISZ     OPRE            /BUMP FOR PREFIX RETURN
+       JMP I   OPRE            /DONE
+
+PRETEMP,.-.                    /PREFIX TEMPORARY                       /032 CJL
+
+       PAGE                                                            /014 CJL
+\f/     ROUTINE TO SCAN A TEXT LINE FOR KEYWORD DELIMITERS.
+
+/      THIS  ROUTINE EXPECTS THE AC TO POINT TO A TEXT LINE TO  SCAN  AND  FINDS  THE
+/      FIRST NON-SPACE, NON-END OF LINE CHAR IN THE LINE AND SETS "SCAN1" TO POINT TO
+/      IT.  NEXT WE FIND THE LAST CHAR IN THE LINE THAT IS A  NON-SPACE,  NON-END  OF
+/      LINE  AND  STORE  A  POINTER  TO  IT  IN "SCAN2".  KEYWORDS ARE DELIMITED BY A
+/      BEGINNING OF  LINE  OR SPACE AT THE BEGINNING AND AN END OF LINE OR A SPACE AT
+/      THE END.
+
+/      ENTER:  AC = POINTER TO COMMAND LINE
+
+/      EXIT: (SUCCESS) SCAN1 = POINTER TO FIRST CHAR OF KEYWORD.
+/                      SCAN2 = POINTER TO LAST CHAR OF KEYWORD.
+/                      RETURN = RETURN + 2 (NO WORDS LEFT IN LINE).
+
+/      EXIT: (FAIL)    RETURN = RETURN + 1.
+
+SCNEL, 0                       /SCAN ROUTINE
+       JMS I   [NOSP]          /FIND FIRST NON-SPACE
+       JMP I   SCNEL           /END OF LINE RETURN
+       DCA     SCAN1           /RETURN SCAN LINE POINTER
+       TAD     SCAN1           /RE-GET SCAN LINE POINTER
+       JMS I   [SP]            /FIND FIRST SPACE OR EOL
+       NOP                     /RETURN HERE ON EOL
+       TAD     (-1             /BACK UP TO PREVIOUS CHAR
+       DCA     SCAN2           /SET END ELEMENT POINTER
+       ISZ     SCNEL           /TAKE SUCCESS RETURN
+       JMP I   SCNEL           /DONE
+
+
+/      ROUTINE TO SCAN THRU A TEXT LINE LOOKING FOR THE NEXT SPACE.
+/      ENTER ROUTINE WITH THE LINE POINTER IN THE AC.
+
+/      EXIT:   RETURN + 2 WITH AC = POINTER TO SPACE.
+/              RETURN + 1 WITH AC = POINTER TO END OF LINE.
+
+SP,    0                       /CHECK FOR A <SPACE> ROUTINE
+       DCA     SCANTP          /USE A TEMP POINTER
+       SKP                     /SKIP INTO LOOP BELOW
+SP1,   ISZ     SCANTP          /BUMP LINE POINTER
+       TAD I   SCANTP          /GET A CHAR
+       SPA                     /SKIP IF NOT END OF LINE
+       JMP     SP3             /GOT AN END OF LINE
+       TAD     [-" !200]       /COMPARE WITH <SP>                      /034 CJL
+       SZA CLA                 /SKIP IF IS A SPACE
+       JMP     SP1             /LOOP TILL SPACE OR EOL
+       ISZ     SP              /BUMP RETURN FOR SPACE FOUND
+
+SP3,   CLA CLL                 /INSURE A CLEAR AC
+       TAD     SCANTP          /GET POINTER VALUE
+       JMP I   SP              /RETURN IN AC
+\f/     ROUTINE TO SCAN THRU A TEXT LINE FOR THE FIRST NON-SPACE.
+/      ENTER ROUTINE WITH POINTER TO THE LINE IN THE AC.
+
+/      EXIT:   RETURN + 2 WITH AC = POINTER TO NON-SPACE.
+/              RETURN + 1 WITH AC = POINTER TO END OF LINE.
+
+NOSP,  0                       /FIND A NON-<SPACE> ROUTINE
+       DCA     SCANTP          /USE A TEMP POINTER
+       SKP                     /SKIP INTO LOOP BELOW
+NOSP1, ISZ     SCANTP          /BUMP THE LINE POINTER
+       TAD I   SCANTP          /GET A CHAR FROM THE LINE
+       SPA                     /SKIP IF NOT EOL
+       JMP     NOSP3           /EXIT IF EOL
+       TAD     [-" !200]       /COMPARE WITH <SP>                      /034 CJL
+       SNA CLA                 /SKIP IF NOT SPACE
+       JMP     NOSP1           /LOOP TILL SPACE OR EOL
+       ISZ     NOSP            /BUMP RETURN FOR SPACE FOUND
+NOSP3, CLA CLL                 /INSURE CLEAR AC
+       TAD     SCANTP          /GET POINTER
+       JMP I   NOSP            /RETURN IN AC
+
+
+
+/      ROUTINE TO FIND AN END CHAR IN A STRING.
+/      ENTER ROUTINE WITH POINTER TO THE STRING IN THE AC.
+/      EXIT WITH THE POINTER TO THE FIRST MINUS CHAR IN THE AC.
+
+FNDEND,        0                       /FIND END CHAR ROUTINE
+       DCA     SCANTP          /PUT POINTER IN SCANTP
+FEND1, TAD I   SCANTP          /GET A CHAR FROM THE STRING
+       SPA CLA                 /SKIP IF NOT END
+       JMP     FEND2           /EXIT IF END OF STRING
+       ISZ     SCANTP          /BUMP THE POINTER
+       JMP     FEND1           /LOOP TILL NON-END OF STRING
+
+FEND2, TAD     SCANTP          /GET POINTER TO NON-END OF STRING
+       JMP I   FNDEND          /EXIT WITH POINTER IN AC
+
+SCANTP,        0                       /USED IN THE SCAN ROUTINES "SP", "NOSP", "FNDNUL"
+\f/     ROUTINE TO LOOKUP THE KEY WORD POINTED TO BY THE AC IN THE      /014 CJL
+/      TABLE POINTED TO BY PTABLE.
+
+/      RETURN + 1 IF NO MATCH IS FOUND WITH AC = ENTRY VALUE.
+/      RETURN + 2 IF NO KEYWORD IS FOUND (EOL DETECTED).
+/      RETURN + 3 IF MATCH IS FOUND WITH THE NEXT PARSE POSITION IN THE LINE IN
+/      THE AC AND THE DISPATCH ADDRESS FROM THE TABLE IN "KEYDSP".
+
+KEYPRS,        .-.                     /KEYWORD PARSE ROUTINE
+       DCA     LOOK3           /SAVE IN CASE OF FAIL
+       TAD     LOOK3           /RE-GET
+/      AND     (137)           /MAKE CHARACTER UPPER-CASE, NO PARITY   /MD013
+       JMS     SCNEL           /TRY TO SCAN OFF A KEYWORD
+       JMP     KP45            /END OF LINE ENCOUNTERED
+       TAD     PTABLE          /GET ADDRESS OF TABLE
+       DCA     LOOK2           /STORE IN LOCAL POINTER
+
+KP10,  TAD     SCAN1           /GET ADDRESS OF SCAN ELEMENT
+       DCA     LOOK1           /INTO LOCAL POINTER
+
+KP20,  TAD I   LOOK1           /GET A CHARACTER FROM THE SCAN ELEMENT
+       CIA                     /NEGATE FOR COMPARE
+       TAD I   LOOK2           /GET A CHAR FROM THE TABLE ELEMENT
+       SZA CLA                 /SKIP IF MATCH
+       JMP     KP90            /NO MATCH, SET TO LOOK AT NEXT TABLE ENTRY
+       TAD     LOOK1           /CHECK IF ALL ENTERED CHARS MATCH
+       CIA                     /NEGATE TO COMPARE
+       TAD     SCAN2           /HAVE WE MATCHED TO THE TERMINATOR?
+       SNA CLA                 /SKIP IF NO
+       JMP     KP40            /YES, GOT ENOUGH TO MATCH
+       ISZ     LOOK1           /MORE TO MATCH, BUMP SCAN ELEMENT POINTER
+       ISZ     LOOK2           /BUMP TABLE ELEMENT POINTER
+       JMP     KP20            /CONTINUE MATCH LOOP
+
+KP40,  TAD     LOOK2           /GET CURRENT TABLE POINTER
+       JMS     FNDEND          /FIND A NULL MARK
+       IAC                     /BUMP BY 1
+       DCA     LOOK1           /STORE IN A POINTER
+       TAD I   LOOK1           /GET DISPATCH ADDRESS
+       DCA     KEYDSP          /PUT INTO DISPATCH ADDRESS
+       ISZ     KEYPRS          /BUMP RETURN
+       ISZ     KEYPRS          /BUMP AGAIN
+       CLA CLL IAC             /AC = 1
+       TAD     SCAN2           /GET POINTER TO END OF CURRENT KEY
+       JMP I   KEYPRS          /RETURN
+
+/      END OF LINE ENCOUNTERED ON PARSE.
+
+KP45,  ISZ     KEYPRS          /BUMP RETURN ONCE FOR EOL
+
+/      NO MATCHES IN THE TABLE HERE.
+
+KP50,  TAD     LOOK3           /GET ORIGINAL AC
+       JMP I   KEYPRS          /RETURN
+\f/     FAILURE ON CURRENT TABLE ENTRY, SET FOR NEXT ENTRY (IF  THERE IS ONE)  AND TRY
+/      AGAIN.
+
+KP90,  TAD     LOOK2           /GET TABLE POINTER
+       JMS     FNDEND          /FIND NEXT TABLE ENTRY
+       IAC;IAC                 /NEXT ENTRY IS 2 PAST THE NULL
+       DCA     LOOK2           /RE-SET LOCAL TABLE POINTER
+       TAD I   LOOK2           /CHECK END OF TABLE
+       SNA CLA                 /SKIP IF NOT END OF THE TABLE
+       JMP     KP50            /TAKE NOT FOUND EXIT
+       JMP     KP10            /TRY MATCH ON THIS ENTRY
+
+LOOK1, .-.                     /TEMPORARY FOR KEYPRS                   /014 CJL
+LOOK2, .-.                     /TEMPORARY FOR KEYPRS                   /014 CJL
+LOOK3, .-.                     /TEMPORARY FOR KEYPRS                   /014 CJL
+
+/      ROUTINE TO MOVE WORDS OF MEMORY.                                /014 CJL
+
+/      CALLING SEQUENCE:
+
+/      TAD     (DESTINATION)   /GET DESTINATION ADDRESS
+/      DCA     MQ              /INTO MQ                                /032 CJL
+/      TAD     (-COUNT)        /GET -NUMBER OF WORDS TO MOVE
+/      DCA     MOVE4           /SETUP MOVE COUNTER
+/      TAD     (SOURCE)        /GET SOURCE ADDRESS
+/      JMS I   (MOVE0)         /CALL MOVE ROUTINE
+/      RETURN                  /RETURNS HERE
+
+MOVE0, .-.                     /MOVE ROUTINE                           /014 CJL
+       DCA     MOVE5           /STORE SOURCE ADDRESS IN LOCAL POINTER
+       TAD     MQ              /GET DESTINATION ADDRESS                /032 CJL
+       DCA     MOVE6           /STORE IN LOCAL POINTER
+MOVE1, TAD I   MOVE5           /GET A WORD FROM THE SOURCE
+       DCA I   MOVE6           /MOVE TO DESTINATION
+       ISZ     MOVE5           /BUMP SOURCE POINTER
+       ISZ     MOVE6           /BUMP DESTINATION COUNTER
+       ISZ     MOVE4           /BUMP COUNTER
+       JMP     MOVE1           /LOOP
+       JMP I   MOVE0           /DONE
+
+MOVE5, .-.                     /SOURCE POINTER FOR "MOVE"
+MOVE6, .-.                     /DESTINATION POINTER FOR "MOVE"
+
+       PAGE                                                            /014 CJL
+\f/     ROUTINE TO PARSE OFF A DEVICE NAME FROM THE COMMAND LINE.       /O14 CJL
+
+/      CALLING SEQUENCE:
+
+/      TAD     (POINTER)       /AC CONTAINS POINTER TO COMMAND LINE
+/      JMS I   [DPARS]         /CALL ROUTINE
+/      ERROR RETURN            /AC UNCHANGED
+/      GOOD RETURN             /AC NOW POINTS TO REST OF LINE
+
+/      DEVNUM= DEVICE NUMBER TO USE.
+/      ":" IS THE FIFTH CHARACTER IF NOT USING DEFAULT DEVICE.
+
+DPARS, .-.                     /DEVICE PARSE ROUTINE                   /014 CJL
+       DCA     DPAR10          /SAVE INITIAL POINTER TO LINE
+       TAD     DPAR10          /GET POINTER
+       JMS I   [NOSP]          /GET PAST ANY LEADING SPACES
+       JMP     DFDEV           /GOT END OF LINE, USE DEFAULT DEVICE
+       DCA     DPAR11          /SAVE POINTER TO LINE
+       DCA     DEVNAME         /INITIALIZE THE DEVICE NAME             /014 CJL
+       DCA     DEVNAME+1       /FOR "INQUIRE" FUNCTION                 /014 CJL
+       TAD     (DEVNAM)        /GET ADDRESS OF WHERE TO PUT DEVICE NAME/014 CJL
+       DCA     PACK6P          /STORE IN PACK6 POINTER
+       DCA     PACK6F          /INITIALIZE PACK6 FLAG FOR LOW BYTE     /014 CJL
+       TAD     (-4)            /SET UP A COUNTER                       /014 CJL
+       DCA     DPAR13          /FOR NO MORE THAN 4 CHARS
+DPAR1, TAD I   DPAR11          /GET A CHAR FROM THE LINE
+       SNA                     /SKIP IF NOT <EOL>                      /014 CJL
+       JMP     DFDEV           /GOT AN <EOL>, USE DEFAULT DEVICE       /014 CJL
+       TAD     (-":!200)       /CHECK FOR ":"                          /034 CJL
+       SNA CLA                 /SKIP IF NOT END OF DEVICE NAME
+       JMP     DPAR2           /DEVICE NAME SET UP
+       TAD I   DPAR11          /RE-GET CHAR
+       ISZ     DPAR11          /BUMP LINE POINTER
+       PACK6                   /PACK SIX-BIT                           /014 CJL
+       ISZ     DPAR13          /BUMP CHARACTER COUNTER                 /014 CJL
+       JMP     DPAR1           /CAN CONTINUE
+       TAD I   DPAR11          /GET CHARACTER AFTER THE FOURTH         /014 CJL
+       TAD     (-":!200)       /CHECK FOR ":"                          /034 CJL
+       SZA CLA                 /SKIP IF YES, ALL IS OK
+       JMP     DFDEV           /USE THE DEFAULT DEVICE
+DPAR2, ISZ     DPAR11          /BUMP POINTER PAST ":"
+       TAD     (DEVNAM)        /GET PARSED DEVICE NAME ADDRESS         /014 CJL
+       JMP     DPAR4           /DO AN OS/8 "INQUIRE"
+
+DFDEV, CLA CLL                 /CLEAN UP                               /019 CJL
+       TAD     DPAR10          /GET ORIGINAL AC FOR
+       DCA     DPAR11          /RETURN POINTER
+DPAR4, JMS     DVNUM           /GET DEVICE NUMBER
+       JMP     DPAR8           /DEVICE NAME ERROR
+       DCA     DEVNUM          /RETURN FOR CALLING PROGRAM
+       TAD     DPAR11          /GET CURRENT POINTER
+       ISZ     DPARS           /BUMP RETURN
+       JMP I   DPARS           /RETURN                                 /014 CJL
+\fDPAR8,        CLA CLL                 /INSURE CLEAR AC
+       TAD     DPAR10          /GET ORIGINAL AC
+       JMP I   DPARS           /TAKE ERROR EXIT
+
+DPAR10,        .-.                     /TEMPORARY FOR DPARS                    /014 CJL
+DPAR11,        .-.                     /TEMPORARY FOR DPARS                    /014 CJL
+DPAR13,        .-.                     /TEMPORARY FOR DPARS                    /014 CJL
+DEFDEV,        DEVICE  DSK             /DEFAULT DEVICE
+DEVNAM,        FILENAM ZZZZZZ.ZZ       /DEFAULT FILENAME                       /014 CJL
+
+/      ROUTINE TO RETURN A DEVICE NUMBER FOR A DEVICE NAME.            /014 CJL
+
+/      CALLING SEQUENCE:
+
+/      TAD     (ADDRESS)       /AC=ADDRESS OF DEVICE NAME
+/                              /*OR* 0000 IF "DSK:" IS TO BE USED
+/      ERROR RETURN            /INVALID DEVICE
+/      GOOD RETURN             /AC=DEVICE NUMBER
+
+DVNUM, .-.                     /DEVICE NUMBER ROUTINE                  /014 CJL
+       SNA                     /SKIP IF DEVICE NAME SPECIFIED
+       TAD     (DEFDEV)        /ELSE USE DEFAULT                       /014 CJL
+       DCA     DVNUM9          /SAVE IN LOCAL POINTER
+       TAD I   DVNUM9          /GET FIRST TWO CHARACTERS OF NAME       /014 CJL
+       DCA     DVNUM5          /PUT INTO CALL
+       ISZ     DVNUM9          /BUMP POINTER
+       TAD I   DVNUM9          /GET LAST TWO CHARACTERS OF NAME        /014 CJL
+       DCA     DVNUM5+1        /PUT INTO CALL
+       CIF     USRFLD          /GOTO USR FIELD                         /020 CJL
+       JMS I   [USRENTRY]      /CALL USER SERVICE ROUTINE              /035 CJL
+       INQUIRE                 /INQUIRE ABOUT HANDLER                  /020 CJL
+DVNUM5,        .-.                     /FIRST TWO BYTES OF DEVICE NAME         /014 CJL
+       .-.                     /LAST TWO BYTES OF DEVICE NAME          /014 CJL
+       0                       /ENTRY POINT OF HANDLER RETURNED HERE
+       JMP I   DVNUM           /ERROR, TAKE ERROR EXIT
+       TAD     DVNUM5+1        /DEVICE NUMBER
+       ISZ     DVNUM           /BUMP RETURN FOR NO ERROR
+       JMP I   DVNUM           /RETURN
+
+DVNUM9,        .-.                     /LOCAL FOR "DVNUM"                      /014 CJL
+\f/     DEVICE HANDLER FETCH ROUTINE.                                   /020 CJL
+
+/      CALLING SEQUENCE:
+
+/      TAD     (HANDLERNUMBER) /AC CONTAINS DEVICE HANDLER NUMBER
+/      JMS I   [HFETCH]        /CALL ROUTINE
+/      ERROR RETURN            /COULDN'T LOAD HANDLER
+/      GOOD RETURN             /HANDLER LOADED
+
+/      IF THE HANDLER WAS LOADED, THEN HNDADR CONTAINS THE HANDLER ENTRY POINT.
+
+HFETCH,        .-.                     /HANDLER FETCH ROUTINE
+       DCA     HANDNUMBER      /STORE HANDLER NUMBER
+       TAD     (HNDLR+1)       /GET OUR BUFFER+(TWO PAGE ALLOWED)
+       DCA     HADR            /STORE IN-LINE
+       TAD     HANDNUMBER      /GET HANDLER NUMBER AGAIN
+       CIF     USRFLD          /GOTO USR FIELD
+       JMS I   [USRENTRY]      /CALL USER SERVICE ROUTINE              /035 CJL
+       FETCH                   /FETCH HANDLER
+HADR,  .-.                     /WILL BE OUR SUGGESTED ADDRESS+TWO PAGES ALLOWED
+       SKP                     /COULDN'T DO IT
+       ISZ     HFETCH          /BUMP TO GOOD RETURN
+       CLA CLL                 /CLEAN UP
+       TAD     HADR            /GET ACTUAL HANDLER ADDRESS
+       DCA     HNDADR          /STASH THE POINTER
+       JMP I   HFETCH          /RETURN EITHER WAY
+
+HANDNUM,.-.                    /HANDLER NUMBER TEMPORARY
+
+\f/     ROUTINE TO HANDLE THE "FINISH" COMMAND.                         /021 CJL
+
+FINSRV,        0
+       JMS I   [CREST2]        /SETUP CONSOLE OUTPUT ROUTINES          /025 CJL
+       TAD     (MSEND)         /GET SEND MODE VALUE                    /045 CJL
+       DCA     KMODE           /SETUP PROPER MODE                      /045 CJL
+       FPACK                   /FORMAT A PACKET
+       SRVFIN                  /PACKET DATA ADDRESS
+       STGEN                   /PACKET TYPE
+
+FIN2,  SPACK                   /SEND PACKET
+       1                       /AWAIT RESPONSE
+       FIN20-2                 /DISPATCH LIST FOR RESPONSE             /027 CJL
+
+/      NAK OR UNDEFINED RESPONSE HERE
+
+FIN5,  ISZ     RTRYC           /BUMP RE-TRY COUNTER
+       JMP     FIN2            /GET RESPONSE AND TRY AGAIN
+       TAD     (NOFINISH)      /FAILED, RETURN MESSAGE                 /025 CJL
+       JMP I   FINSRV
+
+/      ACK HERE
+
+FIN10, ISZ     FINSRV          /BUMP FOR NON-ERROR EXIT
+       JMP I   FINSRV          /DONE
+
+FIN20, STACK;  FIN10           /ACK
+       STNAK;  FIN5            /NAK
+       0
+
+SRVFIN,        "F&137                  /SERVER KERMIT COMMAND TO SHUT DOWN
+       -1                      /END OF DATA
+
+       PAGE
+\f/     ROUTINE TO PARSE OFF A FILE NAME.
+/      FILE NAME TO BE PARSED MUST BE LETTERS OR DIGITS AND BE NO MORE THAN
+/      SIX CHARS FOR THE NAME AND TWO CHARS FOR THE EXTENSION.
+
+/      ENTER WITH:     AC =    POINTER TO FILE NAME TO PARSE.
+/                      FNPTR = POINTER TO WHERE TO PUT THE PARSED FILE NAME.
+
+/      NON-ERROR EXIT: AC =    POINTER TO REMAINDER OF COMMAND LINE.
+/                              RETURN THE CALL + 2.
+
+/      ERROR EXIT:     AC =    ORIGINAL POINTER.
+/                              RETURN THE CALL + 1.
+
+PFNAM, 0
+       DCA     PFN10           /SAVE POINTER TO FILE NAME STRING
+       TAD     FNPTR           /GET POINTER TO FILE NAME BLOCK
+       DCA     MQ              /SET FOR "CLEAR" ROUTINE                /032 CJL
+       TAD     (-4             /FOUR WORDS TO CLEAR OUT
+       CLEAR                   /INIT THE FILE NAME BLOCK
+       TAD     PFN10           /GET THE STRING POINTER
+       JMS I   [NOSP]          /GET PAST ANY LEADING SPACES
+       JMP     PFNAM9          /GOT EOL, NO FILE NAME
+       DCA     PFN11           /SAVE POINTER
+       TAD     FNPTR           /GET FILE NAME BLOCK POINTER
+       DCA     PACK6P          /SET UP THE "PACK6" POINTER
+       DCA     PACK6F          /INIT THE "PACK6" FLAG
+       TAD     (-6             /MAX OF 6 CHARS FOR FILE NAME
+       DCA     PFN15           /PUT INTO COUNTER
+       DCA     WILDF           /INIT THE WILD CARD FLAG
+       JMS     NAM             /MOVE AND PACK FILE NAME
+       TAD I   PFN11           /GET THE TERM CHAR
+       SPA                     /SKIP IF NOT EOL
+       JMP     PFNAM7          /EOL MEANS END OF FILE NAME
+       TAD     (-".!200)       /COMPARE TO "."                         /034 CJL
+       SNA                     /SKIP IF NO
+       JMP     PFNAM3          /GO HANDLE EXTENSION
+       TAD     (-" +".)        /COMPARE TO <SP>                        /034 CJL
+       SZA CLA                 /SKIP IF WAS A SPACE
+       JMP     PFNAM9          /NOT A SPACE, GOT AN ERROR
+       JMP     PFNAM7          /IS A SPACE, END OF FILE NAME
+\fPFNAM3,       ISZ     PFN11           /BUMP PAST THE "."
+       TAD     FNPTR           /GET FILE NAME BLOCK POINTER
+       TAD     (3)             /POINT TO EXTENSION                     /032 CJL
+       DCA     PACK6P          /SET "PACK6" POINTER
+       DCA     PACK6F          /INIT "PACK6" FLAG
+       NL7776                  /SET -2                                 /032 CJL
+       DCA     PFN15           /COUNTER FOR 2 EXT CHARS
+       JMS     NAM             /NOW DO THE EXTENSION
+       TAD I   PFN11           /GET THE TERM CHAR
+       SPA                     /SKIP IF NOT EOL
+       JMP     PFNAM7          /GOT COMPLETE FILE NAME HERE
+       TAD     [-" !200]       /COMPARE TO <SP>                        /034 CJL
+       SZA CLA                 /SKIP IF IT WAS
+       JMP     PFNAM9          /GOT A FILE NAME ERROR
+PFNAM7,        ISZ     PFNAM           /BUMP RETURN FOR GOOD FILE NAME
+       CLA CLL                 /INSURE CLEAR AC
+       TAD     PFN11           /GET CURRENT STRING POINTER
+       JMP I   PFNAM           /AND RETURN
+
+PFNAM9,        CLA CLL                 /INSURE CLEAR AC
+       TAD     PFN10           /GET ORIGINAL STRING POINTER
+       JMP I   PFNAM           /TAKE ERROR RETURN
+
+PFN10, 0                       /TEMP FOR PFNAM ROUTINE
+PFN11, 0                       /TEMP FOR PFNAM ROUTINE
+PFN15, 0                       /TEMP FOR PFNAM ROUTINE
+\f/     LOCAL ROUTINE TO "PFNAM" TO MOVE IN THE FILE NAME OR FILE EXTENSION.
+/      ENTER WITH "PFN11" POINTING TO WHERE TO GET THE NAME OR EXTENSION.
+/      AND "PFN15" EQUAL TO THE MAX NUMBER OF CHARS (6 FOR NAME, 2 FOR EXT).
+/      THIS ROUTINE CHECKS FOR WILD CARD CHARS "*" AND "?" AND PUTS THE
+/      "?" CHAR IN FOR ANY CHARS IN THE NAME THAT ARE WILD.  ALSO IF ANY
+/      WILD CARD CHARS ARE FOUND THE FLAG "WILDC" IS SET SO BEFORE PARSING
+/      ANY FILE NAME THE "WILDC" FLAG SHOULD BE INITIALIZED.
+
+NAM,   0
+NAM0,  TAD I   PFN11           /GET A CHAR FROM THE STRING
+       JMS I   (ALPNUM)        /MUST BE ALPHA OR NUMBER
+       SKP                     /NOT A ALPHA NUMERIC
+       JMP     NAM3            /IS ALPHA NUMERIC
+       TAD     (-"?!200)       /COMPARE TO "?"                         /034 CJL
+       SNA                     /SKIP IF NO
+       JMP     NAM2            /YES, JUST PUT IT IN
+       TAD     (-"*+"?)        /COMPARE TO "*"                         /034 CJL
+       SZA CLA                 /SKIP IF YES
+       JMP I   NAM             /TAKE THE FILE NAME ERROR EXIT
+       ISZ     WILDF           /SET FLAG FOR WILD CARD FOUND
+NAM1,  TAD     ["?&77]         /GET WILD CARD CHARACTER                /034 CJL
+       PACK6                   /PUT IN NAME BLOCK
+       ISZ     PFN15           /BUMP CHAR COUNTER
+       JMP     NAM1            /LOOP TILL ALL FILLED
+       ISZ     PFN11           /BUMP THE STRING POINTER
+       JMP     NAM9            /EXIT WITH "PFN11" POINTING TO NEXT CHAR
+NAM2,  ISZ     WILDF           /SET FLAG FOR WILD CARD FOUND
+       TAD     ["?&77]         /GET WILD CARD CHARACTER                /034 CJL
+NAM3,  PACK6                   /PUT THE CHAR INTO THE FILE NAME BLOCK
+       ISZ     PFN11           /BUMP THE STRING POINTER
+       ISZ     PFN15           /BUMP THE CHAR COUNTER
+       JMP     NAM0            /LOOP
+
+NAM4,  TAD I   PFN11           /NOW GET TO A TERMINATOR CHAR
+       JMS I   (ALPNUM)        /BY FINDING FIRST NON-ALPHNUMERIC
+       JMP     NAM9            /NOW WE CAN QUIT
+       CLA CLL                 /IGNORE EXCESS CHARS
+       ISZ     PFN11           /BUMP THE STRING POINTER
+       JMP     NAM4            /LOOP
+
+NAM9,  CLA CLL                 /LEAVE WITH A CLEAR AC
+       JMP I   NAM             /RETURN
+\f/     ROUTINE TO SEND A PACKET.
+/      ENTER WITH ADDRESS OF PACKET DATA IN CALL + 1.
+/      AND TYPE OF PACKET IN CALL + 2.
+/      EXIT CALL + 4 IF ACK RETURNED.
+/      EXIT CALL + 3 IF NAK OR OTHER PACKET TYPE RETURNED.
+
+SNDP,  0
+       TAD I   SNDP            /GET DATA ADDRESS
+       DCA     SNDP1           /STORE IN CALL
+       ISZ     SNDP            /BUMP POINTER
+       TAD I   SNDP            /GET PACKET TYPE
+       DCA     SNDP2           /STORE IN CALL
+       ISZ     SNDP            /BUMP
+
+       FPACK                   /FORMAT A PACKET
+SNDP1, 0                       /DATA ADDRESS GOES HERE
+SNDP2, 0                       /PACKET TYPE GOES HERE
+
+SNDP3, SPACK                   /SEND A DATA PACKET
+       1                       /GET RESPONSE
+       SNDP9-2                 /RESPONSE DISPATCH TABLE ADDRESS        /027 CJL
+
+/      HERE ON NOT "NAK" OR "ACK" RESPONSE.
+
+       SKP
+
+/      HERE ON "ACK".
+
+SNDP5, ISZ     SNDP            /BUMP RETURN
+
+       ISZ     SNDP            /BUMP RETURN
+       JMP I   SNDP            /EXIT
+
+/      HERE ON NAK.
+
+SNDP4, ISZ     RTRYC           /BUMP THE RE-TRY COUNTER
+       JMP     SNDP3           /RE-TRY
+       JMP I   SNDP            /TAKE RETURN + 3
+
+SNDP9, STACK;  SNDP5           /ACK
+       STACK;  SNDP4           /NAK
+       0
+
+       PAGE                                                            /014 CJL
+\f      IFZERO  1       <
+
+/      ROUTINE TO PARSE OFF A DECIMAL NUMBER.
+/      ENTER ROUTINE WITH A POINTER TO THE PARSE LINE IN THE AC.
+/      EXIT:   RETURN + 1 FOR NO NUMBER.
+/              RETURN + 2 FOR INVALID NUMBER.
+/              RETURN + 3 FOR VALID NUMBER.
+
+/      IN ALL CASES ON RETURN THE AC WILL CONTAIN A POINTER TO THE NEXT CHAR TO PARSE
+/      IN THE LINE.  ANY NUMBER  PARSED  WILL BE CONVERTED TO BINARY AND PUT INTO THE
+/      REGISTER "BININP".
+
+DECPRS,        0
+       JMS I   [NOSP]          /GET PAST ANY LEADING SPACES
+       JMP I   DECPRS          /GOT AN END OF LINE, AC POINTS TO IT
+       DCA     DP10            /SAVE POINTER TO LINE
+       TAD     DP10            /RE-GET POINTER TO LINE
+       DCA     DP11            /STORE IN OUR LINE POINTER
+       DCA     BININP          /INIT BINARY REGISTER
+       DCA     DP13            /INIT PARSED NUMBER FLAG
+       SKP                     /SKIP INTO LOOP BELOW
+DP1,   ISZ     DP11            /BUMP THE LINE POINTER
+       TAD I   DP11            /GET A CHAR FROM THE LINE
+       JMS     DECCK           /CHECK FOR PROPER ASCII DECIMAL
+       JMP     DP5             /NOT PROPER ASCII DECIMAL
+       ISZ     DP13            /FLAG NUMBER INPUT
+       TAD     (-"0            /MAKE BINARY
+       DCA     DP12            /AND STORE
+       TAD     BININP          /GET PREVIOUS INPUT
+       JMS     MUL10           /AND MULTIPLY TIMES 10
+       SZL                     /SKIP IF NO OVERFLOW ENCOUNTERED
+       JMP     DP6             /GOT AN OVERFLOW ERROR
+       TAD     DP12            /COMBINE WITH CURRENT INPUT
+       SZL                     /SKIP IF NO OVERFLOW ERROR
+       JMP     DP6             /GOT AN OVERFLOW ERROR
+       DCA     BININP          /RETURN ACCUMULATED SUM
+       JMP     DP1             /LOOP
+
+DP5,   CLA CLL                 /AC MAY NOT BE CLEAR
+       TAD     DP13            /ANY NUMBERS INPUT YET?
+       SNA CLA                 /SKIP IF YES
+       JMP     DP6             /TAKE THE NO NUMBER INPUT RETURN
+       ISZ     DECPRS          /BUMP THE RETURN
+       ISZ     DECPRS          /TWICE FOR GOOD NUMBER INPUT RETURN
+       TAD     DP11            /GET POINTER TO LINE
+       JMP I   DECPRS          /AND RETURN
+
+DP6,   CLA CLL                 /AC MAY NOT BE CLEAR
+       TAD     DP10            /GET ORIGINAL LINE POINTER
+       ISZ     DECPRS          /BUMP THE RETURN
+       JMP I   DECPRS          /TAKE THE INVALID NUMBER RETURN
+
+                       >
+\f      IFZERO  1       <
+
+DP10,  0                       /TEMP FOR DECPRS
+DP11,  0                       /TEMP FOR DECPRS
+DP12,  0                       /TEMP FOR DECPRS
+DP13,  0                       /TEMP FOR DECPRS
+
+/      ROUTINE TO MULTIPLY THE VALUE OF THE AC TIMES 10.
+/      VALUE IN THE AC IS ASSUMED BINARY.
+
+/      THE NUMBER IS RETURNED IN THE AC.  IF THE LINK IS SET THE MULTIPLY
+/      OVERFLOWED 12 BITS.
+
+MUL10, 0
+       DCA     MULTMP          /SAVE THE NUMBER
+       TAD     MULTMP          /GET THE NUMBER BACK
+       CLL RTL                 /MULTIPLY TIMES 4
+       TAD     MULTMP          /TIMES 5
+       SNL                     /SKIP IF ALREADY OVERFLOWED             /025 CJL
+       RAL                     /TIMES 10
+       JMP I   MUL10           /RETURN NUMBER IN AC
+                               /THE LINK HAS ANY OVERFLOW
+
+MULTMP,        0                       /TEMP STORAGE FOR MUL10 ROUTINE
+
+
+
+/      ROUTINE TO CHECK FOR A VALID ASCII DECIMAL VALUE.
+
+/      ENTER WITH ASCII CHAR IN THE AC.
+/      EXIT RETURN + 1 IF NON-VALID ASCII DECIMAL WITH CHAR IN AC.
+/      EXIT RETURN + 2 IF VALID ASCII DECIMAL WITH CHAR IN AC.
+
+DECCK, 0
+       DCA     DECCK5          /STORE THE CHAR TO CHECK
+       TAD     DECCK5          /GET THE CHAR
+       TAD     (-"0            /CHECK FOR LESS THAN 0
+       SPA                     /SKIP IF NOT LESS THAN 0
+       JMP     DECCK1          /NON-ASCII DECIMAL
+       TAD     ("0-"9-1        /CHECK GREATER THAN 9
+       SMA CLA                 /SKIP IF LE 9
+       JMP     DECCK1          /INVALID ASCII DECIMAL
+       ISZ     DECCK           /BUMP RETURN FOR VALID ASCII DECIMAL
+DECCK1,        TAD     DECCK5          /RE-GET ORIGINAL CHAR IN AC
+       JMP I   DECCK           /RETURN
+
+
+DECCK5,        0                       /TEMP FOR "DECCK" ROUTINE
+
+                       >
+\f/     ROUTINE TO INPUT A COMMAND LINE FROM THE KEYBOARD.              /013/014 CJL
+
+LININP,        0
+       TAD     (LINBUF         /GET ADDRESS OF LINE BUFFER
+       DCA     LIN50           /STORE IN A POINTER
+LIN1,  JMS I   (INPUT)         /GET A CHARACTER FROM THE KEYBOARD      /044 CJL
+       TAD     (-CNTRLM)       /COMPARE TO <CR>                        /034 CJL
+       SNA                     /SKIP IF NOT A RETURN
+       JMP     LIN2            /LINE IS INPUT
+       TAD     (-DELETE+CNTRLM)/COMPARE TO <DEL>                       /034 CJL
+       SNA CLA                 /SKIP IF NOT A DELETE
+       JMP     LIN5            /OFF TO HANDLE A DELETE
+       TAD     LIN50           /GET VALUE OF LINE POINTER
+       TAD     (-LINBUF-LINSIZ /COMPARE WITH END OF LINE BUFFER
+       SMA CLA                 /SKIP IF ROOM IN LINE BUFFER
+       JMP     LIN10           /BEEP FOR FULL BUFFER
+       TAD     INCHAR          /GET THE KEYBOARD CHARACTER AGAIN       /044 CJL
+       TAD     (-140)          /COMPARE TO LOWER-CASE LIMIT            /034 CJL
+       SMA                     /SKIP IF BELOW LIMIT                    /034 CJL
+       TAD     [-40]           /ELSE MAKE IT UPPER-CASE                /034 CJL
+       TAD     (140)           /RESTORE THE CHARACTER                  /034 CJL
+       DCA I   LIN50           /STORE IN THE LINE BUFFER
+       ISZ     LIN50           /BUMP THE LINE BUFFER POINTER
+       NL7777                  /SET -1                                 /032 CJL
+       DCA I   LIN50           /TERMINATE THE LINE
+       TAD     INCHAR          /GET THE LATEST KEYBOARD CHARACTER BACK /044 CJL
+       JMS I   [P7ECHO]        /PRINT IT                               /043 CJL
+       JMP     LIN1            /LOOP TILL A RETURN TYPED
+
+LIN2,  NL7777                  /SET -1                                 /032 CJL
+       DCA I   LIN50           /INSURE STRING TERMINATED
+       JMS I   [SCRIBE]        /DO A                                   /025 CJL
+       CRLF                    /<CR>, <LF>                             /025 CJL
+       JMP I   LININP          /DONE
+
+/      HANDLE A DELETE TYPED IN
+
+LIN5,  TAD     LIN50           /FIND OUT FIRST IF...
+       TAD     (-LINBUF        /WE ARE AT THE BEGINNING OF THE LINE
+       SNA CLA                 /SKIP IF NO
+       JMP     LIN1            /JUST IGNORE THE DELETE
+       NL7777                  /SET -1                                 /032 CJL
+       TAD     LIN50           /GET THE LINE POINTER
+       DCA     LIN50           /RETURN BACKED UP
+       DCA I   LIN50           /ZERO THE CHAR
+       TAD     (CNTRLH)        /GET A <BS>                             /025 CJL
+       JMS I   [P7ECHO]        /PRINT IT                               /043 CJL
+       TAD     [" &177]        /GET A <SPACE>                          /025 CJL
+       JMS I   [P7ECHO]        /PRINT IT                               /043 CJL
+       TAD     (CNTRLH)        /GET A <BS>                             /025 CJL
+       JMS I   [P7ECHO]        /PRINT IT                               /043 CJL
+       JMP     LIN1            /BACK TO INPUT
+\f/     HANDLE FULL LINE BUFFER HERE
+
+LIN10, CLA CLL                 /ENSURE CLEAR AC
+       TAD     [CNTRLG]        /GET A <BEL> CHARACTER                  /025 CJL
+       JMS I   [P7ECHO]        /PRINT IT                               /043 CJL
+       JMP     LIN1            /WAIT FOR EITHER RETURN OF DELETE KEY
+
+LIN50, 0                       /TEMP POINTER FOR "LININP" ROUTINE
+\f/     ROUTINE TO PACK TWO SIX-BIT CHARACTERS INTO A WORD.             /032 CJL
+
+/      CALLING SEQUENCE:
+
+/      [PACK6PTR => CHARACTER PACKING AREA].
+/      [PACK6FLAG=0 IF PACKING INTO HIGH-ORDER BYTE.
+/      PACK6FLAG=4000 IF PACKING INTO LOW-ORDER BYTE].
+
+/      TAD     CHAR            /AC CONTAINS CHARACTER TO BE PACKED
+/      PACK6                   /CALL VIA PAGE ZERO POINTER
+
+/      RETURNS WITH AC CLEAR AND PACK6PTR AND PACK6FLAG UPDATED FOR NEXT PACKING.
+
+PACK60,        .-.                     /PACK SIX-BIT ROUTINE
+       AND     [77]            /JUST SIX-BIT
+       DCA     PACK6TEMP       /SAVE FOR NOW
+       NL4000                  /SET INVERSION BIT
+       TAD     PACK6FLAG       /REVERSE THE FLAG
+       DCA     PACK6FLAG       /STORE BACK
+       SZL                     /WAS IT CLEAR?
+       JMP     PACKIT          /NO, GO DO LOW-ORDER
+       TAD     PACK6TEMP       /GET THE CHARACTER
+       RTL;RTL;RTL             /MOVE UP
+       DCA I   PACK6PTR        /STORE IT
+       JMP I   PACK60          /RETURN
+
+PACKIT,        TAD I   PACK6PTR        /GET PREVIOUS HIGH-ORDER HALFWORD
+       TAD     PACK6TEMP       /ADD ON LATEST
+       DCA I   PACK6PTR        /STORE BOTH
+       ISZ     PACK6PTR        /BUMP FOR NEXT TIME
+       JMP I   PACK60          /RETURN
+
+PACK6TE,.-.                    /PACK6 TEMPORARY
+\f/     ROUTINE TO COMPARE TWO FILE NAMES FOR EQUALITY.
+/      THE ROUTINE WILL CHECK EACH OF THE 8 FILE NAME CHARS AND IF A
+/      CHAR IN THE FIRST FILE NAME (THE ONE WE ARE LOOKING FOR) CONTAINS
+/      A "?" IT WILL MATCH ON THE SECOND FILE NAME CHAR.
+/      ENTER WITH "FCMP1" POINTING TO THE FILE NAME TO FIND, AND "FCMP2"
+/      POINTING TO THE FILE NAME TO TRY AND MATCH.  EXIT + 1 IF NO MATCH
+/      AND EXIT + 2 IF MATCH.  (IF NON-ZERO AC ON ENTRY, THE AC IS ASSUMED
+/      TO HAVE THE VALUE FOR "FCMP2".)
+
+FMATCH,        0
+       SZA                     /SKIP IF NO ARGUMENT IN AC
+       DCA     FCMP2           /THIS ARGUMENT CAME IN THE AC
+       TAD     FCMP1           /GET ADDRESS OF FIRST FILE NAME BLOCK
+       DCA     GET6P           /STORE IN A POINTER
+       DCA     GET6F           /INIT FLAG FOR "GET6" ROUTINE
+       TAD     FCMP2           /GET ADDRESS OF SECOND FILE NAME BLOCK
+       DCA     FMATP           /STORE IN A LOCAL POINTER
+       DCA     FMATF           /INIT LOCAL FLAG
+       TAD     (-10            /8 CHARS TO DO
+       DCA     FMATC           /STORE IN LOCAL COUNTER
+
+FMAT1, NL4000                  /SET 4000                               /032 CJL
+       TAD     FMATF           /GET FLAG
+       DCA     FMATF           /RETURN FLAG, LINK CONTAINS STATUS
+       TAD I   FMATP           /GET A WORD FROM THE SECOND NAME
+       SZL                     /SKIP IF HIGH-ORDER WANTED NOW          /032 CJL
+       JMP     FSWIT           /JUMP IF LOW-ORDER WANTED NOW           /032 CJL
+       RTR;RTR;RTR             /MOVE DOWN HIGH-ORDER                   /032 CJL
+       SKP                     /DON'T BUMP YET                         /032 CJL
+FSWIT, ISZ     FMATP           /BUMP THE POINTER                       /032 CJL
+       AND     [77]            /KEEP ONLY BOTTOM 6 BITS                /016 CJL
+       DCA     FMATT           /STORE IN A TEMP
+       GET6                    /NOW GET A CHAR FROM FIRST NAME
+       TAD     (-77            /CHECK IF WILD
+       SNA                     /SKIP IF NO
+       JMP     FMAT2           /NO MATCH CHECK ON A WILD CARD
+       TAD     [77]            /RESTORE THE CHARACTER                  /014/016 CJL
+       CIA                     /NEGATE FOR COMPARE
+       TAD     FMATT           /COMPARE WITH SECOND FILE NAME
+       SZA CLA                 /SKIP IF IS A MATCH
+       JMP I   FMATCH          /THIS IS NOT A MATCH
+
+FMAT2, ISZ     FMATC           /BUMP COUNTER
+       JMP     FMAT1           /LOOP, MORE TO CHECK
+       ISZ     FMATCH          /BUMP RETURN FOR MATCH
+       JMP I   FMATCH          /GOT A MATCH
+
+FMATP, 0                       /POINTER FOR "FMATCH"
+FMATC, 0                       /COUNTER FOR "FMATCH"
+FMATF, 0                       /FLAG FOR "FMATCH"
+FMATT, 0                       /TEMP FOR "FMATCH"
+FCMP1, 0                       /POINTER FOR FIRST FILE NAME BLOCK
+FCMP2, 0                       /POINTER FOR SECOND FILE NAME BLOCK
+\f      PAGE                                                            /014 CJL
+\f/     REMOTE LINK INPUT ROUTINE.
+/      CALL = RPACK.
+
+ILINK, 0
+       TAD     RETRY           /SET UP A RE-TRY COUNT
+       DCA     ILINK6          /RE-TRY COUNT FOR INPUT ERRORS
+
+ILINK0,        JMS I   (GETSOH)        /FIRST GET THE "SOH" BYTE
+       JMP     ILINK2          /RETURN HERE ON TIME-OUT
+       DCA     ILINK9          /INIT CHECKSUM REGISTER
+       TAD     [RRLEN]         /GET REMOTE RECEIVE BUFFER ADDRESS
+       DCA     ILINK8          /STORE IN LOCAL POINTER
+       JMS I   (GETIR)         /GET A CHAR
+       JMP     ILINK2          /GOT A RETURN OR TIME-OUT
+       DCA I   ILINK8          /STORE LENGTH IN BUFFER
+       TAD I   ILINK8          /GET LENGTH CHAR BACK
+       TAD     (-40-1          /CHAR FUNCTION - LENGTH BYTE
+       CIA                     /NEGATE FOR COUNTER
+       DCA     ILINK7          /STORE IN LOCAL COUNTER
+
+ILINK1,        ISZ     ILINK8          /BUMP POINTER
+       JMS I   (GETIR)         /GET NEXT CHAR
+       JMP     ILINK2          /GOT A RETURN
+       DCA I   ILINK8          /STORE IN BUFFER
+       ISZ     ILINK7          /BUMP COUNTER
+       JMP     ILINK1          /LOOP
+
+       ISZ     ILINK8
+       NL7777                  /SET -1                                 /032 CJL
+       DCA I   ILINK8
+       TAD     ILINK9          /GET CALCULATED CHECKSUM
+       JMS I   [CKSUM]         /CALCULATE 1 BYTE CHECKSUM
+       CIA                     /NEGATE FOR COMPARE
+       DCA     ILINK7          /STORE TEMP
+       JMS I   (GETIR)         /NOW GET CHECKSUM
+       JMP     ILINK2          /GOT A RETURN
+       TAD     ILINK7          /COMPARE WITH CALCULATED CHECKSUM
+       SNA CLA                 /SKIP IF NOT SAME
+       JMP     ILINK4          /ARE SAME
+
+ILINK2,        CLA CLL                 /INSURE CLEAR AC
+       ISZ     ILINK6          /BUMP RE-TRY COUNTER
+       JMP     ILINK3          /CAN RE-TRY
+       TAD     (RPERMSG)       /GET MESSAGE FOR FATAL PACKET ERROR     /025 CJL
+       JMP I   [CLOOP7]        /AND ABORT THE MESS
+
+ILINK3,        TAD     ABFLAG          /GET ABORT FLAG                         /044 CJL
+       SZA CLA                 /SKIP IF NO
+       JMP I   (ABORT)         /ABORT THIS
+       JMS I   (SNDNAK)        /SEND BACK A "NAK"
+       JMP     ILINK0          /AND TRY AGAIN
+\fILINK4,       TAD     ABFLAG          /GET ABORT FLAG                         /044 CJL
+       SNA CLA                 /SKIP IF YES
+       JMP I   ILINK           /NOPE, RETURN
+       JMP I   (ABORT)
+
+ILINK6,        0                       /LOCAL TO "ILINK"
+ILINK7,        0                       /LOCAL TO "ILINK"
+ILINK8,        0                       /LOCAL TO "ILINK"
+ILINK9,        0                       /LOCAL TO "ILINK"
+
+/      HELP COMMAND ROUTINE.                                           /024 CJL
+
+HELPSRV,.-.                    /HELP ROUTINE
+       JMS I   [CRESET]        /RESET CONSOLE ROUTINE STUFF
+       JMS I   [SCRIBE]        /GIVE THEM THE
+       HELPMSG                 /HELP MESSAGE
+       TAD     ESCHAR          /GET THE ESCAPE CHARACTER
+       JMS I   [ESCPRNT]       /PRINT IT
+       JMS I   [SCRIBE]        /DO A
+       CRLF                    /<CR>, <LF>
+       ISZ     HELPSRV         /BUMP PAST ERROR RETURN
+       JMP I   HELPSRV         /RETURN
+
+/      ROUTINE TO PRINT THE DATA IN THE RECEIVED PACKET.
+
+PRIPAK,        0
+       PRI8B;  RRDTA           /PRINT THE DATA
+       JMS I   [SCRIBE]        /DO A                                   /025 CJL
+       CRLF                    /<CR>, <LF>                             /025 CJL
+       JMP I   PRIPAK          /DONE
+
+       PAGE                                                            /014 CJL
+\f/     ROUTINE TO SERVICE A SEND REQUEST.
+
+SNDSRV,        0
+       JMS I   [CREST2]        /SETUP CONSOLE OUTPUT ROUTINES          /025 CJL
+       TAD     (MSEND)         /FIRST SET MODE TO SEND
+       DCA     KMODE           /PUT INTO MODE FLAG
+       TAD     LPTR            /GET CURRENT LINE POINTER
+       DCA     PRSERR          /SAVE LINE POSITION
+       TAD     PRSERR          /GET LINE POSITION
+       JMS I   [DPARS]         /TRY TO PARSE OFF A DEVICE NAME
+       JMS     SNDERROR        /RETURN A DEVICE NAME ERROR             /026 CJL
+SER1,  DCA     PRSERR          /SAVE LINE POINTER                      /026 CJL
+       TAD     (FNBLK          /GET FILE NAME BLOCK ADDRESS
+       DCA     FNPTR           /STORE IN POINTER
+       TAD     PRSERR          /GET STRING POINTER
+       JMS I   [PFNAM]         /PARSE OFF THE FILE NAME
+       JMS     SNDERROR        /FILE NAME PARSE ERROR                  /026 CJL
+SER2,  DCA     PRSERR          /SAVE THE STRING POINTER                /026 CJL
+       TAD     PRSERR          /GET THE STRING POINTER
+       JMS I   [NOSP]          /FIND THE END OF STRING
+       SKP                     /GOT END OF STRING HERE
+       JMS     SNDERROR        /SYNTAX ERROR                           /026 CJL
+SER3,  DCA     PRSERR          /RETURN POINTER                         /026 CJL
+       TAD     DEVNUM          /GET THE DEVICE NUMBER PARSED
+       JMS I   [HFETCH]        /FETCH A HANDLER FOR THIS
+       JMS     SNDERROR        /HANDLER FETCH ERROR                    /026 CJL
+SER4,  DCA     FILFND          /INIT FILE FOUND FLAG
+       DCA     INIFLG          /CLEAR THE INIT DONE FLAG
+       NL0001                  /INITIALIZE DIRECTORY                   /028 CJL
+       DCA     SLFLAG          /LOOKUP FLAG                            /028 CJL
+SNDSV1,        TAD     (FNBLK          /GET FILE NAME BLOCK ADDRESS
+       DCA I   (FCMP1)         /SET FOR FILE TO FINE
+       TAD     SLFLAG          /GET DIRECTORY FLAG                     /028 CJL
+       JMS I   (LUKUP)         /FIND A MATCH FOR THIS FILE
+       JMS     SNDERROR        /DIRECTORY I/O ERROR                    /026 CJL
+SER5,  JMP     S00             /FILE NOT FOUND                         /026 CJL
+       ISZ     FILFND          /BUMP FILE FOUND COUNT
+       DCA     SLFLAG          /DON'T INITIALIZE LOOKUP AGAIN
+       JMS I   (SNDPRO)        /PROCESS THIS FILE FOR SEND
+       JMS     SNDERROR        /ERROR IN FILE SEND PROCESS             /026 CJL
+SER6,  TAD     WILDF           /WAS WILD CARD FILE SPEC?               /026 CJL
+       SZA CLA                 /SKIP IF NO
+       JMP     SNDSV1          /GOT WILD CARD, TRY FOR NEXT
+S00,   TAD     FILFND          /CHECK FOR ANY FILES FOUND
+       SNA CLA                 /SKIP IF YES
+       JMS     SNDERROR        /RETURN FILE NOT FOUND ERROR            /026 CJL
+SER7,  JMS     BRKXMT          /BREAK THE SEND                         /026 CJL
+       TAD     PRSERR          /GET CURRENT CURSOR POSITION
+       DCA     LPTR            /UPDATE
+       ISZ     SNDSRV          /BUMP RETURN
+       JMP I   SNDSRV          /AND DONE
+\f/     SEND ERRORS COME HERE.                                          /026 CJL
+
+SNDERRO,.-.                    /SEND ERROR ROUTINE
+       CLA                     /CLEAN UP
+       TAD     SNDERROR        /GET CALLER
+       JMS I   [SRCHTABLE]     /GO MATCH IT
+       SNERTABLE-1-1           /IN ERROR TABLE
+       JMP I   SNDSRV          /TAKE ERROR EXIT WITH MESSAGE ADDRESS IN AC
+
+/      SEND ERROR MESSAGE DISPATCH TABLE.                              /026 CJL
+
+SNERTAB,-SER1; DNERMSG         /DEVICE NAME ERROR
+       -SER2;  FNERMSG         /FILE NAME ERROR
+       -SER3;  FSERMSG         /FILE NAME SYNTAX ERROR
+       -SER4;  SHFEMSG         /HANDLER FETCH ERROR
+       -SER5;  SDERMSG         /DIRECTORY I/O ERROR
+       -SER6;  SNDEMSG         /SEND ERROR
+       -SER7;  NOTFND          /LOOKUP
+       0                       /THIS ENDS THE LIST
+
+FILFND,        0                       /HOLDS COUNT OF # OF FILES FOUND
+SLFLAG,        .-.                     /LOOKUP INITIALIZE FLAG                 /028 CJL
+FNBLK, 0
+       0
+       0
+       0
+\f/     ROUTINE TO RE-SET THE SEND.
+
+BRKXMT,        .-.
+       CLA CLL                 /INSURE CLEAR AC
+       DCA     INIFLG          /CLEAR THE INIT SEND FLAG
+       FPACK                   /FORMAT A PACKET
+       NODATA                  /NO DATA FOR THIS PACKET
+       STEOT                   /"EOT" PACKET TYPE
+       SPACK                   /SEND THE PACKET
+       1                       /READ RESPONSE                          /042 CJL
+       0                       /DO NOT DISPATCH                        /042 CJL
+       JMP I   BRKXMT          /DONE
+
+/      ROUTINE TO SEND OUT A NAK WITHOUT DISTURBING THE NORMAL PACKET BUFFER.
+
+SNDNAK,        0
+       NL7777                  /-1                                     /042 CJL
+       TAD     CURSEQ          /ADD ON CURRENT SEQUENCE NUMBER         /042 CJL
+       AND     [77]            /MODULO 64                              /042 CJL
+       TAD     [40]            /TAKE CHAR(SEQUENCE NUMBER)             /042 CJL
+       DCA     NAKPAK+2        /PUT IN NAK PACKET BUFFER
+       TAD     NAKPAK+1        /GET LENGTH
+       TAD     NAKPAK+2        /GET SEQ
+       TAD     NAKPAK+3        /GET TYPE
+       JMS I   [CKSUM]         /CALCULATE CHECKSUM
+       DCA     NAKPAK+4        /PUT IN CHECKSUM
+       TAD     REOL            /GET ANY EOL REQUIRED
+       TAD     [-40]           /UN-CHAR IT                             /014/016 CJL
+       SNA                     /SKIP IF USING
+       NL7777                  /NO EOL, PUT IN -1 INSTEAD              /032 CJL
+       DCA     NAKPAK+5        /PUT EOL IN
+       REM8B;  NAKPAK          /SEND NAK TO REMOTE
+       JMP I   SNDNAK          /DONE
+
+
+NAKPAK,        CNTRLA                  /MARK                                   /042 CJL
+       " &77+3                 /LENGTH OF NAK PACKET                   /042 CJL
+       .-.                     /SEQUENCE NUMBER GOES HERE              /042 CJL
+       STNAK                   /DATA TYPE
+       .-.                     /CHECKSUM                               /042 CJL
+       .-.                     /<EOL> IF USED                          /042 CJL
+       -1                      /TERMINATE
+
+/      FILENAME BUFFER.                                                /014 CJL
+
+NAMBUFF,ZBLOCK 12              /FILENAME.EXTENSION (WITH TERMINATOR) GOES HERE
+\f      PAGE                                                            /014 CJL
+\f/     ROUTINE TO SERVICE A "GET" COMMAND.
+
+GETSRV,        0
+       JMS I   [CREST2]        /SETUP CONSOLE OUTPUT ROUTINES          /025 CJL
+       TAD     (MREC)          /GET OUR MODE VALUE                     /045 CJL
+       DCA     KMODE           /SETUP NOW                              /045 CJL
+       TAD     LPTR            /GET CURRENT LINE POINTER
+       DCA     PRSERR          /SAVE
+       TAD     PRSERR          /RE-GET IT
+       JMS I   [DPARS]         /PARSE OFF THE DEVICE NAME              /006/014 CJL
+       JMP     GSRV50          /ERROR IN DEVICE NAME                   /006
+       JMS I   [NOSP]          /FIND BEGINNING OF A FILE NAME
+       JMP     GSRV22          /GOT <EOL>, NO FILE NAME                /006/014 CJL
+       DCA     GSRV90          /STORE BEGINNING ADDRESS
+       TAD     GSRV90          /NOW WE LOOK FOR
+       JMS I   [SP]            /THE END OF THE LINE
+       SKP                     /GOT THE END OF THE LINE HERE
+       JMP     .-2             /NOT END YET, CONTINUE
+       DCA     PRSERR          /STORE POINTER TO EOL
+       NL7777                  /SET -1                                 /032 CJL
+       DCA I   PRSERR          /TERMINATE FILE NAME WITH -1
+       DCA     CURSEQ          /RE-SET THE SEQUENCE
+       TAD     GSRV90          /GET ADDRESS OF FILE NAME
+
+GSRV10,        FPACK                   /FORMAT THE PACKET
+GSRV90,        0                       /DATA ADDRESS HERE
+       STRIN                   /RECIEVE INIT PACKET
+
+GSRV12,        SPACK                   /SEND THE PACKET
+       1                       /GET RESPONSE
+       GSRV80-2                /DISPATCH TABLE                         /027 CJL
+
+/      SERVICE A NAK OR UNDEFINED.
+
+GSRV15,        ISZ     RTRYC           /BUMP THE RE-TRY COUNTER
+       JMP     GSRV12          /TRY AGAIN
+       JMP I   GETSRV          /GIVE UP
+
+/      SERVICE A SEND/INIT FROM THE REMOTE.
+
+GSRV20,        JMS I   (INPSRV)        /HANDLE JUST LIKE A RECEIVE
+       JMP     GSRV21          /ERROR RETURN FROM "INPSRV"
+       ISZ     GETSRV          /BUMP RETURN FOR NO ERROR
+       TAD     PRSERR          /UPDATE THE CURRENT LINE POINTER
+       DCA     LPTR
+GSRV21,        JMP I   GETSRV
+
+GSRV22,        CLA CLL                 /MAKE SURE WE ARE CLEAR                 /009/014 CJL
+       TAD     [NOTFND]        /GET ERROR MESSAGE ADDRESS              /025 CJL
+       JMP I   GETSRV          /TAKE ERROR RETURN                      /009/014 CJL
+
+/      GOT AN ERROR PACKET, DISPLAY ERROR AND ABORT.
+
+GSRV40,        JMS I   [PRIPAK]        /PRINT OUT THE ERROR PACKET
+       JMP I   GETSRV          /TAKE THE ERROR EXIT
+\f/     GOT DEVICE ERROR.                                               /006/014 CJL
+
+GSRV50,        CLA CLL                 /ENSURE CLEAR AC                        /006/014 CJL
+       TAD     (DNERMSG)       /GET ERROR MESSAGE ADDRESS              /025 CJL
+       JMP I   GETSRV          /TAKE ERROR RETURN                      /006/014 CJL
+
+/      DISPATCH TABLE.
+
+GSRV80,        STERR;  GSRV40          /ERROR PACKET RETURNED
+       STSIN;  GSRV20          /SEND INIT PACKET RETURNED
+       STNAK;  GSRV15          /NAK PACKET RETURNED
+       0                       /TERMINATE TABLE
+\f/     ROUTINE TO SERVICE A "RECEIVE" COMMAND.
+
+RECSRV,        0
+       JMS I   [CREST2]        /SETUP CONSOLE OUTPUT ROUTINES          /025 CJL
+       TAD     (MREC)          /GET OUR MODE VALUE                     /045 CJL
+       DCA     KMODE           /SETUP NOW                              /045 CJL
+       TAD     LPTR            /GET CURRENT LINE POINTER
+       DCA     PRSERR          /SAVE IT
+       TAD     PRSERR          /GET IT BACK
+       JMS I   [DPARS]         /PARSE OFF DEVICE NAME                  /018 CJL
+       JMP     RECS30          /ERROR IN DEVICE NAME                   /018 CJL
+       JMS I   [NOSP]          /CHECK IF BEGINNING OF FILE NAME        /014 CJL
+       SKP                     /GOT <EOL> HERE                         /018 CJL
+       JMP     RECS60          /SOMETHING ELSE ON LINE, ERROR          /014 CJL
+       DCA     PRSERR          /SAVE CURRENT LINE POINTER              /018 CJL
+       RPACK                   /GET SEND/INIT PACKET FROM REMOTE
+       JMS I   (DISPATCH)      /DISPATCH BASED ON RRTYP                /031 CJL
+       RECS80-2                /TABLE ADDRESS                          /027/031 CJL
+       JMP     RECS60          /DON'T KNOW WHAT IT IS
+
+/      GOT A SEND INIT PACKET.
+
+RECS10,        JMS I   (INPSRV)        /OFF TO HANDLE INPUT
+       JMP     RECS60          /ERROR RETURN
+
+/      TAKE THE NON-ERROR RETURN.
+
+RECS20,        ISZ     RECSRV          /BUMP FOR NON-ERROR RETURN
+       TAD     PRSERR          /GET CURRENT CURSOR POSITION            /018 CJL
+       DCA     LPTR            /UPDATE IT                              /018 CJL
+       JMP I   RECSRV
+
+/      GOT ERROR IN DEVICE NAME.                                       /018 CJL
+
+RECS30,        CLA CLL                 /CLEAN UP                               /018 CJL
+       TAD     (DNERMSG)       /GET ERROR MESSAGE ADDRESS              /025 CJL
+       JMP I   RECSRV          /TAKE ERROR RETURN                      /018 CJL
+
+/      TAKE THE ERROR RETURN.
+
+RECS60,        CLA
+       JMP I   RECSRV          /TAKE ERROR EXIT
+
+/      DISPATCH TABLE.
+
+RECS80,        STSIN;  RECS10          /SEND INIT PACKET DISPATCH
+       STEOT;  RECS60          /END OF CONNECTION
+       STBRK;  RECS20          /BREAK TRANSMISSION
+       0
+
+RECS90,        0                       /TEMP FOR "RECSRV"
+\f/     KEYBOARD LINE BUFFER.                                           /014 CJL
+
+LINBUF,        ZBLOCK  LINSIZE         /LINE BUFFER
+
+       PAGE                                                            /014 CJL
+\f/     ROUTINE TO SERVICE INPUT OF A FILE.
+
+INPSRV,        0
+       JMS I   (SETINI)        /SET UP INIT REGISTERS
+       DCA     OFFLG           /INITIALIZE OUTPUT FILE FLAG            /036 CJL
+       CIF     USRFLD          /GOTO USR FIELD                         /037 CJL
+       JMS I   [USRENTRY]      /CALL USER SERVICE ROUTINE              /037 CJL
+       RESET                   /RESET TABLES                           /037 CJL
+       DCA     CURSEQ          /RE-SET THE SEQUENCE NUMBER
+
+       FPACK                   /FORMAT A PACKET
+       INIDAT                  /PACKET DATA ADDRESS
+       STACK                   /"ACK" PACKET TYPE
+
+
+INPS01,        SPACK                   /SEND A PACKET
+       1                       /AWAIT RESPONSE
+       INPS91-2                /DISPATCH TABLE ADDRESS                 /027 CJL
+
+/      NAK OR UNDEFINED RESPONSE HERE.
+
+INPS02,        ISZ     RTRYC           /GOT A NAK, CHECK RE-TRY COUNT
+       JMP     INPS01          /RE-TRY THE INIT
+       JMS     INPERROR        /GIVE UP                                /025 CJL
+
+       IER02=  .               /ERROR TABLE ADDRESS                    /039 CJL
+
+INPS03,        FPACK                   /FORMAT A PACKET
+       NODATA                  /NO DATA
+       STACK                   /"ACK" PACKET TYPE
+
+INPS05,        SPACK                   /SEND A PACKET
+       1                       /AWAIT RESPONSE
+       INPS90-2                /DISPATCH TABLE ADDRESS                 /027 CJL
+       JMS     INPERROR        /UNDEFINED RESPONSE                     /025 CJL
+
+       IER05=  .               /ERROR TABLE ADDRESS                    /039 CJL
+
+/      GOT A DATA PACKET, WRITE TO OUTPUT FILE.
+
+INPS10,        TAD     OFFLG           /CHECK THE OUTPUT FILE FLAG
+       SNA CLA                 /SKIP IF OUTPUT FILE OPEN
+       JMS     INPERROR        /ABORT AND EXIT                         /025 CJL
+IER10, JMS I   (WRIPAK)        /WRITE THE PACKET TO THE FILE           /039 CJL
+       JMS     INPERROR        /ERROR WRITING PACKET                   /025 CJL
+IER11, JMP     INPS03          /LOOP                                   /039 CJL
+\f/     GOT A FILE HEADER PACKET, OPEN FILE.
+
+INPS20,        TAD     OFFLG           /CHECK IF OUTPUT FILE OPEN
+       SZA CLA                 /SKIP IF NO
+       JMS     INPERROR        /ABORT IF FILE ALREADY OPEN             /025 CJL
+IER20, TAD I   [RRLEN]         /GET CURRENT PACKET LENGTH              /039 CJL
+       TAD     (-40-3          /CALCULATE LENGTH OF DATA
+       SPA                     /SKIP IF DATA IN THE PACKET
+       JMS     INPERROR        /ELSE AN ERROR                          /025 CJL
+IER21, TAD     (RRDTA)         /CALCULATE LAST BYTE IN DATA            /039 CJL
+       DCA     INPS81          /STORE IN POINTER
+       NL7777                  /SET -1                                 /032 CJL
+       DCA I   INPS81          /TERMINATE NAME WITH A MINUS WORD
+       TAD     (FNBLK          /GET ADDRESS OF FILE NAME BLOCK
+       DCA     FNPTR           /SAVE FOR NAME PARSE
+       TAD     (RRDTA          /GET ADDRESS OF DATA IN PACKET
+       JMS I   [PFNAM]         /PARSE OFF THE FILE NAME
+       JMS     INPERROR        /ERROR IN FILE NAME                     /025 CJL
+
+/      GET TARGET DEVICE.
+
+IER23, CLA CLL                 /CLEAR AC FROM FILE NAME PARSE          /039 CJL
+       TAD     DEVNUM          /GET DEVICE NUMBER PARSED               /006
+       DCA     ODNUMB          /SAVE OUTPUT DEVICE NUMBER
+       TAD     ODNUMB          /GET NUMBER BACK
+       JMS I   [HFETCH]        /FETCH HANDLER FOR THIS DEVICE
+       JMS     INPERROR        /HANDLER FETCH ERROR                    /025 CJL
+IER24, TAD     (FNBLK)         /GET ADDRESS OF FILE NAME BLOCK         /039 CJL
+       DCA     INPS22          /PUT IN CALL
+       TAD     ODNUMB          /GET DEVICE NUMBER
+       CIF     USRFLD          /GOTO USR FIELD                         /020 CJL
+       JMS I   [USRENTRY]      /CALL USER SERVICE ROUTINE              /035 CJL
+       ENTER                   /ENTER TENTATIVE FILE                   /020 CJL
+INPS22,        0                       /
+       0                       /
+       JMS     INPERROR        /NO DIRECTORY ROOM                      /025 CJL
+IER22, TAD     INPS22          /GET NEW FILE START BLOCK               /039 CJL
+       DCA     FSBLK           /SAVE
+       TAD     INPS22+1        /GET INDICATED MAXIMUM FILE SIZE        /021 CJL
+       IAC                     /GIVE ONE MORE THAN 2 LESS              /021 CJL
+       DCA     FLEN            /SAVE AS DANGER COUNT                   /021 CJL
+       ISZ     OFFLG           /SET FLAG FOR OUTPUT FILE OPEN
+       NL7777                  /INDICATE INITIALIZATION                /020 CJL
+       JMS I   [PUTBYTE]       /INITIALIZE OUTPUT FILE ROUTINE         /020 CJL
+       HLT                     /THIS CAN'T HAPPEN!                     /020 CJL
+       TAD     FNPTR           /GET POINTER TO 6 BIT FILE NAME
+       JMS I   [FILN8]         /MAKE 8 BIT FORMATTED STRING
+       JMS I   [SCRIBE]        /TELL THEM
+       FRECMSG                 /WE ARE RECEIVING
+       PRI8B;  NAMBUF          /WHICH FILE WE ARE RECEIVING
+       JMS I   [SCRIBE]        /DO A
+       CRLF                    /<CR>, <LF>
+       JMP     INPS03          /LOOP
+\f/     GOT AN END OF FILE PACKET.
+
+INPS30,        TAD     OFFLG           /ANY OUTPUT FILE OPEN?
+       SNA CLA                 /SKIP IF YES
+       JMS     INPERROR        /ERROR                                  /025 CJL
+IER30, JMS I   [FILCLOSE]      /CLOSE THE FILE                         /020/039 CJL
+       JMS     INPERROR        /ERROR CLOSING THE FILE                 /025 CJL
+IER31,/        DCA     OFFLG           /RE-SET FILE OPEN FLAG                  /D009/039 CJL
+       JMP     INPS03          /CONTINUE
+
+/      GOT AN END OF TRANSMISSION PACKET.
+
+INPS40,        TAD     OFFLG           /WAS A FILE OPEN?
+       SZA CLA                 /SKIP IF NO
+       JMS I   [FILCLOSE]      /CLOSE ANY OPEN FILE                    /020 CJL
+       NOP                     /ERROR CLOSING THE FILE **** FIX THIS ****
+       FPACK                   /FORMAT A PACKET
+       NODATA                  /NO DATA IN PACKET
+       STACK                   /"ACK" PACKET TYPE
+
+       SPACK                   /SEND THE PACKET
+       0                       /NO RESPONSE
+       ISZ     INPSRV          /BUMP RETURN FOR NO ERROR
+       JMP I   INPSRV          /TAKE NON-ERROR EXIT
+
+/      GOT AN ERROR PACKET.
+
+INPS50,        JMS I   [PRIPAK]        /PRINT THE PACKET DATA
+       JMP I   INPSRV          /AND TAKE THE ERROR EXIT                /009/014 CJL
+
+/      INPUT ERRORS COME HERE.                                         /025 CJL
+
+INPERRO,.-.                    /INPUT ERROR ROUTINE                    /025 CJL
+       FPACK                   /FORMAT A PACKET                        /025 CJL
+       NODATA                  /NO DATA                                /025 CJL
+       STBRK                   /"BREAK LINK" PACKET TYPE               /025 CJL
+       SPACK                   /SEND THE PACKET                        /025 CJL
+       0                       /NO RESPONSE                            /025 CJL
+       TAD     INPERROR        /GET CALLER                             /025 CJL
+       JMS I   [SRCHTABLE]     /TRY TO FIND A MATCH                    /025 CJL
+       INERTABLE-1-1           /IN ERROR TABLE                         /025 CJL
+       SNA                     /SKIP IF FOUND PARTICULAR MESSAGE       /025 CJL
+       TAD     (RERRMSG)       /ELSE USE GENERAL MESSAGE               /025 CJL
+       JMP I   INPSRV          /TAKE ERROR RETURN                      /025 CJL
+
+/      TEMPS FOR "INPSRV".
+
+INPS80,        0
+INPS81,        0
+\f      PAGE                                                            /014 CJL
+\f/     DISPATCH TABLES FOR "INPSRV".
+
+INPS90,        STDAT;  INPS10          /HANDLE DATA PACKETS
+       STEOF;  INPS30          /HANDLE EOF PACKET
+       STEOT;  INPS40          /HANDLE END OF TRANSMISSION PACKET
+       STFIL;  INPS20          /HANDLE FILE NAME PACKET
+       STERR;  INPS50          /HANDLE ERROR PACKET
+       0                       /TERMINATE TABLE
+
+INPS91,        STNAK;  INPS02          /HANDLE A NAK PACKET
+       STFIL;  INPS20          /HANDLE FILE NAME PACKET
+       STERR;  INPS50          /HANDLE ERROR PACKET
+       0                       /TERMINATE TABLE
+
+/      INPUT ERROR MESSAGE DISPATCH TABLE.                             /025/039 CJL
+
+INERTAB,-IER05;        UPERMSG         /UNDEFINED PACKET ERROR                 /025 CJL
+       -IER11; DSFLMSG         /DISK OVERFLOW ERROR                    /042 CJL
+       -IER22; RIDEMSG         /DIRECTORY FULL ERROR                   /025 CJL
+       -IER23; RFLNMSG         /RECEIVED FILE NAME ERROR               /025 CJL
+       -IER24; RHFEMSG         /HANDLER FETCH ERROR                    /025 CJL
+       -IER31; FCLEMSG         /FILE CLOSE ERROR                       /025 CJL
+       0                       /THIS ENDS THE LIST                     /025 CJL
+\f/     ROUTINE TO CHECK FOR AN ALPHABETIC OR NUMERIC CHAR.
+/      ENTER WITH THE CHAR IN THE AC.
+/      EXIT + 2 IF ALPHABETIC OR NUMERIC WITH CHAR IN THE AC.
+/      EXIT + 1 IF NON-ALPHABETIC OR NUMERIC WITH CHAR IN THE AC.
+
+ALPNUM,        0
+       JMS     ALPHA           /CHECK FOR ALPHA FIRST
+       SKP                     /NON-ALPHA RETURN, MUST CHECK NUMERIC
+       JMP     ALPNM1          /IS ALPHA, TAKE RETURN + 2
+       JMS     NUMRC           /CHECK IF NUMERIC
+       SKP                     /NOT NUMERIC
+ALPNM1,        ISZ     ALPNUM          /BUMP RETURN FOR ALPHA-NUMERIC
+       JMP I   ALPNUM          /DONE
+
+
+/      ROUTINE TO CHECK FOR AN ALPHABETIC CHARACTER.
+/      ROUTINE ASSUMES UPPER CASE.
+/      ENTER ROUTINE WITH CHAR IN THE AC.
+/      EXIT + 2 IF THE CHAR IS ALPHABETIC WITH THE CHAR IN THE AC.
+/      EXIT + 1 IF THE CHAR IS NOT ALPHABETIC WITH THE CHAR IN THE AC.
+
+ALPHA, 0
+       DCA     ALPHA1          /STORE THE CHAR FOR RETURN
+       TAD     ALPHA1          /GET THE CHAR
+       TAD     (-"Z!200-1)     /ADD ON UPPER LIMIT                     /034 CJL
+       CLL                     /INIT LINK FOR A FLAG
+       TAD     ("Z-"A+1
+       SZL                     /SKIP IF NOT A LETTER
+       ISZ     ALPHA           /IS A LETTER, BUMP RETURN
+       CLA CLL                 /CLEAR AC
+       TAD     ALPHA1          /RESTORE CHAR IN THE AC
+       JMP I   ALPHA           /TAKE PROPER RETURN
+
+ALPHA1,        0                       /TEMP FOR ALPHA ROUTINE
+
+/      ROUTINE TO CHECK FOR A NUMERIC CHARACTER.
+/      ENTER WITH THE CHAR TO CHECK IN THE AC.
+/      EXIT + 2 IF NUMERIC WITH THE CHAR IN THE AC.
+/      EXIT + 1 IF NON-NUMERIC WITH THE CHAR IN THE AC.
+
+NUMRC, 0
+       DCA     NUMRC1          /SAVE THE CHAR FOR RETURN
+       TAD     NUMRC1          /GET THE CHAR BACK
+       TAD     (-"9!200-1)     /ADD ON UPPER LIMIT                     /034 CJL
+       CLL                     /INIT LINK FOR A FLAG
+       TAD     ["9-"0+1]                                               /016 CJL
+       SZL                     /SKIP IF NOT A DIGIT
+       ISZ     NUMRC           /BUMP RETURN FOR NUMERIC
+       CLA CLL                 /CLEAR AC
+       TAD     NUMRC1          /RESTORE CHAR IN THE AC
+       JMP I   NUMRC           /DONE
+
+NUMRC1,        0                       /TEMP FOR NUMRC CHECK ROUTINE
+\f/     ROUTINE TO WRITE THE CURRENT INPUT PACKET TO THE OUTPUT FILE.
+/      ENTER:  NOTHING.
+/      EXIT:   + 2 = WRITE SUCCESSFUL.
+/              + 1 = WRITE NOT SUCCESSFUL.
+
+WRIPAK,        0
+       TAD I   [RRLEN]         /GET LENGTH OF PACKET
+       TAD     (RRDTA-40-3     /CALCULATE END OF BUFFER
+       DCA     W90             /PUT INTO POINTER
+       DCA I   W90             /ZERO AFTER END OF BUFFER
+       TAD     (RRDTA          /GET ADDRESS OF DATA
+       DCA     W90             /PUT INTO POINTER
+
+W10,   TAD I   W90             /GET A CHAR FROM PACKET
+       SNA                     /SKIP IF NOT END
+       JMP     W60             /END, EXIT
+       CIA                     /NEGATE FOR COMPARE
+       TAD     RQCTL           /COMPARE WITH CURRENT QUOTE CHAR
+       SNA CLA                 /SKIP IF NOT QUOTE CHAR
+       JMP     W20             /IS QUOTE, HANDLE SPECIAL
+       TAD     W92             /WAS LAST CHAR A QUOTE?
+       SZA CLA                 /SKIP IF NO
+       TAD     (-100           /IT WAS, FIX UP THIS CHAR
+       JMP     W25             /HANDLE REST BELOW
+
+W20,   TAD     W92             /CURRENT CHAR A QUOTE, CHECK PREVIOUS
+       SNA CLA                 /SKIP IF YES
+       JMP     W30             /JUST THIS CHAR IS QUOTE, SET FLAG
+
+W25,   TAD I   W90             /GET CHAR FROM BUFFER
+       JMS I   [PUTBYTE]       /OUTPUT TO FILE                         /020 CJL
+       JMP I   WRIPAK          /ERROR IN OUTPUT                        /M020 CJL
+       JMP     W35             /FINISH BELOW
+
+W30,   NL0001 CLL              /GOTA SET FLAG FOR QUOTE CHARACTER      /032 CJL
+
+W35,   DCA     W92             /SET UP QUOTE FLAG
+       ISZ     W90             /BUMP POINTER
+       JMP     W10             /LOOP
+
+W60,   ISZ     WRIPAK          /BUMP RETURN FOR OK
+       JMP I   WRIPAK          /DONE
+
+W90,   0                       /POINTER FOR "WRIPAK"
+W92,   0                       /TEMP FOR "WRIPAK"
+\f/     TABLE SEARCH ROUTINE.                                           /025 CJL
+
+/      CALLING SEQUENCE:
+
+/      TAD     VALUE                   /AC CONTAINS VALUE TO MATCH
+/      JMS I   [SRCHTABLE]             /CALL ROUTINE
+/      TABLE-2                         /ADDRESS(TABLE)-2
+/      RETURN                          /ALWAYS RETURNS HERE
+
+/      IF AC=0 THEN NO MATCH OCCURRED.
+
+/      IF AC IS NON-ZERO, THEN AC CONTAINS CORRESPONDING VALUE TO MATCH WHICH IS ALSO
+/      STORED IN TABLEJUMP.
+
+/      TABLE FORMAT.
+
+/      -VALUE; CORRESPONDING VALUE     /TABLE PAIR
+/      "";     ""                      /ADDITIONAL PAIRS AS NECESSARY
+/      0                               /ZERO TERMINATES THE TABLE
+
+SRCHTAB,.-.                            /TABLE SEARCH ROUTINE
+       DCA     TABLEJUMP               /SAVE PASSED VALUE TO MATCH
+       TAD I   SRCHTABLE               /GET PASSED POINTER ARGUMENT
+       DCA     XR0                     /STASH THE POINTER
+       ISZ     SRCHTABLE               /BUMP PAST ARGUMENT
+SRCHLUP,ISZ    XR0                     /BUMP TO NEXT PAIR
+       TAD I   XR0                     /GET A TABLE VALUE
+       SNA                             /END OF TABLE?
+       JMP I   SRCHTABLE               /YES, RETURN WITH CLEAR AC
+       TAD     TABLEJUMP               /COMPARE TO DESIRED
+       SZA CLA                         /SKIP IF IT MATCHES
+       JMP     SRCHLUP                 /JUMP IF NOT
+       TAD I   XR0                     /GET CORRESPONDING VALUE
+       DCA     TABLEJUMP               /STASH IT
+       TAD     TABLEJUMP               /GET IT BACK
+       JMP I   SRCHTABLE               /RETURN WITH CORRESPONDING VAUE IN AC
+
+       PAGE                                                            /014 CJL
+\f      IFZERO  1       <
+
+/      OS8 DIRECTORY FILE DATA SETUP.
+/      ENTER WITH THE DIRECTORY DATE WORD IN THE AC.
+/      EXIT WITH THE DATE IN THE BUFFER "DATBUF".
+
+FILD8, 0
+       DCA     FILD89          /SAVE THE DATE WORD
+       TAD     FILD89          /GET DATA WORD
+       AND     (7              /KEEP ONLY YEAR BITS
+       TAD     (116            /ADD 78 YEARS
+       MQL                     /PUT INTO MQ REGISTER
+       TAD     (DATEYR         /GET POINTER TO YEAR
+       JMS     DECCON          /CONVERT TO ASCII DATE
+       TAD     FILD89          /GET DATE WORD BACK
+       CLL RTR                 /SHIFT DAY DOWN
+       RAR
+       AND     (37             /KEEP ONLY DAY BITS
+       MQL                     /PUT IN MQ REGISTER
+       TAD     (DATEDA         /GET POINTER TO DAY
+       JMS     DECCON          /CONVERT TO ASCII DAY
+       TAD     FILD89          /GET DATE WORD BACK
+       BSW                     /GET MONTH
+       CLL RTR                 /DOWN
+       AND     (17             /KEEP ONLY MONTH BITS
+       MQL                     /INTO MQ REGISTER
+       TAD     (DATEMO         /GET ADDRESS OF WHERE TO PUT MONTH
+       JMS     DECCON          /CONVERT
+       JMP I   FILD8           /ALL DONE
+
+FILD89,        0                       /TEMP FOR "FILD8"
+
+
+/      ROUTINE  TO CONVERT A BINARY VALUE INTO A  TWO  DIGIT  ASCII  DECIMAL  NUMBER.
+/      ENTER WITH WHERE TO STORE THE CONVERTED NUMBER IN THE AC AND THE NUMBER IN THE
+/      MQ REGISTER.
+
+DECCON,        0
+       DCA     DECC20          /STORE THE POINTER
+       TAD     ("0&177-1       /GET AN ASCII ZERO
+       DCA I   DECC20          /START OUT WITH A ZERO
+       MQA                     /GET THE BINARY VALUE
+DECC01,        ISZ I   DECC20          /BUMP
+       TAD     (-12            /SUB 10
+       SMA                     /SKIP IF NO MORE DIVISION
+       JMP     DECC01          /ELSE KEEP GOING
+       TAD     (12+"0&177      /CONVERT REMAINDER TO ASCII
+       ISZ     DECC20          /BUMP POINTER
+       DCA I   DECC20          /STORE
+/      JMS     FMTDAT          /FORMAT FOR PRINTING                    /D013
+       JMP I   DECCON          /DONE
+
+                       >
+\f      IFZERO  1       <
+
+DECC20,        0                       /LOCAL POINTER TO DECCON
+
+/      ROUTINE TO SET UP THE DATE IN A MM-DD-YY FORMAT  TO  PUT IN FRONT OF A FILE TO
+/      PASS THE FILES DATE (TEMPORY AND NOT PART OF THE KERMIT PROTOCOL).
+
+FMTDAT,        0
+       TAD     DATEMO          /GET FIRST CHAR OF DATE
+       DCA     FDATE           /MOVE IT
+       TAD     DATEMO+1
+       DCA     FDATE+1
+       TAD     DATEDA
+       DCA     FDATE+3
+       TAD     DATEDA+1
+       DCA     FDATE+4
+       TAD     DATEYR
+       DCA     FDATE+6
+       TAD     DATEYR+1
+       DCA     FDATE+7
+       JMP I   FMTDAT          /QUICK AND DIRTY
+
+DATBUF,        "#&177                  /FILE CREATION DATE ATTRIBUTE
+       6+40                    /LENGTH OF DATE (CHAR(X))
+DATEYR,        0                       /ASCII YEAR GOES HERE
+       0
+DATEMO,        0                       /ASCII MONTH GOES HERE
+       0
+DATEDA,        0                       /ASCII DAY GOES HERE
+       0
+       -1                      /TERMINATE
+
+/      FORMATTED DATE GOES HERE.
+
+SETDAT,"ANGLEBRACKET&177       /COMMENT SIGN
+
+FDATE, 0
+       0
+       "-&177
+       0
+       0
+       "-&177
+       0
+       0
+       12
+       15
+       -1
+
+                       >
+\f/     DIRECTORY LOOKUP ROUTINE.                                       /028 CJL
+
+/      CALLING SEQUENCE:
+
+/      NL0001                          /IF INITIALIZING THE DIRECTORY
+
+/      OR
+
+/      CLA                             /CLEAR AC IF SUBSEQUENT CALL
+
+/      JMS I   (LUKUP)                 /CALL ROUTINE
+/      I/O ERROR                       /DIRECTORY I/O ERROR RETURN WITH AC DIRTY
+/      NOT FOUND                       /FILE NOT FOUND RETURN
+/      FOUND                           /LATEST FILE MATCHES REQUEST
+
+/      SETS FLEN TO -(FILE LENGTH) IN RECORDS.
+
+/      SETS FSBLK TO STARTING RECORD OF FILE.
+
+/      MODIFIES DIRECTORY SEGMENT SLIGHTLY (NOT TO BE WRITTEN BACK).
+
+/      DEPENDS ON DIRXR BEING UNTOUCHED BY OTHER ROUTINES.
+
+LUKUP, .-.                             /DIRECTORY LOOKUP ROUTINE
+       SNA                             /INITIALIZING DIRECTORY?
+       JMP     NXTFILE                 /NO, JUST GET ANOTHER FILE IF POSSIBLE
+NEXTSEG,DCA    DIRRECORD               /STORE LATEST DIRECTORY SEGMENT RECORD
+       JMS I   HNDADR                  /CALL I/O HANDLER
+       PAGCNT^100+DIRFLD               /READ IN A DIRECTORY SEGMENT
+       DIRBUFFER                       /DIRECTORY I/O BUFFER
+DIRRECO,.-.                            /WILL BE LATEST SEGMENT NUMBER
+       JMP I   LUKUP                   /I/O ERROR, TAKE DIRTY IMMEDIATE RETURN
+       CDF     DIRFLD                  /GOTO DIRECTORY FIELD
+       TAD I   (FRSTRECORD)            /GET FIRST RECORD OF FIRST ENTRY
+       DCA     FSBLK                   /STASH IT
+       TAD     (ENTSTRT-1)             /POINT TO
+       DCA     DIRXR                   /ENTRIES
+LOOKLUP,TAD I  DIRXR                   /GET FIRST WORD OF ENTRY
+       SNA                             /SKIP IF NOT EMPTY
+       JMP     EMPENTRY                /JUMP IF EMPTY ENTRY
+       DCA     FNAME                   /STORE FIRST FILENAME WORD
+       TAD I   DIRXR                   /GET NEXT
+       DCA     FNAME+1                 /STORE SECOND FILENAME WORD
+       TAD I   DIRXR                   /GET NEXT
+       DCA     FNAME+2                 /STORE THIRD FILENAME WORD
+       TAD I   DIRXR                   /GET NEXT
+       DCA     FNAME+3                 /STORE EXTENSION WORD
+       NL7777                          /BACKUP
+       TAD I   (AIWNUMBER)             /GET ADDITIONAL INFORMATION WORD COUNT
+       DCA     AIWCNT                  /STASH THE COUNTER
+DCADATW,DCA    DATWORD                 /CLEAR THE DATE WORD
+       TAD     DCADATW/(DCA    DATWORD)/GET STORING INSTRUCTION
+       DCA     AIWSTORE                /STORE IN-LINE
+       JMP     AIWTEST                 /START LOOP THERE
+\fAIWLUP,       TAD I   DIRXR           /GET A WORD FROM ENTRY
+AIWSTOR,DCA    DATWORD+.-.     /STORE IN PROPER WORD
+       ISZ     AIWSTORE        /BUMP TO NEXT INSTRUCTION
+AIWTEST,ISZ    AIWCNT          /DONE ALL ADDITIONAL INFORMATION WORDS?
+       JMP     AIWLUP          /NO, KEEP GOING
+       TAD I   DIRXR           /GET THE FILE LENGTH
+       SNA                     /SKIP IF VALID
+       JMP     TENTRY          /JUMP IF ONLY TENTATIVE FILE (NO LENGTH)
+       DCA     FILENGTH        /STORE FILE LENGTH
+       CDF     PRGFLD          /BACK TO OUR FIELD
+/      JMS I   (FILTER)        /CHECK IF WE LIKE THIS ONE
+       TAD     (FNAME)         /POINT TO LATEST FILENAME
+       JMS I   (FMATCH)        /CHECK FOR A MATCH
+       JMP     NXTFILE         /FORGET THIS ONE, IT DIDN'T MATCH
+       TAD     FILENGTH        /GET FILE LENGTH
+       DCA     FLEN            /GIVE TO CALLER TO DESTROY
+       TAD     (FNAME)         /POINT TO FILENAME
+       JMS I   [FILN8]         /PUT IN CHARACTER FORM IN BUFFER
+       ISZ     LUKUP           /BUMP TO FILE MATCH RETURN
+       JMP     FLEXIT          /EXIT THERE
+
+/      COMES HERE FROM SUBSEQUENT CALL OR MATCH FAILURE.
+
+NXTFILE,CDF    DIRFLD          /GOTO BUFFER FIELD
+       TAD     FILENGTH        /GET LATEST FILE LENGTH
+       SKP                     /DON'T DO EMPTY LENGTH
+
+/      COMES HERE TO BYPASS AN EMPTY ENTRY.
+
+EMPENTR,TAD I  DIRXR           /GET LENGTH OF EMPTY
+       CIA                     /WANT POSITIVE FORM
+       TAD     FSBLK           /UPDATE TO NEXT FILE RECORD
+       DCA     FSBLK           /STORE UPDATED VALUE
+TENTRY,        ISZ I   (FILECNT)       /DONE WITH THIS SEGMENT?
+       JMP     LOOKLUP         /NO, KEEP GOING
+       TAD I   (DIRLINK)       /GET LINK TO NEXT SEGMENT
+       CDF     PRGFLD          /BACK TO OUR FIELD
+       SZA                     /END OF DIRECTORY?
+       JMP     NEXTSEGMENT     /NO, GO DO NEXT SEGMENT
+FLEXIT,        ISZ     LUKUP           /BUMP PAST I/O ERROR EXIT
+       JMP I   LUKUP           /RETURN FOR FILE NOT FOUND
+
+AIWCNT,        .-.                     /ADDITIONAL INFORMATION WORD COUNTER
+DATWORD,.-.                    /DATE WORD STORED HERE (0000 IF NONE)
+       ZBLOCK  7               /ROOM FOR MORE ADDITIONAL INFORMATION WORDS
+FILENGT,.-.                    /LATEST FILE LENGTH
+FNAME, ZBLOCK  4               /FILENAME AND EXTENSION STORED HERE
+
+       PAGE
+\f/     OS/8 FILE UNPACK ROUTINE.                                       /019 CJL
+
+/      THIS ROUTINE UNPACKS BYTES FROM THE INPUT FILE ACCORDING TO THE  CURRENT VALUE
+/      OF FILMODE:
+
+/      FILMODE CONTAINS 0177 (ASCII MODE).  ALL BYTES ARE TREATED AS SEVEN-BIT  ASCII
+/      CHARACTERS BY STRIPPING THE HIGH-ORDER BIT.  END OF FILE IS THE <^Z> CHARACTER
+/      WHICH  WILL  BE  SENT  OR  NOT  ACCORDING  TO  THE  CONTENTS OF OCTLZFLAG.  IF
+/      OCTLZFLAG CONTAINS  NON-ZERO,  THEN <^Z> WILL BE SENT AT <EOF>;  THE NEXT CALL
+/      WILL YIELD THE  <EOF>  RETURN.   IF OCTLZFLAG CONTAINS ZERO, THEN DETECTION OF
+/      <^Z> YIELDS THE <EOF> RETURN IMMEDIATELY.
+
+/      FILMODE CONTAINS 4377 (BINARY  MODE).    ALL  BYTES  ARE  TREATED AS EIGHT-BIT
+/      CHARACTERS AND WILL BE SENT  WITHOUT <^Z> CHECK.  THE NEXT CALL AFTER THE LAST
+/      BYTE OF THE LAST RECORD HAS BEEN SENT YIELDS THE <EOF> RETURN.
+
+/      CALLING CONSIDERATIONS:
+
+/      OCTLZFLAG MUST BE SETUP ACCORDINGLY IF IN ASCII MODE.
+
+/      FILMODE MUST BE SETUP ACCORDINGLY.
+
+/      FLEN MUST CONTAIN -(FILE LENGTH IN  RECORDS) WHEN INITIALIZING THE INPUT FILE.
+/      IT WILL BE MODIFIED BY CALLING THIS ROUTINE.
+
+/      FSBLK MUST CONTAIN THE THE STARTING RECORD WHEN INITIALIZING THE INPUT FILE.
+
+/      HNDADR MUST ALREADY BE SETUP TO CALL THE INPUT HANDLER.
+
+/      CALLING SEQUENCE:
+
+/      CLA                             /OR NL7777 IF INITIALIZING THE INPUT FILE
+/      JMS I   (GETBYTE)               /CALL ROUTINE
+/      I/O ERROR RETURN                /FATAL INPUT ERROR OCCURRED; AC CONTAINS JUNK
+/      END OF FILE                     /<EOF> OCCURRED
+/      GOOD RETURN                     /AC CONTAINS LATEST SEVEN/EIGHT-BIT CHARACTER
+
+GETBYTE,.-.                            /GET A BYTE ROUTINE
+       SNA CLA                         /INITIALIZING?
+       JMP I   PUTC                    /NO, GO GET NEXT BYTE
+       TAD     FSBLK                   /GET STARTING RECORD OF INPUT FILE
+       DCA     GETRECORD               /STORE IN-LINE
+GETNEWR,JMS I  HNDADR                  /CALL I/O HANDLER
+       PAGCNT^100+BUFFLD               /READ SOME PAGES INTO BUFFER FIELD
+GETCORE,FILBUFFER                      /BUFFER ADDRESS
+GETRECO,.-.                            /WILL BE LATEST RECORD NUMBER
+       JMP I   GETBYTE                 /INPUT ERROR!
+       TAD     GETCORE/(FILBUFFER)     /SETUP THE
+       DCA     BUFPTR                  /BUFFER POINTER
+\fGETLOOP,DCA   THIRD                   /CLEAR THIRD BYTE NOW
+       JMS     PUTONE                  /OBTAIN AND SEND BACK FIRST BYTE
+       JMS     PUTONE                  /OBTAIN AND SEND BACK SECOND BYTE
+       TAD     THIRD                   /GET THIRD BYTE
+       JMS     PUTC                    /SEND IT BACK
+       TAD     BUFPTR                  /GET THE POINTER
+       TAD     (-PAGCNT^200-FILBUFFER) /COMPARE TO LIMIT
+       SZA CLA                         /SKIP IF AT END
+       JMP     GETLOOP                 /KEEP GOING
+       ISZ     GETRECORD               /BUMP TO NEXT RECORD
+       ISZ     FLEN                    /DONE ALL RECORDS? (BINARY MODE ONLY)
+       JMP     GETNEWRECORD            /NO, GO DO ANOTHER ONE
+
+/      BINARY <EOF> REACHED HERE.
+
+       JMP     GETEOF                  /TAKE SKIP RETURN TO MAIN CALLER
+
+PUTONE,        .-.                             /SEND BACK A BYTE ROUTINE
+       CDF     BUFFLD                  /GOTO BUFFER FIELD
+       TAD I   BUFPTR                  /GET LATEST WORD
+       AND     [7400]                  /JUST THIRD-BYTE NYBBLE
+       CLL RAL                         /MOVE UP
+       TAD     THIRD                   /GET OLD NYBBLE (IF ANY)
+       RTL;RTL                         /MOVE UP NYBBLE BITS
+       DCA     THIRD                   /SAVE FOR NEXT TIME
+       TAD I   BUFPTR                  /GET LATEST WORD AGAIN
+       JMS     PUTC                    /SEND BACK CURRENT BYTE
+       ISZ     BUFPTR                  /BUMP TO NEXT WORD
+       JMP I   PUTONE                  /RETURN
+
+PUTC,  .-.                             /SEND BACK LATEST BYTE ROUTINE
+       CDF     PRGFLD                  /BACK TO OUR FIELD
+       RAL                             /MOVE UP
+       STL RAR                         /MOVE DOWN WITH BIT[0] SET
+       AND     FILMODE                 /KEEP ONLY GOOD BITS
+       TAD     [-CNTRLZ]               /COMPARE TO <^Z>
+       SNA                             /SKIP IF NOT ASCII MODE <EOF>
+       JMP     GETEND                  /JUMP IF ASCII MODE <EOF>
+GETUPZ,        TAD     [CNTRLZ]                /RESTORE THE CHARACTER
+       AND     [377]                   /ENSURE EIGHT-BIT (MIGHT ALREADY BE SEVEN-BIT)
+       ISZ     GETBYTE                 /BUMP PAST <EOF> RETURN
+GETEOF,        ISZ     GETBYTE                 /BUMP PAST I/O ERROR RETURN
+       JMP I   GETBYTE                 /RETURN TO MAIN CALLER
+
+/      GOT <Z> IN ASCII MODE.
+
+GETEND,        TAD     OCTLZFLAG               /GET <^Z> DISPOSITION FLAG
+       SNA CLA                         /SKIP IF SET
+       JMP     GETEOF                  /JUST RETURN <EOF> CONDITION
+       TAD     (GETEOF)                /POINT TO <EOF>
+       DCA     PUTC                    /FOR NEXT TIME
+       JMP     GETUPZ                  /GIVE THEM BACK <^Z> THIS TIME
+\f/     OS/8 FILE PACK ROUTINE.                                         /020 CJL
+
+/      THIS ROUTINE PACKS BYTES INTO THE OUTPUT  FILE  ACCORDING TO THE CURRENT VALUE
+/      OF FILMODE:
+
+/      FILMODE CONTAINS 0177 (ASCII MODE).  ALL BYTES  ARE TREATED AS SEVEN-BIT ASCII
+/      CHARACTERS BY STRIPPING THE HIGH-ORDER BIT.
+
+/      FILMODE  CONTAINS  4377  (BINARY MODE).  ALL BYTES ARE  TREATED  AS  EIGHT-BIT
+/      CHARACTERS AND WILL BE WRITTEN AS IS.
+
+/      CALLING CONSIDERATIONS:
+
+/      FILMODE MUST BE SETUP ACCORDINGLY.
+
+/      FLEN  MUST  CONTAIN  -(MAXIMUM  FILE LENGTH IN RECORDS) WHEN INITIALIZING  THE
+/      TENTATIVE OUTPUT FILE.  IT WILL BE MODIFIED BY CALLING THIS ROUTINE.
+
+/      FSBLK  MUST CONTAIN THE STARTING RECORD WHEN INITIALIZING THE TENTATIVE OUTPUT
+/      FILE.
+
+/      HNDADR MUST ALREADY BE SETUP TO CALL THE OUTPUT HANDLER.
+
+/      CALLING SEQUENCE:
+
+/      NL7777                          /ANY NEGATIVE VALUE
+/      JMS I   [PUTBYTE]               /CALL ROUTINE TO INITIALIZE
+/      IMPOSSIBLE                      /CAN'T RETURN HERE
+/      GOOD RETURN                     /ALWAYS RETURNS HERE
+
+/      OR
+
+/      TAD     (CHAR&377)              /ANY EIGHT-BIT (OR LESS) VALUE
+/      JMS I   [PUTBYTE]               /CALL ROUTINE TO PACK A CHARACTER
+/      ERROR RETURN                    /I/O ERROR WHILE WRITING A BUFFER
+/      GOOD RETURN                     /CHARACTER PACKED WITH NO ERRORS
+
+/      ALL RETURNS CLEAR THE AC.
+
+PUTBYTE,.-.                            /OUTPUT A BYTE ROUTINE
+       SPA                             /ARE WE INITIALIZING?
+       JMP     PUTINITIALIZE           /YES
+       AND     FILMODE                 /REDUCE TO SEVEN-BIT/EIGHT-BIT
+       DCA     LATEST                  /SAVE LATEST CHARACTER
+       CDF     BUFFLD                  /GOTO BUFFER FIELD
+       TAD     LATEST                  /GET LATEST CHARACTER
+       JMP I   PUTNEXT                 /GO WHERE YOU SHOULD GO
+
+PUTNEXT,.-.                            /EXIT ROUTINE
+       ISZ     PUTBYTE                 /BUMP TO GOOD RETURN
+PUTERRO,CLA CLL                                /CLEAN UP
+       CDF     PRGFLD                  /BACK TO OUR FIELD
+       JMP I   PUTBYTE                 /RETURN TO MAIN CALLER
+\fPUTINIT,CLA                           /CLEAN UP
+       TAD     FSBLK                   /GET STARTING RECORD OF TENTATIVE FILE
+       DCA     PUTRECORD               /STORE IN-LINE
+       DCA I   (FLENGTH)               /CLEAR ACTUAL FILE LENGTH
+PUTNEWR,TAD    PUTCORE/(FILEBUFFER)    /SETUP THE
+       DCA     BUFPTR                  /BUFFER POINTER
+PUTLOOP,JMS    PUTNEXT                 /GET A CHARACTER
+       DCA I   BUFPTR                  /STORE IT
+       TAD     BUFPTR                  /GET POINTER VALUE
+       DCA     TEMPTR                  /SAVE FOR LATER
+       ISZ     BUFPTR                  /BUMP TO NEXT
+       JMS     PUTNEXT                 /GET A CHARACTER
+       DCA I   BUFPTR                  /STORE IT
+       JMS     PUTNEXT                 /GET A CHARACTER
+       RTL;RTL                         /MOVE UP
+       AND     [7400]                  /ISOLATE HIGH NYBBLE
+       TAD I   TEMPTR                  /ADD ON FIRST BYTE
+       DCA I   TEMPTR                  /STORE COMPOSITE
+       TAD     LATEST                  /GET LATEST CHARACTER
+       RTR;RTR;RAR                     /MOVE UP AND
+       AND     [7400]                  /ISOLATE LOW NYBBLE
+       TAD I   BUFPTR                  /ADD ON SECOND BYTE
+       DCA I   BUFPTR                  /STORE COMPOSITE
+       ISZ     BUFPTR                  /BUMP TO NEXT
+       TAD     BUFPTR                  /GET LATEST POINTER VALUE
+       TAD     (-PAGCNT^200-FILBUFFER) /COMPARE TO LIMIT
+       SZA CLA                         /SKIP IF AT END
+       JMP     PUTLOOP                 /KEEP GOING
+       CDF     PRGFLD                  /BACK TO OUR FIELD
+       ISZ     FLEN                    /TOO MANY RECORDS?
+       SKP                             /SKIP IF NOT
+       JMP I   PUTBYTE                 /TAKE ERROR RETURN
+       JMS I   HNDADR                  /CALL I/O HANDLER
+       PAGCNT^100+BUFFLD+WRITE         /WRITE SOME PAGES FROM BUFFER FIELD
+PUTCORE,FILBUFFER                      /BUFFER ADDRESS
+PUTRECO,.-.                            /WILL BE LATEST RECORD NUMBER
+       JMP     PUTERROR                /OUTPUT ERROR!
+       ISZ I   (FLENGTH)               /BUMP ACTUAL LENGTH
+       ISZ     PUTRECORD               /BUMP TO NEXT RECORD
+       JMP     PUTNEWRECORD            /KEEP GOING
+
+BUFPTR,        .-.                             /INPUT/OUTPUT BUFFER POINTER
+
+/      ASCII FILE MODE <^Z> OUTPUT DISPOSITION FLAG.
+
+OCTLZFL,OCLOSE                         /ZERO=DON'T SEND <^Z> AT <EOF>,
+                                       /NON-ZERO=SEND <^Z> AT <EOF>
+
+       THIRD=  PUTNEXT                 /THIRD BYTE TEMPORARY
+
+       TEMPTR= PUTONE                  /TEMPORARY BUFFER POINTER
+\f      PAGE
+\f/     OUTPUT FILE CLOSE ROUTINE                                       /020 CJL
+
+/      THIS  ROUTINE  CLOSES  THE OPEN OUTPUT FILE ACCORDING TO THE CURRENT VALUE  OF
+/      FILMODE:
+
+/      FILMODE  CONTAINS  0177  (ASCII  MODE).  ALL BYTES PRIOR TO CLOSE ARE STRIPPED
+/      SEVEN-BIT CHARACTERS.    IF  THE  LAST  CHARACTER SENT TO PUTBYTE (CONTENTS OF
+/      LATEST) IS A  <^Z>,  THEN  JUST  CLOSE THE FILE.  IF NOT, THEN IF ICTLZFLAG IS
+/      NON-ZERO, INSERT A <^Z>  CHARACTER INTO THE FILE AS <EOF> INDICATOR, ELSE JUST
+/      CLOSE THE FILE.
+
+/      FILMODE CONTAINS 4377 (BINARY MODE).    ALL BYTES PRIOR TO CLOSE ARE EIGHT-BIT
+/      CHARACTERS.  IF NECESSARY, <NUL> CHARACTERS WILL BE APPENDED TO THE END OF THE
+/      LAST BLOCK OF THE FILE TO FILL IT.  THE FILE IS CLOSED OTHERWISE UNMODIFIED.
+
+/      CALLING CONSIDERATIONS.
+
+/      OFFLG MUST BE SET (OUTPUT FILE IS OPEN).
+
+/      FLENGTH MUST CONTAIN THE ACTUAL FILE LENGTH.
+
+/      LATEST MUST CONTAIN THE LAST BYTE SENT  TO  THE OUTPUT FILE VIA PUTBYTE (ASCII
+/      MODE ONLY).
+
+/      ICTLZFLAG MUST BE SETUP ACCORDINGLY.
+
+/      FILMODE MUST BE SETUP ACCORDINGLY.
+
+/      CALLING SEQUENCE:
+
+/      CLA CLL                 /CLEAR AC
+/      JMS I   (FILCLOSE)      /CALL ROUTINE
+/      ERROR RETURN            /ERROR WHILE CLOSING FILE
+/      GOOD RETURN             /FILE CLOSED PROPERLY
+
+/      ON RETURN, OFFLG WILL BE CLEAR; THE AC WILL BE CLEAR ALSO.
+
+FILCLOS,.-.                    /OUTPUT FILE CLOSE ROUTINE
+       TAD     FILMODE         /GET CURRENT FILE MODE
+       SPA CLA                 /SKIP IF ASCII
+       JMP     CLOSIT          /JUMP IF BINARY
+       TAD     LATEST          /GET LATEST CHARACTER
+       TAD     [-CNTRLZ]       /COMPARE TO <^Z>
+       SZA CLA                 /SKIP IF <^Z> ALREADY IN FILE
+       TAD     ICTLZFLAG       /GET <^Z> DISPOSITION FLAG
+       SNA CLA                 /SKIP IF SET
+       JMP     CLOSIT          /JUMP IF NOT
+       TAD     [CNTRLZ]        /GET A <^Z>
+\fCLOSLUP,JMS I [PUTBYTE]       /OUTPUT A BYTE
+       JMP     CLOSERROR       /ERROR WHILE WRITING
+CLOSIT,        TAD I   (BUFPTR)        /GET THE BUFFER POINTER
+       TAD     (-FILBUFFER)    /COMPARE TO RESET VALUE
+       SZA CLA                 /SKIP IF IT MATCHES
+       JMP     CLOSLUP         /ELSE KEEP GOING
+       TAD     ODNUMBER        /GET OUTPUT DEVICE NUMBER
+       CIF     USRFLD          /GOTO USR FIELD
+       JMS I   [USRENTRY]      /CALL USER SERVICE ROUTINE              /035 CJL
+       CLOSE                   /CLOSE FILE
+       FNBLK                   /=> FILENAME
+FLENGTH,.-.                    /ACTUAL FILE LENGTH
+CLOSERR,SKP CLA                        /ERROR WHILE CLOSING THE FILE
+       ISZ     FILCLOSE        /BUMP RETURN IF NO ERRORS
+       DCA     OFFLG           /CLEAR OUTPUT FILE OPEN FLAG
+       JMP I   FILCLOSE        /RETURN TO CALLER
+
+/      ASCII FILE MODE <^Z> INPUT DISPOSITION FLAG.
+
+ICTLZFL,ICLOSE                 /ZERO=DON'T ENSURE <^Z> IN FILE, NON-ZERO=PACK <^Z>
+                               /IF LAST CHARACTER WASN'T <^Z>
+\f/     SEND PROCESSING
+
+SNDPRO,        0
+       TAD     INIFLG          /CHECK IF SEND/INIT HAS BEEN DONE
+       SZA CLA                 /SKIP IF NO
+       JMP     SNDP10          /RIGHT INTO FILE TRANSFER
+       TAD     (DEFCK          /SET UP DEFAULT CHECKSUM
+       DCA     RCHKT
+       TAD     (DEFEOL         /GET DEFAULT EOL
+       DCA     REOL            /AND SET IT
+       TAD     (DEFQCTL        /GET DEFAULT QUOTE CONTROL CHAR
+       DCA     RQCTL           /AND SET IT UP
+       TAD     (DEFMAXL+40     /GET DEFAULT MAX BUFFER SIZE
+       DCA     RMAXL           /SET IT UP
+       DCA     CURSEQ          /RE-SET SEQUENCE NUMBER
+       JMS I   (SNDI00)        /HANDLE "SEND-INIT"
+       JMP I   SNDPRO          /TAKE ERROR RETURN                      /014 CJL
+
+/      SEND FILE HEADER DISPATCH ROUTINE
+
+SNDP10,        FPACK                   /FORMAT A PACKET
+       NAMBUF                  /ADDRESS OF FILE HEADER FOR DATA
+       STFIL                   /"FIL" PACKET TYPE
+
+SNDP11,        SPACK                   /SEND A PACKET
+       1                       /AWAIT RESPONSE
+       SNDP96-2                /DISPATCH TABLE ADDRESS                 /026 CJL
+
+/      GOT A NAK OR UNDEFINED HERE
+
+SNDP12,        ISZ     RTRYC           /BUMP THE COUNTER
+       JMP     SNDP11          /TRY AGAIN
+       JMP I   SNDPRO          /TAKE ERROR RETURN                      /014 CJL
+
+/      FILE CREATION DATE HANDLING
+
+SNDP15,        IFZERO  1       <
+
+       TAD     RCAPAS          /CHECK IF REMOTE SUPPORTS FILE
+       AND     (10             /  ATTRIBUTES
+       SNA CLA                 /SKIP IF YES
+       JMP     SNDP20          /SKIP IF NO
+       FPACK                   /FORMAT PACKET
+       DATBUF                  /DATE DATA
+       STATT                   /"ATT" PACKET TYPE
+
+SNDP16,        SPACK                   /SEND THE PACKET
+       1                       /AWAIT RESPONSE
+       SNDP98-2                /DISPATCH TABLE ADDRESS                 /027 CJL
+       JMP I   SNDPRO          /TAKE ERROR RETURN                      /014 CJL
+
+                       >
+\f/     GOT ACK HERE
+
+SNDP20,        JMS I   [SCRIBE]        /TELL THEM                              /025 CJL
+       FSENMSG                 /WE ARE SENDING                         /025 CJL
+       PRI8B;  NAMBUF          /TELL THEM THE NAME OF THE FILE
+       JMS I   [SCRIBE]        /DO A                                   /025 CJL
+       CRLF                    /<CR>, <LF>                             /025 CJL
+       JMS     SLOOP
+       SKP                     /ERROR RETURN
+       ISZ     SNDPRO          /BUMP FOR NON-ERROR EXIT
+       JMP I   SNDPRO
+\f/     DATA SEND LOOP.
+/      ROUTINE TO GET CHARS FROM THE INPUT BUFFER AND SEND THEM TO REMOTE
+/      VIA PACKET TRANSFERS.  RETURN + 1 IF ERROR, + 2 IF DONE.
+
+SLOOP, 0
+       JMS I   (INIOPB)        /INIT OUTPUT PACKET HOLD BUFFER
+       NL7777                  /INITIALIZE INPUT FILE ROUTINE          /019 CJL
+SLOP01,        JMS I   (GETBYTE)       /GET A FILE CHARACTER                   /019 CJL
+       JMP I   SLOOP           /FATAL I/O ERROR                        /026 CJL
+       JMP     SLOP15          /HERE ON EOF
+       JMS I   (OPBUF)         /PUT INTO PACKET BUFFER
+       SKP                     /RETURN HERE ON BUFFER FULL
+       JMP     SLOP01          /RETURN HERE IF STILL ROOM
+
+/      PACKET IS FULL HERE, WE MUST SEND IT.
+
+       FPACK                   /FORMAT A PACKET
+       HOLDBF                  /DATA ADDRESS
+       STDAT                   /"DAT" PACKET TYPE
+
+SLOP05,        SPACK                   /SEND PACKET
+       1                       /AWAIT RESPONSE
+       SLOP90-2                /RESPONSE TABLE ADDRESS                 /027 CJL
+
+/      HERE ON NAK OR FALL THRU ON UNDEFINED RESPONSE ABOVE.
+
+SLOP10,        ISZ     RTRYC           /BUMP THE RE-TRY COUNTER
+       JMP     SLOP05          /TRY AGAIN
+       JMP I   SLOOP           /TAKE ERROR RETURN                      /026 CJL
+
+/      HERE ON END OF FILE  --  SEND THEM WHAT WE HAVE.
+
+SLOP15,        TAD I   (OP2)           /GET THE POINTER                        /052 CJL
+       TAD     (-HOLDBF)       /COMPARE TO EMPTY VALUE                 /052 CJL
+       SNA CLA                 /SKIP IF NOT EMPTY                      /052 CJL
+       JMP     SLOP35          /JUMP IF EMPTY                          /052 CJL
+       FPACK                   /FORMAT A PACKET
+       HOLDBF                  /ADDRESS OF DATA
+       STDAT                   /"DAT" PACKET TYPE
+
+SLOP20,        SPACK                   /SEND A PACKET
+       1                       /AWAIT RESPONSE
+       SLOP92-2                /DISPATCH TABLE ADDRESS                 /027 CJL
+
+/      NAK FOR LAST PACKET.            
+
+SLOP25,        ISZ     RTRYC           /BUMP RE-TRY COUNTER
+       JMP     SLOP20          /TRY AGAIN
+       JMP I   SLOOP           /TAKE ERROR RETURN                      /026 CJL
+\f/     ACK FOR FINAL PACKET, SEND AN EOF PACKET.
+
+SLOP35,        JMS I   [SNDP]          /SEND A PACKET
+       NODATA                  /NO DATA
+       STEOF                   /MAKE IT AN EOF PACKET
+       JMP I   SLOOP           /NAK, TAKE ERROR RETURN
+       JMP I   SLOOP           /OTHER THAN ACK, NAK; TAKE ERROR RETURN /026 CJL
+       ISZ     SLOOP           /EOF ACCEPTED, BUMP FOR GOOD RETURN
+       JMP I   SLOOP           /TAKE GOOD RETURN
+
+       PAGE
+\fSLOP90,       STACK;  SLOP01          /ACK, CONTINUE
+       STNAK;  SLOP10          /NAK, HANDLE
+       0
+
+SLOP92,        STACK;  SLOP35          /ACK, CONTINUE
+       STNAK;  SLOP25          /NAK, HANDLE
+       0
+
+/      COMMAND DISPATCH TABLE FOR SEND SERVICE.
+
+SNDP96,        STACK;  SNDP15          /FILE HEADER ACKNOWLEDGED
+       STNAK;  SNDP12          /NAK RETURNED, RE-TRY
+       0                       /END OF TABLE
+
+SNDP98,        STACK;  SNDP20          /DATE ATTRIBUTE ACKNOWLEDGED
+       0                       /END OF TABLE
+\f/     ROUTINE TO HANDLE A "SEND-INIT" COMMAND.
+/      RETURN + 1 IF ERROR.
+/      RETURN + 2 IF SUCCESSFUL.
+
+SNDI00,        0
+       FPACK                   /FORMAT A PACKET
+       INIDAT                  /ADDRESS OF DATA FOR PACKET
+       STSIN                   /"SIN" PACKET TYPE
+
+SNDI02,        SPACK                   /SEND A PACKET
+       1                       /AWAIT RESPONSE
+       SNDI80-2                /RESPONSE TABLE TYPE                    /027 CJL
+
+/      HERE ON NAK OR UNDEFINED.
+
+SNDI05,        ISZ     RTRYC           /BUMP RE-TRY COUNTER
+       JMP     SNDI02          /TRY AGAIN
+       JMP I   SNDI00          /TAKE ERROR EXIT
+
+/      HERE ON ACK.
+
+SNDI10,        JMS     SETINI          /SET UP THE INIT REGISTERS
+       NL0001 CLL              /NOW FLAG THE SEND/INIT DONE            /032 CJL
+       DCA     INIFLG          /BY MAKING THIS NON-ZERO
+       ISZ     SNDI00          /BUMP FOR NON-ERROR RETURN
+       JMP I   SNDI00          /BACK TO MAIN SEND PROCESSING
+
+SNDI80,        STACK;  SNDI10          /GOT AN ACK
+       STNAK;  SNDI05          /NAK
+       0                       /END OF TABLE
+
+
+/      ROUTINE TO MOVE THE SEND/INIT OR RECEIVE/INIT PACKET INTO THE INIT REGISTERS.
+
+SETINI,        0
+       TAD     (RMAXL          /GET ADDRESS OF RECEIVE INIT REGISTERS
+       DCA     MQ              /SETUP FOR CLEAR ROUTINE                /032 CJL
+       TAD     (RMAXL-INITEND) /GET -(NUMBER OF REGISTERS)             /022 CJL
+       CLEAR                   /CLEAR OUT A CHUNK OF MEMORY            /M013
+/      TAD     (RMAXL          /GET ADDRESS OF RECEIVE INIT REGISTERS
+/      DCA     MQ              /SETUP FOR MOVE ROUTINE                 /032 CJL
+       TAD I   [RRLEN]         /GET LENGTH OF PACKET JUST INPUT
+       TAD     (-40-4          /COUNT OF DATA RECEIVED
+       TAD     (RMAXL-INITEND) /COMPARE TO MAXIMUM ALLOWED             /022 CJL
+       SMA SZA                 /SKIP IF NOT TOO MANY                   /022 CJL
+       CLA                     /ELSE USE ALLOWED MAXIMUM               /022 CJL
+       TAD     (INITEND-RMAXL) /RESTORE VALUE                          /022 CJL
+       CIA                     /MAKE IT NEGATIVE
+       DCA     MOVE4           /SAVE FOR "MOVE" ROUTINE
+       TAD     (RRDTA          /ADDRESS OF DATA IN PACKET
+       MOVE                    /MOVE THE INIT REGISTERS
+       JMP I   SETINI          /DONE
+\f      IFZERO  1       <                                               /D013
+
+/      ROUTINE TO SEND THE DATE IN A DATA PACKET.
+/      RETURN + 1 IF ERROR, + 2 IF SUCCESSFUL.
+
+DATOUT,        0
+       JMS     INIOPB          /INSURE PACKET HOLD BUFFER INITIALIZED
+       TAD     (SETDAT         /GET ADDRESS OF DATE
+       DCA     DATOU9          /PUT INTO POINTER
+
+DATOU1,        TAD I   DATOU9          /GET A CHAR
+       ISZ     DATOU9          /BUMP POINTER
+       SPA                     /SKIP IF NOT ENT
+       JMP     DATOU2          /DONE
+       JMS     OPBUF           /PUT INTO HOLD BUFFER
+       SKP                     /HOLD FULL, SEND IT
+       JMP     DATOU1          /LOOP
+
+DATOU2,        CLA CLL                 /INSURE CLEAR AC
+       FPACK                   /FORMAT A PACKET
+       HOLDBF                  /DATA ADDRESS
+       STDAT                   /DATA PACKET
+
+DATOU3,        SPACK                   /SEND THE PACKET
+       1                       /GET RESPONSE
+       DATOU7-2                /DISPATCH TABLE ADDRESS                 /027 CJL
+
+/      HERE ON NAK OR UNDEFINED RESPONSE.
+
+DATOU4,        ISZ     RTRYC           /BUMP RE-TRY COUNTER
+       JMP     DATOU3          /TRY AGAIN
+       JMP I   DATOUT          /ABORT
+
+/      HERE ON ACK.
+
+DATOU5,        ISZ     DATOUT          /BUMP FOR GOOD RETURN
+       JMP I   DATOUT          /EXIT
+
+DATOU7,        STACK;  DATOU5          /ACK
+       STNAK;  DATOU4          /NAK
+       0
+
+DATOU9,        0                       /TEMP POINTER FOR DATOUT
+
+                       >                                               /D013
+\f/     HANDLE AN ABORT REQUEST.
+
+ABORT, CLA CLL                 /INSURE CLEAR AC
+       DCA     ABFLAG          /CLEAR ABORT FLAG NOW                   /044 CJL
+       TAD     KMODE           /GET CURRENT MODE
+       TAD     (-MSEND         /IS IT A SEND?
+       SZA                     /SKIP IF YES
+       JMP     ABORT2          /NOT SEND
+
+       JMS I   [SNDP]          /SEND OUT A PACKET
+       ABORT9                  /WHICH HAS A "D" IN THE DATA
+       STEOF                   /AND IS AN EOF PACKET
+       NOP                     /WE GOT NAK BACK HERE
+       NOP                     /WE GOT NEITHER NAK OR ACK HERE
+       JMS I   (BRKXMT)        /BREAK THE SEND
+       JMP     ABORT3          /FINISH THE ABORT
+
+ABORT2,        TAD     (MSEND-MREC     /CHECK IF IN RECEIVE MODE
+       SZA CLA                 /SKIP IF YES
+       JMP     ABORT3          /JUST BACK TO COMMAND LOOP
+       JMS I   [SNDP]          /SEND A PACKET BACK FOR AN ABORT
+
+       IFZERO  1       <                                               /D009
+
+       ABORT8                  /WHICH HAS AN "X" IN THE DATA
+       STACK                   /MAKE IT AN ACK PACKET
+       NOP                     /NAK HERE
+       NOP                     /NOT NAK OR ACK HERE
+
+                       >                                               /D009
+
+       NODATA                  /NO DATA                                /A009
+       STBRK                   /BREAK TRANSMISSION                     /A009
+       NOP                     /NAK HERE                               /A009
+       CLA                     /NOT ACK OR NAK HERE                    /A009
+       TAD     OFFLG           /GET FILE OPEN FLAG                     /A009
+       SZA CLA                 /IS IT OPEN YET?                        /A009
+       JMS I   [FILCLOSE]      /CLOSE THE OUTPUT FILE                  /020 CJL
+       CLA                     /ERROR DURING CLOSE **** FIX THIS ****
+ABORT3,        TAD     (ABMSG)         /GET MESSAGE ADDRESS                    /044 CJL
+       JMP I   [CLOOP7]        /DISPLAY THE ABORT
+
+ABORT9,        "D&137                  /DATA PACKET FOR SEND ABORT
+       -1
+
+       PAGE                                                            /014 CJL
+\f/     ROUTINE TO PRINT 8 BIT CHARS ON THE  TTY.  ENTER ROUTINE WITH THE ADDRESS OF
+/      THE TEXT IN THE AC OR IF AC IS  ZERO  THE  ADDRESS  IS  IN THE CALL + 1.  TEXT
+/      TERMINATES ON A MINUS WORD.
+
+PRI8B0,        0
+       SZA                     /SKIP IF ADDRESS NOT IN AC
+       JMP     PRI8B1          /ADDRESS IS IN THE AC
+       TAD I   PRI8B0          /GET ADDRESS FROM CALL + 1
+       ISZ     PRI8B0          /BUMP RETURN POINTER
+PRI8B1,        DCA     MQ              /SAVE ADDRESS OF STRING                 /032 CJL
+       TAD     [P7ECHO]        /GET CONSOLE OUTPUT ROUTINE ADDRESS     /043 CJL
+       JMS     EIGHTB          /AND SEND IT
+       JMP I   PRI8B0          /ALL DONE
+
+/      ROUTINE TO SEND 8 BIT CHARS DOWN THE REMOTE LINE.    ENTER  ROUTINE  WITH  THE
+/      ADDRESS OF THE TEXT IN THE AC OR IF AC IS ZERO THE ADDRESS IS IN THE CALL + 1.
+/      TEXT TERMINATES ON A MINUS WORD.
+
+REM8B0,        0
+       SZA                     /SKIP IF ADDRESS NOT IN AC
+       JMP     REM8B1          /ADDRESS IN AC
+       TAD I   REM8B0          /GET ADDRESS FROM CALL + 1
+       ISZ     REM8B0          /BUMP RETURN
+
+REM8B1,        DCA     MQ              /SAVE ADDRESS OF STRING                 /032 CJL
+       TAD     (COMOUT)        /GET ADDRESS OF REMOTE OUTPUT ROUTINE   /046 CJL
+       JMS     EIGHTB          /AND SEND THE STRING
+       JMP I   REM8B0          /DONE
+
+
+/      ROUTINE TO SEND 8 BIT DATA.  ENTER WITH ADDRESS OF DATA  IN  THE  MQ  AND  THE
+/      ADDRESS  OF  THE ROUTINE TO TAKE EACH BYTE IN THE AC.  TEXT  TERMINATES  ON  A
+/      MINUS WORD.
+
+EIGHTB,        0
+       DCA     EIGHT5          /STORE POINTER TO ROUTINE
+       TAD     MQ              /GET STRING POINTER                     /032 CJL
+       DCA     EIGHT6          /STORE IN LOCAL POINTER
+
+EIGHT1,        TAD I   EIGHT6          /GET A CHAR
+       ISZ     EIGHT6          /BUMP THE POINTER
+       SPA                     /SKIP IF NOT EOL
+       JMP     EIGHT2          /GOT EOL
+       JMS I   EIGHT5          /CALL OUTPUT ROUTINE
+       CLA CLL                 /INSURE CLEAR AC
+       JMP     EIGHT1          /LOOP
+
+EIGHT2,        CLA CLL                 /CLEAR THE AC
+       JMP I   EIGHTB          /DONE
+
+EIGHT5,        0                       /POINTER TO ROUTINE TO DO OUTPUT
+EIGHT6,        0                       /POINTER TO TEXT TO OUTPUT
+\f/     ROUTINE TO UNPACK 6-BT  CHARS FROM MEMORY.  BEFORE  CALLING INIT "GET6P" AS  A
+/      POINTER  TO THE STRING LOCATION AND "GET6F" SHOULD BE ZEROED TO START WITH THE
+/      TOP BYTE OF THE FIRST MEMORY LOCATION.
+
+GET60, 0
+       NL4000                  /SET 4000                               /032 CJL
+       TAD     GET6F           /GET THE FLAG
+       DCA     GET6F           /RETURN THE FLAG
+       TAD I   GET6P           /GET TWO BYTES
+       SZL                     /HIGH-ORDER WANTED?                     /032 CJL
+       JMP     GETSWT          /JUMP IF NOT                            /032 CJL
+       RTR;RTR;RTR             /MOVE DOWN HIGH-ORDER HALF              /032 CJL
+       SKP                     /DON'T BUMP POINTER YET                 /032 CJL
+GETSWT,        ISZ     GET6P           /BUMP TO NEXT WORD                      /032 CJL
+       AND     [77]            /STRIP UNUSED BITS                      /016 CJL
+       JMP I   GET60           /DONE
+
+
+/      LOCAL ROUTINE  TO  "FILN8"  TO  MAKE  THE 6 BIT CHAR IN THE AC INTO 8 BITS AND
+/      STORE IN A STRING.
+
+MOV8,  .-.                     /6-BIT CHARACTER => 7-BIT CHARACTER     /028 CJL
+       SNA                     /SKIP IF SOMETHING PASSED               /028 CJL
+       TAD     [" &77]         /ELSE SUPPLY A <SPACE>                  /025 CJL
+       TAD     [" &77]         /INVERT THE CHARACTER                   /028 CJL
+       AND     [77]            /JUST SIX-BITS                          /014/016 CJL
+       TAD     [" &77]         /MAKE IT SEVEN-BIT ASCII                /028 CJL
+       DCA I   MOV8P           /STORE IN THE STRING                    /028 CJL
+       ISZ     MOV8P           /BUMP POINTER FOR NEXT TIME             /028 CJL
+       JMP I   MOV8            /RETURN                                 /028 CJL
+
+MOV8P, 0                       /POINTER FOR "MOV8" ROUTINE
+\f/     ROUTINE TO PULL A FILE  NAME  IN 6 BIT POINTED TO  BY THE AC  AND PLACE IN THE
+/      FILE NAME BUFFER IN  8  BIT  ADDING  IN  THE  "."  TO  SEPARATE  FILE NAME AND
+/      EXTENSION.  A MINUS WORD WILL FOLLOW THE NAME.
+
+FILN8, 0
+       DCA     GET6P           /SET POINTER FOR "GET6"
+       DCA     GET6F           /SET FLAG FOR "GET6"
+       TAD     (NAMBUF         /GET ADDRESS OF THE NAME BUFFER
+       DCA     MOV8P           /SET IN A POINTER
+       TAD     (-6             /6 NAME CHARS TO DO
+       DCA     FILN8C          /SAVE IN COUNTER
+       GET6                    /PULL A CHAR
+       SZA                     /SKIP IF A SPACE
+       JMS     MOV8            /PUT INTO THE BUFFER
+       ISZ     FILN8C          /BUMP COUNTER
+       JMP     .-4             /LOOP TILL ALL 6 DONE
+       TAD     (".&177)        /GET A "."                              /034 CJL
+       JMS     MOV8            /PUT WITH FILE NAME
+       NL7776                  /SET -2                                 /032 CJL
+       DCA     FILN8C          /2 EXTENSION CHARS
+       GET6                    /GET NEXT CHAR
+       SZA                     /SKIP IF A SPACE
+       JMS     MOV8            /PUT WITH NAME
+       ISZ     FILN8C          /BUMP COUNTER
+       JMP     .-4             /LOOP
+       NL7777                  /SET -1                                 /032 CJL
+       DCA I   MOV8P           /TERMINATE THE STRING
+       JMP I   FILN8           /AND RETURN
+
+FILN8C,        0                       /COUNTER FOR "FILN8"
+
+       PAGE
+\f/     CONSOLE I/O ROUTINES, ETC.                                      /023 CJL
+
+/      CONSOLE MESSAGE PRINT ROUTINE.
+
+/      CALLING SEQUENCE:
+
+/      JMS I   [SCRIBE]        /CALL MESSAGE PRINT ROUTINE
+/      MESSAGEADDRESS          /MESSAGE ADDRESS PASSED IN-LINE
+
+/      AC CAN BE DIRTY ON CALL.
+
+/      RETURNS WITH CLEAR AC.
+
+/      MESSAGE FORMAT:
+
+/      ALL UPPER-CASE CHARACTERS ARE ALLOWED  TO  EXIST IN THE MESSAGE EXCEPT '%' AND
+/      '^' WHICH ARE RESERVED.  A  ZERO  HALF-WORD TERMINATES THE MESSAGE STRING.  IF
+/      '%' IS DETECTED, A <CR> AND <LF>  WILL  BE  OUTPUT.    IF '^' IS DETECTED, THE
+/      PREVAILING CASE WILL BE REVERSED.  INITIAL CASE IS LOWER-CASE.  IF 'UPONLY' IS
+/      SET  TO  7740,  ALL  CASE CHANGES ARE IGNORED AND  THE  OUTPUT  IS  FORCED  TO
+/      UPPER-CASE  ONLY.    THE MESSAGE ADDRESS MUST BE IN FIELD  ONE  AND  MUST  NOT
+/      OVERLAP  AREAS  RESERVED FOR OTHER PURPOSES (OS/8 RESIDENT AT 17600-17777, USR
+/      LOCATIONS 10000-11777, ETC.).
+
+
+SCRIBE,        .-.                     /CONSOLE MESSAGE PRINT ROUTINE
+       CLA                     /CLEAN UP                               /029 CJL
+       TAD     [P7ECHO]        /POINT TO                               /043 CJL
+RSCRENT,DCA    MSGOUT          /CONSOLE PRINT ROUTINE
+       TAD I   SCRIBE          /GET IN-LINE POINTER ARGUMENT
+       DCA     SCRPTR          /STASH THE POINTER
+       ISZ     SCRIBE          /BUMP PAST ARGUMENT
+       TAD     UPONLY          /GET UPPER-ONLY VALUE                   /030 CJL
+       TAD     [140]           /ADD ON LOWER-CASE VALUE                /030 CJL
+       DCA     SCRCASE         /STORE INITIAL CASE VALUE
+SCRLUP,        CDF     MSGFLD          /GOTO MESSAGE FIELD
+       TAD I   SCRPTR          /GET LEFT HALF-WORD
+       RTR;RTR;RTR             /MOVE OVER
+       JMS     SCRPRNT         /PRINT IT
+       CDF     MSGFLD          /GOTO MESSAGE FIELD
+       TAD I   SCRPTR          /GET RIGHT HALF-WORD
+       JMS     SCRPRNT         /PRINT IT
+       ISZ     SCRPTR          /BUMP TO NEXT PAIR
+       JMP     SCRLUP          /KEEP GOING
+\fSCRPRNT,.-.                   /CHARACTER PRINT ROUTINE
+       CDF     PRGFLD          /BACK TO OUR FIELD
+       AND     [77]            /JUST SIX BITS
+       SNA                     /END OF MESSAGE?
+       JMP I   SCRIBE          /YES, RETURN TO ORIGINAL CALLER
+       DCA     SCRCHAR         /NO, SAVE FOR NOW
+       TAD     SCRCHAR         /GET IT BACK
+       TAD     (-"%!200)       /IS IT "%"?
+       SNA                     /SKIP IF NOT
+       JMP     SCRCRLF         /JUMP IF IT MATCHES
+       TAD     [-"^+100+"%]    /IS IT "^"
+       SNA CLA                 /SKIP IF NOT
+       JMP     SCRFLIP         /JUMP IF IT MATCHES
+       TAD     SCRCHAR         /GET THE CHARACTER
+       AND     [40]            /DOES CASE MATTER?
+       SNA CLA                 /SKIP IF NOT
+       TAD     SCRCASE         /ELSE GET PREVAILING CASE
+       TAD     SCRCHAR         /GET THE CHARACTER
+SCRPRLF,JMS I  MSGOUT          /PRINT THE CHARACTER
+       JMP I   SCRPRNT         /RETURN
+
+SCRCRLF,TAD    [CNTRLM]        /GET A <CR>
+       JMS I   MSGOUT          /PRINT IT
+       TAD     [CNTRLJ]        /GET A <LF>
+       JMP     SCRPRLF         /CONTINUE THERE
+
+SCRFLIP,TAD    UPONLY          /GET UPPER-ONLY FLAG
+       SZA CLA                 /SKIP IF OFF
+       JMP I   SCRPRNT         /RETURN IF ON
+       TAD     SCRCASE         /GET CURRENT CASE
+       CIA                     /INVERT IT
+       TAD     (140+100)       /ADD SUM OF POSSIBLE VALUES
+       DCA     SCRCASE         /STORE NEW INVERTED CASE
+       JMP I   SCRPRNT         /RETURN
+
+/      REMOTE LINE MESSAGE PRINT ROUTINE.
+
+/      CALLING SEQUENCE:
+
+/      JMS I   [RSCRIBE]       /CALL MESSAGE PRINT ROUTINE
+/      MESSAGEADDRESS          /MESSAGE ADDRESS PASSED IN-LINE
+
+/      AC CAN BE DIRTY ON CALL.
+
+/      RETURNS WITH CLEAR AC.
+
+/      MESSAGE FORMAT AND RESTRICTIONS ARE IDENTICAL TO SCRIBE ROUTINE.
+
+RSCRIBE,.-.                    /REMOTE LINE MESSAGE PRINT ROUTINE
+       CLA                     /CLEAN UP                               /029 CJL
+       TAD     RSCRIBE         /GET OUR CALLER
+       DCA     SCRIBE          /MAKE IT THEIRS
+       TAD     (COMOUT)        /POINT TO REMOTE OUTPUT ROUTINE
+       JMP     RSCRENTRY       /CONTINUE THERE
+\f/     ESCAPE CHARACTER PRINT ROUTINE.
+
+/      CALLING SEQUENCE:
+
+/      TAD     ESCHAR          /OR OTHER CHARACTER TO PRINT
+/      JMS I   [ESCPRNT]       /CALL ROUTINE
+/      RETURNS WITH CLEAR AC HERE
+
+/      CAUSES CHARACTER TO PRINT LITERALLY IF CHARACTER>37.
+/      CAUSES MESSAGE "CONTROL-" FOLLOWED BY CHARACTER+100 IF CHARACTER<40.
+
+ESCPRNT,.-.                    /ESCAPE CHARACTER PRINT ROUTINE
+       DCA     ESCTEMP         /SAVE PASSED VALUE
+       TAD     ESCTEMP         /GET IT BACK
+       TAD     [-40]           /COMPARE TO CONTROL LIMIT
+       SMA CLA                 /SKIP IF LESS THAN LIMIT
+       JMP     ESPRINT         /JUMP IF NOT
+       JMS I   [SCRIBE]        /GIVE THEM THE
+       CONTMSG                 /CONTROL MESSAGE
+       TAD     [100]           /MAKE IT UPPER-CASE, NOT CONTROL
+ESPRINT,TAD    ESCTEMP         /GET ORIGINAL VALUE
+       JMS I   [P7ECHO]        /PRINT IT                               /043 CJL
+       JMP I   ESCPRNT         /RETURN
+
+       MSGOUT= RSCRIBE         /OUTPUT ROUTINE POINTER
+
+ESCTEMP,.-.                    /TEMPORARY FOR ESCPRNT ROUTINE
+SCRCASE,.-.                    /CURRENT MESSAGE CASE
+SCRCHAR,.-.                    /LATEST MESSAGE CHARACTER
+SCRPTR,        .-.                     /MESSAGE POINTER
+
+       PAGE
+\f/     ROUTINE TO HANDLE THE "CONNECT" COMMAND.                        /025 CJL
+
+CONSRV,        .-.                     /CONNECT SERVICE ROUTINE
+       JMS I   [CREST2]        /SETUP CONSOLE OUTPUT ROUTINES          /025 CJL
+       JMS I   [SCRIBE]        /GIVE THE
+       CONNMSG                 /OPENING MESSAGE
+       TAD     ESCHAR          /GET THE CURRENT <ESCAPE> CHARACTER
+       JMS I   [ESCPRNT]       /PRINT IT
+       JMS I   [SCRIBE]        /GIVE THEM THE
+       CON2MSG                 /BRIDGING MESSAGE
+       JMS I   [SCRIBE]        /PRINT OUT THE
+       CPUMSG                  /ACTUAL CPU TYPE
+       JMS I   [SCRIBE]        /GIVE THEM THE
+       CON3MSG                 /CLOSING MESSAGE
+CORESET,DCA    ESCFLAG         /CLEAR <ESCAPE> SEEN FLAG
+       TAD     ESCHAR          /GET THE <ESCAPE> CHARACTER
+       DCA     ESCH            /STORE IN SEARCH LIST
+       JMS I   (CONRESET)      /RESET CONSOLE ROUTINES
+       JMS I   (REMRESET)      /RESET REMOTE LINE ROUTINES
+CONNLUP,TAD    KEYERROR        /GET KEYBOARD ERROR FLAG
+       SNA                     /SKIP IF KEYBOARD ERROR
+       TAD     RINERROR        /ELSE GET REMOTE ERROR FLAG
+       SZA CLA                 /SKIP IF NEITHER KEYBOARD NOR REMOTE LINE ERRORS
+       JMP     KERROR          /JUMP IF KEYBOARD ERROR
+       JMS I   (CONTEST)       /TEST IF CONSOLE CAN TAKE OUTPUT
+       JMP     TESTKEYBOARD    /JUMP IF NOT
+       JMS I   (REMINPUT)      /TEST IF ANY REMOTE INPUT
+       SKP                     /SKIP IF NONE
+       JMS I   (CONOUT)        /OUTPUT TO CONSOLE
+TESTKEY,TAD    ECHOFLAG        /GET LOCAL ECHO FLAG
+       TAD     ESCFLAG         /ADD ON <ESCAPE> SEEN FLAG
+       SNA CLA                 /SKIP IF LOCAL ECHO POSSIBLY NEEDED
+       JMP     NOLOCALECHO     /JUMP IF NOT
+       JMS I   (CONTEST)       /TEST IF CONSOLE CAN TAKE OUTPUT
+       JMP     BUFCHECK        /JUMP IF NOT
+NOLOCAL,JMS I  (REMTEST)       /TEST IF REMOTE CAN TAKE OUTPUT
+       JMP     BUFCHECK        /JUMP IF NOT
+       JMS I   (KEYINPUT)      /TEST IF ANY KEYBOARD INPUT
+       JMP     BUFCHECK        /JUMP IF NOT
+       DCA     KEYLATEST       /SAVE FOR LATER
+       TAD     KEYLATEST       /GET IT BACK
+       AND     [177]           /WANT SEVEN-BIT VERSION FOR TESTS
+       CIA                     /INVERT IT
+       DCA     TESTCHAR        /SAVE FOR LATER
+       TAD     ESCFLAG         /<ESCAPE> SEEN LAST TIME?
+       SNA CLA                 /SKIP IF SO
+       JMP     NOESCAPE        /JUMP IF NOT
+       TAD     TESTCHAR        /GET TEST VAUE
+       JMS I   [SRCHTABLE]     /SEARCH FOR IT
+       ESCLIST-1-1             /SEARCH TABLE POINTER
+       SNA CLA                 /SKIP IF FOUND
+       JMP     ESCOMPLAIN      /JUMP IF NOT
+       JMP I   TABLEJUMP       /GO WHERE YOU'RE SUPPOSED TO
+\f/     COMES HERE IF PREVIOUS WAS NOT THE <ESCAPE> CHARACTER.
+
+NOESCAP,TAD    TESTCHAR        /GET THE LATEST CHARACTER
+       TAD     ESCHAR          /COMPARE TO <ESCAPE> CHARACTER
+       SZA CLA                 /SKIP IF IT MATCHES
+       JMP     OUTCHAR         /JUMP IF NOT
+       NL7777                  /SET THE
+/      DCA     ESCFLAG         /<ESCAPE> SEEN FLAG
+/      JMP     BUFCHECK        /CONTINUE THERE
+       JMP     NOESENTRY       /CONTINUE THERE
+
+/      COMES HERE IF BOTH PREVIOUS AND LATEST ARE THE <ESCAPE> CHARACTER.
+
+ESCTYPE,DCA    ESCFLAG         /CLEAR THE <ESCAPE> SEEN FLAG AND OUTPUT
+
+/      COMES HERE IF PREVIOUS AND LATEST CHARACTER ARE NOT THE <ESCAPE> CHARACTER.
+
+OUTCHAR,TAD    ECHOFLAG        /GET LOCAL ECHO FLAG
+       SNA CLA                 /SKIP IF SET
+       JMP     NOECHO          /JUMP IF NOT
+       TAD     KEYLATEST       /GET LATEST CHARACTER
+       JMS I   (CONOUT)        /OUTPUT TO CONSOLE
+NOECHO,        TAD     KEYLATEST       /GET LATEST CHARACTER
+       JMS I   (REMOUT)        /OUTPUT TO REMOTE
+       JMP     BUFCHECK        /CONTINUE THERE
+
+/      COMES HERE IF PREVIOUS WAS THE <ESCAPE> CHARACTER AND THE LATEST IS NOT
+/      A VALID <ESCAPE> COMMAND CHARACTER.
+
+ESCOMPL,TAD    [CNTRLG]        /GET A <BEL>
+       JMS I   (CONOUT)        /OUTPUT TO CONSOLE
+NOESENT,DCA    ESCFLAG         /CLEAR <ESCAPE> SEEN FLAG
+BUFCHEC,JMS I  PUPSTATUS       /UPDATE THE PORT STATUS                 /047 CJL
+
+/      THE ABOVE INSTRUCTION IS FOR DECMATE USE ONLY.  THE DEFAULT INSTRUCTION IS FOR
+/      KL8 INTERFACES.
+
+       *BUFCHECK               /OVERLAY DECMATE CODE                   /047 CJL
+
+BUFCHEC,NOP                    /DON'T CHECK PORT STATUS                /047 CJL
+
+       JMS I   (RINUPDATE)     /CHECK FOR MORE REMOTE INPUT
+       JMS I   (KEYUPDATE)     /CHECK FOR MORE KEYBOARD INPUT
+       JMS I   (REMUPDATE)     /CHECK FOR MORE REMOTE OUTPUT
+       JMS I   (CONUPDATE)     /CHECK FOR MORE CONSOLE OUTPUT
+       JMP     CONNLUP         /GO BACK FOR MORE
+
+/      COMES HERE ON <ESCAPE> C(LOSE).
+
+ESCLOSE,ISZ    CONSRV          /BUMP TO GOOD RETURN
+       JMP I   CONSRV          /RETURN
+\fKERRLUP,JMS I PUPSTATUS       /UPDATE THE PORT STATUS                 /047 CJL
+
+/      THE ABOVE INSTRUCTION IS FOR DECMATE USE ONLY.  THE DEFAULT INSTRUCTION IS FOR
+/      KL8 INTERFACES.
+
+       *KERRLUP                /OVERLAY DECMATE CODE                   /047 CJL
+
+KERRLUP,NOP                    /DON'T CHECK PORT STATUS                /047 CJL
+
+       JMS I   (RINUPDATE)     /CHECK FOR MORE REMOTE INPUT
+       JMS I   (KEYUPDATE)     /CHECK FOR MORE KEYBOARD INPUT
+       JMS I   (REMUPDATE)     /CHECK FOR MORE REMOTE OUTPUT
+       JMS I   (CONUPDATE)     /CHECK FOR MORE CONSOLE OUTPUT
+
+/      COMES HERE ON KEYBOARD INPUT ERROR.
+
+KERROR,        JMS I   (CONTEST)       /CONSOLE READY FOR OUTPUT?
+       JMP     KERRLUP         /NO, GO WAIT AWHILE
+       TAD I   (CONINSERT)     /GET CONSOLE INSERTION POINTER
+       CIA                     /INVERT FOR TEST
+       TAD I   (CONREMOVE)     /COMPARE TO CONSOLE REMOVAL POINTER
+       SZA CLA                 /SKIP IF CONSOLE OUTPUT BUFFER EMPTY
+       JMP     KERRLUP         /GO WAIT FOR AWHILE
+       TAD     KEYERROR        /KEYBOARD INPUT ERROR?
+       SNA CLA                 /SKIP IF SO
+       JMP     RIERTST         /JUMP IF NOT
+       JMS I   [SCRIBE]        /TELL THEM
+       KERRMSG                 /WE HAD A KEYBOARD ERROR
+RIERTST,TAD    RINERROR        /REMOTE INPUT ERROR?
+       SNA CLA                 /SKIP IF SO
+       JMP     CORESET         /JUMP IF NOT
+       JMS I   [SCRIBE]        /TELL THEM
+       RIERMSG                 /WE HAD A REMOTE LINE ERROR
+       JMP     CORESET         /RESTART
+
+/      <ESCAPE> CHARACTER SEARCH LIST.
+
+ESCLIST,UPPERC;        ESCLOSE         /<ESCAPE> C(LOSE)
+       LOWERC; ESCLOSE         /<ESCAPE> C(LOSE) (LOWER-CASE)
+ESCH,  .-.;    ESCTYPE         /<ESCAPE> <ESCAPE>
+       0                       /THIS ENDS THE LIST
+
+/      LOCAL ECHO FLAG FOR CONNECT MODE.
+
+ECHOFLA,INIECHO                        /0=DON'T ECHO, NON-ZERO=ECHO            /039 CJL
+ESCFLAG,.-.                    /<ESCAPE> CHARACTER SEEN FLAG
+KEYLATE,.-.                    /LATEST KEYBOARD CHARACTER
+PUPSTAT,UPSTATUS               /POINTER TO DECMATE STATUS UPDATE       /047 CJL
+TESTCHA,.-.                    /LATEST KEYBOARD TEST CHARACTER
+\f      PAGE
+\f/     CONNECT-MODE SUPPORT ROUTINES.                                  /047 CJL
+
+/      CONSOLE KEYBOARD ROUTINES.                                      /047 CJL
+
+/      KEYBOARD INPUT ROUTINE.                                         /026 CJL
+
+/      CALLING SEQUENCE:
+
+/      JMS I   (KEYINPUT)      /CALL ROUTINE
+/      NO INPUT                /RETURN IF NO INPUT
+/      INPUT                   /RETURN IF INPUT AVAILABLE
+
+/      THE AC WILL BE CLEAR IF THE IMMEDIATE RETURN IS TAKEN FOR NO INPUT.
+
+/      THE AC WILL CONTAIN THE LATEST CHARACTER IF THE SKIP RETURN IS TAKEN.
+
+KEYINPU,.-.                    /KEYBOARD INPUT ROUTINE
+       TAD     KEYINSERT       /GET INSERTION POINTER
+       CIA                     /INVERT FOR TEST
+       TAD     KEYREMOVE       /COMPARE TO REMOVAL POINTER
+       SNA CLA                 /SKIP IF BUFFER NOT EMPTY
+       JMP     KEYCHECK        /JUMP IF BUFFER EMPTY
+       TAD     KEYREMOVE       /GET REMOVAL POINTER
+       DCA     KEYTEMP         /SAVE FOR LATER
+       NL0001                  /SET INCREMENT
+       TAD     KEYREMOVE       /UPDATE REMOVAL POINTER
+       AND     [BUFSIZE-1]     /JUST BUFFER BITS
+       TAD     [KEYBUFFER]     /MAKE IT ABSOLUTE
+       DCA     KEYREMOVE       /STORE UPDATED POINTER
+       CDF     BUFFLD          /GOTO BUFFER FIELD
+       TAD I   KEYTEMP         /GET THE LATEST CHARACTER
+       CDF     PRGFLD          /BACK TO OUR FIELD
+       SKP                     /DON'T GET ANOTHER CHARACTER            /047 CJL
+
+/      COMES HERE IF BUFFER IS EMPTY.
+
+KEYCHEC,JMS    KEYGET          /TRY TO GET A CHARACTER NOW             /047 CJL
+       ISZ     KEYINPUT        /GOT ONE, SO TAKE SKIP RETURN           /047 CJL
+       JMP I   KEYINPUT        /RETURN EITHER WAY
+\f/     KEYBOARD BUFFER UPDATE ROUTINE.                                 /026 CJL
+
+/      CALLING SEQUENCE:
+
+/      JMS I   (KEYUPDATE)     /CALL ROUTINE
+
+/      RETURNS  WITH  CLEAR  AC.    ANY  KEYBOARD  INPUT  WHICH JUST OCCURRED WILL BE
+/      BUFFERED;  CALLS TO KEYINPUT WILL RETRIEVE THE CHARACTERS.
+
+KEYUPDA,.-.                    /KEYBOARD BUFFER UPDATE ROUTINE
+       JMS     KEYGET          /TRY TO GET A CHARACTER NOW             /047 CJL
+       SKP                     /GOT ONE, DON'T LEAVE YET               /047 CJL
+       JMP I   KEYUPDATE       /CHARACTER NOT AVAILABLE NOW, RETURN    /047 CJL
+       CDF     BUFFLD          /GOTO BUFFER FIELD
+       DCA I   KEYINSERT       /STORE IN THE BUFFER
+       CDF     PRGFLD          /BACK TO OUR FIELD
+       NL0001                  /SET INCREMENT
+       TAD     KEYINSERT       /UPDATE POINTER
+       AND     [BUFSIZE-1]     /JUST BUFFER BITS
+       TAD     [KEYBUFFER]     /MAKE IT ABSOLUTE
+       DCA     KEYINSERT       /STORE BACK UPDATED POINTER
+       TAD     KEYINSERT       /GET INSERTION POINTER
+       CIA                     /INVERT FOR TEST
+       TAD     KEYREMOVE       /COMPARE TO REMOVAL POINTER
+       SNA CLA                 /SKIP IF NOT EQUAL
+KSERROR,ISZ    KEYERROR        /INDICATE KEYBOARD ERROR
+       JMP I   KEYUPDATE       /RETURN
+       JMP     KSERROR         /MAKE SURE ERROR IS INDICATED
+\f/     KEYBOARD GET A CHARACTER ROUTINE.                               /047 CJL
+
+/      CALLING SEQUENCE:
+
+/      JMS     KEYGET          /CALL ROUTINE
+/      CHARACTER AVAILABLE     /RETURNS HERE WITH LATEST CHARACTER
+/      NO CHARACTER AVAILABLE  /RETURNS HERE IF NO CHARACTER OR HANDLED FLOW-CONTROL
+
+/      NORMAL RETURN HAS LATEST CHARACTER IN AC.
+
+/      SKIP RETURN HAS CLEAR AC.
+
+/      IF FLOWFLAG=0, FLOW CHARACTERS ARE UNPROCESSED AND CAUSE NORMAL RETURN.
+
+KEYGET,        .-.                     /KEYBOARD GET A CHARACTER ROUTINE
+KGTEST,        KSFIOT                  /FLAG UP?
+       JMP     KEYGNONE        /NO, TAKE SKIP RETURN
+KGREAD,        KRBIOT                  /YES, READ THE CHARACTER
+       SPA                     /SKIP IF NO UART ERRORS
+       ISZ     KEYERROR        /INDICATE KEYBOARD ERROR
+       SKP                     /SKIP IF NOT TOO MANY ERRORS
+       JMP     .-2             /ENSURE KEYBOARD ERROR IS INDICATED
+       AND     [377]           /JUST EIGHT-BIT
+       DCA     KEYTEMP         /SAVE FOR NOW
+       TAD     FLOWFLAG        /GET FLOW CONTROL FLAG
+       SNA CLA                 /SKIP IF SET
+       JMP     KEYGEXIT        /JUMP IF NOT
+       TAD     KEYTEMP         /GET THE CHARACTER
+       AND     [177]           /JUST SEVEN-BIT
+       TAD     [-CNTRLS]       /COMPARE TO <^S>
+       SNA                     /SKIP IF OTHER
+       JMP     KWATSET         /JUMP IF IT MATCHES
+       TAD     [-CNTRLQ+CNTRLS]/COMPARE TO <^S>
+       SNA CLA                 /SKIP IF OTHER
+       JMP     KWATCLEAR       /JUMP IF IT MATCHES
+KEYGEXI,TAD    KEYTEMP         /GET THE CHARACTER
+       JMP I   KEYGET          /TAKE IMMEDIATE RETURN
+
+/      COMES HERE ON <^S> TO SET OUTPUT WAIT.
+
+KWATSET,NL4000                 /SET WAIT VALUE
+
+/      COMES HERE ON <^Q> TO CLEAR OUTPUT WAIT.
+
+KWATCLE,DCA    CONWAIT         /STORE NEW STATE
+KEYGNON,ISZ    KEYGET          /BUMP RETURN ADDRESS
+       JMP I   KEYGET          /TAKE SKIP RETURN
+\f/     CONSOLE TERMINAL ROUTINES.
+
+/      CONSOLE OUTPUT ROUTINE.
+
+/      CALLING SEQUENCE:
+
+/      TAD     CHAR            /CHARACTER TO OUTPUT IN AC
+/      JMS I   (CONOUT)        /CALL ROUTINE
+/      RETURN                  /RETURNS HERE WITH CLEAR AC
+
+CONOUT,        .-.                     /CONSOLE OUTPUT ROUTINE
+       DCA     CONTEMP         /SAVE PASSED VALUE
+       TAD     CONINSERT       /GET INSERTION POINTER
+       CIA                     /INVERT FOR TEST
+       TAD     CONREMOVE       /COMPARE TO REMOVAL POINTER
+       TAD     CONWAIT         /ADD ON WAIT STATUS
+       SZA CLA                 /SKIP IF BUFFER EMPTY AND NOT WAITING   /047 CJL
+       JMP     CSTUFF          /JUMP IF CHARACTER MUST BE BUFFERED
+       TAD     CONTEMP         /GET PASSED VALUE                       /047 CJL
+       JMS I   (CONPUT)        /TRY TO OUTPUT THE CHARACTER NOW                        /047 CJL
+       JMP     CSTUFF          /COULDN'T OUTPUT IT, SO BUFFER IT       /047 CJL
+       JMP I   CONOUT          /RETURN
+
+CSTUFF,        TAD     CONTEMP         /GET THE CHARACTER
+       CDF     BUFFLD          /GOTO BUFFER FIELD
+       DCA I   CONINSERT       /STORE THE CHARACTER
+       CDF     PRGFLD          /BACK TO OUR FIELD
+       NL0001                  /SET INCREMENT
+       TAD     CONINSERT       /UPDATE POINTER
+       AND     [BUFSIZE-1]     /JUST BUFFER BITS
+       TAD     [CONBUFFER]     /MAKE IT ABSOLUTE
+       DCA     CONINSERT       /STORE BACK UPDATED POINTER
+       JMP I   CONOUT          /RETURN
+
+/      CONSOLE OUTPUT TEST ROUTINE.
+
+/      CALLING SEQUENCE:
+
+/      JMS I   (CONTEST)       /CALL ROUTINE
+/      NOT READY               /RETURN IF OUTPUT NOT READY FOR NEXT CHARACTER
+/      READY                   /OUTPUT CAN ACCEPT ANOTHER CHARACTER NOW
+
+CONTEST,.-.                    /CONSOLE OUTPUT TEST ROUTINE
+       NL0001                  /SET BUFFER INCREMENT
+       TAD     CONINSERT       /GET UPDATED INSERTION POINTER
+       CIA                     /INVERT FOR TEST
+       TAD     CONREMOVE       /COMPARE TO REMOVAL POINTER
+       AND     [BUFSIZE-1]     /JUST BUFFER BITS
+       SZA CLA                 /SKIP IF BUFFER IS FULL
+       ISZ     CONTEST         /BUMP RETURN IF NOT
+       JMP I   CONTEST         /RETURN EITHER WAY
+\f/     CONSOLE OUTPUT BUFFER UPDATE ROUTINE.
+
+/      CALLING SEQUENCE:
+
+/      JMS I   (CONUPDATE)     /CALL ROUTINE
+/      RETURN                  /RETURN WITH CLEAR AC
+
+/      THE CONSOLE OUTPUT BUFFERING ROUTINES WILL  UPDATE  POINTERS,  ETC.    IF  ANY
+/      STATUS HAS CHANGED SINCE THE LAST CALL.
+
+CONUPDA,.-.                    /CONSOLE OUTPUT UPDATE ROUTINE
+       TAD     CONWAIT         /FLOW CONTROL WAIT SET?
+       SZA CLA                 /SKIP IF NOT
+       JMP I   CONUPDATE       /JUST RETURN IF SO
+       TAD     CONINSERT       /GET INSERTION POINTER
+       CIA                     /INVERT FOR TEST
+       TAD     CONREMOVE       /COMPARE TO REMOVAL POINTER
+       SNA CLA                 /SKIP IF BUFFER CONTAINS SOMETHING      /047 CJL
+       JMP I   CONUPDATE       /RETURN IF BUFFER EMPTY                 /047 CJL
+       CDF     BUFFLD          /GOTO BUFFER FIELD
+       TAD I   CONREMOVE       /GET A CHARACTER FROM THE BUFFER
+       CDF     PRGFLD          /BACK TO OUR FIELD
+       JMS I   (CONPUT)        /TRY TO OUTPUT THE CHARACTER NOW        /047 CJL
+       JMP I   CONUPDATE       /COULDN'T DO IT, SO JUST RETURN         /047 CJL
+       NL0001                  /SET BUFFER INCREMENT
+       TAD     CONREMOVE       /UPDATE REMOVAL POINTER
+       AND     [BUFSIZE-1]     /JUST BUFFER BITS
+       TAD     [CONBUFFER]     /MAKE IT ABSOLUTE
+       DCA     CONREMOVE       /STORE UPDATED POINTER
+       JMP I   CONUPDATE       /RETURN
+
+CONINSE,.-.                    /CONSOLE OUTPUT INSERTION POINTER
+CONREMO,.-.                    /CONSOLE OUTPUT REMOVAL POINTER
+
+/      CONSOLE FLOW CONTROL WAIT FLAG.
+
+CONWAIT,.-.                    /0=DON'T WAIT, 4000=WAIT FOR <^Q>
+KEYINSE,.-.                    /KEYBOARD BUFFER INSERTION POINTER
+KEYREMO,.-.                    /KEYBOARD BUFFER REMOVAL POINTER
+
+       CONTEMP=CONUPDATE       /CONSOLE OUTPUT TEMPORARY
+
+       KEYTEMP=CONUPDATE       /KEYBOARD INPUT TEMPORARY
+
+       PAGE
+\f/     REMOTE LINE ROUTINES.
+
+/      REMOTE LINE INPUT ROUTINE.                                      /026 CJL
+
+/      CALLING SEQUENCE:
+
+/      JMS I   (REMINPUT)      /CALL ROUTINE
+/      NO INPUT                /RETURN IF NO INPUT
+/      INPUT                   /RETURN IF INPUT AVAILABLE
+
+/      THE AC WILL BE CLEAR IF THE IMMEDIATE RETURN IS TAKEN FOR NO INPUT.
+
+/      THE AC WILL CONTAIN THE LATEST CHARACTER IF THE SKIP RETURN IS TAKEN.
+
+REMINPU,.-.                    /REMOTE LINE INPUT ROUTINE
+       TAD     RININSERT       /GET INSERTION POINTER
+       CIA                     /INVERT FOR TEST
+       TAD     RINREMOVE       /COMPARE TO REMOVAL POINTER
+       SNA CLA                 /SKIP IF BUFFER NOT EMPTY
+       JMP     RINCHECK        /JUMP IF BUFFER EMPTY
+       TAD     RINREMOVE       /GET REMOVAL POINTER
+       DCA     RINTEMP         /SAVE FOR LATER
+       NL0001                  /SET INCREMENT
+       TAD     RINREMOVE       /UPDATE REMOVAL POINTER
+       AND     [BUFSIZE-1]     /JUST BUFFER BITS
+       TAD     (RINBUFFER)     /MAKE IT ABSOLUTE
+       DCA     RINREMOVE       /STORE UPDATED POINTER
+       CDF     BUFFLD          /GOTO BUFFER FIELD
+       TAD I   RINTEMP         /GET THE LATEST CHARACTER
+       CDF     PRGFLD          /BACK TO OUR FIELD
+       DCA     RINTEMP         /SAVE FOR LATER
+       TAD     FLOWFLAG        /GET FLOW CONTROL FLAG
+       SNA CLA                 /SKIP IF SET
+       JMP     REMINEXIT       /JUMP IF NOT
+       NL4000                  /SET WAITING VALUE
+       TAD     RINWAIT         /ARE WE WAITING TO EMPTY?
+       SZA CLA                 /SKIP IF SO
+       JMP     REMINEXIT       /JUMP IF NOT
+       TAD     RININSERT       /GET INSERTION POINTER
+       CIA                     /INVERT FOR TEST
+       TAD     RINREMOVE       /COMPARE TO REMOVAL POINTER
+       AND     [BUFSIZE^3%4]   /JUST 3/4 BITS
+       SZA CLA                 /SKIP IF BUFFER NOW 1/4 FULL (OR LESS)
+       JMP     REMINEXIT       /JUMP IF NOT
+       NL7777                  /SET BUFFER EMPTYING VALUE
+       DCA     RINWAIT         /STORE FOR OUTPUT ROUTINE
+REMINEX,TAD    RINTEMP         /GET THE CHARACTER
+       SKP                     /DON'T GET ANOTHER ONE                  /047 CJL
+
+/      COMES HERE IF REMOTE LINE INPUT BUFFER IS EMPTY.
+
+RINCHEC,JMS    RINGET          /TRY TO GET A CHARACTER NOW             /047 CJL
+       ISZ     REMINPUT        /GOT ONE, SO TAKE SKIP RETURN           /047 CJL
+       JMP I   REMINPUT        /RETURN EITHER WAY
+\f/     REMOTE LINE INPUT BUFFER UPDATE ROUTINE.                        /026 CJL
+
+/      CALLING SEQUENCE:
+
+/      JMS I   (RINUPDATE)     /CALL ROUTINE
+
+/      RETURNS WITH CLEAR AC.  ANY REMOTE LINE  INPUT  WHICH  JUST  OCCURRED  WILL BE
+/      BUFFERED;  CALLS TO REMINPUT WILL RETRIEVE THE CHARACTERS.
+
+RINUPDA,.-.                    /REMOTE LINE INPUT BUFFER UPDATE ROUTINE
+       JMS     RINGET          /TRY TO GET A CHARACTER NOW             /047 CJL
+       SKP                     /GOT ONE, DON'T LEAVE YET               /047 CJL
+       JMP I   RINUPDATE       /CHARACTER NOT AVAILABLE NOW, RETURN    /047 CJL
+       CDF     BUFFLD          /GOTO BUFFER FIELD
+       DCA I   RININSERT       /STORE IN THE BUFFER
+       CDF     PRGFLD          /BACK TO OUR FIELD
+       NL0001                  /SET INCREMENT
+       TAD     RININSERT       /UPDATE POINTER
+       AND     [BUFSIZE-1]     /JUST BUFFER BITS
+       TAD     (RINBUFFER)     /MAKE IT ABSOLUTE
+       DCA     RININSERT       /STORE BACK UPDATED POINTER
+       TAD     RININSERT       /GET INSERTION POINTER
+       CIA                     /INVERT FOR TEST
+       TAD     RINREMOVE       /COMPARE TO REMOVAL POINTER
+       SNA                     /SKIP IF BUFFER NOT FULL
+       ISZ     RINERROR        /INDICATE REMOTE LINE INPUT ERROR
+       SKP                     /SKIP IF NO OVERFLOW
+       JMP     .-2             /ENSURE ERROR IS SET
+       TAD     [BUFSIZE^3%4]   /SUBTRACT 1/4 BUFFER'S WORTH
+       AND     [BUFSIZE^3%4]   /JUST 3/4 BUFFER BITS
+       SNA CLA                 /SKIP IF NOT 3/4 FULL
+       TAD     FLOWFLAG        /ELSE CHECK IF FLOW CONTROL IS ENABLED
+       SNA CLA                 /SKIP IF 3/4 FULL AND FLOW CONTROL IS ENABLED
+       JMP I   RINUPDATE       /JUST RETURN
+       TAD     RINWAIT         /GET INPUT WAIT FLAG
+       SNA CLA                 /SKIP IF ALREADY SET
+       ISZ     RINWAIT         /SET TO <^S> STATE
+       JMP I   RINUPDATE       /RETURN
+\f/     REMOTE LINE GET A CHARACTER ROUTINE.                            /047 CJL
+
+/      CALLING SEQUENCE:
+
+/      JMS I   (RINGET)        /CALL ROUTINE
+/      CHARACTER AVAILABLE     /RETURNS HERE WITH LATEST CHARACTER
+/      NO CHARACTER AVAILABLE  /RETURNS HERE IF NO CHARACTER OR HANDLED FLOW-CONTROL
+
+/      NORMAL RETURN HAS LATEST CHARACTER IN AC.
+
+/      SKIP RETURN HAS CLEAR AC.
+
+/      IF FLOWFLAG=0, FLOW CHARACTERS ARE UNPROCESSED AND CAUSE NORMAL RETURN.
+
+RINGET,        .-.                     /REMOTE LINE GET A CHARACTER ROUTINE
+RINTEST,TAD    INFLAG          /IS INPUT AVAILABLE?
+RINGT0,        SNA CLA                 /SKIP IF SO
+RINREAD,JMP    RINGNONE        /JUMP IF NOT
+RINGT1,        DCA     INFLAG          /CLEAR AVAILABILITY FLAG
+RINGT2,        IRB                     /READ IN THE CHARACTER
+
+/      THE ABOVE INSTRUCTIONS ARE FOR DECMATE II USE ONLY.  THE  DEFAULT INSTRUCTIONS
+/      ARE FOR KL8 INTERFACES.
+
+       *RINTEST                /OVERLAY DECMATE II CODE
+
+RINTEST,RKSFIOT                        /FLAG UP?
+RINGT0,        JMP     RINGNONE        /NO, TAKE SKIP RETURN
+RINREAD,RKRBIOT                        /YES, READ THE CHARACTER
+RINGT1,        SKP                     /NO ERRORS ON DECMATE I
+
+/      THE ABOVE INSTRUCTION IS FOR DECMATE I USE ONLY.    THE DEFAULT INSTRUCTION IS
+/      FOR KL8 INTERFACES.
+
+       *RINGT1                 /OVERLAY DECMATE I CODE
+
+RINGT1,        SPA                     /SKIP IF NO UART ERRORS
+RING2, ISZ     RINERROR        /INDICATE REMOTE LINE INPUT ERROR
+       SKP                     /SKIP IF NOT TOO MANY ERRORS
+       JMP     .-2             /ENSURE REMOTE LINE INPUT ERROR IS INDICATED
+       AND     [377]           /JUST EIGHT-BIT
+       DCA     RINTEMP         /SAVE FOR NOW
+       TAD     FLOWFLAG        /GET FLOW CONTROL FLAG
+       SNA CLA                 /SKIP IF SET
+       JMP     RINGEXIT        /JUMP IF NOT
+       TAD     RINTEMP         /GET THE CHARACTER
+       AND     [177]           /JUST SEVEN-BIT
+       TAD     [-CNTRLS]       /COMPARE TO <^S>
+       SNA                     /SKIP IF OTHER
+       JMP     RWATSET         /JUMP IF IT MATCHES
+       TAD     [-CNTRLQ+CNTRLS]/COMPARE TO <^S>
+       SNA CLA                 /SKIP IF OTHER
+       JMP     RWATCLEAR       /JUMP IF IT MATCHES
+RINGEXI,TAD    RINTEMP         /GET THE CHARACTER
+       JMP I   RINGET          /TAKE IMMEDIATE RETURN
+\f/     COMES HERE ON <^S> TO SET OUTPUT WAIT.
+
+RWATSET,NL4000                 /SET WAIT VALUE
+
+/      COMES HERE ON <^Q> TO CLEAR OUTPUT WAIT.
+
+RWATCLE,DCA    REMWAIT         /STORE NEW STATE
+RINGNON,ISZ    RINGET          /BUMP RETURN ADDRESS
+       JMP I   RINGET          /TAKE SKIP RETURN
+
+/      REMOTE LINE RESET ROUTINE.                                      /026 CJL
+
+/      CALLING SEQUENCE:
+
+/      JMS I   (REMRESET)      /CALL ROUTINE
+/      RETURN                  /RETURN WITH CLEAR AC
+
+/      RETURNS WITH CLEAR AC AND ALL REMOTE LINE VARIABLES RESET.
+
+REMRESE,.-.                    /REMOTE LINE RESET ROUTINE
+       TAD     [REMBUFFER]     /SETUP THE REMOTE LINE
+       DCA     REMINSERT       /OUTPUT INSERTION POINTER
+       TAD     [REMBUFFER]     /SETUP THE REMOTE LINE
+       DCA     REMREMOVE       /OUTPUT REMOVAL POINTER
+       TAD     (RINBUFFER)     /SETUP THE REMOTE LINE
+       DCA     RININSERT       /INPUT INSERTION POINTER
+       TAD     (RINBUFFER)     /SETUP THE REMOTE LINE
+       DCA     RINREMOVE       /INPUT REMOVAL POINTER
+       DCA     REMWAIT         /CLEAR REMOTE OUTPUT WAIT
+       DCA     RINWAIT         /CLEAR REMOTE INPUT WAIT
+       DCA     RINERROR        /CLEAR REMOTE INPUT ERROR
+       JMP I   REMRESET        /RETURN
+
+RININSE,.-.                    /REMOTE INPUT INSERTION POINTER
+RINREMO,.-.                    /REMOTE INPUT REMOVAL POINTER
+RINTEMP,.-.                    /REMOTE INPUT TEMPORARY                 /047 CJL
+
+       PAGE
+\f/     REMOTE LINE OUTPUT ROUTINE.
+
+/      CALLING SEQUENCE:
+
+/      TAD     CHAR            /CHARACTER TO OUTPUT IN AC
+/      JMS I   (REMOUT)        /CALL ROUTINE
+/      RETURN                  /RETURNS HERE WITH CLEAR AC
+
+REMOUT,        .-.                     /REMOTE LINE OUTPUT ROUTINE
+       DCA     REMTEMP         /SAVE PASSED VALUE
+       TAD     REMINSERT       /GET INSERTION POINTER
+       CIA                     /INVERT FOR TEST
+       TAD     REMREMOVE       /COMPARE TO REMOVAL POINTER
+       TAD     REMWAIT         /ADD ON WAIT STATUS
+       SZA CLA                 /SKIP IF BUFFER EMPTY AND NOT WAITING   /047 CJL
+       JMP     RSTUFF          /JUMP IF CHARACTER MUST BE BUFFERED
+       TAD     REMTEMP         /GET PASSED VALUE                       /047 CJL
+       JMS I   (REMPUT)        /TRY TO OUTPUT THE CHARACTER NOW        /047 CJL
+       JMP     RSTUFF          /COULDN'T OUTPUT IT, SO BUFFER IT       /047 CJL
+       JMP I   REMOUT          /RETURN
+
+RSTUFF,        TAD     REMTEMP         /GET THE CHARACTER
+       CDF     BUFFLD          /GOTO BUFFER FIELD
+       DCA I   REMINSERT       /STORE IN BUFFER
+       CDF     PRGFLD          /BACK TO OUR FIELD
+       NL0001                  /SET BUFFER INCREMENT
+       TAD     REMINSERT       /BUMP INSERTION POINTER
+       AND     [BUFSIZE-1]     /JUST BUFFER BITS
+       TAD     [REMBUFFER]     /MAKE IT ABSOLUTE
+       DCA     REMINSERT       /STORE UPDATED POINTER
+       JMP I   REMOUT          /RETURN
+
+/      REMOTE LINE OUTPUT TEST ROUTINE.
+
+/      CALLING SEQUENCE:
+
+/      JMS I   (REMTEST)       /CALL ROUTINE
+/      NOT READY               /RETURN IF OUTPUT NOT READY FOR NEXT CHARACTER
+/      READY                   /OUTPUT CAN ACCEPT ANOTHER CHARACTER NOW
+
+/      AC WILL BE CLEARED AFTER THE CALL.
+
+REMTEST,.-.                    /REMOTE LINE OUTPUT TEST ROUTINE
+       NL0001                  /SET BUFFER INCREMENT
+       TAD     REMINSERT       /GET INSERTION POINTER
+       CIA                     /INVERT FOR TEST
+       TAD     REMREMOVE       /COMPARE TO REMOVAL POINTER
+       AND     [BUFSIZE-1]     /JUST BUFFER BITS
+       SZA CLA                 /SKIP IF BUFFER IS FULL
+       ISZ     REMTEST         /BUMP RETURN IF BUFFER IS NOT FULL
+       JMP I   REMTEST         /RETURN EITHER WAY
+\f/     REMOTE LINE OUTPUT BUFFER UPDATE ROUTINE.
+
+/      CALLING SEQUENCE:
+
+/      JMS I   (REMUPDATE)     /CALL ROUTINE
+/      RETURN                  /RETURN WITH CLEAR AC
+
+/      THE REMOTE LINE OUTPUT  BUFFERING  ROUTINES WILL UPDATE POINTERS, ETC.  IF ANY
+/      STATUS HAS CHANGED SINCE THE LAST CALL.
+
+REMUPDA,.-.                    /REMOTE LINE OUTPUT UPDATE ROUTINE
+       TAD     RINWAIT         /GET INPUT WAIT FLAG
+       CLL RAL                 /MAIN STATE BIT TO LINK
+       SNA CLA                 /SKIP IF OUTPUT FLOW CHARACTER NEEDED   /047 CJL
+       JMP     REMCHECK        /JUMP IF CHARACTER NOT NEEDED NOW       /047 CJL
+       TAD     (CNTRLQ)        /ASSUME RELEASE CHARACTER NEEDED        /047 CJL
+       SNL                     /SKIP IF SO                             /047 CJL
+       TAD     [CNTRLS-CNTRLQ] /ELSE CHANGE IT TO HOLD CHARACTER       /047 CJL
+       JMS I   (REMPUT)        /TRY TO OUTPUT IT NOW                   /047 CJL
+       JMP     REMCHECK        /COULDN'T DO IT, FORGET IT FOR NOW      /047 CJL
+       CML RAR                 /SET NEW STATE VALUE                    /047 CJL
+       DCA     RINWAIT         /STORE IT
+REMCHEC,TAD    REMWAIT         /GET OUTPUT WAIT FLAG
+       SZA CLA                 /SKIP IF NOT WAITING
+       JMP I   REMUPDATE       /JUST RETURN IF WAITING
+       TAD     REMINSERT       /GET OUTPUT INSERTION POINTER
+       CIA                     /INVERT FOR TEST
+       TAD     REMREMOVE       /COMPARE TO OUTPUT REMOVAL POINTER
+       SNA CLA                 /SKIP IF BUFFER CONTAINS SOMETHING      /047 CJL
+       JMP I   REMUPDATE       /RETURN IF BUFFER EMPTY                 /047 CJL
+       CDF     BUFFLD          /GOTO BUFFER FIELD
+       TAD I   REMREMOVE       /GET A CHARACTER FROM THE BUFFER
+       CDF     PRGFLD          /BACK TO OUR FIELD
+       JMS I   (REMPUT)        /TRY TO OUTPUT THE CHARACTER NOW        /047 CJL
+       JMP I   REMUPDATE       /COULDN'T DO IT, SO JUST RETURN         /047 CJL
+       NL0001                  /SET BUFFER INCREMENT
+       TAD     REMREMOVE       /BUMP REMOVAL POINTER
+       AND     [BUFSIZE-1]     /JUST BUFFER BITS
+       TAD     [REMBUFFER]     /MAKE IT ABSOLUTE
+       DCA     REMREMOVE       /STORE UPDATED POINTER
+       JMP I   REMUPDATE       /RETURN
+
+       REMTEMP=REMUPDATE       /REMOTE OUTPUT TEMPORARY
+\f/     LOW-LEVEL CONSOLE OUTPUT ROUTINE.                               /047 CJL
+
+/      CALLING SEQUENCE:
+
+/      [CHARACTER TO OUTPUT IN THE AC]
+
+/      JMS I   (CONPUT)        /CALL ROUTINE
+/      NO OUTPUT               /RETURNS HERE IF OUTPUT UNAVAILABLE
+/      OUTPUT                  /RETURNS HERE IF CHARACTER WAS OUTPUT
+
+CONPUT,        .-.                     /CONSOLE OUTPUT ROUTINE
+CONTSF,        TSFIOT                  /FLAG UP?
+       JMP     CONCLEAR        /NO, FORGET IT
+CONTLS,        TLSIOT                  /YES, OUTPUT THE CHARACTER NOW
+       ISZ     CONPUT          /TAKE SKIP RETURN
+CONCLEA,CLA                    /CLEAN UP
+       JMP I   CONPUT          /RETURN EITHER WAY
+
+/      CONSOLE RESET ROUTINE.                                          /026 CJL
+
+/      CALLING SEQUENCE:
+
+/      JMS I   (CONRESET)      /CALL ROUTINE
+/      RETURN                  /RETURN WITH CLEAR AC
+
+/      RETURNS WITH CLEAR AC AND ALL CONSOLE VARIABLES RESET.
+
+CONRESE,.-.                    /CONSOLE RESET ROUTINE
+       TAD     [CONBUFFER]     /SETUP THE
+       DCA I   (CONINSERT)     /CONSOLE OUTPUT INSERTION POINTER
+       TAD     [CONBUFFER]     /SETUP THE
+       DCA I   (CONREMOVE)     /CONSOLE OUTPUT REMOVAL POINTER
+       TAD     [KEYBUFFER]     /SETUP THE
+       DCA I   (KEYINSERT)     /KEYBOARD INSERTION POINTER
+       TAD     [KEYBUFFER]     /SETUP THE
+       DCA I   (KEYREMOVE)     /KEYBOARD REMOVAL POINTER
+       DCA I   (CONWAIT)       /CLEAR OUTPUT WAIT
+       DCA     KEYERROR        /CLEAR KEYBOARD ERROR
+       JMP I   CONRESET        /RETURN
+\f/     LOW-LEVEL REMOTE LINE OUTPUT ROUTINE.                           /047 CJL
+
+/      CALLING SEQUENCE:
+
+/      [CHARACTER TO OUTPUT IN THE AC]
+
+/      JMS I   (REMPUT)        /CALL ROUTINE
+/      NO OUTPUT               /RETURNS HERE IF OUTPUT UNAVAILABLE
+/      OUTPUT                  /RETURNS HERE IF CHARACTER WAS OUTPUT
+
+REMPUT,        .-.                     /REMOTE LINE OUTPUT ROUTINE
+DM1AN2,        AND     [377]           /ENSURE EIGHT BIT                       /049 CJL
+
+/      THE  ABOVE INSTRUCTION IS FOR DECMATE I USE ONLY.  THE DEFAULT INSTRUCTION  IS
+/      FOR KL8 INTERFACES.
+
+       *DM1AN2                 /OVERLAY DECMATE II CODE                /049 CJL
+
+DM1AN2,        SKP                     /WE'RE NOT A DECMATE I                  /049 CJL
+       TAD     [400]           /SET WRITE BIT                          /049 CJL
+REMTSF,        DCA     RMPTEMP         /SAVE PASSED VALUE
+RMPUT0,        TAD     OUTFLAG         /CHECK IF OUTPUT IS AVAILABLE
+REMTLS,        SNA CLA                 /SKIP IF SO
+RMPUT1,        JMP I   REMPUT          /RETURN IF NOT
+REMCLEA,TAD    RMPTEMP         /GET THE PASSED VALUE
+RMPUT2,        OLS                     /OUTPUT THE CHARACTER NOW
+
+/      THE ABOVE INSTRUCTIONS ARE FOR DECMATE II USE ONLY.  THE DEFAULT  INSTRUCTIONS
+/      ARE FOR KL8 INTERFACES.
+
+       *REMTSF                 /OVERLAY DECMATE II CODE
+
+REMTSF,        RTSFIOT                 /FLAG UP?
+RMPUT0,        JMP     REMCLEAR        /NO, FORGET IT
+REMTLS,        RTLSIOT                 /YES, OUTPUT THE CHARACTER NOW
+RMPUT1,        ISZ     REMPUT          /TAKE SKIP RETURN
+REMCLEA,CLA                    /CLEAN UP
+RMPUT2,        JMP I   REMPUT          /RETURN EITHER WAY
+
+       CLA                     /CLEAN UP
+       DCA     OUTFLAG         /INDICATE OUTPUT IS UNAVAILABLE
+       ISZ     REMPUT          /TAKE SKIP RETURN
+       JMP I   REMPUT          /RETURN TO CALLER
+
+       RMPTEMP=CONRESET        /REMOTE OUTPUT TEMPORARY
+
+       PAGE
+\f/     SEVEN-BIT COMMAND TABLES.                                       /034 CJL
+
+       CMDTBL= .               /COMMAND TABLE HERE
+
+       "C&177; "O&177; "N&177  /\
+       "N&177; "E&177; "C&177  / >CONNECT COMMAND
+       "T&177; -1              //
+       CONSRV                  /CONNECT ROUTINE ADDRESS
+
+       "F&177; "I&177; "N&177  /\
+       "I&177; "S&177; "H&177  / >FINISH COMMAND
+       -1                      //
+       FINSRV                  /FINISH ROUTINE ADDRESS
+
+       "E&177; "X&177; "I&177  /EXIT
+       "T&177; -1              /COMMAND
+       EXITKERMIT              /EXIT ROUTINE ADDRESS
+
+       "S&177; "E&177; "N&177  /SEND
+       "D&177; -1              /COMMAND
+       SNDSRV                  /SEND ROUTINE ADDRESS
+
+       "G&177; "E&177; "T&177  /GET
+       -1                      /COMMAND
+       GETSRV                  /GET ROUTINE ADDRESS
+
+       "R&177; "E&177; "C&177  /\
+       "E&177; "I&177; "V&177  / >RECEIVE COMMAND
+       "E&177; -1              //
+       RECSRV                  /RECEIVE ROUTINE ADDRESS
+\f      "H&177; "E&177; "L&177  /HELP
+       "P&177; -1              /COMMAND
+       HELPSRV                 /HELP ROUTINE ADDRESS
+
+       -1                      /THIS ENDS THE TABLE                    /034 CJL
+
+/      REMOTE PACKET INPUT BUFFER.                                     /014 CJL
+
+RRBUF, 0                       /MARK
+RRLEN, 0                       /PACKET LENGTH
+RRSEQ, 0                       /PACKET SEQ
+RRTYP, 0                       /PACKET TYPE
+
+       DECIMAL
+
+RRDTA, ZBLOCK  91              /DATA GOES HERE
+
+       OCTAL
+
+RTERMI,        0                       /ADD LOCATION WHERE TERMINATOR IS STORED/A004
+                               /ON RECEIVE IF BUFFER IS MAXIMUM LENGTH /A004
+
+/      REMOTE PACKET OUTPUT BUFFER
+
+RSBUF, CNTRLA                  /PACKET BUFFER (BEGINS WITH "SOH")      /034 CJL
+RSLEN, 0                       /PACKET LENGTH GOES HERE
+RSSEQ, 0                       /PACKET SEQUENCE GOES HERE
+RSTYP, 0                       /PACKET TYPE GOES HERE
+
+       DECIMAL
+
+RSDTA, ZBLOCK  91              /DATA GOES HERE
+
+       0                       /CHECKSUM HERE ON MAX PACKET
+       0                       /EOL (IF USED HERE ON MAX PACKET)
+       0                       /INTERNAL TERMINATOR HERE ON MAX PACKET
+
+       OCTAL
+\f/     SEND-INIT PACKET DEFINITION
+
+INIDAT,        DECIMAL
+
+       94+32                   /94 CHARS MAX
+
+       OCTAL
+
+       "/&177                  /15 SECOND TIME-OUT                     /M013/014 CJL
+       " &177                  /NO PADDING
+       0+100&177               /NO PADDING CHAR
+       " &177+15               /CR FOR EOL
+       "#&177                  /QUOTE CHAR
+       "N&137                  /NO 8TH BIT QUOTING
+       "1&177                  /CHECK TYPE 1
+       " &177                  /NO REPEAT CHAR
+       " &177+0                /NO EXTRA CAPABILITY
+NODATA,        -1                      /END OF DATA (USE THIS FOR SENDING NO-DATA)
+\f      PAGE                    /GET TO NEXT PAGE                       /028 CJL
+
+/      NO-INTERRUPT CONSOLE INPUT/OUTPUT SUPPORT ROUTINES.             /023 CJL
+
+/      MODIFIED FOR FORCED-ECHO AND COLUMN-COUNTING.                   /043 CJL
+
+/      CONSOLE INPUT ROUTINE.  RETURNS  LATEST  CHARACTER  WITHOUT  ECHOING.   MAY BE
+/      CALLED WITH DIRTY AC.  RETURNS LATEST SEVEN-BIT CHARACTER TYPED WHILE FIELDING
+/      POTENTIAL <^S>/<^Q> PROTOCOL.
+
+INPUT, .-.                     /CONSOLE INPUT ROUTINE
+INPWAIT,JMS    CHKUP           /TRY TO GET A CHARACTER
+       TAD     INCHAR          /GET THE CHARACTER
+       SNA                     /SKIP IF ANYTHING CAME IN
+       JMP     INPWAIT         /WAIT FOR ANYTHING
+       JMP I   INPUT           /RETURN WITH LATEST CHARACTER
+
+/      CONSOLE  OUTPUT  ROUTINE.    OUTPUTS  CHARACTER  IN  AC  (INCLUDING  <HT>  VIA
+/      SIMULATION).  RETURNS WITH CLEAR AC.  SUBJECT TO CONSOLE ECHO STATUS (ECHOSW).
+
+P7CH,  .-.                     /CONSOLE OUTPUT ROUTINE
+       TAD     (-CNTRLI)       /COMPARE TO <HT>
+       SNA                     /SKIP IF OTHER
+       JMP     DOTAB           /JUMP IF <HT>
+       TAD     L11/(CNTRLI)    /RESTORE THE CHARACTER
+       JMS     P7CHAR          /PRINT IT (UPDATING COLUMN COUNT)
+       JMP I   P7CH            /RETURN
+
+DOTAB, TAD     [" &177]        /GET A <SPACE>
+       JMS     P7CHAR          /OUTPUT IT
+       TAD     COLUMN          /GET CURRENT COLUMN COUNT
+       AND     [7]             /JUST TAB BITS
+       SZA CLA                 /SKIP IF NOW AT NEW TAB STOP
+       JMP     DOTAB           /ELSE KEEP GOING
+       JMP I   P7CH            /RETURN
+
+/      FORCED-ECHO  CONSOLE  OUTPUT ROUTINE.  SAME AS P7CH BUT CLEARS  ECHOSW  BEFORE
+/      OUTPUT OF THE CHARACTER.
+
+P7ECHO,        .-.                     /CONSOLE OUTPUT WITH FORCED-ECHO ROUTINE
+       DCA     P7TEMP          /SAVE PASSED VALUE
+       DCA     ECHOSW          /CLEAR ECHO STATUS
+       TAD     P7TEMP          /RESTORE THE CHARACTER
+       JMS     P7CH            /CALL MAIN ROUTINE
+       JMP I   P7ECHO          /RETURN
+\fCHKUP,        .-.                             /CHECK FOR <^C>, ETC. ROUTINE
+       JMS     CTLCTST                 /CALL LOW-LEVEL INPUT CHECK ROUTINE
+       SNA                             /SKIP IF ANYTHING CAME BACK
+       JMP     CHKCLR                  /ELSE FORGET IT
+       TAD     (-CNTRLP)               /COMPARE TO <^P>
+       SNA                             /SKIP IF OTHER
+       JMP     DOUP                    /GO HANDLE <^P> THERE
+       IAC     /TAD    (-CNTRLO+CNTRLP)/COMPARE TO <^O>
+       SNA                             /SKIP IF OTHER
+       JMP     DOUO                    /GO HANDLER <^O> THERE
+       TAD     (-CNTRLS+CNTRLO)        /COMPARE TO <^S>
+       SZA CLA                         /SKIP IF IT MATCHES
+       JMP I   CHKUP                   /RETURN ON UNIMPORTANT CHARACTERS
+UQWAIT,        JMS     CTLCTST                 /CALL LOW-LEVEL INPUT CHECK ROUTINE
+       TAD     (-CNTRLQ)               /COMPARE TO <^Q>
+       SZA CLA                         /SKIP IF IT MATCHES
+       JMP     UQWAIT                  /ELSE WAIT FOR <^Q> FOREVER
+CHKCLR,        DCA     INCHAR                  /OBLITERATE INPUT CHARACTER
+       JMP I   CHKUP                   /RETURN
+
+/      COMES HERE TO HANDLE <^P>.
+
+DOUP,  TAD     ("P&177)                /GET A "P"
+       JMS     UPRINT                  /PRINT "^P"
+       JMP I   UPADDRESS               /GO WHERE YOU SHOULD
+
+/      COMES HERE TO HANDLE <^O>.
+
+DOUO,  TAD     ("O&177)                /GET AN "O"
+       JMS     UPRINT                  /PRINT "^O"
+       NL4000                          /SET REVERSING BIT
+       TAD     ECHOSW                  /REVERSE THE ECHO STATE
+       DCA     ECHOSW                  /STORE BACK
+       JMP     CHKCLR                  /OBLITERATE <^O> AND RETURN
+
+CTLCTST,.-.                            /LOW-LEVEL <^C> TEST ROUTINE
+       CLA                             /CLEAN UP
+KSFLOC,        KSFIOT                          /FLAG UP?
+       JMP I   CTLCTST                 /NO, JUST RETURN
+KRSZAP,        KRSIOT                          /**** 6120 **** KRBIOT
+       AND     [177]                   /JUST SEVEN-BIT
+       DCA     INCHAR                  /SAVE THE CHARACTER
+       NL7775                          /SET -<^C> VALUE
+       TAD     INCHAR                  /COMPARE TO CHARACTER
+       SNA CLA                         /SKIP IF OTHER THAN <^C>
+       JMP I   UCADDRESS               /JUMP IF <^C>
+KCCZAP,        KCCIOT                          /**** 6120 **** 0000
+       TAD     INCHAR                  /GET THE CHARACTER
+       JMP I   CTLCTST                 /RETURN
+\fP7CHAR,       .-.                     /LOWER-LEVEL CONSOLE PRINT ROUTINE
+       DCA     P7TEMP          /SAVE PASSED VALUE
+P7AGN, JMS     CHKUP           /CHECK FOR <^C>, ETC.
+       TAD     ECHOSW          /GET CURRENT ECHO STATUS
+       SPA CLA                 /SKIP IF ECHO ON
+       JMP     P7OFF           /JUMP IF ECHO OFF
+       TAD     P7TEMP          /GET THE PASSED VALUE BACK
+       JMS     P7OUT           /TRY TO OUTPUT IT
+       JMP     P7AGN           /COULDN'T OUTPUT, GO WAIT THERE
+P7OFF, JMS     CHKUP           /CHECK FOR <^C>, ETC.
+       TAD     P7TEMP          /GET THE CHARACTER BACK
+       AND     [140]           /JUST QUADRANT BITS
+       SZA CLA                 /SKIP IF CONTROL CHARACTER
+       ISZ     COLUMN          /BUMP COLUMN IF PRINTING CHARACTER
+L11,   CNTRLI/NOP              /JUST IN CASE
+       TAD     P7TEMP          /GET THE CHARACTER AGAIN
+       TAD     (-CNTRLM)       /COMPARE TO <CR>
+       SNA                     /SKIP IF NOT <CR>
+       DCA     COLUMN          /CLEAR COLUMN COUNT ON <CR>
+       TAD     (-CNTRLH+CNTRLM)/COMPARE TO <BS>
+       SNA CLA                 /SKIP IF OTHER
+       NL7777                  /SET BACKUP VALUE
+       TAD     COLUMN          /UPDATE COLUMN COUNT
+       DCA     COLUMN          /STORE BACK
+       JMP I   P7CHAR          /RETURN
+
+P7OUT, .-.                     /LOW-LEVEL CONSOLE OUTPUT ROUTINE
+P7TSF, TSFIOT                  /FLAG UP?
+       JMP I   P7OUT           /NO, TAKE IMMEDIATE RETURN WITH AC INTACT
+P7TLS, TLSIOT                  /YES, OUTPUT IT
+       CLA                     /CLEAN UP
+       ISZ     P7OUT           /BUMP RETURN ADDRESS
+       JMP I   P7OUT           /TAKE SKIP RETURN TO CALLER
+
+/      COMES HERE TO HANDLE <^C> IF SO ENABLED.
+
+UPCPRT,        TAD     ("C&177)        /GET A "C"
+       JMS     UPRINT          /PRINT "^C"
+KCCZP2,        KCCIOT                  /**** 6120 **** 0000
+       JMP I   [CLOOP]         /RESTART
+
+UPRINT,        .-.                     /"^"<CHARACTER> PRINTING ROUTINE
+       DCA     P7TEMP          /SAVE PASSED VALUE
+       TAD     ("^&177)        /GET AN "^"
+       JMS     P7OUT           /OUTPUT IT
+       JMP     .-1             /WAIT FOR IT
+       TAD     P7TEMP          /GET PASSED VALUE
+       JMS     P7OUT           /OUTPUT IT
+       JMP     .-1             /WAIT FOR IT
+       JMP I   UPRINT          /RETURN
+
+P7TEMP,        .-.                     /OUTPUT ROUTINE TEMPORARY
+\f      PAGE
+
+/      HANDLER I/O BUFFER DEFINITIONS.                                 /014 CJL
+
+       HNDLR=  .               /BUFFER FOR DISK I/O HANDLER            /014 CJL
+
+       *PAGCNT^200+HNDLR       /RESET ORIGIN PAST HANDLER BUFFER       /014 CJL
+
+       IFNZRO  SBOOT-.&4000    <ERROR  .>                              /028 CJL
+
+       *SBOOT-2                /JUST BEFORE EXIT ADDRESS               /025 CJL
+EXITKER=.              /WHERE TO EXIT TO                       /025 CJL
+       0
+       CAF /PHPH
+\f/     ONCE-ONLY INITIALIZATION CODE.                                  /024 CJL
+
+       *HNDLR                  /OVER AVAILABLE SPACE
+
+INITIAL,CLA CLL                        /CLEAN UP
+COUTINI,TLSIOT                 /RAISE CONSOLE OUTPUT FLAG              /046 CJL
+       TAD     INITIA/(CLA CLL)/GET REPLACEMENT INSTRUCTION
+       DCA I   [CLOOP]         /DON'T COME BACK TO US
+       JMS I   (MACHINE)       /IDENTIFY CPU TYPE
+       DCA     CPUTEMP         /SAVE IT
+       TAD     CPUTEMP         /GET CPU TYPE
+       TAD     (-13)           /COMPARE TO DEADLY 6120 VALUE
+       SNA CLA                 /SKIP IF OTHER
+       JMP     INI6120         /JUMP IF IT MATCHES
+ROUTINI,RTLSIOT                        /INITIALIZE REMOTE OUTPUT               /046 CJL
+RININIT,RKRBIOT                        /INITIALIZE REMOTE INPUT                /046 CJL
+       CLA                     /CLEAN UP
+INITPRT,
+/PHPHPH
+/      JMS I   [SCRIBE]        /GIVE THEM THE
+/      INITMSG                 /OPENING MESSAGE
+/      JMS I   [SCRIBE]        /GIVE THEM THE
+/      DAYMSG                  /DAY MESSAGE
+/      JMS I   [SCRIBE]        /GIVE THEM THE
+/      MONMSG                  /MONTH MESSAGE
+/      JMS I   [SCRIBE]        /GIVE THEM THE
+/      YEARMSG                 /YEAR MESSAGE
+/      JMS I   [SCRIBE]        /GIVE THEM THE
+/      CPUTMSG                 /CPU ID MESSAGE
+       TAD     CPUTEMP         /*1
+       CLL RTL                 /*4
+       TAD     CPUTEMP         /*5
+       TAD     (CPULIST)       /POINT TO PROPER MESSAGE
+       DCA     TST6120         /STORE IN-LINE
+/      JMS I   [SCRIBE]        /TELL THEM THEIR
+       SKP     /PHPH
+TST6120,0                      /ACTUAL CPU ID
+/      JMS I   [SCRIBE]        /GIVE THEM THE
+/      CLOSMSG                 /CLOSING MESSAGE
+DMPRZAP,JMP    .+3             /**** DECMATE USAGE DETECTED **** 0000
+       JMS I   [SCRIBE]        /GIVE THEM THE
+SPZAP, DMPOMSG                 /DECMATE PORT MESSAGE
+       JMS I   [SCRIBE]        /GIVE THEM THE
+       CRLF                    /END OF LINE
+       JMS I   [SCRIBE]        /GIVE THEM THE
+       LCLMSG                  /LOCAL PREFERENCE MESSAGE
+/      JMS I   [SCRIBE]        /TELL THEM THEY CAN
+/      THLPMSG                 /ASK FOR HELP
+       TAD     CPUTEMP         /GET CPU TYPE
+       CLL RTL                 /*4
+       TAD     (CPUPRMPT-1)    /POINT TO PROPER ENTRY
+       DCA     XR0             /STASH THE POINTER
+       TAD     (-4)            /GET MOVE COUNT
+       JMS     MESMOVE         /MOVE THE PROPER PROMPT TEXT
+       PROMID-1                /TO THERE
+\f      TAD     CPUTEMP         /*1
+       CLL RTL                 /*4
+       TAD     CPUTEMP         /*5
+       TAD     (CPUIDLST-1)    /POINT TO PROPER ENTRY
+       DCA     XR0             /STASH THE POINTER
+       TAD     (-5)            /GET MOVE COUNT
+       JMS     MESMOVE         /MOVE THE PROPER CPU ID TEXT
+       CPUMSG-1                /TO THERE
+       CIF     USRFLD          /GOTO USR FIELD                         /035 CJL
+       JMS I   (USR)           /CALL USER SERVICE ROUTINE              /035 CJL
+       USRIN                   /LOCK USR IN                            /035 CJL
+
+/      DO FURTHER INITIALIZATION HERE.
+
+       JMP I   [CLOOP]         /GO BACK TO KERMIT PROPER
+
+/      COMES HERE TO INITIALIZE 6120-BASED MACHINES.                   /046 CJL
+
+INI6120,DCA I  (KCCZAP)        /ELIMINATE KCCIOT
+       DCA I   (KCCZP2)        /ELIMINATE KCCIOT
+       ISZ I   (KRSZAP)        /TURN KRSIOT
+       ISZ I   (KRSZAP)        /INTO KRBIOT
+       TAD     ROUTINITIALIZE  /GET OUTPUT INITIALIZE INSTRUCTION      /046 CJL
+       TAD     (-6336)         /COMPARE TO POSSIBLE VALUE              /046 CJL
+       SZA CLA                 /SKIP IF IT MATCHES SERIAL PRINTER VALUE/046 CJL
+       JMP     TRYDM1          /JUMP IF NOT CONFIGURED FOR SERIAL PORT /046 CJL
+       TAD     RININITIALIZE   /GET INPUT INITIALIZE INSTRUCTION       /046 CJL
+       TAD     (-6326)         /COMPARE TO POSSIBLE VALUE              /046 CJL
+       SNA CLA                 /SKIP IF NOT CONFIGURED FOR SERIAL PORT /046 CJL
+       JMP     DMSER           /JUMP IF SERIAL PORT CONFIGURATION      /046 CJL
+TRYDM1,        CLSK                    /SKIP ON, CLEAR CLOCK FLAG IF DECMATE II/046 CJL
+       NOP                     /JUST IN CASE                           /046 CJL
+       CLCL                    /CLEAR VT278 CLOCK FLAG                 /046 CJL
+       NOP                     /JUST IN CASE                           /046 CJL
+       ISZ     TST6120         /WASTE                                  /046 CJL
+       JMP     .-1             /SOME TIME                              /046 CJL
+       CLSK8A                  /VT278 CLOCK FLAG UP?                   /046 CJL
+       JMP     TRYDM2          /NO, TRY DECMATE II, ETC.               /046 CJL
+       DCA     DMPRZAP         /MAKE IT PRINT OUR MESSAGE              /050 CJL
+       CIF CDF DMIFLD          /GOTO DECMATE ONCE-ONLY CODE FIELD      /046 CJL
+       JMP I   (DM1INIT)       /CONTINUE THERE                         /046 CJL
+
+TRYDM2,        CLSK                    /CLOCK FLAG UP?                         /046 CJL
+       JMP     ROUTINITIALIZE  /NO, MUST BE SOMEBODY ELSE!             /046 CJL
+       DCA     DMPRZAP         /MAKE IT PRINT OUR MESSAGE              /048 CJL
+       CIF CDF DMIFLD          /GOTO DECMATE ONCE-ONLY FIELD           /046 CJL
+       JMP I   (DM2INIT)       /CONTINUE THERE                         /046 CJL
+
+/      COMES HERE IF SERIAL PORT CONFIGURATION ON DECMATE.
+
+DMSER, DCA     DMPRZAP         /MAKE IT PRINT OUR MESSAGE              /048 CJL
+       TAD     (DMPPMSG)       /GET OUR MESSAGE ADDRESS                /048 CJL
+       DCA     SPZAP           /STORE IN-LINE                          /048 CJL
+       JMP     ROUTINITIALIZE  /CONTINUE THERE
+\fMESMOVE,.-.                   /MESSAGE MOVE ROUTINE
+       DCA     MMOVCNT         /SAVE PASSED COUNT
+       TAD I   MESMOVE         /GET THE PASSED ARGUMENT
+       DCA     XR1             /SET IT UP
+       ISZ     MESMOVE         /BUMP PAST ARGUMENT
+       CDF     MSGFLD          /GOTO BUFFER FIELD
+MESMVLP,TAD I  XR0             /GET A WORD
+       DCA I   XR1             /PUT A WORD
+       ISZ     MMOVCNT         /DONE YET?
+       JMP     MESMVLP         /NO, GO BACK
+       CDF     PRGFLD          /BACK TO OUR FIELD
+       JMP I   MESMOVE         /YES, RETURN
+
+CPUTEMP,.-.                    /TEMPORARY FOR MACHINE TYPE
+MMOVCNT,.-.                    /TEMPORARY FOR MOVE COUNT
+
+       PAGE
+\f/     CPU IDENTIFYING ROUTINE.                                        /024 CJL
+
+/      RETURNS VALUE IN AC ACCORDING TO THE FOLLOWING RULE:
+
+/      AC      CPU TYPE
+
+/      0       UNKNOWN (DCC112, MP-12?)
+/      1       PDP-5 (THE INCOMPATIBLE ONE!)
+/      2       PDP-8 (THE REAL ONE!)
+/      3       PDP-8/S (THE SLOW ONE!)
+/      4       LINC-8 (THE STRANGE ONE!)
+/      5       PDP-8/I (THE ORANGE ONE!)
+/      6       PDP-8/L (THE STRIPPED-DOWN ONE!)
+/      7       PDP-12 (THE GREEN ONE! (BLUE?))
+/      10      PDP-8/E (THE FAST ONE!)
+/      11      PDP-8/A (THE WIDE ONE!)
+/      12      6100 (THE MICRO ONE!)
+/      13      6120 (THE HARRIS ONE!)
+
+MACHINE,.-.                    /MACHINE IDENTIFYING ROUTINE
+       CLA CLL                 /THIS WORKS ON EVERYBODY!
+       TAD     0               /GET PDP-5 PC
+       DCA     MACHTEMP        /SAVE IT
+       TAD     (IMA5-1)        /GET PDP-5 NEW PC
+       DCA     0               /STORE IT
+
+/      IF WE GET HERE, WE'RE NOT A PDP-5.
+
+       TAD     MACHTEMP        /GET OLD LOCATION ZERO
+       DCA     0               /RESTORE IT
+       NL3776                  /PDP-8/I, L WEIRDNESS
+       TAD     (-3776)         /COMPARE TO POSSIBLE VALUE
+       SNA CLA                 /SKIP IF NOT THOSE TWO
+       JMP     IMA8IL          /JUMP IF ONE OF THEM
+
+/      IF WE GET HERE, WE'RE NOT A PDP-8/I OR PDP-8/L.
+
+       NL7776                  /SETUP -2
+       TAD     (-7776)         /COMPARE TO EXPECTED VALUE
+       SZA CLA                 /SKIP IF OK
+       JMP     IMA8S           /JUMP IF RETARDED BROTHER
+
+/      IF WE GET HERE, WE'RE NOT A PDP-8/S.
+
+       NL0100                  /SETUP 0100
+       TAD     (-100)          /COMPARE TO EXPECTED VALUE
+       SNA CLA                 /SKIP IF STRAIGHT PDP-8
+       JMP     IMAOMNIBUS      /JUMP IF NEWER CPU
+\f/     IF WE GET HERE, WE ARE A PDP-8, BUT ARE WE A LINC-8?
+
+       NL7777                          /SETUP LINC TEST VALUE
+       IACA                            /LOAD LINC "A" REGISTER
+       CLA                             /CLEAN UP
+       IAAC                            /GET IT BACK
+       IAC                             /ADD ONE
+       SNA CLA                         /SKIP IF NO LINC HARDWARE
+       JMP     IMAL8                   /JUMP IF LINC-8
+
+/      SINCE WE DON'T CARE ABOUT PERIPHERALS, WE ARE A PDP-8.
+
+       JMP     IMA8                    /GO TELL THEM WE ARE A PDP-8
+
+/      COMES HERE IF PDP-8/I OR PDP-8/L.
+
+IMA8IL,        NL7777                          /SETUP TEST VALUE
+       CLA!401                         /DO PDP-8/I GROUP THREE EAE CLA
+       SZA CLA                         /SKIP IF PDP-8/I
+       JMP     IMA8L                   /JUMP IF NOT
+
+/      IF WE GET HERE, WE ARE A PDP-8/I, BUT ARE WE A PDP-12?
+
+       LINC                            /GOTO LINC MODE
+       COM                             /COMPLEMENT AC IF PDP-12, ELSE A HARMLESS AND
+       PDP                             /GOTO PDP8 MODE IF PDP-12, ELSE HARMLESS AND
+       IAC                             /ADD ONE FOR TEST
+       SNA CLA                         /SKIP IF JUST PDP-8/I
+       JMP     IMA12                   /JUMP IF ACTUALLY A LINC-8/I
+
+/      SINCE WE DON'T CARE ABOUT PERIPHERALS, WE ARE JUST A PDP-8/I.
+
+       JMP     IMA8I                   /TELL THEM WE ARE A PDP-8/I
+
+IMAOMNI,RTL RTR                                /DO STRANGE OMNIBUS INSTRUCTION
+PC8A,  SNA                             /SKIP IF NOT A MICRO CHIP
+       JMP     IMA61                   /JUMP IF ONE OF THOSE THINGS
+       TAD     (.&7600+16^7777)        /CHECK FOR PDP-8/E VALUE
+       SNA                             /SKIP IF NOT HIM
+       JMP     IMA8E                   /JUMP IF IT IS A PDP-8/E (/F OR /M OR 8A-6XX)
+       TAD     (.&7600+16-PC8A)        /COMPARE TO PDP-8/A VALUE       /051 CJL
+       SNA CLA                         /SKIP IF SOMEBODY ELSE
+       JMP     IMA8A                   /JUMP IF IT MATCHES
+
+/      IF WE GET HERE, SOME STRANGE PROCESSOR IS RUNNING US.
+
+       JMP     IMAUNKNOWN              /YOU FIGURE IT OUT!
+\f/     IF WE GET HERE, WE ARE A 6100 OR 6120.
+
+IMA61, NL0010                  /DO 6120 SPECIAL INSTRUCTION
+       TAD     (-10)           /COMPARE TO EXPECTED VALUE
+       SNA CLA                 /SKIP IF OTHER
+       JMP     IMA6120         /JUMP IF IT MATCHES
+
+/      WE APPARENTLY ARE ON A 6100, SO TELL THEM SO.
+
+       JMP     IMA6100         /TELL THEM WE ARE A 6100 MACHINE (VT-78, ETC.)
+
+/      RETURN GAUNTLET.
+
+IMA6120,IAC                    /SET 6120 VALUE
+IMA6100,IAC                    /SET 6100 VALUE
+IMA8A, IAC                     /SET PDP-8/A VALUE
+IMA8E, IAC                     /SET PDP-8/E VALUE
+IMA12, IAC                     /SET PDP-12 VALUE
+IMA8L, IAC                     /SET PDP-8/L VALUE
+IMA8I, IAC                     /SET PDP-8/I VALUE
+IMAL8, IAC                     /SET LINC-8 VALUE
+IMA8S, IAC                     /SET PDP-8/S VALUE
+IMA8,  IAC                     /SET PDP-8 VALUE
+IMA5,  IAC                     /SET PDP-5 VALUE
+IMAUNKN,JMP I  MACHINE         /RETURN
+
+MACHTEM,.-.                    /TEMPORARY FOR LOCATION ZERO
+
+       PAGE
+\f      FIELD   PRGFLD%10       /DUMP THE LITERALS NOW
+\f/     LAYOUT OF FIELD ONE (PERMANENT CONTENTS).                       /046 CJL
+
+       NOPUNCH                         /FOOL THE ASSEMBLER             /046 CJL
+
+       FIELD   USRFLD%10               /USR FIELD                      /046 CJL
+
+       *0                              /WHERE IT LOADS                 /046 CJL
+
+USRLOAD,ZBLOCK 200-.                   /GET TO ENTRY POINT             /046 CJL
+
+       USRENTR=.                       /LOCKED-IN USR ENTRY POINT      /046 CJL
+
+USRENTR,ZBLOCK 2000-.                  /USR OWNS REST OF THIS AREA     /046 CJL
+
+       FILBUFF=.                       /FILE I/O DONE HERE             /046 CJL
+
+       FIELD   BUFFLD%10               /FILE I/O BUFFER FIELD          /046 CJL
+
+       *FILBUFFER                      /RESET ORIGIN                   /046 CJL
+
+FILBUFF,ZBLOCK PAGCNT^200              /THIS IS THE FILE I/O BUFFER    /046 CJL
+
+       DIRBUFF=.                       /DIRECTORY LOOKUP I/O DONE HERE /028 CJL
+
+       FIELD   DIRFLD%10               /DIRECTORY LOOKUP BUFFER FIELD  /028 CJL
+
+       *DIRBUFFER                      /RESET ORIGIN                   /028 CJL
+
+FILECNT,.-.                            /-(NUMBER OF ENTRIES IN THIS SEGMENT)
+FRSTREC,.-.                            /FIRST RECORD OF FIRST ENTRY IN THIS SEGMENT
+DIRLINK,.-.                            /LINK TO NEXT SEGMENT; 0 IF LAST ACTIVE ONE
+       .-.                             /TENTATIVE ENTRY POINTER STORED HERE
+AIWNUMB,.-.                            /-(NUMBER OF ADDITIONAL INFORMATION WORDS)
+
+       ENTSTRT=.                       /FILE ENTRIES START HERE        /046 CJL
+
+       ZBLOCK  PAGCNT^200+DIRBUFFER-.  /DIRECTORY ENTRIES HERE         /046 CJL
+
+/      CONNECT MODE I/O BUFFERS.                                       /026 CJL
+
+KEYBUFF,ZBLOCK BUFSIZE                 /KEYBOARD BUFFER                /026 CJL
+CONBUFF,ZBLOCK BUFSIZE                 /CONSOLE OUTPUT BUFFER          /026 CJL
+RINBUFF,ZBLOCK BUFSIZE                 /REMOTE INPUT BUFFER            /026 CJL
+REMBUFF,ZBLOCK BUFSIZE                 /REMOTE OUTPUT BUFFER           /026 CJL
+
+       FLD1ADR=.                       /SPACE AVAILABLE FOR TEXT, ETC. /046 CJL
+
+       ENPUNCH                         /UN-FOOL THE ASSEMBLER          /046 CJL
+\f/     DECMATE ONCE-ONLY CODE.                                         /046 CJL
+
+       FIELD   DMIFLD%10               /DECMATE ONCE-ONLY CODE FIELD   /046 CJL
+
+       *USRLOAD                        /OVER USR ROUTINE               /046 CJL
+
+/      PAGE ZERO FOR ONCE-ONLY CODE.                                   /046 CJL
+
+       *10                             /GET TO AUTO-INDEX AREA         /048 CJL
+
+XR0,   .-.                             /AUTO-INDEX ZERO                /048 CJL
+
+       *USRENTRY                       /OVER USR ENTRY POINT           /046 CJL
+
+/      DECMATE I ONCE-ONLY CODE.                                       /046 CJL
+
+DM1INIT,JMS I  (DM1PORT)               /INITIALIZE THE REMOTE PORTS    /050 CJL
+       TAD     (DM1LIST-1)             /POINT TO REPLACEMENT LIST      /050 CJL
+       JMS     REPLACE                 /ZAP IN ALL OF OUR PATCHES      /050 CJL
+       CDF     PRGFLD                  /GOTO MAIN FIELD                /050 CJL
+       TAD I   (DIRXR)                 /GET PORT SELECTION             /050 CJL
+       SNA CLA                         /SKIP IF PORT 1 REQUIRED        /050 CJL
+       JMP     USEP0                   /JUMP IF PORT 0 REQUIRED        /050 CJL
+       TAD     (DM1SEC-1)              /POINT TO REPLACEMENT LIST      /050 CJL
+       JMS     REPLACE                 /ZAP IN SECONDARY PATCHES       /050 CJL
+USEP0, CIF CDF PRGFLD                  /BACK TO REST OF INITIALIZATION /046 CJL
+       JMP I   (INITPRT)               /CONTINUE THERE                 /046 CJL
+
+/      DECMATE II, ETC. ONCE-ONLY CODE.                                /046 CJL
+
+DM2INIT,JMS I  (DMIPORT)               /INITIALIZE THE REMOTE PORT     /048 CJL
+       TAD     (DM2LIST-1)             /POINT TO REPLACEMENT LIST      /048 CJL
+       JMS     REPLACE                 /ZAP IN ALL OF OUR PATCHES      /048 CJL
+       CIF CDF PRGFLD                  /BACK TO REST OF INITIALIZATION /046 CJL
+       JMP I   (INITPRT)               /CONTINUE THERE                 /046 CJL
+
+REPLACE,.-.                            /REPLACEMENT ROUTINE            /048 CJL
+       DCA     XR0                     /SAVE PASSED LIST POINTER       /048 CJL
+REPLUP,        CDF     DMIFLD                  /BACK TO OUR FIELD              /048 CJL
+       TAD I   XR0                     /GET AN ADDRESS                 /048 CJL
+       SNA                             /SKIP IF NOT AT END OF LIST     /048 CJL
+       JMP I   REPLACE                 /RETURN IF END OF LIST          /048 CJL
+       DCA     REPADR                  /STASH THE ADDRESS              /048 CJL
+       TAD I   XR0                     /GET THE REPLACEMENT VALUE      /048 CJL
+       CDF     PRGFLD                  /GOTO ZAPPING FIELD             /048 CJL
+       DCA I   REPADR                  /ZAP IT IN                      /048 CJL
+       JMP     REPLUP                  /KEEP GOING                     /048 CJL
+
+REPADR,        .-.                             /REPLACEMENT ADDRESS TEMPORARY  /048 CJL
+\f/     DECMATE I PORT INITIALIZE ROUTINE                               /050 CJL
+
+DM1PORT,.-.                            /DECMATE I PORT INITIALIZE ROUTINE
+       TAD     (234)                   /GET PORT 0 SCD ENABLE VALUE
+       WCON0                           /WRITE PORT 0 CONTROL REGISTER
+       NL0000                          /INDICATE PORT 0
+       JMS     PRTINIT                 /INITIALIZE PORT 0
+
+/      CHANGE ALL IOTS TO PORT 1 VALUES.
+
+IOCLUP,        ISZ     PSETF1                  /BUMP SET FLAG INSTRUCTION
+       ISZ     PDUMRD                  /BUMP DUMMY READ INSTRUCTION
+       ISZ     PSETF2                  /BUMP SET FLAG INSTRUCTION
+       ISZ     PSKIP                   /BUMP SKIP ON FLAG INSTRUCTION
+       ISZ     PLOAD                   /BUMP LOAD INSTRUCTION
+       ISZ     IOTCNT                  /DONE YET?
+       JMP     IOCLUP                  /NO, KEEP GOING
+
+       TAD     (234)                   /GET PORT 1 SCD ENABLE VALUE
+       WCON1                           /WRITE PORT 1 CONTROL REGISTER
+       NL4000                          /INDICATE PORT 1
+       JMS     PRTINIT                 /INITIALIZE PORT 1
+       JMP I   DM1PORT                 /RETURN
+
+PRTINIT,.-.                            /LOW-LEVEL PORT INTIALIZE ROUTINE
+       RACD                            /RESET DESIRED PORT
+       ISZ     PWASTE                  /WASTE
+       JMP     .-1                     /SOME TIME
+       CLA                             /CLEAN UP
+PSETF1,        RTFL0                           /SET THE FLAG NOW
+       TAD     (2516)                  /SETUP FOR 8 BITS, NO PARITY, ETC.
+       JMS     PSEND                   /SEND TO MODE REGISTER 1
+       CDF     PRGFLD                  /GOTO MAIN FIELD
+       TAD I   (RATE)                  /GET BAUD RATE NOW
+       CDF     DMIFLD                  /BACK TO OUR FIELD
+       TAD     (2460)                  /ADD ON CLOCK ENABLES, ETC.
+       JMS     PSEND                   /SEND TO MODE REGISTER 2
+       TAD     (3425)                  /GET ENABLE AND RESET VALUE
+       JMS     PSEND                   /SEND TO COMMAND REGISTER
+PDUMRD,        RKRB0                           /DO A DUMMY READ NOW
+PSETF2,        RTFL0                           /SET THE FLAG NOW
+       CLA                             /CLEAN UP
+       JMP I   PRTINIT                 /RETURN
+
+PSEND, .-.                             /PORT WRITE ROUTINE
+PSKIP, RTSF0                           /FLAG UP?
+       JMP     PSKIP                   /NO, WAIT FOR IT
+PLOAD, RTLS0                           /YES, LOAD THE VALUE
+       CLA                             /CLEAN UP
+       JMP I   PSEND                   /RETURN
+
+IOTCNT,        RKFL0-RKFL1                     /INTER-DEVICE IOT COUNT
+PWASTE,        0                               /TIMER TEMPORARY
+\f      PAGE
+\f/     DECMATE II, ETC. PORT INITIALIZE ROUTINE.                       /048 CJL
+
+/      THIS ROUTINE IS MOSTLY  "DARK  GREY MAGIC" WHICH IS PRIMARILY DERIVED FROM THE
+/      "OFFICIAL" INFORMATION TAKEN FROM THE ONLY KNOWN DOCUMENTATION, THE DECMATE II
+/      PROGRAMMER'S REFERENCE MANUAL:  EK-DECM2-RM-001.  VARIOUS EMPLOYEES OF DIGITAL
+/      EQUIPMENT CORPORATION (A MULTI-NATIONAL COMPANY) HAVE ADDITIONALLY CONTRIBUTED
+/      TO THIS EFFORT BY PROVIDING PORTIONS OF THE  "SACRED SLUSHWARE NOTES" ON A NOT
+/      NECESSARILY  WILLING  BASIS  THROUGH  THEIR RELEASED WORKS, SUCH AS,  BUT  NOT
+/      LIMITED TO, THE SOURCES OF THE PARTICULAR VERSION OF KERMIT-8  KNOWN  AS K278.
+/      IT  IS  ASSUMED THAT THESE PEOPLE HAVE ACCESS TO BETTER DOCUMENTATION  OF  THE
+/      HARDWARE, AND  ESPECIALLY  DOCUMENTATION  OF  THE  THREE  DIFFERENT  MODELS OF
+/      DECMATE (II, III, III+) THAT THESE ISSUES APPLY TO.
+
+/      SINCE IT IS NOT KNOWN WHETHER THE K278, ETC.  CODE IS SPECIFIC AND PRECISE, OR
+/      MERELY SLOPPY, VARIOUS "QUIRKY" CODING TECHNIQUES HAVE BEEN LEFT "AS IS", WITH
+/      COMMENTS   REGARDING  POTENTIAL  VARIANCE  WITH  DOCUMENTATION  NOTED    WHERE
+/      NECESSARY.  THE ORDER OF ACCESS TO THE  REGISTERS HAS BEEN LEFT INTACT IN CASE
+/      OF POTENTIAL INTERACTION.  SEVERAL CHANGES HAVE BEEN MADE  BEYOND THIS WORK AS
+/      A  RESULT  OF  TRIAL-AND-ERROR, AND ALSO HAND DIS-ASSEMBLY OF SEVERAL  DECMATE
+/      DISKETTES' CONTENTS.
+
+/      IT IS HOPED THAT FUTURE "NEGOTIATIONS" WITH DEC ALLOW FOR PROPER DISCLOSURE OF
+/      THESE ISSUES TO AVOID POTENTIAL SOFTWARE FAILURES  EVIDENT  IN  THESE ROUTINES
+/      DUE TO LACK OF PROPER DOCUMENTATION.
+
+DMIPORT,.-.                    /COMMUNICATIONS PORT INITIALIZE ROUTINE
+
+/      ACCORDING TO THE DECMATE II MANUAL, THE FOLLOWING INSTRUCTION IS UNDEFINED.
+
+       MPRESET                 /RESET MULTIPROTOCOL COMMUNICATIONS CONTROLLER CHIP
+
+/      THE DECMATE III HAS  AN  INTERNAL  MODEM  OPTION WHICH IS NOT AVAILABLE IN THE
+/      DECMATE II.  THE INTERFACE  TO THIS DEVICE IS APPARENTLY SHARED WITH THE MPSCC
+/      MODEM INTERFACE WE NORMALLY USE, SO THE REGISTER ACCESS MUST BE MORE CAREFULLY
+/      DEFINED.  THE APPARENT DIFFERENTIATION IS THE CURRENT VALUE OF THE DATA FIELD,
+/      NAMELY EITHER FIELD 0 OR 1.  IT  IS  NOT  KNOWN WHETHER THE THREE-BIT VALUE OF
+/      THE DATA FIELD IS SIGNIFICENT (PRESUMABLY FOR FUTURE EXPANSION), OR MERELY THE
+/      DATA  FIELD'S  LOW-ORDER  BIT  IS  USED, AS ALL KNOWN EXAMPLES  OF  ALLEDGEDLY
+/      FUNCTIONAL CODE USE APPROPRIATE CDF 00 AND CDF 10 ONLY.   APPARENTLY THE MODEM
+/      INTERFACE IS REFERRED TO AS "A" AND THE MPSCC INTERFACE IS REFERRED TO AS "B".
+
+       TAD     (030)           /GET RESET VALUE
+       CDF     00              /TALKING TO REGISTER 0A
+       MPSCC                   /RESET COMMUNICATIONS CHIP
+       CDF     10              /TALKING TO REGISTER 0B
+       MPSCC                   /RESET COMMUNICATIONS CHIP
+\f/     ACCORDING  TO  THE  DECMATE II MANUAL, CONTROL  REGISTER  2 "HAS  NO  RELEVANT
+/      BITS...  IF IT IS EVER WRITTEN, IT MUST BE WRITTEN WITH ALL ZEROS." APPARENTLY
+/      THE  MODEM  INTERFACE  DEMANDS  A  NON-ZERO  VALUE  BE  WRITTEN  TO REGISTER 2
+/      (PRESUMABLY TO  DISABLE  IT).  TO SATISFY THE ABOVE REQUIREMENT (WHATEVER THIS
+/      IMPLIES!), REGISTER 2(B)  IS  WRITTEN  WITH ALL ZEROS *LAST* IN CASE THIS IS A
+/      DECMATE II WHERE THE DATA FIELD CONSIDERATIONS ARE MEANINGLESS.
+
+       CDF     00              /TALKING TO REGISTER 0A
+       NL0002                  /WANT REGISTER 2A
+       MPSCC                   /SELECT IT
+       TAD     (020-2)         /GET RESET VALUE
+       MPSCC                   /LOAD IT
+       CDF     10              /TALKING TO REGISTER 0B
+       NL0002                  /WANT REGISTER 2B
+       MPSCC                   /SELECT IT
+       NL0000                  /GET RESET VALUE (000)
+       MPSCC                   /LOAD IT
+
+/      THE K278 CODE DOES NOT HAVE SETUP CODE FOR REGISTER 4B, PRESUMABLY BECAUSE THE
+/      CODE PERFORMS A PANEL  REQUEST  (PRQ3) WHICH SETS UP THE EQUIVALENT VALUES FOR
+/      ASYNCHRONOUS OPERATION WITH ONE STOP  BIT  AND  NO PARITY.  IT IS NOT KNOWN IF
+/      THE DECMATE III EVEN *HAS* A  REGISTER  4B, BUT PRESUMABLY IT IS AVAILABLE FOR
+/      LOADING THE RIGHT VALUES COMPATIBLE WITH THE DECMATE II, OR ATTEMPTING TO LOAD
+/      IT IS INNOCUOUS. 
+
+       CDF     00              /TALKING TO REGISTER 0A
+       NL0004                  /WANT REGISTER 4A
+       MPSCC                   /SELECT IT
+       TAD     (104-4)         /SETUP FOR ASYNCHRONOUS, ONE STOP BIT, NO PARITY
+       MPSCC                   /LOAD IT
+       CDF     10              /TALKING TO REGISTER 0B
+       NL0004                  /WANT REGISTER 4B
+       MPSCC                   /SELECT IT
+       TAD     (104-4)         /SETUP FOR ASYNCHRONOUS, ONE STOP BIT, NO PARITY
+       MPSCC                   /LOAD IT
+\f/     THE  DOCUMENTED VALUES  (FOR DECMATE II) REGARDING CONTROL REGISTER 1 INDICATE
+/      THE PROPER VALUE OF 022, WHERE BIT[9] IS DEFINED AS A ZERO.   THE VALUE OF 026
+/      IS  TAKEN  FROM  K278  WHERE  PRESUMABLY  THE  EXTRA BIT IS NECESSARY FOR SOME
+/      DECMATE III OBSCURITY.
+
+/      THE FOLLOWING CODE IS  REDUNDANT  FOR  LOADING  REGISTER  0A  BEFORE AND AFTER
+/      LOADING REGISTER 0B.  THIS  IS  EITHER A MISTAKE OR OBSCURELY NECESSARY (TAKEN
+/      FROM K278).
+
+       CDF     00              /TALKING TO REGISTER 0A
+       NL0001                  /WANT REGISTER 1A
+       MPSCC                   /SELECT IT
+       TAD     (026-1)         /GET SETUP VALUE
+       MPSCC                   /LOAD IT
+       CDF     10              /TALKING TO REGISTER 0B
+       NL0001                  /WANT REGISTER 1B
+       MPSCC                   /SELECT IT
+       TAD     (026-1)         /GET SETUP VALUE
+       MPSCC                   /LOAD IT
+       CDF     00              /TALKING TO REGISTER 0A
+       NL0001                  /WANT REGISTER 1A
+       MPSCC                   /SELECT IT
+       TAD     (026-1)         /GET SETUP VALUE
+       MPSCC                   /LOAD IT
+
+/      THE DECMATE III INTERNAL MODEM IS PROBABLY ASYNCHRONOUS 8 BIT  ONLY.  ASSUMING
+/      THE RECEIVE SIDE OF THE INTERNAL MODEM IS ALWAYS "ENABLED", REGISTER  3A WOULD
+/      BE  UNNECESSARY.  THE K278 CODE DOES NOT ADDRESS REGISTER 3 AS  AN  A/B  PAIR,
+/      PRESUMABLY  BECAUSE  REGISTER  3 IS NOT DECODED AND IS EFFECTIVELY REGISTER 3B
+/      REGARDLESS OF  THE  DATA FIELD.  THIS IS EITHER TRUE, OR THE K278 CODING FAILS
+/      TO PROPERLY INITIALIZE THE DECMATE III MPSCC PORT.
+
+       NL0003                  /WANT REGISTER 3
+       MPSCC                   /SELECT IT
+       TAD     (301-3)         /SETUP FOR 8 BITS AND ENABLE RECIVER
+       MPSCC                   /LOAD IT
+
+/      A SIMILAR  SITUATION  EXISTS  FOR  THE  TRANSMITTER  SIDE  OF  THE DECMATE III
+/      INTERNAL MODEM.  REGISTER 5 IS UTILIZED ACCORDINGLY.
+
+       TAD     (5-301)         /WANT REGISTER 5
+       MPSCC                   /SELECT IT
+       TAD     (150-5)         /GET TRANSMITTER ENABLE, 8 BITS VALUE
+       MPSCC                   /LOAD IT
+
+/      THE DECMATE II REFERENCE  MANUAL  INDICATES  THE  PROPER SETTING FOR THE MODEM
+/      CONTROL REGISTER AS EITHER 030  OR  130  DEPENDING ON WHETHER BIT[5] INDICATES
+/      INTERNAL OR EXTERNAL TIMING (WHERE ONE  OF  THESE  IS ILLEGAL FOR ASYNCHRONOUS
+/      OPERATION!).  THE SETTING OF BITS [10]  AND  [11]  WOULD  INDICATE ENABLING OF
+/      BOTH  LOCAL  AND  REMOTE LOOPBACKS, YET WE SET  ONLY  THESE  BITS  (ALA  K278)
+/      ALLEDGEDLY FOR THE PURPOSE OF SETTING RTS AND DTR  (WHICH  ARE  DOCUMENTED  AS
+/      BEING BITS[7] AND [8] RESPECTIVELY).
+
+       NL0003                  /SET VALUE
+       MLC                     /LOAD IT
+\f      CLA                     /CLEAN UP
+
+/      THE BAUD RATE SHOULD BE SET HERE IF DESIRED.
+
+/      TAD     BAUD            /GET BAUD RATE
+/      MSB                     /LOAD IT
+       CLA                     /CLEAN UP
+       JMP I   DMIPORT         /RETURN
+\f/     DECMATE II, ETC. REPLACEMENT LIST.                              /048 CJL
+
+DM2LIST,CLDMZAP                                /        *CLDMZAP
+
+               DMINIT&177+JMSC         /CLDMZAP,JMS     DMINIT
+
+       SETBAUD                         /        *SETBAUD               /050 CJL
+
+               MSB                     /SETBAUD,MSB                    /050 CJL
+
+       INLUP                           /        *INLUP
+
+               TAD     INFLAG          /INLUP,  TAD     INFLAG
+
+       INSKIP                          /        *INSKIP
+
+               NOTYET&177+JMPC         /INSKIP, JMP     NOTYET
+       INLUP1; DCA     INFLAG          /INLUP1, DCA     INFLAG
+       INREAD; IRB                     /INREAD, IRB
+
+       INSTATUS                        /        *INSTATUS
+
+               UPSTATUS&177+JMSC       /INSTATU,JMS     UPSTATUS
+
+       GETFL1                          /        *GETFL1
+
+               UPSTATUS&177+JMSC       /GETFL1, JMS     UPSTATUS
+
+       COMWAIT                         /        *COMWAIT
+
+               GETFLOW&177+JMSC        /COMWAIT,JMS     GETFLOW
+
+       NOWAIT                          /        *NOWAIT
+
+               TAD     OUTFLAG         /NOWAIT, TAD     OUTFLAG
+       CMOUT1; SNA CLA                 /CMOUT1, SNA CLA
+       CMOUT2; OWAIT&177+JMPC          /CMOUT2, JMP     OWAIT
+       DM1AND; DCA     OUTFLAG         /DM1AND, DCA     OUTFLAG
+       CMOUT3; OUTEMP&177+TADC         /CMOUT3, TAD     OUTEMP
+       CMOUT4; OLS                     /CMOUT4, OLS
+
+       BUFCHECK                        /        *BUFCHECK
+
+               PUPSTATUS&177+JMSIC     /BUFCHEC,JMS I   PUPSTATUS
+
+       KERRLUP                         /        *KERRLUP
+
+               PUPSTATUS&177+JMSIC     /KERRLUP,JMS I   PUPSTATUS
+\f      RINTEST                         /        *RINTEST
+
+               TAD     INFLAG          /RINTEST,TAD     INFLAG
+       RINGT0; SNA CLA                 /RINGT0, SNA CLA
+       RINREAD;RINGNONE&177+JMPC       /RINREAD,JMP     RINGNONE
+       RINGT1; DCA     INFLAG          /RINGT1, DCA     INFLAG
+       RINGT2; IRB                     /RINGT2, IRB
+
+       REMTSF                          /        *REMTSF
+
+               RMPTEMP&177+DCAC        /REMTSF, DCA     RMPTEMP
+       RMPUT0; TAD     OUTFLAG         /RMPUT0, TAD     OUTFLAG
+       REMTLS; SNA CLA                 /REMTLS, SNA CLA
+       RMPUT1; REMPUT&177+JMPIC        /RMPUT1, JMP I   REMPUT
+       REMCLEA;RMPTEMP&177+TADC        /REMCLEA,TAD     RMPTEMP
+       RMPUT2; OLS                     /RMPUT2, OLS
+
+       0                               /THIS ENDS THE LIST
+
+       PAGE
+\f/     DECMATE I REPLACEMENT LIST.                                     /050 CJL
+
+DM1LIST,CLDMZAP                                /        *CLDMZAP
+
+               DMINIT&177+JMSC         /CLDMZAP,JMS     DMINIT
+
+       SETBAUD                         /        *SETBAUD
+
+               NOP                     /SETBAUD,NOP
+
+       DMI01                           /        *DMI01
+
+               DM234&177+TADC          /DMI01,  TAD     DM234/(234)
+       DMI02;  WCON0                   /DMI02,  WCON0
+       DMI03;  NL0000                  /DMI03,  NL0000
+       DMI04;  RACD                    /DMI04,  RACD
+       DMI05;  DMWASTE&177+ISZC        /DMI05,  ISZ     DMWASTE
+       DMI06;  DMI05&177+JMPC          /DMI06,  JMP     DMI05
+       DMI07;  DMWASTE&177+ISZC        /DMI07,  ISZ     DMWASTE
+       DMI08;  DMI07&177+JMPC          /DMI08,  JMP     DMI07
+       DMI09;  RTFL0                   /DMI09,  RTFL0
+       DMI10;  DM2516&177+TADC         /DMI10,  TAD     DM2516/(2516)
+       DMI11;  DMSEND&177+JMSC         /DMI11,  JMS     DMSEND
+       DMI12;  TAD     RATE            /DMI12,  TAD     RATE
+       DMI13;  DM2460&177+TADC         /DMI13,  TAD     DM2460/(2460)
+       DMI14;  DMSEND&177+JMSC         /DMI14,  JMS     DMSEND
+       DMI15;  DM3425&177+TADC         /DMI15,  TAD     DM3425/(3425)
+       DMI16;  DMSEND&177+JMSC         /DMI16,  JMS     DMSEND
+       DMI17;  RKRB0                   /DMI17,  RKRB0
+
+       DMISET                          /        *DMISET
+
+               RTFL0                   /DMISET, RTFL0
+
+       DMISKP                          /        *DMISKP
+
+               RTSF0                   /DMISKP, RTSF0
+\f      DMIOUT                          /        *DMIOUT
+
+               RTLS0                   /DMIOUT, RTLS0
+
+       INSKIP                          /        *INSKIP
+
+               RKSF0                   /INSKIP, RKSF0
+
+       INREAD                          /        *INREAD
+
+               RKRB0                   /INREAD, RKRB0
+
+       COMWAIT                         /        *COMWAIT
+
+               GETFLOW&177+JMSC        /COMWAIT,JMS     GETFLOW
+
+       NOWAIT                          /        *NOWAIT
+
+               RTSF0                   /NOWAIT, RTSF0
+       CMOUT1; OWAIT&177+JMPC          /CMOUT1, JMP     OWAIT
+
+       DM1AND                          /        *DM1AND
+
+               AND377                  /DM1AND, AND     [377]
+
+       CMOUT4                          /        *CMOUT4
+
+               RTLS0                   /CMOUT4, RTLS0
+
+       RINTEST                         /        *RINTEST
+
+               RKSF0                   /RINTEST,RKSF0
+
+       RINREAD                         /        *RINREAD
+
+               RKRB0                   /RINREAD,RKRB0
+       RINGT1; SKP                     /RINGT1, SKP
+
+       DM1AN2                          /        *DM1AN2
+
+               AND377                  /DM1AN2, AND     [377]
+
+       REMTSF                          /        *REMTSF
+
+               RTSF0                   /REMTSF, RTSF0
+
+       REMTLS                          /        *REMTLS
+
+               RTLS0                   /REMTLS, RTLS0
+
+       0                               /THIS ENDS THE LIST
+\f/     DECMATE I SECONDARY REPLACEMENT LIST                            /050 CJL
+
+DM1SEC,        DMI02                           /        *DMI02
+
+               WCON1                   /DMI02,  WCON1
+       DMI03;  NL4000                  /DMI03,  NL4000
+
+       DMI09                           /        *DMI09
+
+               RTFL1                   /DMI09,  RTFL1
+
+       DMI17                           /        *DMI17
+
+               RKRB1                   /DMI17,  RKRB1
+
+       DMISET                          /        *DMISET
+
+               RTFL1                   /DMISET, RTFL1
+
+       DMISKP                          /        *DMISKP
+
+               RTSF1                   /DMISKP, RTSF1
+
+       DMIOUT                          /        *DMIOUT
+
+               RTLS1                   /DMIOUT, RTLS1
+
+       INSKIP                          /        *INSKIP
+
+               RKSF1                   /INSKIP, RKSF1
+
+       INREAD                          /        *INREAD
+
+               RKRB1                   /INREAD, RKRB1
+
+       NOWAIT                          /        *NOWAIT
+
+               RTSF1                   /NOWAIT, RTSF1
+
+       CMOUT4                          /        *CMOUT4
+
+               RTLS1                   /CMOUT4, RTLS1
+
+       RINTEST                         /        *RINTEST
+
+               RKSF1                   /RINTEST,RKSF1
+
+       RINREAD                         /       *RINREAD
+
+               RKRB1                   /RINREAD,RKRB1
+
+       REMTSF                          /        *REMTSF
+
+               RTSF1                   /REMTSF, RTSF1
+\f      REMTLS                          /        *REMTLS
+
+               RTLS1                   /REMTLS, RTLS1
+
+       0                               /THIS ENDS THE LIST
+\f/     ONCE-ONLY TEXT MESSAGES.                                        /024 CJL
+
+       FIELD   BUFFLD%10               /FILE I/O BUFFER FIELD
+
+       *FILBUFFER                      /OVER FILE I/O BUFFER
+
+/      LOCAL PREFERENCE MESSAGE.                                       /024 CJL
+
+/      USE SOMETHING APPROPRIATE HERE TO CUSTOMIZE KERMIT-12 TO YOUR MACHINE.
+
+/      THIS LOCATION SHOULD BE MAINTAINED SINCE IT IS DOCUMENTED TO BE HERE.
+
+       XLIST   OFF
+       IFZERO  GENMSG                  <
+       XLIST   ON
+LCLMSG,        *LCLMSG+40                      /EMPTY HOLE FOR USER MESSAGE    /039 CJL
+
+       XLIST   OFF                     >
+       IFNZRO  GENMSG                  <
+       IFNZRO  LEDERLE         <
+       XLIST   ON
+LCLMSG,        TEXT    "%^T^HANKS TO: ^B^ILL ^S^MITH AND ^D^INGER ^M^ILLER%"
+
+       XLIST   OFF             >
+       IFNZRO  UMSG            <
+       XLIST   ON
+LCLMSG,        TEXT    "%^I^NSERT LOCAL USER MESSAGE HERE!%^"
+
+       XLIST   OFF             >
+       IFZERO  LEDERLE!UMSG    <
+       XLIST   ON
+LCLMSG,        TEXT    "^^^^^^^^^^^^^^^^^^^^^^"/DEFAULT IS NO MESSAGE
+
+       XLIST   OFF             >
+       IFNZRO  LCLMSG+40-.     <
+       XLIST   ON
+       ZBLOCK  LCLMSG+40-.             /LEAVE PATCHING SPACE
+
+       XLIST   OFF             >
+                                       >
+       XLIST   ON
+CLOSMSG,TEXT   "^]^"                   /CPU TYPE CLOSING MESSAGE
+\f/     CPU IDENTIFICATION LIST; ALL MUST BE 5 WORDS LONG (EXCEPT LAST)./024 CJL
+
+CPULIST,TEXT   "^U^NKNOWN"             /00=UNKNOWN
+       TEXT    "^PDP^-5^^"             /01=PDP-5
+       TEXT    "^PDP^-8^^"             /02=PDP-8
+       TEXT    "^PDP^-8/S"             /03=PDP-8/S
+       TEXT    "^LINC^-8^"             /04=LINC-8
+       TEXT    "^PDP^-8/I"             /05=PDP-8/I
+       TEXT    "^PDP^-8/L"             /06=PDP-8/L
+       TEXT    "^PDP^-12^"             /07=PDP-12
+       TEXT    "^PDP^-8/E"             /10=PDP-8/E
+       TEXT    "^PDP^-8/A"             /11=PDP-8/A
+\f      TEXT    "6100^^^^^"                     /12=6100
+       TEXT    "6120^"                         /13=6120; LAST CAN BE SHORT!
+CPUTMSG,TEXT   "%^[C^PU TYPE IS: "             /CPU TYPE MESSAGE
+DAYMSG,        DAY%12^66+DAY+6060                      /DAY MESSAGE
+       TEXT    " "
+DMPOMSG,TEXT   " ^[U^SING ^C^OMMUNICATIONS"    /DECMATE PORT MESSAGE
+       TEXT    " ^P^ORT^]"
+DMPPMSG,TEXT   " ^[U^SING ^P^RINTER ^P^ORT^]^" /DECMATE SERIAL PORT MESSAGE
+\fINITMSG,TEXT  "%^PS/8 PS/12 OS/8 OS/12 "      /INITIAL MESSAGE
+       TEXT    "OS/78 OS/278  K^ERMIT-12  ^V"
+INMSG2,        VERSION%12^66+VERSION+6060              /VERSION DIGITS
+INMSG3,        "^^100+REVISION                         /REVISION
+       TEXT    "   "                           /END OF MESSAGE
+       XLIST   OFF
+       IFZERO  MONTH-1         <
+       XLIST   ON
+MONMSG,        TEXT    "^J^ANUARY ^"                   /MONTH MESSAGE
+       XLIST   OFF             >
+       IFZERO  MONTH-2         <
+       XLIST   ON
+MONMSG,        TEXT    "^F^EBRUARY "                   /MONTH MESSAGE
+       XLIST   OFF             >
+       IFZERO  MONTH-3         <
+       XLIST   ON
+MONMSG,        TEXT    "^M^ARCH ^"                     /MONTH MESSAGE
+       XLIST   OFF             >
+       IFZERO  MONTH-4         <
+       XLIST   ON
+MONMSG,        TEXT    "^A^PRIL ^"                     /MONTH MESSAGE
+       XLIST   OFF             >
+       IFZERO  MONTH-5         <
+       XLIST   ON
+MONMSG,        TEXT    "^M^AY ^"                       /MONTH MESSAGE
+       XLIST   OFF             >
+       IFZERO  MONTH-6         <
+       XLIST   ON
+MONMSG,        TEXT    "^J^UNE "                       /MONTH MESSAGE
+       XLIST   OFF             >
+       IFZERO  MONTH-7         <
+       XLIST   ON
+MONMSG,        TEXT    "^J^ULY "                       /MONTH MESSAGE
+       XLIST   OFF             >
+       IFZERO  MONTH-10        <
+       XLIST   ON
+MONMSG,        TEXT    "^A^UGUST "                     /MONTH MESSAGE
+       XLIST   OFF             >
+       IFZERO  MONTH-11        <
+       XLIST   ON
+MONMSG,        TEXT    "^S^EPTEMBER ^"                 /MONTH MESSAGE
+       XLIST   OFF             >
+       IFZERO  MONTH-12        <
+       XLIST   ON
+MONMSG,        TEXT    "^O^CTOBER ^"                   /MONTH MESSAGE
+       XLIST   OFF             >
+       IFZERO  MONTH-13        <
+       XLIST   ON
+MONMSG,        TEXT    "^N^OVEMBER "                   /MONTH MESSAGE
+       XLIST   OFF             >
+       IFZERO  MONTH-14        <
+       XLIST   ON
+MONMSG,        TEXT    "^D^ECEMBER "                   /MONTH MESSAGE
+       XLIST   OFF             >
+       IFNZRO  MONMSG+7-.      <
+       XLIST   ON
+
+       ZBLOCK  MONMSG+7-.                      /EMPTY SPACE FOR ALIGNMENT
+
+       XLIST   OFF             >
+       XLIST   ON
+\fTHLPMSG,TEXT  "%^T^YPE ^HELP<CR>^ FOR HELP%^" /TYPE HELP MESSAGE
+YEARMSG,TEXT   "19"                            /YEAR MESSAGE
+       YEAR%12^66+YEAR+6060                    /YEAR DIGITS
+       TEXT    "^"                             /END OF MESSAGE
+\f/     CPU-SPECIFIC PROMPT LIST.                                       /024 CJL
+
+CPUPRMP,TEXT   "??^>^^^"       /UNKNOWN
+       TEXT    "5^>^^^^"       /PDP-5
+       TEXT    "8^>^^^^"       /PDP-8
+       TEXT    "8^/S>^^"       /PDP-8/S
+       TEXT    "LINC-8>"       /LINC-8
+       TEXT    "8^/I>^^"       /PDP-8/I
+       TEXT    "8^/L>^^"       /PDP-8/L
+       TEXT    "12^>^^^"       /PDP-12
+       TEXT    "8^/E>^^"       /PDP-8/E
+       TEXT    "8^/A>^^"       /PDP-8/A
+       TEXT    "78^>^^^"       /6100
+       TEXT    "278^>^^"       /6120
+\f/     CPU-SPECIFIC IDENTIFICATION LIST.                               /025 CJL
+
+CPUIDLS,TEXT   "^U^NKNOWN"     /UNKNOWN
+       TEXT    "^PDP^-5^^"     /PDP-5
+       TEXT    "^PDP^-8^^"     /PDP-8
+       TEXT    "^PDP^-8/S"     /PDP-8/S
+       TEXT    "^LINC^-8^"     /LINC-8
+       TEXT    "^PDP^-8/I"     /PDP-8/I
+       TEXT    "^PDP^-8/L"     /PDP-8/L
+       TEXT    "^PDP^-12^"     /PDP-12
+       TEXT    "^PDP^-8/E"     /PDP-8/E
+       TEXT    "^PDP^-8/A"     /PDP-8/A
+\f      TEXT    "^VT^-78^^"     /VT-78
+       TEXT    "^DEC^MATE"     /6120
+\f      FIELD   MSGFLD%10                       /MESSAGE FIELD
+
+       *FLD1ADR                                /PERMANENT LOAD ADDRESS /046 CJL
+                                               /TEXT MESSAGES LOAD HERE/046 CJL
+
+ABMSG, TEXT    "%^F^ILE ^A^BORT%^"             /FILE ABORT MESSAGE
+CMERMSG,TEXT   "?^I^NVALID COMMAND^"           /COMMAND ERROR MESSAGE
+CONNMSG,TEXT   "%(^C^ONNECTING TO HOST, TYPE " /FIRST CONNECT MESSAGE
+CONTMSG,TEXT   "^C^ONTROL-^"                   /CONTROL CHARACTER MESSAGE
+\fCON2MSG,TEXT  " ^C^ TO RETURN TO ^"           /BRIDGING CONNECT MESSAGE
+CON3MSG,TEXT   ")%^"                           /FINAL CONNECT MESSAGE
+CPUMSG,        ZBLOCK  5                               /CPU ID MESSAGE GOES HERE
+/CRLF, TEXT    "%"                             /<CR>, <LF> MESSAGE
+DNERMSG,TEXT   "?^E^RROR IN DEVICE NAME"       /DEVICE NAME ERROR MESSAGE
+DSFLMSG,TEXT   "?^D^ISK FULL!"                 /DISK OUT OF ROOM ERROR MESSAGE
+FCLEMSG,TEXT   "?^E^RROR CLOSING FILE"         /FILE CLOSE ERROR MESSAGE
+\fFNERMSG,      TEXT    "?^E^RROR IN FILE NAME" /FILE NAME ERROR MESSAGE
+FRECMSG,TEXT   "^R^EC: ^"                      /RECEIVING FILE MESSAGE
+FSENMSG,TEXT   "^S^END: ^"             /SENDING FILE MESSAGE
+FSERMSG,TEXT   "?^F^ILE NAME SYNTAX ERROR"     /FILE NAME ERROR MESSAGE
+\fHELPMSG,TEXT  "%^S^UPPORTED COMMANDS ARE:%%"  /HELP MESSAGE
+       TEXT    "^CONNECT^ (TO REMOTE SYSTEM) %"
+       TEXT    "^SEND DEV:FILNAM.EX^ %"
+\f      TEXT    "^RECEIVE DEV:^ (FILENAME AND EXTENSION ^NOT^ ALLOWED)%"
+       TEXT    "^GET DEV:FILNAM.EX^%"
+       TEXT    "^FINISH^ (SERVER)%"
+\f      TEXT    "^EXIT^ (TO OPERATING SYSTEM) %"
+       TEXT    "^HELP^ (THIS MESSAGE)%"
+       TEXT    "%^E^SCAPE CHARACTER: "
+KERRMSG,TEXT   "%^K^EYBOARD INPUT ERROR!%"     /KEYBOARD ERROR MESSAGE
+
+       CRLF=   .-1                             /<CR>, <LF> MESSAGE
+\fNOFINIS,TEXT  "?^U^NABLE TO TELL HOST THAT "  /FINISH ERROR MESSAGE
+       TEXT    "SESSION IS FINISHED"
+NOTFND,        TEXT    "?^U^NABLE TO LOCATE FILE^"     /FILE NOT FOUND MESSAGE
+PRMTMSG,TEXT   "^K^ERMIT-^"                    /STATIC PORTION OF PROMPT MESSAGE
+PROMID,        ZBLOCK  23                              /MODIFIED PORTION OF PROMPT MESSAGE
+PRMT2, TEXT    "^K12>"                         /PHPH
+RERRMSG,TEXT   "?^R^ECEIVE FAILURE^"           /GENERAL RECEIVE FAILURE MESSAGE
+\fRFLNMSG,TEXT  "?^E^RROR IN RECEIVED FILE NAME"/RECEIVED NAME ERROR MESSAGE
+       TEXT    "^"
+RHFEMSG,TEXT   "^U^NABLE TO RECEIVE - HANDLER" /HANDLER FETCH ERROR MESSAGE
+       TEXT    " ERROR^"
+\fRIDEMSG,TEXT  "?^U^NABLE TO RECEIVE -"        /DIRECTORY FULL ERROR MESSAGE
+       TEXT    " INSUFFICIENT DIRECTORY SPACE"
+RIERMSG,TEXT   "%^R^EMOTE LINE INPUT ERROR!%^" /REMOTE LINE ERROR MESSAGE
+\fRPERMSG,TEXT  "?^U^NABLE TO RECEIVE LATEST "  /LATEST PACKET ERROR MESSAGE
+       TEXT    "PACKET^"
+SDERMSG,TEXT   "?^U^NABLE TO SEND - DIRECTORY "/DIRECTORY INPUT ERROR MESSAGE
+       TEXT    "ERROR"
+SHFEMSG,TEXT   "?^U^NABLE TO SEND - HANDLER "  /HANDLER FETCH ERROR MESSAGE
+       TEXT    "ERROR"
+\fSNDEMSG,TEXT  "?^U^NABLE TO SEND"             /GENERAL SEND ERROR MESSAGE
+UPERMSG,TEXT   "?^U^NABLE TO RECEIVE - DATA "  /RECEIVED DATA ERROR MESSAGE
+       TEXT    "ERROR"
+
+       $                                       /THAT'S ALL FOLK!