home *** CD-ROM | disk | FTP | other *** search
/ Columbia Kermit / kermit.zip / d / nosker.src < prev    next >
Text File  |  2020-01-01  |  336KB  |  9,027 lines

  1. KERMIT
  2.           IDENT  KERMIT 
  3.           ENTRY  KERMIT 
  4.           SYSCOM B1 
  5.           SST    PPR
  6.           TITLE  KERMIT PROTOCOL HANDLER. 
  7.           COMMENT KERMIT PROTOCOL HANDLER 
  8.           SPACE  4,10 
  9. ***       KERMIT - KERMIT PROTOCOL HANDLER. 
  10. *         KERMIT IS AN IMPLEMENTATION OF THE 'KERMIT PROTOCOL'
  11. *         DEVELOPED AT THE UNIVERSITY OF COLUMBIA. THIS VERSION 
  12. *         SUPPORTS A MINIMAL COMMAND/PROTOCOL SET AND IS INTENDED 
  13. *         TO BE USE MAINLY IN 'SERVER' MODE. WINDOWING AS PER 
  14. *         RECOMMENDATIONS IS SUPPORTED. 
  15. *         P. JARVIS.               86/02/19.
  16.           SPACE  4,10 
  17. ***       MODIFICATION HISTORY. 
  18. *         AUGUST 1986.  VERSION 1.2 
  19. *              ORIGINAL STABALISED
  20. *         JANUARY 1987.  VERSION 1.3
  21. *              INTERACTIVE HELP ADDED 
  22. *              CORRECTIONS TO PROCESSING DUPLICATE PACKETS
  23. *              ADD SYMBOL 'PSR' TO ALLOW WINDOWING BELOW NOS 2.3
  24. *              ADD BINARY FORMAT SUPORT 
  25. *              CORRECT RECEIVE DATA TIMEOUT PROCESSING
  26. *              CHANGE DEFAULT PACKET LENGTH TO 94 
  27. *              CORRECT PROCESSING OF RECEIVED ILLEGAL CHARACTERS
  28.           SPACE  4,10 
  29. ***       METHOD OF USE.
  30. *         KERMIT IS DESIGNED TO BE RUN BY A USER UNDER THE IAF
  31. *         SUBSYSTEM. THE USER LOGS ON TO THE HOST IN THE NORMAL 
  32. *         MANNER AND THEN INITIATES KERMIT. KERMIT DIRECTIVES MAY 
  33. *         BE ENTERED FROM A LOCAL FILE OR FROM THE KERMIT COMMAND 
  34. *         (OR BOTH). SEE LATER SECTION FOR DETAILS. 
  35. *             KERMIT[,I=LFN1][,D=LFN2][,L=LFN3].
  36. *                  LFN1 = NAME OF FILE CONTAINING KERMIT DIRECTIVES 
  37. *                            (DEFAULT = INPUT,  'I' = INPUT)
  38. *                  LFN2 = NAME OF FILE TO RECEIVE DEBUG DATA (IF ON)
  39. *                            (DEFAULT = ZZZZDBG,  'D' = DBG)
  40. *                  LFN3 = NAME OF FILE TO RECEIVE LOG DATA (IF ON)
  41. *                            (DEFAULT = ZZZZLOG,  'L' = LOG)
  42.           SPACE  4,10 
  43. ***       DAYFILE MESSAGES. 
  44. *         * ILLEGAL PARAMETER - XX.* - INDICATES PARAMETER 'XX' IS
  45. *                                      INVALID AND KERMIT IS ABORTED. 
  46. *         * ILLEGAL - XXXXXXX      * - INDICATES THE COMMAND XXXXXXX
  47. *                                      INVALID AND KERMIT IS ABORTED. 
  48.           SPACE  4,10 
  49. ****      SYSTEM DEPENDANT SYMBOLS. 
  50.  PSR      EQU    647         SYSTEM PSR LEVEL 
  51. ****
  52.           SPACE  4,10 
  53. ****      DEFAULT SYMBOLS.
  54.  D_CODE   EQU    1           0 = DIS64, 1 = ASCII, 2 = ASCII8, 3 = HEX
  55.  D_DEBUG  EQU    0           0 = DEBUG OFF, 1 = DEBUG ON
  56.  D_DELAY  EQU    6           DELAY IN SECONDS BEFORE 'SENDING'
  57.  D_EOL    EQU    015B        C/R AT END OF LINE 
  58.  D_MARK   EQU    1           SOH (START OF PACKET MARKER) 
  59.  D_MAXL   EQU    94          MAXIMUM PACKET LENGTH
  60.  D_MODE   EQU    1           0 = LOCAL, 1 = SAVE, 2 = REPLACE 
  61.  D_NPAD   EQU    0           NUMBER OF PADDING CHARACTERS 
  62.  D_PADC   EQU    0           PADDING CHARACTER
  63.  D_QUIET  EQU    0           QUIET MODE FLAG (0 = SEND WAKEUP NAKS) 
  64.  D_WSIZE  EQU    8           WINDOW SIZE
  65. ****
  66.           SPACE  4,10 
  67. *         COMMON DECK SYMBOLS.
  68.  OPL      XTEXT  COMSPFM
  69.  OPL      XTEXT  COMSRPV
  70.           SPACE  4,10 
  71. *         ASSEMBLY CONSTANTS. 
  72.  CBUFL    EQU    201B        COMMAND/CATLIST BUFFER LENGTH
  73.  DBUFL    EQU    1001B       DEBUG BUFFER LENGTH
  74.  IBUFL    EQU    101B        TERMINAL INPUT BUFFER LENGTH 
  75.  LBUFL    EQU    101B        LOG FILE BUFFER LENGTH 
  76.  FBUFL    EQU    1001B       FILE BUFFER LENGTH 
  77.  OBUFL    EQU    201B        TERMINAL OUTPUT BUFFER LENGTH
  78.  WTABL    EQU    34          WINDOW TABLE LENGTH
  79.  OBCNT    EQU    36          OUTPUT BUFFER COUNT
  80.  OBLEN    EQU    41          OUTPUT BUFFER LENGTH 
  81.  LFTABL   EQU    64          LOCAL FILE TABLE LENGTH
  82.           SPACE  4,10 
  83. *         PACKET TYPE SYMBOLS.
  84.  CHKERR   EQU    0           CHECKSUM ERROR 
  85.  TIMEOUT  EQU    1           TIME OUT                             [ T ] 
  86.  DATA     EQU    2           DATA PACKET                          [ D ] 
  87.  ACK      EQU    3           ACKNOWLEDGE PACKET                   [ Y ] 
  88.  NAK      EQU    4           NEGATIVE ACKNOWLEDGE PACKET          [ N ] 
  89.  SENDI    EQU    5           SEND INITIATE PACKET                 [ S ] 
  90.  BREAK    EQU    6           BREAK TRANSMISSION PACKET (EOT)      [ B ] 
  91.  FILEH    EQU    7           FILE HEADER PACKET                   [ F ] 
  92.  EOF      EQU    8           END OF FILE PACKET                   [ Z ] 
  93.  ERROR    EQU    9           ERROR PACKET                         [ E ] 
  94.  RECI     EQU    10          RECEIVE INITIATE PACKET              [ R ] 
  95.  GENCOM   EQU    11          GENCOM  COMMAND PACKET               [ G ] 
  96.  INITP    EQU    12          INIT PACKET                          [ I ] 
  97.  FILEX    EQU    13          FILE HEADER (TYPED) PACKET 
  98.           SPACE  4,10 
  99. *         PACKET OFFSET SYMBOLS.
  100.  PLINK    EQU    0           LINK TO NEXT PACKET
  101.  PLEN     EQU    1           PACKET LENGTH
  102.  PSEQ     EQU    2           PACKET SEQUENCE NUMBER 
  103.  PTYPE    EQU    3           PACKET TYPE
  104.  PDATA    EQU    4           START OF DATA
  105.           SPACE  4,10 
  106. *         ERROR CODES.
  107.  E_PROERR EQU    0           PROTOCOL ERROR 
  108.  E_TIMEOT EQU    1           PROTOCOL TIME OUT
  109.  E_RLIMIT EQU    2           PACKET RETRY LIMIT EXCEEDED
  110.  E_ILDATA EQU    3           ILLEGAL DATA PACKET STRUCTURE
  111.  E_FILENF EQU    4           FILE NOT FOUND 
  112.  E_ILCHAR EQU    5           ILLEGAL CHARACTER CODE 
  113.           SPACE  4,10 
  114. *         MICRO DEFINITIONS.
  115.  VERSION  MICRO  1,,*1.30*
  116.           SPACE  4,10 
  117. *         FILE ENVIRONMENT TABLES.
  118.  C        BSS    0           COMMAND BUFFER 
  119.  INPUT    FILEB  CBUF,CBUFL,FET=8 
  120.  D        BSS    0           DEBUG FILE 
  121.  ZZZZDBG  FILEB  DBUF,DBUFL,FET=8 
  122.  I        BSS    0           TERMINAL INPUT FILE
  123.  ZZZZZIN  FILEB  IBUF,IBUFL,FET=8,DTY=2RTT
  124.  L        BSS    0           LOGGING FILE 
  125.  ZZZZLOG  FILEB  LBUF,LBUFL,FET=8 
  126.  F        BSS    0           FILE BUFFER
  127.  ZZZZZFN  FILEB  FBUF,FBUFL,FET=16,EPR
  128.  O        BSS    0           TERMINAL OUTPUT FILE 
  129.  ZZZZZOU  FILEB  OBUF,OBUFL,FET=8,DTY=2RTT
  130.  S        BSS    0           STATUS FET 
  131.  ZZZZZST  FILEB  CBUF,CBUFL,FET=8 
  132.  Q        BSS    0           CATLIST BUFFER 
  133.  ZZZZCAT  FILEB  CBUF,CBUFL,FET=16,EPR
  134.  H        BSS    0           HELP FILE
  135.  ZZZZHLP  RFILEB CBUF,CBUFL,FET=8,EPR 
  136.           SPACE  4,10 
  137. *         ARGUMENT EQUIVALENCE TABLE. 
  138.  ARGTAB   BSS    0           ARGUMENT TABLE 
  139.           VFD    12/0LD,18/ASVD,12/3,18/D 
  140.           VFD    12/0LI,18/ASVI,12/3,18/C 
  141.           VFD    12/0LL,18/ASVL,12/3,18/L 
  142.           VFD    60/0 
  143.   
  144.  ASVD     VFD    42/0LDBG,18/3
  145.  ASVI     VFD    42/0LINPUT,18/3
  146.  ASVL     VFD    42/0LLOG,18/3
  147.           SPACE  4,10 
  148. *         REPRIEVE BLOCK. 
  149.  RPB      RPVBLK KMT4 
  150.           SPACE  4,10 
  151. **        MACRO DEFINITIONS.
  152.           SPACE  2,10 
  153. **        CHR - CONVERT NONE PRINTING CHARACTER.
  154. *         CHR  X
  155.   
  156.  CHR      MACRO  X
  157.           CON    32D+X
  158.           ENDM
  159.           SPACE  2,10 
  160. **        CTL - CONVERT CONTROL CODE TO PRINTABLE FORM. 
  161. *         CTL  X
  162.   
  163.  CTL      MACRO  X
  164.           CON    64D&_X 
  165.           ENDM
  166.           SPACE  2,10 
  167. **        CDC - CREATE ASCII TO CDC CONVERSION TABLE ENTRY. 
  168. *         CDC   EXT,DIS,PKT,SYM 
  169. *               EXT = EXTENDED (6/12) DISPLAY CODE
  170. *               DIS = 6 BIT DISPLAY CODE (64 CHARACTER SET) 
  171. *               PKT = PACKET ORDINAL IF VALID PACKET TYPE 
  172. *               SYM = SET IF NOT VALID IN SYMBOLIC NAME 
  173.   
  174.  CDC      MACRO  EXT,DIS,PKT,SYM
  175.           LOCAL  N
  176.           BASE   OCTAL
  177.  .1       IFC    EQ,/SYM/*/ 
  178.           VFD    1/1,5/0
  179.  .1       ELSE
  180.           VFD    1/0,5/0
  181.  .1       ENDIF 
  182.  N        SET    PKT 777776 
  183.           VFD    18D/N
  184.  N        SET    DIS 777776 
  185.           VFD    18D/N
  186.           VFD    18D/EXT
  187.           BASE   *
  188.           ENDM
  189.           SPACE  2,10 
  190. **        ASC - CREATE CDC TO ASCII CONVERSION TABLE ENTRY. 
  191. *         ASC   DIS,D76,D74 
  192. *               DIS = ASCII EQUIVALENT OF 6 BIT CODE
  193. *               D76 = EQUIVALENT OF 76NN CODE 
  194. *               D74 = EQUIVALENT OF 74NN CODE 
  195.   
  196.  ASC      MACRO  DIS,D76,D74
  197.           LOCAL  N
  198.           BSS    0
  199.  N        SET    D76 -1 
  200.           VFD    2/0,18/N 
  201.  N        SET    D74 -1 
  202.           VFD    2/0,18/N 
  203.           VFD    2/0,18/DIS 
  204.           ENDM
  205.           SPACE  2,10 
  206. **        CVE - CREATE VALIDATION ENTRY.
  207. *         CVE    TEXT,NUM,TYPE,HELP,ADR,V1,V2 
  208. *         WHERE:- 
  209. *                 TEXT = COMMAND NAME 
  210. *                  NUM = NUMBER OF SIGNIFICANT CHARACTERS 
  211. *                 TYPE = PROCESSING TYPE CODE 
  212. *                        0 - FURTHER TABLE ENTRIES REQUIRED 
  213. *                        1 - SET VARIABLE TO SPECIFIC VALUE 
  214. *                        2 - SET VARIABLE TO NUMERIC PARAMETER
  215. *                        3 - PROCESS AT GIVEN ADDRESS 
  216. *                        4 - RETURN GIVEN MESSAGE REQUEST 
  217. *                 HELP = HELP MESSAGE ORDINAL 
  218. *                  ADR = ADDRESS OF TABLE OR VARIABLE 
  219. *                   V1 = VALUE OR MAXIMUM EXTENT
  220. *                   V2 = MINIMUM EXTENT 
  221.           SPACE  2,10 
  222.  CVE      MACRO  TEXT,NUM,TYPE,HELP,ADR,V1,V2 
  223.           NOREF  N,N1 
  224.  M        MICRO  1,,*_TEXT_*
  225.  N        MICCNT M
  226.  N1       SET    1
  227.  .1       DUP    N
  228.  M        MICRO  N1,1,*_TEXT_*
  229.           VFD    7/040B+1R"M" 
  230.  N1       SET    N1+1 
  231.  .1       ENDD
  232.  N1       SET    8-N
  233.           ERRNG  N1          COMMAND NAME LONGER THAN 8 CHARACTERS
  234.           IFGT   N1,0,2 
  235.  N1       SET    N1*7 
  236.           VFD    N1/0 
  237.           VFD    4/NUM
  238.           IFC    EQ,/TYPE/0/,1
  239.           VFD    18/0,18/ADR,18/HELP,6/0
  240.           IFC    EQ,/TYPE/1/,1
  241.           VFD    18/V1,18/ADR,18/HELP,6/1 
  242.           IFC    EQ,/TYPE/2/,1
  243.           VFD    9/V1,9/V2,18/ADR,18/HELP,6/2 
  244.           IFC    EQ,/TYPE/3/,1
  245.           VFD    18/V1,18/ADR,18/HELP,6/3 
  246.           IFC    EQ,/TYPE/4/,1
  247.           VFD    18/0,18/HELP,18/HELP,6/4 
  248.           ENDM
  249.           SPACE  2,10 
  250. **        MSG - DEFINE MESSAGE FOR ERROR PACKET.
  251. *         MSG   TEXT
  252. *               TEXT = REQUIRED CHARACTERS (6 BIT DISPLAY CODE) 
  253.   
  254.           MACRO  MSG,SYM,TEXT 
  255.           LOCAL  M,N
  256.  SYM      BSS    0
  257.  M        MICRO  1,,#_TEXT_#
  258.  M        MICCNT M
  259.  N        SET    1
  260.           CODE   ASCII
  261.  .1       DUP    M
  262.  M        MICRO  N,1,#_TEXT_# 
  263.           CON    1R"M"+040B 
  264.  N        SET    N+1
  265.  .1       ENDD
  266.           CODE   *
  267.  SYM_L    EQU    *-SYM
  268.           ENDM
  269.           SPACE  2,10 
  270. **        STATE - GENERATE STATE TABLE ENTRY. 
  271. *   ST    STATE  P1,P2,P3,P4,P5,P6,P7,P8,P9,P10 
  272. *                ST = CURRENT STATE ORDINAL 
  273. *                PN = NEXT STATE ORDINAL
  274.   
  275.           MACRO  STATE,ST,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P 
  276.           IF     -DEF,S.ORD,1 
  277.  S.ORD    SET    0
  278.  ST       EQU    S.ORD
  279.  S.ORD    SET    S.ORD+1
  280.           VFD    7/A,7/B,7/C,7/D,7/E,7/F,7/G,7/H,4/0
  281.           VFD    7/I,7/J,7/K,7/L,7/M,7/N,7/O,7/P,4/0
  282.           BSSZ   2
  283.           ENDM
  284.           SPACE  4,10 
  285. *         VARIABLES.
  286.  DEBUG    CON    D_DEBUG     DEBUG FLAG (0 = OFF, 1 = ON) 
  287.  PFFLAG   CON    D_MODE      P.F. FLAG (0 = LOCAL, 1 = SAVE, 2 = REPLACE
  288.  MARK     CON    D_MARK      MARK CHARACTER (START OF PACKET) 
  289.  MAXL     CON    D_MAXL      MAIMUM PACKET LENGTH 
  290.  NPAD     CON    D_NPAD      NUMBER OF PADDING CHARACTERS 
  291.  PADC     CON    D_PADC      PADDING CHARACTER
  292.  EOL      CON    D_EOL       END OF LINE MARKER 
  293.  SEQ      CON    0           CURRENT SEQUENCE NUMBER
  294.  DELAY    CON    D_DELAY     DELAY TIME BEFORE 'SENDING' FILE 
  295.  EMODE    CON    0           ERROR MODE (SEE 'PROCFPE' FOR DEFINITION)
  296.  ILCHAR   CON    0           ILLEGAL CHARACTER CODE 
  297.  TMODE    CON    0           TRANSFER MODE (0=SERVER, 1=SEND, 2=REC.) 
  298.  QUIETF   CON    D_QUIET     QUIET MODE FLAG (0 = SEND NAKS)
  299.  PSTATE   CON    0           PREVIOUS PROTOCOL STATE
  300.  STATE    CON    0           CURRENT PROTOCOL STATE 
  301.  CSTATE   CON    -1          CHANGED STATE FLAG (0 IF SAME STATE AS PREV
  302.  RETRY    CON    5           RETRY COUNTER
  303.  TIMER    CON    10          TIMEOUT TIMER (IN SECONDS) 
  304.  RETIME   CON    5           RETRY TIMEOUT COUNTER
  305.  RXQCTL   CON    043B        RECEIVE CONTROL QUOTE CHARACTER
  306.  TXQCTL   CON    043B        TRANSMIT CONTROL QUOTE CHARACTER 
  307.  QBIN     CON    0           8 BIT QUOTE CHARACTER
  308.  CHKT     CON    0           CHECKSUM TYPE (DEFAULT)
  309.  REPT     CON    0           REPEAT QUOTE CHARACTER 
  310.  FIRSTF   CON    0           FIRST FILE FLAG (-1 IF FIRST FILE) 
  311.  TTYPE    CON    0           TRANSFER TYPE ( 0 = FILE, 1 = TYPE ) 
  312.  FNAME    CON    0           FILE NAME
  313.  FMASK    CON    0           FILE NAME MASK 
  314.  CNAME    CON    0           CURRENT FILE NAME
  315.  ANAME    CON    0           ALTERNATIVE FILE NAME
  316.  FFORM    CON    D_CODE      FILE FORMAT (0=DIS64, 1=ASCII, 2=ASCII8) 
  317.                                          (3=HEX, 4=BINARY)
  318.  FWORD    CON    0           FILE WORD FOR I/O
  319.  FCOUNT   CON    0           UNPACKING COUNTER
  320.  RXPWORD  CON    0           RX PREFIX WORD 
  321.  TXPWORD  CON    0           TX PREFIX WORD 
  322.  CAPAS    CON    2           CAPABILITY FLAG BITS 
  323.  FQPTR    CON    0           FREE QUEUE POINTER 
  324.  IQPTR    CON    0           INPUT QUEUE POINTER
  325.  LASTSEQ  CON    0           LAST SEQUENCE NUMBER IN RECEIVE WINDOW 
  326.  RWSIZE   CON    D_WSIZE     REQUESTED WINDOW SIZE
  327.  WSIZE    CON    0           USED WINDOW SIZE 
  328.  WPTR     CON    0           WINDOW TABLE POINTER 
  329.  WTABLE   BSSZ   WTABL       WINDOW TABLE 
  330.  LFPTR    CON    0           LOCAL FILE LIST POINTER
  331.  LFTAB    BSS    LFTABL+1    LOCAL FILE NAME TABLE
  332.  HELPCDE  CON    0           HELP MESSAGE CODE NUMBER 
  333.  HLPTABL  BSSZ   20          HELP FILE POINTER TABLE
  334.  LINEP    BSSZ   1           LINE POINTER 
  335.  LINE     BSSZ   100         LINE STRING BUFFER 
  336.  LOGPTR   CON    128         LOG BUFFER POINTER 
  337.  LOGBUF   BSS    128         LOG BUFFER 
  338.           SPACE  4,10 
  339. **        ASCII TO CDC CONVERSION TABLE.
  340. *         THE TABLE FORMAT IS AS FOLLOWS:-
  341. *T 1/F,5/0,18/CODE,18/6BIT,18/612 
  342. *         WHERE:- 
  343. *                F    = SET IF INVALID IN FILE NAME 
  344. *                CODE = PACKET TYPE CODE (-1 IF INVALID)
  345. *                6BIT = 6 BIT DISPLAY CODE (-1 IF INVALID)
  346. *                EXT  = EXTENDED (6/12) DISPLAY CODE
  347.   
  348.  A2C      BSS    0           ASCII TO CDC CONVERSION TABLE
  349.           LOC    0
  350.           CDC    7640,,,*    NUL
  351.           CDC    7641,,,*    SOH
  352.           CDC    7642,,,*    STX
  353.           CDC    7643,,,*    ETX
  354.           CDC    7644,,,*    EOT
  355.           CDC    7645,,,*    ENQ
  356.           CDC    7646,,,*    ACK
  357.           CDC    7647,,,*    BEL
  358.           CDC    7650,,,*    BS 
  359.           CDC    7651,,,*    HT 
  360.           CDC    7652,,,*    LF 
  361.           CDC    7653,,,*    VT 
  362.           CDC    7654,,,*    FF 
  363.           CDC    7655,,,*    CR 
  364.           CDC    7656,,,*    SO 
  365.           CDC    7657,,,*    SI 
  366.           CDC    7660,,,*    DLE
  367.           CDC    7661,,,*    DC1
  368.           CDC    7662,,,*    DC2
  369.           CDC    7663,,,*    DC3
  370.           CDC    7664,,,*    DC4
  371.           CDC    7665,,,*    NAK
  372.           CDC    7666,,,*    SYN
  373.           CDC    7667,,,*    ETB
  374.           CDC    7670,,,*    CAN
  375.           CDC    7671,,,*    EM 
  376.           CDC    7672,,,*    SUB
  377.           CDC    7673,,,*    ESC
  378.           CDC    7674,,,*    FS 
  379.           CDC    7675,,,*    GS 
  380.           CDC    7676,,,*    RS 
  381.           CDC    7677,,,*    VS 
  382.           CDC    55,55,,*    SPACE
  383.           CDC    66,66,,*    !
  384.           CDC    64,64,,*    "
  385.           CDC    60,60,,*    #
  386.           CDC    53,53,,*    $
  387.           CDC    63,63,,*    PERCENT
  388.           CDC    67,67,,*    &
  389.           CDC    70,70,,*    '
  390.           CDC    51,51,,*    (
  391.           CDC    52,52,,*    )
  392.           CDC    47,47,,*    *
  393.           CDC    45,45,,*    +
  394.           CDC    56,56,,*    ,
  395.           CDC    46,46,,*    -
  396.           CDC    57,57,,*    .
  397.           CDC    50,50,,*    /
  398.           CDC    33,33       0
  399.           CDC    34,34       1
  400.           CDC    35,35       2
  401.           CDC    36,36       3
  402.           CDC    37,37       4
  403.           CDC    40,40       5
  404.           CDC    41,41       6
  405.           CDC    42,42       7
  406.           CDC    43,43       8
  407.           CDC    44,44       9
  408.           CDC    7404,00,,*  COLON
  409.           CDC    77,77,,*    SEMI-COLON 
  410.           CDC    72,72,,*    <
  411.           CDC    54,54,,*    =
  412.           CDC    73,73,,*    >
  413.           CDC    71,71,,*    ?
  414.           CDC    7401,74,,*  AT SIGN
  415.           CDC    01,01       U.C. A 
  416.           CDC    02,02,BREAK U.C. B 
  417.           CDC    03,03       U.C. C 
  418.           CDC    04,04,DATA  U.C. D 
  419.           CDC    05,05,ERROR U.C. E 
  420.           CDC    06,06,FILEH U.C. F 
  421.           CDC    07,07,GENCOM U.C. G
  422.           CDC    10,10       U.C. H 
  423.           CDC    11,11,INITP U.C. I 
  424.           CDC    12,12       U.C. J 
  425.           CDC    13,13       U.C. K 
  426.           CDC    14,14       U.C. L 
  427.           CDC    15,15       U.C. M 
  428.           CDC    16,16,NAK   U.C. N 
  429.           CDC    17,17       U.C. O 
  430.           CDC    20,20       U.C. P 
  431.           CDC    21,21       U.C. Q 
  432.           CDC    22,22,RECI  U.C. R 
  433.           CDC    23,23,SENDI U.C. S 
  434.           CDC    24,24       U.C. T 
  435.           CDC    25,25       U.C. U 
  436.           CDC    26,26       U.C. V 
  437.           CDC    27,27       U.C. W 
  438.           CDC    30,30       U.C. X 
  439.           CDC    31,31,ACK   U.C. Y 
  440.           CDC    32,32,EOF   U.C. Z 
  441.           CDC    61,61,,*    [
  442.           CDC    75,75,,*    BACK / 
  443.           CDC    62,62,,*    ]
  444.           CDC    7402,76,,*  ^
  445.           CDC    65,65,,*    UNDERSCORE 
  446.           CDC    7407,,,*    BACK QUOTE 
  447.           CDC    7601,01     L.C. A 
  448.           CDC    7602,02     L.C. B 
  449.           CDC    7603,03     L.C. C 
  450.           CDC    7604,04     L.C. D 
  451.           CDC    7605,05     L.C. E 
  452.           CDC    7606,06     L.C. F 
  453.           CDC    7607,07     L.C. G 
  454.           CDC    7610,10     L.C. H 
  455.           CDC    7611,11     L.C. I 
  456.           CDC    7612,12     L.C. J 
  457.           CDC    7613,13     L.C. K 
  458.           CDC    7614,14     L.C. L 
  459.           CDC    7615,15     L.C. M 
  460.           CDC    7616,16     L.C. N 
  461.           CDC    7617,17     L.C. O 
  462.           CDC    7620,20     L.C. P 
  463.           CDC    7621,21     L.C. Q 
  464.           CDC    7622,22     L.C. R 
  465.           CDC    7623,23     L.C. S 
  466.           CDC    7624,24     L.C. T 
  467.           CDC    7625,25     L.C. U 
  468.           CDC    7626,26     L.C. V 
  469.           CDC    7627,27     L.C. W 
  470.           CDC    7630,30     L.C. X 
  471.           CDC    7631,31     L.C. Y 
  472.           CDC    7632,32     L.C. Z 
  473.           CDC    7633,,,*    LEFT BRACE 
  474.           CDC    7634,,,*    VERTICAL BAR 
  475.           CDC    7635,,,*    RIGHT BRACE
  476.           CDC    7636,,,*    TILDE
  477.           CDC    7637,,,*    DEL
  478.           LOC    *O 
  479.           SPACE  4,10 
  480. **        CDC TO ASCII CONVERSION TABLE.
  481. *         THE TABLE FORMAT IS AS FOLLOWS:-
  482. *T 2/0,18/76NN,2/0,18/74NN,2/0,18/NN
  483. *         WHERE:- 
  484. *                THE REQUIRED TABLE ENTRY IS INDEXED BY THE CDC DISPLAY 
  485. *                76NN = ASCII CODE FOR DIPLAY CODE 76NN 
  486. *                74NN = ASCII CODE FOR DISPLAY CODE 74NN
  487. *                NN   = ASCII CODE FOR DISPLAY CODE NN
  488. *         NOTE:-
  489. *               IF THE ASCII VALUE OBTAINED FROM THIS TABLE IS NEGATIVE 
  490. *               THEN THE SOURCE DISPLAY ESCAPE SEQUENCE IS ILLEGAL. 
  491.   
  492.  C2A      BSS    0           CDC TO ASCII CONVERSION TABLE
  493.           LOC    0
  494.           ASC    072B                  COLON
  495.           ASC    101B,141B,100B        A
  496.           ASC    102B,142B,136B        B
  497.           ASC    103B,143B             C
  498.           ASC    104B,144B,072B        D
  499.           ASC    105B,145B             E
  500.           ASC    106B,146B             F
  501.           ASC    107B,147B,140B        G
  502.           ASC    110B,150B             H
  503.           ASC    111B,151B             I
  504.           ASC    112B,152B             J
  505.           ASC    113B,153B             K
  506.           ASC    114B,154B             L
  507.           ASC    115B,155B             M
  508.           ASC    116B,156B             N
  509.           ASC    117B,157B             O
  510.           ASC    120B,160B             P
  511.           ASC    121B,161B             Q
  512.           ASC    122B,162B             R
  513.           ASC    123B,163B             S
  514.           ASC    124B,164B             T
  515.           ASC    125B,165B             U
  516.           ASC    126B,166B             V
  517.           ASC    127B,167B             W
  518.           ASC    130B,170B             X
  519.           ASC    131B,171B             Y
  520.           ASC    132B,172B             Z
  521.           ASC    060B,173B             0
  522.           ASC    061B,174B             1
  523.           ASC    062B,175B             2
  524.           ASC    063B,176B             3
  525.           ASC    064B,177B             4
  526.           ASC    065B,000B             5
  527.           ASC    066B,001B             6
  528.           ASC    067B,002B             7
  529.           ASC    070B,003B             8
  530.           ASC    071B,004B             9
  531.           ASC    053B,005B             +
  532.           ASC    055B,006B             -
  533.           ASC    052B,007B             *
  534.           ASC    057B,010B             /
  535.           ASC    050B,011B             (
  536.           ASC    051B,012B             )
  537.           ASC    044B,013B             $
  538.           ASC    075B,014B             =
  539.           ASC    040B,015B             SPACE
  540.           ASC    054B,016B             ,
  541.           ASC    056B,017B             .
  542.           ASC    043B,020B             #
  543.           ASC    133B,021B             [
  544.           ASC    135B,022B             ]
  545.           ASC    045B,023B             PERCENT
  546.           ASC    042B,024B             "
  547.           ASC    137B,025B             UNDERSCORE 
  548.           ASC    041B,026B             !
  549.           ASC    046B,027B             &
  550.           ASC    047B,030B             '
  551.           ASC    077B,031B             ?
  552.           ASC    074B,032B             <
  553.           ASC    076B,033B             >
  554.           ASC    100B,034B             AT SIGN
  555.           ASC    134B,035B             BACK / 
  556.           ASC    136B,036B             CAROT
  557.           ASC    073B,037B             SEMI-COLON 
  558.           LOC    *O 
  559.           SPACE  4,10 
  560. *         HEX TO DISPLAY CODE CONVERSION TABLE. 
  561.   
  562.  H2D      BSS    0           HEX TO DISPLAY CODE CONVERSION TABLE.
  563.           LOC    0
  564.           CON    1R0
  565.           CON    1R1
  566.           CON    1R2
  567.           CON    1R3
  568.           CON    1R4
  569.           CON    1R5
  570.           CON    1R6
  571.           CON    1R7
  572.           CON    1R8
  573.           CON    1R9
  574.           CON    1RA
  575.           CON    1RB
  576.           CON    1RC
  577.           CON    1RD
  578.           CON    1RE
  579.           CON    1RF
  580.           LOC    *O 
  581.           CODE   ASCII
  582.   
  583.  VTABLE   BSS    0           VALIDATION TABLE 
  584.           CVE    HELP,1,3,2,SVT18,2 
  585.           CVE    EXIT,1,3,25,SVT20,3
  586.           CVE    RECEIVE,1,3,23,SVT24,2 
  587.           CVE    SEND,3,3,22,SVT22,1
  588.           CVE    SERVER,3,3,24,SVT20,0
  589.           CVE    SET,3,0,3,VT.A 
  590.           CVE    STATUS,3,4,-7
  591.           CVE    TAKE,3,3,28,SVT22,-1 
  592.           CVE    VERSION,3,4,-5 
  593.           CON    0
  594.   
  595.  VT.A     BSS    0           SET VALIDATION TABLE 
  596.           CVE    CODE,1,0,4,VT.A1 
  597.           CVE    DEBUG,3,0,10,VT.A2 
  598.           CVE    DELAY,3,2,13,DELAY,500,0 
  599.           CVE    MODE,1,0,14,VT.A3
  600.           CVE    WINDOW,1,0,18,VT.A4
  601.           CON    0
  602.   
  603.  VT.A1    BSS    0           CODE VALIDATION TABLE
  604.           CVE    ASCII,5,1,5,FFORM,1
  605.           CVE    ASCII8,6,1,6,FFORM,2 
  606.           CVE    BINARY,3,1,7,FFORM,4 
  607.           CVE    DIS64,3,1,8,FFORM,0
  608.           CVE    HEX,3,1,9,FFORM,3
  609.           CON    0
  610.   
  611.  VT.A2    BSS    0           SET DEBUG VALIDATION TABLE 
  612.           CVE    ON,2,1,11,DEBUG,1
  613.           CVE    OFF,2,1,12,DEBUG,0 
  614.           CON    0
  615.   
  616.  VT.A3    BSS    0           MODE VALIDATION TABLE
  617.           CVE    LOCAL,3,1,15,PFFLAG,0
  618.           CVE    REPLACE,3,1,16,PFFLAG,2
  619.           CVE    SAVE,3,1,17,PFFLAG,1 
  620.           CON    0
  621.   
  622.  VT.A4    BSS    0           WINDOW VALIDATION TABLE
  623.           CVE    ON,2,1,19,RWSIZE,D_WSIZE 
  624.           CVE    OFF,2,1,20,RWSIZE,0
  625.           CVE    SIZE,1,2,21,RWSIZE,31,0
  626.           CON    0
  627.   
  628.  HTABLE   BSS    0           HELP VALIDATION TABLE
  629.           CVE    ASCII,5,4,5
  630.           CVE    ASCII8,6,4,6 
  631.           CVE    BINARY,3,4,7 
  632.           CVE    DIS64,3,4,8
  633.           CVE    HEX,3,4,9
  634.           CVE    CODE,1,4,4 
  635.           CVE    DEBUG,3,4,10 
  636.           CVE    DELAY,3,4,13 
  637.           CVE    MODE,2,4,14
  638.           CVE    WINDOW,3,4,18
  639.           CVE    HELP,3,4,2 
  640.           CVE    EXIT,3,4,25
  641.           CVE    RECEIVE,3,4,23 
  642.           CVE    SEND,3,4,22
  643.           CVE    SERVER,3,4,24
  644.           CVE    SET,3,4,3
  645.           CVE    STATUS,3,4,27
  646.           CVE    TAKE,3,4,28
  647.           CVE    VERSION,3,4,26 
  648.           CVE    COMMAND,7,4,1
  649.           CON    0
  650.           CODE   *
  651.   
  652.           SPACE  4,10 
  653. *         ****  ENTRY  **** 
  654.   
  655.  KERMIT   SB1    1
  656.   
  657. *         PROCESS ARGUMENTS.
  658.   
  659.           SA1    ACTR        (X1) = ARGUMENT COUNT
  660.           SA4    ARGR        (X4) = FIRST ARGUMENT
  661.           SB5    ARGTAB      (B5) = FWA OF ARGUMENT TABLE 
  662.           SB4    X1+         (B4) = ARGUMENT COUNT
  663.           RJ     ARG         PROCESS ARGUMENT LIST
  664.           ZR     X1,KMT2     NO ERROR 
  665.   
  666. *         ARGUMENT ERROR. 
  667.   
  668.           MX6    42 
  669.           BX6    X4*X6       (X6) = ILLEGAL ARGUMENT
  670.           SX4    1R 
  671.           BX6    X4+X6       ADD BLANK
  672.           LX6    60-6        LEFT JUSTIFY BLANK 
  673.           SA6    KMT.C+2     SAVE IN MESSAGE BUFFER 
  674.           MESSAGE KMT.C,3,R  ISSUE MESSAGE
  675.           ABORT 
  676.   
  677. *         INITIALISE. 
  678.   
  679.           SX6    FPE
  680.           SA6    STATE       INITIALISE STATE VARIABLE
  681.  KMT2     RJ     WHF         WRITE HELP FILE
  682.           RJ     ITF         INITIALISE TERMINAL FILES
  683.           RJ     SFB         SET FLUSH BITS 
  684.           RJ     OLF         OPEN LOG FILE
  685.           SA1    KMT.A       (X1) = FIRST WORD OF LOG MESSAGE 
  686.           RJ     WLM         WRITE LOG MESSAGE
  687.           RJ     PID         PROCESS INPUT DIRECTIVES 
  688.           RJ     STI         SET TERMINAL INTERFACE 
  689.           RJ     DBC         DEBUG COMMENCE (IF SELECTED) 
  690.           RJ     IBC         INITIALISE BUFFER CHAIN
  691.           SX1    1           (X1) = INITIAL WINDOW SIZE 
  692.           RJ     IWP         INITIALISE WINDOW POINTER
  693.           REPRIEVE RPB,SETUP,277B 
  694.           WRITEC O,KMT.A     WRITE INITIALISATION MESSAGE 
  695.           WRITER X2,R 
  696.           MESSAGE KMT.A,1,R  SET 'B' DISPLAY
  697.           SA1    TMODE       (X1) = TRANSFER MODE 
  698.           SA1    KMT.B+X1    (X1) = INITIAL STATE CODE
  699.           SX6    X1 
  700.           EQ     SGS         SET GIVEN STATE
  701.   
  702. *         PROCESS REPRIEVE. 
  703.   
  704.  KMT4     RJ     DBX         DEBUG EXCHANGE PACKAGE AREA
  705.           SX6    3           FLAG TERMINATE MODE
  706.           SA6    TMODE       SAVE 
  707.           EQ     PROCABT     PROCESS ABORT
  708.   
  709.  KMT.A    DIS    ,'KERMIT INITIALISED.' 
  710.  KMT.B    BSS    0           INITIAL STATE TABLE
  711.           CON    SCW         SERVER 
  712.           CON    SND         SEND 
  713.           CON    REC         RECEIVE
  714.           CON    CMP         QUIT 
  715.  KMT.C    CON    10H ILLEGAL P,10HARAMETER -,0
  716.           TITLE  PROTOCOL STATE PROCESSORS. 
  717. **        PROTOCOL STATE PROCESSORS.
  718. *         THE FOLLOWING ROUTINE ARE USED TO CHANGE THE CURRENT
  719. *         PROTOCOL STATE ACCORDING TO THE SPECIFIED PROCESS.
  720. *         CPS - CHANGE PROTOCOL STATE 
  721. *         PCS - PROCESS CURRENT STATE 
  722. *         SGS - SET GIVEN STATE 
  723. *         WCS - WAIT FOR INPUT AND CHANGE STATE 
  724.           SPACE  4,10 
  725. ****      KERMIT STATE TABLE. 
  726. *         THE KERMIT STATE TABLE DESCRIBES ALL THE STATE CHANGES
  727. *         REQUIRED DURING THE PROTOCOL. THE TABLE IS IN EFFECT A
  728. *         MATRIX THE ROW NUMBER BEING THE CURRENT STATE AND THE 
  729. *         COLUMN NUMBER BEING THE ACTION CODE TO CHANGE STATE (THIS 
  730. *         IS NORMALLY AN INPUT PACKET TYPE). THE CODE AT THE ROW
  731. *         AND COLUMN INTERSECTION IS THE REQUIRED NEW STATE.
  732.   
  733.   
  734.  STABLE   BSS    0           KERMIT STATE TABLE 
  735.           LOC    0
  736.   
  737. * INIT            ?   T   D   A   N   S   B   F   Z   E   R   G   I 
  738.  FPE      STATE  ___,___,___,___,___,___,___,___,___,ERR,___,___,___
  739.  SCW      STATE  SCW,SCT,SCW,SCW,SCW,SCR,SCW,SCW,SCW,ERR,SCS,SCG,INT
  740.  SCT      STATE  SCW,___,___,___,___,___,___,___,___,___,___,___,___
  741.  SND      STATE  ___,___,___,___,___,___,___,___,___,ERR,___,___,___
  742.  REC      STATE  REC,REC,___,___,___,SCR,___,___,___,ERR,___,___,___
  743.  SCS      STATE  SI_,___,___,___,___,___,___,___,___,ERR,___,___,___
  744.  SCR      STATE  ABT,___,___,___,___,___,___,___,___,ERR,___,___,___
  745.  INT      STATE  ___,___,___,___,___,___,___,___,___,___,___,___,___
  746.  SI       STATE  SIE,SIE,SIE,SIV,SIE,SIE,SIE,SIE,SIE,ERR,SIE,SIE,SIE
  747.  SIE      STATE  SIE,SIE,SIE,SIV,SIE,SIE,SIE,SIE,SIE,ERR,SIE,SIE,SIE
  748.  SIV      STATE  SF_,SI_,SI_,SI_,SI_,SI_,SI_,SI_,SI_,ERR,SI_,___,___
  749.  OF       STATE  ___,___,___,___,___,___,___,___,___,ERR,___,___,___
  750.  SF       STATE  SF_,SF_,___,SFW,SFW,___,___,___,___,ERR,___,___,___
  751.  SFW      STATE  ___,SFW,___,SFW,SFW,___,___,___,___,ERR,___,___,___
  752.  SD       STATE  SDT,SDT,___,SD_,SD_,___,___,___,___,ERR,___,___,___
  753.  SDT      STATE  ___,___,___,___,___,___,___,___,___,ERR,___,___,___
  754.  SDW      STATE  SDW,___,___,SDW,SDW,___,___,___,___,ERR,___,___,___
  755.  SEF      STATE  ___,SET,___,OF_,___,___,___,___,___,ERR,___,___,___
  756.  SET      STATE  SET,SET,___,OF_,___,___,___,___,___,ERR,___,___,___
  757.  SB       STATE  ___,SB_,___,CMP,___,___,___,___,___,ERR,___,___,___
  758.  RF       STATE  ___,___,___,___,___,SCR,RDE,RFF,ADP,ERR,___,___,___
  759.  RFF      STATE  ___,___,___,___,___,___,___,___,___,ERR,___,___,___
  760.  RD       STATE  RDT,RDT,RD_,___,___,___,___,ADP,RDW,ERR,___,___,___
  761.  RDT      STATE  ___,___,___,___,___,___,___,___,___,ERR,___,___,___
  762.  RDW      STATE  ___,___,___,___,___,___,___,___,___,ERR,___,___,___
  763.  RDE      STATE  ___,___,___,___,___,___,___,___,___,ERR,___,___,___
  764.  SCG      STATE  ___,___,___,___,___,___,___,___,___,ERR,___,___,___
  765.  ADP      STATE  ___,___,___,___,___,___,___,___,___,___,___,___,___
  766.  ERR      STATE  ___,___,___,___,___,___,___,___,___,___,___,___,___
  767.  ABT      STATE  ___,___,___,___,___,___,___,___,___,ERR,___,___,___
  768.  CMP      STATE  ___,___,___,___,___,___,___,___,___,ERR,___,___,___
  769.   
  770.           LOC    *O 
  771. ****
  772.           SPACE  4,10 
  773. **        CPS - CHANGE PROTOCOL STATE.
  774. *         THIS ROUTINE CHANGES STATE ACCORDING TO THE GIVEN PROCESS 
  775. *         CODE (NORMALLY PACKET TYPE). NOTE THAT THIS CODE IS NOT A 
  776. *         SUBROUTIINE AND SO SHOULD BE ENTERED USING A JUMP NOT 
  777. *         A CALL. 
  778. *         ENTRY  (B1) = 1 
  779. *                (X1) = PROCESS CODE
  780. *         EXIT   (X6) = NEW STATE ORDINAL 
  781. *                STATE CHANGED
  782. *         USES   X - 1, 2, 6, 7.
  783. *                A - 1, 2, 6, 7.
  784. *                B - 7. 
  785. *         CALLS  NONE.
  786.           SPACE  4,10 
  787.  CPS      BSS    0           ENTRY
  788.   
  789.           MX6    -3 
  790.           BX6    -X6*X1      (X6) = WORD POSITION IN STATE TABLE
  791.           SA2    STATE       (X2) = CURRENT STATE ORDINAL 
  792.           BX7    X1-X2       COMPARE NEW STATE WITH PREVIOUS
  793.           AX1    3           (X1) = WORD OFFSET 
  794.           LX2    2           (X2) = OFFSET TO START OF CURENT STATE ENTR
  795.           SX6    X6+B1       OFFSET WORD POSITION 
  796.           IX1    X1+X2       (X1) = OFFSET TO REQUIRED STATE CHANGE 
  797.           BX2    X6 
  798.           SA1    STABLE+X1   (X1) = REQUIRED ENTRY FROM STATE TABLE 
  799.           LX6    3
  800.           IX6    X6-X2       (X6) = 7 * ENTRY POSITION WITHIN WORD
  801.           SB7    X6          (B7) = SHIFT COUNT 
  802.           LX1    B7          RIGHT JUSTIFY REQUIRED STATE 
  803.           MX6    -7 
  804.           BX6    -X6*X1      (X6) = NEW REQUIRED STATE
  805.           SA7    CSTATE      SAVE STATE CHANGE FLAG 
  806. *         EQ     SGS         SET GIVEN STATE
  807.           SPACE  4,10 
  808. **        SGS - SET GIVEN STATE.
  809. *         THIS ROUTINE SETS THE CURRENT STATE TO THE GIVEN
  810. *         VALUE AND THEN STARTS PROCESSING. NOTE THAT THIS
  811. *         IS NOT A SUBROUTINE AND SO SHOULD BE ENTERED VIA
  812. *         A JUMP NOT A CALL.
  813. *         ENTRY  (B1) = 1 
  814. *                (X6) = REQUIRED STATE ORDINAL
  815. *         EXIT   ENTRY TO PROCESS REQUESTED 
  816. *         USES   X - 1. 
  817. *                A - 1, 6.
  818. *                B - NONE.
  819. *         CALLS  DBS. 
  820.           SPACE  4,10 
  821.  SGS      SA6    STATE       SAVE REQUIRED STATE
  822.           SA1    DEBUG       (X1) = DEBUG FLAG
  823.           ZR     X1,PCS      DEBUG OFF
  824.           RJ     DBS         DEBUG STATE
  825. *         EQ     PCS         PROCESS CURRENT STATE
  826.           SPACE  4,10 
  827. **        PCS - PROCESS CURRENT STATE.
  828. *         THIS CODE BRANCHES TO THE REQUIRED CODDE AREA ACCORDING 
  829. *         TO THE CURRENT PROTOCOL STATE. NOTE THAT THIS CODE IS NOT 
  830. *         A SUBROUTINE AND HENCE SHOULD BE JUMPED TO NOT CALLED.
  831. *         ENTRY  CURRENT STATE DEFINED. 
  832. *         EXIT   TO REQUIRED CODE 
  833. *         USES   X - 1. 
  834. *                A - 1. 
  835. *                B - 7. 
  836. *         CALLS  NONE.
  837.   
  838.  PCS      SA1    STATE       (X1) = CURRENT STATE 
  839.           SA1    PCS.A+X1    (X) = PROCESS ADDRESS
  840.           SB7    X1 
  841.           JP     B7+         BRANCH TO PROCESS ADDRESS
  842.   
  843.  PCS.A    BSS    0           PROCESS ADDRESS TABLE
  844.           LOC    0
  845.  FPE      CON    PROCFPE     FORCE PROTOCOL ERROR 
  846.  SCW      CON    PROCSCW     SERVER COMMAND WAIT
  847.  SCT      CON    PROCSCT     SERVER COMMAND TIMEOUT 
  848.  SND      CON    PROCSND     SEND FILE(S) 
  849.  REC      CON    PROCREC     RECEIVE FILE(S)
  850.  SCS      CON    PROCSCS     SERVER COMMAND SEND
  851.  SCR      CON    PROCSCR     SERVER COMMAND RECEIVE 
  852.  INT      CON    PROCINT     PROCESS INIT PACKET
  853.  SI       CON    PROCSI      SEND INIT PACKET 
  854.  SIE      CON    PROCSIE     SENT INIT ERROR
  855.  SIV      CON    PROCSIV     WAIT FOR SEND INIT VERIFY
  856.  OF       CON    PROCOF      OPEN FILE
  857.  SF       CON    PROCSF      SEND FILE
  858.  SFW      CON    PROCSFW     SEND FILE WAIT 
  859.  SD       CON    PROCSD      SEND DATA
  860.  SDT      CON    PROCSDT     SEND DATA TIMEOUT
  861.  SDW      CON    PROCSDW     SEND DATA WAIT 
  862.  SEF      CON    PROCSEF     SEND END OF FILE 
  863.  SET      CON    PROCSET     SEND END OF FILE TIMEOUT 
  864.  SB       CON    PROCSB      SEND BREAK 
  865.  RF       CON    PROCRF      RECEIVE FILE 
  866.  RFF      CON    PROCRFF     RECEIVE FILE - FILE HEADER RECEIVED
  867.  RD       CON    PROCRD      RECEIVE DATA 
  868.  RDT      CON    PROCRDT     RECEIVE DATA TIMEOUT 
  869.  RDW      CON    PROCRDW     RECEIVE DATA WAIT
  870.  RDE      CON    PROCRDE     RECEIVE DATA END 
  871.  SCG      CON    PROCSCG     SERVER GENERIC COMMAND 
  872.  ADP      CON    PROCADP     ACK DUPLICATE (SUPERFLUOUS) PACKET 
  873.  ERR      CON    PROCERR     ERROR CONDITION
  874.  ABT      CON    PROCABT     ABORT
  875.  CMP      CON    PROCCMP     COMPLETE 
  876.           LOC    *O 
  877.           SPACE  4,10 
  878. **        WCS - WAIT FOR INPUT AND CHANGE STATE.
  879. *         THIS ROUTINE WAITS FOR INPUT AND WHEN AVAILABLE CHANGES 
  880. *         STATE ACCORDING TO THE INPUT. IF THERE IS NO INPUT THEN 
  881. *         A TIMEOUT SHOULD OCCURR WHICH WILL CAUSE THE STATE CHANGE.
  882. *         NOTE THAT THIS CODE IS NOT A SUBROUTINE AND SO SHOULD 
  883. *         BE ENTERED USING A JUMP NOT A CALL. 
  884. *         ENTRY  (B1) = 1 
  885. *         EXIT   STATE CHANGED ACCORDING TO INPUT 
  886. *         USES   X - 1, 6.
  887. *                A - 1, 6.
  888. *                B - NONE.
  889. *         CALLS  RTI, SYS=. 
  890.           SPACE  4,10 
  891. *         INITIALISE TIMEOUT COUNTER. 
  892.   
  893.  WCS      SA1    TIMER       (X1) = TIMEOUT REQUIRED IN SECONDS 
  894.           SX6    20          (X6) = CONVERSION TO WAIT TIME 
  895.           IX6    X1*X6       (X6) = NUMBER OF TIMES TO LOOP 
  896.           SA6    WCS.A       SAVE 
  897.   
  898. *         WAIT TILL INPUT AVAILABLE.
  899.   
  900.  WCS2     RJ     RTI         READ TERMINAL INPUT
  901.           NZ     X1,WCS6     INPUT AVAILABLE
  902.           SA1    WCS.A       (X1) = TIMEOUT COUNTER 
  903.           SX6    X1-1        DECREMENT
  904.           SA6    A1+         REPLACE
  905.           ZR     X6,WCS4     TIMEOUT
  906.           WAIT   50          RELINQUISH CPU 
  907.           EQ     WCS2        LOOP TILL INPUT AVAILABLE
  908.   
  909. *         TIMED OUT WHILE WAITING FOR INPUT SO FORCE ERROR. 
  910.   
  911.  WCS4     SX1    TIMEOUT     (X1) = TIMEOUT CODE
  912.           EQ     CPS         CHANGE PROTOCOL STATE
  913.   
  914. *         INPUT AVAILABLE SO DETERMINE PACKET TYPE. 
  915.   
  916.  WCS6     NG     X1,WCS8     CHECKSUM ERROR 
  917.           MX6    -7 
  918.           BX1    -X6*X1      ENSURE TYPE IS 7 BIT ASCII 
  919.           SA1    A2C+X1      TABLE LOOKUP 
  920.           AX1    18+18
  921.           SX1    X1          (X1) = PACKET TYPE ORDINAL 
  922.           PL     X1,CPS      VALID SO CHANGE STATE
  923.   
  924. *         INVALID PACKET TYPE OR CHECKSUM.
  925.   
  926.  WCS8     MX1    0           FLAG CHECKSUM ERROR
  927.           EQ     CPS         CHANGE PROTOCOL STATE
  928.   
  929.  WCS.A    BSS    1           TIMER
  930.           SPACE  4,10 
  931. **        PROCFPE - FORCE PROTOCOL ERROR. 
  932. *         THIS ROUTINE SENDS AN ERROR PACKET SPECIFYING A 
  933. *         'PROTOCOL ERROR' AND ENTERS THE ABORT STATE.
  934.   
  935.  PROCFPE  SX1    1
  936.           RJ     IWP         FORCE MINIMUM WINDOW SIZE
  937.           RJ     IBC         INITIALISE BUFFER CHAIN
  938.   
  939. *         DETERMINE MESSAGE REQUIRED. 
  940.   
  941.           SA1    EMODE       (X1) = ERROR MODE
  942.           MX6    0
  943.           SA6    A1          CLEAR IT FOR NEXT TIME!
  944.           SA1    FPE.A+X1    (X1) = PARAMETER WORD
  945.           SB7    X1          (B7) = LENGTH
  946.           AX1    18 
  947.           SB6    X1          (B6) = FWA OF TEXT 
  948.           SB5    ERROR       (B5) = PACKET TYPE 
  949.           MX3    59          FLAG NEXT SEQUENCE NUMBER
  950.           RJ     BTP         BUILD TRANSMISSION PACKET
  951.           ZR     X6,FPE2     ERROR
  952.           BX1    X6          (X1) = ATTRIBUTES
  953.           RJ     TPK         TRANSMIT PACKET
  954.   
  955.  FPE2     SX6    ABT         FORCE ABORT STATE
  956.           EQ     SGS         SET GIVEN STATE
  957.   
  958.  FPE.A    BSS    0           MESSAGE PARAMETER TABLE
  959.           VFD    24/0,18/FPE.B,18/FPE.BL  0 - PROTOCOL ERROR
  960.           VFD    24/0,18/FPE.C,18/FPE.CL  1 - PROTOCOL TIME OUT 
  961.           VFD    24/0,18/FPE.D,18/FPE.DL  2 - PACKET RETRY LIMIT EXCEEDE
  962.           VFD    24/0,18/FPE.E,18/FPE.EL  3 - ILLEGAL DATA PACKET STRUCT
  963.           VFD    24/0,18/FPE.F,18/FPE.FL  4 - FILE NOT FOUND
  964.           VFD    24/0,18/FPE.G,18/FPE.GL  5 - ILLEGAL CHARACTER 
  965.  FPE.B    MSG    ( PROTOCOL ERROR.) 
  966.  FPE.C    MSG    ( PROTOCOL TIMED OUT.) 
  967.  FPE.D    MSG    ( PACKET RETRY LIMIT EXCEEDED.)
  968.  FPE.E    MSG    ( ILLEGAL DATA PACKET STRUCTURE.)
  969.  FPE.F    MSG    ( FILE NOT FOUND.) 
  970.  FPE.G    MSG    ( ILLEGAL CHARACTER CODE - SEE LOG.) 
  971.           SPACE  4,10 
  972. **        PROCSCW - SERVER COMMAND WAIT.
  973. *         THIS COMMAND WAITS FOR DIRECTIVES VIA THE KERMIT
  974. *         PACKET PROTOCOL.
  975.   
  976.  PROCSCW  MESSAGE SCW.A,1,R 
  977.           RJ     IBC         INITIALISE BUFFER CHAIN
  978.           SX1    1           (X1) = REQUIRED WINDOW SIZE
  979.           RJ     IWP         INITIALISE WINDOW POINTER
  980.           EQ     WCS         WAIT FOR INPUT AND CHANGE STATE
  981.   
  982.  SCW.A    DIS    ,'KERMIT SERVER WAIT.' 
  983.           SPACE  4,10 
  984. **        PROCSCT - SERVER COMMAND TIMEOUT. 
  985. *         THIS STATE IS ENTERED WHEN A TIMEOUT OCCURS IN SERVER 
  986. *         COMMAND WAIT STATE. IF QUIET MODE IS NOT SELECTED THEN
  987. *         A 'NAK' PACKET IS TRANSMITTED EVERY 5 TIMEOUTS. 
  988.   
  989.  PROCSCT  SA1    SCT.A       (X1) = TIME OUT COUNTER
  990.           SX6    X1-1        DECREMENT
  991.           SA6    A1+         REPLACE
  992.           NZ     X6,SCT2     NO 'NAK' REQUIRED
  993.   
  994. *         RESET COUNTER AND CHECK IF IN 'QUIET MODE'. 
  995.   
  996.           SX6    5           (X6) = TIMEOUT COUNTER 
  997.           SA6    A6+         RESET
  998.           SA1    QUIETF      (X1) = QUIET MODE FLAG 
  999.           NZ     X1,SCT2     QUIET MODE SELECTED SO NO 'NAK'
  1000.   
  1001. *         TRANSMIT 'NAK' WITH SEQUENCE NUMBER ZERO. 
  1002.   
  1003.           SX3    B0          (X3) = SEQUENCE NUMBER 
  1004.           RJ     NGP         NAK GIVEN PACKET 
  1005.   
  1006. *         RESET SCW STATE.
  1007.   
  1008.  SCT2     SX6    SCW         (X6) = SERVER COMMAND WAIT 
  1009.           EQ     SGS         SET GIVEN STATE
  1010.   
  1011.  SCT.A    CON    1           TIMEOUT LOOP COUNTER 
  1012.           SPACE  4,10 
  1013. **        PROCSND - SEND FILE(S). 
  1014. *         THIS STATE IS THE NONE SERVER ENTRY FOR SENDING FILES.
  1015. *         IT WAITS FOR THE SPECIFIED DELAY TIME AND THEN ENTERS 
  1016. *         THE SEND INIT STATE.
  1017.   
  1018.  PROCSND  SA1    FNAME       (X1) = FILE NAME POINTER 
  1019.           SB7    X1          (B7) = LWA + 1 OF FILE NAME
  1020.           AX1    18 
  1021.           SB6    X1          (B6) = FWA OF FILE NAME
  1022.           SB5    0           FLAG WILD CARDS VALID
  1023.           SB7    B7-B6       (B7) = CHARACTER COUNT 
  1024.           RJ     BFN         BUILD FILE NAME
  1025.           SA6    FNAME       SAVE FILE NAME 
  1026.           SA7    FMASK       SAVE FILE NAME MASK
  1027.   
  1028.           SA1    SND.B       (X1) = FIRST WORD OF LOG MESSAGE 
  1029.           RJ     WLM         WRITE LOG MESSAGE
  1030.           SA1    DELAY       (X1) = DELAY COUNTER 
  1031.           ZR     X1,SND4     NO DELAY REQUIRED
  1032.           SX6    X1+
  1033.           SA6    SND.A       SAVE DELAY COUNT 
  1034.           MESSAGE SND.C,1,R 
  1035.   
  1036. *         WAIT FOR SPECIFIED DELAY TIME.
  1037.   
  1038.  SND2     WAIT   1000        WAIT FOR ONE SECOND
  1039.           SA1    SND.A       (X1) = LOOP COUNT
  1040.           SX6    X1-1        DECREMENT
  1041.           SA6    A1+         REPLACE
  1042.           NZ     X6,SND2     LOOP TILL DELAY EXPIRED
  1043.   
  1044. *         ENTER SEND INIT STATE.
  1045.   
  1046.  SND4     MESSAGE SND.B,1,R 
  1047.           SX6    SI          (X6) = SEND INIT STATE 
  1048.           EQ     SGS         SET GIVEN STATE
  1049.   
  1050.  SND.A    BSS    1           DELAY COUNTER
  1051.  SND.B    DIS    ,'KERMIT SENDING.' 
  1052.  SND.C    DIS    ,'KERMIT WAITING.' 
  1053.           SPACE  4,10 
  1054. **        PROCREC - RECEIVE FILE(S).
  1055. *         THIS STATE IS ENTERED FOR A NONE SERVER RECEIVE FUNCTION. 
  1056. *         THE STATE WAITS FOR AN 'S' PACKET FROM THE REMOTE END.
  1057.   
  1058.  PROCREC  EQ     WCS         WAIT FOR INPUT 
  1059.           SPACE  4,10 
  1060. **        PROCSCR - SERVER COMMAND RECEIVE. 
  1061. *         THIS STATE IS ENTERED WHEN AN 'S' TYPE PACKET IS
  1062. *         RECEIVED. THE PACKET IS PROCESSED AND AN 'ACK' RETURNED 
  1063. *         WITH THE ACCEPTED ATTRIBUTES. THE 'RECEIVE FILE' STATE
  1064. *         IS THEN ENTERED.
  1065.   
  1066.  PROCSCR  SA1    IQPTR       (X1) = FWA OF 'S' PACKET 
  1067.           SA2    X1+PSEQ     (X2) = SEQUENCE NUMBER 
  1068.           ZR     X2,SCR2     ZERO SO VALID
  1069.           SX6    SCW         RETURN TO WAIT STATE 
  1070.           EQ     SGS         SET GIVEN STATE
  1071.   
  1072. *         PROCESS 'S' PARAMETERS. 
  1073.   
  1074.  SCR2     RJ     CPR         CREATE PARAMETER REPLY 
  1075.           RJ     RIB         RETURN INPUT BUFFER
  1076.           SA1    SCR.A       (X1) = FIRST WORD OF LOG MESSAGE 
  1077.           RJ     WLM         WRITE LOG MESSAGE
  1078.           MESSAGE SCR.A,1,R 
  1079.           SX6    RF          (X6) = NEXT STATE
  1080.           SA6    STATE       SAVE CURRENT STATE 
  1081.           EQ     WCS         WAIT FOR INPUT AND CHANGE STATE
  1082.   
  1083.  SCR.A    DIS    ,'KERMIT RECEIVING.' 
  1084.           SPACE  4,10 
  1085. **        PROCSCS - SERVER COMMAND SEND.
  1086. *         THIS STATE IS ENTERED WHEN AN 'R' PACKET IS RECEIVED WHEN 
  1087. *         SERVER COMMAND WAIT. THE FILE NAME IS EXTRACTED AND THEN
  1088. *         THE SEND INIT STATE IS ENTERED. 
  1089.   
  1090.  PROCSCS  SA1    IQPTR       (X1) = INPUT QUEUE POINTER 
  1091.           SA2    X1+PSEQ     (X2) = PACKET SEQUENCE NUMBER
  1092.           NZ     X2,SCS2     ILLEGAL
  1093.           RJ     UDF         UNPACK DATA FIELD
  1094.           ZR     B7,SCS2     ILLEGAL
  1095.           SB5    0           ALLOW WILD CHARACTERS IN FILE NAME 
  1096.           RJ     BFN         BUILD FILE NAME
  1097.           SX6    0
  1098.           SA6    TTYPE       SET TRANSFER TYPE
  1099.           SX6    SI          (X6) = REQUIRED STATE (SEND INIT)
  1100.           EQ     SGS         SET GIVEN STATE
  1101.   
  1102. *         ILLEGAL SEQUENCE NUMBER.
  1103.   
  1104.  SCS2     RJ     RIB         RETURN INPUT BUFFER
  1105.           SX6    SCW         RETURN TO SERVER COMMAND WAIT
  1106.           EQ     SGS         SET GIVEN STATE
  1107.           SPACE  4,10 
  1108. **        PROCINT - PROCESS INIT PACKET.
  1109. *         THIS STATE IS ENTERED WHEN AN 'I' PACKET IS RECEIVED
  1110. *         WHILE IN THE 'SERVER COMMAND WAIT' STATE. 
  1111.   
  1112.  PROCINT  SA1    IQPTR       (X1) = FWA OF 'I' PACKET 
  1113.           SA2    X1+PSEQ     (X2) = PACKET SEQUENCE NUMBER
  1114.           ZR     X2,INT2     ZERO SO VALID
  1115.           SX6    SCW         RETURN TO WAIT STATE 
  1116.           EQ     SGS         SET GIVEN STATE
  1117.   
  1118.  INT2     RJ     CPR         CREATE PARAMETER REPLY 
  1119.           RJ     RIB         RETURN INPUT BUFFER
  1120.           SX6    SCW         RETURN TO WAIT STATE 
  1121.           EQ     SGS         SET GIVEN STATE
  1122.           SPACE  4,10 
  1123. **        PROCSI - SEND INITIALISATION. 
  1124. *         THIS CODE SENDS AN 'S' PACKET AND THEN AWAITS THE REPLY 
  1125. *         IF NOT A SUITABLE 'ACK' THEN ANOTHER PACKET IS SENT UNTIL 
  1126. *         THE RETRY LIMIT IS REACHED. 
  1127.   
  1128.  PROCSI   MX7    59 
  1129.           SX6    B0 
  1130.           SA7    FIRSTF      FLAG FIRST FILE
  1131.           SA6    SEQ         FORCE ZERO 
  1132.           SB5    SENDI       (B5) = REQUIRED PACKET TYPE
  1133.           SA6    REPT        CLEAR REPEAT CHARACTER 
  1134.           RJ     BCP         BUILD CONNECTION PARAMETERS
  1135.           MX3    59          USE NEXT SEQUENCE NUMBER 
  1136.           RJ     BTP         BUILD TRANSMISSION PACKET
  1137.           RJ     TGP         TRANSMIT GIVEN PACKET
  1138.           EQ     WCS         WAIT FOR INPUT AND CHANGE STATE
  1139.           SPACE  4,10 
  1140. **        PROCSIE - SEND INITIALISATION ERROR.
  1141. *         THIS STATE IS ENTERED WHEN AN ILLEGAL RESPONSE IS 
  1142. *         RECEIVED AFTER SENDING A 'SEND INIT' PACKET. THE
  1143. *         PACKET IS RESENT UNTIL THE RETRY LIMIT IS REACHED.
  1144.   
  1145.  PROCSIE  SX1    0           (X1) = SEQUENCE NUMBER OF PACKET TO RESEND 
  1146.           RJ     RSP         RESEND PACKET
  1147.           EQ     WCS         WAIT FOR INPUT AND CHANGE STATE
  1148.           SPACE  4,10 
  1149. **        PROCSIV - SEND INIT VERIFICATION. 
  1150. *         THIS TASK IS ENTERED WHEN AN 'ACK' IS RECEIVED AFTER A
  1151. *         'SEND INIT' HAS BEEN TRANSMITTED. 
  1152.   
  1153.  PROCSIV  SA1    IQPTR       (X1) = INPUT QUEUE POINTER 
  1154.           SA1    X1+PSEQ     (X1) = PACKET SEQUENCE NUMBER
  1155.           ZR     X1,SIV2     VALID
  1156.           SX6    SIE         FORCE ERROR
  1157.           EQ     SGS         SET GIVEN STATE
  1158.   
  1159. *         PACKET SEQUENCE VALID SO PROCESS. 
  1160.   
  1161.  SIV2     RJ     PPR         PROCESS PARAMETER REPLY
  1162.           RJ     RIB         RETURN INPUT BUFFER
  1163.           SX1    0
  1164.           RJ     PAP         PROCESS ACK PACKET 
  1165.           SX6    OF          (X6) = REQUIRED STATE
  1166.           EQ     SGS         GOTO SET GIVEN STATE 
  1167.           SPACE  4,10 
  1168. **        PROCOF - OPEN FILE. 
  1169. *         THIS ROUTINE GETS THE NEXT FILE NAME AND OPENS THE FILE 
  1170. *         FOR READING.
  1171.   
  1172.  PROCOF   RJ     GNF         GET NEXT FILE
  1173.           NZ     X6,OF2      FILE FOUND 
  1174.   
  1175. *         CHECK THIS IS NOT THE FIRST FILE. 
  1176.   
  1177.           SA1    FIRSTF      (X1) = FIRST FILE FLAG 
  1178.           NG     X1,OF1      FIRST FILE NOT FOUND SO ERROR
  1179.   
  1180. *         NO MORE FILES SO SEND BREAK.
  1181.   
  1182.           SX6    SB          (X6) = REQUIRED STATE
  1183.           EQ     SGS         SET GIVEN STATE
  1184.   
  1185. *         FIRST FILE NOT FOUND SO FLAG ERROR. 
  1186.   
  1187.  OF1      SX6    4
  1188.           SA6    EMODE       SET ERROR MODE 
  1189.           SX6    FPE         FORCE PROTOCOL ERROR 
  1190.           EQ     SGS         SET GIVEN STATE
  1191.   
  1192. *         FILE FOUND SO OPEN FILE.
  1193.   
  1194.  OF2      SX6    0
  1195.           SA6    IQPTR       CLEAR INPUT QUEUE POINTER
  1196.           SA6    FIRSTF      CLEAR FIRST FILE FLAG
  1197.           SA6    FWORD       CLEAR PACKING WORD 
  1198.           SA6    FCOUNT      CLEAR PACKING COUNTER
  1199.           RJ     IBC         INITIALISE BUFFER CHAIN
  1200.           SX1    1           (X1) = REQUIRED WINDOW SIZE
  1201.           RJ     IWP         INITIALISE WINDOW POINTER
  1202.           SA1    OF.A        (X1) = FIRST WORD OF TEXT
  1203.           RJ     WLM         WRITE LOG MESSAGE
  1204.           SX6    SF          (X6) = REQUIRED STATE
  1205.           EQ     SGS         SET GIVEN STATE
  1206.   
  1207.  OF.A     DIS    ,'    SENDING - ;A.' 
  1208.           SPACE  4,10 
  1209. **        PROCSF - SEND FILE. 
  1210. *         THIS ROUTINE SENDS A FILE HEADER FOR THE CURRENTLY
  1211. *         OPEN FILE.
  1212.   
  1213.  PROCSF   SA1    ANAME       CHECK FOR ALTERNATIVE FILE NAME
  1214.           NZ     X1,SF3      ALTERNATIVE SPECIFIED
  1215.           SA1    SF.A-1      (A1) = BUFFER ADDRESS - 1
  1216.           BX6    X1 
  1217.           SA6    A1          PRESET DESTINATION ADDRESS 
  1218.           SX0    77B
  1219.           SB7    -1          CLEAR BYTE COUNT 
  1220.           SA1    CNAME       (X1) = CURRENT FILE NAME 
  1221.           MX6    42 
  1222.           BX1    X1*X6       TRUNCATE TO 7 CHARACTERS 
  1223.   
  1224. *         UNPACK NAME TO STRING BUFFER. 
  1225.   
  1226.  SF2      LX1    6
  1227.           SB7    B7+1        INCREMENT BYTE COUNT 
  1228.           BX2    X0*X1       (X2) = CDC DISPLAY CODE
  1229.           ZR     X2,SF4      END OF NAME
  1230.           SA2    C2A+X2      CONVERT TO ASCII 
  1231.           SX6    X2 
  1232.           SA6    A6+B1       SAVE IN STRING BUFFER
  1233.           SB6    SF.A        (B6) = FWA OF DATA 
  1234.           EQ     SF2         LOOP TILL END OF NAME
  1235.   
  1236. *         USE ALTERNATIVE FILE NAME.
  1237.   
  1238.  SF3      SB7    X1          (B7) = LWA + 1 OF NAME 
  1239.           MX6    0
  1240.           AX1    18 
  1241.           SA6    A1          CLEAR ALTERNATIVE NAME 
  1242.           SB6    X1          (B6) = FWA OF NAME 
  1243.           SB7    B7-B6       (B7) = BYTE COUNT
  1244.   
  1245. *         TRANSMIT FILE HEADER PACKET.
  1246.   
  1247.  SF4      SA1    TTYPE       (X1) = TRANSFER TYPE 
  1248.           SA1    SF.B+X1     (X1) = PACKET TYPE CODE
  1249.           SB5    X1 
  1250.           MX3    59          USE NEXT SEQUENCE NUMBER 
  1251.           RJ     BTP         BUILD TRANSMISSION PACKET
  1252.           RJ     TGP         TRANSMIT GIVEN PACKET
  1253.           EQ     WCS         WAIT FOR INPUT AND CHANGE STATE
  1254.   
  1255.  SF.A     BSS    8           FILE NAME BUFFER 
  1256.  SF.B     BSS    0           TRANSFER TYPE FLAG 
  1257.           CON    FILEH       FILE 
  1258.           CON    FILEX       TYPE 
  1259.           SPACE  4,10 
  1260. **        PROCSFW - SEND FILE HEADER WAIT.
  1261. *         THIS STATE IS ENTERED AFTER A FILE HEADER HAS BEEN SENT.
  1262. *         WHEN THE CORRESPONDING ACK HAS BEEN PROCESSED THE WINDOW
  1263. *         SIZE IS RESET FOR THE DATA TRANSFER.
  1264.   
  1265.  PROCSFW  SA1    IQPTR       (X1) = INPUT QUEUE POINTER 
  1266.           ZR     X1,WCS      NO INPUT SO WAIT TILL THERE IS 
  1267.           SA1    X1+PTYPE    (X1) = TYPE CODE 
  1268.           SX1    X1-131B     CHECK IF 'ACK' 
  1269.           NZ     X1,SFW2     NOT ACK
  1270.   
  1271. *         PROCESS ACK PACKET. 
  1272.   
  1273.           SA1    A1-PTYPE+PSEQ (X1) = PACKET SEQUENCE NUMBER
  1274.           RJ     PAP         PROCESS ACK PACKET 
  1275.   
  1276. *         CHECK WINDOW IS NOW FULLY OPEN. 
  1277.   
  1278.           RJ     CWO         CHECK WINDOW IS OPEN 
  1279.           SX1    X1-1        CHECK FULLY OPEN 
  1280.           NZ     X1,WCS      ACK STILL OUTSTANDING
  1281.   
  1282. *         RESET WINDOW SIZE FOR DATA TRANSFER.
  1283.   
  1284.           SA1    WSIZE       (X1) = AGREED WINDOW SIZE
  1285.           RJ     IWP         INITIALISE WINDOW POINTER
  1286.           SX6    SD          (X6) = NEXT STATE
  1287.           EQ     SGS         SET GIVEN STATE
  1288.   
  1289. *         CHECK FOR PENDING NAK.
  1290.   
  1291.  SFW2     SX1    X1+131B-116B CHECK FOR NAK 
  1292.           NZ     X1,SFW4     NOT NAK SO MUST BE TIMEOUT 
  1293.   
  1294. *         PROCESS NAK PACKET. 
  1295.   
  1296.           SA1    A1-PTYPE+PSEQ (X1) = SEQUENCE NUMBER 
  1297.           SA2    LASTSEQ     (X2) = LAST SEQUENCE NUMBER
  1298.           MX6    -6 
  1299.           SX2    X2+B1       INCREMENT
  1300.           BX2    -X6*X2      ENSURE 6 BIT 
  1301.           BX2    X1-X2       COMPARE
  1302.           NZ     X2,SFW4     NOT NEXT SO RESEND 
  1303.   
  1304. *         NAK FOR N+1 SO SET TO 'SEND DATA' STATE.
  1305.   
  1306.           SX6    SD          (X6) = SEND DATA STATE 
  1307.           EQ     SGS         SET GIVEN STATE
  1308.   
  1309. *         NAK OR TIMEOUT SO RESEND 'F' PACKET.
  1310.   
  1311.  SFW4     SA1    LASTSEQ     (X1) = SEQUENCE NUMBER 
  1312.           RJ     RSP         RESEND PACKET
  1313.           EQ     WCS         WAIT FOR INPUT 
  1314.           SPACE  4,10 
  1315. **        PROCSD - SEND DATA. 
  1316. *         THIS ROUTINE TRANSMITS DATA PACKETS UNTIL AN END OF FILE
  1317. *         IS REACHED. 
  1318.   
  1319. *         CHECK FOR PENDING ACK.
  1320.   
  1321.  PROCSD   SA1    IQPTR       (X1) = INPUT QUEUE POINTER 
  1322.           ZR     X1,SD4      NO INPUT PACKET
  1323.           SA1    X1+PTYPE    (X1) = TYPE CODE 
  1324.           SX1    X1-131B     CHECK IF 'ACK' 
  1325.           NZ     X1,SD2      NOT ACK
  1326.   
  1327.           SA1    A1-PTYPE+PSEQ (X1) = PACKET SEQUENCE NUMBER
  1328.           RJ     PAP         PROCESS ACK PACKET 
  1329.   
  1330. *         CHECK FOR INTERRUPT.
  1331.   
  1332.           SA1    IQPTR       (X1) = FWA OF PACKET 
  1333.           SA1    X1+PLEN     (X1) = PACKET LENGTH 
  1334.           SX1    X1-4        CHECK LENGTH 
  1335.           NG     X1,SD4      NO DATA FIELD
  1336.           SA1    A1-PLEN+PDATA (X1) = DATA WORD 
  1337.           MX6    -8 
  1338.           BX1    -X6*X1      (X1) = FIRST DATA BYTE 
  1339.           SX1    X1-130B     CHECK FOR 'X'
  1340.           ZR     X1,SD1      ABORT FILE 
  1341.           SX1    X1+130B-132B          CHECK FOR 'Z'
  1342.           NZ     X1,SD4      NO INTERRUPT 
  1343.           SX7    0
  1344.           SA7    FNAME       CLEAR FILE NAME TO FORCE END OF GROUP
  1345.           SA7    A7+1        CLEAR MASK 
  1346.   
  1347. *         RETURN ANY OUTSTANDING PACKETS. 
  1348.   
  1349.  SD1      SX1    B1 
  1350.           RJ     IWP         RESET WINDOW SIZE
  1351.           RJ     IBC         INITIALISE BUFFER CHAIN
  1352.           SX6    SEF         SEND EOF PACKET
  1353.           EQ     SGS         SET GIVEN STATE
  1354.   
  1355. *         CHECK FOR PENDING NAK.
  1356.   
  1357.  SD2      SX1    X1+131B-116B CHECK FOR NAK 
  1358.           NZ     X1,SD4      NOT NAK
  1359.   
  1360.           SA1    A1-PTYPE+PSEQ (X1) = PACKET SEQUENCE NUMBER
  1361.           RJ     RSP         RESEND PACKET IF WITHIN WINDOW 
  1362.           ZR     X6,SD4      PACKET FOUND AND RESENT
  1363.           RJ     ROU         RE-TRANSMIT OLDEST UNACKED PACKET
  1364.   
  1365. *         CHECK IF WINDOW IS OPEN.
  1366.   
  1367.  SD4      RJ     CWO         CHECK IF WINDOW IS OPEN
  1368.           ZR     X1,WCS      WINDOW CLOSED SO WAIT FOR INPUT
  1369.   
  1370. *         BUILD AND TRANSMIT DATA PACKET. 
  1371.   
  1372.  SD5      RJ     BDP         BUILD DATA PACKET
  1373.           ZR     X6,SD6      END OF DATA
  1374.           RJ     TGP         TRANSMIT GIVEN PACKET
  1375.  .1       IFLT   PSR,617
  1376.   
  1377. *         AS NO TLX LOOK-AHEAD ONLY READ IF WINDOW IS CLOSED. 
  1378.   
  1379.           RJ     CWO         CHECK IF WINDOW OPEN 
  1380.           NZ     X1,SD5      STILL OPEN SO SEND NEXT DATA PACKET
  1381.  .1       ENDIF 
  1382.   
  1383. *         CHECK IF ANY INPUT NOW AVAILABLE. 
  1384.   
  1385.           RJ     RTI         READ TERMINAL INPUT
  1386.           SX6    0
  1387.           SA6    WCS.A       CLEAR DEBUG TIMER
  1388.           ZR     X1,SD4      NO INPUT 
  1389.           EQ     WCS6        GOTO PACKET IDENTIFICATION AND STATE CHANGE
  1390.   
  1391. *         END OF DATA SO SEND EOF.
  1392.   
  1393.  SD6      RJ     RIB         RETURN INPUT BUFFER
  1394.           SX6    SDW         WAIT FOR END OF DATA TRANSMISSION
  1395.           EQ     SGS         SET GIVEN STATE
  1396.           SPACE  4,10 
  1397. **        PROCSDT - SEND DATA TIMEOUT.
  1398. *         THIS STATE IS ENTERED WHEN A TIMEOUT OCCURS WHEN IN 
  1399. *         THE SEND DATA STATE. THE OLDEST UNACKED PACKET IS RESENT. 
  1400.   
  1401.  PROCSDT  SA1    RETIME      (X1) = TIMEOUT RETRY COUNTER 
  1402.           SX6    X1-1        DECREMENT
  1403.           ZR     X6,SDT2     PROTOCOL TIME OUT
  1404.           SA6    A1+         REPLACE
  1405.           RJ     ROU         RETRANSMIT OLDEST UNACKED PACKET 
  1406.           SX6    SD          (X6) = SEND DATA STATE 
  1407.           EQ     SGS         SET GIVEN STATE
  1408.   
  1409. *         PROTOCOL TIMED OUT. 
  1410.   
  1411.  SDT2     SX6    1           FLAG TIMED OUT 
  1412.           SA6    EMODE       SAVE ERROR MODE
  1413.           SX6    FPE         FORCE PROTOCOL ERROR 
  1414.           EQ     SGS         SET GIVEN STATE
  1415.           SPACE  4,10 
  1416. **        PROCSDW - SEND DATA WAIT. 
  1417. *         THIS STATE IS ENTERED AFTER ALL DATA HAS BEEN SENT. 
  1418. *         WHEN THE CORRESPONDING ACK HAS BEEN PROCESSED THE WINDOW
  1419. *         SIZE IS RESET TO ONE. 
  1420.   
  1421.  PROCSDW  SA1    IQPTR       (X1) = INPUT QUEUE POINTER 
  1422.           ZR     X1,SDW1     NO INPUT PACKET
  1423.           SA1    X1+PTYPE    (X1) = TYPE CODE 
  1424.           SX1    X1-131B     CHECK IF 'ACK' 
  1425.           NZ     X1,SDW2     NOT ACK
  1426.   
  1427. *         PROCESS ACK PACKET. 
  1428.   
  1429.           SA1    A1-PTYPE+PSEQ (X1) = PACKET SEQUENCE NUMBER
  1430.           RJ     PAP         PROCESS ACK PACKET 
  1431.   
  1432. *         CHECK WINDOW IS NOW FULLY OPEN. 
  1433.   
  1434.  SDW1     RJ     UWP         UPDATE WINDOW POINTER
  1435.           SA1    WSIZE       (X1) = MAXIMUM WINDOW SIZE 
  1436.  +        NZ     X1,*+1      WINDOWING ENABLED
  1437.           SX1    1           ASSUME MINIMUM SIZE
  1438.           BX1    X1-X6       COMPARE
  1439.           NZ     X1,WCS      NOT FULLY OPEN SO WAIT FOR MORE INPUT
  1440.   
  1441. *         RESET WINDOW SIZE TO END TRANSFER.
  1442.   
  1443.           SX1    B1          (X1) = WINDOW SIZE 
  1444.           RJ     IWP         INITIALISE WINDOW POINTER
  1445.           SX6    SEF         (X6) = NEXT STATE
  1446.           EQ     SGS         SET GIVEN STATE
  1447.   
  1448. *         CHECK FOR PENDING NAK.
  1449.   
  1450.  SDW2     SX1    X1+131B-116B CHECK FOR NAK 
  1451.           NZ     X1,SDW4     NOT NAK
  1452.   
  1453. *         PROCESS NAK PACKET. 
  1454.   
  1455.           SA1    A1-PTYPE+PSEQ (X1) = PACKET SEQUENCE NUMBER
  1456.           RJ     RSP         RESEND PACKET IF WITHIN WINDOW 
  1457.           EQ     WCS         WAIT FOR INPUT AND CHANGE STATE
  1458.   
  1459. *         ILLEGAL PACKET TYPE (IMPOSSIBLE ERROR). 
  1460.   
  1461.  SDW4     SX6    FPE         FORCE PROTOCOL ERROR 
  1462.           EQ     SGS         SET GIVEN STATE
  1463.           SPACE  4,10 
  1464. **        PROCSEF - SEND END OF FILE. 
  1465. *         THIS STATE SENDS AND END OF FILE PACKET.
  1466.   
  1467.  PROCSEF  MX3    -1          USE NEXT SEQUENCE NUMBER 
  1468.           SB5    EOF         (B5) = REQUIRED PACKET TYPE
  1469.           SB7    B0          (B7) = DATA LENGTH 
  1470.           RJ     BTP         BUILD TRANSMISSION PACKET
  1471.           RJ     TGP         TRANSMIT GIVEN PACKET
  1472.   
  1473. *         IF FILE WAS NOT LOCAL BEFORE TRANSMISSION RETURN IT.
  1474.   
  1475.           SA1    CNAME       (X1) = CURRENT FILE NAME 
  1476.           SA2    F           (X2) = NAME FROM FET 
  1477.           BX6    X1-X2       COMPARE
  1478.           AX6    18          IGNORE STATUS
  1479.           ZR     X6,WCS      MATCH SO FILE WAS LOCAL
  1480.           RETURN F,R         GET RID OF LOCAL COPY
  1481.           EQ     WCS         WAIT FOR INPUT AND CHANGE STATE
  1482.           SPACE  4,10 
  1483. **        PROCSET - SEND END OF FILE TIMEOUT. 
  1484. *         THIS CODE RESENDS THE 'Z' EOF PACKET. 
  1485.   
  1486.  PROCSET  SA1    RETIME      (X1) = TIMEOUT RETRY COUNTER 
  1487.           SX6    X1-1        DECREMENT
  1488.           ZR     X6,SET2     PROTOCOL TIMEOUT 
  1489.           SA6    A1+         REPLACE
  1490.           RJ     ROU         RESEND OLDEST UNACKED PACKET 
  1491.           EQ     WCS         WAIT FOR INPUT AND CHANGE STATE
  1492.   
  1493. *         PROTOCOL TIMED OUT. 
  1494.   
  1495.  SET2     SX6    1
  1496.           SA6    EMODE       FLAG TIMED OUT 
  1497.           SX6    FPE         FORCE PROTOCOL ERROR 
  1498.           EQ     SGS         SET GIVEN STATE
  1499.           SPACE  4,10 
  1500. **        PROCSB - SEND BREAK.
  1501. *         THIS CODE SENDS A 'BREAK' PACKET TO INDICATE END OF FILE
  1502. *         TRANSMISSION. 
  1503.   
  1504.  PROCSB   SA1    IQPTR       (X1) = INPUT QUEUE POINTER 
  1505.           SA1    X1+PSEQ     (X1) = SEQUENCE NUMBER 
  1506.           RJ     PAP         PROCESS ACK PACKET 
  1507.           NZ     X6,SB2      ERROR IN ACK 
  1508.   
  1509. *         SEND BREAK. 
  1510.   
  1511.           SB7    B0          NO DATA FIELD
  1512.           SB5    BREAK       (B5) = REQUIRED PACKET TYPE
  1513.           MX3    59          FLAG NEXT SEQUENCE NUMBER
  1514.           RJ     BTP         BUILD TRANSMISSION PACKET
  1515.           RJ     TGP         TRANSMIT GIVEN PACKET
  1516.           EQ     WCS         WAIT FOR INPUT AND CHANGE STATE
  1517.   
  1518. *         ERROR IN ACK PACKET.
  1519.   
  1520.  SB2      SX6    ABT         ABORT
  1521.           EQ     SGS         SET GIVEN STATE
  1522.           SPACE  4,10 
  1523. **        PROCRF - RECEIVE FILE.
  1524. *         THIS STATE IS ENTERED WHEN A FILE TRANSFER IS EXPECTED
  1525. *         INTO THE CYBER. NOTE THAT THIS STATE IS NEVER EXECUTED
  1526. *         IT IS USED WHILE WAITING FOR MORE INPUT 
  1527.   
  1528.  PROCRF   EQ     WCS         WAIT FOR INPUT AND CHANGE STATE
  1529.           SPACE  4,10 
  1530. **        PROCRFF - RECEIVE FILE (FILE HEADER RECEIVED).
  1531. *         THIS STATE IS ENTERED WHEN A FILE HEADER PACKET IS READ WHILE 
  1532. *         IN THE 'RECEIVE FILE' STATE.
  1533.   
  1534.  PROCRFF  SA1    ANAME       (X1) = ALTERNATIVE NAME POINTER
  1535.           ZR     X1,RFF2     NO ALTERNATIVE NAME
  1536.           SB7    X1          (B7) = LWA + 1 
  1537.           MX6    0
  1538.           AX1    18 
  1539.           SA6    A1          CLEAR POINTER
  1540.           SB6    X1          (B6) = FWA OF NAME 
  1541.           SB7    B7-B6       (B7) = CHARACTER COUNT 
  1542.           EQ     RFF4        GOTO CRACK NAME
  1543.   
  1544. *         NO ALTERNATIVE SO USE NAME FROM PACKET. 
  1545.   
  1546.  RFF2     SA1    IQPTR       (X1) = FWA OF PACKET 
  1547.           RJ     UDF         UNPACK DATA FIELD
  1548.   
  1549. *         BUILD NAME (WILD CHARACTERS ILLEGAL). 
  1550.   
  1551.  RFF4     SB5    B1          FLAG WILD CHARACTERS ILLEGAL 
  1552.           RJ     BFN         BUILD FILE NAME
  1553.           SA1    WSIZE       (X1) = WINDOW SIZE 
  1554.           RJ     IWP         INITIALISE WINDOW POINTER FOR DATA TRANSFER
  1555.           SA3    IQPTR       (X3) = FWA OF PACKET 
  1556.           SA3    X3+PSEQ     (X3) = SEQUENCE NUMBER 
  1557.           SX6    X3 
  1558.           SA6    LASTSEQ     PRESET LAST SEQUENCE NUMBER
  1559.           LX6    18 
  1560.           SA6    WTABLE      PRESET OLDEST WINDOW TABLE ENTRY 
  1561.           RJ     AGP         ACK GIVEN PACKET 
  1562.           SA1    FNAME       (X1) = FILE NAME 
  1563.           SA2    RFF.B       (X2) = DEFAULT FILE NAME 
  1564.           BX6    X1 
  1565.           BX7    X2 
  1566.           SA6    CNAME       SAVE CURRENT NAME
  1567.           SA7    F           RESET DEFAULT FILE NAME
  1568.           REWIND F,R         REWIND FILE
  1569.           WRITE  X2,*        PRESET WRITE FUNCTION
  1570.           MX6    0
  1571.           SA6    FWORD       CLEAR PACKING WORD 
  1572.           SA6    A6+B1       CLEAR PACKING COUNTER
  1573.           RJ     RIB         RETURN INPUT BUFFER
  1574.           SA1    RFF.A       (X1) = FIRST WORD OF TEXT
  1575.           RJ     WLM         WRITE LOG MESSAGE
  1576.           SX6    RD          (X6) = RECEIVE DATA STATE CODE 
  1577.           EQ     SGS         SET GIVEN STATE
  1578.   
  1579.  RFF.A    DIS    ,'    RECEIVING - ;A.' 
  1580.  RFF.B    VFD    42/0LZZZZZFN,18/3
  1581.           SPACE  4,10 
  1582. **        PROCRD - RECEIVE DATA.
  1583. *         THIS STATE IS USED TO READ DATA FROM THE REMOTE LINK. 
  1584.   
  1585.  PROCRD   SA1    IQPTR       (X1) = FWA OF INCOMMING PACKET 
  1586.           SA2    LASTSEQ     (X2) = LAST SEQUENCE NUMBER
  1587.           ZR     X1,WCS      NO INPUT SO WAIT TILL THERE IS 
  1588.           SA1    X1+PSEQ     (X1) = PACKET SEQUENCE NUMBER
  1589.           SX2    X2+B1       CALCULATE EXPECTED SEQUENCE NUMBER 
  1590.           MX7    -6 
  1591.           BX2    -X7*X2      ENSURE MODULO 64 
  1592.           IX6    X1-X2       CHECK IF REQUIRED VALUE
  1593.           ZR     X6,RD4      EXPECTED PACKET SO ACK IT
  1594.           SA3    WSIZE       (X3) = WINDOW SIZE 
  1595.  +        NZ     X3,*+1      WINDOW SIZE DEFINED
  1596.           SX3    1           USE MINIMUM
  1597.           SX6    X6+64       ALLOW FOR WRAP AROUND
  1598.           BX6    -X7*X6      ENSURE MODULO 64 
  1599.           IX7    X3-X6       CHECK IF WITHIN WINDOW 
  1600.           NG     X7,RD6      MAY BE DUPLICATE 
  1601.   
  1602. *         PACKET WITHIN WINDOW SO NAK PRECEEDING PACKETS. 
  1603.   
  1604.           SA6    RD.A        SAVE NUMBER OF NAKS REQUIRED 
  1605.   
  1606. *         NAK MISSING PACKETS.
  1607.   
  1608.  RD2      RJ     NNP         NAK NEXT PACKET
  1609.           SA1    RD.A        (X1) = COUNT 
  1610.           SX6    X1-1        DECREMENT
  1611.           SA6    A1+         REPLACE
  1612.           NZ     X6,RD2      LOOP FOR ALL NAKS
  1613.   
  1614. *         NOW SAVE THE DATA.
  1615.   
  1616.  RD4      SA1    IQPTR       (X1) = FWA OF PACKET 
  1617.           SA2    X1+PSEQ     (X2) = SEQUENCE NUMBER 
  1618.           SX6    X1          (X6) = FWA 
  1619.           LX2    18          POSITION SEQUENCE NUMBER 
  1620.           SA1    RETRY       (X1) = RETRY COUNTER 
  1621.           BX6    X2+X6       (X6) = 33/0,9/SEQ,18/FWA 
  1622.           LX1    18+9+9 
  1623.           BX6    X1+X6       (X6) = 15/0,9/RETRY,9/0,9/SEQ,18/FWA 
  1624.           MX1    1
  1625.           BX6    X1+X6       FLAG ACKED 
  1626.           RJ     SRP         SAVE RECEIVED PACKET 
  1627.           SX6    0
  1628.           SA6    IQPTR       CLEAR INPUT QUEUE
  1629.           SA3    LASTSEQ     (X3) = PACKET SEQUENCE NUMBER
  1630.           RJ     AGP         ACK GIVEN PACKET 
  1631.           RJ     RIB         RETURN INPUT BUFFER
  1632.           EQ     WCS         WAIT FOR INPUT AND CHANGE STATE
  1633.   
  1634. *         CHECK IF PACKET IS A DUPLICATE. 
  1635.   
  1636.  RD6      SA3    WPTR        (X3) = WINDOW POINTER
  1637.           SB4    X3          (B4) = LIMIT 
  1638.           AX3    18 
  1639.           SB3    X3          (B3) = OUT 
  1640.           AX3    18 
  1641.           SB2    X3          (B2) = IN
  1642.           MX6    -9 
  1643.           EQ     B2,B3,RD12  EMPTY SO IGNORE
  1644.   
  1645. *         SCAN CURRENT WINDOW.
  1646.   
  1647.  RD8      SA3    WTABLE+B3   (X3) = NEXT ATTRIBUTE WORD 
  1648.           BX7    X3 
  1649.           AX7    18 
  1650.           BX7    -X6*X7      (X7) = SEQUENCE NUMBER FROM TABLE
  1651.           BX7    X1-X7       COMPARE
  1652.           ZR     X7,RD10     ENTRY FOUND
  1653.  +        SB3    B3+B1       INCREMENT OUT
  1654.           NE     B3,B4,*+1   NOT LIMIT
  1655.           SB3    B0          SET OUT = FIRST
  1656.           NE     B2,B3,RD8   NOT END OF WINDOW
  1657.           EQ     RD12        GOTO RETURN BUFFER AND EXIT
  1658.   
  1659. *         ENTRY FOUND SO SAVE PACKET UNLESS DUPLICATE.
  1660.   
  1661.  RD10     NG     X3,RD11     DUPLICATE SO ACK AND IGNORE
  1662.           SX3    X1+         (X3) = PACKET SEQUENCE NUMBER
  1663.           SX6    A1-PSEQ     (X6) = FWA OF PACKET 
  1664.           LX1    18 
  1665.           BX6    X1+X6       (X6) = 33/0,9/SEQ,18/FWA 
  1666.           SA1    RETRY       (X1) = RETRY COUNTER 
  1667.           LX1    18+9+9 
  1668.           BX6    X1+X6       ADD RETRY COUNTER
  1669.           MX1    1
  1670.           BX6    X1+X6       ADD ACKED FLAG 
  1671.           SA6    A3          UPDATE ATTRIBUTES
  1672.           MX6    0
  1673.           SA6    IQPTR       CLEAR INPUT POINTER
  1674.           RJ     AGP         ACK PACKET 
  1675.           EQ     WCS         GOTO WAIT FOR INPUT
  1676.   
  1677. *         DUPLICATE SO ACK AND IGNORE.
  1678.   
  1679.  RD11     SX3    X1          (X3) = SEQUENCE NUMBER OF DUPLICATE PACKET 
  1680.           RJ     AGP         ACK GIVEN PACKET 
  1681.   
  1682. *         RETURN BUFFER TO FREE QUEUE.
  1683.   
  1684.  RD12     RJ     RIB         RETURN INPUT BUFFER
  1685.           EQ     WCS         GOTO WAIT FOR INPUT
  1686.   
  1687.  RD.A     BSS    1           NAK COUNT
  1688.           SPACE  4,10 
  1689. **        PROCRDT - RECEIVE DATA TIMEOUT. 
  1690. *         THIS STATE IS ENTERED WHEN A TIMEOUT OCCURS WHILE WAITING 
  1691. *         FOR DATA INPUT. A NAK IS SENT FOR THE NEXT PACKET EXPECTED. 
  1692.   
  1693.  PROCRDT  SB5    NAK         (B5) = PACKET TYPE 
  1694.           SA3    LASTSEQ     (X3) = LAST RECEIVED SEQUENCE NUMBER 
  1695.           SB7    B0          NO DATA FIELD
  1696.           SX3    X3+B1       INCREMENT SEQUENCE NUMBER
  1697.           MX6    -6 
  1698.           BX3    -X6*X3      CALCULATE MODULO 64
  1699.           RJ     BTP         BUILD TRANSMISSION PACKET
  1700.           SA6    RDT.A       SAVE ATTRIBUTE WORD
  1701.           BX1    X6          (X1) = ATTRIBUTE WORD
  1702.           RJ     TPK         TRANSMIT PACKET
  1703.           SA1    RDT.A       (X1) = PACKET ATTRIBUTE WORD 
  1704.           SX6    X1+         (X6) = FWA OF PACKET 
  1705.           RJ     RBF         RETURN BUFFER TO FREE QUEUE
  1706.           SX6    RD          (X6) = REQUIRED STATE
  1707.           EQ     SGS         SET GIVEN STATE
  1708.   
  1709.  RDT.A    BSS    1           PACKET ATTRIBUTE WORD
  1710.           SPACE  4,10 
  1711. **        PROCRDW - RECEIVE DATA WAIT.
  1712. *         THIS STATE IS ENTERED WHEN A TYPE 'Z' PACKET IS 
  1713. *         RECEIVED. THE REMAINING DATA PACKETS ARE FLUSHED TO DISC
  1714. *         AND THE FILE CLOSED. IF THE DATA PART OF THE 'Z' PACKET 
  1715. *         IS 'D' THEN THE FILE IS DISCARDED.
  1716.   
  1717.  PROCRDW  SA1    IQPTR       (X1) = FWA OF 'Z' PACKET 
  1718.           SA1    X1+PLEN     (X1) = PACKET LENGTH 
  1719.           SX1    X1-3        CHECK DATA FIELD LENGTH
  1720.           ZR     X1,RDW2     NO DATA
  1721.   
  1722. *         CHECK IF DISCARD REQUIRED.
  1723.   
  1724.           SA1    A1-PLEN+PDATA         (X1) = FIRST DATA WORD 
  1725.           MX6    -8 
  1726.           BX6    -X6*X1      (X6) = FIRST DATA BYTE 
  1727.           SX6    X6-104B     CHECK FOR 'D'
  1728.           NZ     X6,RDW2     NOT 'DISCARD'
  1729.   
  1730. *         DISCARD FILE. 
  1731.   
  1732.           REWIND F,R         REWIND FILE
  1733.           RETURN X2,R        DISCARD FILE 
  1734.           EQ     RDW6        GOTO RESET WINDOW
  1735.   
  1736. *         DATA REQUIRED SO FLUSH WINDOW.
  1737.   
  1738.  RDW2     SA2    WPTR        (X2) = WINDOW POINTER
  1739.           SB4    X2          (B4) = LIMIT 
  1740.           AX2    18 
  1741.           SB3    X2          (B3) = OUT 
  1742.           AX2    18 
  1743.           SB2    X2+         (B2) = IN
  1744.           EQ     B2,B3,RDW4  EMPTY
  1745.   
  1746. *         WRITE OLDEST PACKET.
  1747.   
  1748.           SA1    WTABLE+B3   (X1) = OLDEST ATTRIBUTE WORD 
  1749.  +        SB3    B3+B1       INCREMENT OUT
  1750.           NE     B3,B4,*+1   NOT LIMIT
  1751.           SB3    B0          SET OUT = FIRST
  1752.           SX6    B2          (X6) = IN
  1753.           SX2    B3          (X2) = OUT 
  1754.           LX6    18 
  1755.           BX6    X2+X6       (X6) = 6/0,18/0,18/IN,18/OUT 
  1756.           SX2    B4          (X2) = LIMIT 
  1757.           LX6    18 
  1758.           BX6    X2+X6       (X6) = 6/0,18/IN,18/OUT,18/LIMIT 
  1759.           SA6    A2          SAVE POINTER 
  1760.           RJ     WDP         WRITE DATA PACKET
  1761.           EQ     RDW2        LOOP TILL WINDOW EMPTY 
  1762.   
  1763. *         FLUSH BUFFER. 
  1764.   
  1765.  RDW4     RJ     FRB         FLUSH RECEIVE BUFFER 
  1766.           RJ     PRF         PROCESS RECEIVED FILE
  1767.   
  1768. *         RESET WINDOW TO CLOSE.
  1769.   
  1770.  RDW6     SX1    1           (X1) = CONTROL WINDOW SIZE 
  1771.           RJ     IWP         INITIALISE WINDO+ POINTER
  1772.   
  1773. *         ACK 'Z' PACKET. 
  1774.   
  1775.           SA3    IQPTR       (X3) = FWA OF PACKET 
  1776.           SA3    X3+PSEQ     (X3) = SEQUENCE NUMBER 
  1777.           RJ     AGP         ACK GIVEN PACKET 
  1778.           RJ     RIB         RETURN INPUT BUFFER
  1779.           SX6    RF          (X6) = REQUIRED STATE
  1780.           EQ     SGS         SET GIVEN STATE
  1781.           SPACE  4,10 
  1782. **        PROCRDE - RECEIVE DATA END. 
  1783. *         THIS STATE IS ENTERED WHEN A 'BREAK' PACKET IS RECEIVED.
  1784. *         RECEIVE MODE IS CLEARED AND THE SERVER COMMAND WAIT ENTERED.
  1785.   
  1786.  PROCRDE  SA3    IQPTR       (X3) = FWA OF PACKET 
  1787.           SA3    X3+PSEQ     (X3) = SEQUENCE NUMBER 
  1788.           RJ     AGP         ACK GIVEN PACKET 
  1789.           RJ     RIB         RETURN INPUT BUFFER
  1790.           EQ     PROCCMP     COMPLETE PROCESSING
  1791.           SPACE  4,10 
  1792. **        PROCSCG - GENERIC COMMAND.
  1793. *         THIS STATE IS ENTERED TO PROCESS A GENERIC COMMAND ENTERED
  1794. *         VIA A 'G' PACKET. 
  1795.   
  1796.  PROCSCG  SA1    IQPTR       (X1) = FWA OF PACKET 
  1797.           SA1    X1+PLEN     (X1) = PACKET LENGTH 
  1798.           SB7    X1-3        CALCULATE DATA LENGTH
  1799.           LE     B7,B0,SCG4  INVALID OR MISSING SO NAK
  1800.           SA1    A1-PLEN+PDATA         (X1) = FIRST SOURCE WORD 
  1801.           MX6    -8 
  1802.           BX6    -X6*X1      (X6) = FIRST DATA BYTE 
  1803.   
  1804. *         SEARCH VALIDATION TABLE.
  1805.   
  1806.           SA2    SCG.A       (X2) = FIRST TABLE ENTRY 
  1807.   
  1808.  SCG2     SX1    X2          (X1) = CHARACTER FROM TABLE
  1809.           AX2    18 
  1810.           BX1    X1-X6       COMPARE WITH DATA
  1811.           SB7    X2          (B7) = PROCESS ADDRESS 
  1812.  +        NZ     X1,*+1      NO MATCH 
  1813.           JP     B7+         PRROCESS 
  1814.           SA2    A2+1        (X2) = NEXT TABLE ENTRY
  1815.           NZ     X2,SCG2     LOOP TILL FOUND OR END OF TABLE
  1816.   
  1817. *         COMMAND NOT RECOGNISED. 
  1818.   
  1819.  SCG4     SA3    A1-PDATA+PSEQ (X3) = SEQUENCE NUMBER 
  1820.           RJ     NGP         NAK GIVEN PACKET 
  1821.           SX6    SCW         (X6) = SERVER COMMAND WAIT 
  1822.           EQ     SGS         SET GIVEN STATE
  1823.   
  1824. *         COMMAND - F  (FINISH).
  1825.   
  1826.  SCG6     SA3    A1-PDATA+PSEQ (X3) = SEQUENCE NUMBER 
  1827.           RJ     AGP         ACK GIVEN PACKET 
  1828.           SX6    3           FLAG TERMINATION MODE
  1829.           SA6    TMODE       SAVE 
  1830.           EQ     PROCCMP     COMPLETE PROCESSING
  1831.   
  1832. *         COMMAND - L  (LOGOUT).
  1833.   
  1834.  SCG8     SA3    A1-PDATA+PSEQ (X3) = SEQUENCE NUMBER 
  1835.           RJ     AGP         ACK GIVEN PACKET 
  1836.           MX6    1
  1837.           LX6    50-59       (X) = '0004' LOGOUT BYTE 
  1838.           WRITEO O           WRITE TO TERMINAL
  1839.           WRITER X2 
  1840.           ABORT 
  1841.   
  1842. *         COMMAND - T (TYPE). 
  1843.   
  1844.  SCG10    SA1    IQPTR       (X1) = FWA OF PACKET 
  1845.           RJ     UDF         UNPACK DATA FIELD
  1846. *         LE     B7,B1,SCG?? ILLEGAL FILE SPECIFICATION 
  1847.           SA1    B6          (X1) = NAME LENGTH 
  1848.           SB6    B6+B1       INCREMENT
  1849.           SB5    B1          FLAG WILD CHARACTERS ILLEGAL 
  1850.           SB7    X1          (B7) = CHARACTER COUNT 
  1851.           RJ     BFN         BUILD FILE NAME
  1852.           SX6    -1 
  1853.           SA6    FIRSTF      CLEAR FIRST FILE FLAG
  1854.           SX6    1
  1855.           SA6    TTYPE       SET TRANSFER TYPE
  1856.           SX6    SI          SEND INIT
  1857.           EQ     SGS         SET GIVEN STATE
  1858.   
  1859.  SCG.A    BSS    0           COMMAND VALIDATION TABLE 
  1860.           VFD    6/0,18/0,18/SCG6,18/106B  'F' - FINISH 
  1861.           VFD    6/0,18/0,18/SCG8,18/114B  'L' - LOGOUT 
  1862.           VFD    6/0,18/0,18/SCG10,18/124B 'T' - TYPE 
  1863.           CON    0
  1864.           SPACE  4,10 
  1865. **        PROCESS DUPLICATE (SUPERFLUOUS) PACKET. 
  1866. *         THIS ROUTINE ACKS THE CURRENT PACKET PROVIDING THAT THE SEQUEN
  1867. *         NUMBER IS THAT OF THE PRECEEDING PACKET. THIS IS USED, FOR EXM
  1868. *         WHEN THE ACK TO A 'F' PACKET HAS BEEN LOST AND A DUPLICATE SEN
  1869.   
  1870.  PROCADP  SA3    IQPTR       (X3) = FWA OF PACKET 
  1871.           SX6    X3+
  1872.           RJ     RBF         RETURN BUFFER TO FREE QUEUE
  1873.           SA1    X3+PSEQ     (X1) = PACKET SEQUENCE NUMBER
  1874.           SA3    LASTSEQ     (X3) = PREVIOUS SEQUENCE NUMBER
  1875.           BX6    X1-X3       COMPARE
  1876.           SX1    77B
  1877.           BX6    X1*X6       IGNORE ANY FLAG BITS 
  1878.           NZ     X6,ADP2     NO MATCH SO ERROR
  1879.           RJ     AGP         ACK GIVEN PACKET 
  1880.           EQ     WCS         GOTO WAIT FOR INPUT
  1881.   
  1882. *         PROTOCOL ERROR AS OT OF SEQUENCE. 
  1883.   
  1884.  ADP2     SX1    FPE         FORCE PROTOCOL ERROR 
  1885.           EQ     CPS         CHANGE PROTOCOL STATE
  1886.           SPACE  4,10 
  1887. **        PROCESS ERROR PACKET. 
  1888. *         THIS STATE IS ENTERD WHEN AN ERROR PACKET IS RECEIVED 
  1889. *         FROM THE REMOTE KERMIT. THE MESSAGE IS WRITTEN TO THE LOG 
  1890. *         FILE AND KERMIT ABORTED OR RETURNED TO SERVER WAIT STATE. 
  1891.   
  1892.  PROCERR  SB6    ERR.A       (B6) = FWA OF MESSAGE
  1893.           RJ     WLT         WRITE LOG TEXT 
  1894.           SA1    IQPTR       (X1) = FWA OF PACKET 
  1895.           RJ     UDF         UNPACK DATA FIELD
  1896.           LE     B7,B0,PROCABT MISSING OR ILLEGAL DATA FIELD
  1897.           SB2    10-1        RESET PACKING COUNTER
  1898.           SX6    1R 
  1899.           SA6    ERR.B       PRESET DESTINATION ADDRESS 
  1900.           MX0    -6          (X0) = CHARACTER MASK
  1901.           SB3    A2C         (B3) = FWA OF ASCII TO DISPLAY CODE CONVERS
  1902.           SB7    B6+B7       (B7) = LWA + 1 OF ASCII STRING 
  1903.   
  1904. *         PROCESS NEXT CHARACTER. 
  1905.   
  1906.  ERR2     SA1    B6          (X1) = NEXT ASCII CHARACTER
  1907.           LX6    6
  1908.           SB2    B2-B1       DECREMENT PACKING COUNTER
  1909.           SA1    X1+B3       CONVERT TO DISPLAY CODE
  1910.           SX1    X1          (X1) = 6/12 CODE 
  1911.           SB6    B6+1        INCREMENT SOURCE ADDRESS 
  1912.           BX2    -X0*X1      (X2) = SECOND BYTE (IF 2)
  1913.           AX1    6           (X1) = FIRST BYTE
  1914.           ZR     X1,ERR6     ONLY 6 BIT CHARACTER 
  1915.   
  1916.           BX6    X1+X6       ADD FIRST 6 BITS 
  1917.           NZ     B2,ERR4     PACKING WORD FULL
  1918.           SA6    A6+B1       SAVE FULL WORD 
  1919.           BX6    X2          (X6) = SECOND BYTE 
  1920.           SB2    10-1        RESET PACKING COUNTER
  1921.           EQ     ERR8        GOTO CHECK FOR MORE DATA 
  1922.   
  1923.  ERR4     LX6    6           MAKE ROOM
  1924.           SB2    B2-1        DECREMENT PACKING COUNTER
  1925.   
  1926.  ERR6     BX6    X2+X6       ADD 6 BIT CODE TO PACKING WORD 
  1927.           NZ     B2,ERR8     PACKING WORD NOT FULL
  1928.           SA6    A6+B1       SAVE FULL WORD 
  1929.           SB2    10          RESET PACKING COUNTER
  1930.           SX6    0           RESET PACKING WORD 
  1931.   
  1932.  ERR8     LT     B6,B7,ERR2  LOOP TILL END OF DATA
  1933.   
  1934. *         END OF DATA SO FORCE EOL. 
  1935.   
  1936.           SX1    B2          (X1) = REMAINING CHARACTER COUNT 
  1937.           LX1    59-0        CHECK IF ODD 
  1938.           PL     X1,ERR10    EVEN SO NO TRAILING BLANK REQUIRED 
  1939.           SX2    1R 
  1940.           LX6    6
  1941.           SX1    X1+         (X1) = REMAINING 12 BIT BYTE COUNT 
  1942.           BX6    X2+X6       BLANK FILL 
  1943.           NZ     X1,ERR10    PACKING WORD NOT FULL
  1944.           SA6    A6+B1       SAVE FULL WORD 
  1945.           MX6    0           CLEAR
  1946.   
  1947.  ERR10    LX1    2           * 4
  1948.           LX2    X1,B1       * 8
  1949.           IX1    X1+X2       (X1) = REMAINING BIT COUNT 
  1950.           SB2    X1 
  1951.           LX6    B2          FORCE EOL
  1952.           SB6    ERR.B+1     (B6) = FWA OF MESSAGE
  1953.           SA6    A6+B1       SAVE LAST DATA WORD + EOL
  1954.           RJ     WLT         WRITE LOG TEXT 
  1955.           EQ     PROCABT     GOTO ABORT PROCESSING
  1956.   
  1957.  ERR.A    DIS    ,' REMOTE KERMIT REQUESTED AN ABORT.'
  1958.  ERR.B    BSS    21          MESSAGE BUFFER 
  1959.           SPACE  4,10 
  1960. **        PROCABT - ABORT PROCESS.
  1961. *         THIS ROUTINE RESETS ANYTHING WHICH REQUIRES RESETTING 
  1962. *         AND RETURNS TO THE SERVER COMMAND WAIT STATE. 
  1963.   
  1964.  PROCABT  SX6    SCW         (X6) = SERVER COMMAND WAIT 
  1965.           SA1    TMODE       (X1) = TRANSFER MODE 
  1966.           ZR     X1,SGS      SERVER SO GO INTO WAIT STATE 
  1967.           RJ     CTI         CLEAR TERMINAL INTERFACE 
  1968.           RJ     DBE         CLOSE DEBUG FILE (IF ON) 
  1969.           SA1    ABT.A       (X1) = FIRST WORD OF LOG MESSAGE 
  1970.           RJ     WLM         WRITE LOG MESSAGE
  1971.           RJ     CLF         CLOSE LOG FILE 
  1972.           MESSAGE ABT.A,3,R 
  1973.           ENDRUN
  1974.   
  1975.  ABT.A    DIS    ,'KERMIT ABORTED.' 
  1976.           SPACE  4,10 
  1977. **        PROCCMP - COMPLETE PROCESSING.
  1978. *         THIS TASK IS ENETERED WHEN A FILE TRANSFER HAS BEEN COMPLETED.
  1979. *         IF IN SERVER MODE THEN THE WAIT STATE IS ENTERED, OTHERWISE 
  1980. *         THE PROGRAM IS TERMINATED.
  1981.   
  1982.  PROCCMP  SX6    SCW         ASSUME SERVER
  1983.           SA1    TMODE       (X1) = TRANSFER MODE 
  1984.           ZR     X1,SGS      SERVER SO ENTER WAIT STATE 
  1985.   
  1986. *         NOT SERVER SO CLOSE DOWN. 
  1987.   
  1988.           RJ     DBE         CLOSE DEBUG FILE (IF ON) 
  1989.           SA1    CMP.A       (X1) = FIRST WORD OF LOG MESSAGE 
  1990.           RJ     WLM         WRITE LOG MESSAGE
  1991.           RJ     CLF         CLOSE LOG FILE 
  1992.           RJ     CTI         CLOSE TERMINAL INTERFACE 
  1993.           MESSAGE CMP.A,3,R 
  1994.           ENDRUN
  1995.   
  1996.  CMP.A    DIS    ,'KERMIT COMPLETE.'
  1997.           TITLE  WINDOW PROCESSING ROUTINES.
  1998. **        WINDOW PROCESSING ROUTINES. 
  1999. *         THE FOLLOWING ROUTINES ARE USED TO ALLOCATE AND MANAGE
  2000. *         PACKET FLOW TAKING INTO ACCOUNT THE WINDOW SIZE.
  2001. *         CWO - CHECK WINDOW IS OPEN
  2002. *         IWP - INITIALISE WINDOW POINTER 
  2003. *         PAP - PROCESS ACK PACKET
  2004. *         ROU - RE-TRANSMIT OLDEST UNACKED PACKET 
  2005. *         RSP - RESEND PACKET 
  2006. *         SRP - SAVE RECEIVED PACKET
  2007. *         UWP - UPDATE WINDOW POINTER 
  2008.           SPACE  4,10 
  2009. **        WINDOW TABLE STRUCTURE. 
  2010. *         THE WINDOW TABLE CONTAINS ONE WORD PER ENTRY AS FOLLOWS:- 
  2011. *T  1/A,5/0,9/LEN,9/RETRY,9/TIMER,9/SEQ,18/ADR
  2012. *         WHERE:- 
  2013. *                     A = SET IF PACKET ACKED 
  2014. *                   LEN = LENGTH OF DATA PART IN WORDS
  2015. *                 RETRY = RETRY COUNTER 
  2016. *                 TIMER = TIMEOUT COUNTER (IF USED) 
  2017. *                   SEQ = PACKET SEQUENCE NUMBER
  2018. *                   ADR = ADDRESS OF PACKET 
  2019. *         THE TABLE IS TREATED AS A CIRCULAR BUFFER ADDRESSED 
  2020. *         BY THE WINDOW POINTER WITH THE FORMAT:- 
  2021. *T  1/0,5/N,18/IN,18/OUT,18/LIMIT 
  2022. *         WHERE:- 
  2023. *                     N = AVAILABLE WINDOW (0 IF WINDOW CLOSED) 
  2024. *                    IN = OFFSET TO NEXT SPACE IN TABLE 
  2025. *                   OUT = OFFSET TO LAST USED TABLE WORD
  2026. *                 LIMIT = TABLE LENGTH
  2027. *         WHEN SENDING THE WINDOW IS USED AS FOLLOWS:-
  2028. *         AS EACH PACKET IS TRANSMITTED THE AVAILABLE WINDOW IS 
  2029. *         DECREMENTED. WHEN IT BECOMES ZERO THEN THE WINDOW IS CLOSED 
  2030. *         AND CANNOT BE OPENED UNTIL THE OLDEST PACKET WITHIN THE 
  2031. *         WINDOW IS ACKED. WHEN ACKED THE 'A' FLAG IS SET AND, IF 
  2032. *         THIS PACKET IS THE OLDEST IN THE TABLE THE TABLE ENTRY IS 
  2033. *         DISCARDED AND THE AVAILABLE WINDOW INCREMENTED. 
  2034. *         WHEN RECEIVING THE WINDOW IS USED AS FOLLOWS:-
  2035. *         AS EACH DATA PACKET IS RECEIVED THE WINDOW TABLE IS CHECKED 
  2036. *         IF IT IS FULL THE PACKET ASSOCIATED WITH THE OLDEST TABLE 
  2037. *         ENTRY IS WRITTEN TO DISK PROVIDED THAT THE ATTRIBUTES 
  2038. *         INDICATE THE PACKET HAS BEEN ACKED. IF IT HAS NOT BEEN
  2039. *         ACKED A PROTOCOL ERROR RESULTS. THE REMAINING ACTION
  2040. *         DEPENDS ON THE SEQUENCE NUMBER OF THE RECIEVED PACKET:- 
  2041. *         1) IF THE RECEIVED SEQUENCE NUMBER IS THE ONE EXPECTED
  2042. *            (I.E. THE NEXT ONE) THEN THE PACKET IS ACKED AND THE 
  2043. *            PACKET ATTRIBUTE WORD SAVED IN THE WINDOW TABLE. 
  2044. *         2) IF THE RECIEVED SEQUENCE NUMBER IS BETWEEN THE EXPECTED
  2045. *            AND THE EXPECTED PLUS THE WINDOW SIZE THEN A 'NAK' IS
  2046. *            TRANSMITTED FOR EACH MISSING SEQUENCE NUMBER. FOR EACH 
  2047. *            NAK AN ENTRY IS MADE IN THE WINDOW TABLE. IF FULL THE
  2048. *            OLDEST ENTRY IS WRITTEN TO DISK PROVIDED IT HAS BEEN 
  2049. *            ACKED. THE RECEIVED PACKET IS THEN ACKED AND AN ENTRY
  2050. *            MADE IN THE WINDOW TABLE.
  2051. *         3) IF THE RECEIVED SEQUENCE NUMBER MATCHES AN ENTRY ALREADY 
  2052. *            IN THE WINDOW TABLE THEN THE PACKET IS ACKED. THE TABLE
  2053. *            ENTRY IS UPDATED IF IT PREVIOUSLY HAD A 'NAK' ATTRIBUTE. 
  2054. *         4) IF THE SEQUENCE NUMBER DOES NOT MATCH ANY OF THE ABOVE 
  2055. *            CASES THEN THE RECEIVED PACKET IS IGNORED. 
  2056.           SPACE  4,10 
  2057. **        CWO - CHECK WINDOW IS OPEN. 
  2058. *         THIS ROUTINE RETURNS THE AVAILABLE WINDOW SIZE. IF ZERO 
  2059. *         THE WINDOW IS CLOSED. 
  2060. *         ENTRY  NONE.
  2061. *         EXIT   (X1) = AVAILABLE WINDOW
  2062. *         USES   X - 1. 
  2063. *                A - 1. 
  2064. *                B - NONE.
  2065. *         CALLS  NONE.
  2066.           SPACE  4,10 
  2067. CWO       SUBR               ENTRY/EXIT 
  2068.           SA1    WPTR        (X1) = WINDOW POINTER
  2069.           AX1    18+18+18    RIGHT JUSTIFY AVAILABLE WINDOW 
  2070.           EQ     CWOX        EXIT 
  2071.           SPACE  4,10 
  2072. **        IWP - INITIALISE WINDOW POINTER.
  2073. *         THIS ROUTINE INITIALISES THE WINDOW POINTER AND MUST
  2074. *         BE CALLED BEFORE ANY PACKET I/O IS ATTEMPTED. 
  2075. *         ENTRY  (B1) = 1 
  2076. *                (X1) = REQUIRED WINDOW SIZE
  2077. *         EXIT   WINDOW POINTER INITIALISED 
  2078. *         USES   X - 1, 6.
  2079. *                A - 6. 
  2080. *                B - NONE.
  2081. *         CALLS  NONE.
  2082.           SPACE  4,10 
  2083.  IWP      SUBR               ENTRY/EXIT 
  2084.   
  2085.           MX6    -5 
  2086.           BX6    -X6*X1      ENSURE ONLY 5 BIT WINDOW 
  2087.           SX1    WTABL       (X1) = WINDOW TABLE LENGTH 
  2088.  +        NZ     X6,*+1      WINDOW VALID 
  2089.           SX6    1           FORCE NO WINDOWING 
  2090.           LX6    18+18+18    SET IN = OUT = FIRST (=0)
  2091.           BX6    X1+X6       ADD LIMIT
  2092.           SA6    WPTR        SAVE WINDOW POINTER
  2093.           EQ     IWPX        EXIT 
  2094.           SPACE  4,10 
  2095. **        ROU - RE-TRANSMIT OLDEST UNACKED PACKET.
  2096. *         THIS ROUTINE SCANS THE WINDOW TABLE FOR THE OLDEST PACKET 
  2097. *         WHICH HAS NOT YET BEEN ACKED. THIS PACKET IS THEN RESENT. 
  2098. *         ENTRY  (B1) = 1 
  2099. *         EXIT   OLDEST PACKET RESENT 
  2100. *         USES   X - 1. 
  2101. *                A - 1. 
  2102. *                B - 2, 3, 4. 
  2103. *         CALLS  TPK. 
  2104.           SPACE  4,10 
  2105.  ROU      SUBR               ENTRY/EXIT 
  2106.   
  2107. *         INITIALISE POINTER. 
  2108.   
  2109.           SA1    WPTR        (X1) = WINDOW POINTER
  2110.           SB4    X1          (B4) = LIMIT 
  2111.           AX1    18 
  2112.           SB3    X1          (B3) = OUT 
  2113.           AX1    18 
  2114.           SB2    X1+         (B2) = IN
  2115.   
  2116. *         SEARCH FROM 'OUT' TO 'IN-1' FOR UN-ACKED PACKET.
  2117.   
  2118.  ROU2     SA1    WTABLE+B3   (X1) = NEXT ENTRY
  2119.           PL     X1,ROU4     THIS IS THE OLDEST 
  2120.  +        SB3    B3+B1       INCREMENT OUT
  2121.           NE     B3,B4,*+1   NOT LIMIT
  2122.           SB3    B0          SET OUT = FIRST
  2123.           NE     B2,B3,ROU2  LOOP TILL END OF TABLE 
  2124.   
  2125. *         NO UNACKED PACKET SO PROBLEM. 
  2126.   
  2127.           EQ     ROUX        IGNORE 
  2128.   
  2129. *         PACKET FOUND SO RESEND. 
  2130.   
  2131.  ROU4     AX1    18 
  2132.           SX6    777B 
  2133.           BX1    X1*X6       (X1) = SEQUENCE NUMBER OF PACKET TO RESEND 
  2134.           RJ     RSP         RESEND PACKET
  2135.           EQ     ROUX        EXIT 
  2136.           SPACE  4,10 
  2137. **        RSP - RESEND PACKET.
  2138. *         THIS ROUTINE RESEND THE PACKET WITH THE SPECIFIED 
  2139. *         SEQUENCE NUMBER. IF THE PACKET RETRY COUNT IS 
  2140. *         EXCEEDED THE ABORT STATE IS ENTERED.
  2141. *         ENTRY  (B1) = 1 
  2142. *                (X1) = SEQUENCE NUMBER OF PACKET TO RESEND 
  2143. *         EXIT   (X6) = 0 IF PACKET FOUND AND PROCESSED 
  2144. *         USES   X - 1, 2, 3, 6, 7. 
  2145. *                A - 1, 6.
  2146. *                B - 2, 3, 4, 5, 6, 7.
  2147. *         CALLS  BTP, TPK.
  2148.           SPACE  4,10 
  2149.  RSP      SUBR               ENTRY/EXIT 
  2150.   
  2151. *         INITIALISE POINTER. 
  2152.           BX6    X1          (X6) = REQUIRED SEQUENCE NUMBER
  2153.           SA1    WPTR        (X1) = WINDOW POINTER
  2154.           SB4    X1          (B4) = LIMIT 
  2155.           AX1    18 
  2156.           SB3    X1          (B3) = OUT 
  2157.           AX1    18 
  2158.           SB2    X1          (B2) = IN
  2159.           SX7    777B        (X7) = SEQUENCE NUMBER MASK
  2160.           SB7    18 
  2161.   
  2162. *         SEARCH WINDOW TABLE FOR REQUIRED SEQUENCE NUMBER. 
  2163.   
  2164.  RSP2     SA1    WTABLE+B3   (X1)  NEXT TABLE ENTRY 
  2165.           AX2    X1,B7       RIGHT JUSTIFY SEQUENCE NUMBER
  2166.           BX2    X2*X7       (X2) = SEQUENCE NUMBER 
  2167.           BX2    X2-X6       COMPARE
  2168.           ZR     X2,RSP4     REQUIRED ENTRY FOUND 
  2169.           SB3    B3+B1       INCREMENT OUT
  2170.  +        LT     B3,B4,*+1   NOT LIMIT
  2171.           SB3    0           SET OUT = FIRST
  2172.           NE     B2,B3,RSP2  LOOP TILL FOUND OR END OF WINDOW 
  2173.           SX6    -1          FLAG NOT FOUND 
  2174.           EQ     RSPX        NOT FOUND SO IGNORE
  2175.   
  2176. *         PACKET FOUND SO DECREMENT RETRY COUNT.
  2177.   
  2178.  RSP4     LX1    60-18-9-9   RIGHT JUSTIFY RETRY COUNT
  2179.           BX2    X1*X7       (X2) = RETRY COUNT 
  2180.           SX2    X2-1        DECREMENT
  2181.           ZR     X2,RSP6     RETRY COUNT EXPIRED
  2182.           BX1    -X7*X1      CLEAR PREVIOUS RETRY COUNT 
  2183.           BX1    X1+X2       ADD NEW VALUE
  2184.           LX1    18+9+9      RESTORE ATTRIBUTE WORD POSITION
  2185.           BX6    X1 
  2186.           SA6    A1+         UPDATE WINDOW TABLE ENTRY
  2187.           RJ     TPK         TRANSMIT PACKET
  2188.           MX6    0           FLAG PACKET FOUND AND PROCESSED
  2189.           EQ     RSPX        EXIT 
  2190.   
  2191. *         PACKET RETRY COUNT EXPIRED SO ABORT.
  2192.   
  2193.  RSP6     SX6    2           (X6) = EXIT MODE CODE
  2194.           SA6    EMODE       SAVE 
  2195.           SX6    FPE         FORCE PROTOCOL ERROR 
  2196.           EQ     SGS         SET GIVEN STATE
  2197.           SPACE  4,10 
  2198. **        PAP - PROCESS ACK PACKET. 
  2199. *         THIS ROUTINE SEARCHES THE WINDOW FOR THE PACKET WITH
  2200. *         THE SAME SEQUENCE NUMBER AS SPECIFIED. IF FOUND THEN
  2201. *         THE PACKET IS FLAGGED AS ACKED AND, IF THE OLDEST, THE
  2202. *         WINDOW POINTER IS UPDATED.
  2203. *         ENTRY  (B1) = 1 
  2204. *                (X1) = SEQUENCE NUMBER TO ACK
  2205. *         EXIT   (X6) = 0 IF ACK PROCESSED O.K. 
  2206. *         USES   X - 2, 3, 6, 7.
  2207. *                A - 2, 3, 6. 
  2208. *                B - 2, 3, 4, 6.
  2209. *         CALLS  RBF. 
  2210.           SPACE  4,10 
  2211.  PAP      SUBR               ENTRY/EXIT 
  2212.   
  2213. *         INITIALISE POINTERS.
  2214.   
  2215.           SB7    18 
  2216.           SA2    WPTR        (X2) = WINDOW POINTER
  2217.           SB4    X2          (B4) = LIMIT 
  2218.           AX2    18 
  2219.           SB3    X2          (B3) = OUT 
  2220.           MX7    -9 
  2221.           AX2    18 
  2222.           SB2    X2          (B2) = IN
  2223.           AX2    18          (X2) = AVAILABLE WINDOW
  2224.           SB6    B3          (B6) = OUT'
  2225.   
  2226. *         SEARCH TABLE FOR ENTRY WITH SAME SEQUENCE NUMBER. 
  2227.   
  2228.  PAP2     SA3    WTABLE+B6   (X3) = NEXT TABLE ENTRY
  2229.           AX6    X3,B7
  2230.           BX6    -X7*X6      (X6) = SEQUENCE NUMBER FROM TABLE
  2231.           BX6    X1-X6       COMPARE
  2232.           ZR     X6,PAP4     ENTRY FOUND
  2233.  +        SB6    B6+B1       INCREMENT OUT' 
  2234.           NE     B4,B6,*+1   NOT LIMIT
  2235.           SB6    B0          SET OUT' = FIRST 
  2236.           NE     B2,B6,PAP2  LOOP TILL END OF TABLE 
  2237.   
  2238. *         PACKET WITH SAME SEQUENCE NUMBER NOT FOUND. 
  2239.   
  2240.           SX6    -1          FLAG NOT FOUND 
  2241.           EQ     PAPX        EXIT 
  2242.   
  2243. *         PACKET FOUND SO MARK ACKED. 
  2244.   
  2245.  PAP4     MX6    1
  2246.           BX6    X3+X6       FLAG ACKED 
  2247.           SA6    A3          REPLACE
  2248.           MX6    0           FLAG COMPLETED 
  2249.           NZ     X2,PAPX     WINDOW IS NOT CLOSED SO EXIT 
  2250.   
  2251. *         WINDOW CLOSED SO CHECK OLDEST ENTRY.
  2252.   
  2253.           SA3    WTABLE+B3   (X3) = OLDEST ENTRY
  2254.           PL     X3,PAP6     NOT ACKED SO CHECK FOR SPECIAL 
  2255.   
  2256. *         DELETE OLDEST ENTRY TO OPEN WINDOW. 
  2257.   
  2258.           SX2    X2+B1       INCREMENT AVAILABLE WINDOW 
  2259.           SB3    B3+B1       INCREMENT OUT
  2260.  +        LX2    18 
  2261.           NE     B3,B4,*+1   NOT LIMIT
  2262.           SB3    B0          SET OUT = FIRST
  2263.           SX6    B2          (X6) = IN
  2264.           BX6    X2+X6       ADD AVAILABLE WINDOW 
  2265.           SX2    B3          (X2) = OUT 
  2266.           LX6    18 
  2267.           BX6    X2+X6       ADD TO POINTER 
  2268.           SX2    B4          (X2) = LIMIT 
  2269.           LX6    18 
  2270.           BX6    X2+X6       ADD TO POINTER 
  2271.           SA6    A2          UPDATE WINDOW POINTER
  2272.           SX6    X3          (X6) = FWA OF BUFFER TO BE RETURNED
  2273.           RJ     RBF         RETURN BUFFER TO FREE QUEUE
  2274.           MX6    0           FLAG COMPLETED 
  2275.           EQ     PAPX        EXIT 
  2276.   
  2277. *         WINDOW CLOSED AND LAST PACKET NOT ACKED SO CHECK IF 
  2278. *         REMOTE END IS NOT WINDOWING.
  2279.   
  2280.  PAP6     SA2    WSIZE       (X2) = WINDOW SIZE 
  2281.           NZ     X2,PAPX     WINDOWING ACTIVE SO EXIT 
  2282.   
  2283. *         REMOTE END NOT WINDOWING SO ACK IF NEXT PACKET IS ACKED.
  2284.   
  2285.  +        SB3    B3+B1       INCREMENT OUT
  2286.           NE     B3,B4,*+1   NOT LIMIT
  2287.           SB3    B0          SET OUT = FIRST
  2288.           EQ     B2,B3,PAPX  WINDOW EMPTY 
  2289.           SA2    WTABLE+B3   (X2) = NEXT TABLE ENTRY
  2290.           PL     X2,PAPX     NOT ACKED SO WAIT
  2291.           SX6    X3          (X6) = BUFFER ADDRESS OF PREVIOUS PACKET 
  2292.           SX2    B1          FLAG WINDOW AVAILABLE
  2293.           RJ     RBF         RETURN BUFFER TO FREE QUEUE
  2294.   
  2295. *         UPDATE WINDOW POINTER.
  2296.   
  2297.           SX6    B2          (X6) = IN
  2298.           LX2    18 
  2299.           BX6    X2+X6       (X6) = AVAILABLE WINDOW (1) + IN 
  2300.           SX2    B3          (X2) = OUT 
  2301.           LX6    18 
  2302.           BX6    X2+X6       ADD
  2303.           SX2    B4          (X2) = LIMIT 
  2304.           LX6    18 
  2305.           BX6    X2+X6       (X6) = POINTER WORD
  2306.           SA6    WPTR        SAVE 
  2307.           MX6    0           FLAG COMPLETED 
  2308.           EQ     PAPX        EXIT 
  2309.           SPACE  4,10 
  2310. **        SRP - SAVE RECEIVED PACKET. 
  2311. *         THIS ROUTINE SAVES THE GIVEN ATTRIBUTE WORD IN THE
  2312. *         WINDOW TABLE. THE ATTRIBUTE WORD IS ASSUMED TO BE 
  2313. *         THAT OF A RECEIVED PACKET ALTHOUGH THIS ROUTINE IS
  2314. *         IS ALSO CALLED FOR INTERNALLY GENERATED NAKS. THE 
  2315. *         ATTRIBUTE WORD IS SAVED. IF THE WINDOW WAS CLOSED 
  2316. *         ON ENTRY THEN THE OLDEST PACKET IS WRITTEN TO DISC
  2317. *         UNLESS IT IS NOT ACKED. IN THE LATTER CASE A PROTOCOL 
  2318. *         ERROR OCCURS. 
  2319. *         ENTRY  (B1) = 1 
  2320. *                (X6) = REQUIRED ATTRIBUTE WORD 
  2321. *         EXIT   ATTRIBUTE WORD SAVE IN WINDOW
  2322. *                OLDEST PACKET WRITTEN TO DISC IF REQUIRED
  2323. *         USES   X - 1, 2, 6, 7.
  2324. *                A - 1, 2, 6. 
  2325. *                B - 2, 3, 4. 
  2326. *         CALLS  WDP. 
  2327.           SPACE  4,10 
  2328.  SRP      SUBR               ENTRY/EXIT 
  2329.   
  2330. *         UNPACK WINDOW POINTER.
  2331.   
  2332.           SA2    WPTR        (X2) = WINDOW POINTER
  2333.           SB4    X2          (B4) = LIMIT 
  2334.           AX2    18 
  2335.           SB3    X2          (B3) = OUT 
  2336.           AX2    18 
  2337.           SB2    X2          (B2) = IN
  2338.           AX2    18          (X2) = AVAILABLE WINDOW
  2339.           SX1    0           ASSUME WINDOW IS OPEN
  2340.           NZ     X2,SRP2     ASSUMPTION CORRECT 
  2341.   
  2342. *         WINDOW CLOSED SO GET OLDEST ATTRIBUTE FOR LATER.
  2343.   
  2344.           SA1    WTABLE+B3   (X1) = OLDEST ATTRIBUTE WORD 
  2345.           SX2    1           OPEN WINDOW
  2346.           SB3    B3+B1       INCREMENT OUT
  2347.           NE     B3,B4,SRP2  NO WRAP AROUND 
  2348.           SB3    B0          SET OUT = FIRST
  2349.   
  2350. *         SAVE NEW ATTRIBUTES.
  2351.   
  2352.  SRP2     SX2    X2-1        DECREMENT AVAILABLE WINDOW 
  2353.           SA6    WTABLE+B2   SAVE ATTRIBUTES
  2354.  +        SB2    B2+B1       INCREMENT IN 
  2355.           NE     B2,B4,*+1   NO WRAP AROUND 
  2356.           SB2    B0          SET IN = FIRST 
  2357.   
  2358. *         UPDATE LAST SEQUENCE NUMBER 
  2359.   
  2360.           SX7    777B 
  2361.           AX6    18 
  2362.           BX6    X6*X7       (X6) = SEQUENCE NUMBER 
  2363.           SA6    LASTSEQ     SAVE 
  2364.   
  2365. *         SAVE UPDATED POINTER WORD.
  2366.   
  2367.           SX6    B2          (X6) = IN
  2368.           LX2    18 
  2369.           BX6    X2+X6       ADD TO AVAILABLE WINDOW
  2370.           SX2    B3          (X2) = OUT 
  2371.           LX6    18 
  2372.           BX6    X2+X6       ADD
  2373.           SX2    B4          (X2) = LIMIT 
  2374.           LX6    18 
  2375.           BX6    X2+X6       ADD
  2376.           SA6    A2          UPDATE POINTER WORD
  2377.   
  2378. *         PROCESS PREVIOUS ATTRIBUTE WORD.
  2379.   
  2380.           ZR     X1,SRPX     NO ATTRIBUTES TO PROCESS 
  2381.           PL     X1,SRP4     PACKET NOT ACKED SO PROTOCOL ERROR 
  2382.           RJ     WDP         WRITE DATA PACKET
  2383.           EQ     SRPX        EXIT 
  2384.   
  2385. *         PROTOCOL ERROR. 
  2386.   
  2387.  SRP4     SX6    FPE         FORCE PROTOCOL ERROR 
  2388.           EQ     SGS         SET GIVEN STATE
  2389.           SPACE  4,10 
  2390. **        UWP - UPDATE WINDOW POIINTER. 
  2391. *         THIS ROUTIINE IS CALLED AT THE END OF DATA TRANSFER TO
  2392. *         UPDATE THE WINDOW POINTER THUS DELETING FROM THE WINDOW 
  2393. *         ALL ACKED PACKETS. THIS IS REQUIRED SO THAT THE WINDOW SIZE 
  2394. *         CAN BE RESET TO 1 TO TERMINATE THE TRANSFER.
  2395. *         ENTRY  (B1) = 1 
  2396. *         EXIT   (X6) = AVAILABLE WINDOW
  2397. *         USES   X - 1, 6.
  2398. *                A - 1, 6.
  2399. *                B - 2, 3, 4. 
  2400. *         CALLS  NONE.
  2401.           SPACE  4,10 
  2402.  UWP      SUBR               ENTRY/EXIT 
  2403.   
  2404. *         UNPACK POINTER WORD.
  2405.   
  2406.           SA1    WPTR        (X1) = WINDOW POINTER
  2407.           SB4    X1          (B4) = LIMIT 
  2408.           AX1    18 
  2409.           SB3    X1+         (B3) = OUT 
  2410.           AX1    18 
  2411.           SB2    X1          (B2) = IN
  2412.           AX1    18          (X1) = AVAILABLE WINDOW
  2413.           BX6    X1 
  2414.           EQ     B2,B3,UWP   EMPTY SO EXIT
  2415.   
  2416. *         SEARCH TABLE FOR ACKED PACKETS. 
  2417.   
  2418.  UWP2     SA1    WTABLE+B3   (X1) = NEXT TABLE ENTRY
  2419.           PL     X1,UWP4     NOT YET ACKED
  2420.           SX6    X6+1        INCREMENT AVAILABLE WINDOW 
  2421.           SB3    B3+1        INCREMENT OUT
  2422.  +        NE     B3,B4,*+1   NOT LIMIT
  2423.           SB3    0           RESET OUT = FIRST
  2424.           NE     B2,B3,UWP2  LOOP TILL END OF WINDOW
  2425.   
  2426. *         END OF WINDOW OR UNACKED PACKED SO UPDATE POINTER.
  2427.   
  2428.  UWP4     SX1    B2 
  2429.           LX6    18 
  2430.           BX6    X1+X6       (X) = AVAILABLE WINDOW + IN
  2431.           SX1    B3 
  2432.           LX6    18 
  2433.           BX6    X1+X6       ADD OUT
  2434.           SX1    B4 
  2435.           LX6    18 
  2436.           BX6    X1+X6       ADD LIMIT
  2437.           SA6    WPTR        UPDATE POINTER 
  2438.           AX6    18+18+18    (X6) = AVAILABLE WINDOW
  2439.           EQ     UWPX        EXIT 
  2440.           TITLE  INPUT/OUTPUT ROUTINES. 
  2441. **        INPUT/OUTPUT ROUTINES.
  2442. *         THE FOLLOWING ROUTINES ARE USED FOR CHARACTER CONVERSIONS 
  2443. *         AND SIMILAR INPUT/OUTPUT CONVERSIONS. THE DATA FILE FET 
  2444. *         MUST BE AT LEAST 8 WORDS LONG. WORD 'FFORM' IS USED TO HOLD 
  2445. *         THE REQUIRED FILE FORMAT AS FOLLOWS:- 
  2446. *                     0 = 6 BIT DISPLAY CODE (DIS64)
  2447. *                     1 = 6/12 DISPLAY CODE (ASCII) 
  2448. *                     2 = 8 IN 12 ASCII (ASCII8)
  2449. *         WORD 'FWORD' IS USED TO HOLD THE CURRENT WORD BEING PACKED
  2450. *         OR UNPACKED.
  2451. *         BPW - BUILD PREFIX WORD 
  2452. *         GNC - GET NEXT CHARACTER
  2453. *         ROC - READ ONE CHARACTER
  2454. *         WAC - WRITE ASCII CHARACTER 
  2455. *         WOC - WRITE ONE CHARACTER 
  2456.           SPACE  4,10 
  2457. **        BPW - BUILD PREFIX WORD.
  2458. *         THIS ROUTINE COMBINES THE THREE PREFIX CODES AND SAVES
  2459. *         THE COMBINATION IN 'PWORD' IN THE FORM- 
  2460. *T        2/0,18/-REPT,2/0,18/-QBIN,2/0,18/QCTL 
  2461. *         WHERE REPT = REPEAT PREFIX
  2462. *               QBIN = 8 BIT PREFIX 
  2463. *               QCTL = CONTROL PREFIX 
  2464. *         ENTRY  (B1) = 1 
  2465. *         EXIT   'PWORD' DEFINED
  2466. *         USES   X - 1, 6, 7. 
  2467. *                A - 11, 6. 
  2468. *                B - NONE.
  2469. *         CALLS  NONE 
  2470.           SPACE  4,10 
  2471.  BPW      SUBR               ENTRY/EXIT 
  2472.   
  2473. *         BUILD TX PREFIX WORD. 
  2474.   
  2475.           SX6    0           CLEAR RESULT 
  2476.           SA1    BPW.A       (X1) = LIST OF PREFIX ADDRESSES
  2477.           RJ     BPW2        CONVERT
  2478.           SA6    TXPWORD     SAVE 
  2479.   
  2480. *         BUILD RX PREFIX WORD. 
  2481.   
  2482.           SX6    0           CLEAR RESULT 
  2483.           SA1    BPW.B       (X1) = LIST OF PREFIX ADDRESSES
  2484.           RJ     BPW2        CONVERT
  2485.           SA6    RXPWORD     SAVE 
  2486.           EQ     BPWX        EXIT 
  2487.   
  2488. *         BUILD RESULT FROM ADDRESS LIST. 
  2489.   
  2490.  BPW2     PS
  2491.   
  2492.  BPW4     SA2    X1          (X2) = NEXT PREFIX CHARACTER 
  2493.           MX7    -8 
  2494.           AX1    18 
  2495.           BX2    -X7*X2      ENSURE 8 BITS
  2496.  +        BX2    -X2         COMPLEMENT 
  2497.           NZ     X2,*+1      DEFINED
  2498.           SX2    B1          FORCE ILLEGAL VALUE
  2499.           LX6    20 
  2500.           MX7    -18
  2501.           BX2    -X7*X2      TRUNCATE TO 18 BITS
  2502.           BX6    X2+X6       ADD TO RESULT
  2503.           NZ     X1,BPW4     LOOP FOR ALL PREFIX ADDRESSES
  2504.           EQ     BPW2        EXIT 
  2505.   
  2506.  BPW.A    VFD    6/0,18/REPT,18/QBIN,18/TXQCTL
  2507.  BPW.B    VFD    6/0,18/REPT,18/QBIN,18/RXQCTL
  2508.           SPACE  4,10 
  2509. **        GNC - GET NEXT CHARACTER. 
  2510. *         THIS ROUTINE RETURNS THE NEXT CHARACTER FROM THE SOURCE 
  2511. *         FILE. THE CHARACTER IS RETURNED WITH REQUIRED PREFIX CODES
  2512. *         PACKED INTO ONE REGISTER WITH THE FIRST CODE RIGHT JUSTIFIED. 
  2513. *         ENTRY  (B1) = 1 
  2514. *         EXIT   (X6) = ASCII CODE
  2515. *         USES   X - 1, 2, 6, 7.
  2516. *                A - 1, 6, 7. 
  2517. *                B - NONE.
  2518. *         CALLS  ROC. 
  2519.           SPACE  4,10 
  2520.  GNC      SUBR               ENTRY/EXIT 
  2521.   
  2522.           SA1    GNC.A       CHECK IF PENDING L/F 
  2523.           NZ     X1,GNC2     PENDING CHARACTER
  2524.   
  2525.  GNC0     SX2    F           (X2) = SOURCE FET ADDRESS
  2526.           RJ     ROC         READ ONE CHARACTER 
  2527.           NZ     X1,GNC14    END OF DATA
  2528.           PL     X6,GNC8     NOT EOL
  2529.   
  2530. *         END OF LINE SO SAVE FLAG AND RETURN C/R.
  2531.   
  2532.           SX1    -2 
  2533.           SA2    GNC.D       (X2) = PENDING CHARACTER COUNT 
  2534.           NG     X2,GNC2     NO PENDING CHARACTERS
  2535.           BX6    X1          (X6) = -2 (EOL FLAG) 
  2536.           SA1    A2-B1       (X1) = CURRENT CHARACTER 
  2537.           SX7    X2+4041B    CONVERT REPEAT COUNT TO PRINTABLE FORM 
  2538.           SA6    GNC.A       FLAG C/R & L/F REQUIRED
  2539.           MX6    59 
  2540.           SA6    A2          CLEAR PENDING CHARACTER COUNT
  2541.           BX6    X1          (X6) = CHARACTER 
  2542.           MX1    0           CLEAR RETURN CODE
  2543.           ZR     X2,GNCX     REPEAT COUNT OF 1
  2544.           LX6    12 
  2545.           BX6    X6+X7       ADD REPEAT COUNT 
  2546.           SA2    REPT        (X2) = REPEAT CHARACTER
  2547.           LX6    12 
  2548.           BX6    X2+X6       ADD TO RETURN CODE 
  2549.           EQ     GNCX        EXIT 
  2550.   
  2551. *         CHECK IF CHARACTER IS EOL.
  2552.   
  2553.  GNC2     PL     X1,GNC6     CHARACTER OTHER THAN EOL 
  2554.           SA2    GNC.B+2+X1  (X2) = REQUIRED CHARACTER
  2555.           SX6    X1+B1       INCREMENT PENDING CHARACTER CODE 
  2556.           SA6    GNC.A       REPLACE
  2557.           BX6    X2          (X6) = CHARACTER CODE
  2558.   
  2559. *         ADD CONTROL CHARACTER PREFIX. 
  2560.   
  2561.           SA1    TXQCTL      (X1) = TRANSMIT QUOTE CHARACTER
  2562.           SX1    X1+4000B    SET TOP BIT
  2563.           LX6    12 
  2564.           BX6    X1+X6       ADD TO EOL CODE
  2565.           SX1    0           CLEAR ERROR CODE 
  2566.           EQ     GNCX        EXIT 
  2567.   
  2568. *         PENDING CHARACTER.
  2569.   
  2570.  GNC6     MX6    0
  2571.           SA6    A1          CLEAR PENDING CHARACTER
  2572.           BX6    X1          (X6) = CHARACTER 
  2573.           MX1    0           CLEAR RETURN CODE
  2574.           EQ     GNCX        EXIT 
  2575.   
  2576. *         CHECK FOR REPEAT COUNT. 
  2577.   
  2578.  GNC8     SA1    REPT        (X1) = REPEAT CHARACTER
  2579.           ZR     X1,GNCX     REPEAT DISABLED SO EXIT
  2580.   
  2581. *         COMPARE WITH PREVIOUS CHARACTER.
  2582.   
  2583.           SA2    GNC.C       (X2) = PREVIOUS CHARACTER
  2584.           BX7    X2-X6       COMPARE
  2585.           SA6    A2          UPDATE 
  2586.           LX2    12+12       MAKE ROOM FOR REPEAT COUNT 
  2587.           BX1    X1+X2       (X1) = 36/CHAR,12/0,12/REPT CHAR 
  2588.           SA2    GNC.D       (X2) = REPEAT COUNT
  2589.           SX6    X2+B1       INCREMENT
  2590.           SA6    A2          REPLACE
  2591.           NG     X2,GNC0     FIRST CHARACTER
  2592.           NZ     X7,GNC10    DIFFERENT
  2593.   
  2594. *         CHECK FOR MAX. REPEAT COUNT.
  2595.   
  2596.           SX6    X6-94       CHECK FOR MAXIMUM
  2597.           NG     X6,GNC0     IN RANGE SO GET NEXT CHARACTER 
  2598.           EQ     GNC12       GOTO BUILD AND RETURN MAX. REPEAT COUNT
  2599.   
  2600. *         CHECK REPEAT COUNT GREATER THAN 2.
  2601.   
  2602.  GNC10    AX7    X2,B1       (X7) = 0 IF REPT = 1 OR 2 (NOTE OFFSET BY 1
  2603.           NZ     X7,GNC12    MORE THAN 2
  2604.           MX6    12+12+12 
  2605.           BX6    X1*X6       CLEAR REPEAT CHARACTER 
  2606.           MX1    0           CLEAR RETURN CODE
  2607.           LX6    12+12+12    RIGHT JUSTIFY CHARACTER
  2608.           SA7    A2          RESET REPEAT COUNT 
  2609.           ZR     X2,GNCX     NOT REPEATED 
  2610.           SA6    GNC.A       SAVE PENDING CHARACTER 
  2611.           EQ     GNCX        EXIT 
  2612.   
  2613. *         ADD REPEAT COUNT AND CHARACTER TO RETURN WORD.
  2614.   
  2615.  GNC12    SX2    X2+4041B    CONVERT REPEAT COUNT TO PRINTABLE
  2616.           LX2    12 
  2617.           BX6    X1+X2       ADD REPEAT COUNT TO CHARACTER
  2618.           SX7    B0 
  2619.           SX1    0           CLEAR RETURN CODE
  2620.           SA7    A2          RESET REPEAT COUNT 
  2621.           EQ     GNCX        EXIT 
  2622.   
  2623. *         END OF DATA SO RETURN LAST CHARACTER. 
  2624.   
  2625.  GNC14    SA2    REPT        (X2) = REPEAT CHARACTER
  2626.           ZR     X2,GNCX     NO REPEAT SO NO PENDING CHARACTER
  2627.           SX7    X2+
  2628.           SA2    GNC.D       (X2) = REPEAT COUNT
  2629.           NG     X2,GNCX     ALREADY CLEARED
  2630.           MX6    59 
  2631.           SX2    X2+4041B    MAKE REPEAT COUNT PRINTABLE
  2632.           SA6    A2          CLEAR REPEAT COUNT 
  2633.           SA1    GNC.C       (X1) = PREVIOUS CHARACTER
  2634.           BX6    X1 
  2635.           MX1    0           CLEAR RETURN FLAG
  2636.           SX1    X2-4041B    CHECK FOR UNITY REPEAT COUNT 
  2637.           ZR     X1,GNCX     NO REPEAT NEEDED 
  2638.           LX6    12 
  2639.           BX6    X2+X6       ADD REPEAT COUNT 
  2640.           LX6    12 
  2641.           BX6    X6+X7       ADD REPEAT CHARACTER 
  2642.           MX1    0           CLEAR EXIT FLAG
  2643.           EQ     GNCX        EXIT 
  2644.   
  2645.  GNC.A    CON    0           PENDING EOL FLAG 
  2646.  GNC.B    BSS    0           SPECIAL CHARACTER TABLE
  2647.           CON    4115B       C/R
  2648.           CON    4112B       L/F
  2649.  GNC.C    CON    -1          PREVIOUS CHARACTER 
  2650.  GNC.D    CON    -1          REPEAT COUNT 
  2651.           SPACE  4,10 
  2652. **        ROC - READ ONE CHARACTER. 
  2653. *         THIS ROUTINE READS DATA FROM THE SOURCE FILE AND RETURNS
  2654. *         THE NEXT ASCII CHARACTER. 
  2655. *         ENTRY  (B1) = 1 
  2656. *                (X2) = SOURCE FET ADDRESS
  2657. *         EXIT   (X1) = 0 IF DATA AVAILABLE 
  2658. *                       (1 IF EOR, -1 IF EOF, -2 IF EOI)
  2659. *                (X2) = FET ADDRESS 
  2660. *                (X6) = ASCII BYTE (-1 IF EOL)
  2661. *         USES   X -
  2662. *                A -
  2663. *                B -
  2664. *         CALLS  RDO=.
  2665.           SPACE  4,10 
  2666.  ROC      SUBR               ENTRY/EXIT 
  2667.   
  2668. *         DETERMINE SOURCE FORMAT.
  2669.   
  2670.           SA1    FFORM       (X1) = FILE FORMAT CODE
  2671.           SA1    X1+ROC.A    (X1) = PROCESS ADDRESS 
  2672.           SB7    X1          (B7) = PROCESS ADDRESS 
  2673.           SA1    FWORD       (X1) = CURRENT WORD
  2674.           SA3    A1+B1       (X3) = UNPACKING COUNTER 
  2675.           JP     B7+         PROCESS
  2676.   
  2677. *         6 BIT DISPLAY CODE SOURCE.
  2678.   
  2679.  ROC2     NZ     X3,ROC4     SOURCE WORD NOT EMPTY
  2680.           READO  X2          READ NEXT WORD 
  2681.           NZ     X1,ROCX     END OF DATA SO EXIT
  2682.           SX3    10          RESET UNPACKING COUNTER
  2683.           BX1    X6          (X1) = SOURCE WORD 
  2684.   
  2685. *         EXTRACT CHARACTER.
  2686.   
  2687.  ROC4     LX1    6
  2688.           SX7    X3-1        DECREMENT UNPACKING COUNTER
  2689.           MX6    -6 
  2690.           BX6    -X6*X1      (X6) = CHARACTER 
  2691.           BX1    X1-X6       CLEAR FROM SOURCE
  2692.           NZ     X6,ROC8     NOT COLON OR EOL 
  2693.           ZR     X7,ROC6     LAST CHARACTER OF SOURCE WORD SO CHECK FOR 
  2694.           ZR     X1,ROC50    REMAINING SOURCE NULL SO EOL 
  2695.           EQ     ROC8        COLON
  2696.   
  2697. *         COLON AT END OF WORD SO CHECK IF EOL. 
  2698.   
  2699.  ROC6     READO  X2          READ NEXT SOURCE WORD
  2700.           NZ     X1,ROCX     END OF DATA
  2701.           ZR     X6,ROC50    END OF LINE
  2702.           BX1    X6          (X1) = SOURCE WORD 
  2703.           SX7    10          RESET UNPACKING COUNTER
  2704.           MX6    0           FORCE COLON
  2705.   
  2706. *         CONVERT CHARACTER TO ASCII. 
  2707.   
  2708.  ROC8     SA7    FCOUNT      UPDATE UNPACKING COUNTER 
  2709.           BX7    X1 
  2710.           SA7    A7-B1       UPDATE REMAINING SOURCE WORD 
  2711.           SA1    C2A+X6      CONVERT TO ASCII 
  2712.           SX6    X1+         (X6) = ASCII CODE
  2713.           EQ     ROC38       GOTO CHECK FOR CONTROL CHARACTERS
  2714.   
  2715. *         MIXED 6/12 DISPLAY CODE.
  2716.   
  2717.  ROC10    NZ     X3,ROC12    SOURCE WORD NOT EMPTY
  2718.           READO  X2          READ NEXT WORD 
  2719.           NZ     X1,ROCX     END OF DATA
  2720.           SX3    10          RESET UNPACKING COUNTER
  2721.           BX1    X6          (X1) = SOURCE WORD 
  2722.   
  2723. *         EXTRACT CHARACTER.
  2724.   
  2725.  ROC12    LX1    6
  2726.           SX7    X3-1        DECREMENT UNPACKING COUNTER
  2727.           MX6    -6 
  2728.           BX6    -X6*X1      (X6) = CHARACTER 
  2729.           BX1    X1-X6       CLEAR FROM SOURCE
  2730.           NZ     X6,ROC16    NOT COLON OR EOL 
  2731.           ZR     X7,ROC14    END OF WORD SO COLON OR EOL
  2732.           ZR     X1,ROC50    REMAINDER NULL SO EOL
  2733.           EQ     ROC18       COLON
  2734.   
  2735. *         COLON AT END OF WORD SO CHECK FOR EOL.
  2736.   
  2737.  ROC14    READO  X2          READ NEXT SOURCE WORD
  2738.           NZ     X1,ROCX     END OF DATA
  2739.           ZR     X6,ROC50    END OF LINE
  2740.           BX1    X6          (X1) = SOURCE WORD 
  2741.           SX7    10          RESET UNPACKING COUNTER
  2742.           MX6    0           FORCE COLON
  2743.   
  2744. *         CHECK FOR ESCAPE CODE.
  2745.   
  2746.  ROC16    SB7    20          ASSUME 76NN
  2747.           SX3    X6-76B      CHECK
  2748.           ZR     X3,ROC20    CORRECT (AS USUAL) 
  2749.           SX3    X6-74B      CHECK FOR 74NN 
  2750.           SB7    B7+B7       ASSUME IT IS 
  2751.           ZR     X3,ROC20    CORRECT (WHAT A GENIUS)
  2752.           SB7    B0          CLEAR ESCAPE FLAG
  2753.   
  2754. *         CONVERT CHARACTER TO ASCII. 
  2755.   
  2756.  ROC18    SA7    FCOUNT      UPDATE UNPACKING COUNTER 
  2757.           BX7    X1 
  2758.           SA7    A7-B1       SAVE SOURCE WORD 
  2759.           SA1    C2A+X6      CONVERT CHARACTER TO ASCII 
  2760.           LX1    B7          ALLOW FOR ESCAPE CODE
  2761.           SX6    X1          (X6) = ASCII CODE
  2762.           PL     X6,ROC38    VALID
  2763.   
  2764. *         ILLEGAL CHARACTER CODE. 
  2765.   
  2766.           SX6    A1-C2A      (X6) = DISPLAY CODE
  2767.           MX7    -3 
  2768.           BX7    -X7*X6      (X7) = L.O. 3 BITS 
  2769.           AX6    3
  2770.           LX6    6
  2771.           BX6    X6+X7
  2772.           SX6    X6+2R00     (X6) = DISPLAY CODE
  2773.           LX6    60-12
  2774.           ZR     B7,ROC36    CHARACTER IS NOT ESCAPED (MUST BE '00')
  2775.           SX7    2R74        ASSUME 74NN
  2776.           SB7    B7-40       CHECK ASSUMPTION 
  2777.  +        ZR     B7,*+1      ASSUMPTION CORRECT 
  2778.           SX7    2R76 
  2779.           BX6    X6+X7       ADD PREFIX 
  2780.           LX6    60-12       LEFT JUSTIFY 
  2781.           EQ     ROC36       GOTO FLAG ERROR
  2782.   
  2783. *         PROCESS SECOND HALF OF ESCAPE CODE. 
  2784.   
  2785.  ROC20    NZ     X7,ROC22    SOURCE WORD NOT EMPTY
  2786.           READO  X2          READ NEXT SOURCE WORD
  2787.           NZ     X1,ROCX     END OF DATA
  2788.           SX7    10          RESET UNPACKING COUNTER
  2789.           BX1    X6          (X1) = SOURCE WORD 
  2790.   
  2791. *         EXTRACT SECOND HALF OF CODE.
  2792.   
  2793.  ROC22    MX6    -6 
  2794.           SX7    X7-1        DECREMENT UNPACKING COUNTER
  2795.           LX1    6
  2796.           BX6    -X6*X1      (X6) = CHARACTER 
  2797.           BX1    X1-X6       CLEAR FROM SOURCE
  2798.           NZ     X6,ROC18    NOT COLON OR EOL 
  2799.           ZR     X7,ROC18    LAST CHARACTER OF WORD SO NOT EOL
  2800.           NZ     X1,ROC18    NOT END OF LINE
  2801.           EQ     ROC50       PROCESS END OF LINE
  2802.   
  2803. *         8 IN 12 ASCII.
  2804.   
  2805.  ROC24    MX0    -12
  2806.           BX7    -X0*X1      (X7) = REMAINING BYTE COUNT
  2807.           NZ     X7,ROC26    WORD NOT EMPTY 
  2808.           READO  F           READ SOURCE WORD 
  2809.           NZ     X1,ROCX     END OF DATA SO EXIT
  2810.           SX7    5           RESET UNPACKING COUNT
  2811.           BX1    X6          (X1) = SOURCE WORD 
  2812.   
  2813.  ROC26    LX1    12 
  2814.           SX7    X7-1        DECREMENT REMAINING BYTE COUNT 
  2815.           BX6    -X0*X1      (X6) = DATA BYTE 
  2816.           BX1    X0*X1       CLEAR FROM SOURCE
  2817.           BX7    X1+X7       ADD REMAINING CHARACTER COUNT
  2818.           ZR     X6,ROC24    EOL
  2819.           MX0    -8 
  2820.           BX7    X1+X7       ADD BYTE COUNT TO REMAINING DATA 
  2821.           BX6    -X0*X6      CLEAR TOP BIT IF SET 
  2822.           SA7    FWORD       UPDATE CURRENT WORD
  2823.           EQ     ROC38       GOTO CHECK FOR CONTROL CODES 
  2824.   
  2825. *         HEX FORMAT. 
  2826.   
  2827.  ROC28    MX0    -6 
  2828.           BX7    -X0*X1      (X7) = REMAINING BYTE COUNT
  2829.           NZ     X7,ROC32    DATA AVAILABLE 
  2830.   
  2831.  ROC30    READO  F           READ NEXT SOURCE WORD
  2832.           NZ     X1,ROCX     END OF DATA
  2833.           SX7    5           RESET BYTE COUNT 
  2834.           BX1    X6          (X1) = SOURCE WORD 
  2835.   
  2836.  ROC32    LX1    6
  2837.           SX7    X7-1        DECREMENT AVAILABLE CHARACTER COUNT
  2838.           BX2    -X0*X1      (X2) = NEXT DISPLAY CODE 
  2839.           ZR     X2,ROC30    IGNORE EOL 
  2840.           SX2    X2-1R0      ASSUME 0-9 
  2841.  +        PL     X2,*+1      ASSUMPTION PROBABLY CORRECT
  2842.           SX2    X2+1R0-1RA+10
  2843.           MX6    -4 
  2844.           BX6    X2*X6       CHECK VALID
  2845.           NZ     X6,ROC34    ILLEGAL CHARACTER SO ABORT 
  2846.           LX1    6
  2847.           BX6    -X0*X1      (X6) = SECOND DISPLAY CODE 
  2848.           SX6    X6-1R0      ASSUME 0-9 
  2849.  +        PL     X6,*+1      ASSUMPTION PROBABLY CORRECT
  2850.           SX6    X6+1R0-1RA+10
  2851.           MX3    -4 
  2852.           BX3    X3*X6       CHECK VALID
  2853.           NZ     X3,ROC34    ILLEGAL CHARACTER SO ABORT 
  2854.           LX2    4           POSITION HIGH NIBBLE 
  2855.           BX6    X2+X6       ADD LOW NIBBLE 
  2856.           BX1    X0*X1       ENSURE ROMM IN SOURCE WORD FOR COUNT 
  2857.           BX7    X1+X7       ADD COUNT
  2858.           SA7    FWORD       UPDATE CURRENT WORD
  2859.           EQ     ROC38       GOTO CHECK FOR CONTROL CODES 
  2860.   
  2861. *         DISPLAY CODE NOT 0-9 OR A-F SO ABORT. 
  2862.   
  2863.  ROC34    BX6    -X0*X1      (X6) = OFFENDING CHARACTER 
  2864.           LX6    60-6        POSITION 
  2865.   
  2866. *         FLAG ILLEGAL CHARACTER (DISPLAY CODE IN X6).
  2867.   
  2868.  ROC36    SA6    ILCHAR      SAVE ILLEGAL CHARACTER CODE
  2869.           SX6    E_ILCHAR    SET EXIT MODE
  2870.           SA6    EMODE
  2871.           SA1    ROC.B       (X1) = FWA OF LOG MESSAGE
  2872.           RJ     WLM         WRITE LOG MESSAGE
  2873.           SX6    FPE         FORCE PROTOCOL ERROR 
  2874.           EQ     SGS         SET GIVEN STATE
  2875.   
  2876. *         CHECK FOR 8 BIT PREFIX. 
  2877.   
  2878.  ROC38    MX0    -7 
  2879.           BX0    X0*X6       CHECK IF TOP BIT SET 
  2880.           ZR     X0,ROC40    NOT SET
  2881.           BX6    X0-X6       CLEAR
  2882.           SA3    TXPWORD     (X3) = TRANSMIT PREFIX WORD
  2883.           AX3    20 
  2884.           SX3    X3          (X3) = 8 BIT PREFIX CODE 
  2885.           PL     X3,ROC48    NO PREFIXING ALLOWED SO ERROR
  2886.           BX3    -X3         COMPLEMENT 
  2887.           SX0    X3+4000B    SET TOP BIT
  2888.   
  2889. *         CHECK FOR CONTROL CHARACTER.
  2890.   
  2891.  ROC40    MX1    -5 
  2892.           SX7    X6-177B     CHECK FOR DEL
  2893.           BX1    X1*X6       CHECK FOR 0-31 
  2894.           IX7    X1*X7       (X7) = 0 IF CONTROL CODE 
  2895.           MX1    0           CLEAR CONTROL PREFIX 
  2896.           ZR     X7,ROC42    CONTROL CHARACTER
  2897.   
  2898. *         CHECK CHARACTER IS NOT PREFIX CHARACTER.
  2899.   
  2900.           SB7    X6          (B7) = CHARACTER 
  2901.           SA3    TXPWORD     (X3) = PREFIX CHARACTERS FOR TX
  2902.           SX7    X3+B7       CHECK FOR CONTROL PREFIX 
  2903.           ZR     X7,ROC44    PREFIX 
  2904.           AX3    20 
  2905.           SX7    X3+B7       CHECK FOR 8 BIT PREFIX 
  2906.           ZR     X7,ROC44    PREFIX 
  2907.           AX3    20 
  2908.           SX7    X3+B7       CHECK FOR REPEAT PREFIX
  2909.           ZR     X7,ROC44    PREFIX 
  2910.           SX7    0           CLEAR CONTROL PREFIX FLAG
  2911.           EQ     ROC46       GOTO BUILD CHARACTER 
  2912.   
  2913. *         ADD CONTROL CHARACTER PREFIX. 
  2914.   
  2915.  ROC42    SX1    64 
  2916.           BX6    X1-X6       CTRL[CHAR] 
  2917.   
  2918.  ROC44    SA1    TXQCTL      (X1) = TX CONTROL PREFIX 
  2919.           SX7    X1+4000B    SET BIT 11 
  2920.   
  2921. *         BUILD CHARACTER,  (X0) = 8 BIT, (X6) = CHAR, (X7) = CTRL. 
  2922.   
  2923.  ROC46    SX6    X6+4000B    SET TOP BIT
  2924.           SX1    0           CLEAR ERROR CODE 
  2925.  +        ZR     X7,*+1      NO CONTROL PREFIX
  2926.           LX6    12 
  2927.           BX6    X6+X7       ADD TO CHARACTER 
  2928.  +        ZR     X0,*+1      NO 8 BIT PREFIX
  2929.           LX6    12 
  2930.           BX6    X0+X6       ADD TO CHARACTER 
  2931.           EQ     ROCX        EXIT 
  2932.   
  2933. *         ERROR AS 8 BIT CODE WHEN PREFIXING NOT ALLOWED. 
  2934.   
  2935.  ROC48    MX3    -3 
  2936.           BX7    -X3*X7      (X7) = LAST 3 BITS 
  2937.           AX6    3
  2938.           BX3    -X3*X6      (X3) = NEXT 3 BITS 
  2939.           AX6    3
  2940.           LX6    6
  2941.           BX6    X3+X6       FIRST TWO DIGITS 
  2942.           LX6    6
  2943.           BX6    X6+X7       (X6) = OCTAL DIGITS
  2944.           SX6    X6+3R200    CONVERT TO DISPLAY CODE
  2945.           LX6    60-18       LEFT JUSTIFY 
  2946.           EQ     ROC36       GOTO FLAG ERROR
  2947.   
  2948. *         END OF LINE.
  2949.   
  2950.  ROC50    MX6    0
  2951.           SA6    FCOUNT      CLEAR REMAINING SOURCE COUNT 
  2952.           SA6    A6+B1       CLEAR UNPACKING COUNTER
  2953.           MX6    59          RETURN EOL 
  2954.           MX1    0           CLEAR EOF FLAG 
  2955.           EQ     ROCX        EXIT 
  2956.   
  2957. *         BINARY FORMAT.
  2958.   
  2959.  ROC52    MX0    -4 
  2960.           BX7    -X0*X1      (X7) = REMAINING NIBBLE COUNT
  2961.           SB7    X7+
  2962.           GT     B7,B1,ROC58 AT LEAST ONE BYTE
  2963.           ZR     B7,ROC56 
  2964.   
  2965. *         BYTE CROSSES WORD BOUNDARY
  2966.   
  2967.           LX1    4
  2968.           BX0    -X0*X1      (X0) = HIGH NIBBLE 
  2969.           READO  F           READ NEXT SOURCE WORD
  2970.           NZ     X1,ROC54    END OF DATA
  2971.           MX1    4
  2972.           BX1    -X1*X6      (X1) = REST OF WORD
  2973.           BX6    X1-X6       (X6) = TOP NIBBLE
  2974.           BX6    X0+X6       ADD HIGH NIBBLE FROM PREVIOUS WORD 
  2975.           LX6    4           RIGHT JUSTIFY
  2976.           LX1    4
  2977.           SX7    14          (X7) = REMAINING NIBBLE COUNT
  2978.           BX7    X1+X7       MERGE
  2979.           SA7    FWORD       UPDATE UNPACKING WORD
  2980.           EQ     ROC38       GOTO CHECK FOR CONTROL CODES 
  2981.   
  2982. *         END OF DATA HALF WAY THROUGH NIBBLE.
  2983.   
  2984.  ROC54    BX6    X0          (X6) = AVAILABLE NIBBLE
  2985.           SX7    0
  2986.           LX6    4           (X6) = RETURN BYTE 
  2987.           SA7    FWORD       CLEAR PACKING WORD 
  2988.           EQ     ROC38       GOTO CHECK FOR CONTROL CODES 
  2989.   
  2990. *         ZERO OR EMPTY SOURCE WORD.
  2991.   
  2992.  ROC56    READO  F           READ NEXT SOURCE WORD
  2993.           NZ     X1,ROCX     END OF DATA
  2994.           BX1    X6          (X1) = SOURCE WORD 
  2995.           SX7    15          (X7) = REMAINING NIBBLE COUNT
  2996.   
  2997. *         EXTRACT NEXT BYTE.
  2998.   
  2999.  ROC58    MX0    -8 
  3000.           SX7    X7-2        DECREMENT REMAINING NIBBLE COUNT 
  3001.           LX1    8
  3002.           BX6    -X0*X1      (X6) = DATA BYTE 
  3003.           BX1    X0*X1       CLEAR FROM SOURCE WORD 
  3004.           BX7    X1+X7       ADD REMAINING COUNT TO CURRENT WORD
  3005.           SA7    FWORD       UPDATE 
  3006.           EQ     ROC38       GOTO CHECK FOR CONTROL CODES 
  3007.   
  3008.  ROC.A    BSS    0           SOURCE FORMAT TYPE TABLE 
  3009.           CON    ROC2        6 BIT DISPLAY CODE 
  3010.           CON    ROC10       MIXED 6/12 DISPLAY CODE
  3011.           CON    ROC24       ASCII 8 IN 12
  3012.           CON    ROC28       HEX FORMAT 
  3013.           CON    ROC52       BINARY FORMAT
  3014.  ROC.B    DIS    ,' ILLEGAL CHARACTER CODE - ;D'
  3015.           SPACE  4,10 
  3016. **        WAC - WRITE ASCII CHARACTER.
  3017. *         THIS ROUTINE WRITES THE GIVEN ASCII CHARACTER TO THE DATA 
  3018. *         FILE THE SPECIFIED NUMBER OF TIMES. UNLIKE THE ROUTINE 'WOC'
  3019. *         THIS ROUTINE CHECKS FOR THE SEQUENCE 'C/R' 'L/F' AND INSERTS
  3020. *         AN END OF LINE ACCORDINGLY. 
  3021. *         ENTRY  (B1) = 1 
  3022. *                (B5) = NUMBER OF TIMES TO WRITE CHARACTER
  3023. *                (X0) = ASCII CHARACTER 
  3024. *         EXIT   CHARACTER WRITTEN TO DATA FILE 
  3025. *         USES   X -
  3026. *                A -
  3027. *                B -
  3028. *         CALLS  WOC. 
  3029.           SPACE  4,10 
  3030.  WAC      SUBR               ENTRY/EXIT 
  3031.   
  3032.           SX6    X0-012B     CHECK FOR 'L/F'
  3033.           NZ     X6,WAC2     NOT L/F
  3034.   
  3035. *         L/F SO FORCE EOL IF PENDING C/R.
  3036.   
  3037.           SA1    WAC.A       (X1) = PENDING C/R FLAG
  3038.           ZR     X1,WAC6     NO C/R SO NOT EOL
  3039.           SX6    B5-B1       (X6) = REMAINING REPEAT COUNT
  3040.           SA6    A1          SAVE 
  3041.           RJ     WEL         WRITE END OF LINE
  3042.           SA1    WAC.A       (X1) = REMAINING REPEAT COUNT
  3043.           ZR     X1,WACX     ONLY ONE L/F SO EXIT (NOTE C/R FLAG CLEARED
  3044.           MX6    0           CLEAR PENDING C/R FLAG 
  3045.           SB5    X1+         RESTORE REPEAT COUNT 
  3046.           SA6    A1          CLEAR FLAG 
  3047.           SX0    012B        RESTORE CHARACTER
  3048.           EQ     WAC6        GOTO WRITE CHARACTER 'B5' TIMES
  3049.   
  3050. *         NOT L/F SO CHECK FOR PENDING C/R. 
  3051.   
  3052.  WAC2     SA1    WAC.A       (X1) = PENDING C/R FLAG
  3053.           ZR     X1,WAC4     NO PENDING C/R 
  3054.   
  3055. *         OUTPUT PENDING C/R. 
  3056.   
  3057.           SX6    B5          (X) = REPEAT COUNT 
  3058.           LX0    18 
  3059.           BX6    X0+X6       (X6) = CHARACTER + REPEAT COUNT
  3060.           SA6    A1          SAVE 
  3061.           SX0    015B        (X0) = C/R 
  3062.           SB5    1           (B5) = REPEAT COUNT
  3063.           RJ     WOC         WRITE ONE CHARACTER
  3064.           SX6    0
  3065.           SA1    WAC.A       (X1) = CHARACTER + REPEAT COUNT
  3066.           SB5    X1          RESTORE REPEAT COUNT 
  3067.           AX1    18 
  3068.           SX0    X1          RESTORE ASCII CHARACTER
  3069.           SA6    A1          CLEAR PENDING C/R FLAG 
  3070.   
  3071. *         CHECK FOR C/R.
  3072.   
  3073.  WAC4     SX6    X0-015B     CHECK FOR C/R
  3074.           NZ     X6,WAC6     NOT C/R
  3075.           MX6    59 
  3076.           SB5    B5-B1       DECREMENT REPEAT COUNT 
  3077.           SA6    WAC.A       FLAG PENDING C/R 
  3078.           ZR     B5,WACX     NOT REPEATED SO EXIT 
  3079.   
  3080. *         WRITE CHARACTER.
  3081.   
  3082.  WAC6     RJ     WOC         WRIITE ONE CHARACTER 
  3083.           EQ     WACX        EXIT 
  3084.   
  3085.  WAC.A    CON    0           PENDING C/R FLAG 
  3086.           SPACE  4,10 
  3087. **        WEL - WRITE END OF LINE.
  3088. *         THIS ROUTINE FORCES AN END OF LINE ON THE DATA FILE.
  3089. *         ENTRY  (B1) = 1 
  3090. *         EXIT   EOL WRITTEN TO DATA FILE 
  3091. *         USES   X -
  3092. *                A -
  3093. *                B -
  3094. *         CALLS  WTO=.
  3095.           SPACE  4,10 
  3096.  WEL      SUBR               ENTRY/EXIT 
  3097.   
  3098. *         INITIALISE. 
  3099.   
  3100.           SA1    FFORM       (X1) = FILE FORMAT 
  3101.           SA2    WEL.A+X1    (X2) = PROCESS ADDRESS 
  3102.           SA1    A1+B1       (X1) = PACKING WORD
  3103.           MX6    0           ASSUME EMPTY 
  3104.           ZR     X1,WEL10    WORD EMPTY SO WRITE AS EOL 
  3105.           SB5    X2          (B5) = PROCESS ADDRESS 
  3106.           JP     B5+         BRANCH ACCORDING TO FILE FORMAT
  3107.   
  3108. *         6 BIT OR 6/12 FORMAT (DIS64 OR ASCII).
  3109.   
  3110.  WEL2     MX6    -6 
  3111.           BX7    -X6*X1      (X7) = AVAILABLE SPACE 
  3112.           BX6    X1*X6       (X6) = PACKED DATA 
  3113.           LX6    60-6        RIGHT JUSTIFY
  3114.           SB5    X7-10       CHECK FOR EMPTY WORD 
  3115.           ZR     B5,WEL6     EMPTY SO WRITE EOL 
  3116.           LX7    59-0        CHECK IF ODD CHARACTER COUNT 
  3117.           SB5    X7          (B5) = REMAINING 12 BIT COUNT
  3118.           PL     X7,WEL4     EVEN CHARACTER COUNT 
  3119.           LX6    6
  3120.           SX2    1R 
  3121.           BX6    X2+X6       ADD TRAILING BLANK 
  3122.   
  3123.  WEL4     NZ     B5,WEL6     PACKING WORD NOT FULL
  3124.           WRITEO F           WRITE FULL WORD
  3125.           SX6    0           CLEAR PACKING WORD 
  3126.           SB5    10          RESET PACKING COUNTER
  3127.   
  3128. *         LEFT JUSTIFY AND SAVE PACKING WORD. 
  3129.   
  3130.  WEL6     SB5    B5+B5       * 2
  3131.           SX7    B5+B5       * 4
  3132.           SB5    X7+B5       * 6
  3133.           SB5    B5+B5       * 12 
  3134.           MX7    0
  3135.           LX6    B5          LEFT JUSTIFY PACKING WORD
  3136.           SA7    FWORD       CLEAR PACKING WORD 
  3137.           WRITEO F           WRITE PACKING WORD FORCING EOL 
  3138.           EQ     WELX        EXIT 
  3139.   
  3140. *         8 IN 12 FORMAT. 
  3141.   
  3142.  WEL8     LX1    12          LEFT JUSTIFY 
  3143.           PL     X1,* 
  3144.           BX6    X1          (X6) = LEFT JUSTIFIED PACKED DATA
  3145.   
  3146.  WEL10    WRITEO F           WRITE PACKING WORD 
  3147.           SX6    0
  3148.           SA6    FWORD       CLEAR PACKING WORD 
  3149.           EQ     WELX        EXIT 
  3150.   
  3151. *         HEX FORMAT. 
  3152.   
  3153.  WEL12    SX0    015B        (X0) = C/R 
  3154.           SB5    1           (B5) = REPEAT COUNT
  3155.           RJ     WOC         WRITE ONE CHARACTER
  3156.           SX0    012B        (X0) = L/F 
  3157.           SB5    1           (B5) = REPEAT COUNT
  3158.           RJ     WOC         WRITE ONE CHARACTER
  3159.           EQ     WELX        EXIT 
  3160.   
  3161.  WEL.A    BSS    0           FILE FORMAT BRANCH TABLE 
  3162.           CON    WEL2        6 BIT DISPLAY CODE (DIS64) 
  3163.           CON    WEL2        6/12 DISPLAY CODE (ASCII)
  3164.           CON    WEL8        8 IN 12 ASCII (ASCII8) 
  3165.           CON    WEL12       HEX FORMAT 
  3166.           CON    WEL12       BINARY FORMAT
  3167.           SPACE  4,10 
  3168. **        WOC - WRITE ONE CHARACTER.
  3169. *         THIS ROUTINE WRITES THE GIVEN ASCII CHARACTER THE SPECIFIED 
  3170. *         NUMBER OF TIMES TO THE DATA FILE. 
  3171. *         ENTRY  (B1) = 1 
  3172. *                (B5) = NUMBER OF TIMES TO WRITE CHARACTER
  3173. *                (X0) = ASCII CHARACTER 
  3174. *         EXIT   CHARACTER WRITTEN TO FILE
  3175. *         USES   X -
  3176. *                A -
  3177. *                B -
  3178. *         CALLS 
  3179.           SPACE  4,10 
  3180.  WOC      SUBR               ENTRY/EXIT 
  3181.   
  3182. *         INITIALISE. 
  3183.   
  3184.           SA1    FWORD       (X1) = PACKING WORD
  3185.           BX6    X1 
  3186.           SA1    A1-B1       (X1) = FILE TYPE 
  3187.           SA1    WOC.A+X1    (X1) = PROCESS ADDRESS 
  3188.           SA0    B5          (A0) = NUMBER OF TIMES TO WRITE
  3189.           SB5    X1          (B5) = PROCESS ADDRESS 
  3190.           JP     B5+         BRANCH ACCORDING TO FILE FORMAT
  3191.   
  3192. *         6 BIT DISPLAY CODE (DIS64). 
  3193.   
  3194.  WOC2     SX4    77B
  3195.           BX4    X4*X6       (X4) = REMAINING BYTE COUNT
  3196.           BX6    X4-X6       (X6) = DATA
  3197.  +        NZ     X4,*+1      NOT EMPTY WORD 
  3198.           SX4    10          RESET PACKING COUNTER
  3199.           MX2    -7 
  3200.           BX2    -X2*X0      (X2) = 7 BIT ASCII CODE
  3201.           SA2    A2C+X2      CONVERT TO DISPLAY CODE
  3202.           AX2    18 
  3203.           SX0    X2          (X0) = 6 BIT DISPLAY CODE
  3204.           NG     X0,WOC40    ILLEGAL
  3205.           SB5    A0+         (B5) = NUMBER OF TIMES TO WRITE
  3206.           SX2    F           (X2) = FET ADDRESS 
  3207.   
  3208. *         SAVE CHARACTER 'B5' TIMES.
  3209.   
  3210.  WOC4     BX6    X0+X6       ADD CHARACTER
  3211.           SX4    X4-1        DECREMENT PACKING COUNTER
  3212.           SB5    B5-B1       DECREMENT REPEAT COUNT 
  3213.           NZ     X4,WOC6     PACKING WORD NOT FULL
  3214.           WRITEO X2          WRITE FULL WORD
  3215.           SX6    0           CLEAR PACKING WORD 
  3216.           SX4    10          RESET PACKING COUNTER
  3217.   
  3218.  WOC6     LX6    6           MOVE ONE CHARACTER 
  3219.           NZ     B5,WOC4     LOOP TILL REPEAT COUNT EXHAUSTED 
  3220.           BX6    X4+X6       ADD PACKING COUNTER TO PACKED WORD 
  3221.           SA6    FWORD       SAVE 
  3222.           EQ     WOCX        EXIT 
  3223.   
  3224. *         6/12 DISPLAY CODE (ASCII).
  3225.   
  3226.  WOC8     SX4    77B
  3227.           BX4    X4*X6       (X4) = REMAINING BYTE COUNT
  3228.           BX6    X4-X6       (X6) = DATA
  3229.  +        NZ     X4,*+1      NOT EMPTY WORD 
  3230.           SX4    10          RESET PACKING COUNTER
  3231.           MX2    -7 
  3232.           BX2    -X2*X0      (X2) = 7 BIT ASCII 
  3233.           SA2    A2C+X2      CONVERT TO DISPLAY CODE
  3234.           SX0    X2          (X0) = CODE
  3235.           NG     X0,WOC40    ILLEGAL (THIS SHOULD BE IMPOSSIBLE)
  3236.           SB5    A0          (B5) = REPEAT COUNT
  3237.   
  3238. *         WRITE CHARACTER 'X0' TIMES. 
  3239.   
  3240.  WOC10    BX2    X0          (X2) = DISPLAY CODE
  3241.           AX2    6           CHECK IF 12 BIT CODE 
  3242.           ZR     X2,WOC14    6 BIT CODE 
  3243.   
  3244.           SX4    X4-2        CHECK IF ROOM IN CURRENT WORD
  3245.           NG     X4,WOC12    CROSSES WORD BOUNDARY
  3246.           LX6    6           MAKE ROOM
  3247.           BX6    X0+X6       ADD 12 BIT CODE
  3248.           EQ     WOC16       GOTO CHECK FOR FULL WORD 
  3249.   
  3250.  WOC12    BX6    X2+X6       ADD FIRST 6 BITS TO FILL WORD
  3251.           WRITEO F           WRITE FULL WORD
  3252.           MX6    -6 
  3253.           SX4    10-1        RESET PACKING COUNTER
  3254.           BX6    -X6*X0      (X6) = L.O. 6 BITS 
  3255.           EQ     WOC18       GOTO CHECK FOR REPEAT
  3256.   
  3257. *         ONLY 6 BIT CODE.
  3258.   
  3259.  WOC14    BX6    X0+X6       ADD CODE TO PACKING WORD 
  3260.           SX4    X4-1        DECREMENT PACKING COUNTER
  3261.   
  3262. *         CHECK IF PACKING WORD FULL. 
  3263.   
  3264.  WOC16    NZ     X4,WOC18    NOT FULL 
  3265.           WRITEO F           WRITE FULL WORD
  3266.           SX6    0           RESET PACKING WORD 
  3267.           SX4    10          RESET PACKING COUNTER
  3268.   
  3269. *         CHECK REPEAT COUNT. 
  3270.   
  3271.  WOC18    SB5    B5-B1       DECREMENT REPEAT COUNT 
  3272.           LX6    6
  3273.           NZ     B5,WOC10    LOOP TILL REPEAT COUNT EXPIRED 
  3274.           BX6    X4+X6       ADD PACKING COUNTER TO PACKING WORD
  3275.           SA6    FWORD       SAVE 
  3276.           EQ     WOCX        EXIT 
  3277.   
  3278. *         8 IN 12 ASCII.
  3279.   
  3280.  WOC20    SB5    A0          (B5) = REPEAT COUNT
  3281.           SX1    4000B
  3282.           BX0    X0+X1       ENSURE TOP BIT SET 
  3283.   
  3284. *         SAVE BYTE.
  3285.   
  3286.  WOC22    LX6    12 
  3287.           SB5    B5-1        DECREMENT REPEAT COUNT 
  3288.           BX6    X0+X6       ADD BYTE 
  3289.           NG     X6,WOC24    WORD FULL
  3290.           NZ     B5,WOC22    CHARACTER REPEATED 
  3291.           SA6    FWORD       UPDATE CURRENT WORD
  3292.           EQ     WOCX        EXIT 
  3293.   
  3294. *         WORD FULL.
  3295.   
  3296.  WOC24    WRITEO F           WRITE FULL WORD
  3297.           SX6    0           CLEAR PACKING WORD 
  3298.           NZ     B5,WOC22    CHARACTER REPEATED 
  3299.           SA6    FWORD       UPDATE CURRENT WORD
  3300.           EQ     WOCX        EXIT 
  3301.   
  3302. *         HEX FORMAT. 
  3303.   
  3304.  WOC26    NZ     X6,*+1      NOT NEW WORD 
  3305.           SX6    39          RESET PACKING COUNTER
  3306.           SX4    77B
  3307.           BX4    X4*X6       (X4) = PACKING BYTE COUNT
  3308.           BX6    X4-X6       (X6) = CURRENT DATA
  3309.           SB5    X4          (B5) = PACKING COUNTER 
  3310.           SX4    A0          (X4) = REPEAT COUNT
  3311.           MX1    -4 
  3312.           BX2    -X1*X0      (X2) = LOW NIBBLE OF DATA
  3313.           SA2    H2D+X2      CONVET TO DISPLAY CODE 
  3314.           AX0    4
  3315.           BX1    -X1*X0      (X1) = HIGH NIBBLE OF DATA 
  3316.           SA1    H2D+X1      CONVERT TO DISPLAY CODE
  3317.           LX1    6
  3318.           BX0    X1+X2       (X0) = DISPLAY CODE TO SAVE
  3319.   
  3320. *         SAVE DISPLAY CODE 'X4' TIMES. 
  3321.   
  3322.  WOC28    BX6    X0+X6       ADD TO PACKING WORD
  3323.           SB5    B5-10B      DECREMENT COUNTER
  3324.           LX6    12 
  3325.           PL     B5,WOC30    NOT END OF WORD/LINE 
  3326.           LX6    60-12       POSITION 
  3327.           SA0    X4          SAVE REMAINING REPEAT COUNT
  3328.           WRITEO F           WRITE FULL WORD
  3329.           SX4    A0          RESTORE REPEAT COUNT 
  3330.           SB5    B5+39       RESET PACKING COUNTER
  3331.           MX6    0           CLEAR PACKING WORD 
  3332.           SX7    B5-39+8     CHECK FOR EOL
  3333.           NZ     X7,WOC30    NOT EOL
  3334.   
  3335. *         FORCE EOL.
  3336.   
  3337.           WRITEO X2          FORCE EOL
  3338.           SX4    A0          RESTORE REPEAT COUNT 
  3339.           SB5    39          RESET PACKING COUNTER
  3340.           MX6    0           CLEAR PACKING WORD 
  3341.   
  3342. *         CHECK IF MORE ENTRIES REQUIRED. 
  3343.   
  3344.  WOC30    SX4    X4-1        DECREMENT REPEAT COUNT 
  3345.           NZ     X4,WOC28    CHARACTER REPEATED 
  3346.           SX1    B5          (X1) = COUNTER 
  3347.           BX6    X1+X6       ADD TO PACKING WORD
  3348.           SA6    FWORD       REPLACE
  3349.           EQ     WOCX        EXIT 
  3350.   
  3351. *         BINARY FORMAT.
  3352.   
  3353.  WOC32    NZ     X6,*+1      SOURCE WORD EMPTY
  3354.           SX6    15          FORCE MAX. NIBBLE COUNT
  3355.           MX4    -4 
  3356.           BX4    -X4*X6      (X4) = REMAINING NIBBLE COUNT
  3357.           BX6    X4-X6       (X6) = DATA
  3358.           SB5    X4          (B5) = UNUSED NIBBLE COUNT 
  3359.   
  3360. *         CHECK IF SPACE IN CURRENT WORD. 
  3361.   
  3362.  WOC34    SB5    B5-2        ASSUME SPACE FOR ONE BYTE
  3363.           PL     B5,WOC36    YES THERE IS ROOM
  3364.   
  3365. *         BYTE MUST BE SPLIT OVER TWO CDC WORDS.
  3366.   
  3367.           BX4    X0          (X4) = DATA BYTE 
  3368.           AX4    4           KEEP TOP NIBBLE
  3369.           BX6    X4+X6       ADD TO PACKING WORD
  3370.           WRITEO F           WRITE FULL WORD
  3371.           MX6    -4 
  3372.           SB5    14          RESET REMAINING NIBBLE COUNT 
  3373.           BX6    -X6*X0      (X6) = LOW NIBBLE
  3374.           EQ     WOC38       GOTO CHECK FOR REPEAT
  3375.   
  3376. *         BYTE FITS IN CURRENT WORD.
  3377.   
  3378.  WOC36    LX6    4           MAKE ROOM FOR BYTE 
  3379.           BX6    X0+X6       ADD DATA BYTE
  3380.           NZ     B5,WOC38    NOT FULL WORD
  3381.           WRITEO F           WRITE FULL WORD
  3382.           SB5    15          RESET REMAINING NIBBLE COUNT 
  3383.           SX6    0           CLEAR PACKING WORD 
  3384.   
  3385.                              CHECK FOR MORE DATA BYTES
  3386.   
  3387.  WOC38    LX6    4           POSITION PACKING WORD
  3388.           SA0    A0-1        DECREMENT REPEAT COUNT 
  3389.           SX1    A0 
  3390.           NZ     X1,WOC34    LOOP FOR REPEAT COUNT
  3391.   
  3392. *         UPDATE PACKING WORD AND EXIT. 
  3393.   
  3394.           SX1    B5          (X1) = REMAINING NIBBLE COUNT
  3395.           BX6    X1+X6       ADD TO PACKING WORD
  3396.           SA6    FWORD       SAVE 
  3397.           EQ     WOCX        EXIT 
  3398.   
  3399. *         ILLEGAL CHARACTER ON INPUT. 
  3400.   
  3401.  WOC40    SX2    A2          (X2) = ADDRESS OF LOOKUP TABLE ENTRY 
  3402.           SX6    A2C         (X6) = FWA OF LOOKUP TABLE 
  3403.           IX2    X2-X6       (X2) = OFFENDING ASCII CHARACTER 
  3404.           MX4    -3 
  3405.           SX6    3R000
  3406.           BX7    -X4*X2      (X7) = LAST OCTET
  3407.           IX6    X6+X7       ADD
  3408.           LX6    60-6        POSITION 
  3409.           AX2    3
  3410.           BX7    -X4*X2      (X7) = SECOND OCTET
  3411.           IX6    X6+X7       ADD
  3412.           LX6    60-6 
  3413.           AX2    3
  3414.           BX7    -X4*X2      (X7) = FIRST OCTET 
  3415.           IX6    X6+X7       ADD
  3416.           LX6    60-6 
  3417.           SA6    ILCHAR      SAVE ILLEGAL CHARACTER CODE
  3418.           SX6    E_ILCHAR    SET EXIT MODE
  3419.           SA6    EMODE
  3420.           SA1    WOC.B       (X1) = FWA OF LOG MESSAGE
  3421.           RJ     WLM         WRITE LOG MESSAGE
  3422.           SX6    FPE         FORCE PROTOCOL ERROR 
  3423.           EQ     SGS         SET GIVEN STATE
  3424.   
  3425.  WOC.A    BSS    0           FILE TYPE BRANCH TABLE 
  3426.           CON    WOC2        6 BIT DISPLAY CODE (DIS64) 
  3427.           CON    WOC8        6/12 DISPLAY CODE (ASCII)
  3428.           CON    WOC20       8 IN 12 ASCII (ASCII8) 
  3429.           CON    WOC26       HEX FORMAT (HEX) 
  3430.           CON    WOC32       BINARY FORMAT (BINARY) 
  3431.  WOC.B    DIS    ,' ILLEGAL CHARACTER CODE - ;D'
  3432.           SPACE  4,10 
  3433. **        FRB - FLUSH RECEIVE BUFFER. 
  3434. *         THIS ROUTINE IS CALLED WHEN AN END OF FILE PACKET IS
  3435. *         RECEIVED. IT THEN FLUSHES ANY DATA LEFT IN THE FILE.
  3436. *         ENTRY  (B1) = 1 
  3437. *         EXIT   BUFFER FLUSHED 
  3438. *         USES   X -
  3439. *                A -
  3440. *                B -
  3441. *         CALLS 
  3442.           SPACE  4,10 
  3443.  FRB      SUBR               ENTRY/EXIT 
  3444.   
  3445.           SA1    FFORM       (X1) = FILE FORMAT CODE
  3446.           SA2    X1+FRB.A    (X2) = PROCESS ADDRESS 
  3447.           SB7    X2 
  3448.           SA1    A1+B1       (X1) = PACKING WORD
  3449.           JP     B7+         BRANCH ACCORDING TO TYPE 
  3450.   
  3451. *         8 IN 12 ASCII.
  3452.   
  3453.  FRB2     BX6    X1          (X6) = REMAINING DATA
  3454.           ZR     X6,FRB6     NO DATA
  3455.   
  3456.  +        LX6    12 
  3457.           PL     X6,*        LEFT JUSTIFY 
  3458.           WRITEO F           WRITE LAST WORD
  3459.           EQ     FRB6        GOTO FLUSH BUFFER
  3460.   
  3461. *         HEX FORMAT. 
  3462.   
  3463.  FRB4     SX6    7777B
  3464.           BX6    -X6*X1      (X6) = REMAINING DATA
  3465.           BX1    X1-X6       (X1) = REMAINING BYTE COUNT
  3466.           SX7    X1-39       CHECK FOR EMPTY LINE 
  3467.           ZR     X1,FRB6     IGNORE 
  3468.   
  3469. *         LEFT JUSTIFY LAST WORD. 
  3470.   
  3471.           AX1    3           (X1) = REMAINING 12 BIT COUNT
  3472.           LX1    2           * 4
  3473.           LX7    X1,B1       * 8
  3474.           IX1    X1+X7       * 12 
  3475.           SB7    X1 
  3476.           LX6    B7          LEFT JUSTIFY 
  3477.           WRITEO F           WRITE LAST WORD
  3478.   
  3479. *         FLUSH BUFFER. 
  3480.   
  3481.  FRB6     WRITER F,R         FLUSH BUFFER 
  3482.           EQ     FRBX        EXIT 
  3483.   
  3484. *         BINARY FORMAT.
  3485.   
  3486.  FRB8     ZR     X1,FRB6     NO PARTIAL WORD
  3487.           MX7    -4 
  3488.           BX6    X1*X7       (X6) = REMAINING DATA
  3489.           BX7    -X7*X1      (X7) = REMAINING NIBBLE COUNT
  3490.           SX2    X7-15       CHECK FOR EMPTY WORD 
  3491.           LX7    2           (X7) = REMAINING BIT COUNT 
  3492.           ZR     X2,FRB6     EMPTY WORD SO EXIT 
  3493.           SB7    X7 
  3494.           LX6    B7          POSITION LAST WORD 
  3495.           WRITEO F           AND WRITE IT 
  3496.           WRITER X2,R        FLUSH BUFFER 
  3497.           EQ     FRBX        EXIT 
  3498.   
  3499.  FRB.A    BSS    0           FILE TYPE BRANCH TABLE 
  3500.           CON    FRB6        DIS64
  3501.           CON    FRB6        ASCII
  3502.           CON    FRB2        8 IN 12
  3503.           CON    FRB4        HEX
  3504.           CON    FRB8        BINARY 
  3505.           TITLE  TERMINAL INTERFACE ROUTINES. 
  3506. ***       TERMINAL INTERFACE ROUTINES.
  3507. *         NOS KERMIT ASSUMES THAT ALL CONNECTION PARAMETERS (E.G. PARITY
  3508. *         HAVE BEEN SET PRIOR TO RUNNING KERMIT. THERE IS NO FACILITY 
  3509. *         FOR CHANGING CONNECTION PARAMETERS WITHIN THIS IMPLEMENTATION.
  3510. *         THERE ARE TWO ROUTINES WHICH ARE USED TO MODIFY THE 2550/2551 
  3511. *         FRONT END CONTROL. THESE ROUTINES (STI - SET TERMINAL INTERFAC
  3512. *         AND CTI - CLEAR TERMINAL INTERFACE) ARE USED TO EFFECT THE
  3513. *         FOLLOWING 'TERMDEF' FUNCTIONS.
  3514. *         STI - CALLED BEFORE TRANSFER. 
  3515. *               %EL=N 
  3516. *               %EP=N 
  3517. *               %IC=Y 
  3518. *               %OC=Y 
  3519. *               %PG=N 
  3520. *         CTI - CALLED AFTER TRANSFER.
  3521. *               %EL=CL
  3522. *               %EP=Y 
  3523. *         THESE ROUTINES MAY NEED MODIFICATION DEPENDING ON THE LOCAL 
  3524. *         NETWORK AVAILABLE.
  3525.           SPACE  4,10 
  3526. **        TERMINAL INTERFACE ROUTINES.
  3527. *         THE FOLLOWING ROUTINES ARE USED TO DO ALL THE INPUT/OUTPUT
  3528. *         TO THE TERMINAL.
  3529. *         CTI - CLEAR TERMINAL INTERFACE
  3530. *         RTI - READ TERMINAL INPUT 
  3531. *         STI - SET TERMINAL INTERFACE
  3532.           SPACE  4,10 
  3533. **        CTI - CLEAR TERMINAL INTERFACE. 
  3534. *         THIS ROUTINE IS CALLED TO CLEAR THE TERMINAL INTERFACE
  3535. *         PARAMETERS WHICH WERE CHANGED TO ALLOW THE TRANSFER. IT 
  3536. *         IS NOT POSSIBLE TO RETURN ALL PARAMETERS TO THEIR ORIGINAL
  3537. *         STATE, THOSE NOT RESTORED ARE LISTED BELOW. 
  3538. *         ENTRY  (B1) = 1 
  3539. *         EXIT   TERMINAL INTERFACE CLEARED 
  3540. *         USES   X -
  3541. *                A -
  3542. *                B -
  3543. *         CALLS 
  3544.           SPACE  4,10 
  3545.  CTI      SUBR               ENTRY/EXIT 
  3546.   
  3547.           CSET   RESTORE     RESTORE TERMINAL MODE
  3548.           WRITER O,R         ENSURE START OF POT
  3549.           WRITEW X2,CTI.A,CTI.AL
  3550.           WRITER X2,R 
  3551.   
  3552. *         RETURN UNWANTED FILES.
  3553.   
  3554.           RETURN Q,R         RETURN CATLIST FILE
  3555.           RETURN I,R         RETURN INPUT FILE
  3556.           RETURN O,R         RETURN OUTPUT FILE 
  3557.           SA1    CNAME       (X1) = CURRENT FILE NAME 
  3558.           SA2    F           (X2) = NAME FROM FET 
  3559.           BX1    X1-X2       COMPARE
  3560.           AX1    18          IGNORE STATUS BITS 
  3561.           ZR     X1,CTIX     FILE WAS ALREADY LOCAL 
  3562.           RETURN F           RETURN DATA FILE 
  3563.           EQ     CTIX        EXIT 
  3564.   
  3565.  CTI.A    VFD    12/0016B    CLEAR TERMINAL INTERFACE 
  3566.           VFD    12/4077B,12/4003B   EL=CL
  3567.           VFD    12/4061B,12/4001B   EP=Y 
  3568.           VFD    12/0        ENSURE EOL 
  3569.           IFNE   *P,60,1     ZERO FILL REMAINDER OF WORD
  3570.           VFD    *P/0 
  3571.  CTI.AL   EQU    *-CTI.A
  3572.           SPACE  4,10 
  3573. **        RTI - READ TERMINAL INPUT.
  3574. *         THIS ROUTINE CHECKS FOR ANY INPUT. IF THERE IS INPUT THEN 
  3575. *         IT IS READ IN.
  3576. *         ENTRY  (B1) = 1 
  3577. *         EXIT   (X1) = 0 IF NO INPUT, -1 IF CHECKSUM ERROR 
  3578. *                       OTHERWISE PACKET TYPE CODE IN ASCII 
  3579. *         USES   X - 0, 1, 2, 6, 7. 
  3580. *                A - 0, 1, 2, 6, 7. 
  3581. *                B - 2, 3, 6, 7.
  3582. *         CALLS  AFB, CBA, CIO, RDC=, SYS=, VPC.
  3583.           SPACE  4,10 
  3584.  RTI      SUBR               ENTRY/EXIT 
  3585.   
  3586. *         RETURN INPUT BUFFER IF ASSIGNED.
  3587.   
  3588.           RJ     RIB         RETURN INPUT BUFFER
  3589.   
  3590. *         CHECK FOR AVAILABLE INPUT BUFFER. 
  3591.   
  3592.           RJ     CBA         CHECK IF BUFFER AVAILABLE
  3593.           ZR     X1,RTIX     NO BUFFER AVAILABLE SO EXIT
  3594.  .1       IFGE   PSR,617
  3595.   
  3596. *         CHECK IF ANY INPUT AVAILABLE. 
  3597.   
  3598.  RTI2     SYSTEM TLX,R,RTI.A,1600B
  3599.           SA1    RTI.A       (X1) = STATUS
  3600.           ZR     X1,RTIX     NO INPUT AVAILABLE SO EXIT 
  3601.   
  3602. *         INPUT AVAILABLE SO RESET TIME OUT RETRY COUNTER.
  3603.   
  3604.           SA1    RETRY       (X1) = RETRY LIMIT 
  3605.           SX6    X1+
  3606.           SA6    RETIME      RESET RETRY TIMEOUT COUNTER
  3607.  .1       ELSE
  3608.  RTI2     BSS    0
  3609.  .1       ENDIF 
  3610.   
  3611. *         NOW READ THE INPUT. 
  3612.   
  3613.           READC  I,RTI.B,32  READ LINE
  3614.           NZ     X1,RTI2     BLANK INPUT SO IGNORE
  3615.           RJ     AFB         ALLOCATE FREE BUFFER 
  3616.           SA0    X1+         (A0) = FWA OF BUFFER 
  3617.   
  3618. *         SCAN INPUT BUFFER FOR START OF PACKET.
  3619.   
  3620.           SA1    MARK        (X1) = START OF PACKET CHARACTER 
  3621.           MX0    -6 
  3622.           BX6    X1          (X6) = MARK CHARACTER (IN ASCII) 
  3623.           SA1    RTI.B       (X1) = FIRST SOURCE WORD 
  3624.           SB2    B0          CLEAR ESCAPE FLAG
  3625.           SB3    5           (B3) = A MUCH USED CONSTANT
  3626.           SB6    B3+B3       (B6) = SOURCE UNPACKING COUNTER
  3627.   
  3628. *         GET NEXT CHARACTER AND CHECK FOR MARK.
  3629.   
  3630.  RTI4     LX1    6
  3631.           SB6    B6-B1       DECREMENT UNPACKING COUNTER
  3632.           BX2    -X0*X1      (X2) = 6 BIT DISPLAY CODE
  3633.           BX1    X0*X1       CLEAR BYTE FROM SOURCE 
  3634.  +        NZ     B6,*+1      SOURCE WORDD NOT EMPTY 
  3635.           SB6    B3+B3       RESET SOURCE UNPACKING COUNTER 
  3636.           SA1    A1+B1       (X1) = NEXT SOURCE WORD
  3637.           NZ     B2,RTI8     ALREADY IN ESCAPE SEQUENCE 
  3638.           SX7    X2-76B      CHECK FOR 76NN 
  3639.           ZR     X7,RTI6     ESCAPE CODE
  3640.           SX7    X2-74B      CHECK FOR 74NN 
  3641.           NZ     X7,RTI8     NOT ESCAPE SEQUENCE
  3642.           SX7    20          FLAG 74NN ESCAPE 
  3643.   
  3644.  RTI6     SB2    X7+20       FLAG ESCAPE SEQUENCE IN PROGRESS 
  3645.           EQ     RTI4        GOTO GET NEXT 6 BIT CODE 
  3646.   
  3647.  RTI8     NZ     X2,*+1      NOT POSSIBLE EOL 
  3648.           ZR     X1,RTI20    END OF LINE WITHOUT MARK SO IGNORE 
  3649.           SA2    X2+C2A      CONVERT TO ASCII 
  3650.           LX2    B2          ALLOW FOR ESCAPE SEQUENCE
  3651.           SB2    B0          CLEAR ESCAPE FLAG
  3652.           SX2    X2          (X2) = ASCII CODE
  3653.           BX2    X2-X6       COMPARE WITH MARK CHARACTER
  3654.           NZ     X2,RTI4     NOT MARK SO CONTINUE SEARCH
  3655.   
  3656. *         MARK FOUND SO PACK ASCII INTO INPUT BUFFER. 
  3657.   
  3658.           SX7    A0+         (X7) = FWA OF BUFFER 
  3659.           SA7    IQPTR       UPDATE POINTER 
  3660.           SB7    4           RESET PACKING COUNTER
  3661.           SA6    A0+PDATA-1  PRESET DESTINATION ADDRESS 
  3662.   
  3663.  RTI10    LX1    6
  3664.           SB6    B6-B1       DECREMENT UNPACKING COUNT
  3665.           BX2    -X0*X1      (X2) = NEXT 6 BIT DISPLAY CODE 
  3666.           BX1    X0*X1       CLEAR BYTE FROM SOURCE 
  3667.  +        NZ     B6,*+1      SOURCE WORD NOT EMPTY
  3668.           SB6    B3+B3       RESET UNPACKING SOURCE COUNT 
  3669.           SA1    A1+B1       (X1) = NEXT SOURCE WORD
  3670.           NZ     B2,RTI14    IN ESCAPE SEQUENCE 
  3671.   
  3672.           SX7    X2-76B      CHECK FOR 76NN 
  3673.           ZR     X7,RTI12    ESCAPE SEQUENCE
  3674.           SX7    X2-74B      CHECK FOR 74NN 
  3675.           NZ     X7,RTI14    NOT ESCAPE SEQUENCE
  3676.           SX7    20          FLAG ESCAPE
  3677.   
  3678.  RTI12    SB2    X7+20       FLAG WITHIN ESCAPE SEQUENCE
  3679.           EQ     RTI10       GOTO GET NEXT 6 BIT CODE 
  3680.   
  3681.  RTI14    NZ     X2,*+1      NOT POSSIBLE EOL 
  3682.           ZR     X1,RTI16    END OF PACKET
  3683.           SA2    X2+C2A      CONVERT TO ASCII 
  3684.           LX2    B2          ALLOW FOR ESCAPE CODE
  3685.           SB2    B0          CLEAR ESCAPE FLAG
  3686.           SX2    X2          (X2) = ASCII CODE
  3687.           NG     X2,RTI10    IGNORE IF ILLEGAL
  3688.           LX6    12 
  3689.           SB7    B7-B1       DECREMENT PACKING COUNTER
  3690.           BX6    X2+X6       ADD ASCII TO PACKING WORD
  3691.           NZ     B7,RTI10    PACKING WORD NOT FULL
  3692.           SA6    A6+B1       SAVE FULL WORD 
  3693.           SX6    0           CLEAR PACKING WORD 
  3694.           SB7    B3          RESET PACKING COUNTER
  3695.           EQ     RTI10       GOTO GET NEXT CHARACTER
  3696.   
  3697. *         END OF PACKET SO SAVE LAST PACKED WORD. 
  3698.   
  3699.  RTI16    SB6    B7+B7       CALCULATE SHIFT COUNT (12 * REMAINING) 
  3700.           SB7    B6+B7       *3 
  3701.           SB7    B7+B7       *6 
  3702.           SB7    B7+B7       *12
  3703.           LX6    B7          POSITION LAST WORD 
  3704.           SA6    A6+B1       SAVE 
  3705.   
  3706. *         EXTRACT AND SAVE PACKET ATTRIBUTES. 
  3707.   
  3708.           SA1    A0+PDATA    (X1) = FIRST PACKED WORD 
  3709.           LX1    12+12       IGNORE MARK
  3710.           SX2    377B 
  3711.           BX6    X1*X2       (X2) = LENGTH
  3712.           SX6    X6-32       DECHAR 
  3713.           LX1    12 
  3714.           SA6    A0+B1       SAVE LENGTH
  3715.           BX6    X1*X2       (X6) = SEQUENCE NUMBER 
  3716.           SX6    X6-32       DECHAR 
  3717.           LX1    12 
  3718.           SA6    A6+B1       SAVE SEQUENCE NUMBER 
  3719.           BX6    X1*X2       (X6) = TYPE CODE 
  3720.           SA6    A6+1        SAVE 
  3721.   
  3722. *         VALIDATE CHECKSUM.
  3723.   
  3724.  RTI18    RJ     VPC         VALIDATE PACKET CHECKSUM 
  3725.           ZR     X6,RTI19    NO ERROR 
  3726.   
  3727. *         CHECKSUM ERROR. 
  3728.   
  3729.           SA1    A0+PDATA    (X1) = FIRST DATA WORD 
  3730.           RJ     DBQ         DEBUG CHECKSUM ERROR (IF DEBUG ON) 
  3731.           MX6    0
  3732.           SA6    IQPTR       THROW AWAY INPUT PACKET
  3733.           SX6    A0          (X6) = FWA OF PACKET 
  3734.           RJ     RBF         RETURN BUFFER TO FREE QUEUE
  3735.           SX1    -1          FLAG CHECKSUM ERROR
  3736.           EQ     RTIX        EXIT 
  3737.   
  3738. *         VALID PACKET SO DEBUG IF SELECTED.
  3739.   
  3740.  RTI19    SA1    A0+PDATA    (X1) = FIRST DATA WORD 
  3741.           RJ     DBI         DDEBUG INPUT (IF DEBUG ON) 
  3742.           SA1    A0+PTYPE    (X1) = PACKET TYPE CODE
  3743.           EQ     RTIX        EXIT 
  3744.   
  3745. *         INVALID INPUT AFTER BUFFER ASSIGNED.
  3746.   
  3747.  RTI20    SB6    RTI.B       (B6) = FWA OF INPUT TEXT 
  3748.           RJ     DBL         DEBUG LOST DATA (IF DEBUG ON)
  3749.           MX6    0
  3750.           SA6    IQPTR       CLEAR INPUT QUEUE POINTER
  3751.           SX6    A0          (X6) = FWA OF ASSIGNED BUFFER
  3752.           RJ     RBF         RETURN BUFFER TO FREE QUEUE
  3753.           EQ     RTI2        GOTO CHECK FOR MORE INPUT
  3754.   
  3755.  RTI.A    BSS    1           INPUT BUFFER STATUS WORD 
  3756.  RTI.B    BSS    33          INPUT BUFFER 
  3757.           SPACE  4,10 
  3758. **        STI - SET TERMINAL INTERFACE. 
  3759. *         THIS ROUTINE IS CALLED TO SET THE TERMINAL INTERFACE
  3760. *         PARAMETERS TO THOSE REQUIRED FOR TRANSFER.
  3761. *         THE PARAMETERS CHANGED ARE:-
  3762. *             ASCII MODE
  3763. *         ENTRY  (B1) = 1 
  3764. *         EXIT   TERMINAL INTERFACE SELECTED
  3765. *         USES   X -
  3766. *                A -
  3767. *                B -
  3768. *         CALLS 
  3769.           SPACE  4,10 
  3770.  STI      SUBR               ENTRY/EXIT 
  3771.   
  3772.           CSET   ASCII       SET TERMINAL TO ASCII MODE 
  3773.           WRITER O,R         ENSURE START OF POT
  3774.           WRITEW X2,STI.A,STI.AL
  3775.           WRITER X2,R 
  3776.  .1       IFGE   PSR,617
  3777.   
  3778. *         DISCARD ANY PENDING INPUT.
  3779.   
  3780.  STI2     SYSTEM TLX,R,STI.B,1600B
  3781.           SA1    STI.B       (X1) = INPUT AVAILABLE FLAG
  3782.           ZR     X1,STIX     NO INPUT SO EXIT 
  3783.           READC  I,FBUF,1000B READ AND IGNORE DATA
  3784.           EQ     STI2        LOOP TILL END OF DATA
  3785.  .1       ELSE
  3786.           PROMPT OFF         DISABLE INPUT PROMPT 
  3787.           EQ     STIX        EXIT 
  3788.  .1       ENDIF 
  3789.   
  3790.  STI.A    VFD    12/0016B            SET TERMINAL INTERFACE 
  3791.           VFD    12/4077B,12/4000B   EL=NO
  3792.           VFD    12/4101B,12/4001B   OC=Y 
  3793.           VFD    12/4061B,12/4000B   EP=N 
  3794.           VFD    12/4103B,12/4001B   IC=Y 
  3795.           VFD    12/4045B,12/4000B   PG=N 
  3796.           VFD    12/0                ENSURE EOL 
  3797.           IFNE   *P,60,1     ZERO FILL REMAINDER OF WORD
  3798.           VFD    *P/0 
  3799.  STI.AL   EQU    *-STI.A
  3800.  STI.B    BSS    1           INPUT AVAILABLE FLAG 
  3801.           TITLE  PACKET HANDLERS. 
  3802. **        PACKET HANDLERS.
  3803. *         THE FOLLOWING ROUTINES ARE USED TO BUILD OR PROCESS 
  3804. *         PACKETS AS FOLLOWS:-
  3805. *         AGP - ACK GIVEN PACKET
  3806. *         BCP - BUILD CONNECTION PARAMETERS 
  3807. *         BDP - BUILD DATA PACKET 
  3808. *         BTP - BUILD TRANSMISSION PACKET 
  3809. *         CPR - CREATE PARAMETER REPLY
  3810. *         NGP - NAK GIVEN PACKET
  3811. *         NNP - NACK NEXT PACKET
  3812. *         PPR - PROCESS PARAMETER REPLY 
  3813. *         TGP - TRANSMIT GIVEN PACKET 
  3814. *         TPK - TRANSMIT PACKET 
  3815. *         UDF - UNPACK DATA FIELD 
  3816. *         VPC - VALIDATE PACKET CHECKSUM
  3817. *         WDP - WRITE DATA PACKET 
  3818.           SPACE  4,10 
  3819. **        AGP - ACK GIVEN PACKET. 
  3820. *         THIS ROUTINE TRANSMITS AN ACK PACKET FOR THE GIVEN
  3821. *         SEQUENCE NUMBER.
  3822. *         ENTRY  (B1) = 1 
  3823. *                (X3) = SEQUENCE NUMBER OF PACKET TO ACK
  3824. *         EXIT   PACKET ACKED 
  3825. *         USES   X - 1, 6.
  3826. *                A - 1, 6.
  3827. *                B - 5, 7.
  3828. *         CALLS  BTP, RBF, TPK. 
  3829.           SPACE  4,10 
  3830.  AGP      SUBR               ENTRY/EXIT 
  3831.   
  3832.           SB5    ACK         (B5) = PACKET TYPE 
  3833.           SB7    0           (B7) = LENGTH OF DATA FIELD
  3834.           RJ     BTP         BUILD TRANSMISSION PACKET
  3835.           BX1    X6          (X1) = ATTRIBUTES
  3836.           SX6    X1          (X6) = FWA OF PACKET 
  3837.           SA6    AGP.A       SAVE 
  3838.           RJ     TPK         TRANSMIT PACKET
  3839.           SA1    AGP.A       (X1) = FWA OF ACK PACKET 
  3840.           SX6    X1+
  3841.           RJ     RBF         RETURN BUFFER TO FREE QUEUE
  3842.           EQ     AGPX       EXIT
  3843.   
  3844.  AGP.A    BSS    1           ADDRESS OF ASSIGNE PACKET
  3845.           SPACE  4,10 
  3846. **        BCP - BUILD CONNECTION PARAMETERS.
  3847. *         THIS ROUTINE BUILD THE DATA PART OF AN 'ACK' OR 'S' PACKET
  3848. *         ACCORDING TO THE CURRENT PARAMETERS.
  3849. *         ENTRY  (B1) = 1 
  3850. *                (B5) = PACKET CODE 
  3851. *         EXIT   (B6) = FWA OF DATA STRING
  3852. *                (B7) = LENGTH OF DATA STRING 
  3853. *         USES   X - 2, 3, 6. 
  3854. *                A - 2, 3, 6. 
  3855. *                B - 2, 3, 6, 7.
  3856. *         CALLS  NONE.
  3857.           SPACE  4,10 
  3858.  BCP      SUBR               ENTRY/EXIT 
  3859.   
  3860.           SB6    BCP.B       (B6) = ADDRESS OF DESTINATION BUFFER 
  3861.           SA2    BCP.A       (X2) = FIRST DESCRIPTOR TABLE ENTRY
  3862.           SB3    18          ASSUME 'I' OR 'S' PACKET TYPE
  3863.           SX6    B5-ACK      CHECK TYPE 
  3864.  +        SB7    B6          (B7) = DESTINATION ADDRESS 
  3865.           NZ     X6,*+1      'I' OR 'S' PACKET
  3866.           SB3    B3+B3       USE 'ACK' PACKET 
  3867.   
  3868. *         PROCESS NEXT DESCRIPTOR.
  3869.   
  3870.  BCP2     SB2    X2          (B2) = PROCESS ADDRESS 
  3871.           AX2    B3          RIGHT JUSTIFY CODE 
  3872.           SX3    X2+         (X3) = REQUIRED CODE (OR ADDRESS)
  3873.           NG     X3,BCP4     ADDRESS GIVEN SO EXTRACT 
  3874.           JP     B2+         PROCESS ACCORDING TO TYPE
  3875.   
  3876. *         GET ADDRESSED VALUE AND LOOKUP DEFAULT IF ZERO. 
  3877.   
  3878.  BCP4     BX3    -X3         (X3) = ADDRESS 
  3879.           SA3    X3          (X3) = PARAMETER 
  3880.           NZ     X3,BCP6     VALUE DEFINED
  3881.           SX3    B5-ACK      CHECK FOR ACK
  3882.           ZR     X3,BCP14    ALL RECEIVED PARAMETERS ACKNOWLEDGED 
  3883.           SX3    B7-B6       (X3) = PARAMETER OFFSET
  3884.           SA3    BCP.C+X3    TABLE LOOKUP 
  3885.           SX3    X3 
  3886.  BCP6     JP     B2+         PROCESS
  3887.   
  3888. *         CONVERT USING CTL().
  3889.   
  3890.  BCP8     SX6    64 
  3891.           BX6    X3-X6       FORM PRINTABLE CHARACTER 
  3892.           SA2    A2+B1       (X2) = NEXT TABLE ENTRY
  3893.           SA6    B7          SAVE CHARACTER 
  3894.           SB7    B7+B1       INCREMENT POINTER
  3895.           NZ     X2,BCP2     LOOP TILL END OF TABLE 
  3896.           EQ     BCP14       END OF TABLE SO EXIT 
  3897.   
  3898. *         CONVERT USING CHAR(). 
  3899.   
  3900.  BCP10    SX6    X3+32       CONVERT TO PRINTABLE FORM
  3901.           SA2    A2+1        (X2) = NEXT TABLE ENTRY
  3902.           SA6    B7          SAVE CHARACTER 
  3903.           SB7    B7+B1       INCREMENT POINTER
  3904.           NZ     X2,BCP2     NOT END OF TABLE 
  3905.           EQ     BCP14       END OF TABLE SO EXIT 
  3906.   
  3907. *         CONVERT TO ASCII NUMBER (CHKT). 
  3908.   
  3909.  BCP11    NZ     X3,*+1      DEFINED
  3910.           SX3    1           FORCE MINIMUM
  3911.           SX6    X3+48       CONVERT TO NUMBER
  3912.           SA2    A2+1        (X2) = NEXT TABLE ENTRY
  3913.           SA6    B7          SAVE 
  3914.           SB7    B7+B1       INCREMENT POINTER
  3915.           EQ     BCP2        GOTO PROCESS NEXT TABLE ENTRY
  3916.   
  3917. *         NO CONVERSION REQUIRED. 
  3918.   
  3919.  BCP12    MX6    -8 
  3920.           BX6    -X6*X3      (X6) = CHARACTER 
  3921.           SA2    A2+B1       (X2) = NEXT TABLE ENTRY
  3922.           SA6    B7          SAVE CHARACTER 
  3923.           SB7    B7+1        INCREMENT POINTER
  3924.           NZ     X2,BCP2     NOT END OF TABLE 
  3925.           EQ     BCP14       END OF TABLE SO EXIT 
  3926.   
  3927. *         CAPABILITY BYTE(S). 
  3928.   
  3929.  BCP13    MX6    -5 
  3930.           BX6    -X6*X3      (X6) = NEXT BYTES WORTH
  3931.           AX3    5           DELETE FROM SOURCE 
  3932.           LX6    1
  3933.  +        ZR     X3,*+1      NO CONTINUATION
  3934.           SX6    X6+1        FLAG CONTINUATIION 
  3935.           SB7    B7+B1       INCREMENT DESTINATION ADDRESS
  3936.           SX6    X6+32       CHAR() 
  3937.           SA6    B7-B1       SAVE 
  3938.           NZ     X3,BCP13    LOOP FOR ALL BYTES 
  3939.           SA2    A2+1        (X2) = NEXT TABLE ENTRY
  3940.           NZ     X2,BCP2     LOOP TILL END OF TABLE 
  3941.           EQ     BCP14       END OF TABLE SO EXIT 
  3942.   
  3943. *         ADD WINDOW SIZE.
  3944.   
  3945.  BCP13A   SA1    CAPAS       (X1) = CAPABILITY MASK 
  3946.           LX1    59-1        CHECK IF WINDOWING REQUIRED
  3947.           NG     X1,BCP10    CHAR CHARACTER 
  3948.           SA2    A2+1        (X2) = NEXT TABLE ENTRY
  3949.           NZ     X2,BCP2     LOOP TILL END OF TABLE 
  3950. *         EQ     BCP14       EXIT 
  3951.   
  3952. *         END OF TABLE SO CALCULATE LENGTH AND EXIT.
  3953.   
  3954.  BCP14    SB7    B7-B6       (B7) = STRING LENGTH 
  3955.           EQ     BCPX        EXIT 
  3956.   
  3957.  BCP.A    BSS    0           PARAMETER DESCRIPTOR TABLE 
  3958.           VFD    6/0,18/94,18/94,18/BCP10       MAXL
  3959.           VFD    6/0,18/5,18/5,18/BCP10         TIME
  3960.           VFD    6/0,18/0,18/0,18/BCP10         NPAD
  3961.           VFD    6/0,18/0,18/0,18/BCP8          PADC
  3962.           VFD    6/0,18/015B,18/015B,18/BCP10   EOL 
  3963.           VFD    6/0,18/043B,18/043B,18/BCP12   QCTL
  3964.           VFD    6/0,18/-QBIN,18/046B,18/BCP12  QBIN
  3965.           VFD    6/0,18/-CHKT,18/1,18/BCP11  CHKT 
  3966.           VFD    6/0,18/-REPT,18/176B,18/BCP12  REPT
  3967.           VFD    6/0,18/-CAPAS,18/-CAPAS,18/BCP13    CAPAS
  3968.           VFD    6/0,18/-WSIZE,18/-RWSIZE,18/BCP13A  WINDOW 
  3969.           CON    0
  3970.  BCP.B    BSS    20          DATA BUFFER
  3971.  BCP.C    BSS    0           DEFAULT VALUE TABLE
  3972.           CON    94          MAXL 
  3973.           CON    5           TIME 
  3974.           CON    0           NPAD 
  3975.           CON    0           PADC 
  3976.           CON    015B        EOL
  3977.           CON    043B        QCTL 
  3978.           CON    116B        QBIN 
  3979.           CON    1           CHKT 
  3980.           CON    040B        REPT 
  3981.           CON    2           CAPAS
  3982.           CON    8           WINDOW 
  3983.           SPACE  4,10 
  3984. **        BDP - BUILD DATA PACKET.
  3985. *         THIS ROUTINE READS DATA FROM THE CURRENT FILE AND BUILDS
  3986. *         A DATA PACKET. IF THERE IS NOT DATA AVAILABLE AN EXIT FLAG
  3987. *         IS SET TO INDICATE EOF. 
  3988. *         ENTRY  (B1) = 1 
  3989. *         EXIT   DATA PACKET BUILT
  3990. *         USES   X -
  3991. *                A -
  3992. *                B -
  3993. *         CALLS  GNC. 
  3994.           SPACE  4,10 
  3995.  BDP      SUBR               ENTRY/EXIT 
  3996.   
  3997. *         PRESET COUNTERS.
  3998.   
  3999.           SB2    BDP.A       (B2) = FWA OF BUFFER 
  4000.           SA1    MAXL        (X1) = MAXIMUM PACKET LENGTH 
  4001.           SB3    0           CLEAR DATA COUNT 
  4002.           SB4    X1-3        (B4) = DATA LENGTH 
  4003.           SA1    BDP.B       (X1) = SAVED CHARACTER 
  4004.           BX6    X1          (X6) = SAVED CHARACTER (IF ANY)
  4005.           SA1    A1+B1       (X1) = COUNT MASK
  4006.           NZ     X6,BDP2A    PENDING CHARACTER
  4007.   
  4008. *         GET NEXT CHARACTER. 
  4009.   
  4010.  BDP2     RJ     GNC         GET NEXT CHARACTER 
  4011.           NZ     X1,BDP8     END OF DATA
  4012.           SA1    BDP.C       (X1) = COUNT MASK
  4013.   
  4014. *         CHECK NUMBER OF CHARACTERS TO DEFINE. 
  4015.   
  4016.  BDP2A    BX1    X1*X6       CHECK NUMBER OF CHARACTERS 
  4017.           CX1    X1          (X1) = NUMBER OF CHARACTERS TO SAVE
  4018.           SB7    X1          (B7) = COUNT 
  4019.           SB3    B3+B7       CHECK IF ROOM
  4020.           GE     B3,B4,BDP4  NO ROOM
  4021.   
  4022. *         SAVE CHARACTERS.
  4023.   
  4024.           SX1    377B 
  4025.   
  4026.  BDP3     BX7    X1*X6       (X7) = NEXT CHARACTER
  4027.           SB7    B7-1        DECREMENT COUNT
  4028.           SA7    B2          SAVE 
  4029.           AX6    12 
  4030.           SB2    B2+B1
  4031.           NZ     B7,BDP3     LO0P FOR ALL CHARACTERS
  4032.           EQ     BDP2        GOTO GET NEXT CHARACTER
  4033.   
  4034. *         NOT ENOUGH ROOM SO SAVE.
  4035.   
  4036.  BDP4     SA6    BDP.B       SAVE CHARACTER 
  4037.           SB5    DATA        (B5) = REQUIRED PACKET TYPE
  4038.           SB6    BDP.A       (B6) = FWA OF DATA 
  4039.           MX3    59          FLAG NEXT SEQUENCE NUMBER
  4040.           SB7    B3-B7       (B7) = DATA BYTE COUNT 
  4041.           RJ     BTP         BUILD TRANSMISSION PACKET
  4042.           EQ     BDPX        EXIT 
  4043.   
  4044. *         END OF DATA SO SAVE PARTIAL BLOCK (IF ANY). 
  4045.   
  4046.  BDP8     MX6    0
  4047.           SB7    B0          ASSUME ZERO LENGTH DATA
  4048.           SA6    BDP.B       CLEAR PENDING CHARACTER
  4049.           NZ     B3,BDP4     SOME DATA ALREADY SAVED
  4050.           EQ     BDPX        EXIT 
  4051.   
  4052.  BDP.A    BSS    94          MAXIMUM DATA SIZE
  4053.  BDP.B    CON    0           LAST DATA BYTE 
  4054.  BDP.C    CON    40004000400040004000B
  4055.           SPACE  4,10 
  4056. **        BTP - BUILD TRANSMISSION PACKET.
  4057. *         THIS ROUTINE TAKES THE GIVEN DATA AND BUILDS THE
  4058. *         REQUIRED PACKET FROM IT. THIS ROUTINE SHOULD ONLY 
  4059. *         BE CALLED IF THERE IS SPACE TO PUT THE PACKET.
  4060. *         ENTRY  (B1) = 1 
  4061. *                (B5) = PACKET TYPE CODE
  4062. *                (B6) = FWA OF DATA STRING (IF REQUIRED)
  4063. *                (B7) = LENGTH OF DATA STRING 
  4064. *                (X3) = REQUIRED SEQUENCE NUMBER (OR -VE FOR NEXT)
  4065. *         EXIT   (X6) = PACKET ATTRIBUTES 
  4066. *                              6/0,9/LEN,9/0,9/0,9/SEQ,18/ADR 
  4067. *         USES   X - 0, 1, 2, 3, 6, 7.
  4068. *                A - 1, 2, 3, 6, 7. 
  4069. *                B - 2. 
  4070. *         CALLS  AFB. 
  4071.           SPACE  4,10 
  4072.  BTP      SUBR               ENTRY/EXIT 
  4073.   
  4074. *         ALLOCATE SPACE FOR PACKET.
  4075.   
  4076.           RJ     AFB         ALLOCATE OUTPUT BUFFER 
  4077.           MX6    0           ASSUME ERROR 
  4078.           ZR     X1,BTPX     NO PACKET SO EXIT
  4079.           SX0    A6          (X0) = FWA OF PACKET 
  4080.   
  4081. *         SET UP PACKET HEADER WITH PADDING IF REQUIRED.
  4082.   
  4083.           SX6    7           (X6) = BINARY OUTPUT REQUEST 
  4084.           SA1    NPAD        (X1) = NUMBER OF PADDING CHARACTERS REQUIRE
  4085.           SB2    4           RESET PACKING COUNTER
  4086.           ZR     X1,BTP6     NO PADDING REQUIRED
  4087.           SA2    PADC        (X2) = PADDING CHARACTER 
  4088.           SX2    X2+4000B    FORCE TOP BIT SET
  4089.   
  4090.  BTP2     LX6    12 
  4091.           SX1    X1-1        DECREMENT PADDING CHARACTER COUNT
  4092.           BX6    X2+X6       ADD PADDING CHARACTER
  4093.           SB2    B2-B1       DECREMENT PACKING COUNTER
  4094.           NZ     B2,BTP4     PACKING WORD NOT FULL
  4095.           SA6    A6+B1       SAVE FULL FORD 
  4096.           SB2    5           RESET PACKING COUNTER
  4097.           SX6    0           CLEAR PACKING WORD 
  4098.   
  4099.  BTP4     NZ     X1,BTP2     LOOP FOR ALL PADDING CHARACTERS
  4100.   
  4101. *         ADD START OF PACKET HEADER. 
  4102.   
  4103.  BTP6     SA1    MARK        (X1) = PACKET MARKER 
  4104.           SX1    X1+4000B    SET TOP BIT
  4105.           LX6    12 
  4106.           SB2    B2-1        DECREMENT PACKING COUNTER
  4107.           BX6    X1+X6       ADD MARK 
  4108.           NZ     B2,BTP8     PACKING WORD NOT FULL
  4109.           SA6    A6+1        SAVE FULL WORD 
  4110.           SB2    5           RESET PACKING COUNTER
  4111.           SX6    0           CLEAR PACKING WORD 
  4112.   
  4113. *         ADD PACKET LENGTH.
  4114.   
  4115.  BTP8     LX6    12 
  4116.           SX2    B7+4043B    CONVERT LENGTH TO PRINTABLE FORM 
  4117.           SB2    B2-B1       DECREMENT PACKING COUNTER
  4118.           BX6    X2+X6       ADD LENGTH 
  4119.           NZ     B2,BTP10    NOT FULL WORD
  4120.           SA6    A6+B1       SAVE FULL WORD 
  4121.           SB2    5           RESET PACKING COUNTER
  4122.           SX6    0           CLEAR PACKING WORD 
  4123.   
  4124. *         GET AND UPDATE SEQUENCE NUMBER. 
  4125.   
  4126.  BTP10    PL     X3,BTP12    SEQUENCE NUMBER DEFINED
  4127.           SA3    SEQ         (X3) = SEQUENCE NUMBER 
  4128.           MX1    -6 
  4129.           SX7    X3+B1       INCREMENT
  4130.           BX7    -X1*X7      ENSURE 6 BITS
  4131.           SA7    A3          REPLACE
  4132.   
  4133.  BTP12    BX7    X3          (X7) = SEQUENCE NUMBER 
  4134.           SX3    X3+4040B    ENSURE PRINTABLE 
  4135.           LX7    18          POSITION FOR ATTRIBUTE WORD
  4136.           SB2    B2-B1       DECREMENT PACKING COUNTER
  4137.           LX6    12 
  4138.           BX0    X0+X7       ADD SEQUENCE NUMBER TO ATTRIBUTE WORD
  4139.           BX6    X3+X6       ADD SEQUENCE NUMBER TO PACKING WORD
  4140.           IX7    X2+X3       INITIALISE CHECKSUM
  4141.           NZ     B2,BTP14    PACKING WORD NOT FULL
  4142.           SA6    A6+B1       SAVE FULL WORD 
  4143.           SB2    5           RESET PACKING COUNTER
  4144.           SX6    0           CLEAR PACKING WORD 
  4145.   
  4146. *         ADD PACKET TYPE.
  4147.   
  4148.  BTP14    LX6    12 
  4149.           SA1    BTP.A+B5    CONVERT TO ASCII CODE
  4150.           SB2    B2-B1       DECREMENT PACKING COUNTER
  4151.           IX7    X1+X7       AD TYPE CODDE TO CHECKSUM
  4152.           BX6    X1+X6       ADD PACKET TYPE
  4153.           NZ     B2,BTP16    PACKING WORD NOT FULL
  4154.           SA6    A6+B1       SAVE FULL WORD 
  4155.           SB2    5           RESET PACKING COUNTER
  4156.           MX6    0           CLEAR PACKING WORD 
  4157.   
  4158. *         COPY DATA (IF ANY). 
  4159.   
  4160.  BTP16    ZR     B7,BTP22    NO DATA FIELD
  4161.           SA1    B6+         (X1) = FIRST DATA BYTE 
  4162.   
  4163.  BTP18    LX6    12 
  4164.           SX1    X1+4000B    SET TOP BIT
  4165.           IX7    X1+X7       ADD TO CHECKSUM
  4166.           SB2    B2-B1       DECREMENT PACKING COUNTER
  4167.           BX6    X1+X6       ADD TO PACKING WORD
  4168.           NZ     B2,BTP20    PACKING WORD NOT FULL
  4169.           SA6    A6+B1       SAVE FULL WORD 
  4170.           SB2    5           RESET PACKING COUNTER
  4171.           MX6    0           CLEAR PACKING WORD 
  4172.   
  4173.  BTP20    SB7    B7-B1       DECREMENT CHARACTER COUNT
  4174.           SA1    A1+B1       (X1) = NEXT CHARACTER
  4175.           NZ     B7,BTP18    LOOP TILL END OF DATA
  4176.   
  4177. *         CALCULATE AND ADD CHECKSUM (TYPE 1).
  4178.   
  4179.  BTP22    SX3    77B
  4180.           BX1    X3*X7       (X1) = L.O. 6 BITS 
  4181.           AX7    6
  4182.           MX2    -2 
  4183.           BX2    -X2*X7      (X2) = H.O. 2 BITS 
  4184.           IX1    X1+X2       (X1) = CHECKSUM
  4185.           BX1    X1*X3      ENSURE 6 BIT RESULT 
  4186.           SX1    X1+4040B    MAKE PRINTABLE 
  4187.           LX6    12 
  4188.           BX6    X1+X6       ADD CHECKSUM 
  4189.           GT     B2,B1,BTP24 PACKING WORD NOT FULL
  4190.           SA6    A6+B1       SAVE FULL WORD 
  4191.           SB2    5+1         RESET PACKING COUNTER
  4192.           MX6    0           CLEAR PACKING WORD 
  4193.   
  4194. *         ADD REQUIRED TERMINATION CHARACTER. 
  4195.   
  4196.  BTP24    SB2    B2-2        DECREMENT PACKING COUNTER
  4197.           SA1    EOL         (X1) = REQUIRED END OF LINE CHARACTER
  4198.           LX6    12 
  4199.           SX1    X1+4000B    SET TOP BIT
  4200.           BX6    X1+X6       ADD TO PACKING WORD
  4201.  +        NZ     B2,*+1      PACKING WORD NOT FULL
  4202.           SA6    A6+B1       SAVE FULL WORD 
  4203.           MX6    0           CLEAR PACKING WORD 
  4204.   
  4205. *         LEFT JUSTIFY AND SAVE LAST WORD.
  4206.   
  4207.           SB7    B2+B2       CALCULATE 12 * REMAINING CHARACTER COUNT 
  4208.           SB7    B2+B7       *3 
  4209.           SB7    B7+B7       *6 
  4210.           SB7    B7+B7       *12
  4211.           LX6    B7          LEFT JUSTIFY LAST WORD 
  4212.           SB6    X0+         (B6) = FWA OF PACKET 
  4213.           SA6    A6+B1       SAVE LAST WORD 
  4214.   
  4215. *         CALCULATE AND SAVE PACKET LENGTH IN WORDS.
  4216.   
  4217.           SB7    A6          (B7) = LWA 
  4218.           SX6    B7-B6       (X6) = PACKET LENGTH 
  4219.           LX6    18+9+9+9    POSITION FOR ATTRIBUTE WORD
  4220.           BX6    X0+X6       ADD TO ATTRIBUTES
  4221.           EQ     BTPX        EXIT 
  4222.   
  4223.  BTP.A    BSS    0           PACKET TYPE TO ASCII CHARACTER TABLE 
  4224.           LOC    0
  4225.           CON    4040B       COMPLETE 
  4226.           CON    4040B       TIMEOUT
  4227.           CON    4104B       DATA 
  4228.           CON    4131B       ACK
  4229.           CON    4116B       NAK
  4230.           CON    4123B       SENDI
  4231.           CON    4102B       BREAK
  4232.           CON    4106B       FILE HEADER
  4233.           CON    4132B       END OF FILE
  4234.           CON    4105B       ERROR
  4235.           CON    4122B       RECEIVE
  4236.           CON    4107B       GENERIC COMMAND
  4237.           CON    4111B       INIT 
  4238.           CON    4130B       TYPE 
  4239.           LOC    *O 
  4240.           SPACE  4,10 
  4241. **        CPR - CREATE PARAMETER REPLY. 
  4242. *         THIS ROUTINE IS CALLED TO PROCESS A RECEIVED 'S' PACKET 
  4243. *         AND GENERATE THE REQUIRED REPLY.
  4244. *         ENTRY  (B1) = 1 
  4245. *         EXIT
  4246. *         USES   X -
  4247. *                A -
  4248. *                B -
  4249. *         CALLS 
  4250.           SPACE  4,10 
  4251.  CPR      SUBR               ENTRY/EXIT 
  4252.   
  4253. *         PROCESS 'S' OR 'I' PARAMETERS.
  4254.   
  4255.           RJ     PPR         PROCESS PARAMETER REPLY
  4256.   
  4257. *         BUILD 'ACK' PACKET. 
  4258.   
  4259.           SB5    ACK         (B5) = REQUIRED PACKET TYPE
  4260.           RJ     BCP         BUILD CONNECTION PARAMETERS
  4261.           SX6    B0          CLEAR CURRENNT SEQUENCE NUMBER 
  4262.           MX3    59          FLAG NEXT
  4263.           SA6    SEQ         CLEAR
  4264.           RJ     BTP         BUILD TRANSMISSION PACKET
  4265.           BX1    X6 
  4266.           RJ     TPK         TRANSMIT PACKET
  4267.           EQ     CPRX        EXIT 
  4268.           SPACE  4,10 
  4269. **        NGP - NAK GIVEN PACKET. 
  4270. *         THIS ROUTINE TRANSMITS A NAK PACKET FOR THE GIVEN 
  4271. *         SEQUENCE NUMBER.
  4272. *         ENTRY  (B1) = 1 
  4273. *                (X3) = SEQUENCE NUMBER OF PACKET TO NAK
  4274. *         EXIT   PACKET NAKED 
  4275. *         USES   X - 1, 6.
  4276. *                A - 1, 6.
  4277. *                B - 5, 7.
  4278. *         CALLS  BTP,RBF,TPK. 
  4279.           SPACE  4,10 
  4280.  NGP      SUBR               ENTRY/EXIT 
  4281.   
  4282.           SB5    NAK         (B5) = PACKET TYPE 
  4283.           SB7    0           (B7) = LENGTH OF DATA FIELD
  4284.           RJ     BTP         BUILD TRANSMISSION PACKET
  4285.           BX1    X6          (X1) = ATTRIBUTES
  4286.           SX6    X1          (X6) = FWA OF PACKET 
  4287.           SA6    NGP.A       SAVE 
  4288.           RJ     TPK         TRANSMIT PACKET
  4289.           SA1    NGP.A       (X1) = FWA OF PACKET 
  4290.           SX6    X1+
  4291.           RJ     RBF         RETURN BUFFER TO FREE QUEUE
  4292.           EQ     NGPX        EXIT 
  4293.   
  4294.  NGP.A    BSS    1           ADDRESS OF ASSIGNED PACKET 
  4295.           SPACE  4,10 
  4296. **        NNP - NAK NEXT PACKET.
  4297. *         THIS ROUTINE IS USED TO OUTPUT A NAK PACKET WHEN A DATA 
  4298. *         PACKET IS RECEIVED WHICH IS OUT OF SEQUENCE.
  4299. *         ENTRY  (B1) = 1 
  4300. *         EXIT   NAK PACKET TRANSMITTED 
  4301. *         USES   X -
  4302. *                A -
  4303. *                B -
  4304. *         CALLS  SRP. 
  4305.           SPACE  4,10 
  4306.  NNP      SUBR               ENTRY/EXIT 
  4307.   
  4308.           SB5    NAK         (B5) = PACKET TYPE 
  4309.           SA3    LASTSEQ     (X3) = LAST SEQUENCE NUMBER
  4310.           SB7    B0          NO DATA
  4311.           SX3    X3+B1       INCREMENT SEQUENCE NUMBER
  4312.           MX6    -6 
  4313.           BX3    -X6*X3      ENSURE 6 BIT 
  4314.           RJ     BTP         BUILD TRANSMISSION PACKET
  4315.           SX7    X6+         (X7) = FWA OF PACKET 
  4316.           SA7    NNP.A       SAVE 
  4317.           RJ     SRP         SEND RECEIVED PACKET 
  4318.           SA1    NNP.A       (X1) = FWA OF PACKET 
  4319.           SX6    X1+
  4320.           RJ     RBF         RETURN BUFFER TO FREE QUEUE
  4321.           EQ     NNPX        EXIT 
  4322.   
  4323.  NNP.A    BSS    1           BUFFER ADDRESS 
  4324.           SPACE  4,10 
  4325. **        PPR - PROCESS PARAMETER REPLY.
  4326. *         THIS ROUTINE IS CALLED TO PROCESS THE DATA FIELD OF 
  4327. *         AN 'ACK' PACKET WHICH IS THE RESPONSE TO EITHER AN
  4328. *         'I' OR AN 'S' PACKET. 
  4329. *         ENTRY  (B1) = 1 
  4330. *                (IQPTR) = FWA OF ACK PACKET
  4331. *         EXIT   PARAMETERS PROCESSED 
  4332. *         USES   X - 1, 2, 3, 4, 6, 7.
  4333. *                A - 1, 2, 3, 4, 6. 
  4334. *                B - 2, 6, 7. 
  4335. *         CALLS  BPW. 
  4336.           SPACE  4,10 
  4337.  PPR      SUBR               ENTRY/EXIT 
  4338.   
  4339. *         GET DATA LENGTH AND FIRST DATA ENTRY. 
  4340.   
  4341.           SA2    IQPTR       (X2) = INPUT QUEUE POINTER 
  4342.           SA2    X2+PLEN     (X2) = PACKET LENGTH 
  4343.           SB7    X2-3        (B7) = LENGTH OF DATA FIELD
  4344.           SA1    A2-PLEN+PDATA PRESET (A1)
  4345.           SB6    B1          (B6) = UNPACKING COUNTER 
  4346.           LX1    60-12       POSITION FIRST DATA BYTE 
  4347.           SA2    PPR.A       (X2) = FIRST VALIDATION TABLE ENTRY
  4348.   
  4349. *         GET NEXT DATA BYTE AND VALIDATE.
  4350.   
  4351.  PPR2     SX3    0           ASSUME END OF DATA 
  4352.           LE     B7,B0,PPR3A ASSUMPTION CORRECT 
  4353.           NZ     B6,PPR3     NOT END OF SOURCE WORD 
  4354.           SA1    A1+1        (X1) = NEXT SOURCE WORD
  4355.           SB6    5           RESET UNPACKING COUNTER
  4356.   
  4357.  PPR3     LX1    12 
  4358.           MX3    -7 
  4359.           SB6    B6-B1       DECREMENT UNPACKING COUNTER
  4360.           BX3    -X3*X1      (X3) = NEXT DATA BYTE
  4361.   
  4362.  PPR3A    SB2    X2          (B2) = PROCESS ADDRESS 
  4363.           SB7    B7-1        DECREMENT AVAILABLE DATA COUNT 
  4364.           AX2    18 
  4365.           JP     B2+         BRANCH ACCORDING TO CHARACTER CODING.
  4366.   
  4367. *         CHARACTER NOT ENCODED.
  4368.   
  4369.  PPR4     SX6    X3          (X6) = CHARACTER FROM PACKET 
  4370.           NZ     X3,*+1      DATA VALID 
  4371.           SX6    X2          USE DEFAULT FROM TABLE 
  4372.           AX2    18 
  4373.           SA6    X2+         SAVE 
  4374.           SA2    A2+B1       (X2) = NEXT VALIDATION TABLE ENTRY 
  4375.           NZ     X2,PPR2     MORE ENTRIES REQUIRED
  4376.           EQ     PPR10       END OF TABLE 
  4377.   
  4378. *         CHARACTER ENCODED USING CTL().
  4379.   
  4380.  PPR6     SX6    64 
  4381.           BX6    X3-X6       UNCTL BYTE FROM PACKET 
  4382.  +        NZ     X3,*+1      DATA VALID 
  4383.           SX6    X2+         USE DEFAULT FROM TABLE 
  4384.           AX2    18 
  4385.           SA6    X2+         SAVE 
  4386.           SA2    A2+B1       (X2) = NEXT VALIDATION TABLE ENTRY 
  4387.           NZ     X2,PPR2     MORE ENTRIES REQUIRED
  4388.           EQ     PPR10       END OF TABLE 
  4389.   
  4390. *         CHARACTER ENCODED USING CHAR(). 
  4391.   
  4392.  PPR8     NZ     X3,*+1      VALUE FROM PACKET VALID
  4393.           SX3    X2+32       USE DEFAULT FROM TABLE 
  4394.           AX2    18 
  4395.           SX6    X3-32       (X6) = REQUIRED CODE 
  4396.           SA6    X2          SAVE 
  4397.           SA2    A2+1        (X2) = NEXT TABLE ENTRY
  4398.           NZ     X2,PPR2     MORE ENTRIES REQUIRED
  4399.   
  4400. *         PROCESS OPTIONAL FIELDS.
  4401.   
  4402.  PPR10    SX6    0
  4403.           SA2    PPR.B       (X2) = FIRST ENTRY OF BRANCH TABLE 
  4404.           SA6    CAPAS       CLEAR CAPABILITY BYTE
  4405.   
  4406.  PPR12    LE     B7,B0,PPR15 NO MORE DATA 
  4407.           NZ     B6,PPR14    NOT END OF SOURCE WORD 
  4408.           SB6    5           RESET UNPACKING COUNTER
  4409.           SA1    A1+1        (X1) = NEXT SOURCE WORD
  4410.   
  4411. *         PROCESS OPTION. 
  4412.   
  4413.  PPR14    LX1    12 
  4414.           MX3    -7 
  4415.           SB6    B6-B1       DECREMENT UNPACKING COUNTER
  4416.           BX3    -X3*X1      (X3) = NEXT DATA BYTE
  4417.           SB2    X2          (B2) = PROCESS ADDRESS 
  4418.           SB7    B7-1        DECREMENT REMAINING DATA COUNT 
  4419.           AX2    18 
  4420.           JP     B2+         PROCESS
  4421.   
  4422. *         END OF DATA SO USE DEFAULT FROM TABLE.
  4423.   
  4424.  PPR15    SB2    X2          (B2) = PROCESS ADDRESS 
  4425.           AX2    18 
  4426.           SX3    X2+         (X3) = DEFAULT 
  4427.           JP     B2+         PROCESS
  4428.   
  4429. *         'QBIN'. 
  4430.   
  4431.  PPR16    SX3    X3-116B     CHECK FOR 'N'
  4432.           ZR     X3,PPR18    NO 8 BIT QUOTING 
  4433.           SX3    X3+116B     RESTORE CHARACTER
  4434.           SX6    X3-131B     CHECK FOR 'Y'
  4435.           NZ     X6,PPR18    QUOTE CHARACTER DEFINED
  4436.           SX3    046B        USE DEFAULT CHARACTER '&'
  4437.   
  4438.  PPR18    BX6    X3          (X6) = CHARACTER 
  4439.           SA6    QBIN        SAVE 
  4440.           SA2    A2+B1       (X2) = NEXT TABLE ENTRY
  4441.           EQ     PPR12       LOOP FOR ALL BYTES 
  4442.   
  4443. *         'CHKT'. 
  4444.   
  4445.  PPR20    SX6    B1 
  4446.           SA6    CHKT        FORCE MINIMAL CHECKSUM TYPE
  4447.           SA2    A2+B1       (X2) = NEXT TABLE ENTRY
  4448.           EQ     PPR12       LOOP FOR ALL BYTES 
  4449.   
  4450. *         'REPT'. 
  4451.   
  4452.  PPR22    SX6    X3-32       CHECK FOR SPACE
  4453.           ZR     X6,PPR24    NO REPEAT PREFIXING
  4454.           BX6    X3 
  4455.           SA3    REPT        (X3) = CURRENT REPEAT CHARACTER
  4456.           MX2    -11
  4457.           BX3    -X2*X3      ENSURE TOP BIT CLEAR 
  4458.           BX2    X3-X6       COMPARE
  4459.           ZR     X3,PPR24    FIRST DEFINITION SO USE
  4460.           ZR     X2,PPR24    SAME DEFINITION SO USE 
  4461.           SX6    0           DISABLE REPEAT PREFIXING 
  4462.   
  4463.  PPR24    ZR     X6,*+1      NOT DEFINED
  4464.           SX6    X6+4000B    SET TOP BIT
  4465.           SA6    REPT        SAVE 
  4466.           SA2    A2+1        (X2) = NEXT TABLE ENTRY
  4467.           EQ     PPR12       LOOP FOR ALL BYTES 
  4468.   
  4469. *         'CAPAS'.
  4470.   
  4471.  PPR26    SX3    X3-32       DECHR()
  4472.           LX3    59-0        LEFT JUSTIFY CONTINUATION FLAG 
  4473.           MX2    -5 
  4474.           SA4    CAPAS       (X4) = CURRENT CAPABILTY BITS
  4475.           BX6    -X2*X4      (X6) = SHIFT COUNT 
  4476.           BX4    X4-X6       (X4) = REMAINDER 
  4477.           SX6    X6+B1       INCREMENT SHIFT COUNT
  4478.           SB2    X6          CONVERT TO BIT COUNT (* 5) 
  4479.           SB2    B2+B2       *2 
  4480.           SB2    B2+B2       *4 
  4481.           SB2    X6+B2       *5 
  4482.           BX2    -X2*X3      (X2) = DATA BITS 
  4483.           LX2    B2          POSITION 
  4484.           BX6    X2+X6       ADD TO SHIFT COUNT 
  4485.           BX6    X4+X6       ADD DATA BITS
  4486.           SA6    A4          SAVE 
  4487.           NG     X3,PPR12    CONTINUATION 
  4488.   
  4489. *         NO MORE CONTINUATION BYTES SO PROCESS.
  4490.   
  4491.           SX4    2           MASK FOR 'WINDOW' FLAG 
  4492.           AX6    5           CLEAR SHIFT COUNT
  4493.           BX6    X4*X6       ALLOW ONLY WINDOWING 
  4494.           SA6    A4           UPDATE CAPABILITY BYTE
  4495.           SA2    A2+B1       INCREMENT TABLE ADDRESS
  4496.           NZ     X6,PPR12    WINDOWING REQUESTED
  4497.           SA6    WSIZE       CLEAR WINDOWING
  4498.           EQ     PPR99       EXIT 
  4499.   
  4500. *         WINDOW SIZE DEFINITION. 
  4501.   
  4502.  PPR28    SX6    X3-32       DECHAR 
  4503.           SX3    37B
  4504.           BX6    X3*X6       ENSURE VALID 
  4505.           SA3    RWSIZE      (X3) = REQUESTED WINDOW SIZE 
  4506.           IX7    X3-X6       COMPARE
  4507.  +        PL     X7,*+1      USE VALUE FROM PACKET
  4508.           SX6    X3+         USE PARAMETER SPECIFIED VALUE
  4509.           SA6    WSIZE       SAVE USED WINDOW SIZE
  4510.           EQ     PPR99       EXIT 
  4511.   
  4512. *         BUILD PREFIX WORDS. 
  4513.   
  4514.  PPR99    RJ     BPW         BUILD PREFIX WORDS 
  4515.           EQ     PPRX        EXIT 
  4516.   
  4517.  PPR.A    BSS    0           PARAMETER VALIDATION TABLE 
  4518.           VFD    6/0,18/MAXL,18/80,18/PPR8     MAX. PACKET LENGTH 
  4519.           VFD    6/0,18/TIMER,18/5,18/PPR8     TIMEOUT VALUE
  4520.           VFD    6/0,18/NPAD,18/0,18/PPR8      PADDING COUNT
  4521.           VFD    6/0,18/PADC,18/0,18/PPR6      PADDING CHARACTER
  4522.           VFD    6/0,18/EOL,18/015B,18/PPR8    END OF LINE CHAR.
  4523.           VFD    6/0,18/RXQCTL,18/043B,18/PPR4 CTL QUOTE CHAR.
  4524.           CON    0
  4525.  PPR.B    BSS    0           OPTIONAL PARAMETER VALIDATION TABLE
  4526.           VFD    24/0,18/116B,18/PPR16  'QBIN'
  4527.           VFD    24/0,18/61B,18/PPR20   'CHKT'
  4528.           VFD    24/0,18/32,18/PPR22    'REPT'
  4529.           VFD    24/0,18/32,18/PPR26    'CAPAS' 
  4530.           VFD    24/0,18/32,18/PPR28    'WINDOW'
  4531.           SPACE  4,10 
  4532. **        TGP - TRANSMIT GIVEN PACKET.
  4533. *         THIS ROUTINE TAKES THE GIVEN ATTRIBUTE WORD, ADDS IT
  4534. *         TO THE WINDOW TABLE AND TRANSMITS THE CORRESPONDING PACKET. 
  4535. *         ENTRY  (B1) = 1 
  4536. *                (X6) = PACKET ATTRIBUTE WORD 
  4537. *         EXIT   ENTRY MADE IN WINDOW TABLE 
  4538. *                PACKET TRANSMITTED 
  4539. *         USES   X - 1, 2, 3, 6, 7. 
  4540. *                A - 1, 2, 6, 7.
  4541. *                B - 2, 3, 4, 6, 7. 
  4542. *         CALLS  TPK. 
  4543.           SPACE  4,10 
  4544.  TGP      SUBR               ENTRY/EXIT 
  4545.   
  4546. *         EXTRACT WINDOW POINTERS.
  4547.   
  4548.           SA1    WPTR        (X1) = WINDOW POINTER
  4549.           SB4    X1          (B4) = LIMIT 
  4550.           AX1    18 
  4551.           SB3    X1          (B3) = OUT 
  4552.           AX1    18 
  4553.           SB2    X1          (B2) = IN
  4554.           AX1    18          (X1) = AVAILABLE WINDOW
  4555.   
  4556. *         SET RETRY COUNTER AND SAVE ENTRY IN WINDOW TABLE. 
  4557.   
  4558.           SA2    RETRY       (X2) = MAX. RETRY COUNT
  4559.           LX2    18+9+9      POSITION 
  4560.           BX6    X2+X6       ADD TO ATTRIBUTE WORD
  4561.           SA6    WTABLE+B2   SAVE IN WINDOW TABLE 
  4562.   
  4563. *         UPDATE WINDOW POINTERS. 
  4564.   
  4565.           SX6    X1-1        DECREMENT AVAILABLE WINDOW 
  4566.  +        SB2    B2+B1       INCREMENT IN 
  4567.           NE     B2,B4,*+1   NOT LIMIT
  4568.           SB2    B0          SET IN = FIRST 
  4569.   
  4570. *         UPDATE POINTER WORD.
  4571.   
  4572.           LX6    18 
  4573.           SX1    B2          (X1) = IN
  4574.           BX6    X1+X6
  4575.           SX1    B3          (X1) = OUT 
  4576.           LX6    18 
  4577.           BX6    X1+X6
  4578.           SX1    B4          (X1) = LIMIT 
  4579.           LX6    18 
  4580.           BX7    X1+X6       (X7) = REQUIRED POINTER WORD 
  4581.           SA7    A1+         SAVE 
  4582.   
  4583. *         TRANSMIT PACKET.
  4584.   
  4585.           SA1    A6          (X1) = ATTRIBUTE WORD
  4586.           RJ     TPK         TRANSMIT PACKET
  4587.           EQ     TGPX        EXIT 
  4588.   
  4589.           SPACE  4,10 
  4590. **        TPK - TRANSMIT PACKET.
  4591. *         THIS ROUTIINE TRANSMITS THE GIVEN PACKET. 
  4592. *         ENTRY  (X1) = CURRENT POINTER WORD
  4593. *         EXIT   PACKET TRANSMITTED 
  4594. *         USES   X - 1, 6, 7. 
  4595. *                A - 1, 6.
  4596. *                B - 6, 7.
  4597. *         CALLS  CIO=, DBO, WTW=. 
  4598.           SPACE  4,10 
  4599.  TPK      SUBR               ENTRY/EXIT 
  4600.   
  4601.           SB6    X1+B1       (B6) = FWA OF DATA PACKET
  4602.           MX7    -9 
  4603.           AX1    18+9+9+9    RIGHT JUSTIFY PACKET LENGTH
  4604.           BX7    -X7*X1 
  4605.           SB7    X7+         (B7) = PACKET LENGTH 
  4606.   
  4607. *         CHECK IF DEBUG SELECTED.
  4608.   
  4609.           SA1    DEBUG       (X1) = DEBUG FLAG
  4610.           ZR     X1,TPK2     DEBUG OFF
  4611.   
  4612.           SX6    B6+         (B6) = FWA OF TEXT 
  4613.           LX6    18 
  4614.           BX6    X6+X7       (X6) = 24/0,18/FWA,18/LEN
  4615.           SA6    TPK.A       SAVE 
  4616.           SA1    B6          (X1) = FIRST PACKED WORD 
  4617.           RJ     DBO         DEBUG OUTPUT 
  4618.           SA1    TPK.A       (X1) = POINTER WORD
  4619.           SB7    X1+         RESTORE LENGTH 
  4620.           AX1    18 
  4621.           SB6    X1          RESTORE FWA
  4622.   
  4623. *         WRITE PACKET TO TERMINAL. 
  4624.   
  4625.  TPK2     WRITEW ZZZZZOU,B6,B7 WRITE LINE 
  4626.           WRITER X2          FLUSH BUFFER 
  4627.           EQ     TPKX        EXIT 
  4628.   
  4629.  TPK.A    BSS    1           POINTER WORD 
  4630.           SPACE  4,10 
  4631. **        UDF - UNPACK DATA FIELD.
  4632. *         THIS ROUTINE UNPACKS THE DATA FIELD OF THE SPECIFIED
  4633. *         PACKET ACCOUNTING FOR CONTROL AND PREFIX CHARACTERS.
  4634. *         ENTRY  (B1) = 1 
  4635. *                (X1) = FWA OF PACKET 
  4636. *         EXIT   (B6) = FWA OF ASCII STRING 
  4637. *                (B7) = LENGTH OF STRING
  4638. *         USES   X - 0, 1, 2, 3, 6, 7.
  4639. *                A - 1, 2, 6. 
  4640. *                B - 2, 3, 4, 5, 6, 7.
  4641. *         CALLS  NONE.
  4642.           SPACE  4,10 
  4643.  UDF      SUBR               ENTRY/EXIT 
  4644.   
  4645. *         INITIALISE. 
  4646.   
  4647.           SA1    X1+PLEN     (X1) = PACKET LENGTH 
  4648.           SB7    X1-3        (B7) = DATA LENGTH 
  4649.           LE     B7,B0,UDF20 ILLEGAL
  4650.           SA1    A1-PLEN+PDATA (X1) = FIRST DATA WORD 
  4651.           SB5    B1          (B5) = UNPACKING COUNTER 
  4652.           LX1    60-12       POSITION FIRST DATA BYTE 
  4653.           SA2    RXPWORD     (X2) = RX PREFIX WORD
  4654.           SB2    X2          (B2) = -REPEAT COUNT PREFIX
  4655.           AX2    30 
  4656.           SB3    X2          (B3) = -8 BIT PREFIX 
  4657.           AX2    30 
  4658.           SB4    X2          (B4) = -CONTROL PREFIX 
  4659.           MX7    -8 
  4660.           SB6    UDF.A       (B6) = DESTINATION ADDRESS 
  4661.   
  4662. *         EXTRACT NEXT CHARACTER. 
  4663.   
  4664.  UDF2     LX1    12 
  4665.           SX0    B1          ASSUME NO REPEAT COUNT 
  4666.           BX2    -X7*X1      (X2) = NEXT ASCII CODE 
  4667.           SB7    B7-B1       DECREMENT AVAILABLE CHARACTER COUNT
  4668.           SB5    B5-B1       DECREMENT UNPACKING COUNTER
  4669.           SX6    X2+B2       CHECK FOR REPEAT PREFIX
  4670.           NZ     X6,UDF8     NO REPEAT PREFIX 
  4671.   
  4672. *         PROCESS REPEAT PREFIX.
  4673.   
  4674.           ZR     B7,UDF20    ILLEGAL PACKET STRUCTURE 
  4675.           NZ     B5,UDF4     SOURCE WORD NOT EMPTY
  4676.           SB5    5           RESET UNPACKING COUNTER
  4677.           SA1    A1+1        (X1) = NEXT SOURCE WORD
  4678.   
  4679.  UDF4     LX1    12 
  4680.           SB5    B5-1        DECREMENT UNPACKING COUNTER
  4681.           BX2    -X7*X1      (X2) = NEXT ASCII CHARACTER
  4682.           SX0    X2-32       DE-CHAR
  4683.           ZR     B7,UDF20    ILLEGAL PACKET STRUCTURE 
  4684.           SB7    B7-1        DECREMENT AVAILABLE CHARACTER COUNT
  4685.           NZ     B5,UDF6     SOURCE WORD NOT EMPTY
  4686.           SB5    5           RESET UNPACKING COUNTER
  4687.           SA1    A1+1        (X1) = NEXT SOURCE WORD
  4688.   
  4689.  UDF6     LX1    12 
  4690.           SB5    B5-1        DECREMENT UNPACKING COUNTER
  4691.           BX2    -X7*X1      (X2) = NEXT ASCII CHARACTER
  4692.           ZR     B7,UDF20    ILLEGAL PACKET STRUCTURE 
  4693.           SB7    B7-1        DECREMENT AVAILABLE CHARACTER COUNT
  4694.   
  4695. *         CHECK FOR 8 BIT PREFIX. 
  4696.   
  4697.  UDF8     SX6    X2+B3       CHECK FOR 8 BIT PREFIX 
  4698.           MX3    0           ASSUME NO PREFIX 
  4699.           NZ     X6,UDF12    ASSUMPTION CORRECT 
  4700.           ZR     B7,UDF20    ILLEGAL PACKET STRUCTURE 
  4701.           ZR     B5,UDF10    SOURCE WORD NOT EMPTY
  4702.           SB5    5           RESET UNPACKING COUNTER
  4703.           SA1    A1+1        (X1) = NEXT SOURCE WORD
  4704.   
  4705.  UDF10    LX1    12 
  4706.           SB6    B6-1        DECREMENT UNPACKING COUNTER
  4707.           BX2    -X7*X1      (X2) = NEXT ASCII CODE 
  4708.           SB7    B7-1        DECREMENT AVAILABLE CHARACTER COUNT
  4709.           SX3    200B        FLAG 8 BIT SET 
  4710.   
  4711. *         CHECK FOR CONTROL PREFIX. 
  4712.   
  4713.  UDF12    SX6    X2+B4       CHECK FOR CONTROL PREFIX 
  4714.           NZ     X6,UDF16    NOT CONTROL PREFIX 
  4715.           LX1    12 
  4716.           ZR     B7,UDF20    ILLEGAL PACKET STRUCTURE 
  4717.           NZ     B5,UDF14    SOURCE WORD NOT EMPTY
  4718.           SB5    5           RESET UNPACKING COUNTER
  4719.           SA1    A1+B1       (X1) = NEXT SOURCE WORD
  4720.           LX1    12 
  4721.   
  4722.  UDF14    BX2    -X7*X1      (X2) = NEXT ASCII CHARACTER
  4723.           SX6    X2-77B      CHECK IF CONTROL CHARACTER 
  4724.           SB7    B7-B1       DECREMENT AVAILABLE CHARACTER COUNT
  4725.           SB5    B5-1        DECREMENT UNPACKING COUNTER
  4726.           NG     X6,UDF16    NOT CONTROL CHARACTER
  4727.           SX6    X2-137B-1   CHECK UPPER BOUND
  4728.           PL     X6,UDF16    NOT CONTROL CHARACTER
  4729.           SX6    64 
  4730.           BX2    X2-X6       DE-CTL() 
  4731.   
  4732. *         SAVE CHARACTER. 
  4733.   
  4734.  UDF16    BX6    X2+X3       ADD  BIT PREFIX
  4735.           SX0    X0-1        DECREMENT REPEAT COUNT 
  4736.           SA6    B6          SAVE CHARACTER 
  4737.           SB6    B6+1        INCREMENT ADDRESS
  4738.           NZ     X0,UDF16    LOOP FOR ALL REPEATS 
  4739.   
  4740. *         CHECK FOR MORE DATA.
  4741.   
  4742.           ZR     B7,UDF18    END OF DATA
  4743.           NZ     B5,UDF2     NOT END OF SOURCE WORD 
  4744.           SB5    5           RESET UNPACKING COUNTER
  4745.           SA1    A1+1        (X1) = NEXT SOURCE WORD
  4746.           EQ     UDF2        LOOP TILL END OF DATA
  4747.   
  4748. *         END OF DATA SO RETURN.
  4749.   
  4750.  UDF18    SB2    UDF.A       (B2) = FWA OF STRING 
  4751.           SB7    B6-B2       (B7) = CHARACTER COUNT 
  4752.           SB6    B2          (B6) = FWA 
  4753.           EQ     UDFX        EXIT 
  4754.   
  4755. *         ILLEGAL OR MISSING DATA.
  4756.   
  4757.  UDF20    SB7    B0          FLAG NO DATA 
  4758.           EQ     UDFX        EXIT 
  4759.   
  4760.  UDF.A    BSS    94          STRING BUFFER
  4761.           SPACE  4,10 
  4762. **        VPC - VALIDATE PACKET CHECKSUM. 
  4763. *         THIS ROUTINE VALIDATES THE CHECKSUM OF THE PACKET 
  4764. *         SPECIFIED ON INPUT. THE PACKET MUST BE IN THE INPUT 
  4765. *         BUFFER IN 8IN12 ASCII.
  4766. *         ENTRY  (B1) = 1 
  4767. *                (A0) = FWA OF QUEUE PACKET 
  4768. *         EXIT   (X6) = 0 IF VALID CHECKSUM 
  4769. *         USES   X - 0, 1, 2, 6.
  4770. *                A - 1, 2.
  4771. *                B - 2, 6, 7. 
  4772. *         CALLS  NONE 
  4773.           SPACE  4,10 
  4774.  VPC      SUBR               ENTRY/EXIT 
  4775.           SA2    A0+B1       (X1) = PACKET LENGTH 
  4776.           SA1    A0+PDATA    (X1) = FIRST PACKED WORD 
  4777.           SB2    X2          (B2) = NUMBER OF BYTES TO CHECK
  4778.           MX0    -8          (X0) = BYTE MASK 
  4779.           SX6    0           CLEAR CHECKSUM 
  4780.           LX1    12          IGNORE MARK CHARACTER
  4781.           SB6    5           (B6) = A USEFUL CONSTANT 
  4782.           SB7    B6-1        (B7) = UNPACKING COUNTER 
  4783.   
  4784.  VPC2     LX1    12 
  4785.           SB7    B7-B1       DECREMENT UNPACKING COUNTER
  4786.           BX7    -X0*X1      (X7) = ASCII CHARACTER 
  4787.           IX6    X6+X7       ADD TO ACCUMULATION
  4788.  +        NZ     B7,*+1      NOT END OF SOURCE WORD 
  4789.           SB7    B6          RESET UNPACKING COUNTER
  4790.           SA1    A1+B1       (X1) = NEXT SOURCE WORD
  4791.           SB2    B2-1        DECREMENT PACKET LENGTH
  4792.           NZ     B2,VPC2     LOOP TILL END OF PACKET
  4793.   
  4794. *         CALCULATE BASIC CHECKSUM. 
  4795.   
  4796.           BX6    -X0*X6      FORM 8 BIT CHECKSUM
  4797.           SX2    77B
  4798.           BX7    X2*X6
  4799.           AX6    6
  4800.           IX6    X6+X7
  4801.           LX1    12 
  4802.           BX6    X2*X6
  4803.           SX6    X6+32       (X6) = EXPECTED CHECKSUM CHARACTER 
  4804.           BX1    -X0*X1      (X1) = ACTUAL CHECKSUM CHARACTER 
  4805.           BX6    X1-X6       COMPARE
  4806.           EQ     VPCX        EXIT 
  4807.           SPACE  4,10 
  4808. **        WDP - WRITE DATA PACKET.
  4809. *         THIS ROUTINE WRITES THE SPECIFIED DATA PACKET TO THE DATA 
  4810. *         FILE. 
  4811. *         ENTRY  (B1) = 1 
  4812. *                (X1) = PACKET ATTRIBUTE WORD 
  4813. *         EXIT   PACKET WRITTEN TO DATA FILE
  4814. *         USES   X - 1, 2, 5, 6, 7. 
  4815. *                A - 1, 5, 6. 
  4816. *                B - 2, 3, 4, 5, 6, 7.
  4817. *         CALLS  RBF, WAC.
  4818.           SPACE  4,10 
  4819.  WDP      SUBR               ENTRY/EXIT 
  4820.   
  4821. *         INITIALISE. 
  4822.   
  4823.           SA5    X1+PLEN     (X5) = PACKET LENGTH 
  4824.           SB7    X5-3        (B7) = DATA BYTE COUNT 
  4825.           LE     B7,B0,WDP17 ILLEGAL DATA BYTE COUNT
  4826.           SA5    A5-PLEN+PDATA (X5) = FIRST DATA WORD 
  4827.           SB6    B1          (B6) = UNPACKING COUNTER 
  4828.           SX6    X1+         (X6) = FWA OF BUFFER 
  4829.           LX5    60-12       LEFT JUSTIFY FIRST DATA BYTE 
  4830.           RJ     RBF         RETURN BUFFER TO FREE QUEUE
  4831.           SA1    RXPWORD     (X1) = RX PREFIX WORD
  4832.           SB2    X1+         (B2) = - REPEAT COUNT PREFIX 
  4833.           AX1    20 
  4834.           SB3    X1          (B3) = -8 BIT PREFIX 
  4835.           AX1    20 
  4836.           SB4    X1+         (B4) = -CONTROL PREFIX 
  4837.           MX1    -8          (X1) = ASCII MASK
  4838.   
  4839. *         EXTRACT NEXT CHARACTER. 
  4840.   
  4841.  WDP2     LX5    12 
  4842.           BX2    -X1*X5      (X2) = NEXT ASCII CODE 
  4843.           SB6    B6-B1       DECREMENT UNPACKING COUNTER
  4844.           SX6    X2+B2       CHECK FOR REPEAT PREFIX
  4845.           SB5    B1          ASSUME NO REPEAT PREFIX
  4846.           SB7    B7-B1       DECREMENT AVAILABLE CHARACTER COUNT
  4847.           NZ     X6,WDP8     NO REPEAT PREFIX 
  4848.   
  4849. *         PROCESS REPEAT PREFIX.
  4850.   
  4851.           ZR     B7,WDP18    ILLEGAL PACKET STRUCTURE 
  4852.           NZ     B6,WDP4     SOURCE WORD NOT EMPTY
  4853.           SB6    5           RESET UNPACKING COUNTER
  4854.           SA5    A5+1        (X5) = NEXT SOURCE WORD
  4855.   
  4856.  WDP4     LX5    12 
  4857.           SB6    B6-1        DECREMENT UNPACKING COUNTER
  4858.           BX2    -X1*X5      (X2) = ASCII CODE
  4859.           SB5    X2-32       DE-CHAR REPEAT COUNT 
  4860.           ZR     B7,WDP18    ILLEGAL PACKET STRUCTURE 
  4861.           SB7    B7-1        DECREMENT AVAILABLE CHARACTER COUNT
  4862.           NZ     B6,WDP6     SOURCE WORD NOT EMPTY
  4863.           SB6    5           RESET UNPACKING COUNTER
  4864.           SA5    A5+1        (X5) = NEXT SOURCE WORD
  4865.   
  4866.  WDP6     LX5    12 
  4867.           SB6    B6-1        DECREMENT UNPACKING COUNTER
  4868.           BX2    -X1*X5      (X2) = NEXT ASCII CODE 
  4869.           ZR     B7,WDP18    ILLEGAL PACKET STRUCTURE 
  4870.           SB7    B7-1        DECREMENT AVAILABLE CHARACTER COUNT
  4871.   
  4872. *         CHECK FOR 8 BIT PREFIX. 
  4873.   
  4874.  WDP8     SX6    X2+B3       CHECK FOR 8 BIT PREFIX 
  4875.           MX7    0           ASSUME NO PREFIX 
  4876.           NZ     X6,WDP12    ASSUMPTION CORRECT 
  4877.           ZR     B7,WDP18    ILLEGAL PACKET STRUCTURE 
  4878.           NZ     B6,WDP10    SOURCE WORD NOT EMPTY
  4879.           SA5    A5+1        (X5) = NEXT SOURCE WORD
  4880.           SB6    5           RESET UNPACKING COUNTER
  4881.   
  4882.  WDP10    LX5    12 
  4883.           SB6    B6-1        DECREMENT UNPACKING COUNTER
  4884.           BX2    -X1*X5      (X2) = NEXT ASCII CODE 
  4885.           SB7    B7-1        DECREMENT AVAILABLE CHARACTER COUNT
  4886.           SX7    200B        FLAG 8 BIT SET 
  4887.   
  4888. *         CHECK FOR CONTROL PREFIX. 
  4889.   
  4890.  WDP12    SX6    X2+B4       CHECK FOR CONTROL PREFIX 
  4891.           NZ     X6,WDP16    NOT CONTROL PREFIX 
  4892.           LX5    12 
  4893.           ZR     B7,WDP18    ILLEGAL PACKET STRUCTURE 
  4894.           NZ     B6,WDP14    SOURCE WORD NOT EMPTY
  4895.           SA5    A5+1        (X5) = NEXT SOURCE WORD
  4896.           SB6    5           RESET UNPACKING COUNTER
  4897.           LX5    12          RIGHT JUSTIFY NEXT DATA BYTE 
  4898.   
  4899.  WDP14    BX2    -X1*X5      (X2) = NEXT ASCII CHARACTER
  4900.           SX6    X2-77B      CHECK IF CONTROL CHARACTER 
  4901.           SB7    B7-B1       DECREMENT AVAILABLE CHARACTER COUNT
  4902.           SB6    B6-1        DECREMENT UNPACKING COUNTER
  4903.           NG     X6,WDP16    NOT CONTROL CHARACTER
  4904.           SX6    X2-137B-1   CHECK UPPER BOUND
  4905.           PL     X6,WDP16    NOT CONTROL CHARACTER
  4906.           SX6    64 
  4907.           BX2    X2-X6       DECTL()
  4908.   
  4909. *         WRITE CHARACTER.
  4910.   
  4911.  WDP16    BX0    X2+X7       (X0) = CHARACTER + 8 BIT FLAG
  4912.           RJ     WAC         WRITE ASCII CHARACTER
  4913.   
  4914. *         CHECK FOR MORE DATA.
  4915.   
  4916.           ZR     B7,WDPX     END OF DATA SO EXIT
  4917.           MX1    -8          RESET ASCII MASK 
  4918.           NZ     B6,WDP2     NOT END OF SOURCE WORD 
  4919.           SA5    A5+1        (X5) = NEXT SOURCE WORD
  4920.           SB6    5           RESET UNPACKING COUNTER
  4921.           EQ     WDP2        LOOP TILL END OF PACKET
  4922.   
  4923. *         ILLEGAL DATA BYTE COUNT SO RETURN BUFFER. 
  4924.   
  4925.  WDP17    ZR     X1,WDPX     NULL BUFFER
  4926.           SX6    X1+         (X6) = FWA OF BUFFER 
  4927.           RJ     RBF         RETURN BUFFER TO FREE QUEUE
  4928.           EQ     WDPX        EXIT 
  4929.   
  4930. *         ILLEGAL PACKET STRUCTURE. 
  4931.   
  4932.  WDP18    SX6    3           (X6) = ERROR CODE
  4933.           SA6    EMODE       SAVE EXIT MODE 
  4934.           SX6    FPE         FORCE PROTOCOL ERROR 
  4935.           EQ     SGS         SET GIVEN STATE
  4936.           TITLE  BUFFER ALLOCATION ROUTINES.
  4937. **        BUFFER ALLOCATION ROUTINES. 
  4938. *         THE FOLLOWING ROUTINES ARE USED TO INITIALISE, ALLOCATE 
  4939. *         AND RETURN PACKET BUFFERS.
  4940. *         AFB - ALLOCATE FREE BUFFER
  4941. *         CBA - CHECK BUFFER AVAILABLE
  4942. *         IBC - INITIALISE BUFFER CHAIN 
  4943. *         RBF - RETURN BUFFER TO FREE CHAIN 
  4944.           SPACE  4,10 
  4945. **        AFB - ALLOCATE FREE BUFFER. 
  4946. *         THIS ROUTINE RETURNS THE ADDRESS OF THE NEXT AVAILABLE
  4947. *         OUTPUT BUFFER.
  4948. *         ENTRY  (B1) = 1 
  4949. *         EXIT   (X1) = FWA OF ALLOCATED BUFFER (0 IF NONE AVAILABLE) 
  4950. *         USES   X - 1, 6.
  4951. *                A - 1, 6.
  4952. *                B - NONE.
  4953. *         CALLS  NONE.
  4954.           SPACE  4,10 
  4955.  AFB      SUBR               ENTRY/EXIT 
  4956.           SA1    FQPTR       (X1) = FREE POINTER
  4957.           ZR     X1,AFBX     NO BUFFER AVAILABLE SO EXIT
  4958.           SA1    X1          (X1) = LINK FROM ASSIGNED PACKET 
  4959.           BX6    X1 
  4960.           SA6    FQPTR       UPDATE FREE POINTER
  4961.           MX6    0
  4962.           SX1    A1+         (X1) = ADDRESS OF ASSIGNED PACKET
  4963.           SA6    A1          CLEAR LINK 
  4964.           EQ     AFBX        EXIT 
  4965.           SPACE  4,10 
  4966. **        CBA - CHECK BUFFER AVAILABLE. 
  4967. *         THIS ROUTINE RETURNS THE CURRENT VALUE OF THE FREE QUEUE
  4968. *         POINTER. IF ZERO NO BUFFER IS AVAILABLE, IF NONE ZERO 
  4969. *         THEN THIS IS THE ADDRESS OF THE NEXT AVAILABLE BUFFER.
  4970. *         THIS ROUTINE DOES NOT ASSIGN OR RESERVE THE BUFFER SO 
  4971. *         UNLESS THE BUFFER IS SUBSEQUENTLY ASSIGNED THE FREE BUFFER
  4972. *         LIST IS NOT CHANGED.
  4973. *         ENTRY  (B1) = 1 
  4974. *         EXIT   (X1) = FWA OF NEXT AVAILABLE BUFFER (0 IF NONE)
  4975. *         USES   X - 1. 
  4976. *                A - 1. 
  4977. *                B - NONE.
  4978. *         CALLS  NONE.
  4979.           SPACE  4,10 
  4980.  CBA      SUBR               ENTRY/EXIT 
  4981.           SA1    FQPTR       (X1) = FREE QUEUE POINTER
  4982.           EQ     CBAX        EXIT 
  4983.           SPACE  4,10 
  4984. **        IBC - INITIALISE BUFFER CHAIN.
  4985. *         THIS ROUTINE INITIALISES THE OUTPUT BUFFERS BY SETTING
  4986. *         THE LINK WORDS SUCH THAT THE BUFFERS FORM A CHAIN WITH
  4987. *         THE LAST LINK BEING ZERO. 
  4988. *         ENTRY  (B1) = 1 
  4989. *         EXIT   BUFFER POINTERS INITIALISED
  4990. *                FQPTR = FWA OF FIRST BUFFER
  4991. *         USES   X - 6, 7.
  4992. *                A - 6, 7.
  4993. *                B - 6, 7.
  4994. *         CALLS  NONE.
  4995.           SPACE  4,10 
  4996.  IBC      SUBR               ENTRY/EXIT 
  4997.           SB7    OBCNT-1     (B7) = OUTPUT BUFFER COUNT - 1 
  4998.           SX6    OBFWA       (X6) = OUTPUT BUFFER FIRST WORD ADDRESS
  4999.           SB6    OBLEN       (X6) = OUTPUT BUFFER LENGTH
  5000.           SA6    FQPTR       RESET FREE POINTER 
  5001.   
  5002.  IBC2     SX7    X6+B6       (X7) = ADDRESS OF NEXT LINK
  5003.           SA7    X6          SAVE LINK
  5004.           SB7    B7-B1       DECREMENT BUFFER COUNT 
  5005.           BX6    X7          UPDATE CURRENT ADDRESS 
  5006.           NZ     B7,IBC2     LOOP FOR ALL BUFFERS 
  5007.           MX6    0
  5008.           SA6    X7          CLEAR LAST LINK
  5009.           SA6    IQPTR       CLEAR INPUT QUEUE POINTER
  5010.           EQ     IBCX        EXIT 
  5011.           SPACE  4,10 
  5012. **        RBF - RETURN BUFFER TO FREE CHAIN.
  5013. *         THIS ROUTINE RETURNS THE GIVEN OUTPUT BUFFER TO THE 
  5014. *         FREE QUEUE. 
  5015. *         ENTRY  (B1) = 1 
  5016. *                (X6) = FWA OF BUFFER TO BE RETURNED
  5017. *         EXIT   BUFFER RETURNED TO FREE QUEUE
  5018. *         USES   X - 1, 7.
  5019. *                A - 1, 6, 7. 
  5020. *                B - NONE.
  5021. *         CALLS  NONE.
  5022.           SPACE  4,10 
  5023.  RBF      SUBR               ENTRY/EXIT 
  5024.           SA1    FQPTR       (X1) = FREE POINTER
  5025.           BX7    X1 
  5026.           SA6    A1          UPDATE FREE POINTER
  5027.           SA7    X6          UPDATE LINK IN BUFFER BEING RETURNED 
  5028.           EQ     RBFX        EXIT 
  5029.           SPACE  4,10 
  5030. **        RIB - RETURN INPUT BUFFER.
  5031. *         THIS ROUTINE CHECKS THE INPUT QUEUE POINTER AND IF
  5032. *         A BUFFER IS ASSIGNED RETURNS THE BUFFER TO THE FREE 
  5033. *         CHAIN.
  5034. *         ENTRY  (B1) = 1 
  5035. *         EXIT   BUFFER RELEASED (IF ASSIGNED)
  5036. *         USES   X - 1, 6.
  5037. *                A - 1, 6.
  5038. *                B - NONE.
  5039. *         CALLS  RBF. 
  5040.           SPACE  4,10 
  5041.  RIB      SUBR               ENTRY/EXIT 
  5042.           SX6    0
  5043.           SA1    IQPTR       (X1) = INPUT QUEUE POINTER 
  5044.           ZR     X1,RIBX     NO BUFFER ASSIGNED SO EXIT 
  5045.           SA6    A1          CLEAR POINTER
  5046.           SX6    X1          (X6) = FWA OF BUFFER 
  5047.           RJ     RBF         RETURN BUFFER TO FREE LIST 
  5048.           EQ     RIBX        EXIT 
  5049.           TITLE  CDC FILE INTERFACE.
  5050. ***       CDC FILE INTEFACE.
  5051. *         KERMIT ATTEMPTS TO INTERFACE TO THE CDC PERMANENT FILE
  5052. *         BASE. IT USUALLY SUCCEDES BUT THERE ARE SOME PROBLEMS.
  5053. *         THE TWO MOST SIGNIFICANT PROBLEMS KNOWN ARE:- 
  5054. *         1) IF THE 'REPLACE' MODE IS SELECTED AND A FILE IS
  5055. *            RECEIVED WITH THE SAME NAME AS AN EXISTING INDIRECT
  5056. *            ACCESS FILE AND THE INCOMMING FILE IS TOO LONG TO 'SAVE' 
  5057. *            THEN ALL THAT HAPPENS IS THAT THE FILE IS LEFT LOCAL.
  5058. *         2) WHEN A LARGE FILE IS RECEIVED WHICH REQUIRES A DIRECT
  5059. *            ACCESS FILE TO SAVE IT THEN THE TIME TAKEN TO COPY THE 
  5060. *            FILE TO THE CORRECT DISK MAY RESULT IN THE REMOTE KERMIT 
  5061. *            TIMING OUT. IT IS HOPED THAT THIS WILL BE RESOLVED SOON. 
  5062. *         WHEN TRANSMITTING FILES THE FOLLOWING CHARACTERS HAVE A 
  5063. *         SPECIAL MEANING WITHIN THE FILE NAME:-
  5064. *         '#' OR '?' MEANS 'ANY SINGLE CHARACTER' 
  5065. *         '*'        MEANS 'ZERO OR MORE CHARACTERS'
  5066.           SPACE  4,10 
  5067. **        CDC FILE INTERFACE. 
  5068. *         THE FOLLOWING ROUTINES ARE USED TO CREATE, MODIFY 
  5069. *         OR GET CDC FORMAT FILES.
  5070. *         BFN - BUILD FILE NAME.
  5071. *         BLL - BUILD LOCAL FILE NAME LIST
  5072. *         GFN - GET FILE NAME (PROCESSES WILD CHARACTERS) 
  5073. *         ITF - INITIALISE TERMINAL FILES.
  5074. *         PRF - PROCESS RECEIVED FILE.
  5075. *         SFB - SET FLUSH BITS. 
  5076. *         VFN - VALIDATE FILE NAME
  5077.           SPACE  4,10 
  5078. **        BFN - BUILD FILE NAME.
  5079. *         THIS ROUTINE PROCESSES THE GIVEN ASCII STRING AND 
  5080. *         RETURNS A CDC FORMAT FILE NAME AND VALIDATION MASK. 
  5081. *         THE CHARACTERS '?' OR '#' MAY BE USED TO SPECIFY A SINGLE 
  5082. *         OCCURRENCE OF ANY CHARACTER. THE CHARACTER '*' CAN
  5083. *         BE USED AT THE END OF THE STRING TO SPECIFY ZERO OR 
  5084. *         MORE OCCURRENCIES OF ANY CHARACTER. ILLEGAL CHARACTERS
  5085. *         ARE IGNORED AS ARE CHARACTERS FOLLOWING THE SEVENTH 
  5086. *         LEGAL CHARACTER.
  5087. *         ENTRY  (B1) = 1 
  5088. *                (B5) = 0 IF WILD CHARACTERS ALLOWED
  5089. *                (B6) = FWA OF ASCII STRING 
  5090. *                (B7) = LENGTH OF STRING
  5091. *         EXIT   (X6) = FILE NAME LEFT JUSTIFIED
  5092. *                (X7) = FILE NAME MASK
  5093. *         USES   X - 0, 1, 2, 3, 6 ,7.
  5094. *                A - 1, 2, 6, 7.
  5095. *                B - 3, 4, 6, 7.
  5096. *         CALLS  BLL. 
  5097.           SPACE  4,10 
  5098.  BFN      SUBR               ENTRY/EXIT 
  5099.   
  5100. *         INITIALISE. 
  5101.   
  5102.           MX6    0           CLEAR FILE NAME
  5103.           SX7    B0          CLEAR MASK 
  5104.           LE     B7,B0,BFNX  ILLEGAL LENGTH SO EXIT 
  5105.           MX0    -7          (X0) = ASCII MASK
  5106.           SB4    7           (B4) = MAXIMUM FILE NAME LENGTH
  5107.           MX3    -6          (X3) = DISPLAY CODE MASK 
  5108.   
  5109. *         GET NEXT CHARACTER. 
  5110.   
  5111.  BFN2     SB6    B6+B1       INCREMENT SOURCE ADDRESS 
  5112.           SB7    B7-1        DECREMENT SOURCE COUNT 
  5113.           SA2    B6-B1       (X2) = NEXT CHARACTER
  5114.           SA2    A2C+X2      CONVERT TO DISPLAY CODE
  5115.           NG     X2,BFN4     POSSIBLE WILD CHARACTER
  5116.   
  5117. *         ADD CHARACTER TO NAME AND SHIFT MASK. 
  5118.   
  5119.           LX7    6           SHIFT MASK 
  5120.           AX2    18 
  5121.           LX6    6
  5122.           SB4    B4-B1       DECREMENT FILE NAME LENGTH 
  5123.           SX2    X2          (X2) = 6 BIT DISPLAY CODE
  5124.           BX6    X2+X6       ADD CHARACTER TO FILE NAME 
  5125.           ZR     B7,BFN12    END OF STRING
  5126.           ZR     B4,BFN12    FILE NAME LENGTH LIMIT 
  5127.           EQ     BFN2        GOTO GET NEXT CHARACTER
  5128.   
  5129. *         INVALID CHARACTER SO CHECK FOR WILD CHARACTER.
  5130.   
  5131.  BFN4     ZR     B5,BFN6     WILD CARDS ALLOWED 
  5132.           ZR     B7,BFN12    END OF STRING
  5133.           EQ     BFN2        GOTO GET NEXT CHARACTER
  5134.   
  5135. *         POSSIBLE WILD CHARACTER.
  5136.   
  5137.  BFN6     SX2    X2-1R?      CHECK FOR SINGLE CHARACTER WILD
  5138.           ZR     X2,BFN7     '?' SO SINGLE CHARACTER WILD CARD
  5139.           SX2    X2+1R?-1R#  CHECK FOR ALTERNATIVE
  5140.           NZ     X2,BFN8     NOT SINGLE CHARACTER WILD CARD 
  5141.   
  5142. *         SINGLE CHARACTER WILD CARD. 
  5143.   
  5144.  BFN7     LX6    6           USE NULL CHARACTER 
  5145.           SB4    B4-B1       DECREMENT FILE NAME LENGTH 
  5146.           LX7    6
  5147.           BX7    -X3+X7      ADD MASK 
  5148.           ZR     B7,BFN12    END OF STRING
  5149.           ZR     B4,BFN12    IF FILE NAME LIMIT REACHED 
  5150.           EQ     BFN2        GOTO GET NEXT CHARACTER
  5151.   
  5152. *         CHECK FOR GLOBAL WILD CHARACTER.
  5153.   
  5154.  BFN8     SX2    X2+1R#-1R*  CHECK FOR '*'
  5155.           ZR     X2,BFN10    ALLOW ANY REMAINING CHARACTERS 
  5156.           NZ     B7,BFN2     NOT END OF STRING
  5157.           EQ     BFN12       END OF STRING
  5158.   
  5159. *         '*' SO ALLOW ANY TRAILING CHARACTERS. 
  5160.   
  5161.  BFN10    SB3    B3+B4
  5162.           SB3    B3+B4
  5163.           SB3    B3+B3       (B3) = 6 * REMAINING CHARACTER COUNT 
  5164.           SB3    B3-B1
  5165.           MX2    1
  5166.           AX2    B3          (X2) = MASK FOR REMAINING CHARACTERS 
  5167.           SB3    B3+B1
  5168.           LX2    B3          RIGHT JUSTIFY MASK 
  5169.           LX7    B3          MAKE ROOM
  5170.           SB4    0           CLEAR REMAINING CHARACTER COUNT
  5171.           BX2    X2+X7       ADD TO FILE NAME MASK
  5172.   
  5173. *         END OF SOURCE DATA SO LEFT JUSTIFY NAME AND MASK. 
  5174.   
  5175.  BFN12    SB4    B4+3        (B4) = REMAINING CHARACTER COUNT + 3 
  5176.           SB3    B4+B4
  5177.           SB4    B3+B4
  5178.           SB4    B4+B4       (B4) = 6 * REMAINING CHARACTER COUNT + 18
  5179.           LX6    B4          LEFT JUSTIFY FILE NAME 
  5180.           SA6    FNAME       SAVE 
  5181.           LX7    B4          LEFT JUSTIFY MASK
  5182.           SA7    A6+B1       SAVE 
  5183.   
  5184. *         IF WILD CHARACTERS BUILD LOCAL FILE NAME LIST.
  5185.   
  5186.           ZR     X7,BFNX     NO WILD CHARACTERS 
  5187.           RJ     BLL         BUILD LOCAL FILE NAME LIST 
  5188.           SA2    FNAME       (X2) = REQUIRED FILE NAME
  5189.           BX6    X2 
  5190.           SA2    A2+B1       (X2) = MASK
  5191.           BX7    X2 
  5192.           EQ     BFNX        EXIT 
  5193.           SPACE  4,10 
  5194. **        BLL - BUILD LIST OF LOCAL FILES.
  5195. *         THIS ROUTINE EXAMINES THE FNT ENTRIES AND SAVES A LIST
  5196. *         OF ALL THE LOCAL FILES ASSIGNED TO MASS STORAGE. NOTE 
  5197. *         THAT A MAXIMUM OF 'LFTABL' ENTRIES ARE SAVED. 
  5198. *         ENTRY  (B1) = 1 
  5199. *         EXIT   FILE LIST BUILT
  5200. *         USES   X - 0, 1, 6, 7.
  5201. *                A - 1, 6, 7. 
  5202. *                B - 7. 
  5203. *         CALLS  LFM=.
  5204.           SPACE  4,10 
  5205.  BLL      SUBR               ENTRY/EXIT 
  5206.   
  5207.           SA1    BLL.A       (X1) = FET + 10B PATCH WORD
  5208.           MX7    0
  5209.           BX6    X1 
  5210.           SA7    LFPTR       RESET LOCAL FILE POINTER 
  5211.           SA6    Q+10B       PATCH FET
  5212.           SB7    -LFTABL     (B7) = - LOCAL FILE TABLE LENGTH 
  5213.           SA7    BLL.B       CLEAR CONTINUATION FLAG
  5214.   
  5215. *         GET NEXT FNT BLOCK. 
  5216.   
  5217.  BLL2     GETFNT Q           GET NEXT BLOCK 
  5218.           SA1    BLL.B+1     (X1) = FIRST ENTRY 
  5219.           ZR     X1,BLL8     NO MORE ENTRIES
  5220.   
  5221. *         SCAN BLOCK EXTRACTING FILES ASSIGNED TO MASS STORAGE. 
  5222.   
  5223.           SX0    60000B      (X0) = TYPE FIELD MASK 
  5224.   
  5225.  BLL4     BX6    X0*X1       (X6) = FILE TYPE 
  5226.           NZ     X6,BLL6     NOT MASS STORAGE 
  5227.           MX6    42 
  5228.           BX6    X1*X6       (X6) = FILE NAME 
  5229.           SA6    LFTAB+LFTABL+B7
  5230.           SB7    B7+B1       INCREMENT POINTER
  5231.           ZR     B7,BLL8     END OF DATA
  5232.   
  5233.  BLL6     SA1    A1+2        (X1) = NEXT TABLE ENTRY
  5234.           NZ     X1,BLL4     LOOP FOR ALL ENTRIES 
  5235.   
  5236. *         CHECK FOR MORE. 
  5237.   
  5238.           SA1    BLL.B       (X1) = CONTINUATION FLAG 
  5239.           NZ     X1,BLL2     LOOP TILL END
  5240.   
  5241. *         END OF DATA OF FILE LIST LIMIT REACHED. 
  5242.   
  5243.  BLL8     SX6    0
  5244.           SA6    LFTAB+LFTABL+B7
  5245.           EQ     BLLX        EXIT 
  5246.   
  5247.  BLL.A    VFD    12/16,6/0,18/023000B,6/10B,18/BLL.B
  5248.  BLL.B    BSS    16*2+2 
  5249.           SPACE  4,10 
  5250. **        GCE - GET CATALOG ENTRY.
  5251. *         THIS ROUTINE READS THE NEXT CATALOG ENTRY FROM
  5252. *         THE USER CATALOG. 
  5253. *         ENTRY  (B1) = 1 
  5254. *                'C' REWOUND IF FIRST ENTRY 
  5255. *         EXIT   (X1) = FILE NAME 
  5256. *                (A1) = ADDRESS OF CATALOG ENTRY
  5257. *         USES   X - 1, 6.
  5258. *                A - 1, 6.
  5259. *                B - NONE.
  5260. *         CALLS  CIO=, LFM=, PFM=, RDW=.
  5261.           SPACE  4,10 
  5262.  GCE      SUBR               ENTRY/EXIT 
  5263.   
  5264.  GCE2     READW  Q,GCE.A,NWCE READ CATALOG ENTRY
  5265.           NG     X1,GCE4     NO DATA AVAILABLE
  5266.           SA1    GCE.A       (X1) = FILE NAME 
  5267.           EQ     GCEX        EXIT 
  5268.   
  5269. *         NO DATA SO ISSUE CATLIST UNLESS EOI.
  5270.   
  5271.  GCE4     SX1    X1+B1       CHECK FOR EOI
  5272.           NG     X1,GCE6     EOI SO END OF CATALOG
  5273.           SA1    X2+B1       (X1) = FIRST + ....
  5274.           SX6    X1          (X6) = FIRST 
  5275.           SA6    A1+1        SET IN = FIRST 
  5276.           SA6    A6+B1       SET OUT = FIRST
  5277.           CATLIST Q          EXTEND CATALOG 
  5278.           EQ     GCE2        GOTO READ NEXT ENTRY 
  5279.   
  5280. *         END OF CATALOG SO INITIALISE FOR NEXT TIME. 
  5281.   
  5282.  GCE6     MX1    0           CLEAR RETURN FLAG
  5283.           EQ     GCEX        EXIT 
  5284.   
  5285.  GCE.A    BSS    NWCE        CATALOG ENTRY BUFFER 
  5286.           SPACE  4,10 
  5287. **        GFN - GET FILE NAME.
  5288. *         THIS ROUTINE RETURNS THE NEXT FILE NAME. IT ALLOWS
  5289. *         FOR WILD CHARACTERS AND RETURNS A ZERO VALUE WHEN 
  5290. *         ALL POSSIBLE NAMES HAVE BEEN RETURNED.
  5291. *         ENTRY  (B1) = 1 
  5292. *         EXIT   (X6) = NAME LEFT JUSTIFIED (0 IF NO NAME)
  5293. *         USES   X - 1, 6, 7. 
  5294. *                A - 1, 6.
  5295. *                B - NONE.
  5296. *         CALLS  GCE. 
  5297.           SPACE  4,10 
  5298.  GFN      SUBR               ENTRY/EXIT 
  5299.   
  5300.           SA1    FMASK       (X1) = FILE NAME MASK
  5301.           NZ     X1,GFN2     WILD CHARACTERS
  5302.   
  5303. *         NO WILD CHARACTERS TO BE PROCESSED. 
  5304.   
  5305.           SA1    FNAME       (X1) = FILE NAME 
  5306.           MX6    0
  5307.           SA6    A1          CLEAR FOR NEXT TIME ROUND
  5308.           BX6    X1          (X6) = FILE NAME 
  5309.           EQ     GFNX        EXIT 
  5310.   
  5311. *         WILD CHARACTERS.
  5312.   
  5313.  GFN2     SA2    LFPTR       (X2) = LOCAL FILE POINTER
  5314.           NG     X2,GFN8     LOCAL FILE LIST EXHAUSTED
  5315.   
  5316. *         SCAN LOCAL FILE LIST FROM CURRENT POSITION FOR MATCH. 
  5317.   
  5318.           BX6    X1          (X6) = FILE NAME MASK
  5319.           SA1    FNAME       (X1) = REQUIRED FILE NAME
  5320.           BX7    X1 
  5321.   
  5322.  GFN4     SA1    LFTAB+X2    (X1) = CURRENT ENTRY 
  5323.           ZR     X1,GFN6     END OF LOCAL FILE LIST 
  5324.           BX3    X1-X7       COMPARE WITH REQUIRED NAME 
  5325.           SX2    X2+1        INCREMENT CURRENT POINTER
  5326.           BX3    -X6*X3      MASK 
  5327.           NZ     X3,GFN4     NO MATCH 
  5328.   
  5329. *         ENTRY FOUND SO UPDATE POINTER AND RETURN. 
  5330.   
  5331.           BX6    X2          (X6) = UPDATED POINTER 
  5332.           SA6    A2          REPLACE
  5333.           BX6    X1          (X6) = FILE NAME 
  5334.           EQ     GFNX        EXIT 
  5335.   
  5336. *         END OF FILE LIST SO RESET POINTER AND PRESET FET. 
  5337.   
  5338.  GFN6     MX6    59 
  5339.           SA1    Q+1         (X1) = FIRST + ....
  5340.           SA6    A2          FLAG LOCAL FILES PROCESSED 
  5341.           SX6    X1          (X6) = FIRST 
  5342.           SA6    A1+1        SET IN = FIRST 
  5343.           SA6    A6+B1       SET OUT = FIRST
  5344.           SX6    0
  5345.           SA6    Q+6         CLEAR CONTINUATION COUNT 
  5346.           SA6    Q+10B       CLEAR FNT FLAGS FROM PFN 
  5347.           CATLIST Q          LOAD CATALOG BUFFER
  5348.   
  5349. *         GET NEXT CATALOG ENTRY. 
  5350.   
  5351.  GFN8     RJ     GCE         GET CATALOG ENTRY
  5352.           SX6    0           ASSUME NO ENTRY
  5353.           ZR     X1,GFNX     ASSUMPTION CORRECT SO EXIT 
  5354.   
  5355. *         CHECK IF POSSIBLE CANDIDATE.
  5356.   
  5357.           MX6    42 
  5358.           BX6    X1*X6       (X6) = FILE NAME 
  5359.           SA1    FNAME       (X1) = REQUIRED FILE NAME
  5360.           BX7    X1-X6       COMPARE
  5361.           SA1    FMASK       (X1) = FILE NAME MASK
  5362.           BX7    -X1*X7      CHECK
  5363.           NZ     X7,GFN8     NO MATCH SO TRY AGAIN
  5364.   
  5365. *         VALID CONTENDER SO CHECK IF ALREADY PROCESSED AS LOCAL. 
  5366.   
  5367.           SA1    LFTAB       (X1) = FIRST LOCAL FILE NAME 
  5368.           ZR     X1,GFNX     NO LOCAL FILES SO USE
  5369.   
  5370.  GFN10    BX7    X1-X6       COMPARE
  5371.           ZR     X7,GFN8     FILE FOUND SO ALREADY PROCESSED
  5372.           SA1    A1+B1       (X1) = NEXT TABLE ENTRY
  5373.           NZ     X1,GFN10    LOOP TILL END OF LOCAL FILE LIST 
  5374.           EQ     GFNX        NOT FOUND SO USE IT
  5375.           SPACE  4,10 
  5376. **        GNF - GET NEXT FILE.
  5377. *         THIS ROUTINE GETS THE NEXT FILE FROM THE FILE NAME
  5378. *         LIST, ASSIGNS THE FILE AND LOADS THE INPUT BUFFER.
  5379. *         ENTRY  (B1) = 1 
  5380. *         EXIT   (X6) = 0 IF NO FILE AVAILABE 
  5381. *         USES   X - 1, 6, 7. 
  5382. *                A - 1, 6.
  5383. *                B - NONE.
  5384. *         CALLS 
  5385.           SPACE  4,10 
  5386.  GNF      SUBR               ENTRY/EXIT 
  5387.   
  5388. *         RESET DEFAULT FILE NAME.
  5389.   
  5390.           SX6    3
  5391.           SA1    GNF.A       (X1) = FILE NAME 
  5392.           BX6    X1+X6       ADD STATUS 
  5393.           SA6    F           SAVE 
  5394.   
  5395. *         GET NEXT FILE NAME. 
  5396.   
  5397.  GNF2     RJ     GFN         GET FILE NAME
  5398.           ZR     X6,GNFX     NO FILE FOUND
  5399.   
  5400. *         SAVE NAME IN FET AND CHECK IF LOCAL.
  5401.   
  5402.           SA6    CNAME       SAVE CURRENT FILE NAME 
  5403.           MX7    -2 
  5404.           BX6    -X7+X6      ADD STATUS TO FILE NAME
  5405.           SA6    S           SAVE IN STATUS FET 
  5406.           REWIND S,R         SET STATUS BITS (INCASE INCOMPLETE READ) 
  5407.           STATUS X2          CHECK IF LOCAL 
  5408.           SA1    X2          (X1) = RETURN CODE 
  5409.           MX6    -12
  5410.           BX6    -X6*X1      EXTRACT STATUS 
  5411.           AX6    1           IGNORE COMPLETED BIT 
  5412.           NZ     X6,GNF6     FILE LOCAL 
  5413.   
  5414. *         FILE NOT LOCAL SO TRY TO 'GET' IT.
  5415.   
  5416.           GET    F,CNAME     GET THE FILE 
  5417.           SA1    X2          (X1) = STATUS WORD 
  5418.           MX6    -18
  5419.           BX6    -X6*X1      (X6) = STATUS BITS 
  5420.           AX6    10          (X6) = ABNORMAL TERMINATION CODE 
  5421.           ZR     X6,GNF8     FILE OPTAINED SO LOAD BUFFER 
  5422.   
  5423. *         NOT ASSIGNED SO TRY TO ATTACH FILE IF APPROPRIATE.
  5424.   
  5425.           SX6    X6-/ERRMSG/FNF        CHECK IF DIRECT ACCESS 
  5426.           NZ     X6,GNF4     CANNOT OBTAIN THIS FILE
  5427.           ATTACH F,CNAME     ATTACH THE FILE
  5428.           SA1    X2          (X1) = STATUS WORD 
  5429.           MX6    -18
  5430.           BX6    -X6*X1      (X6) = STATUS
  5431.           AX6    10          (X6) = ABNORMAL TERMINATION CODE 
  5432.           ZR     X6,GNF8     FILE OBTAINED
  5433.   
  5434. *         CANNOT GET THIS FILE. 
  5435.   
  5436.  GNF4     SA1    GNF.B       (X1) = FIRST WORD OF LOG MESSAGE 
  5437.           RJ     WLM         WRITE LOG MESSAGE
  5438.           EQ     GNF2        GOTO GET NEXT (IF WILD CARD) 
  5439.   
  5440. *         FILE LOCAL SO PATCH SOURCE FET NAME.
  5441.   
  5442.  GNF6     SA1    CNAME       (X1) = CURRENT FILE NAME 
  5443.           MX6    -2 
  5444.           BX6    -X6+X1      SET STATUS BITS
  5445.           SA6    F           SAVE FILE NAME IN FET
  5446.           REWIND F,R         REWIND 
  5447.   
  5448. *         OPEN FILE NOW THAT IT IS LOCAL. 
  5449.   
  5450.  GNF8     READ   F           LOAD BUFFER
  5451.           MX6    0
  5452.           SA6    FWORD       CLEAR PACKING/UNPACKING WORD 
  5453.           SA6    A6+B1       CLEAR UNPACKING COUNTER
  5454.           SX6    B1          FLAG FILE ASSIGNED 
  5455.           EQ     GNFX        EXIT 
  5456.   
  5457.  GNF.A    VFD    42/0LZZZZZFN,18/0
  5458.  GNF.B    DIS    ,'**** UNABLE TO FIND ;A.' 
  5459.           SPACE  4,10 
  5460. **        ITF - INITIALISE TERMINAL FILES.
  5461. *         THIS ROUTINE ASSIGNS THE FILES 'ZZZZZIN' AND 'ZZZZZOU'
  5462. *         TO THE TERMINAL. THESE ARE USED BY KERMIT FOR THE 
  5463. *         PACKET INPUT AND OUTPUT.
  5464. *         ENTRY  (B1) = 1 
  5465. *         EXIT   FILES ASSIGNED TO THE TERMINAL 
  5466. *         USES   X - NONE.
  5467. *                A - NONE.
  5468. *                B - NONE.
  5469. *         CALLS  LFM=.
  5470.           SPACE  4,10 
  5471.  ITF      SUBR               ENTRY/EXIT 
  5472.   
  5473.           RETURN ZZZZZIN,R   INITIALISE INPUT FILE
  5474.           REQUEST X2,U,ND 
  5475.           SA1    X2          (X1) = FET + 0 
  5476.           MX6    42 
  5477.           BX6    X1*X6       CLEAR STATUS 
  5478.           SX1    11B         (X1) = 'READ' FUNCTION 
  5479.           BX6    X1+X6       ADD TO FILE NAME 
  5480.           SA6    A1          PRESET READ FUNCTION 
  5481.           RETURN ZZZZZOU,R   INITIALISE OUTPUT FILE 
  5482.           REQUEST X2,U,ND 
  5483.           EQ     ITFX        EXIT 
  5484.           SPACE  4,10 
  5485. **        PROCESS RECEIVED FILE.
  5486. *         THIS ROUTINE MAKES THE RECEIVED FILE PERMANENT ACCORDING
  5487. *         TO THE P.F. FLAG. 
  5488. *         ENTRY  (B1) = 1 
  5489. *                PFFLAG = 0 - LEAVE FILE LOCAL
  5490. *                         1 - SAVE/DEFINE FILE
  5491. *                         2 - REPLACE/ATTACH & COPY FILE
  5492. *         EXIT   FILE PROCESSED 
  5493. *         USES   X -
  5494. *                A -
  5495. *                B -
  5496. *         CALLS 
  5497.           SPACE  4,10 
  5498.  PRF      SUBR               ENTRY/EXIT 
  5499.   
  5500. *         BRANCH ACCORDING TO FUNCTION. 
  5501.   
  5502.           SA1    PFFLAG      (X1) = P.F. FLAG 
  5503.           SA1    PRF.A+X1    (X1) = PROCESS ADDRESS 
  5504.           SB7    X1 
  5505.           JP     B7+         PROCESS
  5506.   
  5507. *         LEAVE FILE LOCAL. 
  5508.   
  5509.  PRF0     RJ     VLN         VALIDATE LOCAL FILE NAME 
  5510.           SA1    CNAME       (X1) = CURRENT FILE NAME 
  5511.           SA2    F+6         (X2) = LOCAL FILE NAME 
  5512.           BX2    X1-X2       COMPARE
  5513.           AX2    18          IGNORE STATUS BITS 
  5514.           SA1    PRF.G       ASSUME SAME NAME 
  5515.  +        ZR     X2,*+1      ASSUMPTION CORRECT 
  5516.           SA1    PRF.I       USE ALTERNATIVE NAME 
  5517.           RJ     WLM         WRITE LOG FILE MESSAGE 
  5518.           EQ     PRFX        EXIT 
  5519.   
  5520. *         SAVE/DEFINE FILE. 
  5521.   
  5522.  PRF2     RJ     VFN         VALIDATE FILE NAME 
  5523.           SAVE   F           TRY TO SAVE FILE 
  5524.   
  5525. *         CHECK RETURN CODE.
  5526.   
  5527.           SX6    377B 
  5528.           SA1    F           (X1) = FILE NAME + STATUS
  5529.           AX1    10 
  5530.           BX6    X1*X6       (X6) = ERROR CODE
  5531.           NZ     X6,PRF4     ERROR OF SOME SORT SO TRY TO IDENTIFY. 
  5532.   
  5533. *         WRITE MESSAGE TO LOG FILE.
  5534.   
  5535.           SA1    CNAME       (X1) = CURRENT FILE NAME 
  5536.           SA2    F+10B       (X2) = NAME USED IN SAVE 
  5537.           BX2    X1-X2       COMPARE
  5538.           AX2    18          IGNORE STATUS BITS 
  5539.           SA1    PRF.B       ASSUME NAMES MATCH 
  5540.  +        ZR     X2,*+1      ASSUMPTION CORRECT 
  5541.           SA1    PRF.C       USE ALTERNATIVE TEXT 
  5542.           RJ     WLM         WRITE LOG MESSAGE
  5543.           EQ     PRFX        EXIT 
  5544.   
  5545. *         UNABLE TO SAVE FILE SO CHECK IF TOO LONG. 
  5546.   
  5547.  PRF4     SX7    X6-/ERRMSG/FTL CHECK IF TOO LONG 
  5548.           NZ     X7,PRF10    NOT TOO LONG 
  5549.           RETURN Q,R         RETURN CATLIST FILE
  5550.           DEFINE Q           TRY TO DEFINE FILE 
  5551.   
  5552. *         CHECK RETURN CODE.
  5553.   
  5554.           SX6    377B 
  5555.           SA1    Q           (X1) = FILE NAME + STATUS
  5556.           AX1    10 
  5557.           BX6    X1*X6       X6) = STATUS BITS
  5558.           NZ     X6,PRF10    ERROR SO UNABLE TO SAVE
  5559.   
  5560. *         COPY LOCAL FILE TO PERMANENT. 
  5561.   
  5562.           REWIND F,R         REWIND SOURCE
  5563.           READ   X2          LOAD BUFFER
  5564.           REWIND Q,R         REWIND DESTINATION 
  5565.           WRITE  X2,*        PRESET FET WRITE FUNCTION
  5566.   
  5567.  PRF6     READO  F           READ NEXT WORD 
  5568.           NZ     X1,PRF8     END OF DATA
  5569.           WRITEO Q           WRITE TO PERMANENT FILE
  5570.           EQ     PRF6        LOOP TILL END OF DATA
  5571.   
  5572.  PRF8     WRITER Q,R         FLUSH OUTPUT BUFFER
  5573.           RETURN X2          RETURN FILE
  5574.   
  5575. *         WRITE LOG MESSAGE.
  5576.   
  5577.           SA1    CNAME       (X1) = CURRENT FILE NAME 
  5578.           SA2    F+10B       (X2) = NAME USED IN DEFINE 
  5579.           BX2    X1-X2       COMPARE
  5580.           AX2    18          IGNORE STATUS BITS 
  5581.           SA1    PRF.D       (X1) = DEFAULT MESSAGE 
  5582.  +        ZR     X2,*+1      ASSUMPTION CORRECT 
  5583.           SA1    PRF.E       USE ALTERNATIVE TEXT 
  5584.           RJ     WLM         WRITE LOG MESSAGE
  5585.           EQ     PRFX        EXIT 
  5586.   
  5587. *         UNABLE TO SAVE FILE SO LOG AND EXIT.
  5588.   
  5589.  PRF10    RJ     VLN         VALIDATE LOCAL FILE NAME 
  5590.           SA1    CNAME       X1) = CURRENT FILE NAME
  5591.           SA2    F+6         (X2) = LOCAL FILE NAME 
  5592.           BX2    X1-X2       COMPARE
  5593.           AX2    18          IGNORE STATUS BITS 
  5594.           SA1    PRF.F       ASSUME SAME NAME 
  5595.  +        ZR     X2,*+1      ASSUMPTION CORRECCT
  5596.           SA1    PRF.H       USE ALTERNATIVE MESSAGE
  5597.           RJ     WLM         WRITE LOG MESSAGE
  5598.           EQ     PRFX        EXIT 
  5599.   
  5600. *         REPLACE/ATTACH & COPY FILE. 
  5601.   
  5602.  PRF12    SA1    CNAME       (X1) = CURRENT FILE NAME 
  5603.           MX6    42 
  5604.           BX6    X1*X6       CLEAR STATUS BITS
  5605.           SA6    F+10B       SAVE AS PFN
  5606.           REPLACE F          TRY TO REPLACE FILE
  5607.   
  5608. *         CHECK RETURN CODE.
  5609.   
  5610.           SX6    377B 
  5611.           SA1    F           (X1) = FILE NAME + STATUS
  5612.           AX1    10 
  5613.           BX6    X1*X6       (X6) = ERROR CODE
  5614.           NZ     X6,PRF10    ERROR OF SOME SORT 
  5615.   
  5616. *         WRITE MESSAGE TO LOG FILE.
  5617.   
  5618.           SA1    PRF.J       (X1) = FIRST WORD OF MESSAGE.
  5619.           RJ     WLM         WRITE LOG MESSAGE
  5620.           EQ     PRFX        EXIT 
  5621.   
  5622.  PRF.A    BSS    0           FUNCTION BRANCH TABLE
  5623.           CON    PRF0        0 - LEAVE LOCAL
  5624.           CON    PRF2        1 - SAVE/DEFINE
  5625.           CON    PRF12       2 - REPLACE/ATTACH & COPY
  5626.  PRF.B    DIS    ,'    ;A SAVED.' 
  5627.  PRF.C    DIS    ,'    ;A SAVED AS ;B.' 
  5628.  PRF.D    DIS    ,'    ;A DEFINED.' 
  5629.  PRF.E    DIS    ,'    ;A DEFINED AS ;B.' 
  5630.  PRF.F    CON    10H ** UNABLE,10H TO SAVE, 
  5631.  PRF.G    DIS    ,'    ;A LEFT LOCAL.'
  5632.  PRF.H    CON    10H ** UNABLE,10H TO SAVE, 
  5633.  PRF.I    DIS    ,'    ;A LEFT LOCAL AS ;C.'
  5634.  PRF.J    DIS    ,'    ;A REPLACED.'
  5635.           SPACE  4,10 
  5636. **        SFB - SET FLUSH BITS. 
  5637. *         THIS ROUTINE SETS THE FLUSH BITS IN THE REQUIRED FETS.
  5638. *         THIS MAY ASSIST THROUGHPUT ON THE TERMINAL FILE.
  5639. *         ENTRY  (B1) = 1 
  5640. *         EXIT   FLUSH BIT (FET+1 BIT 36) SET 
  5641. *         USES   X - 1, 6, 7. 
  5642. *                A - 1, 6.
  5643. *                B - NONE.
  5644. *         CALLS  CPM=, RCL=.
  5645.           SPACE  4,10 
  5646.  SFB      SUBR               ENTRY/EXIT 
  5647.   
  5648.           SX7    B1 
  5649.           LX7    36-0        (X7) = FLUSH BIT 
  5650.   
  5651. *         SET DEBUG FILE FLUSH BIT. 
  5652.   
  5653.           SA1    D+1         (X1) = FIRST + ....
  5654.           BX6    X1+X7       SET FLUSH BIT
  5655.           SA6    A1          REPLACE
  5656.   
  5657. *         SET DATA FILE FLUSH BIT.
  5658.   
  5659.           SA1    F+1         (X1) = FIRST + ....
  5660.           BX6    X1+X7       SET FLUSH BIT
  5661.           SA6    A1          REPLACE
  5662.   
  5663. *         SET LOG FILE FLUSH BIT. 
  5664.   
  5665.           SA1    L+1         (X1) = FIRST + ....
  5666.           BX6    X1+X7       SET FLUSH BIT
  5667.           SA6    A1          REPLACE
  5668.   
  5669. *         SET TERMINAL OUTPUT FLUSH BIT.
  5670.   
  5671.           SA1    O+1         (X1) = FIRST + ....
  5672.           BX6    X1+X7       SET FLUSH BIT
  5673.           SA6    A1          REPLACE
  5674.   
  5675. *         GIVE LIST OF FILES TO SYSTEM. 
  5676.   
  5677.           SETLOF SFB.A
  5678.           RECALL SFB.A
  5679.           EQ     SFBX        EXIT 
  5680.   
  5681.  SFB.A    VFD    12/0,18/SFB.B,29/0,1/0 
  5682.  SFB.B    BSS    0           LIST OF FILES TO FLUSH 
  5683.           VFD    1/0,41/0,18/SFB.BL 
  5684.           VFD    42/7LZZZZZOU,18/O
  5685.           VFD    42/7LZZZZDBG,18/D
  5686.           VFD    42/7LZZZZZFN,18/F
  5687.           VFD    42/7LZZZZLOG,18/L
  5688.           CON    0
  5689.  SFB.BL   EQU    *-SFB.B-1
  5690.           SPACE  4,10 
  5691. **        VFN - VALIDATE FILE NAME. 
  5692. *         THIS ROUTINE CHECKS IF THE CURRENT FILE NAME IS ALREADY 
  5693. *         A PERMANENT FILE. IF IT IS THEN THE FILE NAME IS MODIFIED 
  5694. *         WHEN THE FUNCTION IS 'SAVE' OR 'DEFINE'.
  5695. *         ENTRY  (B1) = 1 
  5696. *                (CNAME) = CURRENT FILE NAME
  5697. *         EXIT   (F+10B) = FILE NAME TO USE 
  5698. *         USES   X -
  5699. *                A -
  5700. *                B -
  5701. *         CALLS 
  5702.           SPACE  4,10 
  5703.  VFN      SUBR               ENTRY/EXIT 
  5704.   
  5705. *         CHECK IF FILE ALREADY PERMANENT.
  5706.   
  5707.           SETFET Q,ERA=VFN.A
  5708.           SA1    CNAME       (X1) = CURRENT FILE NAME 
  5709.           MX6    0
  5710.           BX7    X1 
  5711.           SA6    VFN.B       CLEAR ATTEMPTED FILE NAME
  5712.           SA7    F+10B       INITIALISE PFN IN FET
  5713.   
  5714.  VFN2     REWIND Q,R         INITIALISE FET 
  5715.           SX6    0
  5716.           SA6    X2+6        CLEAR CATLIST CONTINUATION 
  5717.           CATLIST Q,F+10B 
  5718.           SA1    Q+2         (X1) = IN
  5719.           SA2    A1+B1       (X2) = OUT 
  5720.           BX1    X1-X2       COMPARE
  5721.           ZR     X1,VFNX     NO INPUT SO FILE NOT FOUND 
  5722.           READW  Q,VFN.C,NWCE READ CATALOG ENTRY
  5723.           NZ     X1,VFNX     FILE NOT FOUND SO USE AS IS
  5724.   
  5725. *         FILE NAME REQUIRES MODIFICATION.
  5726.   
  5727.           SA5    VFN.B       (X5) = ATTEMPTED FILE NAME 
  5728.           NZ     X5,VFN4     NOT FIRST ATTEMPT
  5729.           SA5    CNAME       (X5) = CURRENT FILE NAME 
  5730.   
  5731. *         EXTRACT CURRENT COUNT AND FILE NAME.
  5732.   
  5733.  VFN4     SX6    X5          (X6) = CURRENT COUNT VALUE 
  5734.           SX1    X6+B1       (X1) =NEXT NUMBER
  5735.           BX5    X5-X6       (X5) = BASE NAME 
  5736.           BX6    X1+X5       (X6) = 42/NAME,18/NEXT NUMBER
  5737.           SA6    VFN.B       SAVE 
  5738.           RJ     CDD         CONVERT TO DECIMAL DISPLAY CODE
  5739.   
  5740. *         DETERMINE NUMBER OF CHARACTERS IN BASE FILE NAME. 
  5741.   
  5742.           MX7    6
  5743.           SB7    0
  5744.           LX6    18          POSITION NUMERIC DISPLAY CODE
  5745.  +        LX7    60-6        SHIFT MASK 
  5746.           SB7    B7+6        INCREMENT BIT COUNT
  5747.           BX1    X5*X7       CHECK IF END OF NAME 
  5748.           NZ     X1,*-1      NOT END OF NAME
  5749.   
  5750. *         TRY TO MERGE NAME AND NUMBER. 
  5751.   
  5752.           SB3    42          (B3) = MAXIMUM FILE NAME LENGTH (IN BITS)
  5753.  +        SB6    B2+B7       (B6) = LENGTH OF NAME + NUMBER (IN BITS) 
  5754.           LE     B6,B3,*+1   IN RANGE 
  5755.           SB7    B3-B2       TRUNCATE NAME PART 
  5756.           MX7    1
  5757.           SB6    B7-1 
  5758.           AX7    B6          (X7) = MASK FOR FILE NAME
  5759.           BX5    X5*X7       (X5) = FILE NAME 
  5760.           AX4    B7          POSITION NUMERIC PART
  5761.           BX4    -X7*X4      CLEAR SIGN EXTENSION 
  5762.           BX6    X4+X5       MERGE NAME AND NUMBER
  5763.           AX7    B2          EXTEND MASK TO TOTAL LENGTH
  5764.           BX6    X6*X7       CLEAR ANY TRAILING BLANKS
  5765.           SA6    F+10B       SAVE IN FET
  5766.           EQ     VFN2        CHECK IF THIS NAME IS O.K. 
  5767.   
  5768.  VFN.A    BSS    3           PFM ERROR MESSAGE BUFFER 
  5769.  VFN.B    BSS    1           ATTEMPTED FILE NAME
  5770.  VFN.C    BSS    NWCE        FILE CATALOG ENTRY 
  5771.           SPACE  4,10 
  5772. **        VLN - VALIDATE LOCAL FILE NAME. 
  5773. *         THIS ROUTINE LEAVES THE CURRENT FILE LOCAL ENSURING 
  5774. *         NO NAME CONFLICT. 
  5775. *         ENTRY  (B1) = 1 
  5776. *                (CNAME) = CURRENT FILE NAME
  5777. *         EXIT   FILE LOCAL (NAME IN F+6) 
  5778. *         USES   X -
  5779. *                A -
  5780. *                B -
  5781. *         CALLS 
  5782.           SPACE  4,10 
  5783.  VLN      SUBR               ENTRY/EXIT 
  5784.   
  5785.           SA1    CNAME       (X1) = CURRENT NAME
  5786.           MX6    0
  5787.           BX7    X1 
  5788.           SA6    VLN.A       CLEAR ATTEMPTED FILE NAME
  5789.           SX6    B1 
  5790.           BX6    X6+X7       (X6) = 42/NAME,18/STATUS 
  5791.           SA6    F           SAVE IN FET
  5792.   
  5793. *         CHECK IF FILE ALREADY EXISTS. 
  5794.   
  5795.  VLN2     REWIND F,R         REWIND FILE TO ENSURE STATUS SET 
  5796.           STATUS X2          CHECK IF LOCAL 
  5797.           SA1    X2          (X1) = RETURN CODE 
  5798.           MX6    -12
  5799.           BX6    -X6*X1      EXTRACT STATUS 
  5800.           AX6    1           IGNORE COMPLETED BIT 
  5801.           ZR     X6,VLN6     FILE NOT LOCAL SO USE IT 
  5802.   
  5803. *         FILE NAME REQUIRES MODIFICATION.
  5804.   
  5805.           SA5    VLN.A       (X5) = ATTEMPTED FILE NAME 
  5806.           NZ     X5,VLN4     NOT FIRST ATTEMPT
  5807.           SA5    CNAME       (X5) = CURRENT FILE NAME 
  5808.   
  5809. *         EXTRACT CURRENT COUNT AND FILE NAME.
  5810.   
  5811.  VLN4     SX6    X5          (X6) = CURRENT COUNT VALUE 
  5812.           SX1    X6+B1       ((X1) = NEXT NUMBER
  5813.           BX5    X5-X6       (X5) = BASE NAME 
  5814.           BX6    X1+X5       (X6) = 42/NAME,18/NEXT NUMBER
  5815.           SA6    VLN.A       SAVE 
  5816.           RJ     CDD         CONVERT TO DECIMAL DISPLAY CODE
  5817.   
  5818. *         DETERMINE NUMBER OF CHARACTERS IN BASE FILE NAME. 
  5819.   
  5820.           MX7    6
  5821.           SB7    0
  5822.           LX6    18          POSITION NUMBERIC DISPLAY CODE 
  5823.  +        LX7    60-6        SHIFT MASK 
  5824.           SB7    B7+6        INCREMENT BIT COUNT
  5825.           BX1    X5*X7       CHECK IF END OF NAME 
  5826.           NZ     X1,*-1      NOT END OF NAME
  5827.   
  5828. *         TRY TO MERGE NAME AND NUMBER. 
  5829.   
  5830.           SB3    42          (B3) = MAXIMUM FILE NAME LENGTH (IN BITS)
  5831.  +        SB6    B2+B7       (B6) = LENGTH OF NAME + NUMBER (IN BITS) 
  5832.           LE     B6,B3,*+1   IN RANGE 
  5833.           SB7    B3-B2       TRUNCATE NAME PART 
  5834.           MX7    1
  5835.           SB6    B7-1 
  5836.           AX7    B6          (X7) = MASK FOR FILE NAME
  5837.           BX5    X5*X7       (X5) = FILE NAME 
  5838.           AX4    B7          POSITION NUMERIC PART
  5839.           BX4    -X7*X4      CLEAR SIGN EXTENSION 
  5840.           BX6    X4+X5       MERGE NAME AND NUMBER
  5841.           AX7    B2          EXTEND MASK TO TOTAL LENGTH
  5842.           BX6    X6*X7       CLEAR ANY TRAILING BLANKS
  5843.           SX7    B1 
  5844.           BX6    X6+X7       SET COMPLETE BIT 
  5845.           SA6    F           UPDATE FET + 0 
  5846.           EQ     VLN2        GOTO CHECK IF THIS FILE EXISTS 
  5847.   
  5848. *         RENAME FILE TO MAKE LOCAL.
  5849.   
  5850.  VLN6     SX2    F           (X2) = FET ADDRESS 
  5851.           SA1    X2+         (X1) = NAME TO USE 
  5852.           MX6    42 
  5853.           BX6    X1*X6       CLEAR STATUS BITS
  5854.           SA6    X2+6        SAVE LOCAL FILE NAME 
  5855.           SA1    VLN.B       (X1) = TEMP FILE NAME
  5856.           BX6    X1 
  5857.           SA6    X2          SAVE 
  5858.           RENAME X2          RENAME FILE
  5859.           SA1    VLN.B       (X1) = TEMP. FILE NAME 
  5860.           BX6    X1 
  5861.           SA6    X2          RESET FET
  5862.           EQ     VLNX        EXIT 
  5863.   
  5864.  VLN.A    BSS    1           ATTEMPTED FILE NAME
  5865.  VLN.B    VFD    42/0LZZZZZFN,18/1
  5866.           TITLE  LOG FILE PROCESSORS. 
  5867. **        LOG FILE PROCESSORS.
  5868. *         THE FOLLOWING ROUTINES MANIPULATE A LOG FILE WHICH
  5869. *         SUMMARISES ALL THE FILE TRANSFERS DURING A GIVEN
  5870. *         SESSION.
  5871. *         CLF - CLOSE LOG FILE. 
  5872. *         OLF - OPEN LOG FILE.
  5873. *         WDL - WRITE DIRECTIVE TO LOG FILE 
  5874. *         WLM - WRITE LOG FILE MESSAGE. 
  5875. *         WLT - WRITE LOG TEXT (NO PARAMETERS)
  5876.           SPACE  4,10 
  5877. **        CLF - CLOSE LOG FILE. 
  5878. *         THIS ROUTINE IS USED TO CLOSE THE LOG FILE AND SUPPRESS 
  5879. *         ANY FURTHER LOGGING MESSAGES. 
  5880. *         ENTRY  (B1) = 1 
  5881. *         EXIT   LOG FILE CLOSED
  5882. *         USES   X - 1, 6.
  5883. *                A - 1, 6.
  5884. *                B - NONE.
  5885. *         CALLS  CIO=, WLM. 
  5886.           SPACE  4,10 
  5887.  CLF      SUBR               ENTRY/EXIT 
  5888.   
  5889.           SA1    CLF.A       (X1) = FWA OF TEXT 
  5890.           RJ     WLM         WRITE LOG MESSAGE
  5891.           WRITER L,R         FLUSH BUFFER 
  5892.           SA1    X2          (X1) = FILE NAME + STATUS
  5893.           MX6    42 
  5894.           BX6    X1*X6       CLEAR STATUS TO PREVENT FURTHER LOGGING
  5895.           SA6    A1          REPLACE
  5896.           EQ     CLFX        EXIT 
  5897.   
  5898.  CLF.A    DIS    ,'CLOSING LOG FILE.' 
  5899.           SPACE  4,10 
  5900. **        OLF - OPEN LOG FILE.
  5901. *         THIS ROUTINE IS CALLED TO OPEN THE LOG FILE. ANY EXISTING 
  5902. *         LOG IS DISCARDED WITHOUT WARNING. 
  5903. *         ENTRY  (B1) = 1 
  5904. *         EXIT   LOG FILE OPENED
  5905. *         USES   X - 1, 2, 6. 
  5906. *                A - 1, 6.
  5907. *                B - NONE.
  5908. *         CALLS  CIO=, WLM. 
  5909.           SPACE  4,10 
  5910.  OLF      SUBR               ENTRY/EXIT 
  5911.   
  5912.           MX6    42 
  5913.           SX2    L           (X2) = LOG FET ADDRESS 
  5914.           SA1    X2          (X1) = LOG FILE NAME + STATUS
  5915.           BX6    X1*X6       CLEAR STATUS 
  5916.           MX1    -2 
  5917.           BX6    -X1+X6      SET REQUIRED STATUS
  5918.           SA6    A1          REPLACE
  5919.           REWIND X2,R        INITIALISE LOG FILE
  5920.           SA1    OLF.A       (X1) = MESSAGE 
  5921.           RJ     WLM         WRITE LOG MESSAGE
  5922.           EQ     OLFX        EXIT 
  5923.   
  5924.  OLF.A    DIS    ,'LOG FILE OPENED.'
  5925.           SPACE  4,10 
  5926. **        WDL - WRITE DIRECTIVE TO LOG FILE.
  5927. *         THIS ROUTINE WRITES THE GIVEN DIRECTIVES TO THE LOG 
  5928. *         FILE. 
  5929. *         ENTRY  (B1) = 1 
  5930. *         EXIT   DIRECTIVE WRITTEN TO LOG FILE IF ACTIVE
  5931. *         USES   X -
  5932. *                A -
  5933. *                B -
  5934. *         CALLS 
  5935.           SPACE  4,10 
  5936.  WDL      SUBR               ENTRY/EXIT 
  5937.   
  5938. *         GET DIRECTIVE LIMITS AND COPY TO LOG FILE.
  5939.   
  5940.           RJ     GDL         GET DIRECTIVE LIMITS 
  5941.           SX6    1R 
  5942.           SA6    WDL.A       PRESET DESTINATION ADDRESS 
  5943.           SB2    9           RESET PACKING COUNTER
  5944.           EQ     B6,B7,WDLX  NO DATA
  5945.   
  5946.  WDL2     SA1    B6          (X1) = ASCII CHARACTER 
  5947.           SB6    B6+B1       INCREMENT POINTER
  5948.           SA1    A2C+X1      CONVERT TO 6/12 DISPLAY CODE 
  5949.           MX7    -6 
  5950.           LX1    60-6 
  5951.           BX7    -X7*X1      (X7) = FIRST 6 BITS
  5952.           ZR     X7,WDL4     ONLY 6 BIT CODE
  5953.           LX6    6
  5954.           BX6    X6+X7       ADD FIRST 6 BITS TO PACKING WORD 
  5955.           SB2    B2-B1       DECREMENT PACKING COUNTER
  5956.           NZ     B2,WDL4     NOT FULL 
  5957.           SA6    A6+B1       SAVE FULL WORD 
  5958.           SB2    10          RESET PACKING COUNTER
  5959.           MX6    0           CLEAR PACKING WORD 
  5960.   
  5961.  WDL4     MX7    -6 
  5962.           LX1    6
  5963.           BX7    -X7*X1      (X7) = LAST 6 BITS 
  5964.           LX6    6
  5965.           SB2    B2-B1       DECREMENT PACKING COUNTER
  5966.           BX6    X6+X7       ADD CHARACTER
  5967.           NZ     B2,WDL6     NOT FULL WORD
  5968.           SA6    A6+B1       SAVE FULL WORD 
  5969.           SB2    10          RESET PACKING COUNTER
  5970.           MX6    0           CLEAR PACKING WORD 
  5971.   
  5972.  WDL6     LT     B6,B7,WDL2  LOOP TILL END OF DIRECTIVE 
  5973.           GT     B2,B1,WDL8  EOL IN CURRENT WORD
  5974.           LX6    6
  5975.           SX7    1R 
  5976.           BX6    X6+X7       BLANK FILL 
  5977.           SA6    A6+1        SAVE 
  5978.           SX6    0
  5979.   
  5980.  WDL8     SX1    B2+B2
  5981.           SB2    X1+B2
  5982.           SB2    B2+B2       (B2) = REMAINING BIT COUNT 
  5983.           LX6    B2 
  5984.           SA6    A6+B1       SAVE LAST WORD 
  5985.           SB6    WDL.A+1     (B6) = FWA OF TEXT 
  5986.           RJ     WLT         WRITE TEXT TO LOG FILE 
  5987.           EQ     WDLX        EXIT 
  5988.   
  5989.  WDL.A    BSS    17 
  5990.           SPACE  4,10 
  5991. **        WLM - WRITE LOG FILE MESSAGE. 
  5992. *         IF THE LOG FILE IS OPEN THEN THE SPECIFIED MESSAGE IS 
  5993. *         WRITTEN TO THE LOG FILE. THE MESSAGE MUST BE IN UPPER 
  5994. *         CASE DISPLAY CODE WITH A 6 BIT ZERO TERMINATION CODE. 
  5995. *         IF DISPLAY CODE 77B (;) APPEARS WITHIN THE GIVEN TEXT 
  5996. *         THEN THE FOLLOWING CHARACTER IS TAKEN AS A PARAMETER
  5997. *         AND THE CORRESPONDING TEXT (E.G. FILE NAME) IS INSERTED.
  5998. *         ENTRY  (B1) = 1 
  5999. *                (X1) = FIRST WORD OF TEXT
  6000. *                (A1) = ADDRESS OF FIRST WORD 
  6001. *         EXIT   MESSAGE WRITTEN TO LOG FILE IF OPENED
  6002. *         USES   X - 0, 1, 2, 3, 6, 7.
  6003. *                A - 1, 2, 6. 
  6004. *                B - 2, 3, 4, 7.
  6005. *         CALLS  WLT. 
  6006.           SPACE  4,10 
  6007.  WLM      SUBR               ENTRY/EXIT 
  6008.   
  6009. *         INITIALISE. 
  6010.   
  6011.           SB4    10 
  6012.           MX0    -6          (X0) = CHARACTER MASK
  6013.           SX6    B0          CLEAR PACKING WORD 
  6014.           SA6    WLM.A       PRESET DESTINATION ADDRESS 
  6015.           SB2    B4          (B2) = PACKING COUNTER 
  6016.           SX6    1R 
  6017.           SB3    B4-B1       (B3) = UNPACKING COUNTER 
  6018.           EQ     WLM4        GOTO GET NEXT CHARACTER
  6019.   
  6020. *         GET NEXT SOURCE WORD. 
  6021.   
  6022.  WLM2     SB2    B4+         RESET UNPACKING COUNTER
  6023.           SA1    A1+1        (X1) = NEXT SOURCE WORD
  6024.   
  6025. *         GET NEXT CHARACTER. 
  6026.   
  6027.  WLM4     LX1    6
  6028.           SB2    B2-1        DECREMENT UNPACKING COUNTER
  6029.           BX2    -X0*X1      (X2) = NEXT CHARACTER
  6030.           ZR     X2,WLM14    END OF TEXT
  6031.           SX7    X2-77B      CHECK FOR PARAMETER
  6032.           ZR     X7,WLM8     PARAMETER
  6033.           LX6    6
  6034.           BX6    X2+X6       ADD TO PACKING WORD
  6035.           SB3    B3-B1       DECREMENT PACKING COUNTER
  6036.           NZ     B3,WLM6     PACKING WORD NOT FULL
  6037.           SA6    A6+B1       SAVE FULL WORD 
  6038.           SB3    B4+         RESET PACKING COUNTER
  6039.           SX6    0           CLEAR PACKING WORD 
  6040.   
  6041.  WLM6     NZ     B2,WLM4     SOURCE WORD NOT EMPTY
  6042.           EQ     WLM2        GOTO GET NEXT SOURCE WORD
  6043.   
  6044. *         PARAMETER CODE SO GET ORDINAL.
  6045.   
  6046.  WLM8     NZ     B2,*+1      NOT END OF SOURCE WORD 
  6047.           SB2    B4          RESET UNPACKING COUNTER
  6048.           SA1    A1+B1       (X1) = NEXT SOURCE WORD
  6049.           LX1    6
  6050.           SB2    B2-1        DECREMENT UNPACKING COUNTER
  6051.           BX2    -X0*X1      (X2) = PARAMETER ORDINAL 
  6052.           ZR     X2,WLM14    END OF LINE
  6053.           SA2    WLM.B-1+X2  GET PARAMETER DESCRIPTOR 
  6054.           SB7    X2 
  6055.           AX2    18 
  6056.           JP     B7+         PROCESS
  6057.   
  6058. *         FILE NAME PARAMETER.
  6059.   
  6060.  WLM10    MX3    42 
  6061.           SA2    X2+         (X2) = FILE NAME + ....
  6062.           BX2    X2*X3       ENSURE 7 CHARACTERS
  6063.   
  6064.  WLM12    LX2    6
  6065.           BX3    -X0*X2      (X3) = NEXT CHARACTER
  6066.           ZR     X3,WLM6     END OF NAME
  6067.           LX6    6
  6068.           SB3    B3-1        DECREMENT PACKING COUNTER
  6069.           BX6    X3+X6       ADD TO PACKING WORD
  6070.           NZ     B3,WLM12    NOT FULL 
  6071.           SB3    B4          RESET PACKING COUNTER
  6072.           SA6    A6+B1       SAVE FULL WORD 
  6073.           MX6    0           CLEAR PACKING WORD 
  6074.           EQ     WLM12       LOOP TILL END OF FILE NAME 
  6075.   
  6076. *         END OF SOURCE TEXT SO FORCE EOL AND WRITE.
  6077.   
  6078.  WLM14    NE     B3,B1,WLM16 ROOM FOR EOL IN CURRENT WORD 
  6079.           SX2    1R 
  6080.           LX6    6
  6081.           BX6    X2+X6       BLANK FILL 
  6082.           SA6    A6+B1       SAVE 
  6083.           MX6    0           CLEAR PACKING WORD 
  6084.   
  6085. *         LEFT JUSTIFY TO FORCE EOL.
  6086.   
  6087.  WLM16    SB2    B3+B3       *2 
  6088.           SB2    B2+B3       *3 
  6089.           SB2    B2+B2       (B2) * 6 * REMAINING CHARACTER COUNT 
  6090.           LX6    B2          LEFT JUSTIFY LAST WORD 
  6091.           SA6    A6+1        SAVE 
  6092.           SB6    WLM.A+1     (B6) = FWA OF TEXT 
  6093.           RJ     WLT         WRITE TEXT TO LOG FILE 
  6094.           EQ     WLMX        EXIT 
  6095.   
  6096.  WLM.A    BSS    11          MESSAGE BUFFER 
  6097.  WLM.B    BSS    0           PARAMETER DESCRIPTOR TABLE 
  6098.           VFD    24/0,18/CNAME,18/WLM10   A - CURRENT FILE NAME 
  6099.           VFD    24/0,18/F+10B,18/WLM10   B - MODIFIED FILE NAME
  6100.           VFD    24/0,18/F+6,18/WLM10     C - LOCAL FILE NAME 
  6101.           VFD    24/0,18/ILCHAR,18/WLM10  D - ILLEGAL CHARACTER 
  6102.           SPACE  4,10 
  6103. **        WLT - WRITE LOG TEXT. 
  6104. *         THIS ROUTINE WRITES THE GIVEN 6/12 PACKED DISPLAY 
  6105. *         CODE TO THE LOG FILE. 
  6106. *         ENTRY  (B1) = 1 
  6107. *                (B6) = FWA OF TEXT 
  6108. *         EXIT   TEXT WRITTEN TO LOG FILE (IF ACTIVE) 
  6109. *         USES   X - 1, 2, 6. 
  6110. *                A - 1, 2.
  6111. *                B - NONE.
  6112. *         CALLS  SYS=, WTC=, WTO=.
  6113.           SPACE  4,10 
  6114.  WLT      SUBR               ENTRY/EXIT 
  6115.   
  6116.           CLOCK  WLT.A       GET MESSAGE TIME 
  6117.   
  6118. *         COPY TEXT TO LOG BUFFER.
  6119.   
  6120.           SA2    LOGPTR      (X2) = LOG POINTER 
  6121.           SB4    X2          (B4) = LIMIT 
  6122.           AX2    18 
  6123.           SB3    X2          (B3) = IN
  6124.           AX2    18 
  6125.           SB2    X2          (B2) = OUT 
  6126.           AX2    18          (X2) = LINE COUNT
  6127.   
  6128. *         SAVE MESSAGE TIME.
  6129.   
  6130.           SA1    WLT.A       (X1) = TIME
  6131.           BX6    X1 
  6132.           MX3    -12
  6133.           SA1    B6-1        PRESET SOURCE ADDRESS
  6134.   
  6135. *         COPY LINE.
  6136.   
  6137.  WLT2     SA6    LOGBUF+B3   SAVE 
  6138.           SB3    B3+B1       INCREMENT IN 
  6139.           BX6    -X3*X6      CHECK FOR EOL
  6140.  +        LT     B3,B4,*+1   NO WRAP
  6141.           SB3    0           SET IN = FIRST 
  6142.           ZR     X6,WLT4     END OF LINE
  6143.           SA1    A1+B1       (X1) = NEXT SOURCE WORD
  6144.           BX6    X1 
  6145.           EQ     WLT2 
  6146.   
  6147. *         END OF LINE SO UPDATE POINTER.
  6148.   
  6149.  WLT4     SX6    X2+1        INCREMENT
  6150.           SX2    X6-8-1      COMPARE WITH MAXIMUM 
  6151.           NG     X2,WLT8     NOT MAXIMUM
  6152.   
  6153. *         ADVANCE OUT FOR ONE COMMAND.
  6154.   
  6155.  WLT6     SA1    LOGBUF+B2   (X1) = SOURCE WORD 
  6156.           SB2    B2+B1       INCREMENT POINTER
  6157.           BX2    -X3*X1      CHECK FOR EOL
  6158.           NZ     X2,WLT6     LOOP TILL EOL
  6159.           SX6    X6-1        (X6) = MAX LINE COUNT
  6160.   
  6161.  WLT8     LX6    18 
  6162.           SX7    B2+
  6163.           BX6    X6+X7       (X6) = 6/COUNT,18/IN 
  6164.           LX6    18 
  6165.           SX7    B3 
  6166.           BX6    X6+X7       ADD IN 
  6167.           LX6    18 
  6168.           SX7    B4 
  6169.           BX6    X6+X7       ADD LIMIT
  6170.           SA6    A2          REPLACE POINTER
  6171.   
  6172. *         CHECK IF LOG FILE ACTIVE. 
  6173.   
  6174.           SA2    L           (X2) = LOG FILE NAME AND STATUS
  6175.           SX2    X2+         (X2) = STATUS
  6176.           ZR     X2,WLTX     LOG FILE NOT ACTIVE
  6177.   
  6178. *         WRITE TEXT TO LOG FILE. 
  6179.   
  6180.           SA1    WLT.A       (X1) = MESSAGE TIME
  6181.           BX6    X1 
  6182.           WRITEO L           WRITE TIME 
  6183.           WRITEC X2,B6       WRITE TEXT 
  6184.           EQ     WLTX        EXIT 
  6185.   
  6186.  WLT.A    BSS    1           CURRENT TIME 
  6187.           TITLE  KERMIT DIRECTIVE PROCESSORS. 
  6188. ***       KERMIT DIRECTIVE PROCESSORS.
  6189. *         KERMIT DIRECTIVES MAY BE ENTERED VIA FOUR ROUTES:-
  6190. *         1.  FROM THE KERMIT COMMAND ITSELF
  6191. *         2.  FROM A SPECIFIED INPUT FILE 
  6192. *         3.  INTERACTIVELY 
  6193. *         4.  FROM A REMOTE MICRO IN 'K' PACKETS
  6194.           SPACE  4,10 
  6195. ***       INPUT COMMAND FORMAT. 
  6196. *         WHEN KERMIT IS INITIALISED THERE IS THE OPTION TO ENTER 
  6197. *         COMMANDS. THESE COMMANDS MAY BE READ FROM INPUT OR FROM 
  6198. *         A SPECIFIED FILE. ONLY ONE COMMAND PER LINE MAY BE
  6199. *         ENTERED. KEYWORDS MAY BE SEPARATED BY BLANKS, COMMAS
  6200. *         OR UNDERLINES AND MUST NOT BE ABBREVIATED. THE VALID
  6201. *         COMMAND AND OPTIONS ARE SPECIFIED BELOW.
  6202. *           HELP  [PARAM]          (GENERAL OR SPECIFIC HELP) 
  6203. *           SET 
  6204. *                  CODE 
  6205. *                         ASCII    (SET 6 IN 12 DISPLAY CODE) 
  6206. *                         ASCII8   (SET 8 IN 12 ASCII)
  6207. *                         BINARY   (SET 7.5 IN 60 ASCII)
  6208. *                         DIS64    (SET 6 BIT DISPLAY CODE) 
  6209. *                         HEX      (SET HEX PAIR CODE - FORTRAN '40Z2') 
  6210. *                  DEBUG
  6211. *                         OFF      (DESELECT DEBUG LOGGING) 
  6212. *                         ON       (SELECT DEBUG LOGGING) 
  6213. *                  DELAY
  6214. *                         N        (SET DELAY TIME TO 'N' SECONDS)
  6215. *                  MODE 
  6216. *                         LOCAL    (LEAVE FILE LOCAL) 
  6217. *                         SAVE     (SAVE FILES - DO NOT REPLACE)
  6218. *                         REPLACE  (REPLACE FILES)
  6219. *                  WINDOW 
  6220. *                         OFF      (DESELECT WINDOWING OPTION)
  6221. *                         ON       (SELECT DEFAULT WINDOW SIZE) 
  6222. *                         SIZE N   (SET WINDOW SIZE TO 'N'  0<N<32 )
  6223. *           SEND   LFN  [NAME]     (TRANSMIT FILE TO REMOTE MICRO)
  6224. *           RECEIVE  [NAME]        (WAIT FOR INCOMMING FILE FROM MICRO) 
  6225. *           SERVER                 (ENTER SERVER MODE - RECOMMENDED)
  6226. *           VERSION                (DISPLAY NOS KERMIT VERSION NUMBER)
  6227. *           EXIT                   (EXIT KERMIT WITHOUT TRANSFER) 
  6228. *         WHEN THE INPUT FILE IS ASSIGNED TO A TERMINAL THEN A
  6229. *         '?' MAY BE ENTERED TO OBTAIN HELP. NOTE THAT THE '?'
  6230. *         SHOULD BE SEPARATED FROM ANY PRECEEDING TEXT BY AT
  6231. *         LEAST ONE SPACE.
  6232. *         IT IS ALSO POSSIBLE TO ENTER ONE OR MORE OF THE ABOVE 
  6233. *         DIRECTIVES ON THE KERMIT CONTROL STATEMENT. EACH
  6234. *         KERMIT DIRECTIVE SHOULD BE SEPARATED FROM THE NEXT BY 
  6235. *         A '/'. WHEN DIRECTIVES ARE ENTERED BOTH ON THE CONTROL
  6236. *         STATEMENT AND ALSO FROM A LOCAL DIRECTIVES FILE THEN
  6237. *         THOSE ON THE FILE ARE PROCESSED FIRST. WHEN DIRECTIVES
  6238. *         ARE ENTERED BOTH ON THE CONTROL STATEMENT AND ALSO
  6239. *         FROM 'INPUT' THEN THOSE ON THE CONTROL STATEMENT ARE
  6240. *         PROCESSED FIRST.
  6241.           SPACE  4,10 
  6242. **        DIRECTIVE PROCESSORS. 
  6243. *         THE FOLLOWING ROUTINES PROCESS KERMIT DIRECTIVES AS FOLLOWS:- 
  6244. *         GDL - GET DIRECTIVE LIMITS
  6245. *         GPL - GET PARAMETER LIMITS
  6246. *         GDW - GET DIRECTIVE WORD
  6247. *         LND - LOCATE NEXT DIRECTIVE 
  6248. *         PCD - PROCESS COMMAND DIRECTIVES
  6249. *         PID - PROCESS INPUT DIRECTIVES
  6250. *         PHM - PRINT HELP MESSAGE
  6251. *         PID - PROCESS INPUT DIRECTIVES
  6252. *         SVT - SEARCH VALIDATION TABLE 
  6253. *         UDL - UNPACK DIRECTIVE LINE 
  6254.           SPACE  4,10 
  6255. **        PCD - PROCESS COMMAND DIRECTIVES. 
  6256. *         THIS ROUTINE SCANS THE KERMIT COMMAND LINE FOR ANY
  6257. *         DIRECTIVES. IF FOUND THESE ARE PROCESSED. IF AN 
  6258. *         ERROR IS FOUND THEN INTERACTIVE MODE IS ENTERED.
  6259. *         ENTRY  (B1) = 1 
  6260. *         EXIT   (X1) = 0 IF NO ERRORS
  6261. *         USES   X - 1, 2, 3, 6.
  6262. *                A - 1, 2, 6. 
  6263. *                B - 2, 3, 4, 6, 7. 
  6264. *         CALLS  GDW, SVT.
  6265.           SPACE  4,10 
  6266.  PCD      SUBR               ENTRY/EXIT 
  6267.   
  6268. *         SEARCH FOR END OF COMMAND.
  6269.   
  6270.           SB3    80          (B3) = MAX. COMMAND LENGTH 
  6271.           SA1    CCDR        (X1) = FIRST PACKED WORD 
  6272.           MX3    -6          (X3) = CHARACTER MASK
  6273.           SB2    10          (B2) = UNPACKING COUNTER 
  6274.           SB4    B2 
  6275.   
  6276. *         SEARCH FOR FINAL DELIMITER. 
  6277.   
  6278.  PCD2     LX1    6
  6279.           SB2    B2-B1       DECREMENT UNPACKING COUNTER
  6280.           BX2    -X3*X1      (X2) = CHARACTER 
  6281.           SB3    B3-B1       DECREMENT INSTRUCTION LENGTH 
  6282.  +        NZ     B2,*+1      NOT END OF SOURCE WORD 
  6283.           SB2    B4          RESET UNPACKING COUNTER
  6284.           SA1    A1+B1       (X1) = NEXT SOURCE WORD
  6285.           SX6    X2-1R.      CHECK FOR TERMINATOR 
  6286.           ZR     X6,PCD4     END
  6287.           SX6    X2-1R) 
  6288.           NZ     X6,PCD2     LOOP TILL TERMINATOR FOUND 
  6289.   
  6290. *         PROCESS REMAINDER OF LINE.
  6291.   
  6292.  PCD4     SB6    LINE        (B6) = FWA OF LINE BUFFER
  6293.           SB7    B6 
  6294.           MX3    -6 
  6295.   
  6296.  PCD6     NZ     B2,*+1 
  6297.           SB2    B4          RESET UNPACKING COUNTER
  6298.           SA1    A1+B1       (X1) = NEXT PACKED WORD
  6299.           LX1    6
  6300.           BX2    -X3*X1      (X2) = NEXT 6 BIT CODE 
  6301.           ZR     X2,PCD8     END OF COMMAND (COLON ILLEGAL) 
  6302.           SB2    B2-1        DECREMENT UNPACKING COUNTER
  6303.           SA2    X2+C2A      CONVERT TO ASCII 
  6304.           SX6    X2 
  6305.           SB3    B3-B1       DECREMENT COMMAND LENGTH 
  6306.           SB7    B7+B1       INCREMENT DESTINATION ADDRESS
  6307.           SA6    B7-B1       SAVE ASCII CHARACTER 
  6308.           NZ     B3,PCD6     LOOP TILL END OF COMMAND 
  6309.  PCD8     SX6    B6          (X6) = FWA OF COMMAND
  6310.           SX7    B7          (X7) = LWA + 1 
  6311.           LX6    18 
  6312.           BX6    X6+X7       (X6) = 24/0,18/FWA,18/LWA+1
  6313.           SA6    LINEP       SAVE 
  6314.           RJ     GDW         GET DIRECTIVE WORD 
  6315.           SX1    0           ASSUME NO INPUT
  6316.           ZR     X2,PCDX     NO INPUT SO EXIT 
  6317.           RJ     SVT         SEARCH VALIDATION TABLE
  6318.           EQ     PCDX        EXIT 
  6319.           SPACE  4,10 
  6320. **        PHM - PRINT HELP MESSAGE. 
  6321. *         THIS ROUTINE COPIES THE GIVEN HELP MESSAGE TO THE 
  6322. *         OUTPUT FILE. NOTE THAT THE MESSAGE IS WRITTEN AS
  6323. *         ASCII.
  6324. *         ENTRY  (B1) = 1 
  6325. *                (X1) = MESSAGE ORDINAL 
  6326. *         EXIT   MESSAGE PRINTED
  6327. *         USES   X - 1, 2, 3, 6, 7. 
  6328. *                A - 1, 2, 3, 6.
  6329. *                B - 2, 3, 6, 7.
  6330. *         CALLS  CIO=, GDL, RDC=, WTC=. 
  6331.           SPACE  4,10 
  6332.  PHM      SUBR               ENTRY/EXIT 
  6333.   
  6334. *         RESET HELP FET. 
  6335.   
  6336.           SA2    ZZZZHLP+1   (X2) = FIRST + ....
  6337.           SX6    X2          (X6) = FIRST 
  6338.           SA6    A2+B1       SET IN = FIRST 
  6339.           SA6    A6+1        SET OUT = FIRST
  6340.   
  6341. *         CHECK FOR ERROR MESSAGE.
  6342.   
  6343.           PL     X1,PHM40    NO ERROR MESSAGE 
  6344.   
  6345. *         MOVE ERROR MESSAGE INTO FILE BUFFER.
  6346.   
  6347.           SA1    PHM.A+PHM.AL+X1 (X1) = MESSAGE ATTRIBUTE WORD
  6348.           SB7    X1 
  6349.           AX1    18 
  6350.           JP     B7+         PROCESS
  6351.   
  6352. *         LOCATE AND COPY COMMAND TO OUTPUT BUFFER. 
  6353.   
  6354.  PHM2     RJ     GDL         GET DIRECTIVE LIMITS 
  6355.           SA3    PHM.H       (X3) = FIRST WORD OF LINE
  6356.           BX6    X3          COPY TO HELP BUFFER
  6357.           SA3    A3+B1
  6358.           SA6    CBUF        SAVE WORD 1
  6359.           BX6    X3 
  6360.           SA3    A3+B1
  6361.           SA6    A6+B1       SAVE WORD 2
  6362.           SB2    6           RESET PACKING COUNTER
  6363.           BX6    X3          (X6) = WORD 3
  6364.           SX2    77B         (X2) = CHARACTER MASK
  6365.   
  6366. *         PACK STRING BUFFER BETWEEN LIMITS.
  6367.   
  6368.           GE     B6,B7,PHM10 ILLEGAL POINTER
  6369.   
  6370.  PHM4     SA3    B6          (X3) = NEXT ASCII CHARACTER
  6371.           SB6    B6+B1       INCREMENT POINTER
  6372.           SA3    X3+A2C      CONVERT TO 6/12 FORMAT 
  6373.           SX3    X3 
  6374.           BX7    X3 
  6375.           BX3    X2*X3       (X3) = LOW 6 BITS (IF 12 BIT CODE) 
  6376.           AX7    6           (X7) = TOP 6 BITS (IF 12 BIT CODE) 
  6377.           ZR     X7,PHM6     ONLY 6 BIT CODE
  6378.           LX6    6
  6379.           BX6    X6+X7       ADD 74 OR 76 CODE TO PACKING WORD
  6380.           SB2    B2-B1       DECREMENT PACKING COUNTER
  6381.           NZ     B2,PHM6     PACKING WORD NOT FULL
  6382.           SA6    A6+B1       SAVE FULL WORD 
  6383.           SB2    10          RESET PACKING COUNTER
  6384.           SX6    0           CLEAR PACKING WORD 
  6385.   
  6386.  PHM6     LX6    6
  6387.           SB2    B2-1        DECREMENT PACKING COUNTER
  6388.           BX6    X3+X6       ADD LOW 6 BITS 
  6389.           NZ     B2,PHM8     PACKING WORD NOT FULL
  6390.           SA6    A6+1        SAVE FULL WORD 
  6391.           SB2    10          RESET PACKING COUNTER
  6392.           SX6    0           CLEAR PACKING WORD 
  6393.   
  6394.  PHM8     LT     B6,B7,PHM4  LOOP TILL END OF DIRECTIVE 
  6395.   
  6396. *         COPY REST OF ERROR MESSAGE. 
  6397.   
  6398.  PHM10    SA3    X1          (X3) = PACKED DISPLAY CODE 
  6399.           SB3    10          RESET UNPACKING COUNTER
  6400.           SX1    X1+B1       INCREMENT CURRENT ADDRESS
  6401.   
  6402.  PHM12    LX3    6
  6403.           SB3    B3-1        DECREMENT UNPACKING COUNTER
  6404.           BX7    X2*X3       (X7) = NEXT CHARACTER
  6405.           ZR     X7,PHM16    END OF SOURCE
  6406.           LX6    6
  6407.           BX6    X6+X7       ADD CHARACTER TO PACKING WORD
  6408.           SB2    B2-1        DECREMENT PACKING COUNTER
  6409.           NZ     B2,PHM14    PACKING WORD NOT FULL
  6410.           SA6    A6+B1       SAVE FULL WORD 
  6411.           SB2    10          RESET PACKING COUNTER
  6412.           MX6    0           CLEAR PACKING WORD 
  6413.   
  6414.  PHM14    NZ     B3,PHM12    NOT END OF SOURCE WORD 
  6415.           EQ     PHM10       GOTO GET NEXT WORD 
  6416.   
  6417. *         END OF SOURCE SO FORCE EOL. 
  6418.   
  6419.  PHM16    GT     B2,B1,PHM18 NOT SINGLE BLANK 
  6420.           SX7    1R 
  6421.           LX6    6
  6422.           BX6    X6+X7       ADD BLANK
  6423.           SA6    A6+B1       SAVE FULL WORD 
  6424.           MX6    0
  6425.   
  6426. *         LEFT JUSTIFY TO FORCE EOL.
  6427.   
  6428.  PHM18    SB3    B2+B2
  6429.           SB2    B3+B2
  6430.           SB2    B2+B2       (B2) = UNUSED BIT COUNT
  6431.           LX6    B2          LEFT JUSTIFY LAST WORD 
  6432.           SA6    A6+1        SAVE 
  6433.           SX1    B1          SET REQUIRED HELP MESSAGE
  6434.           SA1    HELPCDE     (X1) = LATEST HELP CODE
  6435.           EQ     PHM38       GOTO OUTPUT TEXT 
  6436.   
  6437. *         OUTPUT GIVEN MESSAGE. 
  6438.   
  6439.  PHM20    SB7    X1          (B7) = WORD COUNT
  6440.           AX1    18 
  6441.           SA1    X1          (X1) = FIRST WORD
  6442.           BX6    X1 
  6443.           SA6    CBUF        SAVE FIRST WORD
  6444.           SX1    0
  6445.           SB7    B7-1        DECREMENT WORD COUNT 
  6446.           EQ     B7,B1,PHM38 ONLY ONE WORD
  6447.   
  6448.  +        SA1    A1+B1
  6449.           SB7    B7-B1       DECREMENT WORD COUNT 
  6450.           BX6    X1 
  6451.           SA6    A6+B1       SAVE 
  6452.           NZ     B7,*-1      LOOP TILL END OF TEXT
  6453.           SX1    0           FORCE NULL MESSAGE 
  6454.           EQ     PHM38       GOTO PRINT MESSAGE 
  6455.   
  6456. *         STATUS REQUEST. 
  6457.   
  6458.  PHM22    SX3    7777B       (X3) = EOL MASK
  6459.           SA1    PHM.J       (X1) = FIRST WORD OF STATUS MESSAGE
  6460.           BX6    X1 
  6461.           SA6    CBUF        PRESET DESTINATION ADDRESS 
  6462.   
  6463. *         PROCESS ACCORDING TO ATTRIBUTE WORD.
  6464.   
  6465.  PHM24    SA1    A1+B1       (X1) = NEXT WORD 
  6466.           ZR     X1,PHM34    END OF TEXT
  6467.           SB7    X1          (B7) = PROCESS ADDRESS 
  6468.           JP     B7+         PROCESS
  6469.   
  6470. *         OUTPUT TEXT.
  6471.   
  6472.  PHM26    AX1    18 
  6473.           SA2    X1          (X2) = FIRST WORD
  6474.           AX1    18 
  6475.           SB7    X1          (B7) = WORD COUNT
  6476.   
  6477.  +        BX6    X2          (X6) = DATA WORD 
  6478.           SB7    B7-B1       DECREMENT WORD COUNT 
  6479.           SA6    A6+B1       SAVE 
  6480.           SA2    A2+B1       LOAD NEXT WORD 
  6481.           NZ     B7,*-1      LOOP TILL END OF TEXT
  6482.           EQ     PHM24       GOTO READ NEXT ATTRIBUTE WORD
  6483.   
  6484. *         REGISTER LOOK-UP. 
  6485.   
  6486.  PHM28    AX1    18 
  6487.           SA2    X1+         (X2) = VALUE OF VARIABLE 
  6488.           AX1    18 
  6489.           SB7    X1+         (B7) = ADDRESS OF TABLE
  6490.           AX1    18          (X1) = LENGTH OF TABLE - 1 
  6491.           IX6    X2-X1       CHECK RANGE
  6492.  +        NG     X6,*+1      VALID
  6493.           SX2    X1+         FORCE LAST ENTRY 
  6494.           SA2    X2+B7       (X2) = REQUIRED TEXT 
  6495.           BX6    X2 
  6496.           SA6    A6+1        SAVE 
  6497.           EQ     PHM24       GOTO OUTPUT TEXT 
  6498.   
  6499. *         OUTPUT NUMERIC VALUE. 
  6500.   
  6501.  PHM30    AX1    18          (X1) = ADDRESS OF VARIABLE 
  6502.           SA2    X1+         (X2) = VALUE 
  6503.           BX1    X2 
  6504.           RJ     CDD         CONVERT TO DECIMAL DISPLAY 
  6505.           BX6    X4 
  6506.           LX6    60-6        FORCE LEADING BLANK
  6507.           MX4    -12
  6508.           BX6    X4*X6       FORCE EOL
  6509.           SX3    7777B       RESTORE MASK 
  6510.           SA6    A6+1        SAVE 
  6511.           EQ     PHM24       GOTO OUTPUT TEXT 
  6512.   
  6513. *         PROCESS WINDOW OPTION.
  6514.   
  6515.  PHM32    SA2    RWSIZE      (X2) = REQUESTED WINDOW SIZE 
  6516.           SA4    PHM.J2+1    ASSUME 'ON'
  6517.  +        NZ     X2,*+1      ASSUMPTION CORRECT 
  6518.           SA4    A4-1        USE 'OFF'
  6519.           BX6    X4 
  6520.           SA6    A6+B1       SAVE 
  6521.           NZ     X2,PHM24    GOTO PRINT SIZE
  6522.           SA1    A1+2        SKIP WINDOW SIZE 
  6523.           EQ     PHM24       GOTO NEXT TEXT 
  6524.   
  6525. *         OUTPUT LOG FILE.
  6526.   
  6527.  PHM34    SA1    LOGPTR      (X1) = LOG BUFFER POINTER
  6528.           SB4    X1+         (B4) = LIMIT 
  6529.           AX1    18 
  6530.           SB3    X1          (B3) = IN
  6531.           AX1    18 
  6532.           SB2    X1          (B2) = OUT 
  6533.   
  6534. *         COPY TO OUTPUT BUFFER.
  6535.   
  6536.  PHM36    SA1    LOGBUF+B2   (X1) = NEXT TEXT 
  6537.           BX6    X1 
  6538.           SA6    A6+B1       SAVE 
  6539.  +        SB2    B2+B1       INCREMENT OUT
  6540.           LT     B2,B4,*+1   NO WRAP AROUND 
  6541.           SB2    B0          SET OUT = FIRST
  6542.           NE     B2,B3,PHM36 LOOP TILL END OF BUFFER
  6543.           SX1    0           FORCE NULL MESSAGE 
  6544.   
  6545. *         LOAD FILE BUFFER AND COPY MESSAGE.
  6546.   
  6547.  PHM38    SX6    A6+1        (X6) = LWA + 1 
  6548.           SA6    ZZZZHLP+2   SET IN = LWA + 1 
  6549.   
  6550.  PHM40    MX6    -2 
  6551.           BX6    -X6*X1      (X6) = POSITION
  6552.           AX1    2           (X1) = WORD OFFSET 
  6553.           SX2    ZZZZHLP     (X2) = HELP FET ADDRESS
  6554.           SA1    HLPTABL+X1  (X1) = POINTER WORD
  6555.           BX7    X6 
  6556.           LX7    4
  6557.           IX7    X7-X6       (X7) = 15 * POSITION 
  6558.           SB7    X7+15
  6559.           LX1    B7          RIGHT JUSTIFY RANDOM SECTOR ADDRESS
  6560.           MX6    -15
  6561.           BX6    -X6*X1      (X6) = RANDOM SECTOR ADDRESS OF MESSAGE
  6562.           SA6    X2+6        SAVE IN FET
  6563.           READ   X2          LOAD INPUT BUFFER
  6564.   
  6565. *         COPY TEXT TO OUTPUT.
  6566.   
  6567.  PHM42    READC  ZZZZHLP,PHM.B+1,20 
  6568.           NZ     X1,PHM44    END OF TEXT
  6569.           WRITEC O,PHM.B
  6570.           EQ     PHM42       LOOP TILL END OF TEXT
  6571.   
  6572. *         FLUSH OUTPUT BUFFER AND EXIT. 
  6573.   
  6574.  PHM44    WRITER O,R
  6575.           EQ     PHMX        EXIT 
  6576.   
  6577.  PHM.A    BSS    0           ERROR MESSAGE DESCRIPTOR TABLE 
  6578.           VFD    6/0,18/0,18/0,18/PHM22  STATUS REQUEST 
  6579.           VFD    6/0,18/PHM.I,18/PHM.IL,18/PHM20  EMPTY TAKE FILE 
  6580.           VFD    6/0,18/PHM.G,18/PHM.GL,18/PHM20  VERSION REQUEST 
  6581.           VFD    6/0,18/0,18/PHM.C,18/PHM2  NUMERIC RANGE ERROR 
  6582.           VFD    6/0,18/0,18/PHM.D,18/PHM2  COMMAND INCOMPLETE
  6583.           VFD    6/0,18/0,18/PHM.E,18/PHM2  COMMAND AMBIGUOUS 
  6584.           VFD    6/0,18/0,18/PHM.F,18/PHM2  COMMAND ILLEGAL 
  6585.  PHM.AL   EQU    *-PHM.A
  6586.  PHM.B    VFD    12/0011B,48/6H 
  6587.           BSS    20 
  6588.  PHM.C    BSS    0
  6589.           CON    10H < ^C^O^N^,10HT^A^I^N^S ,10H^A^N ^I^L^      ! 
  6590.           CON    10HL^E^G^A^L ,10H^N^U^M^E^R,10H^I^C ^V^A^      ! 
  6591.           CON    6LL^U^E. 
  6592.  PHM.D    CON    10H < ^I^S ^I,10H^N^C^O^M^P,10H^L^E^T^E. ,0
  6593.  PHM.E    CON    10H < ^I^S ^A,10H^M^B^I^G^U,8L^O^U^S.
  6594.  PHM.F    CON    10H < ^I^S ^I,10H^L^L^E^G^A,4L^L.
  6595.  PHM.G    BSS    0           VERSION TEXT 
  6596.           CON    2L 
  6597.           DIS    ,'               NOS KERMIT' 
  6598.           DIS    ,'               ==========' 
  6599.           CON    2L 
  6600.           DIS    ,'         VERSION        "VERSION"' 
  6601.           DIS    ,'         AUTHOR         P. JARVIS' 
  6602.           DIS    ,'         DOCUMENTATION  A. BALLARD'
  6603.           DIS    ,'         DATE          "DATE"' 
  6604.           DIS    ,'         TIME          "TIME"' 
  6605.           CON    2L 
  6606.  PHM.GL   EQU    *-PHM.G
  6607.  PHM.H    CON    10H T^H^E ^C^,10HO^M^M^A^N^,4RD >
  6608.  PHM.I    BSS    0           MISSING OR EMPTY TAKE FILE 
  6609.           CON    2L 
  6610.           DIS    ,'E^M^P^T^Y ^O^R ^M^I^S^S^I^N^G TAKE ^F^I^L^E.'
  6611.           CON    2L 
  6612.  PHM.IL   EQU    *-PHM.I
  6613.  PHM.J    BSS    0           STATUS TEXT
  6614.           CON    2L 
  6615.           VFD    6/0,18/PHM.J1L,18/PHM.J1,18/PHM26
  6616.           VFD    6/2,18/PHM.J2,18/DEBUG,18/PHM28
  6617.           VFD    6/0,18/PHM.J3L,18/PHM.J3,18/PHM26
  6618.           VFD    6/3,18/PHM.J4,18/PFFLAG,18/PHM28 
  6619.           VFD    6/0,18/PHM.J5L,18/PHM.J5,18/PHM26
  6620.           VFD    6/5,18/PHM.J6,18/FFORM,18/PHM28
  6621.           VFD    6/0,18/PHM.J7L,18/PHM.J7,18/PHM26
  6622.           VFD    6/0,18/0,18/DELAY,18/PHM30 
  6623.           VFD    6/0,18/PHM.J8L,18/PHM.J8,18/PHM26
  6624.           VFD    6/0,18/0,18/0,18/PHM32 
  6625.           VFD    6/0,18/PHM.J9L,18/PHM.J9,18/PHM26
  6626.           VFD    6/0,18/0,18/RWSIZE,18/PHM30
  6627.           VFD    6/0,18/PHM.JZL,18/PHM.JZ,18/PHM26
  6628.           CON    0
  6629.  PHM.J1   BSS    0
  6630.           DIS    ,'    CURRENT STATUS'
  6631.           DIS    ,'    =============='
  6632.           DIS    ,'  '
  6633.           CON    10HDEBUG STAT,10HUS       -
  6634.  PHM.J1L  EQU    *-PHM.J1 
  6635.  PHM.J2   BSS    0           DEBUG TEXT TABLE 
  6636.           CON    4L OFF 
  6637.           CON    4L ON
  6638.           CON    2L ? 
  6639.  PHM.J3   BSS    0
  6640.           CON    10HFILE MODE ,10H         -
  6641.  PHM.J3L  EQU    *-PHM.J3 
  6642.  PHM.J4   BSS    0           FILE MODE TABLE
  6643.           CON    6L LOCAL 
  6644.           CON    6L SAVE
  6645.           CON    8L REPLACE 
  6646.           CON    2L ? 
  6647.  PHM.J5   BSS    0
  6648.           CON    10HFILE CODE ,10H         -
  6649.  PHM.J5L  EQU    *-PHM.J5 
  6650.  PHM.J6   BSS    0           FILE CODE BRANCH TABLE 
  6651.           CON    6L DIS64 
  6652.           CON    6L ASCII 
  6653.           CON    8L ASCII8
  6654.           CON    4L HEX 
  6655.           CON    8L BINARY
  6656.           CON    2L ? 
  6657.  PHM.J7   BSS    0
  6658.           CON    10HDELAY TIME,10H (SECS)  -
  6659.  PHM.J7L  EQU    *-PHM.J7 
  6660.  PHM.J8   BSS    0
  6661.           CON    10HWINDOWING ,10HOPTION   -
  6662.  PHM.J8L  EQU    *-PHM.J8 
  6663.  PHM.J9   BSS    0
  6664.           CON    10HWINDOW SIZ,10HE        -
  6665.  PHM.J9L  EQU    *-PHM.J9 
  6666.  PHM.JZ   BSS    0
  6667.           CON    2L 
  6668.           DIS    ,'LAST LINES OF LOG FILE ARE-' 
  6669.           CON    2L 
  6670.  PHM.JZL  EQU    *-PHM.JZ 
  6671.           SPACE  4,10 
  6672. **        PID - PROCESS INPUT DIRECTIVES. 
  6673. *         THIS ROUTINE PROCESSES DIRECTIVES ENTERED EITHER
  6674. *         ON THE KERMIT COMMAND OR FROM AN INPUT FILE. IF THE 
  6675. *         INPUT IS FROM A FILE ASSIGNED TO THE TERMINAL THEN
  6676. *         AN INTERACTIVE DIALOGUE IS ENTERED. 
  6677. *         ENTRY  (B1) = 1 
  6678. *         EXIT   (X1) = EXIT CODE 
  6679. *                        0 - SERVER 
  6680. *                        1 - SEND 
  6681. *                        2 - RECEIVE
  6682. *                        3 - EXIT 
  6683. *         USES   X - 0, 1, 2, 6.
  6684. *                A - 1, 2, 6. 
  6685. *                B - NONE.
  6686. *         CALLS  CIO=, GDW, PCD, PHM, RDC=, SVT, UDL, WTW=. 
  6687.           SPACE  4,10 
  6688.  PID      SUBR               ENTRY/EXIT 
  6689.   
  6690. *         CHECK FOR NO INPUT. 
  6691.   
  6692.           SA1    C           (X1) = INPUT FET STATUS WORD 
  6693.           MX6    42 
  6694.           BX1    X1*X6       EXTRACT FILE NAME
  6695.           ZR     X1,PIDX     NO INPUT SO EXIT 
  6696.   
  6697. *         CHECK IF INPUT ASSIGNED TO THE TERMINAL.
  6698.   
  6699.  PID2     REWIND C,R         ENSURE DEVICE TYPE FIELD IS SET
  6700.           SA1    X2+B1       (X1) = FIRST + TYPE CODE 
  6701.           MX6    -11
  6702.           LX1    12 
  6703.           BX6    -X6*X1      (X6) = DEVICE CODE 
  6704.           ZR     X6,PID16    DEVICE NOT ASSIGNED
  6705.           SX0    X6-2RTT     CHECK IF ASSIGNED TO TERMINAL
  6706.           ZR     X0,PID4     ASSIGNED TO THE TERMINAL 
  6707.           READ   X2,R        LOAD BUFFER
  6708.           SA1    X2          (X1) = FET STATUS WORD 
  6709.           LX1    59-9        CHECK FOR EMPTY FILE 
  6710.           PL     X1,PID8     DATA FOUND 
  6711.           SX1    -6          FORCE ERROR MESSAGE
  6712.           EQ     PID18       GOTO PRINT MESSAGE 
  6713.   
  6714. *         INPUT FILE ASSIGNED TO TERMINAL SO DISABLE SYSTEM PROMPT. 
  6715.   
  6716.  PID4     PROMPT OFF         TURN OFF PROMPT
  6717.           RJ     PCD         PROCESS COMMAND DIRECTIVES (IF ANY)
  6718.           NZ     X1,PID18    HELP TEXT REQUESTED
  6719.           NG     X1,PID12    TERMINATED COMMAND LIST
  6720.   
  6721. *         ISSUE INPUT PROMPT. 
  6722.   
  6723.  PID6     WRITEW O,PID.A,3
  6724.           WRITER X2,R 
  6725.           READ   C           LOAD BUFFER
  6726.   
  6727. *         PROCESS INPUT.
  6728.   
  6729.  PID8     READC  C,PID.B     READ LINE
  6730.           ZR     X1,PID10    DATA AVAILABLE 
  6731.   
  6732. *         END OF DATA UNLESS ASSIGNED TO THE TERMINAL.
  6733.   
  6734.           ZR     X0,PID6     TERMINAL INPUT SO CONTINUE 
  6735.           RJ     PCD         PROCESS COMMAND DIRECTIVES (IF ANY)
  6736.           NZ     X1,PID18    HELP REQUESTED 
  6737.           EQ     PID12       GOTO RETURN TRANSFER MODE FLAG 
  6738.   
  6739. *         PROCESS DATA. 
  6740.   
  6741.  PID10    SA1    PID.B       (X1) = FIRST WORD OF INPUT 
  6742.           RJ     UDL         UNPACK DIRECTIVE LINE
  6743.           RJ     GDW         GET DIRECTIVE WORD 
  6744.           ZR     X2,PID22    NO INPUT SO IGNORE 
  6745.           RJ     SVT         SEARCH VALIDATION TABLE
  6746.           NZ     X1,PID18    HELP REQUESTED 
  6747.           PL     X1,PID22    EOL SO CHECK FOR MORE
  6748.   
  6749. *         END OF DIRECTIVES SO EXIT.
  6750.   
  6751.  PID12    SA1    TMODE       (X1) = TRANSFER MODE FLAG
  6752.           NG     X1,PID14    'TAKE' REQUEST 
  6753.   
  6754. *         SET 'CAPAS' BYTE AND EXIT.
  6755.   
  6756.           SA2    RWSIZE      (X2) = REQUESTED WINDOW SIZE 
  6757.           SX6    2           ASSUME WINDOWING REQUIRED
  6758.  +        NZ     X2,*+1      ASSUMPTION CORRECT 
  6759.           SX6    0           CLEAR WINDOWING FLAG 
  6760.           SA6    CAPAS       UPDATE 'CAPAS' BYTE
  6761.           EQ     PIDX        EXIT 
  6762.   
  6763. *         PROCESS 'TAKE' REQUEST. 
  6764.   
  6765.  PID14    MX6    0
  6766.           SX1    -3          ASSUME FILE NAME MISSING 
  6767.           SA6    A1          CLEAR TRANSFER MODE
  6768.           SA2    FNAME       (X2) = TAKE FILE NAME
  6769.           ZR     X2,PID18    NO FILE NAME SPECIFIED 
  6770.           SB7    X2          (B7) = LWA + 1 OF FILE NAME
  6771.           AX2    18 
  6772.           SB6    X2          (B6) = FWA OF FILE NAME
  6773.           SB7    B7-B6       (B7) = LENGTH OF FLE NAME
  6774.           SB5    B1          FLAG WILD CARDS ILLEGAL
  6775.           RJ     BFN         BUILD FILE NAME
  6776.           MX7    -18
  6777.           SA2    C           (X2) = HELP FET WORD 
  6778.           BX6    X6*X7       ENSURE CORECT LENGTH 
  6779.           BX7    -X7*X2      EXTRACT CURRENT STATUS 
  6780.           BX6    X6+X7       MERGE NEW NAME 
  6781.           SA6    A2+         UPDATE FET NAME
  6782.           EQ     PID2        GOTO INITIALISE INPUT
  6783.   
  6784. *         DEVICE NOT ASSIGNED SO CHECK FOR 'INPUT'. 
  6785.   
  6786.  PID16    SA1    X2+         (X1) = FILE NAME + STATUS
  6787.           SA2    PID.C       (X2) = 'INPUT' 
  6788.           BX2    X1-X2       COMPARE
  6789.           AX2    18          IGNORE STATUS
  6790.           ZR     X2,PID20    FORCE 'INPUT' ASSIGNED TO TERMINAL 
  6791.           SX1    -6          FLAG 'TAKE' FILE NOT FOUND 
  6792.   
  6793. *         HELP TEXT REQUESTED.
  6794.   
  6795.  PID18    RJ     PHM         PRINT HELP MESSAGE 
  6796.           ZR     X0,PID6     TERMINAL INPUT SO NO PROBLEM 
  6797.   
  6798. *         SWITCH INPUT TO TERMINAL. 
  6799.   
  6800.  PID20    SA1    C           (X1) = SOURCE FET
  6801.           MX6    -18
  6802.           BX6    -X6*X1      (X6) = STATUS
  6803.           SA2    PID.C       (X2) = REQUIRED FILE NAME 'INPUT'
  6804.           BX6    X2+X6       ADD TO STATUS
  6805.           SA6    A1          UPDATE FET 
  6806.           SX0    0           FLAG TERMINAL INPUT
  6807.           REWIND C,R         INITIALISE FILE
  6808.           PROMPT OFF
  6809.           EQ     PID6        GOTO INTERACTIVE INPUT 
  6810.   
  6811. *         INPUT PROCESSED SO CHECK FOR MORE.
  6812.   
  6813.  PID22    ZR     X0,PID6     INTERACTIVE SO ISSUE PROMPT
  6814.           EQ     PID8        GOTO BATCH INPUT 
  6815.   
  6816.  PID.A    BSS    0           PROMPT 
  6817.           VFD    12/0007B,12/4116B,12/4117B,12/4123B,12/4040B 
  6818.           VFD    12/4113B,12/4105B,12/4122B,12/4115B,12/4111B 
  6819.           VFD    12/4124B,12/4076B,12/0000B,12/0000B,12/0000B 
  6820.  PID.B    BSS    21          INPUT LINE BUFFER
  6821.  PID.C    CON    5LINPUT
  6822.           SPACE  4,10 
  6823.           SPACE  4,10 
  6824. **        SVT - SEARCH VALIDATION TABLE.
  6825. *         THIS ROUTINE SCANS THE GIVEN VALIDATION TABLE FOR 
  6826. *         THE CURRENT COMMAND. SUBSEQUENT PROCESSING IS AS
  6827. *         SPECIFIED WITHIN ANY FOUND TABLE ENTRY. 
  6828. *         ENTRY  (B1) = 1 
  6829. *                (X2) = FIRST COMMAND WORD
  6830. *         EXIT   (X1) = EXIT FLAG 
  6831. *                           +N = HELP MESSAGE 'N' REQUESTED 
  6832. *                            0 = COMMAND PROCESSED
  6833. *                           -1 = ILLEGAL COMMAND
  6834. *                           -2 = COMMAND AMBIGUOUS
  6835. *                           -3 = COMMAND INCOMPLETE 
  6836. *                           -4 = NUMERIC VALUE OUT OF RANGE 
  6837. *                           -5 = VERSION REQUEST
  6838. *         USES   X - 1, 2, 3, 5, 6, 7.
  6839. *                A - 1, 2, 6, 7.
  6840. *                B - 2, 7.
  6841. *         CALLS  GDW, GPL, LND, WDL.
  6842.           SPACE  4,10 
  6843.  SVT      SUBR               ENTRY/EXIT 
  6844.   
  6845.  SVT0     SX6    1
  6846.           SA6    HELPCDE     RESET HELP CODE
  6847.           SA1    VTABLE      (X1) = FIRST ENTRY IN VALIDATION TABLE 
  6848.   
  6849. *         IF HELP NOT REQUIRED EXTRACT COUNTERS FROM DATA.
  6850.   
  6851.  SVT2     SX6    X2-077B     CHECK FOR HELP 
  6852.           ZR     X6,SVT30    HELP REQUESTED 
  6853.           MX3    -4 
  6854.           BX6    -X3*X2      (X6) = COMMAND CHARACTER COUNT 
  6855.           BX2    X2-X6       (X2) = COMMAND CHARACTERS
  6856.           LX7    X6,B1
  6857.           SB2    X6+         (B2) = NUMBER OF CHARACTERS IN COMMAND 
  6858.           LX7    2
  6859.           IX6    X7-X6       (X6) = NUMBER OF BITS IN COMMAND CHARACTERS
  6860.           MX7    1
  6861.           SB7    X6-1 
  6862.           AX7    B7          (X7) = COMMAND CHARACTER MASK
  6863.   
  6864. *         SEARCH TABLE FOR MATCH. 
  6865.   
  6866.  SVT4     BX6    X1-X2       COMPARE
  6867.           BX6    X6*X7       CHECK ONLY SUPPLIED CHARACTERS 
  6868.           ZR     X6,SVT6     MATCH (PROBABLY) 
  6869.           SA1    A1+2        (X1) = NEXT TABLE ENTRY
  6870.           NZ     X1,SVT4     NOT END OF TABLE 
  6871.           SX1    -1          FLAG NOT FOUND 
  6872.           EQ     SVTX        EXIT 
  6873.   
  6874. *         CHARACTERS SUPPLIED MATCH SO CHECK IF ENOUGH. 
  6875.   
  6876.  SVT6     BX6    -X3*X1      (X6) = REQUIRED CHARACTER COUNT
  6877.           SB7    X6 
  6878.           GE     B2,B7,SVT8  COMMAND RECOGNISED 
  6879.           SX1    -2          FLAG AMBIGUITY 
  6880.           EQ     SVTX        EXIT 
  6881.   
  6882. *         COMMAND RECOGNISED. 
  6883.   
  6884.  SVT8     SA1    A1+B1       (X1) = COMMAND ATTRIBUTE WORD
  6885.           BX6    X3*X1       (X6) = PARAMETERS
  6886.           BX1    -X3*X1      (X1) = PROCESS CODE
  6887.           LX6    60-6        RIGHT JUSTIFY HELP LEVEL 
  6888.           SX7    X6          (X7) = HELP CODE 
  6889.           AX6    18 
  6890.           SA7    HELPCDE     UPDATE REQUIRED HELP CODE
  6891.           SA1    SVT.A+X1    (X1) = PROCESS ADDRESS 
  6892.           SB7    X1+
  6893.           JP     B7+         BRANCH ACCORDING TO PROCESS CODE 
  6894.   
  6895. *         MORE TABLE ENTRIES REQUIRED.
  6896.   
  6897.  SVT10    SA1    X6          (X1) = NEXT TABLE ENTRY
  6898.           RJ     GDW         GET DIRECTIVE WORD 
  6899.           NZ     X2,SVT2     NOT END OF LINE
  6900.           SX1    -3          FLAG COMMAND INCOMPLETE
  6901.           EQ     SVTX        EXIT 
  6902.   
  6903. *         SET ADDRESS TO SPECIFIC VALUE.
  6904.   
  6905.  SVT12    BX5    X6          SAVE ATTRIBUTE DESCRIPTOR
  6906.           RJ     GDW         GET DIRECTIVE WORD 
  6907.           SX7    X2-077B     CHECK FOR HELP REQUEST 
  6908.           ZR     X7,SVT30    HELP REQUEST 
  6909.           SX7    X5          (X7) = ADDRESS OF VARIABLE TO DEFINE 
  6910.           AX5    18 
  6911.           SX6    X5          (X6) = VALUE TO DEFINE 
  6912.           SA6    X7          SAVE VALUE 
  6913.           EQ     SVT32       GOTO CHECK FOR END OF DIRECTIVE
  6914.   
  6915. *         SET GIVEN ADDRESS TO NUMERIC VALUE. 
  6916.   
  6917.  SVT14    SA6    SVT.B       SAVE ATTRIBUTE WORD
  6918.           RJ     GDW         GET DIRECTIVE WORD 
  6919.           SX7    X2-077B     CHECK FOR HELP REQUEST 
  6920.           ZR     X7,SVT30    HELP REQUESTED 
  6921.           MX3    -4 
  6922.           BX2    X2*X3       CLEAR CHARACTER COUNT
  6923.           MX3    -7 
  6924.           MX6    0
  6925.   
  6926. *         CONVERT ASCII TO BINARY NUMBER. 
  6927.   
  6928.  SVT15    LX2    7
  6929.           BX7    -X3*X2      (X7) = NEXT ASCII CODE 
  6930.           SX7    X7-060B     CONVERT TO BINARY
  6931.           NG     X7,SVT28    ILLEGAL
  6932.           SX1    X7-10       CHECK RANGE
  6933.           PL     X1,SVT28    ILLEGAL
  6934.           BX2    X2*X3       CLEAR FROM SOURCE
  6935.           LX1    X6,B1       (X1) = 2 * CURRENT VALUE 
  6936.           LX6    3
  6937.           IX6    X1+X6       (X6) = CURRENT VALUE * 10
  6938.           IX6    X6+X7       ADD NEW VALUE
  6939.           NZ     X2,SVT15    LOOP TILL END OF NUMBER
  6940.   
  6941. *         CHECK NUMBER IS WITHIN LIMITS.
  6942.   
  6943.           SA2    SVT.B       (X2) = ATTRIBUTE WORD
  6944.           SB7    X2 
  6945.           AX2    18 
  6946.           MX7    -9 
  6947.           BX7    -X7*X2      (X7) = MIN VALUE 
  6948.           AX2    9
  6949.           IX7    X6-X7       COMPARE
  6950.           NG     X7,SVT28    TOO SMALL
  6951.           IX7    X2-X6       COMPARE WITH MAX VALUE 
  6952.           NG     X7,SVT28    TOO LARGE
  6953.           SA6    B7          SAVE VALUE 
  6954.           EQ     SVT32       GOTO ADVANCE COMMAND POINTER 
  6955.   
  6956. *         PROCESS AT GIVEN ADDRESS. 
  6957.   
  6958.  SVT16    SB7    X6          (B7) = PROCESS ADDRESS 
  6959.           AX6    18 
  6960.           JP     B7+         PROCESS
  6961.   
  6962. *         PROCESS HELP REQUEST. 
  6963.   
  6964.  SVT18    SX1    X6+         ASSUME NO EXTENSION
  6965.           SA6    HELPCDE     PRESET HELP CODE 
  6966.           RJ     GDW         GET DATA WORD
  6967.           ZR     X2,SVTX     NO EXTENSION 
  6968.           SA1    HTABLE      (X1) = FIRST WORD FROM VALIDATION TABLE
  6969.           EQ     SVT2        PROCESS
  6970.   
  6971. *         'SERVER' OR 'EXIT'. 
  6972.   
  6973.  SVT20    SA6    SVT.B       SAVE MODE FLAG 
  6974.           SX6    0
  6975.           SA6    FNAME       CLEAR FILE NAME
  6976.           SA6    ANAME       CLEAR ALTERNATIVE FILE NAME
  6977.           RJ     GDW         GET DIRECTIVE WORD 
  6978.           ZR     X2,SVT34    NO EXTENSION SO VALID
  6979.           SX6    X2-077B     CHECK FOR HELP REQUEST 
  6980.           ZR     X6,SVT30    HELP 
  6981.           SX1    -1          FLAG ILLEGAL 
  6982.           EQ     SVTX        EXIT 
  6983.   
  6984. *         'SEND' OR 'TAKE'. 
  6985.   
  6986.  SVT22    SA6    SVT.B       SAVE TRANSFER MODE FLAG
  6987.           SX6    0
  6988.           SA6    FNAME       CLEAR FILE NAME POINTER
  6989.           SA6    ANAME       CLEAR ALTERNATIVE NAME POINTER 
  6990.           RJ     GPL         GET PARAMETER LIMITS (FILE NAME) 
  6991.           SX1    -3          ASSUME ERROR 
  6992.           ZR     X6,SVTX     ASSUMPTION CORRECT 
  6993.           SX2    X6-077B     CHECK FOR HELP REQUEST 
  6994.           ZR     X2,SVT30    HELP 
  6995.           SA6    FNAME       SAVE FILE NAME POINTER 
  6996.           RJ     GPL         GET PARAMETER LIMITS (ALTERNATIVE FILE NAME
  6997.           ZR     X6,SVT34    NO ALTERNATIVE FILE NAME 
  6998.           SX2    X6-077B     CHECK FOR HELP REQUEST 
  6999.           ZR     X2,SVT30    HELP 
  7000.           SA6    ANAME       SAVE ALTERNATIVE FILE NAME 
  7001.           EQ     SVT34       GOTO RETURN TRANSFER MODE
  7002.   
  7003. *         RECEIVE.
  7004.   
  7005.  SVT24    SA6    SVT.B       SAVE TRANSFER MODE FLAG
  7006.           SX6    0
  7007.           SA6    ANAME       CLEAR ALTERNATIVE FILE NAME
  7008.           RJ     GPL         GET PARAMETER LIMITS 
  7009.           ZR     X6,SVT34    NO NAME SPECIFIED
  7010.           SX2    X6-077B     CHECK FOR HELP REQUEST 
  7011.           ZR     X2,SVT30    HELP 
  7012.           SA6    ANAME       SAVE ALTERNATIVE FILE NAME 
  7013.           EQ     SVT34       GOTO RETURN TRANSFER MODE
  7014.   
  7015. *         RETURN GIVEN MESSAGE REQUEST. 
  7016.   
  7017.  SVT26    SX1    X6          (X1) = MESSAGE CODE
  7018.           EQ     SVTX        EXIT 
  7019.   
  7020. *         ILLEGAL NUMERIC VALUE.
  7021.   
  7022.  SVT28    SX1    -4          FLAG NUMERIC CONVERSION ERROR
  7023.           EQ     SVTX        EXIT 
  7024.   
  7025. *         HELP REQUESTED. 
  7026.   
  7027.  SVT30    SA1    HELPCDE     (X1) = REQUIRED MESSAGE ORDINAL
  7028.           EQ     SVTX        EXIT 
  7029.   
  7030. *         SKIP TILL END OF DIRECTIVE
  7031.   
  7032.  SVT32    RJ     WDL         WRITE DIRECTIVE TO LOG FILE
  7033.           RJ     LND         LOCATE NEXT DIRECTIVE
  7034.           SX1    0           ASSUME NO MORE 
  7035.           ZR     X6,SVTX     EXIT 
  7036.           RJ     GDW         GET DIRECTIVE WORD 
  7037.           EQ     SVT0        NOW SCAN THIS DIRECTIVE
  7038.   
  7039. *         SET TRANSFER MODE FLAG AND EXIT.
  7040.   
  7041.  SVT34    RJ     WDL         WRITE DIRECTIVE TO LOG FILE
  7042.           SA2    SVT.B       (X2) = TRANSFER MODE FLAG REQUIRED 
  7043.           MX1    60          FLAG COMPLETE
  7044.           SX6    X2          (X6) = TRANSFER MODE FLAG
  7045.           SA6    TMODE       SAVE 
  7046.           EQ     SVTX        EXIT 
  7047.   
  7048.  SVT.A    BSS    0           COMMAND CODE BRANCH TABLE
  7049.           CON    SVT10       MORE TABLE ENTRIES REQUIRED
  7050.           CON    SVT12       SET VARIABLE TO SPECIFIC VALUE 
  7051.           CON    SVT14       SET VARIABLE TO NUMERIC VALUE
  7052.           CON    SVT16       PROCESS AT GIVEN ADDRESS 
  7053.           CON    SVT26       RETURN GIVEN MESSAGE REQUEST 
  7054.  SVT.B    BSS    1           NUMERIC PARAMETER LIMITS 
  7055.           SPACE  4,10 
  7056. **        GDW - GET DIRECTIVE WORD. 
  7057. *         THIS ROUTINE RETURNS THE NEXT WORD OF UPTO 8 ASCII
  7058. *         CHARACTERS FROM THE SOURCE STRING. LOWER CASE CHARACTERS
  7059. *         ARE CONVERTED TO UPPER CASE AND LEADING BLANKS ARE
  7060. *         IGNORED. A WORD TERMINATES ON A BLANK, A SLASH OR AT
  7061. *         THE END OF LINE.
  7062. *         ENTRY  (B1) = 1 
  7063. *                (LINEP) POINT TO CURRENT LINE POSITION AND LIMIT 
  7064. *         EXIT   (X2) = 56/PACKED ASCII,4/CHAR COUNT
  7065. *                       OR  52/0,8/077B IF HELP REQUEST 
  7066. *                (LINEP) UPDATED
  7067. *         USES   X - 2, 3, 6, 7.
  7068. *                A - 2, 7.
  7069. *                B - 2, 3, 6, 7.
  7070. *         CALLS 
  7071.           SPACE  4,10 
  7072.  GDW      SUBR               ENTRY/EXIT 
  7073.           SA2    LINEP       (X2) = LINE POINTER
  7074.           SB7    X2+         (B7) = LWA + 1 
  7075.           AX2    18 
  7076.           SB6    X2+         (B6) = CURRENT ADDRESS 
  7077.           MX2    0           CLEAR RETURN CODE
  7078.           GE     B6,B7,GDWX  END OF LINE REACHED
  7079.           SX6    0           CLEAR PACKING WORD 
  7080.   
  7081. *         SKIP LEADING BLANKS AND '/' CHARACTERS. 
  7082.   
  7083.  GDW2     SA2    B6          (X2) = NEXT ASCII CHARACTER
  7084.           SB6    B6+B1       INCREMENT ADDRESS
  7085.           SX3    X2-040B     CHECK FOR BLANK
  7086.           ZR     X3,GDW4     IGNORE BLANKS
  7087.           SX3    X2-057B     CHECK FOR '/'
  7088.           ZR     X3,GDW6     EOL SO NO PARAMETER
  7089.           SB2    0           (B2) = CURRENT CHARACTER COUNT 
  7090.           SB3    8           (B3) = MAXIMUM CHARACTER COUNT 
  7091.           SX3    X2-077B     CHECK FOR ?
  7092.           NZ     X3,GDW8     NOT HELP REQUEST 
  7093.           SX3    B6          (X3) = CURRENT ADDRESS 
  7094.           SX7    B7          (X7) = LIMIT ADDRESS 
  7095.           LX3    18 
  7096.           BX7    X3+X7       (X7) = 24/0,18/CURRENT ADR,18/LIMIT ADR
  7097.           SA7    LINEP       UPDATE LINE POINTER
  7098.           EQ     GDWX        EXIT 
  7099.   
  7100.  GDW4     LT     B6,B7,GDW2  LOOP TILL WORD OR EOL
  7101.   
  7102.  GDW6     SX2    0           FLAG NO DATA 
  7103.           EQ     GDWX        EXIT (X6) = 0
  7104.   
  7105. *         CONVERT TO UPPER CASE IF REQUIRED.
  7106.   
  7107.  GDW8     EQ     B2,B3,GDW12 ALREADY MAX. CHARACTER COUNT 
  7108.           SX3    X2-141B     CHECK FOR L.C. A 
  7109.           NG     X3,GDW10    NO ADJUSTMENT
  7110.           SX3    X2-172B-1   CHECK FOR L.C. Z 
  7111.           PL     X3,GDW10    NO ADJUSTMENT
  7112.           SX2    X2-40B      CONVERT TO UPPER CASE
  7113.   
  7114.  GDW10    LX6    7
  7115.           SB2    B2+1        INCREMENT CHARACTER COUNT
  7116.           BX6    X2+X6       ADD NEW CHARACTER
  7117.   
  7118.  GDW12    EQ     B6,B7,GDW14 END OF LINE SO MUST BE END OF WORD 
  7119.           SA2    B6+         (X2) = NEXT CHARACTER
  7120.           SX3    X2-077B     CHECK FOR '?'
  7121.           ZR     X3,GDW14    END OF WORD
  7122.           SX3    X2-057B     CHECK FOR '/'
  7123.           ZR     X3,GDW14    END OF WORD
  7124.           SB6    B6+1        INCREMENT POINTER
  7125.           SX3    X2-040B     CHECK FOR BLANK
  7126.           NZ     X3,GDW8     LOOP TILL END OF WORD
  7127.   
  7128. *         END OF WORD SO UPDATE POINTER.
  7129.   
  7130.  GDW14    SX3    B6          (X3) = CURRENT ADDRESS 
  7131.           SX7    B7          (X7) = LIMIT ADDRESS 
  7132.           LX3    18 
  7133.           BX7    X3+X7       (X7) = 24/0,18/CURRENT,18/LWA+1
  7134.           SA7    LINEP       SAVE 
  7135.   
  7136. *         LEFT JUSTIFY TEXT AND ADD CHARACTER COUNT.
  7137.   
  7138.           SB7    B3-B2       (B7) = UNUSED CHARACTER COUNT
  7139.           SX7    B7 
  7140.           LX7    3
  7141.           SB6    X7          (B6) = 8 * UNUSED CHARACTER COUNT
  7142.           SB7    B6-B7       (B7) = SHIFT COUNT 
  7143.           LX6    B7          LEFT JUSTIFY TEXT
  7144.           SX7    B2          (X7) = CHARACTER COUNT 
  7145.           LX6    4
  7146.           BX2    X6+X7       (X2) = 56/ASCII,4/COUNT
  7147.           EQ     GDWX        EXIT 
  7148.           SPACE  4,10 
  7149. **        GDL - GET DIRECTIVE LIMITS. 
  7150. *         THIS ROUTINE SCANS FORWARD AND BACKWARDS FROM THE CURRENT 
  7151. *         LINE BUFFER POSITION FOR THE START AND END OF THE DIRECTIVE.
  7152. *         IT IS USED TO LOCATE THE AREA TO BE PRINTED WHEN AN ERROR 
  7153. *         IS DETECTED.
  7154. *         ENTRY  (B1) = 1 
  7155. *                (LINEP) CONTAINS CURRENT POINTER 
  7156. *         EXIT   (B6) = FWA OF DIRECTIVE
  7157. *                (B7) = LWA + 1 OF DIRECTIVE
  7158. *         USES   X - 2, 6.
  7159. *                A - 2. 
  7160. *                B - 2, 6, 7. 
  7161. *         CALLS  NONE.
  7162.           SPACE  4,10 
  7163.  GDL      SUBR               ENTRY/EXIT 
  7164.           SA2    LINEP       (X2) = POINTER 
  7165.           SB7    X2          (B7) = LWA + 1 OF STRING 
  7166.           AX2    18 
  7167.           SB6    X2          (B6) = CURRENT ADDRESS 
  7168.   
  7169. *         LOCATE END OF COMMAND.
  7170.   
  7171.           EQ     B6,B7,GDL4  ALREADY AT LIMIT 
  7172.           SB2    B7          (B2) = LIMIT 
  7173.           SB7    B6          (B7) = CURRENT 
  7174.   
  7175.  GDL2     SA2    B7+         (X2) = CURRENT CHARACTER 
  7176.           SX6    X2-057B     CHECK FOR '/'
  7177.           ZR     X6,GDL4     END OF DIRECTIVE FOUND 
  7178.           SB7    B7+1        INCREMENT POINTER
  7179.           LT     B7,B2,GDL2  LOOP TILL END FOUND
  7180.   
  7181. *         SEARCH FOR BEGINNING OF DIRECTIVE.
  7182.   
  7183.  GDL4     SB2    LINE        (B2) = FWA OF LINE POINTER 
  7184.           EQ     B2,B6,GDLX  AT START 
  7185.   
  7186.  GDL6     SB6    B6-B1       DECREMENT CURRENT POSITION 
  7187.           SA2    B6          (X2) = CURRENT CHARACTER 
  7188.           SX6    X2-057B     CHECK FOR '/'
  7189.           ZR     X6,GDL8     START FOUND
  7190.           GT     B6,B2,GDL6  LOOP TILL START FOUND
  7191.           EQ     GDLX 
  7192.   
  7193.  GDL8     SB6    B6+B1       (B6) = STARTING ADDRESS
  7194.           EQ     GDLX        EXIT 
  7195.           SPACE  4,10 
  7196. **        GPL - GET PARAMETER LIMITS. 
  7197. *         THIS ROUTINE SCANS THE STRING BUFFER FROM THE CURRENT 
  7198. *         POSITION AND RETURNS THE STARTING AND ENDING ADDRESS OF 
  7199. *         THE NEXT PARAMETER. THIS IS DESIGNED FOR LOCATING FILE
  7200. *         NAMES IN 'SEND' AND 'RECEIVE' COMMANDS. 
  7201. *         ENTRY  (B1) = 1 
  7202. *                (LINEP) = CURRENT LINE POINTERS
  7203. *         EXIT
  7204. *         USES   X - 2, 3, 6, 7.
  7205. *                A - 2, 6, 7. 
  7206. *                B - 6, 7.
  7207. *         CALLS  NONE.
  7208.           SPACE  4,10 
  7209.  GPL      SUBR               ENTRY/EXIT 
  7210.           SA2    LINEP       (X2) = LINE POINTER
  7211.           SB7    X2          (B7) = LIMIT ADDRESS 
  7212.           AX2    18 
  7213.           SB6    X2          (B6) = CURRENT POSITION
  7214.           MX6    0           ASSUME NO PARAMETER
  7215.           EQ     B6,B7,GPLX  NO PARAMETER 
  7216.   
  7217. *         SKIP TILL START OF PARAMETER. 
  7218.   
  7219.  GPL2     SA2    B6          (X2) = NEXT CHARACTER
  7220.           SX3    X2-057B     CHECK FOR '/'
  7221.           ZR     X3,GPLX     EOL SO NO PARAMETER
  7222.           SX3    X2-077B     CHECK FOR HELP REQUEST 
  7223.           ZR     X3,GPL4     HELP 
  7224.           SX3    X2-040B     CHECK FOR BLANK
  7225.           NZ     X3,GPL6     START OF PARAMETER FOUND 
  7226.           SB6    B6+1        INCREMENT CURRENT ADDRESS
  7227.           LT     B6,B7,GPL2  LOOP IF NOT END OF BUFFER
  7228.           EQ     GPLX        NO PARAMETER SO EXIT 
  7229.   
  7230. *         HELP REQUEST. 
  7231.   
  7232.  GPL4     SX6    B6          (X6) = CURRENT ADDRESS 
  7233.           SX3    B7          (X3) = LIMIT ADDRESS 
  7234.           LX6    18 
  7235.           BX6    X3+X6       (X6) = 24/0,18/CURRENT/18/LIMIT
  7236.           SA6    LINEP       UPDATE LINE POINTER
  7237.           SX6    077B        RETURN '?' 
  7238.           EQ     GPLX        EXIT 
  7239.   
  7240. *         LOCATE END OF PARAMETER.
  7241.   
  7242.  GPL6     SX6    B6          (X6) = STARTING ADDRESS
  7243.           SB6    B6+1        INCREMENT CURRENT ADDRESS
  7244.           LX6    18 
  7245.   
  7246.  GPL8     EQ     B6,B7,GPL10 END OF BUFFER
  7247.           SA2    B6+         (X2) = CURRENT CHARACTER 
  7248.           SX3    X2-040B     CHECK FOR BLANK
  7249.           ZR     X3,GPL10    END OF PARAMETER FOUND 
  7250.           SX3    X2-077B     CHECK FOR '?'
  7251.           ZR     X3,GPL10    END OF PARAMETER FOUND 
  7252.           SX3    X2-057B     CHECK FOR '/'
  7253.           SB6    B6+1        INCREMENT POINTER
  7254.           NZ     X3,GPL8     LOOP TILL END FOUND
  7255.   
  7256. *         END OF DIRECTIVE SO SAVE LWA + 1 AND UPDATE POINTER.
  7257.   
  7258.  GPL10    SX7    B6          (X7) = LWA + 1 
  7259.           BX6    X6+X7       (X6) = POINTER FOR PARAMETER 
  7260.           SX3    B7 
  7261.           LX7    18 
  7262.           BX7    X3+X7       (X7) = LINE POINTER
  7263.           SA7    LINEP       UPDATE 
  7264.           EQ     GPLX        EXIT 
  7265.           SPACE  4,10 
  7266. **        LND - LOCATE NEXT DIRECTIVE.
  7267. *         THIS ROUTINE SCANS FROM THE CURRENT POINTER POSITION UNTIL
  7268. *         THE NEXT DIRECTIVE IS LOCATED OR THE END OF LINE REACHED. 
  7269. *         ENTRY  (B1) = 1 
  7270. *                (LINEP) = CURRENT LINE POINTER 
  7271. *         EXIT   (X6) = NEW POINTER VALUE (ZERO IF EOL) 
  7272. *         USES   X - 2, 6.
  7273. *                A - 2, 6.
  7274. *                B - 6, 7.
  7275. *         CALLS  NONE.
  7276.           SPACE  4,10 
  7277.  LND      SUBR               ENTRY/EXIT 
  7278.   
  7279.           SA2    LINEP       (X2) = LINE POINTER
  7280.           SB7    X2          (B7) = LIMIT 
  7281.           AX2    18 
  7282.           SB6    X2          (B6) = CURRENT ADDRESS 
  7283.           MX6    0           ASSUME EOL 
  7284.           EQ     B6,B7,LNDX  ASSUMTION CORRECT
  7285.   
  7286. *         SKIP TILL '/' OR EOL. 
  7287.   
  7288.  LND2     SA2    B6          (X2) = NEXT ASCII CHARACTER
  7289.           SB6    B6+B1       INCREMENT POINTER
  7290.           SX6    X2-057B     CHECK FOR '/'
  7291.           ZR     X6,LND4     END OF STATEMENT 
  7292.           SX6    X2-040B     CHECK FOR BLANK
  7293.           ZR     X6,LND4     IGNORE BLANKS
  7294.   
  7295. *         START OF DIRECTIVE SO UPDATE POINTER. 
  7296.   
  7297.           SX6    B6-B1       (X6) = ADDRESS OF START
  7298.           SX2    B7          (X2) = LIMIT 
  7299.           LX6    18 
  7300.           BX6    X2+X6       (X6) = 24/0,18/CURRENT,18/LIMIT
  7301.           SA6    LINEP       UPDATE POINTER 
  7302.           EQ     LNDX        EXIT 
  7303.   
  7304. *         NOT END OF DIRECTIVE SO CHECK FOR EOL.
  7305.   
  7306.  LND4     LT     B6,B7,LND2  CONTINUE SEARCH
  7307.           EQ     LNDX        EXIT (X6) = 0
  7308.           SPACE  4,10 
  7309. **        UDL - UNPACK DIRECTIVE LINE.
  7310. *         THIS ROUTINE UNPACKS THE GIVEN PACKED 6/12 FORMAT 
  7311. *         LINE INTO THE ASCII STRING BUFFER 'LINE'. THE 
  7312. *         POINTER 'LINEP' IS SET ACCORDINGLY. 
  7313. *         ENTRY  (B1) = 1 
  7314. *                (X1) = FIRST PACKED WORD 
  7315. *                (A1) = ADDRESS OF FIRST PACKED WORD
  7316. *         EXIT   (LINE CONVERTED AND POINTER SET
  7317. *         USES   X - 1, 2, 6, 7.
  7318. *                A - 1, 2, 6. 
  7319. *                B - 2, 3.
  7320. *         CALLS  NONE.
  7321.           SPACE  4,10 
  7322.  UDL      SUBR               ENTRY/EXIT 
  7323.   
  7324.           SB2    10          RESET UNPACKING COUNTER
  7325.           SA6    LINEP       PRESET DESTINATION ADDRESS 
  7326.           SX7    77B         (X7) = CHARACTER MASK
  7327.   
  7328.  UDL2     LX1    6
  7329.           BX2    X1*X7       (X2) = NEXT SOURCE CHARACTER 
  7330.           ZR     X2,UDL8     END OF INPUT 
  7331.           SX6    X2-74B      CHECK FOR ESCAPE CODE
  7332.           NG     X6,UDL6     NOT ESCAPE CODE
  7333.           LX6    59-0 
  7334.           NG     X6,UDL6     NOT 74 OR 76 
  7335.           LX2    X6,B1
  7336.           LX6    4
  7337.           LX2    B1 
  7338.           IX6    X2+X6       (X6) = 0 IF 74NN, 20 IF 76NN 
  7339.           SB2    B2-B1       DECREMENT UNPACKING COUNTER
  7340.           SB3    X6+20       (B3) = 20 IF 74NN, 40 IF 76NN
  7341.   
  7342.           NZ     B2,UDL4     SOURCE WORD NOT EMPTY
  7343.           SB2    10          RESET UNPACKING COUNT
  7344.           SA1    A1+1        (X1) = NEXT SOURCE WORD
  7345.  UDL4     LX1    6
  7346.           BX2    X1*X7       (X2) = NEXT 6 BIT CODE 
  7347.           SA2    X2+C2A      CONVERT TO ASCII 
  7348.           AX2    B3          POSITION 
  7349.           SB2    B2-1        DECREMENT UNPACKING COUNTER
  7350.           SX6    X2          (X6) = ASCII CODE
  7351.  +        NG     X6,*+1      ILLEGAL SO IGNORE
  7352.           SA6    A6+1        SAVE CHARACTER 
  7353.           NZ     B2,UDL2     NOT END OF SOURCE WORD 
  7354.           SA1    A1+1        GET NEXT SOURCE WORD 
  7355.           SB2    10          RESET UNPACKING COUNTER
  7356.           EQ     UDL2 
  7357.   
  7358. *         NOT ESCAPED CHARACTER.
  7359.   
  7360.  UDL6     SA2    X2+C2A      CONVERT TO ASCII 
  7361.           SX6    X2 
  7362.           SA6    A6+B1       SAVE 
  7363.           SB2    B2-B1       DECREMENT UNPACKING COUNTER
  7364.           NZ     B2,UDL2     NOT END OF SOURCE WORD 
  7365.           SA1    A1+B1       (X1) = NEXT SOURCE WORD
  7366.           SB2    10          RESET UNPACKING COUNTER
  7367.           EQ     UDL2 
  7368.   
  7369. *         END OF LINE SO SET POINTER. 
  7370.   
  7371.  UDL8     SX6    A6+1        (X6) = LWA + 1 
  7372.           SX7    LINE        (X7) = FWA 
  7373.           LX7    18 
  7374.           BX6    X6+X7       (X6) = 24/0,18/FWA,18/LWA+1
  7375.           SA6    LINEP       SET POINTER
  7376.           EQ     UDLX        EXIT 
  7377.           TITLE  DEBUG ROUTINES.
  7378. ***       DEBUG FILE FORMAT.
  7379. *         WHEN DEBUG IS SELECTED USING THE COMMAND 'SET DEBUG ON' THEN
  7380. *         A LOCAL FILE IS PRODUCED CONTAINING ALL THE I/O PROCESSED BY
  7381. *         KERMIT. BY DEFAULT THE LOCAL FILE NAME IS 'ZZZZDBG'. THE FILE 
  7382. *         IS CREATED IN 6/12 FORMAT. THE OUTPUT IS AS FOLLOWS:- 
  7383. *         WHEN THE KERMIT STATE CHANGE ROUTINE IS CALLED THE NEW STATE
  7384. *         IS PRINTED WITH THE WINDOW POINTER AND FREE BUFFER QUEUE
  7385. *         POINTER (IN OCTAL). THE FORMAT IS-
  7386. *            STATE - SCW     WPTR = NNNNNNNNB      FQPTR = MMMMMMMMB
  7387. *         ANY PACKET TRANSMITTED IS LISTED IN FULL, INCLUDING THE 
  7388. *         PACKET HEADER AND CHECKSUM. THE FORMAT IS-
  7389. *            XMT-[SOH]XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX[CR]
  7390. *         ANY INPUT RECEIVED IS LISTED IN A SIMILAR FORM TO THE 
  7391. *         ABOVE EXCEPT THAT THE LINE STARTS WITH ONE OF THE FOLLOWING 
  7392. *         PREFIX- 
  7393. *                 RCV-         NORMAL VALID PACKET
  7394. *                 CHK-         CHECKSUM ERROR IN PACKET 
  7395. *                 LOST-        START OF PACKET LOST 
  7396. *         IF A FATAL ERROR OCCURS WITHIN KERMIT THEN THE REPRIEVE 
  7397. *         BLOCK, INCLUDING EXCHANGE PACKAGE, IS WRITTEN TO THE
  7398. *         DEBUG FILE. THIS WILL OCCUR EVEN IF 'DEBUG' IS NOT
  7399. *         SELECETED.
  7400.           SPACE  4,10 
  7401. **        DEBUG ROUTINES. 
  7402. *         THE FOLLOWING ROUTINES ARE USED TO PROVIDE DIAGNOSTIC 
  7403. *         INFORMATION TO ASSIST PROGRAM DEVELOPMENT.
  7404.   
  7405. *         DBC - DEBUG COMMENCE
  7406. *         DBE - DEBUG END 
  7407. *         DBI - DEBUG INPUT PACKET
  7408. *         DBL - DEBUG LOST INPUT
  7409. *         DBO - DEBUG OUTPUT PACKET 
  7410. *         DBQ - DEBUG INPUT CHECKSUM ERROR
  7411. *         DBS - DEBUG STATE CHANGE
  7412. *         DBU - DEBUG UNPACK ROUTINE
  7413. *         DBX - DEBUG EXCHANGE PACKAGE AREA 
  7414. *         DBZ - UNPACK DISPLAY CODE TO ASCII BUFFER 
  7415.           SPACE  4,10 
  7416. **        DBC - DEBUG COMMENNCE.
  7417. *         THIS ROUTINE SHOULD BE CALLED DURING THE PROGRAM
  7418. *         STARTUP. IF THE DEBUG FLAG IS SET THEN THE DEBUG
  7419. *         FILE 'ZZZZDBG' IS INITIALISED.
  7420. *         ENTRY  (B1) = 1 
  7421. *         EXIT   DEBUG FILE INITIALISED 
  7422. *         USES   X - 1, 2, 6, 7.
  7423. *                A - 1, 6.
  7424. *                B - NONE.
  7425. *         CALLS  CIO=, WLM. 
  7426.           SPACE  4,10 
  7427.  DBC      SUBR               ENTRY/EXIT 
  7428.   
  7429.           SA1    DEBUG       (X1) = DEBUG FLAG
  7430.           ZR     X1,DBCX     DEBUG OFF SO IGNORE
  7431.           REWIND D,R         INITIALISE FILE
  7432.           WRITE  X2,*        PRESET FET WRITE FUNCTION
  7433.           SA1    DBC.A       (X1) = FIRST WORD OF LOG FILE MESSAGE
  7434.           RJ     WLM         WRITE LOG MESSAGE
  7435.           EQ     DBCX        EXIT 
  7436.   
  7437.  DBC.A    DIS    ,'DEBUG FILE OPENED.'
  7438.           SPACE  4,10 
  7439. **        DBE - DEBUG END.
  7440. *         THIS ROUTINE FLUSHES THE DEBUG OUTPUT FILE AND
  7441. *         CLOSES THE FILE.
  7442. *         ENTRY  (B1) = 1 
  7443. *         EXIT   FILE CLOSED IF DEBUG SELECTED
  7444. *         USES   X - 1. 
  7445. *                A - 1. 
  7446. *                B - NONE.
  7447. *         CALLS  CIO=, WLM. 
  7448.           SPACE  4,10 
  7449.  DBE      SUBR               ENTRY/EXIT 
  7450.   
  7451.           SA1    DEBUG       (X1) = DEBUG FLAG
  7452.           ZR     X1,DBEX     DEBUG OFF SO IGNORE
  7453.           WRITER D,R         FLUSH BUFFER 
  7454.           REWIND X2,R 
  7455.           SA1    DBE.A       (X1) = FIRST WORD OF TEXT
  7456.           RJ     WLM         WRITE LOG MESSAGE
  7457.           EQ     DBEX        EXIT 
  7458.   
  7459.  DBE.A    DIS    ,'DEBUG FILE CLOSED.'
  7460.           SPACE  4,10 
  7461. **        DBI - DEBUG INPUT.
  7462. *         THIS ROUTINE DUMPS THE CONTENTS OF THE GIVEN INPUT
  7463. *         PACKET TO THE LOG FILE IF DEBUG IS SELECTED.
  7464. *         ENTRY  (B1) = 1 
  7465. *                (X1) = FIRST PACKED WORD OF PACKET (8 IN 12) 
  7466. *                (A1) = ADDRESS OF FIRST WORD 
  7467. *         EXIT   PACKET WRITTEN TO DEBUG FILE 
  7468. *         USES   X - 2, 3.
  7469. *                A - 2. 
  7470. *                B - NONE.
  7471. *         CALLS  DBU. 
  7472.           SPACE  4,10 
  7473.  DBI      SUBR               ENTRY/EXIT 
  7474.           SA2    DEBUG       (X2) = DEBUG FLAG
  7475.           ZR     X2,DBIX     NOT SELECTED SO EXIT 
  7476.           SX3    0           FLAG PRINT FIRST BYTE
  7477.           SA2    DBI.A       (X2) = HEADER TEXT 
  7478.           RJ     DBU         DEBUG UNPACK 
  7479.           EQ     DBIX        EXIT 
  7480.   
  7481.  DBI.A    CON    6LRCV -
  7482.           SPACE  4,10 
  7483. **        DBL - DEBUG LOST INPUT. 
  7484. *         THIS ROUTINE DUMPS THE CONTENTS OF THE GIVEN INPUT
  7485. *         TO THE DEBUG FILE IF DEBUG IS ON. THIS ROUTINE IS CALLED
  7486. *         WHEN INPUT IS READ WITHOUT AN 'SOH' BYTE. 
  7487. *         ENTRY  (B1) = 1 
  7488. *                (B6) = FWA OF INPUT BUFFER (IN DISPLAY CODE) 
  7489. *         EXIT   DEBUG DATA WRITTEN IF SELECTED 
  7490. *         USES   X - 1, 2, 3. 
  7491. *                A - 1, 2.
  7492. *                B - NONE.
  7493. *         CALLS  DBU. 
  7494.           SPACE  4,10 
  7495.  DBL      SUBR               ENTRY/EXIT 
  7496.           SA2    DEBUG       (X2) = DEBUG FLAG
  7497.           ZR     X2,DBLX     DEBUG OFF SO IGNORE
  7498.           SA1    B6          (X1) = FIRST SOURCE WORD 
  7499.           SX3    B0          PRINT FIRST BYTE FLAG
  7500.           SA2    DBL.A       (X2) = HEADER TEXT 
  7501.           RJ     DBU         DEBUG UNPACK 
  7502.           EQ     DBLX        EXIT 
  7503.   
  7504.  DBL.A    CON    7LLOST - 
  7505.           SPACE  4,10 
  7506. **        DBO - DEBUG OUTPUT. 
  7507. *         THIS ROUTINE DUMPS THE CONTENTS OF THE GIVEN OUTPUT 
  7508. *         PACKET TO TH LOG FILE. THIS ROUTINE SHOULD ONLY BE
  7509. *         CALLED IF DEBUG IS ACTIVE.
  7510. *         ENTRY  (B1) = 1 
  7511. *                (X1) = FIRST PACKED WORD OF PACKET 
  7512. *                (A1) = ADDRESS OF FIRST WORD 
  7513. *         EXIT   PACKET WRITTEN TO DEBUG FILE 
  7514. *         USES   X - 2. 
  7515. *                A - 2. 
  7516. *                B - NONE.
  7517. *         CALLS  DBU. 
  7518.           SPACE  4,10 
  7519.  DBO      SUBR               ENTRY/EXIT 
  7520.           SX3    1           FLAG SKIP FIRST BYTE 
  7521.           SA2    DBO.A       (X2) = HEADER TEXT 
  7522.           RJ     DBU         DEBUG UNPACK 
  7523.           EQ     DBOX        EXIT 
  7524.   
  7525.  DBO.A    CON    6LXMT -
  7526.           SPACE  4,10 
  7527. **        DBQ - DEBUG INPUT CHECKSUM ERROR. 
  7528. *         THIS ROUTINE DUMPS THE CONTENTS OF THE GIVEN INPUT
  7529. *         PACKET TO THE LOG FILE IF DEBUG IS SELECTED. THE
  7530. *         PACKET HAS A CHECKSUM ERROR SO IS NOT PROCESSED 
  7531. *         FURTHER.
  7532. *         ENTRY  (B1) = 1 
  7533. *                (X1) = FIRST PACKED WORD OF PACKET (8 IN 12) 
  7534. *                (A1) = ADDRESS OF FIRST WORD 
  7535. *         EXIT   PACKET WRITTEN TO DEBUG FILE 
  7536. *         USES   X - 2, 3.
  7537. *                A - 2. 
  7538. *                B - NONE.
  7539. *         CALLS  DBU. 
  7540.           SPACE  4,10 
  7541.  DBQ      SUBR               ENTRY/EXIT 
  7542.           SA2    DEBUG       (X2) = DEBUG FLAG
  7543.           ZR     X2,DBQX     NOT SELECTED SO EXIT 
  7544.           SX3    0           FLAG PRINT FIRST BYTE
  7545.           SA2    DBQ.A       (X2) = HEADER TEXT 
  7546.           RJ     DBU         DEBUG UNPACK 
  7547.           EQ     DBQX        EXIT 
  7548.   
  7549.  DBQ.A    CON    6LCHK -
  7550.           SPACE  4,10 
  7551. **        DBS - DEBUG STATE CHANGE. 
  7552. *         THIS ROUTINE WRITES THE NEW PROTOCOL STATE TO THE 
  7553. *         LOG FILE. IT SHOULD ONLY BE CALLED IF DEBUG IS ACTIVE.
  7554. *         ENTRY  (B1) = 1 
  7555. *                (X6) = STATE ORDINAL 
  7556. *         EXIT   STATE CHANGE WRITTEN TO LOG FILE 
  7557. *         USES   X - 1, 6.
  7558. *                A - 1, 6, 7. 
  7559. *                B - 6. 
  7560. *         CALLS  SYS=, WOD, WTW=. 
  7561.           SPACE  4,10 
  7562.  DBS      SUBR               ENTRY/EXIT 
  7563.           SB6    DBS.A+1     (B6) = FWA OF BUFFER + 1 
  7564.           SA1    DBS.B+X6    (X1) = STATE TEXT
  7565.           BX6    X1          SAVE 
  7566.           SA6    B6+B1       SAVE 
  7567.           CLOCK  DBS.A       SAVE CURRENT TIME
  7568.           SA1    WPTR        (X1) = WINDOW POINTER
  7569.           RJ     WOD         CONVERT WORD TO OCTAL
  7570.           SA6    DBS.A+4     SAVE 
  7571.           SA7    A6+1 
  7572.           SA1    FQPTR       (X1) = FREE QUEUE POINTER
  7573.           RJ     WOD         CONVERT WORD TO OCTAL
  7574.           SA6    DBS.A+8     SAVE 
  7575.           SA7    A6+1 
  7576.           WRITEW D,DBS.A,11 
  7577.           EQ     DBSX        EXIT 
  7578.   
  7579.  DBS.A    CON    0,10H  STATE - ,0
  7580.           CON    10H  WPTR  - ,0,0,10HB 
  7581.           CON    10H  FQPTR - ,0,0,2LB
  7582.  DBS.B    BSS    0           TEXT FOR EACH STATE
  7583.           LOC    0
  7584.  FPE      CON    4HFPE
  7585.  SCW      CON    4HSCW
  7586.  SCT      CON    4HSCT
  7587.  SND      CON    4HSND
  7588.  REC      CON    4HREC
  7589.  SCS      CON    4HSCS
  7590.  SCR      CON    4HSCR
  7591.  INT      CON    4HINT
  7592.  SI       CON    2HSI 
  7593.  SIE      CON    4HSIE
  7594.  SIV      CON    4HSIV
  7595.  OF       CON    2HOF 
  7596.  SF       CON    2HSF 
  7597.  SFW      CON    4HSFW
  7598.  SD       CON    2HSD 
  7599.  SDT      CON    4HSDT
  7600.  SDW      CON    4HSDW
  7601.  SEF      CON    4HSEF
  7602.  SET      CON    4HSET
  7603.  SB       CON    2HSB 
  7604.  RF       CON    2HRF 
  7605.  RFF      CON    4HRFF
  7606.  RD       CON    2HRD 
  7607.  RDT      CON    4HRDT
  7608.  RDW      CON    4HRDW
  7609.  RDE      CON    4HRDE
  7610.  SCG      CON    4HSCG
  7611.  ADP      CON    4HADP
  7612.  ERR      CON    4HERR
  7613.  ABT      CON    4HABT
  7614.  CMP      CON    4HCMP
  7615.           LOC    *O 
  7616.           SPACE  4,10 
  7617. **        DBU - DEBUG UNPACK. 
  7618. *         THIS ROUTINE UNPACKS THE GIVEN ASCII PACKET TO A CDC DISPLAY
  7619. *         FORMAT AND WRITES IT TO THE LOG FILE. 
  7620. *         ENTRY  (B1) = 1 
  7621. *                (X1) = FIRST WORD OF PACKET (8 IN 12)
  7622. *                (X2) = HEADER TEXT (6 BIT) 
  7623. *                (X3) = 1 IF FIRST DATA BYTE TO BE SKIPPED (ELSE 0) 
  7624. *                (A1) = ADDRESS OF PACKET 
  7625. *         EXIT   PACKET WRITTEN TO LOG FILE 
  7626. *         USES   X - 1, 2, 3, 6, 7. 
  7627. *                A - 1, 2, 6. 
  7628. *                B - 6, 7.
  7629. *         CALLS  WTS=.
  7630.           SPACE  4,10 
  7631.  DBU      SUBR               ENTRY/EXIT 
  7632.   
  7633. *         INITIALISE. 
  7634.   
  7635.           SX6    1R 
  7636.           SA6    DBU.B       PRESET DESTINATION ADDRESS 
  7637.           SB6    5           (B6) = SHIFT COUNT 
  7638.           SB7    5           (B7) = UNPACKING COUNTER 
  7639.           SX0    177B        (X0) = ASCII MASK
  7640.           SX7    77B         (X7) = CDC DISPLAY CODE MASK 
  7641.   
  7642. *         CHECK IF FIRST CHARACTER TO BE SKIPPED. 
  7643.   
  7644.           ZR     X3,DBU2     PRINT FIRST BYTE 
  7645.           SB7    B7-B1       DECREMENT UNPACKING COUNTER
  7646.           LX1    12          DROP FIRST DATA BYTE 
  7647.   
  7648. *         UNPACK DISPLAY CODE TEXT. 
  7649.   
  7650.  DBU2     LX2    6
  7651.           BX6    X2*X7       (X6) = NEXT DISPLAY CODE 
  7652.           BX2    -X7*X2      CLEAR FROM SOURCE
  7653.           SA6    A6+B1       SAVE 
  7654.           NZ     X2,DBU2     LOOP TILL END OF TEXT
  7655.           NZ     B7,DBU4     NOT END OF PACKET SOURCE WORD
  7656.           SB7    5           RESET UNPACKING COUNTER
  7657.           SA1    A1+1        (X1) = NEXT PACKED WORD
  7658.   
  7659. *         UNPACK PACKET DATA TO STRING BUFFER.
  7660.   
  7661.  DBU4     LX1    12 
  7662.           BX2    X0*X1       (X2) = NEXT ASCII CODE 
  7663.           AX3    X2,B6       CHECK FOR CONTROL CODE (0-31)
  7664.           BX6    X0-X2       CHECK FOR 'DEL'
  7665.           IX6    X3*X6       (X6) = 0 IF CONTROL CODE 
  7666.           SB7    B7-B1       DECREMENT UNPACKING COUNTER
  7667.           ZR     X6,DBU6     CONTROL CODE 
  7668.           SA2    A2C+X2      CONVERT TO 6/12 DISPLAY CODE 
  7669.           SX2    X2 
  7670.           BX6    X2 
  7671.  +        AX6    6           (X6) = ESCAPE CODE (IF REQUIRED) 
  7672.           ZR     X6,*+1      NO ESCAPE CODE 
  7673.           SA6    A6+B1       SAVE 
  7674.           BX6    X2*X7       (X6) = L.O. CHARACTER
  7675.           SA6    A6+B1       SAVE 
  7676.           NZ     B7,DBU4     NOT END OF SOURCE WORD 
  7677.           SB7    B6          RESET UNPACKING COUNTER
  7678.           SA1    A1+B1       (X1) = NEXT SOURCE WORD
  7679.           EQ     DBU4        LOOP TILL END OF PACKET
  7680.   
  7681. *         CONTROL CHARACTER (OR END OF PACKET). 
  7682.   
  7683.  DBU6     ZR     X3,*+1      IF CONTROL CHARACTER (0-31)
  7684.           SX2    32          FORCE 'DEL' OFFSET 
  7685.           MX3    -12         CHECK FOR END OF PACKET
  7686.           BX3    -X3*X1 
  7687.           ZR     X3,DBU8     END OF LINE
  7688.           SA2    DBU.A+X2    (X2) = REQUIRED CONTROL CODE TEXT
  7689.           EQ     DBU2        GOTO UNPACK CDC TEXT 
  7690.   
  7691. *         END OF LINE SO WRITE TO DEBUG FILE. 
  7692.   
  7693.  DBU8     SB7    A6+B1       (B7) = LWA + 1 
  7694.           SB6    DBU.B       (B6) = FWA OF BUFFER 
  7695.           SB7    B7-B6       (B7) = CHARACTER COUNT 
  7696.           CLOCK  DBU.C       GET CURRENT TIME 
  7697.           SX2    D           (X2) = ADDRESS OF DUMP FET 
  7698.           SA1    DBU.C       (X1) = TIME
  7699.           BX6    X1 
  7700.           WRITEO X2          WRITE TO LOG FILE
  7701.           WRITES X2,B6,B7    WRITE TEXT 
  7702.           EQ     DBUX        EXIT 
  7703.   
  7704.  DBU.A    BSS    0           CONTROL CODE TEXT TABLE
  7705.           LOC    0
  7706.           CON    5L[NUL]
  7707.           CON    5L[SOH]
  7708.           CON    5L[STX]
  7709.           CON    5L[ETX]
  7710.           CON    5L[EOT]
  7711.           CON    5L[ENQ]
  7712.           CON    5L[ACK]
  7713.           CON    5L[BEL]
  7714.           CON    4L[BS] 
  7715.           CON    4L[HT] 
  7716.           CON    4L[LF] 
  7717.           CON    4L[VT] 
  7718.           CON    4L[FF] 
  7719.           CON    4L[CR] 
  7720.           CON    4L[SO] 
  7721.           CON    4L[SI] 
  7722.           CON    5L[DLE]
  7723.           CON    5L[DC1]
  7724.           CON    5L[DC2]
  7725.           CON    5L[DC3]
  7726.           CON    5L[DC4]
  7727.           CON    5L[NAK]
  7728.           CON    5L[SYN]
  7729.           CON    5L[ETB]
  7730.           CON    5L[CAN]
  7731.           CON    4L[EM] 
  7732.           CON    5L[SUB]
  7733.           CON    5L[ESC]
  7734.           CON    4L[FS] 
  7735.           CON    4L[GS] 
  7736.           CON    4L[RS] 
  7737.           CON    4L[VS] 
  7738.           CON    5L[DEL]
  7739.           LOC    *O 
  7740.  DBU.B    BSS    334         LINE BUFFER
  7741.  DBU.C    BSS    1           CURRENT TIME 
  7742.           SPACE  4,10 
  7743. **        DBX - DEBUG EXCHANGE PACKAGE AREA.
  7744. *         THIS ROUTINE IS CALLED WHEN A REPREIVED ERROR IS BEING
  7745. *         PROCESSED. THE REPREIVE BLOCK IS WRITTEN TO THE DEBUG 
  7746. *         FILE EVEN IF DEBUG IS NOT SELECTED. 
  7747. *         ENTRY  (B1) = 1 
  7748. *                REPRIEVE BLOCK DEFINED 
  7749. *         EXIT   BLOCK WRITTEN TO DEBUG FILE
  7750. *         USES   X -
  7751. *                A -
  7752. *                B -
  7753. *         CALLS 
  7754.           SPACE  4,10 
  7755.  DBX      SUBR               ENTRY/EXIT 
  7756.   
  7757.           CLOCK  DBX.A       GET CURRENT TIME 
  7758.           WRITEW D,DBX.A,3   WRITE HEADER 
  7759.           SA1    DBX.A       (X1) = CURRENT TIME
  7760.           BX6    X1 
  7761.           SA0    -30B        (A0) = -WORD COUNT 
  7762.           SA6    DBX.B       SAVE CLOCK TIME
  7763.   
  7764. *         PROCESS NEXT WORD.
  7765.   
  7766.  DBX2     SA1    RPB+30B+A0  (X1) = NEXT WORD FROM BLOCK
  7767.           RJ     WOD         CONVERT WORD TO OCTAL DISPLAY CODE 
  7768.           SA6    DBX.B+2     SAVE FIRST WORD
  7769.           SA1    DBX.C+30B+A0 (X1) = TEXT 
  7770.           SA0    A0+B1       DECREMENT WORD COUNT 
  7771.           SA7    A6+B1       SAVE SECOND WORD 
  7772.           BX6    X1 
  7773.           SA6    A6-B1       SAVE TEXT
  7774.           MX7    0
  7775.           SA7    A7+B1       TERMINATE BUFFER 
  7776.           WRITEW D,DBX.B,5   WRITE LINE 
  7777.           SX1    A0-1        CHECK FOR END
  7778.           NG     X1,DBX2     LOOP FOR ALL WORDS 
  7779.   
  7780. *         FLUSH BUFFER IF DEBUG NOT SELECTED. 
  7781.   
  7782.           SA1    DEBUG       (X1) = DEBUG FLAG
  7783.           NZ     X1,DBXX     DEBUG SELECTED 
  7784.           WRITER X2,R        FLUSH OUTPUT BUFFER
  7785.           EQ     DBXX        EXIT 
  7786.   
  7787.  DBX.A    CON    0,10H INTERNAL ,6LERROR. 
  7788.  DBX.B    BSS    5           LINE BUFFER
  7789.  DBX.C    BSS    0           HEADER TEXT TABLE
  7790.           LOC    0
  7791.           CON    10H LEN+FUNC 
  7792.           CON    10H CHK+TADR 
  7793.           CON    10H CHECKSUM 
  7794.           CON    10H MSK+EC+E 
  7795.           CON    10H PEND INT 
  7796.           CON    10H PEND RA1 
  7797.           CON    10H INT I/O
  7798.           CON    10H EF 
  7799.           CON    10H
  7800.           CON    10H  P+A0+B0 
  7801.           CON    10H RA+A1+B1 
  7802.           CON    10H FL+A2+B2 
  7803.           CON    10H EM+A3+B3 
  7804.           CON    10H RE+A4+B4 
  7805.           CON    10H FE+A5+B5 
  7806.           CON    10H MA+A6+B6 
  7807.           CON    10H    A7+B7 
  7808.           CON    10H       X0 
  7809.           CON    10H       X1 
  7810.           CON    10H       X2 
  7811.           CON    10H       X3 
  7812.           CON    10H       X4 
  7813.           CON    10H       X5 
  7814.           CON    10H       X6 
  7815.           CON    10H       X7 
  7816.           LOC    *O 
  7817.           SPACE  4,10 
  7818. **        DBZ - UNPACK DISPLAY CODE TO ASCII STRING BUFFER. 
  7819. *         THIS ROUTINE UNPACKS ONE WORD IN CDC 6 BIT DISPLAY
  7820. *         CODE AND SAVES THE RESULT AS AN ASCII STRING. 
  7821. *         ENTRY  (B1) = 1 
  7822. *                (X6) = DISPLAY CODE
  7823. *                (A0) = DESTINATION ADDRESS 
  7824. *         EXIT   ASCII IN STRING BUFFER 
  7825. *                (A0) = NEXT ADDRESS
  7826. *         USES   X - 1, 6, 7. 
  7827. *                A - 0, 1, 7. 
  7828. *                B - NONE.
  7829. *         CALLS  NONE.
  7830.           SPACE  4,10 
  7831.  DBZ      SUBR               ENTRY/EXIT 
  7832.   
  7833.  DBZ2     MX1    -6 
  7834.           LX6    6
  7835.           BX1    -X1*X6      (X1) = NEXT CHARACTER
  7836.           BX6    X1-X6       DELETE FROM SOURCE 
  7837.           SA1    C2A+X1      CONVERT TO ASCII 
  7838.           SX7    X1+         (X7) = ASCII 
  7839.           SA7    A0          SAVE IN BUFFER 
  7840.           SA0    A0+B1       INCREMENT BUFFER ADDRESS 
  7841.           NZ     X6,DBZ2     LOOP FOR ALL CHARACTERS
  7842.           EQ     DBZX        EXIT 
  7843.           SPACE  4,10 
  7844. *         COMMON DECKS. 
  7845.  OPL      XTEXT  COMCARG
  7846.  OPL      XTEXT  COMCCDD
  7847.  OPL      XTEXT  COMCCFD
  7848.  OPL      XTEXT  COMCCIO
  7849.  OPL      XTEXT  COMCCPM
  7850.  OPL      XTEXT  COMCDXB
  7851.  OPL      XTEXT  COMCLFM
  7852.  OPL      XTEXT  COMCPFM
  7853.  OPL      XTEXT  COMCRDC
  7854.  OPL      XTEXT  COMCRDO
  7855.  OPL      XTEXT  COMCRDW
  7856.  OPL      XTEXT  COMCSYS
  7857.  OPL      XTEXT  COMCWOD
  7858.  OPL      XTEXT  COMCWTC
  7859.  OPL      XTEXT  COMCWTO
  7860.  OPL      XTEXT  COMCWTS
  7861.  OPL      XTEXT  COMCWTW
  7862.           SPACE  4,10 
  7863. *         BUFFERS.
  7864.  CBUF     BSS    CBUFL       COMMAND BUFFER 
  7865.  DBUF     BSS    DBUFL       DEBUG BUFFER 
  7866.  IBUF     BSS    IBUFL       TERMINAL INPUT BUFFER
  7867.  LBUF     BSS    LBUFL       LOGGING BUFFER 
  7868.  FBUF     BSS    FBUFL       FILE BUFFER
  7869.  OBUF     BSS    OBUFL       TERMINAL OUTPUT BUFFER 
  7870.  OBFWA    BSS    OBCNT*OBLEN PACKET OUTPUT BUFFERS
  7871.           TITLE  PRESET CODE
  7872.           ORG    CBUF 
  7873.           SPACE  4,10 
  7874. **        WHF - WRITE HELP FILE.
  7875. *         THIS ROUTINE PRESETS THE HELP FILE AS A RANDOM FILE 
  7876. *         CONTAINING ONE HELP MESSAGE PER PRU. THE DATA IS READ 
  7877. *         SEQUENTIALLY FROM THE SOURCE WITH A '.EOR' INDICATING 
  7878. *         EACH PRU BOUNDARY.
  7879. *         ENTRY  (B1) = 1 
  7880. *         EXIT   HELP FILE CREATED
  7881. *         USES   X - 0, 1, 5, 6, 7. 
  7882. *                A - 1, 6, 7. 
  7883. *                B - 5, 6, 7. 
  7884. *         CALLS  CIO=.
  7885.           SPACE  4,10 
  7886.  WHF      SUBR               ENTRY/EXIT 
  7887.           REWIND ZZZZHLP,R
  7888.           SB6    WHF.A       (B6) = FWA OF TEXT 
  7889.           SB7    4           RESET TABLE PACKING COUNT
  7890.           SX5    0
  7891.           SB5    HLPTABL     (B5) = FWA OF HELP POINTER TABLE 
  7892.   
  7893. *         SEARCH FOR '.EOR' 
  7894.   
  7895.           SA1    =4L.EOR
  7896.           BX0    X1 
  7897.           SA1    B6-B1
  7898.   
  7899.  WHF2     SA1    A1+B1       (X1) = NEXT WORD 
  7900.           BX6    X0-X1       COMPARE
  7901.           NZ     X6,*        LOOP TILL EOR
  7902.   
  7903. *         WRITE THIS BLOCK (FROM (B6) TO (A1)-1). 
  7904.   
  7905.           SX6    B6          (X6) = START ADDRESS 
  7906.           SB6    A1+B1       (B6) = ADDRESS OF NEXT BLOCK 
  7907.           SA1    X2+B1       (X1) = FIRST + ... 
  7908.           MX7    42 
  7909.           BX7    X1*X7       CLEAR FIRST
  7910.           BX7    X6+X7       ADD NEW FIRST
  7911.           SA7    A1          REPLACE
  7912.           SX7    B6-B1       (X7) = LWA + 1 
  7913.           SA7    A7+B1       SET OUT = LWA + 1
  7914.           SA6    A7+B1       SET OUT = FIRST
  7915.           SA1    A6+B1       (X1) = LIMIT + ....
  7916.           MX6    42 
  7917.           SX7    X7+B1       (X7) = LWA + 2 
  7918.           BX6    X1*X6
  7919.           BX6    X6+X7       ADD NEW LIMIT
  7920.           SA6    A1          REPLACE
  7921.   
  7922. *         SAVE STARTING ADDRESS IN HELP TABLE.
  7923.   
  7924.           SA1    X2+6        (X1) = RANDOM WORD POINTER FROM FET
  7925.           LX5    15 
  7926.           AX1    30          (X1) = CURRENT RANDOM INDEX
  7927.           SB7    B7-B1       DECREMENT PACKING COUNTER
  7928.           BX5    X1+X5       ADD NEW POINTER
  7929.           NZ     B7,WHF4     NOT FULL 
  7930.           BX6    X5          (X6) = FULL POINTER
  7931.           SA6    B5          SAVE 
  7932.           SB7    4           RESET PACKING COUNTER
  7933.           SB5    B5+1        INCREMENT TABLE POINTER
  7934.           SX5    0           CLEAR PACKING WORD 
  7935.   
  7936. *         NOW WRITE BLOCK.
  7937.   
  7938.  WHF4     WRITER X2,R        FLUSH BUFFER 
  7939.   
  7940. *         CHECK IF END OF DATA. 
  7941.   
  7942.           SA1    B6          (X1) = NEXT SOURCE WORD
  7943.           BX6    X0-X1       CHECK FOR TWO '.EOR'S
  7944.           NZ     X6,WHF2     NOT END OF DATA
  7945.   
  7946. *         END OF DATA SO UPDATE LAST HELP POINTER.
  7947.   
  7948.           ZR     X5,WHFX     POINTER EMPTY
  7949.           BX6    X5 
  7950.  +        SB7    B7-B1       DECREMENT COUNTER
  7951.           LX6    15 
  7952.           NZ     B7,*        LEFT JUSTIFY 
  7953.           SA6    B5          SAVE 
  7954.           REWIND X2,R        CLOSE FILE 
  7955.           SETFET X2,(BUF=CBUF,101B) 
  7956.           EQ     WHFX        EXIT 
  7957.   
  7958.  WHF.A    BSS    0           DATA FOR HELP FILE 
  7959.           CON    2L  ,4L.EOR,2L  ,10L 
  7960.           CON    10L      KERM,10LIT HELP FA,6LCILITY,2L
  7961.           CON    10LW^H^E^N ^Y,10L^O^U ^U^S^,10LE K^E^R^M^,10LI^T ^Y^O^U
  7962.           CON    10L ^C^A^N ^S,10L^P^E^C^I^F,10L^Y ^A^N^Y ,10L^O^F ^T^H^
  7963.           CON    10LE ^F^O^L^L,10L^O^W^I^N^G,4L@D  ,2L
  7964.           CON    10L     C^O^M,10L^M^A^N^D  ,10L   P^A^R^A,10L^M^E^T^E^R
  7965.           CON    10L   ^1    C,10L^O^M^M^A^N,10L^D     P^A,10L^R^A^M^E^T
  7966.           CON    4L^E^R,10L     HELP ,10L          ,10L         ^ 
  7967.           CON    10L1    RECEI,2LVE,10L     SET  ,10L 
  7968.           CON    10L         ^,10L1    SEND ,2L  ,10L 
  7969.           CON    10L       COD,10LE        ^,10L1    SERVE,2LR
  7970.           CON    10L          ,10L       DEB,10LUG       ^,10L1    EXIT 
  7971.           CON    2L  ,10L          ,10L       DEL,10LAY       ^ 
  7972.           CON    10L1    VERSI,2LON,10L          ,10L       MOD 
  7973.           CON    10LE        ^,10L1    STATU,2LS ,10L 
  7974.           CON    10L       WIN,10LDOW      ^,10L1    TAKE ,2L 
  7975.           CON    2L  ,10LF^O^R ^M^O,10L^R^E ^I^N^,10LF^O^R^M^A^ 
  7976.           CON    10LT^I^O^N ^E,10L^N^T^E^R ^,10LT^H^E ^C^O,10L^M^M^A^N^D
  7977.           CON    10L-^N^A^M^E ,2L? ,10L          ,10L 
  7978.           CON    10L          ,6L  ^O^R,10L          ,10L        ^C 
  7979.           CON    10L^O^M^M^A^N,10L^D-^N^A^M^,10LE ^P^A^R^A,10L^M^E^T^E^R
  7980.           CON    6L(^S) ?,2L  ,4L.EOR,2L
  7981.           CON    10L          ,10L          ,10L       HEL,2LP
  7982.           CON    2L  ,10LF^O^R ^M^O,10L^R^E ^I^N^,10LF^O^R^M^A^ 
  7983.           CON    10LT^I^O^N ^A,10L^B^O^U^T ^,10LC^O^M^M^A^,10LN^D^S ^A^N
  7984.           CON    10L^D ^P^A^R^,10LA^M^E^T^E^,10LR^S ^Y^O^U,10L ^C^A^N ^E
  7985.           CON    10L^I^T^H^E^R,2L  ,10L^E^N^T^E^R,10L@D   ^C^O^ 
  7986.           CON    10LM^M^A^N^D-,10L^N^A^M^E ?,2L  ,10L         ^ 
  7987.           CON    10LC^O^M^M^A^,10LN^D-^N^A^M,10L^E ^P^A^R^,10LA^M^E^T^E^
  7988.           CON    4LR ? ,10L         ^,10LH^E^L^P ^C,10L^O^M^M^A^N 
  7989.           CON    10L^D-^N^A^M^,2LE ,10L         ^,10LH^E^L^P ^P 
  7990.           CON    10L^A^R^A^M^E,6L^T^E^R,2L  ,10LF^O^R ^A ^
  7991.           CON    10LL^I^S^T ^O,10L^F ^C^O^M^,10LM^A^N^D^S ,10L^A^V^A^I^L
  7992.           CON    10L^A^B^L^E ^,10LE^N^T^E^R ,2L  ,2L
  7993.           CON    10L          ,10L          ,2L? ,6L  ^O^R
  7994.           CON    10L          ,10L    HELP C,6LOMMAND,2L
  7995.           CON    10LE^N^T^E^R^,10LI^N^G HELP,10L ^W^I^L^L ,10L^R^E-^D^I^
  7996.           CON    10LS^P^L^A^Y ,10L^T^H^I^S ^,8LP^A^G^E.,2L
  7997.           CON    4L.EOR,2L  ,10L          ,10L
  7998.           CON    10L        SE,2LT ,2L  ,10LT^H^E SET 
  7999.           CON    10L^C^O^M^M^A,10L^N^D ^A^L^,10LL^O^W^S ^Y,10L^O^U ^T^O 
  8000.           CON    10L^A^L^T^E^R,10L ^A ^N^U^M,10L^B^E^R ^O^,10LF ^P^A^R^A
  8001.           CON    10L^M^E^T^E^R,2L^S,10L^T^H^A^T ^,10LA^R^E ^U^S 
  8002.           CON    10L^E^D ^D^U^,10LR^I^N^G ^F,10L^I^L^E ^T^,10LR^A^N^S^F^
  8003.           CON    10LE^R.  F^O^,10LR ^E^X^A^M,10L^P^L^E, ^T,10L^H^E ^F^O^
  8004.           CON    8LR^M^A^T ,10L^O^F ^T^H^,10LE ^F^I^L^E,10L ^O^N ^T^H 
  8005.           CON    10L^E C^Y^B^E,10L^R ^C^A^N ,10L^B^E ^C^H^,10LA^N^G^E^D.
  8006.           CON    10L  T^O ^L^O,10L^O^K ^A^T ,10L^T^H^E ^C^,10LU^R^R^E^N^
  8007.           CON    2LT ,10L^S^E^T^T^I,10L^N^G^S ^E^,10LN^T^E^R@D
  8008.           CON    8LSTATUS. ,2L  ,10LT^H^E ^P^A,10L^R^A^M^E^T
  8009.           CON    10L^E^R^S ^W^,10LH^I^C^H ^C,10L^A^N ^B^E ,10L@G^S^E^T' 
  8010.           CON    10L^A^R^E@D  ,2L  ,2L  ,10L      CODE
  8011.           CON    10L  DEBUG  D,10LELAY  MODE,8L  WINDOW,2L
  8012.           CON    10LF^O^R ^M^O,10L^R^E ^I^N^,10LF^O^R^M^A^,10LT^I^O^N ^E
  8013.           CON    10L^N^T^E^R  ,10LSET ^P^A^R,10L^A^M^E^T^E,10L^R^N^A^M^E
  8014.           CON    2L? ,2L  ,2L  ,4L.EOR
  8015.           CON    2L  ,10L          ,10L          ,10L      SET
  8016.           CON    4LCODE,2L  ,10LT^H^E CODE,10L ^P^A^R^A^
  8017.           CON    10LM^E^T^E^R ,10L^A^L^L^O^W,10L^S ^Y^O^U ,10L^T^O ^S^E^
  8018.           CON    10LL^E^C^T ^T,10L^H^E C^Y^B,10L^E^R ^F^I^,10LL^E ^F^O^R
  8019.           CON    8L^M^A^T. ,10LT^H^I^S ^S,10L^H^O^U^L^D,10L ^B^E ^S^P 
  8020.           CON    10L^E^C^I^F^I,10L^E^D ^T^O ,10L^E^N^S^U^R,10L^E ^T^H^A^
  8021.           CON    10LT ^A^N^Y ^,10LF^I^L^E ^T,10L^R^A^N^S^F,10L^E^R^R^E^D
  8022.           CON    2L  ,10L^I^S ^T^H^,10LE^N ^R^E^A,10L^D^A^B^L^E 
  8023.           CON    10L.  F^I^L^E,10L^S ^T^R^A^,10LN^S^F^E^R^,10LR^E^D ^U^S
  8024.           CON    10L^I^N^G ^T^,10LH^E ^W^R^O,10L^N^G ^C^O^,10LD^E ^C^A^N
  8025.           CON    2L  ,10L^C^O^N^T^A,10L^I^N ^A ^N,10L^U^M^B^E^R 
  8026.           CON    10L ^O^F ^I^N,10L^C^O^R^R^E,10L^C^T ^C^H^,10LA^R^A^C^T^
  8027.           CON    6LE^R^S.,2L  ,10LT^H^E ^F^I,10L^L^E ^F^O^
  8028.           CON    10LR^M^A^T^S ,10L^S^U^P^P^O,10L^R^T^E^D ^,8LA^R^E@D
  8029.           CON    2L  ,10LASCII  ASC,10LII8  BINAR,10LY  DIS64 
  8030.           CON    4LHEX ,2L  ,10LT^H^E ^D^E,10L^F^A^U^L^T
  8031.           CON    10L ^F^I^L^E ,10L^F^O^R^M^A,10L^T ^I^S AS,4LCII. 
  8032.           CON    2L  ,10LF^O^R ^M^O,10L^R^E ^I^N^,10LF^O^R^M^A^ 
  8033.           CON    10LT^I^O^N ^A,10L^B^O^U^T ^,10LT^H^E ^D^I,10L^F^F^E^R^E
  8034.           CON    10L^N^T ^C^O^,10LD^E^S ^E^N,10L^T^E^R@D  ,2L 
  8035.           CON    2L  ,10L          ,10L        SE,10LT CODE  ^F 
  8036.           CON    10L^O^R^M^A^T,2L? ,2L  ,10L^W^H^E^R^E
  8037.           CON    10L @G^F^O^R^,10LM^A^T' ^I^,10LS ^O^N^E ^,10LO^F ^T^H^E
  8038.           CON    10L ^A^B^O^V^,2LE.,2L  ,4L.EOR 
  8039.           CON    2L  ,10L          ,10L          ,10L SET CODE
  8040.           CON    6LASCII ,2L  ,10LT^H^I^S ^I,10L^S ^T^H^E 
  8041.           CON    10L^D^E^F^A^U,10L^L^T ^F^I^,10LL^E ^F^O^R,10L^M^A^T.  T
  8042.           CON    10L^H^E ^F^U^,10LL^L 128 ^C,10L^H^A^R^A^C,10L^T^E^R ASC
  8043.           CON    2LII,10L^S^T^A^N^D,10L^A^R^D ^I^,10LS ^S^U^P^P 
  8044.           CON    10L^O^R^T^E^D,10L ^S^O ^T^H,10L^A^T ^A^N^,10LY ^T^E^X^T
  8045.           CON    10L ^F^I^L^E ,10L^F^R^O^M ^,10LA ^M^I^C^R,10L^O ^C^A^N 
  8046.           CON    4L^B^E,10L^S^T^O^R^E,10L^D ^W^I^T^,10LH ^A^L^L ^ 
  8047.           CON    10LC^H^A^R^A^,10LC^T^E^R^S ,10L^R^E^M^A^I,10L^N^I^N^G ^
  8048.           CON    10LI^N^T^A^C^,10LT.  N^O^T^,10LE ^T^H^A^T,10L ^T^H^E C^
  8049.           CON    8LY^B^E^R ,10L^C^H^A^R^A,10L^C^T^E^R ^,10LS^I^Z^E ^I 
  8050.           CON    10L^S ^S^I^X ,10L^B^I^T^S ^,10LS^O, ^I^N ,10L^O^R^D^E^R
  8051.           CON    10L ^T^O ^O^B,10L^T^A^I^N ^,10LT^H^E ^F^U,8L^L^L 128 
  8052.           CON    10LASCII ^C^H,10L^A^R^A^C^T,10L^E^R ^S^E^,10LT, ^A ^C^O
  8053.           CON    10L^N^V^E^N^T,10L^I^O^N ^I^,10LS ^U^S^E^D,10L ^W^H^E^R^
  8054.           CON    10LE ^B^Y ^S^,10LO^M^E ASCI,2LI ,10L^C^H^A^R^A 
  8055.           CON    10L^C^T^E^R^S,10L ^A^R^E ^S,10L^A^V^E^D ^,10LA^S ^T^W^O
  8056.           CON    10L C^Y^B^E^R,10L ^M^A^I^N^,10LF^R^A^M^E ,10L^C^H^A^R^A
  8057.           CON    10L^C^T^E^R^S,8L.  F^O^R,10L^I^N^S^T^A,10L^N^C^E, ^T 
  8058.           CON    10L^H^E ^C^H^,10LA^R^A^C^T^,10LE^R A ^I^S,10L ^S^T^O^R^
  8059.           CON    10LE^D ^A^S 0,10L1 ^A^N^D ^,10LT^H^E ^C^H,10L^A^R^A^C^T
  8060.           CON    10L^E^R ^A ^I,2L^S,10L^S^T^O^R^E,10L^D ^A^S 76 
  8061.           CON    10L01.  T^H^E,10L C^Y^B^E^R,10L ^M^A^I^N^,10LF^R^A^M^E 
  8062.           CON    10L^F^I^L^E ^,10LT^H^E^R^E^,10LF^O^R^E ^C,10L^O^N^T^A^I
  8063.           CON    10L^N^S ^E^I^,8LT^H^E^R ,10L^S^I^X ^O^,10LR ^T^W^E^L 
  8064.           CON    10L^V^E ^B^I^,10LT^S ^P^E^R,10L ASCII ^C^,10LH^A^R^A^C^
  8065.           CON    10LT^E^R ^A^N,10L^D ^H^E^N^,10LC^E, ^T^H^,10LE ^F^I^L^E
  8066.           CON    10L ^F^O^R^M^,4LA^T ,10L^I^S ^O^F^,10LT^E^N ^R^E 
  8067.           CON    10L^F^E^R^R^E,10L^D ^T^O ^A,10L^S 6/12 ^F,10L^O^R^M^A^T
  8068.           CON    10L.  W^H^E^N,10L ^A^N ASCI,10LI ^C^H^A^R,10L^A^C^T^E^R
  8069.           CON    6L ^I^S ,10L^S^T^O^R^E,10L^D ^A^S ^A,10L ^T^W^E^L^ 
  8070.           CON    10LV^E ^B^I^T,10L ^V^A^L^U^,10LE ^T^H^E ^,10LF^I^R^S^T 
  8071.           CON    10L^S^I^X ^B^,10LI^T^S ^A^R,10L^E ^E^I^T^,10LH^E^R 74 ^
  8072.           CON    8LO^R 76, ,10L^W^H^I^C^H,10L ^C^O^R^R^,10LE^S^P^O^N^ 
  8073.           CON    10LD ^T^O ^T^,10LH^E C^Y^B^,10LE^R ^M^A^I,10L^N^F^R^A^M
  8074.           CON    10L^E ^C^H^A^,10LR^A^C^T^E^,10LR^S @A ^A^,10LN^D @B.  I
  8075.           CON    6L^F ^A ,10L^F^I^L^E ^,10LI^S ^T^R^A,10L^N^S^F^E^R 
  8076.           CON    10L^R^E^D ^A^,10LN^D ^T^H^E,10L ^R^E^S^U^,10LL^T^I^N^G 
  8077.           CON    10L^O^U^T^P^U,10L^T ^H^A^S ,10L^A ^N^U^M^,10LB^E^R ^O^F
  8078.           CON    10L @A ^O^R @,2LB ,10L^T^H^E^N ^,10LI^T ^I^S ^ 
  8079.           CON    10LR^E^A^S^O^,10LN^A^B^L^E ,10L^T^O ^A^S^,10LS^U^M^E ^T
  8080.           CON    10L^H^A^T ^T^,10LH^E ^F^I^L,10L^E ^I^S ^I,10L^N ASCII ^
  8081.           CON    10LF^O^R^M^A^,2LT.,2L  ,4L.EOR 
  8082.           CON    2L  ,10L          ,10L        SE,10LT CODE ASC 
  8083.           CON    4LII8 ,2L  ,10LT^H^I^S ^F,10L^I^L^E ^F^
  8084.           CON    10LO^R^M^A^T ,10L^S^U^P^P^O,10L^R^T^S ^T^,10LH^E ^F^U^L
  8085.           CON    10L^L ASCII ^,10LC^H^A^R^A^,10LC^T^E^R ^S,10L^E^T ^A^N^
  8086.           CON    2LD ,10L^E^A^C^H ^,10LC^H^A^R^A^,10LC^T^E^R ^I 
  8087.           CON    10L^S ^S^A^V^,10LE^D ^A^S ^,10LI^T^S ^E^I,10L^G^H^T ^B^
  8088.           CON    10LI^T ^V^A^L,10L^U^E.  A^S,10L ^T^H^E C^,8LY^B^E^R
  8089.           CON    10L^M^A^C^H^I,10L^N^E^S ^U^,10LS^E ^A 60-,10L^B^I^T ^W^
  8090.           CON    10LO^R^D ^A^N,10L^D ^E^I^G^,10LH^T ^B^I^T,10L ^V^A^L^U^
  8091.           CON    10LE^S ^C^A^N,10L^N^O^T ^B^,2LE ,10L^P^A^C^K^E 
  8092.           CON    10L^D ^E^X^A^,10LC^T^L^Y, ^,10LE^A^C^H ^E,10L^I^G^H^T ^
  8093.           CON    10LB^I^T ASCI,10LI ^C^H^A^R,10L^A^C^T^E^R,10L ^I^S ^S^A
  8094.           CON    10L^V^E^D ^W^,10LI^T^H^I^N ,2L  ,10L^T^W^E^L^V 
  8095.           CON    10L^E ^B^I^T^,10LS.  T^H^I^,10LS ^M^E^A^N,10L^S ^T^H^A^
  8096.           CON    10LT ^F^I^V^E,10L ASCII ^C^,10LH^A^R^A^C^,10LT^E^R^S ^C
  8097.           CON    10L^A^N ^B^E ,2L  ,10L^S^T^O^R^E,10L^D ^P^E^R
  8098.           CON    10L^M^A^C^H^I,10L^N^E ^W^O^,10LR^D.  T^H^,10LI^S ^F^I^L
  8099.           CON    10L^E ^F^O^R^,10LM^A^T ^I^S,10L ^O^F^T^E^,10LN ^R^E^F^E
  8100.           CON    10L^R^R^E^D ^,4LT^O ,10L^A^S @G8 ^,10LI^N 12'; ^ 
  8101.           CON    10LE^I^G^H^T ,10L^D^A^T^A ^,10LB^I^T^S ^A,10L^R^E ^S^A^
  8102.           CON    10LV^E^D ^I^N,10L ^E^A^C^H ,10L12 ^B^I^T^,10LS ^O^F ^C^
  8103.           CON    10LO^M^P^U^T^,4LE^R ,10L^W^O^R^D. ,10L T^H^I^S ^ 
  8104.           CON    10LF^I^L^E ^F,10L^O^R^M^A^T,10L ^I^S ^P^R,10L^O^B^A^B^L
  8105.           CON    10L^Y ^T^H^E ,10L^L^E^A^S^T,10L ^P^O^P^U^,10LL^A^R ^O^F
  8106.           CON    10L ^T^H^O^S^,2LE ,10L^S^U^P^P^O,10L^R^T^E^D ^ 
  8107.           CON    10LB^Y K^E^R^,6LM^I^T.,2L  ,4L.EOR 
  8108.           CON    2L  ,10L          ,10L          ,10L   SET COD 
  8109.           CON    8LE BINARY,2L  ,10LT^H^I^S ^I,10L^S ^N^O^T 
  8110.           CON    10L^A C^Y^B^E,10L^R ^M^A^I^,10LN^F^R^A^M^,10LE ^F^I^L^E
  8111.           CON    10L ^F^O^R^M^,10LA^T ^B^U^T,10L ^O^N^E ^I,10L^N^V^E^N^T
  8112.           CON    4L^E^D,10L^S^P^E^C^I,10L^F^I^C^A^L,10L^L^Y ^F^O^ 
  8113.           CON    10LR K^E^R^M^,10LI^T.  T^H^,10LE ^D^A^T^A,10L ^I^S ^S^T
  8114.           CON    10L^O^R^E^D ^,10LA^S ^S^E^V,10L^E^N-^A^N^,10LD-^A-^H^A^
  8115.           CON    4LL^F ,10L^B^Y^T^E^S,10L ^P^E^R ^W,10L^O^R^D.  A 
  8116.           CON    10L ^F^I^L^E ,10L^T^R^A^N^S,10L^M^I^T^T^E,10L^D ^U^P ^T
  8117.           CON    10L^O ^T^H^E ,10LC^Y^B^E^R ,10L^W^I^L^L ^,10LB^E ^S^T^O
  8118.           CON    6L^R^E^D,10L^A^S ^A^N ,10L^I^N^T^E^G,10L^E^R ^N^U^ 
  8119.           CON    10LM^B^E^R ^O,10L^F ^W^O^R^,10LD^S; ^H^E^,10LN^C^E, ^N^
  8120.           CON    10LU^L^L ^B^Y,10L^T^E^S ^M^,10LA^Y ^B^E ^,10LA^D^D^E^D 
  8121.           CON    4L^T^O,10L^T^H^E ^E^,10LN^D ^O^F ^,10LT^H^E ^F^I 
  8122.           CON    10L^L^E ^T^O ,10L^C^O^M^P^L,10L^E^T^E ^T^,10LH^E ^F^I^N
  8123.           CON    10L^A^L ^W^O^,10LR^D.  I^F ,10L^T^H^E ^F^,10LI^L^E ^I^S
  8124.           CON    2L  ,10L^T^H^E^N ^,10LR^E-^S^E^N,10L^T ^B^A^C^ 
  8125.           CON    10LK ^T^O ^T^,10LH^E ^O^R^I,10L^G^I^N^A^T,10L^I^N^G ^M^
  8126.           CON    10LI^C^R^O, ^,10LI^N ^B^I^N,10L^A^R^Y ^F^,10LO^R^M^A^T,
  8127.           CON    10L ^T^H^E^S^,2LE ,10L^N^U^L^L ^,10LB^Y^T^E^S
  8128.           CON    10L^W^I^L^L ^,10LA^L^S^O ^B,10L^E ^T^R^A^,10LN^S^M^I^T^
  8129.           CON    6LT^E^D.,2L  ,10LT^H^I^S ^F,10L^O^R^M^A^T
  8130.           CON    10L ^I^S ^N^O,10L^T ^G^E^N^,10LE^R^A^L^L^,10LY ^R^E^C^O
  8131.           CON    10L^M^M^E^N^D,6L^E^D. ,2L  ,4L.EOR 
  8132.           CON    2L  ,10L          ,10L          ,10L   SET COD 
  8133.           CON    8LE DIS64 ,2L  ,10LT^H^I^S ^F,10L^I^L^E ^F^
  8134.           CON    10LO^R^M^A^T ,10L^S^T^O^R^E,10L^D ^E^A^C^,10LH ^C^H^A^R
  8135.           CON    10L^A^C^T^E^R,10L ^R^E^C^E^,10LI^V^E^D ^A,10L^S ^A ^S^I
  8136.           CON    10L^X-^B^I^T ,2L  ,10L^Q^U^A^N^T,10L^I^T^Y ^A^ 
  8137.           CON    10LN^D, ^H^E^,10LN^C^E, ^O^,10LN^L^Y 64 ^,10LC^H^A^R^A^
  8138.           CON    10LC^T^E^R^S ,10L^A^R^E ^A^,10LL^L^O^W^E^,10LD.  T^H^I^
  8139.           CON    6LS ^I^S,10L^T^H^E ^D^,10LE^F^A^U^L^,10LT ^F^I^L^E 
  8140.           CON    10L ^F^O^R^M^,10LA^T ^O^N ^,10LT^H^E C^Y^,10LB^E^R ^M^A
  8141.           CON    10L^I^N^F^R^A,10L^M^E^S, ^A,10L^L^T^H^O^U,10L^G^H K^E^R
  8142.           CON    6L^M^I^T,10L^D^E^F^A^U,10L^L^T^S ^T^,8LO ASCII.
  8143.           CON    2L  ,10LDIS64 ^I^S,10L ^U^S^E^D ,10L^B^Y ^T^H^ 
  8144.           CON    10LE FORTRAN ,10L^C^O^M^P^I,10L^L^E^R^S ^,10LA^N^D ^S^O
  8145.           CON    10L ^Y^O^U ^S,10L^H^O^U^L^D,10L ^T^R^A^N^,8LS^F^E^R
  8146.           CON    10L^A^N^Y ^S^,10LU^C^H ^S^O,10L^U^R^C^E ^,10LF^I^L^E^S 
  8147.           CON    10L^I^N ^T^H^,10LI^S ^F^I^L,10L^E ^F^O^R^,6LM^A^T. 
  8148.           CON    2L  ,10LT^H^E^R^E ,10L^I^S ^O^N^,10LE ^M^A^J^O 
  8149.           CON    10L^R ^F^L^A^,10LW ^W^I^T^H,10L ^T^H^I^S ,10L^F^O^R^M^A
  8150.           CON    10L^T; ^T^H^E,10L ^R^E^P^R^,10LE^S^E^N^T^,10LA^T^I^O^N 
  8151.           CON    2L  ,10L^O^F ^T^H^,10LE @G^E^N^D,10L-^O^F-^L^I 
  8152.           CON    10L^N^E', ^W^,10LH^I^C^H ^I,10L^S 0000.  ,10LA^S ^A ^C^
  8153.           CON    10LO^L^O^N (@,10LD) ^I^S ^S,10L^T^O^R^E^D,2L 
  8154.           CON    10L^A^S 00, ^,10LT^W^O ^O^R,10L ^M^O^R^E ,10L^C^O^N^S^E
  8155.           CON    10L^C^U^T^I^V,10L^E ^C^O^L^,10LO^N^S ^C^O,10L^U^L^D ^P^
  8156.           CON    10LR^O^D^U^C^,10LE ^A^N ^E^,10LN^D-^O^F-^,8LL^I^N^E. 
  8157.           CON    10LA^L^T^H^O^,10LU^G^H ^T^H,10L^I^S ^M^A^,10LY ^S^E^E^M
  8158.           CON    10L ^A^N ^U^N,10L^L^I^K^E^L,10L^Y ^O^C^C^,10LU^R^E^N^C^
  8159.           CON    10LE, ^I^T ^C,10L^A^N ^S^T^,6LI^L^L ,10L^C^A^U^S^E 
  8160.           CON    10L ^O^B^S^C^,10LU^R^E ^E^R,10L^R^O^R^S. ,2L 
  8161.           CON    2L  ,4L.EOR,2L  ,10L 
  8162.           CON    10L          ,10L    SET CO,6LDE HEX,2L
  8163.           CON    10LT^H^I^S ^I,10L^S ^N^O^T ,10L^A C^Y^B^E,10L^R ^M^A^I^
  8164.           CON    10LN^F^R^A^M^,10LE ^F^I^L^E,10L ^F^O^R^M^,10LA^T ^B^U^T
  8165.           CON    10L ^O^N^E ^I,10L^N^V^E^N^T,4L^E^D,10L^S^P^E^C^I 
  8166.           CON    10L^F^I^C^A^L,10L^L^Y ^F^O^,10LR K^E^R^M^,10LI^T.  I^F 
  8167.           CON    10L^A ^F^I^L^,10LE ^I^S ^T^,10LR^A^N^S^F^,10LE^R^R^E^D 
  8168.           CON    10L^I^N^T^O ^,10LA C^Y^B^E^,2LR ,10L^M^A^I^N^F 
  8169.           CON    10L^R^A^M^E, ,10L^U^S^I^N^G,10L ^O^N^E ^O,10L^F ^T^H^E 
  8170.           CON    10L^A^B^O^V^E,10L ^F^I^L^E ,10L^F^O^R^M^A,10L^T^S, ^O^N
  8171.           CON    10L^E ^O^R ^M,6L^O^R^E,10L^B^L^A^N^K,10L^S ^C^A^N
  8172.           CON    10L^B^E ^A^D^,10LD^E^D ^A^T,10L ^T^H^E ^E,10L^N^D ^O^F 
  8173.           CON    10L^T^H^E ^F^,10LI^L^E ^T^O,10L ^E^N^S^U^,10LR^E ^T^H^A
  8174.           CON    10L^T ^T^H^E ,2L  ,10L^F^I^L^E ^,10LC^O^N^T^A^ 
  8175.           CON    10LI^N^S ^A ^,10LC^O^M^P^L^,10LE^T^E ^N^U,10L^M^B^E^R ^
  8176.           CON    10LO^F ^C^O^M,10L^P^U^T^E^R,10L, 60-^B^I^,10LT, ^W^O^R^
  8177.           CON    4LD^S.,10LI^F ^T^H^I,10L^S ^F^I^L^,10LE ^I^S ^S^ 
  8178.           CON    10LU^B^S^E^Q^,10LU^E^N^T^L^,10LY ^T^R^A^N,10L^S^M^I^T^T
  8179.           CON    10L^E^D ^B^A^,10LC^K ^T^O ^,10LT^H^E ^S^O,8L^U^R^C^E 
  8180.           CON    10L^M^I^C^R^O,10L ^T^H^E^S^,10LE ^B^L^A^N,10L^K^S ^W^I^
  8181.           CON    10LL^L ^B^E ^,10LS^E^N^T; ^,10LT^H^E ^F^I,10L^L^E ^R^E^
  8182.           CON    10LC^E^I^V^E^,10LD ^I^S ^N^,4LO^T ,10L^I^D^E^N^T 
  8183.           CON    10L^I^C^A^L ^,10LT^O ^T^H^E,10L ^O^N^E ^S,10L^E^N^T.  T
  8184.           CON    10L^O ^O^V^E^,10LR^C^O^M^E ,10L^T^H^I^S ^,10LP^R^O^B^L^
  8185.           CON    10LE^M ^Y^O^U,8L ^C^A^N ,10L^U^S^E HEX,10L ^M^O^D^E. 
  8186.           CON    10L  T^H^I^S ,10L^S^T^O^R^E,10L^S ^E^A^C^,10LH ASCII ^C
  8187.           CON    10L^H^A^R^A^C,10L^T^E^R ^R^,10LE^C^E^I^V^,10LE^D ^A^S ^
  8188.           CON    6LT^W^O ,10L^H^E^X^A^D,10L^E^C^I^M^A,10L^L ^D^I^G^ 
  8189.           CON    10LI^T^S ^A^N,10L^D ^W^I^L^,10LL ^O^N^L^Y,10L ^T^R^A^N^
  8190.           CON    10LS^M^I^T ^S,10L^I^M^I^L^A,10L^R^L^Y ^C^,10LO^D^E^D ^F
  8191.           CON    10L^I^L^E^S. ,2L  ,10LT^H^U^S, ^,10LT^H^E ^F^I 
  8192.           CON    10L^L^E ^R^E^,10LT^U^R^N^I^,10LN^G ^T^O ^,10LT^H^E ^O^R
  8193.           CON    10L^I^G^I^N^A,10L^L ^M^I^C^,10LR^O ^W^I^L,10L^L ^B^E ^I
  8194.           CON    10L^D^E^N^T^I,8L^C^A^L, ,10L^A^L^T^H^O,10L^U^G^H ^N^ 
  8195.           CON    10LO^T ^P^A^R,10L^T^I^C^U^L,10L^A^R^L^Y ^,10LU^S^E^F^U^
  8196.           CON    10LL ^O^N ^T^,10LH^E C^Y^B^,4LE^R.,2L
  8197.           CON    4L.EOR,2L  ,10L          ,10L
  8198.           CON    10L    SET DE,4LBUG ,2L  ,10LT^H^I^S ^I
  8199.           CON    10L^S ^M^A^I^,10LN^L^Y ^U^S,10L^E^D ^W^H^,10LE^N ^D^E^V
  8200.           CON    10L^E^L^O^P^I,10L^N^G ^T^H^,10LE K^E^R^M^,10LI^T ^P^R^O
  8201.           CON    10L^G^R^A^M ^,10LI^T^S^E^L^,4LF@D ,10L^H^O^W^E^V 
  8202.           CON    10L^E^R, ^I^T,10L ^M^A^Y ^P,10L^R^O^V^E ^,10LU^S^E^F^U^
  8203.           CON    10LL ^F^O^R ^,10LD^I^A^G^N^,10LO^S^T^I^C ,10L^P^U^R^P^O
  8204.           CON    10L^S^E^S ^F^,10LO^R ^T^H^O,4L^S^E,10L^F^A^M^I^L 
  8205.           CON    10L^I^A^R ^W^,10LI^T^H ^T^H,10L^E K^E^R^M,10L^I^T ^P^R^
  8206.           CON    10LO^T^O^C^O^,10LL.  W^H^E^,10LN D^E^B^U^,10LG ^I^S ^S^
  8207.           CON    10LE^L^E^C^T^,4LE^D,,10L^A^L^L ^I^,10LN^P^U^T ^A 
  8208.           CON    10L^N^D ^O^U^,10LT^P^U^T ^T,10L^O ^T^H^E ,10LC^Y^B^E^R 
  8209.           CON    10L^I^S ^A^L^,10LS^O ^W^R^I,10L^T^T^E^N ^,10LT^O ^A ^L^
  8210.           CON    10LO^C^A^L ^F,8L^I^L^E; ,10L^B^Y ^D^E^,10LF^A^U^L^T
  8211.           CON    10L^T^H^E ^F^,10LI^L^E^N^A^,10LM^E ^I^S Z,10LZZZDBG.  I
  8212.           CON    10L^N ^T^H^I^,10LS ^F^I^L^E,10L ^T^H^E ^F,10L^O^L^L^O^W
  8213.           CON    6L^I^N^G,10L^A^B^B^R^E,10L^V^I^A^T^I,10L^O^N^S ^A^ 
  8214.           CON    10LR^E ^U^S^E,6L^D@D  ,10L          ,10L 
  8215.           CON    10L        RC,10LV - ^F^I^L,10L^E ^R^E^C^,10LE^I^V^E^D 
  8216.           CON    2L  ,10L          ,10L          ,10L        XM 
  8217.           CON    10LT - ^F^I^L,10L^E ^T^R^A^,10LN^S^M^I^T^,6LT^E^D
  8218.           CON    10L          ,10L          ,10L        CH,10LK - ^C^H^E
  8219.           CON    10L^C^K^S^U^M,10L ^E^R^R^O^,2LR ,10L 
  8220.           CON    10L          ,10L       LOS,10LT - ^P^A^C,10L^K^E^T ^I^
  8221.           CON    10LN^C^O^M^P^,8LL^E^T^E ,2L  ,10LDEBUG ^I^S
  8222.           CON    10L ^E^N^A^B^,10LL^E^D ^B^Y,10L ^T^H^E ^C,10L^O^M^M^A^N
  8223.           CON    10L^D SET DEB,10LUG ON ^A^N,10L^D ^D^I^S^,10LA^B^L^E^D 
  8224.           CON    4L^B^Y,10LSET DEBUG ,10LOFF.  B^Y ,10L^D^E^F^A^U 
  8225.           CON    10L^L^T DEBUG,10L ^I^S ^O^F,4L^F. ,2L
  8226.           CON    4L.EOR,2L  ,10L          ,10L
  8227.           CON    10L    SET DE,6LBUG ON,2L  ,10LT^H^I^S ^S
  8228.           CON    10L^E^L^E^C^T,10L^S ^D^E^B^,10LU^G ^L^O^G,10L^G^I^N^G. 
  8229.           CON    10L A^L^L ^I^,10LN^P^U^T ^A,10L^N^D ^O^U^,10LT^P^U^T ^T
  8230.           CON    10L^O ^T^H^E ,2L  ,10LC^Y^B^E^R ,10L^I^S ^A^L^ 
  8231.           CON    10LS^O ^W^R^I,10L^T^T^E^N ^,10LT^O ^A ^L^,10LO^C^A^L ^F
  8232.           CON    10L^I^L^E; ^T,10L^H^E ^D^E^,10LF^A^U^L^T ,10L^F^I^L^E^N
  8233.           CON    6L^A^M^E,10L^I^S ZZZDB,10LG.   F^O^R,10L ^M^O^R^E
  8234.           CON    10L^I^N^F^O^R,10L^M^A^T^I^O,10L^N ^E^N^T^,10LE^R HELP D
  8235.           CON    6LEBUG. ,2L  ,4L.EOR,2L
  8236.           CON    10L          ,10L          ,10L   SET DEB,6LUG OFF 
  8237.           CON    2L  ,10LT^H^I^S ^I,10L^S ^T^H^E ,10L^D^E^F^A^U 
  8238.           CON    10L^L^T ^S^E^,10LT^T^I^N^G.,10L D^E^B^U^G,10L ^L^O^G^G^
  8239.           CON    10LI^N^G ^I^S,10L ^D^E^S^E^,10LL^E^C^T^E^,2LD. 
  8240.           CON    10LF^O^R ^M^O,10L^R^E ^I^N^,10LF^O^R^M^A^,10LT^I^O^N ^E
  8241.           CON    10L^N^T^E^R H,10LELP DEBUG.,2L  ,2L
  8242.           CON    4L.EOR,2L  ,10L          ,10L
  8243.           CON    10L   SET DEL,6LAY ^N ,2L  ,10LT^H^I^S ^P
  8244.           CON    10L^A^R^A^M^E,10L^T^E^R ^I^,10LS ^O^N^L^Y,10L ^U^S^E^D 
  8245.           CON    10L^I^N ^C^O^,10LN^J^U^N^C^,10LT^I^O^N ^W,10L^I^T^H ^T^
  8246.           CON    10LH^E S^E^N^,2LD ,10L^C^O^M^M^A,10L^N^D. I^T
  8247.           CON    10L^S^P^E^C^I,10L^F^I^E^S ^,10LT^H^E ^T^I,10L^M^E ^T^O 
  8248.           CON    10L^W^A^I^T ^,10LA^F^T^E^R ,10L^T^H^E S^E,10L^N^D ^C^O^
  8249.           CON    10LM^M^A^N^D ,2L  ,10L^H^A^S ^B^,10LE^E^N ^E^N 
  8250.           CON    10L^T^E^R^E^D,10L ^B^E^F^O^,10LR^E ^T^H^E,10L ^T^R^A^N^
  8251.           CON    10LS^F^E^R ^S,10L^T^A^R^T^S,10L.  T^H^I^S,10L ^W^I^L^L 
  8252.           CON    10L^A^L^L^O^W,2L  ,10L^Y^O^U ^E^,10LN^O^U^G^H
  8253.           CON    10L^T^I^M^E ^,10LT^O ^P^R^E,10L^P^A^R^E ^,10LT^H^E ^L^O
  8254.           CON    10L^C^A^L ^M^,10LI^C^R^O ^F,10L^O^R ^R^E^,10LC^E^I^V^I^
  8255.           CON    10LN^G ^T^H^E,2L  ,10L^F^I^L^E. ,10L T^H^E ^D^ 
  8256.           CON    10LE^F^A^U^L^,10LT ^I^S 0 ^,10LS^E^C^O^N^,10LD^S ^D^E^L
  8257.           CON    6L^A^Y. ,2L  ,10LI^T ^I^S ^,10LR^E^C^O^M^
  8258.           CON    10LM^E^N^D^E^,10LD ^T^H^A^T,10L ^Y^O^U ^U,10L^S^E S^E^R
  8259.           CON    10L^V^E^R ^M^,10LO^D^E, ^I^,10LF ^P^O^S^S,10L^I^B^L^E, 
  8260.           CON    10L^I^N ^W^H^,6LI^C^H ,10L^C^A^S^E ^,10LY^O^U ^D^O 
  8261.           CON    10L ^N^O^T ^N,10L^E^E^D ^T^,10LO ^S^E^T ^,10LT^H^E ^D^E
  8262.           CON    10L^L^A^Y ^T^,6LI^M^E.,2L  ,4L.EOR 
  8263.           CON    2L  ,10L          ,10L          ,10L     SET M 
  8264.           CON    4LODE ,2L  ,10LT^H^I^S ^A,10L^L^L^O^W^S
  8265.           CON    10L ^Y^O^U ^T,10L^O ^S^P^E^,10LC^I^F^Y ^W,10L^H^E^T^H^E
  8266.           CON    10L^R ^A^N ^I,10L^N^C^O^M^I,10L^N^G ^F^I^,10LL^E ^I^S ^
  8267.           CON    10LT^O ^B^E ^,10LK^E^P^T ^A,2L^S,10L^A ^L^O^C^ 
  8268.           CON    10LA^L ^F^I^L,10L^E ^O^N ^T,10L^H^E C^Y^B,10L^E^R, ^O^R
  8269.           CON    10L ^S^A^V^E^,10LD ^A^N^D ^,10LR^E^P^L^A^,10LC^E^D.  I^
  8270.           CON    10LF ^Y^O^U ^,10LS^A^V^E ^A,10L ^F^I^L^E ,2L 
  8271.           CON    10L^A^N^D ^O^,10LN^E ^O^F ^,10LT^H^E ^S^A,10L^M^E ^N^A^
  8272.           CON    10LM^E ^A^L^R,10L^E^A^D^Y ^,10LE^X^I^S^T^,10LS, ^T^H^E 
  8273.           CON    10L^N^A^M^E ^,10LO^F ^T^H^E,10L ^I^N^C^O^,10LM^I^N^G ^F
  8274.           CON    6L^I^L^E,10L^I^S ^A^L^,10LT^E^R^E^D ,10L^B^Y ^T^H^ 
  8275.           CON    10LE ^A^D^D^I,10L^T^I^O^N ^,10LO^F ^A ^D^,10LE^C^I^M^A^
  8276.           CON    10LL ^N^U^M^B,10L^E^R.  I^F,10L ^Y^O^U ^S,10L^P^E^C^I^F
  8277.           CON    2L^Y,10L^R^E^P^L^A,10L^C^E ^T^H^,10LE^N ^A^N^Y 
  8278.           CON    10L ^E^X^I^S^,10LT^I^N^G ^F,10L^I^L^E, ^O,10L^F ^T^H^E 
  8279.           CON    10L^S^A^M^E ^,10LN^A^M^E, ^,10LI^S ^O^V^E,10L^R^W^R^I^T
  8280.           CON    8L^T^E^N. ,2L  ,10LF^O^R ^M^O,10L^R^E ^I^N^
  8281.           CON    10LF^O^R^M^A^,10LT^I^O^N ^E,10L^N^T^E^R@D,2L 
  8282.           CON    10L          ,10L          ,10L       SET,10L MODE LOCA
  8283.           CON    10LL?    ^O^R,2L  ,10L          ,10L 
  8284.           CON    10L       SET,10L MODE SAVE,10L?     ^O^R,2L 
  8285.           CON    10L          ,10L          ,10L       SET,10L MODE REPL
  8286.           CON    4LACE?,2L  ,4L.EOR,2L
  8287.           CON    10L          ,10L          ,10L        SE,10LT MODE LOC
  8288.           CON    2LAL,2L  ,10LT^H^I^S ^E,10L^N^S^U^R^E
  8289.           CON    10L^S ^T^H^A^,10LT ^A^N ^I^,10LN^C^O^M^I^,10LN^G ^F^I^L
  8290.           CON    10L^E ^R^E^M^,10LA^I^N^S ^A,10L^S ^A ^L^O,10L^C^A^L ^F^
  8291.           CON    6LI^L^E.,10LW^H^E^N ^T,10L^H^E ^S^E^,10LS^S^I^O^N
  8292.           CON    10L^O^N ^T^H^,10LE C^Y^B^E^,10LR ^I^S ^D^,10LI^S^C^O^N^
  8293.           CON    10LT^I^N^U^E^,10LD ^T^H^E ^,10LF^I^L^E ^I,10L^S ^P^U^R^
  8294.           CON    6LG^E^D.,2L  ,4L.EOR,2L
  8295.           CON    10L          ,10L          ,10L       SET,10L MODE SAVE
  8296.           CON    2L  ,2L  ,10LT^H^I^S ^E,10L^N^S^U^R^E
  8297.           CON    10L^S ^T^H^A^,10LT ^A^N ^I^,10LN^C^O^M^I^,10LN^G ^F^I^L
  8298.           CON    10L^E ^I^S ^S,10L^A^V^E^D ^,10LO^N ^Y^O^U,10L^R ^P^E^R^
  8299.           CON    10LM^A^N^E^N^,2LT ,10L^F^I^L^E^B,10L^A^S^E ^A^ 
  8300.           CON    10LN^D ^I^S ^,10LT^H^E ^D^E,10L^F^A^U^L^T,10L ^S^E^T^T^
  8301.           CON    6LI^N^G.,2L  ,10LI^F ^Y^O^U,10L ^A^L^R^E^
  8302.           CON    10LA^D^Y ^H^A,10L^V^E ^A ^F,10L^I^L^E ^O^,10LF ^T^H^E ^
  8303.           CON    10LS^A^M^E ^N,10L^A^M^E ^T^,10LH^E^N ^A ^,10LD^E^C^I^M^
  8304.           CON    4LA^L ,10L^I^N^T^E^G,10L^E^R ^I^S ,10L^A^D^D^E^D 
  8305.           CON    10L ^T^O ^T^H,10L^E ^F^I^L^,10LE ^N^A^M^E,2L.
  8306.           CON    2L  ,4L.EOR,2L  ,10L 
  8307.           CON    10L          ,10L     SET M,10LODE REPLAC,2LE
  8308.           CON    2L  ,10LA^N^Y ^I^N,10L^C^O^M^I^N,10L^G ^F^I^L^ 
  8309.           CON    10LE ^W^I^L^L,10L ^B^E ^S^A,10L^V^E^D ^O^,10LN ^Y^O^U^R
  8310.           CON    10L ^P^E^R^M^,10LA^N^E^N^T ,10L^F^I^L^E^B,8L^A^S^E;
  8311.           CON    10L^I^F ^Y^O^,10LU ^H^A^V^E,10L ^A^N ^E^X,10L^I^S^T^I^N
  8312.           CON    10L^G ^F^I^L^,10LE ^W^I^T^H,10L ^T^H^E ^S,10L^A^M^E ^N^
  8313.           CON    10LA^M^E ^A^S,10L ^T^H^E ^I,10L^N^C^O^M^I,4L^N^G 
  8314.           CON    10L^F^I^L^E ^,10LI^T ^W^I^L,10L^L ^B^E ^R,10L^E^P^L^A^C
  8315.           CON    6L^E^D. ,2L  ,4L.EOR,2L
  8316.           CON    10L          ,10L          ,10L      SET ,6LWINDOW 
  8317.           CON    2L  ,10LW^I^N^D^O^,10LW^I^N^G ^I,10L^S ^A^N ^E 
  8318.           CON    10L^X^T^E^N^S,10L^I^O^N ^O^,10LF ^T^H^E ^,10LB^A^S^I^C 
  8319.           CON    10LK^E^R^M^I^,10LT ^P^R^O^T,10L^O^C^O^L ^,6LA^N^D
  8320.           CON    10L^I^S ^C^U^,10LR^R^E^N^T^,10LL^Y ^S^U^P,10L^P^O^R^T^E
  8321.           CON    10L^D ^O^N ^A,10L ^F^E^W ^M,10L^I^C^R^O^S,10L.  I^T ^E^
  8322.           CON    10LN^A^B^L^E^,10LS ^M^O^R^E,10L ^T^H^A^N ,2L 
  8323.           CON    10L^O^N^E ^P^,10LA^C^K^E^T ,10L^A^C^K^N^O,10L^W^L^E^D^G
  8324.           CON    10L^E^M^E^N^T,10L ^T^O ^B^E,10L ^O^U^T^S^,10LT^A^N^D^I^
  8325.           CON    10LN^G ^A^N^D,10L ^R^E^S^U^,10LL^T^S ^I^N,4L ^A
  8326.           CON    10L^F^A^S^T^E,10L^R ^D^A^T^,10LA ^T^R^A^N,10L^S^F^E^R. 
  8327.           CON    10L G^E^N^E^R,10L^A^L^L^Y, ,10L^T^H^E ^L^,10LA^R^G^E^R 
  8328.           CON    10L^T^H^E ^W^,10LI^N^D^O^W ,8L^S^I^Z^E,10L^T^H^E ^F^ 
  8329.           CON    10LA^S^T^E^R ,10L^T^H^E ^T^,10LR^A^N^S^F^,4LE^R. 
  8330.           CON    2L  ,10LI^F ^W^I^N,10L^D^O^W^I^N,10L^G ^I^S ^R 
  8331.           CON    10L^E^Q^U^E^S,10L^T^E^D ^B^,10LU^T ^T^H^E,10L ^M^I^C^R^
  8332.           CON    10LO ^C^A^N^N,10L^O^T ^S^U^,10LP^P^O^R^T ,10L^I^T ^T^H^
  8333.           CON    4LI^S ,10L^I^S ^R^E^,10LS^O^L^V^E^,10LD ^A^T ^T^ 
  8334.           CON    10LH^E ^S^T^A,10L^R^T ^O^F ,10L^T^H^E ^T^,10LR^A^N^S^F^
  8335.           CON    10LE^R ^A^N^D,10L ^W^I^N^D^,10LO^W^I^N^G ,10L^I^S ^N^O^
  8336.           CON    10LT ^U^S^E^D,2L. ,2L  ,10LF^O^R ^M^O
  8337.           CON    10L^R^E ^I^N^,10LF^O^R^M^A^,10LT^I^O^N ^S,10L^E^E@D   S
  8338.           CON    10LET WINDOW ,10LON?   ^O^R,2L  ,10L 
  8339.           CON    10L          ,10L        SE,10LT WINDOW O,10LFF?  ^O^R 
  8340.           CON    2L  ,10L          ,10L          ,10L        SE 
  8341.           CON    10LT WINDOW S,4LIZE?,2L  ,4L.EOR 
  8342.           CON    2L  ,10L          ,10L          ,10L    SET WI 
  8343.           CON    8LNDOW ON ,2L  ,10LT^H^I^S ^S,10L^E^L^E^C^T
  8344.           CON    10L^S ^W^I^N^,10LD^O^W^I^N^,10LG ^A^N^D ^,10LI^S ^T^H^E
  8345.           CON    10L ^D^E^F^A^,10LU^L^T ^S^E,10L^T^T^I^N^G,2L.
  8346.           CON    10LT^H^E ^D^E,10L^F^A^U^L^T,10L ^W^I^N^D^,10LO^W ^S^I^Z
  8347.           CON    10L^E ^I^S 8.,2L  ,2L  ,4L.EOR 
  8348.           CON    2L  ,10L          ,10L          ,10L    SET WI 
  8349.           CON    8LNDOW OFF,2L  ,10LT^H^I^S ^D,10L^E^S^E^L^E
  8350.           CON    10L^C^T^S ^T^,10LH^E ^W^I^N,10L^D^O^W ^O^,10LP^T^I^O^N.
  8351.           CON    2L  ,2L  ,4L.EOR,2L
  8352.           CON    10L          ,10L          ,10L   SET WIN,10LDOW SIZE ^
  8353.           CON    2LM ,2L  ,10LT^H^I^S ^S,10L^E^T^S ^T^
  8354.           CON    10LH^E ^S^I^Z,10L^E ^O^F ^W,10L^I^N^D^O^W,10L ^T^O ^M ^
  8355.           CON    10LW^H^E^R^E ,8L0<^M<32.,10LT^H^E ^D^E,10L^F^A^U^L^T 
  8356.           CON    10L ^S^I^Z^E ,8L^I^S 8. ,2L  ,4L.EOR 
  8357.           CON    2L  ,10L          ,10L        SE,10LND ^F^I^L^ 
  8358.           CON    10LE^N^A^M^E ,10L[^A^L^T-^N,8L^A^M^E] ,2L
  8359.           CON    10LT^H^E SEND,10L ^C^O^M^M^,10LA^N^D ^T^R,10L^A^N^S^M^I
  8360.           CON    10L^T^S ^A ^F,10L^I^L^E ^T^,10LO ^A ^R^E^,10LM^O^T^E ^M
  8361.           CON    10L^I^C^R^O. ,2L  ,10LY^O^U ^S^H,10L^O^U^L^D ^ 
  8362.           CON    10LO^N^L^Y ^E,10L^N^T^E^R ^,10LA SEND ^C^,10LO^M^M^A^N^
  8363.           CON    10LD ^A^T ^T^,10LH^E ^E^N^D,10L ^O^F ^Y^O,4L^U^R 
  8364.           CON    10L^I^N^P^U^T,10L ^A^S ^T^H,10L^I^S ^C^O^,10LM^M^A^N^D 
  8365.           CON    10L^T^E^R^M^I,10L^N^A^T^E^S,10L ^T^H^E ^I,10L^N^T^E^R^A
  8366.           CON    10L^C^T^I^V^E,10L ^D^I^A^L^,8LO^G^U^E.,2L
  8367.           CON    10LF^I^L^E^N^,10LA^M^E ^I^S,10L ^T^H^E ^N,10L^A^M^E ^O^
  8368.           CON    10LF ^T^H^E ^,10LF^I^L^E ^T,10L^O ^B^E ^T,10L^R^A^N^S^M
  8369.           CON    10L^I^T^T^E^D,10L. I^F ^T^H,2L^E,10L^F^I^L^E ^ 
  8370.           CON    10LS^P^E^C^I^,10LF^I^E^D ^I,10L^S ^L^O^C^,10LA^L ^T^H^E
  8371.           CON    10L^N ^T^H^I^,10LS ^I^S ^S^,10LE^N^T ^O^T,10L^H^E^R^W^I
  8372.           CON    10L^S^E ^T^H^,10LE ^F^I^L^E,2L  ,10L^I^S ^O^B^ 
  8373.           CON    10LT^A^I^N^E^,10LD ^F^R^O^M,10L ^T^H^E ^P,10L^E^R^M^A^N
  8374.           CON    10L^E^N^T ^F^,10LI^L^E ^B^A,6L^S^E. ,2L
  8375.           CON    10LI^F @G^A^L,10L^T-^N^A^M^,10LE' ^I^S ^S,10L^P^E^C^I^F
  8376.           CON    10L^I^E^D ^T^,10LH^E^N ^T^H,10L^I^S ^I^S ,10L^T^H^E ^N^
  8377.           CON    10LA^M^E ^U^S,10L^E^D ^B^Y ,6L^T^H^E,10L^R^E^C^E^I 
  8378.           CON    10L^V^I^N^G K,10L^E^R^M^I^T,10L. N^O^T^E ,10L^T^H^A^T ^
  8379.           CON    10LI^F ^W^I^L,10L^D ^C^H^A^,10LR^A^C^T^E^,10LR^S ^A^R^E
  8380.           CON    10L ^U^S^E^D ,8L^T^H^E^N,10L^T^H^E ^A^,10LL^T^E^R^N^ 
  8381.           CON    10LA^T^I^V^E ,10L^N^A^M^E ^,10LA^P^P^L^I^,10LE^S ^O^N^L
  8382.           CON    10L^Y ^T^O ^T,10L^H^E ^F^I^,10LR^S^T ^F^I,10L^L^E ^S^E^
  8383.           CON    4LN^T.,2L  ,10LT^H^E ^C^H,10L^A^R^A^C^T
  8384.           CON    10L^E^R @G*' ,10L^C^A^N ^B^,10LE ^U^S^E^D,10L ^W^I^T^H^
  8385.           CON    10LI^N ^A ^F^,10LI^L^E ^N^A,10L^M^E ^T^O ,10L^S^P^E^C^I
  8386.           CON    4L^F^Y,10L^Z^E^R^O ^,10LO^R ^M^O^R,10L^E ^C^H^A^ 
  8387.           CON    10LR^A^C^T^E^,10LR^S. F^O^R,10L ^E^X^A^M^,10LP^L^E @G*'
  8388.           CON    10L ^W^O^U^L^,10LD ^M^E^A^N,10L ^A^L^L ^F,10L^I^L^E^S, 
  8389.           CON    2L  ,10L@G^X*' ^W^,10LO^U^L^D ^M,10L^E^A^N ^A^ 
  8390.           CON    10LL^L ^F^I^L,10L^E^S ^S^T^,10LA^R^T^I^N^,10LG ^W^I^T^H
  8391.           CON    10L ^T^H^E ^L,10L^E^T^T^E^R,8L @G^X'. ,2L
  8392.           CON    10LT^H^E ^C^H,10L^A^R^A^C^T,10L^E^R @G?' ,10L^C^A^N ^B^
  8393.           CON    10LE ^U^S^E^D,10L ^T^O ^R^E,10L^P^R^E^S^E,10L^N^T ^A^N^
  8394.           CON    10LY ^C^H^A^R,10L^A^C^T^E^R,8L. F^O^R ,10L^E^X^A^M^P 
  8395.           CON    10L^L^E @G^X?,10L' ^W^O^U^L,10L^D ^M^E^A^,10LN ^A^N^Y ^
  8396.           CON    10LF^I^L^E ^W,10L^H^O^S^E ^,10LN^A^M^E ^W,10L^A^S ^E^X^
  8397.           CON    10LA^C^T^L^Y ,6L^T^W^O,10L^C^H^A^R^A,10L^C^T^E^R^S 
  8398.           CON    10L ^L^O^N^G ,10L^A^N^D ^S^,10LT^A^R^T^S ,10L^W^I^T^H ^
  8399.           CON    10LA^N @G^X'.,2L  ,2L  ,4L.EOR 
  8400.           CON    2L  ,10L          ,10L          ,10L     RECEI 
  8401.           CON    10LVE [^N^A^M,4L^E] ,2L  ,10LW^H^E^N ^Y
  8402.           CON    10L^O^U ^I^S^,10LS^U^E ^A R,10LECEIVE ^C^,10LO^M^M^A^N^
  8403.           CON    10LD K^E^R^M^,10LI^T ^W^A^I,10L^T^S ^F^O^,10LR ^A^N ^I^
  8404.           CON    10LN^C^O^M^I^,4LN^G ,10L^F^I^L^E. ,10L Y^O^U ^S^ 
  8405.           CON    10LH^O^U^L^D ,10L^O^N^L^Y ^,10LE^N^T^E^R ,10L^A RECEIVE
  8406.           CON    10L ^C^O^M^M^,10LA^N^D ^A^T,10L ^T^H^E ^E,10L^N^D ^O^F 
  8407.           CON    2L  ,10L^Y^O^U^R ^,10LI^N^P^U^T ,10L^A^S ^T^H^ 
  8408.           CON    10LI^S ^C^O^M,10L^M^A^N^D ^,10LT^E^R^M^I^,10LN^A^T^E^S 
  8409.           CON    10L^T^H^E ^I^,10LN^T^E^R^A^,10LC^T^I^V^E ,10L^D^I^A^L^O
  8410.           CON    8L^G^U^E. ,2L  ,10LI^F @G^N^A,10L^M^E' ^I^S
  8411.           CON    10L ^S^P^E^C^,10LI^F^I^E^D ,10L^T^H^E ^T^,10LH^E ^F^I^R
  8412.           CON    10L^S^T ^F^I^,10LL^E ^R^E^C,10L^E^I^V^E^D,10L ^I^S ^S^A
  8413.           CON    6L^V^E^D,10L^U^S^I^N^G,10L ^T^H^I^S ,10L^N^A^M^E.
  8414.           CON    10LS^U^B^S^E^,10LQ^U^E^N^T ,10L^F^I^L^E^S,10L ^A^R^E ^S
  8415.           CON    10L^A^V^E^D ^,10LU^S^I^N^G ,10L^T^H^E ^N^,6LA^M^E
  8416.           CON    10L^G^I^V^E^N,10L ^B^Y ^T^H,10L^E ^T^R^A^,10LN^S^M^I^T^
  8417.           CON    10LT^I^N^G K^,10LE^R^M^I^T.,2L  ,2L
  8418.           CON    4L.EOR,2L  ,10L          ,10L
  8419.           CON    10L    SERVER,2L  ,2L  ,10LW^H^E^N ^Y
  8420.           CON    10L^O^U ^U^S^,10LE K^E^R^M^,10LI^T ^O^N ^,10LT^H^E C^Y^
  8421.           CON    10LB^E^R ^M^A,10L^I^N^F^R^A,10L^M^E ^F^R^,10LO^M ^A ^R^
  8422.           CON    10LE^M^O^T^E ,10L^M^I^C^R^O,2L  ,10L^A^N^D ^U^ 
  8423.           CON    10LS^E S^E^R^,10LV^E^R ^M^O,10L^D^E ^T^O ,10L^E^N^T^E^R
  8424.           CON    10L ^C^O^M^M^,10LA^N^D^S ^T,10L^H^E K^E^R,10L^M^I^T ^R^
  8425.           CON    10LU^N^N^I^N^,6LG ^O^N,10L^T^H^E ^M^,10LI^C^R^O ^W 
  8426.           CON    10L^H^I^C^H ^,10LW^I^L^L ^I,10L^N^S^T^R^U,10L^C^T ^T^H^
  8427.           CON    10LE C^Y^B^E^,10LR ^M^A^I^N,10L^F^R^A^M^E,10L ^A^C^C^O^
  8428.           CON    10LR^D^I^N^G^,4LL^Y.,10LI^F ^Y^O^U,10L ^D^O ^N^O 
  8429.           CON    10L^T ^U^S^E ,10L^S^E^R^V^E,10L^R ^M^O^D^,10LE ^Y^O^U ^
  8430.           CON    10LM^U^S^T ^E,10L^N^T^E^R ^,10LC^O^M^M^A^,10LN^D^S ^T^O
  8431.           CON    10L ^B^O^T^H ,6L^T^H^E,10LK^E^R^M^I^,10LT ^O^N ^T^ 
  8432.           CON    10LH^E ^M^I^C,10L^R^O ^A^N^,10LD ^T^H^E K,10L^E^R^M^I^T
  8433.           CON    10L ^O^N ^T^H,10L^E C^Y^B^E,4L^R. ,2L
  8434.           CON    10LI^F ^Y^O^U,10L^R ^M^I^C^,10LR^O ^H^A^S,10L ^A^N ^I^M
  8435.           CON    10L^P^L^E^M^E,10L^N^T^A^T^I,10L^O^N ^O^F ,10LK^E^R^M^I^
  8436.           CON    10LT ^T^H^A^T,10L ^C^A^N^N^,10LO^T ^T^A^L,2L^K 
  8437.           CON    10L^T^O ^S^E^,10LR^V^E^R^S ,10L^Y^O^U ^M^,10LU^S^T ^U^S
  8438.           CON    10L^E ^T^H^E ,10LC^Y^B^E^R ,10L^I^N ^N^O^,10LN-^S^E^R^V
  8439.           CON    10L^E^R ^M^O^,10LD^E.  I^F ,6L^Y^O^U,10L^F^I^N^D ^ 
  8440.           CON    10LT^H^A^T ^Y,10L^O^U ^C^A^,10LN^N^O^T ^U,10L^S^E ^T^H^
  8441.           CON    10LE GET ^C^O,10L^M^M^A^N^D,10L ^O^N ^Y^O,10L^U ^M^I^C^
  8442.           CON    10LR^O K^E^R^,6LM^I^T ,10L^Y^O^U ^W^,10LI^L^L ^N^O 
  8443.           CON    10L^T ^B^E ^A,10L^B^L^E ^T^,10LO ^U^S^E S,10L^E^R^V^E^R
  8444.           CON    10L ^M^O^D^E ,10L^T^O ^T^R^,10LA^N^S^F^E^,10LR ^F^I^L^E
  8445.           CON    4L^S. ,2L  ,4L.EOR,2L
  8446.           CON    10L          ,10L          ,8L    EXIT,2L
  8447.           CON    10LT^E^R^M^I^,10LN^A^T^E^S ,10L^T^H^E ^I^,10LN^T^E^R^A^
  8448.           CON    10LC^T^I^V^E ,10L^D^I^A^L^O,10L^G^U^E ^A^,10LN^D K^E^R^
  8449.           CON    6LM^I^T.,2L  ,4L.EOR,2L
  8450.           CON    10L          ,10L          ,8L VERSION,2L
  8451.           CON    10LD^I^S^P^L^,10LA^Y^S ^T^H,10L^E ^C^U^R^,10LR^E^N^T K^
  8452.           CON    10LE^R^M^I^T ,10L^V^E^R^S^I,10L^O^N ^N^U^,8LM^B^E^R. 
  8453.           CON    2L  ,4L.EOR,2L  ,10L 
  8454.           CON    10L          ,10L        ST,4LATUS,2L
  8455.           CON    10LSTATUS ^D^,10LI^S^P^L^A^,10LY^S ^T^H^E,10L ^S^T^A^T^
  8456.           CON    10LE ^O^F ^A^,10LN^Y @G^S^E,10L^T^T^A^B^L,10L^E' ^P^A^R
  8457.           CON    10L^A^M^E^T^E,10L^R^S.  F^O,2L^R,10L^I^N^S^T^A 
  8458.           CON    10L^N^C^E, ^T,10L^H^E ^C^U^,10LR^R^E^N^T ,10L^C^O^D^E, 
  8459.           CON    10L^W^I^N^D^O,10L^W ^S^I^Z^,10LE, ^W^H^E^,10LT^H^E^R ^D
  8460.           CON    10L^E^B^U^G ^,8LI^S ^O^N,10L^O^R ^O^F^,10LF, ^E^T^C. 
  8461.           CON    10L  I^T ^A^L,10L^S^O ^D^I^,10LS^P^L^A^Y^,10LS ^T^H^E ^
  8462.           CON    10LL^A^S^T ^T,10L^H^R^E^E ^,10LL^I^N^E^S ,10L^O^F ^Y^O^
  8463.           CON    4LU^R ,10L^L^O^G ^F^,10LI^L^E, ZZZ,10LZLOG.  T^H 
  8464.           CON    10L^I^S ^I^S ,10L^U^S^E^F^U,10L^L ^I^F ^Y,10L^O^U ^H^A^
  8465.           CON    10LV^E ^T^R^A,10L^N^S^F^E^R,10L^R^E^D ^A ,2L 
  8466.           CON    10L^F^I^L^E ^,10LA^N^D ^R^E,10L^Q^U^E^S^T,10L^E^D ^I^T 
  8467.           CON    10L^T^O ^B^E ,10L^S^A^V^E^D,10L ^B^U^T ^A,10L^L^R^E^A^D
  8468.           CON    10L^Y ^H^A^V^,10LE ^A ^F^I^,8LL^E ^O^F,10L^T^H^A^T ^ 
  8469.           CON    10LN^A^M^E ^P,10L^R^E^S^E^N,10L^T.  K^E^R,10L^M^I^T ^W^
  8470.           CON    10LI^L^L ^A^D,10L^D ^A ^D^E,10L^C^I^M^A^L,10L ^I^N^T^E^
  8471.           CON    10LG^E^R ^T^O,8L ^T^H^E ,10L^F^I^L^E^N,10L^A^M^E ^A^ 
  8472.           CON    10LN^D ^T^H^E,10L ^L^O^G ^F,10L^I^L^E ^W^,10LI^L^L ^T^E
  8473.           CON    10L^L^L ^Y^O^,10LU ^T^H^E ^,10LN^E^W ^N^A,10L^M^E ^O^F 
  8474.           CON    10L^T^H^E ^F^,6LI^L^E.,2L  ,4L.EOR 
  8475.           CON    2L  ,10L          ,10L          ,10L      TAKE 
  8476.           CON    10L ^F^I^L^E^,8LN^A^M^E ,2L  ,10LTAKE ^E^N^
  8477.           CON    10LA^B^L^E^S ,10L^Y^O^U ^T^,10LO ^U^S^E ^,10LA ^F^I^L^E
  8478.           CON    10L ^Y^O^U ^H,10L^A^V^E ^P^,10LR^E^V^I^O^,10LU^S^L^Y ^C
  8479.           CON    10L^R^E^A^T^E,8L^D ^T^O ,10L^S^E^T ^U^,10LP ^V^A^R^I 
  8480.           CON    10L^O^U^S ^P^,10LA^R^A^M^E^,10LT^E^R^S.  ,10LT^H^E ^F^I
  8481.           CON    10L^L^E ^Y^O^,10LU TAKE ^M^,10LU^S^T ^B^E,10L ^L^O^C^A^
  8482.           CON    2LL.,10LF^O^R ^E^X,10L^A^M^P^L^E,10L@D ^Y^O^U
  8483.           CON    10L^C^O^U^L^D,10L ^H^A^V^E ,10L^A ^F^I^L^,10LE ^T^H^A^T
  8484.           CON    10L ^S^E^T^S ,10L^U^P ^P^A^,10LR^A^M^E^T^,10LE^R^S ^S^O
  8485.           CON    2L  ,10L^Y^O^U ^C^,10LA^N ^T^R^A,10L^N^S^F^E^R 
  8486.           CON    10L ^A W^O^R^,10LDS^T^A^R ^,10LF^I^L^E ^F,10L^R^O^M ^A^
  8487.           CON    10LN IBM ^T^O,10L ^T^H^E C^,8LY^B^E^R.,10LI^N ^T^H^I 
  8488.           CON    10L^S ^C^A^S^,10LE ^Y^O^U^R,10L ^F^I^L^E ,10L^C^O^U^L^D
  8489.           CON    10L ^B^E ^C^A,10L^L^L^E^D I,10LBMCYB ^A^N,10L^D ^C^O^N^
  8490.           CON    10LT^A^I^N ^T,4L^H^E,10L^F^O^L^L^O,10L^W^I^N^G ^ 
  8491.           CON    10LL^I^N^E^S@,2LD ,2L  ,10L
  8492.           CON    10L          ,10L      SET ,10LCODE ASCII,2L 
  8493.           CON    10L          ,10L          ,10L      SET ,10LWINDOW 10 
  8494.           CON    2L  ,10L          ,10L          ,10L      SERV 
  8495.           CON    2LER,2L  ,10LY^O^U ^C^A,10L^N ^S^A^V^
  8496.           CON    10LE ^T^H^I^S,10L ^F^I^L^E ,10L^S^O ^E^V^,10LE^R^Y ^T^I
  8497.           CON    10L^M^E ^Y^O^,10LU ^W^A^N^T,10L ^T^O ^T^R,10L^A^N^S^F^E
  8498.           CON    10L^R ^B^E^T^,8LW^E^E^N ,10L^A^N IBM ^,10LA^N^D ^T^H 
  8499.           CON    10L^E C^Y^B^E,10L^R ^Y^O^U ,10L^N^E^E^D ^,10LO^N^L^Y ^E
  8500.           CON    10L^N^T^E^R@D,10L   TAKE IB,4LMCYB,10L^F^O^L^L^O 
  8501.           CON    10L^W^E^D ^B^,10LY ^A G^E^T,10L ^O^R S^E^,10LN^D ^C^O^M
  8502.           CON    10L^M^A^N^D ^,10LI^S^S^U^E^,10LD ^F^R^O^M,10L ^T^H^E ^M
  8503.           CON    10L^I^C^R^O. ,2L  ,2L  ,4L.EOR 
  8504.           CON    4L.EOR 
  8505.   
  8506.           END    KERMIT 
  8507.