*COMDECK X25APPL
_$J+  PAGE EJECT? 
  
  
  
  
  
  
  
  
_ 
                 XX      XX       22222222   55 
                 XX      XX      2222222222  5555555555 
                 XXX    XXX      2       22  5555555555 
                  XXX  XXX               22  55 
                   XX  XX               22   55 
                    XXXX               22    55 
                     XX               22     555555555
                    XXXX             22       555555555 
                   XX  XX           22               55 
                  XXX  XXX         22                55 
                 XXX    XXX       22         5       55 
                 XX      XX  ..  2222222222  5555555555 
                 XX      XX  ..  2222222222   55555555
  
  
  
                     AAAAAA                  AAAAAA 
                    AAAAAAAA                AAAAAAAA
                   AA      AA              AA      AA 
                   AA      AA              AA      AA 
                   AA      AA   --------   AA      AA 
                   AAAAAAAAAA   --------   AAAAAAAAAA 
                   AAAAAAAAAA              AAAAAAAAAA 
                   AA      AA              AA      AA 
                   AA      AA              AA      AA 
                   AA      AA              AA      AA 
  
  
  SSSSSSSS   UU      UU  BBBBBBBBB      TTTTTTTTTT  IIIIII  PPPPPPPPP 
 SSSSSSSSSS  UU      UU  BBBBBBBBBB     TTTTTTTTTT  IIIIII  PPPPPPPPPP
 SS      SS  UU      UU  BB      BB         TT        II    PP      PP
  SS         UU      UU  BB      BB         TT        II    PP      PP
   SSS       UU      UU  BBBBBBBB           TT        II    PPPPPPPPPP
      SSS    UU      UU  BBBBBBBB           TT        II    PPPPPPPPP 
        SS   UU      UU  BB      BB         TT        II    PP
 SS      SS  UU      UU  BB      BB         TT        II    PP
 SSSSSSSSSS   UUUUUUUU   BBBBBBBBBB         TT      IIIIII  PP
  SSSSSSSS     UUUUUU    BBBBBBBBB          TT      IIIIII  PP
? 
  
  
  
_$J+  PAGE EJECT? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*               X25 APPL. TO APPL. CONNECTION SUBTIP.                 * 
*                                                                     * 
*                          PXAATIP                                    * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_$R-,G-,I-     NON-RECURSIVE
               INTERRUPTABLE? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW:                                                          * 
*              THE APPLICATION TO APPLICATION (A-A) SUBTIP DRIVES     * 
*              A-A CONNECTION LINK BETWEEN APPLICATIONS, HOSTS        * 
*              CONNECTED BY A X25 LINK AND 2 NPUS OR VIA A PACKET     * 
*              SWITCHED NETWORK (PSN).                                * 
*                                                                     * 
*              DOWNLINE DATA FLOW:                                    * 
*              ------------------                                     * 
*                                                                     * 
*                                                                     * 
*               I)   DOWNLINE BLK OR MSG TYPE BLOCK.                  * 
*                                                                     * 
*                    PACKETIZES NETWORK BLOCKS TO PACKETS (M-BIT      * 
*                    MAY OR MAY NOT SET, IT DEPENDS UPON SEQUENCE     * 
*                    OF BLK AND MSG BLOCKS OR SIZE OF BLOCKS.         * 
*                    Q-BIT IS ALWAYS SET TO 0).                       * 
*                                                                     * 
*                    IF THE NUMBER OF DATA CHARACTER IN A RECEIVED    * 
*                    BLK BLOCK IS NOT ENOUGH TO FILL A PACKET,        * 
*                    SUBTIP HOLDS THE DOWNLINE PARTIAL PACKET UNTIL   * 
*                    THE PACKET IS FILLED.                            * 
*                                                                     * 
*                    EX.)                                             * 
*                     BLK, BLK, ..., BLK                              * 
*                         =====>  PACKET (M=1, Q=0)                   * 
*                                   .                                 * 
*                                   .                                 * 
*                                   .                                 * 
*                                 PACKET (M=1, Q=0)                   * 
*                                                                     * 
*                     NOTE:  ONLY PACKETS THAT ARE FULL IS QUEUED     * 
*                            TO PACKET LEVEL (LEVEL 3).               * 
*                                                                     * 
*                     BLK, BLK, ..., MSG                              * 
*                         =====>  PACKET (M=1, Q=0)                   * 
*                                   .                                 * 
*                                   .                                 * 
*                                   .                                 * 
*                                 PACKET (M=1, Q=0)                   * 
*                                 PACKET (M=0, Q=0)                   * 
*                                                                     * 
*                     NOTE :  NO OUTSTANDING PACKET IS LEFT           * 
*                             AFTER PROCESSING MSG BLOCK.             * 
*                                                                     * 
*                                                                     * 
*               II)  DOWNLINE QBLK OR QMSG TYPE BLOCK.                * 
*                                                                     * 
*                    PACKETIZES NETWORK BLOCKS TO PACKETS (M-BIT      * 
*                    MAY OR MAY NOT SET, IT DEPENDS UPON SEQUENCE     * 
*                    OF QBLK AND QMSG BLOCKS OR SIZE OF BLOCKS.       * 
*                    Q-BIT IS ALWAYS SET TO 1).                       * 
*                                                                     * 
*                    IF THE NUMBER OF DATA CHARACTER IN A RECEIVED    * 
*                    QBLK BLOCK IS NOT ENOUGH TO FILL A PACKET,       * 
*                    SUBTIP HOLDS THE DOWNLINE PARTIAL PACKET UNTIL   * 
*                    THE PACKET IS FILLED.                            * 
*                                                                     * 
*                    EX.)                                             * 
*                     QBLK, QBLK, ..., QBLK                           * 
*                         =====>  PACKET (M=1, Q=1)                   * 
*                                   .                                 * 
*                                   .                                 * 
*                                   .                                 * 
*                                 PACKET (M=1, Q=1)                   * 
*                                                                     * 
*                     NOTE:  ONLY PACKETS THAT ARE FULL IS QUEUED     * 
*                            TO PACKET LEVEL (LEVEL 3).               * 
*                                                                     * 
*                     QBLK, QBLK, ..., QMSG                           * 
*                         =====>  PACKET (M=1, Q=1)                   * 
*                                   .                                 * 
*                                   .                                 * 
*                                   .                                 * 
*                                 PACKET (M=1, Q=1)                   * 
*                                 PACKET (M=0, Q=1)                   * 
*                                                                     * 
*                     NOTE :  NO OUTSTANDING PACKET IS LEFT           * 
*                             AFTER PROCESSING QMSG BLOCK.            * 
*                                                                     * 
*                                                                     * 
*               III) DOWNLINE CMD TYPE BLOCK.                         * 
*                                                                     * 
*                    1) DOWNLINE IVT COMMAND                          * 
*                         CALL IVT PARSER ROUTINE                     * 
*                                                                     * 
*                    2) DOWNLINE PRU MODE COMMAND                     * 
*                         SET / RESET RECEIVER PRU MODE OPERATION     * 
*                                                                     * 
*                                                                     * 
*                                                                     * 
*               IV)  DOWNLINE INTERRUPT CMD TYPE BLOCK.               * 
*                      (ICMD : REQUEST.  ICMDR : RESPONSE)            * 
*                                                                     * 
*                      SEND WORKLIST ENTRY TO PACKET LEVEL.           * 
*                                                                     * 
*                       ICMD  ===> L5INTR (REQUEST)                   * 
*                       ICMDR ===> L5INTC (RESPONSE)                  * 
*                                                                     * 
*                                                                     * 
*               V)   DOWNLINE RESET TYPE BLOCK                        * 
*                      (BREAK : REQUEST.  RESET : RESPONSE)           * 
*                                                                     * 
*                      SEND WORKLIST ENTRY TO PACKET LEVEL.           * 
*                                                                     * 
*                      BREAK ===> L5BREAK (REQUEST)                   * 
*                      RESET ===> L5RESET (RESPONSE)                  * 
*                                                                     * 
*                                                                     * 
*              UPLINE DATA FLOW:                                      * 
*              ----------------                                       * 
*                                                                     * 
*               I)   UPLINE DATA PACKET.                              * 
*                                                                     * 
*                    INCOMING PACKET IS PASSED TO ULTS (BIP)          * 
*                    AS AN UPLINE DATA BLOCK WITHOUT GOING THRU       * 
*                    TEXT PROCESSING.                                 * 
*                                                                     * 
*                    BLK, MSG UPLINE BLOCK;                           * 
*                      SUBTIP SENDS THE BLK BLOCK TO ULTS IF          * 
*                      M-BIT IN INCOMING PACKET IS SET, SENDS         * 
*                      THE MSG BLOCK OTHERWISE.                       * 
*                                                                     * 
*                    SUBTIP ASSUMES ULTS TO DO THE BLOCKING ON        * 
*                    UPLINE DATA BLOCK BY USING THE BLOCKING          * 
*                    FACTOR PARAMETER.                                * 
*                                                                     * 
*                    EX.)                                             * 
*                       I           I         I           I           * 
*                       I-----I-----I         I-----I-----I           * 
*                       I FH  I FH  I         I DN  I SN  I           * 
*                       I-----I-----I         I-----I-----I           * 
*                       I PH  I PH  I         I CN  I BT  I           * 
*                       I-----I-----I         I-----I-----I           * 
*                       I PH  I     I =====>  I DBC I     I           * 
*                       I-----I     I         I-----I     I           * 
*                       I           I         I           I           * 
*                       I   DATA    I         I   DATA    I           * 
*                       I           I         I           I           * 
*                                                                     * 
*                                                                     * 
*               II)  UPLINE Q-BIT PACKET.                             * 
*                                                                     * 
*                    INCOMING PACKET IS PASSED TO ULTS (BIP)          * 
*                    AS AN UPLINE Q BLOCK WITHOUT GOING THRU          * 
*                    TEXT PROCESSING.                                 * 
*                                                                     * 
*                    QBLK, QMSG UPLINE BLOCK:                         * 
*                      SUBTIP SENDS THE QBLK BLOCK TO ULTS IF         * 
*                      M-BIT IN INCOMING PACKET IS SET, SENDS         * 
*                      THE QMSG BLOCK OTHERWISE.                      * 
*                                                                     * 
*                    SUBTIP ASSUMES ULTS TO DO THE BLOCKING ON        * 
*                    UPLINE QUALIFIED DATA BLOCK BY USING THE         * 
*                    BLOCKING FACTOR PARAMETER.                       * 
*                                                                     * 
*                    EX.)                                             * 
*                       I           I         I           I           * 
*                       I-----I-----I         I-----I-----I           * 
*                       I FH  I FH  I         I DN  I SN  I           * 
*                       I-----I-----I         I-----I-----I           * 
*                       I PH  I PH  I         I CN  I BT  I           * 
*                       I-----I-----I         I-----I-----I           * 
*                       I PH  I     I         I DBC I     I           * 
*                       I-----I-----I =====>  I-----I     I           * 
*                       I           I         I           I           * 
*                       I  Q DATA   I         I  Q DATA   I           * 
*                       I           I         I           I           * 
*                                                                     * 
*                                                                     * 
*               III) UPLINE INTERRUPT INDICATION.                     * 
*                                                                     * 
*                    THE INTERRUPT INDICATION IS QUEUED FROM          * 
*                    PACKET LEVEL.  SUBTIP SENDS ICMD OR ICMDR        * 
*                    INDICATION TO ULTS.                              * 
*                                                                     * 
*                      FROM LEVEL 3                TO ULTS            * 
*                      ------------          -------------------      * 
*                         L3INTR              UPLINE ICMD BLOCK       * 
*                                             (WITH REASON CODE)      * 
*                         L3INTC              UPLINE ICMDR BLOCK      * 
*                                                                     * 
*                                                                     * 
*               IV)  UPLINE RESET INDICATION.                         * 
*                                                                     * 
*                    THE RESET INDICATION IS QUEUED FROM PACKET       * 
*                    LEVEL. SUBTIP SENDS BREAK OR RESET INDICATION    * 
*                    TO ULTS.                                         * 
*                                                                     * 
*                      FROM LEVEL 3                TO ULTS            * 
*                      ------------          -------------------      * 
*                         L3BREAK             UPLINE BREAK BLOCK      * 
*                                             (WITH REASON CODE       * 
*                                                   CAUSE  CODE       * 
*                                                   DIAG   CODE)      * 
*                         L3RESET             UPLINE RESET BLOCK      * 
*                                                                     * 
*                                                                     * 
*              INPUT TO THE A-A SUBTIP:                               * 
*              -----------------------                                * 
*                                                                     * 
*                  I)  WORKLIST ENTRY                                 * 
*                                                                     * 
*                     WORK CODE  ORIGINATOR                 RECEIVER  * 
*                     ---------  ----------                 --------  * 
*                                           WL          DC            * 
*                     L3FRGQ      LEVEL 3   ---> X25TIP ---> SUBTIP   * 
*                                           WL          DC            * 
*                     L3FRGR      LEVEL 3   ---> X25TIP ---> SUBTIP   * 
*                                           WL          DC            * 
*                     L3INTR      LEVEL 3   ---> X25TIP ---> SUBTIP   * 
*                                           WL          DC            * 
*                     L3INTC      LEVEL 3   ---> X25TIP ---> SUBTIP   * 
*                                           WL          DC            * 
*                     L3BREAK     LEVEL 3   ---> X25TIP ---> SUBTIP   * 
*                                           WL          DC            * 
*                     L3RESET     LEVEL 3   ---> X25TIP ---> SUBTIP   * 
*                                           WL          DC            * 
*                     L3TCB       LEVEL 3   ---> X25TIP ---> SUBTIP   * 
*                      (CMDATA = D5DOWN)                              * 
*                                                                     * 
*                                           DC          DC            * 
*                     L5ATOA      BIP       ---> INTBIP ---> SUBTIP   * 
*                                           WL          DC            * 
*                     L5QUEOUT    BIP       ---> X25TIP ---> SUBTIP   * 
*                                                                     * 
*                                           WL          DC            * 
*                     L5SMEN      SVM       ---> X25TIP ---> SUBTIP   * 
*                                           WL          DC            * 
*                     L5SMDA      SVM       ---> X25TIP ---> SUBTIP   * 
*                                           WL          DC            * 
*                     L5SMDLTCB   SVM       ---> X25TIP ---> SUBTIP   * 
*                                           WL          DC            * 
*                     L5TCB       SVM       ---> X25TIP ---> SUBTIP   * 
*                      (CMDATA = D5FREE)                              * 
*                                                                     * 
*                                           WL          DC            * 
*                     L5TIMEOUT   TIMING    ---> X25TIP ---> SUBTIP   * 
*                                 SERVICES                            * 
*                                                                     * 
*                                                                     * 
*                 II)  INPUT DATA                                     * 
*                                                                     * 
*                     UPLINE FRAGMENT.                                * 
*                       * Q-BIT = 1 : Q-BIT PACKET.                   * 
*                               = 0 : DATA PACKET.                    * 
*                                                                     * 
*                     DOWNLINE NETWORK BLOCK.                         * 
*                       * DATA BLOCK.               (BLK OR MSG)      * 
*                       * Q BLOCK.                  (QBLK OR QMSG)    * 
*                       * INTERRUPT COMMAND BLOCK.  (ICMD OR ICMDR)   * 
*                       * RESET TYPE BLOCK.         (BREAK OR RESET)  * 
*                       * COMMAND BLOCK             (CMD)             * 
*                                                                     * 
*                                                                     * 
*              OUTPUT FROM THE A-A SUBTIP:                            * 
*              --------------------------                             * 
*                                                                     * 
*                  I)  WORKLIST ENTRY                                 * 
*                                                                     * 
*                     WORK CODE    ORIGINATOR               RECEIVER  * 
*                     ---------    ----------               --------  * 
*                                                 WL                  * 
*                     L5INTR         SUBTIP  -------------> LEVEL 3   * 
*                                                 WL                  * 
*                     L5INTC         SUBTIP  -------------> LEVEL 3   * 
*                                                 WL                  * 
*                     L5BREAK        SUBTIP  -------------> LEVEL 3   * 
*                                                 WL                  * 
*                     L5RESET        SUBTIP  -------------> LEVEL 3   * 
*                                                                     * 
*                 II)  OUTPUT DATA                                    * 
*                                                                     * 
*                     UPLINE NETWORK BLOCK.                           * 
*                       (DIRECT CALL TO THE UPLINE TIP SERVICE)       * 
*                       * BLK OR MSG BLOCK.                           * 
*                       * QBLK OR QMSG BLOCK.                         * 
*                       * ICMD OR ICMDR BLOCK.                        * 
*                       * BREAK OR RESET BLOCK.                       * 
*                                                                     * 
*                     DOWNLINE FRAGMENT TO LEVEL 3                    * 
*                       * Q-BIT = 1  Q-BIT PACKET.                    * 
*                               = 0  DATA PACKET.                     * 
*                                                                     * 
*                                                                     * 
*     ***  NOTE                                                       * 
*                                                                     * 
*           FLOW OF DOWNLINE DATA:                                    * 
*                                                                     * 
*             * BLK OR MSG BLOCK     ----->   DATA PACKET             * 
*             * QBLK OR QMSG BLOCK   ----->   Q-BIT PACKET            * 
*             * ICMD OR ICMDR BLOCK  ----->   INTERRUPT COMMAND       * 
*                                             REQUEST OR RESPONSE     * 
*             * BREAK OR RESET BLOCK ----->   RESET PACKET REQUEST    * 
*                                             OR RESPONSE             * 
*                                                                     * 
*           FLOW OF UPLINE DATA:                                      * 
*                                                                     * 
*             * DATA PACKET          ----->   BLK OR MSG BLOCK        * 
*             * Q-BIT PACKET         ----->   QBLK OR QMSG BLOCK      * 
*             * INTERRUPT COMMAND                                     * 
*               REQUEST OR RESPONSE  ----->   ICMD OR ICMDR BLOCK     * 
*             * RESET PACKET REQUEST                                  * 
*               OR RESPONSE          ----->   BREAK OR RESET BLOCK    * 
*                                                                     * 
*                                                                     * 
*        DC :  DIRECT CALL                                            * 
*        WL :  WORKLIST ENTRTY                                        * 
*                                                                     * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PXAATIP;
  
CONST 
  
  
*CALL X25CON01
_ 
* * * *  INTERNAL BLOCK TYPE. 
? 
      BLK  = 1;                             _BLK BLOCK                 ?
      QBLK = 2;                             _Q MESSAGE BLK BLOCK       ?
      MSG  = 3;                             _MSG BLOCK                 ?
      QMSG = 4;                             _Q MESSAGE MSG BLOCK       ?
      CMD  = 5;                             _COMMAND BLOCK             ?
      ICMD = 6;                             _I COMMAND REQUEST BLOCK   ?
      ICMR = 7;                             _I COMMAND RESPONSE BLOCK  ?
  
  
  
  
TYPE
  
  
*CALL X25TYP02
  
  
_ 
* * *  DEFINITION OF PACKET FLAGS 
? 
      A0AADEF      = PACKED RECORD
  
                   XBSP0     : INTEGER;     _WORD 0: LCD AND FCD       ?
                   XBSP16    : INTEGER;     _WORD 2: BUFFER FLAGS      ?
                   XBSP32    : INTEGER;     _WORD 3: QUEUE CHAIN       ?
                   XBSP35    : B03BITS;     _SPARE                     ?
                   XBFRGQBIT : BOOLEAN;     _PACKET TYPE (Q - BIT)     ?
                                            _T : CMD PACKET            ?
                                            _F : DATA PACKET           ?
                   XBSP39    : B03BITS;     _SPARE                     ?
                   XBFRGMBIT : BOOLEAN;     _PACKET CHAIN (M - BIT)    ?
                                            _T : MORE PACKET CHAINED   ?
                                            _F : LAST PACKET           ?
                   XBSP48    : B08BITS;     _SPARE                     ?
                 END;  _ A0AADEF ?
  
      A0AAPTR      = 'A0AADEF;
  
_ 
* * *  ACCESSING SYSTEM BUFFER DEFINITION AND SUBTIP DEFINITION 
? 
      A0BUFFER     = PACKED RECORD  CASE A0TAG1 : INTEGER OF
  
                 1: (A1BFACSS : B0BUFPTR);  _ACCESS THE GLOBAL BUFFER  ?
                                            _ DEFINITIONS              ?
                 2: (A1AAACSS : A0AAPTR );  _ACCESS THE SUBTIP BUFFER  ?
                                            _ DEFINITIONS              ?
                 3: (A1TMACSS : B7PKTPTR);  _ACCESS THE TIMER PACKET   ?
                                            _ DEFINITIONS              ?
                 END;  _ A0BUFFER ? 
  
VAR 
      A1TIPIDENT   : PACKED                 _A-A SUBTIP IDENTIFIER     ?
                      ARRAY [1..6] OF CHAR; _ IN CORE MEMORY           ?
  
_ 
* * * *  INPUT AND OUTPUT WORKLIST ENTRY WORKING AREAS. 
? 
      A1INWKLST    : X0PARAMS;              _SAVE INCOMING WORKLIST    ?
      A1OUTWKLST   : X0PARAMS;              _SAVE OUTGOING WORKLIST    ?
  
_ 
* * * *  LOCAL TCB AND LCB POINTERS.
? 
      A1TCBADDR    : B0BUFPTR;              _TCB ADDRESS               ?
      A1LCBADDR    : BZLCBP;                _LCB ADDRESS               ?
  
_ 
* * * *  LOCAL UPLINE AND DOWNLINE BLOCK POINTERS.
? 
      A1ULBLOCK    : B0BUFPTR;              _UPLINE BLOCK POINTER      ?
  
  
_ 
* * * *  ULTS (BIP) INTERFACE FLAG WORD.
? 
      A1FLGWRD     : KTULTSFLAG;
  
_ 
* * * *  BLOCK TYPE OF THE DOWNLINE BLOCK.
? 
      A1BLKTYPE    : INTEGER; 
  
_ 
* * * *  TIMER PACKET ACCESS. 
? 
      A1TMRPKT     : A0BUFFER;
  
_ 
* * * *  UPLINE VARIABLES.
? 
      A1PACKET     : A0BUFFRE;              _X25 BUFFER DEFINITION     ?
      A1QBIT       : BOOLEAN;               _Q-BIT IN UPLINE PACKET    ?
      A1MBIT       : BOOLEAN;               _M-BIT IN UL PACKET        ?
_ 
* * * *  UPLINE BLOCK TYPE SELECTION. 
? 
      A1TYPE       : ARRAY [BOOLEAN]        _ARRAY [A1QBIT]            ?
                                OF INTEGER; 
  
      A1BRK        : ARRAY [L3BREAK .. L3RESET] OF INTEGER; 
                                            _BREAK BLOCK TYPE TABLE    ?
VALUE 
      A1TIPIDENT   = (#A-ATIP#);            _IDENTIFIER CHARACTERS     ?
  
_                                            A1QBIT                    ?
      A1TYPE       = (HTMSG,                _  F             MSG  BLOCK?
                      HTQMSG);              _  T             QMSG BLOCK?
  
      A1BRK        = (HTBREAK,              _BREAK BLOCK               ?
                      HTRESET);             _RESET BLOCK               ?
  
_$J+  PAGE EJECT? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*              DOWNLINE BLOCK HANDLER  ( PXADLHANDLER )   : LEVEL II  * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW:                                                          * 
*              CHECKS FOR DOWNLINE BLOCKS IN BSQPTR AND CREATES       * 
*              DOWNLINE FRAGMENTS UNTIL THE PACKET WINDOW IS CLOSED.  * 
*              COMMAND BLOCKS ARE ALSO PROCESSED BY THIS PROCEDURE.   * 
** INPUT                                                              * 
*              TCB ADDRESS                    : A1TCBADDR             * 
*                                                                     * 
** OUTPUT                                                             * 
*              DOWNLINE PACKETS QUEUED        : BSDLPACKET            * 
*                                                                     * 
** CALLING PROGRAM:                                                   * 
*                                                                     * 
*              A-A SUBTIP WORKLIST HANDLER    : MAIN PROGRAM          * 
*                                                                     * 
** SUBROUTINE CALL:                                                   * 
*                                                                     * 
*     EXTERNAL SUBROUTINE                                             * 
*              MAINTAIN QUEUES                : PBQUEMAINT            * 
*              RELEASE CHAIN OF BUFFERS       : PBRELCHN              * 
*              PROCESS DOWNLINE COMMANDS      : PTDLCMD               * 
*              CHAIN BUFFERS TOGETHER         : PTCHAIN               * 
*              GET A BUFFER                   : PBGET1BF              * 
*              COPY CHARACTERS INTO A BUFFER  : PBFCOPY               * 
*                                                                     * 
*     INTERNAL SUBROUTINE                                             * 
*              CHAIN DOWNLINE PACKETS         : QCHAINIT              * 
*                                                                     * 
** NOTES:                                                             * 
*                                                                     * 
*                                                                     * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PXADLHANDLER; 
  
  
VAR 
      A5LEFTOVR : B0BUFPTR;                 _LEFT OVER DOWNLINE BLOCK  ?
      A5DLDATA  : B0BUFPTR;                 _CURRENT DOWNLINE BLOCK    ?
      A5DLPKT   : B0BUFPTR;                 _CURRENT DOWNLINE PACKET   ?
      A5WKBUF   : B0BUFPTR;                 _WORKING BUFFER POINTER    ?
      A5LSTPKT  : B0BUFPTR;                 _LAST DOWNLINE PACKET      ?
  
      A5CNTCHR  : INTEGER;                  _BUFFER CHARCTER COUNT     ?
      A5BLKTYPE : INTEGER;                  _INTERNAL BLOCK TYPE       ?
      A5PKTSIZE : INTEGER;                  _PACKET SIZE               ?
      A5PKTCNT  : INTEGER;                  _PACKET COUNT              ?
      A5PKTW    : INTEGER;                  _PACKET WINDOW SIZE        ?
      A5NWLCD   : INTEGER;                  _UPDATED LCD               ?
      A5LCD     : INTEGER;
      A5FCD     : INTEGER;
      A5QBIT    : BOOLEAN;
      A5TYPE    : ARRAY [HTQBLK .. HTQMSG] OF INTEGER;
  
VALUE 
      A5TYPE    = (HTBLK, HTMSG); 
  
PROCEDURE QCHAINIT (PACKET : B0BUFPTR; MBIT : BOOLEAN); 
  
VAR 
      PKTBUF  : A0BUFFER; 
  
BEGIN 
PKTBUF.A1BFACSS      := PACKET; 
PKTBUF.A1AAACSS'.                           _SET Q-BIT                 ?
           XBFRGQBIT := A5QBIT; 
PKTBUF.A1AAACSS'.                           _SET M-BIT                 ?
           XBFRGMBIT := MBIT; 
_ 
* * *  QUE CHAIN DOWNLINE PACKETS.
? 
A5PKTCNT := A5PKTCNT + 1; 
  
IF A5PKTCNT = 1                             _THE FIRST PACKET          ?
THEN
  A1TCBADDR'.BSTCB.BSDLPACKET := PACKET 
ELSE
  A5LSTPKT'.BCCHAINS[QCHN] := PACKET;       _PLACE PACKET AT END OF CHN?
  
A5LSTPKT                   := PACKET;       _THIS ONE IS THE LAST      ?
A5LSTPKT'.BCCHAINS[QCHN]   := NIL;          _CLEAR CHAIN POINTER       ?
A1TCBADDR'.BSTCB.BSXFRGREQ := FALSE;        _CLEAR FRAGMENT REQUEST    ?
  
END; _ PROCEDURE QCHAINIT                                              ?
  
  
_ 
* * *  PXADLHANDLER MAIN PROGRAM. 
? 
  
BEGIN 
A5PKTCNT := 0;
A5DLDATA := A1TCBADDR'.BSTCB.BSDLPACKET;    _CHECK ANY DOWNLINE PACKETS?
WHILE A5DLDATA " NIL DO 
  BEGIN 
  A5PKTCNT := A5PKTCNT + 1;                 _BUMP NUMBER OF PACKETS    ?
  A5LSTPKT := A5DLDATA;                     _THIS ONE THE LAST SO FAR  ?
  A5DLDATA := A5DLDATA'.BCCHAINS[QCHN];     _ADVANCE TO NEXT PACKET    ?
  END;
A5PKTW   := A1TCBADDR'.BSTCB.BSLCCBPTR'.    _GET PAKCET WINDOW SIZE    ?
                                 LCCB.LCW;
WHILE (A1TCBADDR'.BSTCB.BSQPTR.BABUFPTR " NIL)
                       &
           (A5PKTCNT @ A5PKTW)  DO
  BEGIN 
  A5DLPKT  := A1TCBADDR'.                   _SET WORKING BUFFER POINTER?
                   BSTCB.BSQPTR.BABUFPTR; 
  A5CNTCHR := 1;                            _SET WORKING COUNTER TO 1  ?
  WHILE A5DLPKT " NIL DO
    BEGIN 
    A5CNTCHR := A5CNTCHR + 1;               _BUMP NUMBER OF BUFFERS    ?
    A5DLPKT  := A5DLPKT'. 
                      BCCHAINS[DBUFLENGTH]; _NEXT CHAINED BUFFER       ?
    END;
  
      _ NOTE: PACKET SIZE IS ASSUMED TO BE 64 CHARACTERS OR GREATER    ?
      _       TO REACH THE REQUIRED ADDITIONAL BUFFER COUNT.           ?
  
  IF PBNBFAVAIL (A5CNTCHR, B0THMUX) = FALSE 
  THEN                                      _BUFFERS NOT AVAILABLE     ?
    BEGIN 
    IF A1TCBADDR'.BSTCB.BSXFRGREQ           _IF NO PACKET CHAINED YET  ?
    THEN
      A1TCBADDR'.BSTCB.BSLCCBPTR'.LCCB.LCNOBUF := TRUE;   _TRY LATER   ?
    GOTO 99;                                _EXIT                      ?
    END 
  ELSE
  BEGIN _REQUIRED NUMBER OF BUFFERS AVAILABLE ? 
  PBQUEMAINT (A1TCBADDR,                    _TCB ADDRESS               ?
              A5DLDATA,                     _DOWNLINE DATA POINTER     ?
              K4GETNB);                     _DO NOT SEND BACK          ?
  
  A5BLKTYPE := A5DLDATA'.BIINT[BTWD];       _GET BLOCK TYPE            ?
  
  IF A5BLKTYPE = HTCMD                      _DOWNLINE CMD BLOCK        ?
  THEN
    BEGIN 
    A5WKBUF := NIL; 
    PBQUEMAIN (A1TCBADDR,                   _TCB ADDRESS               ?
               A5WKBUF,                     _NIL                       ?
               K4PUTBC);                    _TEL BIP TO SEND BAKC      ?
    IF A5DLDATA'.BFDATAC[PFC] = CHR(D8FT)   _IF PFC = FT               ?
    THEN
      BEGIN 
      A1TCBADDR'.BSTCB.BSPRUON :=           _SET/RESET PRU MODE IN TCB ?
        A5DLDATA'.BFDATAC[SFC] = CHR (D9ON);
      PBRELCHN (A5DLDATA, BEDBSIZE);        _RELEASE FT CMD BUFFER     ?
      END   _IF PFC = FT  ? 
    ELSE    _IF COMMAND AND PFC " FT ?
      BEGIN 
      PTDLCMD (A1TCBADDR,                   _TCB ADDRESS               ?
               A5DLDATA);                   _CMD BLOCK POINTER         ?
      END;
    END 
  ELSE  _ RECEIVED MSG, BLK, QMSG OR QBLK BLOCK                        ?
    BEGIN 
    A5QBIT    := (A5BLKTYPE = HTQBLK)       _SET Q-BIT IF QBLK OR QMSG ?
                          ! 
                 (A5BLKTYPE = HTQMSG);
    IF A5QBIT                               _CONVERT TO BLK OR MSG     ?
    THEN
      A5BLKTYPE := A5TYPE[A5BLKTYPE]; 
  
    A5LEFTOVR := A1TCBADDR'.BSTCB.          _POINTER FOR LEFT OVER     ?
                               BSALEFTOVR;  _ DOWNLINE DATA            ?
_ 
    * * *  CHECK FOR THE EMPTY DOWNLINE BLOCK.
? 
    A5LCD := A5DLDATA'.BFLCD; 
    IF A5LCD @ DATA                         _CHECK FOR EMPTY BLOCK     ?
    THEN
      BEGIN 
      IF A5BLKTYPE = HTMSG                  _WORKING ON MSG OR QMSG    ?
      THEN
        BEGIN 
        IF A5LEFTOVR = NIL                  _NO LEFT OVER PACKET       ?
        THEN
          BEGIN 
          A5DLDATA'.BIINT[LFCD] :=          _SET BUFFER LCD FCD        ?
                               DATA * $101; 
          QCHAINIT (A5DLDATA, FALSE);       _SEND EMPTY PACKET M=0     ?
          END 
        ELSE                                _LEFT OVER DOWNLINE DATA   ?
          BEGIN                             _ AVAILABLE SEND LEFT OVER ?
          QCHAINIT (A5LEFTOVR, FALSE);      _ INSTED OF EMPTY PACKET   ?
          PBRELCHN (A5DLDATA, BEDBSIZE);    _RELEASE EMPTY BUFFER      ?
          END;                              _ M=0                      ?
        END 
      ELSE                                  _WORKING ON BLK OR QBLK    ?
        BEGIN 
        PBRELCHN (A5DLDATA, BEDBSIZE);
        PBQUEMAIN (A1TCBADDR,               _TCB ADDRESS               ?
                   A5DLDATA,                _NIL                       ?
                   K4PUTBC);                _NEED TO CHECK BACK DUE    ?
        END;
      END                                   _RECEIVED EMPTY DL BLOCK   ?
    ELSE                                    _DOWNLINE BLOCK NOT ENPTY  ?
      BEGIN 
_ 
      * * *  RECEIVED BLOCK NOT EMPTY.
? 
      A5PKTSIZ        := A1TCBADDR'.BSTCB.  _GET PACKET SIZE FROM LCCB ?
                                  BSLCCBPTR'.LCCB.LCDPL;
      A5DLDATA'.BFFCD := DBC + 1;           _SET FCD TO BEGIN. OF DATA ?
      A5CNTCHR        := 0;                 _RESET CHARACTER COUNT     ?
      A5DLPKT         := A5LEFTOVR;         _IN CASE OF SOME LEFT OVER ?
                                            _ DATA FROM PROCESSING     ?
      PTCHAIN (A5DLDATA, A5DLPKT);          _ LAST DOWNLINE BLK BLOCK  ?
      A5DLDATA := A5DLPKT;
  
_ 
    * * *  START PACKETIZING A DOWNLINE DATA. 
? 
      REPEAT  _ UNTIL A5DLDATA = NIL                                   ?
        A5WKBUF  := A5DLDATA;               _COUNT CHARACTER IN THIS   ?
                                            _ BUFFER                   ?
        A5DLDATA := A5WKBUF'.               _NEXT BUFFER IN CHAIN      ?
                        BCCHAINS[DBUFLENGTH]; 
        A5FCD    := A5WKBUF'.BFFCD; 
        A5CNTCHR := A5WKBUF'.BFLCD - A5FCD + A5CNTCHR + 1;
  
        IF A5CNTCHR \ A5PKTSIZ              _ENOUGH CHARACTER TO MAKE  ?
        THEN                                _ A PACKET                 ?
          BEGIN 
_ 
          * * *  CREATE A PACKET AND KEEP WHAT IS LEFT FOR NEXT PACKET. 
? 
          A5LCD   := A5WKBUF'.BFLCD;
          A5NWLCD := A5LCD - A5CNTCHR + A5PKTSIZ; 
          IF A5LCD > A5NWLCD                _AVAILABLE CHARACTERS IS   ?
          THEN                              _ MORE THAN PACKET SIZE    ?
            BEGIN                           _ NOTE THAT THE CONDITION  ?
                                            _ CNANOT BE A5LCD < A5NWLCD?
            A5LEFTOVR        := PBGET1BF    _GET BUFFER TO SEVE THE    ?
                               (BEDBSIZE);  _ LEFT OVER DATA           ?
            A5LEFTOVR'.BFFCD := DATA + 1;   _SET BUF FCD FOR OVERFLOW  ?
            A5FCD            := A5WKBUF'.   _SAVE FCD OF CURRENT BUF   ?
                                    BFFCD;
            A5WKBUF'.BFFCD   := A5NWLCD + 1;_SET TEMP FCD FOR PBFCOPY  ?
            PBFCOPY (A5WKBUF, A5LEFTOVR);   _COPY LEFT OVER DATA       ?
                                            _ TO A NEW BUFFER          ?
            A5WKBUF'.BIINT[1] := A5NWLCD *  _RESTORE FCD SET NEW LCD   ?
                                    $100 + A5FCD; 
            PTCHAIN (A5DLDATA, A5LEFTOVR);  _CHAIN OUTSTANDING DL      ?
                                            _ DATA TO LEFT OVER BUFFER ?
            A5DLDATA := A5LEFTOVR;          _SET NEXT DL DATA          ?
  
            END; _                                                     ?
  
          A5CNTCHR := 0;                    _RESET COUNTER             ?
          A5WKBUF'.BCCHAINS[DBUFLENGTH] := NIL; 
  
          IF (A5DLDATA " NIL) !             _MORE DATA EXISTS OR       ?
             (A5BLKTYPE = HTBLK)            _BLOCK TYPE IS BLK         ?
          THEN
            BEGIN 
            QCHAINIT (A5DLPKT, TRUE);       _CHAIN PACKET M=1          ?
            A5DLPKT := A5DLDATA;            _NEXT PACKET OR NIL        ?
            END;
  
          END; _ IF A5CNTCHR \ A5PKTSIZ                                ?
  
      UNTIL A5DLDATA = NIL;                 _NO MORE DATA LEFT         ?
  
      IF A5BLKTYPE = HTMSG                  _JUST PROCESSED MSG OR QMSG?
      THEN                                  _ DOWNLINE BLOCK           ?
        BEGIN 
        A1TCBADDR'.BSTCB.BSALEFTOVR := NIL; 
        QCHAINIT (A5DLPKT, FALSE);          _SEND DL PACKET M=0        ?
        END 
      ELSE                                  _PROCESSED BLK OR QBLK     ?
        BEGIN                               _SEVE IT AND WAIT FOR NEXT ?
        A1TCBADDR'.BSTCB.BSALEFTOVR         _ DOWNLINE BLOCK           ?
                                 := A5DLPKT;
        END;
      END; _ A5LCD " $0C DOWNLINE BLOCK NOT EMPTY                      ?
    END; _ ELSE A5BLKTYPE = BLK, MSG, QBLK OR QMSG                     ?
  END;  _REQUIRED NUMBER OF BUFFERS AVAILABLE ? 
  END; _ WHILE BSQPTR " NIL AND A5PKTCNT @ A5PKTW                      ?
  
99:                                         _EXIT IF NO BUFFER AVAIL.  ?
END;  _  PROCEDURE PXADLHANDLER : DOWNLINE BLOCK HANDLER               ?
_$J+ PAGE EJECT?
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*              CLEAR TCB FIELDS  ( PXAFLASH )             : LEVEL II  * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW:                                                          * 
*              INITIALIZES SUBTIP TCB FIELDS AND RELEASES             * 
*              BUFFERS WHICH ATTACHED TO THE CONNECTION.              * 
** INPUT                                                              * 
*              TCB ADDRESS                    : A1TCBADDR             * 
*                                                                     * 
** OUTPUT                                                             * 
*              NONE                                                   * 
*                                                                     * 
** CALLING PROGRAM:                                                   * 
*                                                                     * 
*              A-A SUBTIP WORKLIST HANDLER    : MAIN PROGRAM          * 
*                                                                     * 
** SUBROUTINE CALL:                                                   * 
*                                                                     * 
*     EXTERNAL SUBROUTINE                                             * 
*              RELEASE CHAIN OF BUFFERS       : PBRELZRO              * 
*                                                                     * 
*     INTERNAL SUBROUTINE                                             * 
*              NONE                                                   * 
*                                                                     * 
** NOTES:                                                             * 
*                                                                     * 
*                                                                     * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PXAFLASH; 
BEGIN 
  
A1TCBADDR'.BSTCB.BSALSTPKT := NIL;          _CLEAR BUFFER POINTER      ?
A1TCBADDR'.BSTCB.BSXFRGREQ := FALSE;        _RESET FRAGMENT REQUEST    ?
                                            _ FROM LEVEL 3             ?
PBRELZRO (A1TCBADDR'.BSTCB.BSAFSTPKT,       _RELEASE CURRENT PACKET    ?
          BEDBSIZE);
  
END;  _  PROCEDURE PXAFLASH : CLEAR TCB FIELDS                         ?
_$J+  PAGE EJECT? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*              A-A SUBTIP MAIN PROGRAM (WORKLIST HANDLER)             * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW:                                                          * 
*            X25 APPLICATION TO APPLICATION LINK CONNECTION           * 
*            ----------------------------------------------           * 
*                                                                     * 
*              THE RECEIVED WORKLIST ENTRY IS COPIED TO INTERNAL      * 
*              VARIABLES (X1INWKLST) FOR USE WITHIN THE SUBTIP.       * 
*              IF THE RECEIVED WORK CODE IS EXPECTED, THE PROCESS     * 
*              CONTROL WILL BE PASSED TO ONE OF THE LEVEL II          * 
*              ROUTINES (REFER TO INTERNAL SUBROUTINES), OTHERWISE    * 
*              NO ACTION WILL BE TAKEN.                               * 
** INPUT:                                                             * 
*              BWWLENTRY[OPS] WORKLIST ENTRY                          * 
*                                                                     * 
*                                                                     * 
*                    WORK CODE        DESCRIPTION         ORIGINATOR  * 
*                    ---------  ----------------------    ----------- * 
*                 1) L3FRGQ     UPLINE FRAGMENT WAS       X25 LEVEL 3 * 
*                                QUEUED                               * 
*                 2) L3FRGR     SEND DOWNLINE FRAGMENT    X25 LEVEL 3 * 
*                                                                     * 
*                 3) L3INTR     UPLINE INTERRUPT          X25 LEVEL 3 * 
*                                REQUEST                              * 
*                 4) L3INTC     UPLINE INTERRUPT          X25 LEVEL 3 * 
*                                RESPONSE                             * 
*                 5) L3BREAK    UPLINE RESET REQUEST      X25 LEVEL 3 * 
*                                                                     * 
*                 6) L3RESET    UPLINE RESET RESPONSE     X25 LEVEL 3 * 
*                                                                     * 
*                 7) L3TCB      CMDATA = D5DOWN           X25 LEVEL 3 * 
*                                 FREE UP TCB                         * 
*                                                                     * 
*                 8) L5ATOA     DOWNLINE BREAK, RESET,    PXINTBIP    * 
*                               ICMD OR ICMDR BLOCK                   * 
*                 9) L5QUEOUT   DOWNLINE BLK, MSG,        X25TIP      * 
*                               QBLK, QMSG OR CMD                     * 
*                               BLOCK                                 * 
*                                                                     * 
*                10) L5SMEN     ENABLE LINE REQUEST       X25TIP      * 
*                                                                     * 
*                11) L5SMDA     DISABLE LINE REQUEST      X25TIP      * 
*                                                                     * 
*                12) L5SMDLTCB  DELETE TCB REQUEST        X25TIP      * 
*                                                                     * 
*                13) L5TCB      CMDATA = D5FREE           X25TIP      * 
*                                 FREE UP TCB                         * 
*                                                                     * 
*                14) L5TIMEOUT  REGULATION TIMER          X25TIP      * 
*                               EXPIRED                               * 
*                                                                     * 
** CALLING PROGRAM:                                                   * 
*                                                                     * 
*              X25 TIP              : PX25TIP                         * 
*              X25 BIP HANDLER      : PXINTBIP                        * 
*                                                                     * 
** SUBROUTINE CALLS:                                                  * 
*                                                                     * 
*     EXTERNAL SUBROUTINE                                             * 
*              CHECK REGULATION     : PXREGLCHK                       * 
*              MAKE A WORKLIST      : PBLSPUT                         * 
*              RELEASE ANY BUFFERS  : PBRELZRO                        * 
*              GET A BUFFER         : PBGET1BF                        * 
*              UPLINE TIP SERVICE   : PBULTS                          * 
*                                                                     * 
*     INTERNAL SUBROUTINE                                             * 
*              DOWNLINE HANDLER     : PXADLHANDLER                    * 
*              CLEAR TCB FIELD      : PXAFLASH                        * 
*                                                                     * 
** NOTES:                                                             * 
*                                                                     * 
*                                                                     * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
BEGIN                                       _START OF MAIN PROGRAM     ?
A1INWKLST.XAWORKLIST := BWWLENTRY[OPS];     _SAVE WORKLIST INTO LOCAL  ?
                                            _ FIELDS                   ?
WITH  A1INWKLST  DO                         _WORK ON RECEIVED WORKLIST ?
  BEGIN                                     _ ENTRY.                   ?
  
  A1TCBADDR := XATCBLCCB;                   _COPY TCB ADDRESS          ?
  A1LCBADDR := A1TCBADDR'.BSTCB.BSLCBP;     _GET LCB ADDRESS FROM TCB  ?
  
  CASE XAWC OF                              _CASE ON EXPECTED WORKCODE ?
  
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
* *   W O R K C O D E   F R O M   B I P                               * 
*                                        ( BIP DOWNLINE TIP SERVICE ) * 
*                                                                     * 
? 
_ 
* * * *  DOWNLINE NETWORK BLOCK AVAILABLE. (L5QUEOUT) 
? 
    L5QUEOUT:                               _BLK, MSG, QBLK, QMSG, CMD ?
      BEGIN 
_ 
      * * *  TRY TO PACKETIZE DOWNLINE BLOCK. 
? 
      IF A1TCBADDR'.BSTCB.BSXFRGREQ         _LEVEL 3 REQUESTING MORE   ?
      THEN                                  _ DOWNLINE PACKET          ?
        PXADLHANDLER;                       _PROCESS DOWNLINE BLOCK    ?
  
      END;  _  END OF L5QUEOUT                                         ?
  
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
* *   W O R K C O D E   F R O M   S E R V I C E   M O D U L E         * 
*                                                                     * 
? 
_ 
* * * *  NO ACTION FOR
                 A0SMEN (L5SMEN)
                 A0SMDA (L5SMDA)
? 
  
_ 
* * * *  DELETE TCB REQUEST. (L5SMDLTCB)
? 
    L5SMDLTCB:  
      BEGIN 
      IF A1TCBADDR'.BSTCB.BSXTMRPKT " NIL   _TIMER PACKET EXIST        ?
      THEN
        BEGIN 
_ 
        * * *  CLEAR TCB POINTER IN TIMER PACKET
        * * *  SINCE TCB WILL BE DELETED. 
? 
        A1TMRPKT.A1BFACSS          := A1TCBADDR'.BSTCB.BSXTMRPKT; 
        A1TMRPKT.A1TMACSS'.BK2UPTR := NIL;
        END;  _ IF BSXTMRPKT " NIL                                     ?
  
      PXAFLASH;                             _CLEAR SUBTIP TCB FIELDS   ?
      END;  _  END OF L5SMDLTCB                                        ?
  
_ 
* * * *  FREE UP TCB. 
? 
    L5TCB:                                  _FROM X25TIP    - D5FREE   ?
_   L3TCB:                                   FROM LEVEL 3   - D5DOWN   ?
      BEGIN 
      PXAFLASH;                             _CLEAR SUBTIP TCB FIELDS   ?
      END;  _  END OF L5TCB                                            ?
  
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
* *   W O R K C O D E   F R O M   P A C K E T   L E V E L             * 
*                                                     ( X25 LEVEL 3 ) * 
*                                                                     * 
? 
_ 
* * * *  DOWNLINE FRAGMENT REQUEST. (L3FRGR)
? 
    L3FRGR: 
      BEGIN 
      IF XANEWCN                            _NEW CONNECTION ESTABLISHED?
      THEN
        PXAFLASH;                           _CLEAR TCB FIELDS          ?
  
      A1TCBADDR'.BSTCB.BSXFRGREQ := TRUE;   _REMEMBER THE REQUEST      ?
      PXADLHANDLER;                         _PROCESS DOWNLINE BLOCK    ?
  
      END;  _  END OF L3FRGR                                           ?
_ 
* * * *  UPLINE PACKET QUEUED. (L3FRGQ) 
? 
    L3FRGQ: 
      BEGIN 
      PXREGLCHK (XAWC,                      _CALL SUBTIP AID PROGRAM   ?
                 A1TCBADDR,                 _ TO CHECK CCP REGULATION  ?
                 NIL);                      _ NO TIMER PACKET POINTER  ?
_ 
      * * *  PROCESS ONE UPLINE PACKET AT TIME. 
? 
      WHILE  XABFRPTR " NIL  DO             _LOOP THRU PACKET CHAIN    ?
        BEGIN 
        A1ULBLOCK := XABFRPTR;              _GET A PACKET POINTER      ?
        XABFRPTR  := XABFRPTR'.             _GET NEXT PACKET IN Q-CHAIN?
                            BCCHAINS[QCHN]; 
        A1ULBLOCK'.BCCHAINS[QCHN] := NIL;   _CLEAR Q-CHAIN             ?
_ 
        * * *  PROCESS UPLINE PACKET. 
? 
        A1PACKET.A1BFACSS := A1ULBLOCK;     _SWITCH TO X25 BUF ACCESS  ?
        A1QBIT            := A1PACKET.      _ AND EXTRACT VALUES OF    ?
                       A1AAACSS'.XBFRGQBIT; _ Q-BIT AND M-BIT FORM     ?
        A1MBIT            := A1PACKET.      _ INCOMING PACKET          ?
                       A1AAACSS'.XBFRGMBIT; 
        A1ULBLOCK'.BFFCD        := DBC;     _SET BUFFER FCD            ?
        A1ULBLOCK'.BFDATAC[DBC] := CHR($0); _CLEAR DBC FIELD           ?
_ 
        * * *  SEND THE UPLINE BOLCK TO ULTS (BIP). 
? 
        A1FLGWRD.KTWORD := A1TYPE [A1QBIT]; 
        A1FLGWRD.KTSEND := A1MBIT = FALSE;
  
        PBULTS (A1TCBADDR,                  _TCB ADDRESS               ?
                A1ULBLOCK,                  _UPLINE NETWORK BLOCK      ?
                A1FLGWRD);                  _FLAG WORD FOR ULTS        ?
        END;  _  WHILE XABFRPTR " NIL                                  ?
_ 
      * * *  PACKET LEVEL MAY BE REQUESTING MORE DOWNLINE PACKETS.
? 
      IF XAREQ                              _PACKET LEVEL WANTS MORE   ?
      THEN                                  _REMEMBER FRAGMENT REQUEST ?
        A1TCBADDR'.BSTCB.BSXFRGREQ := TRUE; 
  
      IF A1TCBADDR'.BSTCB.BSXFRGREQ         _LEVEL 3 REQUESTING PACKETS?
      THEN
        PXADLHANDLER;                       _PROCESS DOWNLINE BLOCK    ?
  
      END;  _  END OF L3FRGQ                                           ?
  
_ 
* * * *  UPLINE ICMD OR ICMDR BLOCK REQUEST. (L3INTR, L3INTC) 
? 
    L3INTR,                                 _UPLINE ICMD  BLOCK REQUEST?
    L3INTC:                                 _UPLINE ICMDR BLOCK REQUEST?
      BEGIN 
      A1ULBLOCK := NIL;                     _ FIELDS                   ?
_ 
      * * *  SET BLOCK TYPE TO THE INTERRUPT COMMAND RESPONSE.
? 
      A1FLGWRD.KTWORD := HTICMR;            _ICMDR BLOCK TYPE          ?
  
      IF XAWC = L3INTR                      _INTERRUPT COMMAND BLOCK   ?
      THEN                                  _ TO BE SENT               ?
        BEGIN 
        A1ULBLOCK := PBGET1BF (BEDBSIZE); 
        A1ULBLOCK'.BIINT[1]     := $0C0C;   _SET BUFFER LCD AND FCD    ?
        A1ULBLOCK'.BFDATAC[DBC] :=          _STORE ICMD CAUSE CODE     ?
                               CHR(XADATA); 
        A1FLGWRD.KTWORD         := HTICMD;  _SET TO ICMD BLOCK         ?
        END;  _ IF XAWC = L3INTR                                     ?
_ 
        * * *  CALL UPLINE TIP SERVICE. 
? 
      PBULTS (A1TCBADDR,                    _TCB ADDRESS               ?
              A1ULBLOCK,                    _UPLINE NETWORK BLOCK      ?
              A1FLGWRD);                    _BIP FLAG WORD             ?
  
      END;  _  END OF L3INTR, L3INTC                                   ?
_ 
* * * *  UPLINE BREAK OR RESET BLOCK REQUEST. (L3BREAK, L3RESET)
? 
    L3BREAK,                                _UPLINE BREAK BLOCK REQUEST?
    L3RESET:                                _UPLINE RESET BLOCK REQUEST?
      BEGIN 
      A1ULBLOCK       := XABFRPTR;          _BUFFER POINTER OR NIL     ?
      A1FLGWRD.KTWORD := A1BRK[XAWC];       _SET TO BREAK/RESET BLOCK  ?
_ 
      * * *  CALL UPLINE TIP SERVICE
? 
      PBULTS (A1TCBADDR,                    _TCB ADDRESS               ?
              A1ULBLOCK,                    _UPLINE NETWORK BLOCK      ?
              A1FLGWRD);                    _BIP FLAG WORD             ?
      END;  _  END OF L3BREAK, L3RESET                                 ?
  
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
* *   W O R K C O D E   F R O M   T I M E R   S E R V I C E           * 
*                                                                     * 
? 
_ 
* * * *  REGULATION TIMER TIMEOUT. (L5TIMEOUT)
? 
    L5TIMEOUT:                              _REGULATION TIMER TIME OUT ?
  
      BEGIN 
      PXREGLCHK (XAWC,                      _CALL SUBTIP AID PROGRAM   ?
                 NIL,                       _ TO CHECK CCP REGULATION  ?
                 XABFRPTR);                 _ NO TCB ADDRESS           ?
      END;  _ L5TIMEOUT                                                ?
  
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
* *   W O R K C O D E   F R O M   C O M M O N   S U B T I P           * 
*                                                                     * 
? 
_ 
* * * *  PROCESS ICMD, ICMDR, BREAK OR RESET. (L5ATOA)
? 
    L5ATOA:                                 _ICMD, ICMDR, BREAK, RESET ?
      BEGIN 
      A1OUTWKLST.XADATA   := 0;             _USED FOR ICMD CAUSE CODE  ?
      A1OUTWKLST.XABFRPTR := NIL;           _USED FOR DL PACKET POINTER?
      A1BLKTYPE           := XADATA;        _COPY BLOCK TYPE           ?
      IF A1BLKTYPE = HTRESET                _DOWNLINE RESET BLOCK      ?
      THEN                                  _NOTIFY PACKET LEVEL TO    ?
        A1OUTWKLST.XAWC  := L5RESET         _ SEND RESET CONFIR. PACKET?
      ELSE
        IF A1BLKTYPE = HTICMR               _DOWNLINE ICMD RESPONSE    ?
        THEN                                _NOTIFY PACKET LEVEL TO    ?
          A1OUTWKLST.XAWC := L5INTC         _ SEND INTERRUPT CONFIR.   ?
                                            _ PACKET                   ?
        ELSE
          IF A1BLKTYPE = HTBREAK            _DOWNLINE BREAK BLOCK      ?
          THEN                              _NOTIFY PACKET LEVEL TO    ?
            BEGIN                           _ SEND RESET REQUEST PACKET?
            A1OUTWKLST.XABFRPTR := XABFRPTR; _ WITH CAUSE AND DIAG CODE?
            XABFRPTR            := NIL; 
            A1OUTWKLST.XAWC     := L5BREAK; _DOWNLINE BREAK REQUEST    ?
            END 
          ELSE
            IF A1BLKTYPE = HTICMD           _DOWNLINE ICMD REQUEST     ?
            THEN                            _NOTIFY PACKET LEVEL TO    ?
              BEGIN                         _ SEND INTERRUPT REQUEST   ?
              A1OUTWKLST.XADATA :=          _ PACKET WITH ICMD CAUSE   ?
                ORD (XABFRPTR'.BFDATAC[P1]); _ CODE                    ?
              A1OUTWKLST.XAWC   := L5INTR;  _INTERRUPT COMMAND REQUEST ?
              END;
  
      PBRELZRO(XABFRPTR, BEDBSIZE); 
      A1OUTWKLST.XATCBLCCB := A1TCBADDR;    _TCB ADDRESS               ?
_ 
      * * *  MAKE WORKLIST TO TIP.
? 
      PBLSPUT (A1OUTWKLST.XAWORKLIST,       _WORKLIST ENTRY            ?
               BYWLCB[B0XTRANS]); 
  
      END;  _  END OF L5ATOA                                           ?
  
  
    END;  _  CASE  XAWC                                                ?
  END;  _  WITH  A1INWKLST                                             ?
END;  _  PROCEDURE  PXAATIP : A-A SUBTIP WORKLIST HANDLER              ?
