*COMDECK X25NTSD3 
_$J+? 
_ 
  
               NN      NN  TTTTTTTTTT    SSSSSS 
               NNN     NN  TTTTTTTTTT   SSSSSSSS
               NNNN    NN      TT      SS      SS 
               NN NN   NN      TT      SS 
               NN  NN  NN      TT      SSSSSSSSS
               NN   NN NN      TT       SSSSSSSSS 
               NN    NNNN      TT              SS 
               NN     NNN      TT      SS      SS 
               NN      NN      TT       SSSSSSSS
               NN      NN      TT        SSSSSS 
  
  
  
          DDDDDDDD    BBBBBBBB      GGGGGG      333333
          DDDDDDDDD   BBBBBBBBB    GGGGGGGG    33333333 
          DD      DD  BB      BB  GG      GG  33      33
          DD      DD  BB      BB  GG                  33
          DD      DD  BBBBBBBBB   GG    GGGG      33333 
          DD      DD  BBBBBBBBB   GG    GGGG      33333 
          DD      DD  BB      BB  GG      GG          33
          DD      DD  BB      BB  GG      GG  33      33
          DDDDDDDDD   BBBBBBBBB    GGGGGGGG    33333333 
          DDDDDDDD    BBBBBBBB      GGGGGG      333333
  
  
  
  
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*                    PNTSTIP                                          * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_$R-,G-,I-? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW -                                                         * 
*     N E T W O R K  T E R M I N A L  S T I M U L A T O R             * 
*                  I N T E R F A C E                                  * 
** INPUT -                                                            * 
*              BWWLENTRY[OPS] = WORKLIST ENTRY                        * 
*                                                                     * 
** CALLING PROGRAMS                                                   * 
*              PBMON         -SYSTEM MONITOR                          * 
*                                                                     * 
** OUTPUT -                                                           * 
** EXTERNAL SUBROUTINES -                                             * 
** NOTES -                                                            * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_ 
THE NTS TIP IS USED TO DRIVE FICTICIOUS ASYNC LINES.
IT HAS TWO MAIN PURPOSES: 
  -ACT AS A REAL ASYNC TERMINAL FOR THE NTS STIMULATOR. 
  -ACT AS A PAD TERMINAL FOR THE X.25 SOFTWARE. 
HENCE THE SAME VIRTUAL TERMINAL IS LOGGED-IN TWICE. 
  
DOWNLINE THE NTS TIP PROCESSES THE FOLLOWING FUNCTIONS: 
  -A0SMEN 
  -A0SMDA 
  -A0SMRCTCB
  SVM IS MODIFIED NOT TO CALL PTLINIT FOR THESES LINES. 
  -A0QUEOUT : FOR THE FIRST DOWNLINE BLOCK (WHICH MUST BE 
              AN INCOMING CALL PACKET, NTS TIP HAS TO MAKE
              A LINK BETWEEN THE NTS TCB SUPPORTING THE 
              DOWNLINE BLOCK AND THE PAD TCB TO WHICH IT IS 
              ADDRESSED ( USING THE LOGICAL CHANNEL NUMBER).
              DUE TO CS TIMING, IF THE PAD TCB IS NOT 
              GENERATED YET, THE A0QUEOUT WILL BE QUEUED BACK 
              UNTIL THE PAD CONNECTION BECOMES AVAILABLE. 
              ALSO THE NTS TIP TRANSFERS DATA TO X.25 LEVEL 2 
              ONLY WHEN A MSG BLOCK IS RECEIVED. THE PROCEDURE
              PSPBLOCKS IS USED TO EXTRACT DOWNLINE BLOCKS
              FROM THE DOWNLINE BLOCK QUEUE AND QUEUE THEM BACK 
              INTO AN INTERNAL DRIVEN QUEUE (BSOQR-BSOQW).
              ANY TIME A BLOCK IS EXTRACTED A BACK BLOCK IS 
              GENERATED. IN ORDER TO DO A KIND OF FLOW CONTROL
              THE NTS TIP WILL BE WAITING FOR THE CORRESPONDING 
              MMOBUX WORKLIST GENERATED BY X.25 LEVEL 2.
             DURING THE INITIALIZATION PHASE TWO FIELDS WILL BE SET 
               .IN THE NTS TCB BSLINK HOLD THE PAD TCB ADDRESS
               .IN THE CORRESPONDING LCCB LCLINO HOLDS
                THE LINE NUMBER ON WHICH NTS TIP IS CONNECTED 
                (THIS FIELD IS USED BY X.25 LEVEL 2 TO GENERATED THE
                 PROPER L2OUTPUT AND MMOBUX WORKLISTS). 
  
  
UPLINE TWO WORKLISTS ARE SUPPORTED: 
  -L2OUTPUT : FRAME SENT BY X.25 LEVEL 2. THIS FRAME IS SENT
              UPLINE AS AN MSG BLOCK, AND AN MMOBUX WORKLIST
              IS QUEUED BACK TO X.25 LEVEL 2. 
  -MMOBUX   : OUTPUT BUFFER TRANSMITTED. THIS ONLY MEANS THAT 
              X.25 LEVEL 2 CORRECTLY RECEIVED THE L2GDFRM 
              WORKLIST. 
? 
PROCEDURE PNTSD3; 
CONST 
*CALL X25CON01
  
TYPE
  
*CALL X25TYP02
*CALL X25TYP07
*CALL X25TYP08
  
VAR 
  
      XIPARAMS : X0PARAMS;                  _INPUT WORKLIST            ?
      XOPARAMS : X0PARAMS;                  _OUTPUT WORKLIST           ?
      XSLCB    : BZLCBP;                    _LCB POINTER               ?
      XSLCCB   : B0BUFPTR;                  _LCCB POINTER              ?
      XNOBFPTR : B0BUFPTR;                  _BUFFER POINTER            ?
      XSQR     : B0BUFPTR;                  _PSPBLOCKS READ            ?
      XSQW     : B0BUFPTR;                  _PSPBLOCKS WRITE           ?
      NTPCB    : B0BUFPTR;                  _NTS TPCB                  ?
      XSPTR    : X0BUFPTR;                  _INTERNAL POINTER          ?
  
_     * * *  BIP INTERFACE                                             ?
      XDLBLOCK : B0BUFPTR;
_$J+? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*                    PSTELLSVM                                        * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW -                                                         * 
*              GENERATE AND QUEUE A SERVICE MESSAGE                   * 
*                                                                     * 
** INPUT -                                                            * 
*              XSSVMWC = WORKCODE FOR SVM                             * 
*              XALINO  = LINE NUMBER(FROM XIPARAMS)                   * 
*              XATCBLCCB = TCB ADDRESS(FROM XIPARAMS)                 * 
*                                                                     * 
** CALLING PROGRAMS                                                   * 
** OUTPUT -                                                           * 
*              WORKLIST QUEUED TO SVM                                 * 
*                                                                     * 
** EXTERNAL SUBROUTINES -                                             * 
*              PBLSPUT       -QUEUE A WORKLIST                        * 
*                                                                     * 
** NOTES -                                                            * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PSTELLSVM( XSSVMWC : B08BITS);
  
BEGIN 
WITH XOPARAMS DO                            _OUTPUT WORKLIST           ?
  BEGIN 
  
  XAWC := XSSVMWC;                          _WORKCODE                  ?
  
  CASE XSSVMWC OF 
  
    C0LINOP,                                _ENABLE LINE               ?
    C0LNDA:                                 _DISABLE LINE              ?
      BEGIN 
      XALINO := XIPARAMS.XALINO;
      XABFRPTR := NIL;                      _CLEAR BUFFER POINTER      ?
      END; _C0LINOP,C0LNDA? 
  
    C0RCTCB:                                _RECONFIGURE TCB           ?
      XATCBLCCB := XIPARAMS.XABFRPTR; 
  
    END; _CASE XSSVMWC? 
  PBLSPUT(XAWORKLIST,BYWLCB[B0SMWL]); 
  END; _WITH XOPARAMS?
END; _PROCEDURE PSTELLSVM?
_$J+? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*                    PSSEARCH                                         * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW -                                                         * 
*              TRIES TO MAKE A CONNECTION BETWEEN A PAD TCB           * 
*              AND AN NTS TCB, USING LCN NUMBER                       * 
*              WHEN THE DOWNLINE BLOCK IS A CMD BLOCK                 * 
*              THIS BLOCK IS BACKED AND DISCARDED                     * 
*                                                                     * 
** INPUT -                                                            * 
*              B1TCB   = NTS TCB ADDRESS                              * 
*              XSLCHN  = LOGICAL CHANNEL NUMBER(FORM BUFFER)          * 
*                                                                     * 
** CALLING PROGRAMS                                                   * 
*              PNTSTIP       -MAIN CODE                               * 
*                                                                     * 
** OUTPUT -                                                           * 
*              IF A MATCH IS FOUND:                                   * 
*                BSNTSINIT = TRUE                                     * 
*                BSLINK    = PAD TCB ADDRESS                          * 
*                LCLINO    = NTS LINE NUMBER                          * 
*                PSSEARCH  = TRUE                                     * 
*                                                                     * 
*              IF NOT FOUND:                                          * 
*                PSSEARCH  = FALSE                                    * 
*                                                                     * 
** EXTERNAL SUBROUTINES -                                             * 
*              PN5SRCH       -FIND LCCB ADDRESS                       * 
*              PBPROPOI      -PRE OUTPUT POI                          * 
*              PBRELCHN      -RELEASE BUFFERS                         * 
*              PTBACK        -GENERATE A BACK BLOCK                   * 
*                                                                     * 
** NOTES -                                                            * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
FUNCTION PSSEARCH( I : BOOLEAN ) : BOOLEAN; 
TYPE
  
      X0LCHN = PACKED RECORD
  
      CASE X : INTEGER OF 
  
        1 : ( XBCHN  : B0OVERLAY);
        2 : ( XBGFID : B04BITS; 
              XBLCHN : B012BITS); 
      END; _XSLCHN? 
VAR 
      XSLCHN : X0LCHN;
      XSEARCH : BOOLEAN;
      XSWK    : B0OVERLAY;
  
BEGIN 
WITH B1TCB'.BSTCB DO                        _TCB POINTER               ?
  
  BEGIN 
_ 
* * * *  IF DOWNLINE BLOCK IS A CMD THEN DISCARD IT 
? 
  XSWK.BARCHAR := BSQPTR.BABUFPTR'.BFDATAC[BTPT]; 
  IF XSWK.BABLKTYPE.BTYPE = HTCMD           _CMD BLOCK                 ?
  THEN
    BEGIN 
    XDLBLOCK := NIL;                        _CLEAR DOWNLINE DATA PTR   ?
    PBQUEMAINT(B1TCB, XDLBLOCK, 0, 0);      _GET DOWNLINE DATA         ?
    PBRELCHN(XDLBLOCK, BEDBSIZE);           _RELEASE NETWORK BLOCK BUF ?
    PSSEARCH := FALSE;
    END 
  ELSE                                      _NOT A CMD BLOCK           ?
    BEGIN 
    XSLCHN.XBCHN.BALCHAR := BSQPTR.BABUFPTR'.BFDATAC[15]; 
    XSLCHN.XBCHN.BARCHAR := BSQPTR.BABUFPTR'.BFDATAC[16]; 
    IF XSLCHN.XBGFID = 1                    _NORMAL GFID               ?
    THEN
      XSEARCH := TRUE 
    ELSE
      XSEARCH := FALSE; 
    XSLCHN.XBGFID := 0;                     _CLEAR GFID                ?
    PN5SRCH(X25LINO,XSLCHN.XBLCHN,XSLCCB);
  
    IF (( XSLCCB'.LCCB.LCTCBPTR " NIL ) &   _TCB ATTACHED              ?
         ( XSLCCB " NIL ) &                 _LCCB FOUND                ?
         ( XSEARCH ))                       _GFID CORRECT              ?
    THEN
      BEGIN 
      PSSEARCH := TRUE;                     _FOUND A MATCH             ?
      BSNTSINIT := TRUE;                    _INITIALIZED;              ?
      BSLINK := XSLCCB'.LCCB.LCTCBPTR;
      XSLCCB'.LCCB.LCLINO := BSLCBP'.BZLINO;
      END 
    ELSE
      PSSEARCH := FALSE;                    _NOT FOUND                 ?
    END; _IF BLOCK TYPE = CMD?
  END; _WITH B1TCB'.BSTCB?
END; _FUNCTION PSSEARCH?
_$J+? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*                    PSXMIT                                           * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW -                                                         * 
*              OUTPUTS A FRAME TO X.25 LEVEL 2                        * 
*                                                                     * 
** INPUT -                                                            * 
*              B1TCB   = TCB POINTER                                  * 
*                BSOON = OUTPUT ON                                    * 
*                BSOQR = BLOCK READ POINTER                           * 
*              NTPCB   = TEXT PROCESSING CONTROL BLOCK                * 
*                                                                     * 
** CALLING PROGRAMS                                                   * 
*              PSPBLOCKS     -PROCESS DOWNLINE BLOCKS                 * 
*                                                                     * 
** OUTPUT -                                                           * 
*              WORKLIST QUEUED TO LEVEL 2                             * 
*                                                                     * 
P 
** EXTERNAL SUBROUTINES -                                             * 
*              PTTPINF       -TEXT PROCESSOR INTERFACE                * 
*                                                                     * 
** NOTES -                                                            * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PSXMIT; 
  
BEGIN 
WITH B1TCB'.BSTCB,                          _TCB POINTER               ?
     NTPCB'.BGMLCB,                         _TEXT PROCESSING           ?
     XOPARAMS DO
  
  BEGIN 
  
  IF ( ^BSOON ) & ( BSOQR " NIL )           _CONDITIONS MET            ?
  THEN
    BEGIN 
    NCFSBA := BSOQR;                        _GET NEXT BLOCK            ?
    BSOQR := BSOQR'.BCCHAINS[QCHN]; 
    BSOON := TRUE;
  
    NCISTAI := 4;                           _FIRST STATE               ?
    NCIBFCD := 8;                           _FCD FOR 1RST BUFFER       ?
    NCSBP := NIL; 
    NCDBP := NIL; 
  
    PTTPINF(NTPCB');                        _CALL TEXT PROCESSOR       ?
  
    PBRELCHN(NCFSBA,BEDBSIZE);              _RELEASE SOURCE            ?
    XAWC := L2GDFRM;
    XALINO := X25LINO;
    XAFRMPTR := NCFDBA; 
_?
_ 
* * * *  CHECK FOR AUTOMATIC SEQUENCING 
? 
_?
    XSPTR.X1BFPTR := NCFDBA;
    WITH XSPTR.X2BFPTR'.XBPKHDR DO
      BEGIN 
      IF ( ^XPKIDL ) &                      _DATA PACKET               ?
         ( X25SEQ )                         _AUTOMATIC SEQ ON          ?
      THEN
        BEGIN 
        XPPS := BSPVS;
        BSPVS := BSPVS + 1; 
        XPPR := BSPVR;
        END; _AUTO? 
      END; _WITH XSPTR'?
  
    PBLSPUT(XAWORKLIST,BYWLCB[B0XL2]);
  
    END; _IF ( ^BSOON ) & (BSQR " NIL)? 
  END; _WITH B1TCB'BSTCB,...? 
END; _PROCEDURE PSXMIT? 
_$J+? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*                    PSPBLOCKS                                        * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW -                                                         * 
*              DEQUEUE DOWNLINE BLOCKS FORM BSQPTR AND QUEUE          * 
*              THEM INTO BSOQR-BSOQW. CALL TRANSMITTER IF AN MSG      * 
*              BLOCK IS FOUND                                         * 
*                                                                     * 
** INPUT -                                                            * 
*              B1TCB   = TCB ADDRESS                                  * 
*              BSQPTR  = DOWNLINE BLOCK POINTER                       * 
*                                                                     * 
** CALLING PROGRAMS                                                   * 
*              PNTSTIP       -MAIN CODE                               * 
*                                                                     * 
** OUTPUT -                                                           * 
*              BSOQR, BSOQW, BSQPTR ARE UPDATED                       * 
*                                                                     * 
** EXTERNAL SUBROUTINES -                                             * 
*              PBPROPOI      -PRE-OUTPUT POI                          * 
*              PTBACK        -GENERATE A BACK BLOCK                   * 
*                                                                     * 
** NOTES -                                                            * 
*                                                                     * 
*              PSPBLOCKS ALLOWS A BLK/BLK...MSG SEQUENCE TO BE        * 
*              SENT AS A SINGLE -L2GDFRM- TO X.25 LEVEL 2.            * 
*              PSPBLOCKS HOLDS AN INTERNAL QUEUE DRIVEN BY            * 
*              -XSQR- AND -XSQW- UNTIL A MSG BLOCK IS RECEIVED        * 
*              WITHIN THIS QUEUE, BLOCKS ARE CHAINED VIA              * 
*              -DBUFLENGTH-. WHEN A MSG BLOCK IS RECEIVED             * 
*              THIS QUEUE IS TRANSFERRED TO THE TRANSMITTER           * 
*              QUEUE DRIVEN BY -BSOQR- AND -BSOQW- WHERE BLOCKS       * 
*              ARE CHAINED VIA -QCHN-                                 * 
*                                                                     * 
*              UPLINE/DOWNLINE BLOCKS ARE FORMATTED AS FOLLOWS:       * 
*              DN    -SN     08-09                                    * 
*              CN    -BT     10-11                                    * 
*              DBC   -A      12-13                                    * 
*              C     -GFID   14-15                                    * 
*              LCHN  -PKTYP  16-17                                    * 
*                                                                     * 
*              BEFORE BEING SENT TO LEVEL 2 BLOCKS ARE FORMATTED      * 
*              A   -C     08-09                                       * 
*              GFID-LCHN  10-11                                       * 
*              PKTYP-DATA 12-13                                       * 
*                                                                     * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PSPBLOCKS;
TYPE
  
      X0LCHN = PACKED RECORD
  
      CASE X : INTEGER OF 
  
        1 : ( XBCHN  : B0OVERLAY);
        2 : ( XBGFID : B04BITS; 
              XBLCHN : B012BITS); 
      END; _XSLCHN? 
VAR 
  
      XSWK : B0OVERLAY; 
      XSLCHN : X0LCHN;
      XSMSG : PACKED ARRAY[1..10] OF CHAR;
  
VALUE 
      XSMSG = (#DISCARDED #); 
BEGIN 
WITH B1TCB'.BSTCB DO                        _TCB POINTER               ?
  
  BEGIN 
  XSWK.BAINT := 0;
  
  WHILE ( BSQPTR.BABUFPTR " NIL ) DO        _MORE BLOCKS IN QUEUE      ?
    BEGIN                                   _STILL MORE BLOCKS IN QUEUE?
                                            _AND NO MSG BLOCK          ?
    XDLBLOCK := NIL;                        _CLEAR DOWNLINE DATA PTR   ?
    PBQUEMAINT(B1TCB, XDLBLOCK, 0, 0);      _GET DOWNLINE DATA         ?
    B1BUFF   := XDLBLOCK; 
    B1BUFF'.BFFCD := 13;                    _SKIP NETWORK HEADER + DBC ?
  
_ 
* * * *  DOWNLINE COMMAND BLOCKS ARE DISCARDED
* * * *  ONLY TRANSPARENT DATA IS USED
? 
    XSWK.BARCHAR := B1BUFF'.BFDATAC[BTPT];  _GET BLOCK TYPE            ?
    IF XSWK.BABLKTYPE.BTYPE = HTCMD         _IF COMMAND BLOCK          ?
    THEN
      PBRELCHN(B1BUFF,BEDBSIZE)             _DISCARD IT                ?
    ELSE
      BEGIN 
      IF XSQR = NIL                         _FIRST BLK BLOCK           ?
      THEN
        BEGIN 
        XSQR := B1BUFF; 
        XSQW := B1BUFF; 
        END 
      ELSE
        XSQW'.BCCHAINS[DBUFLENGTH] := B1BUFF; 
      WHILE XSQW'.BCCHAINS[DBUFLENGTH] " NIL DO 
        XSQW := XSQW'.BCCHAINS[DBUFLENGTH]; 
  
      IF XSWK.BABLKTYPE.BTYPE = HTMSG       _MSG BLOCK FOUND           ?
      THEN
        BEGIN 
        XSLCHN.XBCHN.BALCHAR := XSQR'.BFDATAC[15];
        XSLCHN.XBCHN.BARCHAR := XSQR'.BFDATAC[16];
        XSLCHN.XBGFID := 0; 
        PN5SRCH(X25LINO,XSLCHN.XBLCHN,XSLCCB);
        IF XSLCCB = NIL                     _NO LCCB FOUND             ?
        THEN
          BEGIN 
          B1BUFF := XSQR; 
          B1BT := HTMSG;
          WITH B1BUFF' DO 
            BEGIN 
            PBLOAD(B1BUFF,XSMSG,18,27); 
            BFFCD := 8; 
            BFLCD := 27;
            WITH  B1TCB'.BSTCB, BSFLGWRD  DO
              BEGIN 
              BSINPBUF := B1BUFF;           _SET UP UNLINE DATA        ?
              KTIGNRCN := FALSE;            _IGNOR CANCEL              ?
              KTSEND   := TRUE;             _SEND THIS DATA TO HOST    ?
              KTCKSP   := TRUE;             _CHECK FOR SPECIAL         ?
              KTBLKT   := HTMSG;            _MSG TYPE BLOCK            ?
_ 
              * * *  CALL UPLINE TIP SERVICE  * * * 
? 
              PBULTS(B1TCB);
  
              KTWORD   := 0;                _CLEAR BIP FLAG WORD       ?
              END;  _ WITH BSTCB, BSFLGWRD ?
            END; _WITH B1BUFF?
          XSQR := NIL;
          END 
        ELSE
          BEGIN 
          IF BSOQR = NIL                    _XMITTER QUEUE EMPTY       ?
          THEN
            BEGIN 
            BSOQR := XSQR;
            BSOQW := XSQR;
            END 
          ELSE
            BEGIN 
            BSOQW'.BCCHAINS[QCHN] := XSQR;  _CHAIN NEXT SEGMENT        ?
            BSOQW := XSQR;
            END;
          XSQR := NIL;
          XSQW := NIL;
          PSXMIT;                           _CALL TRANSMITTER          ?
          END; _XSLCCB = NIL? 
        END; _MSG BLOCK FOUND?
      END; _NOT A CMD BLOCK?
    END; _WHILE ( BSQPTR " NIL )? 
  END; _WITH B1TCB'.BSTCB?
END; _PROCEDURE PSPBLOCKS?
_$J+? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*                    PSTAROUND                                        * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_?
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW -                                                         * 
*              THIS PROCEDURE IS USED TO FIND NHP/CCP THRUPUT.        * 
*              ALL -CMD- BLOCKS ARE DISCARDED.                        * 
*              ALL BLK/CMD BLOCKS ARE SWITCHED UPLINE.                * 
*                                                                     * 
** INPUT -                                                            * 
*              BSQPTR  = NTS DOWNLINE QUEUE POINTER                   * 
*                                                                     * 
** CALLING PROGRAMS                                                   * 
*              PNTSTIP       -MAIN CODE                               * 
*                                                                     * 
** OUTPUT -                                                           * 
** EXTERNAL SUBROUTINES -                                             * 
*              PBPROPOI      -GET NEXT BLOCK                          * 
*              PTBACK        -BACK ONE BLOCK                          * 
*              PBPIPOI       -SWITCH BLOCK UPLINE                     * 
*              PBRELCHN      -RELEASE BUFFER CHAIN                    * 
*                                                                     * 
** NOTES -                                                            * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PSTAROUND;
VAR 
      XSWK : B0OVERLAY; 
  
BEGIN 
  
WHILE ( B1TCB'.BSTCB.BSQPTR.BABUFPTR " NIL ) DO 
  
  BEGIN 
  XDLBLOCK := NIL;                          _CLEAR DOWNLINE DATA PTR   ?
  PBQUEMAINT(B1TCB, XDLBLOCK, 0, 0);        _GET DOWNLINE DATA         ?
  B1BUFF   := XDLBLOCK; 
  
  XSWK.BARCHAR := B1BUFF'.BFDATAC[BTPT];
  IF XSWK.BABLKTYPE.BTYPE = HTCMD 
  THEN
    PBRELCHN(B1BUFF,BEDBSIZE)               _DISCARD CMD BLOCKS        ?
  ELSE
    BEGIN 
    B1BUFF'.BFFCD := 12;                    _SKIP NETWORK HEADER       ?
    B1BT := HTMSG;
    WITH  B1TCB'.BSTCB, BSFLGWRD  DO
      BEGIN 
      BSINPBUF := B1BUFF;                   _SET UP UNLINE DATA        ?
      KTIGNRCN := FALSE;                    _IGNOR CANCEL              ?
      KTSEND   := TRUE;                     _SEND THIS DATA TO HOST    ?
      KTCKSP   := TRUE;                     _CHECK FOR SPECIAL         ?
      KTBLKT   := HTMSG;                    _MSG TYPE BLOCK            ?
_ 
      * * *  CALL UPLINE TIP SERVICE  * * * 
? 
      PBULTS(B1TCB);
  
      KTWORD   := 0;                        _CLEAR BIP FLAG WORD       ?
      END;  _ WITH BSTCB, BSFLGWRD ?
    END; _IF BTYPE = HTCMD? 
  END; _WHILE MORE BLOCKS?
END; _PROCEDURE PSTAROUND?
_$J+? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*              PNTSTIP MAIN CODE                                      * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
BEGIN 
XIPARAMS.XAWORKLIST := BWWLENTRY[OPS];
WITH XIPARAMS DO                            _INPUT WORKLIST            ?
  
  BEGIN 
  
  CASE XAWC OF
  
    A0SMEN:                                 _ENABLE LINE               ?
      BEGIN 
      TOPSEUDO := TRUE;                     _NTS IS RUNNING            ?
      IF NTPCB = NIL                        _NOT ASSIGNED YET          ?
      THEN
        BEGIN 
        NTPCB := PBGET1BF(B0S32); 
        PBCLR(NTPCB,32);
        NTPCB'.BGMLCB.NCISPTA := PNTSTP;
        END;
      PSTELLSVM(C0LINOP); 
      END; _A0SMEN? 
  
    A0SMDA:                                 _DISABLE LINE              ?
      PSTELLSVM(C0LNDA);
  
    A0SMRCTCB:                              _RECONFIGURE TCB           ?
      PSTELLSVM(C0RCTCB); 
  
    A0QUEOUT:                               _OUTPUT IN QUEUE           ?
      BEGIN 
      B1TCB := XABFRPTR;
_ 
* * * *  TERMINALS ARE DEFINED IN NDL AS AUTO LOGGED IN TO NTS
? 
_ 
* * * *  STIMULATOR. HENCE THE BANNER(FIRST DOWNLINE BLOCK) IS DISCARDED. 
? 
      IF B1TCB'.BSTCB.BSLOGGED              _ALREADY LOGGED-IN         ?
      THEN
        BEGIN 
        XSLCB := B1TCB'.BSTCB.BSLCBP; 
  
        IF X25LPBCK 
        THEN
          PSTAROUND                         _SWITCH UPLINE             ?
        ELSE
          BEGIN 
          IF ^B1TCB'.BSTCB.BSNTSINIT        _STILL NOT UP              ?
          THEN
            IF ^PSSEARCH(FALSE)             _PAD TCB NOT UP            ?
            THEN
              PBLSPUT(XAWORKLIST,BYWLCB[B0NTSWL]) 
            ELSE
              PSPBLOCKS 
          ELSE
            PSPBLOCKS;
          END; _IF X25LPBCK?
        END 
      ELSE                                  _DOWNLINE BANNER           ?
        BEGIN 
        XSQR := NIL;                        _SEGMENT READ              ?
        XSQW := NIL;                        _SEGMENT WRITE             ?
        XDLBLOCK := NIL;                    _CLEAR DOWNLINE DATA PTR   ?
        PBQUEMAINT(B1TCB, XDLBLOCK, 0, 0);  _GET DOWNLINE DATA         ?
        PBRELCHN(XDLBLOCK, BEDBSIZE);       _RELEASE NETWORK BLOCK BUF ?
        B1TCB'.BSTCB.BSLOGGED := TRUE;      _LOGGED-IN                 ?
        END;
      END; _A0QUEOUT? 
  
    L2OUTPUT:                               _LEVEL 2 FRAME             ?
      BEGIN 
      PBLCBP(XALINO.BDLINO,XSLCB);          _ACQUIRE LCB POINTER       ?
      B1TCB := XSLCB'.BZTCBPTR; 
      IF B1TCB " NIL THEN BEGIN             _DISCARD IF DOWN           ?
      B1BUFF := XABFRPTR; 
      B1BT := HTMSG;
_?
_ 
* * * *  CHECK FOR AUTO SEQUENCING OF DATA PACKETS
? 
_?
      XSPTR.X1BFPTR := B1BUFF;
      IF ( ^XSPTR.X2BFPTR'.XBPKHDR.XPKIDL ) &  _DATA PACKET            ?
         ( X25SEQ )                         _AUTO SEQ ON               ?
      THEN
        B1TCB'.BSTCB.BSPVR := B1TCB'.BSTCB.BSPVR + 1; 
_ 
* * * *  INSERT DATA BLOCK CLARIFIER
* * * *  TRANSPARENT DATA IS USED 
? 
      XNOBFPTR := PBGET1BF(BEDBSIZE); 
      WITH XNOBFPTR' DO 
        BEGIN 
        BFDATAC[12] := CHR(4);              _DBC                       ?
        BFFCD := 12;                        _LEAVE SPACE               ?
        BFLCD := 12;                        _FOR DN/SN/CN/BT           ?
        BCCHAINS[DBUFLENGTH] := B1BUFF; 
        END; _WITH XNOBFPTR?
      B1BUFF := XNOBFPTR; 
      WITH  B1TCB'.BSTCB, BSFLGWRD  DO
        BEGIN 
        BSINPBUF := B1BUFF;                 _SET UP UNLINE DATA        ?
        KTIGNRCN := FALSE;                  _IGNOR CANCEL              ?
        KTSEND   := TRUE;                   _SEND THIS DATA TO HOST    ?
        KTCKSP   := TRUE;                   _CHECK FOR SPECIAL         ?
        KTBLKT   := HTMSG;                  _MSG TYPE BLOCK            ?
_ 
        * * *  CALL UPLINE TIP SERVICE  * * * 
? 
        PBULTS(B1TCB);
  
        KTWORD   := 0;                      _CLEAR BIP FLAG WORD       ?
        END;  _ WITH BSTCB, BSFLGWRD ?
  
      XOPARAMS.XAWC := MMOBUX;
      XOPARAMS.XALINO := X25LINO; 
      XOPARAMS.XABFRPTR := XABFRPTR;
      PBLSPUT(XOPARAMS.XAWORKLIST,BYWLCB[B0XL2]); 
      END; _B1TCB " NIL?
      END; _L2OUTPUT? 
  
    MMOBUX:                                 _OUTPUT TRANSMITTED        ?
      BEGIN 
      PBLCBP(XALINO.BDLINO,XSLCB);          _ACQUIRE LCB POINTER       ?
      B1TCB := XSLCB'.BZTCBPTR; 
      IF B1TCB " NIL                        _DISCARD IF DOWN           ?
      THEN
        BEGIN 
        B1TCB'.BSTCB.BSOON := FALSE;        _RESET OUTPUT ON           ?
        PSXMIT; 
        END; _TCB ASSIGNED? 
      END; _MMOBUX? 
  
    END; _CASE XAWC?
  END; _WITH XIPARAMS, B1TCB'.BSTCB?
END; _PROCEDURE PNTSD3? 
