*COMDECK PTIVTCMD 
_$J+
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*                      P T I V T C M D                                * 
*                                                                     * 
*         PROCESS TERMINAL AND DOWNLINE IVT COMMANDS                  * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_$R-,G-,I-    NON RECURSIVE, INTERRUPTABLE ?
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW - PTIVTCMD RECEIVES AN IVT COMMANDS IN CHARACTER STRING   * 
*             FORMAT, CONVERTS IT TO FN/FV PAIR(S), CALLS ROUTINE     * 
*             PNCONFIGURE (SVM) TO INSERT FV IN PROPER TCB FIELD.     * 
*                                                                     * 
** INPUT    - FOLLOWING PARAMETERS ARE PASSED BY THE CALLER:          * 
*             1/ BUFFER POINTER TO IVT COMMAND STRING.                * 
*             2/ TCB ADDRESS OF APPLICABLE TERMINAL CONTROL BLOCK.    * 
*             3/ SOURCE OF IVT COMMAND (EITHER TERMINAL OR DL MSG).   * 
*                                                                     * 
** OUTPUT   - THIS ROUTINE RETURNS A BOOLEAN TRUE IF THE RECEIVED     * 
*             IVT COMMAND IS CORRECTLY PROCESSED. IF THE BOOLEAN IS   * 
*             FALSE, GLOBAL VARIABLE -IVTNM- WILL CONTAIN THE FIRST   * 
*             TWO CHARACTERS OF THE FIRST BAD IVT COMMAND DETECTED.   * 
*                                                                     * 
** EXTERNAL SUBROUTINES -                                             * 
*             PBRELZRO    - RELEASE A POSSIBLE CHAIN OF BUFFERS       * 
*             PBFMAD      - CONVERT ASCII NUMERICS TO INTEGER         * 
*             PBMEMBER    - TEST FOR ASCII HEX CHARACTER              * 
*             PNGTLLCB    - PERFORM DN, SN LOOKUP                     * 
*             PBXFER      - TRANSFER CONTROL TO PAGED ROUTINE         * 
*             PNCONFIGURE - PROCESS FN/FV PAIRS (SVM)                 * 
*             PNSMGEN     - GENERATE SERVICE MESSAGE (SVM)            * 
*             PNNOTIFY    - SEND CANNED MESSAGE TO TERMINAL           * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
FUNCTION PGIVTCMD (T9CMDP, T9TCBP : B0BUFPTR; T9SOURCE : C9SOURCE) :  
         BOOLEAN; 
  
CONST 
  T7MXLENGTH = 55;                          _MAXIMUM IVT STRING LENGTH ?
  T7SRCFCD   = 14;                          _FCD SOURCE      (DATA + 2)?
  T7DSTFCD   = 14;                          _FCD DESTINATION (DATA + 2)?
_ 
* * * *  ASCII CHARACTER CONSTANTS (1 OR 2 CHARACTERS)
? 
  T7CSMS     = $4D53;                       _#MS# CHARACTER STRING     ?
  T7CSCA     = $4341;                       _#CA# CHARACTER STRING     ?
  T7CSTO     = $544F;                       _#TO# CHARACTER STRING     ?
  T7PARMSEP  = #,#;                         _PARAMETER SEPARATOR       ?
  T7CMDEOS   = # #;                         _END OF COMMAND STRING     ?
  T7EQUAL    = #=#;                         _CHARACTER EQUAL           ?
  T7LCA      = $61;                         _LOWER CASE A              ?
  T7LCZ      = $7A;                         _LOWER CASE Z              ?
_ 
* * * *  ARRAY SIZES
? 
  T7NRCMDS   = 37;                          _NR OF IVT COMMANDS        ?
  T7NRFNFV   = 7;                           _NR FN/FV PAIRS (MAX)      ?
  T7NRPHLE   = 22;                          _NR PARAMETERS IN HIT LIST ?
  T7NRCHLE   = 6;                           _NR CMD ENTRIES IN HIT LIST?
  T7NRLIMS   = 5;                           _NR OF LIMIT TABLE ENTRIES ?
  T7NRDLDF   = 5;                           _NR DL/XL DEFAULTS FN/FV-S ?
_ 
* * * *  FN CONSTANTS 
? 
  T7DLXFN    = $3B;                         _1ST XPT DELIMITER         ?
  T7DLYFN    = $45;                         _2ND XPT DELIMITER         ?
  T7ELFN     = $3D;                         _END OF LINE CHARACTER     ?
_ 
* * * *  ACTION CONSTANTS 
? 
  T7CHACT    = 0;                           _TERMINAL CHARACTERISTICS  ?
  T7RCACT    = 1;                           _RECONFIGURE TERMINAL      ?
  T7TMACT    = 2;                           _TERMINATE CONNECTION      ?
  T7HDACT    = 3;                           _HOST ACCESSIBILITY DISPLAY?
  T7HNACT    = 5;                           _HOST NODE SELECTION       ?
  T7XLACT    = 9;                           _MULTI-MSG XPT DELIMETERS  ?
  T7EBACT    = 11;                          _END OF BLOCK CHARACTER    ?
  
VAR 
  T9PFIRST   : INTEGER;                     _FIRST PARAMETER CHARACTER ?
  T9PCHARS   : INTEGER;                     _FIRST 2 PARAMETER CHARS   ?
  T9CTIND    : INTEGER;                     _COMMAND TABLE INDEX       ?
  T9IND1     : INTEGER;                     _WORK INDEX 1              ?
  T9IND2     : INTEGER;                     _WORK INDEX 2              ?
  T9CMDSEP   : CHAR;                        _COMMAND SEPARATOR CHAR    ?
  T9SPRTR    : CHAR;                        _CURR. SEPARATOR CHARACTER ?
  T9ACTION   : INTEGER;                     _COMMAND ACTION -T8ACTION- ?
  T9ACTVAL   : INTEGER;                     _COMMAND VALUE  -T8ACTVAL- ?
  T9BLANK    : CHAR;                        _BLANK (OR NULL) CHARACTER ?
  T9PLNG     : INTEGER;                     _CURRENT PARAMETER LENGTH  ?
  T9NOTIFY   : INTEGER;                     _NOTIFY MESSAGE ORDINAL    ?
  T9CORRECT  : BOOLEAN;                     _CORRECT IVT COMMAND FLAG  ?
  T9PTR      : B0BUFPTR;                    _WORK POINTER              ?
  T9CHAR     : B0OVERLAY;                   _WORK CHARACTER            ?
  T9I        : INTEGER;                     _WORK INTEGER              ?
  T9J        : INTEGER;                     _WORK INTEGER              ?
  T9FLAG     : BOOLEAN;                     _WORK BOOLEAN              ?
  T9HCB      : B0BUFPTR;                    _HOST CONTROL BLOCK        ?
  T9HNWT     : INTEGER;                     _HOST NODE WEIGHTED VALUE  ?
  T9HSNAME   : PACKED ARRAY [1..8] OF CHAR; _HOST NAME ARRAY           ?
  T9WORKLIST : BWWORKLIST;                  _LOCAL WORKLIST ARRAY      ?
  T9CMDTBL   : ARRAY [1..T7NRCMDS] OF 
               PACKED RECORD
                 T8NAME   : INTEGER;        _IVT COMMAND NAME          ?
                 T8FN1    : B08BITS;        _IVT COMMAND NUMBER        ?
                 T8ACTION : B04BITS;        _COMMAND ACTION            ?
                 T8ACTVAL : B04BITS;        _COMMAND ACTION VALUE      ?
               END; 
  T9PHITBL   : ARRAY [1..T7NRPHLE] OF       _PARAMETER HIT TABLE       ?
               PACKED RECORD
                 T8CHARS  : INTEGER;        _PARAMETER CHARACTER (1/2) ?
                 CASE X : INTEGER OF
                 0 : (T8FN2 : B08BITS;      _FN2 ASSOCIATED WITH PARAM ?
                      T8FV1 : B04BITS;      _FV1 ASSOCIATED WITH PARAM ?
                      T8FV2 : B04BITS);     _FV2 ASSOCIATED WITH PARAM ?
  
                 1 : (T8FN  : B08BITS;      _FN ASSOCIATED WITH PARAM  ?
                      T8FV  : B04BITS;      _FV ASSOCIATED WITH PARAM  ?
                      T8IND : B04BITS);     _FN/FV PAIR INDEX          ?
                 END; 
  T9PHLIM    : ARRAY [1..T7NRCHLE] OF       _HIT LIST LIMITS FOR CMDS  ?
               INTEGER; 
  T9NNNLIM   : ARRAY [1..T7NRLIMS] OF 
               RECORD 
                 T8LOWER  : INTEGER;        _MINIMUM NNN VALUE         ?
                 T8UPPER  : INTEGER;        _MAXIMUM NNN VALUE         ?
               END; 
  T9FN,                                     _ARRAY WITH FN-S           ?
  T9FV       : ARRAY [1..T7NRFNFV] OF       _ARRAY WITH FV-S           ?
               INTEGER; 
  T9DLDFLTS  : ARRAY [1..T7NRDLDF] OF       _DEFAULT FN-S FOR DL/XL CMD?
               INTEGER; 
  
VALUE 
_ 
* * * *  IVT COMMAND TABLE (MUST BE IN ALPHA-NUMERICAL ORDER) 
? 
  T9CMDTBL   = (
                #AB#,$2970,                 _ABORT OUTPUT BLOCK CHAR   ?
                #AR#,$6521,                 _AUTO RECOGNITION          ?
                #B1#,$2A70,                 _USER BREAK 1 CHARACTER    ?
                #B2#,$2B70,                 _USER BREAK 2 CHARACTER    ?
                #BF#,$1945,                 _BLOCKING FACTOR (UPLINE)  ?
                #BR#,$3321,                 _BREAK KEY AS USER BREAK 1 ?
                #BS#,$2770,                 _BACKSPACE CHARACTER       ?
                #CH#,$0000,                 _TERMINAL CHARACTERISTICS  ?
                #CI#,$2C61,                 _CR IDLE COUNT             ?
                #CN#,$2670,                 _CANCEL CHARACTER          ?
                #CP#,$4721,                 _CURSOR POSITIONING        ?
                #CT#,$2870,                 _CONTROL CHARACTER         ?
                #DL#,$3984,                 _SINGLE-MSG XPT DELIMITERS ?
                #EB#,$00B5,                 _END OF BLOCK CHARACTER    ?
                #EL#,$00A5,                 _END OF LINE CHARACTER     ?
                #EP#,$3121,                 _ECHOPLEX MODE             ?
                #FA#,$3721,                 _FULL ASCII INPUT MODE     ?
                #HC#,$1410,                 _HOST NAME SELECT/CONNECT  ?
                #HD#,$0003,                 _HOST ACCESSIBILITY DISPLAY?
                #HN#,$1453,                 _HOST NODE SELECTION       ?
                #HS#,$14C0,                 _HOST NAME SELECTION       ?
                #IC#,$4321,                 _INPUT CONTROL (XON/XOFF)  ?
                #IN#,$3424,                 _INPUT DEVICE              ?
                #LI#,$2D61,                 _LF IDLE COUNT             ?
                #LK#,$2021,                 _LOCK UNSOLICITED OUTPUT   ?
               _#MS#,0    ,?                _OPERATOR MESSAGE          ?
                #OC#,$4421,                 _OUTPUT CONTROL (XON/XOFF) ?
                #OP#,$3623,                 _OUTPUT DEVICE             ?
                #PA#,$3222,                 _PARITY MODE               ?
                #PG#,$2521,                 _PAGING MODE               ?
                #PL#,$2442,                 _PAGE LENGTH               ?
                #PW#,$2342,                 _PAGE WIDTH                ?
                #RC#,$0001,                 _ISSUE CNF/RC AT DISCONNECT?
                #SE#,$3021,                 _SPECIAL EDIT MODE         ?
                #TC#,$2242,                 _TERMINAL CLASS            ?
                #TM#,$0002,                 _CONNECTION TERMINATION    ?
                #XL#,$3994,                 _MULTI-MSG XPT DELIMITERS  ?
               $7FFF,$00F0);                _END OF TABLE MARKER       ?
_ 
* * * *  PARAMETER HIT TABLE FOR XX=Y/N AND PA/IN/OP COMMANDS 
? 
  T9PHITBL   = ( #N#,$0000,                 _ENTRIES FOR XX=Y/N    (1) ?
                 #Y#,$0010, 
  
                 #Z#,$0000,                 _ENTRIES FOR PA=...    (3) ?
                 #O#,$0010, 
                 #E#,$0020, 
                 #N#,$0030, 
                 #I#,$0040, 
  
                #DI#,$0010,                 _ENTRIES FOR OP=...        ?
                #PR#,$0000, 
                #PT#,$0020, 
  
                #KB#,$3500,                 _ENTRIES FOR IN=...        ?
                #XK#,$3510, 
                #PT#,$3501, 
                #XP#,$3511, 
                #BK#,$3502, 
                 #X#,$3411, 
  
                #NO#,$3F02,                 _ENTRIES FOR EL/EB = ...   ?
                #CR#,$3F12, 
                #LF#,$3F22, 
                #CL#,$3F32, 
                #EL#,$3E13, 
                #EB#,$3E23 ); 
_ 
* * * *  LIMITS PARAM. HIT TABLE FOR VARIOUS COMMANDS (INDEX = T8ACTVAL)
? 
  T9PHLIM    = (1,                          _HIT LIST START FOR XX=Y/N ?
                3,                          _HIT LIST START FOR PA=... ?
                8,                          _HIT LIST START FOR OP=... ?
                11,                         _HIT LIST START FOR IN=... ?
                17,                         _HIT LIST START FOR EL/EB= ?
                23);                        _END OF LIST (+1)          ?
_ 
* * * *  LIMITS NNN PARAMETERS FOR VARIOUS COMMANDS   (INDEX = T8ACTVAL)
? 
  T9NNNLIM  =  (0,127,                      _LIMITS FOR CI/LI          ?
                0,255,                      _LIMITS FOR TC/PL/PW       ?
                0,255,                      _LIMITS FOR HN             ?
                1,4095,                     _LIMITS FOR DL/XL=CNNNN    ?
                0,2);                       _LIMITS FOR BF             ?
_ 
* * * *  DEFAULT FN-S FOR DL/XL= COMMANDS 
? 
  T9DLDFLTS  = ($39,                        _UPPER NIBBLE DL=CNNNN     ?
                $3A,                        _LOWER BYTE DL=CNNNN       ?
                $38,                        _CHARACTER DELIMITER ACTIVE?
                $46,                        _SINGLE/MULTI MSG XPT      ?
                $3C);                       _TIMEOUT DELIMITER ACTIVE  ?
  
_$J+? 
_ 
* 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
* * * *   P T G E T P A R M  - GET NEXT PARAMETER FROM IVT COMMAND.   * 
*                              ENTRY: T9CMDP, T9IND2 MUST BE SET UP   * 
*                              EXIT:  T9IND1 - PREVIOUS SEPARATOR + 1 * 
*                                     T9IND2 - NEW CURRENT SEPARATOR  * 
*                                     T9PLNG - PARAMETER LENGTH       * 
*                                     T9PCHARS FIRST TWO CHRS OF PARM * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PTGETPARM (T9TCHR : CHAR);
  
BEGIN 
T9PFIRST := 0;                              _CLEAR FIRST PARAMETER CHAR?
T9PCHARS := 0;                              _CLEAR PARAMETER CHARACTERS?
T9IND1   := T9IND2 + 1;                     _SET INDEX FIRST CHAR PARM ?
REPEAT
  T9IND2  := T9IND2 + 1;                    _INDEX TO NEXT CHARACTER   ?
  T9SPRTR := T9CMDP'.BFDATAC [T9IND2];      _GET NEXT CHARACTER        ?
UNTIL (T9SPRTR = T7CMDEOS) !                _END OF COMMAND STRING OR  ?
      (T9SPRTR = T9CMDSEP) !                _END OF SINGLE COMMAND OR  ?
      (T9SPRTR = T9TCHR);                   _SPECIAL TERMINATOR FOUND  ?
T9PLNG := T9IND2 - T9IND1;                  _GET LENGTH OF PARAMETER   ?
IF T9PLNG " 0 
THEN
  BEGIN 
  T9PFIRST := ORD (T9CMDP'.BFDATAC
                   [T9IND1]);               _GET FIRST CHAR LOCAL      ?
  T9PCHARS := T9PFIRST; 
  IF T9PLNG > 1 
  THEN
    T9PCHARS := T9PCHARS * $100 + ORD (     _GET SECOND CHAR LOCAL     ?
                T9CMDP'.BFDATAC [T9IND1+1]);
  END;
END; _PROCEDURE PTGETPARM?
_$J+? 
_ 
* 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
* * * *   P T C N V I N T    - CONVERT ASCII INTEGER PARAMETER.       * 
*                              ENTRY: T9CMDP, T9IND1/2 MUST BE SET UP * 
*                              EXIT:  T9CONV CONTAINS INTEGER VALUE   * 
*                                     T9CORRECT SET TRUE IF OKAY.     * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PTCNVINT (VAR T9CONV : INTEGER);
  
VAR 
  T9VALUE : INTEGER;                        _CONVERTED INTEGER NUMBER  ?
  
BEGIN 
T9CMDP'.BFLCD := T9IND2 - 1;                _INSERT LCD FOR PBFMAD     ?
IF PBFMAD (T9VALUE,T9CMDP,T9IND1)           _CONVERT NNN TO INTEGER    ?
THEN
  WITH T9NNNLIM [T9ACTVAL] DO               _SET INDEX TO LIMITS TABLE ?
    IF T9VALUE \ T8LOWER                    _TEST LOWER LIMIT          ?
    THEN
      IF T9VALUE @ T8UPPER                  _TEST UPPER LIMIT          ?
      THEN
        BEGIN                               _CONVERSION SUCCESSFUL     ?
        T9CORRECT := TRUE;                  _INDICATE SO               ?
        T9CONV    := T9VALUE;               _STORE CONVERTED INTEGER   ?
        END;
END; _PROCEDURE PTCNVINT? 
_$J+? 
_ 
* 
* 
* 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
* * * *   P T C N V H E X    - CONVERT HEXADECIMAL CHAR. PARAMETER    * 
*                              ENTRY: T9CMDP, T9IND1/2 MUST BE SET UP * 
*                              EXIT:  T9CONV CONTAINS INTEGER VALUE   * 
*                                     T9CORRECT SET TRUE IF OKAY.     * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PTCNVHEX (VAR T9CONV : INTEGER);
  
VAR 
  T9CHR : B0OVERLAY;
  
BEGIN 
T9CORRECT := FALSE;                         _PRESUME BAD CONVERSION    ?
T9CONV    := 0; 
REPEAT
  IF T9IND1 < T9IND2
  THEN
    BEGIN 
    T9CHR.BA1CHAR := T9CMDP'. 
                     BFDATAC [T9IND1];      _GET ASCII CHARACTER       ?
    T9CORRECT := PBMEMBER (T9CHR, JSHEXSET);_TEST FOR ASCII HEX CHAR   ?
    T9CONV    := T9CONV * 16 +
                 JNCNVTFROM [T9CHR.BA1CHAR];_CONVERT NEXT CHARACTER    ?
    IF T9CONV > $FF 
    THEN
      T9CORRECT := FALSE; 
    IF T9CORRECT = FALSE
    THEN                                    _BAD ASCII HEX DATA, EXIT  ?
      T9IND1 := T9IND2; 
    END;
  T9IND1 := T9IND1 + 1;                     _BUMP CHARACTER INDEX      ?
UNTIL T9IND1 \ T9IND2;                      _UNTIL AT DELIMITER        ?
END; _PROCEDURE PTCNVHEX? 
_$J+? 
_ 
* 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
* * * *   P T F I N D H I T  - FIND PARAMETER HIT                     * 
*                              ENTRY: T9ACTVAL MUST BE SET UP         * 
*                              EXIT:  T9I     - ENTRY INDEX           * 
*                                     FUNCTION RETURNS FALSE NO HIT   * 
*                                     T9CORRECT SET TRUE IF HIT.      * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
FUNCTION PTFINDHIT (DUMMY : INTEGER) : BOOLEAN; 
  
VAR 
  T9K : INTEGER;                            _INDEX WORK INTEGER        ?
  
BEGIN 
PTFINDHIT := FALSE;                         _PRESET TO NO HIT FOUND    ?
FOR T9K := T9PHLIM [T9ACTVAL] TO
           T9PHLIM [T9ACTVAL+1] - 1 DO      _LOOK AT ALLOWED CMD PARAMS?
IF T9PHITBL [T9K].T8CHARS = T9PCHARS
THEN                                        _FOUND A HIT               ?
  BEGIN 
  T9I       := T9K;                         _SET GLOBAL INDEX          ?
  T9CORRECT := TRUE;                        _SET COMMAND CORRECT FLAG  ?
  PTFINDHIT := TRUE;                        _SET HIT FOUND TO RETURN   ?
  END; _FOR T9K..?
END; _FUNCTION PTFINDHIT? 
_$J+? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*                    PTCHOOSEHOST                                     * 
*                                                                     * 
*        SELECT HOST VIA HS OR HC IVT COMMAND                         * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_$R-,G-,I-? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW -  IVT COMMANDS HS=HHHHHHH AND HC=HHHHHHH MUST            * 
*              MATCH A HOST NAME IN HOST TABLE TO BE CORRECTLY        * 
*              PROCESSED                                              * 
*                                                                     * 
** INPUT -     T9IND2 SHOULD BE SET TO EQUALS OF IVT COMMAND          * 
*                                                                     * 
** CALLING PROGRAMS -                                                 * 
*              PTIVTCMD FOR HC AND HS IVT COMMANDS                    * 
*                                                                     * 
** OUTPUT -    T9CORRECT SET APPROPRIATELY AND IF TRUE                * 
*                   T9FV SET TO HOST NODE OF LEAST USED LINK          * 
*                                                                     * 
** EXTERNAL SUBROUTINES USED :                                        * 
*               1) PTGETPARM                                          * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PTCHOOSEHOST; 
VAR I : INTEGER;                            _FOR LOOP                  ?
BEGIN 
PTGETPARM (T9CMDSEP);                       _DETERMINE LENGTH OF NAME  ?
IF T9PLNG @ 7                               _NAME IS 1 - 7 CHARACTERS  ?
THEN
  BEGIN 
  FOR I := 1 TO 7 DO                        _BLANK HOST NAME ARRAY     ?
    T9HSNAME [I] := T9BLANK;
  FOR I := 1 TO T9PLNG DO                   _FOR ALL CHARACTERS OF NAME?
    BEGIN 
    T9HSNAME [I] :=                         _STORE IN HOST NAME ARRAY  ?
      T9CMDP'.BFDATAC [T9IND1]; 
    T9IND1 := T9IND1 + 1;                   _BUMP CHARACTER INDEX      ?
    END;
  
  T9HNWT := 0;                              _RESET HIGHEST WEIGHT VALUE?
  T9HCB  := DEHOSTABLE;                     _GET POINTER TO FIRST HCB  ?
  WHILE T9HCB'.BRTYP3.BRLAST "              _MORE HCBS TO CHECK        ?
        BREND DO
    BEGIN 
    FOR I := 1 TO 7 DO                      _CHECK ALL CHARS OF NAME   ?
      IF T9HSNAME [I] "                     _CHARACTER MISMATCH        ?
         T9HCB'.BRTYP3.BRHOST [I] 
      THEN                                  _ADVANCE TO NEXT HCB       ?
        GOTO 30;
  
    T9CORRECT := TRUE;                      _CORRECT HOST NAME         ?
    T9TCBP'.BSTCB.BSACON := FALSE;          _CLEAR AUTO-CONNECT FLAG   ?
    T9PTR := PNGTLLCB (CKLOCNODE,           _GET POINTER TO LLCB       ?
               T9HCB'.BRTYP3.BRNODE); 
    T9J   := (T9PTR'.BLLLCB.BLSPART.        _CALCULATE HOST NODE WEIGHT?
              BLREG * 256) + (256 - 
              T9PTR'.BLLLCB.BLSPART.BLCOUNT); 
    IF T9J > T9HNWT                         _BEST SO FAR ENCOUNTERED   ?
    THEN
      BEGIN                                 _STORE HOST NODE AS FV     ?
      T9FV [1] := T9HCB'.BRTYP3.BRNODE; 
      T9HNWT   := T9J;                      _SAVE HIGHEST NODE WEIGHT  ?
      END;
30:                                         _ENTRY FOR NAME MISMATCH   ?
    T9HCB := T9HCB + 5;                     _ADVANCE TO NEXT HCB       ?
    END;         _WHILE .... DO?
  
  END;         _IF T9PLNG @ 7 THEN? 
END; _ PROCEDURE PTCHOOSEHOST ? 
_$J+? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*                    PTTMRCCN                                         * 
*                                                                     * 
*        TERMINATE CONNECTION FOR TM OR HC IVT COMMAND                * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_$R-,G-,I-? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW -  IVT COMMANDS HC=HHHHHHH OR TM MUST                     * 
*              SHIP A D0TCB D5DISC WORKLIST ENTRY TO SVM FOR          * 
*              PROCESSING                                             * 
*              RC IVT COMMAND MUST SHIP A D0TCB D5RECON               * 
*                                                                     * 
** INPUT -     T9TCBP  SHOULD BE SET TO TCB OF CONNECTION TO SERVICE  * 
*              TEMPSFC SHOULD BE SET TO CMDATA OF D0TCB WLE TO SVM    * 
*                                                                     * 
** CALLING PROGRAMS -                                                 * 
*              PTIVTCMD FOR HC AND TM IVT COMMANDS                    * 
*                                                                     * 
** OUTPUT -    T9NOTIFY IVTNM BSACON    SET APPROPRIATELY             * 
*              WORKLIST SHIPPED TO SVM                                * 
*                                                                     * 
** EXTERNAL SUBROUTINES USED :                                        * 
*               1) PBLSPUT                                            * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PTTMRCCN(TEMPSFC : B08BITS ); 
  
BEGIN 
  T9TCBP'.BSTCB.BSACON := FALSE;            _CLEAR AUTO-CONNECT FLAG   ?
  IVTNM.BAINT := -1;                        _DO NOT SEND ACCEPTED..    ?
  IF T9TCBP'.BSTCB.BSCN = 0                 _NO HOST CONNECTED         ?
  THEN
    BEGIN 
    T9NOTIFY := H2NHNCONN;                  _INFORM THE USER AS SUCH BY?
    IF TEMPSFC = D5RECON                    _DEFAULT UNLESS            ?
    THEN                                    _WE ARE RECONFIGURING      ?
      T9NOTIFY := H2RECONFIG; 
    END;
  WITH T9WORKLIST.CMSMLEY DO
    BEGIN 
    CMWKCODE := D0TCB;                      _SET TCB EVENT WORKCODE    ?
    CMDATA   := TEMPSFC;                    _SET USER DISCONNECT/RECON ?
    CMPTR    := T9TCBP;                     _INSERT TCB ADDRESS        ?
    CMRC     := DAUSER;                     _INSERT REASON CODE        ?
    END;
  PBLSPUT (T9WORKLIST,                      _SEND WORKLIST TO SVM      ?
           BYWLCB [B0SMWL]);
END; _ PTTMRCCN ? 
_$J+? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
* * * *   B E G I N   P R O C E D U R E   P T I V T C M D             * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
BEGIN 
WITH T9CMDP' DO                             _INDEX TO COMMAND BUFFER   ?
  BEGIN 
_ 
* * * *  REMOVE BLANKS FROM IVT COMMAND, CONVERT TO UPPER CASE
*        PERFORM BACKSPACING (FOR SPECIAL EDIT OR FULL ASCII INPUT) 
? 
  T9PTR    := T9CMDP;                       _INITIALIZE SOURCE POINTER ?
  T9IND1   := T7SRCFCD - 1;                 _INITIALIZE SOURCE INDEX   ?
  T9IND2   := T7DSTFCD;                     _INITIALIZE DESTIN. INDEX  ?
  T9CMDSEP := CHR (T9TCBP'.BSTCB. 
                   BSCNTRLCHAR);            _GET COMMAND SEPARATOR CHAR?
  T9BLANK  := # #;                          _INIT. COMPRESS BLANKS     ?
10: 
  T9IND1   := T9IND1 + 1;                   _BUMP SOURCE INDEX         ?
  IF T9IND1 > T9PTR'.BFLCD
  THEN                                      _CURR. SRCE BUFR EXHAUSTED ?
    BEGIN 
    T9PTR  := T9PTR'.BCCHAINS [DBUFLENGTH]; _ADVANCE TO NEXT SOURCE BUF?
    T9IND1 := T9PTR'.BFFCD;                 _SET NEW SOURCE INDEX      ?
    END;
  IF T9PTR " NIL
  THEN                                      _MORE SOURCE CHARACTERS    ?
    BEGIN 
    T9CHAR.BA1CHAR := T9PTR'. 
                      BFDATAC [T9IND1];     _GET NEXT SOURCE CHARACTER ?
    IF T9CHAR.BA1CHAR " T9BLANK 
    THEN                                    _NOT A BLANK SOURCE CHAR   ?
      IF T9CHAR.BAINT = T9TCBP'.BSTCB.
                        BSBSCHAR
      THEN
        BEGIN                               _FOUND A BACKSPACE CHAR    ?
        IF T9IND2 > T7DSTFCD
        THEN                                _PERFORM BACKSPACING IF NOT?
          T9IND2 := T9IND2 - 1;             _AT BEGIN OF DESTINATION   ?
        END _IF T9CHAR = BSBSCHAR THEN? 
      ELSE
        BEGIN                               _NOT A BACKSPACE, CONVERT  ?
        IF T9CHAR.BAINT \ T7LCA             _IF THIS IS A LOWER CASE   ?
        THEN                                _CHARACTER                 ?
         IF T9CHAR.BAINT @ T7LCZ
          THEN
            T9CHAR.BAINT := T9CHAR.BAINT-$20; _CONVERT TO UPPER CASE   ?
        BFDATAC [T9IND2] := T9CHAR.BA1CHAR; _INSERT CHAR IN DESTIN BUF ?
        T9IND2           := T9IND2 + 1;     _BUMP DESTINATION INDEX    ?
        END; _IF T9CHAR = BSBSCHAR ELSE?
    IF T9IND2 < (T7DSTFCD + T7MXLENGTH) 
    THEN                                    _MAXIMUM STRING LENGTH NOT ?
      BEGIN                                 _REACHED, CONTINUE         ?
_ 
* * * *  TEST FOR MS= COMMAND TO AVOID COMPRESSION/CONVERSION OF TEXT 
? 
      IF T9IND2 = T7DSTFCD + 3              _FIRST CMD AND #=# SEEN    ?
      THEN
        IF BIINT [T7DSTFCD/2+1] = T7CSMS    _AND COMMAND IS MS=        ?
        THEN                                _YES                       ?
          BEGIN 
          T9BLANK     := CHR (0);           _TURN OFF CONVERSION       ?
          IVTNM.BAINT := T7CSMS;
          END;
      GOTO 10;                              _GET NEXT SOURCE CHARACTER ?
      END;
    END; _IF T9PTR " NIL? 
  BFDATAC [T9IND2] := T7CMDEOS;             _INSERT BLANK TERMINATOR   ?
  PBRELZRO (BCCHAINS[DBUFLENGTH], BEDBSIZE);_RELEASE ALL BUT FIRST BUFR?
_ 
* * * *  ACTION MS=TEXT COMMAND 
? 
  IF T9BLANK = CHR (0)                      _RECOGNIZED MS=.. COMMAND  ?
  THEN
    BEGIN 
    T9CORRECT := TRUE;                      _GOOD IVT COMMAND          ?
    IF CS " 0                               _SUPERVISION AVAILABLE     ?
    THEN
      BEGIN 
      IF T9IND2 > T7DSTFCD + 50 + 3         _CUT LENGTH OF MS TO 50 CHR?
      THEN                                  _(ACCOUNT FOR CHARS MS=)   ?
        T9IND2 := T7DSTFCD + 50 + 3;
      BFLCD           := T9IND2 - 1;        _SET LCD (REMOVE BLANK)    ?
      BFFCD           := T7DSTFCD + 3;      _SET FCD (REMOVE MS= CHARS)?
      BCCHAINS [QCHN] := T9TCBP;            _TCB PTR FOR PNSMGEN       ?
      GENSUP          := CS;                _SET SUPERVISOR (MAYBE 0)  ?
      GENPFC          := D8MSG;             _SET PFC - MESSAGE         ?
      GENSFC.DHINT    := D9OP;              _SET SFC - OPERATOR        ?
      GENPAR.BABUFPTR := T9CMDP;            _SET BUFFER ADDRESS        ?
      IF T9IND2 > T7DSTFCD + 3
      THEN                                  _AT LEAST SINGLE TEXT CHAR ?
        WITH BRTNJUMP [C1PNSMGEN] DO        _SEND TO CS VIA PNSMGEN    ?
          PBXFER (JENTADDR,JPAGEVAL); 
      T9CMDP := NIL;                        _CLEAR BUFFER PTR          ?
      END; _IF CS " 0?
    GOTO 50;                                _EXIT PROCEDURE            ?
    END; _IF T9BLANK = CHR (0)? 
  END; _WITH T9CMDP' DO?
_ 
* * * *  SET UP VARIABLES TO START SCANNING FOR FIRST IVT COMMAND.
*         DURING SCAN T9IND1 POINTS TO PREVIOUS SEPARATOR AND T9IND2
*         POINTS TO CURRENT SEPARATOR.
? 
T9IND2   := T7DSTFCD - 1;                   _INIT INDEX TO PREV. SEPAR.?
T9SPRTR  := CHR (0);                        _INIT CURRENT SEPARATOR    ?
_ 
* * * *  GET (NEXT) IVT COMMAND FROM COMMAND BUFFER 
? 
  REPEAT
  CONFIGOK  := D3BADCMD;                    _ASSUME BAD IVT COMMAND    ?
  T9CORRECT := FALSE;                       _ASSUME BAD COMMAND FORMAT ?
  T9NOTIFY  := 0;                           _CLEAR MESSAGE ORDINAL     ?
  FOR T9I := 1 TO T7NRFNFV DO               _CLEAR ALL POSSIBLE FN/FV-S?
    BEGIN 
    T9FN [T9I] := 0;
    T9FV [T9I] := 0;
    END;
  PTGETPARM (T7EQUAL);                      _GET IVT COMMAND NAME      ?
  IVTNM.BAINT := T9PCHARS;                  _SET GLOBAL IVT NAME FIELD ?
  IF T9PLNG = 2 
  THEN                                      _IVT NAME OF CORRECT LENGTH?
    BEGIN 
_ 
* * * *  SCAN THE COMMAND TABLE FOR THE PROPER ENTRY
? 
    T9CTIND := 1;                           _FIRST ENTRY IN CMD TABLE  ?
    WHILE IVTNM.BAINT > 
          T9CMDTBL [T9CTIND].T8NAME DO
      T9CTIND := T9CTIND + 1; 
  
    T9FN [1] := T9CMDTBL [T9CTIND].T8FN1;   _PRESET MOST LIKELY FN     ?
    T9ACTVAL := T9CMDTBL [T9CTIND].T8ACTVAL;_GET COMMAND ACTION VALUE  ?
    T9ACTION := T9CMDTBL [T9CTIND].T8ACTION;_GET COMMAND ACTION        ?
  
    IF (T9PCHARS = T9CMDTBL [T9CTIND].
        T8NAME)                             _CORRECT NAME AND          ?
    THEN
      BEGIN 
      CONFIGOK := D3FNFVERR;                _ASSUME BAD PARAMETER      ?
      IF (T9SPRTR = T7EQUAL) !              _SEPARATOR IS EQUAL-SIGN OR?
         (T9ACTION < 4)                     _OKAY WITH NO PARAMETERS   ?
      THEN                                  _VALID IVT COMMAND FOUND   ?
_ 
* * * *  FOUND A VALID IVT COMMAND MNEMONIC, GO PROCESS POSSIBLE PARAMS 
? 
      CASE T9ACTION OF                      _CASE OUT COMMAND ACTIONS  ?
_ 
 PTIVTCMD * * * *  ACTION XX TYPE COMMANDS (CH/HD/RC/TM)
? 
  0:  
        BEGIN 
        IF  T9SPRTR " T7EQUAL               _NO EQUAL SIGN SEPARATOR   ?
        THEN
          BEGIN 
          T9CORRECT := TRUE;                _NO PARAMETERS - CORRECT   ?
          CASE T9ACTVAL OF                  _CASE SUB COMMANDS         ?
  
          0: _CH COMMAND? 
            T9NOTIFY := H2TMLCHARS;         _CALL PNNOTIFY LATER FOR   ?
                                            _TERMINAL CHARACTERISTICS  ?
  
          1: _RC COMMAND                     RECONFIGURE TCB           ?
            IF T9TCBP'.BSTCB.BSCN = 0       _IF NO HOST CONNECTED      ?
            THEN                            _THEN                      ?
              PTTMRCCN (D5RECON)            _SHIP D0TCB/D5RECON TO SVM ?
            ELSE                            _ELSE CONNECTED TO HOST SO ?
              T9NOTIFY := H2HADONLY;        _SEND HAD DISPLAY          ?
  
          2: _TM COMMAND                     TERMINATE CONNECTION      ?
            PTTMRCCN (D5DISC);              _USE PTTMRCCN TO SEND      ?
                                            _DOTCB/D5DISC WLE TO SVM   ?
  
          3: _HD COMMAND? 
            T9NOTIFY := H2HADONLY;          _CALL PNNOTIFY LATER FOR   ?
                                            _HOST ACCESSIBILITY DISPLAY?
  
          END; _CASE T9ACTVAL OF ... SUBCASES OF T9ACTION = 0?
          END; _IF NO PARAMETERS? 
        END; _0:? 
_ 
* * * *  ACTION HC AND HC=HHHHHHH COMMANDS
? 
  1:  
        BEGIN 
        IF T9SPRTR " T7EQUAL                _HC TO RECONNECT           ?
        THEN
          BEGIN 
          T9CORRECT := TRUE;                _NO PARAMETERS IS OKAY     ?
          IF T9TCBP'.BSTCB.BSSHN = 0        _IF NO HOST SELECTED THEN  ?
          THEN                              _SELECT SUPERVISION IF ANY ?
            T9TCBP'.BSTCB.BSSHN := CS;      _IF NONE, SVM WILL GENERATE?
                                            _A DIAGNOSTIC HAD          ?
          END 
        ELSE  _ T9SPTR = T7EQUAL ?          _ACTION HC=HHHHHHH COMMAND ?
          PTCHOOSEHOST;                     _PTCHOO RETURNS BEST NODE  ?
                                            _AND T9CORRECT ON MATCH    ?
        IF T9CORRECT
        THEN
          BEGIN                             _REMEMBER HC IVT CMD BEING ?
          T9TCBP'.BSTCB.BSHCIN := TRUE;     _PROCESSED FOR CONNECTION  ?
          PTTMRCCN (D5DISC);                _TRIGGER AFTER DISCONNECT  ?
          END; _ IF T9CORRECT ? 
        END; _ 1: ? 
_ 
* * * *  ACTION XX=Y/N TYPE COMMANDS (BR/CD/CP/EP/FA/IC/LK/OC/PG/SE)
         AND PA/IN/OP 
? 
  2:  
        BEGIN 
        T9PCHARS := ORD (#Y#);              _DEFAULT CHARACTER IS Y(ES)?
        IF T9SPRTR = T7EQUAL
        THEN
          PTGETPARM (T9CMDSEP);             _GET PARAMETER             ?
        IF PTFINDHIT (0)                    _FIND PARAMETER            ?
        THEN
          BEGIN 
          WITH T9PHITBL [T9I] DO            _SET INDEX TO HIT TBL ENTRY?
            BEGIN 
            T9FV [1] := T8FV1;              _COPY FV1                  ?
            T9FN [2] := T8FN2;              _AND POSSIBLY REQUIRED     ?
            T9FV [2] := T8FV2;              _FN2/FV2                   ?
            END;
          IF T9ACTION = T7HDACT             _HOST ACCESSIBILITY DISPLAY?
          THEN
            IF T9FV [1] " 0                 _REQUESTING DISPLAY        ?
            THEN
              T9NOTIFY := H2HADONLY;        _CALL PNNOTIFY LATER       ?
  
          END; _IF PTFINDHIT (T9ACTVAL)?
        END; _2,3:? 
_ 
* * * *  ACTION XX=NNN TYPE COMMANDS (HN/PL/PW/TC)
? 
  4,5:  
        BEGIN 
        PTGETPARM (T9CMDSEP);               _GET PARAMETER             ?
        PTCNVINT (T9FV [1]);                _CONVERT NNN TO INTEGER    ?
        IF T9ACTION = T7HNACT               _HOST NODE SELECTION       ?
        THEN
          BEGIN 
          IF T9FV[1] = 0                    _IF HN=0 INPUT             ?
          THEN
            T9FV[1] := CS;                  _SELECT *CS* NODE          ?
          T9CORRECT := (PNGTLLCB (CKLOCNODE,
                        T9FV[1]) " NIL) & T9CORRECT;
          IF T9CORRECT                      _VALID HN COMMAND          ?
          THEN
            BEGIN 
            T9NOTIFY := H2HADONLY;          _CALL PNNOTIFY LATER       ?
            T9TCBP'.BSTCB.BSACON := FALSE;  _CLEAR AUTO-CONNECT FLAG   ?
            END;
          END; _ T9ACTION = T7HNACT ? 
        END; _4,5:? 
_ 
* * * *  ACTION XX=CA/NNN TYPE COMMANDS (CI/LI) 
? 
  6:  
        BEGIN 
        T9FN [2] := T9FN [1] + 2;           _PRESET SECOND FN VALUE    ?
        PTGETPARM (T9CMDSEP); 
        IF  T9PCHARS = T7CSCA 
        THEN
          BEGIN 
          T9CORRECT := TRUE;                _FORMAT CORRECT            ?
          T9FV [2]  := 1;                   _SET SECOND FV VALUE (YES) ?
          END 
        ELSE
          PTCNVINT (T9FV [1]);              _CONVERT NNN TO INTEGER    ?
        END; _6:? 
_ 
* * * *  ACTION XX=C (CHARACTER) TYPE COMMANDS (AB/BS/B1/B2/CN/CT)
? 
  7:  
        BEGIN 
        PTGETPARM (T9CMDSEP);               _GET NEXT PARAMETER        ?
        IF T9PLNG = 1 
        THEN
          BEGIN                             _SINGLE CHARACTER PASSED   ?
          T9CORRECT := TRUE;                _SINGLE CHARACTER CORRECT  ?
          T9FV [1]  := T9PCHARS;            _INSERT CHARACTER AS FV    ?
          END; _IF T9PLNG = 1?
        END; _7:? 
_ 
* * * *  ACTION DL/XL= COMMAND
? 
  8,9:  
        BEGIN 
        FOR T9I := 1 TO T7NRDLDF DO         _INITIALIZE DEFAULT FN-S   ?
          T9FN [T9I] := T9DLDFLTS [T9I];
        T9FLAG := FALSE;                    _CLEAR XHH/TO SEEN FLAG    ?
  
        REPEAT                              _PROCESS ALL PARAMETERS    ?
        T9CORRECT := FALSE;                 _RESET COMMAND CORRECT FLAG?
        PTGETPARM (T7PARMSEP);              _GET (NEXT) PARAMETER      ?
        IF T9PCHARS = T7CSTO                _DL=TO PARAMETER           ?
        THEN
          BEGIN 
          T9CORRECT := TRUE;                _FORMAT CORRECT SO FAR     ?
          T9FLAG    := TRUE;                _SET XHH/TO SEEN FLAG      ?
          T9FV [5]  := 1;                   _SET TIMEOUT ACTIVE        ?
          END 
        ELSE
          BEGIN 
          T9IND1 := T9IND1 + 1;             _SET INDEX PAST #C#/#X#/#Y#?
          IF T9PFIRST = ORD (#C#)           _DL=CNNNN PARAMETER        ?
          THEN
            BEGIN 
            PTCNVINT (T9FV [2]);            _CONVERT NNNN TO INTEGER   ?
            T9FV [1] := T9FV [2] / $100;    _GET UPPER BITS OF NNNN    ?
            END 
          ELSE
            IF T9PFIRST = ORD (#X#)         _DL=XHH PARAMETER          ?
            THEN
              BEGIN 
              T9FN [6] := T7DLXFN;          _SET FN FOR 1ST DELIMITER  ?
              T9FN [7] := T7DLYFN;          _SET FN FOR 2ND DELIMITER  ?
              PTCNVHEX (T9FV [6]);          _CONVERT #X# TO INTEGER    ?
              T9FV [7] := T9FV [6];         _#Y# EQ #X# IF NOT FOLLOWNG?
              T9FLAG   := TRUE;             _SET XHH/TO SEEN FLAG      ?
              T9FV [3] := 1;                _SET CHARACTER ACTIVE      ?
              END 
            ELSE
              IF T9PFIRST = ORD (#Y#)       _DL=YHH PARAMETER          ?
              THEN
                PTCNVHEX (T9FV [7]);        _CONVERT #Y# TO INTEGER    ?
          END; _IF T9PCHARS = T7CSTO ELSE?
  
        IF T9CORRECT = FALSE                _BAD FORMAT DETECTED       ?
        THEN
          T9SPRTR := T7CMDEOS;              _END PROCESSING            ?
  
        UNTIL T9SPRTR " T7PARMSEP;          _END OF PARAM PROCESSING   ?
  
        IF T9ACTION = T7XLACT               _MULTI-MSG TRANSPARENT DLMS?
        THEN
          BEGIN 
          T9CORRECT := T9CORRECT & T9FLAG;  _MUST HAVE XHH OR TO       ?
          T9FV [4]  := 1;                   _SET MULTI-MSG XPT ACTIVE  ?
          END; _IF T9ACTION = T7XLACT?
        END; _8,9:? 
_ 
* * * *  ACTION EL/EB COMMAND 
? 
  10,11:  
        BEGIN 
        T9J := 0;                           _RESET OFFSET              ?
        IF T9ACTION = T7EBACT 
        THEN
          T9J := 3;                         _OFFSET TO EB FN-S         ?
        REPEAT                              _PROCESS ALL PARAMETERS    ?
        T9CORRECT := FALSE;                 _RESET COMMAND CORRECT FLAG?
        PTGETPARM (T7PARMSEP);              _GET (NEXT) PARAMETER      ?
        IF T9PLNG = 1 
        THEN                                _SINGLE CHARACTER PARAMETER?
          BEGIN 
          T9FN [1]  := T7ELFN + T9J;        _END OF LINE/BLOCK CHAR    ?
          T9FV [1]  := T9PCHARS;            _INSERT CHARACTER AS FV    ?
          T9CORRECT := TRUE;
          END 
        ELSE
          IF PTFINDHIT (0)                  _EL/EB/CR/LF/CR PARAMETER  ?
          THEN
            WITH T9PHITBL [T9I] DO          _SET INDEX TO HIT TBL ENTRY?
              BEGIN 
              T9FN [T8IND] := T8FN + T9J;   _COPY APPROPRIATE FN       ?
              T9FV [T8IND] := T8FV;         _AND FV                    ?
              END;
        IF T9CORRECT = FALSE                _BAD FORMAT DETECTED       ?
        THEN
          T9SPRTR := T7CMDEOS;              _END PROCESSING            ?
  
        UNTIL T9SPRTR " T7PARMSEP;          _END OF PARAM PROCESSING   ?
  
        END; _10,11:? 
_ 
* * * *  ACTION HS=NAME COMMAND 
? 
  12: 
        BEGIN 
          PTCHOOSEHOST;                     _FIND MOST APPROPRIATE HN  ?
        IF T9CORRECT                        _IF WE WILL PROCESS HS CMD ?
        THEN
          T9NOTIFY := H2HADONLY;            _CALL PNNOTIFY LATER       ?
        END; _12:?
  
        END; _CASE T9ACTION OF? 
  
      END; _IF T8NAME OK? 
    END; _IF T9PLNG = 2?
_ 
* * * *  CALL PNCONFIGURE TO PROCESS GENERATED FN/FV PAIRS
? 
  IF T9CORRECT                              _COMMAND FORMAT CORRECT    ?
  THEN
    BEGIN 
    WITH T9CNFBFR DO                        _SET UP PSEUDO CONF. BFR   ?
      BEGIN 
      T9J := 0; 
      FOR T9I := 1 TO T7NRFNFV DO           _FOR ALL POSSIBLE FN/FV-S  ?
        IF T9FN [T9I] " 0                   _TEST FN USED              ?
        THEN
          BEGIN 
          T8CPAIR [T9J].T8CFN := T9FN [T9I];_COPY FN                   ?
          T8CPAIR [T9J].T8CFV := T9FV [T9I];_AND  FV                   ?
          T9J                 := T9J + 1;   _INCREMENT COUNTER         ?
          END;
      END; _WITH T9CNFBFR DO? 
    IF T9J " 0                              _TEST ANY PAIRS PRODUCED   ?
    THEN
      BEGIN 
      T9CNFBFR.T8LCDFCD :=                  _SET LCD/FCD OF PSEUDO BFR ?
        ((T9J * 2) + 1) * $100 + 2; 
      ADDR (T9CNFBFR,D0BFR);                _SET PNCONFIGURES BUFFER   ?
      D0FDT := D0TCBFDT;                    _SET FIELD DESCRIPTION TBL ?
      D0IVT := TRUE;                        _SET COMING FROM IVT       ?
      D0CB  := T9TCBP;                      _SET CONTROL BLOCK POINTER ?
      D0AT  := BJTIPTYPT [T9TCBP'.BSTCB.    _SET CONSOLE ACTION TABLE  ?
               BSLCBP'.BZTIPTYPE].
               BJJAT [N1CON]; 
      WITH BRTNJUMP [C1PNCONF] DO           _CALL PNCONFIGURE          ?
        PBXFER (JENTADDR,JPAGEVAL); 
      T9CORRECT := CONFIGOK = D3AC;         _DETERMINE COMMAND CORRECT ?
  
      END; _IF T9J " 0? 
    END; _IF T9CORRECT? 
_ 
* * * *  CALL NOTIFY PROCESSOR IF NECESSARY (CH/HD) 
? 
  IF T9CORRECT                              _COMMAND FORMAT CORRECT    ?
  THEN
    BEGIN 
    IF T9NOTIFY " 0                         _TEST NEED TO CALL PNNOTIFY?
    THEN
      BEGIN 
      IVTNM.BAINT := -1;                    _DO NOT SEND ACCEPTED..    ?
      PNNOTIFY (-T9NOTIFY,T9TCBP);          _YES, DO SO                ?
      END;
    END _IF T9CORRECT?
  ELSE
    T9SPRTR := T7CMDEOS;                    _BAD COMMAND - TERMINATE   ?
  
  UNTIL T9SPRTR = T7CMDEOS;                 _UNTIL BLANK SEPARATOR FND ?
                                            _OR BAD COMMAND DETECTED   ?
50:                                         _ENTRY FOR MS COMMAND      ?
  
PBRELZRO (T9CMDP, BEDBSIZE);                _RELEASE COMMAND BUFFER    ?
PGIVTCMD := T9CORRECT;                      _RETURN BAD/GOOD STATUS    ?
END; _FUNCTION PGIVTCMD?
_$J+? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
* * * *   T O P H A T   F O R   P T I V T C M D                       * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
FUNCTION PTIVTCMD; _(T9CMDP, T9TCBP: B0BUFPTR; T9SOURCE: C9SOURCE) :  
                    BOOLEAN  ;? 
  
VAR 
  T9PAGE : INTEGER; 
  
BEGIN 
PBRDPGE (T9PAGE);                           _SAVE CALLERS PAGE NR      ?
PBPSWITCH (BPGSWITCH [P1PTIVTCMD]);         _SWITCH TO PTIVTCMD PAGE   ?
PTIVTCMD := PGIVTCMD (T9CMDP, T9TCBP, 
                      T9SOURCE);            _CALL ROUTINE ON PAGE      ?
PBPSWITCH (T9PAGE);                         _SWITCH BACK               ?
END;
