*COMDECK X25TIP 
_$J+? 
_ 
                 XX      XX        222222    5555555555 
                  XX    XX        22222222   5555555555 
                   XX  XX        22      22  55 
                    XXXX                 22  55 
                     XX            2222222    5555555 
                     XX           2222222      5555555
                    XXXX         22                  55 
                   XX  XX        22          55      55 
                  XX    XX   ..  2222222222   55555555
                 XX      XX  ..  2222222222    555555 
  
  
  
                   TTTTTTTTTT    IIIIII    PPPPPPPP 
                   TTTTTTTTTT    IIIIII    PPPPPPPPP
                       TT          II      PP      PP 
                       TT          II      PP      PP 
                       TT          II      PPPPPPPPP
                       TT          II      PPPPPPPP 
                       TT          II      PP 
                       TT          II      PP 
                       TT        IIIIII    PP 
                       TT        IIIIII    PP 
  
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*                             PX25TIP                                 * 
*                             X25 TIP                                 * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_$R-,G-,I-     NON-RECURSIVE
               INTERRUPTABLE? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW -                                                         * 
*              ALL THE WORKLIST ENTRIES WHICH ARE GENERATED BY        * 
*              THE EXTERNAL MODULE ARE MADE TO X25TIP.                * 
*              THE X25TIP DETERMINES THE INCOMING WORKCODE AND        * 
*              TRANSFERS A CONTROL TO THE X.25 TRANSPORT INTERFACE    * 
*              MODULE OR SUBTIPS AFTER THE INCOMING WORKCODE IS       * 
*              CONVERTED TO THE INTERNAL WORKCODE.                    * 
*                                                                     * 
*              THE X.25 DATA STRUCTURE IS BUILT FOR THE RECEIPT       * 
*              OF AN ENABLE LINE REQUEST WORKLIST AND THE             * 
*              STRUCTURE IS DELETED FOR THE RECEIPT OF A DELETE       * 
*              LINE REQUEST WORKLIST FROM SERVICE MODULE.             * 
*                                                                     * 
*              THE TIP QUEUES DOWNLINE PACKETS INTO LCCB IF THERE     * 
*              ARE SOME PACKETS GENERATED BY A SUBTIP AFTER THE       * 
*              CONTROL IS RETURNED FROM A SUBTIP CALL.                * 
*                                                                     * 
** INPUT -                                                            * 
*              BWWLENTRY[OPS] WORK LIST ENTRY. (OPS = B0X25TIP)       * 
*                                                                     * 
*               INCOMING            OUTGOING                          * 
*               WORKCODE   SOURCE   WORKCODE             DESTINATION  * 
*              ----------  ------  ----------            -----------  * 
*                                                                     * 
*              A0SMEN      SVM     L5SMEN     ===WL===>  TRANSPORT    * 
*                                                                     * 
*              A0SMDA      SVM     L5SMDA     ===WL===>  TRANSPORT    * 
*                                                                     * 
*              A0SMDLTCB   SVM     L5SMDLTCB  ===WL===>  TRANSPORT    * 
*                                                                     * 
*              A0TIP       SVM     L5TCB      ===WL===>  TRANSPORT    * 
*               W/D5ICXN                                              * 
*               W/D5ICXA                                              * 
*               W/D5ICAR                                              * 
*               W/D5FREE                                              * 
*                                                                     * 
*              A0HARDERR   MUXSUB  L5HARDERR  ===WL===>  TRANSPORT    * 
*                                                                     * 
*              A0QUEOUT    BIP     L5QUEOUT   ===DC===>  PAD SUBTIP   * 
*                                                        A-A SUBTIP   * 
*                                                                     * 
*              A0BREAK     BIP     L5BREAK    ===DC===>  PAD SUBTIP   * 
*                                                        A-A SUBTIP   * 
*                                                                     * 
*              L3LINE      XPORT   D0LINE     ===WL===>  SVM          * 
*               W/D5OPER                                              * 
*               W/D5DISA                                              * 
*               W/D5INOP                                              * 
*                                                                     * 
*              L3TCB       XPORT   D0TCB      ===WL===>  SVM          * 
*               W/D5DELE                                              * 
*               W/D5ICAA                                              * 
*               W/D5ICAN                                              * 
*               W/D5ICXR                                              * 
*                                                                     * 
*              L3FRGR      XPORT   L3FRGR     ===DC===>  PAD SUBTIP   * 
*                                                        A-A SUBTIP   * 
*                                                                     * 
*              L3FRGQ      XPORT   L3FRGQ     ===DC===>  PAD SUBTIP   * 
*                                                        A-A SUBTIP   * 
*                                                                     * 
*              L5TIMEOUT   TIMER   L5TIMEOUT  ===DC===>  PAD SUBTIP   * 
*                                                        A-A SUBTIP   * 
*                                                                     * 
*              L3BREAK     XPORT   L3BREAK    ===DC===>  A-A SUBTIP   * 
*                                                                     * 
*              L3RESET     XPORT   L3RESET    ===DC===>  A-A SUBTIP   * 
*                                                                     * 
*              L3INTR      XPORT   L3INTR     ===DC===>  A-A SUBTIP   * 
*                                                                     * 
*              L3INTC      XPORT   L3INTC     ===DC===>  A-A SUBTIP   * 
*                                                                     * 
*              L5ULPKT     PAD     L5ULPKT    ===DC===>  PAD SUBTIP   * 
*                                                                     * 
*              L5SETPAD    SVM     L3SETPAD   ===DC===>  PAD SUBTIP   * 
*                                                                     * 
*              L3INVCLR     XPORT  L3INVCLR  ===DC===>  PAD SUBTIP    * 
*                                                                     * 
*              L5SENDCLR    TIMER  L5SENDCLR  ===WL===>  TRANSPORT    * 
*                                                                     * 
*                                                                     * 
*                                                                     * 
*                      X.25 TABLE STRUCTURES                          * 
*                      ---------------------                          * 
*                                                                     * 
*                                  LCB                                * 
*                             -------------                           * 
*                             *           *                           * 
*                             *           *                           * 
*                             *           *                           * 
*                             *           *                           * 
*                             -------------                           * 
*                             * BZTCBPTR  *                           * 
*                             -------------                           * 
*                             *           *                           * 
*                             -------------                           * 
*                         ....* BZSLCBPTR *                           * 
*         SUBLCB         .    -------------                           * 
*      ------------     .     *           *                           * 
*      *          * <...      -------------                           * 
*      *          *                                                   * 
*      *          *                                                   * 
*      ------------                                    LCCB           * 
*      * BZFLCCB  *.............................> -------------       * 
*      ------------                         ....> *           *       * 
*      *          *              LCD       .      -------------       * 
*      ------------            -------    .       * LCTCBPTR  *       * 
*      * BZLCDADR *..........> *     *....        -------------       * 
*      ------------            -------            * LCNXTLCCB *       * 
*      *          *            *     *            -------------       * 
*      ------------            *     *            *           *       * 
*      * BZGRPTCB *            *     *            -------------       * 
*      ------------            -------                  .             * 
*      *          *               .                     .             * 
*      ------------               .                     .             * 
*                                 .                     .             * 
*                                 .               -------------       * 
*                              -------            *           *       * 
*                              *     *            -------------       * 
*                              *     *            * LCTCBPTR  *       * 
*                              *     *            -------------       * 
*                              -------            * LCNXTLCCB *       * 
*                              *     *            -------------       * 
*                              -------            *           *       * 
*                                                 -------------       * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_$J+? 
  
PROCEDURE PX25TIP;
  
CONST 
  
*CALL X25CON01
  
  
TYPE
  
*CALL X25TYP02
  
      X5BUFPTR = 'X25BUFFER;                _X25 BUFFER POINTER        ?
  
      X25BUFFER = PACKED RECORD 
  
        XBSP1     : INTEGER;                _FCD/LCD                   ?
        XBSP2     : INTEGER;                _BUFFER FLAGS              ?
        XBSP3     : INTEGER;                _QCHAIN                    ?
        XBSP4     : B03BITS;                _SPARE                     ?
        XBFRGQBIT : BOOLEAN;                _FRAGMENT Q BIT            ?
        XBSP5     : B03BITS;                _SPARE                     ?
        XBFRGMBIT : BOOLEAN;                _FRAGMENT M BIT            ?
        XBSP6     : B03BITS;                _SPARE                     ?
        XBT1      : BOOLEAN;                _START T1                  ?
        XBSP7     : B04BITS;                _SPARE                     ?
      END; _X25BUFFER?
  
      X0BUFPTR = PACKED RECORD              _X25 BUFPTRS DEFINITION    ?
  
      CASE X9TAG6 : INTEGER OF
  
        1 : (X1BFPTR : B0BUFPTR);           _ACCESS GLOBAL VARIANTS    ?
        2 : (X2BFPTR : X5BUFPTR);           _X25 BUFFER POINTER        ?
        3 : (X3BFPTR : B7PKTPTR);           _TIMER PACKET POINTER      ?
      END; _X0BUFPTR? 
  
  
  
VAR 
  
      X5TIPIDENT : PACKED                   _X25 TIP IDENTIFIER        ?
                    ARRAY [1..6] OF CHAR;   _ IN CORE MEMORY           ?
      X5DBGI     : INTEGER;                 _INDEX TO NEXT WORKLIST    ?
      X5DBGA     : ARRAY [0..24]            _SAVED WORKLIST ENTRY ARRAY?
                     OF BWTIPWLE; 
      XIPARAMS   : X0PARAMS;                _X25 TIP WORKLIST          ?
      X5CNTYPE   : INTEGER;                 _CONNECTION TYPE           ?
      X5LCB      : BZLCBP;                  _LCB POINTER               ?
      X5SLCB     : B0BUFPTR;                _SLCB POINTER              ?
      X5TIMPTR   : X0BUFPTR;                _TIMER PACKET POINTER      ?
      X5CNT      : INTEGER; 
  
VALUE 
      X5TIPIDENT = (#X25TIP#);
  
_$J+? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*                   PX5BLD                                            * 
*             BUILD X25 DATA STRUCTURES                               * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW -                                                         * 
*             THIS MODULE BUILDS X.25 DATA STRUCTURE SUCH AS:         * 
*                                                                     * 
*               LCD   - LOGICAL CHANNEL DIRECTORY TABLE               * 
*               LCCB  - LOGICAL CHANNEL CONTROL BLOCK                 * 
** INPUT -                                                            * 
*             X5SLCB = SUB LCB ADDRESS                                * 
*                                                                     * 
** CALLING PROGRAMS                                                   * 
*             PX25TIP                                                 * 
*                                                                     * 
** OUTPUT -                                                           * 
*             X.25 DATA STRUCTURE                                     * 
*               .BUILD THE LOGICAL CHANNEL DIRECTORY                  * 
*               .LINK THE LCD TO THE SUBLCB                           * 
*               .BUILD ALL LCCB S FOR THE LINE                        * 
*               .LINK SUBLCB TO FIRST LCCB IN CHAIN                   * 
*               .CHAIN TOGETHER ALL LCCB S                            * 
*               .RETURN TRUE                                          * 
*                                                                     * 
** EXTERNAL SUBROUTINES -                                             * 
*             PBGET1BF  -  GET ONE BUFFER                             * 
*             PBCLR     -  CLEAR BUFFER                               * 
*             PB16ADJ   -  ADJUST 16-WORD BUFFERS                     * 
*                                                                     * 
** NOTES -                                                            * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PX5BLD; 
VAR 
      I,J,K  : INTEGER;                     _MISCELLANOUS VARIABLES    ?
      BFR    : B0BUFPTR;
      NBUF   : INTEGER;                     _NUMBER OF BUFFERS         ?
      LASTBF : B0BUFPTR;                    _POINTER TO LAST BUFFER    ?
      CHNL   : B0OVERLAY; 
      LCCB1  : BOOLEAN;                     _FIRST LCCB FLAG           ?
BEGIN 
WITH X5SLCB'.BZXSLCB DO                     _WITH SUB LCB ADDRESS      ?
  BEGIN 
  CHNL.BAINT := BZLPVC + BZLSVC;            _TOTAL NUMBER OF LOGICAL   ?
                                            _  CHANNELS                ?
  NBUF       := CHNL.BAINT DIV 64 + 1;      _NUMBER OF BUFS FOR LCNHD  ?
  BZLCDADR   := PBGET1BF(B0S64);
  PBCLR(BZLCDADR,64);                       _CLEAR IT                  ?
  FOR I := 1 TO NBUF DO                     _FOR EACH GROUP OF 64      ?
    BEGIN 
    BFR := PBGET1BF(B0S64);                 _GET A BUFFER FOR LCHND    ?
    PBCLR(BFR,64);                          _CLEAR IT                  ?
    BZLCDADR'.BCCHAINS[I] := BFR;           _PUT ADDRESS OF LCHND INTO ?
                                            _  LCHGND                  ?
    END; _FOR I := 1 TO NBUF? 
  LCCB1 := TRUE;                            _INIT FIRST LCCB FLAG      ?
  FOR I := 0 TO CHNL.BAINT DO               _FOR EACH CHANNEL          ?
    BEGIN 
    BFR := PBGET1BF(B0S16);                 _GET NEXT BUFFER ADDR      ?
    PBCLR(BFR,16);                          _CLEAR IT                  ?
    BFR'.LCCB.LCPHPSTATE := 1;              _X7READY STATE FOR LEVEL 3 ?
    BFR'.LCCB.LCHN       := I;              _CHANNEL NUMBER            ?
    IF I < BZLPVC                           _PVC CHANNEL               ?
    THEN                                    _THEN                      ?
      BFR'.LCCB.LCPVC := TRUE;              _SET PVC FLAG              ?
    J := (I DIV 64) + 1;                    _LOGICAL CHANNEL NUMBER    ?
    K := (I MOD 64) + 1;                    _LOGICAL CHANNEL NUMBER    ?
    BZLCDADR'.BCCHAINS[J]'.                 _PUT ADDRESS OF LCCB INTO  ?
                BCCHAINS[K] := BFR;         _  LCHND                   ?
    IF LCCB1                                _IF FIRST LCCB             ?
    THEN                                    _THEN                      ?
      BEGIN 
      BZFLCCB := BFR;                       _PUT FIRST LCCB ADDRESS    ?
                                            _  INTO SUB LCB            ?
      LCCB1 := FALSE;                       _TURN OFF FIRST LCCB FLAG  ?
      END _IF LCCB1?
    ELSE                                    _ELSE                      ?
      LASTBF'.LCCB.LCNXTLCCB := BFR;        _CHAIN LCCB TO LAST LCCB   ?
    LASTBF := BFR;                          _SET LAST BUFFER PTR       ?
    END; _FOR I := 0 TO CHNL? 
  BZLCDADR'.BCCHAINS[J]'.                   _LAST LCCB CHAIN POINTER   ?
      BCCHAINS[K]'.LCCB.LCNXTLCCB := BZFLCCB; 
  END; _WITH? 
END; _PROCEDURE PX5BLD? 
_$J+? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*                   PX5DEL                                            * 
*             DELETE X.25 DATA STRUCTURES                             * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW -                                                         * 
*             PX5DEL DELETES THE LOGICAL CHANNEL DIRECTORY,           * 
*             AND ALL LCCBS                                           * 
*                                                                     * 
** INPUT -                                                            * 
*             X5SLCB  = SUB LCB POINTER                               * 
*                                                                     * 
** CALLING PROGRAMS                                                   * 
*             PX25TIP                                                 * 
*                                                                     * 
** OUTPUT -                                                           * 
*                                                                     * 
** EXTERNAL SUBROUTINES -                                             * 
*             PBRELZRO - RELEASE CHAIN OF BUFFERS (CHECK NIL FIRST)   * 
*             PBREL1BF - RELEASE ONE BUFFER                           * 
*                                                                     * 
** NOTES -                                                            * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PX5DEL; 
VAR 
      I    : INTEGER;                       _INDEX                     ?
      BFR1 : B0BUFPTR;                      _ADDRESS OF BUFFER TO      ?
                                            _  RELEASE                 ?
      BFR2 : B0BUFPTR;                      _ADDRESS OF NEXT BUFFER TO ?
                                            _  RELEASE                 ?
BEGIN 
WITH X5SLCB'.BZXSLCB DO                     _SUB LCB POINTER           ?
  BEGIN 
  BFR1 := BZFLCCB;                          _FIRST LCCB IN CHAIN       ?
  WHILE BFR1 " NIL DO                       _RELEASE CHAINED LCCB"S    ?
    BEGIN 
    BFR2 := BFR1'.LCCB.LCNXTLCCB;           _NEXT LCCB IN CHAIN        ?
    PBREL1BF(BFR1,B0S16);                   _RELEASE LCCB              ?
    BFR1 := BFR2;                           _NEXT LCCB TO BE RELEASED  ?
    IF BFR1 = BZFLCCB                       _IF LAST LCCB              ?
    THEN                                    _THEN                      ?
      BFR1 := NIL;                          _SET BUFFER POINTER TO NIL ?
    END; _WHILE?
  FOR I := 1 TO 64 DO                       _RELEASE LCHND#S           ?
    BEGIN 
    BFR1 := BZLCDADR'.BCCHAINS[I];          _LCHND POINTER             ?
    BFR1'.BCCHAINS[64] := NIL;              _CLEAR LAST WORD OF LCHND  ?
    PBRELZRO(BFR1,B0S64);                   _RELEASE LCHND             ?
    END;
  PBRELZRO(BZLCDADR,B0S64);                 _RELEASE LCHGND            ?
  BZNLCCB := NIL; 
  END; _WITH? 
END; _PROCEDURE PX5DEL? 
_$J+? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*                   PX5GETCT                                          * 
*             GET CONNECTION TYPE                                     * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW -                                                         * 
*             FIND THE SUBTIP CONNECTION FROM LCCB                    * 
*                                                                     * 
** INPUT -                                                            * 
*             XATCBLCCB = TCB POINTER                                 * 
*                                                                     * 
** CALLING PROGRAMS                                                   * 
*             PX25TIP                                                 * 
*                                                                     * 
** OUTPUT -                                                           * 
*             APPROPRIATE SUBTIP                                      * 
*                                                                     * 
** EXTERNAL SUBROUTINES -                                             * 
*             NONE                                                    * 
*                                                                     * 
** NOTES -                                                            * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PX5GETCT; 
VAR 
      X5PTR : B0BUFPTR; 
BEGIN 
X5CNTYPE := N0XUNDEF;                       _PRESET TO UNDEFINED       ?
X5PTR := XIPARAMS.XATCBLCCB;                _TCB ADDRESS               ?
IF X5PTR " NIL                              _EXISTING TCB              ?
THEN
  X5PTR := X5PTR'.BSTCB.BSLCCBPTR;          _GET LCCB POINTER          ?
IF X5PTR " NIL                              _EXISTING LCCB LINK        ?
THEN
  X5CNTYPE := X5PTR'.LCCB.LCCNTYPE;         _SET CONNECTION TYPE       ?
END; _PX5GETCT? 
_$J+? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*                    PX5CALLSUBTIP                                    * 
*              CALL APPROPRIATE SUB TIP                               * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW -                                                         * 
*              CALLS A SUBTIP USING THE CONNECTION TYPE.  IF THE      * 
*              SUBTIP GENERATED SOME DOWNLINE PACKETS TO OUTPUT,      * 
*              IT QUEUES INTO THE LCCB.  A DOWNLINE FRAGMENT          * 
*              QUEUED WORKLIST IS MADE TO THE TRANSPORT INTERFACE     * 
*              MODULE IF IT IS NECESSARY.                             * 
** INPUT -                                                            * 
*              X5CNTYPE = CONNECTION TYPE                             * 
*              XIPARAMS = WORKLIST WORK AREA TO BE PASSED TO A SUB TIP* 
*              X25STTABLE = SUB TIPS ADDRESS TABLE                    * 
*                                                                     * 
** CALLING PROGRAMS                                                   * 
*              PX25TIP                                                * 
** OUTPUT -                                                           * 
*              INBOUND WORKLIST.                                      * 
*              DOWNLINE PACKETS TO X.25 TRANSPORT INTERFACE MODULE.   * 
*                                                                     * 
** EXTERNAL SUBROUTINES -                                             * 
*              PBXFER    - CALL A PAGED PROGRAM                       * 
*              PBRELZRO  - RELEASE CHAIN OF BUFFERS (CHECK NIL FIRST) * 
*              PBLSPUT   - PUT WORKLIST ENTRY                         * 
*                                                                     * 
** NOTES -                                                            * 
*              PROGRAMS WHICH CAN BE CALLED ARE                       * 
*              PXPADTIP = PAD SUB TIP                                 * 
*              PXAATIP  = APPLICATION TO APPLICATION SUB TIP          * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PX5CALLSUBTIP;
  
CONST 
      X2FCR     = 1;                        _FLOW CONTROL READY        ?
      X2DATAPKT = $00;                      _DATA PACKET               ?
      X2MODL8   = 1;                        _USING MODULO OF 8         ?
  
TYPE
      X2PKTHDR = PACKED RECORD
  
                 X2SP1     : ARRAY [1..3]   _NOT IN USE                ?
                                      OF INTEGER; 
                 X2SP41    : B03BITS;       _NOT IN USE                ?
                 XBFRGQBIT : BOOLEAN;       _Q-BIT SET BY SUBTIP       ?
                 X2SP45    : B03BITS;       _NOT IN USE                ?
                 XBFRGMBIT : BOOLEAN;       _M-BIT SET BY SUBTIP       ?
                 X2SP49    : B08BITS;       _NOT IN USE                ?
  
                 X2SP5     : INTEGER;       _NOT IN USE                ?
  
                 X2QBIT    : BOOLEAN;       _Q-BIT FIELD               ?
                 X2DPGFI   : B03BITS;       _DATA PACKET GFI           ?
                 X2LCN     : B012BITS;      _LOGICAL CHANNEL NUMBER    ?
  
                 CASE X2TAG1 : INTEGER OF 
  
                   1: (X2GPKID : B08BITS;   _GENERAL PACKET ID         ?
                       X2SP7   : B08BITS);  _NOT IN USE                ?
  
                   2: (X2SP71  : B03BITS; 
                       X2MBIT  : BOOLEAN;   _M-BIT FILED               ?
                       X2SP75  : B012BITS); 
  
                 END; _X2PKTHDR?
  
      X0PKTHDR = 'X2PKTHDR; 
  
      X0BUFPTR = PACKED RECORD
                 CASE X2TAG2 : INTEGER OF 
  
                 1: (BUFPTR : B0BUFPTR);
                 2: (PKTPTR : X0PKTHDR);
  
                 END; _X0BUFPTR?
  
VAR 
      X2TCB     : B0BUFPTR;                 _TCB ADDRESS               ?
      X2LCCB    : B0BUFPTR;                 _LCCB ADDRESS              ?
      X2BUFPTR  : B0BUFPTR;                 _BUFFER POINTER            ?
      X2PKTPTR  : X0BUFPTR;                 _PACKET ACCESS POINTER     ?
  
      X2PKTCNT  : INTEGER;                  _PACKET COUNTER            ?
  
BEGIN 
IF X5CNTYPE " N0XUNDEF                      _SUBTIP CONNECTION DEFINED ?
THEN
  BEGIN 
  BWWLENTRY[OPS] := XIPARAMS.XAWORKLIST;    _SET UP WORKLIST TO SUBTIP ?
  PBXFER (X25STTABLE[X5CNTYPE].XASTADDR,    _SUBTIP ENTRY ADDRESS      ?
          X25STTABLE[X5CNTYPE].XASTPAGE);   _SUBTIP PAGE NUMBER        ?
  
  X2TCB    := XIPARAMS.XATCBLCCB; 
  X2BUFPTR := X2TCB'.BSTCB.BSDLPACKET;
_ 
  * * *  CHECK FOR THE DOWNLINE PACKETS.
? 
  IF X2BUFPTR " NIL                         _DOWNLINE PACKET AVAILABLE ?
  THEN                                      _ SEND PACKETS TO LEVEL 3  ?
    BEGIN 
    X2LCCB          := X2TCB'.BSTCB.        _LCCB ADDRESS              ?
                               BSLCCBPTR; 
  
    IF X2LCCB'.LCCB.LCPHSSTATE " X2FCR    _RESET STATE                 ?
    THEN
      BEGIN                               _FLUSH DOWNLINE DATA         ?
      WHILE X2BUFPTR " NIL DO 
        BEGIN 
        X2PKTPTR.BUFPTR := X2BUFPTR'.BCCHAINS[QCHN];
        PBRELZRO(X2BUFPTR, BEDBSIZE); 
        X2BUFPTR := X2PKTPTR.BUFPTR;      _NEXT ONE                    ?
        END; _ WHILE                                                   ?
      END; _ RESET                                                     ?
  
    IF X2BUFPTR " NIL                       _PACKET STILL AVAILABLE    ?
    THEN
      BEGIN 
      X2PKTPTR.BUFPTR := X2BUFPTR;
      X2PKTCNT        := 0; 
  
      WHILE X2PKTPTR.BUFPTR " NIL DO
        BEGIN 
        X2PKTCNT := X2PKTCNT + 1; 
_ 
        * * *  SET UP PACKET HEADER 
? 
        WITH X2PKTPTR.PKTPTR' DO            _PACKET HEADER             ?
          BEGIN 
          X2DPGFI := X2MODL8;               _SET GFI (MODULO OF 8)     ?
          X2GPKID := X2DATAPKT;             _SET DATA PACKET TYPE      ?
          X2QBIT  := XBFRGQBIT;             _COPY Q-BIT                ?
          X2MBIT  := XBFRGMBIT;             _COPY M-BIT                ?
          X2LCN   := X2LCCB'.LCCB.LCHN;     _LOGICAL CHANNEL NUMBER    ?
          END; _ WITH X2PKTPTR                                         ?
  
        X2PKTPTR.BUFPTR :=                  _GET NEXT FRAGMENT         ?
            X2PKTPTR.BUFPTR'.BCCHAINS[QCHN];
  
        END; _ WHILE X2PKTPTR.BUFPTR " NIL                             ?
  
      X2LCCB'.LCCB.LCDFRGCNT :=             _UPDATE COUNT              ?
        X2LCCB'.LCCB.LCDFRGCNT + X2PKTCNT;
  
      IF X2LCCB'.LCCB.LCDPQR = NIL          _DOWNLINE QUEUE EMPTY      ?
      THEN
        X2LCCB'.LCCB.LCDPQR := X2BUFPTR 
      ELSE
        BEGIN 
        X2PKTPTR.BUFPTR := X2LCCB'.LCCB.LCDPQR; 
        WHILE X2PKTPTR.BUFPTR'.BCCHAINS[QCHN] " NIL DO
          X2PKTPTR.BUFPTR := X2PKTPTR.BUFPTR'.BCCHAINS[QCHN]; 
        X2PKTPTR.BUFPTR'.BCCHAINS[QCHN] := X2BUFPTR;
        END;
_ 
      * * *  SEND L3FRGQ WORKLIST TO LEVEL 3 IF IT IS NECESSARY.
? 
      IF X2TCB'.BSTCB.BSLCBP'.BZSLCBPTR'.BZXSLCB.BZFRMRPEND 
      THEN
        BEGIN 
        XIPARAMS.XAWC      := TPFRGQ; 
        XIPARAMS.XABFRPTR  := NIL;
        XIPARAMS.XATCBLCCB := X2TCB;
        PBLSPUT (XIPARAMS.XAWORKLIST, BYWLCB[B0XTRANS]);
        END;
  
      END; _ IF X2BUFPTR " NIL                                         ?
  
    X2TCB'.BSTCB.BSDLPACKET := NIL; 
    END; _ IF BSDLPACKET " NIL                                         ?
  
  END; _ IF X5CNTYPE " N0XUNDEF                                        ?
END; _PROCEDURE PX5CALLSUBTIP?
  
_$J+? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*              MAIN PROGRAM                                           * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
BEGIN 
X5DBGA [X5DBGI] := BWWLENTRY[OPS].B0TIPWLE; _SAVE WORKLIST ENTRY       ?
X5DBGI          := (X5DBGI + 1) MOD 25;     _UPDATE INDEX INTO ARRAY   ?
XIPARAMS.XAWORKLIST := BWWLENTRY[OPS];      _GET NEW WORKLIST          ?
WITH XIPARAMS DO
  BEGIN 
  
  CASE XAWC OF                              _WORK CODE                 ?
  
_ 
* * * *  PROCESS THE ENABLE AND DISABLE LINE REQUESTS 
? 
  A0SMEN,                                   _ENABLE LINE               ?
  A0SMDA:                                   _DISABLE LINE              ?
    BEGIN 
    PBLCBP(XALINO.BDLINO,X5LCB);            _ACQUIRE LCB               ?
    X5SLCB := X5LCB'.BZSLCBPTR;             _SUB LCB POINTER           ?
    IF XAWC = A0SMEN
    THEN
      BEGIN                                 _CONVERT TO INTERNAL CODES ?
      PX5BLD;                               _BUILD X25 CONTROL BLOCKS  ?
      XAWC := L5SMEN; 
      END 
    ELSE
      BEGIN 
      XAWC := L5SMDA; 
      FOR X5CNT := N0XPAD TO N0X2USR DO     _RELEASE GROUPE TCB        ?
        PBRELZRO(X5SLCB'.BZXSLCB.BZGRPTCB[X5CNT], BEDBSIZE);
      END;
  
_   X5CNTYPE := N0XPAD;                                                ?
_   PX5CALLSUBTIP;                           CALL PAD SUB TIP          ?
_   X5CNTYPE := N0XAPPL;                                               ?
_   PX5CALLSUBTIP;                           CALL APPLICATION LINK     ?
_   X5CNTYPE := N0X1USR;                                               ?
_   PX5CALLSUBTIP;                           CALL USER SUB TIP         ?
  
    PBLSPUT(XAWORKLIST,BYWLCB[B0XTRANS]);   _SWITCH TO TRANSPORT       ?
    END;  _A0SMEN,A0SMDA? 
  
_ 
* * * *  PROCESS THE DOWNLINE NETWORK BLOCK QUEUED
? 
  A0QUEOUT:                                 _DOWNLINE BLOCK QUEUED     ?
    BEGIN 
    XAWC := L5QUEOUT;                       _INTERNAL CODE             ?
    PX5GETCT;                               _GET CONNECTION TYPE       ?
    PX5CALLSUBTIP;
    END; _A0QUROUT? 
  
_ 
* * * *  PROCESS PACKET LEVEL RESET INDICATION/CONFIRMATION 
* * * *  PROCESS PACKET LEVEL INTERRUPT INDICATION CONFIRMATION 
? 
  L3BREAK,                                  _LEVEL 3 RESET INDICATION  ?
  L3RESET,                                  _LEVEL 3 RESET CONFIRMATION?
  L3INTR,                                   _LEVEL 3 INTERRUPT INDICATI?
  L3INTC,                                   _LEVEL 3 INTERRUPT CONFIRMA?
  L5ULPKT:                                  _PROCESS OUTSTANDING PACKET?
    BEGIN 
    PX5GETCT;                               _GET CONNECTION TYPE       ?
    PX5CALLSUBTIP;                          _CALL SUB TIP              ?
    END; _A0QUEOUT ?
  
_ 
* * * *  PROCESS DOWNLINE BREAK 
? 
  A0BREAK:                                  _DOWNLINE BREAK            ?
    BEGIN 
    XAWC := L5BREAK;                        _INTERNAL CODE             ?
    PX5GETCT;                               _GET CONNECTION TYPE       ?
    PX5CALLSUBTIP;                          _CALL SUB TIP              ?
    PBLSPUT(XAWORKLIST,BYWLCB[B0XTRANS]);   _SWITCH TO TRANSPORT       ?
    END; _A0BREAK ? 
  
_ 
* * * *  PROCESS DOWNLINE RESET 
? 
  A0RESET:                                  _DOWNLINE RESET            ?
    BEGIN 
    XAWC := L5RESET;
    PX5GETCT;                               _GET CONNECTION TYPE       ?
    PX5CALLSUBTIP;                          _CALL SUB TIP              ?
    PBLSPUT(XAWORKLIST,BYWLCB[B0XTRANS]);   _SWITCH TO TRANSPORT       ?
    END; _A0RESET ? 
  
_ 
* * * *  PROCESS HARDWARE ERRORS
? 
  A0HARDERR:                                _HARDWARE ERROR            ?
    BEGIN 
    XAWC   := L5HARDERR;                    _INTERNAL WORKCODE         ?
    XADATA := D5INOP;                       _ACTION CODE               ?
    PBLSPUT(XAWORKLIST,BYWLCB[B0XTRANS]);   _SWITCH TO TRANSPORT       ?
    END; _A0HARDERR?
  
_ 
* * * *  PROCESS THE FRAGMENT QUEUED REQUEST
* * * *  PROCESS THE FRAGMENT REQUEST 
? 
  L3FRGR, 
  L3FRGQ:                                   _FRAGMENT QUEUED           ?
    BEGIN 
    PX5GETCT;                               _GET CONNECTION TYPE       ?
    IF XATCBLCCB = NIL                      _TCB DELINKED              ?
    THEN
      PBRELZRO(XABFRPTR,BEDBSIZE)           _RELEASE ANY BUFFER        ?
    ELSE
      PX5CALLSUBTIP;
    END; _L3FRGR,L3FRGQ?
  
_ 
* * * *  PROCESS THE LINE INOPERATIVE STATUS
* * * *  PROCESS THE LINE OPERATIVE STATUS
* * * *  PROCESS THE LINE DISABLED RESPONSE 
? 
  L3LINE:                                   _LINE OPER, INOP, DISA     ?
    BEGIN 
    PBLCBP(XALINO.BDLINO,X5LCB);            _GET LCB POINTER           ?
    X5SLCB := X5LCB'.BZSLCBPTR;             _GET SUB LCB POINTER       ?
    XADATA := X5SLCB'.BZXSLCB.BZSTLNK;
    XAWC   := D0LINE;                       _LINE EVENT                ?
    IF XADATA = D5DISA                      _LINE IS DISABLED          ?
    THEN
      BEGIN 
      PX5DEL;                               _DELETE X25 STRUCTURES     ?
      END;
    PBLSPUT(XAWORKLIST,BYWLCB[B0SMWL]);     _GIVE IT TO SVM            ?
    END; _L3LINE? 
  
_ 
* * * *  PROCESS THE A0TIP REQUESTS 
? 
  A0TIP:                                    _A0TIP EVENTS              ?
    BEGIN 
    XAWC := L5TCB;
    IF XADATA = D5FREE                      _CONNECTION HAS BEEN FREED ?
    THEN
      BEGIN 
      PX5GETCT;                             _GET CONNECTION TYPE       ?
      PX5CALLSUBTIP;
      END;
    PBLSPUT(XAWORKLIST,BYWLCB[B0XTRANS]);   _SWITCH TO TRANSPORT       ?
    END; _A0TIP?
  
_ 
* * * *  PROCESS TCB EVENTS 
? 
  L3TCB:                                    _TCB EVENTS                ?
    BEGIN 
    PX5GETCT;                               _GET CONNECTION TYPE       ?
    PX5CALLSUBTIP;
    XAWC := D0TCB;
    PBLSPUT(XAWORKLIST,BYWLCB[B0SMWL]);     _GIVE IT TO SVM            ?
    END; _L3TCB?
  
_ 
* * * *  PROCESS DELETE TCB REQUEST 
? 
  A0SMDLTCB:                                _DELETE TCB REQUEST        ?
    BEGIN 
    XAWC := L5SMDLTCB;                      _CONVERT FOR LEVEL 3       ?
    PX5GETCT;                               _GET CONNECTION TYPE       ?
    PX5CALLSUBTIP;                          _CALL SUB TIP              ?
    PBLSPUT(XAWORKLIST,BYWLCB[B0XTRANS]);   _SWITCH TO TRANSPORT       ?
    END; _A0SMDLTCB?
  
_ 
* * * *  PROCESS THE TIME-OUT WORKLIST ENTRY
? 
  L5TIMEOUT:                                _TIMEOUT ENTRY             ?
    BEGIN 
    X5TIMPTR.X1BFPTR := XABFRPTR;           _GET TIMER PACKET          ?
    X5CNTYPE := X5TIMPTR.X3BFPTR'.BKUSRBYTE;_GET CONNECTION TYPE       ?
    PX5CALLSUBTIP;                          _NOTIFY SUB TIP            ?
    END; _L5TIMEOUT?
  
_ 
* * * *  PAD SUBTIP NEEDS TO SEND A SET PAD PARAMETER MESSAGE 
? 
  L5SETPAD: 
    BEGIN 
    PX5GETCT;                               _GET CONNECTION TYPE       ?
    PX5CALLSUBTIP;                          _NOTITY SUBTIP             ?
    END; _L5SETPAD? 
  
_ 
* * * *  PAD SUBTIP NEEDS TO PROCESS INVITATION TO CLEAR PACKET 
? 
  L3INVCLR: 
    BEGIN 
    PX5GETCT;                               _GET CONNECTION TYPE       ?
    PX5CALLSUBTIP;                          _NOTIFY SUB TIP            ?
    END; _L3INVCLR? 
  
_ 
* * * *  PROCESS TIME EXPIRED WAITING FOR CLEAR INDICATION RESPONSE TO
* * * *  INVITATION TO CLEAR
? 
  L5SENDCLR:                                _CLEAR INDICATION TIMEOUT  ?
    BEGIN 
    X5TIMPTR.X1BFPTR := XABFRPTR;           _GET TIMER PACKET          ?
    XATCBLCCB  := X5TIMPTR.X3BFPTR'.BK2UPTR;_GET TCB PTR               ?
    X5TIMPTR.X3BFPTR'.BK2UPTR := NIL;       _CLEAR BUFFER CHAIN        ?
    IF XATCBLCCB " NIL                      _CLEAR INDICATION RECEIVED ?
    THEN
      BEGIN                                 _SEND CLEAR REQUEST        ?
      PBLSPUT(XAWORKLIST,BYWLCB[B0XTRANS]); _SWITCH TO TRANSPORT       ?
      XATCBLCCB'.BSTCB.BSLCCBPTR'.          _PTR SHOULD BE NIL         ?
                     LCCB.LCTMRPKT := NIL;
      END;
    PBREL1BF(X5TIMPTR.X1BFPTR,B0S8);        _RELEASE TIMER PACKET BFR  ?
    END; _L5SENDCLR?
  
  END; _XAWC ?
  END; _WITH XIPARAMS?
  
END; _PROCEDURE PX25TIP?
