home *** CD-ROM | disk | FTP | other *** search
/ Columbia Kermit / kermit.zip / cdccompass / cybker.asm next >
Assembly Source File  |  2020-01-01  |  134KB  |  3,782 lines

  1.           IDENT  KERMIT,XSTORE,KERMIT
  2.           ABS
  3.           ENTRY  KERMIT
  4.           TITLE  KERMIT -- FILE TRANSFER UTILITY
  5.           SYSCOM B1
  6.  OPL      XTEXT  COMCMAC
  7.  OPL      XTEXT  COMCCMD
  8.  KERMIT   SPACE  4,10
  9. *****  SUMMARY
  10. *
  11. * CYBER KERMIT  IS  A PROGRAM TO TRANSFER FILES TO AND FROM A MACHINE
  12. * RUNNING NOS, USING THE KERMIT FILE TRANSFER PROTOCOL AS  DEFINED AT
  13. * COLUMBIA UNIVERSITY.
  14.  KERMIT   SPACE  4,10
  15. ***    REVISION HISTORY
  16. *
  17. * WRITTEN BY  A. V. LE BLANC, UMRCC, FEB. 1986
  18. *
  19. * COPYRIGHT, UNIVERSITY OF MANCHESTER.
  20. *
  21. * THIS  PROGRAM IS AVAILABLE TO ANYONE; ANYONE MAY COPY OR DISTRIBUTE
  22. * IT, PROVIDED THERE IS NO CHARGE EXCEPT MEDIUM AND SHIPPING COSTS.
  23.  EXTERN   SPACE  4,10
  24. ***    EXTERNAL INTERFACE
  25. *
  26. * CONTROL CARD FORMAT:  KERMIT
  27. *
  28. * ANY PARAMETERS ARE IGNORED.
  29.  EXTERN   SPACE  4,10
  30. ***    DAYFILE MESSAGES
  31. *
  32. *    OCCASION:                ERROR MESSAGE:
  33. *
  34. * INPUT IS MASS STORAGE    INPUT AND OUTPUT MUST BE TERMINAL FILES
  35. * OUTPUT IS MASS STORAGE   INPUT AND OUTPUT MUST BE TERMINAL FILES
  36. * ZZZKHLP NOT ASSIGNED     FILE ZZZKHLP IS MISSING
  37. * ZZZKDAT DOES NOT CONTAIN
  38. *   EXACTLY 12 WORDS       FILE ZZZKDAT IS CORRUPT
  39.  CONSTANT SPACE  4,10
  40. ****   ASSEMBLY CONSTANTS
  41. *
  42.  PARIT    EQU    2           PARITY: 0 = ZERO, 1 = ODD, 2 = EVEN
  43.  TBUFL    EQU    301B        BUFFER LENGTH FOR TERMINAL FILES
  44.  WBUFL    EQU    501B        BUFFER LENGTH FOR MASS STORAGE FILES
  45.  LBUFL    EQU    301B        BUFFER LENGTH FOR LOG FILE
  46.  DEFPLEN  EQU    94          DEFAULT PACKET LENGTH TO REQUEST
  47.  DEFESCA  EQU    3           DEFAULT (ASCII CODE) LOCAL ESCAPE CHAR
  48.  DEFTIME  EQU    20          DEFAULT TIMEOUT TO REQUEST IN SECONDS
  49.  DEFRETR  EQU    5           DEFAULT RETRIES ALLOWED PER PACKET
  50. ****
  51.  DESIGN   SPACE  4,10
  52. **     THE DESIGN OF CYBER KERMIT
  53. *
  54. * CYBER KERMIT WAS DESIGNED BY THE METHOD OF ABSTRACTION FROM DETAIL.
  55. * AT MOST TIMES WHEN THIS PROGRAM IS RUNNING, DATA PASSES IN A STREAM
  56. * FROM A PRODUCER OF SOME KIND TO A CONSUMER OF SOME KIND.  GENERALLY
  57. * THE PRODUCER MAKES USE OF REGISTERS  B2, B3, B4, AND X3,  WHILE THE
  58. * CONSUMER USES REGISTERS B5, B6, B7, AND X7.   REGISTER X5 IS COMMON
  59. * TO BOTH HALVES OF THIS PROCESS, BEING THE PLACE DATA IS TRANSFERRED
  60. * FROM THE PRODUCER TO THE CONSUMER.  BOTH CONSUMPTION AND PRODUCTION
  61. * CONTAIN  SEVERAL LAYERS OF SUBROUTINES,  EACH DESIGNED TO HIDE SOME
  62. * UNSIGHTLY DETAILS FROM THE HIGHER LEVELS.
  63. *
  64. * THIS PROGRAM TOOK TWO WEEKS TO WRITE AND DEBUG, AND ANOTHER WEEK TO
  65. * DOCUMENT AND ANNOTATE.   OBVIOUSLY IN SUCH A SHORT PERIOD OF TIME I
  66. * WAS MUCH LESS CONCERNED WITH GARNISH AND TRIMMINGS, AND VERY LITTLE
  67. * INTERESTED IN POTENTIAL USERS OF CYBER KERMIT  OUTSIDE  MANCHESTER.
  68. * NEVERTHELESS, I HOPE SOME OTHER SITES MAY FIND THIS VERSION USEFUL,
  69. * OR AT LEAST MORE USEFUL THAN THE UNIVERSITY OF TEXAS'S  KERMIT 170,
  70. * WHICH WE WERE UTTERLY UNABLE TO RUN -- OR EVEN INTERPRET, SINCE THE
  71. * COPY WE RECEIVED IS IN A CHARACTER SET UNKNOWN TO US.
  72. *
  73. * THE PROGRAM CODE  CONTAINS CONDITIONS WHICH SHOULD DETERMINE DURING
  74. * ASSEMBLY WHETHER THE SITE IS A 63- OR 64-CHARACTER SITE AND PRODUCE
  75. * AN APPROPRIATE BINARY.
  76.  IOSTORE  TITLE  STORAGE, CONSTANTS, TABLES, AND OTHER DATA
  77. **     I/O STORAGE AND FILE ENVIRONMENT TABLES
  78. *
  79. * XSTORE AND REGIST ARE USED TO SAVE VARIOUS REGISTER CONTENTS DURING
  80. * I/O  OPERATIONS.   ALSO THE TERMINAL BUFFER  TBUF  MAY OCCASIONALLY
  81. * UNDERFLOW INTO THE TOP WORD OF REGIST DURING READ OPERATIONS -- THE
  82. * INPUT SUBROUTINE  SREAD  STORES A ZERO IN THIS WORD  UNDER  CERTAIN
  83. * CIRCUMSTANCES.  SIMILARLY THE MASS STORAGE BUFFER  WBUF  IS ALLOWED
  84. * TO  UNDERFLOW ONE WORD, WHICH EXPLAINS WHY  TBUF  HAS AN EXTRA WORD
  85. * AT THE TOP.   THE BUFFER  LBUF  IS RESERVED EXCLUSIVELY FOR THE LOG
  86. * FILE  ZZZKLOG.  THE BUFFER  CBUF IS ACTUALLY A PAIR OF BUFFERS USED
  87. * TO STORE PACKETS BEFORE SENDING THEM AND AFTER RECEIVING THEM.
  88. *
  89. * LOFS IS THE LIST-OF-FILES TABLE.  IT SERVES TWO PURPOSES: IF KERMIT
  90. * IS  INTERRUPTED,  THIS  TABLE ENSURES THAT THE LAST PART OF ZZZKLOG
  91. * GETS WRITTEN TO THE FILE BEFORE THE PROGRAM ABORTS, IN CASE THE LOG
  92. * IS NEEDED TO SHED LIGHT ON THE PROBLEM.   ORDINARILY THE LOFS TABLE
  93. * ENSURES THAT THE OUTPUT BUFFER GETS FLUSHED AUTOMATICALLY  WHENEVER
  94. * INPUT IS READ.   FOR THIS REASON,  CYBER KERMIT NEVER WRITES OUTPUT
  95. * EXPLICITLY EXCEPT WHEN RESPONDING TO A GENERIC LOGOUT COMMAND.
  96. *
  97. * IN MOST CASES THE  FILE ENVIRONMENT TABLE  IS EXTENDED BACKWARDS BY
  98. * TWO  WORDS.   THE FIRST OF THESE CONTAINS THE NEGATIVE SHIFT COUNT,
  99. * WHICH REACHES 0 WHEN AN INPUT WORD HAS BEEN EMPTIED  OR  AN  OUTPUT
  100. * WORD  HAS BEEN FILLED;  THE SECOND WORD CONTAINS THE WORD CURRENTLY
  101. * BEING FILLED OR EMPTIED.
  102. *
  103. * HELPLOC  IS USED TO RECORD THE CURRENT POSITION OF  THE  STRUCTURED
  104. * HELP FILE  ZZZKHLP.  IT IS 0 WHEN ZZZKHLP HAS NOT BEEN OPENED,  AND
  105. * OTHERWISE CONTAINS THE NUMBER OF THE RECORD  WHICH WOULD BE READ BY
  106. * A  READ  MACRO AT THE MOMENT  --  THAT IS, ONE MORE THAN THE NUMBER
  107. * OF THE LAST RECORD READ.
  108. *
  109. * THE DUMMY FET IS A TEMPLATE  FROM WHICH THE FILE FET IS CONSTRUCTED
  110. * WHEN A FILE IS TO BE TRANSFERRED.
  111. *
  112. * INFI AND OUTFI ARE POINTERS TO CURRENTLY ACTIVE FET'S,  SIMPLIFYING
  113. * I/O OPERATIONS SUCH AS BUFFER FILLING AND FLUSHING.
  114.  IOSTORE  SPACE  4,12
  115.           ORG    110B
  116.  XSTORE   BSS    6           TEMPORARY STORAGE WHEN GETTNG ACK FOR
  117.  REGIST   BSS    6           PACKETS, AND DURING CIO CALLS
  118.  TBUF     BSS    TBUFL+1     INPUT, OUTPUT
  119.  WBUF     BSS    WBUFL       FILE, ZZZKHLP, ZZZKDAT
  120.  LBUF     BSS    LBUFL       ZZZKLOG
  121.  CBUF     BSS    192         ASCII CODED PACKETS
  122.  LOFS     VFD    30/LOFS+1,30/0,42/0,18/4
  123.           VFD    42/0ZOUTPUT,18/OUTPUT
  124.           VFD    42/0ZZZZKLOG,18/ZZZKLOG,60/0
  125.           BSSZ   2
  126.  INPUT    FILEB  TBUF,TBUFL
  127.           BSSZ   2
  128.  OUTPUT   FILEB  TBUF,TBUFL
  129.  HELPLOC  DATA   0
  130.  ZZZKHLP  FILEB  WBUF,WBUFL
  131.  ZZZKDAT  FILEB  WBUF,WBUFL
  132.           DATA   -9,45       THIS INITIALISES THE LOG FILE
  133.  ZZZKLOG  FILEB  LBUF,LBUFL
  134.           BSSZ   2
  135.  FILE     FILEB  WBUF,WBUFL
  136.  DUMMY    FILEB  WBUF,WBUFL
  137.  INFI     DATA   0           ADDRESS OF FET OF FILE BEING READ
  138.  OUTFI    DATA   0           ADDRESS OF FET OF FILE BEING WRITTEN
  139.  CONSVARS SPACE  4,15
  140. *      CONSTANTS AND VARIABLES
  141.  CONSVARS SPACE  3,10
  142.  CURN     DATA   0           CURRENT PACKET NUMBER
  143.  FILNAM   DATA   0,0         TENTATIVE AND PREVIOUS NAMES OF FILES
  144.  KMODE    DATA   0           SERVER OR NOT; SEND, RECEIVE, OR COMMAND
  145.  NPAD     DATA   0,0         NUMBER OF PAD CHARS TO SEND, PAD CHAR
  146.  EOLN     DATA   -1          HIS REQUESTED EOLN
  147.  BITPREF  DATA   38          DEFAULT BIT-PREFIX
  148.  QBIN     DATA   0           CURRENT BIT-PREFIX
  149.  DEBUGW   DATA   0           0 = DEBUG IS OFF; 1 = DEBUG IS ON
  150.  DEFAULF  DATA   1           NUMBER TO CONSTRUCT DEFAULT FILE NAME
  151.  ESCAPEC  CON    DEFESCA     INTERNAL ESCAPE CHAR (LITERAL)
  152.  FILETYP  DATA   0,0         0 ASC, 1 BIN, 2 KER, 3 DIS, 4 ASC8
  153.  SYNCM    DATA   1           PACKET START (LITERAL)
  154.  PLENGTH  CON    DEFPLEN     PACKET LENGTH TO REQUEST
  155.  SLENGTH  DATA   80          MAXIMUM PACKET LENGTH TO SEND
  156.  QUOTEC   DATA   35          DEFAULT QUOTE CHAR
  157.  QCTL     DATA   0           QUOTE CHAR BEING USED
  158.  RPCH     DATA   0           REPEAT CHAR BEING USED
  159.  REPETC   DATA   126         DEFAULT REPEAT CHAR
  160.  TIMEOUT  CON    DEFTIME     TIMEOUT TO REQUEST FROM LOCAL KERMIT
  161.  FILETOT  DATA   0           FILES TRANSFERRED
  162.  PSENT    DATA   0           PACKETS SENT
  163.  PRECD    DATA   0           PACKETS RECEIVED
  164.  PKERRS   DATA   0           ERRORS IN RECEIVED PACKETS
  165.  RETRYT   DATA   0           TOTAL RETRIES
  166.  RETRYC   DATA   0           CURRENT NO OF RETRIES
  167.  RETRYN   CON    DEFRETR     MAXIMUM RETRIES TO HAVE
  168.  TIMWORD  DATA   0           CURRENT TIME
  169.  UPDAT    DATA   0           TEMPORARY STORAGE
  170.  TABLES   SPACE  4,10
  171. **     TABLES
  172. *
  173. * THE TABLE PTYPES IS USED TO SELECT  C, E, G, I, K, R, AND S PACKETS
  174. * FOR SPECIAL TREATMENT.
  175. *
  176. * ILLEGIT IS USED TO SELECT CONTROL CHARACTERS WHICH ARE FORBIDDEN AS
  177. * PACKET SYNC MARKERS AND AS LOCAL ESCAPE CHARACTERS BECAUSE OF THEIR
  178. * SPECIAL SIGNIFICANCE TO THE OPERATING SYSTEM.  IN GENERAL, A BIT  N
  179. * IS SET WHEN THE CHARACTER WITH ASCII VALUE  N  IS FORBIDDEN.   HERE
  180. * IN MANCHESTER THE VALUES 8 (BACKSPACE), 10 (LINEFEED), 13 (CARRIAGE
  181. * RETURN), 16 (INTERRUPT), 17 (XOFF), 19 (XON), 20 (TERMINATION), AND
  182. * 24 (CANCEL LINE) ARE FORBIDDEN.
  183. *
  184. * DITAB  IS  USED FOR CHARACTER CODE CONVERSION FROM DISPLAY CODE AND
  185. * FROM  6/12 ASCII CODE TO ASCII PROPER;  ATTAB  IS ALSO USED FOR THE
  186. * LATTER CONVERSION.  ASCTAB  IS USED TO CONVERT FROM ASCII PROPER TO
  187. * DISPLAY CODE OR TO 6/12 ASCII.
  188. *
  189. * THE TABLES  BEGINNING AT THE WORD AFTER  KNAME  ARE USED BY  CREAD,
  190. * THE CYBER KERMIT COMMAND PROCESSOR.   EACH TABLE CONTAINS ONE ENTRY
  191. * FOR EACH ACCEPTABLE COMMAND AND ENDS WITH A 0.  EACH TABLE ALSO HAS
  192. * ONE ENTRY EACH FOR THE LONGEST (AMBIGUOUS) EXPRESSION COMMON TO TWO
  193. * OR MORE COMMANDS (PROVIDED THE ACTION TO BE TAKEN ACTUALLY DIFFERS)
  194. * AND PRECEDING THE COMMANDS IN QUESTION.  THE TABLES ARE SEARCHED IN
  195. * SEQUENCE, SO THE ALPHABETICAL ORDER IS COINCIDENTAL.
  196. *
  197. * THE  EXPRESSION  TPARAMS  IS A CODED INSTRUCTION THAT REDIFINES THE
  198. * TERMINAL CHARACTERISTICS WHEN KERMIT EXECUTES.  THE CODES ARE:
  199. *
  200. *     0016       REDEFINE TERMINAL CHARACTERISTICS (CONTROL BYTE)
  201. *     40624002   SET PARITY EVEN
  202. *     40454000   TURN OFF PAGING
  203. *     40434377   SET PAGE WIDTH TO 255 CHARACTERS
  204.  TABLES   SPACE  4,10
  205.  PTYPES   DATA   3005250B    SPECIAL PACKET TYPES TO SELECT
  206.  ILLEGIT  DATA   106622400B  SPECIAL CONTROL CHARACTERS TO AVOID
  207.  DITAB    DATA   43,45,42,47,40,41,36,61,32
  208.           IFEQ   1R:,0
  209.           DATA   44,46,35,91,93,37,34,95,33
  210.           ELSE   1
  211.           DATA   44,46,35,91,93,58,34,95,33
  212.           DATA   38,39,63,60,62,64,92,94,59
  213.           IFEQ   1R:,0
  214.  ATTAB    DATA   32,64,94,32,58,32,32,96
  215.  ASCTAB   DATA   54,52,48,43,51,55,56,41,42,39,37
  216.           DATA   46,38,47,40,00,63,58,44,59,57,60
  217.           ELSE   3
  218.  ATTAB    DATA   32,64,94,32,37,32,32,96
  219.  ASCTAB   DATA   54,52,48,43,40,55,56,41,42,39,37
  220.           DATA   46,38,47,40,51,63,58,44,59,57,60
  221.           DATA   49,61,50,62,53,56,49,61,50,62,45
  222.  KNAME    DATA   0ZKERMIT,0ZO,0ZOFF,0ZON
  223.  COMTAB   DATA   0,0ZEXIT,0ZPUSH,0ZQUIT,0ZRECEIVE,0ZSE
  224.           DATA   0ZSEND,0ZSERVER,0ZSET,0ZSHOW,0ZSTATUS
  225.  SETTAB   DATA   0,0ZBITPREFIX,0ZDE,0ZDEBUG,0ZDELAY,0ZESCAPE
  226.           DATA   0ZFILETYPE,0ZMARKER,0ZPACKETLEN,0ZQUOTECHAR
  227.           DATA   0ZRE,0ZREPEATCHA,0ZRETRY
  228.           IFEQ   1R:,0
  229.  FTYPES   DATA   0,0ZASCII64,0ZASCII8,0ZBINARY,0ZDISPLAY,0ZDIS64
  230.           ELSE   1
  231.  FTYPES   DATA   0,0ZASCII63,0ZASCII8,0ZBINARY,0ZDISPLAY,0ZDIS63
  232.           DATA   0ZEIGHT,0ZKERMIT,0ZNORMAL,0Z8
  233.  SERVTAB  DATA   0,0ZS,0ZSETFILETY,0ZSHOW,0ZSTATUS,0ZTYPE,0
  234.  TPARAMS  VFD    27/1640624B,9/PARIT,24/40454000B
  235.           DATA   40434377000000000000B
  236.  MESSAGES SPACE  4,19
  237. **     MESSAGES AND TEXTS
  238. *
  239. * THE SPECIAL TEXTS  OFFLIST, CMDLIST, FTLIST, AND  SETLIST  ARE USED
  240. * BY THE LIST FORMATTER LWRITE AND BY VARIOUS OTHER ROUTINES.  LWRITE
  241. * IS DISCUSSED IN DETAIL LATER.  THE FORMAT PRESCRIBED BY  LWRITE OC-
  242. * CASIONALLY REQUIRES AN APPARENTLY SUPERFLUOUS BLANK.
  243.  MESSAGES SPACE  3,9
  244.           IFEQ   1R:,0
  245.  OFFLIST  DIS    ,/D^E^B^U^G ^M^A^Y ^B^E ^S^E^T ^T^O@D/
  246.           ELSE   1
  247.  OFFLIST  DIS    ,/D^E^B^U^G ^M^A^Y ^B^E ^S^E^T ^T^O:/
  248.           VFD    60/0,24/4LOF^F,12/23,24/0,12/2LON,48/0,12/1,48/0
  249.           IFEQ   1R:,0
  250.  CMDLIST  DIS    ,/T^H^E K^E^R^M^I^T ^C^O^M^M^A^N^D^S ^A^R^E@D/
  251.           ELSE   1
  252.  CMDLIST  DIS    ,/T^H^E K^E^R^M^I^T ^C^O^M^M^A^N^D^S ^A^R^E:/
  253.           VFD    60/0,42/7LE^X^I^T,12/22,6/0,60/10LR^E^C^E^I^
  254.           VFD    18/3LV^E,12/19,30/0,60/0LSET
  255.           VFD    42/7LP^U^S^H,12/22,6/0,30/5LSEN^D,12/22,18/0
  256.           VFD    60/6LSH^O^W,42/7LQ^U^I^T,12/22,6/0
  257.           VFD    60/10LSER^V^E^R ,12/19,48/0,60/10LST^A^T^U^S
  258.           VFD    60/0,12/1,48/0
  259.           IFEQ   1R:,0
  260.  FTLIST   DIS    ,/F^I^L^E^S ^M^A^Y ^B^E@D/
  261.           ELSE   1
  262.  FTLIST   DIS    ,/F^I^L^E^S ^M^A^Y ^B^E:/
  263.           VFD    60/0,60/10LA^S^C^I^I ,12/20,48/0
  264.           VFD    60/10LE^I^G^H^T ,60/0,60/10LB^I^N^A^R^
  265.           VFD    6/0LY,12/19,42/0,60/10LK^E^R^M^I^,6/0LT,54/0
  266.           VFD    60/10LD^I^S^P^L^,18/3LA^Y,42/0,12/1,48/0
  267.           IFEQ   1R:,0
  268.  SETLIST  DIS    ,/Y^O^U ^M^A^Y ^S^E^T@D/
  269.           ELSE   1
  270.  SETLIST  DIS    ,/Y^O^U ^M^A^Y ^S^E^T: /
  271.           VFD    60/0,60/10LB^I^T-^P^R,48/8L^E^F^I^X,12/16
  272.           VFD    60/10LF^I^L^E-^T,36/6L^Y^P^E,12/17,12/0
  273.           DIS    ,/Q^U^O^T^E-^C^H^A^R/
  274.           VFD    42/7LDEB^U^G,12/21,6/0,60/10LM^A^R^K^E^
  275.           VFD    6/0LR,12/20,42/0
  276.           DIS    ,/REP^E^A^T-^C^H^A^R/
  277.           VFD    42/7LDEL^A^Y,12/21,6/0,60/10LP^A^C^K^E^
  278.           VFD    60/10LT-^L^E^N^G,24/4L^T^H,12/13,24/0
  279.           DIS    ,/RET^R^Y/
  280.           DIS    ,/E^S^C^A^P^E/
  281.           VFD    12/1,48/0
  282.  TRANSFM  DIS    ,/ F^I^L^E^S ^T^R^A^N^S^F^E^R^R^E^D/
  283.           DIS    ,/ P^A^C^K^E^T^S ^S^E^N^T/
  284.           DIS    ,/ P^A^C^K^E^T^S ^R^E^C^E^I^V^E^D/
  285.           DIS    ,/ D^A^T^A ^E^R^R^O^R^S/
  286.           DIS    ,/ R^E^P^E^T^I^T^I^O^N^S/
  287.  KPROMPT  DIS    ,/ C^Y^B^E^R K^E^R^M^I^T> /
  288.  BLOCKM   DIS    ,/^B^L^O^C^K ^C^H^E^C^K^S        1-^C^H^A^R/
  289.  DEFAULM  DIS    ,/^D^E^F^A^U^L^T ^F^I^L^E ^N^A^M^E   /
  290.  CTRLHYP  DIS    ,/CTRL-/
  291.           IFEQ   PARIT,0,1
  292.  PAREVEN  DIS    ,/^P^A^R^I^T^Y              ^Z^E^R^O/
  293.           IFEQ   PARIT,1,1
  294.  PAREVEN  DIS    ,/^P^A^R^I^T^Y              ^O^D^D/
  295.           IFEQ   PARIT,2,1
  296.  PAREVEN  DIS    ,/^P^A^R^I^T^Y              ^E^V^E^N/
  297.  INTERM   DIS    ,/I^N^T^E^R^R^U^P^T^E^D/
  298.  RETRYM   DIS    ,/T^O^O ^M^A^N^Y ^R^E^P^E^T^I^T^I^O^N^S/
  299.  NOTHIGM  DIS    ,/N^O^T^H^I^N^G/
  300.           IFEQ   1R:,0
  301.  RECEIVM  DIS    ,/R^E^C^E^I^V^E@D /
  302.           CON    10LS^E^N^D@D
  303.           ELSE   2
  304.  RECEIVM  DIS    ,/R^E^C^E^I^V^E: /
  305.           CON    10LS^E^N^D:
  306.  PACKNUM  DIS    ,/P^A^C^K^E^T ^N^U^M^B^E^R /
  307.  CKERRM   DIS    ,/C^H^E^C^K^S^U^M ^E^R^R^O^R/
  308.  FNCHGM   DIS    ,/C^H^A^N^G^E ^F^I^L^E ^N^A^M^E ^T^O /
  309.  FRABTM   DIS    ,/T^R^A^N^S^F^E^R ^A^B^O^R^T^E^D/
  310.  BREAKM   DIS    ,/B^R^E^A^K.  /
  311.  ERRORM   DIS    ,/E^R^R^O^R.  /
  312.           IFEQ   1R:,0
  313.  LASTFM   DIS    ,/ L^A^S^T ^F^I^L^E@D/
  314.           ELSE   1
  315.  LASTFM   DIS    ,/ L^A^S^T ^F^I^L^E:/
  316.  BINERM   DATA   10LB^I^T ^P^R,10L^E^F^I^X ^,10LI^S ^R^E^Q
  317.           DIS    ,/^U^I^R^E^D ^F^O^R ^B^I^N^A^R^Y ^F^I^L^E^S/
  318.  OPENFM   DIS    ,/R^E^C^E^I^V^I^N^G ^F^I^L^E  /
  319.  DISCARM  DIS    ,/I^N^S^T^R^U^C^T^E^D ^T^O ^D^I^S^C^A^R^D ^F^I^L^E/
  320.  EOFM     DIS    ,/E^N^D ^O^F ^F^I^L^E /
  321.  KDATERM  DIS    ,/F^A^T^A^L ^P^R^O^T^O^C^O^L ^V^I^O^L^A^T^I^O^N/
  322.  NONEXTM  DIS    ,/T^H^I^S ^F^I^L^E ^D^O^E^S ^N^O^T ^E^X^I^S^T/
  323.  LOGOUTM  DIS    ,/L^O^G^O^U^T/
  324.  FINISHM  DIS    ,/F^I^N^I^S^H/
  325.  NOTIMP   DIS    ,/N^O^T ^I^M^P^L^E^M^E^N^T^E^D/
  326.  TYPEM    DIS    ,/T^Y^P^E/
  327.  TYPERM   DIS    ,/Y^O^U ^C^A^N^N^O^T T^Y^P^E ^B^I^N^A^R^Y ^F^I^L^E^S/
  328.  HELPM    DIS    ,/H^E^L^P/
  329.  EOPMSG   DIS    ,/(EOP)/
  330.  BADTERM  DIS    ,/ INPUT AND OUTPUT MUST BE TERMINAL FILES/
  331.  NOHELPM  DIS    ,/ FILE ZZZKHLP IS MISSING/
  332.  BADKDAT  DIS    ,/ FILE ZZZKDAT IS CORRUPT/
  333.  DEBACL   SPACE  4,21
  334. **     DEALING WITH FATAL ERRORS
  335. *
  336. * IF WE LEARN THAT THE LINK FILE WRITTEN BY A  PUSH  COMMAND HAS BEEN
  337. * CORRUPTED, OR THAT THE HELP FILE ZZZKHLP IS MISSING, OR THAT EITHER
  338. * INPUT  OR  OUTPUT IS NOT ASSIGNED TO A TERMINAL,  WE HAVE NO CHOICE
  339. * BUT TO ABORT.   DEBACLD IS THE ENTRY POINT FOR CORRUPT LINK  FILES,
  340. * DEBACL - 2 FOR NONEXISTENCE OF ZZZKHLP,  AND DEBACL-1 WHEN INPUT OR
  341. * OUTPUT IS A MASS STORAGE FILE.
  342.  DEBACL   SPACE  3,9
  343.  DEBACLD  RETURN ZZZKDAT     DESTROY THE INFAMOUS THING!
  344.           SX1    BADKDAT     THEN CONFESS
  345.           EQ     DEBACL
  346.           SX1    NOHELPM     A USER HAS BEEN TAMPERING WITH FILES
  347.           EQ     DEBACL
  348.           SX1    BADTERM     OR WITH FANCY 'ASSIGN' STATEMENTS
  349.  DEBACL   MESSAGE X1,4
  350.           ABORT
  351.  NCONV    TITLE  SUBROUTINES THAT MANIPULATE DATA
  352. **     SUBROUTINES THAT MANIPULATE DATA
  353. *
  354. *  THESE  ELEMENTARY ROUTINES ARE CALLED FREQUENTLY BY SEVERAL LATER,
  355. *  MORE COMPLEX ROUTINES.
  356. *
  357. *  NCONV CONVERTS A BINARY NUMBER IN X3 TO DISPLAY CODE IN X5,  USING
  358. *  B2 FOR UNPACKING AND SHIFT OPERATIONS.  X5 MUST BE 0 ON ENTRY.
  359.  NCONV    SPACE  3,10
  360.  NCONV    PS
  361.           SX0    10
  362.           PX1    X0          X1 := FLOATING POINT 10
  363.           NX1    X1          NORMALISE X1
  364.           PX2    X3          CONVERT X3 TO FLOATING POINT
  365.           FX2    X2/X1       DIVIDE
  366.           SX4    X3+27       THIS WILL LEAVE A PRINTABLE DIGIT
  367.           UX3    B2,X2
  368.           LX3    B2,X3       X3 NOW CONTAINS THE INTEGER QUOTIENT
  369.           IX2    X3*X0
  370.           IX4    X4-X2       THIS IS THE RIGHTMOST DIGIT FROM X3
  371.           BX5    X5+X4       ADD IT TO X5
  372.           LX5    54          SHIFT IT INTO THE UPPER END OF X5
  373.           NZ     X2,*-2
  374.           EQ     NCONV
  375.  DEFFILE  SPACE  4,18
  376. ** DEFFILE  PREPARES THE CURRENT DEFAULT FILE NAME IN X6 USING NCONV.
  377. *  AT EXIT A3 CONTAINS DEFAULF, THE ADDRESS OF THE SEQUENCE NUMBER OF
  378. *  THE DEFAULT FILE, WHILE X6 CONTAINS THE CURRENT DEFAULT FILE NAME,
  379. *  LOGICALLY ADDED TO THE CODE FOR A BINARY FET.
  380.  DEFFILE  SPACE  3,10
  381.           SA0    B2          SAVE CONTENTS OF B2 (USED BY NCONV)
  382.           BX5    X5-X5       X5 := 0
  383.           RJ     NCONV       CONVERT X3 TO DISPLAY CODE
  384.           SB2    A0          RESTORE CONTENTS OF B2
  385.           MX0    24          4-CHARACTER MASK
  386.           SX4    3RKER       START OF DEFAULT FILE NAME
  387.           BX2    -X0*X5      X2 SHOULD BE 0
  388.           ZR     X2,*+2      UNLESS THE NUMBER IS TOO LARGE
  389.           BX6    X6-X6       IN WHICH CASE USE 0
  390.           SA6    A3          AND SAVE IT (A3 STILL = DEFAULF)
  391.           SX5    27
  392.           LX5    54          SHIFT TO AVOID OVERLAP
  393.           BX6    X4+X5       AND COMBINE TWO PARTS OF FILE NAME
  394.           LX6    42          SHIFT INTO POSITION
  395.           SX5    3           AND ADD BINARY FET CODE
  396.           BX6    X6+X5       TO FILE NAME
  397.  DEFFILE  PS
  398.           SA3    DEFAULF     X3 := DEFAULT FILE NUMBER
  399.           EQ     DEFFILE-6
  400.  PUTVAL   SPACE  4,23
  401. ** PUTVAL  STORES  THE  NEXT  8-BIT VALUE FROM X5 INTO A PACKET BEING
  402. *  PREPARED FOR SENDING.  IT ACTUALLY KEEPS THE LAST VALUE IN X7, FOR
  403. *  WE SOMETIMES WISH TO STRIP ONE OR MORE VALUES.  B5 HOLDS THE COUNT
  404. *  OF THE NUMBER OF TIMES THE VALUE IN  X7 HAS BEEN REPEATED,  AND B6
  405. *  HOLDS THE OFFSET OF THE CURRENT STORAGE ADDRESS,  WHICH IS A SHORT
  406. *  DISTANCE FROM END-OF-PACKET TO BE SAFE.   THIS 'PADDED' ADDRESS IS
  407. *  IN B7.   PUTVAL MAY RETURN WITHOUT COMPLETING THE  'PUTTING'  WHEN
  408. *  B6 GOES POSITIVE.   THE 'PUTTING' IS COMPLETE WHENEVER B6 < 0, AND
  409. *  IF B6 >= 0, THE PUTTING IS COMPLETE IF X5 = X7.
  410.  PUTVAL   SPACE  3,10
  411.  PUTVAL   PS
  412.           BX4    X7-X5       IS THIS A NEW VALUE, OR DOES IT REPEAT
  413.           NZ     X4,*+2      X4 = 0 IF THIS IS NOT A NEW VALUE
  414.           SB5    B5+B1       NEW VALUE = LAST; INCREMENT COUNT
  415.           EQ     PUTVAL
  416.           SA1    RPCH
  417.           SB5    B5-B1       B5 := ONE LESS THAN THE REPEAT COUNT
  418.           MX0    53
  419.           LE     B5,B1,*+6   WE NEED AT LEAST 3 TO USE REPEAT
  420.           MI     X1,*+6      AND WE CAN'T REPEAT WITH NO RPCH
  421.           BX6    X1
  422.           SA6    B6+B7       SEND THE REPEAT PREFIX
  423.           SX6    B5+34
  424.           BX2    X0*X6       TEST FOR OVERLARGE COUNTS
  425.           ZR     X2,*+1      X2 = 0 IF THE COUNT IS <= 126
  426.           BX6    -X0         OTHERWISE LIMIT THEM TO 126
  427.           BX4    -X6
  428.           SX4    X4+B1
  429.           BX6    -X4         X6 := REPEAT COUNT TO BE SENT
  430.           SB5    X4+B5       B5 := REMAINING REPEAT COUNT
  431.           SB5    B5+33       THEN CORRECT THE TOTAL
  432.           SB6    B6+B1
  433.           SA6    B6+B7       STORE CODED REPEAT COUNT
  434.           SB6    B6+B1
  435.  +        SX0    B1
  436.           LX0    7           X0 := 128
  437.           SA2    BITPREF
  438.           BX6    X7
  439.           BX4    X0*X7       TEST TO SEE IF BIT 8 IS SET
  440.           ZR     X4,*+2
  441.           BX6    X2
  442.           SA6    B6+B7       BIT-PREFIX
  443.           SB6    B6+B1
  444.           BX6    X0-X7
  445.           SA4    QUOTEC      QUOTE PREFIX
  446.           BX1    X1-X6
  447.           BX0    X6
  448.           ZR     X1,*+5      RPCH REQUIRES A PREFIX
  449.           SX1    B1
  450.           LX1    6           X1 := 64
  451.           BX2    X2-X6
  452.           ZR     X2,*+4      QBIN REQUIRES A PREFIX
  453.           BX2    X4-X6
  454.           ZR     X2,*+3      QCTL REQUIRES A PREFIX
  455.           MX2    53
  456.           BX2    -X2-X6
  457.           ZR     X2,*+1      DEL REQUIRES A PREFIX AND DECONTROL
  458.           MX2    55
  459.           BX2    X2*X6
  460.           NZ     X2,*+2      CHARS LESS THAN 32 REQUIRE PREFIX
  461.           BX0    X0-X1
  462.  +        BX6    X4
  463.           SA6    B6+B7       PUT QUOTE PREFIX
  464.           SB6    B6+B1
  465.           BX6    X0
  466.           SA6    B6+B7       FINALLY, STORE THE CHAR
  467.           SB6    B6+B1
  468.           ZR     B5,*+2      DONE IF B5 = 0
  469.           MI     B6,PUTVAL+3
  470.           EQ     PUTVAL      WE CANNOT GO ON IN THIS PACKET
  471.           BX7    X5
  472.           SB5    B1
  473.           EQ     PUTVAL
  474.  UNPACK   SPACE  4,17
  475. ** UNPACK GETS THE NEXT 8-BIT VALUE FROM A PACKET INTO X5.  X5 < 0 AT
  476. *  END-OF-PACKET,  IN WHICH CASE ANOTHER PACKET MAY BE REQUESTED WHEN
  477. *  MORE DATA IS EXPECTED.
  478.  UNPACK   SPACE  3,10
  479.           MX3    47
  480.  UNPACK   PS
  481.           BX5    X3          X3 CONTAINS NEXT CHARACTER IN THE PACKET
  482.           MI     X3,UNPACK   OR A NEGATIVE NUMBER IF PACKET IS EMPTY
  483.           SB2    B2-B1       B2 CONTAINS THE REPEAT COUNT
  484.           GT     B2,B0,UNPACK  IF THIS WAS > 1 AND IS > 0, THEN DONE
  485.           SA3    B4          OTHERWISE TRY TO GET NEXT CHAR
  486.           SB2    B1          WHICH PROBABLY OCCURS ONLY ONCE
  487.           MI     X3,UNPACK   X3 < 0 AT END OF PACKET
  488.           SA1    QCTL
  489.           SA2    A1+B1       RPCH
  490.           BX0    X2-X3       IS THIS A REPEATED VALUE
  491.           NZ     X0,*+3      IF X2 = X3, THEN NEXT VALUE FOLLOWS COUNT
  492.           SA3    A3+B1
  493.           SB2    X3-32       B2 := REPEAT COUNT
  494.           SA3    A3+B1       AND X3 := VALUE
  495.           MI     X3,UNPACK   JUST IN CASE THERE IS A DATA ERROR
  496.           LE     B2,B0,UNPACK-1  WE LEAVE THIS ROUTINE WITH NO ERROR
  497.           SA4    QBIN
  498.           BX0    X3-X4
  499.           BX6    X6-X6       IS THE EIGHTH BIT TRUE
  500.           NZ     X0,*+2      IF X6 = 0, THIS IS A BIT PREFIX
  501.           SA3    A3+B1       IN WHICH CASE, GET THE VALUE
  502.           SX6    B1
  503.           MI     X3,UNPACK   THIS SHOULD NEVER OCCUR (BUT WHO KNOWS?)
  504.           LX6    7           X6 := 128
  505.  +        BX0    X3-X1       IS IT A QUOTED CHARACTER
  506.           NZ     X0,*+4
  507.           SA3    A3+B1
  508.           BX0    X1-X3       IS IT QCTL
  509.           ZR     X0,*+3
  510.           BX0    X4-X3       IS IT QBIN
  511.           ZR     X0,*+2
  512.           BX0    X2-X3       IS IT RPCH
  513.           SX4    B1
  514.           ZR     X0,*+1
  515.           LX4    6           X4 := 64
  516.           BX3    X3-X4
  517.           BX3    X3+X6
  518.           SB4    A3+B1
  519.           EQ     UNPACK
  520.  PREAD    SPACE  4,18
  521. ** PREAD 'READS' ONE CHARACTER FROM A 6/12 TEXT AND TRANSLATES IT INTO
  522. *  ASCII CODE.  IT USES THE SUBROUTINE PREADSUB TO GET THE NEXT 6 BITS
  523. *  OF THE TEXT.   NOTE THAT PREAD MAKES NO ATTEMPT TO DETECT ERRORS IN
  524. *  SUCH A TEXT.
  525.  PREAD    SPACE  3,10
  526.           MX0    54
  527.           LX3    6
  528.           BX5    -X0*X3      GET NEXT SIX BITS OF WORD INTO X5
  529.           SB2    B2+B1       AND INCREMENT CHARACTER COUNT
  530.  PREADSB  PS
  531.           MI     B2,*-2      B2 < 0 IF THERE IS MORE IN THIS WORD
  532.           SA3    B3          GET NEXT WORD
  533.           SB3    B3+B1       (INCREMENTING THE POINTER)
  534.           SB2    -10         WHICH CONTAINS 10 6-BIT CHARACTERS
  535.           EQ     *-3
  536. *
  537.  PREAD    PS
  538.           RJ     PREADSB     GET THE NEXT SIX BITS
  539.           ZR     X5,PREAD    WHICH ARE 0 AT END OF TEXT
  540.           SX4    X5-62       TEST FOR UP-ARROW
  541.           ZR     X4,PREAD1   WHICH IS HANDLED AT PREAD1
  542.           SX4    X4+B1
  543.           SX4    X4+B1
  544.           NZ     X4,*+2      NOW TEST FOR AT-SIGN
  545.           RJ     PREADSB
  546.           SA5    X5+ATTAB    AND CONVERT USING TABLE
  547.           EQ     PREAD
  548.           SX5    X5-27       TEST FOR UPPER-CASE LETTER
  549.           PL     X5,*+2      X5 >= 0 UNLESS CHAR IS LETTER
  550.           SX5    X5+91
  551.           EQ     PREAD
  552.           SX5    X5-10       TEST FOR DIGIT
  553.           PL     X5,*+2      X5 >= 0 UNLESS CHAR IS DIGIT
  554.           SX5    X5+58
  555.           EQ     PREAD
  556.           SA5    X5+DITAB    CONVERT USING TABLE
  557.           EQ     PREAD
  558.  PREAD1   RJ     PREADSB     AFTER UP-ARROW, GET NEXT SIX BITS
  559.           SX5    X5-32       IF THESE ARE >= 32, ASCII VALUE IS
  560.           PL     X5,PREAD    BITS - 32
  561.           SX5    X5+128      OTHERWISE ASCII VALUE IS BITS + 96
  562.           EQ     PREAD
  563.  PACKTEX  SPACE  4,13
  564. ** THE  PACKTEX  UTILITY ROUTINE WORKS WITH PREAD TO PACK TEXT INTO A
  565. *  PACKET.   IT IS USEFUL WHEN SENDING ERROR MESSAGES AND OTHER SHORT
  566. *  COMMUNICATIONS.
  567.  PACKTEX  SPACE  3,6
  568.  PACKTEX  PS
  569.           RJ     PREAD       UNPACK NEXT CHARACTER OF MESSAGE
  570.           ZR     X5,*-2      IT IS 0 AT END-OF-TEXT
  571.           RJ     PUTVAL      STORE IT IN THE PACKET
  572.           MI     B6,*-2      AND REPEAT IF B6 < 0
  573.           EQ     *-3         B6 >= 0 WHEN PACKET IS FULL
  574.  MAKEFN   SPACE  4,17
  575. ** THE ROUTINE MAKEFN BUILDS A FILE NAME ONE CHARACTER AT A TIME FROM
  576. *  ASCII CODED CHARACTERS INPUT IN X5.  OUTPUT IS LEFT-JUSTIFIED FILE
  577. *  NAME IN DISPLAY CODE IN X7.
  578.  MAKEFN   SPACE  3,10
  579.           SX2    X4-26       TEST FOR LOWER-CASE LETTER
  580.           PL     X2,*+3      X2 >= 0 IF NOT A LETTER
  581.           SX4    X4+B1       CONVERT LETTERS TO DISPLAY CODE
  582.           LX7    6
  583.           BX7    X7+X4       AND ADD TO FILE NAME
  584.           SB5    B5+B1
  585.           MI     B5,*+1      IF B5 < 0, THEN FILE NAME IS NOT FULL
  586.           LX7    18          IF FULL, JUSTIFY IT
  587.  MAKEFN   PS
  588.           PL     B5,*-1      B5 >= 0 WHEN FILE NAME IS COMPLETE
  589.           PL     X5,*+3      X5 < 0 WHEN THERE IS NO MORE INPUT
  590.           LX7    6           IF THERE IS NO MORE INPUT, THEN
  591.           SB5    B5+B1       JUSTIFY THE FILE NAME IN X7
  592.           MI     B5,*
  593.           LX7    18
  594.           EQ     MAKEFN
  595.           SX4    X5-65       DIVIDE ASCII CHARS; LETTERS >= 65
  596.           MI     X4,*+3      TREAT NON-LETTERS LATER
  597.           SX2    X4-32       TEST FOR LOWER-CASE LETTERS
  598.           MI     X2,MAKEFN-3 AND TREAT THEM ELSEWHERE
  599.           BX4    X2
  600.           EQ     MAKEFN-3    TREAT UPPER-CASE LETTERS
  601.           ZR     X7,MAKEFN   DO NOT STORE NON-LETTERS AS 1ST CHAR
  602.           SX4    X5-22       CONVERT DIGITS TO DISPLAY CODE
  603.           SX2    X4-26       TEST THAT THEY ARE IN FACT DIGITS
  604.           MI     X2,MAKEFN   IF X2 < 0 THEN THEY ARE NOT DIGITS
  605.           SX2    X2-10
  606.           MI     X2,MAKEFN-2 IF X2 < 0 HERE, THEY ARE DIGITS
  607.           EQ     MAKEFN      OTHERWISE THEY ARE NOT
  608.  UNPCFIL  SPACE  4,17
  609. ** UNPCFIL EXTRACTS A FILE NAME FROM A PACKET.  IT PRESUMES THAT X3 =
  610. *  0 AND THAT THE FILE NAME BEGINS AT THE FOURTH WORD OF THE RECEIVED
  611. *  PACKET;  HENCE THIS ROUTINE CANNOT EXTRACT FILE NAMES FROM PACKETS
  612. *  CARRYING REMOTE COMMANDS TO 'TYPE' A FILE.
  613.  UNPCFIL  SPACE  3,10
  614.  UNPCFIL  PS
  615.           BX7    X7-X7       X7 := 0
  616.           SB5    -7          7 CHARS IN FILE NAME
  617.           SB2    B1          FIRST CHAR WILL BE REPEATED ONCE
  618.           SB4    CBUF+99
  619.           RJ     UNPACK      GET DUMMY FIRST CHAR
  620.           RJ     UNPACK      GET A CHAR OUT OF THE PACKET
  621.           RJ     MAKEFN      AND TRY TO ADD IT TO THE FILE NAME
  622.           MI     B5,*-2      REPEAT UNTIL FILE NAME IS COMPLETE
  623.           EQ     UNPCFIL
  624.  FREAD    TITLE  PRIMARY INPUT ROUTINES
  625. **     PRIMARY INPUT ROUTINES
  626. *
  627. *  FREAD FILLS A FILE BUFFER.  NOTE: INFI MUST CONTAIN ADDRESS OF FET
  628. *  OF FILE BEING READ, AS DOES X2 ON ENTRY.  THIS ALWAYS RETURNS X6 =
  629. *  0 AND SETS B4 AND B3 TO END-OF-INPUT AND OFFSET ADDRESS OF THE 1ST
  630. *  WORD READ.
  631.  FREAD    SPACE  3,10
  632.  FREAD    PS
  633.           SA7    REGIST      REGIST CONTAINS X7
  634.           MX0    42
  635.           SX1    B2          PREPARE TO SAVE CONTENTS OF B REGISTERS
  636.           SX4    B5
  637.           SX6    B6
  638.           SX7    B7
  639.           BX1    -X0*X1      MASK OFF ALL SIGN EXTENSIONS
  640.           BX4    -X0*X4
  641.           BX6    -X0*X6
  642.           BX7    -X0*X7
  643.           LX6    18          AND PREPARE TO COMBINE
  644.           LX7    18
  645.           BX6    X6+X1
  646.           BX7    X7+X4
  647.           SA6    A7+B1       REGIST + 1 CONTAINS B6, B2
  648.           SA7    A6+B1       REGIST + 2 CONTAINS B7, B5
  649.           BX7    X3
  650.           BX6    X5
  651.           SA7    A7+B1       REGIST + 3 CONTAINS X3
  652.           SA6    A7+B1       REGIST + 4 CONTAINS X5
  653.           SA1    X2+B1       FET + 1
  654.           BX6    -X0*X1      X6 CONTAINS START OF BUFFER
  655.           SA6    A1+B1       IN
  656.           SA6    A6+B1       OUT
  657.           READ   X2,R
  658.           SA1    REGIST      X7
  659.           SA2    A1+B1       B6, B2
  660.           SA4    A2+B1       B7, B5
  661.           SA3    A4+B1       X3
  662.           SA5    A3+B1       X5
  663.           BX7    X1
  664.           SB2    X2
  665.           SB5    X4
  666.           LX2    42
  667.           LX4    42
  668.           SB6    X2
  669.           SB7    X4
  670.           SA2    INFI        X2 = FET ADDRESS
  671.           SB3    X2+B1
  672.           SA1    B3+B1       IN
  673.           SA4    A1+B1       OUT
  674.           SB4    X1          END OF DATA
  675.           IX4    X4-X1
  676.           SB3    X4          OFFSET
  677.           BX6    X6-X6
  678.           EQ     FREAD
  679.  WREAD    SPACE  4,18
  680. * WREAD  READS  ONE WORD FROM AN INPUT FILE;  IT IS USED BY ALL INPUT
  681. * ROUTINES.   NOTE THAT INFI MUST CONTAIN ADDRESS OF THE FET OF  FILE
  682. * BEING READ.  WREAD RETURNS X1 = 0 WHEN DATA IS READ, WITH DATA READ
  683. * IN X6, OR X1 <> 0 WHEN NO DATA IS READ, WITH X6 = 0.
  684.  WREAD    SPACE  3,10
  685.           SA4    B3+B4       X4 = NEXT WORD
  686.           SB3    B3+B1
  687.           BX6    X4
  688.           BX1    X1-X1       SIGNAL THAT DATA WAS READ
  689.  WREAD    PS
  690.           MI     B3,*-2      B3 < 0 WHEN BUFFER IS NOT YET EMPTY
  691.           SA2    INFI        X2 := FET ADDRESS
  692.           SA1    X2          X1 := I/O STATUS
  693.           LX1    55          X1 > 1 WHEN THIS RECORD IS NOT FINISHED
  694.           BX6    X6-X6
  695.           MI     X1,WREAD    X1 < 0 AT EOR, EOF, EOI
  696.           RJ     FREAD       FILL BUFFER
  697.           MI     B3,WREAD-1  B3 < 0 WHEN DATA WAS READ
  698.           EQ     WREAD
  699.  SREAD    SPACE  4,18
  700. ** SREAD  READS ONE SIX-BIT CHARACTER FROM A FILE.  ALL TEXTUAL INPUT
  701. *  WHETHER FROM THE TERMINAL OR FROM MASS STORAGE USES SREAD.   EXITS
  702. *  WITH NEXT 6 BITS IN X5 OR WITH X5 < 0 AT EOLN AND EOR.   B2 = 0 AT
  703. *  EOLN, B2 > 0 AT EOR, EOF, EOI, AND B2 < 0 WHEN DATA IS IN X5.
  704.  SREAD    SPACE  3,10
  705.           MI     B3,SREAD
  706.           RJ     WREAD       FILL BUFFER
  707.           SB3    B3-B1
  708.           ZR     X1,*+1      X1 = 0 IF DATA WAS READ
  709.           SA6    B3+B4       INSERT MISSING END-OF-LINE
  710.  SREAD    PS
  711.           PL     B2,SREAD1   EOLN OR EOR
  712.           SB2    B2+B1
  713.           MX0    54
  714.           BX5    -X0*X3      GET NEXT CHAR
  715.           LX3    6
  716.           MI     B2,SREAD    B2 < 0 WHEN X3 HOLDS MORE CHARS
  717.           SA3    B3+B4       GET NEXT WORD
  718.           SB3    B3+B1
  719.           ZR     X3,SREAD    EOLN IS NEXT
  720.           MX1    48
  721.           SB2    -10
  722.           BX6    -X1*X3      TEST FOR END OF LINE
  723.           ZR     X6,*+5      X6 = 0 WHEN WORD ENDS WITH EOLN
  724.           BX6    -X0*X3      TEST FOR POSSIBLE END OF LINE
  725.           LX3    6
  726.           NZ     X6,SREAD-2  NO POSSIBLE END OF LINE
  727.           RJ     WREAD       GET NEXT WORD
  728.           SB3    B3-B1
  729.           ZR     X1,*+1      X1 = 0 WHEN THERE IS MORE DATA
  730.           SA6    B3+B4       OTHERWISE ADD MISSING EOLN
  731.           NZ     X6,SREAD    X6 <> 0 WHEN THERE IS NO EOLN
  732.           SB2    B2+B1       B2 = -9; 9 CHARS ARE IN WORD IN X3
  733.           EQ     SREAD
  734.           SB2    B2+B1       B2 = -9
  735.           BX2    X3          EXTRA COPY OF DATA
  736.           SB3    B3-B1
  737.           SA6    B3+B4       SAVE EOLN
  738.           LX2    54
  739.           BX4    -X1*X2      TEST EXTENT OF EOLN IN WORD
  740.           SB2    B2+B1
  741.           ZR     X4,*-1      X4 = 0 WHEN THIS IS PART OF THE EOLN
  742.           LX3    6
  743.           EQ     SREAD
  744.  SREAD1   SX5    -B1         NO CHAR MESSAGE
  745.           NZ     B2,SREAD    B2 > 0 AT EOR, EOF, OR EOI
  746.           SB2    B1
  747.           RJ     WREAD
  748.           NZ     X1,SREAD    X1 <> 0 AT EOR, EOF, EOI
  749.           SB2    B0
  750.           BX3    X6
  751.           ZR     X6,SREAD    EOLN
  752.           MX0    54
  753.           EQ     SREAD+4     TEST FOR EOLN
  754.  BREAD    SPACE  4,19
  755. ** BREAD READS EIGHT BITS FROM A BINARY FILE.   THESE ARE RETURNED IN
  756. *  X5; X5 < 0 AT EOR, EOI, EOF.  BREAD ALLOWS ITS INPUT TO CROSS WORD
  757. *  BOUNDARIES.  IF THE LAST DATA IN THE FILE IS ONLY FOUR BITS, BREAD
  758. *  PADS THIS WITH ZEROS, UNLESS THE FOUR BITS ARE 0, IN WHICH CASE IT
  759. *  DROPS THEM.
  760.  BREAD    SPACE  3,10
  761.           SX5    -B1         RETURN END OF FILE
  762.           EQ     BREAD
  763.           SB2    B1          FLAG EOF
  764.           ZR     X5,*-1
  765.           LX5    4           AND FILL WITH 0
  766.  BREAD    PS
  767.           PL     B2,*-3      END OF FILE?
  768.           MX0    56
  769.           BX5    -X0*X3      GET NEXT 4 BITS
  770.           SB2    B2+B1
  771.           MI     B2,*+3      B2 < 0 IF THERE IS MORE IN THIS WORD
  772.           SB2    -15         1 WORD = 15 * 4 BITS
  773.           RJ     WREAD       GET NEXT WORD
  774.           NZ     X1,BREAD-1  ADD 0 AT END OF FILE
  775.           MX0    56
  776.           BX3    X6          TRANSFER WORD READ TO X3
  777.           LX3    4
  778.           BX4    -X0*X3      GET SECOND FOUR BITS
  779.           SB2    B2+B1       UPDATE SHIFT COUNT
  780.           LX5    4
  781.           BX5    X5+X4       COMBINE TWO PARTS OF 8-BIT DATUM
  782.           LX3    4
  783.           MI     B2,BREAD    B2 < 0 UNLESS WE MUST READ A WORD
  784.           SB2    B1          PREPARE IN ADVANCE FOR EOR
  785.           RJ     WREAD
  786.           NZ     X1,BREAD    X1 <> 0 AT EOR, EOF, OR EOI
  787.           SB2    -15         15 4-BIT PARCELS PER WORD
  788.           BX3    X6          X3 := WORD READ
  789.           LX3    4
  790.           EQ     BREAD
  791.  KREAD    SPACE  4,19
  792. ** KREAD READS FROM A KERMIT-FORMAT BINARY FILE.  THE UPPER FOUR BITS
  793. *  OF EACH WORD OF SUCH A FILE SHOULD CONTAIN  SEVEN MINUS THE NUMBER
  794. *  OF 8-BIT BYTES IN THE REST OF THE WORD.   HENCE IT IS AN ERROR FOR
  795. *  THIS NUMBER TO BE GREATER THAN 6, BUT WE IGNORE SUCH ERRORS.  DATA
  796. *  ARE RETURNED IN X5; X5 < 0 AT EOR, EOF, EOI.
  797.  KREAD    SPACE  3,10
  798.           MX0    52          MASK OFF EIGHT BITS
  799.           LX3    8
  800.           BX5    -X0*X3      PUT THEM IN X5
  801.           SB2    B2+B1       UPDATE SHIFT COUNT
  802.  KREAD    PS
  803.           MI     B2,*-2      B2 < 0 IF MORE BYTES IN THIS WORD
  804.           RJ     WREAD
  805.           NZ     X1,*+3      X1 <> 0 AT EOR, EOF, EOI
  806.           BX3    X6          X3 := WORD READ
  807.           LX3    4
  808.           MX0    56
  809.           BX5    -X0*X3      X5 := 7 - NUMBER OF BYTES IN THIS WORD
  810.           SB2    X5-7        B2 := - NUMBER OF BYTES
  811.           EQ     *-3
  812.           MX5    45          SEND EOR MESSAGE
  813.           EQ     KREAD
  814.  ISAVE    SPACE  4,16
  815. ** ISAVE  SAVES ALL REGISTERS ASSOCIATED WITH AN INPUT FILE;  FET - 2
  816. *  RECEIVES THE SHIFT COUNT, FET - 1 THE WORD BEING READ, AND FET + 3
  817. *  THE ADDRESS OF THE NEXT WORD TO BE READ.
  818.  ISAVE    SPACE  3,9
  819.           SX6    B2
  820.           SA6    X1-2        SHIFT COUNT
  821.           BX6    X3
  822.           SA6    A6+B1       SAVE WORD BEING READ
  823.           SX6    B3+B4
  824.           SA6    X1+3        OUT
  825.  ISAVE    PS
  826.           SA1    INFI        GET FET ADDRESS
  827.           EQ     ISAVE-2
  828.  IREST    SPACE  4,18
  829. ** IREST RESTORES ALL REGISTERS ASSOCIATED WITH AN INPUT FILE;  SHIFT
  830. *  COUNT IN B2, B4 := ADDRESS OF WORD AFTER LAST WORD TO BE READ,  B3
  831. *  IS THE OFFSET FROM B4 OF THE NEXT WORD TO BE READ, AND  X3 := WORD
  832. *  CURRENTLY BEING READ.
  833.  IREST    SPACE  3,10
  834.  IREST    PS
  835.           SB2    X1          SHIFT COUNT
  836.           SA3    A1+B1       WORD BEING READ
  837.           SA2    A3+3        IN
  838.           SA4    A2+B1       OUT
  839.           SX6    A3+B1       FET ADDRESS
  840.           SA6    INFI
  841.           SB4    X2          END OF DATA
  842.           IX4    X4-X2       OFFSET
  843.           SB3    X4
  844.           EQ     IREST
  845.  INSTART  SPACE  4,19
  846. ** INSTART READS NEW INPUT FROM THE TERMINAL, STORING THE FET ADDRESS
  847. *  OF INPUT IN INFI, CALLING FREAD,  AND PREPARING THE OUTPUT FET FOR
  848. *  NEW OUTPUT,  SINCE IT HAS JUST BEEN FLUSHED BY READING FROM INPUT.
  849. *  IT RETURNS WITH X7 = 0.
  850.  INSTART  SPACE  3,11
  851.  INSTART  PS
  852.           SB2    B0
  853.           SX2    INPUT       ADDRESS OF FET
  854.           BX6    X2
  855.           SA6    INFI
  856.           RJ     FREAD       FILL BUFFER
  857.           SX7    TBUF
  858.           RJ     SREAD       READ DUMMY EOLN
  859.           SA7    OUTPUT+2    IN
  860.           SA7    A7+B1       OUT; HENCE OUTPUT BUFFER IS EMPTY
  861.           BX7    X7-X7
  862.           EQ     INSTART
  863.  TESTFIL  SPACE  4,18
  864. ** TESTFIL  CHECKS WHETHER A LOCAL FILE EXISTS OR NOT.   NO REGISTERS
  865. *  ARE PRESERVED.   ON ENTRY X6 = THE ADDRESS OF THE FET OF THE FILE.
  866. *  ON EXIT, X6 CONTAINS THE FILE STATUS: X6 = 0 IF NO FILE WAS FOUND;
  867. *  X6 > 0 IF A FILE WAS FOUND.
  868.  TESTFIL  SPACE  3,10
  869.  TESTFIL  PS
  870.           SA6    UPDAT       SAVE FET ADDRESS
  871.           STATUS X6
  872.           SA2    UPDAT
  873.           SA1    X2          GET FET + 0
  874.           MX0    42
  875.           BX6    X0*X1       X6 := FILE NAME
  876.           SX5    B1+B1
  877.           SX5    X5+B1       X5 := 3 = BINARY FET FLAG
  878.           BX6    X6+X5
  879.           SA6    A1          RESTORE FET TO NORMAL
  880.           MX0    48
  881.           BX6    -X0*X1
  882.           AX6    1           X6 CONTAINS DESIRED STATUS
  883.           EQ     TESTFIL
  884.  WWRITE   TITLE  PRIMARY OUTPUT ROUTINES
  885. **     PRIMARY OUTPUT ROUTINES
  886. *
  887. *  WWRITE WRITES ONE WORD TO A FILE.   IF THIS FILLS THE FILE BUFFER,
  888. *  WWRITE FLUSHES IT.  THE WORD TO BE WRITTEN IN IN X7; X7 STILL CON-
  889. *  TAINS THIS WORD UPON EXIT FROM THIS ROUTINE.
  890.  WWRITE   SPACE  3,10
  891.  WWRITE   PS
  892.           SA7    B6+B7
  893.           SB6    B6+B1
  894.           MI     B6,WWRITE
  895.           SA7    REGIST      REGIST CONTAINS X7
  896.           MX0    42
  897.           SX2    B2
  898.           SX4    B3
  899.           SX6    B4
  900.           SX7    B5
  901.           BX2    -X0*X2      REMOVE SIGN EXTENSIONS FROM B REGISTERS
  902.           BX4    -X0*X4
  903.           BX6    -X0*X6
  904.           BX7    -X0*X7
  905.           LX6    18
  906.           LX7    18
  907.           BX6    X6+X2
  908.           BX7    X7+X4
  909.           SA6    A7+B1       REGIST + 1 CONTAINS B4, B2
  910.           SA7    A6+B1       REGIST + 2 CONTAINS B5, B3
  911.           BX7    X3
  912.           BX6    X5
  913.           SA7    A7+B1       REGIST + 3 CONTAINS X3
  914.           SA6    A7+B1       REGIST + 4 CONTAINS X5
  915.           SA2    OUTFI       X2 = FET ADDRESS
  916.           SA1    X2+B1
  917.           BX6    -X0*X1      X6 = START OF BUFFER
  918.           SX7    B7
  919.           SA7    A1+B1       IN
  920.           SA6    A7+B1       OUT
  921.           WRITE  X2,R
  922.           SA2    OUTFI       X2 := FET ADDRESS
  923.           MX0    42
  924.           SA1    X2+B1
  925.           SA3    A1+B1       IN
  926.           SA4    A3+B1       OUT
  927.           SA5    A4+B1
  928.           BX6    -X0*X1      FIRST
  929.           BX5    -X0*X5      LIMIT
  930.           SA6    A4          SAVE FIRST AS OUT
  931.           SB7    X5          END OF BUFFER
  932.           SB7    B7-B1
  933.           SB6    X6
  934.           IX5    X4-X3
  935.           PL     X5,*+3      X5 > 0 IF THE BUFFER WAS EMPTIED
  936.           SA1    X4          OTHERWISE GET NEXT WORD IN BUFFER
  937.           BX7    X1
  938.           SA7    B6          AND TRANSFER IT TO START OF BUFFER
  939.           SX4    X4+B1       UPDATING SOURCE ADDRESS
  940.           SB6    B6+B1       AND DESTINATION ADDRESS
  941.           SX5    X5+B1       AND WORD COUNT (WHICH SHOULD BECOME 0)
  942.           MI     X5,*-1      THIS SHOULD NEVER HAPPEN, BUT ...
  943.           SB6    B6-B7
  944.           SA4    REGIST      X4 = (X7)
  945.           SA1    A4+B1       X1 = (B4, B2)
  946.           SA2    A1+B1       X2 = (B5, B3)
  947.           SA3    A2+B1       X3 = (X3)
  948.           SA5    A3+B1       X5 = (X5)
  949.           BX7    X4
  950.           SB2    X1
  951.           SB3    X2
  952.           LX1    42
  953.           LX2    42
  954.           SB4    X1
  955.           SB5    X2
  956.           EQ     WWRITE
  957.  SWRITE   SPACE  4,16
  958. ** SWRITE  WRITES  ONE  6-BIT CHARACTER FROM X5 TO THE CURRENT OUTPUT
  959. *  FILE.
  960.  SWRITE   SPACE  3,10
  961.           LX7    6
  962.           BX7    X7+X5       ADD CHAR TO OUTPUT WORD
  963.           SB5    B5+B1
  964.           MI     B5,*+1      B5 < 0 IF THE WORD IS NOT YET FULL
  965.           RJ     WWRITE
  966.  SWRITE   PS
  967.           MI     B5,SWRITE-2 B5 < 0 WHEN THE WORD IS NOT FULL
  968.           SB5    -9          THERE WILL BE 9 MORE CHARACTERS
  969.           BX7    X5          AFTER THIS ONE
  970.           EQ     SWRITE
  971.  SLINE    SPACE  4,17
  972. ** SLINE WRITES AN END-OF-LINE ON AN ASCII OR DISPLAY CODE FILE, ADD-
  973. *  ING A BLANK CHARACTER TO EMPTY LINES  AND TO LINES ENDING WITH ANY
  974. *  CHARACTER WHOSE LAST SIX BITS ARE ZERO.
  975.  SLINE    SPACE  3,10
  976.           LX7    6           LOOP TO ADD ZEROS
  977.           SB5    B5+B1
  978.           MI     B5,*
  979.           RJ     WWRITE      AND WRITE THE WORD
  980.  SLINE    PS
  981.           MX0    54
  982.           BX4    -X0*X7      TEST THE LAST CHAR WRITTEN
  983.           NZ     X4,*+5      IF IT <> 0 THEN JUST ADD EOLN;
  984.           SX4    45          OTHERWISE ADD A BLANK
  985.           MI     B5,*+2      B5 < 0 IF THE BLANK FITS IN THIS WORD
  986.           BX7    X4          THE BLANK IS THE ONLY CHARACTER
  987.           LX7    54          ADD NINE ZEROS
  988.           EQ     SLINE-1     AND WRITE THE WORD
  989.           LX7    6
  990.           BX7    X7+X4       ADD THE BLANK
  991.           SB5    B5+B1
  992.           MI     B5,*+1      B5 < 0 IF BLANK DOES NOT FILL THIS WORD
  993.           RJ     WWRITE
  994.           PL     B5,*+2      B5 >= 0 IF X7 CONTAINS NO CHARACTERS
  995.           LX7    6
  996.           SB5    B5+B1
  997.           MI     B5,SLINE-2  B5 < 0 IF END-OF-LINE FITS IN THIS WORD
  998.           RJ     WWRITE
  999.           BX7    X7-X7       WRITE A WORD OF ZEROS
  1000.           EQ     SLINE-1
  1001.  OSAVE    SPACE  4,18
  1002. ** OSAVE INTERRUPTS WRITING TO A FILE AND SAVES 4 OUTPUT REGISTERS IN
  1003. *  THE FET AND ITS EXTENSION.  AFTER FLUSHING THE WORD BEING WRITTEN,
  1004. *  CALL THIS ROUTINE TO PREPARE TO CLOSE A FILE.  X6 = 0 ON EXIT.
  1005.  OSAVE    SPACE  3,11
  1006.  OSAVE    PS
  1007.           SA1    OUTFI       GET FET ADDRESS
  1008.           SX6    B6+B7
  1009.           SB6    B1+B1
  1010.           SB7    -B6
  1011.           SA6    X1+B6       IN
  1012.           SX6    B5
  1013.           SA6    X1+B7       WORD SHIFT
  1014.           SA7    A6+B1       OUTPUT WORD
  1015.           BX6    X6-X6
  1016.           EQ     OSAVE
  1017.  OREST    SPACE  4,17
  1018. ** OREST PREPARES TO RESUME WRITING TO A FILE BY RESTORING THE OUTPUT
  1019. *  REGISTERS  SAVED BY OSAVE.   ON ENTRY X7 CONTAINS THE FET ADDRESS.
  1020. *  ON EXIT, X6 IS GUARANTEED NOT TO BE ZERO.
  1021.  OREST    SPACE  3,10
  1022.  OREST    PS
  1023.           SA7    OUTFI       SAVE FET ADDRESS AT OUTFI
  1024.           SB6    B1+B1
  1025.           SB7    -B6
  1026.           SA1    X7+B7       SHIFT COUNT
  1027.           SA2    A1+B1       WORD BEING WRITTEN
  1028.           SB5    X1
  1029.           SA1    X7+B6       IN
  1030.           BX7    X2
  1031.           SA4    A1+B6
  1032.           MX0    42
  1033.           BX4    -X0*X4      ADDRESS OF END OF BUFFER
  1034.           SB7    X4
  1035.           IX4    X1-X4       OFFSET
  1036.           SB6    X4+B1
  1037.           SB7    B7-B1
  1038.           SX6    B1          ENSURE THAT X6 <> 0
  1039.           EQ     OREST
  1040.  OUTSTRT  SPACE  4,17
  1041. ** OUTSTRT  PREPARES TO WRITE ON THE FILE OUTPUT; IT ASSUMES THERE IS
  1042. *  NO TEXT ALREADY WRITTEN TO THIS FILE.
  1043.  OUTSTRT  SPACE  3,11
  1044.  OUTSTRT  PS
  1045.           SB7    WBUF-2      END OF OUTPUT BUFFER
  1046.           SB6    1-TBUFL     SIZE OF OUTPUT BUFFER
  1047.           SX7    OUTPUT
  1048.           SA7    OUTFI
  1049.           SX6    B6+B7
  1050.           SA6    OUTPUT+2    IN
  1051.           SA6    A6+B1       OUT
  1052.           BX7    X7-X7       NO CHARACTERS WRITTEN
  1053.           SB5    B0
  1054.           EQ     OUTSTRT
  1055.  NREAD    TITLE  SECONDARY INPUT: TRANSLATION AND UTILITIES
  1056. **     SECONDARY INPUT: TRANSLATION AND UTILITIES
  1057. *
  1058. *  NREAD READS A NUMBER FROM TERMINAL INPUT.  IT IS USED WITH THE SET
  1059. *  COMMAND AND THE OPTIONS DELAY, PACKET-LENGTH, AND RETRY.  ON EXIT,
  1060. *  B5 SHOWS THAT AN END-OF-LINE WAS READ (0) OR A NUMBER (1) OR INPUT
  1061. *  OF SOME OTHER KIND (-1); THE NUMBER IS IN X7.
  1062.  NREAD    SPACE  3,10
  1063.           SB5    -B1         ERROR
  1064.  NREAD    PS
  1065.           BX7    X7-X7
  1066.           SB5    B0
  1067.           RJ     SREAD       GET A CHAR
  1068.           MI     X5,NREAD    X5 < 0 AT EOLN
  1069.           SX4    X5-45       TEST FOR BLANK
  1070.           ZR     X4,*-2      IGNORE LEADING BLANKS
  1071.  +        SX5    X5-1R0
  1072.           MI     X5,NREAD-1  ALPHABETIC INPUT
  1073.           SX4    X5-10
  1074.           PL     X4,NREAD-1  NON-DIGIT
  1075.           SB5    B1          SET DATA FLAG; SOMETHING WAS READ
  1076.           LX4    B1,X7       X4 := X7 * 2
  1077.           LX7    3           X7 := X7 * 8
  1078.           IX7    X7+X4
  1079.           IX7    X7+X5
  1080.           RJ     SREAD       GET NEXT CHAR
  1081.           MI     X5,NREAD    EOLN
  1082.           SX4    X5-45       TEST FOR BLANK
  1083.           NZ     X4,NREAD+4  NO BLANK
  1084.           EQ     NREAD       STOP AT BLANK
  1085.  DREAD    SPACE  4,15
  1086. ** DREAD  READS FROM A DISPLAY CODE FILE BUT PRODUCES AN ASCII VALUE.
  1087.  DREAD    SPACE  3,10
  1088.  DREAD    PS
  1089.           RJ     SREAD
  1090.           MI     X5,DREAD    EOLN
  1091.           NZ     X5,*+2
  1092.           IFEQ   1R:,0
  1093.           SX5    58          COLON
  1094.           ELSE   2
  1095.           SX5    B1
  1096.           LX5    5           BLANK
  1097.           EQ     DREAD
  1098.           SX5    X5-27       TEST ALPHABETIC
  1099.           PL     X5,*+2      X5 > 0 UNLESS ALPHABETIC
  1100.           SX5    X5+91
  1101.           EQ     DREAD
  1102.           SX5    X5-10       TEST FOR DIGITS
  1103.           PL     X5,*+2      X5 > 0 FOR SYMBOLS WHICH ARE NOT DIGITS
  1104.           SX5    X5+58
  1105.           EQ     DREAD
  1106.           SA5    X5+DITAB    USE TABLE TO CONVERT
  1107.           EQ     DREAD
  1108.  AREAD    SPACE  4,15
  1109. ** AREAD READS FROM A 6/12 ASCII FILE AND YIELDS STANDARD ASCII CODE.
  1110.  AREAD    SPACE  3,10
  1111.           RJ     SREAD
  1112.           MI     X5,AREAD    IGNORE @ + EOLN
  1113.           SX4    X5-8
  1114.           PL     X4,AREAD1-1 WHEN X4 > 0, @ + X4 IS UNPRINTABLE
  1115.           SA5    X5+ATTAB
  1116.  AREAD    PS
  1117.           RJ     SREAD       GET NEXT CHAR
  1118.           MI     X5,AREAD    X5 < 0 AT EOLN, EOR, EOF
  1119.           SX4    X5-62       TEST FOR UP-ARROW
  1120.           ZR     X4,AREAD1   PROCESS THEM AT AREAD1
  1121.           SX4    X4+B1
  1122.           SX4    X4+B1       TEST FOR @
  1123.           ZR     X4,AREAD-3  TEST @ ELSEWHERE
  1124.           NZ     X5,*+2
  1125.           IFEQ   1R:,0
  1126.           SX5    58          COLON
  1127.           ELSE   2
  1128.           SX5    B1
  1129.           LX5    5           BLANK SPACE
  1130.           EQ     AREAD
  1131.           SX5    X5-27       TEST FOR UPPER CASE LETTERS
  1132.           PL     X5,*+2
  1133.           SX5    X5+91       CONVERT LETTERS
  1134.           EQ     AREAD
  1135.           SX5    X5-10       TEST FOR DIGITS
  1136.           PL     X5,*+2
  1137.           SX5    X5+58       CONVERT DIGITS
  1138.           EQ     AREAD
  1139.           SA5    X5+DITAB    CONVERT OTHER SYMBOLS
  1140.           EQ     AREAD
  1141.           SX5    B1
  1142.           LX5    5           BLANK
  1143.           EQ     AREAD
  1144.  AREAD1   RJ     SREAD       GET NEXT CHAR
  1145.           MI     X5,AREAD    IGNORE ^ + EOLN
  1146.           ZR     X5,AREAD1-1 UNDEFINED COMBINATION
  1147.           SX5    X5-32
  1148.           PL     X5,AREAD    UNPRINTABLE CHARACTER
  1149.           SX5    X5+128
  1150.           EQ     AREAD
  1151.  EREAD    SPACE  4,15
  1152. ** EREAD READS ASCII CODE FROM AN ASCII8 FILE.
  1153.  EREAD    SPACE  3,10
  1154.           RJ     SREAD       GET NEXT CHAR
  1155.  EREAD    PS
  1156.           RJ     SREAD       GET NEXT CHAR
  1157.           MI     X5,EREAD    EOLN
  1158.           ZR     X5,EREAD-1
  1159.           MX0    58
  1160.           BX4    X0*X5       TEST FOR LEGITIMATE ASCII8 CHAR
  1161.           ZR     X4,*+3      X4 = 0 IF OK
  1162.           PL     B2,EREAD-1  GET EOLN NEXT
  1163.           RJ     SREAD
  1164.           SX5    B1
  1165.           LX5    5           BLANK
  1166.           EQ     EREAD
  1167.           MX0    59
  1168.           BX5    -X0*X5      MASK OFF EIGHTH BIT
  1169.           ZR     X5,EREAD-1
  1170.           PL     B2,*+2      ASSUME THERE SHOULD HAVE BEEN A BLANK
  1171.           RJ     SREAD
  1172.           SX5    X5+64       RESTORE MISSING BIT
  1173.           EQ     EREAD
  1174.           LX5    6           X5 := 64
  1175.           EQ     EREAD
  1176.  SETCHAR  SPACE  4,16
  1177. ** SETCHAR IS USED BY SET WITH OPTIONS BIT-PREFIX, QUOTE-CHAR AND RE-
  1178. *  PEAT-CHAR.
  1179.  SETCHAR  SPACE  3,10
  1180.           MX7    58          RETURN ERROR VALUE
  1181.  SETCHAR  PS
  1182.           MI     X5,*-1      END-OF-LINE
  1183.           RJ     AREAD
  1184.           SX4    X5-32
  1185.           MI     X4,*-3      X4 < 0 FOR UNPRINTABLE CHARACTERS
  1186.           ZR     X4,*-2      X4 - 0 FOR BLANK SPACE
  1187.           MI     B2,*-4      B2 < 0 WHEN MORE INPUT FOLLOWS
  1188.           SX4    X5-63       PREPARE FOR LEGITIMACY TEST
  1189.           MI     X4,*+3      CONSIDER VALUES < 63 ELSEWHERE
  1190.           SX4    X5-96
  1191.           MI     X4,*-6      X4 < 0 FOR '?' AND CTRL-POSSIBLES
  1192.           MX0    53
  1193.           BX4    -X0-X5
  1194.           ZR     X4,*-7      X4 = 0 FOR DEL
  1195.           BX7    X5
  1196.           EQ     SETCHAR
  1197.  SETCTRL  SPACE  4,15
  1198. ** SETCTRL IS USED TO SET ESCAPE AND PACKET-MARKER.
  1199.  SETCTRL  SPACE  3,10
  1200.           MX7    40
  1201.  SETCTRL  PS
  1202.           MI     X5,*-1      END-OF-LINE
  1203.           RJ     AREAD
  1204.           SX4    X5-32
  1205.           MI     X4,*-3      LITERAL CONTROL CHARACTERS NOT ALLOWED
  1206.           ZR     X4,*-2      LEADING BLANKS IGNORED
  1207.           MI     B2,*-4      TWO CHARACTERS NOT ALLOWED
  1208.           SX7    X5-64
  1209.           MI     X7,*-4      CHARS LESS THAN 64 NOT ALLOWED
  1210.           SX5    X7-32
  1211.           MI     X5,*+3      NEITHER ARE CHARS GREATER THAN 126
  1212.           ZR     X5,*-7
  1213.           BX7    X5
  1214.           SX5    X5-27       EXCEPT FOR LOWER CASE LETTERS
  1215.           PL     X5,*-8
  1216.           SB5    X7
  1217.           SX5    B1
  1218.           SA4    ILLEGIT     TEST FOR CHARS WITH SPECIAL MEANING
  1219.           LX5    B5,X5
  1220.           BX5    X4*X5
  1221.           ZR     X5,SETCTRL  X5 = 0 IF THE CHARACTER READ IS GOOD
  1222.           EQ     SETCTRL-1
  1223.  AWRITE   TITLE  SECONDARY OUTPUT: TRANSLATION AND UTILITIES
  1224. **     SECONDARY OUTPUT: TRANSLATION AND UTILITIES
  1225. *
  1226. *  AWRITE WRITES AN ASCII CODE TO A 6/12 FILE.
  1227.  AWRITE   SPACE  3,10
  1228.           RJ     SWRITE
  1229.  AWRITE   PS
  1230.           MX0    53
  1231.           BX5    -X0*X5      MASK OFF ANY EIGHTH BITS SET
  1232.           SX4    X5-13
  1233.           NZ     X4,*+2      TEST FOR CARRIAGE RETURN
  1234.           RJ     SLINE       IN WHICH CASE, WRITE END-OF-LINE
  1235.           EQ     AWRITE
  1236.           SX5    X5-32
  1237.           PL     X5,*+2      IF X5 < 0 THE CHAR IS NOT PRINTABLE
  1238.           SX5    X5+91       AND NEEDS A CODE AFTER UP-ARROW
  1239.           EQ     AWRITE1
  1240.           SX5    X5-1
  1241.           PL     X5,*+2      X5 >= 0 IF CHAR IS NOT BLANK
  1242.           SX5    45
  1243.           EQ     AWRITE-1
  1244.           SX4    X5-15       X4 IS < 0 FOR SOME NONALPHANUMERIC
  1245.           IFEQ   1R:,0
  1246.           MI     X4,AWRITE1-1
  1247.           ELSE   1
  1248.           MI     X4,AWRITE1-4
  1249.           SX4    X4-10
  1250.           PL     X4,*+2      X4 < 0 FOR DIGITS
  1251.           SX5    X5+12       WHICH WE CONVERT TO DISPLAY CODE
  1252.           EQ     AWRITE-1
  1253.           IFEQ   1R:,0,1
  1254.           ZR     X4,AWRITE1-3  COLON
  1255.           SX5    X5-10
  1256.           SX4    X5-22
  1257.           PL     X4,*+4      X4 < 0 FOR SOME NONALPHANUMERIC
  1258.           SX4    X4+B1
  1259.           MI     X4,AWRITE1-1  X4 = 0 FOR AT SYMBOL
  1260.           SX5    60
  1261.           RJ     SWRITE
  1262.           SX5    B1
  1263.           EQ     AWRITE-1
  1264.           SX4    X4-26
  1265.           PL     X4,*+2      X4 < 0 FOR UPPER CASE LETTERS
  1266.           SX5    X4+27
  1267.           EQ     AWRITE-1
  1268.           SX5    X5-26
  1269.           SX4    X5-28
  1270.           PL     X4,AWRITE1  X4 > 0 FOR CHARACTERS WITH UP-ARROW
  1271.           SX4    X4+B1
  1272.           MI     X4,*+3      X4 = 0 FOR GRAVE ACCENT
  1273.           SX5    60
  1274.           RJ     SWRITE
  1275.           SX5    7
  1276.           EQ     AWRITE-1
  1277.           SX4    X4+B1
  1278.           SX4    X4+B1
  1279.           NZ     X4,AWRITE1-1  X4 = 0 FOR UP-ARROW SYMBOL
  1280.           SX5    60
  1281.           RJ     SWRITE
  1282.           SX5    B1+B1
  1283.           EQ     AWRITE-1
  1284.           IFNE   1R:,0,2
  1285.           SX4    X5-5
  1286.           NZ     X4,*+3      X4 = 0 FOR PERCENT SYMBOL
  1287.           SX5    60
  1288.           RJ     SWRITE
  1289.           SX5    B1
  1290.           LX5    2
  1291.           EQ     AWRITE-1
  1292.           SA5    X5+ASCTAB   LOOK UP VALUE IN TABLE
  1293.           EQ     AWRITE-1
  1294.  AWRITE1  MI     B5,*+2      B5 < 0 IF X7 IS NOT YET FULL
  1295.           SX7    X5+3941
  1296.           SB5    -8          EIGHT CHARACTERS TO GO IN X7
  1297.           EQ     AWRITE
  1298.           SX4    62          ADD UP-ARROW TO X7
  1299.           LX7    6
  1300.           BX7    X7+X4
  1301.           SB5    B5+B1
  1302.           SX5    X5-27       CONVERT X5 TO HOLD APPROPRIATE CODE
  1303.           MI     B5,AWRITE-1 B5 < 0 IF X7 IS NOT YET FULL
  1304.           RJ     WWRITE
  1305.           BX7    X5
  1306.           SB5    -9          NINE CHARS TO GO IN X7
  1307.           EQ     AWRITE
  1308.  ELINE    SPACE  4,17
  1309. ** ELINE   WRITES AN END-OF-LINE ON AN ASCII8 FILE.   IT ADDS A BLANK
  1310. *  SPACE TO EMPTY LINES  AND TO LINES ENDING WITH ANY CHARACTER WHOSE
  1311. *  LAST SIX BITS ARE ZERO (NUL AND AT-SYMBOL).
  1312.  ELINE    SPACE  3,10
  1313.           LX7    12          FILL WORD WITH ZEROS
  1314.           SB5    B5+B1
  1315.           MI     B5,*
  1316.           RJ     WWRITE      THEN WRITE IT
  1317.  ELINE    PS
  1318.           MX0    54
  1319.           BX4    -X0*X7
  1320.           NZ     X4,*+5      IF X4 = 0 A BLANK MUST BE ADDED
  1321.           SX4    B1
  1322.           LX4    53          X4 CONTAINS LEFT JUSTIFIED ASCII BLANK
  1323.           MI     B5,*+2      B5 < 0 IF THIS WORD IS NOT FULL
  1324.           BX7    X4
  1325.           EQ     ELINE-1
  1326.           BX7    X7+X4       ADD THE BLANK TO X7
  1327.           LX7    12
  1328.           SB5    B5+B1
  1329.           MI     B5,ELINE-2  B5 < 0 IF EOLN FITS IN THIS WORD
  1330.           RJ     WWRITE
  1331.           MI     B5,ELINE-2
  1332.           BX7    X7-X7       OTHERWISE WRITE A WORD OF ZEROS
  1333.           EQ     ELINE-1
  1334.  ZWRITE   SPACE  4,16
  1335. ** ZWRITE COPIES A (DISPLAY OR 6/12 CODE) TEXT WHICH IS TERMINATED BY
  1336. *  SIX ZERO BITS.  ON ENTRY B3 MUST CONTAIN THE ADDRESS OF THE TEXT.
  1337.  ZWRITE   SPACE  3,10
  1338.  ZWRITE   PS
  1339.           SA3    B3          GET 1ST WORD OF TEXT
  1340.           SB3    B3+B1
  1341.           SB2    -10         SHIFT COUNT = 10
  1342.           MX0    54
  1343.           LX3    6
  1344.           BX5    -X0*X3      X5 := NEXT CHAR OF TEXT
  1345.           SB2    B2+B1
  1346.           ZR     X5,ZWRITE   X5 = 0 WHEN THE TEXT IS FINISHED
  1347.           RJ     SWRITE
  1348.           MI     B2,*-2      B2 < 0 WHEN THE NEXT CHAR IS IN X3
  1349.           EQ     *-3         OTHERWISE GET THE NEXT WORD
  1350.  NWRITE   SPACE  4,17
  1351. ** NWRITE  CONVERTS A NUMBER TO DISPLAY CODE AND WRITES IT TO A FILE.
  1352. *  ON INPUT THE NUMBER MUST BE IN X3 AND THE FILE PARAMETERS IN OUTFI
  1353. *  AND THE REGISTERS B5, B6, B7, AND X7.
  1354.  NWRITE   SPACE  3,10
  1355.           MX0    54
  1356.           LX3    6
  1357.           BX5    -X0*X3      GET NEXT CHARACTER
  1358.           BX3    X3-X5       AND REMOVE IT FROM X3
  1359.           RJ     SWRITE
  1360.           NZ     X3,*-2
  1361.           RJ     SLINE       WRITE END-OF-LINE
  1362.  NWRITE   PS
  1363.           SA0    B2          SAVE B2 (USED BY NCONCV)
  1364.           BX5    X5-X5       AND MAKE X5 := 0
  1365.           RJ     NCONV       CONVERT THE NUMBER TO DISPLAY CODE
  1366.           SB2    A0          RESTORE B2
  1367.           BX3    X5
  1368.           EQ     NWRITE-3
  1369.  XWRITE   SPACE  4,12
  1370. ** XWRITE WRITES A SPECIFIED NUMBER OF BLANKS TO A FILE.  ON ENTRY B2
  1371. *  MUST CONTAIN 1 LESS THAN THE NUMBER OF BLANKS DESIRED.
  1372.  XWRITE   SPACE  3,6
  1373.           RJ     SWRITE      WRITE ONE BLANK
  1374.           SB2    B2-B1       DECREMENT COUNT
  1375.           PL     B2,*-1      UNTIL DONE
  1376.  XWRITE   PS
  1377.           SX5    45          DISPLAY CODE BLANK
  1378.           EQ     XWRITE-2
  1379.  ZLINE    SPACE  4,10
  1380. ** ZLINE  WRITES AN END-OF-LINE,  THEN THE ZERO-TERMINATED TEXT WHOSE
  1381. *  ADDRESS IS IN B3 ON ENTRY.
  1382.  ZLINE    SPACE  3,4
  1383.  ZLINE    PS
  1384.           RJ     SLINE
  1385.           RJ     ZWRITE
  1386.           EQ     ZLINE
  1387.  NZLINE   SPACE  4,10
  1388. ** NZLINE WRITES THE NUMBER CONTAINED IN X3, THEN AN END-OF-LINE, AND
  1389. *  THEN THE TEXT WHOSE ADDRESS IS CONTAINED IN B3 ON ENTRY.
  1390.  NZLINE   SPACE  3,4
  1391.  NZLINE   PS
  1392.           RJ     NWRITE      THIS WRITES BOTH THE NUMBER AND THE EOLN
  1393.           RJ     ZWRITE      PRINT THE TEXT
  1394.           EQ     NZLINE
  1395.  BCTRLW   SPACE  4,18
  1396. ** BCTRLW IS DESIGNED TO REPORT THAT SOMETHING IS OR BECOMES  CTRL-X,
  1397. *  WHERE 'X' IS AN ASCII CODE LETTER.  FIRST IT WRITES THE TEXT WHOSE
  1398. *  ADDRESS IS IN B3, THEN 14 SPACES, THEN THE TEXT 'CTRL-',  THEN THE
  1399. *  LETTER WHOSE ADDRESS IS IN B4.
  1400.  BCTRLW   SPACE  3,10
  1401.           SX5    X5+64       CONVERT TO PRINTABLE CHARACTER
  1402.           RJ     AWRITE
  1403.  BCTRLW   PS
  1404.           RJ     ZWRITE      PRINT THE TEXT
  1405.           SB2    13
  1406.           RJ     XWRITE      WRITE BLANKS
  1407.           SB3    CTRLHYP
  1408.           RJ     ZWRITE      WRITE 'CTRL-'
  1409.           SA5    B4
  1410.           EQ     BCTRLW-1
  1411.  WSTATS   SPACE  4,16
  1412. ** WSTATS  WRITES TRANSFER STATISTICS REQUIRED BY THE STATUS COMMAND;
  1413. *  IT ALSO RECORDS PACKET TRAFFIC IN THE LOG AT END-OF-FILE.
  1414.  WSTATS   SPACE  3,10
  1415.  WSTATS   PS
  1416.           SB3    TRANSFM+4
  1417.           RJ     ZLINE
  1418.           SB2    9
  1419.           RJ     XWRITE
  1420.           SA3    PSENT       NUMBER OF PACKETS SENT
  1421.           RJ     NZLINE
  1422.           SB2    5
  1423.           RJ     XWRITE
  1424.           SA3    PRECD       NUMBER OF PACKETS RECEIVED
  1425.           RJ     NZLINE
  1426.           SB2    10
  1427.           RJ     XWRITE
  1428.           SA3    PKERRS      NUMBER OF INPUT ERRORS
  1429.           RJ     NZLINE
  1430.           SB2    10
  1431.           RJ     XWRITE
  1432.           SA3    RETRYT      NUMBER OF RETRIES
  1433.           RJ     NWRITE
  1434.           RJ     SLINE
  1435.           EQ     WSTATS
  1436.  WFILTYP  SPACE  4,16
  1437. ** WFILTYP  WRITES THE NAME OF THE CURRENT FILE TYPE AND END-OF-LINE.
  1438. *  THE NAME OF THE FILE TYPE FOLLOWS A BLANK SPACE.
  1439.  WFILTYP  SPACE  3,10
  1440.           SB3    X4+FTLIST+4
  1441.           RJ     ZWRITE      WRITE NAME OF FILE TYPE
  1442.           RJ     SLINE       WRITE EOLN
  1443.  WFILTYP  PS
  1444.           SX5    45
  1445.           RJ     SWRITE      WRITE BLANK
  1446.           SA4    FILETYP+1
  1447.           MX0    58
  1448.           BX0    -X0*X4
  1449.           ZR     X0,*+1
  1450.           SX4    X4+B1
  1451.           LX4    2
  1452.           AX4    1
  1453.           EQ     *-6
  1454.  LOGLIN   SPACE  4,18
  1455. ** LOGLIN  STARTS A NEW SECTION OF THE LOG.  IT DOES NOT PRESERVE ANY
  1456. *  REGISTER CONTENTS EXISTING AT ENTRY.  IT WRITES AN EOLN IF THE LOG
  1457. *  DID NOT HAVE ONE AFTER THE LAST LINE, THE TIME, AND A SPACE.   THE
  1458. *  OUTPUT REGISTERS ARE SET UP ON EXIT FOR WRITING TO THE LOG.
  1459.  LOGLIN   SPACE  3,10
  1460.  LOGLIN   PS
  1461.           CLOCK  TIMWORD
  1462.           SX7    ZZZKLOG
  1463.           RJ     OREST       PREPARE TO WRITE ON LOG
  1464.           MI     B5,*+1      OREST RETURNS WITH X6 <> 0
  1465.           MX0    48
  1466.           BX6    -X0*X7
  1467.           ZR     X6,*+1      X6 = 0 AFTER AN END-OF-LINE
  1468.           RJ     SLINE       OTHERWISE WRITE ONE
  1469.           SA3    TIMWORD
  1470.           SB5    -9
  1471.           BX7    X3
  1472.           RJ     WWRITE      WRITE THE TIME
  1473.           SX7    55B         AND A BLANK SPACE
  1474.           EQ     LOGLIN
  1475.  LOGSET   SPACE  4,13
  1476. ** LOGSET  STARTS TO LOG A SET COMMAND; IT STARTS A NEW LOG ENTRY AND
  1477. *  WRITES THE WORD 'SET' FOLLOWED BY A BLANK SPACE.
  1478.  LOGSET   SPACE  3,7
  1479.  LOGSET   PS
  1480.           RJ     LOGLIN      SET UP LOG FOR WRITING
  1481.           SB3    CMDLIST+9   SET
  1482.           RJ     ZWRITE
  1483.           SX5    45          BLANK
  1484.           RJ     SWRITE
  1485.           EQ     LOGSET
  1486.  UNIQUE   SPACE  4,17
  1487. ** UNIQUE ENSURES THAT NO FILE HAS A GIVEN NAME (IN X6 ON ENTRY);  IF
  1488. *  THERE IS SUCH A FILE, THE NAME IS REPLACED BY ANOTHER.    ANY NAME
  1489. *  CHANGES ARE LOGGED.  THE PROCESS CREATES A FILE ENVIRONMENT TABLE.
  1490.  UNIQUE   SPACE  3,10
  1491.  UNIQUE   PS
  1492.           SX6    3           BINARY FILE CODE (ALL FILES ARE BINARY)
  1493.           SA1    DUMMY+1
  1494.           SA2    A1+B1
  1495.           BX6    X6+X3       FILE NAME + TYPE
  1496.           SX5    WBUF        ADDRESS OF BUFFER ('IN' AND 'OUT')
  1497.           BX7    X1
  1498.           SA6    FILE
  1499.           SA7    A6+B1
  1500.           BX7    X5
  1501.           SA7    A7+B1
  1502.           SA7    A7+B1
  1503.           BX7    X2
  1504.           SA7    A7+B1       LAST (5TH) WORD OF FET
  1505.           SX5    3RZZZ
  1506.           LX5    42
  1507.           BX5    X5-X6       TEST FOR AN ILLEGAL FILE NAME
  1508.           AX5    42
  1509.           ZR     X5,*+2      X5 = 0 IF THE NAME BEGINS WITH ZZZ
  1510.           SX6    FILE
  1511.           RJ     TESTFIL     TEST FOR EXISTENCE OF FILE
  1512.           ZR     X6,*+3      X6 IS 0 IF THE FILE DOES NOT EXIST
  1513.           RJ     DEFFILE     OTHERWISE CREATE A NEW FILE NAME
  1514.           SA6    FILE
  1515.           SA2    A3
  1516.           SX6    X2+B1       AND INCREMENT THE DEFAULT FILE NUMBER
  1517.           SA6    A2
  1518.           EQ     *-3
  1519.           SA1    FILE
  1520.           SA2    FILNAM
  1521.           BX2    X2-X1       HAS THE NAME BEEN CHANGED?
  1522.           AX2    18
  1523.           ZR     X2,UNIQUE   X2 = 0 IF THE NAME HAS NOT BEEN CHANGED
  1524.           BX6    X1
  1525.           SA6    A2
  1526.           RJ     LOGLIN
  1527.           SB3    FNCHGM      NAME OF FILE CHANGED TO
  1528.           RJ     ZWRITE
  1529.           SB3    FILE
  1530.           RJ     ZWRITE      FILENAME
  1531.           RJ     OSAVE
  1532.           EQ     UNIQUE
  1533.  MAINPRG  TITLE  MAINPRG -- MAIN COMMAND PROCESSOR
  1534. ** THE MAIN COMMAND PROCESSOR, MAINPRG, HAS TWO ENTRY POINTS: MAINPRG
  1535. *  ITSELF IS USED WHEN THE OUTPUT BUFFER CONTAINS DATA AND THE OUTPUT
  1536. *  REGISTERS ARE SET;  MAINPRG-1 IS USED WHEN NEITHER OF THESE CONDI-
  1537. *  TIONS IS TRUE.
  1538.  MAINPRG  SPACE  3,10
  1539.           RJ     OUTSTRT
  1540.  MAINPRG  SB3    KPROMPT
  1541.           RJ     ZWRITE      WRITE THE CYBER KERMIT PROMPT
  1542.           LX7    12
  1543.           SX6    B1          AND PREVENT CARRIAGE RETURN
  1544.           BX7    X7+X6
  1545.           SB5    B5+B1
  1546.           SB5    B5+B1
  1547.           RJ     SLINE
  1548.           RJ     OSAVE       UPDATE OUTPUT FET FOR AUTOMATIC FLUSHING
  1549.           SB7    COMTAB      PREPARE TO READ ONE OF THE MAIN COMMANDS
  1550.           RJ     INSTART     AND FILL THE INPUT BUFFER
  1551.  CREAD    SPACE  4,22
  1552. ** CREAD UNITES THE TWO COMMAND PROCESSORS.  ONE READS TERMINAL INPUT
  1553. *  AND ONE READS COMMANDS SENT IN PACKETS; KMODE (ARE WE A SERVER) IS
  1554. *  THE DISTINGUISHING FLAG.  BOTH PROCESSORS KEEP THE INPUT REGISTERS
  1555. *  FOR GETTING DATA FROM THEIR SOURCE.  ON ENTRY B7 HOLDS THE ADDRESS
  1556. *  OF THE WORD BEFORE THE FIRST ACCEPTABLE COMMAND IN A TABLE.  AMBI-
  1557. *  GUOUS COMMANDS REQUIRE AN ENTRY FOR AN AMBIGUOUS STRING; OTHERWISE
  1558. *  THE FIRST WILL BE CHOSEN.  COMMANDS MAY HAVE AT MOST NINE LETTERS.
  1559. *  SELECTING A COMMAND CAUSES A JUMP TO A LOCATION IN COMSEL.
  1560.  CREAD    SPACE  3,10
  1561.  CREAD    SB6    B7+COMDIFF  WHERE TO GO
  1562.           SB5    -9          MAX CHARS TESTED IN A COMMAND
  1563.           BX7    X7-X7
  1564.           SA1    KMODE       ARE WE A SERVER
  1565.           ZR     X1,CREAD1   IF NOT, READ
  1566.           EQ     CREAD3
  1567.  CREAD5   SX4    X5-32       TEST FOR BLANK
  1568.           NZ     X4,*+2
  1569.           NZ     X7,CREAD1+3  A BLANK TERMINATES A COMMAND
  1570.           EQ     CREAD3      UNLESS NOTHING WAS READ
  1571.           SX4    X5-45       TEST FOR HYPHEN
  1572.           NZ     X4,*+2
  1573.           NZ     X7,CREAD3   A HYPHEN IS IGNORED
  1574.           JP     B6          UNLESS NOTHING WAS READ
  1575.           SX4    X5-44       TEST FOR COMMAS
  1576.           ZR     X4,CREAD1+2  COMMA, LIKE EOLN, ALWAYS TERMINATES
  1577.           SX4    X5-58       TEST FOR DIGITS
  1578.           MI     X4,*+6
  1579.           SX5    X5-64
  1580.           SX4    X5-27
  1581.           MI     X4,*+1
  1582.           SX5    X5-32       CHANGE LOWER CASE TO UPPER CASE
  1583.           MI     X5,*+2
  1584.           ZR     X5,*+2
  1585.           SX4    X5-27       TEST FOR LETTERS
  1586.           MI     X4,*+4
  1587.           JP     B6
  1588.           SX4    X4+10
  1589.           MI     X4,*-1
  1590.           SX5    X5-21       CONVERT DIGITS
  1591.  +        PL     B5,CREAD3   IGNORE CHARS BEYOND 9
  1592.           LX7    6
  1593.           BX7    X7+X5
  1594.           SB5    B5+B1
  1595.  CREAD3   RJ     UNPACK      GET THE NEXT CHARACTER FROM THE PACKET
  1596.           MX0    54
  1597.           PL     X5,CREAD5
  1598.           NZ     X7,CREAD1+3
  1599.           JP     B6
  1600.  CREAD4   SX4    X5-45       TEST FOR BLANK
  1601.           NZ     X4,*+2
  1602.           NZ     X7,CREAD1+3  A BLANK TERMINATES A COMMAND
  1603.           EQ     CREAD1      PROVIDED SOMETHING WAS READ
  1604.           SX4    X5-1R-      TEST FOR A HYPHEN
  1605.           NZ     X4,*+2
  1606.           NZ     X7,CREAD1   IGNORE HYPHENS IN A COMMAND
  1607.           JP     B6          BUT DO NOT ALLOW ONE BEFORE IT
  1608.           SX4    X5-1R,      TEST FOR A COMMA
  1609.           ZR     X4,CREAD1+2  COMMA, LIKE EOLN, ALWAYS TERMINATES
  1610.           SX4    X5-1R^      TEST FOR UP-ARROW
  1611.           NZ     X4,*+4
  1612.           RJ     SREAD
  1613.           SX4    X5-27       TEST FOR ALPHABETIC
  1614.           MI     X4,*+3      ERROR UNLESS ALPHABETIC
  1615.           JP     B6
  1616.           SX4    X5-37       TEST FOR ALPHANUMERIC
  1617.           PL     X4,*-1      ERROR IF NOT
  1618.           PL     B5,CREAD1   IGNORE LETTERS BEYOND 9
  1619.           LX7    6
  1620.           BX7    X7+X5       ADD THE LETTER TO THE WORD
  1621.           SB5    B5+B1
  1622.  CREAD1   RJ     SREAD       READ THE NEXT SIX-BIT CHARACTER
  1623.           MX0    54
  1624.           PL     X5,CREAD4   NOT EOLN
  1625.           NZ     X7,*+1      X7 = 0 IF NO COMMAND WAS READ
  1626.           JP     B6
  1627.           LX7    6
  1628.           SB5    B5+B1
  1629.           LE     B5,B0,*     LEFT-JUSTIFY COMMAND IN X7
  1630.           SA1    B5+B7       GET WORD FROM TABLE
  1631.           ZR     X1,CREAD1-4  X1 = 0 WHEN NO COMMAND HAS MATCHED
  1632.           BX6    X7          MAKE AN EXTRA COPY OF THE COMMAND
  1633.           LX6    6
  1634.           BX4    -X0*X6      GET NEXT CHAR FROM COMMAND
  1635.           NZ     X4,*+2      IF THERE IS NONE, MATCH IS FOUND
  1636.           SB6    B6+B5
  1637.           JP     B6
  1638.           LX1    6
  1639.           BX2    -X0*X1      GET NEXT CHAR FROM TABLE
  1640.           BX2    X2-X4       AND COMPARE IT WITH X4
  1641.           ZR     X2,*-3      KEEP GOING IF THEY MATCH
  1642.           SB5    B5+B1       OTHERWISE TRY THE NEXT TABLE ENTRY
  1643.           EQ     *-5
  1644.  LOGPACK  TITLE  PACKET HANDLING ROUTINES
  1645. ** LOGPACK IS USED BY THE DEBUG FACILITY TO LOG PACKET DATA.  B4 CON-
  1646. *  TAINS ON ENTRY THE ADDRESS OF THE FIRST WORD IN THE PACKET  (AFTER
  1647. *  THE PACKET SYNC-MARKER).  THE END OF THE DATA IS MARKED BY A NEGA-
  1648. *  TIVE CHARACTER.
  1649.  LOGPACK  SPACE  3,10
  1650.           RJ     AWRITE      WRITE THE CHARACTER IN THE LOG
  1651.           SB4    B4+B1
  1652.           SA5    B4          AND GET THE NEXT CHARACTER
  1653.           PL     X5,*-1
  1654.           SB3    EOPMSG      MARK POSITION OF END-OF-PACKET
  1655.           RJ     ZWRITE
  1656.           SB4    B4-B1
  1657.           RJ     SLINE
  1658.           SX6    -B1
  1659.           SA6    B4          CANCEL CHECKSUM CHARACTER
  1660.           RJ     SLINE
  1661.           RJ     OSAVE
  1662.  LOGPACK  PS
  1663.           SA5    B4
  1664.           PL     X5,*-7      X5 <= 0 WHEN NO DATA FOLLOWS SYNCM
  1665.           SB3    NOTHIGM
  1666.           RJ     ZWRITE
  1667.           SB4    B4+B1
  1668.           EQ     LOGPACK-3
  1669.  SENDPACK SPACE  4,18                                               X
  1670. ** SENDPACK IS USED TO SEND A PACKET.   IT SETS UP OUTPUT, WRITES ANY
  1671. *  PADDING CHARACTERS REQUIRED BY THE PROTOCOL,  SENDS A SYNC MARKER,
  1672. *  COMPUTES AND SENDS A CHECKSUM CHARACTER, SENDS ANY REQUIRED TERMI-
  1673. *  NATION CHARACTER, AND LOGS THE PACKET IF DEBUG IS SET ON.
  1674.  SENDPACK SPACE  3,10
  1675.  SENDPACK PS
  1676.           SA4    NPAD        WRITE PADDING CHARACTERS?
  1677.           RJ     OUTSTRT
  1678.           ZR     X4,*+3      X4 = 0 IF THERE ARE NO PAD CHARACTERS
  1679.           SA3    A4+B1
  1680.           SB2    X4          USE B2 TO COUNT THEN
  1681.           BX5    X3
  1682.           RJ     AWRITE      WRITE A PAD CHARACTER
  1683.           SB2    B2-B1
  1684.           NZ     B2,*-1      B2 <> 0 IF WE NEED MORE PAD CHARS
  1685.           SA5    SYNCM
  1686.           RJ     AWRITE      WRITE THE PACKET SYNCHRONISATION MARKER
  1687.           SA5    CBUF
  1688.           SB4    X5-32
  1689.           SB3    B1-B4
  1690.           SB2    X5
  1691.           SB4    A5+B4
  1692.           RJ     AWRITE      WRITE THE FIRST CHARACTER
  1693.           SA5    B3+B4       GET A CHARACTER
  1694.           SB2    X5+B2       UPDATE THE CKECKSUM
  1695.           RJ     AWRITE      WRITE THE CHARACTER
  1696.           SB3    B3+B1       INCREMENT THE OFFSET
  1697.           MI     B3,*-1
  1698.           MX0    52          COMPUTE THE CHECKSUM
  1699.           SX5    B2
  1700.           BX5    -X0*X5
  1701.           BX4    X5
  1702.           AX4    6
  1703.           IX6    X5+X4
  1704.           MX1    54
  1705.           BX6    -X1*X6
  1706.           SX4    B1
  1707.           LX4    5
  1708.           IX6    X6+X4       AND THE CHECKSUM CHARACTER
  1709.           SA6    B7
  1710.           BX5    X6
  1711.           SA6    B4
  1712.           SX6    -B1
  1713.           SA6    A6+B1       ENSURE THAT BUFFER CONTENTS END WITH -1
  1714.           RJ     AWRITE      WRITE THE CHECKSUM
  1715.           SA1    PSENT
  1716.           SX6    X1+B1
  1717.           SA6    A1          INCREMENT COUNT OF PACKETS SENT
  1718.           SA5    EOLN
  1719.           MI     X5,*+2
  1720.           RJ     AWRITE      SEND HIS EOLN IF NECESSARY
  1721.           RJ     SLINE
  1722.           SA3    DEBUGW
  1723.           RJ     OSAVE
  1724.           ZR     X3,SENDPACK  X3 = 0 IF THE PACKET NEED NOT BE LOGGED
  1725.           RJ     LOGLIN
  1726.           SB3    PACKNUM-1   WRITE 'SEND PACKET NUMBER'
  1727.           RJ     ZWRITE
  1728.           SB4    CBUF
  1729.           SA3    B4+B1
  1730.           SX3    X3-32
  1731.           RJ     NWRITE      WRITE PACKET NUMBER
  1732.           SB2    10
  1733.           RJ     XWRITE
  1734.           RJ     LOGPACK     COPY PACKET
  1735.           EQ     SENDPACK
  1736.  ACKIT    SPACE  4,15
  1737. ** ACKIT SENDS ACKNOWLEDGEMENT FOR A PACKET RECEIVED.
  1738.  ACKIT    SPACE  3,10
  1739.           SA7    CBUF
  1740.           SA1    CURN        ACKNOWLEDGEMENT HAS CURRENT PACK NUMBER
  1741.           SX7    X1+32
  1742.           SX6    89          Y = ACK
  1743.           SA7    A7+B1
  1744.           SA6    A7+B1
  1745.           RJ     SENDPACK
  1746.  ACKIT    PS
  1747.           SX7    35          PACKET = 3 WORDS LONG
  1748.           EQ     ACKIT-3
  1749.  TERMIN   SPACE  4,16
  1750. ** TERMIN SENDS ACK FOR LAST PACKET RECEIVED,  THEN WRITES IN THE LOG
  1751. *  THE TEXT WHOSE ADDRESS IS IN X6 ON ENTRY.
  1752.  TERMIN   SPACE  3,10
  1753.  TERMIN   SA6    UPDAT       STORE TERMINATING MESSAGE
  1754.           RJ     ACKIT
  1755.           SA1    RETRYT      UPDATE TOTAL RETRY COUNT
  1756.           SA2    A1+B1
  1757.           IX6    X1+X2
  1758.           SA6    A1
  1759.           BX7    X7-X7
  1760.           SA7    CURN        SET PACKET NUMBER TO 0
  1761.           SA7    A2
  1762.           RJ     LOGLIN      WRITE IN LOG
  1763.           SA3    UPDAT       AFTER RECOVERING ADDRESS OF MESSAGE
  1764.           SB3    X3
  1765.           RJ     ZWRITE      WRITE END-OF-LINE
  1766.  TERMIN1  RJ     OSAVE       AND SAVE PLACE IN OUTPUT FILE
  1767.           SA1    FILETYP+1
  1768.           BX6    X1          RESTORE FILE TYPE (NEEDED ONLY RARELY)
  1769.           SA6    A1-B1
  1770.           SA1    KMODE
  1771.           NZ     X1,RECCOM2  IF X1 <> 0, YOU ARE A SERVER
  1772.           SX7    OUTPUT      OTHERWISE PREPARE TO WRITE ON OUTPUT
  1773.           RJ     OREST       (CAN'T USE MAINPRG-1 IF ACK IS SENT)
  1774.           EQ     MAINPRG
  1775.  MYPARM   SPACE  4,18
  1776. ** MYPARM SENDS A PACKET CONTAINING THE CYBER KERMIT (MY) PARAMETERS.
  1777. *  ON ENTRY X7 CONTAINS THE TYPE OF PARAMETER (SEND-INIT OR ACK), AND
  1778. *  X0 MUST = 32.   ON EXIT A7 CONTAINS THE ADDRESS BEFORE THAT OF THE
  1779. *  REPEAT PREFIX IN THE OUTGOING PACKET.
  1780.  MYPARM   SPACE  3,10
  1781.  MYPARM   PS
  1782.           SX6    44          LENGTH OF MY PACKET
  1783.           SA6    CBUF
  1784.           SA1    PLENGTH     MAXIMUM LENGTH I WANT TO RECEIVE
  1785.           BX6    X0
  1786.           SA6    A6+B1       SEQUENCE NUMBER
  1787.           SA7    A6+B1       YES OR SEND
  1788.           IX7    X0+X1
  1789.           SA1    TIMEOUT
  1790.           SA7    A7+B1       MY MAXL
  1791.           IX7    X0+X1
  1792.           SA7    A7+B1       REQUESTED TIMEOUT LIMIT
  1793.           SA6    A7+B1       NUMBER OF PAD CHARS
  1794.           LX6    1
  1795.           SA6    A6+B1       DEFAULT PAD CHARACTER
  1796.           SX6    45
  1797.           SA6    A6+B1       END-OF-PACKET IS END-OF-LINE
  1798.           SA1    QUOTEC
  1799.           SA2    BITPREF
  1800.           BX6    X1
  1801.           BX7    X2
  1802.           SA6    A6+B1       MY QCTL
  1803.           SA7    A6+B1       MY QBIN
  1804.           SX7    49
  1805.           SA7    A7+B1       DEFAULT CHECKSUM TYPE
  1806.           EQ     MYPARM
  1807.  YOURPAR  SPACE  4,16
  1808. ** YOURPAR PROCESSES THE MICRO KERMIT'S (YOUR) PARAMETERS.   ON ENTRY
  1809. *  X0 MUST BE 32.  ON EXIT X2 CONTAINS THE VALUE OF YOUR REPEAT-CHAR.
  1810.  YOURPAR  SPACE  3,10
  1811.           SA7    QBIN
  1812.  YOURPAR  PS
  1813.           SA1    CBUF+96     HOW LONG IS YOUR PACKET
  1814.           IX1    X1-X0
  1815.           SB6    X1
  1816.           SX7    -B1
  1817.           SB7    -10
  1818.           SA7    A1+B6
  1819.           SA7    A7+B1
  1820.           SB7    B7+B1
  1821.           MI     B7,*        ENSURE WE DON'T GET BAD DATA
  1822.           SA1    CBUF+99     CHAR (HIS MAXL)
  1823.           IX1    X0-X1
  1824.           BX7    -X1
  1825.           MI     X1,*+1
  1826.           SX7    80          DEFAULT PACKET LENGTH
  1827.           SA7    SLENGTH
  1828.           SA0    A1+B1       IGNORE HIS TIME
  1829.           SA2    A0+B1       CHAR (HIS NPAD)
  1830.           IX3    X0-X2
  1831.           LX7    B1,X0       X7 := 64
  1832.           SA2    A2+B1       CTRL (HIS PADC)
  1833.           BX7    X7-X2
  1834.           BX6    -X3
  1835.           MI     X1,*+1
  1836.           BX6    X6-X6       DEFAULT NUMBER OF PAD CHARS
  1837.           IX2    X0-X2
  1838.           MI     X2,*+1
  1839.           BX7    X7-X7       DEFAULT PAD CHAR
  1840.           SA6    NPAD        AMOUNT OF PADDING
  1841.           SA7    A6+B1       CONTENT OF PADDING
  1842.           SA2    A2+B1       CHAR (HIS EOLN)
  1843.           IX2    X0-X2
  1844.           BX7    -X2
  1845.           SX5    13          DEFAULT EOLN
  1846.           SA1    A2+B1       HIS QCTL
  1847.           MI     X2,*+1
  1848.           BX7    X5
  1849.           BX5    X5-X7
  1850.           NZ     X5,*+1
  1851.           MX7    44
  1852.           SA7    A7+B1       HIS EOLN
  1853.           BX6    X1
  1854.           IX5    X0-X1
  1855.           SA1    A1+B1       HIS QBIN
  1856.           MI     X5,*+1
  1857.           SX6    35          DEFAULT QCTL
  1858.           SA6    QCTL
  1859.           BX7    X1
  1860.           SA0    A1+B1       IGNORE HIS CHECKSUM TYPE
  1861.           SA2    A0+B1       HIS RPCH
  1862.           BX6    X2
  1863.           SX3    X7-89       TEST FOR AFFIRMATION
  1864.           NZ     X3,*+1
  1865.           SX7    38          DEFAULT QBIN
  1866.           IX1    X0-X1
  1867.           MI     X1,*+1
  1868.           MX7    49          SET QBIN TO NO BIT-PREFIX
  1869.           SX3    X7-78       CHECK FOR REFUSAL
  1870.           ZR     X3,*-1      IF SO, USE DEFAULT
  1871.           PL     X7,YOURPAR-1
  1872.           SA3    FILETYP+1
  1873.           ZR     X3,YOURPAR-1
  1874.           MX1    58          X1 := -3
  1875.           IX1    X1+X3
  1876.           PL     X1,YOURPAR-1
  1877.           SX6    BINERM      BINARY FILES MUST USE BIT-PREFIXING
  1878.  SENDERR  SPACE  4,16
  1879. ** SENDERR TERMINATES A PROCESS BY SENDING AN ERROR PACKET CONTAINING
  1880. *  THE MESSAGE WHOSE ADDRESS IS IN X6 ON ENTRY.
  1881.  SENDERR  SPACE  3,10
  1882.  SENDERR  SA6    UPDAT
  1883.           SX7    69          ERROR MESSAGE
  1884.           SA4    SLENGTH
  1885.           SB7    X4+CBUF-5   LIMIT OF PACKET SIZE (PLUS SAFE MARGIN)
  1886.           SA7    CBUF+2
  1887.           SB6    A7-B7
  1888.           SB6    B6+B1
  1889.           SB5    B1
  1890.           SB3    X6
  1891.           SB2    B0
  1892.           BX7    X7-X7
  1893.           SA7    CURN
  1894.           RJ     PREAD       GET 1ST CHAR OF ERROR MESSAGE
  1895.           BX7    X5
  1896.           RJ     PACKTEX     PUT REST OF MESSAGE INTO PACKET
  1897.           SX5    B1
  1898.           LX5    5
  1899.           RJ     PUTVAL      INCLUDING LAST CHAR (UNLESS BLANK)
  1900.           SX6    B1
  1901.           SX7    B6+B7
  1902.           SX7    X7+32-CBUF  1ST CHAR OF PACKET
  1903.           LX6    5           X6 := 32
  1904.           SA7    CBUF
  1905.           SA6    A7+B1       SEQUENCE
  1906.           RJ     SENDPACK
  1907.           EQ     TERMIN+1
  1908.  RETRINC  SPACE  4,14
  1909. ** RETRINC INCREMENTS THE RETRY COUNT AND ABORTS IF TOO MANY OCCUR.
  1910.  RETRINC  SPACE  3,9
  1911.  RETRINC  PS
  1912.           SA2    RETRYC      CURRENT RETRIES
  1913.           SA1    A2+B1       MAXIMUM ALLOWED RETRIES
  1914.           SX6    X2+B1
  1915.           SA6    A2
  1916.           IX2    X2-X1
  1917.           MI     X2,RETRINC  X2 < 0 UNTIL THE LIMIT IS REACHED
  1918.           SX6    RETRYM
  1919.           EQ     SENDERR     IN THAT CASE, ABORT
  1920.  INTTEST  SPACE  4,14
  1921. ** INTTEST  TESTS (PACKET) TERMINAL INPUT FOR THE CYBER KERMIT INTER-
  1922. *  RUPT SEQUENCE; IT SHOULD BE CALLED ONLY IF THE CHAR (IN X5) < 32.
  1923.  INTTEST  SPACE  3,8
  1924.  INTTEST  PS
  1925.           SA4    ESCAPEC
  1926.           BX6    X4-X5
  1927.           NZ     X6,INTTEST  X6 <> 0 IF THE INPUT CHAR IS NOT ESCAPEC
  1928.           SA6    KMODE
  1929.           SX6    INTERM
  1930.           SA6    UPDAT
  1931.           EQ     TERMIN+1
  1932.  GETPACK  SPACE  4,21
  1933. ** GETPACK READS AND CHECKS OUT A PACKET 'INTERNALLY',  THAT IS, WITH
  1934. *  NO ATTEMPT TO VERIFY THAT THIS PARTICULAR PACKET IS APPROPRIATE AT
  1935. *  THIS POINT IN THE PROTOCOL.   IF A PUTATIVE PACKET STARTS WITH THE
  1936. *  SYNC MARKER,  CONTAINS THE NUMBER OF CHARACTERS  CODED IN ITS NEXT
  1937. *  ELEMENT,  HAS TYPE AND SEQUENCE CODES IN THE CORRECT  RANGES,  ALL
  1938. *  INTERNAL CHARACTERS PRINTABLE, AND THE CORRECT CHECKSUM, THEN X1 =
  1939. *  0 ON RETURN; OTHERWISE X1 <> 0.
  1940.  GETPACK  SPACE  3,10
  1941.  NORECP   SA1    DEBUGW
  1942.           ZR     X1,*+4      X1 = 0 IF DEBUG IS NOT ON
  1943.           SX7    -B1
  1944.           SA7    B6+B7       TERMINATE THE FAILURE FOR LOGGING
  1945.           RJ     LOGLIN
  1946.           SB3    RECEIVM     'RECEIVED'
  1947.           RJ     ZWRITE
  1948.           SB4    CBUF+96
  1949.           RJ     LOGPACK     PRINT WHAT WAS RECEIVED
  1950.           SA1    CBUF+96
  1951.           MI     X1,*+2      INCREMENT ERROR COUNT ONLY IF DATA READ
  1952.           SA1    PKERRS
  1953.           SX6    X1+B1
  1954.           SA6    A1
  1955.           RJ     RETRINC     INCREMENT RETRY COUNT
  1956.  GETPACK  PS
  1957.           SB6    CBUF+96
  1958.           RJ     INSTART     READ SOMETHING
  1959.           SX6    -B1         ENSURE END OF BUFFER IS FLAGGED
  1960.           SA6    B6
  1961.           SA4    SYNCM       GET SYNC MARKER
  1962.           BX7    X4
  1963.           SB7    B0
  1964.           SB5    CBUF+64
  1965.           RJ     AREAD       GET NEXT ASCII CHAR INPUT
  1966.           MI     X5,NORECP   X5 < 0 AT END-OF-INPUT
  1967.           BX4    X5-X7       IS IT A SYNC MARKER
  1968.           ZR     X4,*+2      X4 = 0 IF IT IS A SYNC MARKER
  1969.           RJ     INTTEST     IF NOT, IS IT ESCAPE
  1970.           EQ     *-3
  1971.           RJ     AREAD       GET LENGTH OF PACKET
  1972.           SX4    X5-32
  1973.           PL     X4,*+3      X4 > 0 WHEN CHARACTER IS PRINTABLE
  1974.  GETPCK1  MI     X5,NORECP   X5 < 0 AT END-OF-INTPUT
  1975.           RJ     INTTEST     IS IT AN INTERRUPT
  1976.           EQ     NORECP      IF NOT, NO PACKET RECEIVED
  1977.           MX0    53
  1978.           BX0    -X0-X5      TEST FOR DEL
  1979.           ZR     X0,NORECP   X0 = 0 WHEN 'DEL' IS READ
  1980.           BX7    X5
  1981.           SA7    B6
  1982.           SB7    X5+B5       ADDRESS OF LAST CHAR
  1983.           SB6    B6-B7
  1984.           SB6    B6+B1       OFFSET
  1985.           SX4    B6+B1
  1986.           PL     X4,NORECP   NOT LONG ENOUGH FOR A PACKET
  1987.           SB5    X5          START CHECKSUM
  1988.           RJ     AREAD       GET SEQUENCE NUMBER
  1989.           SX4    X5-32
  1990.           MI     X4,GETPCK1  INTERRUPT OR ERROR
  1991.           SX4    X5-96       TEST FOR LEGITIMATE SEQUENCE NUMBER
  1992.           PL     X4,NORECP   (IN THE REANGE 32 - 95)
  1993.           BX7    X5
  1994.           SA7    B6+B7
  1995.           SB6    B6+B1
  1996.           SB5    X5+B5       ADD TO CHECKSUM
  1997.           RJ     AREAD       GET PACKET TYPE
  1998.           SX4    X5-65
  1999.           MI     X4,GETPCK1  ACCORDING TO THE PROTOCOL,
  2000.           SX4    X4-26       PACKET TYPES MUST BE
  2001.           PL     X4,NORECP   IN THE RANGE 65 -- 90
  2002.           BX7    X5
  2003.           SA7    B6+B7
  2004.           SB6    B6+B1
  2005.           SB5    X5+B5
  2006.           PL     B6,*+4      TIME FOR CHECKSUM
  2007.           RJ     AREAD       GET NEXT CHARACTER IN PACKET
  2008.           SX4    X5-32
  2009.           MI     X4,GETPCK1  IT MUST BE PRINTABLE
  2010.           MX0    53
  2011.           BX0    -X0-X5      TEST FOR DEL
  2012.           NZ     X0,*-3
  2013.           EQ     NORECP
  2014.           RJ     AREAD       GET CHECKSUM
  2015.           MX0    52          AND COMPUTE CHECKSUM OF DATA RECEIVED
  2016.           SX7    B5
  2017.           BX7    -X0*X7
  2018.           BX4    X7
  2019.           AX4    6
  2020.           IX7    X7+X4
  2021.           MX1    54
  2022.           BX7    -X1*X7
  2023.           SX7    X7+32
  2024.           BX4    X5-X7
  2025.           BX7    X5
  2026.           SA1    DEBUGW
  2027.           NZ     X1,*+4      X1 <> 0 IF DEBUGGING IS TO BE DONE
  2028.           MX6    57
  2029.           SA6    B7
  2030.           NZ     X4,GETPACK-2  THERE WAS AN ERROR IN THE CHECKSUM
  2031.           SA2    PRECD       THERE WAS NO ERROR; SUCCESS IS OURS!
  2032.           SX6    X2+B1
  2033.           SA6    A2
  2034.           EQ     GETPACK     (NOTE THAT X1 IS ALREADY = 0)
  2035.           MX6    57
  2036.           SA7    B7
  2037.           SA6    A7+B1
  2038.           NZ     X4,GETPCK2  X4 <> 0 IF THERE WAS A CHECKSUM ERROR
  2039.           RJ     LOGLIN
  2040.           SB3    RECEIVM
  2041.           RJ     ZWRITE      'RECEIVED'
  2042.           SB3    PACKNUM
  2043.           RJ     ZWRITE      'PACKET NUMBER'
  2044.           SB4    CBUF+96
  2045.           SA3    B4+B1
  2046.           SX3    X3-32
  2047.           RJ     NWRITE      WRITE PACKET NUMBER
  2048.           SB2    10
  2049.           RJ     XWRITE
  2050.           RJ     LOGPACK
  2051.           BX1    X1-X1       RETURN ZERO
  2052.           EQ     *-10        UPDATE RECEIVED COUNT BEFORE LEAVING
  2053.  GETPCK2  RJ     LOGLIN
  2054.           SB3    CKERRM      REPORT CHECKSUM ERROR
  2055.           RJ     ZWRITE
  2056.           RJ     SLINE
  2057.           SB2    10
  2058.           RJ     XWRITE
  2059.           EQ     GETPACK-5   AND RECORD WHAT WAS RECEIVED
  2060.  REQUESP  SPACE  4,25
  2061. ** REQUESP IS SLIGHTLY MORE SOPHISTICATED THAN GETPACK.  IF NO PACKET
  2062. *  WAS RECEIVED, IT RETRIES.  THEN FOR PACKETS OF TYPE C-G-I-K-R-S IT
  2063. *  RETURNS (WITHOUT CHECKING THE PACKET'S SEQUENCE NUMBER) WITH X1 <>
  2064. *  0.   FOR E-PACKETS  (ALSO WITHOUT CHECKING THE SEQUENCE NUMBER) IT
  2065. *  TERMINATES THE CURRENT PROCESS  (WITHOUT RETURNING)  AFTER LOGGING
  2066. *  THE ERROR MESSAGE.  IT CONSIDERS ALL OTHER PACKETS LEGITIMATE WHEN
  2067. *  THEY ARE IN PROPER SEQUENCE;  IT DOES NOT RETURN AFTER RECEIVING A
  2068. *  B-PACKET,  AND IT RETURNS WITH X1 = 0 FOR D-F-Z AND OTHER PACKETS.
  2069. *  AFTER RECEIVING A PACKET WITH AN INCORRECT SEQUENCE NUMBER, WE NAK
  2070. *  THE EXPECTED PACKET AND TRY AGAIN.  REQUESP RETURNS WITH A2 = CBUF
  2071. *  + 98, X2 = PACKET TYPE, AND X0 = 32.
  2072.  REQUESP  SPACE  3,10
  2073.  RECERR   SA6    UPDAT       SAVE ERROR MESSAGE
  2074.           EQ     REQUSP1
  2075.  REQUESP  PS
  2076.           RJ     GETPACK     READ A PACKET
  2077.           SX0    B1
  2078.           LX0    5           X0 := 32
  2079.           NZ     X1,REQUSP2+1  X1 <> 0 IF NO PACKET WAS RECEIVED
  2080.           SA1    PTYPES
  2081.           SA2    CBUF+98     GET PACKET TYPE
  2082.           SB2    X2-69
  2083.           LX3    B2,X0
  2084.           BX1    X1*X3       TEST FOR THE RESERVED PACKET TYPES
  2085.           NZ     X1,REQUSP2-2  (C, E, G, I, K, R, S)
  2086.           SA3    CURN        IF NOT RESERVED, THEN TEST:
  2087.           SA1    A2-B1       GET SEQUENCE NUMBER AS CODED
  2088.           IX1    X1-X0
  2089.           BX1    X1-X3       TEST FOR CORRECT SEQUENCE NUMBER
  2090.           NZ     X1,REQUSP2  IF INCORRECT NAK AND TRY AGAIN
  2091.           SX3    X2-66       TEST FOR BREAK
  2092.           NZ     X3,REQUESP  IF NOT BREAK, RETURN (WITH X1 = 0)
  2093.           SX6    BREAKM      IF BREAK, REPORT IT
  2094.           SA6    UPDAT
  2095.           RJ     ACKIT       ACKNOWLEDGE RECEIPT OF PACKET
  2096.  REQUSP1  SA2    RETRYT
  2097.           SA1    A2+B1       UPDATE RETRY COUNTS
  2098.           IX6    X2+X1
  2099.           BX7    X7-X7
  2100.           SA6    A2
  2101.           SA7    A1          UPDATE ERROR COUNTS
  2102.           RJ     LOGLIN      SET UP LOG FOR WRITING
  2103.           SA1    UPDAT
  2104.           SB4    CBUF+99
  2105.           SB3    X1
  2106.           RJ     ZWRITE      REPORT CAUSE OF TERMINATION
  2107.           BX3    X3-X3
  2108.           SB2    B1
  2109.           RJ     UNPACK
  2110.           EQ     *+2
  2111.           RJ     AWRITE      AND RECORD ANY MESSAGES RECEIVED
  2112.           RJ     UNPACK
  2113.           SX4    X5-32
  2114.           PL     X4,*-2      UNTIL X4 < 0 AT END-OF-PACKET
  2115.           EQ     TERMIN1
  2116.           SX4    X2-69       TEST FOR ERROR PACKET
  2117.           NZ     X4,REQUESP  OTHERWISE RETURN (WITH X1 <> 0)
  2118.           SX6    ERRORM
  2119.           EQ     RECERR
  2120.  REQUSP2  RJ     RETRINC     TEST NUMBER OF FAILURES
  2121.           SA1    CURN
  2122.           SX7    35
  2123.           SX6    78          NO = NAK
  2124.           SA7    CBUF
  2125.           IX7    X0+X1
  2126.           SA7    A7+B1
  2127.           SA6    A7+B1
  2128.           RJ     SENDPACK    SEND NAK OF EXPECTED PACKET
  2129.           EQ     REQUESP+1   AND TRY AGAIN
  2130.  SENDWAC  SPACE  4,17
  2131. ** SENDWAC  SENDS A PACKET AND INSISTS ON ACKNOWLEDGEMENT.  ON ENTRY,
  2132. *  X2 CONTAINS THE TYPE OF PACKET IN ASCII, AND B6 + B7 = THE ADDRESS
  2133. *  OF THE CHECKSUM CHARACTER IN THE BUFFER.  ON EXIT, A1 = CBUF + 98.
  2134.           SPACE  3,10
  2135.  SENDWAC  PS
  2136.           SA7    XSTORE      XSTORE CONTAINS X7
  2137.           BX7    X3
  2138.           BX6    X5
  2139.           SA7    A7+B1       XSTORE + 1 CONTAINS X3
  2140.           SA6    A7+B1       XSTORE + 2 CONTAINS X5
  2141.           SX4    B2
  2142.           SX5    B3
  2143.           SX6    B4
  2144.           SX7    B5
  2145.           MX0    42
  2146.           BX4    -X0*X4      MASK OFF ALL BUT 18 BITS
  2147.           BX5    -X0*X5
  2148.           BX6    -X0*X6
  2149.           BX7    -X0*X7
  2150.           LX6    18
  2151.           LX7    18
  2152.           BX6    X6+X4
  2153.           BX7    X7+X5
  2154.           SA6    A6+B1       XSTORE + 3 CONTAINS B4, B2
  2155.           SA7    A6+B1       XSTORE + 4 CONTAINS B5, B3
  2156.           SA1    INFI
  2157.           BX7    X1
  2158.           SA7    A7+B1       XSTORE + 5 CONTAINS ADDR OF FILE FET
  2159.           SA3    RETRYT
  2160.           SA4    A3+B1
  2161.           IX6    X3+X4
  2162.           BX7    X7-X7
  2163.           SA6    A3
  2164.           SA7    A4          UPDATE RETRY COUNT FOR NEW PACKET
  2165.           SA1    CURN
  2166.           SX7    X1+32       PACKET NUMBER
  2167.           SA7    CBUF+1
  2168.           BX7    X2
  2169.           SX6    B6+B7       ADDRESS OF CHECKSUM
  2170.           SX6    X6+32-CBUF
  2171.           SA6    A7-B1       1ST WORD OF PACKET
  2172.           SA7    A7+B1       PACKET TYPE
  2173.           EQ     SENDWA1+1
  2174.  SENDWA3  SX3    X1-78       NO
  2175.           ZR     X3,*+3
  2176.           SA3    X1-69       TEST FOR ERROR PACKET
  2177.           NZ     X3,FATALE   ANY OTHER KIND IS A DISASTER
  2178.           SX6    ERRORM
  2179.           EQ     RECERR
  2180.           SA3    A1-B1       CHECK NUMBER OF RECEIVED PACKET
  2181.           SX4    X3-32
  2182.           BX5    X2-X4
  2183.           ZR     X5,SENDWA1  X5 = 0 WHEN THE NUMBER IS CORRECT
  2184.           MX0    54
  2185.           SX6    X2+B1
  2186.           BX6    -X0*X6
  2187.           BX5    X4-X6
  2188.           ZR     X5,SENDWA2  X5 = 0 WHEN YOU NAK THE SUCCESSOR
  2189.  FATALE   SX6    KDATERM
  2190.           EQ     SENDERR     ABORT WITH ERROR MESSAGE
  2191.  SENDWA1  RJ     RETRINC     INCREMENT RETRY COUNT
  2192.           RJ     SENDPACK    (RE)SEND
  2193.           RJ     GETPACK     ASK FOR ACKNOWLEDGEMENT
  2194.           NZ     X1,*-2      REPEAT IF NOTHING RECEIVED
  2195.           SA1    CBUF+98     GET TYPE OF PACKET RECEIVED
  2196.           SA2    CURN
  2197.           SX3    X1-89       Y = ACK
  2198.           NZ     X3,SENDWA3  X3 <> 0 IF THIS WAS NOT AN ACK
  2199.           SA3    A1-B1       GET SEQUENCE NUMBER RECEIVED
  2200.           SX6    X2+B1
  2201.           SX4    X3-32
  2202.           BX5    X4-X2       DID WE RECEIVE ACK OF PACKET SENT
  2203.           MX0    54
  2204.           ZR     X5,SENDWA2  YES
  2205.           SX4    X4+B1
  2206.           BX4    -X0*X4
  2207.           BX5    X2-X4       OR ACK OF PREVIOUS PACKET
  2208.           ZR     X5,SENDWA1  IF SO REPEAT
  2209.           EQ     FATALE      OTHERWISE ABORT
  2210.  SENDWA2  BX6    -X0*X6      (MAKE 64 = 0)
  2211.           SA6    A2          UPDATE CURRENT PACKET NUMBER CURN
  2212.           SA3    RETRYT
  2213.           SA4    A3+B1
  2214.           IX6    X3+X4
  2215.           BX7    X7-X7
  2216.           SA6    A3          RESTART ERROR COUNT
  2217.           SA3    SLENGTH
  2218.           SB7    X3+CBUF-5
  2219.           SB6    CBUF+3      PREPARE TO SEND A PACKET
  2220.           SB6    B6-B7
  2221.           SA7    A4
  2222.           SA2    XSTORE      AND RESTORE ALL INPUT REGISTERS
  2223.           BX7    X2
  2224.           SA3    A2+B1
  2225.           SA5    A3+B1
  2226.           SA2    A5+B1
  2227.           SA4    A2+B1
  2228.           SB2    X2
  2229.           SB3    X4
  2230.           LX2    42
  2231.           LX4    42
  2232.           SB4    X2
  2233.           SA2    A4+B1       GET FORMER CONTENTS OF INFI
  2234.           BX6    X2
  2235.           SA6    INFI
  2236.           SB5    X4
  2237.           EQ     SENDWAC
  2238.  PTVWAC   SPACE  4,16
  2239. ** PTVWAC STORES A VALUE IN A PACKET,  SENDING THE PACKET AND GETTING
  2240. *  IT ACKNOWLEDGED WHEN THE PACKET IS FULL.
  2241.  PTVWAC   SPACE  3,10
  2242.  PTVWAC   PS
  2243.           RJ     PUTVAL
  2244.           MI     B6,PTVWAC   B6 < 0 IF THE PACKET IS NOT YET FULL
  2245.           SX2    68          D = DATA
  2246.           RJ     SENDWAC     SEND AND GET ACK
  2247.           SX4    X1-89       Y = ACK
  2248.           NZ     X4,PTVWAC1  IGNORE NAK PACKETS
  2249.           SA1    A1+B1       GET 1ST DATA WORD
  2250.           MI     X4,PTVWAC1  IGNORE ACKS WITH NO DATA
  2251.           SX4    X4+B1       X = ABANDON
  2252.           SX1    X4-2        Z = ABANDON
  2253.           ZR     X4,PUTEOF1  WE ARE HERE INSTRUCTED TO ABORT SENDING
  2254.           ZR     X1,PUTEOF1  THE FILE
  2255.  PTVWAC1  BX4    X5-X7       TEST THAT REPEATED CHARACTER DOESN'T
  2256.           ZR     X4,PTVWAC   OVERFLOW INTO NEXT PACKET (WHEN X4 <> 0)
  2257.           EQ     PTVWAC+1    NOT YET DONE
  2258.  PZWRITE  SPACE  4,15
  2259. ** PZWRITE TRANSFERS A ZERO-TERMINATED MESSAGE TO A PACKET.  ON ENTRY
  2260. *  THE ADDRESS OF THE MESSAGE SHOULD BE IN B3.
  2261.  PZWRITE  SPACE  3,9
  2262.           RJ     PTVWAC
  2263.           RJ     PREAD
  2264.           NZ     X5,*-2      X5 <> 0 BEFORE THE TEXT TERMINATES
  2265.           SX5    B1
  2266.           LX5    5           X5 := ASCII BLANK
  2267.           RJ     PTVWAC      ENSURE LAST CHAR IS STORED
  2268.  PZWRITE  PS
  2269.           SB2    B0          FLAG NEED TO FETCH NEXT WORD OF TEXT
  2270.           EQ     *-4
  2271.  PLINE    SPACE  4,15
  2272. ** PLINE STORES A PROTOCOL END-OF-LINE IN A PACKET AFTER FLUSHING THE
  2273. *  OUTPUT REGISTER X7.
  2274.  PLINE    SPACE  3,9
  2275.  PLINE    PS
  2276.           SX5    B1
  2277.           LX5    5           X5 := BLANK
  2278.           RJ     PTVWAC      THIS DOES NOT PUT THE BLANK BUT THE
  2279.           SX7    13          PREVIOUS CHARACTER (UNLESS IT WAS BLANK)
  2280.           SX5    10          THEN ADD THE CR/LF SEQUENCE REQUIRED
  2281.           SB5    B1
  2282.           RJ     PTVWAC
  2283.           EQ     PLINE
  2284.  PZLINE   SPACE  4,10
  2285. ** PZLINE PUTS INTO A PACKET AN END-OF-LINE  FOLLOWED BY A TEXT WHOSE
  2286. *  ADDRESS IS IN B3 ON ENTRY.
  2287.  PZLINE   SPACE  3,4
  2288.  PZLINE   PS
  2289.           RJ     PLINE
  2290.           RJ     PZWRITE
  2291.           EQ     PZLINE
  2292.  PNWRITE  SPACE  4,17
  2293. ** PNWRITE CONVERTS A  (BINARY)  NUMBER TO ASCII AND STORES IT IN THE
  2294. *  OUTGOING PACKET, SENDING THE PACKET WHEN IT IS FULL, IF NECESSARY.
  2295. *  THE NUMBER MUST BE IN X3 ON ENTRY.
  2296.  PNWRITE  SPACE  3,10
  2297.           MX0    54
  2298.           LX3    6
  2299.           BX5    -X0*X3      GET THE NEXT DIGIT
  2300.           BX3    X3-X5       AND REMOVE IT FROM X3
  2301.           SX5    X5+21       CONVERT IT TO ASCII
  2302.           RJ     PTVWAC      STORE IT
  2303.           NZ     X3,*-2      AND REPEAT UNTIL X3 IS EMPTY
  2304.           RJ     PLINE       THEN PUT END-OF-LINE
  2305.  PNWRITE  PS
  2306.           SA0    B2          SAVE CONTENTS OF B2
  2307.           BX5    X5-X5
  2308.           RJ     NCONV       AND CALL NCONV
  2309.           SB2    A0
  2310.           BX3    X5          PUT THE RESULT IN X3
  2311.           EQ     *-5         AND CONVERT IT
  2312.  SENDINIT TITLE  MORE SPECIALISED PACKET HANDLERS
  2313. ** SENDINIT  PERFORMS NEGOTIATIONS AT THE START OF A FILE TRANSFER IF
  2314. *  I AM SENDING A FILE AND YOU ARE RECEIVING ONE.
  2315.  SENDINIT SPACE  3,10
  2316.           SA6    A1-B1       SAVE REPETC
  2317.           SA7    CURN        AND NEW PACKET NUMBER
  2318.           SB2    B0
  2319.  SENDINIT PS
  2320.           SX0    B1
  2321.           LX0    5           X0 := 32
  2322.           RJ     MYPARM      SEND MY PARAMETERS
  2323.           SA1    REPETC
  2324.           BX7    X1
  2325.           SA7    A7+B1       AND THE REPEAT PREFIX
  2326.           EQ     *+3
  2327.           SX1    X2-69       TEST FOR ERROR TYPE
  2328.           SX6    ERRORM
  2329.           ZR     X1,RECERR   X1 = 0 IF AN ERROR PACKET IS RECEIVED
  2330.           RJ     RETRINC     OTHERWISE INCREMENT RETRIES
  2331.           RJ     SENDPACK    SEND MY PARAMETERS
  2332.           RJ     GETPACK     AND TRY TO GET YOURS
  2333.           NZ     X1,*-2      X1 MUST EQUAL 0
  2334.           SA2    CBUF+98
  2335.           SX1    X2-89       Y = ACK MUST BE THE TYPE OF PACKET REC'D
  2336.           NZ     X1,*-5
  2337.           SA1    A2-B1       SEQUENCE
  2338.           SX0    B1
  2339.           LX0    5           X0 := 5
  2340.           BX1    X1-X0       SEQUENCE MUST BE 0
  2341.           NZ     X1,*-6
  2342.           RJ     YOURPAR     PROCESS YOUR PARAMETERS
  2343.           SA1    REPETC
  2344.           BX1    X2-X1       DOES HE ACCEPT REPETITION
  2345.           SX7    B1
  2346.           ZR     X1,SENDINIT-1
  2347.           MX6    50          IF NOT, CHOOSE A SAFE NEGATIVE NUMBER
  2348.           EQ     SENDINIT-1
  2349.  NONEXT   SPACE  4,13
  2350. ** NONEXT REPORTS THAT A FILE DOES NOT EXIST.
  2351.  NONEXT   SPACE  3,8
  2352.  NONEXT   SX6    NONEXTM
  2353.  +        SA3    KMODE       ARE YOU A SERVER
  2354.           NZ     X3,SENDERR  IF SO, SEND AN ERROR PACKET
  2355.           SB3    X6          OTHERWISE
  2356.           RJ     OUTSTRT     PREPARE TO WRITE ON OUTPUT
  2357.           RJ     ZLINE
  2358.           RJ     SLINE
  2359.           EQ     MAINPRG     AND START OVER
  2360.  SENDSUB  SPACE  4,19
  2361. ** SENDSUB PREPARES TO SEND DATA TO ANOTHER KERMIT; WHEN IT IS CALLED
  2362. *  IT EXPECTS ZZZKLOG TO BE SET UP FOR WRITING  AND B3 TO CONTAIN THE
  2363. *  ADDRESS OF 'SEND' OR 'TYPE'.  AFTER LOGGING THE FILE NAME IT MAKES
  2364. *  AN FET AND TESTS FOR THE FILE'S EXISTENCE.   IF IT EXISTS, WE SEND
  2365. *  A SEND-INITIATION PACKET, PROCESS THE REPLY, AND OPEN THE FILE.
  2366.  SENDSUB  SPACE  3,10
  2367.           BX6    X4
  2368.           SA6    A4+B1       STORE THE FILE NAME IN 'LAST FILE' ADDR
  2369.           RJ     ISAVE       AND SAVE ITS REGISTERS FOR REST OF INIT
  2370.  SENDSUB  PS
  2371.           RJ     ZWRITE      WRITE CALLING COMMAND
  2372.           SX5    45          A BLANK SPACE
  2373.           RJ     SWRITE
  2374.           SB3    FILNAM      AND FILE NAME ON COMMAND OR IN R-PACKET
  2375.           RJ     ZWRITE
  2376.           RJ     OSAVE
  2377.           SA3    FILNAM
  2378.           SX6    3           ALL KERMIT FET'S ARE BINARY
  2379.           SA1    DUMMY+1
  2380.           SA2    A1+B1
  2381.           BX6    X6+X3       ADD TYPE CODE TO FILE NAME
  2382.           SX5    WBUF
  2383.           SA6    FILE        CREATE A NEW FET
  2384.           BX7    X1
  2385.           SA7    A6+B1
  2386.           BX7    X5
  2387.           SA7    A7+B1
  2388.           SA7    A7+B1
  2389.           BX7    X2
  2390.           SX5    3RZZZ       TEST FOR ILLEGAL FILE NAMES
  2391.           SA7    A7+B1
  2392.           LX5    42
  2393.           BX5    X5-X6
  2394.           AX5    42
  2395.           ZR     X5,NONEXT   X5 = 0 IF FILE NAME BEGINS WITH 'ZZZ'
  2396.           SX6    A6          PUT ADDRESS OF FET INTO X6
  2397.           RJ     TESTFIL
  2398.           ZR     X6,NONEXT   X6 = 0 IF THE FILE DOES NOT EXIST
  2399.           REWIND FILE,R
  2400.           BX7    X7-X7
  2401.           SA7    FILE-2      CLEAR ANY SAVED SHIFT & CHARS FROM FET
  2402.           SA7    A7+B1
  2403.           SA7    CURN        PACKET NUMBER WILL BE 0
  2404.           SA7    PSENT       NO PACKETS SEND
  2405.           SA7    A7+B1       NONE RECEIVED
  2406.           SA7    A7+B1       NO ERRORS
  2407.           SA7    A7+B1
  2408.           SA7    A7+B1       AND NO RETRIES
  2409.           SX7    83          SEND-INITIATION PACKET
  2410.           RJ     SENDINIT
  2411.           SX7    FILE
  2412.           SA7    INFI
  2413.           BX2    X7
  2414.           BX3    X3-X3
  2415.           RJ     FREAD       FILL THE FILE BUFFER
  2416.           SA4    FILNAM
  2417.           MI     B3,SENDSUB-1  B3 < 0 IF THE FILE CONTAINS DATA
  2418.  SENCOM3  SX6    NONEXTM     OTHERWISE REPORT NONEXISTENCE
  2419.           EQ     SENDERR
  2420.  INFOSUB  SPACE  4,19
  2421. ** INFOSUB PREPARES TO TYPE ON THE REMOTE SCREEN AS A RESULT OF A RE-
  2422. *  MOTE TYPE COMMAND OR A REMOTE REQUEST FOR INFORMATION.   ON ENTRY,
  2423. *  X1 CONTAINS THE NAME OF THE FILE BEING TYPED AND A1 THE ADDRESS OF
  2424. *  THE NAME.   AFTER INITIAL NEGOTIATIONS AN X-PACKET IS SENT INSTEAD
  2425. *  OF THE USUAL FILE HEADER.
  2426.  INFOSUB  SPACE  3,10
  2427.  INFOSUB  PS
  2428.           BX6    X1
  2429.           SA6    FILNAM
  2430.           SB3    A1
  2431.           RJ     ZWRITE      LOG THE KIND OF INFORMATION
  2432.           RJ     OSAVE
  2433.           BX7    X7-X7
  2434.           SA7    PSENT       CLEAR ALL TRANSFER COUNTS
  2435.           SA7    A7+B1
  2436.           SA7    A7+B1
  2437.           SA7    A7+B1
  2438.           SA7    A7+B1
  2439.           SA7    FILETYP     TO AVOID PROBLEMS DURING SENDINIT
  2440.           SA7    CURN
  2441.           SX7    83          S = SEND-INITIATION
  2442.           RJ     SENDINIT
  2443.           SB7    CBUF+3
  2444.           SX2    88          X = TYPE ON SCREEN
  2445.           SB6    B0
  2446.           RJ     SENDWAC     SEND X-PACKET
  2447.           SA4    SLENGTH
  2448.           SB7    X4+CBUF-5   AND PREPARE TO SEND NEXT PACKET
  2449.           SB6    CBUF+3
  2450.           SB6    B6-B7
  2451.           SB5    B1
  2452.           SX7    B1
  2453.           LX7    5           X7 := 32
  2454.           EQ     INFOSUB
  2455.  LWRITE   TITLE  SOME UTILITY SUBROUTINES FOR COMMAND PROCESSING
  2456. ** LWRITE PRINTS THE COMPRESSED LIST WHOSE ADDRESS IS IN B3 ON ENTRY.
  2457. *  THE FORMAT OF SUCH A LIST CONSISTS OF A SERIES OF ASCII TEXTS WITH
  2458. *  SIX ZERO BITS TERMINATING EACH TEXT, FOLLOWED BY A CODE SPECIFYING
  2459. *  THE ACTION TO BE TAKEN: 0 = START A NEW LINE; 1 = END OF LIST; 2 -
  2460. *  63 = WRITE 2 - 63 BLANKS.  THE ZERO BITS AND THE CODE MUST FALL IN
  2461. *  THE SAME WORD, AND THE NEXT SECTION OF TEXT MUST BEING IN THE FOL-
  2462. *  LOWING WORD.
  2463.  LWRITE   SPACE  3,10
  2464.  LWRITE   RJ     OUTSTRT     SET UP OUTPUT REGISTERS
  2465.           RJ     SLINE       SKIP A LINE
  2466.           SX7    45          AND START WITH A BLANK
  2467.           SB5    -9
  2468.           RJ     ZWRITE      PRINT HEADER
  2469.           LX3    6
  2470.           BX5    -X0*X3      GET NEXT CHAR AFTER COLON
  2471.           ZR     X5,*-3      IF IT'S 0, THEN WRITELN
  2472.           SB2    X5
  2473.           NE     B1,B2,*+3   COLON-A MEANS END-OF-LIST
  2474.           RJ     SLINE
  2475.           EQ     MAINPRG
  2476.           SB2    B2-B1
  2477.           RJ     XWRITE      WRITE BLANKS
  2478.           EQ     LWRITE+3
  2479.  SETDBG   SPACE  4,17
  2480. ** SETDBG SETS DEBUGGING ON OR OFF.   ON ENTRY X7 CONTAINS THE CHOSEN
  2481. *  OPTION.  FIRST WE TEST FOR A HELP REQUEST, AND IF THERE IS NONE WE
  2482. *  SET DEBUG AND LOG THE FACT.
  2483.  SETDBG   SPACE  3,10
  2484.           RJ     SREAD
  2485.  SETDBG   MI     X5,*+3      SET IT AT END OF LINE
  2486.           SX4    X5-45       TEST FOR BLANK
  2487.           ZR     X4,*-2      X4 = 0 IF A BLANK WAS READ
  2488.           SX5    X7+6        OTHERWISE HELP IS REQUESTED
  2489.           EQ     GETHELP
  2490.           SA7    DEBUGW      SAVE OPTION
  2491.           RJ     LOGSET
  2492.           SB3    SETLIST+10  'DEBUG'
  2493.           RJ     ZWRITE
  2494.           SX5    45
  2495.           RJ     SWRITE      WRITE BLANK SPACE
  2496.           SA5    DEBUGW
  2497.           SB3    X5+KNAME+2  'OFF' OR 'ON'
  2498.           RJ     ZWRITE
  2499.           EQ     TERMIN1     SAVE PLACE IN LOG
  2500.  SETFILE  SPACE  4,15
  2501. ** SETFILE SETS THE FILE TYPE; X7 = THE OPTION ON ENTRY.
  2502.  SETFILE  SPACE  3,10
  2503.  SETFILE  SA1    KMODE
  2504.           ZR     X1,SETFIL1  X1 = 0 IF WE ARE IN COMMAND MODE
  2505.           EQ     *+2
  2506.           RJ     UNPACK
  2507.           MI     X5,SETFIL1+3  AT THIS POINT WE REACH END-OF-PACKET
  2508.           SX4    X5-32       BLANK
  2509.           NZ     X4,SETFIL1+1  IF X4 <> 0 HELP IS REQUESTED
  2510.           EQ     *-2
  2511.           RJ     SREAD
  2512.  SETFIL1  MI     X5,*+3      END OF LINE
  2513.           SX4    X5-45
  2514.           ZR     X4,*-2      BLANK
  2515.           SX5    X7+B1
  2516.           EQ     GETHELP
  2517.           SA7    FILETYP+1   SAVE OPTION
  2518.           SA1    KMODE
  2519.           ZR     X1,*+1
  2520.           RJ     ACKIT       IN SERVER MODE WE MUST SEND ACK IF OK
  2521.           RJ     LOGSET      READY TO WRITE LOG
  2522.           SB3    SETLIST+6   'FILE-TYPE'
  2523.           RJ     ZWRITE
  2524.           RJ     WFILTYP     WRITE NAME OF FILE-TYPE
  2525.           EQ     TERMIN1
  2526.  SETBIT   SPACE  4,15
  2527. ** SETBIT SETS THE BIT-PREFIX.  THE DEFAULT VALUE IS THE AMPERSAND.
  2528.  SETBIT   SPACE  3,10
  2529.           SX5    13
  2530.           EQ     GETHELP
  2531.  SETBIT   SX7    38
  2532.           RJ     SETCHAR
  2533.           MI     X7,*-2      IF X7 < 0 THERE WAS A REQUEST FOR HELP
  2534.           SA1    QUOTEC
  2535.           SA2    REPETC
  2536.           BX1    X1-X7       THE BIT-PREFIX MUST BE DISTINCT FROM THE
  2537.           BX2    X2-X7       QUOTE AND REPEAT PREFIXES
  2538.           ZR     X1,*-4
  2539.           ZR     X2,*-4
  2540.           SA7    BITPREF     IF SO, SAVE IT
  2541.           RJ     LOGSET
  2542.           SB3    SETLIST+4
  2543.           RJ     ZWRITE
  2544.           SA3    BITPREF
  2545.  CHAREND  SX5    45          WRITE A BLANK SPACE
  2546.           RJ     SWRITE
  2547.           BX5    X3
  2548.           RJ     AWRITE      AND THEN THE CHARACTER
  2549.           EQ     TERMIN1
  2550.  SETQUOT  SPACE  4,15
  2551. ** SETQUOT SETS THE QUOTE PREFIX.
  2552.  SETQUOT  SPACE  3,10
  2553.           SX5    14
  2554.           EQ     GETHELP
  2555.  SETQUOT  SX7    35
  2556.           RJ     SETCHAR
  2557.           MI     X7,*-2      X7 = 0 IF HELP IS REQUESTED
  2558.           SA1    BITPREF
  2559.           SA2    REPETC
  2560.           BX1    X1-X7       THE THREE PREFIXES MUST BE DISTINCT
  2561.           BX2    X2-X7
  2562.           ZR     X1,*-4
  2563.           ZR     X2,*-4
  2564.           SA7    QUOTEC      IF SO, SAVE AND LOG THE SET COMMAND
  2565.           RJ     LOGSET
  2566.           SB3    SETLIST+8
  2567.           RJ     ZWRITE
  2568.           SA3    QUOTEC
  2569.           EQ     CHAREND
  2570.  SETREP   SPACE  4,15
  2571. ** SETREP SETS THE REPEAT PREFIX.
  2572.  SETREP   SPACE  3,10
  2573.           SX5    15
  2574.           EQ     GETHELP
  2575.  SETREP   SX7    126
  2576.           RJ     SETCHAR
  2577.           MI     X7,*-2      X7 < 0 IF HELP IS REQUESTED
  2578.           SA1    BITPREF
  2579.           SA2    QUOTEC
  2580.           BX1    X1-X7       THE THREE PREFIXES MUST BE DISTINCT
  2581.           BX2    X2-X7
  2582.           ZR     X1,*-4
  2583.           ZR     X2,*-4
  2584.           SA7    REPETC      IF SO, SAVE AND LOG THE SET COMMAND
  2585.           RJ     LOGSET
  2586.           SB3    SETLIST+13
  2587.           RJ     ZWRITE
  2588.           SA3    REPETC
  2589.           EQ     CHAREND
  2590.  SETESCA  SPACE  4,15
  2591. ** SETESCA SETS THE ESCAPE CHARACTER.
  2592.  SETESCA  SPACE  3,10
  2593.           SX5    17
  2594.           EQ     GETHELP
  2595.  SETESCA  SX7    DEFESCA     DEFAULT ESCAPE CHAR
  2596.           RJ     SETCTRL
  2597.           MI     X7,*-2      ERRORS REQUIRE HELP
  2598.           SA1    SYNCM
  2599.           BX1    X1-X7
  2600.           ZR     X1,*-3      ESCAPE MAY NOT BE THE SAME AS SYNC
  2601.           SA7    ESCAPEC
  2602.           RJ     LOGSET
  2603.           SB3    SETLIST+20  ESCAPE
  2604.           SB4    ESCAPEC
  2605.  CTRLREP  RJ     ZWRITE      WRITE THE TERM BEING SET
  2606.           SX5    45          A BLANK SPACE
  2607.           RJ     SWRITE
  2608.           SB3    CTRLHYP     'CTRL-'
  2609.           RJ     ZWRITE
  2610.           SA4    B4
  2611.           SX5    X4+64
  2612.           RJ     AWRITE      AND THE SYMBOL YOU MUST PRESS WITH CTRL
  2613.           EQ     TERMIN1
  2614.  SETMARK  SPACE  4,15
  2615. ** SETMARK SETS THE PACKET SYNC MARKER.
  2616.  SETMARK  SPACE  3,10
  2617.           SX5    18
  2618.           EQ     GETHELP
  2619.  SETMARK  SX7    B1          DEFAULT PACKET SYNC MARKER
  2620.           RJ     SETCTRL
  2621.           MI     X7,*-2      ERRORS REQUIRE HELP
  2622.           SA1    ESCAPEC
  2623.           BX1    X1-X7
  2624.           ZR     X1,*-3      SYNC MAY NOT BE THE SAME AS ESCAPE
  2625.           SA7    SYNCM
  2626.           RJ     LOGSET
  2627.           SB3    SETLIST+11  MARKER
  2628.           SB4    SYNCM
  2629.           EQ     CTRLREP
  2630.  SETDELA  SPACE  4,15
  2631. ** SETDELA SETS THE DELAY TO BE REQUESTED FROM ANOTHER KERMIT.
  2632.  SETDELA  SPACE  3,10
  2633.           SX7    DEFTIME     DEFAULT DELAY IS 20 SECONDS
  2634.           EQ     *+6
  2635.  SETDELA  RJ     NREAD       READ THE AMOUNT
  2636.           ZR     B5,*-2      SET THE DEFAULT VALUE
  2637.           PL     B5,*+2      SET THE VALUE READ
  2638.           SX5    16
  2639.           EQ     GETHELP
  2640.           SX4    X7-5        5 SECONDS IS MINIMUM
  2641.           MI     X4,*-1
  2642.           SX4    X7-95       94 SECONDS IS MAXIMUM
  2643.           PL     X4,*-2
  2644.           SA7    TIMEOUT     STORE THE VALUE
  2645.           RJ     LOGSET
  2646.           SB3    SETLIST+15  DELAY
  2647.           SB4    TIMEOUT
  2648.  SETNUM   RJ     ZWRITE      WHAT IS BEING SET
  2649.           SX5    45
  2650.           RJ     SWRITE      A BLANK SPACE
  2651.           SA3    B4
  2652.           RJ     NWRITE      THE NUMBER TO WHICH IT IS SET
  2653.           RJ     OSAVE
  2654.           EQ     MAINPRG-1
  2655.  SETPACL  SPACE  4,15
  2656. ** SETPACL SETS THE MAXIMUM PACKET LENGTH TO REQUEST.
  2657.  SETPACL  SPACE  3,10
  2658.           SX7    DEFPLEN     DEFAULT IS 94
  2659.           EQ     *+6
  2660.  SETPACL  RJ     NREAD
  2661.           ZR     B5,*-2
  2662.           PL     B5,*+2
  2663.           SX5    19
  2664.           EQ     GETHELP
  2665.           SX4    X7-40       40 IS MINIMUM
  2666.           MI     X4,*-1
  2667.           SX4    X7-95       94 IS MAXIMUM
  2668.           PL     X4,*-2
  2669.           SA7    PLENGTH
  2670.           RJ     LOGSET
  2671.           SB3    SETLIST+16  PACKET LENGTH
  2672.           SB4    PLENGTH
  2673.           EQ     SETNUM
  2674.  SETTRY   SPACE  4,15
  2675. ** SETTRY SETS THE LIMIT ON THE NUMBER OF RETRIES PER PACKET.
  2676.  SETTRY   SPACE  3,10
  2677.           SX7    DEFRETR     DEFAULT LIMIT IS 5
  2678.           EQ     *+6
  2679.  SETTRY   RJ     NREAD
  2680.           ZR     B5,*-2
  2681.           PL     B5,*+2
  2682.           SX5    20
  2683.           EQ     GETHELP
  2684.           SX4    X7-3        3 IS MINIMUM
  2685.           MI     X4,*-1
  2686.           SX4    X7-31       30 IS MAXIMUM
  2687.           PL     X4,*-2
  2688.           SA7    RETRYN
  2689.           RJ     LOGSET
  2690.           SB3    SETLIST+19  RETRY
  2691.           SB4    RETRYN
  2692.           EQ     SETNUM
  2693.  SENDCOM  TITLE  SENDING A FILE
  2694. ** SENDCOM HANDLES SENDING A FILE TO ANOTHER KERMIT.   SENDCOM IS THE
  2695. *  ENTRY POINT FOR THE SEND COMMAND,  SENDSER FOR A (REMOTE) GET COM-
  2696. *  MAND, AND SENCOM2 FOR REMOTE LISTING (TYPE) AND HELP.
  2697.  SENDCOM  SPACE  3,10
  2698.  SENDCOM  BX7    X7-X7       COMMAND-MODE ENTRY POINT
  2699.           MI     X5,*+5      END-OF-LINE MEANS GET HELP
  2700.           SB5    -7
  2701.           EQ     *+2
  2702.           RJ     AREAD
  2703.           RJ     MAKEFN
  2704.           MI     B5,*-2      CONSTRUCT A FILE NAME
  2705.           NZ     X7,*+4      AND PREPARE TO SEND IT
  2706.           SX5    8
  2707.           EQ     GETHELP     UNLESS THERE ISN'T ANY NAME
  2708.  SENDSER  RJ     UNPCFIL     ENTRY POINT FOR R PACKET
  2709.           ZR     X7,NONEXT
  2710.  +        SA7    FILNAM
  2711.           RJ     LOGLIN
  2712.           SB3    CMDLIST+11  'SEND'
  2713.           RJ     SENDSUB
  2714.           SA5    SLENGTH
  2715.           SB7    X5+CBUF-5
  2716.           SB6    CBUF+3
  2717.           SB6    B6-B7
  2718.           SB5    B1
  2719.           SB3    FILNAM
  2720.           RJ     PREAD
  2721.           BX7    X5
  2722.           RJ     PACKTEX
  2723.           SX5    B1
  2724.           LX5    5
  2725.           RJ     PUTVAL
  2726.           SX2    70          F = FILE HEADER
  2727.           RJ     SENDWAC
  2728.  SENCOM2  SA4    SLENGTH
  2729.           SB7    X4+CBUF-5
  2730.           SB6    CBUF+3
  2731.           SB6    B6-B7
  2732.           SB5    B1
  2733.           SA1    FILE-2
  2734.           RJ     IREST
  2735.           SA1    FILETYP
  2736.           ZR     X1,SENAS    ASCII TEXT
  2737.           MX0    58          X0 := -3
  2738.           IX0    X0+X1
  2739.           MI     X0,SENBI
  2740.           ZR     X0,SENNO
  2741.  
  2742.           SB2    B0          SEND AN ASCII8 FILE
  2743.           RJ     EREAD
  2744.           RJ     EREAD
  2745.           MI     X5,*+6
  2746.           BX7    X5
  2747.           EQ     *+2
  2748.           RJ     PTVWAC
  2749.           RJ     EREAD
  2750.           PL     X5,*-2
  2751.           SX5    B1
  2752.           LX5    5
  2753.           RJ     PTVWAC
  2754.           GT     B2,B0,PUTEOF
  2755.           SX7    13
  2756.           SX5    10
  2757.           SB5    B1
  2758.           EQ     *-6
  2759.  
  2760.  SENNO    SB2    B0          SEND A DISPLAY CODE FILE
  2761.           RJ     DREAD
  2762.           RJ     DREAD
  2763.           MI     X5,*+6
  2764.           BX7    X5
  2765.           EQ     *+2
  2766.           RJ     PTVWAC
  2767.           RJ     DREAD
  2768.           PL     X5,*-2
  2769.           SX5    B1
  2770.           LX5    5
  2771.           RJ     PTVWAC
  2772.           GT     B2,B0,PUTEOF
  2773.           SX7    13
  2774.           SX5    10
  2775.           SB5    B1
  2776.           EQ     *-6
  2777.  
  2778.  SENAS    SB2    B0          SEND AN ASCII 6/12 FILE
  2779.           RJ     AREAD
  2780.           RJ     AREAD
  2781.           MI     X5,*+6
  2782.           BX7    X5
  2783.           EQ     *+2
  2784.           RJ     PTVWAC
  2785.           RJ     AREAD
  2786.           PL     X5,*-2
  2787.           SX5    B1
  2788.           LX5    5
  2789.           RJ     PTVWAC
  2790.           GT     B2,B0,PUTEOF
  2791.           SX7    13
  2792.           SX5    10
  2793.           SB5    B1
  2794.           EQ     *-6
  2795.  
  2796.  SENKE    SB3    B3-B1       SEND A 'KERMIT'-FORMAT BINARY
  2797.           SB2    B0
  2798.           RJ     KREAD
  2799.           MI     X5,SENCOM3
  2800.           BX7    X5
  2801.           SB5    B1
  2802.           EQ     *+2
  2803.           RJ     PTVWAC
  2804.           RJ     KREAD
  2805.           PL     X5,*-2
  2806.           EQ     PUTEOF-2
  2807.  
  2808.  SENBI    SX7    X0+B1       SEND A BINARY FILE
  2809.           RJ     WREAD
  2810.           NZ     X1,SENCOM3
  2811.           ZR     X7,SENKE
  2812.           BX3    X6
  2813.           LX3    8
  2814.           SB2    -13
  2815.           MX0    52
  2816.           BX7    -X0*X3
  2817.           LX3    4
  2818.           EQ     *+2
  2819.           RJ     PTVWAC
  2820.           RJ     BREAD
  2821.           PL     X5,*-2
  2822.           SX5    B1+B1
  2823.           BX5    X5-X7
  2824.           RJ     PTVWAC
  2825.  
  2826.  PUTEOF   SA1    FILETOT     SEND AN END-OF-FILE PACKET
  2827.           SX6    X1+B1
  2828.           SA6    A1
  2829.           SB3    CBUF+3
  2830.           SB4    B6+B7
  2831.           EQ     B3,B4,PUTEOF1
  2832.           SX2    68          D = DATA
  2833.           RJ     SENDWAC
  2834.  PUTEOF1  SB7    CBUF+3
  2835.           SX2    90          Z = EOF
  2836.           SX4    X1-78       N = NAK
  2837.           SA1    A1+B1       GET DATA WORD
  2838.           SB6    B0
  2839.           ZR     X4,*+4
  2840.           SX4    X1-90       TEST Z
  2841.           ZR     X4,*+1
  2842.           SX4    X4+B1
  2843.           SX4    X4+B1       TEST X
  2844.           NZ     X4,*+2
  2845.           SX6    68          D = DISCARD
  2846.           SA6    B7
  2847.           SB6    B1
  2848.  +        RJ     SENDWAC
  2849.           SB7    CBUF+3
  2850.           SX2    66          B = EOT
  2851.           SB6    B0
  2852.           RJ     SENDWAC
  2853.           RJ     LOGLIN
  2854.           SB3    EOFM
  2855.           RJ     ZWRITE
  2856.           SA1    FILNAM
  2857.           BX6    X6-X6       CANCEL CURRENT NAME AND PACKET NUMBER
  2858.           SA6    A1
  2859.           SA6    CURN
  2860.           BX6    X1
  2861.           SA6    A1+B1
  2862.           SB3    A6
  2863.           RJ     ZWRITE
  2864.           RJ     SLINE
  2865.           RJ     WSTATS
  2866.           EQ     TERMIN1
  2867.  GENERIC  TITLE  RECEIVE FILES AND CODED COMMANDS
  2868. ** GENERIC, FINICOM, TYPECOM, AND REMCOM  DEAL WITH COMMANDS RECEIVED
  2869. *  FROM THE LOCAL KERMIT IN PACKETS.
  2870.  FINICOM  SPACE  3,10
  2871.  FINICOM  BX7    X7-X7       PROCESS FINISH COMMAND
  2872.           SA7    KMODE
  2873.           SX6    FINISHM
  2874.           EQ     TERMIN
  2875.  GENERIC  SPACE  4,10
  2876.  GENERIC  SB2    B1
  2877.           SB4    A2+B1       B4 := CBUF+99
  2878.           RJ     UNPACK      A DUMMY OPERATION
  2879.           RJ     UNPACK
  2880.           SX4    X5-70       TEST FOR F = FINISH
  2881.           ZR     X4,FINICOM
  2882.           SX4    X5-81       TEST FOR Q = STATUS QUERY
  2883.           ZR     X5,STATUSP
  2884.           SX4    X5-72       TEST FOR H = GET HELP
  2885.           ZR     X4,SERVHLP
  2886.           SX4    X5-76       TEST FOR L = LOGOUT
  2887.           ZR     X4,*+4
  2888.           SX7    X5-84       TEST FOR T = TYPE
  2889.           SB5    -7
  2890.           ZR     X7,TYPECOM+1
  2891.           SX6    NOTIMP      OTHERWISE SEND A 'NOT IMPLEMENTED' MSG
  2892.           EQ     SENDERR
  2893.           RJ     ACKIT
  2894.           WRITER OUTPUT
  2895.           SX7    LOGOUTM
  2896.           EQ     FINIS+3
  2897.  TYPECOM  SPACE  4,10
  2898.  TYPECOM  BX7    X7-X7       TYPE A LOCAL FILE ON THE OTHER KERMIT'S
  2899.           EQ     *+2         SCREEN
  2900.           RJ     UNPACK      IGNORE ENCODED FIELD LENGTH
  2901.           SA1    FILETYP+1
  2902.           ZR     X1,*+3
  2903.           MX2    58
  2904.           IX2    X1+X2
  2905.           PL     X2,*+2
  2906.           SX6    TYPERM
  2907.           EQ     SENDERR
  2908.           RJ     UNPACK
  2909.           RJ     MAKEFN
  2910.           MI     B5,*-2
  2911.           NZ     X7,*+2
  2912.           SX5    21
  2913.           EQ     GETHELP
  2914.           SA7    FILNAM
  2915.           RJ     LOGLIN
  2916.           SB3    TYPEM
  2917.           RJ     SENDSUB
  2918.           SB7    CBUF+3
  2919.           SX2    88          X = TYPE ON SCREEN
  2920.           SB6    B0
  2921.           RJ     SENDWAC
  2922.           EQ     SENCOM2
  2923.  REMCOM   SPACE  4,10
  2924.  REMCOM   SB2    B1          PROCESS A REMOTE COMMAND
  2925.           SB4    A2+B1       B4 := CBUF + 99
  2926.           RJ     UNPACK      GET DUMMY CONTENTS OF X3
  2927.           SB7    SERVTAB
  2928.           EQ     CREAD
  2929.  SERVCOM  SPACE  4,15
  2930. ** SERVCOM IS THE ENTRY POINT FOR THE SERVER COMMAND.
  2931.  SERVCOM  SPACE  3,10
  2932.           RJ     SREAD
  2933.  SERVCOM  MI     X5,*+3
  2934.           SX4    X5-45
  2935.           ZR     X4,*-2
  2936.           SX5    10
  2937.           EQ     GETHELP
  2938.           SX6    B1          SET SERVER MODE
  2939.           SA6    KMODE
  2940.           BX6    X6-X6
  2941.           SA6    CURN
  2942.           RJ     LOGLIN
  2943.           SB3    CMDLIST+14
  2944.           RJ     ZWRITE
  2945.           RJ     OSAVE
  2946.           SA6    FILNAM
  2947.           EQ     RECCOM2
  2948.  RECVCOM  SPACE  4,15
  2949. ** RECVCOM IS THE ENTRY POINT FOR THE RECEIVE COMMAND.
  2950.  RECVCOM  SPACE  3,10
  2951.  RECVCOM  BX7    X7-X7
  2952.           MI     X5,*+6
  2953.           SB5    -7
  2954.           EQ     *+2
  2955.           RJ     AREAD
  2956.           RJ     MAKEFN
  2957.           MI     B5,*-2
  2958.           NZ     X7,*+2
  2959.           SX5    9
  2960.           EQ     GETHELP
  2961.           SA7    FILNAM
  2962.           RJ     LOGLIN
  2963.           SB3    CMDLIST+7   'RECEIVE'
  2964.           RJ     ZWRITE
  2965.           SX5    45
  2966.           RJ     SWRITE
  2967.           SB3    FILNAM
  2968.           RJ     ZWRITE
  2969.           RJ     OSAVE
  2970.           SA3    FILNAM
  2971.           ZR     X3,*+2
  2972.           RJ     UNIQUE
  2973.           BX7    X7-X7
  2974.           SA7    FILE-2
  2975.           SA7    A7+B1
  2976.           SA7    PSENT
  2977.           SA7    A7+B1       PRECD
  2978.           SA7    A7+B1       PKERRS
  2979.           SA7    A7+B1       RETRYT
  2980.           SA7    A7+B1       RETRYC
  2981.           SA7    CURN
  2982.           SA7    RPCH
  2983.           EQ     RECCOM2
  2984.  RECCOM1  SPACE  4,10
  2985.  RECCOM1  SX3    X2-82       ENTRY FOR RECEIVING R-PACKET
  2986.           ZR     X3,SENDSER
  2987.           SX3    X2-71       GENERIC COMMAND
  2988.           ZR     X3,GENERIC
  2989.           SX3    X2-67       'HOST' COMMAND
  2990.           ZR     X3,REMCOM
  2991.           SX3    X2-75       KERMIT COMMAND
  2992.           ZR     X3,REMCOM
  2993.           SX3    X2-73       INITIALISE PACKET
  2994.           ZR     X3,*+2      WILL BE FOLLOWED BY 0, NOT 1
  2995.           SX6    B1
  2996.           SA6    CURN
  2997.           RJ     YOURPAR     GET YOUR PARAMETERS
  2998.           IX2    X0-X2       ARE YOU USING REPEAT COUNTS
  2999.           MI     X2,*+1
  3000.           MX6    46
  3001.           BX7    X6
  3002.           PL     X6,*+1
  3003.           BX7    X0
  3004.           SA7    CBUF+11
  3005.           SX7    89          YES = ACK
  3006.           SA6    A6+B1
  3007.           RJ     MYPARM
  3008.           RJ     SENDPACK
  3009.  RECCOM2  RJ     REQUESP
  3010.           NZ     X1,RECCOM1  PROCESS INITIALISATION COMMANDS
  3011.           SX4    X2-70       IS IT A FILE HEADER
  3012.           NZ     X4,FATALE   IF NOT, IT IS A FATAL ERROR
  3013.           SA1    RPCH
  3014.           ZR     X1,REQUSP2  THIS SHOULD BE IMPOSSIBLE; WHO KNOWS
  3015.           SA1    FILNAM
  3016.           NZ     X1,RECCOM3  THE FILE HAS A NAME ALREADY
  3017.           RJ     UNPCFIL
  3018.           SA7    FILNAM
  3019.           NZ     X7,*+3      DO NOT USE THE PACKET NAME IF THERE WAS
  3020.           RJ     DEFFILE       ONE ON THE COMMAND LINE
  3021.           BX7    X6
  3022.           SA2    A3
  3023.           SX6    X2+B1
  3024.           SA6    A2
  3025.           BX3    X7
  3026.           RJ     UNIQUE      ENSURE THERE IS NO SUCH FILE YET
  3027.  
  3028.  RECCOM3  RJ     LOGLIN      START TO RECEIVE A FILE
  3029.           SB3    OPENFM
  3030.           RJ     ZWRITE
  3031.           SB2    B1
  3032.           BX3    X3-X3
  3033.           SB4    CBUF+99
  3034.           RJ     UNPACK
  3035.           EQ     *+2
  3036.           RJ     AWRITE      RECORD THE FILE'S NAME IN THE LOG
  3037.           RJ     UNPACK
  3038.           PL     X5,*-2
  3039.           RJ     OSAVE
  3040.           SA1    FILNAM
  3041.           BX6    X1
  3042.           SA6    A1+B1       RECORD THIS FILE AS LAST TRANSFERRED
  3043.           EQ     *+2
  3044.  
  3045.  RECCOM4  RJ     OSAVE       START OF MAIN RECEIVE LOOP
  3046.           SX7    89          ACKNOWLEDGE
  3047.           SA1    RETRYT      RESTART RETRY COUNT
  3048.           SA2    A1+B1
  3049.           IX6    X1+X2
  3050.           SA6    A1
  3051.           BX6    X6-X6
  3052.           SA6    A2
  3053.           SA1    CURN
  3054.           SX6    X1+B1       INCREMENT PACKET NUMBER
  3055.           MX0    54
  3056.           BX6    -X0*X6      PROVIDED IT'S LESS THAN 63
  3057.           SA6    A1
  3058.           SX6    35
  3059.           SA6    CBUF
  3060.           SX6    X1+32       NUMBER OF PREVIOUS PACKET
  3061.           SA6    A6+B1
  3062.           SA7    A6+B1       TYPE OF PACKET (ACK OR NAK)
  3063.           RJ     SENDPACK
  3064.           RJ     REQUESP
  3065.           NZ     X1,FATALE   WE CANNOT GET A COMMAND PACKET HERE
  3066.           SX4    X2-90       Z IS END-OF-FILE
  3067.           ZR     X4,RECEOF
  3068.           SX4    X2-68       TEST FOR DATA
  3069.           NZ     X4,RECCOM4+1
  3070.           SX7    FILE
  3071.           SB4    CBUF+99
  3072.           RJ     OREST
  3073.           SB2    B1
  3074.           BX3    X3-X3
  3075.           RJ     UNPACK
  3076.           SA1    FILETYP
  3077.           ZR     X1,RECAS
  3078.           MX2    58          X2 := -3
  3079.           IX1    X1+X2
  3080.           MI     X1,*+2
  3081.           ZR     X1,RECNO
  3082.           EQ     RECEI
  3083.           SX1    X1+B1
  3084.           MI     X1,RECBI
  3085.           EQ     RECKE
  3086. * RECEIVE ASCII8 FILES
  3087.           MX0    53
  3088.           BX5    -X0*X5
  3089.           MI     B5,*+3
  3090.           SB5    -4
  3091.           BX7    X5
  3092.           EQ     RECEI
  3093.           LX7    12
  3094.           SB5    B5+B1
  3095.           BX7    X7+X5
  3096.           MI     B5,*+1
  3097.           RJ     WWRITE
  3098.  RECEI    RJ     UNPACK
  3099.           MI     X5,RECCOM4
  3100.           SX4    X5-10
  3101.           ZR     X4,*-2
  3102.           SX4    X5-13
  3103.           NZ     X4,*-8
  3104.           RJ     ELINE
  3105.           EQ     *-4
  3106. * RECEIVE ASCII FILES
  3107.           RJ     AWRITE
  3108.  RECAS    RJ     UNPACK
  3109.           MI     X5,RECCOM4
  3110.           SX4    X5-10
  3111.           ZR     X4,*-2
  3112.           SX4    X5-13
  3113.           NZ     X4,*-4
  3114.           RJ     SLINE
  3115.           EQ     RECAS
  3116. * RECEIVE BINARY FILES
  3117.           MI     B5,*+2
  3118.           SB5    -13
  3119.           BX7    X5
  3120.           EQ     RECBI
  3121.           SB5    B5+B1
  3122.           MI     B5,*+4
  3123.           BX4    X5
  3124.           AX4    4
  3125.           MX0    56
  3126.           BX4    -X0*X4
  3127.           BX5    -X0*X5
  3128.           LX7    4
  3129.           BX7    X7+X4
  3130.           RJ     WWRITE
  3131.           SB5    -14
  3132.           EQ     *-4
  3133.           SB5    B5+B1
  3134.           LX7    8
  3135.           BX7    X7+X5
  3136.           MI     B5,*+1
  3137.           RJ     WWRITE
  3138.  RECBI    RJ     UNPACK
  3139.           PL     X5,*-9
  3140.           EQ     RECCOM4
  3141. * RECEIVE KERMIT-FORMAT BINARY FILES
  3142.           MI     B5,*+2
  3143.           SB5    -6
  3144.           BX7    X5
  3145.           EQ     *+3
  3146.           SB5    B5+B1
  3147.           LX7    8
  3148.           BX7    X7+X5
  3149.           MI     B5,*+1
  3150.           RJ     WWRITE
  3151.  RECKE    RJ     UNPACK
  3152.           PL     X5,*-5
  3153.           EQ     RECCOM4
  3154. * RECEIVE DISPLAY CODE FILES
  3155.           SX4    X5-15
  3156.           PL     X4,*+2      X4 < 0 FOR CERTAIN SYMBOLS
  3157.           SA5    X5+ASCTAB
  3158.           EQ     RECNO-1
  3159.           SX4    X4-10
  3160.           PL     X4,*+2      X4 < 0 FOR DIGITS
  3161.           SX5    X5+12
  3162.           EQ     RECNO-1     DIGITS
  3163.           SX5    X5-10
  3164.           SX4    X5-22
  3165.           MI     X4,*-4      X4 < 0 FOR CERTAIN SYMBOLS
  3166.           SX4    X4-26
  3167.           MI     X4,*+4      X4 < 0 FOR UPPER CASE LETTERS
  3168.           SX5    X5-26
  3169.           SX4    X5-28
  3170.           MI     X4,*-6      X4 < 0 FOR CERTAIN SYMBOLS
  3171.           SX4    X4-26
  3172.           MI     X4,*+2      X4 < 0 FOR LOWER CASE LETTERS
  3173.           SA5    X5+ASCTAB-26
  3174.           EQ     RECNO-1
  3175.           SX5    X4+27       LETTERS
  3176.           EQ     RECNO-1
  3177.           MX0    53
  3178.           BX5    -X0*X5      SHAVE OFF EIGHTH BIT IF NECESSARY
  3179.           SX5    X5-33
  3180.           PL     X5,*-12     X5 >= 0 IF PRINTABLE
  3181.           SX5    45          BLANK
  3182.           RJ     SWRITE
  3183.  RECNO    RJ     UNPACK
  3184.           MI     X5,RECCOM4
  3185.           SX4    X5-10
  3186.           ZR     X4,*-2
  3187.           SX4    X5-13
  3188.           NZ     X4,*-6
  3189.           RJ     SLINE
  3190.           EQ     RECNO
  3191. *
  3192.  RECEOF   SA2    A2+B1       CONTENTS OF DATA FIELD
  3193.           SX2    X2-68       IS IT A DISCARD
  3194.           ZR     X2,RECEOF2
  3195.           SA3    FILETYP
  3196.           SX7    FILE
  3197.           SA1    FILETOT
  3198.           SX6    X1+B1
  3199.           SA6    A1
  3200.           RJ     OREST
  3201.           ZR     X3,RECEOFA
  3202.           MX0    58          X0 := -3
  3203.           IX3    X0+X3
  3204.           PL     X3,RECEOFA
  3205.           PL     B5,RECEOF1  BINARY FILE ENDS AT A WORD BOUNDARY
  3206.           SX3    X3+B1
  3207.           ZR     X3,*+6
  3208.           NZ     X7,*+2      IF X7 CONTAINS DATA, FILL WITH ZEROS
  3209.           SB4    B5+14
  3210.           ZR     B4,RECEOF1
  3211.  +        LX7    4
  3212.           SB5    B5+B1
  3213.           MI     B5,*
  3214.           RJ     WWRITE      WRITE LAST WORD OF FILE
  3215.           EQ     RECEOF1-1
  3216.           SX3    -B5
  3217.           LX7    4
  3218.  +        LX7    8
  3219.           SB5    B5+B1
  3220.           MI     B5,*
  3221.           BX7    X7+X3
  3222.           LX7    56
  3223.           EQ     *-4
  3224.  RECEOFA  MI     B5,*+1
  3225.           MX0    48
  3226.           BX6    -X0*X7      HAVE WE HAD AN EOLN
  3227.           ZR     X6,RECEOF1
  3228.           ZR     X3,*+3      SIX BIT FILE CODES HAVE X3 = 0 HERE
  3229.           RJ     ELINE
  3230.           EQ     *+2
  3231.           RJ     SLINE
  3232.           RJ     OSAVE
  3233.  RECEOF1  WRITER FILE
  3234.           EQ     RECEOF3
  3235.  RECEOF2  RETURN FILE
  3236.  RECEOF3  RJ     LOGLIN
  3237.           SB3    EOFM
  3238.           RJ     ZWRITE
  3239.           SB3    FILE
  3240.           RJ     ZWRITE
  3241.           SA3    CBUF+99
  3242.           RJ     SLINE
  3243.           SX3    X3-68       TEST FOR DISCARD INSTRUCTION
  3244.           NZ     X3,*+4
  3245.           SB2    9
  3246.           RJ     XWRITE
  3247.           SB3    DISCARM
  3248.           RJ     ZWRITE
  3249.           RJ     SLINE
  3250.           RJ     WSTATS
  3251.           RJ     OSAVE
  3252.           SA1    CURN
  3253.           SX7    X1+B1
  3254.           MX0    54
  3255.           BX7    -X0*X7
  3256.           SA7    A1
  3257.           SX6    X1+32
  3258.           BX7    X7-X7
  3259.           SA7    FILNAM
  3260.           SX7    35
  3261.           SA7    CBUF
  3262.           SX7    89          Y = ACK
  3263.           SA6    A7+B1
  3264.           SA7    A6+B1
  3265.           EQ     RECCOM2-1
  3266.  SHOWP    TITLE  INFORMATION ROUTINES
  3267. ** SHOWP EXECUTES A REMOTE SHOW COMMAND.
  3268.  SHOWP    SPACE  3,10
  3269.  SHOWP    RJ     LOGLIN
  3270.           SA1    CMDLIST+12  SHOW
  3271.           RJ     INFOSUB
  3272.           SB3    SETLIST+4   BIT-PREFIX
  3273.           RJ     PZLINE
  3274.           SB5    10
  3275.           SA5    BITPREF
  3276.           RJ     PTVWAC
  3277.           SB3    BLOCKM
  3278.           RJ     PZLINE
  3279.           SB3    SETLIST+10  DEBUG
  3280.           RJ     PZLINE
  3281.           SB5    15
  3282.           SA5    DEBUGW
  3283.           SB3    X5+KNAME+2
  3284.           RJ     PZWRITE
  3285.           SB3    DEFAULM
  3286.           RJ     PZLINE
  3287.           SB5    B5-B1
  3288.           RJ     DEFFILE     DEFAULT FILE NAME
  3289.           SA6    UPDAT
  3290.           SB3    A6
  3291.           RJ     PZWRITE
  3292.           SB3    SETLIST+15  DELAY
  3293.           RJ     PZLINE
  3294.           SB5    15
  3295.           SA3    TIMEOUT
  3296.           RJ     PNWRITE
  3297.           SB3    SETLIST+20  ESCAPE
  3298.           RJ     PZWRITE
  3299.           SB5    14
  3300.           SB3    CTRLHYP
  3301.           RJ     PZWRITE
  3302.           SA5    ESCAPEC
  3303.           SX7    X5+64
  3304.           SB3    SETLIST+6   FILE TYPE
  3305.           RJ     PZLINE
  3306.           SA4    FILETYP+1
  3307.           MX0    58
  3308.           BX0    -X0*X4
  3309.           ZR     X0,*+1
  3310.           SX4    X4+B1
  3311.           LX4    2
  3312.           AX4    1
  3313.           SB3    X4+FTLIST+4
  3314.           SB5    11
  3315.           RJ     PZWRITE
  3316.           RJ     PLINE
  3317.           SB3    SETLIST+11  SYNC MARKER
  3318.           RJ     PZWRITE
  3319.           SB5    14
  3320.           SB3    CTRLHYP
  3321.           RJ     PZWRITE
  3322.           SA5    SYNCM
  3323.           SX7    X5+64
  3324.           SB3    SETLIST+16  PACKET LENGTH
  3325.           RJ     PZLINE
  3326.           SB5    7
  3327.           SA3    PLENGTH
  3328.           RJ     PNWRITE
  3329.           SB3    PAREVEN
  3330.           RJ     PZWRITE
  3331.           SB3    SETLIST+8   QUOTE CHARACTER
  3332.           RJ     PZLINE
  3333.           SB5    10
  3334.           SA5    QUOTEC
  3335.           RJ     PTVWAC
  3336.           SB3    SETLIST+13  REPEAT CHARACTER
  3337.           RJ     PZLINE
  3338.           SB5    9
  3339.           SA5    REPETC
  3340.           RJ     PTVWAC
  3341.           SB3    SETLIST+19  RETRY LIMIT
  3342.           RJ     PZLINE
  3343.           SB5    15
  3344.           SA3    RETRYN
  3345.  SHSTEND  RJ     PNWRITE
  3346.           RJ     PLINE
  3347.           SX5    B1
  3348.           LX5    5
  3349.           RJ     PTVWAC
  3350.           EQ     PUTEOF
  3351.  STATUSP  SPACE  4,15
  3352. ** STATUSP EXECUTES A REMOTE STATUS COMMAND.
  3353.  STATUSP  SPACE  3,10
  3354.  STATUSP  RJ     LOGLIN
  3355.           SA1    CMDLIST+16
  3356.           SA2    SETTAB-1
  3357.           BX1    X2
  3358.           RJ     INFOSUB
  3359.           SB3    TRANSFM
  3360.           RJ     PZLINE
  3361.           SB5    5
  3362.           SA3    FILETOT     FILES TRANSFERRED
  3363.           RJ     PNWRITE
  3364.           SB3    LASTFM
  3365.           RJ     PZWRITE
  3366.           SB3    FILNAM+1
  3367.           SB5    12
  3368.           RJ     PZWRITE     NAME OF LAST FILE TRANSFERRED
  3369.           SB3    TRANSFM+4
  3370.           RJ     PZLINE
  3371.           SB5    10
  3372.           SA3    PSENT       PACKETS SENT
  3373.           RJ     PNWRITE
  3374.           RJ     PZWRITE
  3375.           SB5    6
  3376.           SA3    PRECD       PACKETS RECEIVED
  3377.           RJ     PNWRITE
  3378.           RJ     PZWRITE
  3379.           SB5    11
  3380.           SA3    PKERRS      ERRORS IN RECEIVED DATA
  3381.           RJ     PNWRITE
  3382.           RJ     PZWRITE
  3383.           SB5    11
  3384.           SA3    RETRYT      TOTAL RETRIES
  3385.           EQ     SHSTEND
  3386.  SHOWVAL  SPACE  4,15
  3387. ** SHOWVAL DISPLAYS THE VALUES OF KERMIT VARIABLES.
  3388.  SHOWVAL  SPACE  3,10
  3389.  SHOWVAL  SX7    OUTPUT      PREPARE TO WRITE OUTPUT
  3390.           RJ     OREST
  3391.           SB3    SETLIST+4
  3392.           RJ     ZLINE
  3393.           SB2    9
  3394.           RJ     XWRITE
  3395.           SA5    BITPREF     BIT-PREFIX
  3396.           RJ     AWRITE
  3397.           SB3    BLOCKM      CHECKSUM TYPE
  3398.           RJ     ZLINE
  3399.           SB3    SETLIST+10
  3400.           RJ     ZLINE
  3401.           SB2    14
  3402.           RJ     XWRITE
  3403.           SA5    DEBUGW
  3404.           SB3    X5+KNAME+2
  3405.           RJ     ZWRITE      DEBUG
  3406.           SB3    DEFAULM
  3407.           RJ     ZLINE
  3408.           RJ     DEFFILE     CURRENT DEFAULT FILE NAME
  3409.           SA6    UPDAT
  3410.           SB3    A6
  3411.           RJ     ZWRITE
  3412.           SB3    SETLIST+15  DELAY
  3413.           RJ     ZLINE
  3414.           SB2    14
  3415.           RJ     XWRITE
  3416.           SA3    TIMEOUT
  3417.           RJ     NWRITE
  3418.           SB3    SETLIST+20  ESCAPE
  3419.           SB4    ESCAPEC
  3420.           RJ     BCTRLW
  3421.           SB3    SETLIST+6   FILE TYPE
  3422.           RJ     ZLINE
  3423.           SB2    9
  3424.           RJ     XWRITE
  3425.           RJ     WFILTYP
  3426.           SB3    SETLIST+11  SYNC MARKER
  3427.           SB4    SYNCM
  3428.           RJ     BCTRLW
  3429.           SB3    SETLIST+16  PACKET LENGTH
  3430.           RJ     ZLINE
  3431.           SB2    6
  3432.           RJ     XWRITE
  3433.           SA3    PLENGTH
  3434.           RJ     NWRITE
  3435.           SB3    PAREVEN     PARITY
  3436.           RJ     ZWRITE
  3437.           SB3    SETLIST+8   QUOTE CHARACTER
  3438.           RJ     ZLINE
  3439.           SB2    9
  3440.           RJ     XWRITE
  3441.           SA5    QUOTEC
  3442.           RJ     AWRITE
  3443.           SB3    SETLIST+13  REPEAT CHARACTER
  3444.           RJ     ZLINE
  3445.           SB2    8
  3446.           RJ     XWRITE
  3447.           SA5    REPETC
  3448.           RJ     AWRITE
  3449.           SB3    SETLIST+19  RETRY
  3450.           RJ     ZLINE
  3451.           SB2    14
  3452.           RJ     XWRITE
  3453.           SA3    RETRYN
  3454.           RJ     NWRITE
  3455.           RJ     SLINE
  3456.           EQ     MAINPRG
  3457.  STATUSV  SPACE  4,15
  3458. ** STATUSV DISPLAYS THE CURRENT TRANSFER STATISTICS.
  3459.  STATUSV  SPACE  3,10
  3460.  STATUSV  SX7    OUTPUT
  3461.           RJ     OREST       PREPARE TO WRITE ON OUTPUT
  3462.           SB3    TRANSFM
  3463.           RJ     ZLINE
  3464.           SB2    4
  3465.           RJ     XWRITE
  3466.           SA3    FILETOT     NUMBER OF FILES TRANSFERRED
  3467.           RJ     NWRITE
  3468.           SB3    LASTFM      NAME OF LAST FILE TRANSFERRED
  3469.           RJ     ZWRITE
  3470.           SB2    11
  3471.           RJ     XWRITE
  3472.           SB3    FILNAM+1
  3473.           RJ     ZWRITE
  3474.           RJ     WSTATS
  3475.           EQ     MAINPRG
  3476.  GETHELP  SPACE  4,16
  3477. ** GETHELP OBTAINS LONG HELP MESSAGES FROM THE FILE ZZZKHLP, A MULTI-
  3478. *  RECORD FILE.
  3479.  GETHELP  SPACE  3,10
  3480.  GETHELP  SA4    HELPLOC
  3481.           SX6    X5+B1
  3482.           SA6    A4          SAVE THE NEXT POSITION IN ZZZKHLP
  3483.           SX6    ZZZKHLP
  3484.           SA6    INFI
  3485.           NZ     X4,GETHLP1
  3486.           REWIND ZZZKHLP     HERE THE FILE  HAS NOT YET BEEN USED
  3487.           SA5    HELPLOC
  3488.           SX4    B1+B1
  3489.  GETHLP1  IX1    X5-X4       COMPUTE RELATIVE LOCATION
  3490.           PL     X1,GETHLP2  IF X1 >= 0, WE MOVE FORWARD
  3491.           BX1    -X1         OTHERWISE WE MOVE BACK
  3492.           SKIPB  ZZZKHLP,X1,R
  3493.           EQ     GETHLP3
  3494.  GETHLP2  ZR     X1,GETHLP3
  3495.           SKIPF  ZZZKHLP,X1,R
  3496.  GETHLP3  SA1    KMODE
  3497.           NZ     X1,GETHLP4  X1 <> 0 IN SERVER MODE
  3498.           SX2    ZZZKHLP
  3499.           RJ     FREAD       FILL READ BUFFER
  3500.           RJ     OUTSTRT
  3501.           EQ     *+2
  3502.           BX7    X6
  3503.           RJ     WWRITE
  3504.           RJ     WREAD
  3505.           ZR     X1,*-2
  3506.           EQ     MAINPRG
  3507.  GETHLP4  RJ     LOGLIN      IN SERVER MODE, SEND HELP IN PACKETS
  3508.           SA1    HELPM
  3509.           RJ     INFOSUB
  3510.           SX6    ZZZKHLP
  3511.           SA6    INFI
  3512.           BX2    X6
  3513.           RJ     FREAD
  3514.           EQ     SENAS
  3515.  KERMIT   TITLE  INITIALISATION
  3516.  KERMIT   SB1    1
  3517.           OPEN   INPUT,READNR,R
  3518.           OPEN   OUTPUT,WRITENR,R
  3519.           SX6    ZZZKHLP
  3520.           RJ     TESTFIL
  3521.           ZR     X6,DEBACL-2
  3522.           SX6    ZZZKLOG
  3523.           RJ     TESTFIL     DOES THE LOG FILE EXIST
  3524.           NZ     X6,KERMIT1  IF SO, WRITE ON END OF IT
  3525.           SX6    1R1         IF NOT, START WITH TOP-OF-PAGE
  3526.           SA6    A6-B1
  3527.           EQ     KERMIT2
  3528.  KERMIT1  SKIPEI X2,R
  3529.  KERMIT2  SETFS  ZZZKLOG,NAD
  3530.           SX6    ZZZKDAT
  3531.           RJ     TESTFIL     WAS THERE A PUSH COMMAND
  3532.           ZR     X6,KERMIT3
  3533.           REWIND ZZZKDAT,R
  3534.           READ   ZZZKDAT,R
  3535.           SA2    ZZZKDAT+3   GET ADDR OF START OF DATA
  3536.           SX3    X2+12
  3537.           SA1    A2-B1       GET ADDR AFTER END OF DATA
  3538.           BX3    X3-X1
  3539.           NZ     X3,DEBACLD  X3 <> 0 IF FILE NOT PROPER LENGTH
  3540.           SA1    X2          BITPREFIX
  3541.           SA2    A1+B1       DEBUG
  3542.           SA3    A2+B1       DEFAULT FILE
  3543.           SA4    A3+B1       ESCAPE CHAR
  3544.           BX6    X1
  3545.           SA6    BITPREF
  3546.           BX6    X2
  3547.           BX7    X3
  3548.           SA6    DEBUGW
  3549.           SA7    A6+B1       DEFAULF
  3550.           BX7    X4
  3551.           SA7    A7+B1       ESCAPEC
  3552.           SA1    A4+B1       FILE TYPE
  3553.           SA2    A1+B1       SYNC MARKER
  3554.           SA3    A2+B1       PACKET LENGTH
  3555.           BX7    X1
  3556.           SA7    FILETYP+1
  3557.           SA4    A3+B1       QUOTE CHARACTER
  3558.           BX7    X2
  3559.           BX6    X3
  3560.           SA7    A7+B1       SYNCM
  3561.           SA6    A7+B1       PLENGTH
  3562.           BX6    X4
  3563.           SA6    QUOTEC
  3564.           SA1    A4+B1       REPEAT PREFIX
  3565.           SA2    A1+B1       TIMEOUT
  3566.           SA3    A2+B1       NUMBER OF FILES TRANSFERRED
  3567.           SA4    A3+B1       RETRY LIMIT
  3568.           BX6    X1
  3569.           BX7    X2
  3570.           SA6    REPETC
  3571.           SA7    A6+B1       TIMEOUT
  3572.           BX6    X4
  3573.           SA6    RETRYN
  3574.           BX7    X3
  3575.           SA7    A7+B1       FILETOT
  3576.           RETURN ZZZKDAT
  3577.  KERMIT3  SA2    INPUT+1
  3578.           SA1    OUTPUT+1
  3579.           LX2    1
  3580.           LX3    B1,X1
  3581.           PL     X2,DEBACL-1 INPUT IS NOT FROM A TERMINAL
  3582.           PL     X3,DEBACL-1 OUTPUT IS NOT TO A TERMINAL
  3583.           SX2    B1
  3584.           LX2    36          FLUSH BIT
  3585.           BX7    X1+X2
  3586.           SA7    A1          SET FLUSH BIT IN OUTPUT
  3587.           SA3    ZZZKLOG+1
  3588.           BX7    X2+X3
  3589.           SA7    A3          SET FLUSH BIT IN LOG FILE
  3590.           SA1    DUMMY+4
  3591.           BX6    X1
  3592.           SA6    DUMMY+2
  3593.           PROMPT OFF
  3594.           CSET   ASCII
  3595.           SETTL  77777B      SET TIME LIMIT TO MAXIMUM
  3596.           SETLOF LOFS        THESE FILES WILL BE FLUSHED
  3597.           DATE   UPDAT
  3598.           RJ     LOGLIN      START LOG FILE
  3599.           SB3    KNAME
  3600.           RJ     ZWRITE
  3601.           SB2    5
  3602.           RJ     XWRITE
  3603.           SB3    UPDAT
  3604.           RJ     ZWRITE
  3605.           RJ     OSAVE
  3606.           SA3    TPARAMS     SET PARITY AND PAGE CHARACTERISTICS
  3607.           RJ     OUTSTRT     SET UP OUTPUT FOR WRITING
  3608.           BX7    X3
  3609.           SA7    B6+B7
  3610.           SB6    B6+B1
  3611.           SA3    A3+B1
  3612.           BX7    X3
  3613.           SA7    B6+B7
  3614.           SB6    B6+B1
  3615.           EQ     MAINPRG
  3616.  COMSEL   TITLE  START TO PROCESS EACH COMMAND
  3617.  FILEASK  ZR     X1,COMSEL-1  X1 = 0 WHEN WE ARE IN COMMAND MODE
  3618.           SX5    23          OTHERWISE SEND A HELP MESSAGE
  3619.           EQ     GETHELP
  3620.           SB3    FTLIST      ASK ABOUT FILES
  3621.           EQ     LWRITE
  3622.  COMSEL   SB3    OFFLIST     ASK FOR HELP WITH SET DEBUG
  3623.           EQ     LWRITE
  3624.  COMDIFF  EQU    COMSEL-KNAME
  3625.           SB3    OFFLIST     AMBIGUOUS 'O'
  3626.           EQ     LWRITE
  3627.           BX7    X7-X7       OFF = 0
  3628.           EQ     SETDBG
  3629.           SX7    B1          ON = 1
  3630.           EQ     SETDBG
  3631.           SB3    CMDLIST     LIST COMMANDS
  3632.           EQ     LWRITE
  3633.           SX7    CMDLIST+6   EXIT
  3634.           EQ     FINIS
  3635.           SX7    CMDLIST+10  PUSH
  3636.           EQ     PUSHIT
  3637.           SX7    CMDLIST+13  QUIT
  3638.           EQ     FINIS
  3639.           EQ     RECVCOM     RECEIVE
  3640.           SB3    CMDLIST     AMBIGUOUS 'SE'
  3641.           EQ     LWRITE
  3642.           EQ     SENDCOM     SEND
  3643.           EQ     SERVCOM     SERVER
  3644.           SB7    SETTAB      SET
  3645.           EQ     CREAD
  3646.           EQ     SHOWVAL     SHOW
  3647.           EQ     STATUSV     STATUS
  3648.           SB3    SETLIST     ASK ABOUT SET
  3649.           EQ     LWRITE
  3650.           EQ     SETBIT      BIT-PREFIX
  3651.           SB3    SETLIST     AMBIGUOUS 'DE'
  3652.           EQ     LWRITE
  3653.           SB7    KNAME       DEBUG
  3654.           EQ     CREAD
  3655.           EQ     SETDELA     DELAY
  3656.           EQ     SETESCA     ESCAPE
  3657.           SB7    FTYPES      FILE-TYPE
  3658.           EQ     CREAD
  3659.           EQ     SETMARK     MARKER
  3660.           EQ     SETPACL     PACKET-LENGTH
  3661.           EQ     SETQUOT     QUOTE-CHAR
  3662.           SB3    SETLIST     AMBIGUOUS 'RE'
  3663.           EQ     LWRITE
  3664.           EQ     SETREP      REPEAT-CHAR
  3665.           EQ     SETTRY      RETRY
  3666.           SA1    KMODE       ASK ABOUT FILES
  3667.           EQ     FILEASK
  3668.           BX7    X7-X7       ASCII
  3669.           EQ     SETFILE
  3670.           SX7    B1          ASCII8
  3671.           LX7    2
  3672.           EQ     SETFILE
  3673.           SX7    B1          BINARY
  3674.           EQ     SETFILE
  3675.           MX7    58          DISPLAY CODE
  3676.           BX7    -X7
  3677.           EQ     SETFILE
  3678.           MX7    58          DIS64
  3679.           BX7    -X7
  3680.           EQ     SETFILE
  3681.           SX7    B1          EIGHT
  3682.           LX7    2
  3683.           EQ     SETFILE
  3684.           SX7    B1+B1       KERMIT
  3685.           EQ     SETFILE
  3686.           MX7    58          NORMAL
  3687.           BX7    -X7
  3688.           EQ     SETFILE
  3689.           SX7    B1          8
  3690.           LX7    2
  3691.           EQ     SETFILE
  3692.  SERVHLP  SX5    22          GET HELP WITH SERVER COMMANDS
  3693.           EQ     GETHELP
  3694.           SX5    22          AMBIGUOUS S
  3695.           EQ     GETHELP
  3696.           SB7    FTYPES      SET-FILE-TYPE
  3697.           EQ     CREAD
  3698.           EQ     SHOWP       SHOW
  3699.           EQ     STATUSP     STATUS
  3700.           SB5    -7          TYPE
  3701.           EQ     TYPECOM
  3702.  PUSHIT   TITLE  PROGRAM TERMINATION
  3703. ** PUSHIT TERMINATES EXECUTION AFTER SAVING VARIABLES.
  3704.  PUSHIT   SPACE  3,10
  3705.           RJ     SREAD
  3706.  PUSHIT   MI     X5,*+3      TEST FOR END-OF-LINE
  3707.           SX4    X5-45
  3708.           ZR     X4,*-2      IGNORE BLANKS
  3709.           SX5    12
  3710.           EQ     GETHELP
  3711.           SA7    UPDAT
  3712.           EVICT  ZZZKDAT     GET RID OF ANYTHING ELSE ON FILE
  3713.           SX6    WBUF
  3714.           SA6    ZZZKDAT+3   START OF DATA
  3715.           SA3    BITPREF
  3716.           BX7    X3
  3717.           SA7    X6          BIT PREFIX
  3718.           SA3    DEBUGW
  3719.           BX7    X3
  3720.           SA7    A7+B1       DEBUG SETTING
  3721.           SA3    A3+B1       DEFAULF
  3722.           BX7    X3
  3723.           SA7    A7+B1       DEFAULT FILE NUMBER
  3724.           SA3    A3+B1       ESCAPEC
  3725.           BX7    X3
  3726.           SA7    A7+B1       ESCAPE CHARACTER
  3727.           SA3    FILETYP+1
  3728.           BX7    X3
  3729.           SA7    A7+B1       FILE TYPE
  3730.           SA3    A3+B1       SYNCM
  3731.           BX7    X3
  3732.           SA7    A7+B1       PACKET SYNCHRONISATION MARKER
  3733.           SA3    A3+B1       PLENGTH
  3734.           BX7    X3
  3735.           SA7    A7+B1       PACKET LENGTH TO REQUEST
  3736.           SA3    QUOTEC
  3737.           BX7    X3
  3738.           SA7    A7+B1       QUOTE CHARACTER
  3739.           SA3    REPETC
  3740.           BX7    X3
  3741.           SA7    A7+B1       REPEAT PREFIX
  3742.           SA3    A3+B1       TIMEOUT
  3743.           BX7    X3
  3744.           SA7    A7+B1       TIMEOUT TO REQUEST
  3745.           SA3    A3+B1       FILETOT
  3746.           BX7    X3
  3747.           SA7    A7+B1       NUMBER OF FILES TRANSFERRED
  3748.           SA3    RETRYN
  3749.           BX7    X3
  3750.           SA7    A7+B1       NUMBER OF RETRIES PERMITTED
  3751.           SX6    A7+B1
  3752.           SA6    A6-B1       ADDRESS AFTER END OF DATA
  3753.           WRITER ZZZKDAT
  3754.           SETFS  ZZZKDAT,NAD
  3755.           EQ     FINIS1
  3756.  FINIS    SPACE  4,15
  3757. ** FINIS TERMINATES EXECUTION WITHOUT SAVING VARIABLES.
  3758.  FINIS    SPACE  3,10
  3759.           RJ     SREAD
  3760.  FINIS    MI     X5,*+3
  3761.           SX4    X5-45
  3762.           ZR     X4,*-2
  3763.           SX5    11
  3764.           EQ     GETHELP
  3765.           SA7    UPDAT
  3766.           RETURN ZZZKDAT
  3767.  FINIS1   RJ     LOGLIN
  3768.           SA2    UPDAT
  3769.           SB3    X2
  3770.           RJ     ZWRITE
  3771.           RJ     SLINE
  3772.           RJ     OSAVE
  3773.           WRITER ZZZKLOG
  3774.           ENDRUN
  3775.           SPACE  4,6
  3776.  OPL      XTEXT  COMCSYS
  3777.  OPL      XTEXT  COMCCIO
  3778.  OPL      XTEXT  COMCLFM
  3779.  OPL      XTEXT  COMCCPM
  3780.           XREF   A
  3781.           END    KERMIT
  3782.