home *** CD-ROM | disk | FTP | other *** search
/ Columbia Kermit / kermit.zip / d / usyskerm.alg < prev    next >
Text File  |  2020-01-01  |  452KB  |  5,579 lines

  1.  $PAGE % 599 BURR P59911A/KERMIT ALGOL SOURCE 041090 041090TA           00001000
  2.  $ SET ASCII                                                            00002000
  3. BEGIN                                                                   00004000
  4.                                                                         00005000
  5. DEFINE    VERS = "UNISYS KERMIT   VERSION 3/21/90  "                    00006000
  6.                  "(Modified for General Mills Inc.)"#;                  00007000
  7.                                                                         00008000
  8. % *****************************************************************     00009000
  9. % HEWLETT PACKARD HP3000                                                00009100
  10. %                                                                       00010000
  11. %      Version 1.0 : Ed Eldridge                                        00011000
  12. %                    Polaris, Inc.                                      00012000
  13. %                    1400 Wilson Blvd                                   00013000
  14. %                      suite 1100                                       00014000
  15. %                    Arlington, Virginia   22209                        00015000
  16. %                    (703) 527-7333                                     00016000
  17. %                                                                       00017000
  18. %      Version 2.0 : Tony Appelget                                      00018000
  19. %                    General Mills, Inc.                                00019000
  20. %                    P.O. Box 1113                                      00020000
  21. %                    Minneapolis, MN 55440                              00021000
  22. %                    (612) 540-7703                                     00022000
  23. %                                                                       00023000
  24. % BURROUGHS B6800                                                       00024000
  25. %                                                                       00024100
  26. %      Version 0.0 : Tony Appelget                                      00024200
  27. %                    General Mills, Inc.                                00024300
  28. %                    P.O. Box 1113                                      00024400
  29. %                    Minneapolis, MN 55440                              00024500
  30. %                    (612) 540-7703                                     00024600
  31. %                                                                       00024601
  32. %    * * * * * * * * * * * * * * * * * * * * * * * * * * * * *          00024602
  33. %                                                                       00024603
  34. %        I have left General Mills, and will no longer be able          00024604
  35. %        to maintain the Unisys Kermits unless, by chance or good       00024605
  36. %        fortune, I wind up in another Unisys shop.  I will be          00024606
  37. %        available to answer questions on a call-at-your-own risk       00024607
  38. %        basis.  My home phone is (612) 559-3764.                       00024608
  39. %                                        Tony Appelget                  00024609
  40. %                                        13 July 1994                   00024610
  41. %                                                                       00024611
  42. %    * * * * * * * * * * * * * * * * * * * * * * * * * * * * *          00024612
  43. %                                                                       00024700
  44. % First Burroughs inplementation    Tony Appelget     May  1986         00024800
  45. %                                                                       00024900
  46. %     Translated from the HP SPL Kermit.  Due to popular demand, this   00025000
  47. %     version of Kermit has been rushed into production.  Due to unpop- 00025100
  48. %     ular demand it is going into production in an uncomplete state    00025200
  49. %     (no paperwork was done for the project). It can move files but    00025300
  50. %     much remains to be done.                                          00025400
  51. %                                                                       00025500
  52. %     1. Many HP options are meaningless in a Burroughs environment and 00025600
  53. %        should be removed.                                             00025700
  54. %     2. Server mode doesn't work due to directory search differences.  00025800
  55. %     3. File validation doesn't work.  It hasn't even been thought of  00025900
  56. %        due to different file structuring.                             00026000
  57. %     4. Maintainability of the command scanner can be improved by using00026100
  58. %        numbered CASE statements in the input scanner.  This should be 00026200
  59. %        implemented BEFORE attempting to remove the HP options in order00026300
  60. %        to maintain some semblence of sanity in the programmer.        00026400
  61. %     5. Transfer speed is deplorable.  I have done what I could but it 00026500
  62. %        didn't seem to make much difference.  I suspect the Datagram   00026600
  63. %        may not be doing the times any good at all.                    00026700
  64. %                                                                       00026800
  65. % Patch history                                                         00026900
  66. %                                                                       00027000
  67. % Undocumented changes    November 1986   Tony Appelget                 00027100
  68. %     BUFEMP will log non-printable chars received.  We have been       00027200
  69. %     getting sync chars in the data on the new A10.  We also now       00027300
  70. %     log interrupts (?HI) in case anyone is interested.                00027400
  71. %                                                                       00027500
  72. % SSR 91-489    January 1987     Tony Appelget     (V1.0)               00027600
  73. %     Communications between this Kermit and PC Kermit V2.3 tended to   00027700
  74. %     experience a large number of retries and eventual abort of a file 00027800
  75. %     transmission.  The problem did not occur with PC Kermit V2.29.    00027900
  76. %     The problem was caused by a timeout occurring in the PC Kermit due00028000
  77. %     to the dismal performance of this Kermit.  Consequently, the sync 00028100
  78. %     was lost between the two Kermits.  I patched procedure SDATA to   00028200
  79. %     to discard ACK packets for the data packet preceding the current  00028300
  80. %     packet.                                                           00028400
  81. %                                                                       00028500
  82. %     While I had my fingers in the soup, I also fixed the following:   00028600
  83. %     1. Replaced `most all references to filename.OPEN with booleans   00028700
  84. %        in an attempt to get rid of the reputation of being a resource 00028800
  85. %        hog.                                                           00028900
  86. %     2. Reworked procedure SPACK to cut down on number of character-by-00029000
  87. %        character moves. I appear to have achieved a 30-35% improvement00029100
  88. %        of that one procedure, but that was a small part of the total. 00029200
  89. %     3. Attempted to do the same in procedure BUFILL with questionable 00029300
  90. %        results.                                                       00029400
  91. %     4. Changed the CASE statments in HELP and CMDINT to numbered CASES00029500
  92. %        to aid future maintainability.  The eventual goal is to get rid00029600
  93. %        of the HP-specific parameters, and implement some of the       00029700
  94. %        features that were disabled in the hurry of a controversial    00029800
  95. %        implementation.                                                00029900
  96. %     5. Lower-case user keyins are now handled properly.               00030000
  97. %     6. Replaced all references to HP and B6800 to Burroughs or        00030100
  98. %        similar throughout the program.                                00030200
  99. %     7. Eliminated some global variables that had meaning only in an   00030300
  100. %        HP3000 environment.  Commented out a number of procedures and  00030400
  101. %        references to them for the same reason.  Much remains to be    00030500
  102. %        done along this line.  It's mostly cosmetic, though.           00030600
  103. %     8. Eliminated all references (I hope) to file LNUM.  In particular00030700
  104. %        eliminated extranous open and close for every file moved.      00030800
  105. %     9. Changed the compile date to display the date compiled rather   00030900
  106. %        than the current date.                                         00031000
  107. %    10. Changed all 3-bit octal string references to 4-bit hex         00031100
  108. %        references.  Octal is dumb, dumb, dumb on any 8-bit machine!   00031200
  109. %    11. Assorted cleanup in comments, defines, etc; more than I can    00031300
  110. %        remember here.  I really should do fixing using a patch file.  00031400
  111. %    12. * * NOTE * * It has just occurred to me that SET RECEIVE BINARY00031500
  112. %        ON and SET SEND BINARY ON may not behave in a manner which may 00031600
  113. %        be intended or desired.  One might assume that they would yield00031700
  114. %        a bit-wise copy of the file on the destination as it existed on00031800
  115. %        the source machine.  It does not.  EBCDIC is still translated  00031900
  116. %        to ASCII and vice-versa.  Certain other actions, such as       00032000
  117. %        trailing blank inclusion/exclusion, inclusion/exclusion of     00032100
  118. %        CR/LF, etc are affected.  Do we want to leave things as they   00032200
  119. %        are or change things so that we do the bit-wise transmission?  00032300
  120. %                                                                       00032400
  121. %       UNSCHEDULED  MODS   FEB 87     TONY APPELGET                    00032500
  122. %       1. Added capability to generate and check 3-byte CRC            00032600
  123. %          block checking in anticipation of being able to handle       00032700
  124. %          long packets.  This Kermit will always attempt to use        00032800
  125. %          the 3-byte CRC unless negotiated down to 1-byte simple       00032900
  126. %          checksum by the other end.  Capability to handle 2-byte      00033000
  127. %          checksum will be deferred forever or until necessary,        00033100
  128. %          whichever comes first.                                       00033200
  129. %                                                                       00033300
  130. %       2. Fixed another bug that a casual user might never             00033400
  131. %          encounter.  If a file had been sent, received, or            00033500
  132. %          typed in non-server mode, and then the user attempted        00033600
  133. %          to upload a file in server mode, the previously speci-       00033700
  134. %          fied title, not the currently specified title, was           00033800
  135. %          used to store the file.                                      00033900
  136. %                                                                       00034000
  137. %       3. Improved efficiency of procedure CTL somewhat.  I suspect    00034100
  138. %          you will hardly notice the difference.                       00034200
  139. %                                                                       00034300
  140. %       4. Put a delay in procecedure TYPESW to slow down the writing   00034400
  141. %          to the terminal so that a ?HI could be seen by the program.  00034500
  142. %          Otherwise, countless writes were stacked up for the terminal 00034600
  143. %          and the effect of the ?HI was not seen for a long time.  The 00034700
  144. %          speed of the output does not seem to be appreciably affected.00034800
  145. %                                                                       00034900
  146. %     UNSCHEDULED FIX        APRIL 7, 88                 TONY APPELGET  00035000
  147. %       If a send initialize failed to connect with the other end       00035100
  148. %       of the circuit, any subsequent attempt to send a file failed    00035200
  149. %       immediately.  This patch resets the error count to zero.        00035300
  150. %                                                                       00035400
  151. %     SSR 91-557             4 MAY 88                    TONY APPELGET  00035500
  152. %       SENDSW always seemed to complain about a SEND failure           00035600
  153. %       regardless of the success or failure of a file trans-           00035700
  154. %       mission.  State was never being set to 'send complete           00035800
  155. %       state' ("C").  Fixed it.                                        00035900
  156. %                                                                       00036000
  157. %        UNSCHEDULED FIX     8 SEPT 88    TONY APPELGET                 00036100
  158. %         An attempt to communicate with a Kermit that did not          00036200
  159. %         specify any block check as part of SINIT caused this          00036300
  160. %         Kermit to use its default 3-byte CRC block check, causing     00036400
  161. %         the other Kermit to go bonkers over all packets.  This        00036500
  162. %         fix causes this Kermit to default to 1-byte block check       00036600
  163. %         when the other Kermit does not specify any block check.       00036700
  164.                                                                         00036800
  165. % ***************************************************************       00036900
  166. %                                                                       00037000
  167. %       GENERAL UPGRADE     APRIL -      89   TONY APPELGET             00037100
  168. %                                                                       00037200
  169. %        Bring program up to snuff with newer releases of PC and        00037300
  170. %        IBM Kermits.                                                   00037400
  171. %                                                                       00037500
  172. %        1.  Add QUIT as synonym for EXIT.                              00037600
  173. %                                                                       00037700
  174. %        2.  Changed 3-byte CRC calculation from table-lookup           00037800
  175. %            to strictly computational. (Purloined from PC mod          00037900
  176. %            MSSCOM.ASM.)                                               00038000
  177. %                                                                       00038100
  178. % *************************************************************         00038200
  179. %                                                                       00038300
  180. %       MORE UPGRADING      SUMMER 89 - SPRING 90   TONY APPELGET       00038400
  181. %       (SSR 91-622)                                                    00038410
  182. %                                                                       00038500
  183. %        Added long packet capability.  The protocol, as near as I      00038600
  184. %        can tell, was straight from the 'Kermit Protocol Manual'.      00038700
  185. %        It must be OK, because it talks to PC Kermit 2.31 just fine.   00038800
  186. %        Max packet size defined as 2000 bytes.  All testing was done   00038900
  187. %        against PC Kermit 2.31, which allowed only 1000 byte packets.  00039000
  188. %        Therefore, the possibility exists that an attempt to push      00039100
  189. %        the 2000 byte limit might cause a seg array or two when it     00039200
  190. %        is first tried.  Compatability with old, short packet Kermits  00039300
  191. %        appears to be OK.  The speed increase was disappointing.       00039400
  192. %        Transmission speeds only appear to be about double the short   00039500
  193. %        packet speeds.  I had expected more, since I got 6 to 7 times  00039600
  194. %        the speed going to long packets on IBM.  C'est la vit.         00039700
  195. %                                                                       00039800
  196. %        While messing around, I discovered the send-init packets are   00039900
  197. %        supposed to always start at packet number zero.  Most PC       00040000
  198. %        Kermits didn't seem to care, but I encountered one that did.   00040100
  199. %        Fixed the problem.                                             00040200
  200. %                                                                       00040300
  201. %        For what it is worth, I resequenced this patch history.        00040400
  202. %                                                                       00040500
  203. % *****************************************************************     00111000
  204.                                                                         00112000
  205. DEFINE    DBUF_WORDSIZE = 300#,                                         00113000
  206.           DBUF_BYTESIZE = DBUF_WORDSIZE*6#,                             00114000
  207.           LBUF_WORDSIZE = 340#,                                         00115000
  208.           LBUF_BYTESIZE = LBUF_WORDSIZE*6#,                             00116000
  209.           MAX_RCV_SIZE  = 94#,                                          00117000
  210.           MAX_LONGPACK_SIZE=2047#,                                      00117100
  211.                                                                         00118000
  212.           CR  =  47"0D"#,                                               00119000
  213.           LF  =  47"0A"#,                                               00120000
  214.           XON =  47"11"#,  %  DC1#,                                     00121000
  215.           EOT =  47"04"#,                                               00122000
  216.           SP  =  47"20"#,                                               00123000
  217.           HTAB=  47"09"#,                                               00124000
  218.         A_DEL =  47"7F"#;                                               00125000
  219.                                                                         00126000
  220. %  Configurable Parameters                                              00127000
  221.                                                                         00128000
  222. DEFINE  P_Q_8     = 7"&"#,   %  Prefered 8 Bit Quote                    00129000
  223.         P_RPT_CHR = 7"~"#;   %  Prefered Repeat Prefix                  00130000
  224.                                                                         00130100
  225. DEFINE  LONGP_F   = 1:0:1#,                                             00130200
  226.         WINDOWS_F = 2:0:1#,                                             00130300
  227.         ATTRS_F   = 3:0:1#;                                             00130400
  228.                                                                         00130500
  229.                                                                         00131000
  230. BOOLEAN USE_DC1    ,% = TRUE,                                           00132000
  231.         QUOTE_8    ,% = FALSE,                                          00133000
  232.         USE_REPEAT ,% = FALSE,                                          00134000
  233.         EXP_TABS   ,% = FALSE,                                          00135000
  234.         IMAGE      ;% = FALSE;                                          00136000
  235.                                                                         00137000
  236. INTEGER PAUSE_CNT     ,% = 0,                                           00138000
  237.         YOUR_PAD      ,% = 0,                                           00139000
  238.         YOUR_PAD_COUNT ,% = 0,                                          00140000
  239.         MAX_SND_SIZE   ,% = MAX_RCV_SIZE,                               00141000
  240.         MAX_SND_DATA   ,% = MAX_RCV_SIZE,                               00142000
  241.         LONGPACK_SIZE,                                                  00142100
  242.         YOUR_EOL       ,% = CR,                                         00143000
  243.         MY_EOL         ,% = CR,                                         00144000
  244.         MY_Q_CTL       ,% = %43,                                        00145000
  245.         YOUR_Q_CTL     ,% = %43,                                        00146000
  246.         Q_8            ,% = P_Q_8,                                      00147000
  247.         RPT_CHR        ,% = P_RPT_CHR,                                  00148000
  248.         MY_TO          ,% = 10,                                         00149000
  249.         YOUR_TO        ,% = 10,                                         00150000
  250.         MAXTRY         ; % = 10;                                        00151000
  251.                                                                         00151100
  252. REAL    MY_CAPS,                                                        00151200
  253.         YOUR_CAPS;                                                      00151300
  254.                                                                         00151400
  255. DEFINE  LOWBYTE = [7:48]#;                                              00151500
  256.                                                                         00151600
  257.                                                                         00152000
  258. DEFINE % FOR USER INPUT SCANNER                                         00153000
  259.        %  FIRST WORD OF USER COMMAND STUFF                              00154000
  260.        NULLV      = 0#,                                                 00155000
  261.        TAKEV      = 1#,    TAKESZ      = 4#,   TAKESZSZ         = 7#,   00156000
  262.        SENDV      = 2#,    SENDSZ      = 4#,   SENDSZSZ         = 7#,   00157000
  263.        RECEIVEV   = 3#,    RECEIVESZ   = 7#,   RECEIVESZSZ      = 10#,  00158000
  264.        SERVEV     = 4#,    SERVESZ     = 6#,   SERVESZSZ        = 9#,   00159000
  265.        SETV       = 5#,    SETSZ       = 3#,   SETSZSZ          = 6#,   00160000
  266.        EXITV      = 6#,    EXITSZ      = 4#,   EXITSZSZ         = 7#,   00161000
  267.        QUITV      = 6#,    QUITSZ      = 4#,   QUITSZSZ         = 7#,   00161100
  268.        DIRV       = 7#,    DIRSZ       = 3#,   DIRSZSZ          = 6#,   00162000
  269.        SPACEV     = 8#,    SPACESZ     = 5#,   SPACESZSZ        = 8#,   00163000
  270.        DELETEV    = 9#,    DELETESZ    = 6#,   DELETESZSZ       = 9#,   00164000
  271.        TYPEV      = 10#,   TYPESZ      = 4#,   TYPESZSZ         = 7#,   00165000
  272.        VERIFYV    = 11#,   VERIFYSZ    = 6#,   VERIFYSZSZ       = 9#,   00166000
  273.        STATUSV    = 11#,   STATUSSZ    = 6#,   STATUSSZSZ       = 9#,   00167000
  274.        %  SECOND WORD OF USER COMMAND STUFF                             00168000
  275.        DEBUGV     = 20#,   DEBUGSZ     = 5#,   DEBUGSZSZ        = 8#,   00169000
  276.        DELAYV     = 21#,   DELAYSZ     = 5#,   DELAYSZSZ        = 8#,   00170000
  277.        LINEV      = 22#,   LINESZ      = 4#,   LINESZSZ         = 7#,   00171000
  278.        SENDV_1    = 23#,                                                00172000
  279.        SPEEDV     = 24#,   SPEEDSZ     = 5#,   SPEEDSZSZ        = 8#,   00173000
  280.        HANDSHAKEV = 25#,   HANDSHAKESZ = 9#,   HANDSHAKESZSZ    = 12#,  00174000
  281.        RECEIVEV_1 = 26#,                                                00175000
  282.        LOGV       = 27#,   LOGSZ       = 3#,   LOGSZSZ          = 6#,   00176000
  283.        SOHV       = 28#,   SOHSZ       = 3#,   SOHSZSZ          = 6#,   00177000
  284.        %  THIRD WORD OF USER COMMAND STUFF                              00178000
  285.        PAUSEV     = 30#,   PAUSESZ     = 5#,   PAUSESZSZ        = 8#,   00179000
  286.        BINARYV    = 31#,   BINARYSZ    = 6#,   BINARYSZSZ       = 9#,   00180000
  287.        DEVICEV    = 32#,   DEVICESZ    = 6#,   DEVICESZSZ       = 9#,   00181000
  288.        FCODEV     = 33#,   FCODESZ     = 5#,   FCODESZSZ        = 8#,   00182000
  289.        RECLENV    = 34#,   RECLENSZ    = 6#,   RECLENSZSZ       = 9#,   00183000
  290.        BLOCKFV    = 35#,   BLOCKFSZ    = 6#,   BLOCKFSZSZ       = 9#,   00184000
  291.        FIXRECV    = 36#,   FIXRECSZ    = 6#,   FIXRECSZSZ       = 9#,   00185000
  292.        MAXRECV    = 37#,   MAXRECSZ    = 6#,   MAXRECSZSZ       = 9#,   00186000
  293.        MAXEXTV    = 38#,   MAXEXTSZ    = 6#,   MAXEXTSZSZ       = 9#,   00187000
  294.        SAVESPV    = 39#,   SAVESPSZ    = 6#,   SAVESPSZSZ       = 9#,   00188000
  295.        PROGV      = 40#,   PROGSZ      = 4#,   PROGSZSZ         = 7#,   00189000
  296.        BIN128V    = 41#,   BIN128SZ    = 6#,   BIN128SZSZ       = 9#,   00190000
  297.        TEXTV      = 42#,   TEXTSZ      = 4#,   TEXTSZSZ         = 7#,   00191000
  298.        TXT80V     = 43#,   TXT80SZ     = 5#,   TXT80SZSZ        = 8#,   00192000
  299.        EXPTABV    = 44#,   EXPTABSZ    = 6#,   EXPTABSZSZ       = 9#,   00193000
  300.        AUTOV      = 50#,   AUTOSZ      = 4#,   AUTOSZSZ         = 7#,   00194000
  301.        %  FOURTH WORD OF USER COMMAND STUFF                             00195000
  302.        ONV        = 51#,   ONSZ        = 2#,   ONSZSZ           = 5#,   00196000
  303.        OFFV       = 52#,   OFFSZ       = 3#,   OFFSZSZ          = 6#,   00197000
  304.        NONEV      = 53#,   NONESZ      = 4#,   NONESZSZ         = 7#,   00198000
  305.        XONV       = 54#,   XONSZ       = 3#,   XONSZSZ          = 6#,   00199000
  306.        XON2V      = 55#,   XON2SZ      = 4#,   XON2SZSZ         = 7#,   00200000
  307.        YESV       = 56#,   YESSZ       = 3#,   YESSZSZ          = 6#,   00201000
  308.        %  QUESTION MARK ANYWHERE FOR HELP                               00202000
  309.        QMARKV     = 60#,   QMARKSZ     = 1#,   QMARKSZSZ        = 4#,   00203000
  310.        NUMBERV    = 61#,                                                00204000
  311.        NOMORE     = NUTTIN#;                                            00205000
  312. VALUE ARRAY RESWDS                                                      00206000
  313.      ( TAKESZSZ,      TAKESZ,      70"TAKE",      TAKEV,                00207000
  314.        SERVESZSZ,     SERVESZ,     70"SERVER",    SERVEV,               00208000
  315.        SENDSZSZ,      SENDSZ,      70"SEND",      SENDV,                00209000
  316.        RECEIVESZSZ,   RECEIVESZ,   70"RECEIVE",   RECEIVEV,             00210000
  317.        SETSZSZ,       SETSZ,       70"SET",       SETV,                 00211000
  318.        EXITSZSZ,      EXITSZ,      70"EXIT",      EXITV,                00212000
  319.        QUITSZSZ,      QUITSZ,      70"QUIT",      EXITV,                00212100
  320.        DIRSZSZ,       DIRSZ,       70"DIR",       DIRV,                 00213000
  321.        SPACESZSZ,     SPACESZ,     70"SPACE",     SPACEV,               00214000
  322.        DELETESZSZ,    DELETESZ,    70"DELETE",    DELETEV,              00215000
  323.        TYPESZSZ,      TYPESZ,      70"TYPE",      TYPEV,                00216000
  324.        VERIFYSZSZ,    VERIFYSZ,    70"VERIFY",    VERIFYV,              00217000
  325.        STATUSSZSZ,    STATUSSZ,    70"STATUS",    STATUSV,              00218000
  326.                                                                         00219000
  327.        DEBUGSZSZ,     DEBUGSZ,     70"DEBUG",     DEBUGV,               00220000
  328.        LOGSZSZ,       LOGSZ,       70"LOG",       LOGV,                 00221000
  329.        HANDSHAKESZSZ, HANDSHAKESZ, 70"HANDSHAKE", HANDSHAKEV,           00222000
  330.        LINESZSZ,      LINESZ,      70"LINE",      LINEV,                00223000
  331.        SPEEDSZSZ,     SPEEDSZ,     70"SPEED",     SPEEDV,               00224000
  332.        DELAYSZSZ,     DELAYSZ,     70"DELAY",     DELAYV,               00225000
  333.        SOHSZSZ,       SOHSZ,       70"SOH",       SOHV,                 00226000
  334.        SENDSZSZ,      SENDSZ,      70"SEND",      SENDV_1,              00227000
  335.        RECEIVESZSZ,   RECEIVESZ,   70"RECEIVE",   RECEIVEV_1,           00228000
  336.                                                                         00229000
  337.        PAUSESZSZ,     PAUSESZ,     70"PAUSE",     PAUSEV,               00230000
  338.        BINARYSZSZ,    BINARYSZ,    70"BINARY",    BINARYV,              00231000
  339.        DEVICESZSZ,    DEVICESZ,    70"DEVICE",    DEVICEV,              00232000
  340.        FCODESZSZ,     FCODESZ,     70"FCODE",     FCODEV,               00233000
  341.        RECLENSZSZ,    RECLENSZ,    70"RECLEN",    RECLENV,              00234000
  342.        BLOCKFSZSZ,    BLOCKFSZ,    70"BLOCKF",    BLOCKFV,              00235000
  343.        FIXRECSZSZ,    FIXRECSZ,    70"FIXREC",    FIXRECV,              00236000
  344.        MAXRECSZSZ,    MAXRECSZ,    70"MAXREC",    MAXRECV,              00237000
  345.        MAXEXTSZSZ,    MAXEXTSZ,    70"MAXEXT",    MAXEXTV,              00238000
  346.        SAVESPSZSZ,    SAVESPSZ,    70"SAVESP",    SAVESPV,              00239000
  347.        PROGSZSZ,      PROGSZ,      70"PROG",      PROGV,                00240000
  348.        BIN128SZSZ,    BIN128SZ,    70"BIN128",    BIN128V,              00241000
  349.        TEXTSZSZ,      TEXTSZ,      70"TEXT",      TEXTV,                00242000
  350.        TXT80SZSZ,     TXT80SZ,     70"TXT80",     TXT80V,               00243000
  351.        EXPTABSZSZ,    EXPTABSZ,    70"EXPTAB",    EXPTABV,              00244000
  352.        AUTOSZSZ,      AUTOSZ,      70"AUTO",      AUTOV,                00245000
  353.                                                                         00246000
  354.        ONSZSZ,        ONSZ,        70"ON",        ONV,                  00247000
  355.        OFFSZSZ,       OFFSZ,       70"OFF",       OFFV,                 00248000
  356.        NONESZSZ,      NONESZ,      70"NONE",      NONEV,                00249000
  357.        XONSZSZ,       XONSZ,       70"XON",       XONV,                 00250000
  358.        XON2SZSZ,      XON2SZ,      70"XON2",      XON2V,                00251000
  359.        YESSZSZ,       YESSZ,       70"YES",       YESV,                 00252000
  360.        QMARKSZSZ,     QMARKSZ,     70"?",         QMARKV,               00253000
  361.        0, 0, 0, 0 );                                                    00254000
  362. % *****************************************************************     00255000
  363. %                                                                       00256000
  364. %      Parameters that are changed via the SET command                  00257000
  365. %                                                                       00258000
  366. % *****************************************************************     00259000
  367.                                                                         00260000
  368. BOOLEAN        RCV_BINARY , % = FALSE,     %  Binary if TRUE            00261000
  369.                RCV_FIXREC , % = TRUE,      %  Fixed records if TRUE     00262000
  370.                RCV_SAVESP ; % = TRUE;      %  Release unused space      00263000
  371.                                                                         00264000
  372. INTEGER        RCV_FCODE  , % = 0,         %  File code                 00265000
  373.                RCV_RECLEN , % = -80,       %  Record Length             00266000
  374.                RCV_BLOCKF , % = 16,        %  Blocking Factor           00267000
  375.                RCV_MAXEXT ; % = 32;        %  Max Extents               00268000
  376.                                                                         00269000
  377. INTEGER         RCV_MAXREC ; % = 5000d;     %  Max Records              00270000
  378.                                                                         00271000
  379. EBCDIC ARRAY    RCV_DEV[ 0:255 ];                                       00272000
  380. %                               "DISC            ";                     00273000
  381.                                                                         00274000
  382. INTEGER        SND_BINARY ; % = 0;         %  SEND Mode, %  0 = Auto    00275000
  383.                                         %             1 = Binary        00276000
  384.                                         %             2 = ASCII         00277000
  385.                                                                         00277100
  386. INTEGER        SND_RECLEN;              %  Maxrecsize                   00277200
  387.                                                                         00278000
  388. INTEGER  %     HNDSHK , % = 1,             %  Handshake, %  0 = None    00279000
  389.                                         %             1 = XON           00280000
  390.                                         %             2 = XON2          00281000
  391.                DEBUG_MODE ; % = 0,         %  Debug Mode                00282000
  392.          %     TSPEED , % = 0,             %  Line Speed (CPS)          00283000
  393.          %     LDEV_LINE ; % = 0;          %  Line LDEV                 00284000
  394.                                                                         00285000
  395. REAL           SOH,         % 4"01",       % Begin-packet character     00286000
  396.                MY_BLK_CK,   % "3",                                      00286100
  397.                YOUR_BLK_CK; % "3"                                       00286200
  398.                                                                         00287000
  399. INTEGER ARRAY  MIN_SIZE[0:69];     %  Used by input scanner to          00288000
  400.                                           %  ensure unique abbreviated  00289000
  401.                                           %  keywords                   00290000
  402.                                                                         00291000
  403. % *****************************************************************     00292000
  404.                                                                         00293000
  405.                                                                         00294000
  406. %  Buffers and etc.                                                     00295000
  407.                                                                         00296000
  408.      FILE  %   LNUM   , %  Line File                                    00297000
  409.                DNUM   , %  Disc file                                    00298000
  410.                CINUM  , %  CI Input                                     00299000
  411.                CONUM  , %  CI Output                                    00300000
  412.                VNUM   , %  Validation file                              00301000
  413.                TNUM   , %  Temp file                                    00301100
  414.                TAKENUM, %  TAKE File Number                             00302000
  415.                LOGNUM ;% = 0; %  Log Output                             00303000
  416. BOOLEAN        DNUM_OPEN,              % Data file open                 00303100
  417.                VNUM_OPEN,              % Validation file open           00303200
  418.                TNUM_OPEN,              % Temp file open                 00303300
  419.                TAKENUM_OPEN,           % Take file open                 00303400
  420.                LOGNUM_OPEN;            % Log file open                  00303500
  421.                                                                         00304000
  422.      BOOLEAN ARRAY  W_DBUF[0:DBUF_WORDSIZE],                            00305000
  423.                     W_LBUF[0:LBUF_WORDSIZE];                            00306000
  424.                                                                         00307000
  425.      ASCII ARRAY    DBUF[0] = W_DBUF,                                   00308000
  426.                     LBUF[0] = W_LBUF;                                   00309000
  427.                                                                         00310000
  428.      INTEGER        DBUFCNT,   %  Disc buffer ASCII count               00311000
  429.                     DBUF_RMAX, %  Receive Max Buf size                  00312000
  430.                     DBUFINX;   %  Disc buffer index                     00313000
  431.                                                                         00313900
  432. REAL                LBUFCNT;   %  Line buffer count                     00314000
  433.                                                                         00314100
  434.                                                                         00315000
  435.      ASCII ARRAY    PDATA[0:MAX_LONGPACK_SIZE]; %  Outgoing pkt data    00316000
  436.      INTEGER        PDATACNT;                                           00317000
  437.                                                                         00318000
  438.      ASCII ARRAY    RP_DATA[0:MAX_LONGPACK_SIZE]; %  Rcv (data) buf     00319000
  439.      REAL            RP; %  Response type                               00320000
  440.      INTEGER        RP_LEN,  %   Length of response data                00321000
  441.                     RP_NUM;  %  Packet number of response               00322000
  442.                                                                         00323000
  443.      ASCII ARRAY     PBUF[0:150];           % Utility buffer            00325000
  444.      INTEGER        PLEN;                                               00326000
  445.                                                                         00327000
  446.      ASCII ARRAY    L_FNAME[0:37],  %  Local file name                  00328000
  447.                     R_FNAME[0:37],  %  Remote file name                 00329000
  448.                     LOGNAME[0:35];  %  Current log file name            00330000
  449.                                                                         00331000
  450.      INTEGER        L_FNAME_LEN,  %  Length of Name                     00332000
  451.                     R_FNAME_LEN,  %  Length of Name                     00333000
  452.                     LOGNAME_LEN;  %  Length of log file name            00334000
  453.                                                                         00334100
  454.      EBCDIC ARRAY   TTL[0:95];   %  Titles can't be in ASCII            00334200
  455.                                                                         00334300
  456.                                                                         00335000
  457.      ASCII ARRAY          IB[0:79];      % Input Buffer                 00337000
  458.      REAL                ILEN;          %  Length of Current IB         00338000
  459.                                                                         00339000
  460. %  Misc                                                                 00340000
  461.                                                                         00341000
  462.      REAL       STATE,  %  Current state                                00342000
  463.                 Q8_IND; %  Receive Q8 flag                              00343000
  464.                                                                         00344000
  465.      INTEGER   N,       %  Current packet number                        00345000
  466.                NUMTRY,  %  Current "try" number                         00346000
  467.                OLDTRY;  %  Previous "try" number                        00347000
  468.                                                                         00348000
  469.      ASCII ARRAY     KT_NAME[0:31];  %  Temp file name                  00349000
  470.                                                                         00350000
  471.      INTEGER        KTN_LEN;        %  Length of KT_NAME                00351000
  472.                                                                         00352000
  473.      BOOLEAN        HAVE_KTEMP,     %  True IF temp file exists         00353000
  474.                     DBUF_WRITTEN,        %  Prevent LF from forcing     00354000
  475.                                          %  disc write after write      00355000
  476.                                          %  from full buffer            00356000
  477.                     BLASTED         ;% True if ?HI entered              00357000
  478.      VALUE ARRAY    VALID_TITLE_W(                                      00358000
  479.                       17973, 14649, 22092, 18756, 12118, 16716,         00359000
  480.                       18756, 16724, 17710, 20565, 16928, 0);            00360000
  481.      ASCII ARRAY     VALID_TITLE[0] = VALID_TITLE_W;                    00361000
  482. %    ASCII ARRAY     MYSELF[0:7];                                       00362000
  483.                                                                         00363000
  484.      INTEGER        ERROR,   %  For COMMAND int                         00364000
  485.                     PARM;    %       ditto                              00365000
  486.                                                                         00365100
  487.      POINTER        PTEMP;   % General purpose - mostly for OFFSETs     00365200
  488.                                                                         00365300
  489.      TRUTHSET       LETTERS(7"ABCDEFGHIJKLMNOPQRSTUVWXYZ"),             00365400
  490.                     NUMBERS(7"01234567890");                            00365500
  491.                                                                         00365600
  492.      TRANSLATETABLE LOWER_TO_UPPER(                                     00365700
  493.                     ASCII TO ASCII,                                     00365800
  494.                     7"abcdefghijklmnopqrstuvwxyz" TO                    00365900
  495.                     7"ABCDEFGHIJKLMNOPQRSTUVWXYZ" );                    00365910
  496.                                                                         00365920
  497.                                                                         00366000
  498. DEFINE E_ST = IF LOGNUM_OPEN THEN                                       00367000
  499.               BEGIN                                                     00368000
  500.                    REPLACE PBUF BY " " FOR 108;  % Clean out  trash     00369000
  501.                    REPLACE PBUF BY  #,                                  00369100
  502.        E_EN =      ;                                                    00369200
  503.                    WRITE(LOGNUM, 108, PBUF);                            00369300
  504.               END#,                                                     00369400
  505.                                                                         00369500
  506.        M_ST = REPLACE PTEMP:PBUF BY #,                                  00370000
  507.        M_EN = ; PLEN:=OFFSET(PTEMP);                                    00371000
  508.                 WRITE(CONUM, PLEN, PBUF) #,                             00372000
  509.                                                                         00372100
  510.        FOUR_ASCII_DIGITS(VAL, PTR) =                                    00372200
  511.            REPLACE PTR BY VAL FOR 4 DIGITS;                             00372300
  512.            REPLACE PTR:PTR BY                                           00372400
  513.                REAL(  BOOLEAN(REAL(PTR, 4)) AND                         00372500
  514.                       BOOLEAN(4"3F3F3F3F")  ).[31:48] FOR 4#,           00372600
  515.                                                                         00372700
  516.        FLUSH_DBUF = BEGIN                                               00373000
  517.                          WRITE(DNUM, RCV_RECLEN, DBUF);                 00374000
  518.                          DBUFINX := 0;                                  00375000
  519.                          REPLACE DBUF BY " " FOR RCV_RECLEN;            00375100
  520.                     END #,                                              00376000
  521.        KTEMP_NAME = 8"KMTTEMP" #,                                       00377000
  522.        RPACK_PACK = 1#,                                                 00377100
  523.        SPACK_PACK = 2#;                                                 00377200
  524.                                                                         00378000
  525. %DEFINE IN    = 0#,                                                     00379000
  526. %       OUT   = 1#,                                                     00380000
  527. %       IO    = 2#;                                                     00381000
  528.                                                                         00382000
  529.                                                                         00383000
  530.                                                                         00395000
  531.      INTEGER        I_DELAY; % = 10;    %  Initial Pause Duration       00396000
  532.                                                                         00397000
  533. % ****************************************************************      00398000
  534.                                                                         00399000
  535.  $ PAGE                                                                 00422000
  536.                                                                         00424000
  537. REAL PROCEDURE TOCHAR(CHR);                                             00425000
  538. VALUE                 CHR ;                                             00426000
  539. INTEGER               CHR ;                                             00427000
  540. BEGIN                                                                   00428000
  541.      TOCHAR := CHR + SP;                                                00429000
  542. END;                                                                    00430000
  543.                                                                         00431000
  544. % ****************************************************************      00432000
  545.                                                                         00433000
  546. INTEGER PROCEDURE UNCHAR(CHR);                                          00434000
  547. VALUE                    CHR ;                                          00435000
  548. REAL                     CHR;                                           00436000
  549. BEGIN                                                                   00437000
  550.      UNCHAR := CHR - SP;                                                00438000
  551. END;                                                                    00439000
  552.                                                                         00440000
  553. % ****************************************************************      00441000
  554.                                                                         00442000
  555. REAL PROCEDURE CTL(CHR);                                                00443000
  556. VALUE              CHR ;                                                00444000
  557. REAL               CHR ;                                                00445000
  558. BEGIN                                                                   00446000
  559. %    CTL := INTEGER(BOOLEAN(CHR) xor %100);                             00447000
  560.      CTL := REAL( NOT(BOOLEAN(CHR) EQV BOOLEAN(4"40")) );               00447100
  561. END;                                                                    00448000
  562.                                                                         00449000
  563. % ****************************************************************      00450000
  564.                                                                         00451000
  565. INTEGER PROCEDURE NPNO(PNO);                                            00452000
  566. VALUE                  PNO ;                                            00453000
  567. INTEGER                PNO ;                                            00454000
  568. BEGIN                                                                   00455000
  569.      NPNO := (PNO + 1) MOD 64;                                          00456000
  570. END;                                                                    00457000
  571.                                                                         00458000
  572. % *****************************************************************     00459000
  573.                                                                         00460000
  574. INTEGER PROCEDURE PPNO(PNO);                                            00461000
  575. VALUE                  PNO ;                                            00462000
  576. INTEGER                PNO ;                                            00463000
  577. BEGIN                                                                   00464000
  578.      IF PNO = 0 THEN                                                    00465000
  579.           PPNO := 63                                                    00466000
  580.      ELSE                                                               00467000
  581.           PPNO := PNO - 1;                                              00468000
  582. END;                                                                    00469000
  583.                                                                         00470000
  584. % *****************************************************************     00471000
  585.                                                                         00472000
  586. INTERRUPT BLAST;  % For ?HI                                             00473000
  587. BEGIN                                                                   00474000
  588.      BLASTED := TRUE;                                                   00475000
  589.      E_ST "* * * *  INTERRUPTED  * * * *" E_EN;                         00475100
  590. END;                                                                    00476000
  591.                                                                         00477000
  592. % *****************************************************************     00485000
  593.  $ PAGE                                                                 00485010
  594.  $ BEGINSEGMENT   % All send, receive, and packet handling in one seg   00485012
  595. REAL PROCEDURE CALCULATE_CRC(PKT, OFFSET, LEN);                         00485020
  596. VALUE                             OFFSET, LEN;                          00485030
  597. INTEGER                           OFFSET, LEN;                          00485040
  598. ASCII ARRAY                  PKT[0];                                    00485050
  599. BEGIN                                                                   00485060
  600.                                                                         00485070
  601.   %  Copied from the IBM-PC CRC calulator in module MSSCOM.ASM          00485080
  602.   %  and modified for better efficiency in this environment.  AX        00485090
  603.   %  and BX were the original PC registers and the nomenclature         00485100
  604.   %  was retained for want of better identifiers.                       00485110
  605.                                                                         00485120
  606.      BOOLEAN AX, DX;                                                    00485130
  607.      DEFINE  AH = AX.[15:8]#,                                           00485140
  608.              AL = AX.[7:8]#,                                            00485150
  609.              DH = DX.[15:8]#,                                           00485160
  610.              DL = DX.[7:8]#;                                            00485161
  611.                                                                         00485162
  612.      INTEGER I, LAST;                                                   00485163
  613.                                                                         00485164
  614.      DEFINE  XOR(U, V) = NOT( (U) EQV (V) )#;                           00485165
  615.      DX:=BOOLEAN(0);                                                    00485166
  616.                                                                         00485170
  617.      LAST:=(I:=OFFSET)+LEN-1;                                           00485175
  618.      DO BEGIN                                                           00485180
  619.           AH := BOOLEAN(REAL(PKT[I], 1));                               00485185
  620.           DL := XOR(DL, AH);                                            00485190
  621.           AH := XOR((FALSE & (DL)[11:7:8]), DL); %(DL & LSL(4)) XOR DL; 00485195
  622.           AL := FALSE;                                                  00485200
  623.           DX := DH OR AX;                                               00485205
  624.           AX := FALSE & AX[11:15:16];          %AX:=AX & LSR(4)         00485210
  625.           DL := XOR(DL, AH);                                            00485220
  626.           DX := XOR(DX, AX.[15:15] );          %DX XOR (AX & LSR(1));   00485230
  627.      END                                                                00485235
  628.      UNTIL ( I := I+1 ) > LAST;                                         00485240
  629.                                                                         00485245
  630.      CALCULATE_CRC := REAL(DX.[15:16]);                                 00485250
  631.                                                                         00485260
  632.      IF DEBUG_MODE > 0  AND  LOGNUM_OPEN  THEN                          00485261
  633.      BEGIN                                                              00485262
  634.           REPLACE PBUF BY                                               00485263
  635.                "CALC_CRC:",                                             00485264
  636.                TOCHAR(REAL(DX.[15:4])).LOWBYTE FOR 1,                   00485265
  637.                TOCHAR(REAL(DX.[11:6])).LOWBYTE FOR 1,                   00485266
  638.                TOCHAR(REAL(DX.[5:6])).LOWBYTE FOR 1,                    00485267
  639.                ":::", PKT[LAST-2] FOR 6, ":::", " " FOR 82;             00485268
  640.           WRITE(LOGNUM, 108, PBUF);                                     00485269
  641.      END;                                                               00485270
  642.                                                                         00485271
  643. END;                                                                    00485272
  644.                                                                         00485280
  645. %****************************************************************       00485290
  646.                                                                         00485300
  647. % **************************************************************        00485350
  648.                                                                         00485360
  649.  $ PAGE                                                                 00485370
  650.                                                                         00485380
  651. PROCEDURE WRITE_LOG(PACKET, LEN, WHO);                                  00485400
  652. VALUE                       LEN, WHO;                                   00485410
  653. INTEGER                     LEN, WHO;                                   00485420
  654. ASCII ARRAY         PACKET[0];                                          00485430
  655. BEGIN                                                                   00485440
  656.      REAL           HH,                                                 00485450
  657.                     MM,                                                 00485460
  658.                     SS,                                                 00485470
  659.                     TT,                                                 00485480
  660.                     NOW;                                                00485490
  661.                                                                         00485492
  662.      DEFINE         ASCII_IZE(T) =                                      00485500
  663.                            (40"3030" & (T DIV 10)[43:3:4]               00485510
  664.                                      & (T MOD 10)[35:3:4])#;            00485520
  665.      POINTER        PB;                                                 00485550
  666.                                                                         00485560
  667.      INTEGER        PB_L;    %  So we don't clobber PLEN                00485570
  668.                                                                         00485580
  669.      REPLACE PBUF BY " " FOR 80;                                        00485582
  670.      IF WHO = RPACK_PACK  THEN                                          00485590
  671.           REPLACE PB:PBUF BY "RPACK: "                                  00485600
  672.      ELSE                                                               00485610
  673.      IF WHO = SPACK_PACK  THEN                                          00485620
  674.           REPLACE PB:PBUF BY "SPACK: "                                  00485630
  675.      ELSE                                                               00485640
  676.           REPLACE PB:PBUF BY "?????? ";                                 00485650
  677.                                                                         00485670
  678.      NOW := TIME(11)*2.4@-6;                                            00485680
  679.                                                                         00485690
  680.      TT := ENTIER( (NOW-(NOW:=ENTIER(NOW)))*100 );                      00485700
  681.      SS := NOW MOD 60;                                                  00485710
  682.      MM := (NOW:=NOW DIV 60) MOD 60;                                    00485720
  683.      HH := NOW DIV 60;                                                  00485730
  684.      REPLACE PB:PB BY ASCII_IZE(HH) FOR 2, ":";                         00485740
  685.      REPLACE PB:PB BY ASCII_IZE(MM) FOR 2, ":";                         00485750
  686.      REPLACE PB:PB BY ASCII_IZE(SS) FOR 2, ".";                         00485760
  687.      REPLACE PB:PB BY ASCII_IZE(TT) FOR 2, "   (";                      00485762
  688.      FOUR_ASCII_DIGITS(LEN, PB);                                        00485766
  689.      REPLACE PB BY ")", " " FOR (80-OFFSET(PB));                        00485774
  690.      WRITE(LOGNUM, 80, PBUF);                                           00485780
  691.                                                                         00485790
  692.      REPLACE PBUF BY  " " FOR 7;                                        00485800
  693.      PB := PACKET;                                                      00485810
  694.                                                                         00485820
  695.      WHILE LEN > 72  DO                                                 00485830
  696.      BEGIN                                                              00485840
  697.           REPLACE  PBUF[7] BY PB:PB  FOR 72;                            00485850
  698.           WRITE(LOGNUM, 79, PBUF);                                      00485870
  699.           LEN := LEN-72;                                                00485880
  700.      END;                                                               00485890
  701.                                                                         00485900
  702.      IF LEN > 0  THEN                                                   00485910
  703.      BEGIN                                                              00485920
  704.           REPLACE PBUF[7] BY PB FOR LEN, " " FOR (72-LEN);              00485930
  705.           WRITE(LOGNUM, 79, PBUF);                                      00485940
  706.      END;                                                               00485950
  707.                                                                         00485960
  708. END;                                                                    00485970
  709. % *****************************************************************     00485980
  710.                                                                         00485990
  711.  $ PAGE                                                                 00581000
  712. PROCEDURE SPACK(TYP,NUM,LEN,DATA);                                      00583000
  713. VALUE           TYP,NUM,LEN      ;                                      00584000
  714. REAL            TYP              ;                                      00585000
  715. INTEGER             NUM,LEN      ;                                      00586000
  716. ASCII ARRAY                 DATA[0];                                    00587000
  717. BEGIN                                                                   00588000
  718.                                                                         00589000
  719.      BOOLEAN   R_ERROR;                                                 00590000
  720.      REAL      CHKSUM;                                                  00590100
  721.                                                                         00591000
  722.      INTEGER   IX,                                                      00592000
  723.                OX;                                                      00593000
  724.                                                                         00595000
  725.      REAL      P_INT;                                                   00596000
  726.                                                                         00597000
  727.      % -----------------------------------------------------------      00598000
  728.                                                                         00599000
  729.      DEFINE     XCK(CHR) =                                              00600000
  730.      BEGIN                                                              00603000
  731.           CHKSUM := CHKSUM + CHR;                                       00604000
  732.           REPLACE LBUF[OX:=OX+1] BY CHR.LOWBYTE FOR 1;                  00605000
  733.      END#;                                                              00607000
  734.                                                                         00608000
  735.      % -----------------------------------------------------------      00609000
  736.      PROCEDURE REGULAR_PACK;                                            00609100
  737.      BEGIN                                                              00610000
  738.           E_ST "REGULAR SIZE PACKETS" E_EN;                             00610001
  739.           REPLACE LBUF[0] BY SOH.LOWBYTE; % Start with SOH              00611000
  740.           IF (STATE = "S") OR      %  Then length                       00612000
  741.              (STATE = "R") OR                                           00612010
  742.              (YOUR_BLK_CK = "1")  THEN                                  00612100
  743.           XCK(TOCHAR(LEN+3))                                            00612200
  744.                ELSE                                                     00612300
  745.           XCK(TOCHAR(LEN+5));                                           00612400
  746.           XCK(TOCHAR(NUM));        %  Block number                      00613000
  747.           XCK(TYP);              %  Block type                          00614000
  748.                                                                         00615000
  749.           IF LEN NEQ 0 THEN       %  Data if needed                     00616000
  750.                FOR IX := 0 STEP 1 UNTIL LEN -1 DO                       00617000
  751.                     XCK(REAL(DATA[IX], 1));                             00618000
  752.                                                                         00619000
  753.           IF STATE = "S"  OR                                            00620100
  754.              STATE = "R"  OR                                            00620200
  755.              YOUR_BLK_CK = "1"  THEN                                    00620300
  756.           BEGIN  %   Kermit primative checksum                          00620400
  757.                CHKSUM := (CHKSUM.[7:2] + CHKSUM.[5:6]).[5:6];           00620500
  758.           REPLACE LBUF[OX:=OX+1] BY TOCHAR(CHKSUM).LOWBYTE FOR 1;       00620600
  759.           E_ST "   ONE-BYTE CK=", TOCHAR(CHKSUM).LOWBYTE FOR 1,         00620601
  760.                 "...", LBUF[OX-3] FOR 4, "..." E_EN;                    00620602
  761.           END                                                           00620800
  762.                ELSE                                                     00620900
  763.           BEGIN  %   Fancy 3-byte CRC                                   00621000
  764.                CHKSUM := CALCULATE_CRC(LBUF, 1, OX);                    00621100
  765.                REPLACE LBUF[OX:=OX+1] BY                                00621200
  766.                     TOCHAR(CHKSUM.[15:4]).LOWBYTE FOR 1,  % First byte  00621300
  767.                     TOCHAR(CHKSUM.[11:6]).LOWBYTE FOR 1,  % Second byte 00621400
  768.                     TOCHAR(CHKSUM.[5:6]).LOWBYTE FOR 1;   % Third byte  00621500
  769.                OX := OX+2;                                              00621600
  770.                E_ST "   THREE-BYTE CRC, ", LBUF[OX-5] FOR 6  E_EN;      00621601
  771.           END;                                                          00621610
  772.      END;                                                               00621700
  773.      % -------------------------------------------------------------    00621800
  774.      PROCEDURE LONG_PACK;                                               00621900
  775.      BEGIN                                                              00622000
  776.           E_ST "LONG PACKS...WHY???" E_EN;                              00622001
  777.           REPLACE LBUF[0] BY SOH.LOWBYTE FOR 1;                         00622100
  778.           XCK(TOCHAR(0));   % Length=0 says this is long data packet    00622200
  779.           XCK(TOCHAR(NUM)); % Packet number                             00622300
  780.           XCK(TYP);         % Should be "D" only                        00622400
  781.           IX := LEN + (YOUR_BLK_CK-"0");                                00622500
  782.           XCK(TOCHAR(IX DIV 95));   % Length, most significant part     00622600
  783.           XCK(TOCHAR(IX MOD 95)); % Length, least significant part      00622700
  784.           IX := TOCHAR( (CHKSUM.[7:2]+CHKSUM.[5:6]).[5:6] );% HDR BCC   00622800
  785.           XCK( IX );                                                    00622810
  786.           IF YOUR_BLK_CK = "1"  THEN                                    00622900
  787.           BEGIN                                                         00623000
  788.                FOR IX := 0 STEP 1 UNTIL LEN-1  DO                       00623100
  789.                     XCK(REAL(DATA[IX], 1));                             00623200
  790.                CHKSUM := (CHKSUM.[7:2]+CHKSUM.[5:6]).[5:6];             00623300
  791.                REPLACE LBUF[OX:=OX+1] BY TOCHAR(CHKSUM).LOWBYTE FOR 1;  00623400
  792.           END                                                           00623500
  793.                ELSE                                                     00623600
  794.           BEGIN  %   Fancy 3-byte CRC                                   00623700
  795.                REPLACE LBUF[OX:=OX+1] BY DATA FOR LEN;                  00623800
  796.                OX := OX+LEN;                                            00623900
  797.                CHKSUM := CALCULATE_CRC(LBUF, 1, OX-1);                  00624000
  798.                REPLACE LBUF[OX] BY                                      00624100
  799.                     TOCHAR(CHKSUM.[15:4]).LOWBYTE FOR 1,  % First byte  00624200
  800.                     TOCHAR(CHKSUM.[11:6]).LOWBYTE FOR 1,  % Second byte 00624300
  801.                     TOCHAR(CHKSUM.[5:6]).LOWBYTE FOR 1;  % Third byte   00624400
  802.                OX := OX+2;                                              00624410
  803.           END;                                                          00624420
  804.                                                                         00624500
  805.      END;                                                               00624700
  806.                                                                         00624800
  807.      % -----------------------------------------------------------      00624900
  808.                                                                         00625000
  809.      IF LOGNUM_OPEN THEN BEGIN                                          00625010
  810.        REPLACE PTEMP:PBUF BY "SPACK LEN=";                              00625020
  811.        FOUR_ASCII_DIGITS(LEN, PTEMP);                                   00625030
  812.        REPLACE PTEMP:PTEMP BY "  TYPE=", TYP.[7:48] FOR 1, " " FOR 10;  00625040
  813.        PLEN:=OFFSET(PTEMP);                                             00625050
  814.        WRITE(LOGNUM, PLEN, PBUF)       ;                                00625060
  815.      END;                                                               00625070
  816.      IF (LEN > MAX_SND_DATA) AND (TYP = "D") THEN                       00625100
  817.           LONG_PACK                                                     00625200
  818.      ELSE                                                               00625300
  819.           REGULAR_PACK;                                                 00625400
  820.                                                                         00625500
  821.      IF LBUF[OX]=" " THEN    %  Unisys has troubles with trailing blank 00625510
  822.           REPLACE LBUF[OX:=*+1] BY 4"7F" FOR 1;                         00625520
  823.      IF DEBUG_MODE > 0 AND LOGNUM_OPEN THEN                             00625600
  824.      BEGIN                                                              00625700
  825.           WRITE_LOG(LBUF, OX+1, SPACK_PACK);                            00628000
  826.      END;                                                               00629000
  827.                                                                         00630000
  828.      REPLACE LBUF[OX:=OX+1] BY YOUR_EOL.LOWBYTE FOR 1;  % Set end of lin00631000
  829.      OX := OX + 1;                                                      00632000
  830.                                                                         00633000
  831.      IF PAUSE_CNT NEQ 0 THEN                                            00634000
  832.      BEGIN                                                              00635000
  833.           P_INT := PAUSE_CNT/10;                                        00636000
  834.           WHEN(P_INT);  %  Pause for turnaround                         00637000
  835.      END;                                                               00638000
  836.                                                                         00639000
  837.      WRITE(CONUM, OX+2, LBUF);  %  Write the block                      00640000
  838.                                                                         00641000
  839. END;                                                                    00642000
  840.                                                                         00643000
  841. % ****************************************************************      00644000
  842.  $ PAGE                                                                 00645000
  843. BOOLEAN PROCEDURE RPACK(TYP,LEN,NUM,DATA);                              00646000
  844. REAL                    TYP              ;                              00647000
  845. INTEGER                     LEN,NUM      ;                              00648000
  846. ASCII ARRAY                         DATA[0];                            00649000
  847. BEGIN                                                                   00650000
  848.                                                                         00651000
  849.      INTEGER        IX,              %  General Index                   00652000
  850.                     PLEN,            %  Packet length                   00655000
  851.                     CHK_TYPE;                                           00655100
  852.                                                                         00656000
  853.      BOOLEAN        R_ERROR,           %  Error Flag                    00657000
  854.                     DONE;              %  Done Flag                     00657100
  855.                                                                         00657200
  856.      REAL           CCHKSUM,           %  Calculated checksum           00657300
  857.                     RCHKSUM;           %  Received checksum             00658000
  858.                                                                         00659000
  859.      POINTER        PACKET;                                             00660000
  860.                                                                         00661000
  861.      LABEL          XIT;    % Fast get-away                             00661100
  862.                                                                         00661200
  863.      % -----------------------------------------------------------      00662000
  864.                                                                         00663000
  865.      REPLACE LBUF BY 0 FOR SIZE(W_LBUF) WORDS;                          00664000
  866.      REPLACE LBUF BY 0 FOR (LBUF_BYTESIZE -1);                          00665000
  867.                                                                         00666000
  868.      IF STATE = "S"  OR                                                 00667000
  869.         STATE = "R"  OR                                                 00667100
  870.         YOUR_BLK_CK = "1"  THEN                                         00667200
  871.           CHK_TYPE := 1                                                 00667300
  872.      ELSE                                                               00667400
  873.           CHK_TYPE := 3;                                                00667500
  874.                                                                         00668000
  875.      LBUFCNT := REAL(READ(CINUM[TIMELIMIT MY_TO], LBUF_BYTESIZE, LBUF));00669000
  876.                                                                         00670000
  877.      IF BOOLEAN(LBUFCNT) THEN                                           00671000
  878.      BEGIN  %  Timeout                                                  00672000
  879.           R_ERROR := TRUE;                                              00673000
  880.                                                                         00674000
  881.           E_ST "RPACK - Timeout" E_EN;                                  00675000
  882.      END                                                                00676000
  883.           ELSE                                                          00677000
  884.      BEGIN  %  Have a packet                                            00678000
  885.                                                                         00679000
  886.           LBUFCNT:=LBUFCNT.[47:20];  %  How much was read               00679100
  887.           IF DEBUG_MODE > 0 AND LOGNUM_OPEN THEN                        00680000
  888.           BEGIN                                                         00681000
  889.                REPLACE PBUF BY " " FOR 108;  %  Keeps trash out of log  00681100
  890.                WRITE_LOG(LBUF, LBUFCNT, RPACK_PACK);                    00684000
  891.           END;                                                          00685000
  892.                                                                         00686000
  893.           IX := 0;                                                      00687000
  894.           WHILE NOT (DONE OR R_ERROR) DO                                00688000
  895.           BEGIN  %  Look for SOH                                        00689000
  896.                IF REAL(LBUF[IX], 1) = SOH THEN                          00690000
  897.                BEGIN                                                    00691000
  898.                     DONE := TRUE;                                       00692000
  899.                END                                                      00693000
  900.                     ELSE                                                00694000
  901.                BEGIN                                                    00695000
  902.                     IX := IX + 1;                                       00696000
  903.                     IF IX > (LBUFCNT - 4) THEN                          00697000
  904.                     BEGIN  %  SOH not found                             00698000
  905.                          R_ERROR := TRUE;                               00699000
  906.                          E_ST "RPACK - SOH not found" E_EN;             00700000
  907.                     END; %  No SOH                                      00701000
  908.                END; %  Not SOH                                          00702000
  909.           END; %  while                                                 00703000
  910.      END; %  Have a packet                                              00704000
  911.                                                                         00705000
  912.                                                                         00706000
  913.      IF R_ERROR THEN                                                    00707000
  914.      BEGIN                                                              00707100
  915.           RPACK := FALSE;                                               00707200
  916.           GO TO XIT;;                                                   00707300
  917.      END;                                                               00707400
  918.                                                                         00708000
  919.      %  Something in the buffer that starts with SOH.                   00709000
  920.      %  Let's see if everything else looks good.                        00710000
  921.                                                                         00711000
  922.      PACKET := LBUF[IX];   %  address packet                            00712000
  923.                                                                         00713000
  924.      PLEN := UNCHAR(REAL(PACKET, 2).[7:8]);                             00714000
  925.      IF PLEN > 0  THEN                                                  00714100
  926.      BEGIN      %  Regular packets                                      00714200
  927.        IF DEBUG_MODE>0 AND LOGNUM_OPEN THEN BEGIN                       00714209
  928.          REPLACE PTEMP:PBUF BY "LBUFCNT=";                              00714210
  929.          FOUR_ASCII_DIGITS(LBUFCNT, PTEMP);                             00714212
  930.          REPLACE PTEMP:PTEMP BY "   PLEN=";                             00714230
  931.          FOUR_ASCII_DIGITS(PLEN, PTEMP);                                00714240
  932.          REPLACE PTEMP:PTEMP BY "   LONGPACK_SIZE=";                    00714250
  933.          FOUR_ASCII_DIGITS(LONGPACK_SIZE, PTEMP);                       00714260
  934.          WRITE(LOGNUM, OFFSET(PTEMP), PBUF);                            00714270
  935.        END;                                                             00714280
  936.           PLEN := PLEN+2;                                               00714300
  937.           IF (IX + PLEN > LBUFCNT) OR                                   00715000
  938.              (PLEN > MAX_RCV_SIZE + 2) OR                               00716000
  939.              (PLEN < 5) THEN                                            00717000
  940.           BEGIN %  Length is not reasonable                             00718000
  941.                R_ERROR := TRUE;                                         00719000
  942.                E_ST "RPACK - Invalid length" E_EN;                      00720000
  943.           END                                                           00721000
  944.                ELSE                                                     00722000
  945.           BEGIN  %  Length is reasonable                                00724000
  946.                IF PACKET+3 = "N"  THEN   % NAKS get special handling    00725000
  947.                     CHK_TYPE := PLEN-4;                                 00725010
  948.                                                                         00725020
  949.                IF CHK_TYPE = 1  THEN                                    00725100
  950.                BEGIN  %   Kermit primative checksum                     00725400
  951.                     CCHKSUM := 0;                                       00725500
  952.                     THRU PLEN-2  DO                                     00725600
  953.                          CCHKSUM := *+REAL( LBUF[IX:=*+1], 1);          00725700
  954.                                                                         00725800
  955.                     CCHKSUM := (CCHKSUM.[7:2] + CCHKSUM.[5:6]).[5:6];   00725810
  956.                     CCHKSUM := TOCHAR(CCHKSUM);                         00725900
  957.                                                                         00726000
  958.                     RCHKSUM := REAL( LBUF[IX+1], 1 );                   00726100
  959.                END                                                      00726200
  960.                     ELSE                                                00726300
  961.                BEGIN                                                    00726400
  962.                     CCHKSUM := CALCULATE_CRC(LBUF, IX+1, PLEN-4);       00726500
  963.                                                                         00726600
  964.                     RCHKSUM := UNCHAR(REAL(PACKET+(PLEN-1), 1)) %  (10:100726700
  965.                             &  UNCHAR(REAL(PACKET+(PLEN-2), 1))[11:6]   00726800
  966.                             &  UNCHAR(REAL(PACKET+(PLEN-3), 1))[15:4];  00726900
  967.                                                                         00726910
  968.                     PLEN := PLEN-2;                                     00726920
  969.                END;                                                     00727000
  970.                                                                         00733000
  971.               IF CCHKSUM NEQ RCHKSUM THEN                               00734000
  972.               BEGIN  %  Bad checksum                                    00735000
  973.                     R_ERROR := TRUE;                                    00736000
  974.                     E_ST "RPACK - CHKSUM Error" E_EN;                   00737000
  975.               END;                                                      00738000
  976.           END;                                                          00739000
  977.      END                                                                00739010
  978.           ELSE                                                          00739020
  979.      BEGIN    %  Long packets                                           00739030
  980.           PLEN:=95*UNCHAR(REAL(PACKET+4, 1))+UNCHAR(REAL(PACKET+5, 1)); 00739040
  981.           IF DEBUG_MODE>0 AND LOGNUM_OPEN THEN BEGIN                    00739051
  982.             REPLACE PTEMP:PBUF BY "LBUFCNT=";                           00739052
  983.             FOUR_ASCII_DIGITS(LBUFCNT, PTEMP);                          00739053
  984.             REPLACE PTEMP:PTEMP BY "   PLEN=";                          00739055
  985.             FOUR_ASCII_DIGITS(PLEN, PTEMP);                             00739056
  986.             REPLACE PTEMP:PTEMP BY "   LONGPACK_SIZE=";                 00739059
  987.             FOUR_ASCII_DIGITS(LONGPACK_SIZE, PTEMP);                    00739060
  988.             WRITE(LOGNUM, OFFSET(PTEMP), PBUF);                         00739061
  989.           END;                                                          00739062
  990.           IF (PLEN > LBUFCNT)  OR                                       00739063
  991.              (PLEN > LONGPACK_SIZE+10)  THEN                            00739070
  992.           BEGIN                                                         00739080
  993.                R_ERROR := TRUE;                                         00739090
  994.                E_ST "RPACK - Invalid longpack length" E_EN;             00739100
  995.           END                                                           00739110
  996.                ELSE                                                     00739120
  997.           BEGIN                                                         00739130
  998.                IF PACKET+3 NEQ "D"  THEN                                00739140
  999.                BEGIN                                                    00739150
  1000.                     R_ERROR := TRUE;                                    00739160
  1001.                     E_ST "RPACK - Longpack not data" E_EN;              00739170
  1002.                END                                                      00739180
  1003.                     ELSE                                                00739190
  1004.                BEGIN     %  Calculate header checksum                   00739200
  1005.                     CCHKSUM := 0;                                       00739210
  1006.                     FOR IX := 1 STEP 1 UNTIL 5  DO                      00739220
  1007.                          CCHKSUM := CCHKSUM + REAL(PACKET+IX, 1);       00739230
  1008.                                                                         00739240
  1009.                     IX := IX-6;   %  Restore to SOH                     00739242
  1010.                     IF (CCHKSUM.[7:2]+CCHKSUM.[5:6]).[5:6]              00739250
  1011.                               NEQ UNCHAR(REAL(PACKET+6, 1))  THEN       00739260
  1012.                     BEGIN                                               00739270
  1013.                          R_ERROR := TRUE;                               00739280
  1014.                          E_ST "RPACK - Header checksum error" E_EN;     00739290
  1015.                     END                                                 00739300
  1016.                          ELSE                                           00739310
  1017.                     BEGIN                                               00739320
  1018.                          IF YOUR_BLK_CK = "1"  THEN                     00739330
  1019.                          BEGIN                                          00739340
  1020.                               FOR IX := 6 STEP 1 UNTIL PLEN-2+7  DO     00739350
  1021.                                  CCHKSUM:=CCHKSUM+REAL(PACKET+IX, 1);   00739360
  1022.                               CCHKSUM :=                                00739362
  1023.                                  (CCHKSUM.[7:2]+CCHKSUM.[5:6]).[5:6];   00739364
  1024.                                                                         00739370
  1025.                               RCHKSUM :=                                00739380
  1026.                                  UNCHAR( REAL(PACKET+(PLEN-1+7), 1) );  00739382
  1027.                          END                                            00739390
  1028.                               ELSE                                      00739400
  1029.                          BEGIN                                          00739410
  1030.                               CCHKSUM :=                                00739420
  1031.                                    CALCULATE_CRC(LBUF, IX+1, PLEN-4+7); 00739430
  1032.                                                                         00739440
  1033.                               RCHKSUM := REAL(LBUF[IX+7+PLEN-3], 3);    00739450
  1034.                               E_ST "RECVD X-SUM=",                      00739452
  1035.                                     RCHKSUM.[23:48] FOR 3,              00739454
  1036.                                     ":::"  E_EN;                        00739456
  1037.                               RCHKSUM := UNCHAR(RCHKSUM.[7:8])          00739460
  1038.                                        & UNCHAR(RCHKSUM.[15:8])[11:5:6] 00739470
  1039.                                        & UNCHAR(RCHKSUM.[23:8])[15:3:4];00739480
  1040.                                                                         00739490
  1041.                               %  PLEN := PLEN-2;                        00739500
  1042.                          END;                                           00739510
  1043.                                                                         00739520
  1044.                          IF CCHKSUM NEQ RCHKSUM  THEN                   00739530
  1045.                          BEGIN                                          00739540
  1046.                               R_ERROR := TRUE;                          00739550
  1047.                               E_ST                                      00739560
  1048.                                   "RPACK - Longpack checksum error"     00739570
  1049.                               E_EN;                                     00739580
  1050.                          END;                                           00739590
  1051.                     END;                                                00739600
  1052.                END;                                                     00739610
  1053.           END;                                                          00739620
  1054.      END;                                                               00740000
  1055.                                                                         00741000
  1056.      IF NOT R_ERROR THEN                                                00742000
  1057.      BEGIN  %  Packet OK, return the needed info                        00743000
  1058.           TYP := REAL(PACKET+3, 1);                                     00744000
  1059.           NUM := UNCHAR(REAL(PACKET+2, 1));                             00745000
  1060.           IF UNCHAR( REAL(PACKET+1, 1) )  NEQ  0 THEN                   00746000
  1061.           REPLACE DATA BY PACKET+4 FOR (LEN:=PLEN-5)                    00747000
  1062.                ELSE                                                     00748000
  1063.           REPLACE DATA BY PACKET+7 FOR (LEN:=PLEN-(YOUR_BLK_CK-"0"));   00748100
  1064.           RPACK := TRUE;                                                00749000
  1065.      END                                                                00750000
  1066.           ELSE                                                          00751000
  1067.      RPACK := FALSE;                                                    00752000
  1068. XIT:                                                                    00752100
  1069.                                                                         00752200
  1070. END;                                                                    00753000
  1071.  $ PAGE                                                                 00754000
  1072. PROCEDURE BUFILL(DATA,CNT,STAT);                                        00755000
  1073. ASCII ARRAY      DATA[0]          ;                                     00756000
  1074. INTEGER               CNT,STAT ;                                        00757000
  1075. BEGIN                                                                   00758000
  1076.                                                                         00759000
  1077.      BOOLEAN        DONE;                                               00760000
  1078.                                                                         00761000
  1079.      REAL           T,                                                  00762000
  1080.                     T7,                                                 00763000
  1081.                     INCLEN,                                             00764000
  1082.                     RPT_CNT,                                            00765000
  1083.                     IX,                                                 00766000
  1084.                     CLEFT,                                              00767000
  1085.                     BUF_MAX;                                            00767100
  1086.                                                                         00768000
  1087.      BOOLEAN        TRY_REPEAT;                                         00769000
  1088.                                                                         00770000
  1089.      POINTER        INC_P;                                              00770100
  1090.                                                                         00770200
  1091.      OWN ASCII ARRAY  INCBUF[0:5];  %  Intermediate Char Buf            00771000
  1092.                                                                         00772000
  1093.      % -----------------------------------------------------------      00773000
  1094.                                                                         00774000
  1095.      DEFINE GETCHAR(CHR) =                                              00775000
  1096.      BEGIN                                                              00777000
  1097.           %   Extract a char from the buffer and do not increment       00778000
  1098.           %   the index.  True is returned if EOF or some error         00779000
  1099.           %   condition occurs (STAT is set accordingly).               00780000
  1100.           %                                                             00781000
  1101.           %   If the buffer index (DBUFINX) is equal to the count       00782000
  1102.           %   (DBUFCNT) the buffer is empty. If in binary mode,         00783000
  1103.           %   we simply get another record. Otherwise (ASCII)           00784000
  1104.           %   we return EOL. In this case DBUFINX will equal            00785000
  1105.           %   DBUFCNT + 1 the next time thru.                           00786000
  1106.                                                                         00787000
  1107.           DONE := FALSE;                                                00788000
  1108.                                                                         00789000
  1109.           IF DBUFINX >= DBUFCNT THEN                                    00790000
  1110.           BEGIN  %  No data in buffer                                   00791000
  1111.                IF IMAGE OR (DBUFINX > DBUFCNT) THEN                     00792000
  1112.                BEGIN  %  Fill up the buffer                             00793000
  1113.                     DBUFCNT := REAL(READ(DNUM, SND_RECLEN, DBUF));      00794000
  1114.                     IF BOOLEAN(DBUFCNT) AND NOT BOOLEAN(DBUFCNT.[9:1])  00795000
  1115.                     THEN BEGIN %  Read error                            00796000
  1116.                          STAT := -1;                                    00797000
  1117.                          E_ST "BUFILL - Disc read error" E_EN;          00798000
  1118.                          DONE := TRUE;                                  00799000
  1119.                     END                                                 00800000
  1120.                          ELSE                                           00801000
  1121.                     IF BOOLEAN(DBUFCNT.[9:1]) THEN                      00802000
  1122.                     BEGIN  %   End of file                              00803000
  1123.                          DONE := TRUE;                                  00804000
  1124.                          IF CNT = 0 THEN STAT := 1;                     00805000
  1125.                          DBUFCNT :=  0;                                 00805100
  1126.                     END                                                 00806000
  1127.                          ELSE                                           00807000
  1128.                     BEGIN  %  Read went OK                              00808000
  1129.                                                                         00809000
  1130.                          DBUFINX := (DBUFCNT := SND_RECLEN) - 1;        00809100
  1131.                          IF NOT IMAGE THEN                              00810000
  1132.                          BEGIN %  Suppress trailing blanks              00811000
  1133.                               WHILE DBUFINX > 0 AND                     00813000
  1134.                                     DBUF[DBUFINX] = " " DO              00814000
  1135.                               BEGIN                                     00815000
  1136.                                    DBUFINX := DBUFINX - 1;              00816000
  1137.                               END;                                      00817000
  1138.                               DBUFCNT := DBUFINX + 1;                   00818000
  1139.                          END;                                           00819000
  1140.                                                                         00820000
  1141.                          DBUFINX := 0;                                  00821000
  1142. % +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++     00822000
  1143. %                                                                       00823000
  1144. %      WARNING: Zero length binary records will not be handled          00824000
  1145. %               properly.                                               00825000
  1146. %                                                                       00826000
  1147. % +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++     00827000
  1148.                          IF DBUFCNT > 0 THEN                            00828000
  1149.                               CHR := REAL(DBUF[0], 1)                   00829000
  1150.                          ELSE                                           00830000
  1151.                               CHR := CR;                                00831000
  1152.                     END;                                                00832000
  1153.                END                                                      00833000
  1154.                     ELSE                                                00834000
  1155.                BEGIN %  Return EOL                                      00835000
  1156.                     CHR := CR;                                          00836000
  1157.                END;                                                     00837000
  1158.           END %  No data in buffer                                      00838000
  1159.                ELSE                                                     00839000
  1160.           BEGIN                                                         00840000
  1161.                CHR := REAL(DBUF[DBUFINX], 1);                           00841000
  1162.           END;                                                          00842000
  1163.      END;                                                               00843000
  1164.      #;                                                                 00843100
  1165.                                                                         00844000
  1166.      % -----------------------------------------------------------      00845000
  1167.                                                                         00846000
  1168.      DEFINE PUTCHR(CHR) =                                               00847000
  1169.      BEGIN                                                              00850000
  1170.           REPLACE INC_P:INC_P BY CHR.LOWBYTE FOR 1;                     00851000
  1171. %         INCLEN := INCLEN + 1;                                         00852000
  1172.      END                                                                00853000
  1173.      #;                                                                 00853100
  1174.                                                                         00854000
  1175.      % -----------------------------------------------------------      00855000
  1176.                                                                         00855100
  1177.      DEFINE PUT_Q_CHR(CHR) =                                            00855200
  1178.      BEGIN                                                              00855300
  1179.           REPLACE INC_P:INC_P BY (MY_Q_CTL & CHR [15:8]).[15:48] FOR 2; 00855400
  1180. %         INCLEN := INCLEN + 2;                                         00855500
  1181.      END                                                                00855600
  1182.      #;                                                                 00855700
  1183.                                                                         00855800
  1184.      % ------------------------------------------------------------     00855900
  1185.                                                                         00856000
  1186.      CNT := 0;                                                          00857000
  1187.      STAT := 0;                                                         00858000
  1188.      IF LONGPACK_SIZE > MAX_SND_DATA  THEN                              00858600
  1189.           BUF_MAX := LONGPACK_SIZE                                      00858700
  1190.      ELSE                                                               00858800
  1191.           BUF_MAX := MAX_SND_DATA;                                      00858900
  1192.      CLEFT := BUF_MAX;  %  Compute room                                 00859000
  1193.      WHILE NOT DONE DO                                                  00860000
  1194.      BEGIN                                                              00861000
  1195.           GETCHAR(T);                                                   00862000
  1196.           IF NOT DONE THEN                                              00863000
  1197.           BEGIN                                                         00864000
  1198.                %  Transfer the character to an intermediate buffer      00865000
  1199.                %  (INCBUF). If a multi-character sequence is            00866000
  1200.                %  generated, it is placed in INCBUF in reverse          00867000
  1201.                %  order. The sequence is re-inverted later.             00868000
  1202.                                                                         00869000
  1203.                T7 := T.[6:7];  %  Get low seven bits                    00870000
  1204.                                                                         00871000
  1205.                INCLEN := 0;                                             00872000
  1206.                INC_P := INCBUF;                                         00872100
  1207.                TRY_REPEAT := USE_REPEAT;                                00873000
  1208.                IF (T7 = CR) AND (NOT IMAGE) THEN                        00874000
  1209.                BEGIN %  Generate END-of-line sequence                   00875000
  1210.                     TRY_REPEAT := FALSE;                                00876000
  1211.                     PUT_Q_CHR(CTL(LF));                                 00877000
  1212. %                   PUTCHR(MY_Q_CTL);                                   00878000
  1213.                     PUT_Q_CHR(CTL(CR));                                 00879000
  1214. %                   PUTCHR(MY_Q_CTL);                                   00880000
  1215.                END                                                      00881000
  1216.                     ELSE                                                00882000
  1217.                BEGIN                                                    00883000
  1218.                     IF T7 < SP OR T7 = A_DEL THEN                       00884000
  1219.                     BEGIN  %  Control char                              00885000
  1220.                          IF QUOTE_8 THEN                                00886000
  1221.                               PUT_Q_CHR(CTL(T7))                        00887000
  1222.                          ELSE                                           00888000
  1223.                               PUT_Q_CHR(CTL(T));                        00889000
  1224. %                        PUTCHR(MY_Q_CTL);                              00890000
  1225.                     END                                                 00891000
  1226.                          ELSE                                           00892000
  1227.                     IF (T7 = MY_Q_CTL)          OR                      00893000
  1228.                        (QUOTE_8 AND T7 = Q_8)   OR                      00894000
  1229.                        (USE_REPEAT AND T7 = RPT_CHR)     THEN           00895000
  1230.                     BEGIN %  Quote a not-control char                   00896000
  1231.                          IF QUOTE_8 THEN                                00897000
  1232.                               PUT_Q_CHR(T7)                             00898000
  1233.                          ELSE                                           00899000
  1234.                               PUT_Q_CHR(T);                             00900000
  1235. %                        PUTCHR(MY_Q_CTL);                              00901000
  1236.                     END                                                 00902000
  1237.                          ELSE                                           00903000
  1238.                     BEGIN %  Regular char                               00904000
  1239.                          IF QUOTE_8 THEN                                00905000
  1240.                               PUTCHR(T7)                                00906000
  1241.                          ELSE                                           00907000
  1242.                               PUTCHR(T);                                00908000
  1243.                     END;                                                00909000
  1244.                                                                         00910000
  1245.                     IF QUOTE_8 AND (T NEQ T7) THEN                      00911000
  1246.                          PUTCHR(Q_8);                                   00912000
  1247.                END;                                                     00913000
  1248.                                                                         00914000
  1249.                %  The single char sequence has been generated.          00915000
  1250.                %  Continue if it will fit in the buffer.                00916000
  1251.                                                                         00917000
  1252.                IF (INCLEN:=OFFSET(INC_P)) > CLEFT THEN                  00918000
  1253.                BEGIN %  It won't fit                                    00919000
  1254.                     DONE := TRUE;                                       00920000
  1255.                END                                                      00921000
  1256.                     ELSE                                                00922000
  1257.                BEGIN  %  Accepted                                       00923000
  1258.                     DBUFINX := DBUFINX +1;                              00924000
  1259.                     IF TRY_REPEAT AND (CLEFT - INCLEN >= 2) THEN        00925000
  1260.                     BEGIN                                               00926000
  1261.                                                                         00927000
  1262.                          %  OK, now we do repeat processing.            00928000
  1263.                          %  Count the adjacent occurences.              00929000
  1264.                                                                         00930000
  1265.                          IX := DBUFINX;                                 00931000
  1266.                          WHILE (IX < DBUFCNT) AND                       00932000
  1267.                                (REAL(DBUF[IX], 1) = T) DO               00933000
  1268.                          BEGIN                                          00934000
  1269.                               IX := IX +1;                              00935000
  1270.                          END;                                           00936000
  1271.                                                                         00937000
  1272.                          RPT_CNT := IX - DBUFINX + 1;                   00938000
  1273.                          IF RPT_CNT > 94 THEN                           00939000
  1274.                               RPT_CNT := 94;                            00940000
  1275.                                                                         00941000
  1276.                          %  Use the repeat count only if it             00942000
  1277.                          %  saves space in the buffer.                  00943000
  1278.                                                                         00944000
  1279.                          IF (INCLEN +2) < (INCLEN * RPT_CNT) THEN       00945000
  1280.                          BEGIN %  Use repeat                            00946000
  1281.                               PUTCHR(TOCHAR(RPT_CNT));                  00947000
  1282.                               PUTCHR(RPT_CHR);                          00948000
  1283.                               DBUFINX := DBUFINX + RPT_CNT - 1;         00949000
  1284.                               INCLEN := INCLEN + 2;                     00949100
  1285.                          END;                                           00950000
  1286.                     END;                                                00951000
  1287.                                                                         00952000
  1288.                     %  Transfer to the buffer                           00953000
  1289.                                                                         00954000
  1290.                     WHILE INCLEN > 0 DO                                 00955000
  1291.                     BEGIN                                               00956000
  1292.                          REPLACE DATA[CNT] BY INCBUF[INCLEN:=*-1] FOR 1;00958000
  1293.                          CNT := CNT + 1;                                00959000
  1294.                     END;                                                00960000
  1295.                                                                         00961000
  1296.                     CLEFT := BUF_MAX - CNT;                             00962000
  1297.                     IF CLEFT <= 0 THEN DONE := TRUE;                    00963000
  1298.                END;                                                     00964000
  1299.           END;                                                          00965000
  1300.      END;                                                               00966000
  1301. END;                                                                    00967000
  1302.  $ PAGE                                                                 00968000
  1303. PROCEDURE BUFEMP(DATA,CNT);                                             00969000
  1304. ASCII ARRAY       DATA[0]     ;                                         00970000
  1305. INTEGER               CNT ;                                             00971000
  1306. BEGIN                                                                   00972000
  1307.                                                                         00973000
  1308.      INTEGER        I,                                                  00974000
  1309.                     RPT_CNT,                                            00975000
  1310.                     T,                                                  00976000
  1311.                     T_HI,                                               00977000
  1312.                     T7;                                                 00978000
  1313.                                                                         00979000
  1314. % ----------------------------------------------------------------      00980000
  1315.                                                                         00980100
  1316.      DEFINE HEXIFY(X) =                                                 00980200
  1317.           (X + (IF X<10 THEN 7"0" ELSE 7"A"))                           00980300
  1318.      #;                                                                 00980400
  1319.                                                                         00980500
  1320. % ----------------------------------------------------------------      00980600
  1321.                                                                         00981000
  1322.      DEFINE NCHAR =                                                     00982000
  1323.      BEGIN                                                              00983000
  1324.           IF (T7:=(T:=REAL(DATA[I], 1)).[6:7]) < 7" " THEN              00984000
  1325.           IF LOGNUM_OPEN THEN                                           00984100
  1326.           BEGIN                                                         00984200
  1327.                REPLACE PTEMP:PBUF BY                                    00984300
  1328.                     7"BUFEMP - nonprintable char  =  HEX ",             00984400
  1329.                     HEXIFY(T.[7:4]).LOWBYTE FOR 1,                      00984500
  1330.                     HEXIFY(T.[3:4]).LOWBYTE FOR 1;                      00984700
  1331.                REPLACE PTEMP BY " " FOR 108-OFFSET(PTEMP);              00984900
  1332.                WRITE(LOGNUM, 108, PBUF);                                00985000
  1333.           END;                                                          00985100
  1334.           I := I + 1;                                                   00986000
  1335.      END;                                                               00987000
  1336.      #;                                                                 00987100
  1337.                                                                         00988000
  1338. % ----------------------------------------------------------------      00989000
  1339.                                                                         00990000
  1340.                                                                         00990200
  1341.      WHILE I < CNT DO                                                   00991000
  1342.      BEGIN                                                              00992000
  1343.           T_HI := 0;  %  Hold high bit here IF quote 8                  00993000
  1344.                                                                         00994000
  1345.           RPT_CNT := 1;                                                 00995000
  1346.                                                                         00996000
  1347.           NCHAR;                                                        00997000
  1348.           IF USE_REPEAT AND (T7 = RPT_CHR) THEN                         00998000
  1349.           BEGIN  %  Process repeat                                      00999000
  1350.                NCHAR;                                                   01000000
  1351.                RPT_CNT := UNCHAR(T7);                                   01001000
  1352.                NCHAR;                                                   01002000
  1353.           END;                                                          01003000
  1354.                                                                         01004000
  1355.           IF QUOTE_8 AND (T7 = Q_8) THEN                                01005000
  1356.           BEGIN                                                         01006000
  1357.                T_HI := 128;                                             01007000
  1358.                NCHAR;                                                   01008000
  1359.           END;                                                          01009000
  1360.                                                                         01010000
  1361.           IF T7 = YOUR_Q_CTL THEN                                       01011000
  1362.           BEGIN                                                         01012000
  1363.                NCHAR;                                                   01013000
  1364.                IF T7 >= 4"3F" AND T7 <= 4"5F" THEN                      01014000
  1365.                     T := CTL(T);                                        01015000
  1366.                T7 := T.[6:7];                                           01016000
  1367.           END;                                                          01017000
  1368.                                                                         01018000
  1369.           IF QUOTE_8 THEN                                               01019000
  1370.                T := T_HI + T7; %  Got the real character                01020000
  1371.                                                                         01021000
  1372.           IF (NOT IMAGE) AND T7 = CR THEN                               01022000
  1373.                RPT_CNT := 0; %  Throw away CR                           01023000
  1374.                                                                         01024000
  1375.           IF EXP_TABS AND T7=HTAB  THEN                                 01025000
  1376.           BEGIN                                                         01026000
  1377.                RPT_CNT:=8*RPT_CNT - (DBUFINX MOD 8);                    01027000
  1378.                T:="  ";                                                 01028000
  1379.           END;                                                          01029000
  1380.                                                                         01030000
  1381.           %  Transfer to disc buffer                                    01031000
  1382.                                                                         01032000
  1383.           WHILE RPT_CNT > 0 DO                                          01033000
  1384.           BEGIN                                                         01034000
  1385.                RPT_CNT := RPT_CNT - 1;                                  01035000
  1386.                IF (NOT IMAGE) AND (T7 = LF) THEN                        01036000
  1387.                BEGIN                                                    01037000
  1388.                     IF DBUF_WRITTEN THEN                                01038000
  1389.                     BEGIN                                               01039000
  1390.                          DBUF_WRITTEN := FALSE;                         01040000
  1391.                          IF DBUFINX > 0 THEN                            01041000
  1392.                               FLUSH_DBUF;                               01042000
  1393.                     END                                                 01043000
  1394.                          ELSE                                           01044000
  1395.                     FLUSH_DBUF;                                         01045000
  1396.                END                                                      01046000
  1397.                     ELSE                                                01047000
  1398.                BEGIN                                                    01048000
  1399.                     REPLACE DBUF[DBUFINX] BY T.LOWBYTE FOR 1;           01049000
  1400.                     IF DBUFINX:=*+1 >= RCV_RECLEN THEN                  01051000
  1401.                     BEGIN                                               01052000
  1402.                          FLUSH_DBUF;                                    01053000
  1403.                          DBUF_WRITTEN := TRUE;                          01054000
  1404.                     END;                                                01055000
  1405.                END;                                                     01056000
  1406.           END;                                                          01057000
  1407.      END;                                                               01058000
  1408. END;                                                                    01059000
  1409.  $ PAGE                                                                 01060000
  1410. BOOLEAN PROCEDURE CBUFXLT(IDATA,ICNT,ODATA,OCNT,OMAX);                  01062000
  1411. VALUE                           ICNT,           OMAX ;                  01063000
  1412. ASCII ARRAY               IDATA[0],  ODATA[0]           ;               01064000
  1413. INTEGER                         ICNT,      OCNT,OMAX ;                  01065000
  1414. BEGIN                                                                   01066000
  1415.                                                                         01067000
  1416.      INTEGER        I,                                                  01068000
  1417.                     RPT_CNT,                                            01069000
  1418.                     T,                                                  01070000
  1419.                     T_HI,                                               01071000
  1420.                     T7;                                                 01072000
  1421.                                                                         01073000
  1422. % ----------------------------------------------------------------      01074000
  1423.                                                                         01075000
  1424.      DEFINE NCHAR =                                                     01076000
  1425.      BEGIN                                                              01077000
  1426.           T := REAL(IDATA[I], 1);                                       01078000
  1427.           T7 := T.[6:7];                                                01079000
  1428.           I := I + 1;                                                   01080000
  1429.      END;                                                               01081000
  1430.      #;                                                                 01081100
  1431.                                                                         01082000
  1432. % ----------------------------------------------------------------      01083000
  1433.                                                                         01084000
  1434.      OCNT := 0;                                                         01085000
  1435.      CBUFXLT := TRUE;                                                   01086000
  1436.                                                                         01087000
  1437.      WHILE I < ICNT DO                                                  01088000
  1438.      BEGIN                                                              01089000
  1439.           T_HI := 0;  %  Hold high bit here IF quote 8                  01090000
  1440.                                                                         01091000
  1441.           RPT_CNT := 1;                                                 01092000
  1442.                                                                         01093000
  1443.           NCHAR;                                                        01094000
  1444.           IF USE_REPEAT AND (T7 = RPT_CHR) THEN                         01095000
  1445.           BEGIN  %  Process repeat                                      01096000
  1446.                NCHAR;                                                   01097000
  1447.                RPT_CNT := UNCHAR(T7);                                   01098000
  1448.                NCHAR;                                                   01099000
  1449.           END;                                                          01100000
  1450.                                                                         01101000
  1451.           IF QUOTE_8 AND (T7 = Q_8) THEN                                01102000
  1452.           BEGIN                                                         01103000
  1453.                T_HI := 128;                                             01104000
  1454.                NCHAR;                                                   01105000
  1455.           END;                                                          01106000
  1456.                                                                         01107000
  1457.           IF T7 = YOUR_Q_CTL THEN                                       01108000
  1458.           BEGIN                                                         01109000
  1459.                NCHAR;                                                   01110000
  1460.                IF T7 >= 4"3F" AND T7 <= 4"5F" THEN                      01111000
  1461.                     T := CTL(T);                                        01112000
  1462.                T7 := T.[6:7];                                           01113000
  1463.           END;                                                          01114000
  1464.                                                                         01115000
  1465.           IF QUOTE_8 THEN                                               01116000
  1466.                T := T_HI + T7; %  Got the real character                01117000
  1467.                                                                         01118000
  1468.                                                                         01119000
  1469.           %  Transfer to output buffer                                  01120000
  1470.                                                                         01121000
  1471.           WHILE RPT_CNT > 0 DO                                          01122000
  1472.           BEGIN                                                         01123000
  1473.                RPT_CNT := RPT_CNT - 1;                                  01124000
  1474.                REPLACE ODATA[OCNT] BY T.LOWBYTE FOR 1;                  01125000
  1475.                IF OCNT:=*+1 >= OMAX THEN                                01127000
  1476.                BEGIN                                                    01128000
  1477.                     I := 0;                                             01129000
  1478.                     CBUFXLT := FALSE;                                   01130000
  1479.                END;                                                     01131000
  1480.           END;                                                          01132000
  1481.      END;                                                               01133000
  1482. END;                                                                    01134000
  1483.  $ PAGE                                                                 01135000
  1484. BOOLEAN PROCEDURE UNQFNAME(FNAME,LEN);                                  01137000
  1485. VALUE                            LEN ;                                  01138000
  1486. INTEGER                          LEN ;                                  01139000
  1487. ASCII ARRAY                 FNAME[0]  ;                                 01140000
  1488. BEGIN                                                                   01141000
  1489. %                                                                       01142000
  1490. %     ASCII ARRAY   BA_TEMP(0:37);                                      01143000
  1491. %                                                                       01144000
  1492. %     INTEGER      I_ERR,                                               01145000
  1493. %                  I_PARM;                                              01146000
  1494. %                                                                       01147000
  1495. %     % ----------------------------------------------------------      01148000
  1496. %                                                                       01149000
  1497. %     MOVE BA_TEMP := "listf ";                                         01150000
  1498. %     MOVE BA_TEMP(6) := FNAME,(LEN);                                   01151000
  1499. %     MOVE BA_TEMP(6+LEN) := ";$NULL";                                  01152000
  1500. %     BA_TEMP(12 + LEN) := %15;                                         01153000
  1501. %     COMMAND(BA_TEMP,I_ERR,I_PARM);                                    01154000
  1502. %     IF I_ERR = 907 THEN                                               01155000
  1503.            UNQFNAME := TRUE                                             01156000
  1504. %     ELSE                                                              01157000
  1505. %          UNQFNAME := FALSE;                                           01158000
  1506. END;                                                                    01159000
  1507.                                                                         01160000
  1508.  $ PAGE                                                                 01161000
  1509.                                                                         01163000
  1510. BOOLEAN PROCEDURE MAKE_U_FNAME(FNAME,LEN); % Disabled. Used for HP only.01164000
  1511. ASCII ARRAY                     FNAME[0]  ;                             01165000
  1512. INTEGER                              LEN ;                              01166000
  1513. BEGIN                                                                   01167000
  1514.                                                                         01168000
  1515.      INTEGER        FIX,   %  From Index                                01169000
  1516.                     TIX,   %  To Index                                  01170000
  1517.                     ITEMP, %  Scratch                                   01171000
  1518.                     BLEN;  %  Base Length                               01172000
  1519.                                                                         01173000
  1520.      BOOLEAN        ALPH,  %  Char Alpha                                01174000
  1521.                     NUM,   %  Char is Num                               01175000
  1522.                     DONE;  %  Loop Flag                                 01176000
  1523.                                                                         01177000
  1524.      % ----------------------------------------------------------       01178000
  1525.                                                                         01179000
  1526.      FIX := 0;                                                          01180000
  1527.      TIX := 0;                                                          01181000
  1528.                                                                         01182000
  1529.      WHILE FIX < LEN DO                                                 01183000
  1530.      BEGIN                                                              01184000
  1531.           ITEMP := REAL(FNAME[FIX], 1);                                 01185000
  1532.                                                                         01186000
  1533.           IF ITEMP >= 4"61"  AND  % a - z                               01187000
  1534.              ITEMP <= 4"7A"  THEN ITEMP := ITEMP - 4"20"; % Upshift     01188000
  1535.                                                                         01189000
  1536.           ALPH := FALSE;                                                01190000
  1537.           NUM := FALSE;                                                 01191000
  1538.                                                                         01192000
  1539.           IF ITEMP >= 7"A"  AND  % A - Z                                01193000
  1540.              ITEMP <= 7"Z"  THEN ALPH := TRUE                           01194000
  1541.                ELSE                                                     01195000
  1542.           IF ITEMP >= 7"0"  AND  % 0 - 9                                01196000
  1543.              ITEMP <= 7"9"  THEN NUM := TRUE;                           01197000
  1544.                                                                         01198000
  1545.           IF (ALPH AND (TIX = 0)) OR                                    01199000
  1546.              ((ALPH OR NUM) AND (TIX > 0)) THEN                         01200000
  1547.           BEGIN                                                         01201000
  1548.                REPLACE FNAME[TIX] BY ITEMP.LOWBYTE FOR 1;               01202000
  1549.                TIX := TIX + 1;                                          01203000
  1550.           END;                                                          01204000
  1551.                                                                         01205000
  1552.           FIX := FIX + 1;                                               01206000
  1553.      END;                                                               01207000
  1554.                                                                         01208000
  1555.      LEN := TIX;                                                        01209000
  1556.                                                                         01210000
  1557.      % ------------------------------------------------                 01211000
  1558.      %  File name now in native format. Adjust length.                  01212000
  1559.      % ------------------------------------------------                 01213000
  1560.                                                                         01214000
  1561.      IF LEN > 8 THEN LEN := 8 %  Truncate                               01215000
  1562.           ELSE                                                          01216000
  1563.      IF LEN = 0 THEN                                                    01217000
  1564.      BEGIN %  Nothing left, use default                                 01218000
  1565.           REPLACE FNAME BY "KMT";                                       01219000
  1566.           LEN := 3;                                                     01220000
  1567.      END;                                                               01221000
  1568.                                                                         01222000
  1569.      % ----------------------------------------                         01223000
  1570.      %  File name is now OK , check uniqueness                          01224000
  1571.      % ----------------------------------------                         01225000
  1572.                                                                         01226000
  1573.      IF UNQFNAME(FNAME,LEN) THEN                                        01227000
  1574.      BEGIN %  OK, we_re done                                            01228000
  1575.           MAKE_U_FNAME := TRUE;                                         01229000
  1576.      END                                                                01230000
  1577.           ELSE                                                          01231000
  1578.      BEGIN                                                              01232000
  1579.           %  ----------------------------------------------             01233000
  1580.           %  Append two numeric chars (00-99) to the name.              01234000
  1581.           % -----------------------------------------------             01235000
  1582.                                                                         01236000
  1583.           BLEN := IF LEN > 12 THEN 12 ELSE LEN;                         01237000
  1584.           ITEMP := 1;                                                   01238000
  1585.           DONE := FALSE;                                                01239000
  1586.           WHILE (ITEMP < 99) AND NOT DONE DO                            01240000
  1587.           BEGIN                                                         01241000
  1588.                REPLACE FNAME[BLEN] BY ITEMP FOR 2 DIGITS; % *PROBLEM*   01242000
  1589.                LEN := BLEN + 2;                                         01244000
  1590.                IF UNQFNAME(FNAME,LEN) THEN                              01245000
  1591.                     DONE := TRUE                                        01246000
  1592.                ELSE                                                     01247000
  1593.                     ITEMP := ITEMP + 1;                                 01248000
  1594.           END;                                                          01249000
  1595.                                                                         01250000
  1596.           MAKE_U_FNAME := NOT DONE;                                     01251000
  1597.      END;                                                               01252000
  1598. END;                                                                    01253000
  1599.  $ PAGE                                                                 01254000
  1600. PROCEDURE P_EPACK(DATA,LEN);                                            01256000
  1601. VALUE                  LEN ;                                            01257000
  1602. INTEGER                LEN ;                                            01258000
  1603. ASCII ARRAY        DATA[0]  ;                                           01259000
  1604. BEGIN                                                                   01260000
  1605.                                                                         01261000
  1606.      DEFINE SEGMENTATION = NUTTIN#;                                     01262000
  1607.      IF LOGNUM_OPEN THEN                                                01266000
  1608.           WRITE(LOGNUM, LEN, DATA);                                     01267000
  1609. END;                                                                    01268000
  1610.  $ PAGE                                                                 01269000
  1611. % ****************************************************************      01271000
  1612.                                                                         01272000
  1613. REAL PROCEDURE SBREAK;                                                  01274000
  1614. BEGIN                                                                   01275000
  1615.                                                                         01276000
  1616.      SBREAK := STATE; %  Default is no change                           01277000
  1617.      NUMTRY := NUMTRY + 1;                                              01278000
  1618.      IF NUMTRY > MAXTRY THEN                                            01279000
  1619.      BEGIN                                                              01280000
  1620.           E_ST "SBREAK - Max retrys exceeded " E_EN;                    01281000
  1621.           SBREAK := "A";                                                01282000
  1622.      END                                                                01283000
  1623.           ELSE                                                          01284000
  1624.      BEGIN                                                              01285000
  1625.           SPACK("B",N,0,RP_DATA);                                       01286000
  1626.           IF RPACK(RP,RP_LEN,RP_NUM,RP_DATA) THEN                       01287000
  1627.           BEGIN                                                         01288000
  1628.                IF RP = "Y" THEN                                         01289000
  1629.                BEGIN                                                    01290000
  1630.                     IF RP_NUM = N THEN                                  01291000
  1631.                     BEGIN                                               01292000
  1632.                          NUMTRY := 0;                                   01293000
  1633.                          N := NPNO(N);                                  01294000
  1634.                          SBREAK := "C";                                 01295000
  1635.                     END;                                                01296000
  1636.                END                                                      01297000
  1637.                     ELSE                                                01298000
  1638.                IF RP = "E" THEN                                         01299000
  1639.                BEGIN                                                    01300000
  1640.                     E_ST "SBREAK - E packet recieved" E_EN;             01301000
  1641.                     P_EPACK(RP_DATA,RP_LEN);                            01302000
  1642.                     SBREAK := "A";                                      01303000
  1643.                END                                                      01304000
  1644.                     ELSE                                                01305000
  1645.                IF RP NEQ "N" THEN                                       01306000
  1646.                BEGIN                                                    01307000
  1647.                     E_ST "SBREAK - Unknown packet type" E_EN;           01308000
  1648.                     SBREAK := "A";                                      01309000
  1649.                END;                                                     01310000
  1650.           END;                                                          01311000
  1651.      END;                                                               01312000
  1652. END;                                                                    01313000
  1653.  $ PAGE                                                                 01313100
  1654. BOOLEAN PROCEDURE SENDSW(SFNAME,SFNLEN);                                01314000
  1655. VALUE                           SFNLEN ;                                01315000
  1656. ASCII ARRAY               SFNAME[0]     ;                               01316000
  1657. INTEGER                         SFNLEN ;                                01317000
  1658. BEGIN                                                                   01318000
  1659.                                                                         01319000
  1660.      BOOLEAN        DONE,                                               01320000
  1661.                     FOPT;                                               01321000
  1662.                                                                         01322000
  1663.      INTEGER        BFSTAT,                                             01323000
  1664.                     TEMP;                                               01323100
  1665.                                                                         01324000
  1666.                                                                         01325000
  1667.  $ PAGE                                                                 01326000
  1668. PROCEDURE SPAR(DATA,LEN);                                               01327000
  1669. ASCII ARRAY      DATA[0]  ;                                             01328000
  1670. INTEGER              LEN ;                                              01329000
  1671. BEGIN                                                                   01330000
  1672.      REPLACE DATA BY                                                    01330100
  1673.           TOCHAR(MAX_RCV_SIZE).LOWBYTE FOR 1, %  Biggest to send me     01331000
  1674.           TOCHAR(MY_TO).LOWBYTE FOR 1,        %  When to time me out    01332000
  1675.           TOCHAR(0).LOWBYTE FOR 1,            %  How many pads I need   01333000
  1676.           CTL(0).LOWBYTE FOR 1,               % Pad char to use for me  01334000
  1677.           TOCHAR(CR).LOWBYTE FOR 1,           %  End-of-line char for me01335000
  1678.           MY_Q_CTL.LOWBYTE FOR 1,             %  Control quote I send   01336000
  1679.           P_Q_8 FOR 1,                        % Prefered 8 bit quote    01337000
  1680.           MY_BLK_CK.LOWBYTE FOR 1,            % 3-char CRC default      01338000
  1681.           P_RPT_CHR FOR 1,             % Preferred repeat prefix        01339000
  1682.           TOCHAR(MY_CAPS).LOWBYTE FOR 1,  % Extended capabilities       01339100
  1683.           TOCHAR(0).LOWBYTE FOR 1,        % Windowing (none here)       01339200
  1684.           TOCHAR(LONGPACK_SIZE DIV 95).LOWBYTE FOR 1,  %  MAXL1         01339300
  1685.           TOCHAR(LONGPACK_SIZE MOD 95).LOWBYTE FOR 1;  %  MAXL2         01339400
  1686.      LEN := 13;                                                         01340000
  1687. END;                                                                    01341000
  1688.                                                                         01342000
  1689. % -----------------------------------------------------------           01343000
  1690.                                                                         01344000
  1691.  $ PAGE                                                                 01345000
  1692. PROCEDURE RPAR(DATA,LEN);                                               01346000
  1693. VALUE                LEN ;                                              01347000
  1694. INTEGER              LEN ;                                              01348000
  1695. ASCII ARRAY      DATA[0]  ;                                             01349000
  1696. BEGIN                                                                   01350000
  1697.      MAX_SND_SIZE := UNCHAR(REAL(DATA[0], 1));  %  Max send size        01351000
  1698.    % MAX_SND_DATA := MAX_SND_SIZE -3;           %  Max send data size   01352000
  1699.      YOUR_TO := UNCHAR(REAL(DATA[1], 1));       %  When I time you out  01353000
  1700.      YOUR_PAD_COUNT := UNCHAR(REAL(DATA[2], 1));% Number of pads to send01354000
  1701.      YOUR_PAD := CTL(REAL(DATA[3], 1));         %  Your Pad char        01355000
  1702.      YOUR_EOL := UNCHAR(REAL(DATA[4], 1));      %  Your END-of-line     01356000
  1703.      YOUR_Q_CTL := INTEGER(REAL(DATA[5], 1));   %  Your control quote   01357000
  1704.                                                                         01358000
  1705.      QUOTE_8 := FALSE;                                                  01359000
  1706.      IF LEN > 6 THEN                                                    01360000
  1707.      BEGIN                                                              01361000
  1708.           IF REAL(DATA[6], 1)="Y" OR REAL(DATA[6], 1)=P_Q_8 THEN        01362000
  1709.           BEGIN                                                         01363000
  1710.                Q_8 := P_Q_8;                                            01364000
  1711.                QUOTE_8 := TRUE;                                         01365000
  1712.           END;                                                          01366000
  1713.      END;                                                               01367000
  1714.                                                                         01368000
  1715.      IF LEN > 7  THEN                                                   01368100
  1716.      YOUR_BLK_CK := REAL(DATA[7], 1)                                    01368200
  1717.           ELSE                                                          01368300
  1718.      YOUR_BLK_CK := "1";  %  No block check -> one-byte check           01368400
  1719.                                                                         01369000
  1720.      IF LEN > 8 AND REAL(DATA[8], 1) = P_RPT_CHR THEN                   01370000
  1721.      BEGIN                                                              01371000
  1722.           RPT_CHR := P_RPT_CHR;                                         01372000
  1723.           USE_REPEAT := TRUE;          %  OK for repeat prefix          01373000
  1724.      END                                                                01374000
  1725.           ELSE                                                          01375000
  1726.      BEGIN                                                              01376000
  1727.           USE_REPEAT := FALSE;         %  No repeat processing          01377000
  1728.      END;                                                               01378000
  1729.                                                                         01378200
  1730.      IF LEN >= 12  THEN                                                 01378400
  1731.      BEGIN     %  Other side agrees to long packets, maybe              01378420
  1732.           YOUR_CAPS :=                                                  01378440
  1733.             REAL(BOOLEAN(UNCHAR(REAL(DATA[9],1))) AND BOOLEAN(MY_CAPS));01378441
  1734.           %  Windowing, DATA(10), is unsupported in this prog           01378460
  1735.           TEMP := 95*UNCHAR(REAL(DATA[11],1))+UNCHAR(REAL(DATA[12],1)); 01378480
  1736.           IF TEMP > MAX_SND_SIZE  THEN                                  01378500
  1737.           BEGIN                                                         01378510
  1738.                IF TEMP < MAX_LONGPACK_SIZE  THEN                        01378520
  1739.                     LONGPACK_SIZE := TEMP-5-(YOUR_BLK_CK-"0")           01378530
  1740.                ELSE                                                     01378540
  1741.                     LONGPACK_SIZE := MAX_LONGPACK_SIZE;                 01378550
  1742.           END                                                           01378560
  1743.                ELSE                                                     01378570
  1744.           LONGPACK_SIZE := 0;   %  Long packets disallowed              01378580
  1745.      END                                                                01378590
  1746.           ELSE                                                          01378600
  1747.      LONGPACK_SIZE := 0;                                                01378610
  1748. END;                                                                    01379000
  1749.  $ PAGE                                                                 01380000
  1750. REAL PROCEDURE SINIT;                                                   01381000
  1751. BEGIN                                                                   01382000
  1752.                                                                         01383000
  1753.      % -----------------------------------------------------------      01384000
  1754.                                                                         01385000
  1755.      SINIT := STATE;  %  Default to return current state                01386000
  1756.      NUMTRY := NUMTRY + 1;                                              01387000
  1757.      IF NUMTRY > MAXTRY THEN                                            01388000
  1758.      BEGIN                                                              01389000
  1759.           E_ST "SINIT - Max retrys exceeded" E_EN;                      01390000
  1760.           SINIT := "A"; %  Abort                                        01391000
  1761.      END                                                                01392000
  1762.           ELSE                                                          01393000
  1763.      BEGIN                                                              01394000
  1764.           SPAR(RP_DATA,RP_LEN);         %  Set up SI data               01395000
  1765.           N := 0;                       %  Always start SINIT at zero   01395100
  1766.           SPACK("S",N,RP_LEN,RP_DATA);  %  And send it                  01396000
  1767.                                                                         01397000
  1768.           IF RPACK(RP,RP_LEN,RP_NUM,RP_DATA) THEN                       01398000
  1769.           BEGIN                                                         01399000
  1770.                IF RP = "Y" THEN                                         01400000
  1771.                BEGIN                                                    01401000
  1772.                     IF RP_NUM = N THEN                                  01402000
  1773.                     BEGIN  %  Positive response                         01403000
  1774.                          RPAR(RP_DATA,RP_LEN);  %  Get parameters       01404000
  1775.                          IF  YOUR_BLK_CK NEQ "1"  AND                   01405000
  1776.                              YOUR_BLK_CK  NEQ  "3"  THEN                01405100
  1777.                          BEGIN   % Whatever that was, I can't do it     01405200
  1778.                               MY_BLK_CK := "1";  % Lets try again       01405300
  1779.                               N := 0;                                   01405400
  1780.                               SINIT := "S";                             01405500
  1781.                          END                                            01405600
  1782.                               ELSE                                      01405700
  1783.                          BEGIN  %  OK, let_s try it your way            01405800
  1784.                               MY_BLK_CK := YOUR_BLK_CK;                 01405900
  1785.                               MAX_SND_DATA := MAX_SND_SIZE -            01406000
  1786.                                               3-(YOUR_BLK_CK-"0");      01406100
  1787.                               NUMTRY := 0;                              01406200
  1788.                               N := NPNO(N);                             01406300
  1789.                               SINIT:= "F";                              01406400
  1790.                          END;                                           01406500
  1791.                     END;                                                01408000
  1792.                END                                                      01409000
  1793.                     ELSE                                                01410000
  1794.                IF RP = "E" THEN                                         01411000
  1795.                BEGIN %  Error packet                                    01412000
  1796.                     E_ST "SINIT - E packet recieved" E_EN;              01413000
  1797.                     P_EPACK(RP_DATA,RP_LEN);                            01414000
  1798.                     SINIT := "A";                                       01415000
  1799.                END;                                                     01416000
  1800.           END;                                                          01417000
  1801.      END;                                                               01418000
  1802. END;                                                                    01419000
  1803.  $ PAGE                                                                 01420000
  1804. REAL PROCEDURE SFILE;                                                   01421000
  1805. BEGIN                                                                   01422000
  1806.                                                                         01423000
  1807.                                                                         01424000
  1808.      % -----------------------------------------------------------      01425000
  1809.                                                                         01426000
  1810.      SFILE := STATE;  %  Default to current state                       01427000
  1811.      NUMTRY := NUMTRY + 1;                                              01428000
  1812.      IF NUMTRY > MAXTRY THEN                                            01429000
  1813.      BEGIN                                                              01430000
  1814.           E_ST "SFILE - Max retrys exceeded" E_EN;                      01431000
  1815.           SFILE := "A"; %  Abort                                        01432000
  1816.      END                                                                01433000
  1817.           ELSE                                                          01434000
  1818.      BEGIN                                                              01435000
  1819.           IF SFNLEN = 0 THEN                                            01436000
  1820.                SPACK("X",N,0,SFNAME)  %  Header only                    01437000
  1821.           ELSE                                                          01438000
  1822.                SPACK("F",N,SFNLEN,SFNAME); %  Normal file               01439000
  1823.                                                                         01440000
  1824.           IF RPACK(RP,RP_LEN,RP_NUM,RP_DATA) THEN                       01441000
  1825.           BEGIN                                                         01442000
  1826.                IF RP = "Y" THEN                                         01443000
  1827.                BEGIN                                                    01444000
  1828.                     IF RP_NUM = N THEN                                  01445000
  1829.                     BEGIN                                               01446000
  1830.                          DBUFCNT := 0; %  Set disc buf empty            01447000
  1831.                          DBUFINX := 1; %  Index=get next                01448000
  1832.                                                                         01449000
  1833.                          BUFILL(PDATA,PDATACNT,BFSTAT);                 01450000
  1834.                          IF BFSTAT = 0 THEN                             01451000
  1835.                          BEGIN                                          01452000
  1836.                               NUMTRY := 0;                              01453000
  1837.                               N := NPNO(N);                             01454000
  1838.                               SFILE := "D";                             01455000
  1839.                          END                                            01456000
  1840.                               ELSE                                      01457000
  1841.                          BEGIN                                          01458000
  1842.                               E_ST "SFILE - BUFILL error" E_EN;         01459000
  1843.                               SFILE := "A";                             01460000
  1844.                          END;                                           01461000
  1845.                     END;                                                01462000
  1846.                END                                                      01463000
  1847.                     ELSE                                                01464000
  1848.                IF RP = "E" THEN                                         01465000
  1849.                BEGIN                                                    01466000
  1850.                     P_EPACK(RP_DATA,RP_LEN);                            01467000
  1851.                     SFILE := "A";                                       01468000
  1852.                END                                                      01469000
  1853.                     ELSE                                                01470000
  1854.                IF RP NEQ "N" THEN                                       01471000
  1855.                BEGIN                                                    01472000
  1856.                     SFILE := "A";                                       01473000
  1857.                     E_ST "SFILE - Unknown packet type" E_EN;            01474000
  1858.                END;                                                     01475000
  1859.           END;                                                          01476000
  1860.      END;                                                               01477000
  1861. END;                                                                    01478000
  1862. % ****************************************************************      01479000
  1863.  $ PAGE                                                                 01480000
  1864. REAL PROCEDURE SDATA;                                                   01481000
  1865. BEGIN                                                                   01482000
  1866.      LABEL     RESYNC;     % A sign of laziness and disorganization     01482100
  1867.                            % and expedience.                            01482200
  1868.                                                                         01483000
  1869.      SDATA := STATE; %  Default is return current state                 01484000
  1870.                                                                         01485000
  1871.      NUMTRY := NUMTRY + 1;                                              01486000
  1872.      IF NUMTRY > MAXTRY THEN                                            01487000
  1873.      BEGIN                                                              01488000
  1874.           SDATA := "A";                                                 01489000
  1875.           E_ST "SDATA - Retry count exceeded" E_EN;                     01490000
  1876.      END                                                                01491000
  1877.           ELSE                                                          01492000
  1878.      BEGIN                                                              01493000
  1879.           SPACK("D",N,PDATACNT,PDATA);                                  01494000
  1880.      RESYNC:                                                            01494900
  1881.           IF RPACK(RP,RP_LEN,RP_NUM,RP_DATA) THEN                       01495000
  1882.           BEGIN                                                         01496000
  1883.                IF RP = "Y" THEN                                         01497000
  1884.                BEGIN                                                    01498000
  1885.                     IF RP_NUM = N THEN                                  01499000
  1886.                     BEGIN                                               01500000
  1887.                          NUMTRY := 0;                                   01501000
  1888.                          N := NPNO(N);                                  01502000
  1889.                          BUFILL(PDATA,PDATACNT,BFSTAT);                 01503000
  1890.                          IF BFSTAT NEQ 0 THEN                           01504000
  1891.                          BEGIN                                          01505000
  1892.                               SDATA := "Z";                             01506000
  1893.                               CLOSE(DNUM);                              01507000
  1894.                               DNUM_OPEN:=FALSE;                         01508000
  1895.                          END;                                           01509000
  1896.                     END                                                 01510000
  1897.                          ELSE                                           01510100
  1898.                     IF RP_NUM = PPNO(N)  THEN  % ACK for previous packet01510200
  1899.                     BEGIN                                               01510300
  1900.                          E_ST "SDATA - prev ACK seen " E_EN;            01510400
  1901.                          GO TO RESYNC;         % Sorry about this       01510600
  1902.                     END;                                                01510700
  1903.                END                                                      01511000
  1904.                     ELSE                                                01512000
  1905.                IF RP = "E" THEN                                         01513000
  1906.                BEGIN                                                    01514000
  1907.                     E_ST "SDATA - E packet recieved" E_EN;              01515000
  1908.                     P_EPACK(RP_DATA,RP_LEN);                            01516000
  1909.                     SDATA := "A";                                       01517000
  1910.                END                                                      01518000
  1911.                     ELSE                                                01519000
  1912.                IF RP NEQ "N" THEN                                       01520000
  1913.                BEGIN                                                    01521000
  1914.                     SDATA := "A";                                       01522000
  1915.                     E_ST "SDATA - Unknown Packet Type" E_EN;            01523000
  1916.                END                                                      01524000
  1917.                ELSE                                                     01524100
  1918.                     E_ST "SDATA - NAK seen" E_EN;                       01524200
  1919.           END;                                                          01525000
  1920.      END;                                                               01526000
  1921. END;                                                                    01527000
  1922.  $ PAGE                                                                 01528000
  1923. REAL PROCEDURE SEOF;                                                    01529000
  1924. BEGIN                                                                   01530000
  1925.                                                                         01531000
  1926.      SEOF := STATE;                                                     01532000
  1927.      NUMTRY := NUMTRY + 1;                                              01533000
  1928.      IF NUMTRY > MAXTRY THEN                                            01534000
  1929.      BEGIN                                                              01535000
  1930.           E_ST "SEOF - Max retrys exceeded" E_EN;                       01536000
  1931.           SEOF := "A";                                                  01537000
  1932.      END                                                                01538000
  1933.           ELSE                                                          01539000
  1934.      BEGIN                                                              01540000
  1935.           SPACK("Z",N,0,RP_DATA);                                       01541000
  1936.           IF RPACK(RP,RP_LEN,RP_NUM,RP_DATA) THEN                       01542000
  1937.           BEGIN                                                         01543000
  1938.                IF RP = "Y" THEN                                         01544000
  1939.                BEGIN                                                    01545000
  1940.                     IF RP_NUM = N THEN                                  01546000
  1941.                     BEGIN                                               01547000
  1942.                          NUMTRY := 0;                                   01548000
  1943.                          N := NPNO(N);                                  01549000
  1944.                          SEOF := "B";                                   01550000
  1945.                     END;                                                01551000
  1946.                END                                                      01552000
  1947.                     ELSE                                                01553000
  1948.                IF RP = "E" THEN                                         01554000
  1949.                BEGIN                                                    01555000
  1950.                     E_ST "SEOF - E packet recieved" E_EN;               01556000
  1951.                     P_EPACK(RP_DATA,RP_LEN);                            01557000
  1952.                     SEOF := "A";                                        01558000
  1953.                END                                                      01559000
  1954.                     ELSE                                                01560000
  1955.                IF RP NEQ "N" THEN                                       01561000
  1956.                BEGIN                                                    01562000
  1957.                     SEOF := "A";                                        01563000
  1958.                     E_ST "SEOF - Unknown packet type" E_EN;             01564000
  1959.                END;                                                     01565000
  1960.           END;                                                          01566000
  1961.      END;                                                               01567000
  1962. END;                                                                    01568000
  1963.                                                                         01569000
  1964.  $ PAGE                                                                 01570000
  1965.                                                                         01571000
  1966. % ****************************************************************      01572000
  1967.                                                                         01573000
  1968.                                                                         01574000
  1969.      NUMTRY := 0;                                                       01574100
  1970.      IF SFNLEN <= 0  THEN                                               01575000
  1971.      BEGIN                                                              01576000
  1972.           STATE := "S"; %  Normal file send                             01577000
  1973.           SFNLEN := -SFNLEN;   %  Make positive again                   01578000
  1974.      END                                                                01579000
  1975.      ELSE                                                               01580000
  1976.           STATE := "F"; %  Sending text, skip SI                        01581000
  1977.                                                                         01582000
  1978.      IF SND_BINARY = 1 THEN                                             01583000
  1979.      BEGIN %  Always binary                                             01584000
  1980.           IMAGE := TRUE;                                                01585000
  1981.      END                                                                01586000
  1982.           ELSE                                                          01587000
  1983.      IF SND_BINARY = 2 THEN                                             01588000
  1984.      BEGIN %  Always ASCII                                              01589000
  1985.           IMAGE := FALSE;                                               01590000
  1986.      END                                                                01591000
  1987.           ELSE                                                          01592000
  1988.      BEGIN %  Auto, check file                                          01593000
  1989. %          FGETINFO(DNUM,,FOPT);                                        01594000
  1990. %          IF (FOPT AND %4) NEQ 0 THEN                                  01595000
  1991. %               IMAGE := FALSE                                          01596000
  1992. %          ELSE                                                         01597000
  1993.                IMAGE := TRUE;                                           01598000
  1994.      END;                                                               01599000
  1995.                                                                         01600000
  1996.      SND_RECLEN := DNUM.MAXRECSIZE                                      01600100
  1997.                     * (IF DNUM.FRAMESIZE = 48  THEN 6  ELSE 1);         01600200
  1998.                                                                         01600300
  1999.      WHILE NOT (DONE OR BLASTED) DO                                     01601000
  2000.      BEGIN                                                              01602000
  2001.           IF STATE = "S" THEN STATE := SINIT                            01603000
  2002.                ELSE                                                     01604000
  2003.           IF STATE = "F" THEN STATE := SFILE                            01605000
  2004.                ELSE                                                     01606000
  2005.           IF STATE = "D" THEN STATE := SDATA                            01607000
  2006.                ELSE                                                     01608000
  2007.           IF STATE = "Z" THEN STATE := SEOF                             01609000
  2008.                ELSE                                                     01610000
  2009.           IF STATE="B" THEN                                             01611000
  2010.           BEGIN                                                         01611100
  2011.                STATE := "C";                                            01611200
  2012.                DONE := TRUE;                                            01611300
  2013.           END                                                           01611400
  2014.                ELSE                                                     01612000
  2015.           BEGIN                                                         01613000
  2016.                DONE := TRUE;                                            01614000
  2017.           END;                                                          01615000
  2018.      END;                                                               01616000
  2019.                                                                         01617000
  2020.      IF DNUM_OPEN THEN                                                  01618000
  2021.      BEGIN                                                              01619000
  2022.           CLOSE(DNUM);                                                  01620000
  2023.           DNUM_OPEN:=FALSE;                                             01621000
  2024.      END;                                                               01622000
  2025.      IF STATE = "C" THEN                                                01623000
  2026.           SENDSW := TRUE                                                01624000
  2027.      ELSE                                                               01625000
  2028.           SENDSW := FALSE;                                              01626000
  2029. END;                                                                    01627000
  2030.  $ PAGE                                                                 01628000
  2031. PROCEDURE R_RPAR(DATA,LEN);                                             01630000
  2032. VALUE                 LEN ;                                             01631000
  2033. INTEGER               LEN ;                                             01632000
  2034. ASCII ARRAY       DATA[0]  ;                                            01633000
  2035. BEGIN                                                                   01634000
  2036.      INTEGER   TEMP;                                                    01634100
  2037.      IF DEBUG_MODE>0 AND LOGNUM_OPEN THEN BEGIN                         01634110
  2038.        REPLACE PBUF BY "R_PAR:", " " FOR 50;                            01634130
  2039.        REPLACE PTEMP:PBUF[8] BY DATA FOR LEN, "   L=";                  01634140
  2040.        FOUR_ASCII_DIGITS(LEN, PTEMP);                                   01634150
  2041.        WRITE(LOGNUM, 33, PBUF);                                         01634160
  2042.      END;                                                               01634170
  2043.                                                                         01634200
  2044.      MAX_SND_SIZE := UNCHAR(REAL(DATA[0], 1));  %  Max send size        01635000
  2045.      MAX_SND_DATA := MAX_SND_SIZE -3;           %  Max send data size   01636000
  2046.      YOUR_TO := UNCHAR(REAL(DATA[1], 1));       %  When I time you out  01637000
  2047.      YOUR_PAD_COUNT := UNCHAR(REAL(DATA[2], 1));% Number of pads to send01638000
  2048.      YOUR_PAD := CTL(REAL(DATA[3], 1));         %  Your Pad char        01639000
  2049.      YOUR_EOL := UNCHAR(REAL(DATA[4], 1));      %  Your end-of-line     01640000
  2050.      YOUR_Q_CTL := INTEGER(REAL(DATA[5], 1));   %  Your control quote   01641000
  2051.      IF LEN > 6 AND REAL(DATA[6], 1) = "Y" THEN                         01642000
  2052.      BEGIN %  I specify the quote                                       01643000
  2053.           Q8_IND := "Y";                                                01644000
  2054.           QUOTE_8 := TRUE;                                              01645000
  2055.      END                                                                01646000
  2056.           ELSE                                                          01647000
  2057.      IF LEN > 6 AND REAL(DATA[6], 1) NEQ "N" THEN                       01648000
  2058.      BEGIN %  Quote specified for me                                    01649000
  2059.           Q_8 := REAL(DATA[6], 1);                                      01650000
  2060.           Q8_IND := " ";                                                01651000
  2061.           QUOTE_8 := TRUE;                                              01652000
  2062.      END                                                                01653000
  2063.           ELSE                                                          01654000
  2064.      BEGIN %  No 8 bit quoting                                          01655000
  2065.           QUOTE_8 := FALSE;                                             01656000
  2066.      END;                                                               01657000
  2067.                                                                         01657100
  2068.      IF LEN > 7  THEN                                                   01657200
  2069.      BEGIN                                                              01657300
  2070.           YOUR_BLK_CK := REAL(DATA[7], 1);                              01657400
  2071.           IF YOUR_BLK_CK = "1"  OR                                      01657500
  2072.              YOUR_BLK_CK = "3"  THEN                                    01657600
  2073.           MY_BLK_CK := YOUR_BLK_CK  % Will do it your way               01657700
  2074.                ELSE                                                     01657800
  2075.           MY_BLK_CK := YOUR_BLK_CK := "1";  % The old way               01657900
  2076.      END                                                                01658000
  2077.           ELSE                                                          01658100
  2078.      MY_BLK_CK := YOUR_BLK_CK := "1"; %  No blk ck -> one-byte ck       01658200
  2079.                                                                         01658300
  2080.      IF LEN > 8 AND REAL(DATA[8], 1) NEQ " " THEN                       01659000
  2081.      BEGIN                                                              01660000
  2082.           RPT_CHR := REAL(DATA[8], 1);                                  01661000
  2083.           USE_REPEAT := TRUE;                                           01662000
  2084.      END                                                                01663000
  2085.           ELSE                                                          01664000
  2086.      BEGIN                                                              01665000
  2087.           USE_REPEAT := FALSE;                                          01666000
  2088.      END;                                                               01667000
  2089.      IF LEN > 12  THEN          %  Extended packet stuff                01667100
  2090.      BEGIN                                                              01667200
  2091.           YOUR_CAPS :=                                                  01667300
  2092.             REAL(BOOLEAN(UNCHAR(REAL(DATA[9],1))) AND BOOLEAN(MY_CAPS));01667310
  2093.                                                                         01667400
  2094.           %  Windowing, DATA(10), is unsupported herein                 01667500
  2095.                                                                         01667600
  2096.           TEMP := UNCHAR(REAL(DATA[11],1))*95+UNCHAR(REAL(DATA[12],1)); 01667700
  2097.           IF DEBUG_MODE>0 AND LOGNUM_OPEN THEN BEGIN                    01667710
  2098.             REPLACE PBUF BY "R_PAR:", " " FOR 50;                       01667720
  2099.             REPLACE PTEMP:PBUF[8] BY DATA[11] FOR 2, "   TEMP=";        01667730
  2100.             FOUR_ASCII_DIGITS(TEMP, PTEMP);                             01667740
  2101.             WRITE(LOGNUM, 50, PBUF);                                    01667750
  2102.           END;                                                          01667760
  2103.           IF TEMP > MAX_LONGPACK_SIZE  THEN                             01667800
  2104.                TEMP := MAX_LONGPACK_SIZE;                               01667900
  2105.           LONGPACK_SIZE := TEMP-7-(YOUR_BLK_CK-"1");                    01668000
  2106.      END                                                                01668100
  2107.           ELSE                                                          01668200
  2108.      LONGPACK_SIZE := MAX_SND_SIZE-6;                                   01668300
  2109. END;                                                                    01668400
  2110.                                                                         01669000
  2111.  $ PAGE                                                                 01670000
  2112.                                                                         01672000
  2113. PROCEDURE R_SPAR(DATA,LEN);                                             01673000
  2114. ASCII ARRAY       DATA[0]  ;                                            01674000
  2115. INTEGER               LEN ;                                             01675000
  2116. BEGIN                                                                   01676000
  2117.      REPLACE DATA[0] BY                                                 01676900
  2118.             TOCHAR(MAX_RCV_SIZE              % Biggest to send me       01677000
  2119.                    + 1 - (MY_BLK_CK-"0")).LOWBYTE FOR 1,                01677100
  2120.            TOCHAR(MY_TO).LOWBYTE FOR 1,        %  When to time me out   01678000
  2121.            TOCHAR(0).LOWBYTE FOR 1,            %  How many pads I need  01679000
  2122.            CTL(0).LOWBYTE FOR 1,               %  Pad char to use for me01680000
  2123.            TOCHAR(CR).LOWBYTE FOR 1,           %  EOL char for me       01681000
  2124.            MY_Q_CTL.LOWBYTE FOR 1;             %  Control quote I send  01682000
  2125.      IF QUOTE_8 THEN                                                    01683000
  2126.      BEGIN                                                              01684000
  2127.           IF Q8_IND = "Y" THEN                                          01685000
  2128.           BEGIN  %  I specify the char                                  01686000
  2129.                Q_8 := P_Q_8;                                            01687000
  2130.                REPLACE DATA[6] BY P_Q_8;                                01688000
  2131.           END                                                           01689000
  2132.                ELSE                                                     01690000
  2133.           BEGIN  %  Already specIFied                                   01691000
  2134.                REPLACE DATA[6] BY "Y";                                  01692000
  2135.           END;                                                          01693000
  2136.      END                                                                01694000
  2137.           ELSE                                                          01695000
  2138.      BEGIN                                                              01696000
  2139.           REPLACE DATA[6] BY "N"; %  No 8 bit quoting                   01697000
  2140.      END;                                                               01698000
  2141.                                                                         01699000
  2142.      REPLACE DATA[7] BY MY_BLK_CK.LOWBYTE FOR 1;                        01700000
  2143.                                                                         01701000
  2144.      IF USE_REPEAT THEN                                                 01702000
  2145.           REPLACE DATA[8] BY RPT_CHR.LOWBYTE FOR 1                      01703000
  2146.      ELSE                                                               01704000
  2147.           REPLACE DATA[8] BY " ";                                       01705000
  2148.                                                                         01706000
  2149.      REPLACE DATA[9] BY                                                 01706100
  2150.           TOCHAR(YOUR_CAPS).LOWBYTE FOR 1,  %  We negotiated this       01706200
  2151.           TOCHAR(0).LOWBYTE FOR 1,          %  We don't do windows      01706300
  2152.           TOCHAR(LONGPACK_SIZE DIV 95).LOWBYTE FOR 1,  %  MAXL1         01706400
  2153.           TOCHAR(LONGPACK_SIZE MOD 95).LOWBYTE FOR 1;  %  MAXL2         01706500
  2154.                                                                         01706600
  2155.                                                                         01706700
  2156.      LEN := 13;                                                         01706800
  2157.      IF DEBUG_MODE>0 AND LOGNUM_OPEN THEN BEGIN                         01706810
  2158.        REPLACE PTEMP:PBUF BY "R_SPAR:  LONGPACK_SIZE=";                 01706820
  2159.        FOUR_ASCII_DIGITS(LONGPACK_SIZE, PTEMP);                         01706830
  2160.        REPLACE PTEMP BY " " FOR 50;                                     01706840
  2161.        WRITE(LOGNUM, 60, PBUF);                                         01706850
  2162.      END;                                                               01706860
  2163. END;                                                                    01707000
  2164.                                                                         01708000
  2165.  $ PAGE                                                                 01709000
  2166. BOOLEAN PROCEDURE RECSW(SERVE);                                         01711000
  2167. VALUE                   SERVE ;                                         01712000
  2168. BOOLEAN                 SERVE ;                                         01713000
  2169. BEGIN                                                                   01714000
  2170.                                                                         01715000
  2171.      BOOLEAN        DONE;                                               01716000
  2172.                                                                         01717000
  2173.      INTEGER        FOPT,    %  File Options (calculated)               01718000
  2174.                     FN_LEN;  %  File Name Length                        01719000
  2175.                                                                         01720000
  2176.      DEFINE         FN_MAX = 35#;  %  Max File Name Length              01721000
  2177.                                                                         01722000
  2178.      ASCII ARRAY     FNAME[0:FN_MAX];                                   01723000
  2179.                                                                         01724000
  2180.      % -----------------------------------------------------------      01725000
  2181.                                                                         01726000
  2182.  $ PAGE                                                                 01727000
  2183. REAL PROCEDURE RINIT;                                                   01728000
  2184. BEGIN                                                                   01729000
  2185.                                                                         01730000
  2186.      % ----------------------------------------------------------       01731000
  2187.                                                                         01732000
  2188.      RINIT := STATE;                                                    01733000
  2189.      NUMTRY := NUMTRY + 1;                                              01734000
  2190.      IF NUMTRY > MAXTRY THEN                                            01735000
  2191.      BEGIN                                                              01736000
  2192.           E_ST "RINIT - Retry count exceeded" E_EN;                     01737000
  2193.           RINIT := "A";                                                 01738000
  2194.      END                                                                01739000
  2195.           ELSE                                                          01740000
  2196.      BEGIN                                                              01741000
  2197.           IF RPACK(RP,RP_LEN,RP_NUM,RP_DATA) THEN                       01742000
  2198.           BEGIN                                                         01743000
  2199.                IF RP = "S" THEN                                         01744000
  2200.                BEGIN                                                    01745000
  2201.                     R_RPAR(RP_DATA,RP_LEN);    %  Read the others       01746000
  2202.                     R_SPAR(RP_DATA,RP_LEN);    %  Generate ours         01747000
  2203.                     SPACK("Y",N,RP_LEN,RP_DATA);  %  Send it            01748000
  2204.                                                                         01749000
  2205.                     OLDTRY := NUMTRY; %  Save trys                      01750000
  2206.                     NUMTRY := 0;                                        01751000
  2207.                     N := NPNO(RP_NUM); %  Syncronize                    01752000
  2208.                     RINIT := "F"; %  Switch to F mode                   01753000
  2209.                END                                                      01754000
  2210.                     ELSE                                                01755000
  2211.                IF RP = "E" THEN                                         01756000
  2212.                BEGIN                                                    01757000
  2213.                     E_ST "RINIT - E packet recieved" E_EN;              01758000
  2214.                     P_EPACK(RP_DATA,RP_LEN);                            01759000
  2215.                     RINIT := "A";                                       01760000
  2216.                END                                                      01761000
  2217.                     ELSE                                                01762000
  2218.                BEGIN                                                    01763000
  2219.                     E_ST "RINIT - Unexpected packet type" E_EN;         01764000
  2220.                     RINIT := "A";                                       01765000
  2221.                END;                                                     01766000
  2222.           END                                                           01767000
  2223.                ELSE                                                     01768000
  2224.           BEGIN                                                         01769000
  2225.                SPACK("N",N,0,RP_DATA);                                  01770000
  2226.           END;                                                          01771000
  2227.      END;                                                               01772000
  2228. END;                                                                    01773000
  2229.                                                                         01774000
  2230. % ****************************************************************      01775000
  2231.                                                                         01776000
  2232.  $ PAGE                                                                 01777000
  2233. REAL PROCEDURE RFILE;                                                   01778000
  2234. BEGIN                                                                   01779000
  2235.                                                                         01780000
  2236.                                                                         01781000
  2237.      RFILE := STATE;                                                    01782000
  2238.      NUMTRY := NUMTRY + 1;                                              01783000
  2239.      IF NUMTRY > MAXTRY THEN                                            01784000
  2240.      BEGIN                                                              01785000
  2241.           E_ST "RFILE - Retry count exceeded" E_EN;                     01786000
  2242.           RFILE := "A";                                                 01787000
  2243.      END                                                                01788000
  2244.           ELSE                                                          01789000
  2245.      BEGIN                                                              01790000
  2246.           IF RPACK(RP,RP_LEN,RP_NUM,RP_DATA) THEN                       01791000
  2247.           BEGIN  %  Got a packet                                        01792000
  2248.                IF RP = "S" THEN                                         01793000
  2249.                BEGIN %  Still in SI, perhaps ACK lost                   01794000
  2250.                     OLDTRY := OLDTRY + 1;                               01795000
  2251.                     IF OLDTRY > MAXTRY THEN                             01796000
  2252.                     BEGIN                                               01797000
  2253.                          E_ST "RFILE - Pretry (S) exceeded" E_EN;       01798000
  2254.                          RFILE := "A";                                  01799000
  2255.                     END                                                 01800000
  2256.                          ELSE                                           01801000
  2257.                     IF RP_NUM NEQ PPNO(N) THEN                          01802000
  2258.                     BEGIN %  Number must match                          01803000
  2259.                          E_ST "RFILE - N mismatch on S packet" E_EN;    01804000
  2260.                          RFILE := "A";                                  01805000
  2261.                     END                                                 01806000
  2262.                          ELSE                                           01807000
  2263.                     BEGIN %  OK, re-ACK the packet                      01808000
  2264.                          R_SPAR(RP_DATA,RP_LEN);                        01809000
  2265.                          SPACK("Y",RP_NUM,RP_LEN,RP_DATA);              01810000
  2266.                          NUMTRY := 0;                                   01811000
  2267.                     END;                                                01812000
  2268.                END                                                      01813000
  2269.                     ELSE                                                01814000
  2270.                IF RP = "Z" THEN                                         01815000
  2271.                BEGIN %  End of file, previous packet (?)                01816000
  2272.                     OLDTRY := OLDTRY + 1;                               01817000
  2273.                     IF OLDTRY > MAXTRY THEN                             01818000
  2274.                     BEGIN                                               01819000
  2275.                          E_ST "RFILE - Pretry (Z) exceeded" E_EN;       01820000
  2276.                          RFILE := "A";                                  01821000
  2277.                     END                                                 01822000
  2278.                          ELSE                                           01823000
  2279.                     IF RP_NUM NEQ PPNO(N) THEN                          01824000
  2280.                     BEGIN  %  N must match                              01825000
  2281.                          E_ST "RFILE - N mismatch on Z packet" E_EN;    01826000
  2282.                          RFILE := "A";                                  01827000
  2283.                     END                                                 01828000
  2284.                          ELSE                                           01829000
  2285.                     BEGIN  %  OK, re-ACK the packet                     01830000
  2286.                          SPACK("Y",RP_NUM,0,RP_DATA);                   01831000
  2287.                          NUMTRY := 0;                                   01832000
  2288.                     END;                                                01833000
  2289.                END                                                      01834000
  2290.                     ELSE                                                01835000
  2291.                IF RP = "F" THEN                                         01836000
  2292.                BEGIN %  File header (what we expect)                    01837000
  2293.                     IF RP_NUM NEQ N THEN                                01838000
  2294.                     BEGIN  %  Oops                                      01839000
  2295.                          E_ST "RFILE - N mismatch" E_EN;                01840000
  2296.                          RFILE := "A";                                  01841000
  2297.                     END                                                 01842000
  2298.                          ELSE                                           01843000
  2299.                     BEGIN %  OK, Open the file                          01844000
  2300.                                                                         01845000
  2301.                          IF L_FNAME_LEN NEQ 0 THEN                      01846000
  2302.                          BEGIN                                          01847000
  2303.                               REPLACE FNAME BY L_FNAME FOR L_FNAME_LEN; 01848000
  2304.                               FN_LEN := L_FNAME_LEN;                    01849000
  2305.                          END                                            01850000
  2306.                               ELSE                                      01851000
  2307.                          BEGIN                                          01852000
  2308.                               CBUFXLT(RP_DATA,RP_LEN,                   01853000
  2309.                                         FNAME,FN_LEN,FN_MAX);           01854000
  2310.                                                                         01855000
  2311.                               IF NOT UNQFNAME(FNAME,FN_LEN) THEN        01856000
  2312.                               BEGIN                                     01857000
  2313.                                    MAKE_U_FNAME(FNAME,FN_LEN);          01858000
  2314.                               END;                                      01859000
  2315.                          END;                                           01860000
  2316.                                                                         01861000
  2317.                          REPLACE FNAME[FN_LEN] BY ".";                  01862000
  2318.                                                                         01863000
  2319.                          IF RCV_BINARY THEN                             01864000
  2320.                          BEGIN %  Binary mode                           01865000
  2321.                               IMAGE := TRUE;                            01866000
  2322.                               FOPT := 0;                                01867000
  2323.                          END                                            01868000
  2324.                               ELSE                                      01869000
  2325.                          BEGIN %  ASCII mode                            01870000
  2326.                               IMAGE := FALSE;                           01871000
  2327.                               FOPT := 4;                                01872000
  2328.                          END;                                           01873000
  2329.                                                                         01874000
  2330.                          IF NOT RCV_FIXREC THEN                         01875000
  2331.                               FOPT := FOPT + 4"40"; %  set variable     01876000
  2332.                                                                         01877000
  2333.                          IF RCV_RECLEN < 0 THEN                         01878000
  2334.                               DBUF_RMAX := -RCV_RECLEN                  01879000
  2335.                          ELSE                                           01880000
  2336.                               DBUF_RMAX := RCV_RECLEN * 2;              01881000
  2337.                                                                         01882000
  2338. %                         IF NOT VALID_FILE(FNAME, FN_LEN, IN) THEN     01883000
  2339. %                         BEGIN                                         01884000
  2340. %                              E_ST "RFILE - file security error" E_EN; 01885000
  2341. %                              RFILE := "A";                            01886000
  2342. %                              DNUM := 0;                               01887000
  2343. %                         END                                           01888000
  2344. %                              ELSE                                     01889000
  2345.                          BEGIN                                          01890000
  2346.                               REPLACE TTL BY FNAME FOR FN_LEN+1         01890100
  2347.                                    WITH ASCIITOEBCDIC;                  01890200
  2348.                               DNUM(TITLE=TTL,                           01891000
  2349.                                    MAXRECSIZE=RCV_RECLEN,               01892000
  2350.                                    UNITS=CHARACTERS,                    01893000
  2351.                                    BLOCKSIZE=RCV_BLOCKF*RCV_RECLEN,     01894000
  2352.                                    KIND=DISK,                           01895000
  2353.                                    NEWFILE,                             01896000
  2354.                                    AREAS=RCV_MAXEXT,                    01897000
  2355.                                    AREASIZE=RCV_MAXREC/RCV_MAXEXT,      01898000
  2356.                                    FILEKIND=RCV_FCODE,                  01899000
  2357.                                    INTMODE=ASCII, EXTMODE=EBCDIC);      01899100
  2358.                          IF DNUM.ATTERR THEN                            01899200
  2359.                               BEGIN %  Can't open file                  01900000
  2360.                                    E_ST "RFILE - Can't open file" E_EN; 01901000
  2361.                                    RFILE := "A";                        01902000
  2362.                               END                                       01903000
  2363.                                    ELSE                                 01904000
  2364.                               BEGIN %  OK                               01905000
  2365.                                    DNUM.OPEN:=TRUE;                     01905800
  2366.                                    DNUM_OPEN:=TRUE;                     01905900
  2367.                                    SPACK("Y",N,RP_LEN,RP_DATA);         01906000
  2368.                                    OLDTRY := NUMTRY;                    01907000
  2369.                                    NUMTRY := 0;                         01908000
  2370.                                    N := NPNO(N);                        01909000
  2371.                                    RFILE := "D";                        01910000
  2372.                                    DBUFCNT := 0;                        01911000
  2373.                                    DBUFINX := 0;                        01912000
  2374.                               END;                                      01913000
  2375.                          END;                                           01914000
  2376.                     END;                                                01915000
  2377.                END                                                      01916000
  2378.                     ELSE                                                01917000
  2379.                IF RP = "B" THEN                                         01918000
  2380.                BEGIN %  Break transmission                              01919000
  2381.                     IF RP_NUM NEQ N THEN                                01920000
  2382.                     BEGIN %  Oops                                       01921000
  2383.                          E_ST "RFILE - (B) N mismatch" E_EN;            01922000
  2384.                          RFILE := "A";                                  01923000
  2385.                     END                                                 01924000
  2386.                          ELSE                                           01925000
  2387.                     BEGIN                                               01926000
  2388.                          SPACK("Y",N,0,RP_DATA);                        01927000
  2389.                          RFILE := "C";                                  01928000
  2390.                     END;                                                01929000
  2391.                END                                                      01930000
  2392.                     ELSE                                                01931000
  2393.                IF RP = "E" THEN                                         01932000
  2394.                BEGIN                                                    01933000
  2395.                     E_ST "RFILE - E packet recieved" E_EN;              01934000
  2396.                     P_EPACK(RP_DATA,RP_LEN);                            01935000
  2397.                     RFILE := "A";                                       01936000
  2398.                END                                                      01937000
  2399.                     ELSE                                                01938000
  2400.                BEGIN                                                    01939000
  2401.                     E_ST "RFILE - Unknown packet type" E_EN;            01940000
  2402.                     RFILE := "A";                                       01941000
  2403.                END;                                                     01942000
  2404.           END %  Got a packet                                           01943000
  2405.                ELSE                                                     01944000
  2406.           BEGIN                                                         01945000
  2407.                SPACK("N",N,0,RP_DATA);  %  No (readable) packet         01946000
  2408.           END;                                                          01947000
  2409.      END;                                                               01948000
  2410. END;                                                                    01949000
  2411.                                                                         01950000
  2412. % *****************************************************************     01951000
  2413.                                                                         01952000
  2414.  $ PAGE                                                                 01953000
  2415. REAL PROCEDURE RDATA;                                                   01954000
  2416. BEGIN                                                                   01955000
  2417.                                                                         01956000
  2418.      RDATA := STATE;                                                    01957000
  2419.      NUMTRY := NUMTRY + 1;                                              01958000
  2420.      IF NUMTRY > MAXTRY THEN                                            01959000
  2421.      BEGIN                                                              01960000
  2422.           E_ST "RDATA - Retry count exceeded" E_EN;                     01961000
  2423.           RDATA := "A";                                                 01962000
  2424.      END                                                                01963000
  2425.           ELSE                                                          01964000
  2426.      BEGIN                                                              01965000
  2427.           IF RPACK(RP,RP_LEN,RP_NUM,RP_DATA) THEN                       01966000
  2428.           BEGIN                                                         01967000
  2429.                IF RP = "D" THEN                                         01968000
  2430.                BEGIN  %  Good, what we expect                           01969000
  2431.                     IF RP_NUM NEQ N THEN                                01970000
  2432.                     BEGIN  %  Oops, not this packet                     01971000
  2433.                          OLDTRY := OLDTRY + 1;                          01972000
  2434.                          IF OLDTRY > MAXTRY THEN                        01973000
  2435.                          BEGIN                                          01974000
  2436.                               E_ST "RDATA - Pretry exceeded" E_EN;      01975000
  2437.                               RDATA := "A";                             01976000
  2438.                          END                                            01977000
  2439.                               ELSE                                      01978000
  2440.                          IF RP_NUM = PPNO(N) THEN                       01979000
  2441.                          BEGIN  %  Already have this one                01980000
  2442.                               SPACK("Y",RP_NUM,0,RP_DATA); %  Re-ACK    01981000
  2443.                               NUMTRY := 0;                              01982000
  2444.                          END                                            01983000
  2445.                               ELSE                                      01984000
  2446.                          BEGIN                                          01985000
  2447.                               E_ST "RDATA - N (D) mismatch" E_EN;       01986000
  2448.                               RDATA := "A";                             01987000
  2449.                          END;                                           01988000
  2450.                     END %  Wrong packet                                 01989000
  2451.                          ELSE                                           01990000
  2452.                     BEGIN %  Got the one we want                        01991000
  2453.                          BUFEMP(RP_DATA,RP_LEN);  %  Process            01992000
  2454.                          SPACK("Y",N,0,RP_DATA);  %  AND ACK            01993000
  2455.                          OLDTRY := NUMTRY;                              01994000
  2456.                          NUMTRY := 0;                                   01995000
  2457.                          N := NPNO(N);                                  01996000
  2458.                     END;                                                01997000
  2459.                END %  RP = "D"                                          01998000
  2460.                     ELSE                                                01999000
  2461.                IF RP = "F" THEN                                         02000000
  2462.                BEGIN %  File header                                     02001000
  2463.                     OLDTRY := OLDTRY + 1;                               02002000
  2464.                     IF OLDTRY > MAXTRY THEN                             02003000
  2465.                     BEGIN                                               02004000
  2466.                          E_ST "RDATA - Pretry (F) exceeded" E_EN;       02005000
  2467.                          RDATA := "A";                                  02006000
  2468.                     END                                                 02007000
  2469.                          ELSE                                           02008000
  2470.                     IF RP_NUM NEQ PPNO(N) THEN                          02009000
  2471.                     BEGIN %  Oops                                       02010000
  2472.                          E_ST "RDATA - N (F) mismatch" E_EN;            02011000
  2473.                          RDATA := "A";                                  02012000
  2474.                     END                                                 02013000
  2475.                          ELSE                                           02014000
  2476.                     BEGIN %  OK                                         02015000
  2477.                          SPACK("Y",RP_NUM,0,RP_DATA); %  ReACK          02016000
  2478.                          NUMTRY := 0;                                   02017000
  2479.                     END;                                                02018000
  2480.                END %  RP = "F"                                          02019000
  2481.                     ELSE                                                02020000
  2482.                IF RP = "Z" THEN                                         02021000
  2483.                BEGIN %  End of File                                     02022000
  2484.                     IF RP_NUM NEQ N THEN                                02023000
  2485.                     BEGIN                                               02024000
  2486.                          E_ST "RDATA - N (Z) mismatch" E_EN;            02025000
  2487.                          RDATA := "A";                                  02026000
  2488.                     END                                                 02027000
  2489.                          ELSE                                           02028000
  2490.                     BEGIN                                               02029000
  2491.                          IF DBUFINX > 0 THEN                            02030000
  2492.                               FLUSH_DBUF;                               02031000
  2493.                                                                         02032000
  2494.                          IF RCV_SAVESP THEN                             02033000
  2495.                               LOCK(DNUM, CRUNCH)                        02034000
  2496.                          ELSE                                           02035000
  2497.                               LOCK(DNUM);                               02036000
  2498.                                                                         02037000
  2499.                          DNUM_OPEN:=FALSE;                              02038000
  2500.                          SPACK("Y",N,0,RP_DATA); %  ACK                 02039000
  2501.                          L_FNAME_LEN := 0;                              02040000
  2502.                          N := NPNO(N);                                  02041000
  2503.                          RDATA := "F";                                  02042000
  2504.                     END;                                                02043000
  2505.                END %  RP = "Z"                                          02044000
  2506.                     ELSE                                                02045000
  2507.                IF RP = "E" THEN                                         02046000
  2508.                BEGIN                                                    02047000
  2509.                     E_ST "RDATA - E packet recieved" E_EN;              02048000
  2510.                     P_EPACK(RP_DATA,RP_LEN);                            02049000
  2511.                     RDATA := "A";                                       02050000
  2512.                END                                                      02051000
  2513.                     ELSE                                                02052000
  2514.                BEGIN                                                    02053000
  2515.                     E_ST "RDATA - Unknown packet type" E_EN;            02054000
  2516.                     RDATA := "A";                                       02055000
  2517.                END;                                                     02056000
  2518.           END %  Got packet                                             02057000
  2519.                ELSE                                                     02058000
  2520.           BEGIN                                                         02059000
  2521.                SPACK("N",N,0,RP_DATA);  %  NAK                          02060000
  2522.           END;                                                          02061000
  2523.      END;                                                               02062000
  2524. END;                                                                    02063000
  2525.  $ PAGE                                                                 02064000
  2526. % *****************************************************************     02065000
  2527.                                                                         02066000
  2528.      IF NOT SERVE THEN                                                  02067000
  2529.      BEGIN                                                              02068000
  2530.           STATE := "R";                                                 02069000
  2531.           N := 0;                                                       02070000
  2532.           NUMTRY := 0;                                                  02071000
  2533.      END                                                                02072000
  2534.           ELSE                                                          02073000
  2535.      BEGIN                                                              02074000
  2536.           STATE := "F";                                                 02075000
  2537.      END;                                                               02076000
  2538.                                                                         02077000
  2539.      WHILE NOT (DONE OR BLASTED) DO                                     02078000
  2540.      BEGIN                                                              02079000
  2541.           IF STATE = "R" THEN STATE := RINIT                            02080000
  2542.                ELSE                                                     02081000
  2543.           IF STATE = "F" THEN STATE := RFILE                            02082000
  2544.                ELSE                                                     02083000
  2545.           IF STATE = "D" THEN STATE := RDATA                            02084000
  2546.                ELSE                                                     02085000
  2547.           IF STATE = "C" THEN                                           02086000
  2548.           BEGIN                                                         02087000
  2549.                DONE := TRUE;                                            02088000
  2550.                RECSW := TRUE;                                           02089000
  2551.           END                                                           02090000
  2552.                ELSE                                                     02091000
  2553.           IF STATE = "A" THEN                                           02092000
  2554.           BEGIN                                                         02093000
  2555.                DONE := TRUE;                                            02094000
  2556.                RECSW := FALSE;                                          02095000
  2557.           END;                                                          02096000
  2558.      END;                                                               02097000
  2559.                                                                         02098000
  2560.      IF DNUM.OPEN THEN                                                  02099000
  2561.      BEGIN                                                              02100000
  2562.           CLOSE(DNUM);                                                  02101000
  2563.           DNUM_OPEN:=FALSE;                                             02102000
  2564.      END;                                                               02103000
  2565. END;                                                                    02104000
  2566. % ****************************************************************      02105000
  2567.  $ ENDSEGMENT  %  End all send, receive, and packet handling.           02106000
  2568.  $ PAGE                                                                 02107000
  2569. BOOLEAN PROCEDURE TYPESW;                                               02108000
  2570. BEGIN                                                                   02109000
  2571.      BOOLEAN        DONE;                                               02110000
  2572.      LABEL          XIT;                                                02110100
  2573.                                                                         02111000
  2574. %     IF VALID_FILE(L_FNAME, L_FNAME_LEN, OUT) THEN                     02112000
  2575. %          ELSE                                                         02113000
  2576. %     BEGIN                                                             02114000
  2577. %          M_ST ("Kermit file security error - ",                       02115000
  2578. %                "see your account manager") M_EN;                      02116000
  2579. %          TYPESW := FALSE;                                             02117000
  2580. %          return;                                                      02118000
  2581. %     END;                                                              02119000
  2582.                                                                         02120000
  2583.      REPLACE TTL BY L_FNAME FOR L_FNAME_LEN+1 WITH ASCIITOEBCDIC;       02120100
  2584.      DNUM(KIND = DISK, TITLE = TTL,                                     02121000
  2585.           INTMODE = ASCII, DEPENDENTSPECS = TRUE,                       02121100
  2586.           NEWFILE = FALSE);                                             02121200
  2587.      IF NOT DNUM.PRESENT THEN                                           02122000
  2588.      BEGIN                                                              02123000
  2589.           M_ST "File open failure" M_EN;                                02124000
  2590.           TYPESW := FALSE;                                              02125000
  2591.           GO TO XIT;                                                    02126000
  2592.      END;                                                               02127000
  2593.                                                                         02127100
  2594.      SND_RECLEN := DNUM.MAXRECSIZE                                      02127200
  2595.                    * (IF DNUM.FRAMESIZE=48  THEN 6  ELSE 1);            02127300
  2596.                                                                         02128000
  2597.      WHILE NOT(DONE OR BLASTED) DO                                      02129000
  2598.      BEGIN                                                              02130000
  2599.           DBUFCNT:=REAL(READ(DNUM, SND_RECLEN, DBUF));                  02131000
  2600.           IF BOOLEAN(DBUFCNT) AND NOT BOOLEAN(DBUFCNT.[9:1]) THEN       02132000
  2601.           BEGIN  %  Read error                                          02133000
  2602.                M_ST "TYPESW - read error" M_EN;                         02134000
  2603.                TYPESW := FALSE;                                         02135000
  2604.                DONE := TRUE;                                            02136000
  2605.           END                                                           02137000
  2606.                ELSE                                                     02138000
  2607.           IF BOOLEAN(DBUFCNT.[9:1]) THEN                                02139000
  2608.           BEGIN  %  EOF                                                 02140000
  2609.                TYPESW := DONE := TRUE;                                  02141000
  2610.           END                                                           02142000
  2611.                ELSE                                                     02143000
  2612.                WRITE(CONUM, SND_RECLEN, DBUF);                          02144000
  2613.           WHEN(0.40); % So we can see ?HI. Machine is slower than this! 02144100
  2614.      END;                                                               02145000
  2615.      CLOSE(DNUM);                                                       02146000
  2616.      DNUM_OPEN:=FALSE;                                                  02147000
  2617.      IF BLASTED THEN                                                    02148000
  2618.           TYPESW := FALSE;                                              02149000
  2619. XIT:                                                                    02149100
  2620. END;                                                                    02150000
  2621.                                                                         02151000
  2622. % *****************************************************************     02152000
  2623.                                                                         02153000
  2624.  $ PAGE                                                                 02154000
  2625. %BOOLEAN PROCEDURE OPEN_LINE;                                           02156000
  2626. %BEGIN                                                                  02157000
  2627. %                                                                       02158000
  2628. %     BOOLEAN        R_ERROR,                                           02159000
  2629. %                    TEMP;                                              02160000
  2630. %                                                                       02161000
  2631. %     INTEGER        DEV_L;                                             02162000
  2632. %                                                                       02163000
  2633. %     ASCII ARRAY     A_DEV[0:11];                                      02164000
  2634. %                                                                       02165000
  2635. %     % ************************************************************    02166000
  2636. %                                                                       02167000
  2637. %     IF NOT LNUM.OPEN THEN                                             02168000
  2638. %     BEGIN %  Line NOT open                                            02169000
  2639. %          IF LDEV_LINE = 0 THEN                                        02170000
  2640. %          BEGIN                                                        02171000
  2641. %               E_ST "Line not specified or defaultable" E_EN;          02172000
  2642. %               R_ERROR := TRUE;                                        02173000
  2643. %          END                                                          02174000
  2644. %               ELSE                                                    02175000
  2645. %          BEGIN                                                        02176000
  2646. %               MOVE PBUF := "SETMSG OFF",2;                            02177000
  2647. %               PLEN := TOS - @PBUF;                                    02178000
  2648. %               PBUF(PLEN) := CR;                                       02179000
  2649. %               COMMAND(PBUF,PLEN,DEV_L);                               02180000
  2650. %                                                                       02181000
  2651. %               DEV_L := ASCII(LDEV_LINE,10,A_DEV);                     02182000
  2652. %               A_DEV(DEV_L) := " ";                                    02183000
  2653. %               LNUM(KIND=REMOTE,                                       02184000
  2654. %                    MAXRECSIZE=128, UNITS=CHARACTERS,                  02184100
  2655. %                    FILETYPE=3); % Variable                            02184200
  2656. %               IF LNUM.ATTERR THEN                                     02185000
  2657. %               BEGIN                                                   02186000
  2658. %                    E_ST "FOPEN error on communications port" E_EN;    02187000
  2659. %                    R_ERROR := TRUE;                                   02188000
  2660. %               END                                                     02189000
  2661. %                    ELSE                                               02190000
  2662. %               BEGIN %  Set up the line                                02191000
  2663. %                    LNUM.OPEN:=TRUE;                                   02191100
  2664. %                    IF HNDSHK = 0 THEN                                 02192000
  2665. %                         TTYPE := 18                                   02193000
  2666. %                    ELSE                                               02194000
  2667. %                         TTYPE := 13;                                  02195000
  2668. %                                                                       02196000
  2669. %                    FCONTROL(LNUM,13,ORGL_ECHO);                       02197000
  2670. %                                                                       02198000
  2671. %                    FCONTROL(LNUM,39,ORGL_TTYPE);                      02199000
  2672. %                    FCONTROL(LNUM,38,TTYPE);                           02200000
  2673. %                                                                       02201000
  2674. %                    IF TSPEED NEQ 0 THEN                               02202000
  2675. %                    BEGIN                                              02203000
  2676. %                         ORGL_TISPEED := TSPEED;                       02204000
  2677. %                         FCONTROL(LNUM,10,ORGL_TISPEED);               02205000
  2678. %                         ORGL_TOSPEED := TSPEED;                       02206000
  2679. %                         FCONTROL(LNUM,11,ORGL_TOSPEED);               02207000
  2680. %                    END;                                               02208000
  2681. %                                                                       02209000
  2682. %                    FSETMODE(LNUM,4); %  Inhibit LF                    02210000
  2683. %                                                                       02211000
  2684. %                    IF HNDSHK = 2 THEN                                 02212000
  2685. %                    BEGIN %  Set XON as termination char               02213000
  2686. %                         TEMP := XON;                                  02214000
  2687. %                         FCONTROL(LNUM,25,TEMP);                       02215000
  2688. %                    END;                                               02216000
  2689. %                                                                       02217000
  2690. %                                                                       02218000
  2691. %                    IF (LDEV_CI = LDEV_LINE) AND                       02219000
  2692. %                       (LOGNUM = CONUM)           THEN LOGNUM := 0;    02220000
  2693. %               END;                                                    02221000
  2694. %          END;                                                         02222000
  2695. %     END;                                                              02223000
  2696. %                                                                       02224000
  2697. %     OPEN_LINE := NOT R_ERROR;                                         02225000
  2698. %END;                                                                   02226000
  2699. %                                                                       02227000
  2700.  $ PAGE                                                                 02228000
  2701. %PROCEDURE SHUT_LINE;                                                   02230000
  2702. %BEGIN                                                                  02231000
  2703. %                                                                       02232000
  2704. %     BOOLEAN   TEMP;                                                   02233000
  2705. %                                                                       02234000
  2706. %     % ************************************************************    02235000
  2707. %                                                                       02236000
  2708. %     IF LNUM.OPEN THEN                                                 02237000
  2709. %     BEGIN %  Line is open                                             02238000
  2710. %          FSETMODE(LNUM,0);  %  Turn on linefeed                       02239000
  2711. %                                                                       02240000
  2712. %          IF ORGL_TTYPE NEQ TTYPE THEN                                 02241000
  2713. %               FCONTROL(LNUM,38,ORGL_TTYPE);                           02242000
  2714. %                                                                       02243000
  2715. %          IF TSPEED NEQ 0 THEN                                         02244000
  2716. %          BEGIN                                                        02245000
  2717. %               IF ORGL_TISPEED NEQ TSPEED THEN                         02246000
  2718. %               BEGIN                                                   02247000
  2719. %                    TEMP := ORGL_TISPEED;                              02248000
  2720. %                    FCONTROL(LNUM,10,TEMP);                            02249000
  2721. %               END;                                                    02250000
  2722. %               IF ORGL_TOSPEED NEQ TSPEED THEN                         02251000
  2723. %               BEGIN                                                   02252000
  2724. %                    TEMP := ORGL_TOSPEED;                              02253000
  2725. %                    FCONTROL(LNUM,11,TEMP);                            02254000
  2726. %               END;                                                    02255000
  2727. %          END;                                                         02256000
  2728. %                                                                       02257000
  2729. %          IF ORGL_ECHO = 0 THEN                                        02258000
  2730. %               FCONTROL(LNUM,12,TEMP);                                 02259000
  2731. %                                                                       02260000
  2732. %          IF HNDSHK = 2 THEN                                           02261000
  2733. %          BEGIN                                                        02262000
  2734. %               TEMP := 0;                                              02263000
  2735. %               FCONTROL(LNUM,25,TEMP);                                 02264000
  2736. %          END;                                                         02265000
  2737. %                                                                       02266000
  2738. %                                                                       02267000
  2739. %          CLOSE(LNUM);                                                 02268000
  2740. %                                                                       02270000
  2741. %          IF LOGNUM = 0 THEN LOGNUM := CONUM;                          02271000
  2742. %                                                                       02272000
  2743. %          MOVE PBUF := "SETMSG ON",2;                                  02273000
  2744. %          PLEN := TOS - @PBUF;                                         02274000
  2745. %          PBUF(PLEN) := CR;                                            02275000
  2746. %          COMMAND(PBUF,PLEN,TEMP);                                     02276000
  2747. %     END;                                                              02277000
  2748. %END;                                                                   02278000
  2749. %                                                                       02279000
  2750.  $ PAGE                                                                 02280000
  2751. %PROCEDURE KILL_KTEMP;                                                  02282000
  2752. %BEGIN                                                                  02283000
  2753. %INTEGER         X;     %  Temp variable                                02285000
  2754. %                                                                       02286000
  2755. %     ASCII ARRAY TBUF[0:79];                                           02287000
  2756. %                                                                       02288000
  2757. %     MOVE TBUF := "RESET ",2;                                          02289000
  2758. %     MOVE * := KTEMP_NAME,2;                                           02290000
  2759. %     X := TOS - @TBUF;                                                 02291000
  2760. %     TBUF(X) := CR;                                                    02292000
  2761. %     COMMAND(TBUF,TNUM,X);  %  Reset file equate                       02293000
  2762. %                                                                       02294000
  2763. %     MOVE TBUF := KTEMP_NAME,2;                                        02295000
  2764. %     X := TOS - @TBUF;                                                 02296000
  2765. %     TBUF(X) := " ";                                                   02297000
  2766. %                                                                       02298000
  2767. %     TNUM := FOPEN(TBUF,7,4);  %  Try to open it                       02299000
  2768. %     IF TNUM.OPEN THEN                                                 02300000
  2769. %          CLOSE(TNUM, PURGE);  %  Kill it                              02301000
  2770. %     HAVE_KTEMP := FALSE;                                              02302000
  2771. %END;                                                                   02303000
  2772. %                                                                       02304000
  2773.  $ PAGE                                                                 02305000
  2774. %PROCEDURE GET_KTEMP;                                                   02307000
  2775. %BEGIN                                                                  02308000
  2776. %INTEGER        X;     %  Temp variable                                 02310000
  2777. %                                                                       02311000
  2778. %     ASCII ARRAY TBUF[0:79];                                           02312000
  2779. %                                                                       02313000
  2780. %     KILL_KTEMP; %  Delete any old one                                 02314000
  2781. %     TNUM(KIND=DISK,                                                   02315000
  2782. %          TITLE=KTEMP_NAME,                                            02315100
  2783. %          MAXRECSIZE=80, UNITS=CHARACTERS,                             02315200
  2784. %          BLOCKSIZE=720,  %  Blocked 9                                 02315300
  2785. %          NEWFILE,                                                     02315310
  2786. %          AREAS=20, AREASIZE=180);  %  Nothing magical about size      02315400
  2787. %     TNUM.OPEN:=TRUE;                                                  02315500
  2788. %     IF TNUM.OPEN THEN                                                 02315600
  2789. %          HAVE_KTEMP:=TRUE;                                            02315700
  2790. %     IF TNUM.OPEN THEN                                                 02316000
  2791. %     BEGIN                                                             02317000
  2792. %          FCLOSE(TNUM,2,0); %  Save as temporary                       02318000
  2793. %          IF = THEN                                                    02319000
  2794. %          BEGIN                                                        02320000
  2795. %               MOVE TBUF := "FILE ",2;                                 02321000
  2796. %               MOVE * := KTEMP_NAME,2;                                 02322000
  2797. %               MOVE * := ",OLDTEMP",2;                                 02323000
  2798. %               X := TOS - @TBUF;                                       02324000
  2799. %               TBUF(X) := CR;                                          02325000
  2800. %               COMMAND(TBUF,X,TNUM);                                   02326000
  2801. %               IF X = 0 THEN                                           02327000
  2802. %                    HAVE_KTEMP := TRUE;                                02328000
  2803. %          END;                                                         02329000
  2804. %     END;                                                              02330000
  2805. %END;                                                                   02331000
  2806.  $ PAGE                                                                 02332000
  2807. PROCEDURE HOST_COMMAND(CMD,CMD_LEN,LONG_REPLY);                         02334000
  2808. VALUE                      CMD_LEN,LONG_REPLY ;                         02335000
  2809. ASCII ARRAY             CMD[0]                 ;                        02336000
  2810. INTEGER                    CMD_LEN            ;                         02337000
  2811. BOOLEAN                            LONG_REPLY ;                         02338000
  2812. BEGIN                                                                   02339000
  2813.                                                                         02340000
  2814.      ASCII ARRAY     CMD_BUF[0:79];                                     02341000
  2815.                                                                         02342000
  2816.      BOOLEAN        CMD_ERR;                                            02343000
  2817.                                                                         02344000
  2818.      INTEGER        CI_ERNO,                                            02345000
  2819.                     CI_PARM;                                            02346000
  2820.                                                                         02347000
  2821.      % ------------------------------------------------------------     02348000
  2822. CMD_ERR:=TRUE; %%%%%%%%%%  EVERYTHING IS ILLEGAL FOR THE MOMENT         02348100
  2823.                                                                         02349000
  2824. %     MOVE CMD_BUF := CMD,(CMD_LEN);                                    02350000
  2825. %     IF LONG_REPLY THEN                                                02351000
  2826. %     BEGIN                                                             02352000
  2827. %          GET_KTEMP;                                                   02353000
  2828. %          IF NOT HAVE_KTEMP THEN                                       02354000
  2829. %          BEGIN                                                        02355000
  2830. %               MOVE CMD_BUF := "Unable to allocate temp file",2;       02356000
  2831. %               CMD_LEN := TOS - @CMD_BUF;                              02357000
  2832. %               SPACK("E",N,CMD_LEN,CMD_BUF);                           02358000
  2833. %               CMD_ERR := TRUE;                                        02359000
  2834. %          END;                                                         02360000
  2835. %     END;                                                              02361000
  2836. %                                                                       02362000
  2837. %     IF NOT CMD_ERR THEN                                               02363000
  2838. %     BEGIN                                                             02364000
  2839. %          CMD_BUF(CMD_LEN) := CR;                                      02365000
  2840. %          COMMAND(CMD_BUF,CI_ERNO,CI_PARM);  %  Issue the command      02366000
  2841. %          IF CI_ERNO NEQ 0 THEN                                        02367000
  2842. %          BEGIN  %  Command Interpreter error                          02368000
  2843. %               MOVE CMD_BUF := "Command Error, CIERROR = ",2;          02369000
  2844. %               CMD_LEN := TOS - @CMD_BUF;                              02370000
  2845. %               CMD_LEN := CMD_LEN + ASCII(CI_ERNO,10,CMD_BUF(CMD_LEN));02371000
  2846. %               SPACK("E",N,CMD_LEN,CMD_BUF);                           02372000
  2847. %               CMD_ERR := TRUE;                                        02373000
  2848. %          END                                                          02374000
  2849. %               ELSE                                                    02375000
  2850. %          BEGIN %  Command OK                                          02376000
  2851. %               IF LONG_REPLY THEN                                      02377000
  2852. %               BEGIN                                                   02378000
  2853. %                    DNUM := FOPEN(KT_NAME,6,0);                        02379000
  2854. %                    IF DNUM = 0 THEN                                   02380000
  2855. %                    BEGIN %  Temp file open error                      02381000
  2856. %                         MOVE CMD_BUF := "Temp file open failure",2;   02382000
  2857. %                         CMD_LEN := TOS - @CMD_BUF;                    02383000
  2858. %                         SPACK("E",N,CMD_LEN,CMD_BUF);                 02384000
  2859. %INTEGER                  CMD_ERR := TRUE;                              02385000
  2860. %                    END                                                02386000
  2861. %                         ELSE                                          02387000
  2862. %                    BEGIN                                              02388000
  2863. %                         SENDSW(CMD_BUF,0);                            02389000
  2864. %                         STATE := SBREAK;                              02390000
  2865. %                    END;                                               02391000
  2866. %               END                                                     02392000
  2867. %                    ELSE                                               02393000
  2868. %               BEGIN %  Short reply                                    02394000
  2869. %                    SPACK("Y",N,0,CMD_BUF);                            02395000
  2870. %               END;                                                    02396000
  2871. %          END;                                                         02397000
  2872. %     END;                                                              02398000
  2873. END;                                                                    02399000
  2874.  $ PAGE                                                                 02400000
  2875. PROCEDURE KERMIT_COMMAND(KCMD,KCMD_LEN);                                02402000
  2876. VALUE                         KCMD_LEN ;                                02403000
  2877. ASCII ARRAY               KCMD[0]       ;                               02404000
  2878. INTEGER                       KCMD_LEN ;                                02405000
  2879. BEGIN                                                                   02406000
  2880.                                                                         02407000
  2881.      ASCII ARRAY     KC_BUF[0:79];                                      02408000
  2882.                                                                         02408100
  2883.      POINTER         PTEMP;                                             02408200
  2884.                                                                         02409000
  2885.      INTEGER        KC_LEN,                                             02410000
  2886.                     X;                                                  02411000
  2887.                                                                         02412000
  2888.      % ------------------------------------------------------------     02413000
  2889.                                                                         02414000
  2890. % _ST "KERMIT COMMAND  KCMD=(", 2;                                      02415000
  2891. % LEN:=(PLEN:=TOS-@PBUF)+ASCII(KCMD_LEN,10,PBUF(PLEN));                 02416000
  2892. % OVE PBUF(PLEN):=")", 2; MOVE *:=KCMD,(KCMD_LEN) E_EN;                 02417000
  2893. %     IF (KCMD = "D") AND (KCMD_LEN > 0) THEN                           02418000
  2894. %     BEGIN  %  Directory Command                                       02419000
  2895. %          MOVE KC_BUF := "LISTF ",2;                                   02420000
  2896. %          KC_LEN := TOS - @KC_BUF;                                     02421000
  2897. %                                                                       02422000
  2898. %          IF KCMD_LEN > 2 THEN                                         02423000
  2899. %          BEGIN  %  Check for filespec                                 02424000
  2900. %               X := UNCHAR(KCMD(1));                                   02425000
  2901. %               IF (X > 0) AND (X <= (KCMD_LEN -2)) THEN                02426000
  2902. %               BEGIN  %  Use filespec                                  02427000
  2903. %                    MOVE KC_BUF(KC_LEN) := KCMD(2),(X);                02428000
  2904. %                    KC_LEN := KC_LEN + X;                              02429000
  2905. %               END;                                                    02430000
  2906. %          END;                                                         02431000
  2907. %                                                                       02432000
  2908. %          MOVE KC_BUF(KC_LEN) := ",2",2;                               02433000
  2909. %          MOVE * := ";*",2;                                            02434000
  2910. %          MOVE * := KTEMP_NAME,2;                                      02435000
  2911. %          KC_LEN := TOS - @KC_BUF;                                     02436000
  2912. %          HOST_COMMAND(KC_BUF,KC_LEN,TRUE);                            02437000
  2913. %     END                                                               02438000
  2914. %                                                                       02439000
  2915. %          ELSE                                                         02440000
  2916. %     IF (KCMD = "U") AND (KCMD_LEN > 0) THEN                           02441000
  2917. %     BEGIN  %  File space usage                                        02442000
  2918. %          MOVE KC_BUF := "REPORT ",2;                                  02443000
  2919. %          KC_LEN := TOS - @KC_BUF;                                     02444000
  2920. %                                                                       02445000
  2921. %          IF KCMD_LEN > 2 THEN                                         02446000
  2922. %          BEGIN  %  Check for groupspec                                02447000
  2923. %               X := UNCHAR(KCMD(1));                                   02448000
  2924. %               IF (X > 0) AND (X <= (KCMD_LEN -2)) THEN                02449000
  2925. %               BEGIN  %  Use groupspec                                 02450000
  2926. %                    MOVE KC_BUF(KC_LEN) := KCMD(2),(X);                02451000
  2927. %                    KC_LEN := KC_LEN + X;                              02452000
  2928. %               END;                                                    02453000
  2929. %          END;                                                         02454000
  2930. %                                                                       02455000
  2931. %          MOVE KC_BUF(KC_LEN) := ",*",2;                               02456000
  2932. %          MOVE * := KTEMP_NAME,2;                                      02457000
  2933. %          KC_LEN := TOS - @KC_BUF;                                     02458000
  2934. %                                                                       02459000
  2935. %          HOST_COMMAND(KC_BUF,KC_LEN,TRUE);                            02460000
  2936. %     END                                                               02461000
  2937. %                                                                       02462000
  2938. %          ELSE                                                         02463000
  2939. %     IF (KCMD = "E") AND (KCMD_LEN > 0) THEN                           02464000
  2940. %     BEGIN  %  Erase (delete) command                                  02465000
  2941. %          MOVE KC_BUF := "PURGE ",2;                                   02466000
  2942. %          KC_LEN := TOS - @KC_BUF;                                     02467000
  2943. %                                                                       02468000
  2944. %          IF KCMD_LEN > 2 THEN                                         02469000
  2945. %          BEGIN                                                        02470000
  2946. %               X := UNCHAR(KCMD(1));                                   02471000
  2947. %          END                                                          02472000
  2948. %               ELSE                                                    02473000
  2949. %          BEGIN                                                        02474000
  2950. %               X := 0;                                                 02475000
  2951. %          END;                                                         02476000
  2952. %                                                                       02477000
  2953. %          IF (X < 1) OR (X > (KCMD_LEN-2))                             02478000
  2954. %          OR NOT VALID_FILE(KCMD(2), X, IN)  THEN                      02479000
  2955. %          BEGIN                                                        02480000
  2956. %               MOVE KC_BUF := "Filespec missing or invalid",2;         02481000
  2957. %               KC_LEN := TOS - @KC_BUF;                                02482000
  2958. %               SPACK("E",N,KC_LEN,KC_BUF);                             02483000
  2959. %          END                                                          02484000
  2960. %               ELSE                                                    02485000
  2961. %          BEGIN                                                        02486000
  2962. %               MOVE KC_BUF(KC_LEN) := KCMD(2),(X);                     02487000
  2963. %               KC_LEN := KC_LEN + X;                                   02488000
  2964. %               HOST_COMMAND(KC_BUF,KC_LEN,FALSE);                      02489000
  2965. %          END;                                                         02490000
  2966. %     END                                                               02491000
  2967. %                                                                       02492000
  2968. %          ELSE                                                         02493000
  2969. %     IF (KCMD = "T") AND (KCMD_LEN > 0) THEN                           02494000
  2970. %     BEGIN  %  Type Command                                            02495000
  2971. %          IF KCMD_LEN > 1 THEN                                         02496000
  2972. %          BEGIN                                                        02497000
  2973. %               X := UNCHAR(KCMD(1));                                   02498000
  2974. %          END                                                          02499000
  2975. %               ELSE                                                    02500000
  2976. %          BEGIN                                                        02501000
  2977. %               X := 0;                                                 02502000
  2978. %          END;                                                         02503000
  2979. %                                                                       02504000
  2980. %          IF (X < 1) OR (X > (KCMD_LEN -2)) THEN                       02505000
  2981. %          BEGIN                                                        02506000
  2982. %               MOVE KC_BUF := "Filespec missing or invalid",2;         02507000
  2983. %               KC_LEN := TOS - @KC_BUF;                                02508000
  2984. %               SPACK("E",N,KC_LEN,KC_BUF);                             02509000
  2985. %          END                                                          02510000
  2986. %               ELSE                                                    02511000
  2987. %          BEGIN                                                        02512000
  2988. %               MOVE KC_BUF := KCMD(2),(X);                             02513000
  2989. %               KC_BUF(X) := " ";                                       02514000
  2990. %                                                                       02515000
  2991. %               IF NOT VALID_FILE(KC_BUF, X, OUT) THEN                  02516000
  2992. %               BEGIN                                                   02517000
  2993. %                    MOVE KC_BUF := ("Kermit file security error -",    02518000
  2994. %                                    " see your account manager"),2;    02519000
  2995. %                    KC_LEN := TOS - @KC_BUF;                           02520000
  2996. %                    SPACK("E",N,KC_LEN,KC_BUF);                        02521000
  2997. %               END                                                     02522000
  2998. %                    ELSE                                               02523000
  2999. %               BEGIN                                                   02524000
  3000. %                    DNUM := FOPEN(KC_BUF,5,0);                         02525000
  3001. %                    IF DNUM = 0 THEN                                   02526000
  3002. %                    BEGIN                                              02527000
  3003. %                         MOVE KC_BUF := "File open error",2;           02528000
  3004. %                         KC_LEN := TOS - @KC_BUF;                      02529000
  3005. %                         SPACK("E",N,KC_LEN,KC_BUF);                   02530000
  3006. %                    END                                                02531000
  3007. %                         ELSE                                          02532000
  3008. %                    BEGIN                                              02533000
  3009. %                         SENDSW(KC_BUF,0);                             02534000
  3010. %                         STATE := SBREAK;                              02535000
  3011. %                    END;                                               02536000
  3012. %               END;                                                    02537000
  3013. %          END;                                                         02538000
  3014. %     END                                                               02539000
  3015. %                                                                       02540000
  3016. %          ELSE                                                         02541000
  3017.      BEGIN                                                              02542000
  3018.           REPLACE PTEMP:KC_BUF BY "Unimplementented Server Command";    02543000
  3019.           KC_LEN:=OFFSET(PTEMP);                                        02544000
  3020.           SPACK("E",N,KC_LEN,KC_BUF);                                   02545000
  3021.      END;                                                               02546000
  3022. END;                                                                    02547000
  3023.  $ PAGE                                                                 02548000
  3024. PROCEDURE SERVER;                                                       02550000
  3025. BEGIN                                                                   02551000
  3026.                                                                         02552000
  3027.      DEFINE         CB_MAX = 79#;  %  Max command size -1               02553000
  3028.                                                                         02554000
  3029.      ASCII ARRAY     CBUF[0:CB_MAX]; %  Command Buffer                  02555000
  3030.                                                                         02556000
  3031.      BOOLEAN        DONE,                                               02557000
  3032.                     SEARCHED;                                           02558000
  3033.                                                                         02559000
  3034.      INTEGER        CB_CNT,  %  Command size                            02560000
  3035.                     KT_NUM;  %  Temp file number                        02561000
  3036.      % ************************************************************     02562000
  3037.      BOOLEAN PROCEDURE DIRSEARCH;                                       02563000
  3038.      BEGIN                                                              02564000
  3039.           DIRSEARCH:=FALSE;  %  Prepare for the worst                   02565000
  3040. %          IF NOT SEARCHED THEN                                         02566000
  3041. %          BEGIN                                                        02567000
  3042. %               GET_KTEMP;                                              02568000
  3043. %               IF NOT HAVE_KTEMP THEN                                  02569000
  3044. %               BEGIN                                                   02570000
  3045. %                    MOVE PBUF:="Unable to allocate temp file", 2;      02571000
  3046. %                    PLEN:=TOS-@PBUF;                                   02572000
  3047. %                    SPACK("E", N, PLEN, PBUF);                         02573000
  3048. %                    return;                                            02574000
  3049. %               END;                                                    02575000
  3050. %               MOVE PBUF:="LISTF ", 2;                                 02576000
  3051. %               MOVE *:=CBUF, (CB_CNT), 2;                              02577000
  3052. %               MOVE *:=("; *", KTEMP_NAME, CR);                        02578000
  3053. %               COMMAND(PBUF, ERROR, PARM);                             02579000
  3054. %               IF ERROR NEQ 0 THEN                                     02580000
  3055. %               BEGIN                                                   02581000
  3056. %                    MOVE PBUF:="Directory search failed. Error=", 2;   02582000
  3057. %                    PLEN:=(PLEN:=TOS-@PBUF) +                          02583000
  3058. %                          ASCII(ERROR, 10, PBUF(PLEN));                02584000
  3059. %                    SPACK("E", N, PLEN, PBUF);                         02585000
  3060. %                    return;                                            02586000
  3061. %               END;                                                    02587000
  3062. %                                                                       02588000
  3063. %               KT_NUM:=FOPEN(KT_NAME, 6, 0);                           02589000
  3064. %               IF KT_NUM = 0 THEN                                      02590000
  3065. %               BEGIN                                                   02591000
  3066. %                    MOVE PBUF:="Temp file open failure", 2;            02592000
  3067. %                    PLEN:=TOS-@PBUF;                                   02593000
  3068. %                    SPACK("E", N, PLEN, PBUF);                         02594000
  3069. %                    return;                                            02595000
  3070. %               END;                                                    02596000
  3071. %                                                                       02597000
  3072. %               FREAD(KT_NUM, PBUF_W, -80); % Hopefully skip over junk  02598000
  3073. %               FREAD(KT_NUM, PBUF_W, -80);                             02599000
  3074. %               FREAD(KT_NUM, PBUF_W, -80);                             02600000
  3075. %               SEARCHED:=TRUE;                                         02601000
  3076. %          END;                                                         02602000
  3077. %                                                                       02603000
  3078. %          MOVE PBUF:=20(" ");                                          02604000
  3079. %          IF FREAD(KT_NUM, PBUF_W, -80) <= 1 OR PBUF(0) = special THEN 02605000
  3080. %          BEGIN                                                        02606000
  3081. %               SEARCHED:=FALSE;                                        02607000
  3082. %               FCLOSE(KT_NUM, 4, 0);  %  Purge                         02608000
  3083. %               KT_NUM:=0;                                              02609000
  3084. %               KILL_KTEMP;                                             02610000
  3085. %               STATE := SBREAK;                                        02611000
  3086. %               return;                                                 02612000
  3087. %          END;                                                         02613000
  3088. %                                                                       02614000
  3089. %          %  If we survived all of that, we will return one file name  02615000
  3090. %          %  which could be denied by the file validator               02616000
  3091. %                                                                       02617000
  3092. %          MOVE L_FNAME:=PBUF(0) WHILE an, 1;                           02618000
  3093. %          CB_CNT:=RP_LEN:=TOS-@L_FNAME;                                02619000
  3094. %          IF SEARCHED.(0:1) THEN                                       02620000
  3095. %          BEGIN                                                        02621000
  3096. %               SEARCHED.(0:1):=FALSE;                                  02622000
  3097. %              RP_LEN:=-RP_LEN;                                         02623000
  3098. %          END;                                                         02624000
  3099. %          DIRSEARCH:=TRUE;                                             02625000
  3100.      END;                                                               02626000
  3101.                                                                         02627000
  3102.                                                                         02628000
  3103.                                                                         02629000
  3104.      %  Set default conditions                                          02630000
  3105.                                                                         02631000
  3106.      MAX_SND_SIZE := 80;                                                02632000
  3107.      MAX_SND_DATA := 77;                                                02633000
  3108.      YOUR_PAD_COUNT := 0;                                               02634000
  3109.      YOUR_PAD := 0;                                                     02635000
  3110.      YOUR_EOL := CR;                                                    02636000
  3111.      YOUR_Q_CTL := 7"#";                                                02637000
  3112.      QUOTE_8 := FALSE;                                                  02638000
  3113.      USE_REPEAT := FALSE;                                               02639000
  3114.                                                                         02640000
  3115.      WHILE NOT (DONE OR BLASTED) DO                                     02641000
  3116.      BEGIN                                                              02642000
  3117.           N := 0;                                                       02643000
  3118.           NUMTRY := 0;                                                  02644000
  3119.           STATE := "S";                                                 02644100
  3120.                                                                         02645000
  3121.           IF RPACK(RP,RP_LEN,RP_NUM,RP_DATA) AND (RP_NUM = 0) THEN      02646000
  3122.           BEGIN                                                         02647000
  3123.                IF RP = "I" THEN                                         02648000
  3124.                BEGIN %  Exchange Parameters                             02649000
  3125.                     R_RPAR(RP_DATA,RP_LEN);                             02650000
  3126.                     R_SPAR(RP_DATA,RP_LEN);                             02651000
  3127.                     SPACK("Y",N,RP_LEN,RP_DATA);                        02652000
  3128.                     OLDTRY := NUMTRY;                                   02653000
  3129.                     NUMTRY := 0;                                        02654000
  3130.                     N := NPNO(RP_NUM);                                  02655000
  3131.                END                                                      02656000
  3132.                     ELSE                                                02657000
  3133.                IF RP = "S" THEN                                         02658000
  3134.                BEGIN %  Other side is sending                           02659000
  3135.                     R_RPAR(RP_DATA,RP_LEN);                             02660000
  3136.                     R_SPAR(RP_DATA,RP_LEN);                             02661000
  3137.                     SPACK("Y",N,RP_LEN,RP_DATA);                        02662000
  3138.                     OLDTRY := NUMTRY;                                   02663000
  3139.                     NUMTRY := 0;                                        02664000
  3140.                     N := NPNO(RP_NUM);                                  02665000
  3141.                     RECSW(TRUE);                                        02666000
  3142.                END                                                      02667000
  3143.                     ELSE                                                02668000
  3144.                IF RP = "R" THEN                                         02669000
  3145.                BEGIN %  Other side wants us to send                     02670000
  3146.                                                                         02671000
  3147.                     CBUFXLT(RP_DATA,RP_LEN,CBUF,CB_CNT,CB_MAX);         02672000
  3148.                     WHILE DIRSEARCH DO                                  02673000
  3149.                     BEGIN                                               02674000
  3150.                     REPLACE L_FNAME[CB_CNT] BY ".";                     02675000
  3151. %                    IF NOT VALID_FILE(L_FNAME, CB_CNT, OUT) THEN       02676000
  3152. %                    BEGIN                                              02677000
  3153. %                         MOVE RP_DATA := ("Kermit file security ",     02678000
  3154. %                                          "error - see your account ", 02679000
  3155. %                                          "manager");                  02680000
  3156. %                         SPACK("E",N,53,RP_DATA);                      02681000
  3157. %                    END                                                02682000
  3158. %                         ELSE                                          02683000
  3159.                     BEGIN                                               02684000
  3160.                          REPLACE TTL BY L_FNAME FOR L_FNAME_LEN         02684800
  3161.                               WITH ASCIITOEBCDIC, 8".";                 02684900
  3162.                          DNUM(KIND = DISK, TITLE = TTL,                 02685000
  3163.                               INTMODE = ASCII, DEPENDENTSPECS = TRUE,   02685100
  3164.                               NEWFILE = FALSE);                         02685200
  3165.                          IF NOT DNUM.OPEN THEN %????????????????????????02686000
  3166.                          BEGIN  %  File open error                      02687000
  3167.                               REPLACE RP_DATA BY "File open error";     02688000
  3168.                               SPACK("E",N,15,RP_DATA);                  02689000
  3169.                          END                                            02690000
  3170.                               ELSE                                      02691000
  3171.                          BEGIN                                          02692000
  3172.                               SENDSW(L_FNAME,RP_LEN);                   02693000
  3173.                          END;                                           02694000
  3174.                     END;                                                02695000
  3175.                     END;                                                02696000
  3176.                END                                                      02697000
  3177.                     ELSE                                                02698000
  3178.                IF RP = "G" THEN                                         02699000
  3179.                BEGIN %  KERMIT Command                                  02700000
  3180.                     IF (RP_DATA = "F") AND (RP_LEN = 1) THEN            02701000
  3181.                     BEGIN                                               02702000
  3182.                          SPACK("Y",N,0,RP_DATA);                        02703000
  3183.                          DONE := TRUE;                                  02704000
  3184.                     END                                                 02705000
  3185.                          ELSE                                           02706000
  3186.                     BEGIN                                               02707000
  3187.                          IF CBUFXLT(RP_DATA,RP_LEN,                     02708000
  3188.                                     CBUF,CB_CNT,CB_MAX) THEN            02709000
  3189.                          BEGIN                                          02710000
  3190.                               KERMIT_COMMAND(CBUF,CB_CNT);              02711000
  3191.                          END                                            02712000
  3192.                               ELSE                                      02713000
  3193.                          BEGIN                                          02714000
  3194.                               REPLACE CBUF BY "Command too big";        02715000
  3195.                               SPACK("E",N,15,CBUF);                     02717000
  3196.                          END;                                           02718000
  3197.                     END;                                                02719000
  3198.                END                                                      02720000
  3199.                     ELSE                                                02721000
  3200.                BEGIN                                                    02722000
  3201.                     SPACK("N",N,0,RP_DATA);                             02723000
  3202.                END;                                                     02724000
  3203.           END                                                           02725000
  3204.                ELSE                                                     02726000
  3205.           BEGIN                                                         02727000
  3206.                SPACK("N",N,0,RP_DATA);                                  02728000
  3207.           END;                                                          02729000
  3208.      END;                                                               02730000
  3209. END;                                                                    02731000
  3210.                                                                         02732000
  3211.  $ PAGE                                                                 02733000
  3212. PROCEDURE VERIFY;                                                       02735000
  3213. BEGIN                                                                   02736000
  3214.      POINTER   P;                                                       02737000
  3215.                                                                         02737100
  3216.      REAL      HEX_N;   %  Temp for SAYNUM                              02737200
  3217.                                                                         02737300
  3218.      INTEGER   I;                                                       02737400
  3219.                                                                         02737500
  3220.      DEFINE    SAY       = BEGIN                                        02738000
  3221.                                 REPLACE P:P BY#,  %  Better than M_ST   02739000
  3222.                ENDSAY    =      ;                 %  Better than M_EN   02740000
  3223.                            END#,                                        02742000
  3224.                SPIT      = BEGIN                                        02745000
  3225.                                 PLEN:=OFFSET(P);                        02746000
  3226.                                 WRITE(CONUM, PLEN, PBUF);               02747000
  3227.                                 REPLACE P:=PBUF BY " " FOR 80;          02749000
  3228.                            END#,                                        02750000
  3229.                MIDLINE   = P:=PBUF[30]#;                                02751000
  3230. %------------------------------------------------------------------     02751100
  3231.      PROCEDURE SAYBOOL(TRUTH);                                          02752000
  3232.      VALUE              TRUTH;                                          02753000
  3233.      BOOLEAN            TRUTH;                                          02754000
  3234.      BEGIN                                                              02755000
  3235.           CASE REAL(TRUTH.[0:1]) OF  % Who says we must use IF statement02756000
  3236.           BEGIN                                                         02757000
  3237.                SAY "FALSE" ENDSAY;                                      02758000
  3238.                SAY "TRUE" ENDSAY;                                       02759000
  3239.           END;                                                          02760000
  3240.      END;                                                               02761000
  3241. %------------------------------------------------------------------     02761010
  3242.      PROCEDURE SAYNUM(N);  %  REPLACE FOR n DIGITS gives EBCDIC         02761100
  3243.      VALUE            N ;  %  output which doesn't do this ASCII        02761200
  3244.      INTEGER          N ;  %  program any good at all                   02761300
  3245.      BEGIN                                                              02761400
  3246.           HEX_N := SCALERIGHTF(N, 12);  %  12 digits of hex             02761500
  3247.           REPLACE P BY 7"0";            %  Need this for N=0            02761600
  3248.           FOR I:=((FIRSTONE(HEX_N)+3) DIV 4)*4 -1  % Readability ...    02761700
  3249.                  STEP -4                                                02761710
  3250.                  UNTIL 3                                                02761720
  3251.                DO REPLACE P:P BY (HEX_N.[I:4]+7"0").LOWBYTE FOR 1;      02761800
  3252.      END;                                                               02761900
  3253. %------------------------------------------------------------------     02761910
  3254.                                                                         02762000
  3255.      P:=PBUF;                                                           02763000
  3256.      SAY " " FOR 80 ENDSAY;                                             02764000
  3257.      SPIT;                                                              02765000
  3258.      SAY "RECEIVE parameters" ENDSAY;                                   02766000
  3259.      MIDLINE;                                                           02767000
  3260.      SAY "Other parameters"   ENDSAY;                                   02768000
  3261.      SPIT;                                                              02769000
  3262.                                                                         02770000
  3263.      SAY "   BINARY:       " ENDSAY;                                    02771000
  3264.      SAYBOOL(RCV_BINARY);                                               02772000
  3265.      MIDLINE;                                                           02773000
  3266.      SAY "   SEND BINARY:  " ENDSAY;                                    02774000
  3267.      CASE SND_BINARY OF                                                 02775000
  3268.      BEGIN                                                              02776000
  3269.           SAY "Auto"   ENDSAY;                                          02777000
  3270.           SAY "Binary" ENDSAY;                                          02778000
  3271.           SAY "ASCII"  ENDSAY;                                          02779000
  3272.      END;                                                               02780000
  3273.      SPIT;                                                              02781000
  3274.                                                                         02782000
  3275.      SAY "   FIXREC:       " ENDSAY;                                    02783000
  3276.      SAYBOOL(RCV_FIXREC);                                               02784000
  3277.      MIDLINE;                                                           02785000
  3278.      SAY "   SEND PAUSE:   " ENDSAY;                                    02786000
  3279.      SAYNUM(PAUSE_CNT);                                                 02787000
  3280.      SPIT;                                                              02788000
  3281.                                                                         02789000
  3282.      SAY "   SAVESP:       " ENDSAY;                                    02790000
  3283.      SAYBOOL(RCV_SAVESP);                                               02791000
  3284.      MIDLINE;                                                           02792000
  3285.      SAY "   DELAY:        " ENDSAY;                                    02793000
  3286.      SAYNUM(I_DELAY);                                                   02794000
  3287.      SPIT;                                                              02795000
  3288.                                                                         02796000
  3289.      SAY "   FCODE:        " ENDSAY;                                    02797000
  3290.      SAY "DATA"              ENDSAY;                                    02798000
  3291. %    MIDLINE;                                                           02799000
  3292. %    SAY "   HANDSHAKE:    " ENDSAY;                                    02800000
  3293. %    CASE HNDSHK OF                                                     02801000
  3294. %    BEGIN                                                              02802000
  3295. %         SAY "None" ENDSAY;                                            02803000
  3296. %         SAY "XON"  ENDSAY;                                            02804000
  3297. %         SAY "XON2" ENDSAY;                                            02805000
  3298. %    END;                                                               02806000
  3299.      SPIT;                                                              02807000
  3300.                                                                         02808000
  3301.      SAY "   RECLEN:       " ENDSAY;                                    02809000
  3302.      SAYNUM(RCV_RECLEN);                                                02810000
  3303.      MIDLINE;                                                           02811000
  3304.      SAY "   DEBUG:        " ENDSAY;                                    02812000
  3305.      SAYNUM(DEBUG_MODE);                                                02813000
  3306.      SPIT;                                                              02814000
  3307.                                                                         02815000
  3308.      SAY "   BLOCKF:       " ENDSAY;                                    02816000
  3309.      SAYNUM(RCV_BLOCKF);                                                02817000
  3310.      MIDLINE;                                                           02818000
  3311.      SAY "   LOG:          " ENDSAY;                                    02819000
  3312.      IF LOGNUM_OPEN THEN                                                02820000
  3313.      BEGIN                                                              02821000
  3314.           SAY "TRUE (" ENDSAY;                                          02822000
  3315.           SAY LOGNAME FOR LOGNAME_LEN ENDSAY;                           02823000
  3316.           SAY ")" ENDSAY;                                               02824000
  3317.      END                                                                02825000
  3318.           ELSE                                                          02826000
  3319.           SAY "FALSE" ENDSAY;                                           02827000
  3320.                                                                         02828000
  3321.      SPIT;                                                              02829000
  3322.      SAY "   MAXEXT:       " ENDSAY;                                    02830000
  3323.      SAYNUM(RCV_MAXEXT);                                                02831000
  3324.      %MIDLINE;                                                          02832000
  3325.      %SAY "   LINE LDEV:    " ENDSAY;                                   02833000
  3326.      %SAYNUM(LDEV_LINE);                                                02834000
  3327.      SPIT;                                                              02835000
  3328.                                                                         02836000
  3329.      SAY "   MAXREC:       " ENDSAY;                                    02837000
  3330.      SAYNUM(RCV_MAXREC);                                                02838000
  3331.      %MIDLINE;                                                          02839000
  3332.      %SAY "   LINE SPEED:   " ENDSAY;                                   02840000
  3333.      %SAYNUM(TSPEED);                                                   02841000
  3334.      SPIT;                                                              02842000
  3335.                                                                         02843000
  3336.      SAY "   DEVICE:       " ENDSAY;                                    02844000
  3337.      SAY "DISK             " ENDSAY;                                    02845000
  3338.      MIDLINE;                                                           02846000
  3339.      SAY "   SOH:          " ENDSAY;                                    02847000
  3340.      SAYNUM(SOH);                                                       02848000
  3341.      SPIT;                                                              02849000
  3342.                                                                         02850000
  3343.      SAY "   EXPTAB:       " ENDSAY;                                    02851000
  3344.      SAYBOOL(EXP_TABS);                                                 02852000
  3345.      SPIT;                                                              02853000
  3346.                                                                         02854000
  3347. END;                                                                    02855000
  3348.                                                                         02856000
  3349.                                                                         02857000
  3350.  $ PAGE                                                                 02858000
  3351. BOOLEAN PROCEDURE KINIT;                                                02860000
  3352. BEGIN                                                                   02861000
  3353.                                                                         02862000
  3354.      BOOLEAN        R_ERROR;                                            02863000
  3355.                                                                         02864000
  3356.      INTEGER        J_MODE,                                             02865000
  3357.                     J_LDEV,                                             02866000
  3358.                     DUM,                                                02867000
  3359.                     F_LDEV;                                             02868000
  3360.                                                                         02869000
  3361.      POINTER        PTEMP;                                              02869100
  3362.                                                                         02869200
  3363.      REAL           DATE;                                               02869300
  3364.                                                                         02869400
  3365.      DEFINE         NUMCONV(N) = ((N).[3:4] + 47"30").LOWBYTE FOR 1#;   02869500
  3366.                                                                         02869600
  3367.      % ------------------------------------------------------------     02870000
  3368.                                                                         02872000
  3369.      CINUM(KIND=REMOTE, MYUSE=IN, FILETYPE=3,                           02872800
  3370.           MAXRECSIZE=LBUF_BYTESIZE, UNITS=CHARACTERS);                  02872900
  3371.      CINUM.OPEN:=TRUE;                                                  02873000
  3372.      CONUM(KIND=REMOTE, MYUSE=OUT,                                      02873800
  3373.           MAXRECSIZE=LBUF_BYTESIZE, UNITS=CHARACTERS);                  02873900
  3374.      CONUM.OPEN:=TRUE;                                                  02874000
  3375.                                                                         02875000
  3376.                                                                         02877000
  3377.      IF (CINUM.OPEN) AND (CONUM.OPEN) THEN                              02878000
  3378.      BEGIN                                                              02879000
  3379.           M_ST    VERS    M_EN;   %  Output current version #           02880000
  3380.           DATE := COMPILETIME(15);  %  Unfortunately, its EBCDIC        02881100
  3381.           M_ST 7" " FOR 16, 7"(Compiled ",                              02881200
  3382.                NUMCONV(DATE.[47:8]), NUMCONV(DATE.[39:8]), 7"/",        02881300
  3383.                NUMCONV(DATE.[31:8]), NUMCONV(DATE.[23:8]), 7"/",        02881400
  3384.                NUMCONV(DATE.[15:8]), NUMCONV(DATE.[7:8]),  7")", 4"00"  02881500
  3385.           M_EN;                                                         02881600
  3386.           M_ST "Works best with PC Kermit 2.31 or newer." M_EN;         02881610
  3387.           M_ST 47"0D0A""Type  ?HI  to abort a command" M_EN;            02881700
  3388.           M_ST   "    "   M_EN;                                         02881900
  3389.                                                                         02882000
  3390.           ATTACH BLAST TO MYSELF.EXCEPTIONEVENT;                        02883000
  3391.           ENABLE BLAST;                                                 02883100
  3392.                                                                         02884000
  3393. %          REPLACE PTEMP:KT_NAME BY KTEMP_NAME;                         02885000
  3394. %          KTN_LEN:=OFFSET(PTEMP);                                      02886000
  3395. %          REPLACE KT_NAME[KTN_LEN] BY ".";                             02887000
  3396. %                                                                       02888000
  3397. %          LDEV_CI := 0;                                                02889000
  3398. %          LDEV_LINE := 0;                                              02890000
  3399. %                                                                       02891000
  3400. %          WHO(J_MODE,,,MYSELF,,,,J_LDEV);                              02892000
  3401. %          IF J_MODE.(12:2) = 1 THEN                                    02893000
  3402. %          BEGIN %  Session                                             02894000
  3403. %               LDEV_LINE := J_LDEV; %  Default COM to session dev      02895000
  3404. %               FGETINFO(CINUM,,,,,,F_LDEV); %  Get CI ldev             02896000
  3405. %               IF F_LDEV = J_LDEV THEN                                 02897000
  3406. %               BEGIN  %  Command input uses session device             02898000
  3407. %                    LDEV_CI := J_LDEV;                                 02899000
  3408. %               END                                                     02900000
  3409. %                    ELSE                                               02901000
  3410. %               BEGIN                                                   02902000
  3411. %                    FGETINFO(CONUM,,,,,,F_LDEV); %  Get CO ldev        02903000
  3412. %                    IF F_LDEV = J_LDEV THEN                            02904000
  3413. %                         LDEV_CI := J_LDEV; %  CO uses session ldev    02905000
  3414. %               END;                                                    02906000
  3415. %          END;                                                         02907000
  3416.           REPLACE MIN_SIZE BY REAL(NOT FALSE).[38:39]                   02907800
  3417.                           FOR SIZE(MIN_SIZE) WORDS;                     02907900
  3418.           MIN_SIZE[DELETEV]   :=2;  MIN_SIZE[DIRV]       :=2;           02908000
  3419.           MIN_SIZE[EXITV]     :=1;  MIN_SIZE[NULLV]      :=1;           02909000
  3420.           MIN_SIZE[RECEIVEV]  :=1;  MIN_SIZE[SENDV]      :=3;           02910000
  3421.           MIN_SIZE[SERVEV]    :=3;  MIN_SIZE[SETV]       :=3;           02911000
  3422.           MIN_SIZE[SPACEV]    :=2;  MIN_SIZE[STATUSV]    :=2;           02912000
  3423.           MIN_SIZE[TAKEV]     :=2;  MIN_SIZE[TYPEV]      :=2;           02913000
  3424.           MIN_SIZE[VERIFYV]   :=1;                                      02914000
  3425.                                                                         02915000
  3426.           MIN_SIZE[DEBUGV]    :=3;  MIN_SIZE[DELAYV]     :=3;           02916000
  3427.           MIN_SIZE[HANDSHAKEV]:=1;  MIN_SIZE[LINEV]      :=2;           02917000
  3428.           MIN_SIZE[LOGV]      :=2;  MIN_SIZE[SENDV_1]    :=3;           02918000
  3429.           MIN_SIZE[SPEEDV]    :=2;  MIN_SIZE[SOHV]       :=2;           02919000
  3430.           MIN_SIZE[RECEIVEV_1]:=1;                                      02920000
  3431.                                                                         02921000
  3432.           MIN_SIZE[AUTOV]     :=1;  MIN_SIZE[BIN128V]    :=4;           02922000
  3433.           MIN_SIZE[BINARYV]   :=4;  MIN_SIZE[BLOCKFV]    :=2;           02923000
  3434.           MIN_SIZE[DEVICEV]   :=1;  MIN_SIZE[FIXRECV]    :=2;           02924000
  3435.           MIN_SIZE[FCODEV]    :=2;  MIN_SIZE[MAXRECV]    :=4;           02925000
  3436.           MIN_SIZE[MAXEXTV]   :=4;  MIN_SIZE[PAUSEV]     :=2;           02926000
  3437.           MIN_SIZE[PROGV]     :=2;  MIN_SIZE[RECLENV]    :=1;           02927000
  3438.           MIN_SIZE[SAVESPV]   :=1;  MIN_SIZE[TEXTV]      :=2;           02928000
  3439.           MIN_SIZE[TXT80V]    :=2;  MIN_SIZE[EXPTABV]    :=1;           02929000
  3440.                                                                         02930000
  3441.           MIN_SIZE[NONEV]     :=1;  MIN_SIZE[OFFV]       :=2;           02931000
  3442.           MIN_SIZE[ONV]       :=2;  MIN_SIZE[XONV]       :=3;           02932000
  3443.           MIN_SIZE[XON2V]     :=4;  MIN_SIZE[YESV]       :=1;           02933000
  3444.                                                                         02933010
  3445.           YOUR_EOL           :=CR;  MY_EOL              :=CR;           02933020
  3446.           MY_Q_CTL        :=7"#";   YOUR_Q_CTL       :=7"#";            02933030
  3447.           Q_8             :=P_Q_8;  RPT_CHR      :=P_RPT_CHR;           02933040
  3448.           MY_TO              :=10;  YOUR_TO             :=10;           02933050
  3449.           MAXTRY             :=10;  RCV_FIXREC        :=TRUE;           02933060
  3450.           RCV_SAVESP       :=TRUE;  RCV_FCODE          :=192;           02933070
  3451.           RCV_RECLEN         :=80;  RCV_BLOCKF          :=18;           02933080
  3452.           RCV_MAXEXT         :=15;  RCV_MAXREC        :=5400;           02933090
  3453.           SOH                 :=2;  %HNDSHK              :=1;           02933100
  3454.           I_DELAY            :=10;  USE_DC1           :=TRUE;           02933110
  3455.           SND_BINARY          :=2;                                      02933112
  3456.           MY_BLK_CK         :="3";  YOUR_BLK_CK        :="1";           02933114
  3457.           MAX_SND_SIZE       :=MAX_RCV_SIZE;                            02933120
  3458.           MAX_SND_DATA       :=MAX_RCV_SIZE;                            02933130
  3459.                                                                         02933140
  3460.         MY_CAPS    := 0 &                                               02933200
  3461.                       1 [LONGP_F] &                                     02933300
  3462.                       0 [WINDOWS_F] &                                   02933400
  3463.                       0 [ATTRS_F];                                      02933500
  3464.                                                                         02934000
  3465.      END                                                                02935000
  3466.           ELSE                                                          02936000
  3467.      BEGIN                                                              02937000
  3468.           R_ERROR := TRUE;                                              02938000
  3469.      END;                                                               02939000
  3470.                                                                         02940000
  3471.      IF MYSELF.TASKVALUE > 0 THEN                                       02941000
  3472.      BEGIN                                                              02942000
  3473.           REPLACE PBUF BY 8"F599KM",                                    02943000
  3474.                           MYSELF.TASKVALUE FOR 2 DIGITS,                02944000
  3475.                           8".";                                         02945000
  3476.           TAKENUM(KIND=DISK, TITLE=PBUF,                                02946000
  3477.                   INTMODE=ASCII, DEPENDENTSPECS=TRUE);                  02946100
  3478.           IF NOT TAKENUM.PRESENT THEN                                   02947000
  3479.           BEGIN                                                         02948000
  3480.                REPLACE PTEMP:PBUF[PLEN] BY "take file open error", 2;   02949000
  3481.                PLEN:=OFFSET(PTEMP);                                     02950000
  3482.                WRITE(CONUM, PLEN, PBUF);                                02951000
  3483.           END                                                           02952000
  3484.           ELSE                                                          02952100
  3485.                TAKENUM_OPEN:=TRUE;                                      02952200
  3486.      END;                                                               02953000
  3487.                                                                         02953100
  3488.                                                                         02954000
  3489.      KINIT := NOT R_ERROR;                                              02955000
  3490.                                                                         02956000
  3491. END;                                                                    02957000
  3492.  $ PAGE                                                                 02958000
  3493. PROCEDURE HELP(ITEM, LEVEL, RCVCASE);                                   02960000
  3494. VALUE          ITEM, LEVEL, RCVCASE;                                    02961000
  3495. INTEGER        ITEM, LEVEL, RCVCASE;                                    02964000
  3496.                                                                         02967000
  3497. BEGIN                                                                   02969000
  3498.      DEFINE SEGMENTATION = NUTTIN#;                                     02970000
  3499.                                                                         02971000
  3500.      % -----------------------------------------------------------      02972000
  3501.                                                                         02973000
  3502.      M_ST " " M_EN;                                                     02974000
  3503.      CASE ITEM OF                                                       02975000
  3504.      BEGIN                                                              02976000
  3505.                                                                         02977000
  3506.           0:  %  COMMANDS IN GENERAL                                    02978000
  3507.           BEGIN                                                         02979000
  3508.                                                                         02980000
  3509.                M_ST "Commands:" M_EN;                                   02981000
  3510.                M_ST " " M_EN;                                           02982000
  3511.                M_ST "     TAKE"      M_EN;                              02983000
  3512.                M_ST "     SERVE"     M_EN;                              02984000
  3513.                M_ST "     SEND"      M_EN;                              02985000
  3514.                M_ST "     RECEIVE"   M_EN;                              02986000
  3515.                M_ST "     SET"       M_EN;                              02987000
  3516.                M_ST "     STATUS"    M_EN;                              02988000
  3517.                M_ST "     DIR"       M_EN;                              02989000
  3518.                M_ST "     SPACE"     M_EN;                              02990000
  3519.                M_ST "     DELETE"    M_EN;                              02991000
  3520.                M_ST "     TYPE"      M_EN;                              02992000
  3521.                M_ST "     EXIT"      M_EN;                              02993000
  3522.           END;                                                          02994000
  3523.                                                                         02995000
  3524.           (TAKEV):                                                      02996000
  3525.                                                                         02997000
  3526.           BEGIN                                                         02998000
  3527.             M_ST "Syntax:  TAKE filespec" M_EN;                         02999000
  3528.             M_ST " " M_EN;                                              03000000
  3529.             M_ST                                                        03001000
  3530.               "The TAKE command causes subsequent commands to be"       03002000
  3531.             M_EN;                                                       03003000
  3532.              M_ST                                                       03004000
  3533.                "taken from the specified file until EOF is reached."    03005000
  3534.              M_EN;                                                      03006000
  3535.              M_ST                                                       03007000
  3536.                "If a subsequent TAKE is encountered within the original"03008000
  3537.              M_EN;                                                      03009000
  3538.              M_ST                                                       03010000
  3539.                "TAKE file, the first file is closed and execution"      03011000
  3540.              M_EN;                                                      03012000
  3541.              M_ST                                                       03013000
  3542.                "continues with the second.  This means that if a"       03014000
  3543.               M_EN;                                                     03015000
  3544.              M_ST                                                       03016000
  3545.                "TAKE appears within a TAKE file, commands that follow"  03017000
  3546.              M_EN;                                                      03018000
  3547.              M_ST                                                       03019000
  3548.                "it (in the original TAKE file) will be ignored."        03020000
  3549.              M_EN;                                                      03021000
  3550.           END;                                                          03022000
  3551.                                                                         03023000
  3552.           (SENDV):                                                      03024000
  3553.                                                                         03025000
  3554.           BEGIN                                                         03026000
  3555.              M_ST  "Syntax:  SEND filespec1 [filespec2]" M_EN;          03027000
  3556.              M_ST " " M_EN;                                             03028000
  3557.              M_ST                                                       03029000
  3558.                "This command causes a file (indicated by filespec1) "   03030000
  3559.              M_EN;                                                      03031000
  3560.              M_ST                                                       03032000
  3561.                "to be sent from the Burroughs to the local KERMIT.  "   03033000
  3562.              M_EN;                                                      03034000
  3563.              M_ST                                                       03035000
  3564.                "Wildcard characters are not permitted.  If filespec2 "  03036000
  3565.              M_EN;                                                      03037000
  3566.              M_ST                                                       03038000
  3567.                "is specified, the file will be sent with that name."    03039000
  3568.              M_EN;                                                      03040000
  3569.           END;                                                          03041000
  3570.                                                                         03042000
  3571.           (RECEIVEV):                                                   03043000
  3572.                                                                         03044000
  3573.           BEGIN                                                         03045000
  3574.              M_ST "Syntax: RECEIVE filespec" M_EN;                      03046000
  3575.              M_ST " " M_EN;                                             03047000
  3576.              M_ST                                                       03048000
  3577.                "The RECEIVE command causes Burroughs KERMIT to enter "  03049000
  3578.              M_EN;                                                      03050000
  3579.              M_ST                                                       03051000
  3580.                "receive mode and wait for the local kermit to start "   03052000
  3581.              M_EN;                                                      03053000
  3582.              M_ST                                                       03054000
  3583.               "sending a file.  If filespec is not specified, a file "  03055000
  3584.              M_EN;                                                      03056000
  3585.              M_ST                                                       03057000
  3586.               "title will be requested."                                03058000
  3587.              M_EN;                                                      03059000
  3588.           END;                                                          03060000
  3589.                                                                         03061000
  3590.           (SERVEV):                                                     03062000
  3591.                                                                         03063000
  3592.           BEGIN                                                         03064000
  3593.              M_ST "Syntax:  SERVE" M_EN;                                03065000
  3594.              M_ST " " M_EN;                                             03066000
  3595.              M_ST                                                       03067000
  3596.              "The SERVE command causes HP 3000 KERMIT to go into"       03068000
  3597.              M_EN;                                                      03069000
  3598.              M_ST                                                       03070000
  3599.                "server mode.  Once in server mode, the only way back"   03071000
  3600.              M_EN;                                                      03072000
  3601.              M_ST                                                       03073000
  3602.                "to command mode is the Control-Y trap."                 03074000
  3603.              M_EN;                                                      03075000
  3604.              M_ST " " M_EN;                                             03076000
  3605.              M_ST                                                       03077000
  3606.                "In addition to the standard KERMIT transactions for"    03078000
  3607.              M_EN;                                                      03079000
  3608.              M_ST                                                       03080000
  3609.                "file transfer, the following server functions are"      03081000
  3610.              M_EN;                                                      03082000
  3611.              M_ST                                                       03083000
  3612.                "supported:"                                             03084000
  3613.              M_EN;                                                      03085000
  3614.              M_ST " " M_EN;                                             03086000
  3615.              M_ST                                                       03087000
  3616.                "FUNCTION             PROBABLE SYNTAX"                   03088000
  3617.              M_EN;                                                      03089000
  3618.              M_ST                                                       03090000
  3619.                "                     (If available on local KERMIT)"    03091000
  3620.              M_EN;                                                      03092000
  3621.              M_ST                                                       03093000
  3622.                "-------------------  -------------------------------"   03094000
  3623.              M_EN;                                                      03095000
  3624.              M_ST " " M_EN;                                             03096000
  3625.              M_ST                                                       03097000
  3626.                "Finish Processing    FINISH"                            03098000
  3627.              M_EN;                                                      03099000
  3628.              M_ST                                                       03100000
  3629.                "Type a file          REMOTE TYPE filespec"              03101000
  3630.              M_EN;                                                      03102000
  3631.              M_ST                                                       03103000
  3632.                "Directory Listing    REMOTE DIRECTORY [filespec]"       03104000
  3633.              M_EN;                                                      03105000
  3634.              M_ST                                                       03106000
  3635.                "File Space Listing   REMOTE SPACE [filespec]"           03107000
  3636.              M_EN;                                                      03108000
  3637.              M_ST                                                       03109000
  3638.                "Delete a file        REMOTE DELETE filespec"            03110000
  3639.              M_EN;                                                      03111000
  3640.              M_ST " " M_EN;                                             03112000
  3641.              M_ST                                                       03113000
  3642.                "Wildcard file specification may be used only for the"   03114000
  3643.              M_EN;                                                      03115000
  3644.              M_ST                                                       03116000
  3645.                "DIRECTORY and SPACE transactions.  Wildcard specifi-"   03117000
  3646.              M_EN;                                                      03118000
  3647.              M_ST                                                       03119000
  3648.                "cations are in the native HP 3000 format.  To produce"  03120000
  3649.              M_EN;                                                      03121000
  3650.              M_ST                                                       03122000
  3651.                "a DIRECTORY listing of all files starting with FOO use:"03123000
  3652.              M_EN;                                                      03124000
  3653.              M_ST  " " M_EN;                                            03125000
  3654.              M_ST                                                       03126000
  3655.                "             REMOTE DIRECTORY FOO@"                     03127000
  3656.              M_EN;                                                      03128000
  3657.           END;                                                          03129000
  3658.                                                                         03130000
  3659.           SETV:                                                         03131000
  3660.                                                                         03132000
  3661.           BEGIN                                                         03133000
  3662.                CASE LEVEL OF                                            03134000
  3663.                BEGIN                                                    03135000
  3664.                                                                         03136000
  3665.                   0:    %  SET COMMANDS IN GENERAL                      03137000
  3666.                                                                         03138000
  3667.                   BEGIN                                                 03139000
  3668.                      M_ST "SET items:" M_EN;                            03140000
  3669.                      M_ST " " M_EN;                                     03141000
  3670.                      M_ST "  SET DEBUG"  M_EN;                          03142000
  3671.                      M_ST "  SET DELAY"  M_EN;                          03143000
  3672.                      M_ST "  SET LINE"   M_EN;                          03144000
  3673.                      M_ST "  SET SEND"   M_EN;                          03145000
  3674.                      M_ST "  SET SPEED"  M_EN;                          03146000
  3675.                      M_ST "  SET HANDSHAKE"  M_EN;                      03147000
  3676.                      M_ST "  SET RECEIVE"    M_EN;                      03148000
  3677.                      M_ST "  SET LOG"    M_EN;                          03149000
  3678.                      M_ST "  SET SOH"    M_EN;                          03150000
  3679.                      M_ST " "        M_EN;                              03151000
  3680.                      M_ST "type 'SET item ?'for explanation" M_EN;      03152000
  3681.                 END;                                                    03153000
  3682.                                                                         03154000
  3683.                DEBUGV:  %  SET DEBUG                                    03155000
  3684.                                                                         03156000
  3685.                BEGIN                                                    03157000
  3686.                     M_ST                                                03158000
  3687.                      "Syntax:  SET DEBUG number"                        03159000
  3688.                     M_EN;                                               03160000
  3689.                     M_ST " " M_EN;                                      03161000
  3690.                     M_ST                                                03162000
  3691.                      "This sets the debug level to the indicated"       03163000
  3692.                     M_EN;                                               03164000
  3693.                     M_ST                                                03165000
  3694.                      "number.  Currently, only one level exists."       03166000
  3695.                     M_EN;                                               03167000
  3696.                     M_ST                                                03168000
  3697.                      "This level is enabled by setting the number to"   03169000
  3698.                     M_EN;                                               03170000
  3699.                     M_ST                                                03171000
  3700.                      "any non-negative, non-zero number.  If DEBUG is"  03172000
  3701.                     M_EN;                                               03173000
  3702.                     M_ST                                                03174000
  3703.                      "enabled, packets sent and received are written"   03175000
  3704.                     M_EN;                                               03176000
  3705.                     M_ST                                                03177000
  3706.                      "to the LOG file.  The LOG file defaults to the"   03178000
  3707.                     M_EN;                                               03179000
  3708.                     M_ST                                                03180000
  3709.                      "job/session output file.  LOG output to the "     03181000
  3710.                     M_EN;                                               03182000
  3711.                     M_ST                                                03183000
  3712.                      "job/session output file is disabled when commu-"  03184000
  3713.                     M_EN;                                               03185000
  3714.                     M_ST                                                03186000
  3715.                      "nications are taking place unless the communica-" 03187000
  3716.                     M_EN;                                               03188000
  3717.                     M_ST                                                03189000
  3718.                      "tions line has been re-designated via the SET"    03190000
  3719.                     M_EN;                                               03191000
  3720.                     M_ST                                                03192000
  3721.                      "LINE command."                                    03193000
  3722.                     M_EN;                                               03194000
  3723.                END;                                                     03195000
  3724.                                                                         03196000
  3725.                DELAYV:  %  SET DELAY                                    03197000
  3726.                                                                         03198000
  3727.                BEGIN                                                    03199000
  3728.                     M_ST "Syntax:  SET DELAY number" M_EN;              03200000
  3729.                     M_ST " " M_EN;                                      03201000
  3730.                     M_ST                                                03202000
  3731.                      "Causes a pause for the indicated number of"       03203000
  3732.                     M_EN;                                               03204000
  3733.                     M_ST                                                03205000
  3734.                      "seconds prior to starting a SEND command.  This"  03206000
  3735.                     M_EN;                                               03207000
  3736.                     M_ST                                                03208000
  3737.                      "is to allow the user to escape back to the local" 03209000
  3738.                     M_EN;                                               03210000
  3739.                     M_ST                                                03211000
  3740.                      "KERMIT and enter a RECEIVE command."              03212000
  3741.                     M_EN;                                               03213000
  3742.                END;                                                     03214000
  3743.                                                                         03215000
  3744.                LINEV:  %  SET LINE                                      03216000
  3745.                                                                         03217000
  3746.                BEGIN                                                    03218000
  3747.                     M_ST "Syntax:  SET LINE ldev" M_EN;                 03219000
  3748.                     M_ST " " M_EN;                                      03220000
  3749.                     M_ST                                                03221000
  3750.                      "This causes the indicated ldev (logical device"   03222000
  3751.                     M_EN;                                               03223000
  3752.                     M_ST                                                03224000
  3753.                      "number) to be used for communications purposes."  03225000
  3754.                     M_EN;                                               03226000
  3755.                END;                                                     03227000
  3756.                                                                         03228000
  3757.                SENDV_1:  %  SET SEND                                    03229000
  3758.                                                                         03230000
  3759.                BEGIN                                                    03231000
  3760.                     M_ST "                 { PAUSE number   }" M_EN;    03232000
  3761.                     M_ST "                 {                }" M_EN;    03233000
  3762.                     M_ST "Syntax: SET SEND {       { ON   } }" M_EN;    03234000
  3763.                     M_ST "                 { BINARY{ OFF  } }" M_EN;    03235000
  3764.                     M_ST "                 {       { AUTO } }" M_EN;    03236000
  3765.                     M_ST " " M_EN;                                      03237000
  3766.                     M_ST                                                03238000
  3767.                      "This parameter is used to alter the default"      03239000
  3768.                     M_EN;                                               03240000
  3769.                     M_ST                                                03241000
  3770.                      "conditions relating to how files are sent."       03242000
  3771.                     M_EN;                                               03243000
  3772.                END;                                                     03244000
  3773.                                                                         03245000
  3774.                SPEEDV:  %  SET SPEED                                    03246000
  3775.                                                                         03247000
  3776.                BEGIN                                                    03248000
  3777.                     M_ST "Syntax:  SET SPEED speed" M_EN;               03249000
  3778.                     M_ST " " M_EN;                                      03250000
  3779.                     M_ST                                                03251000
  3780.                      "Sets the communications speed to the indicated"   03252000
  3781.                     M_EN;                                               03253000
  3782.                     M_ST                                                03254000
  3783.                      "number of characters per second.  Supported"      03255000
  3784.                     M_EN;                                               03256000
  3785.                     M_ST                                                03257000
  3786.                      "speeds are: 30, 60, 120, 480, 960."               03258000
  3787.                     M_EN;                                               03259000
  3788.                END;                                                     03260000
  3789.                                                                         03261000
  3790.                HANDSHAKEV:  %  SET HANDSHAKE                            03262000
  3791.                                                                         03263000
  3792.                BEGIN                                                    03264000
  3793.                     M_ST "Syntax:  SET HANDSHAKE option" M_EN;          03265000
  3794.                     M_ST " " M_EN;                                      03266000
  3795.                     M_ST                                                03267000
  3796.                      "This specifies any handshaking that is to be"     03268000
  3797.                     M_EN;                                               03269000
  3798.                     M_ST                                                03270000
  3799.                      "done on the communications line.  Options are:"   03271000
  3800.                     M_EN;                                               03272000
  3801.                     M_ST " " M_EN;                                      03273000
  3802.                     M_ST                                                03274000
  3803.                      "XON  Generate an XON character prior to each"     03275000
  3804.                     M_EN;                                               03276000
  3805.                     M_ST                                                03277000
  3806.                      "read.  This is the default mode and is needed"    03278000
  3807.                     M_EN;                                               03279000
  3808.                     M_ST                                                03280000
  3809.                      "in most cases since the HP will lose any"         03281000
  3810.                     M_EN;                                               03282000
  3811.                     M_ST                                                03283000
  3812.                      "characters that are transmitted when no read is"  03284000
  3813.                     M_EN;                                               03285000
  3814.                     M_ST                                                03286000
  3815.                      "active.  The local KERMIT must be capable of"     03287000
  3816.                     M_EN;                                               03288000
  3817.                     M_ST                                                03289000
  3818.                      "waiting for an XON character before issuing a"    03290000
  3819.                     M_EN;                                               03291000
  3820.                     M_ST                                                03292000
  3821.                      "a write to the communications line."              03293000
  3822.                     M_EN;                                               03294000
  3823.                     M_ST " " M_EN;                                      03295000
  3824.                     M_ST                                                03296000
  3825.                      "NONE  Generate no special characters prior to a"  03297000
  3826.                     M_EN;                                               03298000
  3827.                     M_ST                                                03299000
  3828.                      "read."                                            03300000
  3829.                     M_EN;                                               03301000
  3830.                     M_ST " " M_EN;                                      03302000
  3831.                     M_ST                                                03303000
  3832.                      "XON2 Same as XON except in both directions."      03304000
  3833.                     M_EN;                                               03305000
  3834.                     M_ST                                                03306000
  3835.                      "This sets the read termination character to XON"  03307000
  3836.                     M_EN;                                               03308000
  3837.                     M_ST                                                03309000
  3838.                      "in an attempt to synchronize with another KERMIT" 03310000
  3839.                     M_EN;                                               03311000
  3840.                     M_ST                                                03312000
  3841.                      "having similar limitations."                      03313000
  3842.                     M_EN;                                               03314000
  3843.                END;                                                     03315000
  3844.                                                                         03316000
  3845.                RECEIVEV_1:  %  SET RECEIVE                              03317000
  3846.                                                                         03318000
  3847.                CASE RCVCASE  OF                                         03319000
  3848.                BEGIN                                                    03320000
  3849.                                                                         03321000
  3850.                     0:  %  General stuff                                03322000
  3851.                                                                         03323000
  3852.                     BEGIN                                               03324000
  3853.                     M_ST                                                03325000
  3854.                      "The SET RECEIVE parameter is used to alter the"   03326000
  3855.                     M_EN;                                               03327000
  3856.                     M_ST                                                03328000
  3857.                      "default conditions regarding file reception."     03329000
  3858.                     M_EN;                                               03330000
  3859.                     M_ST                                                03331000
  3860.                      "The various options are:"                         03332000
  3861.                     M_EN;                                               03333000
  3862.                     M_ST " " M_EN;                                      03334000
  3863.                     M_ST "     SET RECEIVE DEVICE" M_EN;                03335000
  3864.                     M_ST "     SET RECEIVE FCODE"  M_EN;                03336000
  3865.                     M_ST "     SET RECEIVE BINARY" M_EN;                03337000
  3866.                     M_ST "     SET RECEIVE RECLEN" M_EN;                03338000
  3867.                     M_ST "     SET RECEIVE FIXREC" M_EN;                03339000
  3868.                     M_ST "     SET RECEIVE BLOCKF" M_EN;                03340000
  3869.                     M_ST "     SET RECEIVE MAXREC" M_EN;                03341000
  3870.                     M_ST "     SET RECEIVE MAXEXT" M_EN;                03342000
  3871.                     M_ST "     SET RECEIVE SAVESP" M_EN;                03343000
  3872.                     M_ST "     SET RECEIVE PROG"   M_EN;                03344000
  3873.                     M_ST "     SET RECEIVE TEXT"   M_EN;                03345000
  3874.                     M_ST "     SET RECEIVE TXT80"  M_EN;                03346000
  3875.                     M_ST "     SET RECEIVE BIN128" M_EN;                03347000
  3876.                     M_ST "     SET RECEIVE EXPTAB" M_EN;                03348000
  3877.                     END;                                                03349000
  3878.                                                                         03350000
  3879.                     BINARYV:  %  SET RECEIVE BINARY                     03351000
  3880.                                                                         03352000
  3881.                     BEGIN                                               03353000
  3882.                     M_ST                                                03354000
  3883.                      "Syntax:  SET RECEIVE BINARY { ON  }"              03355000
  3884.                     M_EN;                                               03356000
  3885.                     M_ST                                                03357000
  3886.                      "                            { OFF }"              03358000
  3887.                     M_EN;                                               03359000
  3888.                     M_ST " " M_EN;                                      03360000
  3889.                     M_ST                                                03361000
  3890.                      "BINARY tells how to store received files on the"  03362000
  3891.                     M_EN;                                               03363000
  3892.                     M_ST                                                03364000
  3893.                      "Burroughs."                                       03365000
  3894.                     M_EN;                                               03366000
  3895.                     M_ST "       ON  Store files as binary." M_EN;      03367000
  3896.                     M_ST "       OFF Store files as ASCII." M_EN;       03368000
  3897.                     END;                                                03369000
  3898.                                                                         03370000
  3899.                     DEVICEV:  %  SET RECEIVE DEVICE                     03371000
  3900.                                                                         03372000
  3901.                     BEGIN                                               03373000
  3902.                     M_ST                                                03374000
  3903.                      "Syntax:  SET RECEIVE DEVICE [ dev ] "             03375000
  3904.                     M_EN;                                               03376000
  3905.                     M_ST " " M_EN;                                      03377000
  3906.                     M_ST                                                03378000
  3907.                      "DEVICE specifies the device class for received"   03379000
  3908.                     M_EN;                                               03380000
  3909.                     M_ST                                                03381000
  3910.                      "files.  Default is DISK.  This command can be"    03382000
  3911.                     M_EN;                                               03383000
  3912.                     M_ST                                                03384000
  3913.                      "used to send files directly to the system line"   03385000
  3914.                     M_EN;                                               03386000
  3915.                     M_ST "printer." M_EN;                               03387000
  3916.                     M_ST " " M_EN;                                      03388000
  3917.                     END;                                                03389000
  3918.                                                                         03390000
  3919.                     FCODEV:  %  SET RECEIVE FCODE                       03391000
  3920.                                                                         03392000
  3921.                     BEGIN                                               03393000
  3922.                     M_ST                                                03394000
  3923.                      "Syntax:  SET RECEIVE FCODE n"                     03395000
  3924.                     M_EN;                                               03396000
  3925.                     M_ST " " M_EN;                                      03397000
  3926.                     M_ST                                                03398000
  3927.                      "FCODE specifies the file code for received files."03399000
  3928.                     M_EN;                                               03400000
  3929.                     END;                                                03401000
  3930.                                                                         03402000
  3931.                     RECLENV:  %  SET RECEIVE RECLEN                     03403000
  3932.                                                                         03404000
  3933.                     BEGIN                                               03405000
  3934.                     M_ST                                                03406000
  3935.                      "Syntax:  SET RECEIVE RECLEN n"                    03407000
  3936.                     M_EN;                                               03408000
  3937.                     M_ST " " M_EN;                                      03409000
  3938.                     M_ST                                                03410000
  3939.                      "RECLEN specifies the maximum record length (n)"   03411000
  3940.                     M_EN;                                               03412000
  3941.                     M_ST                                                03413000
  3942.                      "for a received file.  The units of n is "         03414000
  3943.                     M_EN;                                               03415000
  3944.                     M_ST                                                03416000
  3945.                      "characters."                                      03417000
  3946.                     M_EN;                                               03418000
  3947.                     END;                                                03422000
  3948.                                                                         03423000
  3949.                     BLOCKFV:  %  SET RECEIVE BLOCKF                     03424000
  3950.                                                                         03425000
  3951.                     BEGIN                                               03426000
  3952.                     M_ST                                                03427000
  3953.                      "Syntax:  SET RECEIVE BLOCKF n"                    03428000
  3954.                     M_EN;                                               03429000
  3955.                     M_ST " " M_EN;                                      03430000
  3956.                     M_ST                                                03431000
  3957.                      "BLOCKF specifies the blocking factor for received"03432000
  3958.                     M_EN;                                               03433000
  3959.                     M_ST                                                03434000
  3960.                      "files.  If n is 0, the file will be unblocked, "  03435000
  3961.                     M_EN;                                               03436000
  3962.                     M_ST                                                03437000
  3963.                      "possibly causing wasted disk space."              03438000
  3964.                     M_EN;                                               03439000
  3965.                     END;                                                03440000
  3966.                                                                         03441000
  3967.                     FIXRECV:  %  SET RECEIVE FIXREC                     03442000
  3968.                                                                         03443000
  3969.                     BEGIN                                               03444000
  3970.                     M_ST                                                03445000
  3971.                      "Syntax:  SET RECEIVE FIXREC { ON  }"              03446000
  3972.                     M_EN;                                               03447000
  3973.                     M_ST                                                03448000
  3974.                      "                            { OFF }"              03449000
  3975.                     M_EN;                                               03450000
  3976.                     M_ST " " M_EN;                                      03451000
  3977.                     M_ST                                                03452000
  3978.                      "FIXREC is used to identify fixed or variable"     03453000
  3979.                     M_EN;                                               03454000
  3980.                     M_ST                                                03455000
  3981.                      "length records.  Options are:"                    03456000
  3982.                     M_EN;                                               03457000
  3983.                     M_ST "       ON   Use fixed length records." M_EN;  03458000
  3984.                     M_ST "       OFF  Use variable length records."M_EN;03459000
  3985.                     END;                                                03460000
  3986.                                                                         03461000
  3987.                     MAXRECV:  %  SET RECEIVE MAXREC                     03462000
  3988.                                                                         03463000
  3989.                     BEGIN                                               03464000
  3990.                     M_ST                                                03465000
  3991.                      "Syntax:  SET RECEIVE MAXREC n"                    03466000
  3992.                     M_EN;                                               03467000
  3993.                     M_ST " " M_EN;                                      03468000
  3994.                     M_ST                                                03469000
  3995.                      "MAXREC specifies the maximum number of records"   03470000
  3996.                     M_EN;                                               03471000
  3997.                     M_ST                                                03472000
  3998.                      "that can be stored in a received file."           03473000
  3999.                     M_EN;                                               03474000
  4000.                     END;                                                03475000
  4001.                                                                         03476000
  4002.                     MAXEXTV:  %  SET RECEIVE MAXEXT                     03477000
  4003.                                                                         03478000
  4004.                     BEGIN                                               03479000
  4005.                     M_ST                                                03480000
  4006.                      "Syntax:  SET RECEIVE MAXEXT n"                    03481000
  4007.                     M_EN;                                               03482000
  4008.                     M_ST " " M_EN;                                      03483000
  4009.                     M_ST                                                03484000
  4010.                      "MAXEXT specifies the maximum number of extents"   03485000
  4011.                     M_EN;                                               03486000
  4012.                     M_ST                                                03487000
  4013.                      "for a received file.  This number (n) must be in" 03488000
  4014.                     M_EN;                                               03489000
  4015.                     M_ST                                                03490000
  4016.                      "the range 1 ... 32."                              03491000
  4017.                     M_EN;                                               03492000
  4018.                     END;                                                03493000
  4019.                                                                         03494000
  4020.                     SAVESPV:  %  SET RECEIVE SAVESP                     03495000
  4021.                                                                         03496000
  4022.                     BEGIN                                               03497000
  4023.                     M_ST                                                03498000
  4024.                      "Syntax:  SET RECEIVE SAVESP { ON  }"              03499000
  4025.                     M_EN;                                               03500000
  4026.                     M_ST                                                03501000
  4027.                      "                            { OFF }"              03502000
  4028.                     M_EN;                                               03503000
  4029.                     M_ST " " M_EN;                                      03504000
  4030.                     M_ST                                                03505000
  4031.                      "SAVESP specifies if unused file space at the end" 03506000
  4032.                     M_EN;                                               03507000
  4033.                     M_ST                                                03508000
  4034.                      "of the file is to be returned to the operating"   03509000
  4035.                     M_EN;                                               03510000
  4036.                     M_ST                                                03511000
  4037.                      "system.  Options are:"                            03512000
  4038.                     M_EN;                                               03513000
  4039.                     M_ST "       ON   Return unused apace" M_EN;        03514000
  4040.                     M_ST "       OFF  Do not return unused space"M_EN;  03515000
  4041.                     END;                                                03516000
  4042.                                                                         03517000
  4043.                     PROGV:%  SET RECEIVE PROG                           03518000
  4044.                                                                         03519000
  4045.                     BEGIN                                               03520000
  4046.                     M_ST                                                03521000
  4047.                      "Syntax:  SET RECEIVE PROG"                        03522000
  4048.                     M_EN;                                               03523000
  4049.                     M_ST " " M_EN;                                      03524000
  4050.                     M_ST                                                03525000
  4051.                      "PROG will set all of the other parameters needed" 03526000
  4052.                     M_EN;                                               03527000
  4053.                     M_ST                                                03528000
  4054.                      "to receive an HP 3000 program (executable) file." 03529000
  4055.                     M_EN;                                               03530000
  4056.                     M_ST                                                03531000
  4057.                      "It is equivalent to:"                             03532000
  4058.                     M_EN;                                               03533000
  4059.                     M_ST "   SET RECEIVE BINARY ON" M_EN;               03534000
  4060.                     M_ST "   SET RECEIVE FIXREC ON" M_EN;               03535000
  4061.                     M_ST "   SET RECEIVE FCODE 1029" M_EN;              03536000
  4062.                     M_ST "   SET RECEIVE RECLEN 128" M_EN;              03537000
  4063.                     M_ST "   SET RECEIVE BLOCKF 1" M_EN;                03538000
  4064.                     M_ST "   SET RECEIVE MAXEXT 1" M_EN;                03539000
  4065.                     END;                                                03540000
  4066.                                                                         03541000
  4067.                     BIN128V:  %  SET RECEIVE BIN128                     03542000
  4068.                                                                         03543000
  4069.                     BEGIN                                               03544000
  4070.                     M_ST                                                03545000
  4071.                      "Syntax:  SET RECEIVE BIN128"                      03546000
  4072.                     M_EN;                                               03547000
  4073.                     M_ST " " M_EN;                                      03548000
  4074.                     M_ST                                                03549000
  4075.                      "BIN128 sets up the needed parameters for recei-"  03550000
  4076.                     M_EN;                                               03551000
  4077.                     M_ST                                                03552000
  4078.                      "ving a binary file in the normal HP repre-"       03553000
  4079.                     M_EN;                                               03554000
  4080.                     M_ST                                                03555000
  4081.                      "sentation.  It is equivalent to:"                 03556000
  4082.                     M_EN;                                               03557000
  4083.                     M_ST "   SET RECEIVE BINARY ON" M_EN;               03558000
  4084.                     M_ST "   SET RECEIVE FIXREC OFF" M_EN;              03559000
  4085.                     M_ST "   SET RECEIVE FCODE 0" M_EN;                 03560000
  4086.                     M_ST "   SET RECEIVE RECLEN 128" M_EN;              03561000
  4087.                     M_ST "   SET RECEIVE BLOCKF 0" M_EN;                03562000
  4088.                     END;                                                03563000
  4089.                                                                         03564000
  4090.                     TEXTV:  %  SET RECEIVE TEXT                         03565000
  4091.                                                                         03566000
  4092.                     BEGIN                                               03567000
  4093.                     M_ST                                                03568000
  4094.                      "Syntax:  SET RECEIVE TEXT"                        03569000
  4095.                     M_EN;                                               03570000
  4096.                     M_ST " " M_EN;                                      03571000
  4097.                     M_ST                                                03572000
  4098.                      "TEXT sets up the needed parameters for receiving" 03573000
  4099.                     M_EN;                                               03574000
  4100.                     M_ST                                                03575000
  4101.                      "generic text files.  It is equivalent to:"        03576000
  4102.                     M_EN;                                               03577000
  4103.                     M_ST "   SET RECEIVE BINARY OFF" M_EN;              03578000
  4104.                     M_ST "   SET RECEIVE FIXREC OFF" M_EN;              03579000
  4105.                     M_ST "   SET RECEIVE FCODE 0" M_EN;                 03580000
  4106.                     M_ST "   SET RECEIVE RECLEN -254" M_EN;             03581000
  4107.                     M_ST "   SET RECEIVE BLOCKF 0" M_EN;                03582000
  4108.                     END;                                                03583000
  4109.                                                                         03584000
  4110.                     TXT80V:  %  SET RECEIVE TXT80                       03585000
  4111.                                                                         03586000
  4112.                     BEGIN                                               03587000
  4113.                     M_ST                                                03588000
  4114.                      "Syntax:  SET RECEIVE TXT80"                       03589000
  4115.                     M_EN;                                               03590000
  4116.                     M_ST " " M_EN;                                      03591000
  4117.                     M_ST                                                03592000
  4118.                      "TXT80 sets up the needed parameters for recei-"   03593000
  4119.                     M_EN;                                               03594000
  4120.                     M_ST                                                03595000
  4121.                      "ving 80 character text files in the manner that"  03596000
  4122.                     M_EN;                                               03597000
  4123.                     M_ST                                                03598000
  4124.                      "is most convenient for the typical text editor."  03599000
  4125.                     M_EN;                                               03600000
  4126.                     M_ST "   SET RECEIVE BINARY OFF" M_EN;              03604000
  4127.                     M_ST "   SET RECEIVE FIXREC ON" M_EN;               03605000
  4128.                     M_ST "   SET RECEIVE FCODE DATA" M_EN;              03606000
  4129.                     M_ST "   SET RECEIVE RECLEN 80" M_EN;               03607000
  4130.                     M_ST "   SET RECEIVE BLOCKF 18" M_EN;               03608000
  4131.                     END;                                                03609000
  4132.                                                                         03610000
  4133.                     EXPTABV:  %  SET RECEIVE EXPTAB                     03611000
  4134.                                                                         03612000
  4135.                     BEGIN                                               03613000
  4136.                     M_ST                                                03614000
  4137.                      "Syntax:  SET RECEIVE EXPTAB { ON  }"              03615000
  4138.                     M_EN;                                               03616000
  4139.                     M_ST                                                03617000
  4140.                      "                            { OFF }"              03618000
  4141.                     M_EN;                                               03619000
  4142.                     M_ST " " M_EN;                                      03620000
  4143.                     M_ST                                                03621000
  4144.                      "EXPTAB expands horizontal tabs found in the"      03622000
  4145.                     M_EN;                                               03623000
  4146.                     M_ST                                                03624000
  4147.                      "data.  Tab stops are assumed to be at columns"    03625000
  4148.                     M_EN;                                               03626000
  4149.                     M_ST                                                03627000
  4150.                      "1, 9, 17, 25, etc."                               03628000
  4151.                     M_EN;                                               03629000
  4152.                     END;                                                03630000
  4153.                                                                         03631000
  4154.                END;   %  CASE SET RECEIVE                               03632000
  4155.                                                                         03633000
  4156.                LOGV:  %  SET LOG                                        03634000
  4157.                                                                         03635000
  4158.                BEGIN                                                    03636000
  4159.                     M_ST                                                03637000
  4160.                      "Syntax:  SET LOG [ filespec ]"                    03638000
  4161.                     M_EN;                                               03639000
  4162.                     M_ST " " M_EN;                                      03640000
  4163.                     M_ST                                                03641000
  4164.                      "This command sets the LOG file to the indicated"  03642000
  4165.                     M_EN;                                               03643000
  4166.                     M_ST                                                03644000
  4167.                      "filespec.  Error and DEBUG messages (if enabled)" 03645000
  4168.                     M_EN;                                               03646000
  4169.                     M_ST                                                03647000
  4170.                      "are written to the LOG file (see SET DEBUG)."     03648000
  4171.                     M_EN;                                               03649000
  4172.                     M_ST                                                03650000
  4173.                      "If filespec is not specified, the current LOG"    03651000
  4174.                     M_EN;                                               03652000
  4175.                     M_ST                                                03653000
  4176.                      "file, if open, is closed."                        03654000
  4177.                     M_EN;                                               03655000
  4178.                END;                                                     03656000
  4179.                                                                         03657000
  4180.                SOHV:  %  SET SOH                                        03658000
  4181.                                                                         03659000
  4182.                BEGIN                                                    03660000
  4183.                     M_ST "Syntax:  SET SOH [%]n" M_EN;                  03661000
  4184.                     M_ST " " M_EN;                                      03662000
  4185.                     M_ST                                                03663000
  4186.                      "This option sets the VALUE of the start-of-header"03664000
  4187.                     M_EN;                                               03665000
  4188.                     M_ST                                                03666000
  4189.                      "character used to BEGIN each packet.  If the %-"  03667000
  4190.                     M_EN;                                               03668000
  4191.                     M_ST                                                03669000
  4192.                      "sign is used, n is assumed to be octal.  Other-"  03670000
  4193.                     M_EN;                                               03671000
  4194.                     M_ST                                                03672000
  4195.                      "wise n is assumed to be decimal.  Default VALUE"  03673000
  4196.                     M_EN;                                               03674000
  4197.                     M_ST                                                03675000
  4198.                      "for SOH is 2 (STX)."                              03676000
  4199.                     M_EN;                                               03677000
  4200.                END;                                                     03678000
  4201.                END;                                                     03679000
  4202.             END;  %  SET (LEVEL) CASE                                   03680000
  4203.                                                                         03681000
  4204.           EXITV:  %  EXIT                                               03682000
  4205.                                                                         03683000
  4206.           BEGIN                                                         03684000
  4207.                M_ST "Syntax:  {EXIT}" M_EN;                             03685000
  4208.                M_ST "         {QUIT}" M_EN;                             03685100
  4209.                M_ST " " M_EN;                                           03686000
  4210.                M_ST                                                     03687000
  4211.                  "This command causes the KERMIT process to"            03688000
  4212.                M_EN;                                                    03689000
  4213.                M_ST                                                     03690000
  4214.                  "terminate in an orderly manner."                      03691000
  4215.                M_EN;                                                    03692000
  4216.           END;                                                          03693000
  4217.                                                                         03694000
  4218.           DIRV:  %  DIR                                                 03695000
  4219.                                                                         03696000
  4220.           BEGIN                                                         03697000
  4221.                M_ST "Syntax:  DIR [ filespec ]" M_EN;                   03698000
  4222.                M_ST " " M_EN;                                           03699000
  4223.                M_ST                                                     03700000
  4224.                 "This command searches the disc directory for the"      03701000
  4225.                M_EN;                                                    03702000
  4226.                M_ST                                                     03703000
  4227.                 "indicated filespec, if any.  Wildcard characters"      03704000
  4228.                M_EN;                                                    03705000
  4229.                M_ST                                                     03706000
  4230.                 "may be used."                                          03707000
  4231.                M_EN;                                                    03708000
  4232.           END;                                                          03709000
  4233.                                                                         03710000
  4234.           SPACEV:  %  SPACE                                             03711000
  4235.                                                                         03712000
  4236.           BEGIN                                                         03713000
  4237.                M_ST "Syntax:  SPACE [ groupspec ]" M_EN;                03714000
  4238.                M_ST " " M_EN;                                           03715000
  4239.                M_ST                                                     03716000
  4240.                 "This command reports the amount of in-use and"         03717000
  4241.                M_EN;                                                    03718000
  4242.                M_ST                                                     03719000
  4243.                 "available disc for the user's account and group."      03720000
  4244.                M_EN;                                                    03721000
  4245.                M_ST                                                     03722000
  4246.                 "(Groupspec may not be valid if the logon user does"    03723000
  4247.                M_EN;                                                    03724000
  4248.                M_ST                                                     03725000
  4249.                 "not have account manager capability.)"                 03726000
  4250.                M_EN;                                                    03727000
  4251.           END;                                                          03728000
  4252.                                                                         03729000
  4253.           DELETEV:  %  DELETE                                           03730000
  4254.                                                                         03731000
  4255.           BEGIN                                                         03732000
  4256.                M_ST "Syntax:  DELETE filespec" M_EN;                    03733000
  4257.                M_ST " " M_EN;                                           03734000
  4258.                M_ST                                                     03735000
  4259.                 "This command causes the indicated filespec to be"      03736000
  4260.                M_EN;                                                    03737000
  4261.                M_ST                                                     03738000
  4262.                 "removed from disc."                                    03739000
  4263.                M_EN;                                                    03740000
  4264.           END;                                                          03741000
  4265.                                                                         03742000
  4266.           TYPEV:  %  TYPE                                               03743000
  4267.                                                                         03744000
  4268.                                                                         03745000
  4269.           BEGIN                                                         03746000
  4270.                M_ST "Syntax:  TYPE filespec" M_EN;                      03747000
  4271.                M_ST " " M_EN;                                           03748000
  4272.                M_ST "TYPE lists a file on your terminal." M_EN;         03749000
  4273.           END;                                                          03750000
  4274.                                                                         03751000
  4275.           STATUSV:    %  STATUS                                         03752000
  4276.                                                                         03753000
  4277.           BEGIN                                                         03754000
  4278.                M_ST "Syntax:  { STATUS }" M_EN;                         03755000
  4279.                M_ST "         { VERIFY }" M_EN;                         03756000
  4280.                M_ST " " M_EN;                                           03757000
  4281.                M_ST                                                     03758000
  4282.                 "STATUS provides a listing of the current file and"     03759000
  4283.                M_EN;                                                    03760000
  4284.                M_ST                                                     03761000
  4285.                 "transmission attributes."                              03762000
  4286.                M_EN;                                                    03763000
  4287.           END;                                                          03764000
  4288.                                                                         03765000
  4289.      END; %  ITEM CASE                                                  03766000
  4290.      M_ST " " M_EN;                                                     03767000
  4291.      REPLACE IB[ILEN-1] BY " ";  % Hopefully wipe out question mark     03768000
  4292.      WRITE(CONUM[STOP], ILEN, IB);                                      03769000
  4293. END;                                                                    03770000
  4294.  $ PAGE                                                                 03771000
  4295. INTEGER PROCEDURE SEARCH(TARGET, LENGTH, DICT, DEFN, START);            03774000
  4296. VALUE                            LENGTH,             START;             03775000
  4297. INTEGER                          LENGTH,             START;             03776000
  4298. ASCII ARRAY              TARGET[0];                                     03777000
  4299. ARRAY                                    DICT[0];                       03777100
  4300. INTEGER                                        DEFN;                    03778000
  4301. BEGIN                                                                   03779000
  4302.                                                                         03780000
  4303.      INTEGER         I;                                                 03781000
  4304.                                                                         03782000
  4305.      DEFINE    NEXTPLACE = I + (DICT[I]-4) DIV 6 + 4#,                  03783000
  4306.                DEFNPLACE = NEXTPLACE-1#,                                03783100
  4307.                SIZEPLACE = I+1#,                                        03783200
  4308.                DICTPLACE = I+2#;                                        03783300
  4309.                                                                         03783400
  4310.                                                                         03783410
  4311.      LABEL     XIT;                                                     03783420
  4312.                                                                         03783430
  4313.      DEFN:=0;  %  Prepare for the worst                                 03783460
  4314.                                                                         03783470
  4315.      WHILE DICT[DEFNPLACE] < START                                      03783500
  4316.      DO I:=NEXTPLACE;                                                   03783600
  4317.                                                                         03783700
  4318.      WHILE DICT[I] NEQ 0 DO                                             03783800
  4319.      BEGIN                                                              03783900
  4320.           IF LENGTH LEQ DICT[SIZEPLACE] THEN                            03784000
  4321.                IF TARGET = POINTER( DICT[DICTPLACE] ) FOR LENGTH  THEN  03784100
  4322.                     IF LENGTH GEQ MIN_SIZE[DICT[DEFNPLACE]]THEN         03784200
  4323.                     BEGIN                                               03784300
  4324.                          SEARCH:=1;                                     03784400
  4325.                          DEFN := DICT[DEFNPLACE];                       03784500
  4326.                          GO TO XIT;                                     03784600
  4327.                     END;                                                03784700
  4328.           I:=NEXTPLACE                                                  03784800
  4329.      END;                                                               03784900
  4330. XIT:                                                                    03785000
  4331.                                                                         03785300
  4332. END;                                                                    03802000
  4333.                                                                         03803000
  4334. % ----------------------------------------------------------------      03804000
  4335.                                                                         03805000
  4336. PROCEDURE CMDINT;  %  Serious work starts here                          03806000
  4337. BEGIN                                                                   03810000
  4338.                                                                         03811000
  4339.      ASCII ARRAY          CPARM[0:79];   %  Current Parameter           03812000
  4340.                                                                         03813000
  4341.      POINTER             IB_PTR;        %  Moves along input line       03815000
  4342.                                                                         03816000
  4343.      INTEGER             CPLEN,         %  Length of CPARM              03817000
  4344.                          CPVAL,         %  Numeric VALUE found          03818000
  4345.                          ITEM,          %  Index of CPARM  word         03819000
  4346.                          IBX,           %  Index to IB                  03820000
  4347.                          IBYTE,         %  Current Character            03821000
  4348.                          X;             %  Temp Variable                03822000
  4349.                                                                         03823000
  4350.                                                                         03825000
  4351.      BOOLEAN             DONE,          %  Done Flag                    03826000
  4352.                          XFROK;         %  Xfer OK flag                 03827000
  4353.                                                                         03828000
  4354.      REAL                P_INT;         %  PAUSE Interval               03829000
  4355.                                                                         03830000
  4356.      LABEL               TAKE_EXIT,                                     03831000
  4357.                          SEND_EXIT,                                     03832000
  4358.                          RECEIVE_EXIT,                                  03833000
  4359.                          SERVE_EXIT,                                    03834000
  4360.                          SET_EXIT,                                      03835000
  4361.                          EXIT_EXIT,                                     03835100
  4362.                          DIR_EXIT,                                      03835200
  4363.                          SPACE_EXIT,                                    03835300
  4364.                          DELETE_EXIT,                                   03835400
  4365.                          VERIFY_EXIT;                                   03835600
  4366.                                                                         03836000
  4367.      % -----------------------------------------------------------      03837000
  4368.                                                                         03838000
  4369.      PROCEDURE SCANIT(START);                                           03839000
  4370.      VALUE             START;                                           03840000
  4371.      INTEGER           START;                                           03841000
  4372.      BEGIN                                                              03842000
  4373.                                                                         03842100
  4374.      INTEGER   BASE;                                                    03842200
  4375.                                                                         03842300
  4376.                                                                         03842700
  4377.      LABEL     XIT;                                                     03842800
  4378.                                                                         03842900
  4379.           ITEM:=NULLV;  %  Default return                               03843000
  4380.           CPLEN:=0;                                                     03844000
  4381.           SCAN IB_PTR:IB_PTR FOR ILEN:ILEN WHILE = " "; % Skip blanks   03845000
  4382.           IF ILEN = 0 THEN                              % End of input  03846000
  4383.                GO TO XIT;                                               03847000
  4384.                                                                         03851000
  4385.           IF IB_PTR IN LETTERS  THEN                                    03853000
  4386.           BEGIN                                                         03854000
  4387.                DO BEGIN                                                 03855000
  4388.                     REPLACE CPARM[CPLEN] BY IB_PTR:IB_PTR               03856000
  4389.                             FOR X:ILEN UNTIL = " ";                     03857000
  4390.                     CPLEN := CPLEN +(READLOCK(X, ILEN)-X);              03857100
  4391. %                   IF IB_PTR = "/"  THEN                               03858000
  4392. %                   BEGIN                                               03859000
  4393. %                        REPLACE CPARM[CPLEN] BY IB_PTR:IB_PTR FOR 1;   03860000
  4394. %                        CPLEN := CPLEN+1;                              03861000
  4395. %                        ILEN := ILEN-1;                                03862000
  4396. %                   END;                                                03863000
  4397.                END                                                      03866000
  4398.                UNTIL NOT IB_PTR IN ALPHA7  OR  ILEN=0;                  03867000
  4399.                SEARCH(CPARM, CPLEN, RESWDS, ITEM, START);               03868000
  4400.                GO TO XIT;                                               03870000
  4401.           END;                                                          03871000
  4402.                                                                         03872000
  4403.           IF IB_PTR IN NUMBERS OR IB_PTR="%"  THEN                      03873000
  4404.           BEGIN    %  It looks numeric.  Will know for sure later.      03875000
  4405.                IF IB_PTR = "%"  THEN                                    03876000
  4406.                BEGIN                                                    03877000
  4407.                     BASE := 8;                                          03878000
  4408.                     IB_PTR := IB_PTR+1;  %  Pointer skips are expensive 03879000
  4409.                     ILEN := ILEN-1;                                     03880000
  4410.                END                                                      03881000
  4411.                ELSE                                                     03882000
  4412.                     BASE:=10;                                           03883000
  4413.                CPVAL := 0;                                              03884000
  4414.                WHILE IB_PTR IN NUMBERS  AND  ILEN > 0  DO               03885000
  4415.                BEGIN                                                    03886000
  4416.                     CPVAL := BASE*CPVAL + INTEGER(IB_PTR:IB_PTR, 1);    03887000
  4417.                     ILEN := ILEN-1;                                     03888000
  4418.                     CPLEN := CPLEN+1;                                   03888100
  4419.                END;                                                     03889000
  4420.                ITEM := NUMBERV;                                         03890000
  4421.                GO TO XIT;                                               03891000
  4422.           END;                                                          03895000
  4423.                                                                         03896000
  4424.           IF IB_PTR = "?" THEN                                          03897000
  4425.           BEGIN                                                         03898000
  4426.                ITEM:=QMARKV;                                            03899000
  4427.                IB_PTR := IB_PTR+1;  %  Another pointer skip             03900000
  4428.                GO TO XIT;                                               03901000
  4429.           END;                                                          03902000
  4430.                                                                         03903000
  4431.           %  At this point the item found is not alphanumeric,          03904000
  4432.           %  numeric (including optional minus sign), or question       03905000
  4433.           %  mark. Pass it back for the command processor to work       03906000
  4434.           %  with.                                                      03907000
  4435.                                                                         03908000
  4436.           SCAN IB_PTR FOR CPLEN:ILEN WHILE > " ";                       03909000
  4437.           REPLACE CPARM BY IB_PTR:IB_PTR FOR ILEN-CPLEN;                03910000
  4438.           CPLEN := READLOCK(CPLEN, ILEN) - CPLEN;                       03911000
  4439. XIT:                                                                    03916000
  4440.                                                                         03917000
  4441.      END;                                                               03918000
  4442.                                                                         03919000
  4443. %-----------------------------------------------------------------      03920000
  4444.      PROCEDURE READ_USER(PROMPT);                                       03921000
  4445.      VALUE                PROMPT;                                       03922000
  4446.      BOOLEAN              PROMPT;                                       03923000
  4447.      BEGIN                                                              03924000
  4448.           IBX := 0; %  Index to zero                                    03925000
  4449. %          IF ICLEN NEQ 0 THEN                                          03926000
  4450. %          BEGIN                                                        03927000
  4451. %               MOVE IB := ICMD,(ICLEN);                                03928000
  4452. %               ILEN := ICLEN;                                          03929000
  4453. %               ICLEN := 0;                                             03930000
  4454. %          END                                                          03931000
  4455. %               ELSE                                                    03932000
  4456.           BEGIN %  Not initial command                                  03933000
  4457.                                                                         03934000
  4458.                IF BLASTED THEN                                          03935000
  4459.                BEGIN                                                    03936000
  4460.                     M_ST " " M_EN;                                      03937000
  4461.                     M_ST "<INTERRUPTED>" M_EN;                          03938000
  4462.                     M_ST " " M_EN;                                      03939000
  4463.                     IF TAKENUM_OPEN THEN                                03940000
  4464.                     BEGIN                                               03941000
  4465.                          CLOSE(TAKENUM);                                03942000
  4466.                          TAKENUM_OPEN:=FALSE;                           03943000
  4467.                     END;                                                03944000
  4468.                                                                         03945000
  4469.                     BLASTED := FALSE;                                   03946000
  4470.                END;                                                     03947000
  4471.                                                                         03948000
  4472.                IF TAKENUM_OPEN THEN                                     03949000
  4473.                BEGIN %  Read TAKE file                                  03950000
  4474.                     ILEN := REAL(READ(TAKENUM, 72, IB));                03951000
  4475.                     IF BOOLEAN(ILEN)  THEN                              03952000
  4476.                     BEGIN %  End of file                                03953000
  4477.                          CLOSE(TAKENUM);                                03954000
  4478.                          TAKENUM_OPEN:=FALSE;                           03955000
  4479. %                    END                                                03956000
  4480. %                         ELSE                                          03957000
  4481. %                    IF < THEN                                          03958000
  4482. %                    BEGIN                                              03959000
  4483. %                         M_ST "Read error on TAKE file" M_EN;          03960000
  4484. %                         FCLOSE(TAKENUM,0,0);                          03961000
  4485. %                         TAKENUM := 0;                                 03962000
  4486.                     END                                                 03963000
  4487.                          ELSE                                           03963100
  4488.                     ILEN := 72;                                         03963200
  4489.                END;                                                     03964000
  4490.                                                                         03965000
  4491.                IF NOT TAKENUM_OPEN THEN                                 03966000
  4492.                DO BEGIN                                                 03967000
  4493.                     IF PROMPT THEN                                      03968000
  4494.                     BEGIN                                               03969000
  4495.                          REPLACE PBUF BY "KERMIT-A>";                   03970000
  4496.                          WRITE(CONUM[STOP], 9, PBUF);                   03971000
  4497.                     END;                                                03972000
  4498.                     ILEN := REAL(READ(CINUM[TIMELIMIT 0], 80, IB));     03973000
  4499.                     IF BOOLEAN(ILEN)  THEN                              03974000
  4500.                     BEGIN                                               03975000
  4501.                          REPLACE IB BY "EXIT";                          03976000
  4502.                          ILEN := 4;                                     03977000
  4503.                     END                                                 03978000
  4504.                          ELSE                                           03978100
  4505.                     ILEN:=ILEN.[47:20];                                 03978200
  4506.                END                                                      03979000
  4507.                UNTIL ILEN > 0  OR  NOT PROMPT;                          03980000
  4508.           END;                                                          03981000
  4509.           IB_PTR := IB;                                                 03983000
  4510.           REPLACE IB_PTR BY                                             03983100
  4511.                IB_PTR FOR ILEN WITH LOWER_TO_UPPER, % Upshift as reqd   03983200
  4512.                7"^";                                % Mysterious stopper03983300
  4513.      END;                                                               03984000
  4514.                                                                         03985000
  4515.      % -----------------------------------------------------------      03986000
  4516.                                                                         03987000
  4517.      WHILE NOT DONE DO                                                  03988000
  4518.      BEGIN                                                              03989000
  4519.           READ_USER(TRUE);                                              03990000
  4520.           SCANIT(NULLV);                                                03991000
  4521.                                                                         03992000
  4522.           CASE ITEM OF                                                  03994000
  4523.           BEGIN                                                         03995000
  4524.      TAKEV:                                                             03996000
  4525.           BEGIN                                                         03997000
  4526.                SCANIT(QMARKV);                                          03998000
  4527.                WHILE ITEM = QMARKV DO                                   03999000
  4528.                BEGIN                                                    04000000
  4529.                     HELP(TAKEV, 0, 0);                                  04001000
  4530.                     READ_USER(FALSE);                                   04002000
  4531.                     SCANIT(QMARKV);                                     04003000
  4532.                     IF BLASTED THEN                                     04004000
  4533.                          GO TO TAKE_EXIT;                               04005000
  4534.                END;                                                     04006000
  4535.                IF ITEM NEQ NULLV THEN  %  No reserved words allowed     04007000
  4536.                BEGIN                                                    04008000
  4537.                     M_ST "Cannot use reserved word for filespec." M_EN; 04009000
  4538.                     GO TO TAKE_EXIT;                                    04010000
  4539.                END;                                                     04011000
  4540.                REPLACE CPARM[CPLEN] BY ".";                             04012000
  4541.                REPLACE TTL BY CPARM FOR CPLEN+1 WITH ASCIITOEBCDIC;     04012100
  4542.                IF TAKENUM.OPEN THEN                                     04013000
  4543.                BEGIN                                                    04014000
  4544.                     CLOSE(TAKENUM);                                     04015000
  4545.                     TAKENUM_OPEN:=FALSE;                                04016000
  4546.                END;                                                     04017000
  4547.                TAKENUM(KIND=DISK, TITLE=TTL,                            04018000
  4548.                        DEPENDENTSPECS=TRUE, INTMODE=ASCII);             04018100
  4549.                IF NOT (TAKENUM_OPEN := TAKENUM.PRESENT)  THEN           04019000
  4550.                BEGIN                                                    04020000
  4551.                     M_ST "take error" M_EN;                             04021000
  4552.                END;                                                     04022000
  4553.           TAKE_EXIT:                                                    04023000
  4554.           END;                                                          04024000
  4555.                                                                         04025000
  4556.      SENDV:                                                             04026000
  4557.                                                                         04027000
  4558.           BEGIN                                                         04028000
  4559.                SCANIT(QMARKV); %  get local file name                   04029000
  4560.                WHILE ITEM = QMARKV DO                                   04030000
  4561.                BEGIN                                                    04031000
  4562.                     HELP(SENDV, 0, 0);                                  04032000
  4563.                     READ_USER(FALSE);                                   04033000
  4564.                     SCANIT(QMARKV);                                     04034000
  4565.                     IF BLASTED THEN                                     04035000
  4566.                          GO TO SEND_EXIT;                               04036000
  4567.                END;                                                     04037000
  4568.                WHILE CPLEN = 0                                          04038000
  4569.                DO BEGIN                                                 04039000
  4570.                     REPLACE PBUF BY "Burroughs file name?";             04040000
  4571.                     WRITE(CONUM[STOP], 20, PBUF);                       04041000
  4572.                     READ_USER(FALSE);                                   04042000
  4573.                     SCANIT(QMARKV);                                     04043000
  4574.                     IF BLASTED THEN                                     04044000
  4575.                          GO TO SEND_EXIT;                               04045000
  4576.                END;                                                     04046000
  4577.                REPLACE L_FNAME BY CPARM FOR CPLEN,                      04047000
  4578.                                   ".";                                  04048000
  4579.                L_FNAME_LEN := CPLEN;                                    04049000
  4580.                                                                         04050000
  4581. %               IF NOT VALID_FILE(L_FNAME, L_FNAME_LEN, OUT) THEN       04051000
  4582. %               BEGIN                                                   04052000
  4583. %                    M_ST ("Kermit file security error - ",             04053000
  4584. %                          "see your account manager") M_EN;            04054000
  4585. %                    DNUM := 0;                                         04055000
  4586. %                    GO TO SEND_EXIT;                                   04056000
  4587. %               END;                                                    04057000
  4588.                REPLACE TTL BY L_FNAME FOR L_FNAME_LEN+1                 04057100
  4589.                     WITH ASCIITOEBCDIC;                                 04057200
  4590.                DNUM(KIND=DISK, INTMODE=ASCII,                           04058000
  4591.                     TITLE=TTL, NEWFILE=FALSE,                           04058100
  4592.                     DEPENDENTSPECS=TRUE);                               04058200
  4593.                IF NOT (DNUM_OPEN := DNUM.PRESENT)  THEN                 04059000
  4594.                BEGIN                                                    04060000
  4595.                     M_ST "File open error" M_EN;                        04061000
  4596.                END                                                      04062000
  4597.                     ELSE                                                04063000
  4598.                BEGIN                                                    04064000
  4599.                     SCANIT(QMARKV);                                     04065000
  4600.                     IF CPLEN NEQ 0 THEN                                 04066000
  4601.                     BEGIN                                               04067000
  4602.                          REPLACE R_FNAME BY CPARM FOR CPLEN, ".";       04068000
  4603.                     END;                                                04069000
  4604.                     R_FNAME_LEN := CPLEN;                               04070000
  4605.                                                                         04071000
  4606. %                    IF NOT OPEN_LINE THEN                              04072000
  4607. %                    BEGIN                                              04073000
  4608. %                         M_ST "Line open failure" M_EN;                04074000
  4609. %                    END                                                04075000
  4610. %                         ELSE                                          04076000
  4611.                     BEGIN                                               04077000
  4612.                          M_ST                                           04078000
  4613.                            "Escape back to your local KERMIT ",         04079000
  4614.                            "and enter the RECEIVE command"              04080000
  4615.                          M_EN;                                          04081000
  4616.                                                                         04082000
  4617.                          IF I_DELAY > 0 THEN                            04083000
  4618.                          BEGIN                                          04084000
  4619.                               P_INT := I_DELAY;                         04085000
  4620.                               WAIT((P_INT));                            04086000
  4621.                          END;                                           04087000
  4622.                                                                         04088000
  4623.                          IF R_FNAME_LEN NEQ 0 THEN                      04089000
  4624.                               XFROK := SENDSW(R_FNAME,                  04090000
  4625.                                               -R_FNAME_LEN)             04091000
  4626.                          ELSE                                           04092000
  4627.                               XFROK := SENDSW(L_FNAME,                  04093000
  4628.                                               -L_FNAME_LEN);            04094000
  4629.                                                                         04095000
  4630.                          STATE := SBREAK;                               04096000
  4631. %                        IF LDEV_CI = LDEV_LINE THEN                    04097000
  4632. %                             SHUT_LINE;  %  Echo on, etc.              04098000
  4633.                                                                         04099000
  4634.                          IF NOT XFROK THEN                              04100000
  4635.                          BEGIN                                          04101000
  4636.                               M_ST "SEND failure" M_EN;                 04102000
  4637.                          END                                            04103000
  4638.                               ELSE                                      04104000
  4639.                          BEGIN                                          04105000
  4640.                               M_ST "SEND completed" M_EN;               04106000
  4641.                          END;                                           04107000
  4642.                     END;                                                04108000
  4643.                END;                                                     04109000
  4644.           SEND_EXIT:                                                    04110000
  4645.                                                                         04110100
  4646.           L_FNAME_LEN := 0;                                             04110200
  4647.                                                                         04110300
  4648.           END;                                                          04111000
  4649.                                                                         04112000
  4650.      RECEIVEV:                                                          04113000
  4651.                                                                         04114000
  4652.           BEGIN                                                         04115000
  4653.                SCANIT(QMARKV);                                          04116000
  4654.                WHILE ITEM = QMARKV DO                                   04117000
  4655.                BEGIN                                                    04118000
  4656.                     HELP(RECEIVEV, 0, 0);                               04119000
  4657.                     READ_USER(FALSE);                                   04120000
  4658.                     SCANIT(QMARKV);                                     04121000
  4659.                     IF BLASTED THEN                                     04122000
  4660.                          GO TO RECEIVE_EXIT;                            04123000
  4661.                END;                                                     04124000
  4662.                WHILE CPLEN = 0                                          04125000
  4663.                DO BEGIN                                                 04126000
  4664.                     REPLACE PBUF BY "Burroughs file name?";             04127000
  4665.                     WRITE(CONUM[STOP], 20, PBUF);                       04128000
  4666.                     READ_USER(FALSE);                                   04129000
  4667.                     SCANIT(QMARKV);                                     04130000
  4668.                     IF BLASTED THEN                                     04131000
  4669.                          GO TO RECEIVE_EXIT;                            04132000
  4670.                END;                                                     04133000
  4671.                REPLACE L_FNAME BY CPARM FOR CPLEN, ".";                 04134000
  4672.                L_FNAME_LEN := CPLEN;                                    04135000
  4673. %               IF VALID_FILE(L_FNAME, L_FNAME_LEN, IN) THEN            04136000
  4674. %               %  Its ok.  No action necessary.                        04137000
  4675. %                    ELSE                                               04138000
  4676. %               BEGIN                                                   04139000
  4677. %                    M_ST ("Kermit file security error - ",             04140000
  4678. %                          "see your account manager") M_EN;            04141000
  4679. %                    GO TO RECEIVE_EXIT;                                04142000
  4680. %               END;                                                    04143000
  4681. %                                                                       04144000
  4682.                REPLACE TTL BY L_FNAME FOR L_FNAME_LEN+1                 04144800
  4683.                     WITH ASCIITOEBCDIC;                                 04144900
  4684.                DNUM(KIND=PACK, FILENAME=TTL, NEWFILE=FALSE);            04145000
  4685.                                                                         04146000
  4686.                IF NOT DNUM.RESIDENT THEN  %  OK.  Its not there already 04149000
  4687.                     ELSE                                                04150000
  4688.                BEGIN                                                    04151000
  4689.                     REPLACE PTEMP:PBUF BY                               04152000
  4690.                     "File is already present.  OK to remove? (Y/N)";    04153000
  4691.                     PLEN:=OFFSET(PTEMP);                                04154000
  4692.                     WRITE(CONUM[STOP], PLEN, PBUF);                     04155000
  4693.                     READ_USER(FALSE);                                   04156000
  4694.                     SCANIT(ONV);                                        04157000
  4695.                     IF ITEM = YESV THEN                                 04158000
  4696.                     BEGIN                                               04159000
  4697.                          REMOVEFILE(TTL);                               04160000
  4698.                     END                                                 04161000
  4699.                          ELSE                                           04165000
  4700.                     BEGIN                                               04166000
  4701.                          M_ST "RECEIVE attempt abandoned" M_EN;         04167000
  4702.                          GO TO RECEIVE_EXIT;                            04168000
  4703.                     END;                                                04169000
  4704.                END;                                                     04170000
  4705.                                                                         04171000
  4706.                                                                         04172000
  4707. %               IF NOT OPEN_LINE THEN                                   04173000
  4708. %               BEGIN                                                   04174000
  4709. %                    M_ST "Line open error" M_EN;                       04175000
  4710. %               END                                                     04176000
  4711. %                    ELSE                                               04177000
  4712.                BEGIN                                                    04178000
  4713.                     M_ST                                                04179000
  4714.                       "Escape back to your local KERMIT ",              04180000
  4715.                       "and enter the SEND command"                      04181000
  4716.                     M_EN;                                               04182000
  4717.                     REPLACE DBUF BY " " FOR RCV_RECLEN; % Initial scrub 04182100
  4718.                                                                         04183000
  4719.                     XFROK := RECSW(FALSE);                              04184000
  4720.                                                                         04185000
  4721. %                   IF LDEV_CI = LDEV_LINE THEN                         04186000
  4722. %                        SHUT_LINE;  %  Echo on, etc.                   04187000
  4723.                                                                         04188000
  4724.                     IF NOT XFROK THEN                                   04189000
  4725.                     BEGIN                                               04190000
  4726.                          M_ST "RECEIVE error" M_EN;                     04191000
  4727.                     END                                                 04192000
  4728.                          ELSE                                           04193000
  4729.                     BEGIN                                               04194000
  4730.                          M_ST "RECEIVE complete" M_EN;                  04195000
  4731.                     END;                                                04196000
  4732.                END;                                                     04197000
  4733.           RECEIVE_EXIT:                                                 04198000
  4734.                                                                         04198100
  4735.           L_FNAME_LEN := 0;                                             04198200
  4736.                                                                         04198300
  4737.           END;                                                          04199000
  4738.                                                                         04200000
  4739.      SERVEV:                                                            04201000
  4740.                                                                         04202000
  4741.           BEGIN                                                         04203000
  4742.                M_ST "SERVER mode is not yet implemented" M_EN;          04203100
  4743.                GO TO SERVE_EXIT;                                        04203200
  4744.                SCANIT(QMARKV);                                          04204000
  4745.                IF ITEM = QMARKV THEN                                    04205000
  4746.                BEGIN                                                    04206000
  4747.                     HELP(SERVEV, 0, 0);                                 04207000
  4748.                     READ_USER(FALSE);                                   04208000
  4749.                     IF BLASTED THEN                                     04209000
  4750.                          GO TO SERVE_EXIT;                              04210000
  4751.                END;                                                     04211000
  4752. %               IF NOT OPEN_LINE THEN                                   04212000
  4753. %               BEGIN                                                   04213000
  4754. %                    M_ST "Line open failure" M_EN;                     04214000
  4755. %               END                                                     04215000
  4756. %                    ELSE                                               04216000
  4757.                BEGIN                                                    04217000
  4758.                     M_ST                                                04218000
  4759.                       "Entering SERVER mode - ",                        04219000
  4760.                       "escape back to your local KERMIT"                04220000
  4761.                     M_EN;                                               04221000
  4762.                     SERVER;                                             04222000
  4763.                                                                         04223000
  4764. %                   IF LDEV_CI = LDEV_LINE THEN SHUT_LINE;              04224000
  4765.                                                                         04225000
  4766.                     % DONE := NOT BLASTED;                              04226000
  4767.                END;                                                     04227000
  4768.           SERVE_EXIT:                                                   04228000
  4769.           END;                                                          04229000
  4770.                                                                         04230000
  4771.      SETV:                                                              04231000
  4772.                                                                         04232000
  4773.           BEGIN                                                         04233000
  4774.                SCANIT(DEBUGV);                                          04234000
  4775.                IF ITEM = QMARKV THEN                                    04235000
  4776.                BEGIN                                                    04236000
  4777.                     HELP(SETV, 0, 0);                                   04237000
  4778.                     READ_USER(FALSE);                                   04238000
  4779.                     SCANIT(DEBUGV);                                     04239000
  4780.                     IF BLASTED THEN                                     04240000
  4781.                          GO TO SET_EXIT;                                04241000
  4782.                END;                                                     04242000
  4783.                IF NOT (DEBUGV <= ITEM AND ITEM <= SOHV) THEN            04243000
  4784.                BEGIN                                                    04244000
  4785.                     M_ST "set error" M_EN                               04245000
  4786.                END                                                      04246000
  4787.                     ELSE                                                04247000
  4788.                CASE ITEM  OF                                            04248000
  4789.                BEGIN                                                    04249000
  4790.                                                                         04250000
  4791.           DEBUGV:     %  SET DEBUG                                      04251000
  4792.                                                                         04252000
  4793.                BEGIN                                                    04253000
  4794.                     SCANIT(QMARKV);                                     04254000
  4795.                     WHILE ITEM = QMARKV DO                              04255000
  4796.                     BEGIN                                               04256000
  4797.                          HELP(SETV, DEBUGV, 0);                         04257000
  4798.                          READ_USER(FALSE);                              04258000
  4799.                          SCANIT(QMARKV);                                04259000
  4800.                          IF BLASTED THEN                                04260000
  4801.                               GO TO SET_EXIT;                           04261000
  4802.                     END;                                                04262000
  4803.                     IF ITEM = NUMBERV THEN                              04263000
  4804.                          DEBUG_MODE:=CPVAL                              04264000
  4805.                          ELSE                                           04265000
  4806.                     BEGIN                                               04266000
  4807.                          M_ST "set debug error" M_EN;                   04267000
  4808.                     END;                                                04268000
  4809.                END;                                                     04269000
  4810.                                                                         04270000
  4811.           DELAYV:     %  SET DELAY                                      04271000
  4812.                                                                         04272000
  4813.                BEGIN                                                    04273000
  4814.                     SCANIT(QMARKV);                                     04274000
  4815.                     WHILE ITEM = QMARKV DO                              04275000
  4816.                     BEGIN                                               04276000
  4817.                          HELP(SETV, DELAYV, 0);                         04277000
  4818.                          READ_USER(FALSE);                              04278000
  4819.                          SCANIT(QMARKV);                                04279000
  4820.                          IF BLASTED THEN                                04280000
  4821.                               GO TO SET_EXIT;                           04281000
  4822.                     END;                                                04282000
  4823.                     IF CPLEN = 0 THEN                                   04283000
  4824.                     BEGIN                                               04284000
  4825.                          I_DELAY := 0;                                  04285000
  4826.                     END                                                 04286000
  4827.                          ELSE                                           04287000
  4828.                     BEGIN                                               04288000
  4829.                          IF ITEM = NUMBERV THEN                         04289000
  4830.                               I_DELAY:=CPVAL                            04290000
  4831.                               ELSE                                      04291000
  4832.                          BEGIN                                          04292000
  4833.                               M_ST "set delay error" M_EN;              04293000
  4834.                          END;                                           04294000
  4835.                     END;                                                04295000
  4836.                END;                                                     04296000
  4837.                                                                         04297000
  4838.           LINEV:     %  SET LINE                                        04298000
  4839.                                                                         04299000
  4840.                BEGIN                                                    04300000
  4841.                     M_ST "SET LINE is not implemented" M_EN;            04300100
  4842.                     GO TO SET_EXIT;                                     04300200
  4843. %                    SCANIT(QMARKV);                                    04301000
  4844. %                    WHILE ITEM = QMARKV DO                             04302000
  4845. %                    BEGIN                                              04303000
  4846. %                         HELP(SETV, LINEV, 0);                         04304000
  4847. %                         READ_USER(FALSE);                             04305000
  4848. %                         SCANIT(QMARKV);                               04306000
  4849. %                         IF BLASTED THEN                               04307000
  4850. %                              GO TO SET_EXIT;                          04308000
  4851. %                    END;                                               04309000
  4852. %                    IF CPLEN = 0 THEN                                  04310000
  4853. %                    BEGIN                                              04311000
  4854. %                         LDEV_LINE := 0;                               04312000
  4855. %%                        SHUT_LINE;                                    04313000
  4856. %                    END                                                04314000
  4857. %                         ELSE                                          04315000
  4858. %                    BEGIN                                              04316000
  4859. %                         IF ITEM NEQ NUMBERV THEN                      04317000
  4860. %                         BEGIN                                         04318000
  4861. %                              M_ST "set line error" M_EN;              04319000
  4862. %                         END                                           04320000
  4863. %                              ELSE                                     04321000
  4864. %                         BEGIN                                         04322000
  4865. %                              LDEV_LINE:=CPVAL;                        04323000
  4866. %%                             SHUT_LINE;                               04324000
  4867. %                         END;                                          04325000
  4868. %                    END;                                               04326000
  4869.                END;                                                     04327000
  4870.                                                                         04328000
  4871.           SENDV_1:     %  SET SEND                                      04329000
  4872.                                                                         04330000
  4873.                BEGIN                                                    04331000
  4874.                     SCANIT(PAUSEV);                                     04332000
  4875.                     WHILE ITEM = QMARKV DO                              04333000
  4876.                     BEGIN                                               04334000
  4877.                          HELP(SETV, SENDV_1, 0);                        04335000
  4878.                          READ_USER(FALSE);                              04336000
  4879.                          SCANIT(PAUSEV);                                04337000
  4880.                          IF BLASTED THEN                                04338000
  4881.                               GO TO SET_EXIT;                           04339000
  4882.                     END;                                                04340000
  4883.                     IF ITEM = PAUSEV THEN                               04341000
  4884.                     BEGIN                                               04342000
  4885.                          SCANIT(QMARKV);                                04343000
  4886.                          IF ITEM NEQ NUMBERV THEN                       04344000
  4887.                          BEGIN                                          04345000
  4888.                               M_ST "send pause error" M_EN;             04346000
  4889.                          END                                            04347000
  4890.                               ELSE                                      04348000
  4891.                          PAUSE_CNT:=CPVAL;                              04349000
  4892.                     END                                                 04350000
  4893.                                                                         04351000
  4894.                          ELSE                                           04352000
  4895.                     IF ITEM = BINARYV THEN                              04353000
  4896.                     BEGIN                                               04354000
  4897.                          SCANIT(AUTOV); %  POTENTIAL TROUBLE            04355000
  4898.                          IF (AUTOV <= ITEM AND ITEM <= OFFV) THEN       04356000
  4899.                          SND_BINARY:=ITEM-AUTOV                         04357000
  4900.                               ELSE                                      04358000
  4901.                          BEGIN                                          04359000
  4902.                               M_ST "set send binary error" M_EN;        04360000
  4903.                          END;                                           04361000
  4904.                     END                                                 04362000
  4905.                          ELSE                                           04363000
  4906.                     BEGIN                                               04364000
  4907.                          M_ST "set send error" M_EN;                    04365000
  4908.                     END                                                 04366000
  4909.                END;                                                     04367000
  4910.                                                                         04368000
  4911.           SPEEDV:     %  SET SPEED                                      04369000
  4912.                                                                         04370000
  4913.                BEGIN                                                    04371000
  4914.                     M_ST "SET SPEED is not implemented" M_EN;           04371100
  4915.                     GO TO SET_EXIT;                                     04371200
  4916. %                    SCANIT(QMARKV);                                    04372000
  4917. %                    WHILE ITEM = QMARKV DO                             04373000
  4918. %                    BEGIN                                              04374000
  4919. %                         HELP(SETV, SPEEDV, 0);                        04375000
  4920. %                         READ_USER(FALSE);                             04376000
  4921. %                         SCANIT(QMARKV);                               04377000
  4922. %                         IF BLASTED THEN                               04378000
  4923. %                              GO TO SET_EXIT;                          04379000
  4924. %                    END;                                               04380000
  4925. %                    X := CPVAL;                                        04381000
  4926. %                    IF (X NEQ 30) AND (X NEQ 60) AND (X NEQ 120) AND   04382000
  4927. %                       (X NEQ 240) AND (X NEQ 480) AND (X NEQ 960) THEN04383000
  4928. %                    BEGIN                                              04384000
  4929. %                         M_ST                                          04385000
  4930. %                                                                       04386000
  4931. %                         "Invalid SPEED, use 30,60,120,240,480,960"    04387000
  4932. %                                                                       04388000
  4933. %                         M_EN;                                         04389000
  4934. %                    END                                                04390000
  4935. %                         ELSE                                          04391000
  4936. %                    TSPEED := X;                                       04392000
  4937.                END;                                                     04393000
  4938.                                                                         04394000
  4939.           HANDSHAKEV:     %  SET HANDSHAKE                              04395000
  4940.                                                                         04396000
  4941.                BEGIN                                                    04397000
  4942.                     M_ST "SET HANDSHAKE is not implemented" M_EN;       04397100
  4943.                     GO TO SET_EXIT;                                     04397200
  4944. %                    SCANIT(ONV);                                       04398000
  4945. %                    WHILE ITEM = QMARKV DO                             04399000
  4946. %                    BEGIN                                              04400000
  4947. %                         HELP(SETV, HANDSHAKEV, 0);                    04401000
  4948. %                         READ_USER(FALSE);                             04402000
  4949. %                         SCANIT(ONV);                                  04403000
  4950. %                         IF BLASTED THEN                               04404000
  4951. %                              GO TO SET_EXIT;                          04405000
  4952. %                    END;                                               04406000
  4953. %                    IF (NONEV <= ITEM AND ITEM <= XON2V) THEN          04407000
  4954. %                    HNDSHK:=ITEM-NONEV                                 04408000
  4955. %                         ELSE                                          04409000
  4956. %                    BEGIN                                              04410000
  4957. %                         M_ST "set handshake error" M_EN;              04411000
  4958. %                    END;                                               04412000
  4959.                END;                                                     04413000
  4960.                                                                         04414000
  4961.           RECEIVEV_1:     %  SET RECEIVE                                04415000
  4962.                                                                         04416000
  4963.                BEGIN                                                    04417000
  4964.                     SCANIT(PAUSEV);                                     04418000
  4965.                     WHILE ITEM = QMARKV DO                              04419000
  4966.                     BEGIN                                               04420000
  4967.                          HELP(SETV, RECEIVEV_1, 0);                     04421000
  4968.                          READ_USER(FALSE);                              04422000
  4969.                          SCANIT(PAUSEV);                                04423000
  4970.                          IF BLASTED THEN                                04424000
  4971.                               GO TO SET_EXIT;                           04425000
  4972.                     END;                                                04426000
  4973.                     IF NOT (BINARYV <= ITEM AND ITEM <= EXPTABV)  THEN  04427000
  4974.                     BEGIN                                               04428000
  4975.                          M_ST "set receive error" M_EN;                 04429000
  4976.                     END                                                 04430000
  4977.                          ELSE                                           04431000
  4978.                     CASE ITEM  OF                                       04432000
  4979.                     BEGIN                                               04433000
  4980.                                                                         04434000
  4981.                BINARYV:     %  SET RECEIVE BINARY                       04435000
  4982.                                                                         04436000
  4983.                     BEGIN                                               04437000
  4984.                          SCANIT(ONV);                                   04438000
  4985.                          WHILE ITEM = QMARKV DO                         04439000
  4986.                          BEGIN                                          04440000
  4987.                               HELP(SETV, RECEIVEV_1, BINARYV);          04441000
  4988.                               READ_USER(FALSE);                         04442000
  4989.                               SCANIT(ONV);                              04443000
  4990.                               IF BLASTED THEN                           04444000
  4991.                                    GO TO SET_EXIT;                      04445000
  4992.                          END;                                           04446000
  4993.                          IF ITEM = ONV  OR  ITEM = OFFV THEN            04447000
  4994.                          RCV_BINARY:=(ITEM=ONV)                         04448000
  4995.                               ELSE                                      04449000
  4996.                          BEGIN                                          04450000
  4997.                               M_ST "set receive binary error" M_EN;     04451000
  4998.                          END;                                           04452000
  4999.                     END;                                                04453000
  5000.                                                                         04454000
  5001.                DEVICEV:     %  SET RECEIVE DEVICE                       04455000
  5002.                                                                         04456000
  5003.                     BEGIN                                               04457000
  5004.                          M_ST "SET RECEIVE DEVICE "                     04457100
  5005.                               "is not implemented" M_EN;                04457200
  5006.                          GO TO SET_EXIT;                                04457300
  5007.                          SCANIT(QMARKV);                                04458000
  5008.                          WHILE ITEM = QMARKV DO                         04459000
  5009.                          BEGIN                                          04460000
  5010.                               HELP(SETV, RECEIVEV_1, DEVICEV);          04461000
  5011.                               READ_USER(FALSE);                         04462000
  5012.                               SCANIT(QMARKV);                           04463000
  5013.                                    IF BLASTED THEN                      04464000
  5014.                                         GO TO SET_EXIT;                 04465000
  5015.                          END;                                           04466000
  5016.                          IF CPLEN NEQ 0 THEN                            04467000
  5017.                          BEGIN                                          04468000
  5018.                               REPLACE RCV_DEV BY CPARM FOR CPLEN,       04469000
  5019.                                                  CR;                    04470000
  5020.                          END                                            04471000
  5021.                          ELSE                                           04472000
  5022.                               REPLACE RCV_DEV BY "DISL", CR;            04473000
  5023.                     END;                                                04474000
  5024.                                                                         04475000
  5025.                FCODEV:     %  SET RECEIVE FCODE                         04476000
  5026.                                                                         04477000
  5027.                     BEGIN                                               04478000
  5028.                           M_ST "SET RECEIVE FCODE "                     04478100
  5029.                                "is not implemented" M_EN;               04478200
  5030.                           GO TO SET_EXIT;                               04478300
  5031.                          SCANIT(QMARKV);                                04479000
  5032.                          WHILE ITEM = QMARKV DO                         04480000
  5033.                          BEGIN                                          04481000
  5034.                               HELP(SETV, RECEIVEV_1, FCODEV);           04482000
  5035.                               READ_USER(FALSE);                         04483000
  5036.                               SCANIT(QMARKV);                           04484000
  5037.                               IF BLASTED THEN                           04485000
  5038.                                    GO TO SET_EXIT;                      04486000
  5039.                          END;                                           04487000
  5040.                          IF ITEM NEQ NUMBERV THEN                       04488000
  5041.                          BEGIN                                          04489000
  5042.                               M_ST "set receive fcode error" M_EN;      04490000
  5043.                          END                                            04491000
  5044.                               ELSE                                      04492000
  5045.                          BEGIN                                          04493000
  5046.                               RCV_FCODE := CPVAL;                       04494000
  5047.                          END;                                           04495000
  5048.                     END;                                                04496000
  5049.                                                                         04497000
  5050.                RECLENV:     %  SET RECEIVE RECLEN                       04498000
  5051.                                                                         04499000
  5052.                     BEGIN                                               04500000
  5053.                          SCANIT(QMARKV);                                04501000
  5054.                          WHILE ITEM = QMARKV DO                         04502000
  5055.                          BEGIN                                          04503000
  5056.                               HELP(SETV, RECEIVEV_1, RECLENV);          04504000
  5057.                               READ_USER(FALSE);                         04505000
  5058.                               SCANIT(QMARKV);                           04506000
  5059.                               IF BLASTED THEN                           04507000
  5060.                                    GO TO SET_EXIT;                      04508000
  5061.                          END;                                           04509000
  5062.                          IF ITEM NEQ NUMBERV THEN                       04510000
  5063.                          BEGIN                                          04511000
  5064.                               M_ST "set receive reclen error" M_EN;     04512000
  5065.                          END                                            04513000
  5066.                               ELSE                                      04514000
  5067.                          IF CPVAL NEQ 0 THEN                            04515000
  5068.                          BEGIN                                          04516000
  5069.                               RCV_RECLEN := CPVAL;                      04517000
  5070.                          END                                            04518000
  5071.                               ELSE                                      04519000
  5072.                          RCV_RECLEN := -254;                            04520000
  5073.                     END;                                                04521000
  5074.                                                                         04522000
  5075.                BLOCKFV:     %  SET RECEIVE BLOCKF                       04523000
  5076.                                                                         04524000
  5077.                     BEGIN                                               04525000
  5078.                          SCANIT(QMARKV);                                04526000
  5079.                          WHILE ITEM = QMARKV DO                         04527000
  5080.                          BEGIN                                          04528000
  5081.                               HELP(SETV, RECEIVEV_1, BLOCKFV);          04529000
  5082.                               READ_USER(FALSE);                         04530000
  5083.                               SCANIT(QMARKV);                           04531000
  5084.                               IF BLASTED THEN                           04532000
  5085.                                    GO TO SET_EXIT;                      04533000
  5086.                          END;                                           04534000
  5087.                          IF ITEM NEQ NUMBERV THEN                       04535000
  5088.                          BEGIN                                          04536000
  5089.                               M_ST "set receive blockf error" M_EN;     04537000
  5090.                          END                                            04538000
  5091.                               ELSE                                      04539000
  5092.                          BEGIN                                          04540000
  5093.                               RCV_BLOCKF := CPVAL;                      04541000
  5094.                          END;                                           04542000
  5095.                     END;                                                04543000
  5096.                                                                         04544000
  5097.                FIXRECV:     %  SET RECEIVE FIXREC                       04545000
  5098.                                                                         04546000
  5099.                     BEGIN                                               04547000
  5100.                          SCANIT(ONV);                                   04548000
  5101.                          WHILE ITEM = QMARKV DO                         04549000
  5102.                          BEGIN                                          04550000
  5103.                               HELP(SETV, RECEIVEV_1, FIXRECV);          04551000
  5104.                               READ_USER(FALSE);                         04552000
  5105.                               SCANIT(QMARKV);                           04553000
  5106.                               IF BLASTED THEN                           04554000
  5107.                                    GO TO SET_EXIT;                      04555000
  5108.                          END;                                           04556000
  5109.                          IF ITEM = OFFV  THEN                           04556100
  5110.                          BEGIN                                          04556200
  5111.                               M_ST "Variable-length records are not "   04556300
  5112.                                    "implemented " M_EN;                 04556400
  5113.                               GO TO SET_EXIT;                           04556500
  5114.                          END;                                           04556600
  5115.                          IF ITEM = ONV  OR  ITEM = OFFV THEN            04557000
  5116.                          RCV_FIXREC:=(ITEM=ONV)                         04558000
  5117.                               ELSE                                      04559000
  5118.                          BEGIN                                          04560000
  5119.                               M_ST "set receive fixrec error" M_EN;     04561000
  5120.                          END;                                           04562000
  5121.                     END;                                                04563000
  5122.                                                                         04564000
  5123.                MAXRECV:     %  SET RECEIVE MAXREC                       04565000
  5124.                                                                         04566000
  5125.                     BEGIN                                               04567000
  5126.                          SCANIT(QMARKV);                                04568000
  5127.                          WHILE ITEM = QMARKV DO                         04569000
  5128.                          BEGIN                                          04570000
  5129.                               HELP(SETV, RECEIVEV_1, MAXRECV);          04571000
  5130.                               READ_USER(FALSE);                         04572000
  5131.                               SCANIT(QMARKV);                           04573000
  5132.                               IF BLASTED THEN                           04574000
  5133.                                    GO TO SET_EXIT;                      04575000
  5134.                          END;                                           04576000
  5135.                          RCV_MAXREC := CPVAL;                           04577000
  5136.                     END;                                                04586000
  5137.                                                                         04587000
  5138.                MAXEXTV:     %  SET RECEIVE MAXEXT                       04588000
  5139.                                                                         04589000
  5140.                     BEGIN                                               04590000
  5141.                          SCANIT(QMARKV);                                04591000
  5142.                          WHILE ITEM = QMARKV DO                         04592000
  5143.                          BEGIN                                          04593000
  5144.                               HELP(SETV, RECEIVEV_1, MAXEXTV);          04594000
  5145.                               READ_USER(FALSE);                         04595000
  5146.                               SCANIT(QMARKV);                           04596000
  5147.                               IF BLASTED THEN                           04597000
  5148.                                    GO TO SET_EXIT;                      04598000
  5149.                          END;                                           04599000
  5150.                          IF ITEM NEQ NUMBERV THEN                       04600000
  5151.                          BEGIN                                          04601000
  5152.                               M_ST "set receive maxext error" M_EN;     04602000
  5153.                          END                                            04603000
  5154.                               ELSE                                      04604000
  5155.                          BEGIN                                          04605000
  5156.                               RCV_MAXEXT := CPVAL;                      04606000
  5157.                          END                                            04607000
  5158.                     END;                                                04608000
  5159.                                                                         04609000
  5160.                SAVESPV:     %  SET RECEIVE SAVESP                       04610000
  5161.                                                                         04611000
  5162.                     BEGIN                                               04612000
  5163.                          SCANIT(ONV);                                   04613000
  5164.                          WHILE ITEM = QMARKV DO                         04614000
  5165.                          BEGIN                                          04615000
  5166.                               HELP(SETV, RECEIVEV_1, SAVESPV);          04616000
  5167.                               READ_USER(FALSE);                         04617000
  5168.                               SCANIT(ONV);                              04618000
  5169.                               IF BLASTED THEN                           04619000
  5170.                                    GO TO SET_EXIT;                      04620000
  5171.                          END;                                           04621000
  5172.                          IF ITEM = ONV  OR  ITEM = OFFV THEN            04622000
  5173.                          RCV_SAVESP:=(ITEM=ONV)                         04623000
  5174.                               ELSE                                      04624000
  5175.                          BEGIN                                          04625000
  5176.                               M_ST "set receive savesp error" M_EN;     04626000
  5177.                          END;                                           04627000
  5178.                     END;                                                04628000
  5179.                                                                         04629000
  5180.                PROGV:     %  SET RECEIVE PROG                           04630000
  5181.                                                                         04631000
  5182.                     BEGIN                                               04632000
  5183.                          M_ST "SET RECEIVE PROG "                       04632100
  5184.                               "is not implemented" M_EN;                04632200
  5185.                          GO TO SET_EXIT;                                04632300
  5186.                          SCANIT(QMARKV);                                04633000
  5187.                          WHILE ITEM = QMARKV DO                         04634000
  5188.                          IF ITEM = QMARKV THEN                          04635000
  5189.                          BEGIN                                          04636000
  5190.                               HELP(SETV, RECEIVEV_1, PROGV);            04637000
  5191.                               READ_USER(FALSE);                         04638000
  5192.                               SCANIT(QMARKV);                           04639000
  5193.                               IF BLASTED THEN                           04640000
  5194.                                    GO TO SET_EXIT;                      04641000
  5195.                          END;                                           04642000
  5196.                          RCV_BINARY := TRUE;                            04643000
  5197.                          RCV_FIXREC := TRUE;                            04644000
  5198.                          RCV_FCODE  := 1029;                            04645000
  5199.                          RCV_RECLEN := 128;                             04646000
  5200.                          RCV_BLOCKF := 1;                               04647000
  5201.                          RCV_MAXEXT := 1;                               04648000
  5202.                     END;                                                04649000
  5203.                                                                         04650000
  5204.                BIN128V:     %  SET RECEIVE BIN128                       04651000
  5205.                                                                         04652000
  5206.                     BEGIN                                               04653000
  5207.                          M_ST "SET RECEIVE BIN128 "                     04653100
  5208.                               "is not implemented" M_EN;                04653200
  5209.                          GO TO SET_EXIT;                                04653300
  5210.                          SCANIT(QMARKV);                                04654000
  5211.                          WHILE ITEM = QMARKV DO                         04655000
  5212.                          IF ITEM = QMARKV THEN                          04656000
  5213.                          BEGIN                                          04657000
  5214.                               HELP(SETV, RECEIVEV_1, BIN128V);          04658000
  5215.                               READ_USER(FALSE);                         04659000
  5216.                               SCANIT(QMARKV);                           04660000
  5217.                               IF BLASTED THEN                           04661000
  5218.                                    GO TO SET_EXIT;                      04662000
  5219.                          END;                                           04663000
  5220.                          RCV_BINARY := TRUE;                            04664000
  5221.                          RCV_FIXREC := FALSE;                           04665000
  5222.                          RCV_FCODE  := 0;                               04666000
  5223.                          RCV_RECLEN := 128;                             04667000
  5224.                          RCV_BLOCKF := 0;                               04668000
  5225.                     END;                                                04669000
  5226.                                                                         04670000
  5227.                TEXTV:     %  SET RECEIVE TEXT                           04671000
  5228.                                                                         04672000
  5229.                     BEGIN                                               04673000
  5230.                          M_ST "SET RECEIVE TEXT "                       04673100
  5231.                               "is not implemented" M_EN;                04673200
  5232.                          GO TO SET_EXIT;                                04673300
  5233.                          SCANIT(QMARKV);                                04674000
  5234.                          WHILE ITEM = QMARKV DO                         04675000
  5235.                          IF ITEM = QMARKV THEN                          04676000
  5236.                          BEGIN                                          04677000
  5237.                               HELP(SETV, RECEIVEV_1, TEXTV);            04678000
  5238.                               READ_USER(FALSE);                         04679000
  5239.                               SCANIT(QMARKV);                           04680000
  5240.                               IF BLASTED THEN                           04681000
  5241.                                    GO TO SET_EXIT;                      04682000
  5242.                          END;                                           04683000
  5243.                          RCV_BINARY := FALSE;                           04684000
  5244.                          RCV_FIXREC := FALSE;                           04685000
  5245.                          RCV_FCODE  := 0;                               04686000
  5246.                          RCV_RECLEN := -254;                            04687000
  5247.                          RCV_BLOCKF := 0;                               04688000
  5248.                     END;                                                04689000
  5249.                                                                         04690000
  5250.                TXT80V:     %  SET RECEIVE TXT80                         04691000
  5251.                                                                         04692000
  5252.                     BEGIN                                               04693000
  5253.                          SCANIT(QMARKV);                                04694000
  5254.                          WHILE ITEM = QMARKV DO                         04695000
  5255.                          BEGIN                                          04696000
  5256.                               HELP(SETV, RECEIVEV_1, TXT80V);           04697000
  5257.                               READ_USER(FALSE);                         04698000
  5258.                               SCANIT(QMARKV);                           04699000
  5259.                               IF BLASTED THEN                           04700000
  5260.                                    GO TO SET_EXIT;                      04701000
  5261.                          END;                                           04702000
  5262.                          RCV_BINARY := FALSE;                           04703000
  5263.                          RCV_FIXREC := TRUE;                            04704000
  5264.                          RCV_FCODE  := 192;                             04705000
  5265.                          RCV_RECLEN := 80;                              04706000
  5266.                          RCV_BLOCKF := 18;                              04707000
  5267.                     END;                                                04708000
  5268.                                                                         04709000
  5269.                 EXPTABV:    %  SET RECEIVE EXPTAB                       04710000
  5270.                                                                         04711000
  5271.                     BEGIN                                               04712000
  5272.                          SCANIT(ONV);                                   04713000
  5273.                          WHILE ITEM = QMARKV  DO                        04714000
  5274.                          BEGIN                                          04715000
  5275.                               HELP(SETV, RECEIVEV_1, EXPTABV);          04716000
  5276.                               READ_USER(FALSE);                         04717000
  5277.                               SCANIT(ONV);                              04718000
  5278.                               IF BLASTED THEN                           04719000
  5279.                                    GO TO SET_EXIT;                      04720000
  5280.                          END;                                           04721000
  5281.                          IF ITEM = ONV  OR  ITEM = OFFV  THEN           04722000
  5282.                               EXP_TABS:=(ITEM=ONV)                      04723000
  5283.                               ELSE                                      04724000
  5284.                          BEGIN                                          04725000
  5285.                               M_ST "set receive exptab error" M_EN;     04726000
  5286.                          END;                                           04727000
  5287.                     END;                                                04728000
  5288.                                                                         04729000
  5289.                     END;  %  SET RECEIVE cases                          04730000
  5290.                END;                                                     04731000
  5291.                                                                         04732000
  5292.           LOGV:     %  SET LOG                                          04733000
  5293.                                                                         04734000
  5294.                BEGIN                                                    04735000
  5295.                     SCANIT(QMARKV);                                     04736000
  5296.                     WHILE ITEM = QMARKV DO                              04737000
  5297.                     BEGIN                                               04738000
  5298.                          HELP(SETV, LOGV, 0);                           04739000
  5299.                          READ_USER(FALSE);                              04740000
  5300.                          SCANIT(QMARKV);                                04741000
  5301.                          IF BLASTED THEN                                04742000
  5302.                               GO TO SET_EXIT;                           04743000
  5303.                     END;                                                04744000
  5304.                     IF LOGNUM_OPEN  THEN                                04745000
  5305.                     BEGIN                                               04746000
  5306.                          LOCK(LOGNUM);                                  04747000
  5307.                          LOGNUM_OPEN:=FALSE;                            04748000
  5308.                     END;                                                04749000
  5309.                                                                         04750000
  5310.                  %  SCANIT;  Was done above                             04751000
  5311.                     IF CPLEN = 0 THEN                                   04752000
  5312.                     BEGIN                                               04753000
  5313.                          %  Take no action                              04754000
  5314.                     END                                                 04755000
  5315.                          ELSE                                           04756000
  5316.                     BEGIN                                               04757000
  5317.                     REPLACE LOGNAME BY CPARM FOR (LOGNAME_LEN:=CPLEN);  04758000
  5318.                     REPLACE TTL BY CPARM FOR CPLEN                      04759000
  5319.                          WITH ASCIITOEBCDIC, 8".";                      04760000
  5320.                     LOGNUM(KIND=DISK, TITLE=TTL,                        04761000
  5321.                            MAXRECSIZE=90, FRAMESIZE=8,                  04762000
  5322.                            BLOCKSIZE=1080,                              04763000
  5323.                            AREAS=10, AREASIZE=900, FLEXIBLE,            04764000
  5324.                            INTMODE=ASCII, EXTMODE=EBCDIC);              04765000
  5325.                     IF LOGNUM.RESIDENT  THEN                            04765100
  5326.                     BEGIN                                               04765200
  5327.                          REPLACE PTEMP:PBUF BY                          04766000
  5328.                               "File is already present.  "              04767000
  5329.                               "OK to remove? (Y/N) ";                   04768000
  5330.                          WRITE(CONUM[STOP], OFFSET(PTEMP), PBUF);       04770000
  5331.                          READ_USER(FALSE);                              04771000
  5332.                          SCANIT(ONV);                                   04772000
  5333.                          IF ITEM=YESV THEN                              04773000
  5334.                          BEGIN                                          04774000
  5335.                          REMOVEFILE(TTL);                               04775000
  5336.                          END                                            04780000
  5337.                               ELSE                                      04781000
  5338.                          BEGIN                                          04782000
  5339.                               M_ST "SET LOG attempt abandoned" M_EN;    04783000
  5340.                               GO TO SET_EXIT;                           04784000
  5341.                          END;                                           04785000
  5342.                     END;                                                04786000
  5343.                     LOGNUM.NEWFILE:=TRUE;                               04788000
  5344.                     IF LOGNUM.ATTERR THEN                               04789000
  5345.                     BEGIN                                               04790000
  5346.                          M_ST "File open error" M_EN;                   04791000
  5347.                     END                                                 04792000
  5348.                          ELSE                                           04792100
  5349.                     BEGIN                                               04792200
  5350.                          LOGNUM.OPEN:=TRUE;                             04792300
  5351.                          LOGNUM_OPEN:=TRUE;                             04792400
  5352.                     END;                                                04792500
  5353.                     END;                                                04793000
  5354.                END;                                                     04794000
  5355.                                                                         04795000
  5356.           SOHV:     %  SET SOH                                          04796000
  5357.                                                                         04797000
  5358.                     BEGIN                                               04798000
  5359.                          SCANIT(QMARKV);                                04799000
  5360.                          WHILE ITEM = QMARKV DO                         04800000
  5361.                          BEGIN                                          04801000
  5362.                               HELP(SETV, SOHV, 0);                      04802000
  5363.                               READ_USER(FALSE);                         04803000
  5364.                               SCANIT(QMARKV);                           04804000
  5365.                               IF BLASTED THEN                           04805000
  5366.                                    GO TO SET_EXIT;                      04806000
  5367.                          END;                                           04807000
  5368.                          IF ITEM = NUMBERV THEN                         04808000
  5369.                               SOH:=CPVAL                                04809000
  5370.                               ELSE                                      04810000
  5371.                          BEGIN                                          04811000
  5372.                               M_ST "set soh error" M_EN;                04812000
  5373.                          END;                                           04813000
  5374.                     END;                                                04814000
  5375.                END; %  SET cases                                        04815000
  5376.                                                                         04816000
  5377.           SET_EXIT:                                                     04817000
  5378.           END;                                                          04818000
  5379.                                                                         04819000
  5380.      EXITV:                                                             04820000
  5381.                                                                         04821000
  5382.           BEGIN                                                         04822000
  5383.                SCANIT(QMARKV);                                          04823000
  5384.                WHILE ITEM = QMARKV DO                                   04824000
  5385.                BEGIN                                                    04825000
  5386.                     HELP(EXITV, 0, 0);                                  04826000
  5387.                     READ_USER(FALSE);                                   04827000
  5388.                     SCANIT(QMARKV);                                     04828000
  5389.                     IF BLASTED THEN                                     04829000
  5390.                        GO TO EXIT_EXIT;                                 04830000
  5391.                END;                                                     04831000
  5392.                DONE := TRUE;                                            04832000
  5393.           EXIT_EXIT:                                                    04833000
  5394.           END;                                                          04834000
  5395.                                                                         04835000
  5396.      DIRV:                                                              04836000
  5397.                                                                         04837000
  5398.           BEGIN                                                         04838000
  5399.                M_ST "DIR is not implemented" M_EN;  GO TO DIR_EXIT;     04838100
  5400.                SCANIT(QMARKV);                                          04839000
  5401.                WHILE ITEM = QMARKV DO                                   04840000
  5402.                BEGIN                                                    04841000
  5403.                     HELP(DIRV, 0, 0);                                   04842000
  5404.                     READ_USER(FALSE);                                   04843000
  5405.                     SCANIT(QMARKV);                                     04844000
  5406.                     IF BLASTED THEN                                     04845000
  5407.                          GO TO DIR_EXIT;                                04846000
  5408.                END;                                                     04847000
  5409. %               BEGIN                                                   04848000
  5410. %                    MOVE PBUF := "LISTF ", 2;                          04849000
  5411. %                    MOVE * := CPARM, (CPLEN), 2;                       04850000
  5412. %                    MOVE * := (", 2", CR);                             04851000
  5413. %                    COMMAND(PBUF, ERROR, PARM);                        04852000
  5414. %                    IF ERROR > 0 THEN                                  04853000
  5415. %                    BEGIN                                              04854000
  5416. %                         MOVE PBUF := "CIerror ", 2;                   04855000
  5417. %                         PLEN := TOS-@PBUF;                            04856000
  5418. %                         PLEN := PLEN+ASCII(ERROR, 10, PBUF(PLEN));    04857000
  5419. %                         FWRITE(CONUM, PBUF_W, -PLEN, 0);              04858000
  5420. %                    END;                                               04859000
  5421. %               END;                                                    04860000
  5422.           DIR_EXIT:                                                     04861000
  5423.           END;                                                          04862000
  5424.                                                                         04863000
  5425.      SPACEV:                                                            04864000
  5426.                                                                         04865000
  5427.           BEGIN                                                         04866000
  5428.                M_ST "SPACE is not implemented" M_EN;  GO TO SPACE_EXIT; 04866100
  5429.                SCANIT(QMARKV);                                          04867000
  5430.           WHILE ITEM = QMARKV DO                                        04868000
  5431.                BEGIN                                                    04869000
  5432.                     HELP(SPACEV, 0, 0);                                 04870000
  5433.                     READ_USER(FALSE);                                   04871000
  5434.                     SCANIT(QMARKV);                                     04872000
  5435.                     IF BLASTED THEN                                     04873000
  5436.                          GO TO SPACE_EXIT;                              04874000
  5437.                END;                                                     04875000
  5438. %               BEGIN                                                   04876000
  5439. %                    MOVE PBUF := "REPORT ", 2;                         04877000
  5440. %                    MOVE * := CPARM, (CPLEN), 2;                       04878000
  5441. %                    MOVE * := CR;                                      04879000
  5442. %                    COMMAND(PBUF, ERROR, PARM);                        04880000
  5443. %                    IF ERROR > 0 THEN                                  04881000
  5444. %                    BEGIN                                              04882000
  5445. %                         MOVE PBUF := "CIerror ", 2;                   04883000
  5446. %                         PLEN := TOS-@PBUF;                            04884000
  5447. %                         PLEN := PLEN+ASCII(ERROR, 10, PBUF(PLEN));    04885000
  5448. %                         FWRITE(CONUM, PBUF_W, -PLEN, 0);              04886000
  5449. %                    END                                                04887000
  5450. %                         ELSE                                          04888000
  5451. %                    BEGIN                                              04889000
  5452. %                         M_ST " " M_EN;  %  Cosmetic output            04890000
  5453. %                    END;                                               04891000
  5454. %               END;                                                    04892000
  5455.           SPACE_EXIT:                                                   04893000
  5456.           END;                                                          04894000
  5457.                                                                         04895000
  5458.      DELETEV:                                                           04896000
  5459.                                                                         04897000
  5460.           BEGIN                                                         04898000
  5461.                M_ST "DELETE is not implemented" M_EN;                   04898100
  5462.                GO TO DELETE_EXIT;                                       04898200
  5463.                SCANIT(QMARKV);                                          04899000
  5464.                WHILE ITEM = QMARKV DO                                   04900000
  5465.                BEGIN                                                    04901000
  5466.                     HELP(DELETEV, 0, 0);                                04902000
  5467.                     READ_USER(FALSE);                                   04903000
  5468.                     SCANIT(QMARKV);                                     04904000
  5469.                     IF BLASTED THEN                                     04905000
  5470.                          GO TO DELETE_EXIT;                             04906000
  5471.                END;                                                     04907000
  5472. %               IF VALID_FILE(CPARM, CPLEN, IN) THEN                    04908000
  5473. %               BEGIN                                                   04909000
  5474. %                    MOVE PBUF := "PURGE ", 2;                          04910000
  5475. %                    MOVE * := CPARM, (CPLEN), 2;                       04911000
  5476. %                    MOVE * := CR;                                      04912000
  5477. %                    COMMAND(PBUF, ERROR, PARM);                        04913000
  5478. %                    IF ERROR > 0 THEN                                  04914000
  5479. %                    BEGIN                                              04915000
  5480. %                         MOVE PBUF := "CIerror ", 2;                   04916000
  5481. %                         PLEN := TOS-@PBUF;                            04917000
  5482. %                         PLEN := PLEN+ASCII(ERROR, 10, PBUF(PLEN));    04918000
  5483. %                         FWRITE(CONUM, PBUF_W, -PLEN, 0);              04919000
  5484. %                    END;                                               04920000
  5485. %               END                                                     04921000
  5486. %                    ELSE                                               04922000
  5487. %               BEGIN                                                   04923000
  5488. %                    M_ST "Filespec missing or invalid" M_EN;           04924000
  5489. %               END;                                                    04925000
  5490.           DELETE_EXIT:                                                  04926000
  5491.           END;                                                          04927000
  5492.                                                                         04928000
  5493.      TYPEV:                                                             04929000
  5494.                                                                         04930000
  5495.           BEGIN                                                         04931000
  5496.                SCANIT(QMARKV); %  get local file name                   04932000
  5497.                WHILE ITEM = QMARKV DO                                   04933000
  5498.                BEGIN                                                    04934000
  5499.                     HELP(TYPEV, 0, 0);                                  04935000
  5500.                     READ_USER(FALSE);                                   04936000
  5501.                     SCANIT(QMARKV);                                     04937000
  5502.                     IF BLASTED THEN                                     04938000
  5503.                          GO TO SEND_EXIT;                               04939000
  5504.                END;                                                     04940000
  5505.                WHILE CPLEN = 0                                          04941000
  5506.                DO BEGIN                                                 04942000
  5507.                     REPLACE PBUF BY "Burroughs file name?";             04943000
  5508.                     WRITE(CONUM[STOP], 16, PBUF);                       04944000
  5509.                     READ_USER(FALSE);                                   04945000
  5510.                     SCANIT(QMARKV);                                     04946000
  5511.                     IF BLASTED THEN                                     04947000
  5512.                          GO TO SEND_EXIT;                               04948000
  5513.                END;                                                     04949000
  5514.                REPLACE L_FNAME BY CPARM FOR CPLEN,                      04950000
  5515.                                   ".";                                  04951000
  5516.                L_FNAME_LEN := CPLEN;                                    04952000
  5517.                                                                         04953000
  5518.                M_ST " " M_EN;                                           04954000
  5519.                IF TYPESW THEN                                           04955000
  5520.                BEGIN                                                    04956000
  5521.                     M_ST " " M_EN;                                      04957000
  5522.                     M_ST "TYPE completed" M_EN;                         04958000
  5523.                END                                                      04959000
  5524.                     ELSE                                                04960000
  5525.                BEGIN                                                    04961000
  5526.                     M_ST " " M_EN;                                      04962000
  5527.                     M_ST "TYPE failure" M_EN;                           04963000
  5528.                END;                                                     04964000
  5529.                                                                         04964100
  5530.                L_FNAME_LEN := 0;                                        04964200
  5531.                                                                         04964300
  5532.           END;                                                          04965000
  5533.                                                                         04966000
  5534.      STATUSV:                                                           04967000
  5535.                                                                         04968000
  5536.           BEGIN                                                         04969000
  5537.                SCANIT(QMARKV);                                          04970000
  5538.                WHILE ITEM = QMARKV DO                                   04971000
  5539.                BEGIN                                                    04972000
  5540.                     HELP(VERIFYV, 0, 0);                                04973000
  5541.                     READ_USER(FALSE);                                   04974000
  5542.                     SCANIT(QMARKV);                                     04975000
  5543.                     IF BLASTED THEN                                     04976000
  5544.                          GO TO VERIFY_EXIT;                             04977000
  5545.                END;                                                     04978000
  5546.                VERIFY;                                                  04979000
  5547.           VERIFY_EXIT:                                                  04980000
  5548.           END;                                                          04981000
  5549.                                                                         04982000
  5550.      ELSE:                                                              04984000
  5551.           IF ITEM = QMARKV THEN                                         04985000
  5552.                HELP(NULLV, 0, 0)                                        04986000
  5553.                                                                         04987000
  5554.                ELSE                                                     04988000
  5555.           BEGIN                                                         04989000
  5556.                M_ST "command error" M_EN;                               04990000
  5557.           END;                                                          04991000
  5558.           END %  CASE                                                   04991100
  5559.      END;                                                               04992000
  5560. END;                                                                    04993000
  5561.                                                                         04994000
  5562. % *****************************************************************     04995000
  5563.                                                                         04996000
  5564.  $ PAGE                                                                 04997000
  5565. % * * * * * * * * * * * * *  OUTER  BLOCK * ** * * * * * * * * * * * * *04998000
  5566.      IF NOT KINIT THEN                                                  04999000
  5567.      BEGIN                                                              05000000
  5568.           MYSELF.STATUS:=-1;                                            05001000
  5569.      END                                                                05002000
  5570.           ELSE                                                          05003000
  5571.      BEGIN                                                              05004000
  5572.           CMDINT;  %  COMMAND main loop                                 05005000
  5573. %         SHUT_LINE;                                                    05006000
  5574. %         IF HAVE_KTEMP THEN KILL_KTEMP;                                05007000
  5575.           IF LOGNUM_OPEN THEN                                           05008000
  5576.                LOCK(LOGNUM);                                            05009000
  5577.      END;                                                               05010000
  5578. END.                                                                    05011000
  5579.