home *** CD-ROM | disk | FTP | other *** search
/ Columbia Kermit / kermit.zip / iclvme2900 / kmt_dh_module < prev    next >
Text File  |  2020-01-01  |  47KB  |  1,375 lines

  1. MODULE KMT_DH_MODULE;
  2.  
  3. @******************************************************************************@
  4. @*                                                                            *@
  5. @* Mode definitions                                                           *@
  6. @*                                                                            *@
  7. @******************************************************************************@
  8.  
  9. MODE
  10. PFI_REPORTS IS LONG WORD STRUCT (
  11.    4-BIT  ALWAYS_ZERO,
  12.    12-BIT USER_FILE_IDENT,
  13.           TRANSFER_IDENTIFIER,
  14.    4-BIT  REASON,
  15.    BYTE   QUALIFIER_1,
  16.           QUALIFIER_2,
  17.    2-BYTE CHARACTER_OUTPUT);
  18.  
  19. MODE
  20. PFI_FLAGS_1S IS BYTE STRUCT (
  21.    BIT MEDIUM_LOW,
  22.        DATA_LOST,
  23.        FORMAT_DISTURBED,
  24.        PERMANENTLY_UNAVAILABLE,
  25.        TEMPORARILY_UNAVAILABLE,
  26.        NOT_IMPLEMENTED,
  27.        GENERAL_FILE_FREEZE,
  28.        CHARACTER_OUTPUT_VALID);
  29.  
  30. MODE
  31. PFI_FLAGS_2S IS BYTE STRUCT (
  32.    BIT   PROPERTIES_LOST,
  33.          LONG_LINE,
  34.          ILLEGAL_DATA,
  35.          FILE_TIMEOUT,
  36.    4-BIT SPARE);
  37.  
  38. MODE
  39. PFI_INPUT_FLAGS IS 2-BYTE STRUCT (
  40.    BIT    QUALIFIED,
  41.    15-BIT SPARE);
  42.  
  43. MODE
  44. PFI_INPUT_RETURNS IS WORD STRUCT (
  45.    PFI_INPUT_FLAGS INPUT_FLAGS,
  46.    2-BYTE          DATA_LENGTH);
  47.  
  48. MODE
  49. PFI_QUEUE_CONTROLS IS WORD STRUCT (
  50.    BIT    BREAK_IN,
  51.           DATA_LOST,
  52.           FORMAT_DISTURBED,
  53.           BREAK_IN_ACK,
  54.           GENERAL_FILE_FREEZE,
  55.           RESET,
  56.    26-BIT RESERVED);
  57.  
  58. MODE
  59. PFI_OUTPUT_CONTROLS IS WORD STRUCT (
  60.    BIT    EXPIDITED_DATA,
  61.           REPORT_NORMAL_TERMINATION,
  62.           PROMPT,
  63.           CANCEL_OUTSTANDING_PROMPT,
  64.           OVERRIDE_MY_READ_INTEREST,
  65.           SPARE_2,
  66.           QUALIFIED,
  67.           SEQUENCE,
  68.    BYTE   COMMAND,
  69.    2-BYTE SPARE5);
  70.  
  71. MODE
  72. PFI_FILE_FLAGS IS WORD STRUCT (
  73.    BIT    FORMAT_SENSITIVE,
  74.           ACTION_KEY_IS_DATA,
  75.           AUTOPAGING,
  76.           AUTOMATIC_NEW_LINE,
  77.           BADGE_REQUIRED,
  78.           PAUSING_REQUIRED,
  79.           INHIBIT_SPACE_TRUNCATION,
  80.           INHIBIT_SPACE_COMPRESSION,
  81.           FE_AT_START_OF_RECORD,
  82.           REJECT_ILLEGAL_DATA,
  83.           ALLOW_COMPRESSION,
  84.    21-BIT RESERVED);
  85.  
  86. MODE
  87. PFI_PARAMETER_VALUES IS ANY (
  88.    INT             INT_VALUE,
  89.    PFI_FILE_FLAGS  FILE_FLAGS,
  90.    REF REF () BYTE RRRB_VALUE,
  91.    REF () BYTE     STRING_VALUE);
  92.  
  93. MODE
  94. PFI_PARAMETER_PAIRS IS STRUCT (
  95.    WORD                 TYPE,
  96.    PFI_PARAMETER_VALUES VALUE);
  97.  
  98. MODE
  99. KMT_TRACE_FLAGS_S IS WORD STRUCT (
  100.    BIT    PH_TRACING,
  101.           PP_TRACING,
  102.           FH_TRACING,
  103.           DH_TRACING,
  104.    28-BIT SPARE);
  105.  
  106. MODE
  107. KMT_DH_DEVICE_DETAILS_S IS STRUCT (
  108.    BOOL FILE_OPEN,
  109.    WORD MAX_INPUT_LENGTH,
  110.         MAX_OUTPUT_LENGTH,
  111.         INPUT_PARITY,
  112.         OUTPUT_PARITY,
  113.         PAUSE);
  114.  
  115. MODE
  116. KMT_DH_FILE_DETAILS_S IS STRUCT (
  117.    LONG INT FILE_CURRENCY,
  118.    WORD     PFM_CURRENCY,
  119.             CONNECTION_CURRENCY,
  120.             TIMER_CHANNEL,
  121.    BOOL     READ_INTEREST,
  122.    (2) WORD EVENT_LIST,
  123.    BOOL     LONG_SUSPEND);
  124.  
  125. MODE
  126. KMT_PP_CONFG_PARAMS_S IS STRUCT (
  127.    BYTE   MARK,
  128.           MAXL,
  129.           TIME,
  130.           NPAD,
  131.           PADC,
  132.           EOL,
  133.           QCTL,
  134.           QBIN,
  135.           CHKT,
  136.           REPT,
  137.    4-BYTE CAPAS);
  138.  
  139. MODE
  140. KMT_MTM_VALUES IS ANY (
  141.    LONG WORD          LW_VALUE,
  142.    LONG INT           LI_VALUE,
  143.    REF WORD           RW_VALUE,
  144.    REF INT            RI_VALUE,
  145.    REF LONG WORD      RLW_VALUE,
  146.    REF LONG INT       RLI_VALUE,
  147.    REF () BYTE        RVB_VALUE,
  148.    REF () REF () BYTE RVRVB_VALUE);
  149.  
  150. ***PAGE
  151.  
  152. @******************************************************************************@
  153. @*                                                                            *@
  154. @* External procedure references                                              *@
  155. @*                                                                            *@
  156. @******************************************************************************@
  157.  
  158. EXT (<PREFIX "ICLCTM">)
  159. PROC
  160.    (LONG WORD,                                   @ FILE_CURRENCY               @
  161.     REF () BYTE,                                 @ FILE_LOCAL_NAME             @
  162.     REF () BYTE,                                 @ FULL_FILE_NAME              @
  163.     REF () WORD,                                 @ PROPERTIES                  @
  164.     RESPONSE                                     @ RESPONSE                    @
  165.    )                                   CTM_READ_DESC;
  166.  
  167. EXT (<PREFIX "ICLCTM">)
  168. PROC
  169.    (WORD,                                        @ TIME_INTERVAL               @
  170.     RESPONSE                                     @ RESPONSE                    @
  171.    )                                   CTM_WAIT_TIME;
  172.  
  173. EXT (<PREFIX "ICLCTM">)
  174. PROC
  175.    (REF () BYTE,                                 @ NAME                        @
  176.     REF LONG INT,                                @ LNAME                       @
  177.     REF () BYTE,                                 @ ACCESS                      @
  178.     REF () BYTE,                                 @ LEVEL                       @
  179.     REF () BYTE,                                 @ LOCK                        @
  180.     REF () BYTE,                                 @ REUSE                       @
  181.     LONG INT,                                    @ STARTSECT                   @
  182.     LONG INT,                                    @ ENDSECT                     @
  183.     LONG INT,                                    @ LOAD                        @
  184.     REF () REF () BYTE,                          @ DNAMES                      @
  185.     RESPONSE                                     @ RESPONSE                    @
  186.    )                                   ASSIGN_FILE;
  187.  
  188. EXT (<PREFIX "ICLCTM">)
  189. PROC
  190.    (INT,                                         @ EVENT_NODE_CURRENCY         @
  191.     BYTE,                                        @ ACCESS                      @
  192.     BYTE,                                        @ SHARABILITY                 @
  193.     REF WORD,                                    @ EVENT_CURRENCY              @
  194.     LONG WORD,                                   @ INTERRUPT_PROC              @
  195.     WORD,                                        @ SPARE                       @
  196.     RESPONSE                                     @ RESPONSE                    @
  197.    )                                   CONNECT_EVENT;
  198.  
  199. EXT (<PREFIX "ICLCTM">)
  200. PROC
  201.    (WORD,                                        @ EVENT_CURRENCY              @
  202.     LONG WORD,                                   @ MESSAGE                     @
  203.     INT,                                         @ REPLY                       @
  204.     RESPONSE                                     @ RESPONSE                    @
  205.    )                                   READ_EVENT;
  206.  
  207. EXT (<PREFIX "ICLCTM">)
  208. PROC
  209.    (LONG WORD,                                   @ FILE_CURRENCY               @
  210.     REF WORD,                                    @ PFM_CURRENCY                @
  211.     REF WORD,                                    @ CONNECTION_CURRENCY         @
  212.     REF () BYTE,                                 @ DETAILS_SUPPLIED            @
  213.     REF () BYTE,                                 @ DETAILS_REQUIRED            @
  214.     REF () BYTE,                                 @ DETAILS_RETURNED            @
  215.     RESPONSE                                     @ RESPONSE                    @
  216.    )                                   BI_CONNECT_FILE;
  217.  
  218. EXT (<PREFIX "ICLCTM">)
  219. PROC
  220.    (WORD,                                        @ CONNECTION_CURRENCY         @
  221.     REF () BYTE,                                 @ DETAILS_SUPPLIED            @
  222.     REF () BYTE,                                 @ DETAILS_REQUIRED            @
  223.     REF () BYTE,                                 @ DETAILS_RETURNED            @
  224.     RESPONSE                                     @ RESPONSE                    @
  225.    )                                   BI_MODIFY_CONNECTION;
  226.  
  227. EXT (<PREFIX "ICLCTM">)
  228. PROC
  229.    (REF () WORD,                                 @ EVENT_LIST                  @
  230.     REF WORD,                                    @ EVENT_CURRENCY              @
  231.     REF LONG WORD,                               @ MESSAGE                     @
  232.     BOOL,                                        @ LONG_SUSPEND                @
  233.     RESPONSE                                     @ RESPONSE                    @
  234.    )                                   WAIT_FOR_EVENTS;
  235.  
  236. EXT (<PREFIX "ICLCTM">)
  237. PROC
  238.    (WORD,                                        @ EVENT_CURRENCY              @
  239.     REF WORD,                                    @ TIMER_CHANNEL               @
  240.     RESPONSE                                     @ RESPONSE                    @
  241.    )                                   CREATE_TIMER_CHANNEL;
  242.  
  243. EXT (<PREFIX "ICLCTM">)
  244. PROC
  245.    (WORD,                                        @ TIMER_CHANNEL               @
  246.     LONG WORD,                                   @ MESSAGE                     @
  247.     LONG INT,                                    @ TIME                        @
  248.     BOOL,                                        @ REAL_TIME                   @
  249.     BOOL,                                        @ PERIODIC                    @
  250.     RESPONSE)                                    @ RESPONSE                    @
  251.                                        ESTABLISH_TIMER_NOTIFICATION;
  252.  
  253. EXT (<PREFIX "ICLCTM">)
  254. PROC
  255.    (WORD,                                        @ TIMER_CHANNEL               @
  256.     RESPONSE                                     @ RESPONSE                    @
  257.    )                                   CANCEL_TIMER_NOTIFICATION;
  258.  
  259. EXT (<PREFIX "ICLCTM">)
  260. PROC
  261.    (WORD,                                        @ PFM_CURRENCY                @
  262.     WORD,                                        @ START_OF_INPUT              @
  263.     REF () BYTE,                                 @ BUFFER                      @
  264.     REF PFI_INPUT_RETURNS,                       @ INPUT_RETURN                @
  265.     RESPONSE                                     @ RESPONSE                    @
  266.    )                                   DH_INPUT;
  267.  
  268. EXT (<PREFIX "ICLCTM">)
  269. PROC
  270.    (WORD,                                        @ PFM_CURRENCY                @
  271.     WORD,                                        @ TRANSFER_IDENTIFIER         @
  272.     REF () BYTE,                                 @ OUTPUT_DATA                 @
  273.     PFI_OUTPUT_CONTROLS,                         @ CONTROL                     @
  274.     RESPONSE                                     @ RESPONSE                    @
  275.    )                                   DH_OUTPUT;
  276.  
  277. EXT (<PREFIX "ICLCTM">)
  278. PROC
  279.    (WORD,                                        @ PFM_CURRENCY                @
  280.     REF () PFI_PARAMETER_PAIRS,                  @ PARAMS                      @
  281.     RESPONSE                                     @ RESPONSE                    @
  282.    )                                   DH_DEFINE_FILE_PROPERTIES;
  283.  
  284. EXT (<PREFIX "ICLCTM">)
  285. PROC
  286.    (WORD,                                        @ PFM_CURRENCY                @
  287.     WORD,                                        @ QUEUE_ACTION                @
  288.     PFI_QUEUE_CONTROLS,                          @ CONTROL                     @
  289.     REF () BYTE,                                 @ ADDITIONAL_DATA             @
  290.     RESPONSE                                     @ RESPONSE                    @
  291.    )                                   DH_DO_QUEUE_ACTION;
  292.  
  293. EXT (<PREFIX "ICLCTM">)
  294. PROC
  295.    (WORD,                                        @ PFM_CURRENCY                @
  296.     REF () BYTE,                                 @ DETAILS_REQUIRED            @
  297.     REF () BYTE,                                 @ DETAILS_AREA                @
  298.     REF WORD,                                    @ DETAILS_LENGTH_AREA         @
  299.     RESPONSE                                     @ RESPONSE                    @
  300.    )                                   DH_GIVE_FILE_DETAILS;
  301.  
  302. EXT
  303. PROC
  304.    (INT,                                         @ TYPE                        @
  305.     REF () KMT_MTM_VALUES                        @ PARAMS                      @
  306.    )                                   KMT_SP_LOG_TRACE_MESSAGE;
  307.  
  308. EXT
  309. PROC
  310.    (INT,                                         @ RESULT_CODE                 @
  311.     WORD,                                        @ DESTINATION                 @
  312.     REF () KMT_MTM_VALUES,                       @ PARAMS                      @
  313.     LONG WORD,                                   @ PE_CONTINGENCY_MESSAGE      @
  314.     BOOL,                                        @ DUMP                        @
  315.     BOOL                                         @ UNRECOVERABLE               @
  316.    )                                   KMT_EH_LOG_ERROR;
  317.  
  318. ***PAGE
  319.  
  320. @******************************************************************************@
  321. @*                                                                            *@
  322. @* External data references                                                   *@
  323. @*                                                                            *@
  324. @******************************************************************************@
  325.  
  326. @ Constants: @
  327. @ ********** @
  328.  
  329. ***LINES(4)
  330.  
  331. @ Variables: @
  332. @ ********** @
  333.  
  334. EXT (<CASCADE>)
  335. REF KMT_TRACE_FLAGS_S KMT_TRACE_FLAGS;
  336.  
  337. EXT (<CASCADE>)
  338. REF KMT_DH_DEVICE_DETAILS_S KMT_DH_DEVICE_DETAILS;
  339.  
  340. EXT (<CASCADE>)
  341. REF KMT_PP_CONFG_PARAMS_S KMT_PP_REMOTE_CONFG_PARAMS;
  342.  
  343. EXT (<CASCADE>)
  344. REF BOOL DELAY_TIMER;
  345.  
  346. EXT (<CASCADE>)
  347. REF WORD DELAY;
  348.  
  349. ***LINES(4)
  350.  
  351. @ Results: @
  352. @ ******** @
  353.  
  354. ***LINES(4)
  355.  
  356. ***PAGE
  357.  
  358. @******************************************************************************@
  359. @*                                                                            *@
  360. @* Static data declarations                                                   *@
  361. @*                                                                            *@
  362. @******************************************************************************@
  363.  
  364. @ Constants: @
  365. @ ********** @
  366.  
  367. ***LINES(4)
  368.  
  369. @ Variables: @
  370. @ ********** @
  371.  
  372. STATIC
  373. KMT_DH_FILE_DETAILS_S KMT_DH_FILE_DETAILS;
  374.  
  375. ***PAGE
  376.  
  377. @******************************************************************************@
  378. @*                                                                            *@
  379. @* Procedure declarations                                                     *@
  380. @*                                                                            *@
  381. @******************************************************************************@
  382.  
  383. STATIC
  384. PROC
  385.    KMT_DH_PROCESS_RESPONSE IS (
  386.    INT      RESULTCODE,
  387.    BOOL     PROMPT,
  388.    REF BOOL RETRY,
  389.    RESPONSE RESULT):
  390.  
  391. @******************************************************************************@
  392. @*                                                                            *@
  393. @* This procedure is used to process resultcodes returned from COSMAN and to  *@
  394. @* handle CDH events.                                                         *@
  395. @* RETRY is set TRUE if a recoverable I/O error occurs indicating that the    *@
  396. @* I/O operation should be repeated.                                          *@
  397. @* PROMPT should be set TRUE if this is an output request and read interest   *@
  398. @* is required.                                                               *@
  399. @*                                                                            *@
  400. @******************************************************************************@
  401.  
  402. BEGIN
  403.    INT PFI_REQUEST_ACCEPTED        IS -31008,
  404.        PFI_FILE_FROZEN             IS -38982,
  405.        PFI_DELAYED_TRANSFER        IS -38983,
  406.        PFI_FILE_UNAVAILABLE        IS 30978,
  407.        PFI_OVERLOAD                IS 37560,
  408.        PFI_TEMPORARILY_UNAVAILABLE IS 37561,
  409.        PFI_TIMED_OUT               IS 39854;
  410.  
  411.    INT KMT_DH_EVENT_MSG          IS 152,
  412.        KMT_DH_UNEXPECTED_BREAKIN IS 80150,
  413.        KMT_DH_UNEXPECTED_EVENT   IS 80151,
  414.        KMT_DH_INPUT_AVAILABLE    IS -80152,
  415.        KMT_DH_QUEUE_EMPTY        IS -80153;
  416.  
  417.    REF BOOL READ_INTEREST IS KMT_DH_FILE_DETAILS.READ_INTEREST;
  418.  
  419.    BOOL TRACING IS KMT_TRACE_FLAGS.DH_TRACING;
  420.  
  421.    UNLESS
  422.       READ_INTEREST
  423.    OR
  424.       RESULTCODE EQ PFI_REQUEST_ACCEPTED
  425.    OR
  426.       RESULTCODE EQ PFI_FILE_FROZEN
  427.    OR
  428.       RESULTCODE EQ PFI_DELAYED_TRANSFER
  429.    OR
  430.       RESULTCODE EQ PFI_OVERLOAD
  431.    OR
  432.       RESULTCODE EQ PFI_TEMPORARILY_UNAVAILABLE
  433.  
  434.    THEN                                          @ Unrecoverable I/O error or  @
  435.                                                  @ REPORT NORMAL TERMINATION   @
  436.                                                  @ not set                     @
  437.       READ_INTEREST := FALSE;
  438.       RESULT := RESULTCODE
  439.  
  440.    ELSE
  441.       REF () WORD EVENT_LIST IS KMT_DH_FILE_DETAILS.EVENT_LIST;
  442.  
  443.       BOOL LONG_SUSPEND IS KMT_DH_FILE_DETAILS.LONG_SUSPEND;
  444.  
  445.       PFI_REPORTS EVENT_MESSAGE;
  446.  
  447.       REF PFI_FLAGS_1S QUALIFIER_1 IS EVENT_MESSAGE.QUALIFIER_1;
  448.  
  449.       REF PFI_FLAGS_2S QUALIFIER_2 IS EVENT_MESSAGE.QUALIFIER_2;
  450.  
  451.       REF WORD PFM_CURRENCY IS KMT_DH_FILE_DETAILS.PFM_CURRENCY;
  452.  
  453.       READ_INTEREST := FALSE;
  454.       RESULT := 0;
  455.  
  456.       WHILE                                      @ Process CDH event           @
  457.         (
  458.          INT RC_DISCARDED;
  459.  
  460.          WORD EVENT_CURRENCY;
  461.  
  462.          BOOL SUSPEND := FALSE;
  463.  
  464.          RETRY := FALSE;
  465.          WAIT_FOR_EVENTS (EVENT_LIST(SIZE 1),
  466.                           EVENT_CURRENCY,
  467.                           EVENT_MESSAGE,
  468.                           LONG_SUSPEND,
  469.                           RC_DISCARDED);
  470.  
  471.          IF
  472.             TRACING
  473.  
  474.          THEN (<RARELY>)
  475.            (
  476.             () KMT_MTM_VALUES PARAMS := DISPLAY(EVENT_MESSAGE
  477.                                                 AS KMT_MTM_VALUES.RLW_VALUE);
  478.  
  479.             KMT_SP_LOG_TRACE_MESSAGE (KMT_DH_EVENT_MSG,
  480.                                       PARAMS)
  481.            )
  482.          FI;
  483.  
  484.          IF
  485.             QUALIFIER_1.DATA_LOST
  486.  
  487.          THEN
  488.             DH_DO_QUEUE_ACTION (PFM_CURRENCY,
  489.                                 0,               @ Unfreeze                    @
  490.                                 X'40000000',
  491.                                 NIL,
  492.                                 RC_DISCARDED);
  493.             RETRY := TRUE
  494.          FI;
  495.  
  496.          IF
  497.             QUALIFIER_1.FORMAT_DISTURBED
  498.  
  499.          THEN
  500.             DH_DO_QUEUE_ACTION (PFM_CURRENCY,
  501.                                 0,               @ Unfreeze                    @
  502.                                 X'20000000',
  503.                                 NIL,
  504.                                 RC_DISCARDED);
  505.             RETRY := TRUE
  506.          FI;
  507.  
  508.          IF
  509.             QUALIFIER_1.PERMANENTLY_UNAVAILABLE
  510.  
  511.          THEN
  512.             RESULT := PFI_FILE_UNAVAILABLE
  513.          FI;
  514.  
  515.          IF
  516.             QUALIFIER_1.TEMPORARILY_UNAVAILABLE
  517.  
  518.          THEN
  519.             SUSPEND := TRUE
  520.          FI;
  521.  
  522.          IF
  523.             QUALIFIER_1.GENERAL_FILE_FREEZE
  524.  
  525.          THEN
  526.             DH_DO_QUEUE_ACTION (PFM_CURRENCY,
  527.                                 0,               @ Unfreeze                    @
  528.                                 X'08000000',
  529.                                 NIL,
  530.                                 RC_DISCARDED);
  531.             RETRY := TRUE
  532.          FI;
  533.  
  534.          IF
  535.             QUALIFIER_2.FILE_TIMEOUT
  536.  
  537.          THEN
  538.             RESULT := PFI_TIMED_OUT
  539.          FI;
  540.  
  541.          UNLESS
  542.             RETRY  OR  RESULT NE 0
  543.  
  544.          THEN
  545.             CASE
  546.                EVENT_MESSAGE.REASON
  547.  
  548.             THEN                                 @ 0 - PFI_NORMAL_TERM         @
  549.                READ_INTEREST := PROMPT
  550.  
  551.             ELSE                                 @ 1 - PFI_ABNORMAL_TERM       @
  552.                RETRY := TRUE
  553.  
  554.             ELSE                                 @ 2 - PFI_ATTENTION           @
  555.                SUSPEND := TRUE
  556.  
  557.             ELSE                                 @ 3 - PFI_FILE_AVAILABLE      @
  558.                RETRY   := (RESULTCODE NE PFI_DELAYED_TRANSFER);
  559.                SUSPEND := NOT(RETRY)
  560.  
  561.             ELSE                                 @ 4 - PFI_INPUT_AVAILABLE     @
  562.                RESULT := KMT_DH_INPUT_AVAILABLE
  563.  
  564.             ELSE (<RARELY>)                      @ 5 - PFI_ACTION_KEY          @
  565.               (
  566.                RESULT := KMT_DH_UNEXPECTED_BREAKIN;
  567.                KMT_EH_LOG_ERROR (RESULT,
  568.                                  2,
  569.                                  NIL,
  570.                                  0,
  571.                                  TRUE,           @ Produce UCG dump            @
  572.                                  FALSE)          @ Recoverable                 @
  573.               )
  574.  
  575.             ELSE                                 @ 6 - PFI_PROMPT_CANCELLED    @
  576.                RETRY := TRUE
  577.  
  578.             ELSE                                 @ 7 - PFI_QUEUE_EMPTY         @
  579.                RETRY := FALSE;
  580.                RESULT := KMT_DH_QUEUE_EMPTY
  581.  
  582.             DEFAULT (<RARELY>)                   @ Unexpected event from CDH   @
  583.               (
  584.                RESULT := KMT_DH_UNEXPECTED_EVENT;
  585.                KMT_EH_LOG_ERROR (RESULT,
  586.                                  2,
  587.                                  NIL,
  588.                                  0,
  589.                                  TRUE,           @ Produce UCG dump            @
  590.                                  FALSE)          @ Recoverable                 @
  591.               )
  592.             ESAC
  593.          FI;
  594.  
  595.          SUSPEND AND RESULT EQ 0
  596.         )
  597.  
  598.       DO
  599.          SKIP
  600.       REPEAT
  601.    FI
  602. END;                                   @ KMT_DH_PROCESS_RESPONSE               @
  603.  
  604. ***PAGE
  605.  
  606. GLOBAL
  607. STATIC (<STATUS 5>)
  608. PROC
  609.    KMT_DH_OPEN_FILE IS (
  610.    RESPONSE RESULT):
  611.  
  612. @******************************************************************************@
  613. @*                                                                            *@
  614. @* This procedure is used to assign, connect and open an interactive file     *@
  615. @* with read and write capability.                                            *@
  616. @* The interactive file is assigned to the slow file description :STD.STDMAC  *@
  617. @* and uses code set 255 (transparent 7-bit ISO).                             *@
  618. @* The file will be used for the exchange of KERMIT packets.                  *@
  619. @*                                                                            *@
  620. @******************************************************************************@
  621.  
  622. BEGIN
  623.  
  624.    INT KMT_EH_SOFTWARE_ERROR IS 80101;
  625.  
  626.    REF LONG INT FILE_CURRENCY IS KMT_DH_FILE_DETAILS.FILE_CURRENCY;
  627.  
  628.    REF WORD PFM_CURRENCY IS KMT_DH_FILE_DETAILS.PFM_CURRENCY;
  629.  
  630.    REF () WORD EVENT_LIST IS KMT_DH_FILE_DETAILS.EVENT_LIST;
  631.  
  632.    IF
  633.      (
  634.       () BYTE NAME   := ":STD.STDMAC",
  635.               ACCESS := "W",
  636.               LEVEL  := "R",
  637.               LOCK   := "",
  638.               REUSE  := "NO",
  639.               DNAME  := "ICL9NINTDEVICE";
  640.  
  641.        () REF () BYTE DNAMES := DISPLAY (DNAME);
  642.  
  643.        ASSIGN_FILE (NAME,
  644.                     FILE_CURRENCY,
  645.                     ACCESS,
  646.                     LEVEL,
  647.                     LOCK,
  648.                     REUSE,
  649.                     -5,
  650.                     -5,
  651.                     0,
  652.                     DNAMES,
  653.                     RESULT);
  654.       RESULT LE 0
  655.      )
  656.  
  657.    AND
  658.      (
  659.       CONNECT_EVENT (0,
  660.                      X"C0",
  661.                      X"C0",
  662.                      EVENT_LIST(0),
  663.                      0,
  664.                      0,
  665.                      RESULT);
  666.       RESULT LE 0
  667.      )
  668.  
  669.    AND
  670.      (
  671.       () BYTE DETAILS_SUPPLIED := X"CE080000000000000000";
  672.  
  673.       EVENT_LIST(1) := EVENT_LIST(0);
  674.       DETAILS_SUPPLIED(2 SIZE 4) := 4-BYTE: EVENT_LIST(0);
  675.       DETAILS_SUPPLIED(6 SIZE 4) := 4-BYTE: EVENT_LIST(1);
  676.       BI_CONNECT_FILE (FILE_CURRENCY,
  677.                        PFM_CURRENCY,
  678.                        KMT_DH_FILE_DETAILS.CONNECTION_CURRENCY,
  679.                        DETAILS_SUPPLIED,
  680.                        NIL,
  681.                        NIL,
  682.                        RESULT);
  683.       RESULT LE 0
  684.      )
  685.  
  686.    AND
  687.      (
  688.       INT FILE_CLASS IS 11,                      @ PFI_INTERACTIVE             @
  689.           CODE_SET   IS 255,                     @ Transparent 7-bit ISO       @
  690.           TIME_OUT   IS 0;                       @ No TIMEOUT ie indefinite    @
  691.                                                  @ wait                        @
  692.  
  693.       PFI_FILE_FLAGS FILE_FLAGS IS X'03000000';
  694.                                                  @ Inhibit space truncation    @
  695.                                                  @ Inhibit space compression   @
  696.  
  697.       () PFI_PARAMETER_PAIRS PARAMS :=
  698.             ((X'00', FILE_CLASS  AS PFI_PARAMETER_VALUES.INT_VALUE),
  699.              (X'01', CODE_SET    AS PFI_PARAMETER_VALUES.INT_VALUE),
  700.              (X'02', FILE_FLAGS  AS PFI_PARAMETER_VALUES.FILE_FLAGS),
  701.              (X'18', TIME_OUT    AS PFI_PARAMETER_VALUES.INT_VALUE)
  702.             );
  703.  
  704.       KMT_DH_FILE_DETAILS.READ_INTEREST := FALSE;
  705.  
  706.       WHILE
  707.         (
  708.          BOOL RETRY;
  709.  
  710.          DH_DEFINE_FILE_PROPERTIES (PFM_CURRENCY,
  711.                                     PARAMS,
  712.                                     RESULT);
  713.          KMT_DH_PROCESS_RESPONSE (RESULT,
  714.                                   FALSE,
  715.                                   RETRY,
  716.                                   RESULT);
  717.          RETRY
  718.         )
  719.  
  720.       DO
  721.          SKIP
  722.       REPEAT;
  723.       RESULT LE 0
  724.      )
  725.  
  726.    AND                                           @ Timeout intervals may be    @
  727.                                                  @ set in multiples of 2       @
  728.                                                  @ minutes using the PFI.      @
  729.                                                  @ We need to be able to set   @
  730.                                                  @ timeout intervals in the    @
  731.                                                  @ order of 5 to 30 seconds.   @
  732.                                                  @ Therefore we must set up    @
  733.                                                  @ our own timer channel.      @
  734.      (
  735.       CREATE_TIMER_CHANNEL (EVENT_LIST(0),
  736.                             KMT_DH_FILE_DETAILS.TIMER_CHANNEL,
  737.                             RESULT);
  738.       RESULT LE 0
  739.      )
  740.  
  741.    THEN                                          @ File opened successfully    @
  742.       () WORD PROPERTIES := (104,                @ Maximum record size         @
  743.                              0,
  744.                              0);
  745.  
  746.       () BYTE DETAILS_REQUIRED := X"49"          @ Line length                 @
  747.                                   X"51";         @ Suspension advice           @
  748.  
  749.       (6) BYTE DETAILS_AREA;
  750.  
  751.       KMT_DH_DEVICE_DETAILS.MAX_INPUT_LENGTH := IF
  752.                                                   (
  753.                                                    CTM_READ_DESC (FILE_CURRENCY,
  754.                                                                   NIL,
  755.                                                                   NIL,
  756.                                                                   PROPERTIES,
  757.                                                                   RESULT);
  758.                                                    RESULT EQ 0
  759.                                                   )
  760.                                                 THEN
  761.                                                    PROPERTIES(1)
  762.                                                 ELSE
  763.                                                    80
  764.                                                 FI;
  765.  
  766.       DH_GIVE_FILE_DETAILS (PFM_CURRENCY,
  767.                             DETAILS_REQUIRED,
  768.                             DETAILS_AREA,
  769.                             NIL,
  770.                             RESULT);
  771.  
  772.       IF
  773.          RESULT EQ 0
  774.  
  775.       THEN
  776.          KMT_DH_DEVICE_DETAILS.MAX_OUTPUT_LENGTH := DETAILS_AREA(2);
  777.          KMT_DH_FILE_DETAILS.LONG_SUSPEND := BIT:DETAILS_AREA(5)
  778.  
  779.       ELSE
  780.          KMT_DH_DEVICE_DETAILS.MAX_OUTPUT_LENGTH := 80;
  781.          KMT_DH_FILE_DETAILS.LONG_SUSPEND := TRUE
  782.       FI
  783.    FI;
  784.  
  785.    IF
  786.       RESULT GT 0
  787.  
  788.    THEN (<RARELY>)                               @ Open error                  @
  789.      (
  790.       () BYTE PROC_NAME := "KMT_DH_OPEN_FILE";
  791.  
  792.       () KMT_MTM_VALUES PARAMS := DISPLAY(PROC_NAME
  793.                                           AS KMT_MTM_VALUES.RVB_VALUE);
  794.  
  795.       KMT_DH_DEVICE_DETAILS.FILE_OPEN := FALSE;
  796.       KMT_EH_LOG_ERROR (RESULT,
  797.                         2,
  798.                         PARAMS,
  799.                         0,
  800.                         FALSE,
  801.                         FALSE);
  802.       RESULT := KMT_EH_SOFTWARE_ERROR
  803.      )
  804.  
  805.    ELSE                                          @ Ignore warnings             @
  806.       KMT_DH_DEVICE_DETAILS.FILE_OPEN := TRUE;
  807.       RESULT := 0
  808.    FI
  809. END;                                   @ KMT_DH_OPEN_FILE                      @
  810.  
  811. ***PAGE
  812.  
  813. GLOBAL
  814. STATIC (<STATUS 5>)
  815. PROC
  816.    KMT_DH_CLOSE_FILE IS (
  817.    RESPONSE RESULT):
  818.  
  819. @******************************************************************************@
  820. @*                                                                            *@
  821. @* This procedure is used to close the file previously opened by the          *@
  822. @* procedure KMT_DH_OPEN_FILE.                                                *@
  823. @*                                                                            *@
  824. @******************************************************************************@
  825.  
  826. BEGIN
  827.  
  828.    INT KMT_EH_SOFTWARE_ERROR IS 80101;
  829.  
  830.    REF BOOL FILE_OPEN IS KMT_DH_DEVICE_DETAILS.FILE_OPEN;
  831.  
  832.    RESULT := 0;
  833.  
  834.    IF
  835.       FILE_OPEN
  836.  
  837.    THEN                                          @ File open, close it         @
  838.       INT RC_DISCARDED;
  839.  
  840.       IF
  841.         (
  842.          () BYTE DETAILS_SUPPLIED := DISPLAY (181,@ FC_TI_ACTION_TYPE          @
  843.                                               1,  @ Length                     @
  844.                                               40);@ FC_DI_DISCONNECT           @
  845.  
  846.          BI_MODIFY_CONNECTION (KMT_DH_FILE_DETAILS.CONNECTION_CURRENCY,
  847.                                DETAILS_SUPPLIED,
  848.                                NIL,
  849.                                NIL,
  850.                                RESULT);
  851.          RESULT GT 0
  852.         )
  853.  
  854.       THEN (<RARELY>)                            @ Close error                 @
  855.         (
  856.          () BYTE PROC_NAME := "KMT_DH_CLOSE_FILE";
  857.  
  858.          () KMT_MTM_VALUES PARAMS := DISPLAY(PROC_NAME
  859.                                              AS KMT_MTM_VALUES.RVB_VALUE);
  860.  
  861.          KMT_EH_LOG_ERROR (RESULT,
  862.                            2,
  863.                            PARAMS,
  864.                            0,
  865.                            FALSE,
  866.                            FALSE);
  867.          RESULT := KMT_EH_SOFTWARE_ERROR
  868.         )
  869.  
  870.       ELSE                                       @ Ignore warnings             @
  871.          RESULT := 0
  872.       FI;
  873.  
  874.       FILE_OPEN := FALSE;
  875.    FI
  876. END;                                   @ KMT_DH_CLOSE_FILE                     @
  877.  
  878. ***PAGE
  879.  
  880. GLOBAL
  881. STATIC (<STATUS 5>)
  882. PROC
  883.    KMT_DH_OUTPUT IS (
  884.    REF () BYTE OUTPUT_PACKET,
  885.    BOOL        PROMPT,
  886.    RESPONSE    RESULT):
  887.  
  888. @******************************************************************************@
  889. @*                                                                            *@
  890. @* This procedure is used to send a KERMIT packet to the remote end.  The     *@
  891. @* end of line terminating character and any padding characters are added and *@
  892. @* the required parity is set.                                                *@
  893. @* OUTPUT_PACKET references an area containing the packet to be output.       *@
  894. @* If the length of the output packet is zero then a single 'PAD' character   *@
  895. @* is output. If PROMPT is set true then the procedure will set read          *@
  896. @* interest on the file for the next call to KMT_DH_INPUT.                    *@
  897. @*                                                                            *@
  898. @******************************************************************************@
  899.  
  900. BEGIN
  901.  
  902. ***PAGE
  903.  
  904. SIM
  905. PROC
  906.    KMT_DH_SET_PARITY IS (
  907.    REF () BYTE BUFFER):
  908.  
  909. @******************************************************************************@
  910. @*                                                                            *@
  911. @* This procedure is used to set the required parity for each byte contained  *@
  912. @* in BUFFER.                                                                 *@
  913. @*                                                                            *@
  914. @******************************************************************************@
  915.  
  916. BEGIN
  917.    WORD PARITY IS KMT_DH_DEVICE_DETAILS.OUTPUT_PARITY;
  918.  
  919.    IF
  920.       PARITY LE 1
  921.  
  922.    THEN                                          @ Even or odd parity required @
  923.       BYTE INITIAL_PARITY_MASK IS IF
  924.                                      PARITY EQ 0
  925.                                   THEN           @ Even parity                 @
  926.                                      X"80"
  927.                                   ELSE           @ Odd parity                  @
  928.                                      X"00"
  929.                                   FI;
  930.  
  931.       FOR I
  932.       TO  BOUND BUFFER
  933.       DO
  934.          BYTE PARITY_MASK := INITIAL_PARITY_MASK;
  935.  
  936.          WORD THIS_BYTE := BUFFER(I) & X"7F";
  937.  
  938.          WHILE
  939.            (
  940.             INT NUM_BITS_SHIFTED;
  941.  
  942.             THIS_BYTE := SHWZ (THIS_BYTE,
  943.                                NUM_BITS_SHIFTED);
  944.             THIS_BYTE NE 0
  945.            )
  946.          DO
  947.             PARITY_MASK := PARITY_MASK NEQ X"80";
  948.             THIS_BYTE := THIS_BYTE & X'7F000000'
  949.          REPEAT;
  950.  
  951.          BUFFER(I) := BUFFER(I) ! PARITY_MASK
  952.       REPEAT
  953.  
  954.    ELSF
  955.       PARITY EQ 2
  956.  
  957.    THEN                                          @ Mark parity                 @
  958.       ORBYTE (X"80",
  959.               BUFFER,
  960.               0,
  961.               NIL)
  962.  
  963.    ELSF
  964.       PARITY EQ 3
  965.  
  966.    THEN                                          @ Space parity                @
  967.       ANDBYTE (X"7F",
  968.                BUFFER,
  969.                0,
  970.                NIL)
  971.    FI
  972. END;                                   @ KMT_DH_SET_PARITY                     @
  973.  
  974. ***PAGE
  975.  
  976.    INT PFI_REQUEST_ACCEPTED IS -31008,
  977.        PFI_TIMED_OUT        IS 39854;
  978.  
  979.    INT KMT_DH_DATA_OUT_MSG    IS 151,
  980.        KMT_DH_INPUT_AVAILABLE IS -80152,
  981.        KMT_DH_QUEUE_EMPTY     IS -80153;
  982.  
  983.    INT KMT_EH_SOFTWARE_ERROR  IS 80101;
  984.  
  985.    INT NPAD IS KMT_PP_REMOTE_CONFG_PARAMS.NPAD;
  986.  
  987.    INT OUTPUT_PACKET_LENGTH IS IF
  988.                                   OUTPUT_PACKET IS NIL
  989.                                THEN
  990.                                   0
  991.                                ELSE
  992.                                   LENGTH OUTPUT_PACKET
  993.                                FI;
  994.  
  995.    INT OUTPUT_BUFFER_LENGTH IS IF
  996.                                   OUTPUT_PACKET_LENGTH EQ 0
  997.                                THEN
  998.                                   1
  999.                                ELSE
  1000.                                   OUTPUT_PACKET_LENGTH + NPAD + 1
  1001.                                FI;
  1002.  
  1003.    PFI_OUTPUT_CONTROLS CONTROL IS IF
  1004.                                      PROMPT
  1005.                                   THEN           @ Report normal termination   @
  1006.                                                  @ Prompt                      @
  1007.                                      X'60000000'
  1008.                                   ELSE           @ Report normal termination   @
  1009.                                      X'40000000'
  1010.                                   FI;
  1011.  
  1012.    WORD PFM_CURRENCY IS KMT_DH_FILE_DETAILS.PFM_CURRENCY;
  1013.  
  1014.    (OUTPUT_BUFFER_LENGTH) BYTE OUTPUT_BUFFER;
  1015.  
  1016.    BOOL TRACING IS KMT_TRACE_FLAGS.DH_TRACING;
  1017.  
  1018.    INT RC_DISCARDED;
  1019.  
  1020.    IF
  1021.       OUTPUT_PACKET_LENGTH EQ 0
  1022.  
  1023.    THEN                                          @ No packet supplied,         @
  1024.                                                  @ output single PAD character @
  1025.       OUTPUT_BUFFER := KMT_PP_REMOTE_CONFG_PARAMS.PADC;
  1026.  
  1027.    ELSE                                          @ Build output data buffer    @
  1028.                                                  @ consisting of the required  @
  1029.                                                  @ number of PAD characters,   @
  1030.                                                  @ the packet and the          @
  1031.                                                  @ end of line terminating     @
  1032.                                                  @ character                   @
  1033.       INT EOL IS IF KMT_PP_REMOTE_CONFG_PARAMS.EOL = X"0D"   @ ASG converts CR @
  1034.                  THEN X"0A"     @ to NULL, LF to CRLF - fix also works via NIC @
  1035.                  ELSE KMT_PP_REMOTE_CONFG_PARAMS.EOL
  1036.                  FI;
  1037.       MOVEBYTE (KMT_PP_REMOTE_CONFG_PARAMS.PADC,
  1038.                 OUTPUT_BUFFER(SIZE NPAD),
  1039.                 0,
  1040.                 NIL);
  1041.       OUTPUT_BUFFER(NPAD SIZE OUTPUT_PACKET_LENGTH) := OUTPUT_PACKET;
  1042.       OUTPUT_BUFFER(OUTPUT_BUFFER_LENGTH - 1) := EOL
  1043.    FI;
  1044.  
  1045.    KMT_DH_SET_PARITY (OUTPUT_BUFFER);
  1046.  
  1047.    CTM_WAIT_TIME (KMT_DH_DEVICE_DETAILS.PAUSE,  @ Wait before sending packet   @
  1048.                   RC_DISCARDED);
  1049.  
  1050.    WHILE
  1051.      (
  1052.       BOOL RETRY;
  1053.  
  1054.                                                  @ Ensure no I/O requests are  @
  1055.                                                  @ outstanding                 @
  1056.       DH_DO_QUEUE_ACTION (PFM_CURRENCY,
  1057.                           5,                     @ PFI_ABORT_QUEUE             @
  1058.                           0,
  1059.                           NIL,
  1060.                           RESULT);
  1061.  
  1062.       WHILE
  1063.         (
  1064.          KMT_DH_PROCESS_RESPONSE (RESULT,
  1065.                                   FALSE,
  1066.                                   RETRY,
  1067.                                   RESULT);
  1068.             RETRY
  1069.          OR
  1070.             (RESULT EQ KMT_DH_INPUT_AVAILABLE)
  1071.          OR
  1072.             (RESULT EQ PFI_TIMED_OUT)
  1073.         )
  1074.       DO
  1075.          RESULT := PFI_REQUEST_ACCEPTED
  1076.       REPEAT;
  1077.  
  1078.       IF
  1079.          RESULT EQ KMT_DH_QUEUE_EMPTY
  1080.  
  1081.       THEN                                       @ File queue empty            @
  1082.          RESULT := 0
  1083.       FI;
  1084.  
  1085.       IF
  1086.          RESULT LE 0
  1087.  
  1088.       THEN                                       @ File queue emptied          @
  1089.                                                  @ successfilly                @
  1090.          IF
  1091.             TRACING
  1092.  
  1093.          THEN (<RARELY>)
  1094.            (
  1095.             () KMT_MTM_VALUES PARAMS := DISPLAY(OUTPUT_BUFFER
  1096.                                                 AS KMT_MTM_VALUES.RVB_VALUE);
  1097.  
  1098.             KMT_SP_LOG_TRACE_MESSAGE (KMT_DH_DATA_OUT_MSG,
  1099.                                       PARAMS)
  1100.            )
  1101.          FI;
  1102.  
  1103.          DH_OUTPUT (PFM_CURRENCY,                @ Send output data            @
  1104.                     0,
  1105.                     OUTPUT_BUFFER,
  1106.                     CONTROL,
  1107.                     RESULT);
  1108.          KMT_DH_PROCESS_RESPONSE (RESULT,        @ Check if successful         @
  1109.                                   PROMPT,
  1110.                                   RETRY,
  1111.                                   RESULT);
  1112.       FI;
  1113.  
  1114.       RETRY
  1115.      )
  1116.    DO
  1117.       SKIP
  1118.    REPEAT;
  1119.  
  1120.    IF
  1121.       RESULT GT 0
  1122.  
  1123.    THEN (<RARELY>)                               @ I/O error                   @
  1124.      (
  1125.       () BYTE PROC_NAME := "KMT_DH_OUTPUT";
  1126.  
  1127.       () KMT_MTM_VALUES PARAMS := DISPLAY(PROC_NAME
  1128.                                           AS KMT_MTM_VALUES.RVB_VALUE);
  1129.  
  1130.       KMT_EH_LOG_ERROR (RESULT,
  1131.                         2,
  1132.                         PARAMS,
  1133.                         0,
  1134.                         FALSE,
  1135.                         FALSE);
  1136.       RESULT := KMT_EH_SOFTWARE_ERROR
  1137.      )
  1138.  
  1139.    ELSE                                          @ Ignore warnings             @
  1140.       RESULT := 0
  1141.    FI
  1142. END;                                   @ KMT_DH_OUTPUT                         @
  1143.  
  1144. ***PAGE
  1145.  
  1146. GLOBAL
  1147. STATIC (<STATUS 5>)
  1148. PROC
  1149.    KMT_DH_INPUT IS (
  1150.    REF () BYTE INPUT_BUFFER,
  1151.    REF INT     INPUT_BUFFER_LENGTH,
  1152.    RESPONSE    RESULT):
  1153.  
  1154. @******************************************************************************@
  1155. @*                                                                            *@
  1156. @* This procedure is used to receive an input buffer from the remote end.     *@
  1157. @* The input buffer may or may not contain a valid KERMIT packet.             *@
  1158. @* The input buffer and length are returned in the areas referenced by        *@
  1159. @* INPUT_BUFFER and INPUT_BUFFER_LENGTH respectively.                         *@
  1160. @*                                                                            *@
  1161. @******************************************************************************@
  1162.  
  1163. BEGIN
  1164. ***PAGE
  1165.  
  1166. SIM
  1167. PROC
  1168.    KMT_DH_REMOVE_PARITY IS (
  1169.    REF () BYTE BUFFER):
  1170.  
  1171. @******************************************************************************@
  1172. @*                                                                            *@
  1173. @* This procedure is used to remove the parity bit (if present) for each byte *@
  1174. @* in BUFFER.                                                                 *@
  1175. @*                                                                            *@
  1176. @******************************************************************************@
  1177.  
  1178. BEGIN
  1179.                                                  @ Clear parity bit            @
  1180.    ANDBYTE (X"7F",                               @ 7 bit IA5                   @
  1181.             BUFFER,
  1182.             0,
  1183.             NIL)
  1184. END;                                   @ KMT_DH_REMOVE_PARITY                  @
  1185.  
  1186. ***PAGE
  1187.  
  1188.    INT TIM_NO_NOTIFICATIONS  IS -32156,
  1189.        PFI_MESSAGE_CANCELLED IS 38575,
  1190.        PFI_TIMED_OUT         IS 39854;
  1191.  
  1192.    INT KMT_DH_DATA_IN_MSG     IS 150,
  1193.        KMT_EH_SOFTWARE_ERROR  IS 80101,
  1194.        KMT_DH_INPUT_AVAILABLE IS -80152;
  1195.  
  1196.    PFI_INPUT_RETURNS INPUT_RETURN;
  1197.  
  1198.    BOOL TRACING IS KMT_TRACE_FLAGS.DH_TRACING;
  1199.  
  1200.    WORD TIMER_CHANNEL IS KMT_DH_FILE_DETAILS.TIMER_CHANNEL;
  1201.  
  1202.    WORD TIME IS IF DELAY_TIMER
  1203.                 THEN DELAY
  1204.                 ELSE KMT_PP_REMOTE_CONFG_PARAMS.TIME
  1205.                 FI;
  1206.  
  1207.    IF
  1208.      (
  1209.       RESULT := 0;
  1210.  
  1211.       UNLESS
  1212.          KMT_DH_FILE_DETAILS.READ_INTEREST
  1213.  
  1214.       THEN                                       @ Read interest not set.      @
  1215.                                                  @ Set read interest           @
  1216.          KMT_DH_OUTPUT (NIL,
  1217.                         TRUE,
  1218.                         RESULT)
  1219.        FI;
  1220.  
  1221.        RESULT LE 0
  1222.      )
  1223.  
  1224.    AND
  1225.      (
  1226.       IF
  1227.          TIME NE 0
  1228.  
  1229.       THEN                                       @ Timeout intervals may be    @
  1230.                                                  @ set in multiples of 2       @
  1231.                                                  @ minutes using the PFI.      @
  1232.                                                  @ We need to be able to set   @
  1233.                                                  @ timeout intervals in the    @
  1234.                                                  @ order of 5 to 30 seconds.   @
  1235.                                                  @ Therefore we must set up    @
  1236.                                                  @ our own timer channel.      @
  1237.  
  1238.          LONG INT TIME_IN_MSECS IS (L'I'TIME) * 1000000;
  1239.  
  1240.          ESTABLISH_TIMER_NOTIFICATION (TIMER_CHANNEL,
  1241.                                        X'00000000 00100000',
  1242.                                                  @ File timeout                @
  1243.                                                  @ Make it look like a PFI     @
  1244.                                                  @ timeout                     @
  1245.                                        TIME_IN_MSECS + I'CLOCKTIME (),
  1246.                                        TRUE,
  1247.                                        FALSE,
  1248.                                        RESULT)
  1249.       FI;
  1250.  
  1251.       RESULT LE 0
  1252.      )
  1253.  
  1254.    AND
  1255.      (
  1256.       INT RC_DISCARDED;
  1257.  
  1258.       BOOL RETRY;
  1259.  
  1260.       KMT_DH_PROCESS_RESPONSE (RESULT,           @ Wait for PFI event          @
  1261.                                FALSE,
  1262.                                RETRY,
  1263.                                RESULT);
  1264.       IF
  1265.          (TIME NE 0)  AND  (RESULT NE PFI_TIMED_OUT)
  1266.  
  1267.       AND                                        @ Timeout set but timeout     @
  1268.         (                                        @ event did not occur.        @
  1269.                                                  @ Turn off timer.             @
  1270.          CANCEL_TIMER_NOTIFICATION (TIMER_CHANNEL,
  1271.                                     RC_DISCARDED);
  1272.          RC_DISCARDED EQ TIM_NO_NOTIFICATIONS
  1273.         )
  1274.  
  1275.  
  1276.       THEN                                       @ Timeout event occurred      @
  1277.                                                  @ after PFI event but before  @
  1278.                                                  @ the timer could be          @
  1279.                                                  @ cancelled.                  @
  1280.                                                  @ Read the timeout event and  @
  1281.                                                  @ discarded it.               @
  1282.          LONG WORD EVENT_MESSAGE;
  1283.  
  1284.          INT REPLY;
  1285.  
  1286.          READ_EVENT (KMT_DH_FILE_DETAILS.EVENT_LIST(0),
  1287.                      EVENT_MESSAGE,
  1288.                      REPLY,
  1289.                      RC_DISCARDED)
  1290.       FI;
  1291.  
  1292.       RESULT EQ KMT_DH_INPUT_AVAILABLE
  1293.      )
  1294.  
  1295.    AND
  1296.      (
  1297.       WORD PFM_CURRENCY IS KMT_DH_FILE_DETAILS.PFM_CURRENCY;
  1298.  
  1299.       DH_INPUT (PFM_CURRENCY,                    @ Get input data              @
  1300.                 0,
  1301.                 INPUT_BUFFER,
  1302.                 INPUT_RETURN,
  1303.                 RESULT);
  1304.       RESULT LE 0
  1305.      )
  1306.  
  1307.    THEN                                          @ Input data read             @
  1308.       INPUT_BUFFER_LENGTH := INPUT_RETURN.DATA_LENGTH;
  1309.  
  1310.       IF
  1311.          (INPUT_BUFFER(INPUT_BUFFER_LENGTH - 1) & X"7F") EQ X"1E"
  1312.  
  1313.       THEN                                       @ Via a PAD and using         @
  1314.                                                  @ code set 255 RS (X1E) is    @
  1315.                                                  @ appended to the end of the  @
  1316.                                                  @ record by VME. Ignore it.   @
  1317.          INPUT_BUFFER_LENGTH := INPUT_BUFFER_LENGTH - 1
  1318.       FI;
  1319.  
  1320.       IF
  1321.          TRACING
  1322.  
  1323.       THEN (<RARELY>)
  1324.         (
  1325.          () KMT_MTM_VALUES PARAMS := DISPLAY(INPUT_BUFFER(SIZE
  1326.                                                           INPUT_BUFFER_LENGTH)
  1327.                                              AS KMT_MTM_VALUES.RVB_VALUE);
  1328.  
  1329.          KMT_SP_LOG_TRACE_MESSAGE (KMT_DH_DATA_IN_MSG,
  1330.                                    PARAMS)
  1331.         )
  1332.       FI;
  1333.  
  1334.       KMT_DH_REMOVE_PARITY (INPUT_BUFFER(SIZE INPUT_BUFFER_LENGTH));
  1335.  
  1336.    ELSE
  1337.       INPUT_BUFFER_LENGTH := 0
  1338.    FI;
  1339.  
  1340.    IF
  1341.       RESULT EQ PFI_MESSAGE_CANCELLED
  1342.  
  1343.    THEN                                          @ 'CANCEL' key, ignore RC     @
  1344.       RESULT := 0
  1345.    FI;
  1346.  
  1347.    IF
  1348.       (RESULT GT 0) AND (RESULT NE PFI_TIMED_OUT)
  1349.  
  1350.    THEN (<RARELY>)                               @ I/O error                   @
  1351.      (
  1352.       () BYTE PROC_NAME := "KMT_DH_INPUT";
  1353.  
  1354.       () KMT_MTM_VALUES PARAMS := DISPLAY(PROC_NAME
  1355.                                           AS KMT_MTM_VALUES.RVB_VALUE);
  1356.  
  1357.       KMT_EH_LOG_ERROR (RESULT,
  1358.                         2,
  1359.                         PARAMS,
  1360.                         0,
  1361.                         FALSE,
  1362.                         FALSE);
  1363.       RESULT := KMT_EH_SOFTWARE_ERROR
  1364.      )
  1365.  
  1366.    ELSF
  1367.       RESULT LE 0
  1368.  
  1369.    THEN                                          @ Ignore warnings             @
  1370.       RESULT := 0
  1371.    FI
  1372. END;                                   @ KMT_DH_INPUT                          @
  1373.  
  1374. ENDMODULE                              @ KMT_DH_MODULE                         @
  1375.