home *** CD-ROM | disk | FTP | other *** search
/ Columbia Kermit / kermit.zip / d / vmeker.sou < prev   
Text File  |  2020-01-01  |  340KB  |  9,378 lines

  1. VME KERMIT VERSION 1.01
  2. =======================
  3.  
  4. The source files contained in this file are:
  5.  
  6.       KERMIT          : SCL interface procedure
  7.  
  8.       KMT_DATA_MODULE : S3 modules
  9.       KMT_DH_MODULE
  10.       KMT_EH_MODULE
  11.       KMT_FH_MODULE
  12.       KMT_MAIN_MODULE
  13.       KMT_PH_MODULE
  14.       KMT_PP_MODULE
  15.       KMT_SP_MODULE
  16.       KMT_UI_MODULE
  17.  
  18.       KMT_HELP_MTM    : Message Text Modules
  19.       KMT_SP_MTM
  20.  
  21. Each file is preceded by $$$$ <filename>
  22.  
  23. $$$$ KERMIT
  24. @******************************************************************************@
  25. @                                                                              @
  26. @     VME Kermit User Interface Procedure.                                     @
  27. @     ------------------------------------                                     @
  28. @                                                                              @
  29. @     Installation instructions:                                               @
  30. @                                                                              @
  31. @     1. The BOOL value ASG should be set to TRUE if terminal connection       @
  32. @        to VME is via ASG, otherwise set to FALSE (for CSC, NIC etc).         @
  33. @                                                                              @
  34. @     2. The default option may be changed from "COMMAND" to "SERVER" if       @
  35. @        desired.                                                              @
  36. @                                                                              @
  37. @******************************************************************************@
  38.  
  39.  
  40. PROC KERMIT IS (
  41.       LITERAL  (OPTION)   OPT := "COMMAND",  @ "SERVER" is a valid alternative @
  42.       LITERAL  (VME_FILE) VF  := "",
  43.       LITERAL  (REM_FILE) RF  := "",
  44.       RESPONSE (RESPONSE) R   := RESULT)
  45.  
  46. PROCBEGIN
  47.  
  48.    EXT PROC KERMIT_THE_FROG IS (
  49.          LITERAL  OPTION   := "COMMAND",     @ DON'T change this to "SERVER"   @
  50.          LITERAL  VME_FILE := "",
  51.          LITERAL  REM_FILE := "",
  52.          RESPONSE RESPONSE := RESULT)
  53.  
  54.    BOOL ASG IS FALSE   @ TRUE : comms route is via ASG, FALSE : via CSC or NIC @
  55.  
  56.    KERMIT_THE_FROG(VAL OPT,VAL VF,VAL RF,R)
  57.  
  58. PROCEND
  59. $$$$ KMT_DATA_MODULE
  60. MODULE KMT_DATA_MODULE;
  61.    (<GSDATA (KMT_DATA_AREA);
  62.      STATUS 5>)
  63.  
  64. @******************************************************************************@
  65. @*                                                                            *@
  66. @* Mode definitions                                                           *@
  67. @*                                                                            *@
  68. @******************************************************************************@
  69.  
  70. MODE
  71. KMT_FH_RECORD_DETAILS_S IS STRUCT (
  72.    BOOL        FILE_OPEN,
  73.                NEW_RECORD,
  74.                END_OF_FILE,
  75.    WORD        TEXT_TYPE,                          @ 0 = EBCDIC                @
  76.                                                    @ 1 = IA5                   @
  77.                                                    @ 2 = BINARY                @
  78.    INT         MAX_RECORD_LENGTH,
  79.                RECORD_LENGTH,
  80.    (4098) BYTE RECORD);                            @ Maximum record size of    @
  81.                                                    @ 4096 + 2 bytes for CRLF   @
  82.                                                    @ pair when constructing    @
  83.                                                    @ output records            @
  84.  
  85. MODE
  86. KMT_FH_FILE_STATISTICS_S IS STRUCT (
  87.    INT INPUT_TOTAL,
  88.    INT OUTPUT_TOTAL);
  89.  
  90. MODE
  91. KMT_DH_DEVICE_DETAILS_S IS STRUCT (
  92.    BOOL FILE_OPEN,
  93.    WORD MAX_INPUT_LENGTH,
  94.         MAX_OUTPUT_LENGTH,
  95.         INPUT_PARITY,
  96.         OUTPUT_PARITY,
  97.         PAUSE);
  98.  
  99. MODE
  100. KMT_PP_CONFG_PARAMS_S IS STRUCT (
  101.    BYTE   MARK,
  102.           MAXL,
  103.           TIME,
  104.           NPAD,
  105.           PADC,
  106.           EOL,
  107.           QCTL,
  108.           QBIN,
  109.           CHKT,
  110.           REPT,
  111.    4-BYTE CAPAS);
  112.  
  113. MODE
  114. KMT_PP_PACKET_STATISTICS_S IS STRUCT (
  115.    INT INPUT_TOTAL,
  116.        OUTPUT_TOTAL);
  117.  
  118. MODE
  119. KMT_TRACE_FLAGS_S IS WORD STRUCT (
  120.    BIT    PH_TRACING,
  121.           PP_TRACING,
  122.           FH_TRACING,
  123.           DH_TRACING,
  124.    28-BIT SPARE);
  125.  
  126. MODE
  127. KMT_STATISTICS_FLAGS_S IS WORD STRUCT (
  128.    BIT    PP_STATISTICS,
  129.           FH_STATISTICS,
  130.    30-BIT SPARE);
  131.  
  132. MODE
  133. KMT_STATISTICS_S IS STRUCT (
  134.    REF KMT_FH_FILE_STATISTICS_S   FH_FILE_STATISTICS,
  135.    REF KMT_PP_PACKET_STATISTICS_S PACKET_STATISTICS);
  136.  
  137. MODE KMT_BUFFER IS (96)BYTE;
  138. MODE KMT_STRING IS REF()BYTE;
  139. MODE KMT_WORD IS REF()BYTE;
  140.  
  141. MODE KMT_MTM_VALUES IS ANY
  142.   (LONG WORD      LW_VALUE,
  143.    LONG INT       LI_VALUE,
  144.    REF WORD       RW_VALUE,
  145.    REF INT        RI_VALUE,
  146.    REF LONG WORD  RLW_VALUE,
  147.    REF LONG INT   RLI_VALUE,
  148.    REF()BYTE      RVB_VALUE,
  149.    REF()REF()BYTE RVRVB_VALUE);
  150.  
  151. ***PAGE
  152.  
  153. @******************************************************************************@
  154. @*                                                                            *@
  155. @* Global data declarations                                                   *@
  156. @*                                                                            *@
  157. @******************************************************************************@
  158.  
  159. @ Constants: @
  160. @ ********** @
  161.  
  162. GLOBAL STATIC
  163. (256) BYTE ASCII_TO_EBCDIC IS X"00010203 372D2E2F 1605250B 0C0D0E0F"
  164.                               X"10111213 3C3D3226 18193F27 1C1D1E1F"
  165.                               X"404F7F7B 5B6C507D 4D5D5C4E 6B604B61"
  166.                               X"F0F1F2F3 F4F5F6F7 F8F97A5E 4C7E6E6F"
  167.                               X"7CC1C2C3 C4C5C6C7 C8C9D1D2 D3D4D5D6"
  168.                               X"D7D8D9E2 E3E4E5E6 E7E8E94A E05A5F6D"
  169.                               X"79818283 84858687 88899192 93949596"
  170.                               X"979899A2 A3A4A5A6 A7A8A9C0 6AD0A107"
  171.                               X"00010203 372D2E2F 1605250B 0C0D0E0F"
  172.                               X"10111213 3C3D3226 18193F27 1C1D1E1F"
  173.                               X"404F7F7B 5B6C507D 4D5D5C4E 6B604B61"
  174.                               X"F0F1F2F3 F4F5F6F7 F8F97A5E 4C7E6E6F"
  175.                               X"7CC1C2C3 C4C5C6C7 C8C9D1D2 D3D4D5D6"
  176.                               X"D7D8D9E2 E3E4E5E6 E7E8E94A E05A5F6D"
  177.                               X"79818283 84858687 88899192 93949596"
  178.                               X"979899A2 A3A4A5A6 A7A8A9C0 6AD0A107";
  179.  
  180. GLOBAL STATIC
  181. (256) BYTE EBCDIC_TO_ASCII IS X"00010203 1A091A7F 1A1A1A0B 0C0D0E0F"
  182.                               X"10111213 1AFB081A 18191A1A 1C1D1E1F"
  183.                               X"FFFEFDFC 1A0A171B 1A1A1A1A 1A050607"
  184.                               X"1A1A161A 1A1A1A04 1A1A1A1A 14151A1A"
  185.                               X"201A1A1A 1A1A1A1A 1A1A5B2E 3C282B21"
  186.                               X"261A1A1A 1A1A1A1A 1A1A5D24 2A293B5E"
  187.                               X"2D2F1A1A 1A1A1A1A 1A1A7C2C 255F3E3F"
  188.                               X"1A1A1A1A 1A1A1A1A 1A603A23 40273D22"
  189.                               X"1A616263 64656667 68691A1A 1A1A1A1A"
  190.                               X"1A6A6B6C 6D6E6F70 71721A1A 1A1A1A1A"
  191.                               X"1A7E7374 75767778 797A1A1A 1A1A1A1A"
  192.                               X"1A1A1A1A 1A1A1A1A 1A1A1A1A 1A1A1A1A"
  193.                               X"7B414243 44454647 48491A1A 1A1A1A1A"
  194.                               X"7D4A4B4C 4D4E4F50 51521A1A 1A1A1A1A"
  195.                               X"5C1A5354 55565758 595A1A1A 1A1A1A1A"
  196.                               X"30313233 34353637 38391A1A 1A1A1A1A";
  197.  
  198. GLOBAL STATIC INT
  199.    UNSET     IS -1,                                @ Kermit exit states        @
  200.    EXIT      IS 0,
  201.    LOGOUT    IS 1,
  202.    FATAL_ERROR IS 999;
  203.  
  204. GLOBAL STATIC INT EOF IS 9034;
  205.  
  206. GLOBAL STATIC BOOL NOREADINT IS FALSE,
  207.                    READINT   IS TRUE;
  208.  
  209. GLOBAL STATIC INT
  210.    SERVER_MODE  IS 0,                              @ Kermit modes              @
  211.    RECEIVE_MODE IS 1,
  212.    SEND_MODE    IS 2,
  213.    COMMAND_MODE IS 3;
  214.  
  215. GLOBAL STATIC INT
  216.    REC_SERVER_IDLE IS 0,                           @ Protocol Handler states   @
  217.    REC_INIT        IS 1,
  218.    REC_FILE        IS 2,
  219.    REC_DATA        IS 3,
  220.    SEND_INIT       IS 4,
  221.    SEND_FILE       IS 5,
  222.    SEND_DATA       IS 6,
  223.    SEND_EOF        IS 7,
  224.    SEND_BREAK      IS 8,
  225.    COMPLETE        IS 9,
  226.    ABORT           IS 10;
  227.  
  228. GLOBAL STATIC INT
  229.    ENTRY          IS 0,                            @ Packet codes              @
  230.    BREAK_PKT      IS 1,
  231.    DATA_PKT       IS 2,
  232.    ERROR_PKT      IS 3,
  233.    FILE_HDR_PKT   IS 4,
  234.    GEN_CMD_PKT    IS 5,
  235.    INIT_PARAM_PKT IS 6,
  236.    KMT_CMD_PKT    IS 7,
  237.    NAK_PKT        IS 8,
  238.    REC_INIT_PKT   IS 9,
  239.    SEND_INIT_PKT  IS 10,
  240.    ACK_PKT        IS 11,
  241.    EOF_PKT        IS 12,
  242.    BAD_PKT        IS 13,
  243.    INVALID_PKT    IS 14;
  244.  
  245. GLOBAL STATIC INT
  246.    UNS_PKT IS -80251,                              @ Unsupported packet        @
  247.    NON_PKT IS -80252;                              @ Non-existant packet type  @
  248.  
  249. GLOBAL STATIC () INT PACKET_CODES := (UNS_PKT,
  250.                                       BREAK_PKT,                    @ B packet @
  251.                                       UNS_PKT,
  252.                                       DATA_PKT,                     @ D packet @
  253.                                       ERROR_PKT,                    @ E packet @
  254.                                       FILE_HDR_PKT,                 @ F packet @
  255.                                       GEN_CMD_PKT,                  @ G packet @
  256.                                       NON_PKT,
  257.                                       INIT_PARAM_PKT,               @ I packet @
  258.                                       NON_PKT,
  259.                                       KMT_CMD_PKT,                  @ K packet @
  260.                                       NON_PKT,
  261.                                       NON_PKT,
  262.                                       NAK_PKT,                      @ N packet @
  263.                                       NON_PKT,
  264.                                       NON_PKT,
  265.                                       NON_PKT,
  266.                                       REC_INIT_PKT,                 @ R packet @
  267.                                       SEND_INIT_PKT,                @ S packet @
  268.                                       UNS_PKT,
  269.                                       NON_PKT,
  270.                                       NON_PKT,
  271.                                       NON_PKT,
  272.                                       UNS_PKT,
  273.                                       ACK_PKT,                      @ Y packet @
  274.                                       EOF_PKT);                     @ Z packet @
  275.  
  276. GLOBAL STATIC INT
  277.    VME_TERM IS 0,                                     @ VME terminal file name @
  278.    VME_STD  IS 1,                                     @ VME standard file name @
  279.    KMT_STD  IS 2;                                     @ Kermit standard name   @
  280.  
  281. ***LINES(4)
  282.  
  283. @ Variables: @
  284. @ ********** @
  285.  
  286. GLOBAL
  287. STATIC (<STATUS 5>)
  288. KMT_FH_RECORD_DETAILS_S KMT_FH_RECORD_DETAILS;
  289.  
  290. GLOBAL
  291. STATIC (<STATUS 5>)
  292. KMT_FH_FILE_STATISTICS_S KMT_FH_FILE_STATISTICS;
  293.  
  294. GLOBAL
  295. STATIC (<STATUS 5>)
  296. KMT_DH_DEVICE_DETAILS_S KMT_DH_DEVICE_DETAILS;
  297.  
  298. ***LINES(4)
  299.  
  300. GLOBAL
  301. STATIC (<STATUS 5>)
  302. KMT_PP_CONFG_PARAMS_S KMT_PP_LOCAL_CONFG_PARAMS;
  303.  
  304. GLOBAL
  305. STATIC (<STATUS 5>)
  306. KMT_PP_CONFG_PARAMS_S KMT_PP_REMOTE_CONFG_PARAMS;
  307.  
  308. GLOBAL
  309. STATIC (<STATUS 5>)
  310. KMT_PP_PACKET_STATISTICS_S KMT_PP_PACKET_STATISTICS;
  311.  
  312. ***LINES(4)
  313.  
  314. GLOBAL
  315. STATIC (<STATUS 5>)
  316. REF () BYTE KMT_PH_INPUT_PACKET_DATA;
  317.  
  318. ***LINES(4)
  319.  
  320. GLOBAL
  321. STATIC (<STATUS 5>)
  322. KMT_TRACE_FLAGS_S KMT_TRACE_FLAGS;
  323.  
  324. GLOBAL
  325. STATIC (<STATUS 5>)
  326. KMT_STATISTICS_FLAGS_S KMT_STATISTICS_FLAGS;
  327.  
  328. GLOBAL
  329. STATIC (<STATUS 5>)
  330. KMT_STATISTICS_S KMT_STATISTICS := (KMT_FH_FILE_STATISTICS,
  331.                                     KMT_PP_PACKET_STATISTICS);
  332.  
  333. GLOBAL STATIC () BYTE KMT_VERSION := "1.01";
  334.  
  335. GLOBAL STATIC BOOL ASG_ROUTE;
  336.  
  337. GLOBAL STATIC (15)KMT_MTM_VALUES KMT_MTM_AREA;
  338. GLOBAL STATIC (80)BYTE MTM_TEXT;
  339. GLOBAL STATIC INT MTM_TEXT_LEN;
  340. GLOBAL STATIC (2)REF()BYTE MTM_RECALL_DATA;
  341.  
  342. GLOBAL STATIC INT RC_IGNORED;                      @ ignored result code       @
  343. GLOBAL STATIC INT PKT_SEQ;                         @ packet sequence number    @
  344. GLOBAL STATIC INT PKT_NO;                          @ number of packet received @
  345. GLOBAL STATIC INT PKT_TYPE;                        @ packet type               @
  346. GLOBAL STATIC INT RETRY_COUNT;                     @ retry count               @
  347. GLOBAL STATIC INT RETRY_TOTAL;                     @ total retries during xfer @
  348. GLOBAL STATIC INT TIMEOUT_TOTAL;                  @ total timeouts during xfer @
  349. GLOBAL STATIC INT MAXTRY;                          @ max retries               @
  350. GLOBAL STATIC INT EXIT_STATE;                      @ controls main Kermit loop @
  351. GLOBAL STATIC INT KMT_CURRENT_MODE;              @ server/send/receive/command @
  352. GLOBAL STATIC INT KMT_PH_STATE;                    @ state in protocol handler @
  353. GLOBAL STATIC INT FILE_OPTION;               @ create or replace receive files @
  354. GLOBAL STATIC WORD DELAY;                  @ time delay before SEND_INIT packet@
  355. GLOBAL STATIC BOOL DELAY_TIMER;            @ set delay timer before get packet @
  356. GLOBAL STATIC BOOL SAVE_INCOMPLETE_FILE;    @ save action for incomplete files @
  357. GLOBAL STATIC BOOL TRANSLATE_FILENAME;           @ file names to be translated @
  358. GLOBAL STATIC KMT_BUFFER KMT_VME_FILE_BUF,         @ buffer for VME filename   @
  359.                          KMT_REM_FILE_BUF;        @ buffer for remote filename @
  360. GLOBAL STATIC KMT_WORD KMT_VME_FILE,               @ pointer to VME filename   @
  361.                        KMT_REM_FILE;              @ pointer to remote filename @
  362.  
  363. GLOBAL STATIC KMT_BUFFER KMT_INPUT_BUF;                   @ command line buffer@
  364.  
  365. ***LINES(4)
  366.  
  367. @ Results: @
  368. @ ******** @
  369.  
  370. ***LINES(4)
  371.  
  372. ENDMODULE                                          @ KMT_DATA_MODULE           @
  373. $$$$ KMT_DH_MODULE
  374. MODULE KMT_DH_MODULE;
  375.  
  376. @******************************************************************************@
  377. @*                                                                            *@
  378. @* Mode definitions                                                           *@
  379. @*                                                                            *@
  380. @******************************************************************************@
  381.  
  382. MODE
  383. PFI_REPORTS IS LONG WORD STRUCT (
  384.    4-BIT  ALWAYS_ZERO,
  385.    12-BIT USER_FILE_IDENT,
  386.           TRANSFER_IDENTIFIER,
  387.    4-BIT  REASON,
  388.    BYTE   QUALIFIER_1,
  389.           QUALIFIER_2,
  390.    2-BYTE CHARACTER_OUTPUT);
  391.  
  392. MODE
  393. PFI_FLAGS_1S IS BYTE STRUCT (
  394.    BIT MEDIUM_LOW,
  395.        DATA_LOST,
  396.        FORMAT_DISTURBED,
  397.        PERMANENTLY_UNAVAILABLE,
  398.        TEMPORARILY_UNAVAILABLE,
  399.        NOT_IMPLEMENTED,
  400.        GENERAL_FILE_FREEZE,
  401.        CHARACTER_OUTPUT_VALID);
  402.  
  403. MODE
  404. PFI_FLAGS_2S IS BYTE STRUCT (
  405.    BIT   PROPERTIES_LOST,
  406.          LONG_LINE,
  407.          ILLEGAL_DATA,
  408.          FILE_TIMEOUT,
  409.    4-BIT SPARE);
  410.  
  411. MODE
  412. PFI_INPUT_FLAGS IS 2-BYTE STRUCT (
  413.    BIT    QUALIFIED,
  414.    15-BIT SPARE);
  415.  
  416. MODE
  417. PFI_INPUT_RETURNS IS WORD STRUCT (
  418.    PFI_INPUT_FLAGS INPUT_FLAGS,
  419.    2-BYTE          DATA_LENGTH);
  420.  
  421. MODE
  422. PFI_QUEUE_CONTROLS IS WORD STRUCT (
  423.    BIT    BREAK_IN,
  424.           DATA_LOST,
  425.           FORMAT_DISTURBED,
  426.           BREAK_IN_ACK,
  427.           GENERAL_FILE_FREEZE,
  428.           RESET,
  429.    26-BIT RESERVED);
  430.  
  431. MODE
  432. PFI_OUTPUT_CONTROLS IS WORD STRUCT (
  433.    BIT    EXPIDITED_DATA,
  434.           REPORT_NORMAL_TERMINATION,
  435.           PROMPT,
  436.           CANCEL_OUTSTANDING_PROMPT,
  437.           OVERRIDE_MY_READ_INTEREST,
  438.           SPARE_2,
  439.           QUALIFIED,
  440.           SEQUENCE,
  441.    BYTE   COMMAND,
  442.    2-BYTE SPARE5);
  443.  
  444. MODE
  445. PFI_FILE_FLAGS IS WORD STRUCT (
  446.    BIT    FORMAT_SENSITIVE,
  447.           ACTION_KEY_IS_DATA,
  448.           AUTOPAGING,
  449.           AUTOMATIC_NEW_LINE,
  450.           BADGE_REQUIRED,
  451.           PAUSING_REQUIRED,
  452.           INHIBIT_SPACE_TRUNCATION,
  453.           INHIBIT_SPACE_COMPRESSION,
  454.           FE_AT_START_OF_RECORD,
  455.           REJECT_ILLEGAL_DATA,
  456.           ALLOW_COMPRESSION,
  457.    21-BIT RESERVED);
  458.  
  459. MODE
  460. PFI_PARAMETER_VALUES IS ANY (
  461.    INT             INT_VALUE,
  462.    PFI_FILE_FLAGS  FILE_FLAGS,
  463.    REF REF () BYTE RRRB_VALUE,
  464.    REF () BYTE     STRING_VALUE);
  465.  
  466. MODE
  467. PFI_PARAMETER_PAIRS IS STRUCT (
  468.    WORD                 TYPE,
  469.    PFI_PARAMETER_VALUES VALUE);
  470.  
  471. MODE
  472. KMT_TRACE_FLAGS_S IS WORD STRUCT (
  473.    BIT    PH_TRACING,
  474.           PP_TRACING,
  475.           FH_TRACING,
  476.           DH_TRACING,
  477.    28-BIT SPARE);
  478.  
  479. MODE
  480. KMT_DH_DEVICE_DETAILS_S IS STRUCT (
  481.    BOOL FILE_OPEN,
  482.    WORD MAX_INPUT_LENGTH,
  483.         MAX_OUTPUT_LENGTH,
  484.         INPUT_PARITY,
  485.         OUTPUT_PARITY,
  486.         PAUSE);
  487.  
  488. MODE
  489. KMT_DH_FILE_DETAILS_S IS STRUCT (
  490.    LONG INT FILE_CURRENCY,
  491.    WORD     PFM_CURRENCY,
  492.             CONNECTION_CURRENCY,
  493.             TIMER_CHANNEL,
  494.    BOOL     READ_INTEREST,
  495.    (2) WORD EVENT_LIST,
  496.    BOOL     LONG_SUSPEND);
  497.  
  498. MODE
  499. KMT_PP_CONFG_PARAMS_S IS STRUCT (
  500.    BYTE   MARK,
  501.           MAXL,
  502.           TIME,
  503.           NPAD,
  504.           PADC,
  505.           EOL,
  506.           QCTL,
  507.           QBIN,
  508.           CHKT,
  509.           REPT,
  510.    4-BYTE CAPAS);
  511.  
  512. MODE
  513. KMT_MTM_VALUES IS ANY (
  514.    LONG WORD          LW_VALUE,
  515.    LONG INT           LI_VALUE,
  516.    REF WORD           RW_VALUE,
  517.    REF INT            RI_VALUE,
  518.    REF LONG WORD      RLW_VALUE,
  519.    REF LONG INT       RLI_VALUE,
  520.    REF () BYTE        RVB_VALUE,
  521.    REF () REF () BYTE RVRVB_VALUE);
  522.  
  523. ***PAGE
  524.  
  525. @******************************************************************************@
  526. @*                                                                            *@
  527. @* External procedure references                                              *@
  528. @*                                                                            *@
  529. @******************************************************************************@
  530.  
  531. EXT (<PREFIX "ICLCTM">)
  532. PROC
  533.    (LONG WORD,                                   @ FILE_CURRENCY               @
  534.     REF () BYTE,                                 @ FILE_LOCAL_NAME             @
  535.     REF () BYTE,                                 @ FULL_FILE_NAME              @
  536.     REF () WORD,                                 @ PROPERTIES                  @
  537.     RESPONSE                                     @ RESPONSE                    @
  538.    )                                   CTM_READ_DESC;
  539.  
  540. EXT (<PREFIX "ICLCTM">)
  541. PROC
  542.    (WORD,                                        @ TIME_INTERVAL               @
  543.     RESPONSE                                     @ RESPONSE                    @
  544.    )                                   CTM_WAIT_TIME;
  545.  
  546. EXT (<PREFIX "ICLCTM">)
  547. PROC
  548.    (REF () BYTE,                                 @ NAME                        @
  549.     REF LONG INT,                                @ LNAME                       @
  550.     REF () BYTE,                                 @ ACCESS                      @
  551.     REF () BYTE,                                 @ LEVEL                       @
  552.     REF () BYTE,                                 @ LOCK                        @
  553.     REF () BYTE,                                 @ REUSE                       @
  554.     LONG INT,                                    @ STARTSECT                   @
  555.     LONG INT,                                    @ ENDSECT                     @
  556.     LONG INT,                                    @ LOAD                        @
  557.     REF () REF () BYTE,                          @ DNAMES                      @
  558.     RESPONSE                                     @ RESPONSE                    @
  559.    )                                   ASSIGN_FILE;
  560.  
  561. EXT (<PREFIX "ICLCTM">)
  562. PROC
  563.    (INT,                                         @ EVENT_NODE_CURRENCY         @
  564.     BYTE,                                        @ ACCESS                      @
  565.     BYTE,                                        @ SHARABILITY                 @
  566.     REF WORD,                                    @ EVENT_CURRENCY              @
  567.     LONG WORD,                                   @ INTERRUPT_PROC              @
  568.     WORD,                                        @ SPARE                       @
  569.     RESPONSE                                     @ RESPONSE                    @
  570.    )                                   CONNECT_EVENT;
  571.  
  572. EXT (<PREFIX "ICLCTM">)
  573. PROC
  574.    (WORD,                                        @ EVENT_CURRENCY              @
  575.     LONG WORD,                                   @ MESSAGE                     @
  576.     INT,                                         @ REPLY                       @
  577.     RESPONSE                                     @ RESPONSE                    @
  578.    )                                   READ_EVENT;
  579.  
  580. EXT (<PREFIX "ICLCTM">)
  581. PROC
  582.    (LONG WORD,                                   @ FILE_CURRENCY               @
  583.     REF WORD,                                    @ PFM_CURRENCY                @
  584.     REF WORD,                                    @ CONNECTION_CURRENCY         @
  585.     REF () BYTE,                                 @ DETAILS_SUPPLIED            @
  586.     REF () BYTE,                                 @ DETAILS_REQUIRED            @
  587.     REF () BYTE,                                 @ DETAILS_RETURNED            @
  588.     RESPONSE                                     @ RESPONSE                    @
  589.    )                                   BI_CONNECT_FILE;
  590.  
  591. EXT (<PREFIX "ICLCTM">)
  592. PROC
  593.    (WORD,                                        @ CONNECTION_CURRENCY         @
  594.     REF () BYTE,                                 @ DETAILS_SUPPLIED            @
  595.     REF () BYTE,                                 @ DETAILS_REQUIRED            @
  596.     REF () BYTE,                                 @ DETAILS_RETURNED            @
  597.     RESPONSE                                     @ RESPONSE                    @
  598.    )                                   BI_MODIFY_CONNECTION;
  599.  
  600. EXT (<PREFIX "ICLCTM">)
  601. PROC
  602.    (REF () WORD,                                 @ EVENT_LIST                  @
  603.     REF WORD,                                    @ EVENT_CURRENCY              @
  604.     REF LONG WORD,                               @ MESSAGE                     @
  605.     BOOL,                                        @ LONG_SUSPEND                @
  606.     RESPONSE                                     @ RESPONSE                    @
  607.    )                                   WAIT_FOR_EVENTS;
  608.  
  609. EXT (<PREFIX "ICLCTM">)
  610. PROC
  611.    (WORD,                                        @ EVENT_CURRENCY              @
  612.     REF WORD,                                    @ TIMER_CHANNEL               @
  613.     RESPONSE                                     @ RESPONSE                    @
  614.    )                                   CREATE_TIMER_CHANNEL;
  615.  
  616. EXT (<PREFIX "ICLCTM">)
  617. PROC
  618.    (WORD,                                        @ TIMER_CHANNEL               @
  619.     LONG WORD,                                   @ MESSAGE                     @
  620.     LONG INT,                                    @ TIME                        @
  621.     BOOL,                                        @ REAL_TIME                   @
  622.     BOOL,                                        @ PERIODIC                    @
  623.     RESPONSE)                                    @ RESPONSE                    @
  624.                                        ESTABLISH_TIMER_NOTIFICATION;
  625.  
  626. EXT (<PREFIX "ICLCTM">)
  627. PROC
  628.    (WORD,                                        @ TIMER_CHANNEL               @
  629.     RESPONSE                                     @ RESPONSE                    @
  630.    )                                   CANCEL_TIMER_NOTIFICATION;
  631.  
  632. EXT (<PREFIX "ICLCTM">)
  633. PROC
  634.    (WORD,                                        @ PFM_CURRENCY                @
  635.     WORD,                                        @ START_OF_INPUT              @
  636.     REF () BYTE,                                 @ BUFFER                      @
  637.     REF PFI_INPUT_RETURNS,                       @ INPUT_RETURN                @
  638.     RESPONSE                                     @ RESPONSE                    @
  639.    )                                   DH_INPUT;
  640.  
  641. EXT (<PREFIX "ICLCTM">)
  642. PROC
  643.    (WORD,                                        @ PFM_CURRENCY                @
  644.     WORD,                                        @ TRANSFER_IDENTIFIER         @
  645.     REF () BYTE,                                 @ OUTPUT_DATA                 @
  646.     PFI_OUTPUT_CONTROLS,                         @ CONTROL                     @
  647.     RESPONSE                                     @ RESPONSE                    @
  648.    )                                   DH_OUTPUT;
  649.  
  650. EXT (<PREFIX "ICLCTM">)
  651. PROC
  652.    (WORD,                                        @ PFM_CURRENCY                @
  653.     REF () PFI_PARAMETER_PAIRS,                  @ PARAMS                      @
  654.     RESPONSE                                     @ RESPONSE                    @
  655.    )                                   DH_DEFINE_FILE_PROPERTIES;
  656.  
  657. EXT (<PREFIX "ICLCTM">)
  658. PROC
  659.    (WORD,                                        @ PFM_CURRENCY                @
  660.     WORD,                                        @ QUEUE_ACTION                @
  661.     PFI_QUEUE_CONTROLS,                          @ CONTROL                     @
  662.     REF () BYTE,                                 @ ADDITIONAL_DATA             @
  663.     RESPONSE                                     @ RESPONSE                    @
  664.    )                                   DH_DO_QUEUE_ACTION;
  665.  
  666. EXT (<PREFIX "ICLCTM">)
  667. PROC
  668.    (WORD,                                        @ PFM_CURRENCY                @
  669.     REF () BYTE,                                 @ DETAILS_REQUIRED            @
  670.     REF () BYTE,                                 @ DETAILS_AREA                @
  671.     REF WORD,                                    @ DETAILS_LENGTH_AREA         @
  672.     RESPONSE                                     @ RESPONSE                    @
  673.    )                                   DH_GIVE_FILE_DETAILS;
  674.  
  675. EXT
  676. PROC
  677.    (INT,                                         @ TYPE                        @
  678.     REF () KMT_MTM_VALUES                        @ PARAMS                      @
  679.    )                                   KMT_SP_LOG_TRACE_MESSAGE;
  680.  
  681. EXT
  682. PROC
  683.    (INT,                                         @ RESULT_CODE                 @
  684.     WORD,                                        @ DESTINATION                 @
  685.     REF () KMT_MTM_VALUES,                       @ PARAMS                      @
  686.     LONG WORD,                                   @ PE_CONTINGENCY_MESSAGE      @
  687.     BOOL,                                        @ DUMP                        @
  688.     BOOL                                         @ UNRECOVERABLE               @
  689.    )                                   KMT_EH_LOG_ERROR;
  690.  
  691. ***PAGE
  692.  
  693. @******************************************************************************@
  694. @*                                                                            *@
  695. @* External data references                                                   *@
  696. @*                                                                            *@
  697. @******************************************************************************@
  698.  
  699. @ Constants: @
  700. @ ********** @
  701.  
  702. ***LINES(4)
  703.  
  704. @ Variables: @
  705. @ ********** @
  706.  
  707. EXT (<CASCADE>)
  708. REF KMT_TRACE_FLAGS_S KMT_TRACE_FLAGS;
  709.  
  710. EXT (<CASCADE>)
  711. REF KMT_DH_DEVICE_DETAILS_S KMT_DH_DEVICE_DETAILS;
  712.  
  713. EXT (<CASCADE>)
  714. REF KMT_PP_CONFG_PARAMS_S KMT_PP_REMOTE_CONFG_PARAMS;
  715.  
  716. EXT (<CASCADE>)
  717. REF BOOL DELAY_TIMER;
  718.  
  719. EXT (<CASCADE>)
  720. REF WORD DELAY;
  721.  
  722. ***LINES(4)
  723.  
  724. @ Results: @
  725. @ ******** @
  726.  
  727. ***LINES(4)
  728.  
  729. ***PAGE
  730.  
  731. @******************************************************************************@
  732. @*                                                                            *@
  733. @* Static data declarations                                                   *@
  734. @*                                                                            *@
  735. @******************************************************************************@
  736.  
  737. @ Constants: @
  738. @ ********** @
  739.  
  740. ***LINES(4)
  741.  
  742. @ Variables: @
  743. @ ********** @
  744.  
  745. STATIC
  746. KMT_DH_FILE_DETAILS_S KMT_DH_FILE_DETAILS;
  747.  
  748. ***PAGE
  749.  
  750. @******************************************************************************@
  751. @*                                                                            *@
  752. @* Procedure declarations                                                     *@
  753. @*                                                                            *@
  754. @******************************************************************************@
  755.  
  756. STATIC
  757. PROC
  758.    KMT_DH_PROCESS_RESPONSE IS (
  759.    INT      RESULTCODE,
  760.    BOOL     PROMPT,
  761.    REF BOOL RETRY,
  762.    RESPONSE RESULT):
  763.  
  764. @******************************************************************************@
  765. @*                                                                            *@
  766. @* This procedure is used to process resultcodes returned from COSMAN and to  *@
  767. @* handle CDH events.                                                         *@
  768. @* RETRY is set TRUE if a recoverable I/O error occurs indicating that the    *@
  769. @* I/O operation should be repeated.                                          *@
  770. @* PROMPT should be set TRUE if this is an output request and read interest   *@
  771. @* is required.                                                               *@
  772. @*                                                                            *@
  773. @******************************************************************************@
  774.  
  775. BEGIN
  776.    INT PFI_REQUEST_ACCEPTED        IS -31008,
  777.        PFI_FILE_FROZEN             IS -38982,
  778.        PFI_DELAYED_TRANSFER        IS -38983,
  779.        PFI_FILE_UNAVAILABLE        IS 30978,
  780.        PFI_OVERLOAD                IS 37560,
  781.        PFI_TEMPORARILY_UNAVAILABLE IS 37561,
  782.        PFI_TIMED_OUT               IS 39854;
  783.  
  784.    INT KMT_DH_EVENT_MSG          IS 152,
  785.        KMT_DH_UNEXPECTED_BREAKIN IS 80150,
  786.        KMT_DH_UNEXPECTED_EVENT   IS 80151,
  787.        KMT_DH_INPUT_AVAILABLE    IS -80152,
  788.        KMT_DH_QUEUE_EMPTY        IS -80153;
  789.  
  790.    REF BOOL READ_INTEREST IS KMT_DH_FILE_DETAILS.READ_INTEREST;
  791.  
  792.    BOOL TRACING IS KMT_TRACE_FLAGS.DH_TRACING;
  793.  
  794.    UNLESS
  795.       READ_INTEREST
  796.    OR
  797.       RESULTCODE EQ PFI_REQUEST_ACCEPTED
  798.    OR
  799.       RESULTCODE EQ PFI_FILE_FROZEN
  800.    OR
  801.       RESULTCODE EQ PFI_DELAYED_TRANSFER
  802.    OR
  803.       RESULTCODE EQ PFI_OVERLOAD
  804.    OR
  805.       RESULTCODE EQ PFI_TEMPORARILY_UNAVAILABLE
  806.  
  807.    THEN                                          @ Unrecoverable I/O error or  @
  808.                                                  @ REPORT NORMAL TERMINATION   @
  809.                                                  @ not set                     @
  810.       READ_INTEREST := FALSE;
  811.       RESULT := RESULTCODE
  812.  
  813.    ELSE
  814.       REF () WORD EVENT_LIST IS KMT_DH_FILE_DETAILS.EVENT_LIST;
  815.  
  816.       BOOL LONG_SUSPEND IS KMT_DH_FILE_DETAILS.LONG_SUSPEND;
  817.  
  818.       PFI_REPORTS EVENT_MESSAGE;
  819.  
  820.       REF PFI_FLAGS_1S QUALIFIER_1 IS EVENT_MESSAGE.QUALIFIER_1;
  821.  
  822.       REF PFI_FLAGS_2S QUALIFIER_2 IS EVENT_MESSAGE.QUALIFIER_2;
  823.  
  824.       REF WORD PFM_CURRENCY IS KMT_DH_FILE_DETAILS.PFM_CURRENCY;
  825.  
  826.       READ_INTEREST := FALSE;
  827.       RESULT := 0;
  828.  
  829.       WHILE                                      @ Process CDH event           @
  830.         (
  831.          INT RC_DISCARDED;
  832.  
  833.          WORD EVENT_CURRENCY;
  834.  
  835.          BOOL SUSPEND := FALSE;
  836.  
  837.          RETRY := FALSE;
  838.          WAIT_FOR_EVENTS (EVENT_LIST(SIZE 1),
  839.                           EVENT_CURRENCY,
  840.                           EVENT_MESSAGE,
  841.                           LONG_SUSPEND,
  842.                           RC_DISCARDED);
  843.  
  844.          IF
  845.             TRACING
  846.  
  847.          THEN (<RARELY>)
  848.            (
  849.             () KMT_MTM_VALUES PARAMS := DISPLAY(EVENT_MESSAGE
  850.                                                 AS KMT_MTM_VALUES.RLW_VALUE);
  851.  
  852.             KMT_SP_LOG_TRACE_MESSAGE (KMT_DH_EVENT_MSG,
  853.                                       PARAMS)
  854.            )
  855.          FI;
  856.  
  857.          IF
  858.             QUALIFIER_1.DATA_LOST
  859.  
  860.          THEN
  861.             DH_DO_QUEUE_ACTION (PFM_CURRENCY,
  862.                                 0,               @ Unfreeze                    @
  863.                                 X'40000000',
  864.                                 NIL,
  865.                                 RC_DISCARDED);
  866.             RETRY := TRUE
  867.          FI;
  868.  
  869.          IF
  870.             QUALIFIER_1.FORMAT_DISTURBED
  871.  
  872.          THEN
  873.             DH_DO_QUEUE_ACTION (PFM_CURRENCY,
  874.                                 0,               @ Unfreeze                    @
  875.                                 X'20000000',
  876.                                 NIL,
  877.                                 RC_DISCARDED);
  878.             RETRY := TRUE
  879.          FI;
  880.  
  881.          IF
  882.             QUALIFIER_1.PERMANENTLY_UNAVAILABLE
  883.  
  884.          THEN
  885.             RESULT := PFI_FILE_UNAVAILABLE
  886.          FI;
  887.  
  888.          IF
  889.             QUALIFIER_1.TEMPORARILY_UNAVAILABLE
  890.  
  891.          THEN
  892.             SUSPEND := TRUE
  893.          FI;
  894.  
  895.          IF
  896.             QUALIFIER_1.GENERAL_FILE_FREEZE
  897.  
  898.          THEN
  899.             DH_DO_QUEUE_ACTION (PFM_CURRENCY,
  900.                                 0,               @ Unfreeze                    @
  901.                                 X'08000000',
  902.                                 NIL,
  903.                                 RC_DISCARDED);
  904.             RETRY := TRUE
  905.          FI;
  906.  
  907.          IF
  908.             QUALIFIER_2.FILE_TIMEOUT
  909.  
  910.          THEN
  911.             RESULT := PFI_TIMED_OUT
  912.          FI;
  913.  
  914.          UNLESS
  915.             RETRY  OR  RESULT NE 0
  916.  
  917.          THEN
  918.             CASE
  919.                EVENT_MESSAGE.REASON
  920.  
  921.             THEN                                 @ 0 - PFI_NORMAL_TERM         @
  922.                READ_INTEREST := PROMPT
  923.  
  924.             ELSE                                 @ 1 - PFI_ABNORMAL_TERM       @
  925.                RETRY := TRUE
  926.  
  927.             ELSE                                 @ 2 - PFI_ATTENTION           @
  928.                SUSPEND := TRUE
  929.  
  930.             ELSE                                 @ 3 - PFI_FILE_AVAILABLE      @
  931.                RETRY   := (RESULTCODE NE PFI_DELAYED_TRANSFER);
  932.                SUSPEND := NOT(RETRY)
  933.  
  934.             ELSE                                 @ 4 - PFI_INPUT_AVAILABLE     @
  935.                RESULT := KMT_DH_INPUT_AVAILABLE
  936.  
  937.             ELSE (<RARELY>)                      @ 5 - PFI_ACTION_KEY          @
  938.               (
  939.                RESULT := KMT_DH_UNEXPECTED_BREAKIN;
  940.                KMT_EH_LOG_ERROR (RESULT,
  941.                                  2,
  942.                                  NIL,
  943.                                  0,
  944.                                  TRUE,           @ Produce UCG dump            @
  945.                                  FALSE)          @ Recoverable                 @
  946.               )
  947.  
  948.             ELSE                                 @ 6 - PFI_PROMPT_CANCELLED    @
  949.                RETRY := TRUE
  950.  
  951.             ELSE                                 @ 7 - PFI_QUEUE_EMPTY         @
  952.                RETRY := FALSE;
  953.                RESULT := KMT_DH_QUEUE_EMPTY
  954.  
  955.             DEFAULT (<RARELY>)                   @ Unexpected event from CDH   @
  956.               (
  957.                RESULT := KMT_DH_UNEXPECTED_EVENT;
  958.                KMT_EH_LOG_ERROR (RESULT,
  959.                                  2,
  960.                                  NIL,
  961.                                  0,
  962.                                  TRUE,           @ Produce UCG dump            @
  963.                                  FALSE)          @ Recoverable                 @
  964.               )
  965.             ESAC
  966.          FI;
  967.  
  968.          SUSPEND AND RESULT EQ 0
  969.         )
  970.  
  971.       DO
  972.          SKIP
  973.       REPEAT
  974.    FI
  975. END;                                   @ KMT_DH_PROCESS_RESPONSE               @
  976.  
  977. ***PAGE
  978.  
  979. GLOBAL
  980. STATIC (<STATUS 5>)
  981. PROC
  982.    KMT_DH_OPEN_FILE IS (
  983.    RESPONSE RESULT):
  984.  
  985. @******************************************************************************@
  986. @*                                                                            *@
  987. @* This procedure is used to assign, connect and open an interactive file     *@
  988. @* with read and write capability.                                            *@
  989. @* The interactive file is assigned to the slow file description :STD.STDMAC  *@
  990. @* and uses code set 255 (transparent 7-bit ISO).                             *@
  991. @* The file will be used for the exchange of KERMIT packets.                  *@
  992. @*                                                                            *@
  993. @******************************************************************************@
  994.  
  995. BEGIN
  996.  
  997.    INT KMT_EH_SOFTWARE_ERROR IS 80101;
  998.  
  999.    REF LONG INT FILE_CURRENCY IS KMT_DH_FILE_DETAILS.FILE_CURRENCY;
  1000.  
  1001.    REF WORD PFM_CURRENCY IS KMT_DH_FILE_DETAILS.PFM_CURRENCY;
  1002.  
  1003.    REF () WORD EVENT_LIST IS KMT_DH_FILE_DETAILS.EVENT_LIST;
  1004.  
  1005.    IF
  1006.      (
  1007.       () BYTE NAME   := ":STD.STDMAC",
  1008.               ACCESS := "W",
  1009.               LEVEL  := "R",
  1010.               LOCK   := "",
  1011.               REUSE  := "NO",
  1012.               DNAME  := "ICL9NINTDEVICE";
  1013.  
  1014.        () REF () BYTE DNAMES := DISPLAY (DNAME);
  1015.  
  1016.        ASSIGN_FILE (NAME,
  1017.                     FILE_CURRENCY,
  1018.                     ACCESS,
  1019.                     LEVEL,
  1020.                     LOCK,
  1021.                     REUSE,
  1022.                     -5,
  1023.                     -5,
  1024.                     0,
  1025.                     DNAMES,
  1026.                     RESULT);
  1027.       RESULT LE 0
  1028.      )
  1029.  
  1030.    AND
  1031.      (
  1032.       CONNECT_EVENT (0,
  1033.                      X"C0",
  1034.                      X"C0",
  1035.                      EVENT_LIST(0),
  1036.                      0,
  1037.                      0,
  1038.                      RESULT);
  1039.       RESULT LE 0
  1040.      )
  1041.  
  1042.    AND
  1043.      (
  1044.       () BYTE DETAILS_SUPPLIED := X"CE080000000000000000";
  1045.  
  1046.       EVENT_LIST(1) := EVENT_LIST(0);
  1047.       DETAILS_SUPPLIED(2 SIZE 4) := 4-BYTE: EVENT_LIST(0);
  1048.       DETAILS_SUPPLIED(6 SIZE 4) := 4-BYTE: EVENT_LIST(1);
  1049.       BI_CONNECT_FILE (FILE_CURRENCY,
  1050.                        PFM_CURRENCY,
  1051.                        KMT_DH_FILE_DETAILS.CONNECTION_CURRENCY,
  1052.                        DETAILS_SUPPLIED,
  1053.                        NIL,
  1054.                        NIL,
  1055.                        RESULT);
  1056.       RESULT LE 0
  1057.      )
  1058.  
  1059.    AND
  1060.      (
  1061.       INT FILE_CLASS IS 11,                      @ PFI_INTERACTIVE             @
  1062.           CODE_SET   IS 255,                     @ Transparent 7-bit ISO       @
  1063.           TIME_OUT   IS 0;                       @ No TIMEOUT ie indefinite    @
  1064.                                                  @ wait                        @
  1065.  
  1066.       PFI_FILE_FLAGS FILE_FLAGS IS X'03000000';
  1067.                                                  @ Inhibit space truncation    @
  1068.                                                  @ Inhibit space compression   @
  1069.  
  1070.       () PFI_PARAMETER_PAIRS PARAMS :=
  1071.             ((X'00', FILE_CLASS  AS PFI_PARAMETER_VALUES.INT_VALUE),
  1072.              (X'01', CODE_SET    AS PFI_PARAMETER_VALUES.INT_VALUE),
  1073.              (X'02', FILE_FLAGS  AS PFI_PARAMETER_VALUES.FILE_FLAGS),
  1074.              (X'18', TIME_OUT    AS PFI_PARAMETER_VALUES.INT_VALUE)
  1075.             );
  1076.  
  1077.       KMT_DH_FILE_DETAILS.READ_INTEREST := FALSE;
  1078.  
  1079.       WHILE
  1080.         (
  1081.          BOOL RETRY;
  1082.  
  1083.          DH_DEFINE_FILE_PROPERTIES (PFM_CURRENCY,
  1084.                                     PARAMS,
  1085.                                     RESULT);
  1086.          KMT_DH_PROCESS_RESPONSE (RESULT,
  1087.                                   FALSE,
  1088.                                   RETRY,
  1089.                                   RESULT);
  1090.          RETRY
  1091.         )
  1092.  
  1093.       DO
  1094.          SKIP
  1095.       REPEAT;
  1096.       RESULT LE 0
  1097.      )
  1098.  
  1099.    AND                                           @ Timeout intervals may be    @
  1100.                                                  @ set in multiples of 2       @
  1101.                                                  @ minutes using the PFI.      @
  1102.                                                  @ We need to be able to set   @
  1103.                                                  @ timeout intervals in the    @
  1104.                                                  @ order of 5 to 30 seconds.   @
  1105.                                                  @ Therefore we must set up    @
  1106.                                                  @ our own timer channel.      @
  1107.      (
  1108.       CREATE_TIMER_CHANNEL (EVENT_LIST(0),
  1109.                             KMT_DH_FILE_DETAILS.TIMER_CHANNEL,
  1110.                             RESULT);
  1111.       RESULT LE 0
  1112.      )
  1113.  
  1114.    THEN                                          @ File opened successfully    @
  1115.       () WORD PROPERTIES := (104,                @ Maximum record size         @
  1116.                              0,
  1117.                              0);
  1118.  
  1119.       () BYTE DETAILS_REQUIRED := X"49"          @ Line length                 @
  1120.                                   X"51";         @ Suspension advice           @
  1121.  
  1122.       (6) BYTE DETAILS_AREA;
  1123.  
  1124.       KMT_DH_DEVICE_DETAILS.MAX_INPUT_LENGTH := IF
  1125.                                                   (
  1126.                                                    CTM_READ_DESC (FILE_CURRENCY,
  1127.                                                                   NIL,
  1128.                                                                   NIL,
  1129.                                                                   PROPERTIES,
  1130.                                                                   RESULT);
  1131.                                                    RESULT EQ 0
  1132.                                                   )
  1133.                                                 THEN
  1134.                                                    PROPERTIES(1)
  1135.                                                 ELSE
  1136.                                                    80
  1137.                                                 FI;
  1138.  
  1139.       DH_GIVE_FILE_DETAILS (PFM_CURRENCY,
  1140.                             DETAILS_REQUIRED,
  1141.                             DETAILS_AREA,
  1142.                             NIL,
  1143.                             RESULT);
  1144.  
  1145.       IF
  1146.          RESULT EQ 0
  1147.  
  1148.       THEN
  1149.          KMT_DH_DEVICE_DETAILS.MAX_OUTPUT_LENGTH := DETAILS_AREA(2);
  1150.          KMT_DH_FILE_DETAILS.LONG_SUSPEND := BIT:DETAILS_AREA(5)
  1151.  
  1152.       ELSE
  1153.          KMT_DH_DEVICE_DETAILS.MAX_OUTPUT_LENGTH := 80;
  1154.          KMT_DH_FILE_DETAILS.LONG_SUSPEND := TRUE
  1155.       FI
  1156.    FI;
  1157.  
  1158.    IF
  1159.       RESULT GT 0
  1160.  
  1161.    THEN (<RARELY>)                               @ Open error                  @
  1162.      (
  1163.       () BYTE PROC_NAME := "KMT_DH_OPEN_FILE";
  1164.  
  1165.       () KMT_MTM_VALUES PARAMS := DISPLAY(PROC_NAME
  1166.                                           AS KMT_MTM_VALUES.RVB_VALUE);
  1167.  
  1168.       KMT_DH_DEVICE_DETAILS.FILE_OPEN := FALSE;
  1169.       KMT_EH_LOG_ERROR (RESULT,
  1170.                         2,
  1171.                         PARAMS,
  1172.                         0,
  1173.                         FALSE,
  1174.                         FALSE);
  1175.       RESULT := KMT_EH_SOFTWARE_ERROR
  1176.      )
  1177.  
  1178.    ELSE                                          @ Ignore warnings             @
  1179.       KMT_DH_DEVICE_DETAILS.FILE_OPEN := TRUE;
  1180.       RESULT := 0
  1181.    FI
  1182. END;                                   @ KMT_DH_OPEN_FILE                      @
  1183.  
  1184. ***PAGE
  1185.  
  1186. GLOBAL
  1187. STATIC (<STATUS 5>)
  1188. PROC
  1189.    KMT_DH_CLOSE_FILE IS (
  1190.    RESPONSE RESULT):
  1191.  
  1192. @******************************************************************************@
  1193. @*                                                                            *@
  1194. @* This procedure is used to close the file previously opened by the          *@
  1195. @* procedure KMT_DH_OPEN_FILE.                                                *@
  1196. @*                                                                            *@
  1197. @******************************************************************************@
  1198.  
  1199. BEGIN
  1200.  
  1201.    INT KMT_EH_SOFTWARE_ERROR IS 80101;
  1202.  
  1203.    REF BOOL FILE_OPEN IS KMT_DH_DEVICE_DETAILS.FILE_OPEN;
  1204.  
  1205.    RESULT := 0;
  1206.  
  1207.    IF
  1208.       FILE_OPEN
  1209.  
  1210.    THEN                                          @ File open, close it         @
  1211.       INT RC_DISCARDED;
  1212.  
  1213.       IF
  1214.         (
  1215.          () BYTE DETAILS_SUPPLIED := DISPLAY (181,@ FC_TI_ACTION_TYPE          @
  1216.                                               1,  @ Length                     @
  1217.                                               40);@ FC_DI_DISCONNECT           @
  1218.  
  1219.          BI_MODIFY_CONNECTION (KMT_DH_FILE_DETAILS.CONNECTION_CURRENCY,
  1220.                                DETAILS_SUPPLIED,
  1221.                                NIL,
  1222.                                NIL,
  1223.                                RESULT);
  1224.          RESULT GT 0
  1225.         )
  1226.  
  1227.       THEN (<RARELY>)                            @ Close error                 @
  1228.         (
  1229.          () BYTE PROC_NAME := "KMT_DH_CLOSE_FILE";
  1230.  
  1231.          () KMT_MTM_VALUES PARAMS := DISPLAY(PROC_NAME
  1232.                                              AS KMT_MTM_VALUES.RVB_VALUE);
  1233.  
  1234.          KMT_EH_LOG_ERROR (RESULT,
  1235.                            2,
  1236.                            PARAMS,
  1237.                            0,
  1238.                            FALSE,
  1239.                            FALSE);
  1240.          RESULT := KMT_EH_SOFTWARE_ERROR
  1241.         )
  1242.  
  1243.       ELSE                                       @ Ignore warnings             @
  1244.          RESULT := 0
  1245.       FI;
  1246.  
  1247.       FILE_OPEN := FALSE;
  1248.    FI
  1249. END;                                   @ KMT_DH_CLOSE_FILE                     @
  1250.  
  1251. ***PAGE
  1252.  
  1253. GLOBAL
  1254. STATIC (<STATUS 5>)
  1255. PROC
  1256.    KMT_DH_OUTPUT IS (
  1257.    REF () BYTE OUTPUT_PACKET,
  1258.    BOOL        PROMPT,
  1259.    RESPONSE    RESULT):
  1260.  
  1261. @******************************************************************************@
  1262. @*                                                                            *@
  1263. @* This procedure is used to send a KERMIT packet to the remote end.  The     *@
  1264. @* end of line terminating character and any padding characters are added and *@
  1265. @* the required parity is set.                                                *@
  1266. @* OUTPUT_PACKET references an area containing the packet to be output.       *@
  1267. @* If the length of the output packet is zero then a single 'PAD' character   *@
  1268. @* is output. If PROMPT is set true then the procedure will set read          *@
  1269. @* interest on the file for the next call to KMT_DH_INPUT.                    *@
  1270. @*                                                                            *@
  1271. @******************************************************************************@
  1272.  
  1273. BEGIN
  1274.  
  1275. ***PAGE
  1276.  
  1277. SIM
  1278. PROC
  1279.    KMT_DH_SET_PARITY IS (
  1280.    REF () BYTE BUFFER):
  1281.  
  1282. @******************************************************************************@
  1283. @*                                                                            *@
  1284. @* This procedure is used to set the required parity for each byte contained  *@
  1285. @* in BUFFER.                                                                 *@
  1286. @*                                                                            *@
  1287. @******************************************************************************@
  1288.  
  1289. BEGIN
  1290.    WORD PARITY IS KMT_DH_DEVICE_DETAILS.OUTPUT_PARITY;
  1291.  
  1292.    IF
  1293.       PARITY LE 1
  1294.  
  1295.    THEN                                          @ Even or odd parity required @
  1296.       BYTE INITIAL_PARITY_MASK IS IF
  1297.                                      PARITY EQ 0
  1298.                                   THEN           @ Even parity                 @
  1299.                                      X"80"
  1300.                                   ELSE           @ Odd parity                  @
  1301.                                      X"00"
  1302.                                   FI;
  1303.  
  1304.       FOR I
  1305.       TO  BOUND BUFFER
  1306.       DO
  1307.          BYTE PARITY_MASK := INITIAL_PARITY_MASK;
  1308.  
  1309.          WORD THIS_BYTE := BUFFER(I) & X"7F";
  1310.  
  1311.          WHILE
  1312.            (
  1313.             INT NUM_BITS_SHIFTED;
  1314.  
  1315.             THIS_BYTE := SHWZ (THIS_BYTE,
  1316.                                NUM_BITS_SHIFTED);
  1317.             THIS_BYTE NE 0
  1318.            )
  1319.          DO
  1320.             PARITY_MASK := PARITY_MASK NEQ X"80";
  1321.             THIS_BYTE := THIS_BYTE & X'7F000000'
  1322.          REPEAT;
  1323.  
  1324.          BUFFER(I) := BUFFER(I) ! PARITY_MASK
  1325.       REPEAT
  1326.  
  1327.    ELSF
  1328.       PARITY EQ 2
  1329.  
  1330.    THEN                                          @ Mark parity                 @
  1331.       ORBYTE (X"80",
  1332.               BUFFER,
  1333.               0,
  1334.               NIL)
  1335.  
  1336.    ELSF
  1337.       PARITY EQ 3
  1338.  
  1339.    THEN                                          @ Space parity                @
  1340.       ANDBYTE (X"7F",
  1341.                BUFFER,
  1342.                0,
  1343.                NIL)
  1344.    FI
  1345. END;                                   @ KMT_DH_SET_PARITY                     @
  1346.  
  1347. ***PAGE
  1348.  
  1349.    INT PFI_REQUEST_ACCEPTED IS -31008,
  1350.        PFI_TIMED_OUT        IS 39854;
  1351.  
  1352.    INT KMT_DH_DATA_OUT_MSG    IS 151,
  1353.        KMT_DH_INPUT_AVAILABLE IS -80152,
  1354.        KMT_DH_QUEUE_EMPTY     IS -80153;
  1355.  
  1356.    INT KMT_EH_SOFTWARE_ERROR  IS 80101;
  1357.  
  1358.    INT NPAD IS KMT_PP_REMOTE_CONFG_PARAMS.NPAD;
  1359.  
  1360.    INT OUTPUT_PACKET_LENGTH IS IF
  1361.                                   OUTPUT_PACKET IS NIL
  1362.                                THEN
  1363.                                   0
  1364.                                ELSE
  1365.                                   LENGTH OUTPUT_PACKET
  1366.                                FI;
  1367.  
  1368.    INT OUTPUT_BUFFER_LENGTH IS IF
  1369.                                   OUTPUT_PACKET_LENGTH EQ 0
  1370.                                THEN
  1371.                                   1
  1372.                                ELSE
  1373.                                   OUTPUT_PACKET_LENGTH + NPAD + 1
  1374.                                FI;
  1375.  
  1376.    PFI_OUTPUT_CONTROLS CONTROL IS IF
  1377.                                      PROMPT
  1378.                                   THEN           @ Report normal termination   @
  1379.                                                  @ Prompt                      @
  1380.                                      X'60000000'
  1381.                                   ELSE           @ Report normal termination   @
  1382.                                      X'40000000'
  1383.                                   FI;
  1384.  
  1385.    WORD PFM_CURRENCY IS KMT_DH_FILE_DETAILS.PFM_CURRENCY;
  1386.  
  1387.    (OUTPUT_BUFFER_LENGTH) BYTE OUTPUT_BUFFER;
  1388.  
  1389.    BOOL TRACING IS KMT_TRACE_FLAGS.DH_TRACING;
  1390.  
  1391.    INT RC_DISCARDED;
  1392.  
  1393.    IF
  1394.       OUTPUT_PACKET_LENGTH EQ 0
  1395.  
  1396.    THEN                                          @ No packet supplied,         @
  1397.                                                  @ output single PAD character @
  1398.       OUTPUT_BUFFER := KMT_PP_REMOTE_CONFG_PARAMS.PADC;
  1399.  
  1400.    ELSE                                          @ Build output data buffer    @
  1401.                                                  @ consisting of the required  @
  1402.                                                  @ number of PAD characters,   @
  1403.                                                  @ the packet and the          @
  1404.                                                  @ end of line terminating     @
  1405.                                                  @ character                   @
  1406.       INT EOL IS IF KMT_PP_REMOTE_CONFG_PARAMS.EOL = X"0D"   @ ASG converts CR @
  1407.                  THEN X"0A"     @ to NULL, LF to CRLF - fix also works via NIC @
  1408.                  ELSE KMT_PP_REMOTE_CONFG_PARAMS.EOL
  1409.                  FI;
  1410.       MOVEBYTE (KMT_PP_REMOTE_CONFG_PARAMS.PADC,
  1411.                 OUTPUT_BUFFER(SIZE NPAD),
  1412.                 0,
  1413.                 NIL);
  1414.       OUTPUT_BUFFER(NPAD SIZE OUTPUT_PACKET_LENGTH) := OUTPUT_PACKET;
  1415.       OUTPUT_BUFFER(OUTPUT_BUFFER_LENGTH - 1) := EOL
  1416.    FI;
  1417.  
  1418.    KMT_DH_SET_PARITY (OUTPUT_BUFFER);
  1419.  
  1420.    CTM_WAIT_TIME (KMT_DH_DEVICE_DETAILS.PAUSE,  @ Wait before sending packet   @
  1421.                   RC_DISCARDED);
  1422.  
  1423.    WHILE
  1424.      (
  1425.       BOOL RETRY;
  1426.  
  1427.                                                  @ Ensure no I/O requests are  @
  1428.                                                  @ outstanding                 @
  1429.       DH_DO_QUEUE_ACTION (PFM_CURRENCY,
  1430.                           5,                     @ PFI_ABORT_QUEUE             @
  1431.                           0,
  1432.                           NIL,
  1433.                           RESULT);
  1434.  
  1435.       WHILE
  1436.         (
  1437.          KMT_DH_PROCESS_RESPONSE (RESULT,
  1438.                                   FALSE,
  1439.                                   RETRY,
  1440.                                   RESULT);
  1441.             RETRY
  1442.          OR
  1443.             (RESULT EQ KMT_DH_INPUT_AVAILABLE)
  1444.          OR
  1445.             (RESULT EQ PFI_TIMED_OUT)
  1446.         )
  1447.       DO
  1448.          RESULT := PFI_REQUEST_ACCEPTED
  1449.       REPEAT;
  1450.  
  1451.       IF
  1452.          RESULT EQ KMT_DH_QUEUE_EMPTY
  1453.  
  1454.       THEN                                       @ File queue empty            @
  1455.          RESULT := 0
  1456.       FI;
  1457.  
  1458.       IF
  1459.          RESULT LE 0
  1460.  
  1461.       THEN                                       @ File queue emptied          @
  1462.                                                  @ successfilly                @
  1463.          IF
  1464.             TRACING
  1465.  
  1466.          THEN (<RARELY>)
  1467.            (
  1468.             () KMT_MTM_VALUES PARAMS := DISPLAY(OUTPUT_BUFFER
  1469.                                                 AS KMT_MTM_VALUES.RVB_VALUE);
  1470.  
  1471.             KMT_SP_LOG_TRACE_MESSAGE (KMT_DH_DATA_OUT_MSG,
  1472.                                       PARAMS)
  1473.            )
  1474.          FI;
  1475.  
  1476.          DH_OUTPUT (PFM_CURRENCY,                @ Send output data            @
  1477.                     0,
  1478.                     OUTPUT_BUFFER,
  1479.                     CONTROL,
  1480.                     RESULT);
  1481.          KMT_DH_PROCESS_RESPONSE (RESULT,        @ Check if successful         @
  1482.                                   PROMPT,
  1483.                                   RETRY,
  1484.                                   RESULT);
  1485.       FI;
  1486.  
  1487.       RETRY
  1488.      )
  1489.    DO
  1490.       SKIP
  1491.    REPEAT;
  1492.  
  1493.    IF
  1494.       RESULT GT 0
  1495.  
  1496.    THEN (<RARELY>)                               @ I/O error                   @
  1497.      (
  1498.       () BYTE PROC_NAME := "KMT_DH_OUTPUT";
  1499.  
  1500.       () KMT_MTM_VALUES PARAMS := DISPLAY(PROC_NAME
  1501.                                           AS KMT_MTM_VALUES.RVB_VALUE);
  1502.  
  1503.       KMT_EH_LOG_ERROR (RESULT,
  1504.                         2,
  1505.                         PARAMS,
  1506.                         0,
  1507.                         FALSE,
  1508.                         FALSE);
  1509.       RESULT := KMT_EH_SOFTWARE_ERROR
  1510.      )
  1511.  
  1512.    ELSE                                          @ Ignore warnings             @
  1513.       RESULT := 0
  1514.    FI
  1515. END;                                   @ KMT_DH_OUTPUT                         @
  1516.  
  1517. ***PAGE
  1518.  
  1519. GLOBAL
  1520. STATIC (<STATUS 5>)
  1521. PROC
  1522.    KMT_DH_INPUT IS (
  1523.    REF () BYTE INPUT_BUFFER,
  1524.    REF INT     INPUT_BUFFER_LENGTH,
  1525.    RESPONSE    RESULT):
  1526.  
  1527. @******************************************************************************@
  1528. @*                                                                            *@
  1529. @* This procedure is used to receive an input buffer from the remote end.     *@
  1530. @* The input buffer may or may not contain a valid KERMIT packet.             *@
  1531. @* The input buffer and length are returned in the areas referenced by        *@
  1532. @* INPUT_BUFFER and INPUT_BUFFER_LENGTH respectively.                         *@
  1533. @*                                                                            *@
  1534. @******************************************************************************@
  1535.  
  1536. BEGIN
  1537. ***PAGE
  1538.  
  1539. SIM
  1540. PROC
  1541.    KMT_DH_REMOVE_PARITY IS (
  1542.    REF () BYTE BUFFER):
  1543.  
  1544. @******************************************************************************@
  1545. @*                                                                            *@
  1546. @* This procedure is used to remove the parity bit (if present) for each byte *@
  1547. @* in BUFFER.                                                                 *@
  1548. @*                                                                            *@
  1549. @******************************************************************************@
  1550.  
  1551. BEGIN
  1552.                                                  @ Clear parity bit            @
  1553.    ANDBYTE (X"7F",                               @ 7 bit IA5                   @
  1554.             BUFFER,
  1555.             0,
  1556.             NIL)
  1557. END;                                   @ KMT_DH_REMOVE_PARITY                  @
  1558.  
  1559. ***PAGE
  1560.  
  1561.    INT TIM_NO_NOTIFICATIONS  IS -32156,
  1562.        PFI_MESSAGE_CANCELLED IS 38575,
  1563.        PFI_TIMED_OUT         IS 39854;
  1564.  
  1565.    INT KMT_DH_DATA_IN_MSG     IS 150,
  1566.        KMT_EH_SOFTWARE_ERROR  IS 80101,
  1567.        KMT_DH_INPUT_AVAILABLE IS -80152;
  1568.  
  1569.    PFI_INPUT_RETURNS INPUT_RETURN;
  1570.  
  1571.    BOOL TRACING IS KMT_TRACE_FLAGS.DH_TRACING;
  1572.  
  1573.    WORD TIMER_CHANNEL IS KMT_DH_FILE_DETAILS.TIMER_CHANNEL;
  1574.  
  1575.    WORD TIME IS IF DELAY_TIMER
  1576.                 THEN DELAY
  1577.                 ELSE KMT_PP_REMOTE_CONFG_PARAMS.TIME
  1578.                 FI;
  1579.  
  1580.    IF
  1581.      (
  1582.       RESULT := 0;
  1583.  
  1584.       UNLESS
  1585.          KMT_DH_FILE_DETAILS.READ_INTEREST
  1586.  
  1587.       THEN                                       @ Read interest not set.      @
  1588.                                                  @ Set read interest           @
  1589.          KMT_DH_OUTPUT (NIL,
  1590.                         TRUE,
  1591.                         RESULT)
  1592.        FI;
  1593.  
  1594.        RESULT LE 0
  1595.      )
  1596.  
  1597.    AND
  1598.      (
  1599.       IF
  1600.          TIME NE 0
  1601.  
  1602.       THEN                                       @ Timeout intervals may be    @
  1603.                                                  @ set in multiples of 2       @
  1604.                                                  @ minutes using the PFI.      @
  1605.                                                  @ We need to be able to set   @
  1606.                                                  @ timeout intervals in the    @
  1607.                                                  @ order of 5 to 30 seconds.   @
  1608.                                                  @ Therefore we must set up    @
  1609.                                                  @ our own timer channel.      @
  1610.  
  1611.          LONG INT TIME_IN_MSECS IS (L'I'TIME) * 1000000;
  1612.  
  1613.          ESTABLISH_TIMER_NOTIFICATION (TIMER_CHANNEL,
  1614.                                        X'00000000 00100000',
  1615.                                                  @ File timeout                @
  1616.                                                  @ Make it look like a PFI     @
  1617.                                                  @ timeout                     @
  1618.                                        TIME_IN_MSECS + I'CLOCKTIME (),
  1619.                                        TRUE,
  1620.                                        FALSE,
  1621.                                        RESULT)
  1622.       FI;
  1623.  
  1624.       RESULT LE 0
  1625.      )
  1626.  
  1627.    AND
  1628.      (
  1629.       INT RC_DISCARDED;
  1630.  
  1631.       BOOL RETRY;
  1632.  
  1633.       KMT_DH_PROCESS_RESPONSE (RESULT,           @ Wait for PFI event          @
  1634.                                FALSE,
  1635.                                RETRY,
  1636.                                RESULT);
  1637.       IF
  1638.          (TIME NE 0)  AND  (RESULT NE PFI_TIMED_OUT)
  1639.  
  1640.       AND                                        @ Timeout set but timeout     @
  1641.         (                                        @ event did not occur.        @
  1642.                                                  @ Turn off timer.             @
  1643.          CANCEL_TIMER_NOTIFICATION (TIMER_CHANNEL,
  1644.                                     RC_DISCARDED);
  1645.          RC_DISCARDED EQ TIM_NO_NOTIFICATIONS
  1646.         )
  1647.  
  1648.  
  1649.       THEN                                       @ Timeout event occurred      @
  1650.                                                  @ after PFI event but before  @
  1651.                                                  @ the timer could be          @
  1652.                                                  @ cancelled.                  @
  1653.                                                  @ Read the timeout event and  @
  1654.                                                  @ discarded it.               @
  1655.          LONG WORD EVENT_MESSAGE;
  1656.  
  1657.          INT REPLY;
  1658.  
  1659.          READ_EVENT (KMT_DH_FILE_DETAILS.EVENT_LIST(0),
  1660.                      EVENT_MESSAGE,
  1661.                      REPLY,
  1662.                      RC_DISCARDED)
  1663.       FI;
  1664.  
  1665.       RESULT EQ KMT_DH_INPUT_AVAILABLE
  1666.      )
  1667.  
  1668.    AND
  1669.      (
  1670.       WORD PFM_CURRENCY IS KMT_DH_FILE_DETAILS.PFM_CURRENCY;
  1671.  
  1672.       DH_INPUT (PFM_CURRENCY,                    @ Get input data              @
  1673.                 0,
  1674.                 INPUT_BUFFER,
  1675.                 INPUT_RETURN,
  1676.                 RESULT);
  1677.       RESULT LE 0
  1678.      )
  1679.  
  1680.    THEN                                          @ Input data read             @
  1681.       INPUT_BUFFER_LENGTH := INPUT_RETURN.DATA_LENGTH;
  1682.  
  1683.       IF
  1684.          (INPUT_BUFFER(INPUT_BUFFER_LENGTH - 1) & X"7F") EQ X"1E"
  1685.  
  1686.       THEN                                       @ Via a PAD and using         @
  1687.                                                  @ code set 255 RS (X1E) is    @
  1688.                                                  @ appended to the end of the  @
  1689.                                                  @ record by VME. Ignore it.   @
  1690.          INPUT_BUFFER_LENGTH := INPUT_BUFFER_LENGTH - 1
  1691.       FI;
  1692.  
  1693.       IF
  1694.          TRACING
  1695.  
  1696.       THEN (<RARELY>)
  1697.         (
  1698.          () KMT_MTM_VALUES PARAMS := DISPLAY(INPUT_BUFFER(SIZE
  1699.                                                           INPUT_BUFFER_LENGTH)
  1700.                                              AS KMT_MTM_VALUES.RVB_VALUE);
  1701.  
  1702.          KMT_SP_LOG_TRACE_MESSAGE (KMT_DH_DATA_IN_MSG,
  1703.                                    PARAMS)
  1704.         )
  1705.       FI;
  1706.  
  1707.       KMT_DH_REMOVE_PARITY (INPUT_BUFFER(SIZE INPUT_BUFFER_LENGTH));
  1708.  
  1709.    ELSE
  1710.       INPUT_BUFFER_LENGTH := 0
  1711.    FI;
  1712.  
  1713.    IF
  1714.       RESULT EQ PFI_MESSAGE_CANCELLED
  1715.  
  1716.    THEN                                          @ 'CANCEL' key, ignore RC     @
  1717.       RESULT := 0
  1718.    FI;
  1719.  
  1720.    IF
  1721.       (RESULT GT 0) AND (RESULT NE PFI_TIMED_OUT)
  1722.  
  1723.    THEN (<RARELY>)                               @ I/O error                   @
  1724.      (
  1725.       () BYTE PROC_NAME := "KMT_DH_INPUT";
  1726.  
  1727.       () KMT_MTM_VALUES PARAMS := DISPLAY(PROC_NAME
  1728.                                           AS KMT_MTM_VALUES.RVB_VALUE);
  1729.  
  1730.       KMT_EH_LOG_ERROR (RESULT,
  1731.                         2,
  1732.                         PARAMS,
  1733.                         0,
  1734.                         FALSE,
  1735.                         FALSE);
  1736.       RESULT := KMT_EH_SOFTWARE_ERROR
  1737.      )
  1738.  
  1739.    ELSF
  1740.       RESULT LE 0
  1741.  
  1742.    THEN                                          @ Ignore warnings             @
  1743.       RESULT := 0
  1744.    FI
  1745. END;                                   @ KMT_DH_INPUT                          @
  1746.  
  1747. ENDMODULE                              @ KMT_DH_MODULE                         @
  1748. $$$$ KMT_EH_MODULE
  1749. MODULE KMT_EH_MODULE;
  1750.  
  1751. @******************************************************************************@
  1752. @*                                                                            *@
  1753. @* Mode definitions                                                           *@
  1754. @*                                                                            *@
  1755. @******************************************************************************@
  1756.  
  1757. MODE
  1758. KMT_MTM_VALUES IS ANY (
  1759.    LONG WORD          LW_VALUE,
  1760.    LONG INT           LI_VALUE,
  1761.    REF WORD           RW_VALUE,
  1762.    REF INT            RI_VALUE,
  1763.    REF LONG WORD      RLW_VALUE,
  1764.    REF LONG INT       RLI_VALUE,
  1765.    REF () BYTE        RVB_VALUE,
  1766.    REF () REF () BYTE RVRVB_VALUE);
  1767.  
  1768. ***PAGE
  1769.  
  1770. @******************************************************************************@
  1771. @*                                                                            *@
  1772. @* External procedure references                                              *@
  1773. @*                                                                            *@
  1774. @******************************************************************************@
  1775.  
  1776. EXT (<PREFIX "ICLCTM">)
  1777. PROC
  1778.    (INT,                                         @ ERROR_NUMBER                @
  1779.     REF () BYTE,                                 @ ERROR_MESSAGE               @
  1780.     REF INT,                                     @ MESSAGE_LENGTH              @
  1781.     RESPONSE                                     @ RESPONSE                    @
  1782.    )                                   CTM_GIVE_ERROR_MSG;
  1783.  
  1784. EXT (<PREFIX "ICLCTM">)
  1785. PROC
  1786.    (WORD,                                        @ TYPE                        @
  1787.     WORD,                                        @ DESTINATION                 @
  1788.     REF () BYTE,                                 @ MESSAGE                     @
  1789.     RESPONSE                                     @ RESPONSE                    @
  1790.    )                                   CTM_LOG;
  1791.  
  1792. EXT (<PREFIX "ICLCTM">)
  1793. PROC
  1794.    (LONG LONG WORD,                              @ TARGET_RESPONSE             @
  1795.     INT                                          @ RESPONSE_TO_CTM_JS_CALL     @
  1796.     )                                  CTM_STOP;
  1797.  
  1798. EXT (<PREFIX "ICLCTM">)
  1799. PROC
  1800.    (LONG WORD,                                   @ MESSAGE                     @
  1801.     WORD,                                        @ FRAMES                      @
  1802.     WORD,                                        @ PLTS                        @
  1803.     REF () LONG WORD,                            @ ADDRESSES                   @
  1804.     REF () REF () BYTE,                          @ AREAS                       @
  1805.     WORD,                                        @ OPTIONS                     @
  1806.     RESPONSE                                     @ RESPONSE                    @
  1807.    )                                   CTM_DUMP;
  1808.  
  1809. EXT (<PREFIX "ICLCTM">)
  1810. PROC
  1811.    (WORD,                                        @ CONTINGENCY_CLASS           @
  1812.     LONG WORD,                                   @ INTERRUPT_PROCEDURE         @
  1813.     RESPONSE                                     @ RESPONSE                    @
  1814.    )                                   CTM_INFORM;
  1815.  
  1816. EXT
  1817. PROC
  1818.    (INT,                                         @ TEXT_NUMBER                 @
  1819.     REF () KMT_MTM_VALUES                        @ AREA                        @
  1820.    ) INT                               KMT_SP_MTM;
  1821.  
  1822. ***PAGE
  1823.  
  1824. @******************************************************************************@
  1825. @*                                                                            *@
  1826. @* External data references                                                   *@
  1827. @*                                                                            *@
  1828. @******************************************************************************@
  1829.  
  1830. @ Constants: @
  1831. @ ********** @
  1832.  
  1833. ***LINES(4)
  1834.  
  1835. @ Variables: @
  1836. @ ********** @
  1837.  
  1838. EXT
  1839. REF () BYTE KMT_DATA_AREA;
  1840.  
  1841. ***LINES(4)
  1842.  
  1843. @ Results: @
  1844. @ ******** @
  1845.  
  1846. ***LINES(4)
  1847.  
  1848. ***PAGE
  1849.  
  1850. @******************************************************************************@
  1851. @*                                                                            *@
  1852. @* Procedure declarations                                                     *@
  1853. @*                                                                            *@
  1854. @******************************************************************************@
  1855.  
  1856. GLOBAL
  1857. STATIC (<STATUS 5>)
  1858. PROC
  1859.    KMT_EH_LOG_ERROR IS (
  1860.    INT                    RESULTCODE,
  1861.    WORD                   DESTINATION,
  1862.    REF () KMT_MTM_VALUES PARAMS,
  1863.    LONG WORD              PE_CONTINGENCY_MESSAGE,
  1864.    BOOL                   DUMP,
  1865.    BOOL                   UNRECOVERABLE):
  1866.  
  1867. @******************************************************************************@
  1868. @*                                                                            *@
  1869. @* This procedure is used to log failing resultcodes to the job journal       *@
  1870. @* and/or to the MAC screen and to produce UCG dumps.                         *@
  1871. @* If RESULTCODE is non zero then a failure message will be generated using   *@
  1872. @* the parameters in the list referenced by PARAMS and logged to the job      *@
  1873. @* journal.                                                                   *@
  1874. @* If DUMP is set TRUE then a UCG dump is produced. PE_CONTINGENCY_MESSAGE is *@
  1875. @* used in conjunction with DUMP and must contain either zero or a program    *@
  1876. @* error contingency message.                                                 *@
  1877. @* If UNRECOVERABLE is set TRUE then the program will exit.                   *@
  1878. @*                                                                            *@
  1879. @******************************************************************************@
  1880.  
  1881. BEGIN
  1882.    INT KMT_EH_SOFTWARE_ERROR IS 80101,
  1883.        KMT_EH_ICL_RESULT     IS 80102;
  1884.  
  1885.    INT RC_DISCARDED,
  1886.        MESSAGE_LENGTH;
  1887.  
  1888.    (120) BYTE ERROR_MESSAGE;
  1889.  
  1890.    REF () BYTE MESSAGE_REM;
  1891.  
  1892.    UNLESS
  1893.       RESULTCODE EQ 0
  1894.  
  1895.    THEN
  1896.       INT RC IS IF
  1897.                    RESULTCODE LT 0
  1898.                 THEN
  1899.                    -RESULTCODE
  1900.                 ELSE
  1901.                    RESULTCODE
  1902.                 FI;
  1903.  
  1904.       BOOL ICL_RESULTCODE IS ((RC LT 80000) OR (RC GT 89999));
  1905.  
  1906.       INT PARAMS_LENGTH IS IF
  1907.                               PARAMS IS NIL
  1908.                            THEN
  1909.                               0
  1910.                            ELSE
  1911.                               LENGTH PARAMS
  1912.                            FI;
  1913.  
  1914.       INT MTM_AREA_LENGTH IS PARAMS_LENGTH + IF
  1915.                                                 ICL_RESULTCODE
  1916.                                              THEN
  1917.                                                 5
  1918.                                              ELSE
  1919.                                                 4
  1920.                                               FI;
  1921.  
  1922.       (MTM_AREA_LENGTH) KMT_MTM_VALUES MTM_AREA;
  1923.  
  1924.       INT MTM_TEXT_NUMBER,
  1925.           MTM_REPLY,
  1926.           MTM_MESSAGE_LENGTH;
  1927.  
  1928.       (100) BYTE MTM_MESSAGE;
  1929.  
  1930.       (2) REF () BYTE MTM_RECALL_DATA;
  1931.  
  1932.       MTM_AREA (SIZE 4) := (MTM_MESSAGE
  1933.                             AS KMT_MTM_VALUES.RVB_VALUE,
  1934.                             MTM_MESSAGE_LENGTH
  1935.                             AS KMT_MTM_VALUES.RI_VALUE,
  1936.                             MTM_RECALL_DATA
  1937.                             AS KMT_MTM_VALUES.RVRVB_VALUE,
  1938.                             (L'PARAMS_LENGTH)
  1939.                             AS KMT_MTM_VALUES.LI_VALUE);
  1940.  
  1941.       IF
  1942.          ICL_RESULTCODE
  1943.  
  1944.       THEN                                       @ Use MTM text number         @
  1945.                                                  @ KMT_EH_ICL_RESULT to expand @
  1946.                                                  @ the error message passing   @
  1947.                                                  @ the RESULTCODE as a         @
  1948.                                                  @ parameter                   @
  1949.          MTM_TEXT_NUMBER := KMT_EH_ICL_RESULT;
  1950.          MTM_AREA(4) := (L'RESULTCODE) AS KMT_MTM_VALUES.LI_VALUE;
  1951.  
  1952.          IF
  1953.             PARAMS_LENGTH GT 0
  1954.          THEN
  1955.             MTM_AREA(5::) := PARAMS
  1956.          FI
  1957.  
  1958.       ELSE                                       @ Use RESULTCODE as the MTM   @
  1959.                                                  @ text number to expand the   @
  1960.                                                  @ error message               @
  1961.          MTM_TEXT_NUMBER := RC;
  1962.  
  1963.          IF
  1964.             PARAMS_LENGTH GT 0
  1965.  
  1966.          THEN
  1967.             MTM_AREA(4::) := PARAMS
  1968.          FI
  1969.       FI;
  1970.  
  1971.       WHILE
  1972.         (
  1973.          MTM_REPLY := KMT_SP_MTM (MTM_TEXT_NUMBER,
  1974.                                   MTM_AREA);
  1975.  
  1976.          IF
  1977.             MTM_REPLY NE -2
  1978.  
  1979.          THEN                                    @ Expanded message returned   @
  1980.             REF () BYTE MESSAGE IS IF
  1981.                                       MTM_REPLY EQ -3
  1982.                                    THEN          @ Returned in recall data     @
  1983.                                       MTM_TEXT_NUMBER := 0;
  1984.                                       MTM_RECALL_DATA(0)
  1985.                                    ELSE          @  Returned in message buffer @
  1986.                                       MTM_TEXT_NUMBER := MTM_REPLY;
  1987.                                       MTM_MESSAGE(SIZE MTM_MESSAGE_LENGTH)
  1988.                                    FI;
  1989.  
  1990.             CTM_LOG (3,
  1991.                      DESTINATION,
  1992.                      MESSAGE,
  1993.                      RC_DISCARDED)
  1994.  
  1995.          ELSE
  1996.             MTM_TEXT_NUMBER := 0
  1997.          FI;
  1998.  
  1999.          MTM_TEXT_NUMBER NE 0
  2000.         )
  2001.       DO
  2002.          SKIP
  2003.       REPEAT;
  2004.  
  2005.       IF
  2006.          ICL_RESULTCODE
  2007.  
  2008.                                                  @ Get ICL message text        @
  2009.       AND
  2010.         (
  2011.          CTM_GIVE_ERROR_MSG (RC,
  2012.                              ERROR_MESSAGE,
  2013.                              MESSAGE_LENGTH,
  2014.                              RC_DISCARDED);
  2015.          RC_DISCARDED EQ 0
  2016.         )
  2017.  
  2018.       AND
  2019.          MESSAGE_LENGTH GT 10
  2020.  
  2021.                                                  @ Skip "**** ERROR "          @
  2022.       AND
  2023.         (
  2024.          MESSAGE_REM := ERROR_MESSAGE(10 SIZE MESSAGE_LENGTH - 10);
  2025.          NOT SCANUNQ (X'40',                     @ Look for start of text      @
  2026.                       MESSAGE_REM,
  2027.                       0,
  2028.                       MESSAGE_REM)
  2029.         )
  2030.  
  2031.       THEN                                       @ Message text exists for     @
  2032.                                                  @ resultcode. Log to journal. @
  2033.          CTM_LOG (3,
  2034.                   DESTINATION,
  2035.                   MESSAGE_REM,
  2036.                   RC_DISCARDED)
  2037.       FI
  2038.    FI;
  2039.  
  2040.    IF
  2041.       DUMP
  2042.  
  2043.    THEN
  2044.       () LONG WORD ADDRESSES := DISPLAY (BDESC KMT_DATA_AREA);
  2045.  
  2046.       CTM_DUMP (PE_CONTINGENCY_MESSAGE,
  2047.                 10,
  2048.                 10,
  2049.                 ADDRESSES,
  2050.                 NIL,
  2051.                 4,                               @ Dump in character and hex   @
  2052.                 RC_DISCARDED)
  2053.    FI;
  2054.  
  2055.    IF
  2056.       UNRECOVERABLE
  2057.  
  2058.    THEN
  2059.       CTM_STOP (L'L'W' RESULTCODE,
  2060.                 -KMT_EH_SOFTWARE_ERROR)
  2061.    FI
  2062. END;                                   @ KMT_EH_LOG_ERROR                      @
  2063.  
  2064. ***PAGE
  2065.  
  2066. GLOBAL
  2067. STATIC (<STATUS 5>)
  2068. PROC
  2069.    KMT_EH_PE_CONTINGENCY_HANDLER IS (
  2070.    REF LONG WORD PE_CONTINGENCY_MESSAGE):
  2071.  
  2072. @******************************************************************************@
  2073. @*                                                                            *@
  2074. @* This procedure is used to handle program error contingencies. The procedure*@
  2075. @* calls KMT_EH_LOG_ERROR to produce a UCG dump. All programs are treated as  *@
  2076. @* unrecoverable.                                                             *@
  2077. @* PE_CONTINGENCY_MESSAGE references an area containing the program error     *@
  2078. @* contingency message.                                                       *@
  2079. @*                                                                            *@
  2080. @******************************************************************************@
  2081.  
  2082. BEGIN
  2083.    INT KMT_EH_SOFTWARE_ERROR IS 80101;
  2084.  
  2085.    KMT_EH_LOG_ERROR (KMT_EH_SOFTWARE_ERROR,
  2086.                      2,
  2087.                      NIL,
  2088.                      PE_CONTINGENCY_MESSAGE,
  2089.                      TRUE,                       @ Produce UCG dump            @
  2090.                      TRUE)                       @ Unrecoverable - Exit        @
  2091. END;                                   @ KMT_EH_PE_CONTINGENCY_HANDLER         @
  2092.  
  2093. ***PAGE
  2094.  
  2095. GLOBAL
  2096. STATIC (<STATUS 5>)
  2097. PROC
  2098.    KMT_EH_INFORM_PE_CONTINGENCY IS (
  2099.    RESPONSE RESULT):
  2100.  
  2101. @******************************************************************************@
  2102. @*                                                                            *@
  2103. @* This procedure is used to associate the contingency procedure:             *@
  2104. @* KMT_EH_PE_CONTINGENCY_HANDLER with the the program error contingcy class.  *@
  2105. @*                                                                            *@
  2106. @******************************************************************************@
  2107.  
  2108. BEGIN
  2109.  
  2110.    INT KMT_EH_SOFTWARE_ERROR IS 80101;
  2111.  
  2112.    CTM_INFORM (X'80000000',                      @ PE contingencies            @
  2113.                PDESC KMT_EH_PE_CONTINGENCY_HANDLER,
  2114.                RESULT);
  2115.  
  2116.    IF
  2117.       RESULT GT 0
  2118.  
  2119.    THEN (<RARELY>)
  2120.      (
  2121.       () BYTE PROC_NAME := "KMT_EH_INFORM_PE_CONTINGENCY";
  2122.  
  2123.       () KMT_MTM_VALUES PARAMS := DISPLAY(PROC_NAME
  2124.                                           AS KMT_MTM_VALUES.RVB_VALUE);
  2125.  
  2126.       KMT_EH_LOG_ERROR (RESULT,
  2127.                         2,
  2128.                         PARAMS,
  2129.                         0,
  2130.                         FALSE,
  2131.                         FALSE);
  2132.       RESULT := KMT_EH_SOFTWARE_ERROR
  2133.      )
  2134.  
  2135.    ELSE                                          @ Ignore warnings             @
  2136.       RESULT := 0
  2137.    FI
  2138. END;                                   @ KMT_EH_INFORM_PE_CONTINGENCY          @
  2139.  
  2140. ENDMODULE                              @ KMT_EH_MODULE                         @
  2141. $$$$ KMT_FH_MODULE
  2142. MODULE KMT_FH_MODULE;
  2143.  
  2144. @******************************************************************************@
  2145. @*                                                                            *@
  2146. @* Mode definitions                                                           *@
  2147. @*                                                                            *@
  2148. @******************************************************************************@
  2149.  
  2150. MODE
  2151. CTM_ACCESS_1 IS GPROC (
  2152.    REF () CTM_PARAMETER_PAIRS,
  2153.    RESPONSE);
  2154.  
  2155. MODE
  2156. CTM_ACCESS_2 IS GPROC (
  2157.    RESPONSE);
  2158.  
  2159. MODE
  2160. CTM_PARAMETER_VALUES IS ANY (
  2161.    INT              INT_VALUE,
  2162.    LONG WORD        LONG_WORD_VALUE,
  2163.    REF INT          REF_INT_VALUE,
  2164.    REF () BYTE      STRING_VALUE,
  2165.    REF CTM_ACCESS_1 REF_ACCESS_1_VALUE,
  2166.    REF CTM_ACCESS_2 REF_ACCESS_2_VALUE);
  2167.  
  2168. MODE
  2169. CTM_PARAMETER_PAIRS IS WSTRUCT (
  2170.    INT                  TYPE,
  2171.    CTM_PARAMETER_VALUES VALUE);
  2172.  
  2173. MODE
  2174. KMT_TRACE_FLAGS_S IS WORD STRUCT (
  2175.    BIT    PH_TRACING,
  2176.           PP_TRACING,
  2177.           FH_TRACING,
  2178.           DH_TRACING,
  2179.    28-BIT SPARE);
  2180.  
  2181. MODE
  2182. KMT_FH_FILE_OPTIONS_S IS BYTE STRUCT (
  2183.    BIT APPEND_CREATE,
  2184.        APPEND,
  2185.        REPLACE_CREATE,
  2186.        REPLACE,
  2187.        CREATE_APPEND,
  2188.        CREATE_REPLACE,
  2189.        CREATE,
  2190.        READ);
  2191.  
  2192. MODE
  2193. KMT_FH_RECORD_DETAILS_S IS STRUCT (
  2194.    BOOL        FILE_OPEN,
  2195.                NEW_RECORD,
  2196.                END_OF_FILE,
  2197.    WORD        TEXT_TYPE,                        @ 0 = EBCDIC                  @
  2198.                                                  @ 1 = IA5                     @
  2199.                                                  @ 2 = BINARY                  @
  2200.    INT         MAX_RECORD_LENGTH,
  2201.                RECORD_LENGTH,
  2202.    (4098) BYTE RECORD);                          @ Maximum record size of 4096 @
  2203.                                                  @ plus 2 bytes for CRLF pair  @
  2204.                                                  @ when constructing output    @
  2205.                                                  @ records                     @
  2206.  
  2207. MODE
  2208. KMT_FH_FILE_STATISTICS_S IS STRUCT (
  2209.    INT INPUT_TOTAL,
  2210.    INT OUTPUT_TOTAL);
  2211.  
  2212. MODE
  2213. KMT_FH_FILE_DETAILS_S IS STRUCT (
  2214.    LONG WORD                    FILE_CURRENCY,
  2215.    BOOL                         NEW_FILE,
  2216.    KMT_FH_FILE_OPTIONS_S        FILE_OPTION,
  2217.    CTM_ACCESS_1                 ACCESS_1,
  2218.    CTM_ACCESS_2                 ACCESS_2);
  2219.  
  2220. MODE
  2221. KMT_MTM_VALUES IS ANY (
  2222.    LONG WORD          LW_VALUE,
  2223.    LONG INT           LI_VALUE,
  2224.    REF WORD           RW_VALUE,
  2225.    REF INT            RI_VALUE,
  2226.    REF LONG WORD      RLW_VALUE,
  2227.    REF LONG INT       RLI_VALUE,
  2228.    REF () BYTE        RVB_VALUE,
  2229.    REF () REF () BYTE RVRVB_VALUE);
  2230.  
  2231. ***PAGE
  2232.  
  2233. @******************************************************************************@
  2234. @*                                                                            *@
  2235. @* External procedure references                                              *@
  2236. @*                                                                            *@
  2237. @******************************************************************************@
  2238.  
  2239. EXT (<PREFIX "ICLCTM">)
  2240. PROC
  2241.    (REF LONG WORD,                               @ FILE_CURRENCY               @
  2242.     REF () BYTE,                                 @ FILE_LOCAL_NAME             @
  2243.     REF () BYTE,                                 @ FULL_FILE_NAME              @
  2244.     RESPONSE                                     @ RESPONSE                    @
  2245.    )                                   CTM_ASSIGN_FILE;
  2246.  
  2247. EXT (<PREFIX "ICLCTM">)
  2248. PROC
  2249.    (REF LONG WORD,                               @ NEW_FILE_CURRENCY           @
  2250.     REF () BYTE,                                 @ NEW_FILE_LOCAL_NAME         @
  2251.     LONG WORD,                                   @ FILE_CURRENCY,              @
  2252.     REF () BYTE,                                 @ FILE_LOCAL_NAME             @
  2253.     REF () BYTE,                                 @ FULL_FILE_NAME              @
  2254.     LONG WORD,                                   @ DESCRIPTION_CURRENCY        @
  2255.     REF () BYTE,                                 @ DESCRIPTION_LOCAL_NAME      @
  2256.     REF () BYTE,                                 @ FULL_DESCRIPTION_NAME       @
  2257.     INT,                                         @ INITIAL_SIZE                @
  2258.     INT,                                         @ MAXIMUM_SIZE                @
  2259.     INT,                                         @ OPTION                      @
  2260.     RESPONSE                                     @ RESPONSE                    @
  2261.    )                                   CTM_GET_FILE;
  2262.  
  2263. EXT (<PREFIX "ICLCTM">)
  2264. PROC
  2265.    (LONG WORD,                                   @ FILE_CURRENCY               @
  2266.     REF () BYTE,                                 @ FILE_LOCAL_NAME             @
  2267.     RESPONSE                                     @ RESPONSE                    @
  2268.    )                                   CTM_SAVE_FILE;
  2269.  
  2270. EXT (<PREFIX "ICLCTM">)
  2271. PROC
  2272.    (LONG WORD,                                   @ FILE_CURRENCY               @
  2273.     REF () BYTE,                                 @ FILE_LOCAL_NAME             @
  2274.     REF () BYTE,                                 @ FULL_FILE_NAME              @
  2275.     REF () WORD,                                 @ PROPERTIES                  @
  2276.     RESPONSE                                     @ RESPONSE                    @
  2277.    )                                   CTM_READ_DESC;
  2278.  
  2279. EXT (<PREFIX "ICLCTM">)
  2280. PROC
  2281.    (RESPONSE                                     @ RESPONSE                    @
  2282.    )                                   CTM_SCHEDULE;
  2283.  
  2284. EXT (<PREFIX "ICLCTM">)
  2285. PROC
  2286.    (LONG WORD,                                   @ FILE_CURRENCY               @
  2287.     REF () BYTE,                                 @ FILE_LOCAL_NAME             @
  2288.     REF () CTM_PARAMETER_PAIRS,                  @ PARAMETER_PAIRS             @
  2289.     RESPONSE                                     @ RESPONSE                    @
  2290.    )                                   CTM_SELECT_RAM;
  2291.  
  2292. EXT (<PREFIX "ICLCTM">)
  2293. PROC
  2294.    (LONG WORD,                                   @ FILE_CURRENCY               @
  2295.     REF () BYTE,                                 @ FILE_LOCAL_CURRENCY         @
  2296.     REF () BYTE,                                 @ FULL_FILE_NAME              @
  2297.     REF INT,                                     @ NAME_LENGTH                 @
  2298.     RESPONSE                                     @ RESPONSE                    @
  2299.    )                                   CTM_GIVE_NAME;
  2300.  
  2301. EXT
  2302. PROC
  2303.    (INT,                                         @ TYPE                        @
  2304.     REF () KMT_MTM_VALUES                        @ PARAMS                      @
  2305.    )                                   KMT_SP_LOG_TRACE_MESSAGE;
  2306.  
  2307. EXT
  2308. PROC
  2309.    (INT,                                         @ RESULT_CODE                 @
  2310.     WORD,                                        @ DESTINATION                 @
  2311.     REF () KMT_MTM_VALUES,                       @ PARAMS                      @
  2312.     LONG WORD,                                   @ PE_CONTINGENCY_MESSAGE      @
  2313.     BOOL,                                        @ DUMP                        @
  2314.     BOOL                                         @ UNRECOVERABLE               @
  2315.    )                                   KMT_EH_LOG_ERROR;
  2316.  
  2317. ***PAGE
  2318.  
  2319. @******************************************************************************@
  2320. @*                                                                            *@
  2321. @* External data references                                                   *@
  2322. @*                                                                            *@
  2323. @******************************************************************************@
  2324.  
  2325. @ Constants: @
  2326. @ ********** @
  2327.  
  2328. ***LINES(4)
  2329.  
  2330. @ Variables: @
  2331. @ ********** @
  2332.  
  2333. EXT (<CASCADE>)
  2334. REF KMT_TRACE_FLAGS_S KMT_TRACE_FLAGS;
  2335.  
  2336. EXT (<CASCADE>)
  2337. REF KMT_FH_RECORD_DETAILS_S KMT_FH_RECORD_DETAILS;
  2338.  
  2339. EXT (<CASCADE>)
  2340. REF KMT_FH_FILE_STATISTICS_S KMT_FH_FILE_STATISTICS;
  2341.  
  2342. ***LINES(4)
  2343.  
  2344. @ Results: @
  2345. @ ******** @
  2346.  
  2347. ***LINES(4)
  2348.  
  2349. ***PAGE
  2350.  
  2351. @******************************************************************************@
  2352. @*                                                                            *@
  2353. @* Static data declarations                                                   *@
  2354. @*                                                                            *@
  2355. @******************************************************************************@
  2356.  
  2357. @ Constants: @
  2358. @ ********** @
  2359.  
  2360. ***LINES(4)
  2361.  
  2362. @ Variables: @
  2363. @ ********** @
  2364.  
  2365. STATIC
  2366. KMT_FH_FILE_DETAILS_S KMT_FH_FILE_DETAILS;
  2367.  
  2368. ***LINES(4)
  2369.  
  2370. @ Results: @
  2371. @ ******** @
  2372.  
  2373. ***LINES(4)
  2374.  
  2375. ***PAGE
  2376.  
  2377. @******************************************************************************@
  2378. @*                                                                            *@
  2379. @* Procedure declarations                                                     *@
  2380. @*                                                                            *@
  2381. @******************************************************************************@
  2382.  
  2383. GLOBAL
  2384. STATIC (<STATUS 5>)
  2385. PROC
  2386.    KMT_FH_OPEN_FILE IS (
  2387.    REF () BYTE FILE_NAME,
  2388.    WORD        OPTION,
  2389.    RESPONSE    RESULT):
  2390.  
  2391. @******************************************************************************@
  2392. @*                                                                            *@
  2393. @* This procedure is used to create (if required), assign and open the data   *@
  2394. @* file specified by FILE_NAME for read or write access depending upon the    *@
  2395. @* value of OPTION.                                                           *@
  2396. @*                                                                            *@
  2397. @******************************************************************************@
  2398.  
  2399. BEGIN
  2400.    INT FC_CTM_FILE_ALREADY_EXISTS IS 9113,
  2401.        FC_CTM_FILE_DOES_NOT_EXIST IS 9114,
  2402.        FC_CTM_NEW_FILE_WARNING    IS -44900;
  2403.  
  2404.    INT KMT_EH_SOFTWARE_ERROR IS 80101;
  2405.  
  2406.    REF LONG WORD FILE_CURRENCY IS KMT_FH_FILE_DETAILS.FILE_CURRENCY;
  2407.  
  2408.    REF KMT_FH_FILE_OPTIONS_S FILE_OPTION IS KMT_FH_FILE_DETAILS.FILE_OPTION;
  2409.  
  2410.    FILE_OPTION := (WORD: X'01') SCALE OPTION;
  2411.  
  2412.    IF
  2413.      (
  2414.       IF
  2415.          FILE_OPTION.READ
  2416.  
  2417.       THEN                                       @ Read                        @
  2418.          CTM_ASSIGN_FILE (FILE_CURRENCY,
  2419.                           NIL,
  2420.                           FILE_NAME,
  2421.                           RESULT)
  2422.  
  2423.       ELSE                                       @ Write                       @
  2424.          CTM_GET_FILE (FILE_CURRENCY,
  2425.                        NIL,
  2426.                        0,
  2427.                        NIL,
  2428.                        FILE_NAME,
  2429.                        0,
  2430.                        NIL,
  2431.                        NIL,
  2432.                        -1,
  2433.                        -1,
  2434.                        (IF
  2435.                            (FILE_OPTION & X"0E") NE 0
  2436.                         THEN                     @ Create, create_replace or   @
  2437.                                                  @ create_append               @
  2438.                            0
  2439.                         ELSE                     @ Replace, replace_create,    @
  2440.                                                  @ append or append_create     @
  2441.                            2
  2442.                         FI),
  2443.                        RESULT);
  2444.  
  2445.          IF
  2446.             (RESULT EQ 0)  AND  FILE_OPTION.CREATE
  2447.  
  2448.          THEN                                    @ Create but file already     @
  2449.                                                  @ exists                      @
  2450.             RESULT := FC_CTM_FILE_ALREADY_EXISTS
  2451.  
  2452.          ELSF
  2453.             (RESULT EQ FC_CTM_NEW_FILE_WARNING)  AND  (FILE_OPTION & X"50" NE 0)
  2454.  
  2455.          THEN                                    @ Replace or append but file  @
  2456.                                                  @ does not exist              @
  2457.             RESULT := FC_CTM_FILE_DOES_NOT_EXIST
  2458.          FI
  2459.       FI;
  2460.  
  2461.       KMT_FH_FILE_DETAILS.NEW_FILE := (RESULT EQ FC_CTM_NEW_FILE_WARNING);
  2462.  
  2463.       RESULT LE 0
  2464.      )
  2465.  
  2466.    AND
  2467.      (
  2468.       CTM_SCHEDULE (RESULT);
  2469.       RESULT LE 0
  2470.      )
  2471.  
  2472.    AND
  2473.      (
  2474.       () CTM_PARAMETER_PAIRS PARAMETER_PAIRS :=
  2475.          ((7,  KMT_FH_RECORD_DETAILS.RECORD
  2476.                AS CTM_PARAMETER_VALUES.STRING_VALUE),
  2477.           (9,  KMT_FH_RECORD_DETAILS.RECORD_LENGTH
  2478.                AS CTM_PARAMETER_VALUES.REF_INT_VALUE),
  2479.           (12, (IF
  2480.                    FILE_OPTION.READ
  2481.                 THEN                             @ Read                        @
  2482.                    1                             @ Select and read             @
  2483.                 ELSE                             @ Write                       @
  2484.                    2                             @ Select and new write        @
  2485.                 FI)
  2486.                AS CTM_PARAMETER_VALUES.INT_VALUE),
  2487.           (19, KMT_FH_FILE_DETAILS.ACCESS_2
  2488.                AS CTM_PARAMETER_VALUES.REF_ACCESS_2_VALUE),
  2489.           (24, KMT_FH_FILE_DETAILS.ACCESS_1
  2490.                AS CTM_PARAMETER_VALUES.REF_ACCESS_1_VALUE),
  2491.           (29, (IF
  2492.                    (FILE_OPTION & X"C8") NE 0
  2493.                 THEN                             @ Append                      @
  2494.                    3                             @ End of file                 @
  2495.                 ELSE                             @ Read, create or replace     @
  2496.                    2                             @ Beginning of file           @
  2497.                 FI)
  2498.                AS CTM_PARAMETER_VALUES.INT_VALUE)
  2499.          );
  2500.  
  2501.       CTM_SELECT_RAM (FILE_CURRENCY,
  2502.                       NIL,
  2503.                       PARAMETER_PAIRS,
  2504.                       RESULT);
  2505.       RESULT LE 0
  2506.      )
  2507.  
  2508.    AND
  2509.      (
  2510.       IF
  2511.          (FILE_OPTION & X"34") NE 0
  2512.  
  2513.       THEN                                       @ Replacing file,             @
  2514.                                                  @ destroy file contents       @
  2515.          () CTM_PARAMETER_PAIRS PARAMETER_PAIRS :=
  2516.             DISPLAY((0, 11                       @ Extended destroy            @
  2517.                         AS CTM_PARAMETER_VALUES.INT_VALUE)
  2518.                    );
  2519.  
  2520.          KMT_FH_FILE_DETAILS.ACCESS_1 (PARAMETER_PAIRS,
  2521.                                        RESULT)
  2522.        FI;
  2523.  
  2524.        RESULT LE 0
  2525.       )
  2526.  
  2527.    THEN
  2528.       WORD R_LEN IS LENGTH KMT_FH_RECORD_DETAILS.RECORD - 2;
  2529.                                                  @ Allows for CRLF end of      @
  2530.                                                  @ record terminator           @
  2531.       () WORD PROPERTIES := (104,                @ Maximum record size         @
  2532.                              0,
  2533.                              0);
  2534.  
  2535.       KMT_FH_RECORD_DETAILS.MAX_RECORD_LENGTH := IF
  2536.                                                    (
  2537.                                                     CTM_READ_DESC (
  2538.                                                                   FILE_CURRENCY,
  2539.                                                                   NIL,
  2540.                                                                   NIL,
  2541.                                                                   PROPERTIES,
  2542.                                                                   RESULT);
  2543.                                                     RESULT EQ 0
  2544.                                                    )
  2545.                                                  AND
  2546.                                                     PROPERTIES(1) LT R_LEN
  2547.                                                  THEN
  2548.                                                     PROPERTIES(1)
  2549.                                                  ELSE
  2550.                                                     R_LEN
  2551.                                                  FI
  2552.    FI;
  2553.  
  2554.    IF
  2555.       RESULT LE 0
  2556.  
  2557.    THEN                                          @ File opened successfully    @
  2558.       KMT_FH_RECORD_DETAILS.FILE_OPEN := TRUE;
  2559.       KMT_FH_RECORD_DETAILS.NEW_RECORD := TRUE;
  2560.       KMT_FH_RECORD_DETAILS.END_OF_FILE := FALSE;
  2561.       KMT_FH_FILE_STATISTICS := (0,0);
  2562.       RESULT := 0                                @ Ignore warnings             @
  2563.  
  2564.    ELSE (<RARELY>)                               @ Open error                  @
  2565.      (
  2566.       () BYTE PROC_NAME := "KMT_FH_OPEN_FILE";
  2567.  
  2568.       () KMT_MTM_VALUES PARAMS := DISPLAY(PROC_NAME
  2569.                                           AS KMT_MTM_VALUES.RVB_VALUE);
  2570.  
  2571.       KMT_FH_RECORD_DETAILS.FILE_OPEN := FALSE;
  2572.       KMT_EH_LOG_ERROR (RESULT,
  2573.                         2,
  2574.                         PARAMS,
  2575.                         0,
  2576.                         FALSE,
  2577.                         FALSE);
  2578.       RESULT := KMT_EH_SOFTWARE_ERROR
  2579.      )
  2580.    FI
  2581. END;                                   @ KMT_FH_OPEN_FILE                      @
  2582.  
  2583. ***PAGE
  2584.  
  2585. GLOBAL
  2586. STATIC (<STATUS 5>)
  2587. PROC
  2588.    KMT_FH_CLOSE_FILE IS (
  2589.    RESPONSE RESULT):
  2590.  
  2591. @******************************************************************************@
  2592. @*                                                                            *@
  2593. @* This procedure is used to close the file previously opened by the          *@
  2594. @* KMT_FH_OPEN_FILE.                                                          *@
  2595. @*                                                                            *@
  2596. @******************************************************************************@
  2597.  
  2598. BEGIN
  2599.    INT KMT_EH_SOFTWARE_ERROR IS 80101;
  2600.  
  2601.    REF BOOL FILE_OPEN IS KMT_FH_RECORD_DETAILS.FILE_OPEN;
  2602.  
  2603.    RESULT := 0;
  2604.  
  2605.    IF
  2606.       FILE_OPEN
  2607.  
  2608.    THEN                                          @ File open, close it         @
  2609.       INT RC;
  2610.  
  2611.       () CTM_PARAMETER_PAIRS PARAMETER_PAIRS :=
  2612.          DISPLAY((0, 12                          @ Deselect RAM                @
  2613.                      AS CTM_PARAMETER_VALUES.INT_VALUE)
  2614.                 );
  2615.  
  2616.                                                  @ When receiving a binary     @
  2617.                                                  @ file, must output last      @
  2618.                                                  @ record to file              @
  2619.       IF
  2620.          KMT_FH_FILE_DETAILS.FILE_OPTION.READ
  2621.       OR
  2622.          KMT_FH_RECORD_DETAILS.TEXT_TYPE NE 2
  2623.       OR
  2624.          KMT_FH_RECORD_DETAILS.NEW_RECORD
  2625.  
  2626.       THEN                                       @ File open for reading, not  @
  2627.                                                  @ a binary file or            @
  2628.          RC := 0                                 @ no record to output         @
  2629.  
  2630.       ELSE                                       @ Flush remaining buffer      @
  2631.          KMT_FH_WRITE (RC)
  2632.       FI;
  2633.  
  2634.       IF
  2635.         (
  2636.          KMT_FH_FILE_DETAILS.ACCESS_1 (PARAMETER_PAIRS,
  2637.                                        RESULT);
  2638.          RESULT GT 0
  2639.         )
  2640.  
  2641.       THEN (<RARELY>)                            @ Close error                 @
  2642.         (
  2643.          () BYTE PROC_NAME := "KMT_FH_CLOSE_FILE";
  2644.  
  2645.          () KMT_MTM_VALUES PARAMS := DISPLAY(PROC_NAME
  2646.                                              AS KMT_MTM_VALUES.RVB_VALUE);
  2647.  
  2648.          KMT_EH_LOG_ERROR (RESULT,
  2649.                            2,
  2650.                            PARAMS,
  2651.                            0,
  2652.                            FALSE,
  2653.                            FALSE);
  2654.          RESULT := KMT_EH_SOFTWARE_ERROR
  2655.         )
  2656.  
  2657.       ELSE
  2658.          RESULT := RC
  2659.       FI;
  2660.  
  2661.       FILE_OPEN := FALSE
  2662.    FI
  2663. END;                                   @ KMT_FH_CLOSE_FILE                     @
  2664.  
  2665. ***PAGE
  2666.  
  2667. GLOBAL
  2668. STATIC (<STATUS 5>)
  2669. PROC
  2670.    KMT_FH_READ IS (
  2671.    RESPONSE RESULT):
  2672.  
  2673. @******************************************************************************@
  2674. @*                                                                            *@
  2675. @* This procedure is used to read a record from the file previously opened    *@
  2676. @* (for read access) by the procedure KMT_FH_OPEN_FILE.                       *@
  2677. @* The record and length are returned in the areas                            *@
  2678. @* KMT_FH_RECORD_DETAILS.RECORD and KMT_FH_RECORD.DETAILS.RECORD_LENGTH       *@
  2679. @* respectively.                                                              *@
  2680. @*                                                                            *@
  2681. @******************************************************************************@
  2682.  
  2683. BEGIN
  2684.    INT DML_READ_PSEUDO_NODE IS 9034;
  2685.  
  2686.    INT KMT_FH_RECORD_IN_MSG  IS 200,
  2687.        KMT_EH_SOFTWARE_ERROR IS 80101,
  2688.        KMT_FH_RECORD_TOO_BIG IS 80200;
  2689.  
  2690.    REF INT RECORD_LENGTH IS KMT_FH_RECORD_DETAILS.RECORD_LENGTH;
  2691.  
  2692.    REF () BYTE RECORD IS KMT_FH_RECORD_DETAILS.RECORD;
  2693.  
  2694.    IF
  2695.      (
  2696.       KMT_FH_FILE_DETAILS.ACCESS_2 (RESULT);
  2697.       RESULT LE 0
  2698.      )
  2699.  
  2700.    THEN                                          @ Read successful             @
  2701.       REF INT MAX_RECORD_LENGTH IS KMT_FH_RECORD_DETAILS.MAX_RECORD_LENGTH;
  2702.  
  2703.       BOOL TRACING IS KMT_TRACE_FLAGS.FH_TRACING;
  2704.  
  2705.       REF INT STATISTICS IS KMT_FH_FILE_STATISTICS.INPUT_TOTAL;
  2706.  
  2707.       STATISTICS := STATISTICS + 1;
  2708.  
  2709.       IF
  2710.          RECORD_LENGTH GT MAX_RECORD_LENGTH
  2711.  
  2712.       THEN (<RARELY>)                            @ Record exceeds buffer size  @
  2713.         (
  2714.          () KMT_MTM_VALUES PARAMS := (RECORD_LENGTH
  2715.                                       AS KMT_MTM_VALUES.RI_VALUE,
  2716.                                       MAX_RECORD_LENGTH
  2717.                                       AS KMT_MTM_VALUES.RI_VALUE);
  2718.  
  2719.          RESULT := KMT_FH_RECORD_TOO_BIG;
  2720.          KMT_EH_LOG_ERROR (RESULT,
  2721.                            2,
  2722.                            PARAMS,
  2723.                            0,
  2724.                            FALSE,
  2725.                            FALSE);
  2726.          RECORD_LENGTH := MAX_RECORD_LENGTH
  2727.         )
  2728.  
  2729.       ELSE                                       @ Ignore warnings             @
  2730.          RESULT := 0
  2731.       FI;
  2732.  
  2733.       IF
  2734.          TRACING
  2735.  
  2736.       THEN (<RARELY>)
  2737.         (
  2738.          () KMT_MTM_VALUES PARAMS := DISPLAY(RECORD(SIZE RECORD_LENGTH)
  2739.                                              AS KMT_MTM_VALUES.RVB_VALUE);
  2740.  
  2741.          KMT_SP_LOG_TRACE_MESSAGE (KMT_FH_RECORD_IN_MSG,
  2742.                                    PARAMS)
  2743.         )
  2744.       FI
  2745.  
  2746.    ELSF
  2747.      (
  2748.       RECORD_LENGTH := 0;
  2749.       RESULT EQ DML_READ_PSEUDO_NODE
  2750.      )
  2751.  
  2752.    THEN                                          @ End of file reached         @
  2753.       SKIP
  2754.  
  2755.    ELSE (<RARELY>)                               @ Read error                  @
  2756.      (
  2757.       () BYTE PROC_NAME := "KMT_FH_READ";
  2758.  
  2759.       () BYTE ERROR_TEXT := "     WHILST READING FROM FILE";
  2760.  
  2761.       () KMT_MTM_VALUES PARAMS := (PROC_NAME
  2762.                                    AS KMT_MTM_VALUES.RVB_VALUE,
  2763.                                    ERROR_TEXT
  2764.                                     AS KMT_MTM_VALUES.RVB_VALUE);
  2765.  
  2766.       KMT_EH_LOG_ERROR (RESULT,
  2767.                         2,
  2768.                         PARAMS,
  2769.                         0,
  2770.                         FALSE,
  2771.                         FALSE);
  2772.       RESULT := KMT_EH_SOFTWARE_ERROR
  2773.      )
  2774.    FI
  2775. END;                                   @ KMT_FH_READ                           @
  2776.  
  2777. ***PAGE
  2778.  
  2779. GLOBAL
  2780. STATIC (<STATUS 5>)
  2781. PROC
  2782.    KMT_FH_WRITE IS (
  2783.    RESPONSE RESULT):
  2784.  
  2785. @******************************************************************************@
  2786. @*                                                                            *@
  2787. @* This procedure is used to write a record to the file previously opened     *@
  2788. @* (for write access) by the procedure KMT_FH_OPEN_FILE.                      *@
  2789. @* The record to be output and length are contained in the areas              *@
  2790. @* KMT_FH_RECORD_DETAILS.RECORD and KMT_FH_RECORD_DETAILS.RECORD_LENGTH       *@
  2791. @* respectively.                                                              *@
  2792. @*                                                                            *@
  2793. @******************************************************************************@
  2794.  
  2795. BEGIN
  2796.  
  2797.    INT KMT_FH_RECORD_OUT_MSG IS 201,
  2798.        KMT_EH_SOFTWARE_ERROR IS 80101;
  2799.  
  2800.    IF
  2801.      (
  2802.       KMT_FH_FILE_DETAILS.ACCESS_2 (RESULT);
  2803.       RESULT LE 0
  2804.      )
  2805.  
  2806.    THEN                                          @ Write successful            @
  2807.       BOOL TRACING IS KMT_TRACE_FLAGS.FH_TRACING;
  2808.  
  2809.       REF INT STATISTICS IS KMT_FH_FILE_STATISTICS.OUTPUT_TOTAL;
  2810.  
  2811.       STATISTICS := STATISTICS + 1;
  2812.  
  2813.       IF
  2814.          TRACING
  2815.  
  2816.       THEN (<RARELY>)
  2817.         (
  2818.          () KMT_MTM_VALUES PARAMS := DISPLAY(
  2819.                                         KMT_FH_RECORD_DETAILS.RECORD(SIZE
  2820.                                            KMT_FH_RECORD_DETAILS.RECORD_LENGTH)
  2821.                                         AS KMT_MTM_VALUES.RVB_VALUE);
  2822.  
  2823.          KMT_SP_LOG_TRACE_MESSAGE (KMT_FH_RECORD_OUT_MSG,
  2824.                                    PARAMS)
  2825.         )
  2826.       FI;
  2827.  
  2828.       RESULT := 0                                @ Ignore warnings             @
  2829.  
  2830.    ELSE (<RARELY>)                               @ Write error                 @
  2831.      (
  2832.       () BYTE PROC_NAME := "KMT_FH_WRITE";
  2833.  
  2834.       () BYTE ERROR_TEXT := "     WHILST WRITING TO FILE";
  2835.  
  2836.       () KMT_MTM_VALUES PARAMS := (PROC_NAME
  2837.                                    AS KMT_MTM_VALUES.RVB_VALUE,
  2838.                                    ERROR_TEXT
  2839.                                    AS KMT_MTM_VALUES.RVB_VALUE);
  2840.  
  2841.       KMT_EH_LOG_ERROR (RESULT,
  2842.                         2,
  2843.                         PARAMS,
  2844.                         0,
  2845.                         FALSE,
  2846.                         FALSE);
  2847.       RESULT := KMT_EH_SOFTWARE_ERROR
  2848.      )
  2849.    FI
  2850. END;                                   @ KMT_FH_WRITE                          @
  2851.  
  2852. ***PAGE
  2853.  
  2854. GLOBAL
  2855. STATIC (<STATUS 5>)
  2856. PROC
  2857.    KMT_FH_SAVE_FILE IS (
  2858.    RESPONSE RESULT):
  2859.  
  2860. @******************************************************************************@
  2861. @*                                                                            *@
  2862. @* This procedure is used to save the file previously opened by the procedure *@
  2863. @* KMT_FH_OPEN_FILE.                                                          *@
  2864. @*                                                                            *@
  2865. @******************************************************************************@
  2866.  
  2867. BEGIN
  2868.  
  2869.    INT KMT_EH_SOFTWARE_ERROR IS 80101;
  2870.  
  2871.    IF
  2872.       KMT_FH_FILE_DETAILS.NEW_FILE
  2873.    AND
  2874.  
  2875.      (
  2876.       CTM_SAVE_FILE (KMT_FH_FILE_DETAILS.FILE_CURRENCY,
  2877.                      NIL,
  2878.                      RESULT);
  2879.       RESULT GT 0
  2880.      )
  2881.  
  2882.    THEN (<RARELY>)                               @ Save error                  @
  2883.      (
  2884.       () BYTE PROC_NAME := "KMT_FH_SAVE_FILE";
  2885.  
  2886.       () KMT_MTM_VALUES PARAMS := DISPLAY(PROC_NAME
  2887.                                           AS KMT_MTM_VALUES.RVB_VALUE);
  2888.  
  2889.       KMT_EH_LOG_ERROR (RESULT,
  2890.                         2,
  2891.                         PARAMS,
  2892.                         0,
  2893.                         FALSE,
  2894.                         FALSE);
  2895.       RESULT := KMT_EH_SOFTWARE_ERROR
  2896.      )
  2897.  
  2898.    ELSE                                          @ Ignore warnings             @
  2899.       RESULT := 0
  2900.    FI
  2901. END;                                   @ KMT_FH_SAVE_FILE                      @
  2902.  
  2903. ***PAGE
  2904.  
  2905. GLOBAL
  2906. STATIC (<STATUS 5>)
  2907. PROC
  2908.    KMT_FH_GIVE_NAME IS (
  2909.    REF () BYTE NAME,
  2910.    REF INT     NAME_LENGTH,
  2911.    BOOL        FULL_NAME,
  2912.    RESPONSE    RESULT):
  2913.  
  2914. @******************************************************************************@
  2915. @*                                                                            *@
  2916. @* This procedure is used to obtain either the full file name or the terminal *@
  2917. @* file name of the file previously opened by KMT_FH_OPEN_FILE.               *@
  2918. @* The name of the file and length are returned in the areas referenced by    *@
  2919. @* NAME and NAME_LENGTH respectively.                                         *@
  2920. @* If FULL_NAME is set TRUE then the full file name will be returned,         *@
  2921. @* otherwise the terminal file name will be returned.                         *@
  2922. @* If the area referenced by NAME is too small to contain the file name then  *@
  2923. @* the file name will be truncated and resultcode FC_CTM_BUFFER_TOO_SHORT     *@
  2924. @* returned.                                                                  *@
  2925. @*                                                                            *@
  2926. @******************************************************************************@
  2927.  
  2928. BEGIN
  2929.    INT KMT_EH_SOFTWARE_ERROR IS 80101;
  2930.  
  2931.    IF
  2932.      (
  2933.       CTM_GIVE_NAME (KMT_FH_FILE_DETAILS.FILE_CURRENCY,
  2934.                      NIL,
  2935.                      NAME,
  2936.                      NAME_LENGTH,
  2937.                      RESULT);
  2938.       RESULT GT 0
  2939.      )
  2940.  
  2941.    THEN (<RARELY>)                               @ Error                       @
  2942.      (
  2943.       () BYTE PROC_NAME := "KMT_FH_GIVE_NAME";
  2944.  
  2945.       () KMT_MTM_VALUES PARAMS := DISPLAY(PROC_NAME
  2946.                                           AS KMT_MTM_VALUES.RVB_VALUE);
  2947.  
  2948.       KMT_EH_LOG_ERROR (RESULT,
  2949.                         2,
  2950.                         PARAMS,
  2951.                         0,
  2952.                         FALSE,
  2953.                         FALSE);
  2954.       RESULT := KMT_EH_SOFTWARE_ERROR
  2955.      )
  2956.  
  2957.    ELSF
  2958.       FULL_NAME
  2959.  
  2960.    THEN                                          @ Full file name required     @
  2961.                                                  @ Exit                        @
  2962.       SKIP
  2963.  
  2964.    ELSF
  2965.       NAME_LENGTH EQ 0
  2966.  
  2967.    THEN                                          @ No file name returned, exit @
  2968.       SKIP
  2969.  
  2970.    ELSE                                          @ Terminal file name required @
  2971.       () BYTE NAME_COPY := NAME(SIZE NAME_LENGTH);
  2972.  
  2973.       REF () BYTE TERMINAL_NAME,
  2974.                   REM;
  2975.  
  2976.       TERMINAL_NAME := NAME_COPY;
  2977.       REM := TERMINAL_NAME;
  2978.  
  2979.       UNTIL                                      @ Search for part of name     @
  2980.          SCANUNQ (".",                           @ after last dot              @
  2981.                   REM,
  2982.                   0,
  2983.                   REM)
  2984.       DO
  2985.          REM := REM(1::);
  2986.          TERMINAL_NAME := REM
  2987.       REPEAT;
  2988.  
  2989.       SCANUNQ ("(",                              @ Remove generation number    @
  2990.                TERMINAL_NAME,
  2991.                0,
  2992.                REM);
  2993.       NAME_LENGTH := LENGTH TERMINAL_NAME - LENGTH REM;
  2994.       NAME(SIZE NAME_LENGTH) := TERMINAL_NAME(SIZE NAME_LENGTH);
  2995.       RESULT := 0
  2996.    FI;
  2997. END;                                   @ KMT_FH_GIVE_NAME                      @
  2998. ENDMODULE                              @ KMT_FH_MODULE                         @
  2999. $$$$ KMT_MAIN_MODULE
  3000. MODULE KMT_MAIN_MODULE;                                         @ Version 1.01 @
  3001.  
  3002. @------------------------------------------------------------------------------@
  3003. @                                                                              @
  3004. @                                                                              @
  3005. @               -----  S W U R C C   V M E   K E R M I T  -----                @
  3006. @                                                                              @
  3007. @                                                                              @
  3008. @       ----------------------------------------------------------------       @
  3009. @                                                                              @
  3010. @                                                                              @
  3011. @       Version 1.00   (February 1986)                                         @
  3012. @                                                                              @
  3013. @         Written by : Richard Andrews and David Lord,                         @
  3014. @                      South West Universities Regional Computer Centre,       @
  3015. @                      Claverton Down, Bath BA2 7AY, U.K.                      @
  3016. @                                                                              @
  3017. @                                                                              @
  3018. @       ----------------------------------------------------------------       @
  3019. @                                                                              @
  3020. @                                                                              @
  3021. @       Version 1.01   (October 1986)                                          @
  3022. @                                                                              @
  3023. @           Fixes by : Dave Allum and David Lord, SWURCC.                      @
  3024. @                                                                              @
  3025. @           1. The BOOL variable ASG_ROUTE is set by reading the BOOL ASG      @
  3026. @              set in the interface procedure KERMIT. (If the BOOL ASG is      @
  3027. @              not found ASG_ROUTE is set FALSE). ASG_ROUTE is used when       @
  3028. @              checking valid characters for START-OF-PACKET etc. VME I/O      @
  3029. @              cannot handle all control characters, the ASG can handle        @
  3030. @              more than other communications controllers (eg NIC and CSC).    @
  3031. @                                                                              @
  3032. @           2. A warning message informs the user that VME KERMIT doesn't      @
  3033. @              use the standard Kermit START-OF-PACKET character.              @
  3034. @                                                                              @
  3035. @           3. Attempts to set START-OF-PACKET, END-OF-LINE or PAD-CHARACTER   @
  3036. @              to a character that cannot be handled by VME I/O are trapped.   @
  3037. @                                                                              @
  3038. @           4. VME KERMIT now does 8th bit prefixing correctly.                @
  3039. @                                                                              @
  3040. @           5. The EOF packet sent by VME KERMIT no longer contains the        @
  3041. @              data field from the last Data packet sent.                      @
  3042. @                                                                              @
  3043. @           6. The DELAY timer now works properly. Previously if the micro     @
  3044. @              Kermit sent a Nak before the DELAY timer had expired a VME      @
  3045. @              break-in occurred.                                              @
  3046. @                                                                              @
  3047. @           7. VME KERMIT in SERVER mode no longer sends the name of the       @
  3048. @              first file sent in the File_Hdr packet for second (and          @
  3049. @              subsequent) files requested via GET command on the remote       @
  3050. @              Kermit.                                                         @
  3051. @                                                                              @
  3052. @           8. VME KERMIT can now receive a batch of files sent by a micro     @
  3053. @              Kermit using a wildcard send. Previously VME Kermit output      @
  3054. @              several generations of the same filename.                       @
  3055. @                                                                              @
  3056. @           9. The way VME KERMIT standardises filenames has been improved.    @
  3057. @              (VME filenames don't conform to the form 'name.type' as         @
  3058. @              in the Kermit protocol: see KMT_SP_STANDARDISE_FILENAME)        @
  3059. @                                                                              @
  3060. @          10. Resources are released after each transfer so that a file       @
  3061. @              that has just been sent to VME can be accessed by other users.  @
  3062. @                                                                              @
  3063. @          11. The DEBUG information at PACKET level is now in a more          @
  3064. @              readable form.                                                  @
  3065. @                                                                              @
  3066. @------------------------------------------------------------------------------@
  3067.  
  3068.  
  3069. @ Mode declarations: @
  3070.  
  3071. MODE KMT_BUFFER IS (96)BYTE;
  3072. MODE KMT_STRING IS REF()BYTE;
  3073. MODE KMT_WORD IS REF()BYTE;
  3074.  
  3075. MODE KMT_MTM_VALUES IS ANY
  3076.   (LONG WORD      LW_VALUE,
  3077.    LONG INT       LI_VALUE,
  3078.    REF WORD       RW_VALUE,
  3079.    REF INT        RI_VALUE,
  3080.    REF LONG WORD  RLW_VALUE,
  3081.    REF LONG INT   RLI_VALUE,
  3082.    REF()BYTE      RVB_VALUE,
  3083.    REF()REF()BYTE RVRVB_VALUE);
  3084.  
  3085. MODE KMT_PP_PACKET_STATISTICS_S IS STRUCT
  3086.    (INT INPUT_TOTAL,
  3087.         OUTPUT_TOTAL);
  3088.  
  3089.  
  3090.  
  3091. @ External procedures @
  3092.  
  3093. EXT PROC (RESPONSE)                              KMT_UI;
  3094.  
  3095. EXT PROC (REF INT,INT,RESPONSE)                  KMT_PH;
  3096.  
  3097. EXT PROC (REF INT,REF INT,RESPONSE)              KMT_PP_GET_PACKET,
  3098.     PROC (INT,INT,BOOL,RESPONSE)                 KMT_PP_SEND_PACKET,
  3099.     PROC (REF()BYTE,RESPONSE)            KMT_PP_BUILD_STRING_PACKET_DATA;
  3100.  
  3101. EXT PROC (RESPONSE)                              KMT_DH_OPEN_FILE,
  3102.     PROC (RESPONSE)                              KMT_DH_CLOSE_FILE;
  3103.  
  3104. EXT PROC (RESPONSE)                      KMT_EH_INFORM_PE_CONTINGENCY;
  3105.  
  3106. EXT PROC (RESPONSE)                              KMT_FH_CLOSE_FILE,
  3107.     PROC (RESPONSE)                              KMT_FH_SAVE_FILE;
  3108.  
  3109. EXT PROC (INT,REF()KMT_MTM_VALUES) INT            KMT_SP_MTM;
  3110.  
  3111. EXT PROC (REF KMT_STRING) KMT_WORD                KMT_SP_GET_WORD;
  3112.  
  3113. EXT PROC ()                                       KMT_SP_SET_DEFAULTS;
  3114.  
  3115. EXT PROC (INT,REF()KMT_MTM_VALUES)                KMT_SP_LOG_TRACE_MESSAGE;
  3116.  
  3117. EXT (<PREFIX "ICLCTM">)
  3118.     PROC ()                                       ENDJOB;
  3119. EXT (<PREFIX "ICLCTM">)
  3120.     PROC (WORD,WORD,REF()BYTE,RESPONSE)           CTM_LOG;
  3121. EXT (<PREFIX "ICLCTM">)
  3122.     PROC (RESPONSE)                               CTM_JS_BEGIN;
  3123. EXT (<PREFIX "ICLCTM">)
  3124.     PROC (RESPONSE)                               CTM_JS_END;
  3125. EXT (<PREFIX "ICLCTM">)
  3126.     PROC (REF () BYTE,LONG WORD,REF () WORD,REF LONG LONG WORD,RESPONSE)
  3127.                                                   CTM_JS_CALL;
  3128. EXT (<PREFIX "ICLCTM">)
  3129.     PROC (REF () BYTE,REF LONG INT,REF () BYTE,REF BOOL,RESPONSE)
  3130.                                                   CTM_JS_READ;
  3131.  
  3132. @ External constants: @
  3133.  
  3134. EXT INT UNSET,EXIT,LOGOUT,FATAL_ERROR;  @ Miscellaneous constants @
  3135.  
  3136. EXT INT SERVER_MODE,COMMAND_MODE;
  3137.  
  3138. EXT INT REC_SERVER_IDLE,REC_INIT,SEND_INIT,ENTRY,ABORT,COMPLETE;
  3139.  
  3140. EXT INT ERROR_PKT;
  3141.  
  3142.  
  3143. @ External variables @
  3144.  
  3145. EXT REF () BYTE KMT_VERSION;
  3146.  
  3147. EXT REF BOOL ASG_ROUTE;
  3148.  
  3149. EXT REF()KMT_MTM_VALUES KMT_MTM_AREA;
  3150. EXT REF()BYTE MTM_TEXT;
  3151. EXT REF INT MTM_TEXT_LEN;
  3152. EXT REF ()REF ()BYTE MTM_RECALL_DATA;
  3153.  
  3154. EXT REF INT RC_IGNORED;
  3155.  
  3156. EXT REF INT PKT_SEQ,PKT_NO,PKT_TYPE;
  3157.  
  3158. EXT REF BOOL SAVE_INCOMPLETE_FILE;
  3159.  
  3160. EXT REF INT RETRY_COUNT,TIMEOUT_TOTAL;
  3161.  
  3162. EXT REF INT EXIT_STATE,KMT_CURRENT_MODE,KMT_PH_STATE;
  3163.  
  3164. EXT REF KMT_BUFFER KMT_VME_FILE_BUF,KMT_REM_FILE_BUF;
  3165.  
  3166. EXT REF KMT_WORD KMT_VME_FILE,KMT_REM_FILE;
  3167.  
  3168.  
  3169.  
  3170. GLOBAL STATIC PROC KMT_MESSAGE IS (INT MSG_NO,RESPONSE RESULT):
  3171.  
  3172.    @ outputs messages to terminal and journal file                             @
  3173.    @ if error returned from protocol handler, an error packet is sent          @
  3174.  
  3175.    BEGIN
  3176.       INT REPLY := UNSET,
  3177.           M := IF MSG_NO > 0
  3178.                THEN MSG_NO
  3179.                ELSE -MSG_NO               @ warning message codes are negative @
  3180.                FI;
  3181.       RESULT := 0;
  3182.  
  3183.       WHILE REPLY = UNSET
  3184.       DO                                                      @ expand message @
  3185.          REPLY := KMT_SP_MTM(M,KMT_MTM_AREA);
  3186.          IF REPLY = -1 OR REPLY = 0
  3187.          THEN
  3188.             CTM_LOG(3,6,MTM_TEXT(SIZE MTM_TEXT_LEN),RC_IGNORED);
  3189.  
  3190.             IF M = MSG_NO                 @ 1st message text from error number @
  3191.             THEN       @ protocol handler error, send 1st message in error pkt @
  3192.                KMT_PP_BUILD_STRING_PACKET_DATA(MTM_TEXT(SIZE MTM_TEXT_LEN),
  3193.                                                             RC_IGNORED);
  3194.                KMT_PP_SEND_PACKET(ERROR_PKT,PKT_SEQ,FALSE,RC_IGNORED);
  3195.                IF RC_IGNORED > 0
  3196.                THEN         @ fatal error sending packet! - continue expansion @
  3197.                              @ of current message, but ensure abort afterwards @
  3198.                   KMT_PH_STATE := ABORT;                     @ set abort state @
  3199.                   EXIT_STATE := FATAL_ERROR;
  3200.                   RESULT := -89061
  3201.                FI
  3202.             FI;
  3203.  
  3204.             IF REPLY = 0 AND RESULT NE 0
  3205.             THEN                        @ error sending packet, record message @
  3206.                M := -RESULT; RESULT := 0         @ zero result always returned @
  3207.             ELSE
  3208.                M := REPLY                    @ continue message text expansion @
  3209.             FI
  3210.          FI
  3211.       REPEAT
  3212.  
  3213.    END
  3214.  
  3215.    ; @ KMT_MESSAGE @
  3216.  
  3217.  
  3218.  
  3219. STATIC PROC KERMIT_SUPPORT IS (REF () BYTE OPTION,REF () BYTE VME_FILE,
  3220.                                REF () BYTE REM_FILE,RESPONSE RESULT):
  3221.  
  3222.    BEGIN
  3223.  
  3224.       INT KMT_OPTION;                       @ mode supplied on entry to Kermit @
  3225.  
  3226.  
  3227.       PROC VALIDATE_ARGS IS (RESPONSE RESULT):
  3228.  
  3229.          @ checks Kermit option and verifies that file arguments are           @
  3230.          @ present for Receive or Send options                                 @
  3231.          @ sets initial protocal handler state (where appropriate)             @
  3232.  
  3233.          BEGIN             @ remove leading and trailing spaces from filenames @
  3234.             ()BYTE VME_BUF := VME_FILE;
  3235.             KMT_WORD VME_PTR := VME_BUF;
  3236.             ()BYTE REM_BUF := REM_FILE;
  3237.             KMT_WORD REM_PTR := REM_BUF;
  3238.             KMT_VME_FILE := KMT_SP_GET_WORD(VME_PTR);
  3239.             KMT_REM_FILE := KMT_SP_GET_WORD(REM_PTR);
  3240.  
  3241.             KMT_MTM_AREA(3) := OPTION AS KMT_MTM_VALUES.RVB_VALUE;
  3242.  
  3243.             KMT_OPTION := KMT_CURRENT_MODE :=
  3244.                KMT_SP_MTM(5000,KMT_MTM_AREA(SIZE 4));        @ validate option @
  3245.  
  3246.             RESULT := 0;
  3247.  
  3248.             CASE KMT_OPTION
  3249.             THEN                     @ Server - no file args should be present @
  3250.                KMT_PH_STATE := REC_SERVER_IDLE;
  3251.                UNLESS KMT_VME_FILE REF NIL AND KMT_REM_FILE REF NIL
  3252.                DO
  3253.                   KMT_VME_FILE := NIL;
  3254.                   KMT_REM_FILE := NIL;
  3255.                   RESULT := -85000                                   @ warning @
  3256.                FI
  3257.             ELSE          @ Receive - VME_FILE may be present but not REM_FILE @
  3258.                KMT_PH_STATE := REC_INIT;
  3259.                UNLESS KMT_VME_FILE REF NIL
  3260.                DO
  3261.                   KMT_VME_FILE :=
  3262.                      KMT_VME_FILE_BUF(SIZE LENGTH KMT_VME_FILE) :=
  3263.                         KMT_VME_FILE
  3264.                FI;
  3265.                UNLESS KMT_REM_FILE REF NIL
  3266.                DO
  3267.                   KMT_REM_FILE := NIL;
  3268.                   RESULT := -85001                                   @ warning @
  3269.                FI
  3270.             ELSE       @ Send - VME_FILE must be present, REM_FILE is optional @
  3271.                KMT_PH_STATE := SEND_INIT;
  3272.                IF KMT_VME_FILE REF NIL
  3273.                THEN
  3274.                   EXIT_STATE := FATAL_ERROR;
  3275.                   RESULT := -85010                                     @ error @
  3276.                ELSE
  3277.                   KMT_VME_FILE :=
  3278.                      KMT_VME_FILE_BUF(SIZE LENGTH VME_FILE):=
  3279.                         KMT_VME_FILE;
  3280.                   UNLESS KMT_REM_FILE REF NIL
  3281.                   DO
  3282.                      KMT_REM_FILE :=
  3283.                         KMT_REM_FILE_BUF(SIZE LENGTH KMT_REM_FILE) :=
  3284.                            KMT_REM_FILE
  3285.                   FI
  3286.                FI
  3287.             ELSE               @ Command - no file arguments should be present @
  3288.                KMT_PH_STATE := UNSET;
  3289.                UNLESS KMT_VME_FILE REF NIL AND KMT_REM_FILE REF NIL
  3290.                DO
  3291.                   KMT_VME_FILE := NIL;
  3292.                   KMT_REM_FILE := NIL;
  3293.                   RESULT := -85000                                   @ warning @
  3294.                FI
  3295.             DEFAULT                                       @ invalid entry mode @
  3296.                EXIT_STATE := FATAL_ERROR;
  3297.                RESULT := -85020
  3298.             ESAC
  3299.          END
  3300.  
  3301.          ; @ VALIDATE_ARGS @
  3302.  
  3303.  
  3304.       PROC CLOSE_FILES IS (RESPONSE RESULT):
  3305.  
  3306.          @ close Kermit Send/Receive files when aborting                       @
  3307.  
  3308.          BEGIN
  3309.             INT RC;
  3310.             KMT_FH_CLOSE_FILE(RC);
  3311.             RESULT := IF RC <= 0
  3312.                       THEN 0                             @ ignore -ve warnings @
  3313.                       ELSE 89042                          @ error closing file @
  3314.                       FI;
  3315.             IF SAVE_INCOMPLETE_FILE
  3316.             THEN
  3317.                KMT_FH_SAVE_FILE(RC);
  3318.                IF RC > 0
  3319.                THEN RESULT := 89044                        @ error saving file @
  3320.                FI
  3321.             FI;
  3322.             KMT_VME_FILE := NIL;
  3323.             KMT_REM_FILE := NIL
  3324.          END
  3325.  
  3326.          ; @ CLOSE_FILES @
  3327.  
  3328.  
  3329.       @ main Kermit segment @
  3330.  
  3331.       EXIT_STATE := UNSET;
  3332.  
  3333.       KMT_SP_SET_DEFAULTS();
  3334.  
  3335.       @ initialise message text area @
  3336.       KMT_MTM_AREA(SIZE 3) :=
  3337.          (MTM_TEXT AS KMT_MTM_VALUES.RVB_VALUE,
  3338.           MTM_TEXT_LEN AS KMT_MTM_VALUES.RI_VALUE,
  3339.           MTM_RECALL_DATA AS KMT_MTM_VALUES.RVRVB_VALUE);
  3340.  
  3341.       KMT_MTM_AREA(3 SIZE 2) := (1           AS KMT_MTM_VALUES.LI_VALUE,
  3342.                                  KMT_VERSION AS KMT_MTM_VALUES.RVB_VALUE);
  3343.  
  3344.       KMT_MESSAGE(-1,RC_IGNORED);                             @ output banners @
  3345.       KMT_SP_LOG_TRACE_MESSAGE(2,NIL);
  3346.  
  3347.       VALIDATE_ARGS(RESULT);
  3348.       IF RESULT NE 0
  3349.       THEN    @ output message & continue (n.b. exit state may be fatal_error) @
  3350.          KMT_MESSAGE(RESULT,RESULT)
  3351.       FI;
  3352.       KMT_DH_OPEN_FILE(RESULT);
  3353.       IF RESULT NE 0
  3354.       THEN
  3355.          KMT_MESSAGE(RESULT,RESULT);
  3356.          EXIT_STATE := FATAL_ERROR
  3357.       FI;
  3358.  
  3359.       IF CTM_JS_BEGIN(RESULT);                           @ start new SCL block @
  3360.          RESULT > 0
  3361.       THEN
  3362.          EXIT_STATE := FATAL_ERROR
  3363.       FI;
  3364.  
  3365.       IF EXIT_STATE = UNSET
  3366.       THEN                       @ notify user of non-standard START-OF-PACKET @
  3367.          KMT_MESSAGE(-3,RC_IGNORED)
  3368.       FI;
  3369.  
  3370.       WHILE EXIT_STATE = UNSET
  3371.       DO
  3372.          RESULT := 0;                            @ everything ok at this point @
  3373.          IF KMT_CURRENT_MODE = COMMAND_MODE
  3374.          THEN   @ get command from user, if command is SERVER, SEND or RECEIVE @
  3375.                 @ then KMT_CURRENT_MODE and KMT_PH_STATE will be reset         @
  3376.             KMT_UI(RESULT);
  3377.             IF RESULT NE 0
  3378.             THEN
  3379.                KMT_MESSAGE(RESULT,RESULT)
  3380.             FI
  3381.          ELSE    @ sending or receiving, carry out action on entry to protocol @
  3382.                  @ handler state, wait for a packet, then carry out action in  @
  3383.                  @ response to type of packet received                         @
  3384.             KMT_PH(KMT_PH_STATE,ENTRY,RESULT);
  3385.             IF RESULT = 0
  3386.             THEN
  3387.                KMT_PP_GET_PACKET(PKT_TYPE,PKT_NO,RESULT);
  3388.                IF RESULT = 39854                                     @ timeout @
  3389.                THEN
  3390.                   TIMEOUT_TOTAL := TIMEOUT_TOTAL + 1;
  3391.                   RESULT := 0
  3392.                FI;
  3393.                IF RESULT <= 0
  3394.                THEN                  @ warning message already ouput, continue @
  3395.                   RESULT := 0;
  3396.                   KMT_PH(KMT_PH_STATE,PKT_TYPE,RESULT)
  3397.                FI
  3398.             FI;
  3399.             IF RESULT NE 0
  3400.             THEN
  3401.                KMT_MESSAGE(RESULT,RESULT)
  3402.             FI;
  3403.  
  3404.             IF KMT_PH_STATE = ABORT
  3405.             THEN
  3406.                CLOSE_FILES(RESULT);
  3407.                IF RESULT NE 0
  3408.                THEN
  3409.                   KMT_MESSAGE(RESULT,RESULT)
  3410.                FI;
  3411.                KMT_PH_STATE := COMPLETE
  3412.             FI;
  3413.  
  3414.             IF KMT_PH_STATE = COMPLETE
  3415.             THEN
  3416.                IF CTM_JS_END(RESULT);                @ close current SCL block @
  3417.                   RESULT > 0
  3418.                THEN
  3419.                   EXIT_STATE := FATAL_ERROR
  3420.                ELSF CTM_JS_BEGIN(RESULT);                 @ open new SCL block @
  3421.                   RESULT > 0
  3422.                THEN
  3423.                   EXIT_STATE := FATAL_ERROR
  3424.                ELSE
  3425.                   PKT_SEQ := 0;                         @ zero packet sequence @
  3426.                   IF KMT_CURRENT_MODE = SERVER_MODE
  3427.                   THEN         @ remain in Server mode until EXIT_STATE is set @
  3428.                        @ (may already have been set by Server Generic command) @
  3429.                      KMT_PH_STATE := REC_SERVER_IDLE;
  3430.                      RETRY_COUNT := 0
  3431.                   ELSF KMT_OPTION = COMMAND_MODE
  3432.                   THEN     @ resume Command mode on completion of Send/Receive @
  3433.                      KMT_CURRENT_MODE := COMMAND_MODE
  3434.                   ELSE     @ Send or Receive specified in VME command, exit on @
  3435.                      EXIT_STATE := EXIT                           @ completion @
  3436.                   FI
  3437.                FI
  3438.             FI
  3439.          FI
  3440.       REPEAT;
  3441.  
  3442.       CTM_JS_END(RC_IGNORED);                        @ close current SCL block @
  3443.  
  3444.       KMT_DH_CLOSE_FILE(RC_IGNORED);                     @ close logging files @
  3445.  
  3446.       IF EXIT_STATE = FATAL_ERROR
  3447.       THEN
  3448.          KMT_MESSAGE(-85030,RC_IGNORED)                            @ tell user @
  3449.       ELSF EXIT_STATE = LOGOUT
  3450.       THEN             @ log out Kermit after receiving Generic Logout command @
  3451.          KMT_MESSAGE(-85031,RC_IGNORED);
  3452.          ENDJOB()
  3453.       ELSE
  3454.          KMT_MESSAGE(-85032,RC_IGNORED)                       @ output newline @
  3455.       FI
  3456.  
  3457.    END
  3458.  
  3459.    ; @ KERMIT_SUPPORT @
  3460.  
  3461.  
  3462. GLOBAL STATIC (<STATUS 5;PSPACE 10001; TEMPLATE>) PROC KERMIT_THE_FROG IS
  3463.       ((<LIT "COMMAND">)             REF()BYTE OPTION,
  3464.        (<LIT ""       >)             REF()BYTE VME_FILE,
  3465.        (<LIT ""       >)             REF()BYTE REM_FILE,
  3466.        (<KEY RESPONSE;DEF N'RESULT>) RESPONSE RESULT):
  3467.  
  3468.    BEGIN
  3469.  
  3470.       ()BYTE JSV_NAME := "ASG";              @ obtain value for ASG_ROUTE bool @
  3471.       CTM_JS_READ(JSV_NAME,NIL,NIL,ASG_ROUTE,RC_IGNORED);
  3472.       IF RC_IGNORED NE 0 THEN ASG_ROUTE := FALSE FI;
  3473.  
  3474.       @ verify parameter references (parameter values validated later):        @
  3475.       @    OPTION   must be of mode REF () BYTE, may not be ZLR or NIL         @
  3476.       @    VME_FILE must be of mode REF () BYTE, may be ZLR, must not be NIL   @
  3477.       @    REM_FILE must be of mode REF () BYTE, may be ZLR, must not be NIL   @
  3478.  
  3479.       UNLESS (VERIFY OPTION AND VALIDR OPTION)
  3480.       AND    (VERIFY VME_FILE AND (VALIDR VME_FILE OR NOT(VME_FILE IS NIL)))
  3481.       AND    (VERIFY REM_FILE AND (VALIDR REM_FILE OR NOT(REM_FILE IS NIL)))
  3482.       THEN                                       @ invalid parameter reference @
  3483.          RESULT := 10002 @ ARCH_INACCESSIBLE_PARAMETER @
  3484.  
  3485.       ELSF                                             @ create resource block @
  3486.          CTM_JS_BEGIN(RESULT);
  3487.          RESULT <= 0
  3488.       THEN                                            @ resource block created @
  3489.          LONG LONG WORD KERMIT_RESULT;
  3490.          ANY((3)LONG WORD AS_LW,(6) WORD AS_W) PARAMS;
  3491.          PARAMS.AS_LW := (BDESC OPTION,BDESC VME_FILE,BDESC REM_FILE);
  3492.  
  3493.                                                 @ set up program error handler @
  3494.          IF  KMT_EH_INFORM_PE_CONTINGENCY(RESULT);
  3495.               RESULT > 0
  3496.          THEN                                    @ failed to set error handler @
  3497.             SKIP
  3498.          ELSF CTM_JS_CALL(NIL,PDESC KERMIT_SUPPORT,PARAMS.AS_W,KERMIT_RESULT,
  3499.                           RESULT);                           @ create firewall @
  3500.               RESULT <= 0
  3501.          THEN                         @ either exited normally or via CTM_STOP @
  3502.             RESULT := IF (S'S'KERMIT_RESULT) <= 0
  3503.                       THEN 0                                 @ ignore warnings @
  3504.                       ELSE 52000              @ error return common resultcode @
  3505.                       FI
  3506.          FI;
  3507.  
  3508.          CTM_JS_END(RC_IGNORED)                           @ end resource block @
  3509.       FI
  3510.  
  3511.    END
  3512.  
  3513.    ; @ KERMIT_THE_FROG @
  3514.  
  3515. ENDMODULE @ KMT_MAIN_MODULE @
  3516. $$$$ KMT_PH_MODULE
  3517. MODULE KMT_PH_MODULE;
  3518.  
  3519. @ VME KERMIT PROTOCOL HANDLER @
  3520.  
  3521. @ GLOBAL VARIABLES @
  3522.  
  3523. @   PKT_TYPE                    : packet type of current packet     @
  3524. @   KMT_PH_INPUT_PACKET_DATA    : pointer to packet data buffer     @
  3525. @                                (translated to EBCDIC and decoded) @
  3526. @   PKT_SEQ                     : current packet number (expected)  @
  3527. @   PKT_NO                      : current packet number (received)  @
  3528. @   RETRY_COUNT                 : current retry count               @
  3529.  
  3530.  
  3531. @ Mode declarations: @
  3532.  
  3533. MODE KMT_BUFFER IS (96)BYTE;
  3534. MODE KMT_STRING IS REF()BYTE;
  3535. MODE KMT_WORD IS REF()BYTE;
  3536.  
  3537. MODE KMT_MTUP_VALUES IS ANY
  3538.   (LONG WORD      LW_VALUE,
  3539.    LONG INT       LI_VALUE,
  3540.    REF WORD       RW_VALUE,
  3541.    REF INT        RI_VALUE,
  3542.    REF LONG WORD  RLW_VALUE,
  3543.    REF LONG INT   RLI_VALUE,
  3544.    REF()BYTE      RVB_VALUE,
  3545.    REF()REF()BYTE RVRVB_VALUE);
  3546.  
  3547. MODE KMT_PP_PACKET_STATISTICS_S IS STRUCT
  3548.    (INT INPUT_TOTAL,
  3549.         OUTPUT_TOTAL);
  3550.  
  3551. MODE KMT_TRACE_FLAGS_S IS WORD STRUCT
  3552.   (BIT    PH_TRACING,
  3553.           PP_TRACING,
  3554.           FH_TRACING,
  3555.           DH_TRACING,
  3556.    28-BIT SPARE);
  3557.  
  3558.  
  3559. @ External procedures @
  3560.  
  3561. EXT PROC (INT,RESPONSE)             KMT_MESSAGE;
  3562.  
  3563. EXT PROC (RESPONSE)                 KMT_UI;
  3564.  
  3565. EXT PROC (REF()BYTE,INT,RESPONSE)          KMT_FH_OPEN_FILE,
  3566.     PROC (RESPONSE)                        KMT_FH_CLOSE_FILE,
  3567.     PROC (RESPONSE)                        KMT_FH_SAVE_FILE,
  3568.     PROC (REF()BYTE,REF INT,BOOL,RESPONSE) KMT_FH_GIVE_NAME;
  3569.  
  3570. EXT PROC ()                         KMT_PP_TRANSLATE_TO_EBCDIC,
  3571.     PROC (REF()BYTE,RESPONSE)       KMT_PP_BUILD_STRING_PACKET_DATA,
  3572.     PROC (RESPONSE)                 KMT_PP_PROCESS_PARAM_PACKET_DATA,
  3573.     PROC ()                         KMT_PP_BUILD_PARAM_PACKET_DATA,
  3574.     PROC (RESPONSE)                 KMT_PP_BUILD_FILE_RECORD,
  3575.     PROC (RESPONSE)                 KMT_PP_BUILD_FILE_PACKET_DATA,
  3576.     PROC (REF INT,REF INT,RESPONSE) KMT_PP_GET_PACKET,
  3577.     PROC (INT,INT,BOOL,RESPONSE)    KMT_PP_SEND_PACKET;
  3578.      @ Any error returned by KMT_PP_SEND_PACKET is fatal and Kermit will exit; @
  3579.      @ warnings will have been logged already and are ignored                  @
  3580.  
  3581. EXT PROC (REF KMT_STRING) KMT_WORD  KMT_SP_GET_WORD,
  3582.     PROC (REF KMT_WORD,INT)         KMT_SP_STANDARDISE_FILENAME,
  3583.     PROC (INT,REF()KMT_MTUP_VALUES) KMT_SP_LOG_TRACE_MESSAGE;
  3584.  
  3585. EXT REF INT PKT_SEQ,PKT_NO,MAXTRY,RETRY_COUNT,RETRY_TOTAL,TIMEOUT_TOTAL,
  3586.             RC_IGNORED;
  3587.  
  3588. EXT REF KMT_STRING KMT_PH_INPUT_PACKET_DATA;
  3589.  
  3590. EXT REF KMT_BUFFER KMT_VME_FILE_BUF,KMT_REM_FILE_BUF;
  3591. EXT REF KMT_WORD KMT_VME_FILE,KMT_REM_FILE;
  3592.  
  3593. EXT INT ENTRY,BREAK_PKT,DATA_PKT,FILE_HDR_PKT,NAK_PKT,SEND_INIT_PKT,ACK_PKT,
  3594.         EOF_PKT;
  3595.  
  3596. EXT INT VME_TERM,VME_STD,KMT_STD;              @ forms of name standardisation @
  3597.  
  3598. EXT INT REC_SERVER_IDLE,REC_INIT,REC_FILE,REC_DATA,SEND_INIT,SEND_FILE,
  3599.         SEND_DATA,SEND_EOF,SEND_BREAK,COMPLETE,ABORT;
  3600.  
  3601. EXT INT EXIT,LOGOUT,FATAL_ERROR;                                 @ exit states @
  3602.  
  3603. EXT INT EOF;                                                @ eof on file data @
  3604.  
  3605. EXT INT SERVER_MODE;
  3606.  
  3607. EXT REF INT KMT_CURRENT_MODE;
  3608.  
  3609. EXT BOOL READ_INT,NO_READ_INT;        @ set/don't set read interest after send @
  3610.  
  3611. EXT REF INT FILE_OPTION;
  3612.  
  3613. EXT REF BOOL DELAY_TIMER;
  3614.  
  3615. EXT REF BOOL SAVE_INCOMPLETE_FILE;
  3616.  
  3617. EXT REF INT EXIT_STATE;
  3618.  
  3619. EXT REF()KMT_MTUP_VALUES KMT_MTM_AREA;
  3620.  
  3621. EXT REF KMT_PP_PACKET_STATISTICS_S KMT_PP_PACKET_STATISTICS;
  3622.  
  3623. EXT REF KMT_TRACE_FLAGS_S KMT_TRACE_FLAGS;
  3624.  
  3625.  
  3626.  
  3627.  
  3628. STATIC REF KMT_STRING PKT_DATA IS KMT_PH_INPUT_PACKET_DATA;
  3629.  
  3630.  
  3631.  
  3632.  
  3633. GLOBAL
  3634. STATIC (<STATUS 5>)
  3635. PROC
  3636.    KMT_PH IS (REF INT STATE,INT EVENT,RESPONSE RESULT):
  3637.  
  3638.    BEGIN
  3639.  
  3640.       @ procedures for state entry @
  3641.  
  3642.       SIM PROC KMT_PH_REC_SERVER_IDLE IS GROUP KMT_PH_GRP (RESPONSE RESULT):
  3643.  
  3644.          @ Server idle, waiting for message                                    @
  3645.  
  3646.          BEGIN
  3647.             RETRY_COUNT := 0;          @ try for ever in Rec_Server_Idle state @
  3648.             RETRY_TOTAL := TIMEOUT_TOTAL := 0;
  3649.             KMT_PP_PACKET_STATISTICS := (0,0);
  3650.             PKT_SEQ := 0;                         @ initialise packet sequence @
  3651.             RESULT := 0
  3652.          END
  3653.  
  3654.          ; @ KMT_PH_REC_SERVER_IDLE @
  3655.  
  3656.  
  3657.       SIM PROC KMT_PH_REC_INIT IS GROUP KMT_PH_GRP (RESPONSE RESULT):
  3658.  
  3659.          @ Entry point for non-server RECEIVE command                          @
  3660.  
  3661.          BEGIN
  3662.             PKT_SEQ := 0;                         @ initialise packet sequence @
  3663.             RESULT := 0
  3664.          END
  3665.  
  3666.          ; @ KMT_PH_REC_INIT @
  3667.  
  3668.  
  3669.       SIM PROC KMT_PH_REC_FILE IS GROUP KMT_PH_GRP (RESPONSE RESULT):
  3670.  
  3671.          @ Look for a file header or EOT message                               @
  3672.  
  3673.             RESULT := 0             @ nothing to do on entry to Rec_File state @
  3674.  
  3675.          ; @ KMT_PH_REC_FILE @
  3676.  
  3677.  
  3678.       SIM PROC KMT_PH_REC_DATA IS GROUP KMT_PH_GRP (RESPONSE RESULT):
  3679.  
  3680.          @ Receive data up to end of file                                      @
  3681.  
  3682.             RESULT := 0             @ nothing to do on entry to Rec_Data state @
  3683.  
  3684.          ; @ KMT_PH_REC_DATA @
  3685.  
  3686.  
  3687.       SIM PROC KMT_PH_SEND_INIT IS GROUP KMT_PH_GRP (RESPONSE RESULT):
  3688.  
  3689.          @ Server Send Init, also entry for non-server SEND command            @
  3690.  
  3691.          BEGIN
  3692.             PKT_SEQ := 0;                         @ initialise packet sequence @
  3693.  
  3694.             IF KMT_CURRENT_MODE NE SERVER_MODE AND RETRY_COUNT LE 1
  3695.             THEN                       @ wait for user to set up remote KERMIT @
  3696.                INT KMT_EH_SOFTWARE_ERROR IS 80101;
  3697.                INT X_TYPE,X_NO;
  3698.                DELAY_TIMER := TRUE;                          @ set delay timer @
  3699.                KMT_PP_GET_PACKET(X_TYPE,X_NO,RESULT);@ attempt to read packet @
  3700.                             @ if we get a packet then they're ready to receive @
  3701.                                 @ if the timer expires then we send regardless @
  3702.                DELAY_TIMER := FALSE;
  3703.                UNLESS RESULT = KMT_EH_SOFTWARE_ERROR
  3704.                DO
  3705.                   RESULT := 0
  3706.                FI
  3707.             ELSE
  3708.                RESULT := 0
  3709.             FI;
  3710.  
  3711.             IF RESULT = 0
  3712.             THEN
  3713.                KMT_PP_BUILD_PARAM_PACKET_DATA();   @ send S(0) with parameters @
  3714.                KMT_PP_SEND_PACKET(SEND_INIT_PKT,PKT_SEQ,READ_INT,RESULT);
  3715.                RESULT := IF RESULT <= 0 THEN 0 ELSE -89061 FI
  3716.             FI
  3717.          END
  3718.  
  3719.          ; @ KMT_PH_SEND_INIT @
  3720.  
  3721.  
  3722.       SIM PROC KMT_PH_SEND_FILE IS GROUP KMT_PH_GRP (RESPONSE RESULT):
  3723.  
  3724.          @ Send file or text header (we don't send text packets!)              @
  3725.  
  3726.          BEGIN                  @ send F(n) - packet made by KMT_PH_READY_FILE @
  3727.             KMT_PP_SEND_PACKET(FILE_HDR_PKT,PKT_SEQ,READ_INT,RESULT);
  3728.             RESULT := IF RESULT <= 0 THEN 0 ELSE -89061 FI
  3729.          END
  3730.  
  3731.          ; @ KMT_PH_SEND_FILE @
  3732.  
  3733.  
  3734.       SIM PROC KMT_PH_SEND_DATA IS GROUP KMT_PH_GRP (RESPONSE RESULT):
  3735.  
  3736.             @ Send contents of file or textual information                     @
  3737.             @ (we don't send text packets!)                                    @
  3738.  
  3739.          BEGIN @ send D(n) with current buffer (pkt made by KMT_PH_READY_DATA) @
  3740.             KMT_PP_SEND_PACKET(DATA_PKT,PKT_SEQ,READ_INT,RESULT);
  3741.             RESULT := IF RESULT <= 0 THEN 0 ELSE -89061 FI
  3742.          END
  3743.  
  3744.          ; @ KMT_PH_SEND_DATA @
  3745.  
  3746.  
  3747.       SIM PROC KMT_PH_SEND_EOF IS GROUP KMT_PH_GRP (RESPONSE RESULT):
  3748.  
  3749.          @ Send end of file indicator (we don't do interrupts)                 @
  3750.  
  3751.          BEGIN
  3752.             KMT_VME_FILE := NIL;                        @ file has been closed @
  3753.             KMT_REM_FILE := NIL;
  3754.                                 @ send Z(n) - packet made by KMT_PH_READY_DATA @
  3755.             KMT_PP_SEND_PACKET(EOF_PKT,PKT_SEQ,READ_INT,RESULT);
  3756.             RESULT := IF RESULT <= 0 THEN 0 ELSE -89061 FI
  3757.          END
  3758.  
  3759.          ; @ KMT_PH_SEND_EOF @
  3760.  
  3761.  
  3762.       SIM PROC KMT_PH_SEND_BREAK IS GROUP KMT_PH_GRP (RESPONSE RESULT):
  3763.  
  3764.          @ End of Transmission                                                 @
  3765.  
  3766.          BEGIN                  @ send B(n)  - packet made by KMT_PH_SENT_FILE @
  3767.             KMT_PP_SEND_PACKET(BREAK_PKT,PKT_SEQ,READ_INT,RESULT);
  3768.             RESULT := IF RESULT <= 0 THEN 0 ELSE -89061 FI
  3769.          END
  3770.  
  3771.          ; @ KMT_PH_SEND_BREAK @
  3772.  
  3773.  
  3774.  
  3775.       @ procedures for expected packets @
  3776.  
  3777.       SIM PROC KMT_PH_INIT_PARAMS IS GROUP KMT_PH_GRP (RESPONSE RESULT):
  3778.  
  3779.          @ A Send_Init or Init packet has arrived. If the packet sequence is   @
  3780.          @ correct, process their parameters and ack with our parameters.      @
  3781.          @ If it's a repeat of their last packet, ack it again with our        @
  3782.          @ parameters. Otherwise, report error and in non-Server modes, abort  @
  3783.  
  3784.             IF (STATE = REC_SERVER_IDLE OR STATE = REC_INIT) AND PKT_NO = 0
  3785.             THEN                         @ got right packet, reset retry count @
  3786.                RETRY_COUNT := 0;
  3787.                KMT_PP_PROCESS_PARAM_PACKET_DATA(RESULT);
  3788.                IF RESULT = 0
  3789.                THEN
  3790.                   KMT_PP_BUILD_PARAM_PACKET_DATA();
  3791.                   KMT_PP_SEND_PACKET(ACK_PKT,PKT_SEQ,READ_INT,RESULT);
  3792.                   RESULT := IF RESULT <= 0 THEN 0 ELSE -89061 FI;
  3793.                   IF RESULT = 0 AND EVENT = SEND_INIT_PKT
  3794.                   THEN                             @ increment packet sequence @
  3795.                      PKT_SEQ := PKT_SEQ+1 MOD 64;
  3796.                      STATE := REC_FILE
  3797.                   FI
  3798.                ELSE                                @ their params unacceptable @
  3799.                   RESULT := 89070
  3800.                FI
  3801.             ELSF STATE = REC_FILE AND PKT_NO+1 MOD 64 = PKT_SEQ @ i.e. P = N-1 @
  3802.             THEN          @ we've picked up their Send_init again, so send ack @
  3803.                KMT_PP_BUILD_PARAM_PACKET_DATA();
  3804.                KMT_PP_SEND_PACKET(ACK_PKT,PKT_NO,READ_INT,RESULT);
  3805.                RESULT := IF RESULT <= 0 THEN 0 ELSE -89061 FI
  3806.             ELSE          @ wrong packet sequence, error (abort if non-server) @
  3807.                RESULT := 89000
  3808.             FI
  3809.  
  3810.          ; @ KMT_PH_INIT_PARAMS @
  3811.  
  3812.  
  3813.       SIM PROC KMT_PH_GEN_CMD IS GROUP KMT_PH_GRP (RESPONSE RESULT):
  3814.  
  3815.          @ Generic command received - some are implemented and will be         @
  3816.          @ executed and acknowledged - an error packet is sent for the rest    @
  3817.  
  3818.             IF PKT_NO = 0
  3819.             THEN
  3820.                BYTE GEN_CMD;
  3821.                KMT_PP_TRANSLATE_TO_EBCDIC();
  3822.                GEN_CMD := PKT_DATA(0);
  3823.                RETRY_COUNT := 0;         @ got right packet, reset retry count @
  3824.  
  3825.                                         @ check if Generic Command implemented @
  3826.                IF GEN_CMD = "F" OR GEN_CMD = "L"
  3827.                THEN      @ GF (Finish command): exit Server mode and terminate @
  3828.                          @ GL (Logout command): exit Server mode and log out   @
  3829.                   EXIT_STATE := IF GEN_CMD = "F" THEN EXIT ELSE LOGOUT FI;
  3830.                   STATE := COMPLETE;
  3831.                                           @ Generic Command successful, ack it @
  3832.                   KMT_PP_BUILD_STRING_PACKET_DATA(NIL,RC_IGNORED);
  3833.                   KMT_PP_SEND_PACKET(ACK_PKT,PKT_SEQ,READ_INT,RESULT);
  3834.                   RESULT := IF RESULT <= 0 THEN 0 ELSE -89061 FI
  3835.                ELSE  @ this Generic Command not implemented (or doesn't exist) @
  3836.                   RESULT := 89011
  3837.                FI
  3838.             ELSE                @ wrong packet number, wait for their next try @
  3839.                RESULT := 89000
  3840.             FI
  3841.  
  3842.          ; @ KMT_PH_GEN_CMD @
  3843.  
  3844.  
  3845.       SIM PROC KMT_PH_KMT_CMD IS GROUP KMT_PH_GRP (RESPONSE RESULT):
  3846.  
  3847.          @ Packet contains Kermit command, pass it to user interface (KMT_UI)  @
  3848.          @ for processing                                                      @
  3849.  
  3850.             IF PKT_NO = 0
  3851.             THEN
  3852.                RETRY_COUNT := 0;         @ got right packet, reset retry count @
  3853.                                           @ pass command (in packet) to KMT_UI @
  3854.                KMT_PP_BUILD_STRING_PACKET_DATA(NIL,RC_IGNORED);
  3855.                KMT_PP_TRANSLATE_TO_EBCDIC();
  3856.                KMT_UI(RESULT);
  3857.                IF RESULT = 0
  3858.                THEN         @ command has been executed successfully so ack it @
  3859.                           @ if there is a reply, KMT_UI has put it into packet @
  3860.                   KMT_PP_SEND_PACKET(ACK_PKT,PKT_SEQ,READ_INT,RESULT);
  3861.                   RESULT := IF RESULT <= 0 THEN 0 ELSE -89061 FI
  3862.                FI
  3863.             ELSE                @ wrong packet number, wait for their next try @
  3864.                RESULT := 89000
  3865.             FI
  3866.  
  3867.          ; @ KMT_PH_KMT_CMD @
  3868.  
  3869.  
  3870.       SIM PROC KMT_PH_GOT_FILENAME IS GROUP KMT_PH_GRP (RESPONSE RESULT):
  3871.  
  3872.          @ Packet contains name of file to be sent                             @
  3873.  
  3874.             IF PKT_NO = 0
  3875.             THEN                         @ got right packet, reset retry count @
  3876.                RETRY_COUNT := 0;
  3877.                KMT_PP_TRANSLATE_TO_EBCDIC();
  3878.                KMT_VME_FILE := KMT_SP_GET_WORD(PKT_DATA);    @ obtain filename @
  3879.                IF NOT (KMT_VME_FILE REF NIL)                 @ must be present @
  3880.                THEN
  3881.                   KMT_VME_FILE :=
  3882.                      KMT_VME_FILE_BUF(SIZE LENGTH KMT_VME_FILE) :=
  3883.                         KMT_VME_FILE;
  3884.                   STATE := SEND_INIT;
  3885.                   RESULT := 0
  3886.                ELSE                             @ no filename, error and abort @
  3887.                   RESULT := 89030
  3888.                FI
  3889.             ELSE                @ wrong packet number, wait for their next try @
  3890.                RESULT := 89000
  3891.             FI
  3892.  
  3893.          ; @ KMT_PH_GOT_FILENAME @
  3894.  
  3895.  
  3896.       SIM PROC KMT_PH_BREAK IS GROUP KMT_PH_GRP (RESPONSE RESULT):
  3897.  
  3898.          @ End of Transmission received                                        @
  3899.  
  3900.             IF PKT_NO = PKT_SEQ
  3901.             THEN                       @ correct sequence, ack it and complete @
  3902.                KMT_PP_BUILD_STRING_PACKET_DATA(NIL,RC_IGNORED);
  3903.                KMT_PP_SEND_PACKET(ACK_PKT,PKT_SEQ,NO_READ_INT,RESULT);
  3904.                RESULT := IF RESULT <= 0 THEN 0 ELSE -89061 FI;
  3905.                STATE := COMPLETE
  3906.             ELSE                          @ wrong packet sequence, error abort @
  3907.                RESULT := 89000
  3908.             FI
  3909.  
  3910.          ; @ KMT_PH_BREAK @
  3911.  
  3912.  
  3913.       SIM PROC KMT_PH_FILE_HDR IS GROUP KMT_PH_GRP (RESPONSE RESULT):
  3914.  
  3915.          @ Packet contains name of file to be received                         @
  3916.  
  3917.             IF PKT_NO = PKT_SEQ
  3918.             THEN @ obtain filename (may have been specified in Receive command)@
  3919.                KMT_PP_TRANSLATE_TO_EBCDIC();
  3920.                IF KMT_VME_FILE REF NIL
  3921.                THEN                                          @ not already set @
  3922.                   KMT_VME_FILE := KMT_SP_GET_WORD(PKT_DATA);
  3923.                   IF KMT_VME_FILE REF NIL
  3924.                   THEN
  3925.                      RESULT := 80931
  3926.                   ELSE
  3927.                      KMT_VME_FILE :=
  3928.                         KMT_VME_FILE_BUF(SIZE LENGTH KMT_VME_FILE) :=
  3929.                            KMT_VME_FILE;
  3930.                      RESULT := 0
  3931.                   FI
  3932.                ELSE          @ already set but verify packet contains filename @
  3933.                   KMT_REM_FILE := KMT_SP_GET_WORD(PKT_DATA);
  3934.                   RESULT := IF KMT_REM_FILE REF NIL THEN 80931 ELSE 0 FI
  3935.                FI;
  3936.  
  3937.                IF RESULT = 0
  3938.                THEN                                                @ open file @
  3939.                   KMT_REM_FILE :=                  @ save copy of VME filename @
  3940.                      KMT_REM_FILE_BUF(SIZE LENGTH KMT_VME_FILE) :=
  3941.                         KMT_VME_FILE;
  3942.                                    @ assume filename is name.type, remove type @
  3943.                   KMT_SP_STANDARDISE_FILENAME(KMT_VME_FILE,VME_STD);
  3944.                   KMT_FH_OPEN_FILE(KMT_VME_FILE,FILE_OPTION,RESULT);
  3945.                   IF RESULT <= 0
  3946.                   THEN                              @ file open, log full name @
  3947.                      INT NAME_LENGTH;
  3948.                      RESULT := 0;
  3949.                      KMT_FH_GIVE_NAME(KMT_VME_FILE_BUF,NAME_LENGTH,TRUE,RESULT);
  3950.                      IF RESULT <= 0
  3951.                      THEN                      @ set VME filename to full name @
  3952.                         RESULT := 0;
  3953.                         KMT_VME_FILE := KMT_VME_FILE_BUF(SIZE NAME_LENGTH);
  3954.                         KMT_MTM_AREA(3) := KMT_REM_FILE AS
  3955.                                               KMT_MTUP_VALUES.RVB_VALUE;
  3956.                         KMT_MTM_AREA(4) := KMT_VME_FILE AS
  3957.                                               KMT_MTUP_VALUES.RVB_VALUE;
  3958.                         KMT_MESSAGE(-87002,RC_IGNORED);         @ log filename @
  3959.                                       @ ack file header including VME filename @
  3960.                         KMT_PP_BUILD_STRING_PACKET_DATA(KMT_VME_FILE,
  3961.                                                                     RC_IGNORED);
  3962.                         KMT_PP_SEND_PACKET(ACK_PKT,PKT_SEQ,READ_INT,RESULT);
  3963.                         IF RESULT <= 0
  3964.                         THEN
  3965.                            PKT_SEQ := PKT_SEQ+1 MOD 64;
  3966.                            RETRY_TOTAL := RETRY_TOTAL + (RETRY_COUNT - 1);
  3967.                            RETRY_COUNT := 0;
  3968.                            STATE := REC_DATA;
  3969.                            RESULT := 0
  3970.                         ELSE
  3971.                            RESULT := -89061
  3972.                         FI
  3973.                      FI
  3974.                   ELSE           @ unable to open file, reset result and abort @
  3975.                      RESULT := 89040
  3976.                   FI
  3977.                FI
  3978.             ELSE                                  @ wrong packet number, abort @
  3979.                RESULT := 89000
  3980.             FI
  3981.  
  3982.          ; @ KMT_PH_FILE_HDR @
  3983.  
  3984.  
  3985.       SIM PROC KMT_PH_GOT_DATA IS GROUP KMT_PH_GRP (RESPONSE RESULT):
  3986.  
  3987.          @ Received data packet                                                @
  3988.  
  3989.             IF PKT_NO = PKT_SEQ
  3990.             THEN                                          @ write data to file @
  3991.                KMT_PP_BUILD_FILE_RECORD(RESULT);
  3992.                IF RESULT <= 0
  3993.                THEN                                          @ ack data packet @
  3994.                   RESULT := 0;
  3995.                   KMT_PP_BUILD_STRING_PACKET_DATA(NIL,RC_IGNORED);
  3996.                   KMT_PP_SEND_PACKET(ACK_PKT,PKT_SEQ,READ_INT,RESULT);
  3997.                   IF RESULT <= 0
  3998.                   THEN
  3999.                      PKT_SEQ := PKT_SEQ+1 MOD 64;
  4000.                      RETRY_TOTAL := RETRY_TOTAL + (RETRY_COUNT - 1);
  4001.                      RETRY_COUNT := 0;
  4002.                      RESULT := 0
  4003.                   ELSE
  4004.                      RESULT := -89061
  4005.                   FI
  4006.                ELSE                        @ error writing data to file, abort @
  4007.                   RESULT := 89046
  4008.                FI
  4009.             ELSF PKT_NO+1 MOD 64 = PKT_SEQ                      @ i.e. P = N-1 @
  4010.             THEN     @ we've picked up their last data packet again, so ack it @
  4011.                KMT_PP_BUILD_STRING_PACKET_DATA(NIL,RC_IGNORED);
  4012.                KMT_PP_SEND_PACKET(ACK_PKT,PKT_NO,READ_INT,RESULT);
  4013.                RESULT := IF RESULT <= 0 THEN 0 ELSE -89061 FI
  4014.             ELSE                            @ wrong packet number, error abort @
  4015.                RESULT := 89000
  4016.             FI
  4017.  
  4018.          ; @ KMT_PH_GOT_DATA @
  4019.  
  4020.  
  4021.       SIM PROC KMT_PH_GOT_FILE IS GROUP KMT_PH_GRP (RESPONSE RESULT):
  4022.  
  4023.          @ End of file packet received                                         @
  4024.  
  4025.             IF PKT_NO = PKT_SEQ
  4026.             THEN
  4027.                KMT_PP_TRANSLATE_TO_EBCDIC();
  4028.                KMT_FH_CLOSE_FILE(RESULT);        @ close file we've just rec'd @
  4029.                RESULT := IF RESULT <= 0
  4030.                          THEN 0                      @ ignore -ve warning code @
  4031.                          ELSE 89042                @ error closing file, abort @
  4032.                          FI;
  4033.  
  4034.                IF (RESULT = 0  OR  SAVE_INCOMPLETE_FILE)
  4035.                   AND (LENGTH PKT_DATA = 0 OR PKT_DATA(0) NE "D")
  4036.                THEN                 @ no discard signal in packet so save file @
  4037.                   INT RC;
  4038.                   KMT_FH_SAVE_FILE(RC);
  4039.                   IF RC > 0
  4040.                   THEN RESULT := 89044              @ error saving file, abort @
  4041.                   FI
  4042.                FI;
  4043.  
  4044.                IF RESULT = 0
  4045.                THEN
  4046.                   KMT_VME_FILE := NIL;
  4047.                   KMT_REM_FILE := NIL;
  4048.                                         @ no problems closing file, so ack eof @
  4049.                   KMT_PP_BUILD_STRING_PACKET_DATA(NIL,RC_IGNORED);
  4050.                   KMT_PP_SEND_PACKET(ACK_PKT,PKT_SEQ,READ_INT,RESULT);
  4051.                   IF RESULT <= 0
  4052.                   THEN
  4053.                      PKT_SEQ := PKT_SEQ+1 MOD 64;
  4054.                      RETRY_TOTAL := RETRY_TOTAL + (RETRY_COUNT - 1);
  4055.                      RETRY_COUNT := 0;
  4056.                      STATE := REC_FILE;
  4057.                      RESULT := 0
  4058.                   ELSE
  4059.                      RESULT := -89061
  4060.                   FI
  4061.                FI
  4062.             ELSE                                  @ wrong packet number, abort @
  4063.                RESULT := 89000
  4064.             FI
  4065.  
  4066.          ; @ KMT_PH_GOT_FILE @
  4067.  
  4068.  
  4069.       SIM PROC KMT_PH_READY_FILE IS GROUP KMT_PH_GRP (RESPONSE RESULT):
  4070.  
  4071.          @ Send Init has been acknowledged, open file for transfer             @
  4072.  
  4073.             IF PKT_NO = 0
  4074.             THEN
  4075.                KMT_PP_PROCESS_PARAM_PACKET_DATA(RESULT);
  4076.                IF RESULT = 0
  4077.                THEN                                   @ open file in READ mode @
  4078.                                    @ assume filename is name.type, remove type @
  4079.                   KMT_SP_STANDARDISE_FILENAME(KMT_VME_FILE,VME_STD);
  4080.                   KMT_FH_OPEN_FILE(KMT_VME_FILE,0,RESULT);
  4081.                   IF RESULT <= 0
  4082.                   THEN                   @ set up filename for file hdr packet @
  4083.                      INT NAME_LENGTH;
  4084.                      RESULT := 0;
  4085.                      KMT_FH_GIVE_NAME(KMT_VME_FILE_BUF,NAME_LENGTH,TRUE,RESULT);
  4086.                      IF RESULT <= 0
  4087.                      THEN
  4088.                         KMT_VME_FILE := KMT_VME_FILE_BUF(SIZE NAME_LENGTH);
  4089.                         IF KMT_REM_FILE REF NIL
  4090.                         THEN        @ set remote filename to VME terminal name @
  4091.                            KMT_REM_FILE :=
  4092.                               KMT_REM_FILE_BUF(SIZE NAME_LENGTH) :=
  4093.                                  KMT_VME_FILE;
  4094.                            KMT_SP_STANDARDISE_FILENAME(KMT_REM_FILE,VME_TERM)
  4095.                         ELSE       @ set remote filename to Kermit Normal-Form @
  4096.                            KMT_SP_STANDARDISE_FILENAME(KMT_REM_FILE,KMT_STD)
  4097.                         FI;
  4098.                                                                @ log filenames @
  4099.                         KMT_MTM_AREA(3) :=
  4100.                            KMT_VME_FILE AS KMT_MTUP_VALUES.RVB_VALUE;
  4101.                         KMT_MTM_AREA(4) :=
  4102.                            KMT_REM_FILE AS KMT_MTUP_VALUES.RVB_VALUE;
  4103.                         KMT_MESSAGE(-87003,RC_IGNORED);
  4104.                                           @ put filename in file header packet @
  4105.                         KMT_PP_BUILD_STRING_PACKET_DATA(KMT_REM_FILE,RC_IGNORED);
  4106.                         PKT_SEQ := PKT_SEQ+1 MOD 64;
  4107.                         RETRY_TOTAL := RETRY_TOTAL + (RETRY_COUNT - 1);
  4108.                         RETRY_COUNT := 0;
  4109.                         STATE := SEND_FILE;
  4110.                         RESULT := 0
  4111.                      FI
  4112.                   ELSE           @ unable to open file, reset result and abort @
  4113.                      RESULT := 89041
  4114.                   FI
  4115.                ELSE                                @ their params unacceptable @
  4116.                   RESULT := 89070
  4117.                FI
  4118.             FI
  4119.  
  4120.          ; @ KMT_PH_READY_FILE @
  4121.  
  4122.  
  4123.       SIM PROC KMT_PH_READY_DATA IS GROUP KMT_PH_GRP (RESPONSE RESULT):
  4124.  
  4125.          @ Get data ready for transfer                                         @
  4126.  
  4127.             IF (EVENT = ACK_PKT AND PKT_NO = PKT_SEQ)
  4128.                OR (EVENT = NAK_PKT AND PKT_NO = PKT_SEQ+1 MOD 64)
  4129.             THEN
  4130.                PKT_SEQ := PKT_SEQ+1 MOD 64;
  4131.                RETRY_TOTAL := RETRY_TOTAL + (RETRY_COUNT - 1);
  4132.                RETRY_COUNT := 0;
  4133.  
  4134.                KMT_PP_TRANSLATE_TO_EBCDIC();
  4135.                IF (LENGTH PKT_DATA = 1 AND STATE = SEND_DATA)
  4136.                   AND (PKT_DATA(0) = "X" OR PKT_DATA(0) = "Z")
  4137.                THEN            @ their ack packet requested interrupt transfer @
  4138.                   KMT_FH_CLOSE_FILE(RESULT);     @ closing file shouldn't fail @
  4139.                   RESULT := IF RESULT <= 0 THEN 0 ELSE 89043 FI;
  4140.                   KMT_MESSAGE(-87000,RC_IGNORED);   @ log cancellation of xfer @
  4141.                                                       @ set up eof packet data @
  4142.                   KMT_PP_BUILD_STRING_PACKET_DATA(NIL,RC_IGNORED);
  4143.                   STATE := SEND_EOF
  4144.                ELSE       @ check for ack of file header, it may have filename @
  4145.                   IF STATE = SEND_FILE   @ used by remote Kermit, if so log it @
  4146.                   THEN
  4147.                      STATE := SEND_DATA;
  4148.                      KMT_MTM_AREA(3) :=
  4149.                         KMT_VME_FILE AS KMT_MTUP_VALUES.RVB_VALUE;
  4150.                      IF LENGTH PKT_DATA > 0
  4151.                      THEN
  4152.                         KMT_MTM_AREA(4) :=
  4153.                            PKT_DATA AS KMT_MTUP_VALUES.RVB_VALUE
  4154.                      ELSE
  4155.                         KMT_MTM_AREA(4) :=
  4156.                            KMT_REM_FILE AS KMT_MTUP_VALUES.RVB_VALUE
  4157.                      FI;
  4158.                      KMT_MESSAGE(-87001,RC_IGNORED)
  4159.                   FI;
  4160.                                                      @ set up next data packet @
  4161.                   KMT_PP_BUILD_FILE_PACKET_DATA(RESULT);
  4162.                   IF RESULT = EOF
  4163.                   THEN           @ all data sent, close file and send eof next @
  4164.                      KMT_FH_CLOSE_FILE(RESULT);               @ shouldn't fail @
  4165.                      RESULT := IF RESULT <= 0 THEN 0 ELSE 89043 FI;
  4166.                      STATE := SEND_EOF                         @ all data sent @
  4167.                   ELSE                              @ error reading from file? @
  4168.                      RESULT := IF RESULT <= 0 THEN 0 ELSE 89047 FI
  4169.                   FI
  4170.                FI
  4171.             ELSE
  4172.                RESULT := 0
  4173.             FI
  4174.  
  4175.          ; @ KMT_PH_MAKE_DATA @
  4176.  
  4177.  
  4178.       SIM PROC KMT_PH_SENT_FILE IS GROUP KMT_PH_GRP (RESPONSE RESULT):
  4179.  
  4180.          @ File sent, check ack                                                @
  4181.  
  4182.          BEGIN
  4183.             IF (EVENT = ACK_PKT AND PKT_NO = PKT_SEQ)
  4184.                OR (EVENT = NAK_PKT AND PKT_NO = PKT_SEQ+1 MOD 64)
  4185.             THEN           @ any more files? no - we only allow 1 per send so: @
  4186.                PKT_SEQ := PKT_SEQ+1 MOD 64;
  4187.                RETRY_TOTAL := RETRY_TOTAL + (RETRY_COUNT - 1);
  4188.                RETRY_COUNT := 0;
  4189.                KMT_PP_BUILD_STRING_PACKET_DATA(NIL,RC_IGNORED); @ set up break @
  4190.                STATE := SEND_BREAK                              @ packet data  @
  4191.                @ (ditto if previous pkt_data(0) was "Z") @
  4192.             FI;
  4193.             RESULT := 0
  4194.          END
  4195.  
  4196.          ; @ KMT_PH_SENT_FILE @
  4197.  
  4198.  
  4199.       SIM PROC KMT_PH_SEND_DONE IS GROUP KMT_PH_GRP (RESPONSE RESULT):
  4200.  
  4201.          @ Break sent, check ack                                               @
  4202.  
  4203.          BEGIN
  4204.             IF EVENT = ACK_PKT
  4205.             THEN
  4206.                IF PKT_NO = PKT_SEQ
  4207.                THEN
  4208.                   STATE := COMPLETE
  4209.                FI
  4210.             ELSF PKT_NO = PKT_SEQ+1 MOD 64 OR PKT_NO = 0
  4211.             THEN                             @ they've sent nak(n+1) or nak(0) @
  4212.                STATE := COMPLETE
  4213.             FI;
  4214.             RESULT := 0
  4215.          END
  4216.  
  4217.          ; @ KMT_PH_SEND_DONE @
  4218.  
  4219.  
  4220.  
  4221.        @ procedures for unexpected packets @
  4222.  
  4223.       SIM PROC KMT_PH_REPORT_ERR IS GROUP KMT_PH_GRP (RESPONSE RESULT):
  4224.  
  4225.          @ unexpected pkt type, send error pkt and remain in same state        @
  4226.  
  4227.             RESULT := 89000
  4228.  
  4229.          ; @ KMT_PH_REPORT_ERR @
  4230.  
  4231.  
  4232.       SIM PROC KMT_PH_GOT_ERROR IS GROUP KMT_PH_GRP (RESPONSE RESULT):
  4233.  
  4234.          @ they've reported an error to us, log error message and abort        @
  4235.  
  4236.          BEGIN   @ decode packet data and set up message text area for logging @
  4237.             KMT_PP_TRANSLATE_TO_EBCDIC();
  4238.             KMT_MTM_AREA(3) := PKT_DATA AS KMT_MTUP_VALUES.RVB_VALUE;
  4239.             RESULT := -87010
  4240.          END
  4241.  
  4242.          ; @ KMT_PH_GOT_ERROR @
  4243.  
  4244.  
  4245.       SIM PROC KMT_PH_SEND_NAK IS GROUP KMT_PH_GRP (RESPONSE RESULT):
  4246.  
  4247.          @ send nak packet                                                     @
  4248.  
  4249.          BEGIN
  4250.             KMT_PP_BUILD_STRING_PACKET_DATA(NIL,RC_IGNORED);
  4251.             KMT_PP_SEND_PACKET(NAK_PKT,PKT_SEQ,READ_INT,RESULT);
  4252.             RESULT := IF RESULT <= 0 THEN 0 ELSE -89061 FI
  4253.          END
  4254.  
  4255.          ; @ KMT_PH_SEND_NAK @
  4256.  
  4257.  
  4258.       SIM PROC KMT_PH_NAK_ABORT IS GROUP KMT_PH_GRP (RESPONSE RESULT):
  4259.  
  4260.          @ Send NAK and abort                                                  @
  4261.  
  4262.          BEGIN
  4263.             KMT_PP_BUILD_STRING_PACKET_DATA(NIL,RC_IGNORED);
  4264.             KMT_PP_SEND_PACKET(NAK_PKT,PKT_SEQ,READ_INT,RESULT);
  4265.             RESULT := IF RESULT <= 0 THEN 0 ELSE -89061 FI;
  4266.             STATE := ABORT
  4267.          END
  4268.  
  4269.          ; @ KMT_PH_NAK_ABORT @
  4270.  
  4271.  
  4272.       SIM PROC KMT_PH_ACK_LAST IS GROUP KMT_PH_GRP (RESPONSE RESULT):
  4273.  
  4274.          @ if current packet is repeat of last packet then send ack            @
  4275.  
  4276.             IF PKT_NO+1 MOD 64 = PKT_SEQ                        @ i.e. P = N-1 @
  4277.             THEN
  4278.                KMT_PP_BUILD_STRING_PACKET_DATA(NIL,RC_IGNORED);
  4279.                KMT_PP_SEND_PACKET(ACK_PKT,PKT_NO,READ_INT,RESULT);
  4280.                RESULT := IF RESULT <= 0 THEN 0 ELSE -89061 FI
  4281.             ELSE                          @ wrong packet sequence, error abort @
  4282.                RESULT := 89000
  4283.             FI
  4284.  
  4285.          ; @ KMT_PH_ACK_LAST @
  4286.  
  4287.  
  4288.       SIM PROC KMT_PH_ERR_ABORT IS GROUP KMT_PH_GRP (RESPONSE RESULT):
  4289.  
  4290.          @ Send error packet and abort                                         @
  4291.  
  4292.             RESULT := 89001
  4293.  
  4294.          ; @ KMT_PH_ERR_ABORT @
  4295.  
  4296.  
  4297.       SIM PROC KMT_PH_SEND_IDLE IS GROUP KMT_PH_GRP (RESPONSE RESULT):
  4298.  
  4299.          @ the wrong type of packet (or a bad packet) has arrived while        @
  4300.          @ sending a file - in this case it doesn't matter                     @
  4301.  
  4302.             RESULT := 0
  4303.  
  4304.          ; @ KMT_PH_SEND_IDLE @
  4305.  
  4306.  
  4307.       SIM PROC KMT_PH_SET_ABORT IS GROUP KMT_PH_GRP (RESPONSE RESULT):
  4308.  
  4309.          @ Set ABORT state                                                     @
  4310.  
  4311.          BEGIN
  4312.             STATE := ABORT;
  4313.             RESULT := 0
  4314.          END
  4315.  
  4316.          ; @ KMT_PH_SET_ABORT @
  4317.  
  4318.  
  4319.       @ protocol handler state event table                                     @
  4320.  
  4321.       (9)(15)SIM PROC GROUP KMT_PH_GRP(RESPONSE) KMT_PH_ACTION IS
  4322.  
  4323.        ((KMT_PH_REC_SERVER_IDLE , KMT_PH_REPORT_ERR  , KMT_PH_REPORT_ERR ,
  4324.             KMT_PH_GOT_ERROR    , KMT_PH_REPORT_ERR  , KMT_PH_GEN_CMD    ,
  4325.             KMT_PH_INIT_PARAMS  , KMT_PH_KMT_CMD     , KMT_PH_REPORT_ERR ,
  4326.             KMT_PH_GOT_FILENAME , KMT_PH_INIT_PARAMS , KMT_PH_REPORT_ERR ,
  4327.             KMT_PH_REPORT_ERR   , KMT_PH_SEND_NAK    , KMT_PH_REPORT_ERR),
  4328.  
  4329.         (KMT_PH_REC_INIT        , KMT_PH_NAK_ABORT   , KMT_PH_NAK_ABORT  ,
  4330.             KMT_PH_GOT_ERROR    , KMT_PH_NAK_ABORT   , KMT_PH_NAK_ABORT  ,
  4331.             KMT_PH_NAK_ABORT    , KMT_PH_NAK_ABORT   , KMT_PH_NAK_ABORT  ,
  4332.             KMT_PH_NAK_ABORT    , KMT_PH_INIT_PARAMS , KMT_PH_NAK_ABORT  ,
  4333.             KMT_PH_NAK_ABORT    , KMT_PH_SEND_NAK    , KMT_PH_NAK_ABORT ),
  4334.  
  4335.         (KMT_PH_REC_FILE        , KMT_PH_BREAK       , KMT_PH_NAK_ABORT  ,
  4336.             KMT_PH_GOT_ERROR    , KMT_PH_FILE_HDR    , KMT_PH_NAK_ABORT  ,
  4337.             KMT_PH_NAK_ABORT    , KMT_PH_NAK_ABORT   , KMT_PH_NAK_ABORT  ,
  4338.             KMT_PH_NAK_ABORT    , KMT_PH_INIT_PARAMS , KMT_PH_NAK_ABORT  ,
  4339.             KMT_PH_ACK_LAST     , KMT_PH_SEND_NAK    , KMT_PH_NAK_ABORT ),
  4340.  
  4341.         (KMT_PH_REC_DATA        , KMT_PH_ERR_ABORT   , KMT_PH_GOT_DATA   ,
  4342.             KMT_PH_GOT_ERROR    , KMT_PH_ACK_LAST    , KMT_PH_ERR_ABORT  ,
  4343.             KMT_PH_ERR_ABORT    , KMT_PH_ERR_ABORT   , KMT_PH_ERR_ABORT  ,
  4344.             KMT_PH_ERR_ABORT    , KMT_PH_ERR_ABORT   , KMT_PH_ERR_ABORT  ,
  4345.             KMT_PH_GOT_FILE     , KMT_PH_SEND_NAK    , KMT_PH_ERR_ABORT ),
  4346.  
  4347.         (KMT_PH_SEND_INIT       , KMT_PH_SEND_IDLE   , KMT_PH_SEND_IDLE  ,
  4348.             KMT_PH_GOT_ERROR    , KMT_PH_SEND_IDLE   , KMT_PH_SEND_IDLE  ,
  4349.             KMT_PH_SEND_IDLE    , KMT_PH_SEND_IDLE   , KMT_PH_SEND_IDLE  ,
  4350.             KMT_PH_SEND_IDLE    , KMT_PH_SEND_IDLE   , KMT_PH_READY_FILE ,
  4351.             KMT_PH_SEND_IDLE    , KMT_PH_SEND_IDLE   , KMT_PH_SEND_IDLE ),
  4352.  
  4353.         (KMT_PH_SEND_FILE       , KMT_PH_SET_ABORT   , KMT_PH_SET_ABORT  ,
  4354.             KMT_PH_GOT_ERROR    , KMT_PH_SET_ABORT   , KMT_PH_SET_ABORT  ,
  4355.             KMT_PH_SET_ABORT    , KMT_PH_SET_ABORT   , KMT_PH_READY_DATA ,
  4356.             KMT_PH_SET_ABORT    , KMT_PH_SET_ABORT   , KMT_PH_READY_DATA ,
  4357.             KMT_PH_SET_ABORT    , KMT_PH_SEND_IDLE   , KMT_PH_SET_ABORT ),
  4358.  
  4359.         (KMT_PH_SEND_DATA       , KMT_PH_SET_ABORT   , KMT_PH_SET_ABORT  ,
  4360.             KMT_PH_GOT_ERROR    , KMT_PH_SET_ABORT   , KMT_PH_SET_ABORT  ,
  4361.             KMT_PH_SET_ABORT    , KMT_PH_SET_ABORT   , KMT_PH_READY_DATA ,
  4362.             KMT_PH_SET_ABORT    , KMT_PH_SET_ABORT   , KMT_PH_READY_DATA ,
  4363.             KMT_PH_SET_ABORT    , KMT_PH_SEND_IDLE   , KMT_PH_SET_ABORT ),
  4364.  
  4365.         (KMT_PH_SEND_EOF        , KMT_PH_SET_ABORT   , KMT_PH_SET_ABORT  ,
  4366.             KMT_PH_GOT_ERROR    , KMT_PH_SET_ABORT   , KMT_PH_SET_ABORT  ,
  4367.             KMT_PH_SET_ABORT    , KMT_PH_SET_ABORT   , KMT_PH_SENT_FILE  ,
  4368.             KMT_PH_SET_ABORT    , KMT_PH_SET_ABORT   , KMT_PH_SENT_FILE  ,
  4369.             KMT_PH_SET_ABORT    , KMT_PH_SEND_IDLE   , KMT_PH_SET_ABORT ),
  4370.  
  4371.         (KMT_PH_SEND_BREAK      , KMT_PH_SET_ABORT   , KMT_PH_SET_ABORT  ,
  4372.             KMT_PH_GOT_ERROR    , KMT_PH_SET_ABORT   , KMT_PH_SET_ABORT  ,
  4373.             KMT_PH_SET_ABORT    , KMT_PH_SET_ABORT   , KMT_PH_SEND_DONE  ,
  4374.             KMT_PH_SET_ABORT    , KMT_PH_SET_ABORT   , KMT_PH_SEND_DONE  ,
  4375.             KMT_PH_SET_ABORT    , KMT_PH_SEND_IDLE   , KMT_PH_SET_ABORT ));
  4376.  
  4377.  
  4378.       @ PROTOCOL HANDLER @
  4379.  
  4380.       IF KMT_TRACE_FLAGS.PH_TRACING
  4381.       THEN
  4382.          () KMT_MTUP_VALUES PARAMS := (STATE AS KMT_MTUP_VALUES.RI_VALUE,
  4383.                                        (L'EVENT) AS KMT_MTUP_VALUES.LI_VALUE);
  4384.          KMT_SP_LOG_TRACE_MESSAGE(300,PARAMS)
  4385.       FI;
  4386.  
  4387.       IF EVENT = ENTRY
  4388.       THEN                    @ increment retry count and test against maximum @
  4389.          RETRY_COUNT := RETRY_COUNT+1;
  4390.          IF RETRY_COUNT > MAXTRY
  4391.          THEN
  4392.             RETRY_TOTAL := RETRY_TOTAL + (RETRY_COUNT - 1);
  4393.             RESULT := 89050
  4394.          ELSE
  4395.             KMT_PH_ACTION(STATE,EVENT)(RESULT)
  4396.          FI
  4397.       ELSE
  4398.          KMT_PH_ACTION(STATE,EVENT)(RESULT)
  4399.       FI;
  4400.  
  4401.       IF RESULT NE 0
  4402.       THEN
  4403.          IF RESULT = -89061
  4404.          THEN                            @ unable to send packet - fatal error @
  4405.             STATE := ABORT;
  4406.             EXIT_STATE := FATAL_ERROR
  4407.          ELSF (RESULT NE 89000) OR (STATE NE REC_SERVER_IDLE)
  4408.          THEN             @ abort unless wrong seq no in Rec_Server_Idle state @
  4409.             STATE := ABORT
  4410.          FI
  4411.       FI
  4412.  
  4413.    END
  4414.  
  4415.    ; @ KMT_PH @
  4416.  
  4417. ENDMODULE                                                      @ KMT_PH_MODULE @
  4418. $$$$ KMT_PP_MODULE
  4419. MODULE KMT_PP_MODULE;
  4420.  
  4421. @******************************************************************************@
  4422. @*                                                                            *@
  4423. @* Mode definitions                                                           *@
  4424. @*                                                                            *@
  4425. @******************************************************************************@
  4426.  
  4427. MODE
  4428. KMT_TRACE_FLAGS_S IS WORD STRUCT (
  4429.    BIT    PH_TRACING,
  4430.           PP_TRACING,
  4431.           FH_TRACING,
  4432.           DH_TRACING,
  4433.    28-BIT SPARE);
  4434.  
  4435. MODE
  4436. KMT_FH_RECORD_DETAILS_S IS STRUCT (
  4437.    BOOL        FILE_OPEN,
  4438.                NEW_RECORD,
  4439.                END_OF_FILE,
  4440.    WORD        TEXT_TYPE,                        @ 0 = EBCDIC                  @
  4441.                                                  @ 1 = ASCII                   @
  4442.                                                  @ 2 = BINARY                  @
  4443.    INT         MAX_RECORD_LENGTH,
  4444.                RECORD_LENGTH,
  4445.    (4098) BYTE RECORD);                          @ Maximum record size of 4096 @
  4446.                                                  @ plus 2 bytes for CRLF pair  @
  4447.                                                  @ when constructing output    @
  4448.                                                  @ records                     @
  4449.  
  4450. MODE
  4451. KMT_DH_DEVICE_DETAILS_S IS STRUCT (
  4452.   BOOL FILE_OPEN,
  4453.   WORD MAX_INPUT_LENGTH,
  4454.        MAX_OUTPUT_LENGTH,
  4455.        INPUT_PARITY,
  4456.        OUTPUT_PARITY,
  4457.        PAUSE);
  4458.  
  4459. MODE
  4460. KMT_PP_PACKET_DATA_S IS STRUCT (
  4461.    INT       DATA_LENGTH,
  4462.    (91) BYTE DATA);
  4463.  
  4464. MODE
  4465. KMT_PP_CONFG_PARAMS_S IS STRUCT (
  4466.    BYTE   MARK,
  4467.           MAXL,
  4468.           TIME,
  4469.           NPAD,
  4470.           PADC,
  4471.           EOL,
  4472.           QCTL,
  4473.           QBIN,
  4474.           CHKT,
  4475.           REPT,
  4476.    4-BYTE CAPAS);
  4477.  
  4478. MODE
  4479. KMT_PP_PACKET_STATISTICS_S IS STRUCT (
  4480.    INT INPUT_TOTAL,
  4481.        OUTPUT_TOTAL);
  4482.  
  4483. MODE
  4484. KMT_MTM_VALUES IS ANY (
  4485.    LONG WORD          LW_VALUE,
  4486.    LONG INT           LI_VALUE,
  4487.    REF WORD           RW_VALUE,
  4488.    REF INT            RI_VALUE,
  4489.    REF LONG WORD      RLW_VALUE,
  4490.    REF LONG INT       RLI_VALUE,
  4491.    REF () BYTE        RVB_VALUE,
  4492.    REF () REF () BYTE RVRVB_VALUE);
  4493.  
  4494. ***PAGE
  4495.  
  4496. @******************************************************************************@
  4497. @*                                                                            *@
  4498. @* External procedure references                                              *@
  4499. @*                                                                            *@
  4500. @******************************************************************************@
  4501.  
  4502. EXT
  4503. PROC
  4504.    (REF () BYTE,                                 @ OUTPUT_PACKET               @
  4505.     BOOL,                                        @ PROMPT                      @
  4506.     RESPONSE                                     @ RESPONSE                    @
  4507.    )                                   KMT_DH_OUTPUT;
  4508.  
  4509. EXT
  4510. PROC
  4511.    (REF () BYTE,                                 @ INPUT_BUFFER                @
  4512.     REF INT,                                     @ INPUT_BUFFER_LENGTH         @
  4513.     RESPONSE                                     @ RESPONSE                    @
  4514.    )                                   KMT_DH_INPUT;
  4515.  
  4516. EXT
  4517. PROC
  4518.    (INT,                                         @ RESULT_CODE                 @
  4519.     WORD,                                        @ DESTINATION                 @
  4520.     REF () KMT_MTM_VALUES,                       @ PARAMS                      @
  4521.     LONG WORD,                                   @ PE_CONTINGENCY_MESSAGE      @
  4522.     BOOL,                                        @ DUMP                        @
  4523.     BOOL                                         @ UNRECOVERABLE               @
  4524.    )                                   KMT_EH_LOG_ERROR;
  4525.  
  4526. EXT
  4527. PROC
  4528.    (
  4529.     RESPONSE                                     @ RESPONSE                    @
  4530.    )                                   KMT_FH_READ;
  4531.  
  4532. EXT
  4533. PROC
  4534.    (
  4535.     RESPONSE                                     @ RESPONSE                    @
  4536.    )                                   KMT_FH_WRITE;
  4537.  
  4538. EXT
  4539. PROC
  4540.    (
  4541.     WORD,                                        @ CHAR                        @
  4542.     WORD,                                        @ I/O FLAG                    @
  4543.     RESPONSE                                     @ RESPONSE                    @
  4544.    )                                  KMT_SP_CHECK_VME_CHAR;
  4545.  
  4546. EXT
  4547. PROC
  4548.    (
  4549.     INT,                                         @ TYPE                        @
  4550.     REF () KMT_MTM_VALUES                        @ PARAMS                      @
  4551.    )                                   KMT_SP_LOG_TRACE_MESSAGE;
  4552.  
  4553.  
  4554. ***PAGE
  4555.  
  4556. @******************************************************************************@
  4557. @*                                                                            *@
  4558. @* External data references                                                   *@
  4559. @*                                                                            *@
  4560. @******************************************************************************@
  4561.  
  4562. @ Constants: @
  4563. @ ********** @
  4564.  
  4565. EXT (256) BYTE
  4566.    EBCDIC_TO_ASCII,                                       @ translation tables @
  4567.    ASCII_TO_EBCDIC;
  4568.  
  4569. EXT (26) INT
  4570.    PACKET_CODES;         @ packet codes to protocol handler state table events @
  4571.  
  4572. EXT INT
  4573.    BAD_PKT,INVALID_PKT,UNS_PKT,NON_PKT;
  4574.  
  4575. ***LINES(4)
  4576.  
  4577. @ Variables: @
  4578. @ ********** @
  4579.  
  4580. EXT (<CASCADE>)
  4581. REF KMT_TRACE_FLAGS_S KMT_TRACE_FLAGS;
  4582.  
  4583. EXT (<CASCADE>)
  4584. REF KMT_FH_RECORD_DETAILS_S KMT_FH_RECORD_DETAILS;
  4585.  
  4586. EXT (<CASCADE>)
  4587. REF KMT_DH_DEVICE_DETAILS_S KMT_DH_DEVICE_DETAILS;
  4588.  
  4589. EXT (<CASCADE>)
  4590. REF KMT_PP_CONFG_PARAMS_S KMT_PP_LOCAL_CONFG_PARAMS;
  4591.  
  4592. EXT (<CASCADE>)
  4593. REF KMT_PP_CONFG_PARAMS_S KMT_PP_REMOTE_CONFG_PARAMS;
  4594.  
  4595. EXT (<CASCADE>)
  4596. REF KMT_PP_PACKET_STATISTICS_S KMT_PP_PACKET_STATISTICS;
  4597.  
  4598. EXT (<CASCADE>)
  4599. REF REF () BYTE KMT_PH_INPUT_PACKET_DATA;
  4600.  
  4601. ***LINES(4)
  4602.  
  4603. @ Results: @
  4604. @ ******** @
  4605.  
  4606. ***LINES(4)
  4607.  
  4608. ***PAGE
  4609.  
  4610. @******************************************************************************@
  4611. @*                                                                            *@
  4612. @* Static data declarations.                                                  *@
  4613. @*                                                                            *@
  4614. @******************************************************************************@
  4615.  
  4616. @ Constants: @
  4617. @ ********** @
  4618.  
  4619. STATIC WORD
  4620.    EBCDIC IS 0,                                               @ transfer codes @
  4621.    ASCII  IS 1,
  4622.    BINARY IS 2;
  4623.  
  4624. STATIC INT
  4625.    KMT_PP_PACKET_IN_MSG       IS 251,
  4626.    KMT_PP_PACKET_OUT_MSG      IS 252,
  4627.    KMT_PP_PACKET_DATA_IN_MSG  IS 253,
  4628.    KMT_PP_PACKET_DATA_OUT_MSG IS 254,
  4629.    KMT_PP_PARAM_OUT_MSG       IS 258,
  4630.    KMT_PP_PARAM_IN_MSG        IS 259;
  4631.  
  4632. ***LINES(4)
  4633.  
  4634. @ Variables: @
  4635. @ ********** @
  4636.  
  4637. STATIC
  4638. KMT_PP_PACKET_DATA_S KMT_PP_INPUT_PACKET_DATA;
  4639.  
  4640. STATIC
  4641. KMT_PP_PACKET_DATA_S KMT_PP_OUTPUT_PACKET_DATA;
  4642.  
  4643. STATIC
  4644. REF () BYTE KMT_PP_RECALL_DATA;
  4645.  
  4646. ***LINES(4)
  4647.  
  4648. @ Results: @
  4649. @ ******** @
  4650.  
  4651. ***LINES(4)
  4652.  
  4653. ***PAGE
  4654.  
  4655. @******************************************************************************@
  4656. @*                                                                            *@
  4657. @* Procedure declarations                                                     *@
  4658. @*                                                                            *@
  4659. @******************************************************************************@
  4660.  
  4661. STATIC
  4662. PROC
  4663.    KMT_PP_CHECK_COMPLETE IS (
  4664.    INT             DATA_LENGTH,
  4665.    REF REF () BYTE BUFFER) BOOL:
  4666.  
  4667. @******************************************************************************@
  4668. @*                                                                            *@
  4669. @* This procedure is used to update a buffer pointer and to check if the      *@
  4670. @* processing of BUFFER is complete.                                          *@
  4671. @* The procedure returns TRUE if the processing of BUFFER has been completed, *@
  4672. @* FALSE otherwise.                                                           *@
  4673. @*                                                                            *@
  4674. @******************************************************************************@
  4675.  
  4676. BEGIN
  4677.    IF
  4678.       LENGTH BUFFER GT DATA_LENGTH
  4679.  
  4680.    THEN                                          @ Incomplete, update pointer  @
  4681.       BUFFER := BUFFER(DATA_LENGTH::);
  4682.       FALSE
  4683.  
  4684.    ELSE                                          @ Complete return ZLR         @
  4685.       BUFFER := BUFFER(SIZE 0);
  4686.       TRUE
  4687.    FI
  4688. END;                                   @ KMT_PP_CHECK_COMPLETE                 @
  4689.  
  4690. ***PAGE
  4691.  
  4692. STATIC
  4693. PROC
  4694.    KMT_PP_MOVE IS (
  4695.    () BYTE         SOURCE,
  4696.    REF REF () BYTE DESTINATION,
  4697.    REF BOOL        COMPLETE) INT:
  4698.  
  4699. @******************************************************************************@
  4700. @*                                                                            *@
  4701. @* This procedure is used to move the source string into the destination      *@
  4702. @* buffer and to check if the destination buffer is full.                     *@
  4703. @* The procedure returns the number of characters moved.                      *@
  4704. @*                                                                            *@
  4705. @******************************************************************************@
  4706.  
  4707. BEGIN
  4708.    INT S_LEN IS LENGTH SOURCE,
  4709.        D_LEN IS LENGTH DESTINATION;
  4710.  
  4711.    IF
  4712.       S_LEN GT D_LEN
  4713.  
  4714.    THEN                                          @ Insufficient space in       @
  4715.                                                  @ buffer for string           @
  4716.       UNLESS
  4717.          COMPLETE IS NIL
  4718.  
  4719.       THEN
  4720.          COMPLETE := TRUE;
  4721.       FI;
  4722.  
  4723.       0
  4724.    ELSE
  4725.       DESTINATION(SIZE S_LEN) := SOURCE;
  4726.  
  4727.       UNLESS
  4728.          COMPLETE IS NIL
  4729.  
  4730.       THEN
  4731.          COMPLETE := KMT_PP_CHECK_COMPLETE (S_LEN,
  4732.                                             DESTINATION);
  4733.       FI;
  4734.  
  4735.       S_LEN
  4736.    FI
  4737. END;                                   @ KMT_PP_MOVE                           @
  4738.  
  4739. ***PAGE
  4740.  
  4741. STATIC
  4742. PROC
  4743.    KMT_PP_GENERATE_CHECKSUM IS (
  4744.    REF () BYTE PACKET) BYTE:
  4745.  
  4746. @******************************************************************************@
  4747. @*                                                                            *@
  4748. @* This procedure is used to generate a checksum for the data contained in    *@
  4749. @* the packet.                                                                *@
  4750. @*                                                                            *@
  4751. @******************************************************************************@
  4752.  
  4753. BEGIN
  4754.    WORD SUM := 0;
  4755.  
  4756.    FOR  I
  4757.    FROM 1                                        @ 'MARK' character not        @
  4758.                                                  @ included in checksum        @
  4759.    TO   PACKET(1) - X"20"
  4760.    DO
  4761.       SUM := SUM + PACKET(I)
  4762.    REPEAT;
  4763.  
  4764.    ((SUM + ((SUM & X'C0') SCALE -6)) & X'3F') + X"20"
  4765. END;                                   @ KMT_PP_GENERATE_CHECKSUM              @
  4766.  
  4767. ***PAGE
  4768.  
  4769. STATIC
  4770. PROC
  4771.    KMT_PP_LOG_TRACE_MESSAGE IS (
  4772.    INT         TYPE,
  4773.    REF () BYTE PACKET):
  4774.  
  4775. @******************************************************************************@
  4776. @*                                                                            *@
  4777. @* This procedure is used to log the packet contents to the job journal.      *@
  4778. @*                                                                            *@
  4779. @******************************************************************************@
  4780.  
  4781. BEGIN
  4782.    INT PACKET_LENGTH IS LENGTH PACKET;
  4783.  
  4784.    INT LEN := PACKET(1) - X"20",
  4785.        SEQ := PACKET(2) - X"20",
  4786.        TYP := PACKET_CODES(PACKET(3) - X"41");
  4787.  
  4788.    () KMT_MTM_VALUES PARAMS := (PACKET           @ COMPLETE PACKET             @
  4789.                                 AS KMT_MTM_VALUES.RVB_VALUE,
  4790.                                 PACKET(0)        @ MARK                        @
  4791.                                 AS KMT_MTM_VALUES.RVB_VALUE,
  4792.                                 LEN              @ LEN                         @
  4793.                                 AS KMT_MTM_VALUES.RI_VALUE,
  4794.                                 SEQ              @ SEQ                         @
  4795.                                 AS KMT_MTM_VALUES.RI_VALUE,
  4796.                                 TYP              @ TYPE                        @
  4797.                                 AS KMT_MTM_VALUES.RI_VALUE,
  4798.                                 PACKET(4 SIZE PACKET_LENGTH - 5)
  4799.                                                  @ DATA                        @
  4800.                                 AS KMT_MTM_VALUES.RVB_VALUE,
  4801.                                 PACKET(PACKET_LENGTH - 1)
  4802.                                                  @ CHECKSUM                    @
  4803.                                 AS KMT_MTM_VALUES.RVB_VALUE);
  4804.  
  4805.    KMT_SP_LOG_TRACE_MESSAGE (TYPE,
  4806.                              PARAMS)
  4807. END;                                   @ KMT_PP_LOG_TRACE_MESSAGE              @
  4808.  
  4809. ***PAGE
  4810.  
  4811. STATIC
  4812. PROC
  4813.    KMT_PP_DATA_TRACE_MESSAGE IS (
  4814.    INT         TYPE,
  4815.    INT         CODE,
  4816.    REF () BYTE DATA):
  4817.  
  4818. @******************************************************************************@
  4819. @*                                                                            *@
  4820. @* This procedure is used to log the packet data to the job journal.          *@
  4821. @*                                                                            *@
  4822. @******************************************************************************@
  4823.  
  4824. BEGIN
  4825.    INT CHAR_CODE := CODE;
  4826.    () KMT_MTM_VALUES PARAMS := (CHAR_CODE        @ character code of data      @
  4827.                                 AS KMT_MTM_VALUES.RI_VALUE,
  4828.                                 DATA             @ data                        @
  4829.                                 AS KMT_MTM_VALUES.RVB_VALUE);
  4830.  
  4831.    KMT_SP_LOG_TRACE_MESSAGE (TYPE,
  4832.                              PARAMS)
  4833. END;                                   @ KMT_PP_DATA_TRACE_MESSAGE             @
  4834.  
  4835. ***PAGE
  4836.  
  4837. STATIC
  4838. PROC
  4839.    KMT_PP_BUILD_PACKET_DATA IS (
  4840.                 REF REF () BYTE BUFFER,
  4841.                 REF REF () BYTE DATA,
  4842.                 WORD            TEXT_TYPE,
  4843.                 REF BOOL        BUFFER_COMPLETE) BOOL:
  4844.  
  4845. @******************************************************************************@
  4846. @*                                                                            *@
  4847. @* This procedure is used to perform data translation of the data area        *@
  4848. @* referenced by BUFFER.                                                      *@
  4849. @* If a binary file transfer is requested then the translation process        *@
  4850. @* involves control character quoting and 8th bit prefixing. Otherwise (for   *@
  4851. @* text files) the translation process involves control character quoting and *@
  4852. @* EBCDIC to ASCII data translation.                                          *@
  4853. @* If the whole of BUFFER has been translated then BUFFER_COMPLETE is set     *@
  4854. @* TRUE and BUFFER is returned referencing a zero length record. Otherwise    *@
  4855. @* BUFFER_COMPLETE is returned FALSE and BUFFER is returned referencing the   *@
  4856. @* untranslated part of the original buffer.                                  *@
  4857. @* The translated data is returned in the area referenced by DATA.            *@
  4858. @* The procedure returns TRUE if there is insufficient space in DATA for more *@
  4859. @* of the translated data.                                                    *@
  4860. @*                                                                            *@
  4861. @******************************************************************************@
  4862.  
  4863. BEGIN
  4864.    STATIC BYTE
  4865.       SPACE IS X"20",                                            @ ASCII codes @
  4866.       DEL   IS X"7F";
  4867.  
  4868.    BYTE
  4869.       QCTL  IS KMT_PP_LOCAL_CONFG_PARAMS.QCTL,
  4870.       QBIN  IS KMT_PP_LOCAL_CONFG_PARAMS.QBIN;
  4871.  
  4872.    () BYTE
  4873.       QLF   IS (QCTL,X"4A"),                               @ ASCII quoted LF   @
  4874.       QFF   IS (QCTL,X"4C"),                               @ ASCII quoted FF   @
  4875.       QCR   IS (QCTL,X"4D"),                               @ ASCII quoted CR   @
  4876.       QCRLF IS (QCTL,X"4D",QCTL,X"4A");                    @ ASCII quoted CRLF @
  4877.  
  4878.    BOOL
  4879.       DATA_COMPLETE := FALSE;
  4880.  
  4881.    SIM PROC PACKETISE IS (() BYTE SOURCE,INT DATA_LENGTH):
  4882.       BEGIN
  4883.          IF KMT_PP_MOVE(SOURCE,DATA,DATA_COMPLETE) NE 0
  4884.          THEN BUFFER_COMPLETE := KMT_PP_CHECK_COMPLETE(DATA_LENGTH,BUFFER)
  4885.          FI
  4886.       END @ PACKETISE @ ;
  4887.  
  4888.    BUFFER_COMPLETE := (LENGTH BUFFER LE 0);
  4889.  
  4890.    UNTIL DATA_COMPLETE OR BUFFER_COMPLETE
  4891.    DO
  4892.       IF TEXT_TYPE GT EBCDIC
  4893.       THEN                                              @ ASCII or binary data @
  4894.          INT SEQ_LEN := 0;
  4895.          (3) BYTE SEQ;
  4896.          BYTE THIS_CHAR := BUFFER(0);
  4897.  
  4898.          SIM PROC ADD_TO_SEQ IS (BYTE OCTET):
  4899.             BEGIN
  4900.                SEQ(SEQ_LEN) := OCTET;
  4901.                SEQ_LEN := SEQ_LEN+1
  4902.             END @ ADD_TO_SEQ @ ;
  4903.  
  4904.          IF (THIS_CHAR GT DEL) AND (TEXT_TYPE EQ BINARY)
  4905.          THEN                                     @ need to add 8th bit prefix @
  4906.             ADD_TO_SEQ(QBIN)
  4907.          FI;
  4908.  
  4909.          THIS_CHAR := THIS_CHAR & X"7F";
  4910.  
  4911.          IF (THIS_CHAR LT SPACE) OR (THIS_CHAR EQ DEL)
  4912.          THEN                                              @ control character @
  4913.             ADD_TO_SEQ(QCTL);
  4914.             THIS_CHAR := THIS_CHAR NEQ X"40"
  4915.          ELSF (THIS_CHAR EQ QCTL) OR (THIS_CHAR EQ QBIN AND TEXT_TYPE EQ BINARY)
  4916.          THEN                                         @ special char, quote it @
  4917.             ADD_TO_SEQ(QCTL)
  4918.          FI;
  4919.  
  4920.          ADD_TO_SEQ(THIS_CHAR);
  4921.          PACKETISE(SEQ(SIZE SEQ_LEN),1)
  4922.  
  4923.       ELSE                                                       @ EBCDIC data @
  4924.          BYTE THIS_CHAR IS EBCDIC_TO_ASCII(BUFFER(0));
  4925.  
  4926.          IF THIS_CHAR GT DEL
  4927.          THEN                                                @ Format effector @
  4928.             IF (LENGTH BUFFER LT 2) OR (THIS_CHAR EQ X"FB")
  4929.             THEN @ Newline FE (1 byte) or FE at end of record with no specifier@
  4930.                IF THIS_CHAR EQ X"FB"
  4931.                THEN                                  @ End of record so ignore @
  4932.                   BUFFER_COMPLETE := KMT_PP_CHECK_COMPLETE(1,BUFFER)
  4933.                ELSE                                                  @ Newline @
  4934.                   PACKETISE(QCRLF,1)
  4935.                FI
  4936.             ELSE                                           @ FE with qualifier @
  4937.                REF BYTE QUALIFIER IS BUFFER(1);
  4938.  
  4939.                SIM PROC EXPAND_FE IS (() BYTE EXPANSION):
  4940.                   BEGIN
  4941.                      IF
  4942.                         QUALIFIER :=
  4943.                            QUALIFIER - W'(TO QUALIFIER - 1
  4944.                                           UNTIL DATA_COMPLETE
  4945.                                           DO
  4946.                                              KMT_PP_MOVE(EXPANSION,DATA,
  4947.                                                               DATA_COMPLETE)
  4948.                                           REPEAT);
  4949.                         QUALIFIER EQ 0
  4950.                      THEN
  4951.                         BUFFER_COMPLETE := KMT_PP_CHECK_COMPLETE(2,BUFFER)
  4952.                      FI
  4953.                   END @ EXPAND_FE @ ;
  4954.  
  4955.                CASE X"FF" - THIS_CHAR
  4956.                THEN                                           @ multiple space @
  4957.                   EXPAND_FE(SPACE)
  4958.                ELSE                                         @ multiple newline @
  4959.                   IF QUALIFIER EQ X"00"
  4960.                   THEN                                       @ translate to CR @
  4961.                      PACKETISE(QCR,2)
  4962.                   ELSE                                  @ expand to CRLF pairs @
  4963.                      EXPAND_FE(QCRLF)
  4964.                   FI
  4965.                ELSE                                        @ vertical position @
  4966.                   IF (QUALIFIER EQ X"00")
  4967.                   THEN
  4968.                      PACKETISE(QFF,2)
  4969.                   ELSE
  4970.                      PACKETISE(QCRLF,2)
  4971.                   FI
  4972.                ELSE                                      @ horizontal position @
  4973.                   PACKETISE(SPACE,2)
  4974.                ESAC
  4975.             FI
  4976.          ELSF THIS_CHAR EQ QCTL
  4977.          THEN                                                @ quote character @
  4978.             PACKETISE((QCTL,THIS_CHAR),1)
  4979.          ELSF (THIS_CHAR LT SPACE) OR (THIS_CHAR EQ DEL)
  4980.          THEN                                              @ control character @
  4981.             PACKETISE((QCTL,THIS_CHAR NEQ X"40"),1)
  4982.          ELSE                                            @ printable character @
  4983.             PACKETISE(THIS_CHAR,1)
  4984.          FI
  4985.       FI
  4986.    REPEAT;
  4987.  
  4988.    DATA_COMPLETE
  4989.  
  4990. END @ KMT_PP_BUILD_PACKET_DATA @ ;
  4991.  
  4992. ***PAGE
  4993.  
  4994. STATIC
  4995. PROC
  4996.    KMT_PP_UNQUOTE_CHAR IS (
  4997.    REF () BYTE DATA,
  4998.    REF BYTE    UNQUOTED_CHAR,
  4999.    REF INT     SEQUENCE_LENGTH):
  5000.  
  5001. @******************************************************************************@
  5002. @*                                                                            *@
  5003. @* This procedure is used to process a quoted (binary and/or control)         *@
  5004. @* character sequence.                                                        *@
  5005. @* The area referenced by DATA contains the character sequence to be          *@
  5006. @* processed. The area referenced by UNQUOTED_CHAR is returned containing the *@
  5007. @* unquoted character (with the control and 8th bit set as appropriate) and   *@
  5008. @* the area referenced by SEQUENCE_LENGTH is returned containing the length   *@
  5009. @* of the quoted sequence. If the first character in DATA is not a binary or  *@
  5010. @* control quote character then UNQUOTED_CHAR is returned containing the      *@
  5011. @* character and SEQUENCE_LENGTH is returned containing 1.                    *@
  5012. @*                                                                            *@
  5013. @******************************************************************************@
  5014.  
  5015. BEGIN
  5016.    WORD TEXT_TYPE IS KMT_FH_RECORD_DETAILS.TEXT_TYPE;
  5017.  
  5018.    BYTE QCTL IS KMT_PP_REMOTE_CONFG_PARAMS.QCTL,
  5019.         QBIN IS KMT_PP_REMOTE_CONFG_PARAMS.QBIN;
  5020.  
  5021.    BYTE THIS_CHAR := DATA(0);
  5022.  
  5023.    BYTE OR_MASK IS IF
  5024.                       (TEXT_TYPE EQ BINARY)  AND  (THIS_CHAR EQ QBIN)
  5025.                    THEN                          @ Binary file and 8th bit     @
  5026.                                                  @ quoted character found      @
  5027.                       THIS_CHAR := DATA(1);
  5028.                       SEQUENCE_LENGTH := 2;
  5029.                       X"80"
  5030.                    ELSE                          @ Not an 8th bit quoted       @
  5031.                                                  @ character                   @
  5032.                       SEQUENCE_LENGTH := 1;
  5033.                       X"00"
  5034.                    FI;
  5035.  
  5036.    IF
  5037.       THIS_CHAR EQ QCTL
  5038.  
  5039.    THEN                                          @ Control quoted character    @
  5040.       THIS_CHAR := DATA(SEQUENCE_LENGTH);
  5041.       SEQUENCE_LENGTH := SEQUENCE_LENGTH + 1;
  5042.  
  5043.       IF
  5044.          (THIS_CHAR NE QCTL)  AND  (THIS_CHAR NE QBIN OR TEXT_TYPE NE BINARY)
  5045.  
  5046.       THEN                                       @ Control character           @
  5047.          THIS_CHAR := THIS_CHAR NEQ X"40"
  5048.       FI
  5049.    FI;
  5050.  
  5051.    UNQUOTED_CHAR := THIS_CHAR ! OR_MASK
  5052. END;                                   @ KMT_PP_UNQUOTE_CHAR                   @
  5053.  
  5054. ***PAGE
  5055.  
  5056. GLOBAL
  5057. STATIC (<STATUS 5>)
  5058. PROC
  5059.    KMT_PP_TRANSLATE_TO_EBCDIC IS ():
  5060.  
  5061. @******************************************************************************@
  5062. @*                                                                            *@
  5063. @* This procedure is used to translate the packet data from ASCII to EBCDIC   *@
  5064. @* and to process any quoted characters.                                      *@
  5065. @* The untranslated data is read from, and the translated data is returned in *@
  5066. @* the area referenced by KMT_PH_INPUT_PACKET_DATA.                           *@
  5067. @*                                                                            *@
  5068. @******************************************************************************@
  5069.  
  5070. BEGIN
  5071.    () BYTE UNTRANSLATED_DATA := KMT_PH_INPUT_PACKET_DATA;
  5072.                                                  @ Copy untranslated data      @
  5073.  
  5074.    REF () BYTE DATA := UNTRANSLATED_DATA;
  5075.  
  5076.    BOOL DATA_COMPLETE := (LENGTH DATA LE 0);
  5077.  
  5078.    INT T_LEN IS FOR   I
  5079.                 UNTIL
  5080.                    DATA_COMPLETE
  5081.                 DO
  5082.                    INT SEQUENCE_LENGTH;
  5083.  
  5084.                    KMT_PP_UNQUOTE_CHAR (DATA,
  5085.                                         KMT_PH_INPUT_PACKET_DATA(I),
  5086.                                         SEQUENCE_LENGTH);
  5087.                    DATA_COMPLETE := KMT_PP_CHECK_COMPLETE (SEQUENCE_LENGTH,
  5088.                                                            DATA)
  5089.                 REPEAT;
  5090.  
  5091.    KMT_PH_INPUT_PACKET_DATA := KMT_PH_INPUT_PACKET_DATA(SIZE T_LEN);
  5092.    TRANSLATE (ASCII_TO_EBCDIC,
  5093.               KMT_PH_INPUT_PACKET_DATA,
  5094.               0,
  5095.               NIL);
  5096.  
  5097.    IF KMT_TRACE_FLAGS.PP_TRACING AND LENGTH KMT_PH_INPUT_PACKET_DATA > 0
  5098.    THEN (<RARELY>)
  5099.      (
  5100.       KMT_PP_DATA_TRACE_MESSAGE(KMT_PP_PACKET_DATA_IN_MSG,
  5101.                                 EBCDIC,
  5102.                                 KMT_PH_INPUT_PACKET_DATA)
  5103.      )
  5104.    FI
  5105.  
  5106. END;                                   @ KMT_PP_TRANSLATE_TO_EBCDIC            @
  5107.  
  5108. ***PAGE
  5109.  
  5110. GLOBAL
  5111. STATIC (<STATUS 5>)
  5112. PROC
  5113.    KMT_PP_GET_PACKET IS (
  5114.    REF INT     TYPE,
  5115.    REF INT     SEQ,
  5116.    RESPONSE    RESULT):
  5117.  
  5118. @******************************************************************************@
  5119. @*                                                                            *@
  5120. @* This procedure is used to receive a KERMIT packet from the remote end.     *@
  5121. @* If a failure is detected whilst attempting to read a packet then TYPE is   *@
  5122. @* set to BAD_PKT and the failing resultcode is returned.                     *@
  5123. @* If a zero length packet is read or no 'MARK' character is found in the     *@
  5124. @* packet then TYPE is set to BAD_PKT and resultcode KMT_PP_NO_INPUT_DATA is  *@
  5125. @* returned.                                                                  *@
  5126. @* If the checksum validation fails then TYPE is set to BAD_PKT and           *@
  5127. @* resultcode KMT_PP_INVALID_CHECKSUM is returned.                            *@
  5128. @* In all other cases TYPE will be set to either INVALID_PKT or the packet    *@
  5129. @* type. In the case of an invalid packet then a resultcode of either UNS_PKT *@
  5130. @* or NON_PKT will be returned.                                               *@
  5131. @* The packet sequence number is returned in the area referenced by SEQ and   *@
  5132. @* the packet data is returned in the area referenced by                      *@
  5133. @* KMT_PH_INPUT_PACKET_DATA.                                                  *@
  5134. @*                                                                            *@
  5135. @******************************************************************************@
  5136.  
  5137. BEGIN
  5138.    INT KMT_PP_PACKET_IN_MSG           IS 251,
  5139.        KMT_PP_NO_INPUT_PACKET         IS -80250,
  5140.        KMT_PP_INVALID_CHECKSUM        IS -80253,
  5141.        KMT_PP_INVALID_PACKET_LENGTH   IS -80254;
  5142.  
  5143.    INT INPUT_PACKET_LENGTH,
  5144.        INPUT_BUFFER_LENGTH,
  5145.        PACKET_POINTER_LENGTH;
  5146.  
  5147.    INT MAX_INPUT_LENGTH IS KMT_DH_DEVICE_DETAILS.MAX_INPUT_LENGTH;
  5148.  
  5149.    REF () BYTE INPUT_PACKET,
  5150.                PACKET_POINTER;
  5151.  
  5152.    (MAX_INPUT_LENGTH) BYTE INPUT_BUFFER;         @ Allows for padding and      @
  5153.                                                  @ 'noise' characters          @
  5154.  
  5155.    IF
  5156.      (
  5157.       KMT_DH_INPUT (INPUT_BUFFER,
  5158.                     INPUT_BUFFER_LENGTH,
  5159.                     RESULT);
  5160.       RESULT GT 0
  5161.      )
  5162.  
  5163.    THEN                                          @ I/O error                   @
  5164.       TYPE := BAD_PKT
  5165.  
  5166.    ELSF
  5167.       INPUT_BUFFER_LENGTH EQ 0
  5168.  
  5169.    OR
  5170.      (
  5171.       BYTE MARK IS KMT_PP_REMOTE_CONFG_PARAMS.MARK;
  5172.  
  5173.       REF () BYTE REM := INPUT_BUFFER(SIZE INPUT_BUFFER_LENGTH);
  5174.  
  5175.       PACKET_POINTER := REM(SIZE 0);
  5176.  
  5177.       UNTIL                                      @ Skip all but last 'MARK'    @
  5178.          SCANUNQ (MARK,                          @ character                   @
  5179.                   REM,
  5180.                   0,
  5181.                   REM)
  5182.       DO
  5183.          PACKET_POINTER := REM;
  5184.          REM := REM(1::)
  5185.       REPEAT;
  5186.  
  5187.       PACKET_POINTER_LENGTH := LENGTH PACKET_POINTER;
  5188.       PACKET_POINTER_LENGTH LT 2
  5189.      )
  5190.  
  5191.    OR
  5192.      (
  5193.       INPUT_PACKET_LENGTH := PACKET_POINTER(1) - X"20" + 2;
  5194.       PACKET_POINTER_LENGTH LT INPUT_PACKET_LENGTH
  5195.      )
  5196.  
  5197.    THEN                                          @ Either 'MARK' character not @
  5198.                                                  @ found or insufficient data  @
  5199.                                                  @ after 'MARK' character or a @
  5200.                                                  @ recoverable I/O error       @
  5201.                                                  @ occurred.                   @
  5202.       TYPE := BAD_PKT;
  5203.       RESULT := KMT_PP_NO_INPUT_PACKET
  5204.  
  5205.    ELSF
  5206.      (
  5207.       (INPUT_PACKET_LENGTH LT 5)  OR  (INPUT_PACKET_LENGTH GT 96)
  5208.      )
  5209.  
  5210.    THEN                                          @ Packet length invalid       @
  5211.       TYPE := BAD_PKT;
  5212.       RESULT := KMT_PP_INVALID_PACKET_LENGTH
  5213.  
  5214.    ELSF
  5215.      (
  5216.       INPUT_PACKET := PACKET_POINTER(SIZE INPUT_PACKET_LENGTH);
  5217.  
  5218.       IF
  5219.          KMT_TRACE_FLAGS.PP_TRACING
  5220.  
  5221.       THEN (<RARELY>)
  5222.         (
  5223.          KMT_PP_LOG_TRACE_MESSAGE (KMT_PP_PACKET_IN_MSG,
  5224.                                    INPUT_PACKET)
  5225.         )
  5226.       FI;
  5227.  
  5228.       INPUT_PACKET(INPUT_PACKET_LENGTH - 1) NE KMT_PP_GENERATE_CHECKSUM (
  5229.                                                   INPUT_PACKET)
  5230.      )
  5231.  
  5232.    THEN                                          @ Checksum error              @
  5233.       TYPE := BAD_PKT;
  5234.       RESULT := KMT_PP_INVALID_CHECKSUM
  5235.  
  5236.    ELSE                                          @ Validate packet type        @
  5237.       WORD PACKET_TYPE IS INPUT_PACKET(3) - X"41";
  5238.  
  5239.       IF
  5240.          PACKET_TYPE GT 25
  5241.  
  5242.       THEN                                       @ Not in range A to Z         @
  5243.          TYPE := INVALID_PKT;
  5244.          RESULT := NON_PKT
  5245.  
  5246.       ELSF
  5247.         (
  5248.          TYPE := PACKET_CODES(PACKET_TYPE);
  5249.          TYPE LT 0
  5250.         )
  5251.  
  5252.       THEN
  5253.          RESULT := TYPE;
  5254.          TYPE := INVALID_PKT
  5255.  
  5256.       ELSE
  5257.          REF INT DATA_LENGTH IS KMT_PP_INPUT_PACKET_DATA.DATA_LENGTH;
  5258.  
  5259.          REF () BYTE DATA IS KMT_PP_INPUT_PACKET_DATA.DATA;
  5260.  
  5261.          REF INT STATISTICS IS
  5262.                     KMT_PP_PACKET_STATISTICS.INPUT_TOTAL;
  5263.  
  5264.          STATISTICS := STATISTICS + 1;
  5265.          SEQ := INPUT_PACKET(2) - X"20";
  5266.          DATA_LENGTH := INPUT_PACKET_LENGTH - 5;
  5267.          MOVE (INPUT_PACKET(4 SIZE DATA_LENGTH),
  5268.                DATA,
  5269.                0,
  5270.                X"00",
  5271.                NIL,
  5272.                NIL);
  5273.          KMT_PH_INPUT_PACKET_DATA := DATA(SIZE DATA_LENGTH)
  5274.       FI
  5275.    FI
  5276. END;                                   @ KMT_PP_GET_PACKET                     @
  5277.  
  5278. ***PAGE
  5279.  
  5280. GLOBAL
  5281. STATIC (<STATUS 5>)
  5282. PROC
  5283.    KMT_PP_SEND_PACKET IS (
  5284.    INT         TYPE,
  5285.    INT         SEQ,
  5286.    BOOL        PROMPT,
  5287.    RESPONSE    RESULT):
  5288.  
  5289. @******************************************************************************@
  5290. @*                                                                            *@
  5291. @* This procedure is used to frame and send a KERMIT packet to the remote end.*@
  5292. @* TYPE and SEQ specify the packet type and sequence number respectively.     *@
  5293. @* The packet data and length is read from the areas                          *@
  5294. @* KMT_PP_OUTPUT_PACKET_DATA.DATA and KMT_PP_OUTPUT_PACKET_DATA.DATA_LENGTH   *@
  5295. @* respectively.                                                              *@
  5296. @* If PROMPT is set TRUE then read interest is set at the PFI for the next    *@
  5297. @* input packet.                                                              *@
  5298. @*                                                                            *@
  5299. @******************************************************************************@
  5300.  
  5301. BEGIN
  5302.    INT KMT_PP_PACKET_OUT_MSG IS 252;
  5303.  
  5304.    INT DATA_LENGTH IS KMT_PP_OUTPUT_PACKET_DATA.DATA_LENGTH;
  5305.  
  5306.    REF () BYTE DATA IS KMT_PP_OUTPUT_PACKET_DATA.DATA;
  5307.  
  5308.    INT OUTPUT_PACKET_LENGTH IS 5 + DATA_LENGTH;
  5309.  
  5310.    (OUTPUT_PACKET_LENGTH) BYTE OUTPUT_PACKET;
  5311.  
  5312.    STATIC () BYTE PACKET_TYPES IS X"00"          @ Not used                    @
  5313.                                   X"42"          @ B packet                    @
  5314.                                   X"44"          @ D packet                    @
  5315.                                   X"45"          @ E packet                    @
  5316.                                   X"46"          @ F packet                    @
  5317.                                   X"47"          @ G packet                    @
  5318.                                   X"49"          @ I packet                    @
  5319.                                   X"4B"          @ K packet                    @
  5320.                                   X"4E"          @ N packet                    @
  5321.                                   X"52"          @ R packet                    @
  5322.                                   X"53"          @ S packet                    @
  5323.                                   X"59"          @ Y packet                    @
  5324.                                   X"5A";         @ Z packet                    @
  5325.  
  5326.    OUTPUT_PACKET(0) := KMT_PP_LOCAL_CONFG_PARAMS.MARK;
  5327.    OUTPUT_PACKET(1) := DATA_LENGTH + 3 + X"20";
  5328.    OUTPUT_PACKET(2) := SEQ + X"20";
  5329.    OUTPUT_PACKET(3) := PACKET_TYPES(TYPE);
  5330.    OUTPUT_PACKET(4 SIZE DATA_LENGTH) := DATA;
  5331.    OUTPUT_PACKET(OUTPUT_PACKET_LENGTH - 1) := KMT_PP_GENERATE_CHECKSUM (
  5332.                                                  OUTPUT_PACKET);
  5333.  
  5334.    IF
  5335.       KMT_TRACE_FLAGS.PP_TRACING
  5336.  
  5337.    THEN (<RARELY>)
  5338.      (
  5339.       KMT_PP_LOG_TRACE_MESSAGE (KMT_PP_PACKET_OUT_MSG,
  5340.                                 OUTPUT_PACKET)
  5341.      )
  5342.    FI;
  5343.  
  5344.    KMT_DH_OUTPUT (OUTPUT_PACKET,
  5345.                   PROMPT,
  5346.                   RESULT);
  5347.  
  5348.    IF
  5349.       RESULT LE 0
  5350.  
  5351.    THEN
  5352.       REF INT STATISTICS IS
  5353.                  KMT_PP_PACKET_STATISTICS.OUTPUT_TOTAL;
  5354.  
  5355.       STATISTICS := STATISTICS + 1
  5356.    FI
  5357. END;                                   @ KMT_PP_SEND_PACKET                    @
  5358.  
  5359. ***PAGE
  5360.  
  5361. GLOBAL
  5362. STATIC (<STATUS 5>)
  5363. PROC
  5364.    KMT_PP_BUILD_FILE_PACKET_DATA IS (
  5365.    RESPONSE    RESULT):
  5366.  
  5367. @******************************************************************************@
  5368. @*                                                                            *@
  5369. @* This procedure is used to read file records and to construct data packets  *@
  5370. @* from the record performing data translation, binary and control character  *@
  5371. @* character quoting as appropriate.                                          *@
  5372. @* The record and length are returned in the data areas                       *@
  5373. @* KMT_FH_RECORD_DETAILS.RECORD and KMT_FH_RECORD_DETAILS.RECORD_LENGTH       *@
  5374. @* respectively. The processed packet data and length are returned is the     *@
  5375. @* data areas                                                                 *@
  5376. @* KMT_PP_OUTPUT_PACKET_DATA.DATA and KMT_PP_OUTPUT_PACKET_DATA.DATA_LENGTH   *@
  5377. @* respectively.                                                              *@
  5378. @* End of file is indicated by returning resultcode DML_READ_PSEUDO_NODE.     *@
  5379. @*                                                                            *@
  5380. @******************************************************************************@
  5381.  
  5382. BEGIN
  5383.    INT DML_READ_PSEUDO_NODE IS 9034;
  5384.  
  5385.    REF BOOL END_OF_FILE IS KMT_FH_RECORD_DETAILS.END_OF_FILE;
  5386.  
  5387.    REF INT DATA_LENGTH IS KMT_PP_OUTPUT_PACKET_DATA.DATA_LENGTH;
  5388.  
  5389.    RESULT := 0;
  5390.  
  5391.    IF
  5392.       END_OF_FILE
  5393.  
  5394.    THEN                                          @ End of file reached during  @
  5395.                                                  @ previous read               @
  5396.       DATA_LENGTH := 0;
  5397.       RESULT := DML_READ_PSEUDO_NODE
  5398.  
  5399.    ELSF
  5400.      (
  5401.       REF BOOL NEW_RECORD IS KMT_FH_RECORD_DETAILS.NEW_RECORD;
  5402.  
  5403.       WORD TEXT_TYPE IS KMT_FH_RECORD_DETAILS.TEXT_TYPE;
  5404.  
  5405.       REF INT RECORD_LENGTH IS KMT_FH_RECORD_DETAILS.RECORD_LENGTH;
  5406.  
  5407.       REF () BYTE RECORD IS KMT_FH_RECORD_DETAILS.RECORD;
  5408.  
  5409.       BYTE QCTL IS KMT_PP_LOCAL_CONFG_PARAMS.QCTL;
  5410.  
  5411.       BYTE MAXL IS KMT_PP_REMOTE_CONFG_PARAMS.MAXL;
  5412.  
  5413.       REF () BYTE DATA IS KMT_PP_OUTPUT_PACKET_DATA.DATA(SIZE MAXL - 5);
  5414.  
  5415.       () BYTE QCRQLF IS (QCTL, X"4D", QCTL, X"4A");
  5416.                                                  @ Quoted CRLF                 @
  5417.       INT D_LEN IS LENGTH DATA;
  5418.  
  5419.       REF () BYTE DATA_REM := DATA;
  5420.  
  5421.       (91) BYTE PP_TRACE_BUFFER;                 @ debug trace area            @
  5422.       REF () BYTE PP_TRACE_PTR := PP_TRACE_BUFFER;
  5423.       INT PP_TRACE_COUNT := 0;
  5424.  
  5425.       UNTIL
  5426.         (
  5427.          BOOL DATA_COMPLETE;
  5428.  
  5429.          IF
  5430.             NEW_RECORD
  5431.  
  5432.          AND
  5433.            (
  5434.             KMT_FH_READ (RESULT);
  5435.  
  5436.             IF
  5437.                RESULT LE 0
  5438.  
  5439.             THEN                                 @ Record read successfully    @
  5440.                KMT_PP_RECALL_DATA := RECORD(SIZE RECORD_LENGTH);
  5441.             FI;
  5442.  
  5443.             RESULT GT 0
  5444.            )
  5445.  
  5446.          THEN                                    @ Read error or end of file   @
  5447.             END_OF_FILE := TRUE;
  5448.             DATA_COMPLETE := TRUE
  5449.  
  5450.          ELSE                                    @ Build packet data from      @
  5451.                                                  @ record                      @
  5452.             REF () BYTE TRACE_PTR := KMT_PP_RECALL_DATA;
  5453.             INT TRACE_CT;
  5454.  
  5455.             DATA_COMPLETE := KMT_PP_BUILD_PACKET_DATA (KMT_PP_RECALL_DATA,
  5456.                                                        DATA_REM,
  5457.                                                        TEXT_TYPE,
  5458.                                                        NEW_RECORD);
  5459.  
  5460.                                                  @ copy source to trace buffer @
  5461.             TRACE_CT := LENGTH TRACE_PTR - LENGTH KMT_PP_RECALL_DATA;
  5462.             PP_TRACE_PTR(SIZE TRACE_CT) := TRACE_PTR(SIZE TRACE_CT);
  5463.             PP_TRACE_COUNT := PP_TRACE_COUNT + TRACE_CT;
  5464.             PP_TRACE_PTR := PP_TRACE_BUFFER(PP_TRACE_COUNT::);
  5465.  
  5466.             IF
  5467.                TEXT_TYPE EQ BINARY
  5468.  
  5469.             THEN                                 @ Binary file transfer don't  @
  5470.                                                  @ add CRLF end of record      @
  5471.                                                  @ marker                      @
  5472.                SKIP
  5473.  
  5474.             ELSF
  5475.                NEW_RECORD
  5476.  
  5477.             THEN                                 @ EBCDIC or ASCII file        @
  5478.                                                  @ transfer and end of record. @
  5479.                                                  @ Move in quote CRLF, end of  @
  5480.                                                  @ record marker               @
  5481.                NEW_RECORD := KMT_PP_MOVE (QCRQLF,
  5482.                                           DATA_REM,
  5483.                                           DATA_COMPLETE) NE 0;
  5484.  
  5485.                IF NEW_RECORD                    @ add new record mark to trace @
  5486.                THEN
  5487.                   PP_TRACE_PTR(SIZE 4) := IF TEXT_TYPE = EBCDIC
  5488.                                           THEN " // "
  5489.                                           ELSE X"202F2F20"
  5490.                                           FI;
  5491.                   PP_TRACE_COUNT := PP_TRACE_COUNT + 4;
  5492.                   PP_TRACE_PTR := PP_TRACE_BUFFER(PP_TRACE_COUNT::);
  5493.                FI
  5494.             FI
  5495.          FI;
  5496.  
  5497.          DATA_COMPLETE
  5498.         )
  5499.       DO
  5500.          SKIP
  5501.       REPEAT;
  5502.  
  5503.       DATA_LENGTH := D_LEN - LENGTH DATA_REM;
  5504.  
  5505.       IF KMT_TRACE_FLAGS.PP_TRACING AND PP_TRACE_COUNT > 0
  5506.       THEN (<RARELY>)
  5507.         (
  5508.          IF TEXT_TYPE = ASCII
  5509.          THEN
  5510.             TRANSLATE(ASCII_TO_EBCDIC,
  5511.                       PP_TRACE_BUFFER(SIZE PP_TRACE_COUNT),
  5512.                       0,
  5513.                       NIL)
  5514.          FI;
  5515.  
  5516.          KMT_PP_DATA_TRACE_MESSAGE(KMT_PP_PACKET_DATA_OUT_MSG,
  5517.                                    TEXT_TYPE,
  5518.                                    PP_TRACE_BUFFER(SIZE PP_TRACE_COUNT))
  5519.         )
  5520.       FI;
  5521.  
  5522.       (RESULT EQ DML_READ_PSEUDO_NODE)  AND  (DATA_LENGTH NE 0)
  5523.      )
  5524.  
  5525.    THEN                                          @ End of file reached but     @
  5526.                                                  @ packet data remains.        @
  5527.                                                  @ Return end of file on next  @
  5528.                                                  @ call                        @
  5529.       RESULT := 0
  5530.    FI
  5531. END;                                   @ KMT_PP_BUILD_FILE_PACKET_DATA         @
  5532.  
  5533. ***PAGE
  5534.  
  5535. GLOBAL
  5536. STATIC (<STATUS 5>)
  5537. PROC
  5538.    KMT_PP_BUILD_STRING_PACKET_DATA IS (
  5539.    REF () BYTE STRING,
  5540.    RESPONSE    RESULT):
  5541.  
  5542. @******************************************************************************@
  5543. @*                                                                            *@
  5544. @* This procedure is used to translate the data held in STRING from EBCDIC to *@
  5545. @* ASCII.                                                                     *@
  5546. @* The translated data and length is returned in the area                     *@
  5547. @* KMT_PP_OUTPUT_PACKET_DATA.DATA and KMT_PP_OUTPUT_PACKET_DATA.DATA_LENGTH   *@
  5548. @* respectively.                                                              *@
  5549. @* If the translated data length exceeds the maximum packet data length then  *@
  5550. @* resultcode KMT_PP_STRING_TOO_BIG is returned.                              *@
  5551. @*                                                                            *@
  5552. @******************************************************************************@
  5553.  
  5554. BEGIN
  5555.    INT KMT_PP_STRING_TOO_BIG IS 80256;
  5556.  
  5557.    INT MAXL IS KMT_PP_REMOTE_CONFG_PARAMS.MAXL;
  5558.  
  5559.    REF INT DATA_LENGTH IS KMT_PP_OUTPUT_PACKET_DATA.DATA_LENGTH;
  5560.  
  5561.    REF () BYTE DATA IS KMT_PP_OUTPUT_PACKET_DATA.DATA(SIZE MAXL - 5);
  5562.  
  5563.    INT STRING_LENGTH IS IF
  5564.                            STRING IS NIL
  5565.                         THEN
  5566.                            0
  5567.                         ELSE
  5568.                            LENGTH STRING
  5569.                         FI;
  5570.  
  5571.    IF
  5572.       STRING_LENGTH EQ 0
  5573.  
  5574.    THEN                                          @ NIL or ZLR supplied         @
  5575.       DATA_LENGTH := 0;
  5576.       RESULT := 0
  5577.  
  5578.    ELSE
  5579.       () BYTE STRING_COPY := STRING;             @ Don't want to corrupt       @
  5580.                                                  @ original string             @
  5581.  
  5582.       REF () BYTE STRING_POINTER := STRING_COPY,
  5583.                   DATA_REM       := DATA;
  5584.  
  5585.       RESULT := IF
  5586.                   (
  5587.                    BOOL STRING_COMPLETE := TRUE;
  5588.  
  5589.                    KMT_PP_BUILD_PACKET_DATA (STRING_POINTER,
  5590.                                              DATA_REM,
  5591.                                              EBCDIC,
  5592.                                              STRING_COMPLETE);
  5593.                    STRING_COMPLETE
  5594.                   )
  5595.                 THEN
  5596.                    0
  5597.                 ELSE                             @ String too big              @
  5598.                    KMT_PP_STRING_TOO_BIG
  5599.                 FI;
  5600.  
  5601.       DATA_LENGTH := LENGTH DATA - LENGTH DATA_REM;
  5602.  
  5603.       IF KMT_TRACE_FLAGS.PP_TRACING
  5604.       THEN (<RARELY>)
  5605.         (
  5606.          KMT_PP_DATA_TRACE_MESSAGE(KMT_PP_PACKET_DATA_OUT_MSG,EBCDIC,
  5607.                            STRING(SIZE (STRING_LENGTH - LENGTH STRING_POINTER)))
  5608.         )
  5609.       FI
  5610.    FI;
  5611. END;                                   @ KMT_PP_BUILD_STRING_PACKET_DATA       @
  5612.  
  5613. ***PAGE
  5614.  
  5615. GLOBAL
  5616. STATIC (<STATUS 5>)
  5617. PROC
  5618.    KMT_PP_BUILD_FILE_RECORD IS (
  5619.    RESPONSE    RESULT):
  5620.  
  5621. @******************************************************************************@
  5622. @*                                                                            *@
  5623. @* This procedure is used to construct file records from KERMIT data packets  *@
  5624. @* received. For text files control character quoting and data translation    *@
  5625. @* from ASCII to EBCDIC is performed. For binary files control character      *@
  5626. @* quoting and 8th bit quoting is performed.                                  *@
  5627. @* The packet data is read from the area referenced by                        *@
  5628. @* KMT_PH_INPUT_PACKET_DATA. The processed record and length is returned in   *@
  5629. @* the areas KMT_FH_RECORD_DETAILS.RECORD and                                 *@
  5630. @* KMT_FH_RECORD_DETAILS.RECORD.LENGTH respectively.                          *@
  5631. @* When the end of record is detected the record is written to the file.      *@
  5632. @*                                                                            *@
  5633. @******************************************************************************@
  5634.  
  5635. BEGIN
  5636.  
  5637.    INT KMT_PP_RECORD_TOO_BIG IS 80255;
  5638.  
  5639.    REF () BYTE DATA := KMT_PH_INPUT_PACKET_DATA;
  5640.  
  5641.    INT DATA_LENGTH IS LENGTH DATA;
  5642.  
  5643.    REF BOOL NEW_RECORD IS KMT_FH_RECORD_DETAILS.NEW_RECORD;
  5644.  
  5645.    WORD TEXT_TYPE IS KMT_FH_RECORD_DETAILS.TEXT_TYPE;
  5646.  
  5647.    INT MAX_RECORD_LENGTH := KMT_FH_RECORD_DETAILS.MAX_RECORD_LENGTH;
  5648.  
  5649.    REF INT RECORD_LENGTH IS KMT_FH_RECORD_DETAILS.RECORD_LENGTH;
  5650.  
  5651.    INT RECORD_SIZE IS IF
  5652.                           TEXT_TYPE EQ BINARY
  5653.                       THEN                       @ Binary file transfer. CRLF  @
  5654.                                                  @ end of record terminator    @
  5655.                                                  @ not required                @
  5656.                           MAX_RECORD_LENGTH
  5657.                       ELSE                       @ EBCDIC or ASCII file xfer.  @
  5658.                                                  @ Allow for CRLF pair, end of @
  5659.                                                  @ record terminator           @
  5660.                           MAX_RECORD_LENGTH + 2
  5661.                       FI;
  5662.  
  5663.    REF () BYTE RECORD IS KMT_FH_RECORD_DETAILS.RECORD(SIZE RECORD_SIZE);
  5664.  
  5665.    () BYTE LF IS X"0A",                          @ ASCII LF                    @
  5666.            CR IS X"0D";                          @ CR                          @
  5667.  
  5668.    () BYTE CRLF IS (CR,LF);
  5669.  
  5670.    BOOL DATA_COMPLETE := (DATA_LENGTH LE 0);
  5671.  
  5672.    (96) BYTE PP_TRACE_BUFFER;                    @ packet trace variables      @
  5673.    REF () BYTE PP_TRACE_PTR := PP_TRACE_BUFFER,
  5674.                TRACE_PTR := KMT_PP_RECALL_DATA;
  5675.    INT PP_TRACE_COUNT := 0;
  5676.  
  5677.    RESULT := 0;
  5678.  
  5679.    UNTIL
  5680.       DATA_COMPLETE  OR  (RESULT GT 0)
  5681.    DO
  5682.       INT LAST_CHAR_INDEX IS IF
  5683.                                 NEW_RECORD
  5684.                              THEN
  5685.                                 KMT_PP_RECALL_DATA := RECORD;
  5686.                                 TRACE_PTR := RECORD; @ (for trace)             @
  5687.                                 -1
  5688.                              ELSE
  5689.                                 RECORD_SIZE - (LENGTH KMT_PP_RECALL_DATA + 1)
  5690.                              FI;
  5691.  
  5692.       BYTE UNQUOTED_CHAR;
  5693.  
  5694.       INT SEQUENCE_LENGTH;
  5695.  
  5696.       KMT_PP_UNQUOTE_CHAR (DATA,
  5697.                            UNQUOTED_CHAR,
  5698.                            SEQUENCE_LENGTH);
  5699.  
  5700.       IF
  5701.          KMT_PP_MOVE (UNQUOTED_CHAR,
  5702.                       KMT_PP_RECALL_DATA,
  5703.                       NEW_RECORD) NE 0
  5704.  
  5705.       THEN                                       @ Moved in data               @
  5706.          DATA_COMPLETE := KMT_PP_CHECK_COMPLETE (SEQUENCE_LENGTH,
  5707.                                                  DATA);
  5708.       FI;
  5709.  
  5710.       IF
  5711.          TEXT_TYPE EQ BINARY
  5712.  
  5713.       THEN                                       @ Binary file transfer        @
  5714.          RECORD_LENGTH := RECORD_SIZE - LENGTH KMT_PP_RECALL_DATA;
  5715.  
  5716.          IF
  5717.             NEW_RECORD
  5718.  
  5719.          THEN                                    @ Record complete, output it  @
  5720.                                                  @ (obtain trace info)         @
  5721.             INT TRACE_CT := LENGTH TRACE_PTR - LENGTH KMT_PP_RECALL_DATA;
  5722.             PP_TRACE_PTR(SIZE TRACE_CT) := TRACE_PTR(SIZE TRACE_CT);
  5723.             PP_TRACE_COUNT := PP_TRACE_COUNT + TRACE_CT;
  5724.             PP_TRACE_PTR := PP_TRACE_BUFFER(PP_TRACE_COUNT::);
  5725.  
  5726.             KMT_FH_WRITE (RESULT)                @ output record               @
  5727.          FI
  5728.  
  5729.       ELSF
  5730.          (LAST_CHAR_INDEX GE 0)  AND  (RECORD(LAST_CHAR_INDEX SIZE 2) EQ CRLF)
  5731.  
  5732.       THEN                                       @ EBCDIC or ASCII file xfer   @
  5733.                                                  @ end of record, output it    @
  5734.                                                  @ (obtain trace info)         @
  5735.          INT TRACE_CT := LENGTH TRACE_PTR - (LENGTH KMT_PP_RECALL_DATA + 2);
  5736.          IF TRACE_CT = -1                    @ CR LF split between two packets @
  5737.          THEN
  5738.             TRACE_CT := 0
  5739.          ELSE
  5740.             PP_TRACE_PTR(SIZE TRACE_CT) := TRACE_PTR(SIZE TRACE_CT);
  5741.          FI;
  5742.          PP_TRACE_PTR := PP_TRACE_BUFFER((PP_TRACE_COUNT + TRACE_CT)::);
  5743.          PP_TRACE_PTR(SIZE 4) := X"202F2F20";
  5744.          PP_TRACE_COUNT := PP_TRACE_COUNT + TRACE_CT + 4;
  5745.          PP_TRACE_PTR := PP_TRACE_BUFFER(PP_TRACE_COUNT::);
  5746.  
  5747.          RECORD_LENGTH := RECORD_SIZE - (LENGTH KMT_PP_RECALL_DATA + 2);
  5748.                                                  @ Don't want CRLF in file     @
  5749.  
  5750.          IF
  5751.             TEXT_TYPE EQ EBCDIC
  5752.  
  5753.          THEN                                    @ EBCDIC file transfer        @
  5754.             TRANSLATE (ASCII_TO_EBCDIC,
  5755.                        RECORD(SIZE RECORD_LENGTH),
  5756.                        0,
  5757.                        NIL)
  5758.          FI;
  5759.  
  5760.          KMT_FH_WRITE (RESULT);
  5761.          NEW_RECORD := TRUE
  5762.  
  5763.       ELSF
  5764.          (
  5765.           RECORD_LENGTH := RECORD_SIZE - LENGTH KMT_PP_RECALL_DATA;
  5766.           NEW_RECORD
  5767.          )
  5768.  
  5769.       THEN                                       @ EBCDIC or ASCII file xfer   @
  5770.                                                  @ and record buffer full but  @
  5771.                                                  @ no end of record found.     @
  5772.          () KMT_MTM_VALUES PARAMS := DISPLAY(MAX_RECORD_LENGTH
  5773.                                              AS KMT_MTM_VALUES.RI_VALUE);
  5774.  
  5775.          RESULT := KMT_PP_RECORD_TOO_BIG;
  5776.          KMT_EH_LOG_ERROR (RESULT,
  5777.                            2,
  5778.                            PARAMS,
  5779.                            0,
  5780.                            FALSE,
  5781.                            FALSE)
  5782.       FI
  5783.    REPEAT;
  5784.  
  5785.    IF KMT_TRACE_FLAGS.PP_TRACING
  5786.    THEN (<RARELY>)
  5787.      (
  5788.       IF DATA_COMPLETE AND NOT NEW_RECORD       @ (obtain rest of trace info) @
  5789.       THEN
  5790.          INT TRACE_CT := LENGTH TRACE_PTR - LENGTH KMT_PP_RECALL_DATA;
  5791.          PP_TRACE_PTR(SIZE TRACE_CT) := TRACE_PTR(SIZE TRACE_CT);
  5792.          PP_TRACE_COUNT := PP_TRACE_COUNT + TRACE_CT
  5793.       FI;
  5794.  
  5795.       IF PP_TRACE_COUNT > 0
  5796.       THEN
  5797.          IF TEXT_TYPE NE BINARY
  5798.          THEN
  5799.             TRANSLATE(ASCII_TO_EBCDIC,
  5800.                       PP_TRACE_BUFFER(SIZE PP_TRACE_COUNT),
  5801.                       0,
  5802.                       NIL)
  5803.          FI;
  5804.  
  5805.          KMT_PP_DATA_TRACE_MESSAGE(KMT_PP_PACKET_DATA_IN_MSG,
  5806.                                    TEXT_TYPE,
  5807.                                    PP_TRACE_BUFFER(SIZE PP_TRACE_COUNT))
  5808.       FI
  5809.      )
  5810.    FI
  5811.  
  5812. END;                                   @ KMT_PP_BUILD_FILE_RECORD              @
  5813.  
  5814. ***PAGE
  5815.  
  5816. GLOBAL
  5817. STATIC (<STATUS 5>)
  5818. PROC
  5819.    KMT_PP_BUILD_PARAM_PACKET_DATA IS ():
  5820.  
  5821. @******************************************************************************@
  5822. @*                                                                            *@
  5823. @* This procedure is used to construct the packet data from the configuration *@
  5824. @* parameters.                                                                *@
  5825. @* The configuration parameters are read from the area                        *@
  5826. @* KMT_PP_LOCAL_CONFG_PARAMS and the packet data and length is returned in    *@
  5827. @* the areas KMT_PP_OUTPUT_PACKET_DATA.DATA and                               *@
  5828. @* KMT_PP_OUTPUT_PACKET_DATA.DATA_LENGTH respectively.                        *@
  5829. @*                                                                            *@
  5830. @******************************************************************************@
  5831.  
  5832. BEGIN
  5833.    REF () BYTE DATA IS KMT_PP_OUTPUT_PACKET_DATA.DATA;
  5834.  
  5835.    BYTE N IS X"4E";                             @ ASCII N                     @
  5836.  
  5837.    DATA(0) := KMT_PP_LOCAL_CONFG_PARAMS.MAXL + X"20";
  5838.    DATA(1) := KMT_PP_LOCAL_CONFG_PARAMS.TIME + X"20";
  5839.    DATA(2) := KMT_PP_LOCAL_CONFG_PARAMS.NPAD + X"20";
  5840.    DATA(3) := KMT_PP_LOCAL_CONFG_PARAMS.PADC NEQ X"40";
  5841.    DATA(4) := KMT_PP_LOCAL_CONFG_PARAMS.EOL + X"20";
  5842.    DATA(5) := KMT_PP_LOCAL_CONFG_PARAMS.QCTL;
  5843.    DATA(6) := IF
  5844.                  KMT_FH_RECORD_DETAILS.TEXT_TYPE NE EBCDIC
  5845.               THEN                               @ ASCII or binary file xfer   @
  5846.                                                  @ requested, do 8th bit       @
  5847.                                                  @ quoting                     @
  5848.                  KMT_PP_LOCAL_CONFG_PARAMS.QBIN
  5849.               ELSE                               @ EBCDIC file transfer        @
  5850.                                                  @ requested, donot do 8th bit @
  5851.                                                  @ quoting                     @
  5852.                  N
  5853.               FI;
  5854.                                                  @ We don't support any others @
  5855.                                                  @ so default them             @
  5856.    KMT_PP_OUTPUT_PACKET_DATA.DATA_LENGTH := 7;
  5857.  
  5858.    IF KMT_TRACE_FLAGS.PP_TRACING
  5859.    THEN (<RARELY>)
  5860.      (
  5861.       () INT P := (KMT_PP_LOCAL_CONFG_PARAMS.MAXL,
  5862.                    KMT_PP_LOCAL_CONFG_PARAMS.TIME,
  5863.                    KMT_PP_LOCAL_CONFG_PARAMS.NPAD);
  5864.  
  5865.       () KMT_MTM_VALUES PARAMS := (P(0)
  5866.                                    AS KMT_MTM_VALUES.RI_VALUE,
  5867.                                    P(1)
  5868.                                    AS KMT_MTM_VALUES.RI_VALUE,
  5869.                                    P(2)
  5870.                                    AS KMT_MTM_VALUES.RI_VALUE,
  5871.                                    KMT_PP_LOCAL_CONFG_PARAMS.PADC
  5872.                                    AS KMT_MTM_VALUES.RVB_VALUE,
  5873.                                    KMT_PP_LOCAL_CONFG_PARAMS.EOL
  5874.                                    AS KMT_MTM_VALUES.RVB_VALUE,
  5875.                                    KMT_PP_LOCAL_CONFG_PARAMS.QCTL
  5876.                                    AS KMT_MTM_VALUES.RVB_VALUE,
  5877.                                    DATA(6)
  5878.                                    AS KMT_MTM_VALUES.RVB_VALUE);
  5879.  
  5880.       KMT_SP_LOG_TRACE_MESSAGE(KMT_PP_PARAM_OUT_MSG,PARAMS)
  5881.      )
  5882.    FI
  5883.  
  5884. END;                                   @ KMT_PP_BUILD_PARAM_PACKET_DATA        @
  5885.  
  5886. ***PAGE
  5887.  
  5888. GLOBAL
  5889. STATIC (<STATUS 5>)
  5890. PROC
  5891.    KMT_PP_PROCESS_PARAM_PACKET_DATA IS (
  5892.    RESPONSE RESULT):
  5893.  
  5894. @******************************************************************************@
  5895. @*                                                                            *@
  5896. @* This procedure is used to extract the configuration parameters from the    *@
  5897. @* packet data.                                                               *@
  5898. @* The packet data is read from the area referenced by                        *@
  5899. @* KMT_PH_INPUT_PACKET_DATA and the configuration parameters are returned in  *@
  5900. @* the area KMT_PP_REMOTE_CONFG_PARAMS.                                       *@
  5901. @*                                                                            *@
  5902. @******************************************************************************@
  5903.  
  5904. BEGIN
  5905.  
  5906. ***PAGE
  5907.  
  5908. SIM
  5909. PROC
  5910. KMT_PP_LOG_PARAM_ERROR IS (
  5911.    INT NAME_CODE,
  5912.    REF () BYTE VALUE,
  5913.    INT REASON_CODE,
  5914.    RESPONSE    RESULT):
  5915.  
  5916. @******************************************************************************@
  5917. @*                                                                            *@
  5918. @* This procedure is used to log configuration parameter validation errors to *@
  5919. @* the job journal.                                                           *@
  5920. @*                                                                            *@
  5921. @******************************************************************************@
  5922.  
  5923. BEGIN
  5924.    INT KMT_PP_INVALID_CONFIG_PARAM IS 80257;
  5925.    INT NAME := NAME_CODE,
  5926.        REASON := REASON_CODE;
  5927.  
  5928.    () KMT_MTM_VALUES PARAMS := (NAME
  5929.                                 AS KMT_MTM_VALUES.RI_VALUE,
  5930.                                 VALUE
  5931.                                 AS KMT_MTM_VALUES.RVB_VALUE,
  5932.                                 REASON
  5933.                                 AS KMT_MTM_VALUES.RI_VALUE);
  5934.  
  5935.    RESULT := KMT_PP_INVALID_CONFIG_PARAM;
  5936.  
  5937.    KMT_EH_LOG_ERROR (RESULT,2,PARAMS,0,FALSE,FALSE)
  5938.  
  5939. END;                                   @ KMT_PP_LOG_PARAM_ERROR                @
  5940.  
  5941. ***PAGE
  5942.  
  5943.    INT KMT_PP_QBIN_AND_QCTL_EQUAL IS 80258,
  5944.        KMT_PP_QCTL_WARNING        IS -80259,
  5945.        KMT_PP_QBIN_REJECTED       IS 80260;
  5946.  
  5947.    INT MAXL_CODE IS 0,
  5948.        NPAD_CODE IS 1,
  5949.        PADC_CODE IS 2,
  5950.        EOL_CODE  IS 3,
  5951.        QCTL_CODE IS 4,
  5952.        QBIN_CODE IS 5;
  5953.  
  5954.    INT INFO_LENGTH IS SIZEOF KMT_PP_CONFG_PARAMS_S;
  5955.  
  5956.    (INFO_LENGTH) BYTE PACKET_INFO;
  5957.  
  5958.    WORD MAX_OUTPUT_LENGTH IS KMT_DH_DEVICE_DETAILS.MAX_OUTPUT_LENGTH;
  5959.  
  5960.    WORD TEXT_TYPE IS KMT_FH_RECORD_DETAILS.TEXT_TYPE;
  5961.  
  5962.    WORD MIN_PACKET_LENGTH IS 30;
  5963.  
  5964.    INT DATA_LENGTH IS LENGTH KMT_PH_INPUT_PACKET_DATA;
  5965.  
  5966.    REF BYTE MAXL IS KMT_PP_REMOTE_CONFG_PARAMS.MAXL,
  5967.             TIME IS KMT_PP_REMOTE_CONFG_PARAMS.TIME,
  5968.             NPAD IS KMT_PP_REMOTE_CONFG_PARAMS.NPAD,
  5969.             PADC IS KMT_PP_REMOTE_CONFG_PARAMS.PADC,
  5970.             EOL  IS KMT_PP_REMOTE_CONFG_PARAMS.EOL,
  5971.             QCTL IS KMT_PP_REMOTE_CONFG_PARAMS.QCTL,
  5972.             QBIN IS KMT_PP_REMOTE_CONFG_PARAMS.QBIN,
  5973.             CHKT IS KMT_PP_REMOTE_CONFG_PARAMS.CHKT,
  5974.             REPT IS KMT_PP_REMOTE_CONFG_PARAMS.REPT;
  5975.  
  5976.    REF 4-BYTE CAPAS IS KMT_PP_REMOTE_CONFG_PARAMS.CAPAS;
  5977.  
  5978.    REF BYTE LOCAL_MARK IS KMT_PP_LOCAL_CONFG_PARAMS.MARK,
  5979.             LOCAL_QCTL IS KMT_PP_LOCAL_CONFG_PARAMS.QCTL,
  5980.             LOCAL_QBIN IS KMT_PP_LOCAL_CONFG_PARAMS.QBIN;
  5981.  
  5982.    INT RC;
  5983.  
  5984.    BYTE PARAM;
  5985.  
  5986.    BYTE NUL    IS X"00",                         @ ASCII NUL                   @
  5987.         CR     IS X"0D",                         @ CR                          @
  5988.         SPACE  IS X"20",                         @ Space                       @
  5989.         HASH   IS X"23",                         @ #                           @
  5990.         ONE    IS X"31",                         @ 1                           @
  5991.         RAB    IS X"3E",                         @ >                           @
  5992.         CTLNUL IS X"40",                         @ Controlled NUL              @
  5993.         N      IS X"4E",                         @ N                           @
  5994.         Y      IS X"59",                         @ Y                           @
  5995.         GRAVE  IS X"60",                         @ `                           @
  5996.         TILDE  IS X"7E",                         @ ~                           @
  5997.         DEL    IS X"7F";                         @ DEL                         @
  5998.  
  5999.    RESULT := 0;
  6000.  
  6001.    MOVEBYTE (SPACE,                              @ Set defaults                @
  6002.              PACKET_INFO,
  6003.              0,
  6004.              NIL);
  6005.    PACKET_INFO(3) := CTLNUL;                     @ PADC default                @
  6006.  
  6007.    PACKET_INFO(SIZE DATA_LENGTH) := KMT_PH_INPUT_PACKET_DATA;
  6008.  
  6009.    IF KMT_TRACE_FLAGS.PP_TRACING
  6010.    THEN (<RARELY>)
  6011.      (
  6012.       () INT IP := (PACKET_INFO(0) - X"20",
  6013.                     PACKET_INFO(1) - X"20",
  6014.                     PACKET_INFO(2) - X"20",
  6015.                     PACKET_INFO(7) - X"30");
  6016.  
  6017.       () BYTE BP := (PACKET_INFO(3) NEQ X"40",
  6018.                      PACKET_INFO(4) - X"20");
  6019.  
  6020.       () KMT_MTM_VALUES PARAMS := (IP(0)                               @ MAXL  @
  6021.                                    AS KMT_MTM_VALUES.RI_VALUE,
  6022.                                    IP(1)                               @ TIME  @
  6023.                                    AS KMT_MTM_VALUES.RI_VALUE,
  6024.                                    IP(2)                               @ NPAD  @
  6025.                                    AS KMT_MTM_VALUES.RI_VALUE,
  6026.                                    BP(0)                               @ PADC  @
  6027.                                    AS KMT_MTM_VALUES.RVB_VALUE,
  6028.                                    BP(1)                               @ EOL   @
  6029.                                    AS KMT_MTM_VALUES.RVB_VALUE,
  6030.                                    PACKET_INFO(5)                      @ QBIN  @
  6031.                                    AS KMT_MTM_VALUES.RVB_VALUE,
  6032.                                    PACKET_INFO(6)                      @ QCTL  @
  6033.                                    AS KMT_MTM_VALUES.RVB_VALUE,
  6034.                                    IP(3)                               @ CHKT  @
  6035.                                    AS KMT_MTM_VALUES.RI_VALUE,
  6036.                                    PACKET_INFO(8)                      @ REPT  @
  6037.                                    AS KMT_MTM_VALUES.RVB_VALUE,
  6038.                                    PACKET_INFO(9 SIZE 4)               @ CAPAS @
  6039.                                    AS KMT_MTM_VALUES.RVB_VALUE);
  6040.  
  6041.       KMT_SP_LOG_TRACE_MESSAGE(KMT_PP_PARAM_IN_MSG,PARAMS(SIZE DATA_LENGTH))
  6042.      )
  6043.    FI;
  6044.  
  6045.    PARAM := PACKET_INFO(0) - X"20";
  6046.    MAXL := IF
  6047.               (PARAM EQ 0)
  6048.            OR
  6049.               (PARAM GE MAX_OUTPUT_LENGTH)
  6050.            THEN                                  @ Defaulted or greater than   @
  6051.                                                  @ device line length          @
  6052.                MAX_OUTPUT_LENGTH
  6053.            ELSE
  6054.                PARAM
  6055.            FI;
  6056.  
  6057.    TIME := PACKET_INFO(1) - X"20";
  6058.    NPAD := PACKET_INFO(2) - X"20";
  6059.    PADC := PACKET_INFO(3) NEQ X"40";
  6060.    PARAM := PACKET_INFO(4) - X"20";
  6061.    EOL := IF
  6062.              PARAM EQ 0
  6063.           THEN                                   @ defaulted, set to CR        @
  6064.              CR
  6065.           ELSE
  6066.              PARAM
  6067.           FI;
  6068.  
  6069.    PARAM := PACKET_INFO(5);
  6070.    QCTL := IF
  6071.               PARAM EQ SPACE
  6072.            THEN                                  @ Defaulted, set to #         @
  6073.                HASH
  6074.            ELSE
  6075.                PARAM
  6076.            FI;
  6077.  
  6078.    PARAM := PACKET_INFO(6);
  6079.    QBIN := IF
  6080.               PARAM EQ N                         @ ASCII N                     @
  6081.            THEN                                  @ 8th bit quoting rejected    @
  6082.               SPACE
  6083.            ELSF
  6084.               PARAM EQ Y                         @ ASCII Y                     @
  6085.            THEN                                  @ 8th bit quoting requested   @
  6086.               LOCAL_QBIN
  6087.            ELSE
  6088.               PARAM
  6089.            FI;
  6090.                                                  @ We donot support any others @
  6091.                                                  @ so default them             @
  6092.    CHKT  := ONE;
  6093.    REPT  := NUL;
  6094.    CAPAS := NUL;
  6095.                                                  @ Validate configuration      @
  6096.                                                  @ parameters                  @
  6097.    IF MAXL LT MIN_PACKET_LENGTH
  6098.    THEN                                          @ Invalid MAXL parameter      @
  6099.       KMT_PP_LOG_PARAM_ERROR (MAXL_CODE,MAXL,80270,RESULT)
  6100.    FI;
  6101.  
  6102.    IF (MAXL + NPAD) LE MAX_OUTPUT_LENGTH
  6103.    THEN
  6104.       SKIP
  6105.    ELSF                                          @ Device line length exceeded @
  6106.      (                                           @ Adjust MAXL                 @
  6107.       MAXL := MAX_OUTPUT_LENGTH - NPAD;
  6108.       MAXL LT MIN_PACKET_LENGTH
  6109.      )
  6110.    THEN                                          @ NPAD parameter invalid      @
  6111.       KMT_PP_LOG_PARAM_ERROR (NPAD_CODE,NPAD,80271,RESULT)
  6112.    FI;
  6113.  
  6114.    IF (PADC GT SPACE)  AND  (PADC NE DEL)
  6115.    THEN                                          @ Invalid PADC character      @
  6116.       KMT_PP_LOG_PARAM_ERROR (PADC_CODE,PADC,80272,RESULT)
  6117.    FI;
  6118.  
  6119.    IF EOL = LOCAL_MARK
  6120.    THEN                                          @ EOL conflicts with MARK     @
  6121.       KMT_PP_LOG_PARAM_ERROR (EOL_CODE,EOL,80276,RESULT)
  6122.    ELSF KMT_SP_CHECK_VME_CHAR(EOL,1,RC);
  6123.         RC NE 0
  6124.    THEN                                          @ EOL not acceptable to VME   @
  6125.       KMT_PP_LOG_PARAM_ERROR (EOL_CODE,EOL,80274,RESULT)
  6126.    FI;
  6127.  
  6128.    IF NPAD > 0
  6129.    THEN                                          @ check for PADC conflict     @
  6130.       IF PADC = LOCAL_MARK
  6131.       THEN                                       @ PADC conflicts with MARK    @
  6132.          KMT_PP_LOG_PARAM_ERROR (PADC_CODE,PADC,80276,RESULT)
  6133.       ELSF PADC = EOL
  6134.       THEN                                       @ PADC conflicts with EOL     @
  6135.          KMT_PP_LOG_PARAM_ERROR (PADC_CODE,PADC,80277,RESULT)
  6136.       ELSF KMT_SP_CHECK_VME_CHAR(PADC,1,RC);
  6137.            RC NE 0
  6138.       THEN                                      @ PADC not acceptable to VME   @
  6139.          KMT_PP_LOG_PARAM_ERROR (PADC_CODE,PADC,80274,RESULT)
  6140.       FI
  6141.    FI;
  6142.  
  6143.    IF (QCTL LE SPACE)  OR  (QCTL GE DEL)
  6144.    THEN                                          @ Invalid QCTL character      @
  6145.       KMT_PP_LOG_PARAM_ERROR (QCTL_CODE,QCTL,80273,RESULT)
  6146.    FI;
  6147.  
  6148.    IF (QCTL GT RAB)  AND  (QCTL LT GRAVE)
  6149.    THEN
  6150.       @ KERMIT protocol permits the QCTL character to be any printable         @
  6151.       @ character. However a QCTL character value in the range X3F to X5F may  @
  6152.       @ result in data corruption. A warning message is logged but the choice  @
  6153.       @ of QCTL is permitted as the protocol allows it. eg Consider a QCTL     @
  6154.       @ character of '?' (X3F) and data containing the character DEL (X7F).    @
  6155.       @ The sender encodes this as a two byte sequence: QCTL (DEL XOR X40)     @
  6156.       @ ie '??' (X3F3F). The quoting rule states that QCTL caharacters         @
  6157.       @ appearing in the data must also be prefixed. Therefore the receiver    @
  6158.       @ will decode the sequence as '?' (X3F) not DEL (X7F) as required.       @
  6159.  
  6160.       BYTE CORRUPTED_CHAR := (QCTL NEQ X"40");
  6161.  
  6162.       () KMT_MTM_VALUES PARAMS := (QCTL
  6163.                                    AS KMT_MTM_VALUES.RVB_VALUE,
  6164.                                    CORRUPTED_CHAR
  6165.                                    AS KMT_MTM_VALUES.RVB_VALUE);
  6166.  
  6167.       KMT_EH_LOG_ERROR (KMT_PP_QCTL_WARNING,2,PARAMS,0,FALSE,FALSE)
  6168.    FI;
  6169.  
  6170.    IF                                                         TEXT_TYPE EQ EBCDIC
  6171.    THEN                                          @ EBCDIC file transfer        @
  6172.       SKIP
  6173.    ELSF
  6174.          (QBIN LT SPACE)
  6175.       OR
  6176.          (QBIN GT TILDE)
  6177.       OR
  6178.          ((QBIN GT RAB)  AND  (QBIN LT GRAVE))
  6179.  
  6180.    THEN                                          @ Invalid QBIN character      @
  6181.       KMT_PP_LOG_PARAM_ERROR (QBIN_CODE,QBIN,80275,RESULT)
  6182.    ELSF
  6183.       QBIN EQ SPACE
  6184.    THEN                                          @ QBIN character rejected     @
  6185.       RESULT := KMT_PP_QBIN_REJECTED;
  6186.       KMT_EH_LOG_ERROR (RESULT,2,NIL,0,FALSE,FALSE)
  6187.    ELSF
  6188.       QBIN EQ QCTL  OR  QBIN EQ LOCAL_QCTL
  6189.    THEN                                          @ ASCII or binary file xfer,  @
  6190.                                                  @ but QBIN and QCTL characters@
  6191.                                                  @ are equal                   @
  6192.       () KMT_MTM_VALUES PARAMS := (QBIN
  6193.                                    AS KMT_MTM_VALUES.RVB_VALUE,
  6194.                                    QCTL
  6195.                                    AS KMT_MTM_VALUES.RVB_VALUE,
  6196.                                    LOCAL_QCTL
  6197.                                    AS KMT_MTM_VALUES.RVB_VALUE);
  6198.  
  6199.       RESULT := KMT_PP_QBIN_AND_QCTL_EQUAL;
  6200.       KMT_EH_LOG_ERROR (RESULT,2,PARAMS,0,FALSE,FALSE)
  6201.    ELSE                                          @ IA5 or binary file transfer,@
  6202.                                                  @ and QCTL and QBIN characters@
  6203.                                                  @ are acceptable              @
  6204.       LOCAL_QBIN := QBIN
  6205.    FI
  6206. END;                                   @ KMT_PP_PROCESS_PARAM_PACKET_DATA      @
  6207. ENDMODULE                              @ KMT_PP_MODULE                         @
  6208. $$$$ KMT_SP_MODULE
  6209. MODULE KMT_SP_MODULE;
  6210.  
  6211. @******************************************************************************@
  6212. @*                                                                            *@
  6213. @* Mode definitions                                                           *@
  6214. @*                                                                            *@
  6215. @******************************************************************************@
  6216.  
  6217. MODE
  6218. KMT_DH_DEVICE_DETAILS_S IS STRUCT (
  6219.    BOOL FILE_OPEN,
  6220.    WORD MAX_INPUT_LENGTH,
  6221.         MAX_OUTPUT_LENGTH,
  6222.         INPUT_PARITY,
  6223.         OUTPUT_PARITY,
  6224.         PAUSE);
  6225.  
  6226. MODE
  6227. KMT_FH_RECORD_DETAILS_S IS STRUCT (
  6228.    BOOL        FILE_OPEN,
  6229.                NEW_RECORD,
  6230.                END_OF_FILE,
  6231.    WORD        TEXT_TYPE,                        @ 0 = EBCDIC                  @
  6232.                                                  @ 1 = IA5                     @
  6233.                                                  @ 2 = BINARY                  @
  6234.    INT         MAX_RECORD_LENGTH,
  6235.                RECORD_LENGTH,
  6236.    (4098) BYTE RECORD);                          @ Maximum record size of 4096 @
  6237.                                                  @ plus 2 bytes for CRLF pair  @
  6238.                                                  @ when constructing output    @
  6239.                                                  @ records                     @
  6240.  
  6241. MODE
  6242. KMT_FH_FILE_STATISTICS_S IS STRUCT (
  6243.    INT INPUT_TOTAL,
  6244.    INT OUTPUT_TOTAL);
  6245.  
  6246. MODE
  6247. KMT_PP_CONFG_PARAMS_S IS STRUCT (
  6248.    BYTE   MARK,
  6249.           MAXL,
  6250.           TIME,
  6251.           NPAD,
  6252.           PADC,
  6253.           EOL,
  6254.           QCTL,
  6255.           QBIN,
  6256.           CHKT,
  6257.           REPT,
  6258.    4-BYTE CAPAS);
  6259.  
  6260. MODE
  6261. KMT_PP_PACKET_STATISTICS_S IS STRUCT (
  6262.    INT INPUT_TOTAL,
  6263.        OUTPUT_TOTAL);
  6264.  
  6265. MODE
  6266. KMT_TRACE_FLAGS_S IS WORD STRUCT (
  6267.    BIT    PH_TRACING,
  6268.           PP_TRACING,
  6269.           FH_TRACING,
  6270.           DH_TRACING,
  6271.    28-BIT SPARE);
  6272.  
  6273. MODE
  6274. KMT_MTM_VALUES IS ANY (
  6275.    LONG WORD          LW_VALUE,
  6276.    LONG INT           LI_VALUE,
  6277.    REF WORD           RW_VALUE,
  6278.    REF INT            RI_VALUE,
  6279.    REF LONG WORD      RLW_VALUE,
  6280.    REF LONG INT       RLI_VALUE,
  6281.    REF () BYTE        RVB_VALUE,
  6282.    REF () REF () BYTE RVRVB_VALUE);
  6283.  
  6284. MODE
  6285. KMT_BUFFER IS (96) BYTE;
  6286.  
  6287. MODE
  6288. KMT_STRING IS REF () BYTE;
  6289.  
  6290. MODE
  6291. KMT_WORD IS REF () BYTE;
  6292.  
  6293. ***PAGE
  6294.  
  6295. @******************************************************************************@
  6296. @*                                                                            *@
  6297. @* External procedure references                                              *@
  6298. @*                                                                            *@
  6299. @******************************************************************************@
  6300.  
  6301. EXT (<PREFIX "ICLCTM">)
  6302. PROC
  6303.    (RESPONSE                                     @ RESPONSE                    @
  6304.    )                                   CTM_JS_BEGIN;
  6305.  
  6306. EXT (<PREFIX "ICLCTM">)
  6307. PROC
  6308.    (RESPONSE                                     @ RESPONSE                    @
  6309.    )                                   CTM_JS_END;
  6310.  
  6311. EXT (<PREFIX "ICLCTM">)
  6312. PROC
  6313.    (REF () BYTE,                                 @ PROMPT                      @
  6314.     REF () BYTE,                                 @ MESSAGE                     @
  6315.     REF LONG INT,                                @ LENGTH_MESSAGE              @
  6316.     RESPONSE                                     @ RESPONSE                    @
  6317.    )                                   ASK_MESSAGE;
  6318.  
  6319. EXT (<PREFIX "ICLCTM">)
  6320. PROC
  6321.    (WORD,                                        @ TYPE                        @
  6322.     WORD,                                        @ DESTINATION                 @
  6323.     REF () BYTE,                                 @ MESSAGE                     @
  6324.     RESPONSE                                     @ RESPONSE                    @
  6325.    )                                   CTM_LOG;
  6326.  
  6327. EXT (<PREFIX "ICLMACROS">)
  6328. PROC
  6329.    (REF () REF () BYTE,                          @ NAMES                       @
  6330.     REF () BYTE,                                 @ JOURNAL_LIST                @
  6331.     RESPONSE                                     @ RESPONSE                    @
  6332.    )                                   SET_OPTIONS;
  6333.  
  6334. EXT
  6335. PROC
  6336.    (INT,                                         @ TEXT_NUMBER                 @
  6337.     REF () KMT_MTM_VALUES                        @ PARAMS                      @
  6338.    ) INT                               KMT_SP_MTM;
  6339.  
  6340. ***PAGE
  6341.  
  6342. @******************************************************************************@
  6343. @*                                                                            *@
  6344. @* External data references                                                   *@
  6345. @*                                                                            *@
  6346. @******************************************************************************@
  6347.  
  6348. @ Constants: @
  6349. @ ********** @
  6350.  
  6351. EXT
  6352. INT UNSET;
  6353.  
  6354. EXT
  6355. INT VME_TERM, @ 0 @                             @forms of name standardisation @
  6356.     VME_STD,  @ 1 @
  6357.     KMT_STD;  @ 2 @
  6358.  
  6359. ***LINES(4)
  6360.  
  6361. @ Variables: @
  6362. @ ********** @
  6363.  
  6364. EXT (<CASCADE>)
  6365. REF BOOL TRANSLATE_FILENAME;
  6366.  
  6367. EXT REF INT EXIT_STATE,
  6368.             FILE_OPTION,
  6369.             MAXTRY,
  6370.             RETRY_COUNT,
  6371.             RETRY_TOTAL,
  6372.             TIMEOUT_TOTAL;
  6373.  
  6374. EXT REF WORD DELAY;
  6375.  
  6376. EXT REF BOOL ASG_ROUTE,
  6377.              DELAY_TIMER,
  6378.              SAVE_INCOMPLETE_FILE;
  6379.  
  6380. EXT (<CASCADE>)
  6381. REF KMT_DH_DEVICE_DETAILS_S KMT_DH_DEVICE_DETAILS;
  6382.  
  6383. EXT (<CASCADE>)
  6384. REF KMT_FH_RECORD_DETAILS_S KMT_FH_RECORD_DETAILS;
  6385.  
  6386. EXT (<CASCADE>)
  6387. REF KMT_FH_FILE_STATISTICS_S KMT_FH_FILE_STATISTICS;
  6388.  
  6389. EXT (<CASCADE>)
  6390. REF KMT_PP_CONFG_PARAMS_S KMT_PP_LOCAL_CONFG_PARAMS;
  6391.  
  6392. EXT (<CASCADE>)
  6393. REF KMT_PP_CONFG_PARAMS_S KMT_PP_REMOTE_CONFG_PARAMS;
  6394.  
  6395. EXT (<CASCADE>)
  6396. REF KMT_PP_PACKET_STATISTICS_S KMT_PP_PACKET_STATISTICS;
  6397.  
  6398. EXT (<CASCADE>)
  6399. REF KMT_TRACE_FLAGS_S KMT_TRACE_FLAGS;
  6400.  
  6401. ***LINES(4)
  6402.  
  6403. @ Results: @
  6404. @ ******** @
  6405.  
  6406. ***PAGE
  6407.  
  6408. @******************************************************************************@
  6409. @*                                                                            *@
  6410. @* Procedure declarations                                                     *@
  6411. @*                                                                            *@
  6412. @******************************************************************************@
  6413.  
  6414. GLOBAL
  6415. STATIC (<STATUS 5>)
  6416. PROC
  6417.    KMT_SP_SET_DEFAULTS IS ():
  6418.  
  6419. @******************************************************************************@
  6420. @*                                                                            *@
  6421. @* This procedure is used to set default values for certain global variables. *@
  6422. @*                                                                            *@
  6423. @******************************************************************************@
  6424.  
  6425. BEGIN
  6426.    EXIT_STATE := UNSET;
  6427.    FILE_OPTION := 1;                            @ create mode                  @
  6428.    DELAY := 30;
  6429.    DELAY_TIMER := FALSE;
  6430.    SAVE_INCOMPLETE_FILE := FALSE;
  6431.    TRANSLATE_FILENAME := TRUE;
  6432.    MAXTRY := 5;
  6433.    RETRY_COUNT := 0;
  6434.    RETRY_TOTAL := 0;
  6435.    TIMEOUT_TOTAL := 0;
  6436.  
  6437.    KMT_TRACE_FLAGS := 0;                         @ No tracing                  @
  6438.  
  6439.    KMT_DH_DEVICE_DETAILS.FILE_OPEN := FALSE;     @ No file open initially      @
  6440.    KMT_DH_DEVICE_DETAILS.INPUT_PARITY := 4;      @ No parity                   @
  6441.    KMT_DH_DEVICE_DETAILS.OUTPUT_PARITY := 4;     @ NO parity                   @
  6442.    KMT_DH_DEVICE_DETAILS.PAUSE := 0;             @ NO pause                    @
  6443.  
  6444.    KMT_FH_RECORD_DETAILS.FILE_OPEN := FALSE;     @ No file open initially      @
  6445.    KMT_FH_RECORD_DETAILS.TEXT_TYPE := 0;         @ EBCDIC text                 @
  6446.  
  6447.    KMT_FH_FILE_STATISTICS := (0,0);              @ Zero record transfers       @
  6448.  
  6449.    KMT_PP_LOCAL_CONFG_PARAMS := (X"1E",          @ MARK  - Record Seperator    @
  6450.                                  80,             @ MAXL                        @
  6451.                                  0,              @ TIME  - No timeout          @
  6452.                                  0,              @ NPAD  - No padding          @
  6453.                                  X"00",          @ PADC  - Null                @
  6454.                                  X"0D",          @ EOL   - Carriage Return     @
  6455.                                  X"23",          @ QCTL  - Hash #              @
  6456.                                  X"26",          @ QBIN  - Ampersand &         @
  6457.                                  X"31",          @ CHKT  - Single check sum    @
  6458.                                  X"00",          @ REPT  - Not supported       @
  6459.                                  X'00');         @ CAPAS - Not supported       @
  6460.  
  6461.    KMT_PP_REMOTE_CONFG_PARAMS := (X"1E",         @ MARK  - Record Seperator    @
  6462.                                   80,            @ MAXL                        @
  6463.                                   0,             @ TIME  - No timeout          @
  6464.                                   0,             @ NPAD  - No padding          @
  6465.                                   X"00",         @ PADC  - Null                @
  6466.                                   X"0D",         @ EOL   - Carriage Return     @
  6467.                                   X"23",         @ QCTL  - Hash #              @
  6468.                                   X"26",         @ QBIN  - Ampersand &         @
  6469.                                   X"31",         @ CHKT  - Single check sum    @
  6470.                                   X"00",         @ REPT  - Not supported       @
  6471.                                   X'00');        @ CAPAS - Not supported       @
  6472.  
  6473.    KMT_PP_PACKET_STATISTICS := (0,0);            @ Zero packet transfers       @
  6474.  
  6475. END;                                   @ KMT_SP_SET_DEFAULTS                   @
  6476.  
  6477. ***PAGE
  6478.  
  6479. GLOBAL
  6480. STATIC (<STATUS 5>)
  6481. PROC
  6482.    KMT_SP_CHAR_TO_HEX IS (
  6483.    REF () BYTE HEX_DIGITS,
  6484.    REF () BYTE HEX_STRING,
  6485.    REF INT     HEX_STRING_LENGTH,
  6486.    RESPONSE    RESULT):
  6487.  
  6488. @******************************************************************************@
  6489. @*                                                                            *@
  6490. @* This procedure is used to convert a string representing hexadecimal digits *@
  6491. @* from character to the hexadecimal notation.                                *@
  6492. @* The area referenced by HEX_DIGITS contains the string representing the     *@
  6493. @* hexadecimal digits and HEX_STRING references an area to contain the        *@
  6494. @* hexadecimal string.                                                        *@
  6495. @* The number of hexadecimal characters returned in HEX_STRING is returned    *@
  6496. @* in the area referenced by HEX_STRING_LENGTH.                               *@
  6497. @* If a non hexadecimal digit is detected then HEX_STRING_LENGTH is returned  *@
  6498. @* zero and resultcode KMT_SP_NOT_HEX is returned.                            *@
  6499. @* If the area referenced by HEX_STRING is not large enough to contain the    *@
  6500. @* hexadecimal string then HEX_STRING_LENGTH is returned containing the size  *@
  6501. @* required and resultcode KMT_SP_STRING_TOO_BIG is returned                  *@
  6502. @*                                                                            *@
  6503. @******************************************************************************@
  6504.  
  6505.  
  6506. BEGIN
  6507.  
  6508. ***PAGE
  6509.  
  6510. SIM
  6511. PROC
  6512.    KMT_SP_HEX IS (
  6513.    2-BYTE HEX_DIGITS) BYTE:
  6514.  
  6515. @******************************************************************************@
  6516. @*                                                                            *@
  6517. @* This procedure is used to return a hexadecimal string from the two byte    *@
  6518. @* hexadecimal representation supplied in HEX_STRING.                         *@
  6519. @*                                                                            *@
  6520. @******************************************************************************@
  6521.  
  6522. BEGIN
  6523.    (2) BYTE HEX_DIGITS_COPY := HEX_DIGITS;
  6524.  
  6525.    FOR I
  6526.    TO  1
  6527.    DO
  6528.       REF BYTE HEX_DIGIT IS HEX_DIGITS_COPY (I);
  6529.  
  6530.       IF
  6531.          (HEX_DIGIT GE "A")  AND  (HEX_DIGIT LE "F")
  6532.  
  6533.       THEN                                       @ In range "A" to "F"         @
  6534.          HEX_DIGIT := HEX_DIGIT + X"09"
  6535.       FI;
  6536.  
  6537.       HEX_DIGIT := HEX_DIGIT & X"0F";            @ In range X"00" to X"0F"     @
  6538.    REPEAT;
  6539.  
  6540.    (W'PACKS (0,
  6541.              HEX_DIGITS_COPY,
  6542.              0,
  6543.              NIL)) SCALE -4
  6544. END;                                   @ KMT_SP_HEX                            @
  6545.  
  6546. ***PAGE
  6547.  
  6548.    INT KMT_SP_NOT_HEX        IS 80050,
  6549.        KMT_SP_STRING_TOO_BIG IS 80051;
  6550.  
  6551.    INT HEX_DIGITS_LENGTH IS LENGTH HEX_DIGITS;
  6552.  
  6553.    RESULT := UNLESS
  6554.                (
  6555.                 () BYTE NON_HEX_BIT_MAP IS (X"FFFFFFFF FFFFFFFF"
  6556.                                             X"FFFFFFFF FFFFFFFF"
  6557.                                             X"81FFFFFF FFFFFFFF"
  6558.                                             X"81FFFFFF FFFF003F");
  6559.                                                  @ Allow lower and upper case  @
  6560.  
  6561.                 CHECK (NON_HEX_BIT_MAP,
  6562.                        HEX_DIGITS,
  6563.                        0,
  6564.                        NIL)
  6565.                )
  6566.              THEN                                @ Non hex digit in string     @
  6567.                 HEX_STRING_LENGTH := 0;
  6568.                 KMT_SP_NOT_HEX
  6569.              ELSF
  6570.                (
  6571.                 HEX_STRING_LENGTH := (HEX_DIGITS_LENGTH + 1) / 2;
  6572.                 HEX_STRING_LENGTH GT LENGTH HEX_STRING
  6573.                )
  6574.              THEN                                @ Return string too small     @
  6575.                 KMT_SP_STRING_TOO_BIG
  6576.              ELSE                                @ Convert to hex              @
  6577.                 INT HEX_DIGITS_INDEX := IF
  6578.                                            ((WORD:HEX_DIGITS_LENGTH) & 1) EQ 1
  6579.                                         THEN     @ Odd number of hex digits    @
  6580.                                            HEX_STRING(0) := KMT_SP_HEX (
  6581.                                                                HEX_DIGITS(0));
  6582.                                            1
  6583.                                         ELSE
  6584.                                            0
  6585.                                         FI;
  6586.  
  6587.              FOR  I
  6588.              FROM HEX_DIGITS_INDEX
  6589.              UNTIL
  6590.                 HEX_DIGITS_INDEX GE HEX_DIGITS_LENGTH
  6591.              DO
  6592.                 HEX_STRING (I) := KMT_SP_HEX (HEX_DIGITS(HEX_DIGITS_INDEX
  6593.                                                          SIZE 2));
  6594.                 HEX_DIGITS_INDEX := HEX_DIGITS_INDEX + 2
  6595.              REPEAT;
  6596.  
  6597.              0
  6598.    FI
  6599. END;                                   @ KMT_SP_CHAR_TO_HEX                    @
  6600.  
  6601. ***PAGE
  6602.  
  6603. GLOBAL
  6604. STATIC (<STATUS 5>)
  6605. PROC
  6606.    KMT_SP_CONVERT_TO_BINARY IS (REF KMT_WORD W) WORD:
  6607.  
  6608.    @ Converts Kermit word or string to a binary number @
  6609.  
  6610.    IF W REF NIL
  6611.    THEN @ not given @
  6612.       -1
  6613.    ELSF
  6614.       (() BYTE BIT_MAP IS X"FFFFFFFF FFFFFFFF"
  6615.                           X"FFFFFFFF FFFFFFFF"
  6616.                           X"FFFFFFFF FFFFFFFF"
  6617.                           X"FFFFFFFF FFFF003F";
  6618.  
  6619.       CHECK(BIT_MAP,W,0,NIL)
  6620.      )
  6621.    THEN @ numeric @
  6622.       I'PACKS(0,W,0,NIL)
  6623.    ELSF
  6624.       LENGTH W < 2 OR W(0) NE "X"
  6625.    THEN @ not hex - invalid @
  6626.       -1
  6627.    ELSE
  6628.       (4) BYTE HEX;
  6629.       INT HEX_LEN,RESULT;
  6630.  
  6631.       KMT_SP_CHAR_TO_HEX(W(1::),HEX,HEX_LEN,RESULT);
  6632.  
  6633.       IF RESULT NE 0 OR HEX_LEN < 1
  6634.       THEN @ invalid hex digits @
  6635.          -1
  6636.       ELSE @ VALID HEX NUMBER @
  6637.          HEX(SIZE HEX_LEN)
  6638.       FI
  6639.    FI
  6640.  
  6641.    ;  @ KMT_SP_CONVERT_TO_BINARY @
  6642.  
  6643. ***PAGE
  6644.  
  6645. GLOBAL
  6646. STATIC (<STATUS 5>)
  6647. PROC
  6648.    KMT_SP_CONVERT_TO_UPPER_CASE IS (
  6649.    REF () BYTE BUFFER):
  6650.  
  6651. @******************************************************************************@
  6652. @*                                                                            *@
  6653. @* This procedure is used to convert lowercase EBCDIC alphabetic characters   *@
  6654. @* to uppercase EBCDIC.                                                       *@
  6655. @* The characters to be case converted are read from and the case converted   *@
  6656. @* characters are written to the area referenced by BUFFER.                   *@
  6657. @*                                                                            *@
  6658. @******************************************************************************@
  6659.  
  6660. UNLESS (BUFFER IS NIL) OR (LENGTH BUFFER EQ 0)
  6661. DO
  6662.    (256) BYTE UPPER_CASE_TT IS X"00010203 04050607 08090A0B 0C0D0E0F"
  6663.                                X"10111213 14151617 18191A1B 1C1D1E1F"
  6664.                                X"20212223 24252627 28292A2B 2C2D2E2F"
  6665.                                X"30313233 34353637 38393A3B 3C3D3E3F"
  6666.                                X"40414243 44454647 48494A4B 4C4D4E4F"
  6667.                                X"50515253 54555657 58595A5B 5C5D5E5F"
  6668.                                X"60616263 64656667 68696A6B 6C6D6E6F"
  6669.                                X"70717273 74757677 78797A7B 7C7D7E7F"
  6670.                                X"80C1C2C3 C4C5C6C7 C8C98A8B 8C8D8E8F"
  6671.                                X"90D1D2D3 D4D5D6D7 D8D99A9B 9C9D9E9F"
  6672.                                X"A0A1E2E3 E4E5E6E7 E8E9AAAB ACADAEAF"
  6673.                                X"B0B1B2B3 B4B5B6B7 B8B9BABB BCBDBEBF"
  6674.                                X"C0C1C2C3 C4C5C6C7 C8C9CACB CCCDCECF"
  6675.                                X"D0D1D2D3 D4D5D6D7 D8D9DADB DCDDDEDF"
  6676.                                X"E0E1E2E3 E4E5E6E7 E8E9EAEB ECEDEEEF"
  6677.                                X"F0F1F2F3 F4F5F6F7 F8F9FAFB FCFDFEFF";
  6678.  
  6679.    TRANSLATE (UPPER_CASE_TT,BUFFER,0,NIL);
  6680. FI
  6681.  
  6682. ;                                      @ KMT_SP_CONVERT_TO_UPPERCASE           @
  6683.  
  6684. ***PAGE
  6685.  
  6686. GLOBAL
  6687. STATIC (<STATUS 5>)
  6688. PROC
  6689.    KMT_SP_ASK_MESSAGE IS (
  6690.    REF () BYTE  PROMPT,
  6691.    REF () BYTE  MESSAGE,
  6692.    REF LONG INT LENGTH_MESSAGE,
  6693.    BOOL         LOG_PROMPT,
  6694.    RESPONSE     RESULT):
  6695.  
  6696. @******************************************************************************@
  6697. @*                                                                            *@
  6698. @* This procedure is used to output a prompt to the users terminal and read a *@
  6699. @* reply to the prompt. Logging of the prompt and reply to the journal is     *@
  6700. @* turned off.                                                                *@
  6701. @*                                                                            *@
  6702. @******************************************************************************@
  6703.  
  6704. BEGIN
  6705.    INT RC_DISCARDED;
  6706.  
  6707.    CTM_JS_BEGIN (RESULT);
  6708.    IF RESULT LE 0
  6709.    THEN                                          @ Resource block created      @
  6710.       UNLESS LOG_PROMPT
  6711.       DO
  6712.          () BYTE NAME := "NOLASKS";
  6713.          () REF () BYTE NAMES := DISPLAY(NAME);
  6714.          (0) BYTE ZLR;
  6715.          SET_OPTIONS (NAMES,ZLR,RC_DISCARDED)
  6716.       FI;
  6717.       ASK_MESSAGE (PROMPT,MESSAGE,LENGTH_MESSAGE,RESULT);
  6718.       CTM_JS_END (RC_DISCARDED)                  @ End resource block          @
  6719.    FI
  6720. END;                                   @ KMT_SP_ASK_MESSAGE                    @
  6721.  
  6722. ***PAGE
  6723.  
  6724. GLOBAL
  6725. STATIC (<STATUS 5>)
  6726. PROC
  6727.    KMT_SP_LOG_TRACE_MESSAGE IS (
  6728.    INT                    TYPE,
  6729.    REF () KMT_MTM_VALUES PARAMS):
  6730.  
  6731. @******************************************************************************@
  6732. @*                                                                            *@
  6733. @* This procedure is used to log a trace message (printed in hex) to the job  *@
  6734. @* journal.                                                                   *@
  6735. @* TYPE specifies the type of trace message and PARAMS references a list of   *@
  6736. @* parameters to be used in the expansion of the message.                     *@
  6737. @*                                                                            *@
  6738. @******************************************************************************@
  6739.  
  6740. BEGIN
  6741.    INT PARAMS_LENGTH IS IF
  6742.                            PARAMS IS NIL
  6743.                         THEN
  6744.                            0
  6745.                         ELSE
  6746.                            LENGTH PARAMS
  6747.                         FI;
  6748.  
  6749.    INT MTM_AREA_LENGTH IS 4 + PARAMS_LENGTH;
  6750.  
  6751.    (MTM_AREA_LENGTH) KMT_MTM_VALUES MTM_AREA;
  6752.  
  6753.    INT MTM_TEXT_NUMBER := TYPE,
  6754.        MTM_REPLY,
  6755.        MTM_MESSAGE_LENGTH;
  6756.  
  6757.    (100) BYTE MTM_MESSAGE;
  6758.  
  6759.    (2) REF () BYTE MTM_RECALL_DATA;
  6760.  
  6761.    MTM_AREA(SIZE 4) := (MTM_MESSAGE
  6762.                         AS KMT_MTM_VALUES.RVB_VALUE,
  6763.                         MTM_MESSAGE_LENGTH
  6764.                         AS KMT_MTM_VALUES.RI_VALUE,
  6765.                         MTM_RECALL_DATA
  6766.                         AS KMT_MTM_VALUES.RVRVB_VALUE,
  6767.                         (L'PARAMS_LENGTH)
  6768.                         AS KMT_MTM_VALUES.LI_VALUE);
  6769.  
  6770.    IF
  6771.       PARAMS_LENGTH GT 0
  6772.  
  6773.    THEN
  6774.       MTM_AREA(4::) := PARAMS
  6775.    FI;
  6776.  
  6777.    WHILE
  6778.      (
  6779.       INT RC_DISCARDED;
  6780.  
  6781.       MTM_REPLY := KMT_SP_MTM (MTM_TEXT_NUMBER,MTM_AREA);
  6782.  
  6783.       IF
  6784.          MTM_REPLY NE -2
  6785.  
  6786.       THEN                             @ Expanded message returned             @
  6787.          REF () BYTE MESSAGE IS IF
  6788.                                    MTM_REPLY EQ -3
  6789.                                 THEN   @ Returned in recall data               @
  6790.                                    MTM_TEXT_NUMBER := 0;
  6791.                                    MTM_RECALL_DATA(0)
  6792.                                 ELSE   @  Returned in message buffer           @
  6793.                                    MTM_TEXT_NUMBER := MTM_REPLY;
  6794.                                    MTM_MESSAGE(SIZE MTM_MESSAGE_LENGTH)
  6795.                                 FI;
  6796.  
  6797.          CTM_LOG (3,
  6798.                   2,                   @ Log to journal only                   @
  6799.                   MESSAGE,
  6800.                   RC_DISCARDED)
  6801.  
  6802.       ELSE                                       @ No message data             @
  6803.          MTM_TEXT_NUMBER := 0
  6804.       FI;
  6805.  
  6806.       MTM_TEXT_NUMBER NE 0
  6807.      )
  6808.    DO
  6809.       SKIP
  6810.    REPEAT
  6811. END;                                   @ KMT_SP_LOG_TRACE_MESSAGE              @
  6812.  
  6813. ***PAGE
  6814.  
  6815. GLOBAL
  6816. STATIC (<STATUS 5>)
  6817. PROC
  6818.    KMT_SP_STANDARDISE_FILENAME IS (REF KMT_WORD FILENAME,
  6819.                                    INT STD_FORM):
  6820.  
  6821.    @ standardises filenames (if reqd) according to STD_FORM:                   @
  6822.    @                                                                           @
  6823.    @    VME_TERM - terminal name of filename, i.e. part after rightmost dot    @
  6824.    @    VME_STD  - remove suffix from filename which should be in Kermit       @
  6825.    @               normal form as sent in packet by remote Kermit              @
  6826.    @    KMT_STD  - convert filename to Kermit normal form, i.e. name.type      @
  6827.    @                                                                           @
  6828.    @ in each case any file generation number will be removed and all lower     @
  6829.    @ case alphabetic characters converted to upper case. any non-alphanumeric  @
  6830.    @ characters (except fullstop) will be converted to X                       @
  6831.  
  6832.    BEGIN
  6833.  
  6834.       IF TRANSLATE_FILENAME
  6835.       THEN @ filename translation required @
  6836.          REF () BYTE NAME,REM;
  6837.          NAME := FILENAME;
  6838.          REM := FILENAME;
  6839.  
  6840.          UNTIL SCANUNQ(".",REM,0,REM)                     @ locate fullstop    @
  6841.          DO
  6842.             INT NAME_LEN IS LENGTH NAME,
  6843.                 REM_LEN  IS LENGTH REM;
  6844.  
  6845.             REM :=  IF REM_LEN > 1
  6846.                     THEN REM(1::)                         @ strip off fullstop @
  6847.                     ELSE REM(SIZE 0)                      @ "." last character @
  6848.                     FI;
  6849.  
  6850.             NAME := IF NOT SCANUNQ(".",REM,0,NIL)         @ if more fullstops  @
  6851.                     THEN REM                              @ continue           @
  6852.                     ELSF STD_FORM = VME_TERM
  6853.                     THEN REM                              @ bit after fullstop @
  6854.                     ELSF STD_FORM = VME_STD
  6855.                     THEN NAME(SIZE(NAME_LEN-REM_LEN))     @ bit before fullstop@
  6856.                     ELSE NAME     @ KMT_STD @             @ i.e. name.type     @
  6857.                     FI
  6858.          REPEAT;
  6859.  
  6860.          SCANUNQ("(",NAME,0,REM);      @ locate generation number (if present) @
  6861.          FILENAME := NAME(SIZE (LENGTH NAME - LENGTH REM));    @ remove gen no @
  6862.  
  6863.          IF LENGTH FILENAME > 0
  6864.          THEN                                         @ standardise characters @
  6865.             (256) BYTE STD_CHAR_TT IS X"E7E7E7E7 E7E7E7E7 E7E7E7E7 E7E7E7E7"
  6866.                                       X"E7E7E7E7 E7E7E7E7 E7E7E7E7 E7E7E7E7"
  6867.                                       X"E7E7E7E7 E7E7E7E7 E7E7E7E7 E7E7E7E7"
  6868.                                       X"E7E7E7E7 E7E7E7E7 E7E7E7E7 E7E7E7E7"
  6869.                                       X"E7E7E7E7 E7E7E7E7 E7E7E74B E7E7E7E7"
  6870.                                       X"E7E7E7E7 E7E7E7E7 E7E7E7E7 E7E7E7E7"
  6871.                                       X"E7E7E7E7 E7E7E7E7 E7E7E7E7 E7E7E7E7"
  6872.                                       X"E7E7E7E7 E7E7E7E7 E7E7E7E7 E7E7E7E7"
  6873.                                       X"E7C1C2C3 C4C5C6C7 C8C9E7E7 E7E7E7E7"
  6874.                                       X"E7D1D2D3 D4D5D6D7 D8D9E7E7 E7E7E7E7"
  6875.                                       X"E7E7E2E3 E4E5E6E7 E8E9E7E7 E7E7E7E7"
  6876.                                       X"E7E7E7E7 E7E7E7E7 E7E7E7E7 E7E7E7E7"
  6877.                                       X"E7C1C2C3 C4C5C6C7 C8C9E7E7 E7E7E7E7"
  6878.                                       X"E7D1D2D3 D4D5D6D7 D8D9E7E7 E7E7E7E7"
  6879.                                       X"E7E7E2E3 E4E5E6E7 E8E9E7E7 E7E7E7E7"
  6880.                                       X"F0F1F2F3 F4F5F6F7 F8F9E7E7 E7E7E7E7";
  6881.  
  6882.             TRANSLATE(STD_CHAR_TT,FILENAME,0,NIL)
  6883.          ELSE                                                   @ invalid name @
  6884.             FILENAME := NIL
  6885.          FI
  6886.       FI
  6887.    END
  6888.  
  6889.    ; @ KMT_SP_STANDARDISE_FILENAME @
  6890.  
  6891. ***PAGE
  6892.  
  6893. GLOBAL
  6894. STATIC (<STATUS 5>)
  6895. PROC
  6896.    KMT_SP_GET_WORD IS (REF KMT_STRING S) KMT_WORD:
  6897.  
  6898.    @ extract word (delimited by spaces) from string, advance pointer over word @
  6899.  
  6900.    BEGIN
  6901.       KMT_STRING S1,S2;
  6902.       IF SCANEQ(" ",S,0,S1)                    @ skip leading spaces           @
  6903.       THEN NIL                                 @ end of line, return null word @
  6904.       ELSE
  6905.          SCANUNQ(" ",S1,0,S2);                 @ find next space (end of word) @
  6906.          S := S2;                              @ advance pointer               @
  6907.          S1(SIZE LENGTH S1 - LENGTH S2)        @ return word                   @
  6908.       FI
  6909.    END
  6910.  
  6911.    ; @ KMT_SP_GET_WORD @
  6912.  
  6913. ***PAGE
  6914.  
  6915. GLOBAL
  6916. STATIC (<STATUS 5>)
  6917. PROC
  6918.    KMT_SP_CHECK_VME_CHAR IS (WORD CHAR,WORD IO_FLAG,RESPONSE RESULT):
  6919.  
  6920.    @ check that CHAR is acceptable for VME I/O                                 @
  6921.  
  6922.    BEGIN
  6923.       IF CHAR = 127                                                @ ASCII DEL @
  6924.       THEN
  6925.          RESULT := 0
  6926.       ELSE
  6927.          ()BYTE X := DISPLAY (CHAR);
  6928.          REF () BYTE B := X;
  6929.          () BYTE CHECK_BITS IS
  6930.             IF ASG_ROUTE AND IO_FLAG = 0 THEN X"FFFF0FFF" @ in via ASG         @
  6931.             ELSF ASG_ROUTE               THEN X"A7DFFFFF" @ out via ASG        @
  6932.             ELSF IO_FLAG = 0             THEN X"0183087F" @ in via CSC or NIC  @
  6933.             ELSE                              X"A7DFFFFF" @ out via CSC or NIC @
  6934.             FI;
  6935.          RESULT := IF CHECK(CHECK_BITS,B,1,NIL) THEN 85936 ELSE 0 FI
  6936.       FI
  6937.    END
  6938.  
  6939.  ; @ KMT_SP_CHECK_VME_CHAR @
  6940.  
  6941. ENDMODULE                              @ KMT_SP_MODULE                         @
  6942.  
  6943. $$$$ KMT_UI_MODULE
  6944. MODULE KMT_UI_MODULE;
  6945.  
  6946.  
  6947. @ Mode declarations @
  6948.  
  6949. MODE KMT_BUFFER IS (96)BYTE;
  6950. MODE KMT_STRING IS REF()BYTE;
  6951. MODE KMT_WORD   IS REF()BYTE;
  6952.  
  6953. MODE KMT_MTM_VALUES IS ANY
  6954.   (LONG WORD      LW_VALUE,
  6955.    LONG INT       LI_VALUE,
  6956.    REF WORD       RW_VALUE,
  6957.    REF INT        RI_VALUE,
  6958.    REF LONG WORD  RLW_VALUE,
  6959.    REF LONG INT   RLI_VALUE,
  6960.    REF()BYTE      RVB_VALUE,
  6961.    REF()REF()BYTE RVRVB_VALUE);
  6962.  
  6963. MODE
  6964. KMT_DH_DEVICE_DETAILS_S IS STRUCT
  6965.   (BOOL FILE_OPEN,
  6966.    WORD MAX_INPUT_LENGTH,
  6967.         MAX_OUTPUT_LENGTH,
  6968.         INPUT_PARITY,
  6969.         OUTPUT_PARITY,
  6970.         PAUSE);
  6971.  
  6972. MODE
  6973. KMT_FH_RECORD_DETAILS_S IS STRUCT
  6974.   (BOOL        FILE_OPEN,
  6975.                NEW_RECORD,
  6976.                END_OF_FILE,
  6977.    WORD        TEXT_TYPE,                        @ 0 = EBCDIC                  @
  6978.                                                  @ 1 = IA5                     @
  6979.                                                  @ 2 = BINARY                  @
  6980.    INT         MAX_RECORD_LENGTH,
  6981.                RECORD_LENGTH,
  6982.    (4098) BYTE RECORD);                          @ Maximum record size of 4096 @
  6983.                                                  @ plus 2 bytes for CRLF pair  @
  6984.                                                  @ when constructing output    @
  6985.                                                  @ records                     @
  6986.  
  6987. MODE
  6988. KMT_PP_CONFG_PARAMS_S IS STRUCT
  6989.   (BYTE   MARK,
  6990.           MAXL,
  6991.           TIME,
  6992.           NPAD,
  6993.           PADC,
  6994.           EOL,
  6995.           QCTL,
  6996.           QBIN,
  6997.           CHKT,
  6998.           REPT,
  6999.    4-BYTE CAPAS);
  7000.  
  7001. MODE
  7002. KMT_TRACE_FLAGS_S IS WORD STRUCT
  7003.   (BIT    PH_TRACING,
  7004.           PP_TRACING,
  7005.           FH_TRACING,
  7006.           DH_TRACING,
  7007.    28-BIT SPARE);
  7008.  
  7009. MODE KMT_FH_FILE_STATISTICS_S IS STRUCT
  7010.   (INT INPUT_TOTAL,
  7011.    INT OUTPUT_TOTAL);
  7012.  
  7013. MODE KMT_PP_PACKET_STATISTICS_S IS STRUCT
  7014.   (INT INPUT_TOTAL,
  7015.    INT OUTPUT_TOTAL);
  7016.  
  7017. MODE KMT_STATISTICS_S IS STRUCT
  7018.   (REF KMT_FH_FILE_STATISTICS_S   FH_FILE_STATISTICS,
  7019.    REF KMT_PP_PACKET_STATISTICS_S PACKET_STATISTICS);
  7020.  
  7021.  
  7022. @ External procedures @
  7023.  
  7024. EXT PROC (INT,RESPONSE)                           KMT_MESSAGE;
  7025.  
  7026. EXT PROC (INT,REF()KMT_MTM_VALUES) INT            KMT_HELP_MTM;
  7027.  
  7028. EXT PROC (INT,REF()KMT_MTM_VALUES) INT            KMT_SP_MTM;
  7029.  
  7030. EXT PROC (REF KMT_STRING) KMT_WORD                KMT_SP_GET_WORD,
  7031.     PROC (REF () BYTE)                            KMT_SP_CONVERT_TO_UPPER_CASE,
  7032.     PROC (()BYTE,REF()BYTE,REF LONG INT,BOOL,RESPONSE)
  7033.                                                   KMT_SP_ASK_MESSAGE,
  7034.     PROC (REF KMT_WORD) WORD                      KMT_SP_CONVERT_TO_BINARY,
  7035.     PROC (WORD,WORD,RESPONSE)                     KMT_SP_CHECK_VME_CHAR;
  7036.  
  7037. EXT PROC (WORD,WORD,REF()BYTE,RESPONSE)           CTM_LOG;
  7038.  
  7039.  
  7040. @ External constants @
  7041.  
  7042. EXT INT UNSET,EXIT;                     @ miscellaneous constants @
  7043.  
  7044. EXT INT SERVER_MODE,RECEIVE_MODE,SEND_MODE,COMMAND_MODE;
  7045.  
  7046. EXT INT REC_SERVER_IDLE,REC_INIT,SEND_INIT,COMPLETE,ABORT; @ protocol handler  @
  7047.                                                            @ states            @
  7048.  
  7049. EXT REF INT EXIT_STATE,               @ controls main Kermit loop @
  7050.             KMT_CURRENT_MODE,         @ Server/Receive/Send/Command @
  7051.             KMT_PH_STATE;             @ Protocol Handler state @
  7052.  
  7053. EXT (256) BYTE
  7054.    EBCDIC_TO_ASCII,                         @ Translation tables @
  7055.    ASCII_TO_EBCDIC;
  7056.  
  7057. EXT REF KMT_STRING KMT_PH_INPUT_PACKET_DATA;
  7058.  
  7059. EXT REF KMT_BUFFER KMT_VME_FILE_BUF,KMT_REM_FILE_BUF,KMT_INPUT_BUF;
  7060. EXT REF KMT_WORD KMT_VME_FILE,KMT_REM_FILE;
  7061.  
  7062. EXT REF()KMT_MTM_VALUES KMT_MTM_AREA;
  7063.  
  7064. EXT REF INT MAXTRY,RETRY_COUNT,RETRY_TOTAL,TIMEOUT_TOTAL;
  7065.  
  7066. EXT REF INT FILE_OPTION;
  7067.  
  7068. EXT REF WORD DELAY;
  7069.  
  7070. EXT REF BOOL TRANSLATE_FILENAME;
  7071.  
  7072. EXT REF BOOL SAVE_INCOMPLETE_FILE;
  7073.  
  7074. EXT REF KMT_DH_DEVICE_DETAILS_S KMT_DH_DEVICE_DETAILS;
  7075.  
  7076. EXT REF KMT_FH_RECORD_DETAILS_S KMT_FH_RECORD_DETAILS;
  7077.  
  7078. EXT REF KMT_PP_CONFG_PARAMS_S KMT_PP_LOCAL_CONFG_PARAMS,
  7079.                               KMT_PP_REMOTE_CONFG_PARAMS;
  7080.  
  7081. EXT REF KMT_TRACE_FLAGS_S KMT_TRACE_FLAGS;
  7082.  
  7083. EXT REF KMT_STATISTICS_S KMT_STATISTICS;
  7084.  
  7085.  
  7086.  
  7087. GLOBAL STATIC (<STATUS 5>) PROC KMT_UI IS (RESPONSE RESULT):
  7088.  
  7089.    @ requests command from user and executes command @
  7090.  
  7091.    BEGIN
  7092.       LONG INT STRLEN;        @ length of input @
  7093.       INT RC_IGNORED;         @ response variable @
  7094.       KMT_STRING KMT_CMD_BUF, @ command input string @
  7095.                  KMT_PARSE;   @ pointer for parsing command string @
  7096.  
  7097.       (10)KMT_MTM_VALUES HELP_MTM_AREA;
  7098.       (80)BYTE HELP_TEXT;
  7099.       INT HELP_TEXT_LEN;
  7100.       (2)REF()BYTE HELP_RECALL_DATA;
  7101.  
  7102.       INT MARK_PARAM IS 0,
  7103.           EOL_PARAM  IS 1,
  7104.           PADC_PARAM IS 2;
  7105.  
  7106.       @ support procs @
  7107.  
  7108.       SIM PROC CHECK_AND_SET_PARAM IS (INT PARAM_CODE, WORD VALUE, WORD P_FLAG,
  7109.                                        RESPONSE RESULT):
  7110.  
  7111.          @ checks new value for MARK/EOL/PADC doesn't conflict with EOL/PADC/  @
  7112.          @ MARK (as appropriate) and that the value is acceptable to VME I/O   @
  7113.  
  7114.          BEGIN
  7115.             IF VALUE > 31 AND VALUE NE 127
  7116.             THEN @ not a control character @
  7117.                RESULT := 85935
  7118.             ELSE
  7119.                INT PMATCH;
  7120.                REF KMT_PP_CONFG_PARAMS_S
  7121.                   CONFG_PARAMS IS IF P_FLAG = 0
  7122.                                   THEN KMT_PP_REMOTE_CONFG_PARAMS    @ receive @
  7123.                                   ELSE KMT_PP_LOCAL_CONFG_PARAMS     @ send    @
  7124.                                   FI;
  7125.                RESULT := UNSET;
  7126.  
  7127.                IF VALUE = CONFG_PARAMS.MARK @ check if value matches any param @
  7128.                THEN PMATCH := MARK_PARAM
  7129.                ELSF VALUE = CONFG_PARAMS.EOL
  7130.                THEN PMATCH := EOL_PARAM
  7131.                ELSF VALUE = CONFG_PARAMS.PADC
  7132.                THEN PMATCH := PADC_PARAM
  7133.                ELSF KMT_SP_CHECK_VME_CHAR(VALUE,P_FLAG,RESULT);
  7134.                     RESULT = 0
  7135.                THEN                @ character ok for VME I/O so set parameter @
  7136.                   CASE PARAM_CODE
  7137.                   THEN CONFG_PARAMS.MARK := VALUE
  7138.                   ELSE CONFG_PARAMS.EOL := VALUE
  7139.                   ELSE CONFG_PARAMS.PADC := VALUE
  7140.                   ESAC;
  7141.                   RESULT := 0
  7142.                FI;
  7143.  
  7144.                IF RESULT = UNSET
  7145.                THEN
  7146.                   IF PMATCH = PARAM_CODE
  7147.                   THEN                         @ matched current value, ignore @
  7148.                      RESULT := 0
  7149.                   ELSE                       @ conflict with another parameter @
  7150.                      KMT_MTM_AREA(7) := PMATCH AS KMT_MTM_VALUES.RI_VALUE;
  7151.                      RESULT := 85937
  7152.                   FI
  7153.                FI
  7154.             FI
  7155.          END
  7156.  
  7157.          ; @ CHECK_AND_SET_PARAM @
  7158.  
  7159.  
  7160.       SIM PROC EXPAND_HELP IS (INT MSG_NO) INT:
  7161.  
  7162.          @ expand help text until reply is -2 (no message found) or 0 (halted  @
  7163.          @ at end of message) or > 0 (halt code returned). @
  7164.  
  7165.          BEGIN
  7166.             INT M := MSG_NO,
  7167.                 REPLY := UNSET; @ -1 @
  7168.  
  7169.             WHILE REPLY = UNSET
  7170.             DO
  7171.                REPLY := KMT_HELP_MTM(M,HELP_MTM_AREA);
  7172.                IF REPLY = -1 OR REPLY = 0
  7173.                THEN
  7174.                   M := REPLY;
  7175.                   CTM_LOG(3,10,HELP_TEXT(SIZE HELP_TEXT_LEN),RC_IGNORED)
  7176.                FI
  7177.             REPEAT;
  7178.  
  7179.             REPLY @ return last reply @
  7180.  
  7181.          END
  7182.  
  7183.          ; @ EXPAND_HELP @
  7184.  
  7185.       @ procedures for executing commands @
  7186.  
  7187.       SIM PROC KMT_UI_SERVER IS GROUP KMT_UI_EXEC(RESPONSE RESULT):
  7188.  
  7189.          @ SERVER command, Syntax: SERVER @
  7190.  
  7191.          @ selects Kermit Server mode @
  7192.          @ (not implemented in Server mode) @
  7193.  
  7194.             IF KMT_CURRENT_MODE NE SERVER_MODE
  7195.             THEN
  7196.                KMT_CURRENT_MODE := SERVER_MODE;
  7197.                KMT_PH_STATE := REC_SERVER_IDLE;
  7198.                RETRY_COUNT := RETRY_TOTAL := TIMEOUT_TOTAL := 0;
  7199.                VAL KMT_STATISTICS.PACKET_STATISTICS := (0,0);
  7200.                RESULT := 0
  7201.             ELSE
  7202.                RESULT := 89021 @ not implemented in Server mode @
  7203.             FI
  7204.  
  7205.          ; @ KMT_UI_SERVER @
  7206.  
  7207.  
  7208.       SIM PROC KMT_UI_RECEIVE IS GROUP KMT_UI_EXEC(RESPONSE RESULT):
  7209.  
  7210.          @ RECEIVE command, Syntax: RECEIVE [VME-filename] @
  7211.  
  7212.          @ prepares VME kermit for the arrival of a file which will be @
  7213.          @ saved with VME filename if specified, or with the filename sent @
  7214.          @ by the remote Kermit @
  7215.          @ (not implemented in Server mode) @
  7216.  
  7217.             IF KMT_CURRENT_MODE NE SERVER_MODE
  7218.             THEN
  7219.                @ check for optional filename @
  7220.                KMT_VME_FILE := KMT_SP_GET_WORD(KMT_PARSE);
  7221.                @ if present, copy to filename buffer @
  7222.                UNLESS KMT_VME_FILE REF NIL
  7223.                DO
  7224.                   KMT_VME_FILE :=
  7225.                      KMT_VME_FILE_BUF(SIZE LENGTH KMT_VME_FILE) :=
  7226.                         KMT_VME_FILE
  7227.                FI;
  7228.                @ set Receive mode and initial protocol handler state @
  7229.                KMT_CURRENT_MODE := RECEIVE_MODE;
  7230.                KMT_PH_STATE := REC_INIT;
  7231.                RETRY_COUNT := RETRY_TOTAL := TIMEOUT_TOTAL := 0;
  7232.                VAL KMT_STATISTICS.PACKET_STATISTICS := (0,0);
  7233.                RESULT := 0
  7234.             ELSE
  7235.                RESULT := 89021 @ not implemented in Server mode @
  7236.             FI
  7237.  
  7238.          ; @ KMT_UI_RECEIVE @
  7239.  
  7240.  
  7241.       SIM PROC KMT_UI_SEND IS GROUP KMT_UI_EXEC(RESPONSE RESULT):
  7242.  
  7243.          @ SEND command, Syntax: SEND VME-filename [remote-filename] @
  7244.  
  7245.          @ sends the VME file to the remote Kermit with remote filename if @
  7246.          @ specified otherwise with VME filename @
  7247.          @ (not implemented in Server mode) @
  7248.  
  7249.             IF KMT_CURRENT_MODE NE SERVER_MODE
  7250.             THEN
  7251.                @ check for mandatory filename @
  7252.                KMT_VME_FILE := KMT_SP_GET_WORD(KMT_PARSE);
  7253.                IF NOT (KMT_VME_FILE REF NIL)
  7254.                THEN
  7255.                   @ copy to filename buffer @
  7256.                   KMT_VME_FILE :=
  7257.                      KMT_VME_FILE_BUF(SIZE LENGTH KMT_VME_FILE) :=
  7258.                         KMT_VME_FILE;
  7259.                   @ check for optional remote filename @
  7260.                   KMT_REM_FILE := KMT_SP_GET_WORD(KMT_PARSE);
  7261.                   @ if present copy to buffer @
  7262.                   UNLESS KMT_REM_FILE REF NIL
  7263.                   DO
  7264.                      KMT_REM_FILE :=
  7265.                         KMT_REM_FILE_BUF(SIZE LENGTH KMT_REM_FILE) :=
  7266.                            KMT_REM_FILE
  7267.                   FI;
  7268.                   @ set Send mode and initial protocol handler state @
  7269.                   KMT_CURRENT_MODE := SEND_MODE;
  7270.                   KMT_PH_STATE := SEND_INIT;
  7271.                   RETRY_COUNT := RETRY_TOTAL := TIMEOUT_TOTAL := 0;
  7272.                   VAL KMT_STATISTICS.PACKET_STATISTICS := (0,0);
  7273.                   RESULT := 0
  7274.                ELSE
  7275.                   RESULT := -85010 @ VME filename must be present @
  7276.                FI
  7277.             ELSE
  7278.                RESULT := 89021 @ not implemented in Server mode @
  7279.             FI
  7280.  
  7281.          ; @ KMT_UI_SEND @
  7282.  
  7283.  
  7284.       SIM PROC KMT_UI_HELP IS GROUP KMT_UI_EXEC(RESPONSE RESULT):
  7285.  
  7286.          @ HELP command, Syntax: HELP [command [argument(s)] ] @
  7287.  
  7288.          @ provides on-line help for Kermit commands @
  7289.          @ (not implemented in Server mode) @
  7290.  
  7291.             IF KMT_CURRENT_MODE NE SERVER_MODE
  7292.             THEN
  7293.                INT HELP_MSG_NO := 1, @ start of help info @
  7294.                    P1 := 0,          @ indicates mtm call with command params @
  7295.                    HELP_REPLY;
  7296.  
  7297.                @ set up message text parameter area @
  7298.                HELP_MTM_AREA(SIZE 4) :=
  7299.                  (HELP_TEXT AS KMT_MTM_VALUES.RVB_VALUE,
  7300.                   HELP_TEXT_LEN AS KMT_MTM_VALUES.RI_VALUE,
  7301.                   HELP_RECALL_DATA AS KMT_MTM_VALUES.RVRVB_VALUE,
  7302.                   P1 AS KMT_MTM_VALUES.RI_VALUE);
  7303.  
  7304.                @ obtain any command line parameters @
  7305.                FOR I FROM 4 TO 9
  7306.                DO
  7307.                   KMT_WORD HELP_ARG := KMT_SP_GET_WORD(KMT_PARSE);
  7308.                   KMT_SP_CONVERT_TO_UPPER_CASE(HELP_ARG);
  7309.                   HELP_MTM_AREA(I) :=
  7310.                      HELP_ARG AS KMT_MTM_VALUES.RVB_VALUE
  7311.                REPEAT;
  7312.  
  7313.                @ expand help until all done (0) or none found (-2) @
  7314.                WHILE HELP_REPLY := EXPAND_HELP(HELP_MSG_NO);
  7315.                      HELP_REPLY > 0
  7316.                DO
  7317.                   @ halt code returned, text is prompt, get response @
  7318.                   KMT_SP_ASK_MESSAGE(HELP_TEXT(SIZE HELP_TEXT_LEN),
  7319.                                      KMT_INPUT_BUF,STRLEN,FALSE,RC_IGNORED);
  7320.                   P1 := 1;      @ indicates mtm call with menu selection @
  7321.                   HELP_MTM_AREA(3) := P1 AS KMT_MTM_VALUES.RI_VALUE;
  7322.                   HELP_MTM_AREA(4) :=
  7323.                      KMT_INPUT_BUF(SIZE S'STRLEN) AS KMT_MTM_VALUES.RVB_VALUE;
  7324.                   HELP_MSG_NO := HELP_REPLY
  7325.                REPEAT;
  7326.                RESULT := 0
  7327.             ELSE
  7328.                RESULT := 89021 @ not implemented in Server mode @
  7329.             FI
  7330.  
  7331.          ; @ KMT_UI_HELP @
  7332.  
  7333.  
  7334.       SIM PROC KMT_UI_EXIT IS GROUP KMT_UI_EXEC(RESPONSE RESULT):
  7335.  
  7336.          @ EXIT command, Syntax: EXIT @
  7337.  
  7338.          @ terminates Kermit execution @
  7339.  
  7340.          BEGIN
  7341.             EXIT_STATE := EXIT; @ set exit state @
  7342.             IF KMT_CURRENT_MODE = SERVER_MODE
  7343.             THEN
  7344.                KMT_PH_STATE := COMPLETE
  7345.             FI;
  7346.             RESULT := 0
  7347.          END
  7348.  
  7349.          ; @ KMT_UI_EXIT @
  7350.  
  7351.  
  7352.       SIM PROC KMT_UI_SET IS GROUP KMT_UI_EXEC(RESPONSE RESULT):
  7353.  
  7354.          @ SET command, Syntax: SET [{SEND/RECEIVE}] parameter value @
  7355.  
  7356.          @ sets Kermit parameters @
  7357.  
  7358.          BEGIN
  7359.             KMT_WORD ARG;
  7360.             WORD P_FLAG,PARAM,OPTION;
  7361.  
  7362.             RESULT := 0;
  7363.             ARG := KMT_SP_GET_WORD(KMT_PARSE);
  7364.  
  7365.             IF ARG REF NIL
  7366.             THEN @ incomplete command @
  7367.                RESULT := 85932
  7368.             ELSF
  7369.                KMT_SP_CONVERT_TO_UPPER_CASE(ARG);
  7370.                KMT_MTM_AREA(4) := ARG AS KMT_MTM_VALUES.RVB_VALUE;
  7371.                P_FLAG := KMT_SP_MTM(5100,KMT_MTM_AREA);
  7372.                P_FLAG NE W'UNSET
  7373.             THEN @ SET SEND/RECEIVE command @
  7374.                ARG := KMT_SP_GET_WORD(KMT_PARSE);
  7375.  
  7376.                IF ARG REF NIL
  7377.                THEN @ incomplete command @
  7378.                   RESULT := 85932
  7379.                ELSF
  7380.                   KMT_SP_CONVERT_TO_UPPER_CASE(ARG);
  7381.                   KMT_MTM_AREA(5) := ARG AS KMT_MTM_VALUES.RVB_VALUE;
  7382.                   PARAM := KMT_SP_MTM(5120,KMT_MTM_AREA);
  7383.                   PARAM = 921
  7384.                THEN @ invalid SEND/RECEIVE parameter @
  7385.                   RESULT := 85921
  7386.                ELSF
  7387.                   ARG := KMT_SP_GET_WORD(KMT_PARSE);
  7388.                   ARG REF NIL
  7389.                THEN @ incomplete command @
  7390.                   RESULT := 85932
  7391.                ELSE
  7392.                   KMT_SP_CONVERT_TO_UPPER_CASE(ARG);
  7393.                   KMT_MTM_AREA(6) := ARG AS KMT_MTM_VALUES.RVB_VALUE;
  7394.  
  7395.                   CASE PARAM
  7396.                   THEN @ 0 - START-OF-PACKET @
  7397.                      OPTION := KMT_SP_CONVERT_TO_BINARY(ARG);
  7398.                      CHECK_AND_SET_PARAM(MARK_PARAM,OPTION,P_FLAG,RESULT)
  7399.                   ELSE @ 1 - PACKET-LENGTH @
  7400.                      WORD DH_LEN,NPAD;
  7401.                      IF P_FLAG = 0
  7402.                      THEN @ RECEIVE @
  7403.                         DH_LEN := KMT_DH_DEVICE_DETAILS.MAX_INPUT_LENGTH;
  7404.                         NPAD := KMT_PP_LOCAL_CONFG_PARAMS.NPAD
  7405.                      ELSE
  7406.                         DH_LEN := KMT_DH_DEVICE_DETAILS.MAX_OUTPUT_LENGTH;
  7407.                         NPAD := KMT_PP_REMOTE_CONFG_PARAMS.NPAD
  7408.                      FI;
  7409.                      OPTION := KMT_SP_CONVERT_TO_BINARY(ARG);
  7410.  
  7411.                      IF OPTION < 30 OR OPTION > 94 OR OPTION > DH_LEN
  7412.                      THEN @ invalid PACKET-LENGTH @
  7413.                         RESULT := 85931
  7414.                      ELSF
  7415.                          (OPTION + NPAD) > DH_LEN
  7416.                      THEN @ padding + packet length exceeds device line length @
  7417.                         RESULT := 85934
  7418.                      ELSF @ set parameter @
  7419.                         P_FLAG = 0
  7420.                      THEN @ RECEIVE @
  7421.                         KMT_PP_LOCAL_CONFG_PARAMS.MAXL := OPTION
  7422.                      ELSE @ SEND @
  7423.                         KMT_PP_REMOTE_CONFG_PARAMS.MAXL := OPTION
  7424.                      FI
  7425.                   ELSE @ 2 - TIMEOUT @
  7426.                      OPTION := KMT_SP_CONVERT_TO_BINARY(ARG);
  7427.  
  7428.                      IF OPTION > 94
  7429.                      THEN @ invalid TIMEOUT @
  7430.                         RESULT := 85931
  7431.                      ELSF @ set parameter @
  7432.                         P_FLAG = 0
  7433.                      THEN @ RECEIVE @
  7434.                         KMT_PP_REMOTE_CONFG_PARAMS.TIME := OPTION
  7435.                      ELSE @ SEND @
  7436.                         KMT_PP_LOCAL_CONFG_PARAMS.TIME := OPTION
  7437.                      FI
  7438.                   ELSE @ 3 - END-OF-LINE @
  7439.                      OPTION := KMT_SP_CONVERT_TO_BINARY(ARG);
  7440.                      CHECK_AND_SET_PARAM(EOL_PARAM,OPTION,P_FLAG,RESULT)
  7441.                   ELSE @ 4 - PADDING @
  7442.                      WORD DH_LEN,MAXL;
  7443.                      IF P_FLAG = 0
  7444.                      THEN @ RECEIVE @
  7445.                         DH_LEN := KMT_DH_DEVICE_DETAILS.MAX_INPUT_LENGTH;
  7446.                         MAXL := KMT_PP_LOCAL_CONFG_PARAMS.MAXL
  7447.                      ELSE @ SEND @
  7448.                         DH_LEN := KMT_DH_DEVICE_DETAILS.MAX_OUTPUT_LENGTH;
  7449.                         MAXL := KMT_PP_REMOTE_CONFG_PARAMS.MAXL
  7450.                      FI;
  7451.                      OPTION := KMT_SP_CONVERT_TO_BINARY(ARG);
  7452.  
  7453.                      IF OPTION > 94 OR OPTION > DH_LEN
  7454.                      THEN @ invalid PADDING @
  7455.                         RESULT := 85931
  7456.                      ELSF
  7457.                          (OPTION + MAXL) > DH_LEN
  7458.                      THEN @ padding + packet length exceeds device line length @
  7459.                         RESULT := 85934
  7460.                      ELSF @ set parameter @
  7461.                         P_FLAG = 0
  7462.                      THEN @ RECEIVE @
  7463.                         KMT_PP_LOCAL_CONFG_PARAMS.NPAD := OPTION
  7464.                      ELSE @ SEND @
  7465.                         KMT_PP_REMOTE_CONFG_PARAMS.NPAD := OPTION
  7466.                      FI
  7467.                   ELSE @ 5 - PAD-CHARACTER @
  7468.                      OPTION := KMT_SP_CONVERT_TO_BINARY(ARG);
  7469.                      CHECK_AND_SET_PARAM(PADC_PARAM,OPTION,P_FLAG,RESULT)
  7470.                   ELSE @ 6 - QUOTE @
  7471.                      REF KMT_PP_CONFG_PARAMS_S CONFG_PARAMS IS
  7472.                          IF P_FLAG = 0
  7473.                          THEN @ RECEIVE @
  7474.                             KMT_PP_REMOTE_CONFG_PARAMS
  7475.                          ELSE @ SEND @
  7476.                             KMT_PP_LOCAL_CONFG_PARAMS
  7477.                          FI;
  7478.  
  7479.                      OPTION := IF LENGTH ARG > 1
  7480.                                THEN @ may be decimal or hex @
  7481.                                   KMT_SP_CONVERT_TO_BINARY(ARG)
  7482.                                ELSE @ EBCDIC character @
  7483.                                   EBCDIC_TO_ASCII(ARG)
  7484.                                FI;
  7485.  
  7486.                      IF OPTION < 32 OR OPTION > 126
  7487.                      THEN @ not a printable character @
  7488.                         RESULT := 85931
  7489.                      ELSF CONFG_PARAMS.QBIN = OPTION
  7490.                      THEN @ QUOTE and EIGTH-BIT-PREFIX characters equal @
  7491.                         RESULT := 85933
  7492.                      ELSE @ set parameter @
  7493.                         CONFG_PARAMS.QCTL := OPTION
  7494.                      FI
  7495.                   ELSE @ 7 - EIGTH-BIT-PREFIX @
  7496.                      REF KMT_PP_CONFG_PARAMS_S CONFG_PARAMS IS
  7497.                          IF P_FLAG = 0
  7498.                          THEN @ RECEIVE @
  7499.                             KMT_PP_REMOTE_CONFG_PARAMS
  7500.                          ELSE @ SEND @
  7501.                             KMT_PP_LOCAL_CONFG_PARAMS
  7502.                          FI;
  7503.  
  7504.                      OPTION := IF LENGTH ARG > 1
  7505.                                THEN @ may be decimal or hex @
  7506.                                   KMT_SP_CONVERT_TO_BINARY(ARG)
  7507.                                ELSE @ EBCDIC character @
  7508.                                   EBCDIC_TO_ASCII(ARG)
  7509.                                FI;
  7510.  
  7511.                      IF OPTION < 32 OR OPTION > 126
  7512.                         OR (OPTION > 62 AND OPTION < 96)
  7513.                      THEN @ not a printable character @
  7514.                         RESULT := 85931
  7515.                      ELSF CONFG_PARAMS.QCTL = OPTION
  7516.                      THEN @ QUOTE and EIGTH-BIT-PREFIX characters equal @
  7517.                         RESULT := 85933
  7518.                      ELSE @ set parameter @
  7519.                         CONFG_PARAMS.QBIN := OPTION
  7520.                      FI
  7521.                   DEFAULT @ invalid SEND/RECEIVE parameter @
  7522.                      RESULT := 85921
  7523.                   ESAC
  7524.                FI
  7525.             ELSF
  7526.                P_FLAG := KMT_SP_MTM(5110,KMT_MTM_AREA);
  7527.                P_FLAG = 920
  7528.             THEN @ invalid SET parameter @
  7529.                RESULT := 85920
  7530.             ELSF @ SET DEBUG/DELAY/FILE/RETRY/PAUSE @
  7531.                ARG := KMT_SP_GET_WORD(KMT_PARSE);
  7532.                ARG REF NIL
  7533.             THEN @ incomplete command @
  7534.                RESULT := 85932
  7535.             ELSE
  7536.                KMT_SP_CONVERT_TO_UPPER_CASE(ARG);
  7537.                KMT_MTM_AREA(5) := ARG AS KMT_MTM_VALUES.RVB_VALUE;
  7538.  
  7539.                CASE P_FLAG
  7540.                THEN @ 0 - DEBUG @
  7541.                   PARAM := KMT_SP_MTM(5130,KMT_MTM_AREA);
  7542.  
  7543.                   IF PARAM = 921
  7544.                   THEN @ invalid DEBUG parameter @
  7545.                      RESULT := 85921
  7546.                   ELSF
  7547.                      ARG := KMT_SP_GET_WORD(KMT_PARSE);
  7548.                      ARG REF NIL
  7549.                   THEN @ incomplete command @
  7550.                      RESULT := 85932
  7551.                   ELSF
  7552.                      KMT_SP_CONVERT_TO_UPPER_CASE(ARG);
  7553.                      KMT_MTM_AREA(6) := ARG AS KMT_MTM_VALUES.RVB_VALUE;
  7554.                      OPTION := KMT_SP_MTM(5150,KMT_MTM_AREA);
  7555.                      OPTION = 931
  7556.                   THEN @ invalid option @
  7557.                      RESULT := 85931
  7558.                   ELSE @ set parameter @
  7559.  
  7560.                      CASE PARAM
  7561.                      THEN @ 0 - ALL @
  7562.                         KMT_TRACE_FLAGS := IF OPTION = 0
  7563.                                            THEN @ OFF @
  7564.                                               0
  7565.                                            ELSE @ ON @
  7566.                                               -1
  7567.                                            FI
  7568.                      ELSE @ 1 - FILE @
  7569.                         KMT_TRACE_FLAGS.FH_TRACING := OPTION
  7570.                      ELSE @ 2 - PROTOCOL @
  7571.                         KMT_TRACE_FLAGS.PH_TRACING := OPTION
  7572.                      ELSE @ 3 - PACKET @
  7573.                         KMT_TRACE_FLAGS.PP_TRACING := OPTION
  7574.                      ELSE @ 4 - DEVICE @
  7575.                         KMT_TRACE_FLAGS.DH_TRACING := OPTION
  7576.                      DEFAULT @ invalid option @
  7577.                         RESULT := 85931
  7578.                      ESAC
  7579.                   FI
  7580.                ELSE @ 1 - DELAY @
  7581.                   KMT_SP_CONVERT_TO_UPPER_CASE(ARG);
  7582.                   KMT_MTM_AREA(5) := ARG AS KMT_MTM_VALUES.RVB_VALUE;
  7583.                   OPTION := KMT_SP_CONVERT_TO_BINARY(ARG);
  7584.  
  7585.                   IF OPTION < 5 OR OPTION > 300
  7586.                   THEN @ invalid DELAY parameter @
  7587.                      RESULT := 85930
  7588.                   ELSE @ set parameter @
  7589.                      DELAY := I'(OPTION)
  7590.                   FI
  7591.                ELSE @ 2 - FILE @
  7592.                   KMT_SP_CONVERT_TO_UPPER_CASE(ARG);
  7593.                   KMT_MTM_AREA(5) := ARG AS KMT_MTM_VALUES.RVB_VALUE;
  7594.                   ARG := KMT_SP_GET_WORD(KMT_PARSE);
  7595.  
  7596.                   IF ARG REF NIL
  7597.                   THEN @ incomplete command @
  7598.                      RESULT := 85932
  7599.                   ELSF
  7600.                      KMT_SP_CONVERT_TO_UPPER_CASE(ARG);
  7601.                      KMT_MTM_AREA(6) := ARG AS KMT_MTM_VALUES.RVB_VALUE;
  7602.                      OPTION := KMT_SP_MTM(5140,KMT_MTM_AREA);
  7603.                      OPTION = 921 OR OPTION = 931
  7604.                   THEN @ invalid FILE parameter or option @
  7605.                      RESULT := 85000 + OPTION
  7606.                   ELSF OPTION < 3
  7607.                   THEN @ TYPE - EBCDIC, ASCII, BINARY @
  7608.                      KMT_FH_RECORD_DETAILS.TEXT_TYPE := OPTION
  7609.                   ELSF OPTION < 5
  7610.                   THEN @ NAMING @
  7611.                      TRANSLATE_FILENAME := (OPTION = 4)
  7612.                   ELSF OPTION < 7
  7613.                   THEN @ OVERWRITE @
  7614.                      FILE_OPTION := IF OPTION = 5
  7615.                                     THEN @ create mode @
  7616.                                        1
  7617.                                     ELSE @ create replace mode @
  7618.                                        2
  7619.                                     FI
  7620.                   ELSF OPTION < 9
  7621.                   THEN @ INCOMPLETE @
  7622.                      SAVE_INCOMPLETE_FILE := (OPTION = 8)
  7623.                   ELSE @ invalid FILE parameter @
  7624.                      RESULT := 85931
  7625.                   FI
  7626.                ELSE @ 3 - RETRY @
  7627.                   KMT_SP_CONVERT_TO_UPPER_CASE(ARG);
  7628.                   KMT_MTM_AREA(5) := ARG AS KMT_MTM_VALUES.RVB_VALUE;
  7629.                   OPTION := KMT_SP_CONVERT_TO_BINARY(ARG);
  7630.  
  7631.                   IF OPTION > 10
  7632.                   THEN @ invalid RETRY @
  7633.                      RESULT := 85930
  7634.                   ELSE @ set parameter @
  7635.                      MAXTRY := OPTION + 1
  7636.                   FI
  7637.                ELSE @ 4 - PAUSE @
  7638.                   KMT_SP_CONVERT_TO_UPPER_CASE(ARG);
  7639.                   KMT_MTM_AREA(5) := ARG AS KMT_MTM_VALUES.RVB_VALUE;
  7640.                   OPTION := KMT_SP_CONVERT_TO_BINARY(ARG);
  7641.  
  7642.                   IF OPTION > 50
  7643.                   THEN @ invalid PAUSE @
  7644.                      RESULT := 85930
  7645.                   ELSE @ set parameter @
  7646.                      KMT_DH_DEVICE_DETAILS.PAUSE := (I'OPTION) * 100
  7647.                   FI
  7648.                DEFAULT @ invalid SET parameter @
  7649.                   RESULT := 85920
  7650.                ESAC
  7651.             FI;
  7652.  
  7653.             IF KMT_CURRENT_MODE NE SERVER_MODE AND RESULT > 0
  7654.             THEN @ don't send error packet if not in server mode @
  7655.                RESULT := -RESULT
  7656.             FI
  7657.          END
  7658.          ; @ KMT_UI_SET @
  7659.  
  7660.  
  7661.       SIM PROC KMT_UI_SHOW IS GROUP KMT_UI_EXEC(RESPONSE RESULT):
  7662.  
  7663.          @ SHOW command, Syntax: SHOW @
  7664.  
  7665.          @ displays the current values of all Kermit parameters @
  7666.          @ (this variant not implemented in Server mode @
  7667.  
  7668.             IF KMT_CURRENT_MODE NE SERVER_MODE
  7669.             THEN
  7670.                BYTE
  7671.                    REM_QCTL := ASCII_TO_EBCDIC(KMT_PP_REMOTE_CONFG_PARAMS.QCTL),
  7672.                    REM_QBIN := ASCII_TO_EBCDIC(KMT_PP_REMOTE_CONFG_PARAMS.QBIN),
  7673.                    LOC_QCTL := ASCII_TO_EBCDIC(KMT_PP_LOCAL_CONFG_PARAMS.QCTL),
  7674.                    LOC_QBIN := ASCII_TO_EBCDIC(KMT_PP_LOCAL_CONFG_PARAMS.QBIN);
  7675.  
  7676.                KMT_MTM_AREA(3 SIZE 3) :=
  7677.                                      ((L'(I'DELAY)) AS
  7678.                                       KMT_MTM_VALUES.LW_VALUE,
  7679.                                       (L'(I'KMT_DH_DEVICE_DETAILS.PAUSE)/100) AS
  7680.                                       KMT_MTM_VALUES.LW_VALUE,
  7681.                                       (L'(MAXTRY-1)) AS
  7682.                                       KMT_MTM_VALUES.LI_VALUE);
  7683.                KMT_MESSAGE(-85821,RC_IGNORED);
  7684.  
  7685.                KMT_MTM_AREA(3 SIZE 8) :=
  7686.                             (KMT_PP_REMOTE_CONFG_PARAMS.MARK AS
  7687.                              KMT_MTM_VALUES.RVB_VALUE,
  7688.                              (L'KMT_PP_LOCAL_CONFG_PARAMS.MAXL) AS
  7689.                              KMT_MTM_VALUES.LW_VALUE,
  7690.                              (L'KMT_PP_REMOTE_CONFG_PARAMS.TIME) AS
  7691.                              KMT_MTM_VALUES.LW_VALUE,
  7692.                              (L'KMT_PP_LOCAL_CONFG_PARAMS.NPAD) AS
  7693.                              KMT_MTM_VALUES.LW_VALUE,
  7694.                              KMT_PP_LOCAL_CONFG_PARAMS.PADC AS
  7695.                              KMT_MTM_VALUES.RVB_VALUE,
  7696.                              KMT_PP_LOCAL_CONFG_PARAMS.EOL AS
  7697.                              KMT_MTM_VALUES.RVB_VALUE,
  7698.                              REM_QCTL AS
  7699.                              KMT_MTM_VALUES.RVB_VALUE,
  7700.                              REM_QBIN AS
  7701.                              KMT_MTM_VALUES.RVB_VALUE);
  7702.                KMT_MESSAGE(-85822,RC_IGNORED);
  7703.  
  7704.                KMT_MTM_AREA(3 SIZE 8) :=
  7705.                              (KMT_PP_LOCAL_CONFG_PARAMS.MARK AS
  7706.                               KMT_MTM_VALUES.RVB_VALUE,
  7707.                               (L'KMT_PP_REMOTE_CONFG_PARAMS.MAXL) AS
  7708.                               KMT_MTM_VALUES.LW_VALUE,
  7709.                               (L'KMT_PP_LOCAL_CONFG_PARAMS.TIME) AS
  7710.                               KMT_MTM_VALUES.LW_VALUE,
  7711.                               (L'KMT_PP_REMOTE_CONFG_PARAMS.NPAD) AS
  7712.                               KMT_MTM_VALUES.LW_VALUE,
  7713.                               KMT_PP_REMOTE_CONFG_PARAMS.PADC AS
  7714.                               KMT_MTM_VALUES.RVB_VALUE,
  7715.                               KMT_PP_REMOTE_CONFG_PARAMS.EOL AS
  7716.                               KMT_MTM_VALUES.RVB_VALUE,
  7717.                               LOC_QCTL AS
  7718.                               KMT_MTM_VALUES.RVB_VALUE,
  7719.                               LOC_QBIN AS
  7720.                               KMT_MTM_VALUES.RVB_VALUE);
  7721.                KMT_MESSAGE(-85823,RC_IGNORED);
  7722.  
  7723.                KMT_MTM_AREA(3 SIZE 4) :=
  7724.                                      (KMT_FH_RECORD_DETAILS.TEXT_TYPE AS
  7725.                                       KMT_MTM_VALUES.RW_VALUE,
  7726.                                       FILE_OPTION AS
  7727.                                       KMT_MTM_VALUES.RI_VALUE,
  7728.                                       (L'(WORD: (BIT: SAVE_INCOMPLETE_FILE))) AS
  7729.                                       KMT_MTM_VALUES.LW_VALUE,
  7730.                                       (L'(WORD: (BIT: TRANSLATE_FILENAME))) AS
  7731.                                       KMT_MTM_VALUES.LW_VALUE);
  7732.                KMT_MESSAGE(-85825,RC_IGNORED);
  7733.  
  7734.                KMT_MTM_AREA(3 SIZE 2) :=
  7735.                                      (KMT_DH_DEVICE_DETAILS.MAX_INPUT_LENGTH AS
  7736.                                       KMT_MTM_VALUES.RW_VALUE,
  7737.                                       KMT_DH_DEVICE_DETAILS.MAX_OUTPUT_LENGTH AS
  7738.                                       KMT_MTM_VALUES.RW_VALUE);
  7739.                KMT_MESSAGE(-85826,RC_IGNORED);
  7740.  
  7741.                KMT_MTM_AREA(3 SIZE 4) :=
  7742.                                       ((L'(WORD: KMT_TRACE_FLAGS.FH_TRACING)) AS
  7743.                                        KMT_MTM_VALUES.LW_VALUE,
  7744.                                        (L'(WORD: KMT_TRACE_FLAGS.PH_TRACING)) AS
  7745.                                        KMT_MTM_VALUES.LW_VALUE,
  7746.                                        (L'(WORD: KMT_TRACE_FLAGS.PP_TRACING)) AS
  7747.                                        KMT_MTM_VALUES.LW_VALUE,
  7748.                                        (L'(WORD: KMT_TRACE_FLAGS.DH_TRACING)) AS
  7749.                                        KMT_MTM_VALUES.LW_VALUE);
  7750.                KMT_MESSAGE(-85827,RC_IGNORED);
  7751.                RESULT := 0
  7752.             ELSE
  7753.                RESULT := 85911 @ not yet implemented in Server mode @
  7754.             FI
  7755.  
  7756.          ; @ KMT_UI_SHOW @
  7757.  
  7758.  
  7759.       SIM PROC KMT_UI_STATISTICS IS GROUP KMT_UI_EXEC(RESPONSE RESULT):
  7760.  
  7761.          @ STATISTICS command, Syntax: STATISTICS @
  7762.  
  7763.          @ displays statistics of last file transfer @
  7764.  
  7765.             IF KMT_CURRENT_MODE NE SERVER_MODE
  7766.             THEN
  7767.                REF KMT_FH_FILE_STATISTICS_S FILE_STATS IS
  7768.                                             KMT_STATISTICS.FH_FILE_STATISTICS;
  7769.  
  7770.                REF KMT_PP_PACKET_STATISTICS_S PACKET_STATS IS
  7771.                                               KMT_STATISTICS.PACKET_STATISTICS;
  7772.  
  7773.                KMT_MTM_AREA(3 SIZE 6) := (PACKET_STATS.INPUT_TOTAL AS
  7774.                                           KMT_MTM_VALUES.RI_VALUE,
  7775.                                           PACKET_STATS.OUTPUT_TOTAL AS
  7776.                                           KMT_MTM_VALUES.RI_VALUE,
  7777.                                           RETRY_TOTAL AS
  7778.                                           KMT_MTM_VALUES.RI_VALUE,
  7779.                                           TIMEOUT_TOTAL AS
  7780.                                           KMT_MTM_VALUES.RI_VALUE,
  7781.                                           FILE_STATS.INPUT_TOTAL AS
  7782.                                           KMT_MTM_VALUES.RI_VALUE,
  7783.                                           FILE_STATS.OUTPUT_TOTAL AS
  7784.                                           KMT_MTM_VALUES.RI_VALUE);
  7785.                KMT_MESSAGE(-85820,RC_IGNORED);
  7786.                RESULT := 0
  7787.             ELSE
  7788.                RESULT := 85911 @ not yet implemented in Server mode @
  7789.             FI
  7790.  
  7791.          ; @ KMT_UI_STATISTICS @
  7792.  
  7793.       SIM PROC KMT_UI_UNRECOGNISED IS GROUP KMT_UI_EXEC(RESPONSE RESULT):
  7794.  
  7795.          @ command no recognised @
  7796.  
  7797.             IF KMT_CURRENT_MODE NE SERVER_MODE
  7798.             THEN
  7799.                RESULT := -85910
  7800.             ELSE
  7801.                RESULT := 85910
  7802.             FI
  7803.  
  7804.          ; @ KMT_UI_UNRECOGNISED @
  7805.  
  7806.  
  7807.       @ command execution procedure selector: @
  7808.  
  7809.       ()SIM PROC GROUP KMT_UI_EXEC(RESPONSE) KMT_UI_CMD IS
  7810.                       (KMT_UI_SERVER,
  7811.                        KMT_UI_RECEIVE,
  7812.                        KMT_UI_SEND,
  7813.                        KMT_UI_HELP,
  7814.                        KMT_UI_EXIT,
  7815.                        KMT_UI_SET,
  7816.                        KMT_UI_SHOW,
  7817.                        KMT_UI_STATISTICS,
  7818.                        KMT_UI_UNRECOGNISED);
  7819.  
  7820.  
  7821.       KMT_WORD KMT_CMD;       @ current command @
  7822.       INT CMD;                @ current command code @
  7823.  
  7824.       RESULT := 0;
  7825.  
  7826.       IF KMT_CURRENT_MODE = COMMAND_MODE
  7827.       THEN
  7828.          @ prompt for command input @
  7829.          KMT_SP_ASK_MESSAGE(X"15E5D4C540D285999489A36E40",   @ " VME Kermit> " @
  7830.                             KMT_INPUT_BUF,STRLEN,TRUE,RESULT);
  7831.          KMT_CMD_BUF := KMT_PARSE := KMT_INPUT_BUF(SIZE S'STRLEN);
  7832.       ELSF LENGTH KMT_PH_INPUT_PACKET_DATA > 0
  7833.       THEN
  7834.          @ Server mode, command in packet @
  7835.          KMT_CMD_BUF := KMT_PARSE := KMT_PH_INPUT_PACKET_DATA
  7836.       ELSE
  7837.          RESULT := 89022 @ no command specified in Server mode @
  7838.       FI;
  7839.  
  7840.       IF RESULT = 0
  7841.       THEN
  7842.          KMT_CMD := KMT_SP_GET_WORD(KMT_PARSE); @ extract command @
  7843.          UNLESS KMT_CMD REF NIL
  7844.          DO
  7845.             @ convert command name to upper case, validate and execute command @
  7846.             KMT_SP_CONVERT_TO_UPPER_CASE(KMT_CMD);
  7847.             KMT_MTM_AREA(3) := KMT_CMD AS KMT_MTM_VALUES.RVB_VALUE;
  7848.             CMD := KMT_SP_MTM(5010,KMT_MTM_AREA(SIZE 4));
  7849.             KMT_UI_CMD(CMD)(RESULT)
  7850.          FI
  7851.       FI
  7852.  
  7853.    END
  7854.  
  7855.    ;                                                                  @ KMT_UI @
  7856.  
  7857. ENDMODULE                                                      @ KMT_UI_MODULE @
  7858. $$$$ KMT_HELP_MTM
  7859. *@ KERMIT HELP SYSTEM MESSAGE TEXT MODULE @
  7860. *@ ====== ==== ====== ======= ==== ====== @
  7861.  
  7862. *CREATE(KMTHELPMTM)
  7863. *PROC(KMTHELPMTM)
  7864. *VERSION(101)
  7865. *PARAMS(EXP&ICL)
  7866. *LINESPLIT(SPACE)
  7867.  
  7868. *@ N.B. NIL IS ASSUMED TO HAVE A VALUE OF -1 @
  7869.  
  7870. *1        @ text to validate command for which help required @
  7871.  
  7872. <CASE P2 STARTS
  7873.          <> OR <-1>        THEN J20,   @ no command specified @
  7874.          <SERVER>          THEN J250,
  7875.          <RECEIVE>         THEN J500,
  7876.          <SEND>            THEN J750,
  7877.          <HELP>            THEN J1000,
  7878.          <EXIT>            THEN J1250,
  7879.          <SET>             THEN J1500,
  7880.          <SHOW>            THEN J1750,
  7881.          <STATISTICS   >   THEN J2000,
  7882.          <START-OF-PACKET> THEN J9000  @ not a command, START-OF-PACKET info @
  7883.       DEFAULT                   J10    @ invalid command @
  7884.  ESAC
  7885. >
  7886.  
  7887. *10        @ invalid command entry @
  7888.  
  7889. <L1><P2> is not a VME Kermit command.
  7890.  
  7891. *20        @ no command specified, display menu @
  7892.  
  7893. <L1>Help is available for the following VME Kermit commands: <HALT -1>
  7894. <L1>(n.b. square brackets enclose optional parameters and should
  7895. omitted when entering a command.) <L1><HALT -1>
  7896. <S3>(1) SERVER <TAB 35>: select Kermit Server mode <HALT -1>
  7897. <S3>(2) RECEIVE [VME-filename] <TAB 35>: prepare to receive file <HALT -1>
  7898. <TAB 35>[save as VME-filename] <HALT -1>
  7899. <S3>(3) SEND VME-filename [dest-filename] : send file <HALT -1>
  7900. <TAB 35>[store as dest-filename] <HALT -1>
  7901. <S3>(4) HELP [command] [params] <TAB 35>: obtain help <HALT -1>
  7902. <TAB 35>[for command or command and parameters] <HALT -1>
  7903. <S3>(5) EXIT <TAB 35>: exit from VME Kermit <HALT -1>
  7904. <S3>(6) SET param value <TAB 35>: set Kermit parameter <HALT -1>
  7905. <S3>(7) SHOW <TAB 35>: show value of all Kermit parameters <HALT -1>
  7906. <S3>(8) STATISTICS <TAB 35>: display details of last transfer <HALT -1,J30>
  7907.  
  7908. *30        @ Select command prompt @
  7909.  
  7910. <L1>Select command (Enter 1 to 8 or 0 if no further help required): <HALT 40>
  7911.  
  7912. *40        @ validate response to Select command @
  7913.  
  7914. <CASE P2 EQUALS
  7915.          <0> THEN <>,
  7916.          <1> THEN J250,
  7917.          <2> THEN J500,
  7918.          <3> THEN J750,
  7919.          <4> THEN J1000,
  7920.          <5> THEN J1250,
  7921.          <6> THEN J1500,
  7922.          <7> THEN J1750,
  7923.          <8> THEN J2000
  7924.       DEFAULT     J50
  7925.  ESAC
  7926. >
  7927.  
  7928.  
  7929. *50        @ invalid response to Select command prompt @
  7930.  
  7931. <L1>**** Invalid response, please re-select. <HALT -1><J30>
  7932.  
  7933. *60        @ more help prompt @
  7934.  
  7935. <L1>Any more help required (YES/NO)? <HALT 70>
  7936.  
  7937. *70        @ validate more help reply @
  7938.  
  7939. <CASE P2 STARTS
  7940.          <YES> OR <yes> THEN J20,
  7941.          <NO>  OR <no>  THEN <>
  7942.       DEFAULT         J60
  7943.  ESAC
  7944. >
  7945.  
  7946. *250       @ SERVER command help @
  7947.  
  7948. <L1>SERVER command: <HALT -1>
  7949. <L1><TAB 15>Syntax: SERVER <HALT -1>
  7950. <L1>The SERVER command selects VME Kermit Server mode. All further commands
  7951. are sent to VME Kermit by the user Kermit (running on your micro). File
  7952. transfers are initiated via commands given to the micro Kermit. VME Kermit
  7953. will remain in Server mode until the user Kermit instructs VME Kermit to exit
  7954. to VME command level (after you have issued a FINISH command to the micro
  7955. Kermit) or the user Kermit tells VME Kermit to log out (after you have issued
  7956. a BYE command to the micro Kermit). <HALT -1>
  7957. <L1>WARNING: It is inadvisable to select VME Kermit Server mode if your micro
  7958. Kermit doesn't have the following commands for communicating with servers:
  7959. GET, BYE and FINISH. If in doubt, consult your documentation. <HALT -1>
  7960. <CASE P1 <>,J60 ESAC>
  7961.  
  7962. *500       @ RECEIVE command help @
  7963.  
  7964. RECEIVE command: <HALT -1>
  7965. <L1><TAB 15>Syntax: RECEIVE [VME-filename] <HALT -1>
  7966. <L1>The RECEIVE command prepares VME Kermit for the arrival of a file from
  7967. the micro Kermit. If a VME filename is specified, the file will be saved with
  7968. this name. If no filename is specified, a filename will be sent by the micro
  7969. Kermit and, if possible, the file will be saved with that name. <HALT -1>
  7970. <L1>After issuing the RECEIVE command, escape back to the micro Kermit and
  7971. initiate the file transfer by entering a SEND command. <HALT -1>
  7972. <CASE P1 <>,J60 ESAC>
  7973.  
  7974. *750       @ SEND command help @
  7975.  
  7976. <L1>SEND command: <HALT -1>
  7977. <L1><TAB 15>Syntax: SEND VME-filename [destination-filename] <HALT -1>
  7978. <L1>The VME file is sent to the micro Kermit. If a destination filename
  7979. is included, the file will be stored by the micro with this name,
  7980. otherwise the VME filename will be used. <HALT -1>
  7981. <L1>After issuing the SEND command escape back to the micro Kermit and
  7982. prepare the micro for the arrival of the file by issuing a RECEIVE
  7983. command. <HALT -1>
  7984. <CASE P1 <>,J60 ESAC>
  7985.  
  7986. *1000      @ HELP command help @
  7987.  
  7988. <L1>HELP command: <HALT -1>
  7989. <L1><TAB 15>Syntax: HELP [command] [parameter(s)]
  7990. <L1>The HELP command gives information for the specified command, or allows
  7991. the user to request information via a menu. If a command is specified,
  7992. it may be qualified by appending parameter names. <HALT -1>
  7993. <CASE P1 <>,J60 ESAC>
  7994.  
  7995. *1250      @ EXIT command help @
  7996.  
  7997. <L1>EXIT command: <HALT -1>
  7998. <L1><TAB 15>Syntax: EXIT <HALT -1>
  7999. <L1>The EXIT command terminates the VME Kermit session, closes any logging
  8000. files and returns the user to VME command level. <HALT -1>
  8001. <CASE P1 <>,J60 ESAC>
  8002.  
  8003. *1500      @ SET command help @
  8004.  
  8005. <CASE P3 STARTS
  8006.          <> OR <-1>        THEN J1505, @ no parameter specified @
  8007.          <DEBUG>           THEN J1520,
  8008.          <DELAY>           THEN J1540,
  8009.          <PAUSE>           THEN J1560,
  8010.          <RETRY>           THEN J1580,
  8011.          <FILE>            THEN J1600,
  8012.          <SEND>            THEN J1620,
  8013.          <RECEIVE>         THEN J1640
  8014.       DEFAULT                   J1504  @ invalid parameter @
  8015.  ESAC
  8016. >
  8017.  
  8018. *1501      @ SET command help exit @
  8019.  
  8020. <CASE P1 <>,J1502 ESAC>
  8021.  
  8022.  
  8023. *1502      @ more help prompt @
  8024.  
  8025. <L1>Any more help required? Select:- <HALT -1>
  8026. <S3>(0) No more help <HALT -1>
  8027. <S3>(1) More help for this command <HALT -1>
  8028. <S3>(2) More help for another command <HALT -1>
  8029. <L1>Enter choice (0 to 2): <HALT 1503>
  8030.  
  8031.  
  8032. *1503      @ validate more help response @
  8033.  
  8034. <CASE P2 EQUALS
  8035.          <0> THEN <>,
  8036.          <1> THEN J1505,
  8037.          <2> THEN J20
  8038.       DEFAULT     J1502  @ invalid response, reprompt @
  8039.  ESAC
  8040. >
  8041.  
  8042.  
  8043. *1504      @ invalid SET parameter @
  8044.  
  8045. <L1>**** <P3> is not a SET parameter. <HALT -1><J1501>
  8046.  
  8047. *1505      @ SET command menu @
  8048.  
  8049. <L1>SET command: <HALT -1>
  8050. <L1><TAB 15>Syntax: SET parameter value <HALT -1>
  8051. <L1>The SET command establishes or modifies various parameters for file
  8052. transfer or logging. <HALT -1>
  8053. <L1>The following parameters may be set: <L1><HALT -1>
  8054. <S3>(1) DEBUG {FILE/PROTOCOL/PACKET/DEVICE/ALL} {ON/OFF} <HALT -1>
  8055. <S3>(2) DELAY seconds <HALT -1>
  8056. <S3>(3) PAUSE 10th-seconds <HALT -1>
  8057. <S3>(4) RETRY maximum-retries <HALT -1>
  8058. <S3>(5) FILE parameter value <HALT -1>
  8059. <S3>         TYPE {EBCDIC/ASCII/BINARY} <HALT -1>
  8060. <S3>         NAMING {UNTRANSLATED/NORMAL-FORM} <HALT -1>
  8061. <S3>         OVERWRITE {ON/OFF} <HALT -1>
  8062. <S3>         INCOMPLETE {DISCARD/KEEP} <HALT-1>
  8063. <S3>(6) SEND parameter value <HALT -1>
  8064. <S3>(7) RECEIVE parameter value <HALT -1>
  8065. <S3>            START-OF-PACKET ctl-char <HALT -1>
  8066. <S3>            PACKET-LENGTH number <HALT -1>
  8067. <S3>            TIMEOUT number <HALT -1>
  8068. <S3>            END-OF-LINE ctl-char <HALT -1>
  8069. <S3>            PADDING number <HALT -1>
  8070. <S3>            PAD-CHARACTER ctl-char <HALT -1>
  8071. <S3>            QUOTE char <HALT -1>
  8072. <S3>            EIGHTH-BIT-PREFIX char <HALT -1>
  8073. <J1506>
  8074.  
  8075.  
  8076. *1506      @ select SET parameter @
  8077.  
  8078. <L1>For further information enter choice (1 to 7) or 0 if no further
  8079. information is required: <HALT 1507>
  8080.  
  8081.  
  8082. *1507      @ validate selection @
  8083.  
  8084. <CASE P2 EQUALS
  8085.          <0> THEN <>,
  8086.          <1> THEN J1520,
  8087.          <2> THEN J1540,
  8088.          <3> THEN J1560,
  8089.          <4> THEN J1580,
  8090.          <5> THEN J1600,
  8091.          <6> THEN J1620,
  8092.          <7> THEN J1640
  8093.       DEFAULT     J1508  @ invalid selection @
  8094.  ESAC
  8095. >
  8096.  
  8097.  
  8098. *1508      @ invalid selection @
  8099.  
  8100. <L1>**** Invalid response, please re-select.<HALT -1><J1506>
  8101.  
  8102.  
  8103. *1520      @ SET DEBUG @
  8104.  
  8105. <CASE P4 STARTS
  8106.          <> OR <-1>  THEN J1525,  @ no parameter specified @
  8107.          <FILE>      THEN J1530,
  8108.          <PROTOCOL>  THEN J1531,
  8109.          <PACKET>    THEN J1532,
  8110.          <DEVICE>    THEN J1533,
  8111.          <ALL>       THEN J1534
  8112.       DEFAULT             J1524   @ invalid parameter @
  8113.  ESAC
  8114. >
  8115.  
  8116.  
  8117. *1521      @ SET DEBUG command help exit @
  8118.  
  8119. <CASE P1 <>, J1522 ESAC>
  8120.  
  8121.  
  8122. *1522      @ more help prompt @
  8123.  
  8124. <L1>Any more help required? Select:- <HALT -1>
  8125. <S3>(0) No more help <HALT -1>
  8126. <S3>(1) More help for this command <HALT -1>
  8127. <S3>(2) More help for another command <HALT -1>
  8128. <L1>Enter choice (0 to 2): <HALT 1523>
  8129.  
  8130.  
  8131. *1523      @ validate more help response @
  8132.  
  8133. <CASE P2 EQUALS
  8134.          <0>  THEN <>,
  8135.          <1>  THEN J1525,
  8136.          <2>  THEN J20
  8137.       DEFAULT      J1522      @ invalid response, reprompt @
  8138.  ESAC
  8139. >
  8140.  
  8141.  
  8142. *1524      @ invalid SET DEBUG parameter @
  8143.  
  8144. <L1>**** <P4> is not a SET DEBUG parameter.<HALT -1><J1521>
  8145.  
  8146.  
  8147. *1525      @ SET DEBUG command menu @
  8148.  
  8149. <L1>SET DEBUG: <HALT-1>
  8150. <L1><TAB 15>Syntax: SET DEBUG parameter option <HALT -1>
  8151. <L1>Sets the various debugging facilities on or off.<HALT -1>
  8152. <L1>The following parameters may be set:<L1><HALT -1>
  8153. <S3>(1) FILE     {ON/OFF} <HALT -1>
  8154. <S3>(2) PROTOCOL {ON/OFF} <HALT -1>
  8155. <S3>(3) PACKET   {ON/OFF} <HALT -1>
  8156. <S3>(4) DEVICE   {ON/OFF} <HALT -1>
  8157. <S3>(5) ALL      {ON/OFF} <HALT -1>
  8158. <J1526>
  8159.  
  8160.  
  8161. *1526      @ select SET DEBUG parameter @
  8162.  
  8163. <L1>For further information enter choice (1 to 5) or 0 if no further
  8164. information is required: <HALT 1527>
  8165.  
  8166.  
  8167. *1527      @ validate selection @
  8168.  
  8169. <CASE P2 EQUALS
  8170.          <0>  THEN <>,
  8171.          <1>  THEN J1530,
  8172.          <2>  THEN J1531,
  8173.          <3>  THEN J1532,
  8174.          <4>  THEN J1533,
  8175.          <5>  THEN J1534
  8176.       DEFAULT      J1528      @ invalid selection @
  8177.  ESAC
  8178. >
  8179.  
  8180.  
  8181. *1528      @ invalid selection @
  8182.  
  8183. <L1>**** Invalid response, please re-select.<HALT -1><J1526>
  8184.  
  8185.  
  8186. *1530      @ SET DEBUG FILE @
  8187.  
  8188. <L1>SET DEBUG FILE: <HALT -1>
  8189. <L1><TAB 15>Syntax: SET DEBUG FILE option <HALT -1>
  8190. <L1>Turns file record tracing on or off. If option is ON then the contents of
  8191. all file records read or written will be logged (in hex) to the job journal.
  8192. The default is OFF. <HALT -1>
  8193. <L1>e.g. SET DEBUG FILE ON - turns on file record tracing. <HALT -1>
  8194. <J1521>
  8195.  
  8196.  
  8197. *1531      @ SET DEBUG PROTOCOL @
  8198.  
  8199. <L1>SET DEBUG PROTOCOL: <HALT -1>
  8200. <L1><TAB 15>Syntax: SET DEBUG PROTOCOL option <HALT -1>
  8201. <L1>Turns protocol state/event tracing on or off. If option is ON then the
  8202. internal states and events of the protocol handler will be logged to the job
  8203. journal. The default is OFF. <HALT -1>
  8204. <L1>e.g. SET DEBUG PROTOCOL ON - turns on protocol state/event tracing.<HALT -1>
  8205. <J1521>
  8206.  
  8207.  
  8208. *1532      @ SET DEBUG PACKET @
  8209.  
  8210. <L1>SET DEBUG PACKET: <HALT -1>
  8211. <L1><TAB 15>Syntax: SET DEBUG PACKET option <HALT -1>
  8212. <L1>Turns packet tracing on or off. If option is ON then the contents of all
  8213. packets sent and received will be logged to the job journal. The
  8214. default is OFF. <HALT -1>
  8215. <L1>e.g. SET DEBUG PACKET ON - turns on packet tracing. <HALT -1>
  8216. <J1521>
  8217.  
  8218.  
  8219. *1533      @ SET DEBUG DEVICE @
  8220.  
  8221. <L1>SET DEBUG DEVICE: <HALT -1>
  8222. <L1><TAB 15>Syntax: SET DEBUG DEVICE option <HALT -1>
  8223. <L1>Turns device tracing on or off. If option is ON then all the data sent and
  8224. received over the terminal link will be logged (in hex) to the job journal. The
  8225. default is OFF. <HALT -1>
  8226. <L1>e.g. SET DEBUG DEVICE ON - turns on device tracing. <HALT -1>
  8227. <J1521>
  8228.  
  8229.  
  8230. *1534      @ SET DEBUG ALL @
  8231.  
  8232. <L1>SET DEBUG ALL: <HALT -1>
  8233. <L1><TAB 15>Syntax: SET DEBUG ALL option <HALT -1>
  8234. <L1>Turns all tracing on or off. If option is ON then the contents of all file
  8235. records read or written, the internal states and events of the protocol handler,
  8236. the contents of all packets sent and received and all the data sent and
  8237. received over the terminal link will be logged to the job journal. The default
  8238. is OFF. <HALT -1>
  8239. <L1>e.g. SET DEBUG ALL ON - turns on all tracing. <HALT -1>
  8240. <J1521>
  8241.  
  8242.  
  8243. *1540      @ SET DELAY @
  8244.  
  8245. <L1>SET DELAY: <HALT -1>
  8246. <L1><TAB 15>Syntax: SET DELAY seconds <HALT -1>
  8247. <L1>Sets the length of delay before transmitting the first packet after
  8248. a SEND command has been issued. The default delay is 30 seconds. The
  8249. minimum delay that can be set is 5 seconds and the maximum is 300
  8250. seconds. Seconds may be expressed as a decimal value (e.g. 9) or as a
  8251. hexadecimal value (e.g. X09). <HALT -1>
  8252. <L1>e.g. SET DELAY 15 - sets the delay period to 15 seconds. <HALT -1>
  8253. <J1501>
  8254.  
  8255.  
  8256. *1560      @ SET PAUSE @
  8257.  
  8258. <L1>SET PAUSE: <HALT -1>
  8259. <L1><TAB 15>Syntax: SET PAUSE 10ths-second <HALT -1>
  8260. <L1>Sets the length of time to pause between receiving a packet from the remote
  8261. system and transmitting the next packet to it. The default pause is 0 tenths
  8262. of a second. The maximum pause that can be set is 50 tenths of a second.
  8263. 10ths-second may be expressed as a decimal value (e.g. 9) or as a hexadecimal
  8264. value (e.g. X09). <HALT -1>
  8265. <L1>e.g. SET PAUSE 10 - sets the pause period to 10 tenths of a second.<HALT -1>
  8266. <J1501>
  8267.  
  8268.  
  8269. *1580      @ SET RETRY @
  8270.  
  8271. <L1>SET RETRY: <HALT -1>
  8272. <L1><TAB 15>Syntax: SET RETRY number <HALT -1>
  8273. <L1>Sets the maximum number of times to attempt to send or receive a packet
  8274. before abandoning the transfer. The default retry is 4. The maximum retry that
  8275. can be set is 10. Number may be expressed as a decimal value (e.g. 4) or as a
  8276. hexadecimal value (e.g. X04). <HALT -1>
  8277. <L1>e.g. SET RETRY 8 - sets the retry limit to 8 retries. <HALT -1>
  8278. <J1501>
  8279.  
  8280.  
  8281. *1600      @ SET FILE @
  8282.  
  8283. <CASE P4 STARTS
  8284.          <> OR <-1>    THEN J1605,  @ no parameter specified @
  8285.          <TYPE>        THEN J1610,
  8286.          <NAMING>      THEN J1611,
  8287.          <OVERWRITE>   THEN J1612,
  8288.          <INCOMPLETE>  THEN J1613
  8289.       DEFAULT               J1604   @ invalid parameter @
  8290.  ESAC
  8291. >
  8292.  
  8293.  
  8294. *1601      @ SET FILE command help exit @
  8295.  
  8296. <CASE P1 <>, J1602 ESAC>
  8297.  
  8298.  
  8299. *1602      @ more help prompt @
  8300.  
  8301. <L1>Any more help required? Select:- <HALT -1>
  8302. <S3>(0) No more help <HALT -1>
  8303. <S3>(1) More help for this command <HALT -1>
  8304. <S3>(2) More help for another command <HALT -1>
  8305. <L1>Enter choice (0 to 2): <HALT 1603>
  8306.  
  8307.  
  8308. *1603      @ validate more help response @
  8309.  
  8310. <CASE P2 EQUALS
  8311.          <0>  THEN <>,
  8312.          <1>  THEN J1605,
  8313.          <2>  THEN J20
  8314.       DEFAULT      J1602      @ invalid response, reprompt @
  8315.  ESAC
  8316. >
  8317.  
  8318.  
  8319. *1604      @ invalid SET FILE parameter @
  8320.  
  8321. <L1>**** <P4> is not a SET FILE parameter.<HALT -1><J1601>
  8322.  
  8323.  
  8324. *1605      @ SET FILE command menu @
  8325.  
  8326. <L1>SET FILE: <HALT-1>
  8327. <L1><TAB 15>Syntax: SET FILE parameter option <HALT -1>
  8328. <L1>Sets the various file attributes.<HALT -1>
  8329. <L1>The following parameters may be set:<L1><HALT -1>
  8330. <S3>(1) TYPE       {EBCDIC/ASCII/BINARY} <HALT -1>
  8331. <S3>(2) NAMING     {UNTRANSLATED/NORMAL-FORM} <HALT -1>
  8332. <S3>(3) OVERWRITE  {ON/OFF} <HALT -1>
  8333. <S3>(4) INCOMPLETE {DISCARD/KEEP} <HALT -1>
  8334. <J1606>
  8335.  
  8336.  
  8337. *1606      @ select SET FILE parameter @
  8338.  
  8339. <L1>For further information enter choice (1 to 4) or 0 if no further
  8340. information is required: <HALT 1607>
  8341.  
  8342.  
  8343. *1607      @ validate selection @
  8344.  
  8345. <CASE P2 EQUALS
  8346.          <0>  THEN <>,
  8347.          <1>  THEN J1610,
  8348.          <2>  THEN J1611,
  8349.          <3>  THEN J1612,
  8350.          <4>  THEN J1613
  8351.       DEFAULT      J1608      @ invalid selection @
  8352.  ESAC
  8353. >
  8354.  
  8355.  
  8356. *1608      @ invalid selection @
  8357.  
  8358. <L1>**** Invalid response, please re-select.<HALT -1><J1606>
  8359.  
  8360.  
  8361. *1610      @ SET FILE TYPE @
  8362.  
  8363. <L1>SET FILE TYPE: <HALT -1>
  8364. <L1><TAB 15>Syntax: SET FILE TYPE option <HALT -1>
  8365. <L1>Defines the type of file to be sent, or received.
  8366. option may be one of: <HALT -1>
  8367. <S3>EBCDIC meaning that the VME file contains, or is to contain EBCDIC <HALT -1>
  8368. <S3>       text and data conversion between EBCDIC and ASCII is <HALT -1>
  8369. <S3>       required. <HALT -1>
  8370. <S3>ASCII  meaning that the VME file contains, or is to contain ASCII <HALT -1>
  8371. <S3>       text and no data conversion is required. <HALT -1>
  8372. <S3>BINARY meaning that the VME file contains, of is to contain binary <HALT -1>
  8373. <S3>       data and no data conversion is required. Note in this case <HALT -1>
  8374. <S3>       the record boundaries of the VME file are not significant <HALT -1>
  8375. <S3>       to KERMIT. <HALT -1>
  8376. The default is EBCDIC. <HALT -1>
  8377. <L1>e.g. SET FILE TYPE BINARY - sets file transfer is to be binary.<HALT -1>
  8378. <J1601>
  8379.  
  8380.  
  8381. *1611      @ SET FILE NAMING @
  8382.  
  8383. <L1>SET FILE NAMING: <HALT -1>
  8384. <L1><TAB 15>Syntax: SET FILE NAMING option <HALT -1>
  8385. <L1>Defines how file names are to represented/interpretted. If option is
  8386. NORMAL-FORM then the VME and remote file names will be normalised. If option is
  8387. UNTRANSLATED then no file name normalisation will take place. The default is
  8388. NORMAL-FORM. <HALT -1>
  8389. <L1>e.g. SET FILE NAMING UNTRANSLATED - turns off file name normalisation.
  8390. <HALT -1>
  8391. <J1601>
  8392.  
  8393.  
  8394. *1612      @ SET FILE OVERWRITE @
  8395.  
  8396. <L1>SET FILE OVERWRITE: <HALT -1>
  8397. <L1><TAB 15>Syntax: SET FILE OVERWRITE option <HALT -1>
  8398. <L1>Defines the action to be taken when receiving a file and a VME file of the
  8399. same name and generation number already exists. If option is ON then the file
  8400. will be overwritten. If option is OFF then the file transfer will abandoned.
  8401. The default is OFF. <HALT -1>
  8402. <L1>e.g. SET FILE OVERWRITE ON - incoming file will be overwritten if it already
  8403. exists. <HALT -1>
  8404. <J1601>
  8405.  
  8406.  
  8407. *1613      @ SET FILE INCOMPLETE @
  8408.  
  8409. <L1>SET FILE INCOMPLETE: <HALT -1>
  8410. <L1><TAB 15>Syntax: SET FILE INCOMPLETE option <HALT -1>
  8411. <L1>Defines the action to be taken when receiving a file and the file transfer
  8412. is abandoned. If option is KEEP then the VME file will be saved. If option is
  8413. DISCARD then the VME file will not be saved. <HALT -1>
  8414. <L1>e.g. SET FILE INCOMPLETE KEEP - file to be saved if transfer abandoned.
  8415. <HALT -1>
  8416. <J1601>
  8417.  
  8418.  
  8419. *1620      @ SET SEND @
  8420.  
  8421. <J1650>
  8422.  
  8423.  
  8424. *1640      @ SET RECEIVE @
  8425.  
  8426. <J1650>
  8427.  
  8428.  
  8429. *1650      @ SET SEND/RECEIVE @
  8430.  
  8431. <CASE P4 STARTS
  8432.          <> OR <-1>          THEN J1655,  @ no parameter specified @
  8433.          <START-OF-PACKET>   THEN J1660,
  8434.          <PACKET-LENGTH>     THEN J1661,
  8435.          <TIMEOUT>           THEN J1662,
  8436.          <END-OF-LINE>       THEN J1663,
  8437.          <PADDING>           THEN J1664,
  8438.          <PAD-CHARACTER>     THEN J1665,
  8439.          <QUOTE>             THEN J1666,
  8440.          <EIGHTH-BIT-PREFIX>  THEN J1667
  8441.       DEFAULT                     J1654   @ invalid parameter @
  8442.  ESAC
  8443. >
  8444.  
  8445.  
  8446. *1651      @ SET SEND/RECEIVE command help exit @
  8447.  
  8448. <CASE P1 <>, J1652 ESAC>
  8449.  
  8450.  
  8451. *1652      @ more help prompt @
  8452.  
  8453. <L1>Any more help required? Select:- <HALT -1>
  8454. <S3>(0) No more help <HALT -1>
  8455. <S3>(1) More help for this command <HALT -1>
  8456. <S3>(2) More help for another command <HALT -1>
  8457. <L1>Enter choice (0 to 2): <HALT 1653>
  8458.  
  8459.  
  8460. *1653      @ validate more help response @
  8461.  
  8462. <CASE P2 EQUALS
  8463.          <0>  THEN <>,
  8464.          <1>  THEN J1655,
  8465.          <2>  THEN J20
  8466.       DEFAULT      J1652      @ invalid response, reprompt @
  8467.  ESAC
  8468. >
  8469.  
  8470.  
  8471. *1654      @ invalid SET SEND/RECEIVE parameter @
  8472.  
  8473. <L1>**** <P4> is not a SET SEND/RECEIVE parameter.<HALT -1><J1651>
  8474.  
  8475.  
  8476. *1655      @ SET SEND/RECEIVE command menu @
  8477.  
  8478. <L1>SET SEND/RECEIVE: <HALT-1>
  8479. <L1><TAB 15>Syntax: SET {SEND/RECEIVE} parameter option <HALT -1>
  8480. <L1>Sets the various configuration parameters to allow the tailoring of
  8481. dissimilar systems to accomodate the peculiarities of the communication path.
  8482. Note a number of the configuration parameters may be modified during the
  8483. exchange of S or I packets and the acknowledgements to those packets. <HALT -1>
  8484. <L1>The following parameters may be set:<L1><HALT -1>
  8485. <S3>(1) START-OF-PACKET ctl_char <HALT -1>
  8486. <S3>(2) PACKET-LENGTH number <HALT -1>
  8487. <S3>(3) TIMEOUT seconds <HALT -1>
  8488. <S3>(4) END-OF-LINE ctl-char <HALT -1>
  8489. <S3>(5) PADDING number <HALT -1>
  8490. <S3>(6) PAD-CHARACTER ctl-char <HALT -1>
  8491. <S3>(7) QUOTE char <HALT -1>
  8492. <S3>(8) EIGHTH-BIT-PREFIX char <HALT -1>
  8493. <J1656>
  8494.  
  8495.  
  8496. *1656      @ select SET SEND/RECEIVE parameter @
  8497.  
  8498. <L1>For further information enter choice (1 to 8) or 0 if no further
  8499. information is required: <HALT 1657>
  8500.  
  8501.  
  8502. *1657      @ validate selection @
  8503.  
  8504. <CASE P2 EQUALS
  8505.          <0>  THEN <>,
  8506.          <1>  THEN J1660,
  8507.          <2>  THEN J1661,
  8508.          <3>  THEN J1662,
  8509.          <4>  THEN J1663,
  8510.          <5>  THEN J1664,
  8511.          <6>  THEN J1665,
  8512.          <7>  THEN J1666,
  8513.          <8>  THEN J1667
  8514.       DEFAULT      J1658      @ invalid selection @
  8515.  ESAC
  8516. >
  8517.  
  8518.  
  8519. *1658      @ invalid selection @
  8520.  
  8521. <L1>**** Invalid response, please re-select.<HALT -1><J1656>
  8522.  
  8523.  
  8524. *1660      @ SET SEND/RECEIVE START-OF-PACKET @
  8525.  
  8526. <L1>SET SEND/RECEIVE START-OF-PACKET: <HALT -1>
  8527. <L1><TAB 15>Syntax: SET {SEND/RECEIVE} START-OF-PACKET ctl-char <HALT -1>
  8528. <L1>Sets the ASCII control character to be used as the start-of-packet marker.
  8529. The default is Record Separator (decimal 30, hex 1E). 'Ctl-char' may be
  8530. expressed as a decimal value (e.g. 30) or as a hexadecimal value (e.g. X1E).
  8531. Note a number of control characters are not accepted by VME as valid
  8532. start-of-packet markers. <HALT -1>
  8533. <L1>e.g. SET SEND START-OF-PACKET X1F - sets the start-of-packet marker for
  8534. output packets to Unit Separator. <HALT -1>
  8535. <J1651>
  8536.  
  8537.  
  8538. *1661      @ SET SEND/RECEIVE PACKET-LENGTH @
  8539.  
  8540. <L1>SET SEND/RECEIVE PACKET-LENGTH: <HALT -1>
  8541. <L1><TAB 15>Syntax: SET {SEND/RECEIVE} PACKET-LENGTH number <HALT -1>
  8542. <L1>Sets the maximum length for a packet. The maximum packet-length plus the
  8543. padding (if any) must not exceed the limits of the VME terminal description
  8544. (normally 80 for output and 128 for input). The default packet-length is 80
  8545. characters. The minimum packet-length that can be set is 30 characters and the
  8546. maximum is defined by the terminal description (normally 80 for output and 94
  8547. for input). 'Number' may be expressed as a decimal value (e.g. 80) or as a
  8548. hexadecimal value (e.g. X50). <HALT -1>
  8549. <L1>e.g. SET RECEIVE PACKET-LENGTH 72 - sets the maximum packet-length of input
  8550. packets to 72 characters. <HALT -1>
  8551. <J1651>
  8552.  
  8553.  
  8554. *1662      @ SET SEND/RECEIVE TIMEOUT @
  8555.  
  8556. <L1>SET SEND/RECEIVE TIMEOUT: <HALT -1>
  8557. <L1><TAB 15>Syntax: SET {SEND/RECEIVE} TIMEOUT seconds <HALT -1>
  8558. <L1>Sets the length of time to wait for a packet to arrive. The default is 0
  8559. seconds i.e. indefinite wait. The maximum timeout that can be set is 94 seconds.
  8560. 'Seconds' may be expressed as a decimal value (e.g. 20) or as a hexadecimal
  8561. value (e.g. X14). <HALT -1>
  8562. <L1>e.g. SET RECEIVE TIMEOUT 20 - sets the timeout value for input packets to 20
  8563. seconds. <HALT -1>
  8564. <J1651>
  8565.  
  8566.  
  8567. *1663      @ SET SEND/RECEIVE END-OF-LINE @
  8568.  
  8569. <L1>SET SEND/RECEIVE END-OF-LINE: <HALT -1>
  8570. <L1><TAB 15>Syntax: SET {SEND/RECEIVE} END-OF-LINE ctl-char <HALT -1>
  8571. <L1>Sets the ASCII control character to be used as the end of packet terminator.
  8572. The default is Carriage Return (decimal 13, hex 0D). 'Ctl-char' may be expressed
  8573. as a decimal value (e.g. 13) or as a hexadecimal value (e.g. X0D). Note a number
  8574. of control characters are not accepted by VME as valid end-of-line terminators.
  8575. <HALT -1>
  8576. <L1>e.g. SET RECEIVE END-OF-LINE X09 - sets the input packet end-of-line
  8577. terminator to Tab. <HALT -1>
  8578. <J1651>
  8579.  
  8580.  
  8581. *1664      @ SET SEND/RECEIVE PADDING @
  8582.  
  8583. <L1>SET SEND/RECEIVE PADDING: <HALT -1>
  8584. <L1><TAB 15>Syntax: SET {SEND/RECEIVE} PADDING number <HALT -1>
  8585. <L1>Sets the number of padding characters to be sent before each packet. The
  8586. padding plus the maximum packet length must not exceed the limits of the VME
  8587. terminal description (normally 80 for output and 128 for input). The default
  8588. padding is 0 characters i.e. no padding. The maximum padding that can be set is
  8589. defined by the VME terminal description. <HALT -1>
  8590. <L1>e.g. SET SEND PADDING 4 - sets the padding for output packets to 4 pad
  8591. characters. <HALT -1>
  8592. <J1651>
  8593.  
  8594.  
  8595. *1665      @ SET SEND/RECEIVE PAD-CHARACTER @
  8596.  
  8597. <L1>SET SEND/RECEIVE PAD-CHARACTER: <HALT -1>
  8598. <L1><TAB 15>Syntax: SET {SEND/RECEIVE} PAD-CHARACTER ctl-char <HALT -1>
  8599. <L1>Sets the ASCII control character to be used as a pad character to be sent
  8600. before each packet. The default is Null (decimal 0, hex 00). 'Ctl-char' may be
  8601. expressed as a decimal value (e.g. 0) or as a hexadecimal value (e.g X00).
  8602. Note a number of the control characters are not accepted by VME as valid pad
  8603. characters. <HALT -1>
  8604. <L1>e.g. SET SEND PAD-CHARACTER 7 - sets the output packet pad character to
  8605. Bell. <HALT -1>
  8606. <J1651>
  8607.  
  8608.  
  8609. *1666      @ SET SEND/RECEIVE QUOTE @
  8610.  
  8611. <L1>SET SEND/RECEIVE QUOTE: <HALT -1>
  8612. <L1><TAB 15>Syntax: SET {SEND/RECEIVE} QUOTE char <HALT -1>
  8613. <L1>Sets the printable ASCII character to be used for control character
  8614. prefixing. It may be any printable character but it must be different from the
  8615. eighth-bit-prefix character. The default value is Hash (#) (decimal 35, hex 23).
  8616. 'Char' may be expressed as an ASCII character (e.g. #), as a decimal value
  8617. (e.g. 35) or as a hexadecimal value (e.g. X23). <HALT -1>
  8618. <L1>e.g. SET SEND QUOTE ? - sets the output packet quote character to question
  8619. mark. <HALT -1>
  8620. <J1651>
  8621.  
  8622.  
  8623. *1667      @ SET SEND/RECEIVE EIGHTH-BIT-PREFIX @
  8624.  
  8625. <L1>SET SEND/RECEIVE EIGHTH-BIT-PREFIX: <HALT -1>
  8626. <L1><TAB 15>Syntax: SET {SEND/RECEIVE} EIGHTH-BIT-PREFIX char <HALT -1>
  8627. <L1>Sets the printable ASCII character to be used for eighth bit prefixing.
  8628. It may be any printable character in the range ASCII 32 to 62 or ASCII 96 TO 126
  8629. but it must be different from the control character prefix.
  8630. The default value is Ampersand (&) (decimal 38, hex 26).
  8631. 'Char' may be expressed as an ASCII character (e.g. &), as a decimal value
  8632. (e.g. 38) or as a hexadecimal value (e.g. X26). <HALT -1>
  8633. <L1>e.g. SET SEND EIGHTH-BIT-PREFIX ! - sets the output packet eighth-bit-prefix
  8634. character to exclamation mark. <HALT -1>
  8635. <J1651>
  8636.  
  8637.  
  8638. *1750     @ SHOW command help @
  8639.  
  8640. <L1>SHOW command: <HALT -1>
  8641. <L1><TAB 15>Syntax: SHOW <HALT -1>
  8642. <L1>Displays the current values of SET parameters, capabilities etc. <HALT -1>
  8643. <CASE P1 <>,J60 ESAC>
  8644.  
  8645. *2000     @ STATISTICS command help @
  8646.  
  8647. <L1>STATISTICS command: <HALT -1>
  8648. <L1><TAB 15>Syntax: STATISTICS <HALT -1>
  8649. <L1>Displays statistical information about the most recent file transfer.
  8650. <HALT -1>
  8651. <CASE P1 <>,J60 ESAC>
  8652.  
  8653. *9000     @ START-OF-PACKET info @
  8654.  
  8655. <L>VME I/0 cannot handle the standard Kermit START-OF-PACKET character Hex 01
  8656. (decimal 1) so initially the VME Kermit START-OF-PACKET character is set to
  8657. Hex 1E (decimal 30). For a Kermit file transfer to work, the START-OF-PACKET
  8658. character on the micro Kermit must be set to correspond to the VME Kermit
  8659. START-OF-PACKET character. Consult the documentation for the micro Kermit to
  8660. find out how to change the START-OF-PACKET character on the micro.<HALT -1>
  8661. <L>If the VME Kermit START-OF-PACKET character isn't suitable for the micro
  8662. Kermit then the START-OF-PACKET character should be altered on BOTH Kermits.
  8663. Appendix 2 of the VME KERMIT User Guide lists the characters that VME I/O
  8664. can handle. To change the START-OF-PACKET character on VME Kermit use the
  8665. commands SET RECEIVE START-OF-PACKET and SET SEND START-OF-PACKET. HELP is
  8666. available for these commands. If you attempt to alter the START-OF-PACKET
  8667. character to an unacceptable character you will be notified.
  8668.  
  8669. *END
  8670. $$$$ KMT_SP_MTM
  8671. *@ VME KERMIT SUPPORT PROCEDURE MESSAGE TEXT MODULE                            @
  8672. *@ ************************************************                            @
  8673.  
  8674.  
  8675. *CREATE(KMTSPMTM)
  8676. *PROC(KMTSPMTM)
  8677. *VERSION(101)
  8678. *PARAMS(EXP&ICL)
  8679. *LINESPLIT(SPACE)
  8680.  
  8681.  
  8682.  
  8683.  
  8684. *@ MESSAGES MESSAGE TEXTS                                                      @
  8685. *@ **********************                                                      @
  8686.  
  8687.  
  8688. *@ GENERAL MESSAGES                                                            @
  8689. *@ ****************                                                            @
  8690.  
  8691. *1                                               @ KMT_VERSION_NUMBER          @
  8692.  
  8693. <L><TAB 25>SWURCC VME KERMIT VERSION <P2>
  8694.  
  8695. *2                                               @ KMT_SWURCC_BANNER           @
  8696.  
  8697. <L>South West Universities Regional Computer Centre,
  8698. <HALT -1>Claverton Down, Bath BA2 7AY, U.K.
  8699.  
  8700. *3                                               @ NON-STANDARD MARK CHARACTER @
  8701.  
  8702. <L>The VME Kermit START-OF-PACKET character is Hex 1E (decimal 30).
  8703. <HALT -1>Please set the START-OF-PACKET character on your micro to correspond.
  8704. <HALT -1>Type: HELP START-OF-PACKET for further details.
  8705.  
  8706.  
  8707. *@ SUPPORT PROCEDURES MESSAGES                                                 @
  8708. *@ ***************************                                                 @
  8709.  
  8710. *50                                              @ KMT_SP_TRACE_MSG            @
  8711. <CASE    P1
  8712.  THEN    <>
  8713.  DEFAULT <<HEX P2>>
  8714.  ESAC>
  8715.  
  8716.  
  8717. *@ ERROR HANDLER MESSAGES                                                      @
  8718. *@ **********************                                                      @
  8719.  
  8720.  
  8721. *@ DEVICE HANDLER MESSAGES                                                     @
  8722. *@ ***********************                                                     @
  8723.  
  8724. *150                                             @ KMT_DH_DATA_IN_MSG          @
  8725. <L>KMT_DH_DATA_IN :- <HALT -1, J50>
  8726.  
  8727. *151                                             @ KMT_DH_DATA_OUT_MSG         @
  8728. <L>KMT_DH_DATA_OUT :- <HALT -1, J50>
  8729.  
  8730. *152                                             @ KMT_DH_EVENT_MSG            @
  8731. <L>KMT_DH_EVENT :- <HALT -1, J50>
  8732.  
  8733.  
  8734. *@ FILE HANDLER MESSAGES                                                       @
  8735. *@ *********************                                                       @
  8736.  
  8737. *200                                             @ KMT_FH_RECORD_IN_MSG        @
  8738. <L>KMT_FH_RECORD_IN :- <HALT -1,J50>
  8739.  
  8740. *201                                             @ KMT_FH_RECORD_OUT_MSG       @
  8741. <L>KMT_FH_RECORD_OUT :- <HALT -1,J50>
  8742.  
  8743.  
  8744. *@ PACKET PROCESSOR MESSAGES                                                   @
  8745. *@ *************************
  8746.  
  8747. *250                                             @ KMT_PP_TRACE_MESSAGE        @
  8748. <HEX P2, HALT -1>
  8749. <HALT -1>MARK     = X"<HEX P3>"
  8750. <HALT -1>LEN      = <P4>
  8751. <HALT -1>SEQ      = <P5>
  8752. <HALT -1>TYPE     = <CASE P6
  8753.                      THEN <INVALID TYPE>,
  8754.                           <B (BREAK)>,
  8755.                           <D (DATA)>,
  8756.                           <E (ERROR)>,
  8757.                           <F (FILE_HEADER)>,
  8758.                           <G (GENERIC_COMMAND)>,
  8759.                           <I (INIT_PARAM)>,
  8760.                           <K (KERMIT_COMMAND)>,
  8761.                           <N (NAK)>,
  8762.                           <R (REC_INIT)>,
  8763.                           <S (SEND_INIT)>,
  8764.                           <Y (ACK)>,
  8765.                           <Z (EOF)>
  8766.                      DEFAULT <INVALID TYPE>
  8767.                      ESAC>
  8768. <HALT -1>DATA     = X"<HEX P7>"
  8769. <HALT -1>CHECKSUM = X"<HEX P8>"
  8770.  
  8771. *251                                             @ KMT_PP_PACKET_IN_MSG        @
  8772. <L>KMT_PP_PACKET_IN :- <HALT -1,J250>
  8773.  
  8774. *252                                             @ KMT_PP_PACKET_OUT_MSG       @
  8775. <L>KMT_PP_PACKET_OUT :- <HALT -1,J250>
  8776.  
  8777. *253                                             @ KMT_PP_PACKET_DATA_IN_MSG   @
  8778. <L>KMT_PP_PACKET_DATA_IN <CASE P2
  8779.                           THEN J255,
  8780.                                J256,
  8781.                                J257
  8782.                           DEFAULT J255
  8783.                           ESAC>
  8784.  
  8785. *254                                             @ KMT_PP_PACKET_DATA_OUT_MSG  @
  8786. <L>KMT_PP_PACKET_DATA_OUT <CASE P2
  8787.                            THEN J255,
  8788.                                 J256,
  8789.                                 J257
  8790.                            DEFAULT J255
  8791.                            ESAC>
  8792.  
  8793. *255                                             @ EBCDIC DATA                 @
  8794. (EBCDIC) :-
  8795. <HALT -1><P3>
  8796.  
  8797. *256                                             @ ASCII DATA                  @
  8798. (ASCII) :-
  8799. <HALT -1><P3>
  8800.  
  8801. *257                                             @ BINARY DATA                 @
  8802. (BINARY) :-
  8803. <HALT -1>X"<HEX P3>"
  8804.  
  8805. *258                                             @ KMT_PP_PARAM_OUT_MSG        @
  8806. <L>KMT_PP_PARAM_OUT :- <HALT -1,CASE P1 J260,J261 ESAC>
  8807.  
  8808. *259                                             @ KMT_PP_PARAM_IN_MSG         @
  8809. <L>KMT_PP_PARAM_IN :- <HALT -1,CASE P1 J260,J261 ESAC>
  8810.  
  8811. *260                                             @ NO PARAMATERS!              @
  8812. <L>NONE!
  8813.  
  8814. *261                                             @ KMT_PP_PARAMS               @
  8815. <HALT -1>MAXL  = <P2><CASE P1 ,,J262 ESAC>
  8816.  
  8817. *262
  8818. <HALT -1>TIME  = <P3><CASE P1 ,,,J263 ESAC>
  8819.  
  8820. *263
  8821. <HALT -1>NPAD  = <P4><CASE P1 ,,,,J264 ESAC>
  8822.  
  8823. *264
  8824. <HALT -1>PADC  = X"<HEX P5>"<CASE P1 ,,,,,J265 ESAC>
  8825.  
  8826. *265
  8827. <HALT -1>EOL   = X"<HEX P6>"<CASE P1 ,,,,,,J266 ESAC>
  8828.  
  8829. *266
  8830. <HALT -1>QCTL  = X"<HEX P7>"<CASE P1 ,,,,,,,J267 ESAC>
  8831.  
  8832. *267
  8833. <HALT -1>QBIN  = X"<HEX P8>"<CASE P1 ,,,,,,,,J268 ESAC>
  8834.  
  8835. *268
  8836. <HALT -1>CHKT  = "<P9>"<CASE P1 ,,,,,,,,,J269 ESAC>
  8837.  
  8838. *269
  8839. <HALT -1>REPT  = X"<HEX P10>"<CASE P1 ,,,,,,,,,,J270 ESAC>
  8840.  
  8841. *270
  8842. <HALT -1>CAPAS = X"<HEX P11>"
  8843.  
  8844.  
  8845. *@ PROTOCOL HANDLER MESSAGES                                                   @
  8846. *@ *************************
  8847.  
  8848. *300                                             @ KMT_PH_STATES_MSG           @
  8849. <L>KMT_PH_STATES :- <HALT -1,J301>
  8850.  
  8851. *301                                             @ KMT_PH_TRACE_MESSAGE        @
  8852. STATE = <P2> (<CASE    P2
  8853.                THEN    <REC_SERVER_IDLE>,
  8854.                        <REC_INIT>,
  8855.                        <REC_FILE>,
  8856.                        <REC_DATA>,
  8857.                        <SEND_INIT>,
  8858.                        <SEND_FILE>,
  8859.                        <SEND_DATA>,
  8860.                        <SEND_EOF>,
  8861.                        <SEND_BREAK>
  8862.                DEFAULT <UNKNOWN STATE>
  8863.                ESAC>),
  8864. EVENT = <P3> (<CASE    P3
  8865.                THEN    <ENTRY>,
  8866.                        <BREAK>,
  8867.                        <DATA>,
  8868.                        <ERROR>,
  8869.                        <FILE_HEADER>,
  8870.                        <GENERIC_COMMAND>,
  8871.                        <INIT_PARAM>,
  8872.                        <KERMIT_COMMAND>,
  8873.                        <NAK>,
  8874.                        <REC_INIT>,
  8875.                        <SEND_INIT>,
  8876.                        <ACK>,
  8877.                        <EOF>,
  8878.                        <CORRUPT_DATA>,
  8879.                        <PROTOCOL_ERROR>
  8880.                DEFAULT <UNKNOWN EVENT>
  8881.                ESAC>)
  8882.  
  8883.  
  8884. *@ COMMAND AND PARAMETER CHECKING @
  8885.  
  8886. *5000      @ check Kermit initial mode @
  8887.  
  8888. <CASE P1 STARTS
  8889.          <SERVER>  THEN HALT 0,
  8890.          <RECEIVE> THEN HALT 1,
  8891.          <SEND>    THEN HALT 2,
  8892.          <COMMAND> THEN HALT 3
  8893.       DEFAULT           HALT 4 @ invalid mode @
  8894.  ESAC
  8895. >
  8896.  
  8897.  
  8898. *5010      @ check Kermit command @
  8899.  
  8900. <CASE P1 STARTS
  8901.          <SERVER>     THEN HALT  0,
  8902.          <RECEIVE>    THEN HALT  1,
  8903.          <SEND>       THEN HALT  2,
  8904.          <HELP>       THEN HALT  3,
  8905.          <EXIT>       THEN HALT  4,
  8906.          <SET>        THEN HALT  5,
  8907.          <SHOW>       THEN HALT  6,
  8908.          <STATISTICS> THEN HALT  7
  8909.       DEFAULT              HALT  8 @ invalid command @
  8910.  ESAC
  8911. >
  8912.  
  8913.  
  8914. *5100      @ SET command: check for SEND or RECEIVE option @
  8915.  
  8916. <CASE P2 STARTS
  8917.          <RECEIVE> THEN HALT  0,
  8918.          <SEND>    THEN HALT  1
  8919.       DEFAULT           HALT -1 @ not present - ok though @
  8920.  ESAC
  8921. >
  8922.  
  8923.  
  8924. *5110      @ check SET parameter @
  8925.  
  8926. <CASE P2 STARTS
  8927.          <DEBUG>           THEN HALT 0,
  8928.          <DELAY>           THEN HALT 1,
  8929.          <FILE>            THEN HALT 2,
  8930.          <RETRY>           THEN HALT 3,
  8931.          <PAUSE>           THEN HALT 4
  8932.       DEFAULT                   HALT 920 @ invalid parameter @
  8933.  ESAC
  8934. >
  8935.  
  8936.  
  8937. *5120      @ check parameter following SEND or RECEIVE option @
  8938.  
  8939. <CASE P3 STARTS
  8940.          <START-OF-PACKET>  THEN HALT 0,
  8941.          <PACKET-LENGTH>    THEN HALT 1,
  8942.          <TIMEOUT>          THEN HALT 2,
  8943.          <END-OF-LINE>      THEN HALT 3,
  8944.          <PADDING>          THEN HALT 4,
  8945.          <PAD-CHARACTER>    THEN HALT 5,
  8946.          <QUOTE>            THEN HALT 6,
  8947.          <EIGHTH-BIT-PREFIX> THEN HALT 7
  8948.       DEFAULT                    HALT 921 @ invalid parameter @
  8949.  ESAC
  8950. >
  8951.  
  8952.  
  8953. *5130      @ check DEBUG option @
  8954.  
  8955. <CASE P3 STARTS
  8956.          <ALL>      THEN HALT 0,
  8957.          <FILE>     THEN HALT 1,
  8958.          <PROTOCOL> THEN HALT 2,
  8959.          <PACKET>   THEN HALT 3,
  8960.          <DEVICE>   THEN HALT 4
  8961.       DEFAULT            HALT 921 @ invalid DEBUG parameter @
  8962.  ESAC
  8963. >
  8964.  
  8965.  
  8966. *5140      @ check FILE option @
  8967.  
  8968. <CASE P3 STARTS
  8969.          <TYPE>       THEN CASE P4 STARTS
  8970.                                    <EBCDIC>       THEN HALT 0,
  8971.                                    <ASCII>        THEN HALT 1,
  8972.                                    <BINARY>       THEN HALT 2
  8973.                                 DEFAULT                HALT 931
  8974.                            ESAC,
  8975.  
  8976.          <NAMING>     THEN CASE P4 STARTS
  8977.                                    <UNTRANSLATED> THEN HALT 3,
  8978.                                    <NORMAL-FORM>  THEN HALT 4
  8979.                                 DEFAULT                HALT 931
  8980.                            ESAC,
  8981.  
  8982.          <OVERWRITE>  THEN CASE P4 STARTS
  8983.                                    <OFF>          THEN HALT 5,
  8984.                                    <ON>           THEN HALT 6
  8985.                                 DEFAULT                HALT 931
  8986.                            ESAC,
  8987.  
  8988.          <INCOMPLETE> THEN CASE P4 STARTS
  8989.                                    <DISCARD>      THEN HALT 7,
  8990.                                    <KEEP>         THEN HALT 8
  8991.                                 DEFAULT                HALT 931
  8992.                            ESAC
  8993.       DEFAULT           HALT 921 @ invalid SET FILE argument @
  8994.  ESAC
  8995. >
  8996.  
  8997.  
  8998. *5150      @ check OFF/ON option @
  8999.  
  9000. <CASE P4 STARTS
  9001.          <OFF> THEN HALT 0,
  9002.          <ON>  THEN HALT 1
  9003.      DEFAULT        HALT 931
  9004.  ESAC
  9005. >
  9006.  
  9007.  
  9008.  
  9009.  
  9010. *@ RESULTCODES MESSAGE TEXTS                                                   @
  9011. *@ *************************                                                   @
  9012.  
  9013.  
  9014. *@ GENERAL RESULTCODES                                                         @
  9015. *@ *******************                                                         @
  9016.  
  9017.  
  9018. *@ SUPPORT PROCEDURES RESULTCODES                                              @
  9019. *@ ******************************                                              @
  9020.  
  9021. *80050                                           @ KMT_SP_NOT_HEX              @
  9022. NON-HEXADECIMAL CHARACTERS FOUND IN STRING
  9023.  
  9024. *80051                                           @ KMT_SP_STRING_TOO_BIG       @
  9025. KMT_SP_STRING_TOO_BIG
  9026.  
  9027.  
  9028. *@ ERROR HANDLER RESULTCODES                                                   @
  9029. *@ *************************                                                   @
  9030.  
  9031. *80100                                           @ KMT_EH_ERROR_MSG            @
  9032. <P2>
  9033.  
  9034. *80101                                           @ KMT_EH_SOFTWARE_ERROR       @
  9035. AN UNRECOVERABLE SOFTWARE ERROR HAS OCCURED
  9036.  
  9037. *80102                                           @ KMT_EH_ICL_RESULT           @
  9038. <>**** RC = <P2> RETURNED FROM PROCEDURE <CASE    P1
  9039.                                           THEN    <*UNKNOWN*>,
  9040.                                                   <<P3>>
  9041.                                           DEFAULT <<P3, HALT -1, P4>>
  9042.                                           ESAC>
  9043.  
  9044.  
  9045. *@ DEVICE HANDLER RESULTCODES                                                  @
  9046. *@ **************************                                                  @
  9047.  
  9048. *80150                                           @ KMT_DH_UNEXPECTED_BREAK_IN  @
  9049. <>**** UNEXPECTED BREAK_IN EVENT ****
  9050.  
  9051. *80151                                           @ KMT_DH_UNEXPECTED_EVENT     @
  9052. <>**** UNEXPECTED EVENT ****
  9053.  
  9054. *80152                                           @ KMT_DH_DATA_AVAILABLE       @
  9055. KMT_DH_DATA_AVAILABLE
  9056.  
  9057. *80153                                           @ KMT_DH_QUEUE_EMPTY          @
  9058. KMT_DH_QUEUE_EMPTY
  9059.  
  9060.  
  9061. *@ FILE HANDLER RESULTCODES                                                    @
  9062. *@ ************************                                                    @
  9063.  
  9064. *80200                                           @ KMT_FH_RECORD_TOO_BIG       @
  9065. <>**** MAXIMUM RECORD SIZE EXCEEDED, SIZE = <P2>, MAX SIZE = <P3>
  9066.  
  9067.  
  9068. *@ PACKET PROCESSOR RESULTCODES                                                @
  9069. *@ ****************************                                                @
  9070.  
  9071. *80250                                           @ KMT_PP_NO_INPUT_PACKET      @
  9072. KMT_PP_NO_INPUT_PACKET
  9073.  
  9074. *80251                                        @ KMT_PP_UNSUPPORTED_PACKET_TYPE @
  9075. KMT_PP_UNSUPPORTED_PACKET_TYPE
  9076.  
  9077. *80252                                           @ KMT_PP_INVALID_PACKET_TYPE  @
  9078. KMT_PP_INVALID_PACKET_TYPE
  9079.  
  9080. *80253                                           @ KMT_PP_INVALID_CHACKSUM     @
  9081. KMT_PP_INVALID_CHECKSUM
  9082.  
  9083. *80254                                          @ KMT_PP_INVALID_PACKET_LENGTH @
  9084. KMT_PP_INVALID_PACKET_LENGTH
  9085.  
  9086. *80255                                           @ KMT_PP_RECORD_TOO_BIG       @
  9087. <>**** MAXIMUM RECORD SIZE EXCEEDED, MAX SIZE = <P2>
  9088.  
  9089. *80256                                           @ KMT_PP_STRING_TOO_BIG       @
  9090. <>**** MAXIMUM MESSAGE SIZE EXCEEDED, SIZE = <P2>, MAX SIZE = <P3>
  9091.  
  9092. *80257                                           @ KMT_PP_INVALID_CONFIG_PARAM @
  9093. INVALID CONFIGURATION PARAMETER
  9094. <CASE P2 <"MARK">,<"NPAD">,<"PADC">,<"EOL">,<"QCTL">,<"QBIN">,<> ESAC>,
  9095. VALUE = X"<HEX P3>"
  9096. <CASE P1 EQUALS <3>
  9097.  THEN    JP4
  9098.  DEFAULT <>
  9099.  ESAC>
  9100.  
  9101. *80258                                           @ KMT_PP_QBIN_AND_QCTL_EQUAL  @
  9102. THE CONTROL-QUOTE AND EIGHTH-BIT-PREFIX CHARACTERS ARE EQUAL <HALT -1>
  9103.      QBIN = X"<HEX P2>", REMOTE QCTL = X"<HEX P3>", LOCAL QCTL = X"<HEX P4>"
  9104.  
  9105. *80259                                           @ KMT_PP_QCTL_WARNING         @
  9106. <>**** WARNING THE REMOTE QCTL CHARACTER X"<HEX P2>" WILL RESULT IN THE
  9107. CORRUPTION OF ANY X"<HEX P3>" CHARACTERS TO X"<HEX P2>"
  9108.  
  9109. *80260                                           @ KMT_PP_QBIN_REJECTED        @
  9110. THE EIGHTH-BIT PREFIXING HAS BEEN REJECTED BY THE REMOTE SYSTEM
  9111.  
  9112. *80270                                           @ INVALID CONFIG PARAM REASONS@
  9113. (less than minimum packet length)
  9114.  
  9115. *80271
  9116. (too many PAD characters requested)
  9117.  
  9118. *80272
  9119. (not a control character)
  9120.  
  9121. *80273
  9122. (not a printable character)
  9123.  
  9124. *80274
  9125. (character not acceptable for VME I/O)
  9126.  
  9127. *80275
  9128. (not a valid character)
  9129.  
  9130. *80276
  9131. (same as START-OF-PACKET character)
  9132.  
  9133. *80277
  9134. (same as END-OF-LINE character)
  9135.  
  9136.  
  9137. *@ VME COMMAND ERRORS @
  9138.  
  9139. *85000     @ filenames not reqd @
  9140.  
  9141. <L>**** File names not required with <P1> option.
  9142.  
  9143. *85001     @ rem_file not reqd for Receive @
  9144.  
  9145. <L>**** Remote filename not required with Receive option.
  9146.  
  9147. *85010     @ vme_file mandatory for Send @
  9148.  
  9149. <L>**** Filename must be specified with Send option.
  9150.  
  9151. *85020     @ invalid option @
  9152.  
  9153. <L>**** <P1> is not a valid VME Kermit option.
  9154.  
  9155. *85030      @ terminated with fatal error @
  9156.  
  9157. <L>**** VME Kermit terminated due to fatal error.<L>
  9158.  
  9159. *85031     @ logging out vm on exit @
  9160.  
  9161. <L>Logging out.....!<L>
  9162.  
  9163. *85032     @ terminate with a new line @
  9164.  
  9165. <S1>
  9166.  
  9167. *@ USER INTERFACE (KMT_UI) MESSAGES @
  9168.  
  9169. *85820
  9170.  
  9171. <L>TRANSFER STATISTICS <HALT -1>
  9172. <S5>Packets in         <P1,TAB40>Packets out         <P2,HALT -1>
  9173. <S5>Retries            <P3,TAB40>Timeouts            <P4,HALT -1>
  9174. <S5>Records read       <P5,TAB40>Records written     <P6,HALT -1>
  9175.  
  9176. *85821
  9177.  
  9178. <L>GENERAL PARAMETERS <HALT -1>
  9179. <S5>Send delay (secs)  <P1,TAB40>TX pause (10th sec) <P2,HALT -1>
  9180. <S5>Maximum retries    <P3,HALT -1>
  9181.  
  9182. *85822
  9183.  
  9184. RECEIVE PARAMETERS <J85824>
  9185.  
  9186. *85823
  9187.  
  9188. SEND PARAMETERS <J85824>
  9189.  
  9190. *85824
  9191.  
  9192. <HALT -1>
  9193. <S5>Packet start       X<HEX P1,TAB40>End of line         X<HEX P6,HALT -1>
  9194. <S5>Packet length      <P2,     TAB40>Timeout (secs)      <P3,HALT -1>
  9195. <S5>Padding            <P4,     TAB40>Pad character       X<HEX P5,HALT -1>
  9196. <S5>Quote character    <P7,     TAB40>8th bit prefix      <P8,HALT -1>
  9197.  
  9198. *85825
  9199.  
  9200. FILE PARAMETERS <HALT -1>
  9201. <S5>File type          <CASE P1 <EBCDIC>,<ASCII>,<BINARY>,<UNKNOWN> ESAC>
  9202. <TAB40>Overwrite option    <CASE     P2 EQUALS
  9203.                                         <1> THEN <OFF>,
  9204.                                         <2> THEN <ON>
  9205.                                         DEFAULT             <UNKNOWN>
  9206.                                         ESAC,HALT -1>
  9207. <S5>Incomplete         <CASE P3 <DISCARD>,<KEEP> ESAC>
  9208. <TAB40>Naming              <CASE P4 <UNTRANSLAED>,<NORMAL-FORM> ESAC,HALT -1>
  9209.  
  9210. *85826
  9211.  
  9212. TERMINAL PARAMETERS <HALT -1>
  9213. <S5>Input length       <P1,TAB40>Output length       <P2,HALT -1>
  9214.  
  9215. *85827
  9216.  
  9217. DEBUGGING PARAMETERS <HALT -1>
  9218. <S5>File               <CASE P1 <OFF>,<ON> ESAC>
  9219. <TAB40>Protocol            <CASE P2 <OFF>,<ON> ESAC,HALT -1>
  9220. <S5>Packet             <CASE P3 <OFF>,<ON> ESAC>
  9221. <TAB40>Device              <CASE P4 <OFF>,<ON> ESAC,HALT -1>
  9222.  
  9223.  
  9224. *@ USER INTERFACE (KMT_UI) ERROR MESSAGES @
  9225.  
  9226. *85910     @ invalid command @
  9227.  
  9228. <L>**** <P1> is not a valid VME Kermit command.
  9229.  
  9230.  
  9231. *85920     @ invalid parameter P2 @
  9232.  
  9233. <L>**** <P2> is not a valid <P1> command parameter.
  9234.  
  9235. *85921     @ invalid parameter P3 @
  9236.  
  9237. <L>**** <P3> is not a valid <P1> <P2> command parameter.
  9238.  
  9239. *85930     @ invalid option P3 @
  9240.  
  9241. <L>**** <P3> is not a valid <P1> <P2> command option.
  9242.  
  9243. *85931     @ invalid option P4 @
  9244.  
  9245. <L>**** <P4> is not a valid <P1> <P2> <P3> option.
  9246.  
  9247. *85932     @ command parameter missing @
  9248.  
  9249. <L>**** Command parameter missing.
  9250.  
  9251. *85933     @ QUOTE and EIGHTH-BIT-PREFIX characters equal @
  9252.  
  9253. <L>**** QUOTE and EIGHTH-BIT-PREFIX characters equal.
  9254.  
  9255. *85934     @ Padding and packet length combined exceeds device length @
  9256.  
  9257. <L>**** Padding plus packet length exceeds the device line length.
  9258.  
  9259. *85935     @ START-OF-PACKET/END-OF-LINE/PADC not a control character @
  9260.  
  9261. <L>**** <P1> <P2> <P3> parameter must be in range 0 - 31 or 127.
  9262.  
  9263. *85936     @ parameter not acceptable for VME I/O @
  9264.  
  9265. <L>**** <P2> <P3> parameter not acceptable for VME I/O.
  9266.  
  9267. *85937     @ conflict with another character @
  9268.  
  9269. <L>**** <P2> <P3> parameter conflicts with <P2>
  9270. <CASE P5 <START-OF-PACKET>,<END-OF-LINE>,<PAD>,<> ESAC> character.
  9271.  
  9272.  
  9273.  
  9274. *@ PROTOCOL HANDLER MESSAGES @
  9275.  
  9276. *87000     @ transfer cancelled by remote Kermit @
  9277.  
  9278. <L>File transfer cancelled by remote Kermit.
  9279.  
  9280. *87001     @ filename used by remote Kermit for sent file @
  9281.  
  9282. <L>File <P1> sent as <P2> to remote Kermit.
  9283.  
  9284. *87002     @ filename used by local Kermit for receive file @
  9285.  
  9286. <L>File <P1> stored as <P2> on VME Kermit.
  9287.  
  9288. *87010     @ error packet received, log details @
  9289.  
  9290. <L>Remote Kermit error: <HALT -1>
  9291. <P1>
  9292.  
  9293.  
  9294. *@ PROTOCOL HANDLER ERRORS @
  9295.  
  9296. *89000     @ unexpected pkt_no @
  9297.  
  9298. Unexpected packet number.
  9299.  
  9300. *89001     @ unexpected pkt_type @
  9301.  
  9302. Unexpected packet type.
  9303.  
  9304. *89010     @ Generic command failed @
  9305.  
  9306. Generic command "<P1>" failed.
  9307.  
  9308. *89011     @ Generic command not implemented/recognised @
  9309.  
  9310. Generic command "<P1>" not implemented.
  9311.  
  9312. *89020     @ Kermit command failed in Server mode @
  9313.  
  9314. Kermit command "<P1>" failed in Server mode.
  9315.  
  9316. *89021     @ Kermit command not implemented in Server mode @
  9317.  
  9318. Kermit command "<P1>" not implemented in Server mode.
  9319.  
  9320. *89022     @ No command in Kermit command packet @
  9321.  
  9322. No command found in Kermit command packet.
  9323.  
  9324. *89030     @ No filename in Rec_Init pkt @
  9325.  
  9326. No filename in Receive Init packet.
  9327.  
  9328. *89031     @ No filename in File_Hdr pkt @
  9329.  
  9330. No filename in File Header packet.
  9331.  
  9332. *89040     @ Unable to open Rec file @
  9333.  
  9334. Unable to open Receive file.
  9335.  
  9336. *89041     @ Unable to open Send file @
  9337.  
  9338. Unable to open Send file.
  9339.  
  9340. *89042     @ Unable to close Rec file @
  9341.  
  9342. Unable to close file received.
  9343.  
  9344. *89043     @ Unable to close Send file @
  9345.  
  9346. Unable to close Send file.
  9347.  
  9348. *89044     @ Unable to save Rec file @
  9349.  
  9350. Unable to save file received.
  9351.  
  9352. *89046     @ error writing to file @
  9353.  
  9354. Unable to write data to file.
  9355.  
  9356. *89047     @ error reading from file @
  9357.  
  9358. Unable to read data from file.
  9359.  
  9360. *89050     @ Retry count exceeded max_try.
  9361.  
  9362. Maximum retries exceeded.
  9363.  
  9364. *89060     @ Fatal error in Get_Packet @
  9365.  
  9366. Fatal I/O error: unable to read packet.
  9367.  
  9368. *89061     @ Fatal error in Send_Packet @
  9369.  
  9370. Fatal I/O error: unable to send packet.
  9371.  
  9372. *89070     @ their parameters unacceptable @
  9373.  
  9374. Initial parameters unacceptable.
  9375.  
  9376.  
  9377. *END                                   @ KMT_SP_MTUP_MODULE                    @
  9378.