*COMDECK BSCU1
_$J+  PAGE EJECT? 
  
  
  
  
_                     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
  
  
                      BBBBBBBB      SSSSSS      CCCCCC
                      BBBBBBBBB    SSSSSSSS    CCCCCCCC 
                      BB      BB  SS      SS  CC      CC
                      BB      BB  SS          CC
                      BBBBBBBBB   SSSSSSSSS   CC
                      BBBBBBBBB    SSSSSSSSS  CC
                      BB      BB          SS  CC
                      BB      BB  SS      SS  CC      CC
                      BBBBBBBBB    SSSSSSSS    CCCCCCCC 
                      BBBBBBBB      SSSSSS      CCCCCC
  
  
          UU      UU    SSSSSS    EEEEEEEEEE  RRRRRRRR        11
          UU      UU   SSSSSSSS   EEEEEEEEEE  RRRRRRRRR      111
          UU      UU  SS      SS  EE          RR      RR    1111
          UU      UU  SS          EE          RR      RR      11
          UU      UU  SSSSSSSSS   EEEEEEEE    RRRRRRRRR       11
          UU      UU   SSSSSSSSS  EEEEEEEE    RRRRRRRR        11
          UU      UU          SS  EE          RR   RR         11
          UU      UU  SS      SS  EE          RR    RR        11
           UUUUUUUU    SSSSSSSS   EEEEEEEEEE  RR     RR     111111
            UUUUUU      SSSSSS    EEEEEEEEEE  RR      RR    111111
? 
_$J+  PAGE EJECT? 
  
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*                         PU1BSCNTS                                   * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_$R-,G-,I-    NON-RECURSIVE 
              INTERRUPTABLE?
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*         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                           * 
*                                                                     * 
*                                                                     * 
*     THE NTS USER1 TIP, WHICH DRIVES FICTICIOUS ASYNC LINES, IS      * 
*     USED TO TEST THE BINARY SYNCHRONOUS (BSC) TIP.                  * 
*     THERE ARE THREE POSSIBLE CONFIGURATIONS (CF1, CF2 AND CF3)      * 
*     FOR THE BSC TIP.  THEY ARE:                                     * 
*                                                                     * 
*       1) CF1 (TESTING FOR BSC TIP MAIN LEVEL)                       * 
*                                                                     * 
*               I        I-----------I                *** PSEUDO LINE * 
*               I <----> I BSC  MAIN I <----------:                   * 
*               I        I   LEVEL   I            :                   * 
*               I        I-----------I            :                   * 
*          NTS  I                                 :                   * 
*          HOST I                                 : WORKCODE          * 
*               I                                 :                   * 
*               I        I-----------I            :                   * 
*               I <----> I NTS USER1 I <----------:                   * 
*               I        I-----------I                *** PSEUDO LINE * 
*                                                                     * 
*                                                                     * 
*                                                                     * 
*       2) CF2 (TESTING FOR BSC LEVEL 2)                              * 
*                                                                     * 
*               I        I-----------I   WORKCODE   I---------I       * 
*               I <----> I NTS USER1 I <----------> I   BSC   I       * 
*               I        I-----------I              I LEVEL 2 I       * 
*               I                                   I---------I       * 
*               I                                        *            * 
*               I                                        *            * 
*               I                                        *            * 
*          NTS  I                                     I-----I         * 
*          HOST I                                     I CLA I         * 
*               I                                     I-----I         * 
*               I                                        .            * 
*               I                                        .            * 
*               I                                                     * 
*               I                                        .            * 
*               I                                        .            * 
*               I        I-----------I                I-----I         * 
*               I <----> I NTS USER2 I ************** I CLA I         * 
*               I        I-----------I                I-----I         * 
*                                                                     * 
*                                                                     * 
*       3) CF3 (TESTING FOR BSC TIP USED BY I AND E)                  * 
*                                                                     * 
*                                                                     * 
*                                                                     * 
*                                                                     * 
*     THE NTS USER1 TIP ACTS AS LEVEL 2 DURING TESTING OF THE MAIN    * 
*     LEVEL (CF1).  IN CF2 THE USER1 TIP ACTS AS THE MAIN LEVEL FOR   * 
*     THE LEVEL 2 TESTING.                                            * 
*                                                                     * 
*                                                                     * 
*                                                                     * 
*     THE NTS USER1 PROCESSING FUNCTIONS:                             * 
*     ----------------------------------                              * 
*     *  ESTABLISHING A CONNECTION ON THE USER1 SIDE.                 * 
*        USER1 TERMINALS MUST BE DEFINED AS AUTO LOG-IN IN THE NDL    * 
*        TERMINAL DEFINITION.  THE USER1 TIP WILL DISCARD THE FIRST   * 
*        DOWNLINE DATA WHICH IS THE DOWNLINE AUTO LOG-IN BANNER.      * 
*        ALL UPLINE AND DOWNLINE DATA SHOULD BE IN TRANSPARENT        * 
*        MODE, THE USER1 TIP WILL SET THE TRANSPARENT FLAG IN ALL     * 
*        UPLINE NETWORK DATA BLOCKS.                                  * 
*                                                                     * 
*     *  WORKLIST PROCESSING                                          * 
*        A0SMEN,   RECEIVES WORKLISTS FROM THE SERVICE MODULE.        * 
*        A0SMDA,   THE ONLY ACTION WILL BE TO RESPOND WITH THE        * 
*        A0RCTCB   APPROPRIATE WORKCODE.                              * 
*                  NOTE : RECEIPT OF A0SMDA, THE USER1 TIP CLEARS     * 
*                         THE LINE CONNECTION BETWEEN BSC AND         * 
*                         NTS USER1                                   * 
*                                                                     * 
*        A0QUEOUT FOR CF1 TESTING, THE FIRST DOWNLINE DATA BLOCK      * 
*                 (AFTER THE AUTO LOG-IN BANNER) MUST BE OF DATA TYPE * 
*                 EQUAL TO THREE (A LINE NUMBER BLOCK).  THIS BLOCK   * 
*                 TYPE IS USED TO INITIALIZE THE USER1 TIP'S LINE     * 
*                 TABLE .  THIS LINE TABLE IS USED TO ESTABLISH       * 
*                 A ONE TO ONE CORRESPONDENCE BETWEEN THE USER1 AND   * 
*                 BSC LINE.                                           * 
*                                                                     * 
*      TYPES OF DOWNLINE DATA.                                        * 
*                                                                     * 
*              1) DATA TYPE ( 1 : U1WORKCD )                          * 
*                     WORKCODE.                                       * 
*                                                                     * 
*                          I          I          I                    * 
*                          I----------I----------I                    * 
*                 WORD 04  I    DN    I    SN    I                    * 
*                          I----------I----------I                    * 
*                 WORD 05  I    CN    I   BTPT   I                    * 
*                          I----------I----------I                    * 
*                 WORD 06  I    DBC   I DATA TYP I                    * 
*                          I----------I----------I                    * 
*                 WORD 07  I WORKCODE I          I                    * 
*                          I----------I----------I                    * 
*                          I          I          I                    * 
*                          I          I          I                    * 
*                                                                     * 
*                                                                     * 
*              2) DATA TYPE ( 2 : U1DATA )                            * 
*                     WORKCODE AND DATA.                              * 
*                                                                     * 
*                          I          I          I                    * 
*                          I----------I----------I                    * 
*                 WORD 04  I    DN    I    SN    I                    * 
*                          I----------I----------I                    * 
*                 WORD 05  I    CN    I   BTPT   I                    * 
*                          I----------I----------I                    * 
*                 WORD 06  I    DBC   I DATA TYP I                    * 
*                          I----------I----------I                    * 
*                 WORD 07  I WORKCODE I          I                    * 
*                          I----------I          I                    * 
*                 WORD 08  I      DOWNLINE       I                    * 
*                 WORD 09  I                     I                    * 
*                 WORD 0A  I        DATA         I                    * 
*                          I          .          I                    * 
*                          I          .          I                    * 
*                          I          .          I                    * 
*                          I          .          I                    * 
*                          I          .          I                    * 
*                          I----------I----------I                    * 
*                 WORD 3F  I     BUFFER CHAIN    I                    * 
*                          I---------------------I                    * 
*                                                                     * 
*                                                                     * 
*              3) DATA TYPE ( 3 : U1LNDATA )                          * 
*                     LINE NUMBER.                                    * 
*                                                                     * 
*                          I          I          I                    * 
*                          I----------I----------I                    * 
*                 WORD 04  I    DN    I    SN    I                    * 
*                          I----------I----------I                    * 
*                 WORD 05  I    CN    I   BTPT   I                    * 
*                          I----------I----------I                    * 
*                 WORD 06  I    DBC   I DATA TYP I                    * 
*                          I----------I----------I                    * 
*                 WORD 07  I   LINE   I          I                    * 
*                          I  NUMBER  I          I                    * 
*                          I----------I----------I                    * 
*                          I          I          I                    * 
*                          I          I          I                    * 
*                                                                     * 
*                                                                     * 
*     REFER TO THE PROCEDURE PUCKTIPWKC FOR THE DEFINITION OF         * 
*     THE UPLINE DATA BUFFER.                                         * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PU1BSCNTS;
  
CONST 
  
*CALL BSCWCS
_ 
* * * *  ACTION TO THE LINE TABLE 
? 
      U1DEFINE    = 1;                      _CREATE LINE NUMBER ENTRY  ?
                                            _ IN THE LINE TABLE        ?
      U1CLEAR     = 2;                      _CLEAR LINE NUMBER ENTRY   ?
                                            _ IN THE LINE TABLE        ?
      U1LNBSC     = 3;                      _SCAN THRU THE LINE TABLE  ?
                                            _ TO GET BSC LINE NUMBER   ?
      U1LNUSER    = 4;                      _SCAN THRU THE LINE TABLE  ?
                                            _ TO GET USER LINE NUMBER  ?
_ 
* * * *  INDEX FOR USER OR BSC TIP SIDE OF THE LINE TABLE 
? 
      U1BSCTIP    = 1;                      _INDEX FOR DEFINING BSC    ?
                                            _ SIDE LINE NUMBER IN      ?
                                            _ LINE TABLE               ?
      U1USER      = 2;                      _INDEX FOR USER SIDE OF    ?
                                            _ THE LINE TABLE           ?
_ 
* * * *  DATA BUFFER ACCESS DEFINITION
? 
      U1BT        = 11;                     _INDEX TO BLOCK TYPE       ?
      U1DBC       = 12;                     _INDEX TO DBC              ?
      U1DTYP      = 13;                     _DATA TYPE                 ?
                                            _ 1 : WORKCODE WITHOUT DATA?
                                            _ 2 : WORKCODE WITH DATA   ?
                                            _ 3 : LINE DEFINITION      ?
      U1LINO      = 14;                     _BSC SIDE OF LINE NUMBER   ?
      U1WKC       = 14;                     _WORKCODE TO BE SENT TO BSC?
      U1BSCDT     = 17;                     _START OF BSC DATA         ?
_ 
* * * *  DOWNLINE NETWORK DATA TYPE 
? 
      U1WORKCD    = 1;                      _WORKCODE WITHOUT DATA     ?
      U1DATA      = 2;                      _WORKCODE WITH DATA        ?
      U1LNDATA    = 3;                      _INTERNAL DATA TO USER TIP ?
                                            _ TO DEFINE LINE DEF ENTRY ?
                                            _ TO LINE TABLE            ?
  
  
  
TYPE
  
*CALL BSCU1TYP1 
  
      U0LNTBL   = ARRAY [1..10,             _LINE TABLE                ?
                         U1BSCTIP..U1USER]
                                OF B08BITS; 
  
  
VAR 
  
      UIPARAMS    : U0PARAMS;               _INCOMING WORKLIST         ?
      UOPARAMS    : U0PARAMS;               _OUTGOING WORKLIST         ?
      ULCBADDR    : BZLCBP;                 _LCB ADDRESS FOR USER TIP  ?
      UTCBADDR    : B0BUFPTR;               _TCB ADDRESS FOR USER TIP  ?
  
      UBSCLCB     : BZLCBP;                 _LCB ADDRESS FOR BSC LEVEL ?
                                            _ OR BSC LEVEL 2           ?
      UBSCTCB     : B0BUFPTR;               _TCB ADDRESS FOR BSC LEVEL ?
                                            _ OF BSC LEVEL 2           ?
      ULINETBL    : U0LNTBL;                _COMMUNICATION LINE NUMBER ?
                                            _ TABLE                    ?
      I          : INTEGER; 
      UBUF, 
      UBUF1,
      UBUF2      : B0BUFPTR;
      UFLAG       : PACKED RECORD 
                    CASE I : INTEGER OF 
                      1: (I  : INTEGER);
                      2: (C1, 
                          C2 : CHAR); 
                    END; _END OF UFLAG? 
  
  
  
VALUE 
  
_                 INDEX     BSC    USER 
                  -----     ---    ----                                ?
      ULINETBL = _ 01 ?  (  $FF,   $FF, 
                 _ 02 ?     $FF,   $FF, 
                 _ 03 ?     $FF,   $FF, 
                 _ 04 ?     $FF,   $FF, 
                 _ 05 ?     $FF,   $FF, 
                 _ 06 ?     $FF,   $FF, 
                 _ 07 ?     $FF,   $FF, 
                 _ 08 ?     $FF,   $FF, 
                 _ 09 ?     $FF,   $FF, 
                 _ 10 ?     $FF,   $FF);
  
  
  
_$J+  PAGE EJECT? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*                     WORK ON LINE TABLE                              * 
*                                                                     * 
*                          PUCKLNTBL                                  * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW:                                                          * 
*              THIS ROUTINE STORES THE USER1 LINE NUMBER AND THE      * 
*              ASSOCIATED BISYNC LINE NUMBER INTO A TWO DEMENSIONAL   * 
*              ARRAY , UNLINETBL.  IT ALSO CLEARS THE ARRAY ENTRY     * 
*              IF THE USER1 LINE IS DISABLED.                         * 
*                                                                     * 
** INPUT:                                                             * 
*              ACTIONS                                                * 
*              -------                                                * 
*              DEFINE : CREATES THE ENTRY FOR THE COMMUNICATION       * 
*                       CONNECTION.                                   * 
*              CLEAR  : CLEARS THE LINE TABLE ENTRY (DELETES THE      * 
*                       USER1 AND BSC LINE NUMBERS FROM THE LINE      * 
*                       TABLE).                                       * 
*              LNBSC  : SCANS THRU THE LINE TABLE LOOKING FOR THE     * 
*                       BSC LINE NUMBER USING THE USER1 LINE NUMBER.  * 
*              LNUSER : SCANS THRU THE LINE TABLE LOOKING FOR THE     * 
*                       USER1 LINE NUMBER USING THE BSC LINE NUMBER.  * 
*                                                                     * 
** OUTPUT:                                                            * 
*              1)  UPDATED LINE TABLE.                                * 
*              2)  LCB ADDRESS OF BSC OR USER1 LINE.                  * 
*                                                                     * 
** CALLING PROGRAM:                                                   * 
*                                                                     * 
*              MAIN PROGRAM                                           * 
*              PUGETDATA     : GET DOWNLINE NETWORK BLOCK             * 
*              PUCKTIPWKC    : SEND UPLINE DATA TO NTS HOST           * 
*                                                                     * 
** EXTERNAL SUBROUTINES:                                              * 
*                                                                     * 
*              PBQUEMAINT    : DEQUEUE DOWNLINE NETWORK BLOCK.        * 
*              PBRELZRO      : RELEASE CHAIN OF DATA BUFFER.          * 
*              PBLCBP        : GETS LCB ADDRESS                       * 
*                                                                     * 
** NOTE:                                                              * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PUCKLNTBL ( ACTION : INTEGER;  BUFPTR : B0BUFPTR);
  
VAR 
  
      USERLN : B08BITS;                     _USER SIDE LINE NUMBER     ?
      BSCLN  : B08BITS;                     _BSC SIDE LINE NUMBER      ?
                                            _  NOTE : ONLY PORT NUMBER ?
                                            _         NOT SUBPORT      ?
      TEMPLN : INTEGER;                     _PORT AND SUBPORT NUMBER   ?
      INDEX  : INTEGER; 
  
  
BEGIN 
  
INDEX  := 1;
USERLN := 0;
BSCLN  := 0;
  
CASE  ACTION  OF
  
_ 
* * * *  CREATE THE ENTRY IN THE LINE TABLE 
? 
  U1DEFINE:                                 _CREATE ENTRY IN LINE      ?
    BEGIN                                   _ TABLE                    ?
    USERLN := ULCBADDR'.BZLINO.BDPORT;      _USER LINE NUMBER          ?
    BSCLN  := ORD(BUFPTR'.BFDATAC[U1LINO]); _BSC LINE NUMBER           ?
  
    WHILE  (INDEX < 11)     &               _INDEX NOT OUT OF RANGE    ?
           (ULINETBL[INDEX, U1USER] " $FF)  DO  _LOOK FOR OPEN ENTRY   ?
      INDEX := INDEX + 1; 
  
    IF INDEX < 11                           _FIND OPEN ENTRY           ?
    THEN
      BEGIN 
      ULINETBL[INDEX, U1USER]    := USERLN; _STORE USER AND BSC LINE   ?
      ULINETBL[INDEX, U1BSCTIP]  := BSCLN;  _ NUMBERS INTO LINE TABLE  ?
      END;
  
    END;  _ U1DEFINE ?
  
_ 
* * * *  TERMINATE THE ENTRY IN THE LINE TABLE
? 
  U1CLEAR:                                  _TERMINATE ENTRY FROM LINE ?
    BEGIN                                   _ TABLE                    ?
    WITH  UIPARAMS  DO
      USERLN := UALINO.BDPORT;              _USER LINE NUMBER          ?
  
  
    WHILE  (INDEX < 11)     &               _INDEX NOT OUT OF RANGE    ?
           (ULINETBL[INDEX, U1USER] " USERLN)  DO  _LOOK FOR USER LINE ?
      INDEX := INDEX + 1;                   _ TO MATCH                 ?
  
    IF INDEX < 11                           _FOUND USER LINE NUMBER TO ?
    THEN                                    _ BE DELETED               ?
      BEGIN 
      ULINETBL[INDEX, U1USER]    := $FF;    _CLEAR BOTH USER AND USER  ?
      ULINETBL[INDEX, U1BSCTIP]  := $FF;    _  FIELDS IN LINE TABLE    ?
      END;
  
    END;  _ U1CLEAR ? 
  
_ 
* * * *  SEARCH FOR THE BSC LINE NUMBER 
? 
  U1LNBSC:                                  _SEARCH THE LINE TABLE  TO ?
    BEGIN                                   _ LOOK FOR BSC LINE NUMBER ?
    USERLN := ULCBADDR'.BZLINO.BDPORT;      _USER LINE NUMBER          ?
  
    WHILE  (INDEX < 11)     &               _INDEX NOT OUT OF RANGE    ?
           (ULINETBL[INDEX, U1USER] " USERLN)  DO  _ LOOK FOR MATCH    ?
      INDEX := INDEX + 1; 
  
    IF INDEX < 11                           _FOUND MATCH               ?
    THEN
      BEGIN 
      BSCLN  := ULINETBL[INDEX, U1BSCTIP];  _GET BSC SIDE LINE NUMBER  ?
      TEMPLN := BSCLN * $100;               _SHIFT 8 BITS              ?
      PBLCBP (TEMPLN, UBSCLCB);             _BSC LCB ADDRESS           ?
      END;
  
    END;  _ U1LNBSC ? 
  
_ 
* * * *  SEARCH FOR THE USER LINE NUMBER
? 
  U1LNUSER:                                 _SEARCH THE LINE TABLE FOR ?
    BEGIN                                   _USER SIDE LINE NUMBER     ?
    WITH  UIPARAMS  DO
      BSCLN := UALINO.BDPORT;               _GET BSC PORT NUMBER       ?
  
    WHILE  (INDEX < 11)     &               _INDEX NOT OUT OF RANGE    ?
           (ULINETBL[INDEX, U1BSCTIP] " BSCLN)  DO  _ LOOK FOR MATCH   ?
      INDEX := INDEX + 1; 
  
    IF INDEX < 11                           _FOUND MATCH               ?
    THEN
      BEGIN 
      USERLN := ULINETBL[INDEX, U1USER];    _GET USER PORT NUMBER      ?
      TEMPLN := USERLN * $100;              _SHIFT 8 BITS TO LEFT      ?
      PBLCBP (TEMPLN, ULCBADDR);            _GET USER SIDE LCB ADDRESS ?
      END;
    END;  _ U1LNUSER ?
  
  END;  _ CASE ACTION ? 
END;  _ PROCEDURE PUCKLNTBL                                            ?
_$J+  PAGE EJECT? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*                 SENDS UPLINE DATA TO NTS HOST                       * 
*                                                                     * 
*                          PUCKTIPWKC                                 * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW:                                                          * 
*              PUCKTIPWC PROVIDES THE REQUIRED INTERFACE TO SEND UP-  * 
*              LINE DATA VIA THE BLOCK PROTOCOL INTERFACE PACKAGE     * 
*              (BIP).  THIS ROUTINE WILL NOT PROCESS THE RESPONSE     * 
*              DATA AND FLAG WORD FROM THE BIP.                       * 
*                                                                     * 
*              TWO TYPES OF UPLINE DATA ARE GENERATED.                * 
*                                                                     * 
*              1) WORKCODE AND LINE NUMBER. (UPLINE DATA)             * 
*                                                                     * 
*                          I          I          I                    * 
*                          I----------I----------I                    * 
*                 WORD 04  I    DN    I    SN    I                    * 
*                          I----------I----------I                    * 
*                 WORD 05  I    CN    I   BTPT   I                    * 
*                          I----------I----------I                    * 
*                 WORD 06  I    DBC   I WORKCODE I                    * 
*                          I----------I----------I                    * 
*                 WORD 07  I     LINE NUMBER     I                    * 
*                          I----------I----------I                    * 
*                          I          I          I                    * 
*                          I          I          I                    * 
*                                                                     * 
*                                                                     * 
*              2) WORKCODE AND LINE NUMBER WITH DATA. (UPLINE DATA)   * 
*                                                                     * 
*                          I          I          I                    * 
*                          I----------I----------I                    * 
*                 WORD 04  I    DN    I    SN    I                    * 
*                          I----------I----------I                    * 
*                 WORD 05  I    CN    I   BTPT   I                    * 
*                          I----------I----------I                    * 
*                 WORD 06  I    DBC   I WORKCODE I                    * 
*                          I----------I----------I                    * 
*                 WORD 07  I     LINE NUMBER     I                    * 
*                          I----------I----------I                    * 
*                 WORD 08  I       UPLINE        I                    * 
*                 WORD 09  I                     I                    * 
*                 WORD 0A  I        DATA         I                    * 
*                          I          .          I                    * 
*                          I          .          I                    * 
*                          I          .          I                    * 
*                          I          .          I                    * 
*                          I          .          I                    * 
*                          I----------I----------I                    * 
*                 WORD 3F  I     BUFFER CHAIN    I                    * 
*                          I---------------------I                    * 
*                                                                     * 
** INPUT:                                                             * 
*              LCB ADDRESS                : ULCBADDR                  * 
*              TCB ADDRESS                : UTCBADDR                  * 
*              INCOMING WORKLIST ENTRY    : UIPARAMS                  * 
*                                                                     * 
** OUTPUT:                                                            * 
*              UPLINE DATA                : BSINPBUF                  * 
*              FLAG WORD                  : BSFLGWRD                  * 
*                                                                     * 
** CALLING PROGRAM:                                                   * 
*                                                                     * 
*              MAIN PROGRAM                                           * 
*                                                                     * 
** EXTERNAL SUBROUTINES:                                              * 
*                                                                     * 
*              PBRELZRO  : RELEASE CHAIN OF BUFFER                    * 
*              PBGET1BUF : GET A DATA BUFFER                          * 
*              PBULTS    : UPLINE TIP SERVICE                         * 
*                                                                     * 
*              PUCKLNTBL : WORK WITH THE LINE TABLE                   * 
*                                                                     * 
** NOTE:                                                              * 
*                                                                     * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PUCKTIPWKC; 
  
BEGIN 
  
PUCKLNTBL (U1LNUSER, NIL);                  _GET USER LINE NUMBER      ?
  
IF ULCBADDR " NIL                           _USER LCB AVAILABLE        ?
THEN
  BEGIN 
  UTCBADDR := ULCBADDR'.BZTCBPTR;           _GET TCB ADDRESS           ?
  
  WITH  UTCBADDR'.BSTCB,
        UIPARAMS        DO
    BEGIN 
    BSINPBUF := PBGET1BUF (BEDBSIZE);       _GET DATA BUFFER TO STORE  ?
                                            _ NOTWORK HEADDER AND BSC  ?
                                            _ WORKCODE AND LINE NUMBER ?
    WITH  BSFLGWRD  DO
      BEGIN 
      KTWORD   := 0;                        _CLEAR BIP FLAG WORD       ?
      KTBLKT   := HTMSG;                    _MSG TYPE BLOCK            ?
      KTCKSPL  := TRUE;                     _CHECK FOR SPECIAL         ?
      KTIGNRCN := FALSE;                    _IGNORE CANCEL             ?
      KTSEND   := TRUE;                     _SEND IT TO HOST           ?
      END;  _ WITH BSFLGWRD ? 
  
    WITH  BSINPBUF'  DO 
      BEGIN 
      BFXPT          := TRUE;               _TRANSPARANT ON            ?
      BIINT[8]       := UALINO.BDLINO;      _PORT AND SUBPORT NUMBER   ?
      BFFCD          := $C;                 _BUFFER FCD                ?
      BFLCD          := $F;                 _BUFFER LCD                ?
      BFDATAC[$D] := CHR(UAWC);             _STORE WORKCODE            ?
      END;  _ WITH BSINPBUF ? 
  
    IF CF1DEBUG                             _TESTING BSC MAIN LEVEL    ?
    THEN
      BEGIN 
      IF UAWC = S3OUTDATA                   _DATA BUF ATTACHED TO IT   ?
      THEN
        BEGIN 
        UBUF1 := BSINPBUF;                  _UPLINE DATA BUF POINTER   ?
        UBUF2 := UADATAPTR;                 _DATA FROM BSC ML          ?
        REPEAT
          WITH UBUF2' DO
          BEGIN 
          UBUF := PBGET1BUF(BEDBSIZE);      _GET A BUF FOR UPLINE DATA ?
          UBUF'.BFFCD := BFFCD; 
          UBUF'.BFLCD := BFLCD; 
          I           := BFFCD; 
          WHILE I @ BFLCD DO
            BEGIN 
            UBUF'.BFDATAC[I] := BFDATAC[I]; _MOVE DATA FROM BSC ML BUF ?
                                            _INTO UPLINE DATA BUF      ?
            I := I + 1; 
            END;
          UBUF1'.BCCHAIN[DBUFLENG] := UBUF; _CHAIN THIS BUF TO UPLINE  ?
          UBUF1 := UBUF;                    _UBUF1 POINTS TO LAST BUF  ?
          END;
  
          IF UBUF2'.BFPERM
          THEN
            UBUF2 := NIL
          ELSE
            UBUF2 := UBUF2'.BCCHAIN[DBUFLENG];
  
        UNTIL UBUF2 = NIL;
        BSINPBUF'.BIINT[9] :=               _MOVE BUF FLAG WORD INTO   ?
                 UADATAPTR'.BIINT[2];       _UPLINE DATA               ?
        BSINPBUF'.BFLCD := $11;             _UPDATE LCD                ?
        END;
      END 
    ELSE
      BEGIN 
      IF UAWC = S2INDATA                    _DATA BUF ATTACH TO IT     ?
      THEN
        BEGIN 
        BSINPBUF'.BCCHAINS[DBUFLENGTH]      _CHAIN DATA TO HEADER      ?
                  := UADATAPTR;             _BUFFER                    ?
        BSINPBUF'.BIINT[9] := UADATAPTR'.BIINT[2];
        BSINPBUF'.BFLCD := $11;             _UPDATE LCD                ?
        END;
      END;
  
    PBULTS (UTCBADDR);                      _SEND DATA TO UPLINE TIP   ?
                                            _ SERVICE                  ?
    IF BSINPBUF " NIL                       _RESPONSE DATA FROM BIP    ?
    THEN
      BEGIN 
      PBRELZRO (BSINPBUF, BEDBSIZE);
      BSINPBUF := NIL;
      END;
    END;  _ WITH UTCBADDR ? 
  END;  _ IF ULCBADDR " NIL ? 
END;  _ PROCEDURE PUCKTIPWKC                                           ?
_$J+  PAGE EJECT? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*                QUEUE WORKLIST ENTRY TO BSC TIP                      * 
*                                                                     * 
*                          PUQUEWKL                                   * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW:                                                          * 
*              QUEUE WORKLIST ENTRY TO BSC MAIN LEVEL OR LEVEL 2      * 
*                                                                     * 
** INPUT:                                                             * 
*              UBSCLCB     : LCB ADDRESS                              * 
*              UAWC        : WORKCODE                                 * 
*              UADATAPTR   : DATA BUFFER POINTER                      * 
*                                                                     * 
** OUTPUT:                                                            * 
*              WORKLIST ENTRY                                         * 
*                                                                     * 
** CALLING PROGRAM:                                                   * 
*                                                                     * 
*              PUGETDATA                                              * 
*                                                                     * 
** EXTERNAL SUBROUTINES:                                              * 
*                                                                     * 
*              PBLSPUT                                                * 
*                                                                     * 
** NOTE:                                                              * 
*              B0BSCUSER CONTAINS THE VALUE OF B0MLBSC (WORKLIST TO   * 
*              BSC MAIN LEVEL) OR B0L2BSC (WORKLIST TO BSC LEVEL 2)   * 
*              IT IS INTIALIZED BY AN MPEDIT STATEMENT.               * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PUQUEWKL ( VAR  RELBUFOK : BOOLEAN ); 
  
BEGIN 
  
IF UBSCLCB " NIL                            _BSC SIDE LCB AVAILABLE    ?
THEN
  WITH  UOPARAMS, 
        UTCBADDR'.BSTCB  DO 
    BEGIN 
  
    UALINO.BDLINO := UBSCLCB'.BZLINO.BDLINO;      _BSC LINE NUMBER     ?
    UAWC          := ORD(BSFBUF'.BFDATAC[U1WKC]); _WORKCODE TO BSC TIP ?
    RELBUFOK      := TRUE;
  
    IF ORD(BSFBUF'.BFDATAC[U1DTYP]) = U1DATA   _WORKCODE HAS A DATA    ?
    THEN
      WITH BSFBUF' DO 
      BEGIN 
      UFLAG.C1 := BFDATAC[15];              _MOVE FLAG WORD LEFT BYTE  ?
      UFLAG.C2 := BFDATAC[16];              _MOVE FLAG WORD RIGHT BYTE ?
      BIINT[2] := UFLAG.I;                  _MOVE FLAG WORD INTO BUFFER?
      RELBUFOK         := FALSE;
      UADATAPTR        := BSFBUF; 
      UADATAPTR'.BFFCD := U1BSCDT;          _BFR FCD START AT $11      ?
      END;
  
    PBLSPUT (UAWORKLIST, BYWLCB[B0BSCUSER]);
  
    END;  _ WITH  UOPARAMS AND UTCBADDR ? 
END;  _ PROCEDURE PUQUEWKL                                             ?
_$J+  PAGE EJECT? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*                  GET DOWNLINE NETWORK BLOCK                         * 
*                                                                     * 
*                          PUGETDATA                                  * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW:                                                          * 
*              GET DOWNLINE NETWORK BLOCK AND SEND IT TO BSC TIP      * 
*               1) TESTING FOR BSC MAIN LEVEL                         * 
*                  THIS ROUTINE CALLS PUCKLNTBL TO CREATE OR FIND THE * 
*                  CONNECTION TO THE BSC TIP.                         * 
*                                                                     * 
*               2) TESTING FOR BSC LEVEL 2                            * 
*                    SENDS TO LEVEL 2.                                * 
*                                                                     * 
** INPUT:                                                             * 
*              UTCBADDR   : USER SIDE TCB ADDRESS                     * 
*              ULCBADDR   : LCB ADDRESS (USER OR BSC SIDE)            * 
*              DLDATA     : DOWNLINE NETWORK BLOCK                    * 
*                                                                     * 
** OUTPUT:                                                            * 
*              UBSCLCB    : LCB ADDRESS FOR USER OR BSC TIP SIDE      * 
*                                                                     * 
** CALLING PROGRAM:                                                   * 
*                                                                     * 
*              MAIN PROGRAM                                           * 
*                                                                     * 
** EXTERNAL SUBROUTINES:                                              * 
*                                                                     * 
*              PBQUEMAINT : DEQUEUE DOWNLINE NETWORK BLOCK            * 
*              PBRELZRO   : RELEASE CHAIN OF DATA BUFFER              * 
*                                                                     * 
*              PUQUEWKL   : QUEUE THE WORKLIST ENTRY TO BSC TIP       * 
*              PUCKLNTBL  : WORK WITH THE LINE TABLE                  * 
*                                                                     * 
** NOTE:                                                              * 
*              PUGETDATA WILL NOT ACTION COMMAND BLOCKS, THEY WILL    * 
*              BE DISCARDED.  PUGETDATA ALSO QUEUES 'BLK' TYPE NET-   * 
*              WORK BLOCKS IN THE TCB (BSFBUF, BSLBUF) UNTIL IT       * 
*              RECEIVES THE 'MSG' TYPE BLOCK.                         * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PUGETDATA;
  
VAR 
      DLDATA   : B0BUFPTR;                  _DOWNLINE NETWORK BLOCK    ?
      BLKTYP   : B0OVERLAY;                 _DOWNLINE BLOCK TYPE       ?
      RELBUF   : BOOLEAN;                   _OK TO RELEASE BUFFER      ?
  
BEGIN 
  
DLDATA := NIL;                              _CLEAR DOWNLINE DATA PTR   ?
  
WITH  UTCBADDR'.BSTCB  DO 
  BEGIN 
  
  IF (CF1DEBUG)    &                        _TESTING FOR BSC MAIN LEVEL?
     (NOT BSBANNER)                         _HAS NOT RECEIVED AN AUTO  ?
  THEN                                      _ LOG IN BANNER            ?
    BEGIN 
    PBQUEMAINT (UTCBADDR, DLDATA, 0, 0);    _GET A DOWNLINE DATA BLOCK ?
    PBRELZRO (DLDATA, BEDBSIZE);            _RELEASE IT                ?
    BSBANNER := TRUE;                       _LOGGED IN                 ?
    BSFBUF   := NIL;                        _CLEAR FIRST AND LAST      ?
    BSLBUF   := NIL;                        _ OUTSTANDING DL DATA PTR  ?
    END;  _ NOT RECEIVED BANNER ? 
  
  BLKTYP.BAINT := 0;
  DLDATA       := NIL;
  
  WHILE  BSQPTR.BABUFPTR " NIL  DO          _TAKE ALL DOWNLINE BLOCKS  ?
    BEGIN                                   _ OUT OF DL DATA QUEUE     ?
  
    PBQUEMAINT (UTCBADDR, DLDATA, 0, 0);    _GET A DOWNLINE DATA BLOCK ?
    BLKTYP.BARCHAR := DLDATA'.BFDATAC[U1BT];_GET BLOCK TYPE            ?
  
    IF (DLDATA'.BFINTBLK)      !            _INTERNAL DATA             ?
       (BLKTYP.BABLKTYPE.BTYPE = HTCMD)     _RECEIVED COMMAND BLOCK    ?
    THEN                                    _NO ACTION WILL BE MADE    ?
      PBRELZRO (DLDATA, BEDBSIZE)           _ ON COMMAND BLOCK         ?
    ELSE                                    _NOT DOWNLINE COMMAND BLK  ?
      BEGIN 
      IF (ORD(DLDATA'.BFDATAC[U1DTYP])      _LINE DATA FROM NTS HOST   ?
                          = U1LNDATA) & 
         (CF1DEBUG)                         _TESTING BSC MAIN LEVEL    ?
      THEN
        BEGIN 
        PUCKLNTBL (U1DEFINE, DLDATA);       _CREATE LINE ENTRY IN LINE ?
                                            _ TABLE IF IT IS POSSIBLE  ?
        PBRELZRO (DLDATA, BEDBSIZE);
        END  _ IF LINE DATA AND TESTING BSC MAIN LEVEL ?
      ELSE                                  _NOT LINE DATA             ?
        BEGIN 
        IF BSFBUF = NIL                     _NO OUTSTANDING DATA       ?
        THEN
          BEGIN 
          BSFBUF := DLDATA;                 _INITIALIZE FIRST AND LAST ?
          BSLBUF := DLDATA;                 _ DATA POINTER             ?
          END   _ IF BSFBUF = NIL ? 
        ELSE                                _THERE IS SOME DATA        ?
          BSLBUF'.BCCHAINS[DBUFLENGTH]      _CHAIN TO THE END OF       ?
                                 := DLDATA; _ OUTSTANDING DL DATA      ?
  
        WHILE  BSLBUF'.BCCHAINS             _LOOK FOR THE LAST BUFFER  ?
                     [DBUFLENGTH] " NIL  DO _ IN CHAIN                 ?
          BSLBUF := BSLBUF'.                _GET NEXT BUFFER IN CHAIN  ?
                      BCCHAINS[DBUFLENGTH]; 
  
        IF BLKTYP.BABLKTYP.BTYPE = HTMSG    _MSG TYPE BLOCK FOUND      ?
        THEN
          BEGIN 
          IF CF1DEBUG                       _TESTING FOR BSC MAIN LEVEL?
          THEN
            PUCKLNTBL (U1LNBSC, NIL)        _CHECK LINE TABLE FOR      ?
                                            _ BSC RECEIVER             ?
          ELSE                              _TESTING BSC LEVEL 2       ?
            UBSCLCB := ULCBADDR;
  
_ 
* * * *  QUEUE WORKLIST TO BSC MAIN LEVEL OR LEVEL 2
? 
          RELBUF := FALSE;
          PUQUEWKL (RELBUF);                _QUEUE WORKLIST            ?
          IF RELBUF                         _OK TO RELEASE BUFFER      ?
          THEN
            PBRELZRO (BSFBUF, BEDBSIZE);
  
          BSFBUF := NIL;
          BSLBUF := NIL;
          END;  _ IF BTYPE = MSG BLOCK ?
  
        END;  _ ELSE NOT LINE DATA ?
      END;  _ ELSE NOT DOWNLINE COMMAND BLOCK ? 
  
    END;  _ WHILE BSQPTR " NIL ?
  END;  _ WITH  UTCBADDR ?
END;  _ PROCEDURE PUGETDATA                                            ?
_$J+  PAGE EJECT? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*             CREATE WORKLIST ENTRY TO SERVICE MODULE                 * 
*                                                                     * 
*                          PUGNWKTOSVM                                * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW:                                                          * 
*              GENERATES THE WORKLIST ENTRY TO SERVICE MODULE         * 
*                                                                     * 
** INPUT:                                                             * 
*              WORKCODE TO SVM - C0LINOP : LINE ENABLED               * 
*                                C0LNDA  : LINE DISABLED              * 
*                                C0RCTCB : TCB RECONFIGURED           * 
*                                                                     * 
*              LCB OR TCB ADDRESS FORM INCOMING WORKLIST ENTRY        * 
*                                                                     * 
** OUTPUT:                                                            * 
*              WORKLIST QUEUED TO THE SERVICE MODULE                  * 
*                                                                     * 
** CALLING PROGRAM:                                                   * 
*                                                                     * 
*              MAIN PROGRAM                                           * 
*                                                                     * 
** EXTERNAL SUBROUTINES:                                              * 
*                                                                     * 
*              PBLSPUT   : QUEUE A WORKLIST ENTRY                     * 
** NOTE:                                                              * 
*                                                                     * 
*                                                                     * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PUGNWKTOSVM ( SVMWC : B06BITS );
  
BEGIN 
  
WITH  UOPARAMS  DO                          _OUT GOING WORKLIST ENTRY  ?
  BEGIN 
  
  UAWC := SVMWC;                            _SET WORKCODE              ?
  
  CASE  SVMWC  OF 
  
    C0LNDA,                                 _LINE DISABLED             ?
    C0LINOP:                                _LINE ENABLED              ?
      BEGIN 
      UALINO    := UIPARAMS.UALINO;         _WITH LINE NUMBER          ?
      UADATAPTR := NIL;                     _CLEAR UNNECESSARY FIELD   ?
      END;
  
    C0RCTCB:                                _TCB RECONFIGURED          ?
      BEGIN 
      UATCBPTR := UIPARAMS.UADATAPTR; 
      END;
  
    END;  _ CASE  SVMWC ? 
  
  PBLSPUT (UAWORKLIST, BYWLCB[B0SMWL]);     _PUT WORKLIST ENTRY TO SVM ?
                                            _ WLCB                     ?
  END;  _ WITH  UOPARAMS ?
END;  _ PROCEDURE PUGNWKTOSVM                                          ?
_$J+  PAGE EJECT? 
  
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*                      M A I N   P R O G R A M                        * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW:                                                          * 
*              PROCESS INCOMING WORKCODE                              * 
*                                                                     * 
** INPUT:                                                             * 
*              WORKLIST ENTRY                                         * 
*                                                                     * 
** OUTPUT:                                                            * 
*              NONE                                                   * 
*                                                                     * 
** CALLING PROGRAM:                                                   * 
*                                                                     * 
*              PBMON   : SYSTEM MONITOR                               * 
*                                                                     * 
** EXTERNAL SUBROUTINES:                                              * 
*                                                                     * 
*              NONE                                                   * 
*                                                                     * 
** NOTE:                                                              * 
*                                                                     * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
BEGIN 
  
UIPARAMS.UAWORKLIST := BWWLENTRY[OPS];      _SAVE WORKLIST ENTRY IN    ?
                                            _ LOCAL FIELDS             ?
_ 
* * *  CLEAR THE LOCAL TCB AND LCB FIELDS FOR BOTH BSC AND USER TIPS
? 
PBLCBP(UIPARAMS.UALINO.BDLINO,ULCBADDR);
UTCBADDR := NIL;
UBSCLCB  := NIL;
UBSCTCB  := NIL;
  
  
WITH  UIPARAMS  DO
  BEGIN 
  
  CASE  UAWC  OF                            _INCOMING WORKCODE         ?
  
    A0SMEN:                                 _ENABLE LINE               ?
      WITH ULCBADDR' DO 
      BEGIN 
      PUGNWKTOSVM (C0LINOP);                _LINE ENABLED  WORKCODE    ?
                                            _ TO SVM                   ?
      IF BZBSCEXT = NIL 
      THEN
        BZBSCEXT := PBGET1BUF(B0S16); 
      END;
  
    A0SMDA:                                 _DISABLE LINE              ?
      WITH ULCBADDR' DO 
      BEGIN 
      IF BZBSCEXT " NIL                     _IF LCB EXTENSION EXISTS   ?
      THEN
        BEGIN 
        BZBSCEXT'.BCCHAIN[16] := NIL;       _CLEAR CHAIN WORD          ?
        PBREL1BUF(BZBSCEXT,B0S16);          _RELEASE LCB EXTENSION     ?
        END;
      IF CF1DEBUG                           _TESTING MAIN LEVEL BSC    ?
      THEN
        PUCKLNTBL (U1CLEAR, NIL);           _CLEAR THE LINE TABLE ENTRY?
                                            _ FOR THIS LINE            ?
      PUGNWKTOSVM (C0LNDA);                 _LINE DISABLED WORKCODE    ?
                                            _ TO SVM                   ?
      END;
  
    A0SMRCTCB:                              _RECONFIGURE TERMINAL      ?
      BEGIN 
      PUGNWKTOSVM (C0RCTCB);                _TCB RECONFIGURED          ?
      END;
  
    A0QUEOUT:                               _RECEVING DOWNLINE DATA    ?
      BEGIN 
      UTCBADDR := UADATAPTR;                _USER TCB ADDRESS FIELD    ?
  
      WITH  UTCBADDR'.BSTCB  DO 
        BEGIN 
        ULCBADDR := BSLCBP;                 _USER LCB ADDRESS          ?
        PUGETDATA;                          _GET DATA FROM DOWNLINE    ?
                                            _ DATA QUEUE AND SORT IT   ?
                                            _ OUT                      ?
        END;  _ WITH UTCBADDR' ?
      END;  _ A0QUEOUT ?
  
    END;  _ CASE UAWC ? 
  
  
_ 
* 
* * * *  CHECK FOR THE WORKCODE FROM BISYNC MAIN LEVEL OR LEVEL 2 
* 
? 
  IF UAWC > $20                             _WORKCODE WAS MADE BY      ?
  THEN                                      _ BSC MAIN LEVEL OR LEVEL 2?
    PUCKTIPWKC;                             _WORKCODE CAME FROM BSC TIP?
  
  END;  _ WITH PIPARAMS ? 
END;  _ PROCEDURE PU1BSCNTS  (DEBUG TIP FOR BISYNC TIP)                ?
