*COMDECK X25TRANS 
*CALL X25XMIT 
*CALL X25MUX
_$J+? 
_ 
                 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
  
  
      XX      XX  PPPPPPPP      OOOOOO    RRRRRRRR    TTTTTTTTTT
       XX    XX   PPPPPPPPP    OOOOOOOO   RRRRRRRRR   TTTTTTTTTT
        XX  XX    PP      PP  OO      OO  RR      RR      TT
         XXXX     PP      PP  OO      OO  RR      RR      TT
          XX      PPPPPPPPP   OO      OO  RRRRRRRRR       TT
          XX      PPPPPPPP    OO      OO  RRRRRRRR        TT
         XXXX     PP          OO      OO  RR   RR         TT
        XX  XX    PP          OO      OO  RR    RR        TT
       XX    XX   PP           OOOOOOOO   RR     RR       TT
      XX      XX  PP            OOOOOO    RR      RR      TT
  
  
      LL          EEEEEEEEEE  VV      VV  EEEEEEEEEE  LL
      LL          EEEEEEEEEE  VV      VV  EEEEEEEEEE  LL
      LL          EE           VV    VV   EE          LL
      LL          EE           VV    VV   EE          LL
      LL          EEEEEEEE      VV  VV    EEEEEEEE    LL
      LL          EEEEEEEE      VV  VV    EEEEEEEE    LL
      LL          EE             VVVV     EE          LL
      LL          EE             VVVV     EE          LL
      LLLLLLLLLL  EEEEEEEEEE      VV      EEEEEEEEEE  LLLLLLLLLL
      LLLLLLLLLL  EEEEEEEEEE      VV      EEEEEEEEEE  LLLLLLLLLL
  
  
             222222                                333333 
            22222222                              33333333
           22      22             &&             33      33 
                   22            &&&&                    33 
             2222222            &&  &&               33333
            2222222            &&    &&              33333
           22                 &&      &&                 33 
           22                                    33      33 
           2222222222                             33333333
           2222222222                              333333 
  
? 
_$J+? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*                           PX25TRANS                                 * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_$R-,G-,I-    NON-RECURSIVE 
              INTERRUPTABLE?
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW:                                                          * 
*              THE X.25 TRANSPORT PROTOCOL MODULE (PX25TRANS) IS      * 
*              DIVIDED INTO TWO COMPONENTS WHICH ARE THE FRAME        * 
*              LEVEL (LEVEL 2) AND THE PACKET LEVEL (LEVEL 3).        * 
*                                                                     * 
*              THE FRAME LEVEL MODULE PROVIDES THE X.25 FRAME         * 
*              PROTOCOL SUCH AS THE TRANSFER OF INFORMATION           * 
*              FRAMES BETWEEN THE 2550 AND A PACKET SWITCHING         * 
*              NETWORK (PSN OR PDN), ANOTHER 2550 OR ANY SOFTWARE     * 
*              OR HARDWARE WHICH SUPPORTS THE HDLC LAPB PROTOCOL.     * 
*                                                                     * 
*              THE LEVEL 2 MODULE SUPPORTS MULTIPLE OF INDEPENDENT    * 
*              LINKS.  MORE THAN ONE PDN ALSO ARE SUPPORTED BY THE    * 
*              SOFTWARE IN A SINGLE 2550.                             * 
*                                                                     * 
*              THE LEVEL 2 IS COMPOSED OF A PRIMARY SENDING           * 
*              COMMANDS AND RECEIVING RESPONSES AND OF A              * 
*              SECONDARY RECEIVING COMMANDS AND SENDING               * 
*              RESPONSES.                                             * 
*                                                                     * 
*                                                                     * 
*                     D T E                                D C E      * 
*                                                                     * 
*                 *************                        *************  * 
*                 *           *                        *           *  * 
*                 *           *   COMMAND (ADDR = 1)   *           *  * 
*                 *           * ---------------------> *           *  * 
*                 *  PRIMARY  *                        * SECONDARY *  * 
*                 *           * <--------------------- *           *  * 
*                 *           *   RESPONSE (ADDR = 1)  *           *  * 
*                 *           *                        *           *  * 
*                 *************                        *************  * 
*                 *           *                        *           *  * 
*                 *           *   COMMAND (ADDR = 3)   *           *  * 
*                 *           * <--------------------- *           *  * 
*                 * SECONDARY *                        *  PRIMARY  *  * 
*                 *           * ---------------------> *           *  * 
*                 *           *   RESPONSE (ADDR = 3)  *           *  * 
*                 *           *                        *           *  * 
*                 *************                        *************  * 
*                                                                     * 
*                                                                     * 
*              THE FRAME LEVEL (LEVEL 2) INCOMING WORKLIST ENTRIES    * 
*                                                                     * 
*                 INCOMING                                            * 
*                 WORKCODE         SOURCE           DISCRIPTION       * 
*                ----------  -----------------  --------------------- * 
*                                                                     * 
*                L5SMEN      SVM VIA X25TIP     LINE EVENT.           * 
*                                               (ENABLE LINE REQUEST) * 
*                                                                     * 
*                L5SMDA      SVM VIA X25TIP     LINE EVENT.           * 
*                                               (DISABLE LINE REQUEST)* 
*                                                                     * 
*                L5HARDERR   MUXSUB VIA X25TIP  HARDWARE ERROR.       * 
*                                                                     * 
*                L2TERMIO    MUXSUB             COMPLETED I/O         * 
*                                               SEQUENCE TERMINATION. * 
*                                                                     * 
*                L2BDFRM     X25 INPUT STATE    BAD FRAME RECEIVED.   * 
*                                               (DISCARD FRAME)       * 
*                                                                     * 
*                L2GDFRM     X25 INPUT STATE    GOOD FRAME RECEIVED.  * 
*                                                                     * 
*                T1TIMER     TIMER              EXPIRATION OF T1      * 
*                                               TIMER.                * 
*                                                                     * 
*                TREGTIMER   TIMER              CCP BUFFER REGULATION.* 
*                                                                     * 
*                                                                     * 
*              THE PACKET LEVEL (LEVEL 3) PROVIDES THE MULTIPLEXING   * 
*              OF CHANNEL VIA EACH PHYSICAL LINK.  EACH CHANNEL       * 
*              PROVIDES THE DATA PATH FOR A TERMINAL/APPLICATION      * 
*              (PAD SUBTIP ACCESS), AN APPLICATION/APPLICATION        * 
*              (A-A SUBTIP ACCESS) OR USER DEFINED SUBTIP             * 
*              CONNECTION.  IT ALSO PROVIDES THE CONNECTION           * 
*              ESTABLISHMENT SUCH AS GENERATING AN OUTGOING CALL      * 
*              REQUEST PACKET OR ACCEPTING AN INCOMING CALL REQUEST   * 
*              PACKET, THE DISCONNECTION OF A LOGICAL CHANNEL AND     * 
*              THE FLOW CONTROL OF EACH CHANNEL.                      * 
*                                                                     * 
*              A VIRTUAL CIRCUIT PROVIDES THE DATA PATH FOR A         * 
*              CONNECTION BETWEEN AN APPLICATION IN HOST TO A         * 
*              TERMINAL, ANOTHER APPLICATION OR AN USER CONNECTION.   * 
*              VIRTUAL CIRCUITS CHANGE WITH TIME.  FOR EXAMPLE,       * 
*              ON DIAL-IN TERMINAL CONTROLS A VIRTUAL CIRCUIT         * 
*              EXCLUSIVELY FOR THE PERIOD OF SESSION.  WHEN THE       * 
*              TERMIANL IS DISCONNECTED, THE CIRCUIT CAN BE           * 
*              ASSIGNED TO ANOTHER CONNECTION.                        * 
*                                                                     * 
*                                                                     * 
*              THE PACKET LEVEL (LEVEL 3) INCOMING WORKLIST ENTRIES   * 
*                                                                     * 
*                 INCOMING                                            * 
*                 WORKCODE         SOURCE           DISCRIPTION       * 
*                ----------  -----------------  --------------------- * 
*                                                                     * 
*                L5TCB       SVM VIA X25TIP     TCB EVENT.            * 
*                                                                     * 
*                L5SMDLTCB   SVM VIA X25TIP     TCB EVENT.            * 
*                                               (DELETE TCB)          * 
*                                                                     * 
*                L5BREAK     SUBTIP             DOWNLINE BRK BLOCK.   * 
*                                                                     * 
*                L5RESET     SUBTIP             DOWNLINE RST BLOCK.   * 
*                                                                     * 
*                L5INTR      SUBTIP             DOWNLINE ICMD BLOCK.  * 
*                                                                     * 
*                L5INTC      SUBTIP             DOWNLINE ICMDR BLOCK. * 
*                                                                     * 
*                TPSTARTIN   SUBTIP             START INPUT.          * 
*                                                                     * 
*                TPSTOPIN    SUBTIP             STOP INPUT.           * 
*                                                                     * 
*                TPFRGQ      SUBTIP VIA X25TIP  DOWNLINE PACKET       * 
*                                               AVAILABLE.            * 
*                                                                     * 
*                L5SENDCLR   TIMER VIA X25TIP   SEND CLEAR REQUEST    * 
*                                                                     * 
*                                                                     * 
*              ANY LEVEL 2 PROCEDURES IN PX25TRANS HAVING PX3 AS      * 
*              PREFIX (PX3......) ARE USED FOR THE PACKET LEVEL,      * 
*              PX2 AS PREFIX (PX2......) ARE USED FOR THE FRAME       * 
*              LEVEL AND PX25 AS PREFIX (PX25.....) ARE USED FOR      * 
*              BOTH FRAME AND PACKET LEVELS.                          * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PX25TRANS;
_ 
* 
*                    X25 LEVEL 2 CONST. 
* 
? 
  
CONST 
*CALL X25CON01
  
_ 
* * * RESTART CHANNELS SUB WORK CODES 
? 
      X9PR = 1;                             _PRIMARY RESET             ?
      X9SR = 2;                             _SECONDARY RESET           ?
_ 
* * * *  DEFINITION OF LAST STATE, LAST EVENT 
* * * *  FOR LINK STATES TRANSITION TABLE 
? 
      X7LLSTAT = 4;                         _LAST LINK STATE           ?
      X7LLEVNT = 8;                         _LAST LINK EVENT           ?
  
_ 
* * * *  DEFINITION OF LAST STATE, LAST EVENT 
* * * *  FOR PRIMARY STATES TRANSITION TABLE
? 
      X8PLSTAT = 4;                         _LAST PRIMARY STATE        ?
      X8PLEVNT = 7;                         _LAST PRIMARY EVENT        ?
  
_ 
* * * *  DEFINITION OF LAST STATE, LAST EVENT 
* * * *  FOR SECONDARY STATES TRANSITION TABLE
? 
      X9SLSTAT = 4;                         _LAST SECONDARY STATE      ?
      X9SLEVNT = 4;                         _LAST SECONDARY EVENT      ?
  
_ 
* * * *  LINK STATES DEFINITION 
? 
      X7ERROR = 0;                          _ERROR                     ?
      X7DOWN  = 1;                          _LINK DOWN                 ?
      X7DIS   = 2;                          _LINK DISC                 ?
      X7SETUP = 3;                          _LINK SET UP               ?
      X7INFO  = 4;                          _INFO TRANSFER             ?
  
_ 
* * * *  LINK EVENTS DEFINITION 
? 
      X7IGN   = 0;                          _IGN   REQUEST             ?
      X7START = 1;                          _START REQUEST             ?
      X7STOP  = 2;                          _STOP REQUEST              ?
      X7HERR  = 3;                          _HARD ERROR                ?
      X7SABM  = 4;                          _SABM                      ?
      X7DISC  = 5;                          _DISC                      ?
      X7UA    = 6;                          _UA                        ?
      X7DM    = 7;                          _DM REQUEST                ?
      X7T1    = 8;                          _T1 EXPIRED                ?
  
_ 
* * * *  PRIMARY STATES DEFINITION
? 
      X8ERROR = 0;                          _ERROR                     ?
      X8OPER  = 1;                          _OPERATIONAL               ?
      X8RBUSY = 2;                          _REMOTE BUSY               ?
      X8RCOVR = 3;                          _RECOVERY STATE            ?
      X8RESET = 4;                          _RESET STATE               ?
  
_ 
* * * *  PRIMARY EVENTS DEFINITION
? 
      X8RR    = 1;                          _RR FRAME                  ?
      X8RNR   = 2;                          _RNR FRAME                 ?
      X8REJ   = 3;                          _REJ FRAME                 ?
      X8FRMR  = 4;                          _FRMR FRAME                ?
      X8UA    = 5;                          _UA FRAME                  ?
      X8NR    = 6;                          _NEW N(R) RECEIVED         ?
      X8T1    = 7;                          _T1 EXPIRED                ?
  
_ 
* * * *  SECONDARY STATES DEFINITION
? 
      X9ERROR = 0;                          _ERROR                     ?
      X9OPER  = 1;                          _OPERATIONAL               ?
      X9BUSY  = 2;                          _BUSY                      ?
      X9RJECT = 3;                          _REJECT                    ?
      X9RESET = 4;                          _RESET                     ?
  
_ 
* * * *  SECONDARY EVENTS DEFINITION
? 
      X9I     = 1;                          _I FRAME RECEIVED          ?
      X9SABM  = 2;                          _SABM FRAME                ?
      X9TREG  = 3;                          _REGULATION TIMER          ?
      X9CNR   = 4;                          _COMMAND N(R)              ?
_ 
* * * *  V(R) OWNER RESPONSE CODES
? 
      X4NSOK  = 1;                          _N(S) CORRECT              ?
      X4WOVF  = 2;                          _WINDOW OVERFLOW           ?
      X4REJ   = 3;                          _REJECT CONDITION          ?
_ 
* * * *  V(S) OWNER RESPONSE CODES
? 
      X3NNR    = 1;                         _NEW N(R) RECEIVED         ?
      X3ONR    = 2;                         _NOT A NEW N(R)            ?
      X3BNR    = 3;                         _BAD N(R) RECEIVED         ?
      X3IFPD   = 4;                         _I FRAME OUTSTANDING       ?
      X3NFPD   = 5;                         _NO FRAME OUTSTANDING      ?
      X3VSENR  = 6;                         _V(S) EQ N(R)              ?
      X3NVSENR = 7;                         _V(S)=N(R) AND NEW N(R)    ?
_ 
* * * *  F BIT CHECK RESPONSE CODES 
? 
      X9FI    = 1;                          _IGNORE                    ?
      X9FR    = 2;                          _RESET REQUIRED            ?
      X9FP    = 3;                          _CONTINUE                  ?
_ 
* * * *  N(R) CHECK RESPONSE CODES
? 
      X9NR    = 1;                          _RESET REQUIRED            ?
      X9NP    = 2;                          _CONTINUE                  ?
_ 
* * * *   PRIMARY/SECONDARY ADDRESSES 
? 
      XA      = $3;                         _ADDRESS A                 ?
      XB      = $1;                         _ADDRESS B                 ?
_ 
* * * *  CMDR/FRMR REASON CODE VALUES 
? 
      XCWV    = 1;                          _REASON CODE W             ?
      XCXV    = 2;                          _REASON CODE X             ?
      XCYV    = 4;                          _REASON CODE Y             ?
      XCZV    = 8;                          _REASON CODE Z             ?
_ 
* * * *  INTERNAL FRAME TYPES 
? 
      X2ERR   = 0;                          _UNKNOWN FRAME             ?
      X2I     = 1;                          _DATA FRAME                ?
      X2RR    = 2;                          _RR FRAME                  ?
      X2RNR   = 3;                          _RNR FRAME                 ?
      X2REJ   = 4;                          _REJ FRAME                 ?
      X2SABM  = 5;                          _SABM FRAME                ?
      X2DM    = 6;                          _DM FRAME                  ?
      X2DISC  = 7;                          _DISC FRAME                ?
      X2UA    = 8;                          _UA FRAME                  ?
      X2FRMR  = 9;                          _FRMR FRAME                ?
      X2CRR   =10;                          _SENDING RR COMMAND        ?
      X2CRNR  =11;                          _SENDING RNR COMMAND       ?
      X2CREJ  =12;                          _SENDING REJ COMMAND       ?
  
_ 
* * * *  FRAME TYPES FOR FRAME GENERATOR (PX2GPF) 
? 
      X3I     = $00;
      X3RR    = $01;
      X3RNR   = $05;
      X3REJ   = $09;
      X3SABM  = $2F;
      X3DM    = $0F;
      X3DISC  = $43;
      X3UA    = $63;
      X3FRMR  = $87;
_ 
* 
*                    X25 LEVEL 3 CONST. 
* 
? 
_ 
* * * *  COMMON DEFINITIONS FOR PRIMARY TABLES
? 
_        STATES DEFINTION                                              ?
      X7READY = 1;                          _READY                     ?
      X7DTEW  = 2;                          _DTE WAITING               ?
      X7DCEW  = 3;                          _DCE WAITING               ?
      X7DXFR  = 4;                          _DATA TRANSFER             ?
      X7CCOL  = 5;                          _CALL COLLISION            ?
      X7DTEC  = 6;                          _DTE CLEAR                 ?
      X7DCEC  = 7;                          _DCE CLEAR                 ?
  
_        EVENTS DEFINITION                                             ?
      X7SUPR  = 1;                          _SET-UP REQUEST            ?
      X7SUPC  = 2;                          _SET-UP CONFIRMATION       ?
      X7CLRR  = 3;                          _CLEAR REQUEST             ?
      X7CLRC  = 4;                          _CLEAR CONFIRMATION        ?
      X7DRFC  = 5;                          _DATA, RESET, FLOW CONTROL ?
      X7ICAR  = 6;                          _SEND OUTCALL BLOCK        ?
      X7ICXN  = 7;                          _CALL REQUEST ACCEPTED     ?
      X7ICXA  = 8;                          _CALL REQUEST REJECTED     ?
      X7FREE  = 9;                          _CONNECTION IS FREED       ?
      X7SKIP  = 10;                         _SKIP PRIMARY STATES       ?
      X7ICNN  = X7ICXN;                     _PAD CALL REQUEST ACCEPTED ?
      X7ICNA  = X7ICXA;                     _PAD CALL REQUEST REJECTED ?
  
_ 
* * * *  COMMON DEFINITIONS FOR SECONDARY TABLES
? 
_        STATES DEFINITION                                             ?
      X8FCR   = 1;                          _FLOW CONTROL READY        ?
      X8DTER  = 2;                          _DTE RESET                 ?
      X8DCER  = 3;                          _DCE RESET                 ?
  
_        EVENTS DEFINITION                                             ?
      X8RIND  = 1;                          _RESET INDICATION          ?
      X8RCONF = 2;                          _RESET CONFIRMATION        ?
      X8DFC   = 3;                          _DATA FLOW CONTROL         ?
      X8INTI  = 4;                          _INTERRUPT INDICATION      ?
      X8INTC  = 5;                          _INTERRUPT CONFIRMATION    ?
      X8RSTR  = 6;                          _RESET REQUEST             ?
      X8RSTC  = 7;                          _RESET CONFIRMATION        ?
      X8INTR  = 8;                          _INT REQ FROM HOST         ?
      X8INC   = 9;                          _INT CONF FROM HOST        ?
  
_ 
* * * *  PACKET TYPES FOR PACKET GENERATOR(PX3GPPKT)
? 
      X6DATA    = $00;                      _DATA PACKET               ?
      X6RR      = $01;                      _RECEIVE READY             ?
      X6RNR     = $05;                      _RECEIVE NOT READY         ?
      X6CALREQ  = $0B;                      _CALL REQUEST              ?
      X6INCALL  = $0B;                      _INCOMING CALL             ?
      X6CALACC  = $0F;                      _CALL ACCEPTED             ?
      X6CLRREQ  = $13;                      _CLEAR REQUEST             ?
      X6CLRIND  = $13;                      _CLEAR INDICATION          ?
      X6CLRCONF = $17;                      _CLEAR CONFIRMATION        ?
      X6INTREQ  = $23;                      _INTERRUPT REQUEST         ?
      X6INTIND  = $23;                      _INTERRUPT INDICATION      ?
      X6INTCONF = $27;                      _INTERRUPT CONFIRMATION    ?
      X6RSTREQ  = $1B;                      _RESET REQUEST             ?
      X6RSTIND  = $1B;                      _RESET INDICATION          ?
      X6RSTCONF = $1F;                      _RESET CONFIRMATION        ?
      X6DIAG    = $F1;                      _DIAGNOSTIC PACKET         ?
      X6STRREQ  = $FB;                      _RESTART REQUEST           ?
      X6STRIND  = $FB;                      _RESTART INDICATION        ?
      X6STRCONF = $FF;                      _RESTART CONFIRMATION      ?
  
_ 
* * * *  INTERNAL PACKET TYPES DEFINITION 
? 
_        REQUEST PACKET ID                                             ?
      X5CALL    =  1;                       _CALL REQUEST/INCOMING CALL?
      X5CLEAR   =  2;                       _CLEAR REQUEST/INDICATION  ?
      X5RESET   =  3;                       _RESET REQUEST/INDICATION  ?
      X5RESTART =  4;                       _RESTART REQUEST/INDICATION?
      X5INTRRPT =  5;                       _INTERRUPT REQ/IND         ?
  
_        CONFIRMATION PACKET ID                                        ?
      X5CALACC  =  6;                       _CALL ACCEPTED             ?
      X5CALCNN  =  6;                       _CALL CONNECTED            ?
      X5CLRCONF =  7;                       _CLEAR CONFIRMATION        ?
      X5RSTCONF =  8;                       _RESET CONFIRMATION        ?
      X5INTCONF =  9;                       _INTERRUPT CONFIRMATION    ?
      X5STRCONF = 10;                       _RESTART CONFIRMATION      ?
  
_        DIAGNOSTIC PACKET ID                                          ?
      X5DIAG    = 11;                       _DIAGNOSTIC PACKET         ?
  
_        FLOW CONTROL PACKET ID                                        ?
      X5RR      = 12;                       _RECEIVE READY             ?
      X5RNR     = 13;                       _RECEIVE NOT READY         ?
  
_       DATA PACKET ID                                                 ?
      X5DATA    = 14;                       _DATA PACKET               ?
  
_ 
* * * *  PACKET LEVEL WINDOW DEFINITION 
           (GENERAL FORMAT IDENTIFIER)
? 
      X9MODL8 = 1;                          _USING MODULO OF 8         ?
  
_ 
* * * *  REMOTE PROCESS IDENTIFIERS 
? 
      X8PAD    = $01;                       _PAD CONNECTION            ?
      X8IX25T  = $F2;                       _INTERACTIVE X25 TERMINAL  ?
      X8APPL   = $C0;                       _APPL TO APPL CONNECTION   ?
      X8APC1   = $C1;                       _A-A OLD FOR COMPATIBILITY ?
      X8CDC1   = $F3;                       _SUBTIP RESERVED FOR CDC   ?
      X8CDC2   = $F4;                       _SUBTIP RESERVED FOR CDC   ?
      X8USR1   = $F5;                       _SUBTIP RESERVED FOR USER  ?
      X8USR2   = $F6;                       _SUBTIP RESERVED FOR USER  ?
  
_ 
* * * *  CLASS CODING OF THE FACILITY CODE FIELD
? 
      X3CLSA   = 0;                         _FOR SINGLE OCTET PARM FILD?
      X3CLSB   = 1;                         _FOR DOUBLE OCTET PARM FILD?
      X3CLSC   = 2;                         _FOR TRIPL  OCTET PARM FILD?
      X3CLSD   = 3;                         _FOR VARIALBE LENGTH PARM  ?
  
_ 
* * * *  FACILITY CODE
? 
      X9DPL    = $42;                       _DATA PACKET LENGTH        ?
      X9PWS    = $43;                       _PACKET WINDOW SIZE        ?
  
_ 
* * * *  PACKET OCTET POSITION
? 
      X3PFLCD  = $0C0A; 
      X3OCT3   = 12;
      X3OCT4   = 13;
      X3OCT5   = 14;
  
      X1CADDR  = 13;                        _FCD FOR DTE ADDRESS       ?
                                            _ AL1 AND AL2 FIELD        ?
  
_ 
* * * *  BUFFER POSITION FOR
           - ERROR CODE IN ICN/AP OR ICN/EX 
           - PACKET WINDOW SIZE 
           - PACKET DATA LENGTH 
           - FACILITY LENGTH FIELD
? 
      X3CN     = $0E;                       _CONNECTION NUMBER         ?
                                            _ WHICH ASSIGN BY HOST     ?
      X3ICERR  = $0F; 
      X3PRI    = $13;                       _PRIORITY LEVEL            ?
      X3UBL    = $18;                       _UPLINE BLOCK LIMIT        ?
      X3UBZ    = $19;                       _UPLINE BLOCK SIZE         ?
      X3PORT   = $1A;                       _PORT NUMBER               ?
      X3SNODE  = $1B;                       _HOST ID                   ?
      X3WS     = $1D;                       _PACKET WINDOW SIZE        ?
      X3DPL    = $1E;                       _DATA PACKET LENGTH (2**N) ?
      X3AL12   = $1F;                       _ADDRESS LENGTH FIELD      ?
  
_ 
* * * * CONSTANTS FOR UPLINE BRK BLOCK
? 
      X3BRDCE  =  6; _RC: RESET REQUEST FROM DCE                       ?
      X3BRDTE  =  7; _RC: RESET REQUEST FROM DTE                       ?
      X3BRTC   =  0; _DTE RESET CAUSE CODE                             ?
      X3BRTD   = $F; _DTE RESET DIAG CODE                              ?
  
      X4BRKRC  = $C; _RC CODE POSITION IN BUFFER                       ?
      X4BRKC   = $D; _CAUSE CODE POSITION IN BUFFER                    ?
      X4BRKD   = $E; _DIAG CODE POSITION IN BUFFER                     ?
      X4BRKFL  = $0E0C; _LCB/FCB FOR UPLINE BRK                        ?
  
_ 
* * * * CAUSE CODE FOR REVERSE CHARGING NOT SUBSCRIBED
? 
      X3NOCHRG = 25;
  
      X2EXTRA  = 2; 
  
_ 
* * * * CAUSE CODE FOR INVALID FACILITY REQUEST 
? 
      X3INVFACL = 3;
  
_$J+? 
TYPE
  
*CALL X25TYP02
  
      X0PKHDR = PACKED RECORD 
  
      CASE X9TAG4 : INTEGER OF
  
         1 : ( XPGFI   : B04BITS;           _GENERAL FORMAT ID         ?
               XPLCHN  : B012BITS;          _LOGICAL CHANNEL NUMBER    ?
               XPGPKID : B08BITS;           _GENERAL PACKET ID         ?
               XPCAUSE : B08BITS;           _CAUSE BYTE                ?
               XPDIAG  : B08BITS;           _DIAG BYTE                 ?
               XPSP1   : B08BITS);
  
         2 : ( XPQBIT  : BOOLEAN;           _Q BIT                     ?
               XPDBIT  : BOOLEAN;           _D BIT                     ?
               XPDPGFI : B02BITS;           _DATA PACKET GFI           ?
               XLCGN   : B04BITS;           _LOGICAL CHANNEL GROUP     ?
               XLCN    : B08BITS;           _LOGICAL CHANNEL NUMBER    ?
               XPKIDU  : B07BITS;           _USED TO FIND              ?
               XPKIDL  : BOOLEAN;           _DATA PACKETS              ?
               XPSP2   : B08BITS);
  
         3 : ( XPSP3   : INTEGER; 
               XPNPR   : B03BITS;           _NUMBERED PACKETS          ?
               XPNPKID : B05BITS;           _RR, RNR, REJ              ?
               XPSP4   : B08BITS);
  
         4 : ( XPSP5   : INTEGER; 
               XPPR    : B03BITS;           _P(R)                      ?
               XPMBIT  : BOOLEAN;           _M BIT                     ?
               XPPS    : B03BITS;           _P(S)                      ?
               XPSP6   : B09BITS);
      END; _X0PKHDR?
  
      X0FRHDR = PACKED RECORD 
  
      CASE X9TAG5 : INTEGER OF
  
         1 : ( XFA     : B08BITS;           _ADDRESS                   ?
               XFNR    : B03BITS;           _N(R)                      ?
               XFPF    : BOOLEAN;           _POOL/FINAL BIT            ?
               XFNS    : B03BITS;           _N(S)                      ?
               XFSUI   : BOOLEAN);          _0 : I, 1 : S/U            ?
  
         2 : ( XFDM1   : B08BITS;           _DUMMY                     ?
               XFM     : B03BITS;           _MODIF FUNCTION BITS       ?
               XFDM2   : B01BIT;            _DUMMY                     ?
               XFS     : B02BITS;           _SUP FUNCTION BITS         ?
               XFSU    : BOOLEAN;           _0 : S  1 : U              ?
               XFDM3   : B01BIT;            _DUMMY                     ?
               XFCB1   : B08BITS;           _CMDR BYTE 01              ?
               XFCB2   : B08BITS;           _CMDR BYTE 02              ?
               XFCB3   : B08BITS;           _CMDR BYTE 03              ?
               XFDM4   : B08BITS);          _DUMMY                     ?
  
         3 : ( XFDM5   : B08BITS;           _DUMMY                     ?
               XFTYP   : B08BITS;           _FRAME TYPE                ?
               XCTYP   : B08BITS;           _CTRL FIELD ON REJECTED FRM?
               XCVR    : B03BITS;           _CMDR V(R)                 ?
               XCF     : BOOLEAN;           _0 : COMMAND,  1 : RESPONSE?
               XCVS    : B03BITS;           _CMDR V(S)                 ?
               XCSP2   : B01BIT;            _UNUSED                    ?
               XFDM6   : B04BITS;           _UNUSED                    ?
               XCZ     : BOOLEAN;           _Z FIELD                   ?
               XCY     : BOOLEAN;           _Y FIELD                   ?
               XCX     : BOOLEAN;           _X FIELD                   ?
               XCW     : BOOLEAN;           _W FIELD                   ?
               XFDM7   : B08BITS);          _DUMMY                     ?
  
      END; _X0FRHDR?
  
  
      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                     ?
  
        CASE X9TAG9 : INTEGER OF
  
          1 : (XBFRHDR   : X0FRHDR);        _FRAME HEADER              ?
          2 : (XBSP8     : INTEGER;         _PACKET HEADER             ?
               XBPKHDR   : X0PKHDR);        _PACKET HEADER             ?
      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? 
  
  
_ 
* * * *  SUBTIP CONNECTION TYPE DEFINITION
? 
      X0CNTYPE = PACKED RECORD
  
                 CNTYPE  : B08BITS;         _EXTERNAL CONNECTION TYPE  ?
                 SUBTIP  : B08BITS;         _INTERNAL SUBTIP TYPE      ?
                 END;  _ X0CNTYPE                                      ?
  
_ 
* * * *  INBOUND PACKET ID CONVERSITION TABLE 
? 
      X0PKTID  = PACKED RECORD
  
                 PCODE   : B08BITS;         _PRIMARY FUNCTION CODE     ?
                 SCODE   : B08BITS;         _SECONDARY FUNCTION CODE   ?
                 SPID1   : B07BITS;         _NOT IN USE                ?
                 CKPKT   : BOOLEAN;         _NEED TO CHECK PACKET      ?
                 PKTID   : B08BITS;         _PACKET ID                 ?
                 END;  _ X0PKTID                                       ?
  
_ 
* * * *  INCOMING CALL PACKET ACCESS
? 
      X0OCTET = PACKED RECORD 
                CASE X4TAG7 : INTEGER OF
  
                1: (OCTET   : CHAR);        _OCTET IN A WORD           ?
                2: (OCTSP2  : B08BITS;      _NOT IN USE                ?
                    CGADDR  : B04BITS;      _CALLING DTE ADDRESS       ?
                    CDADDR  : B04BITS);     _CALLED DTE ADDRESS        ?
                3: (OCTSP3  : B010BITS;     _NOT IN USE                ?
                    FACL    : B06BITS);     _FACILITY LENGTH           ?
                4: (OCTSP4  : B08BITS;      _NOT IN USE                ?
                    CUSRDT  : B08BITS);     _CALL USER DATA FIELDS     ?
                5: (OCINT   : INTEGER);     _OCTET AS AN INTGER        ?
                END; _X0OCTET?
  
_ 
* * * *  OPTIONAL USER FACILITIES 
? 
      X0OPUFCL = PACKED RECORD
                 CASE X4TAG8  : INTEGER OF
  
                 1 : (X3CLASS : B02BITS;    _CLASS TYPE                ?
                      X3CODE  : B06BITS;    _FACILITY CODE             ?
                      X3PM1   : B08BITS); 
                 2 : (X3CPM0  : CHAR; 
                      X3CPM1  : CHAR);
                 END; _X0OPUFCL?
  
_ 
* * * *  ABNORMAL RESPONSE CODE AND SUBCODE FOR CALL REQUEST
? 
      X0RC     = PACKED RECORD
                 CASE X5TAG1  : INTEGER OF
  
                 1 : (X3FIL1  : B08BITS;
                      X3SCRC  : B08BITS); 
                 2 : (X3FIL2  : B08BITS;
                      X3SC    : B04BITS;    _SUB RESPONSE CODE         ?
                      X3RC    : B04BITS);   _RESPONSE CODE             ?
                 END; _X0RC?
  
_ 
* * * *  ACCESSING SYSTEM BUFFER DEFINITION AND TIMER PACKET DEFINITION 
? 
      X0BUFFER = PACKED RECORD
  
      CASE X : INTEGER OF 
  
        1 : (X1BUFACSS : B0BUFPTR);         _ACCESS THE GLOBAL BUFFER  ?
                                            _DEFINITIONS               ?
        2 : (X1TMRACSS : B7PKTPTR);         _TIMER PACKET DEFINITION   ?
                                            _USING 8 WORD BUFFER       ?
        END; _X0BUFFER? 
  
_$J+? 
VAR 
_ 
* 
*                    X25 LEVEL 2/3 COMBINED VARIABLES 
* 
? 
      XTIDENT    : PACKED ARRAY             _X25 TRANSPORT IDENTIFIER  ?
                     [1..8] OF CHAR;        _ IN CORE MEMORY           ?
      XTDBGI     : INTEGER;                 _INDEX TO NEXT WORKLIST    ?
      XTDBGA     : ARRAY [0..24]            _SAVED WORKLIST ENTRY ARRAY?
                     OF BWTIPWLE; 
      XIPARAMS   : X0PARAMS;                _INCOMING WORKLIST         ?
      XOPARAMS   : X0PARAMS;                _OUTGOING WORKLIST         ?
      XTLCB      : BZLCBP;                  _LCB POINTER               ?
      XTSLCB     : B0BUFPTR;                _SUB LCB POINTER           ?
      XTL3FRMR   : BOOLEAN;                 _LEVEL 3 FRAME REQUEST     ?
      XTL3PKQ    : BOOLEAN;                 _LEVEL 3 PACKET QUEUED     ?
      XTWC       : INTEGER;                 _INCOMING WORK CODE        ?
      XTCNT1     : INTEGER; 
      XTCNT2     : INTEGER; 
  
_ 
* 
*                    X25 LEVEL 2 VAR. 
* 
? 
      X2IFRPTR   : X0BUFPTR;                _INPUT FRAME POINTER       ?
      X2FRPTR    : X0BUFPTR;                _WORKING FRAME POINTER     ?
      X2LCODE    : B04BITS;                 _LINK ACTION CODE          ?
      X2PCODE    : B04BITS;                 _PRIMARY ACTION CODE       ?
      X2SCODE    : B04BITS;                 _SECONDARY ACTION CODE     ?
      X2IFRHDR   : X0FRHDR;                 _LOCAL INBOUND FRAME HEADER?
      X2IFRTYP   : INTEGER;                 _INBOUND INTERNAL FRAME TYP?
      X2IFRLNGTH : INTEGER;                 _INBOUND FRAME LENGTH      ?
      X2NRSP     : INTEGER; 
      X2IFLOK    : BOOLEAN;                 _1 : CORRECT LENGTH        ?
      X2SHIFR    : BOOLEAN;                 _1 : SHORT I FRAME         ?
      X2AKNOWN   : BOOLEAN;                 _0 : ADDRESS UNKNOWN       ?
      X2CRKNOWN  : BOOLEAN;                 _0 : CMD/RSP UNKNOWN       ?
      X2CMDRSP   : BOOLEAN;                 _0 :CMD, 1 :RESP           ?
      X2IPF      : BOOLEAN;                 _INBOUND POLL/FINAL BIT    ?
      X2VRCODE   : B08BITS;                 _RETURNED V(R) OWNER CODE  ?
      X2RJCODE   : B08BITS;                 _CMDR/FRMR REASON CODE     ?
      X2RSWC     : B02BITS;                 _RESTART WORKCODES         ?
      X2TIMPTR   : X0BUFPTR;                _INTERNAL POINTER          ?
      X2CMDPKT   : NKINCOM;                 _MUX COMMAND PACKET        ?
      X2FRMID    : ARRAY [X2RR .. X2CREJ]   _EXTERNAL FRAME TYPES      ?
                                OF INTEGER; 
      X2IFRSET   : SET OF X2ERR .. X2FRMR;  _INBOUND FRAMES SET        ?
      X2OFRSET   : SET OF X2ERR .. X2CREJ;  _OUTBOUND FRAME SET        ?
  
_ 
* * * *  DTE LINK STATE TRANSITION MATRIX 
? 
    XLDTEMATRIX : ARRAY[1..X7LLSTAT,1..X7LLEVNT] OF INTEGER;
_ 
* * * *  DCE LINK STATE TRANSITION MATRIX 
? 
    XLDCEMATRIX : ARRAY[1..X7LLSTAT,1..X7LLEVNT] OF INTEGER;
  
_ 
* * * *  PRIMARY STATES TRANSITION MATRIX 
? 
  
    XPMATRIX : ARRAY[1..X8PLSTAT,1..X8PLEVNT] OF INTEGER; 
  
_ 
* * * *  SECONDARY STATES TRANSITION MATRIX 
? 
    XSMATRIX : ARRAY[1..X9SLSTAT,1..X9SLEVNT] OF INTEGER; 
  
_ 
* 
*                    X25 LEVEL 3 VAR. 
* 
? 
      X3LCCB     : B0BUFPTR;                _LCCB POINTER              ?
      X3TCB      : B0BUFPTR;                _TCB  POINTER              ?
      X3IPKPTR   : X0BUFPTR;                _INBOUND PACKET POINTER    ?
      X3OPKPTR   : X0BUFPTR;                _OUTBOUND PACKET POINTER   ?
      X3IPKHDR   : X0PKHDR;                 _INBOUND PACKET HEADER     ?
      X3BRKRC    : B08BITS;                 _UPLINE BREAK REASON CODE  ?
      X3PCODE    : B04BITS;                 _PRIMARY STATES EVENT      ?
      X3SCODE    : B04BITS;                 _SECONDARY STATES EVENT    ?
      X3IPKTYPE  : B04BITS;                 _INTERNAL PACKET TYPE      ?
      X3IPKLNGTH : INTEGER;                 _INPUT PACKET LENGTH       ?
      X3IPLOK    : BOOLEAN;                 _INBOUND PACKET LENGTH OK  ?
      X3ALARM    : BOOLEAN;                 _ALARM FLAG                ?
      X3WARNING  : BOOLEAN;                 _WARNING FLAG              ?
      X3FLG1     : BOOLEAN;                 _ALL PURPOSE BOOLEAN       ?
      X3NEWCN    : BOOLEAN;                 _NEW CONN MARKER IN L3FRGR ?
      X3FIRST    : B0BUFPTR;                _BUFFER POINTER            ?
      X3STATE    : INTEGER;                 _INTEGER                   ?
      X3EVENT    : INTEGER;                 _INTEGER                   ?
      X3PKTID    : ARRAY [X5CALL .. X5RNR]  _EXTERNAL PACKET TYPES     ?
                                OF INTEGER; 
      X3CSCOD    : ARRAY [L3BREAK .. L5INTC]
                                OF INTEGER; 
      X3IPKSET   : B0OVERLAY;               _USED FOR PACKET CHECKS    ?
      X3OPKSET   : B0OVERLAY;               _USED FOR PACKET CHECKS    ?
      X3MARK     : INTEGER; 
      X3OCTET    : X0OCTET; 
      X3CAUSE    : INTEGER;                 _CAUSE CODE                ?
      X3SVCNT    : INTEGER;                 _NUMBER OF SVC             ?
      X3LCHN     : INTEGER;                 _TOTAL NUMBER OF LOGICAL   ?
                                            _ CHANNELS                 ?
      X3TMRPKT  :  X0BUFFER;                _TIMER PACKET ACCESS       ?
      X3SUBTIP   : ARRAY [N0XPAD ..         _SUBTIP CONNECTION TYPE    ?
                            N0X2USR]        _ TABLE                    ?
                               OF X0CNTYPE; 
      X3PKTBL    : ARRAY [X5CALL ..         _INBOUND PACKET ID         ?
                             X5DIAG]        _ CONVERSION TABLE         ?
                                OF X0PKTID; 
      X3PSNCD    : PACKED ARRAY [0 .. 21]   _CONVERTION TABLE FROM PSN ?
                                   OF CHAR; _ CLEARING CAUSE CODE TO   ?
                                            _ CDC ERROR CODE           ?
      X3D0TIP    : ARRAY [D5ICXN .. D5ICNA] _WLE FROM SVM TO TIP       ?
                                OF INTEGER; 
      X3FCLCLS   : ARRAY [X3CLSA .. X3CLSD] _FACILITY CLASS TABLE      ?
                                OF INTEGER; 
      X3PWR2     : ARRAY [4..10] OF INTEGER;_POWERS OF 2               ?
  
_ 
* * * *  PVC PRIMARY STATE MATRIX 
? 
_/XAPPVCMATRIX : ARRAY[X7READY..X7DCEC,X7SUPR..X7FREE] OF INTEGER; /? 
  
_ 
* * * *  SVC PRIMARY STATE MATRIX 
? 
      XAPSVCMATRIX : ARRAY[X7READY..X7DCEC,X7SUPR..X7FREE] OF INTEGER;
  
_ 
* * * *  PVC SECONDARY STATE MATRIX 
? 
_/    XASPVCMATRIX : ARRAY[X8FCR..X8DCER,X8RIND..X8DFC] OF INTEGER;/? 
  
_ 
* * * *  SVC SECONDARY STATE MATRIX 
? 
      XASSVCMATRIX : ARRAY[X8FCR..X8DCER,X8RIND..X8INC] OF INTEGER; 
  
      X3DIAG       : X0RC;
  
      X3CEPTR   : 'X0ENTRY;                 _ CURRENT ENTRY IN X25NET  ?
      X3NETWORK : INTEGER;                  _ INDEX INTO X25NETTAB     ?
  
_$J+? 
VALUE 
      XTIDENT    = (#X25TRANS#);            _IDENTIFIER CHARACTERS     ?
_ 
* 
*                    X25 LEVEL 2 VALUE. 
* 
? 
  
      XLDTEMATRIX =                         _DTE LINK STATES           ?
  
                ( 1, 8, 0, 0, 0, 0, 0, 0,   _LINK DOWN                 ?
                  0, 8, 8,10, 9, 3, 3, 2,   _LINK DISC                 ?
                  0, 8, 8, 9,10, 7, 6, 4,   _LINK SET UP               ?
                  0, 8, 8, 0, 5, 0, 3, 0);  _LINK INFO TRANSFER        ?
  
      XLDCEMATRIX =                         _DCE LINK STATE            ?
  
                (11, 8, 0, 0, 0, 0, 0, 0,   _LINK DOWN                 ?
                  0, 0, 0, 0, 0, 0, 0, 0,   _LINK DISC                 ?
                  0, 8, 8,12, 9, 0, 8, 0,   _LINK SET UP               ?
                  0, 8, 8, 0, 8, 0, 8, 0);  _LINK INFO TRANSFER        ?
  
      XPMATRIX =                            _PRIMARY MATRIX            ?
  
                ( 0, 1, 2, 3, 8, 0, 4,      _OPERATIONAL               ?
                  5, 0, 2, 3, 8, 0, 4,      _REMOTE BUSY               ?
                  2, 1, 2, 3, 6, 0, 4,      _RECOVER                   ?
                  0, 0, 0, 0, 6, 0, 7);     _RESET                     ?
  
      XSMATRIX =                            _SECONDARY MATRIX          ?
  
                ( 1, 2, 0, 7,               _OPERATIONAL               ?
                  3, 2, 5, 7,               _BUSY                      ?
                  4, 2, 0, 7,               _REJECT                    ?
                  6, 2, 0, 0);              _RESET                     ?
  
      X2FRMID =                             _EXTERNAL FRAMES TYPES     ?
              (X3RR,       _ $01 ?          _RR                        ?
               X3RNR,      _ $05 ?          _RNR                       ?
               X3REJ,      _ $09 ?          _REJ                       ?
               X3SABM,     _ $2F ?          _SABM                      ?
               X3DM,       _ $0F ?          _DM                        ?
               X3DISC,     _ $43 ?          _DISC                      ?
               X3UA,       _ $63 ?          _UA                        ?
               X3FRMR,     _ $87 ?          _FRMR                      ?
               X3RR,       _ $01 ?          _RR  (COMMAND)             ?
               X3RNR,      _ $05 ?          _RNR (COMMAND)             ?
               X3REJ);     _ $09 ?          _REJ (COMMAND)             ?
  
  
_ 
* 
*                    X25 LEVEL 3 VALUE. 
* 
? 
  
      XAPSVCMATRIX =                        _SVC PRIMARY MATRIX        ?
              ( 1, 2, 3, 2, 2, 4, 8, 7, 7,  _READY STATE               ?
               10, 6,11,10,10, 0, 0, 0,13,  _DTE WAITING               ?
                2, 2, 3, 2, 2, 0, 8,14, 7,  _DCE WAITING               ?
                2, 2, 3, 2,12, 0, 0, 0, 7,  _DATA TRANSFER             ?
                0, 0, 0, 0, 0, 0, 0, 0, 0,  _CALL COLLISION            ?
                2, 2, 3, 5, 2, 0, 8, 7, 7,  _DTE CLEARING              ?
                9, 9, 3, 9, 9, 0, 8, 7, 7); _DCE CLEARING              ?
  
  
   _/ XAPPVCMATRIX =   /?                   _PVC PRIMARY MATRIX        ?
  
  
      XASSVCMATRIX =                        _SVC SECONDARY MATRIX      ?
              ( 6, 9, 1, 2, 3, 7, 0, 4, 5,  _FLOW CONTROL READY        ?
               10,10,12,12,12, 8, 8, 0, 0,  _DTE RESET                 ?
               12,12,12,12,12,11,11, 0, 0); _DCE RESET                 ?
  
  
_/    XASPVCMATRIX =    /?                  _PVC SECONDARY MATRIX      ?
  
  
      X3PKTID  =                            _EXTERNAL PACKET TYPES     ?
                 (X6CALREQ,                 _CALL REQUEST              ?
                  X6CLRREQ,                 _CLEAR REQUEST             ?
                  X6RSTREQ,                 _RESET REQUEST             ?
                  X6STRREQ,                 _RESTART REQUEST           ?
                  X6INTREQ,                 _INTERRUPT REQUEST         ?
                  X6CALACC,                 _CALL ACCEPTED             ?
                  X6CLRCONF,                _CLEAR CONFIRMATION        ?
                  X6RSTCONF,                _RESET CONFIRMATION        ?
                  X6INTCONF,                _INTERRUPT CONFIRMATION    ?
                  X6STRCONF,                _RESTART CONFIRMATION      ?
                  X6DIAG,                   _DIAGNOSTIC PACKET         ?
                  X6RR,                     _RECEIVE READY             ?
                  X6RNR);                   _RECEIVE NOT READY         ?
  
      X3CSCOD  =                            _CONVERT TO SECONDARY      ?
                 (X8RSTR,                   _RESET REQUEST             ?
                  X8RSTC,                   _RESET CONFIRMATION        ?
                  X8INTR,                   _INTERRUPT REQUEST         ?
                  X8INC);                   _INTERRUPT CONFIRMATION    ?
  
      X3SUBTIP =                            _REM PROCESS ID, SUBTIP ID ?
                 ($0101,                    _   X8PAD          N0XPAD  ?
                  $FF00,      _02 NOT IN USE    X8IX25T        N0XITML ?
                  $C003,                    _   X8APPL         N0XAPPL ?
                  $C103,                    _   X8APC1         N0XAPPL ?
                  $FF00,      _05 NOT IN USE    X8CDC2         N0X2CDC ?
                  $FF00,      _06 NOT IN USE    X8USR1         N0X1USR ?
                  $FF00);     _07 NOT IN USE    X8USR2         N0X2USR ?
  
      X3PKTBL  =                            _P-CODE  S-CODE  PACKET-ID ?
                 ($0100, $010B,             _X7SUPR    ---   X5CALL    ?
                  $0000, $0113,             _  ---     ---   X5CLEAR   ?
                  $0001, $011B,             _  ---   X8RIND  X5RESET   ?
                  $0A00, $01FB,             _X7SKIP    ---   X5RESTART ?
                  $0504, $0023,             _X7DRFC  X8INTI  X5INTRRPT ?
                  $0200, $000F,             _X7SUPC    ---   X5CALACC  ?
                  $0400, $0017,             _X7CLRC    ---   X5CLRCONF ?
                  $0502, $001F,             _X7DFRC  X8RCONF X5RSTCONF ?
                  $0505, $0027,             _X7DFRC  X8INTC  X5INTCONF ?
                  $0A00, $00FF,             _X7SKIP    ---   X5STRCONF ?
                  $0A00, $00F1);            _X7SKIP    ---   X5DIAG    ?
  
      X3PSNCD  = _         PSN CLEARING CAUSE CODE ---> CDC ERROR CODE ?
_ 
THIS TABLE CONVERTS PDN CLEARING CAUSES INTO CON/ACRQ/A REASON CODES
? 
                 ($A4C2,              _ $01 --> 164   , $03 --> 194    ?
_                  NUMBER BUSY                INVALID FACILITY REQUEST ?
                  $B400,              _ $05 --> 180   ,    -------     ?
_                  NETWORK CONGESTION                                  ?
                  $E6D2,              _ $09 --> 230   , $0B --> 210    ?
_                  OUT OF ORDER               ACCESS BARRED            ?
                  $9600,              _ $0D --> 150   ,    -------     ?
_                  NOT OBTAINABLE                                      ?
                  $D2A1,              _ $11 --> 210   , $13 --> 161    ?
_                  REMOTE PROCEDURE ERROR     LOCAL PROCEDURE ERROR    ?
                  $C600,              _ $15 --> 198   ,    -------     ?
_                  RPOA OUT OF ORDER                                   ?
                  $E200,              _ $19 --> 226   ,    -------     ?
_                  REVERSE CHARGING ACCEPTANCE NOT SUBSCRIBED          ?
                  $0000,              _    -------         -------     ?
_                                                                      ?
                  $D200,              _ $21 --> 210   ,    -------     ?
_                  INCOMPATIBLE DESTINATION                            ?
                  $0000,              _    -------         -------     ?
_                                                                      ?
                  $F200);             _ $29 --> 242   ,    -------     ?
_                  FAST SELECT ACCEPTANCE NOT SUBSCRIBED               ?
  
      X3D0TIP  =
                 (X7ICXN,                   _INBOUND CALL ACCEPTED     ?
                  X7ICXA,                   _INBOUND CALL REJECTED     ?
                  X7ICAR,                   _OUTBOUND CALL REQUEST     ?
                  X7FREE,                   _ACCESS HAS BEEN FREED     ?
                  X7ICNN,                   _PAD CALL ACCEPTED         ?
                  X7ICNA);                  _PAD CALL REJECTED         ?
  
      X3FCLCLS = (2, 3, 4, 0);
  
      X3PWR2   = (16,32,64,128,256,512,1024); 
  
_$J+? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*                        PX25MSG                                      * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_?
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW :                                                         * 
*              GENERATE A MESSAGE TO NAM DAYFILE VIA SVM.             * 
*                                                                     * 
** INPUT :                                                            * 
*              CANNED MESSAGE INDEX.                                  * 
*                 1 : LINK RESET.                                     * 
*                 2 : PSN DOWN.                                       * 
*                 3 : UNKNOWN LCN RECEIVED.                           * 
*                 4 : SUP. PACKET RECEIVED.                           * 
*                                                                     * 
** CALLING PROGRAMS :                                                 * 
*              PX2PRIMARY    - PRIMARY HANDLER.  (CASE 6 AND 7)       * 
*              PX2SECONDARY  - SECONDARY HANDLER.  (CASE 2)           * 
*              PX2LINK       - LINK HANDLER.  (CASE 2, 4 AND 6)       * 
*              PX3CHKPKT     - CHECK FOR AN INCOMING CALL, A CLEAR    * 
*                              REQUEST, A RESET REQUEST OR A RESTART  * 
*                              REQUEST PACKET.                        * 
*              PX3HDPROCESS  - PACKET HEADER PROCESS.                 * 
*              PX25TRANS     - MAIN PROGRAM. (LEVEL 3)                * 
*                                                                     * 
** OUTPUT :                                                           * 
*              CANNED MESSAGE TO NAM DAYFILE VIR SVM.                 * 
*                                                                     * 
** EXTERNAL SUBROUTINES :                                             * 
*              PBGET1BF   - GET A DATA BUFFER.                        * 
*              PBXFER     - CALL A PAGED PROGRAM. (PNSMGEN)           * 
*              PBFCOPY    - COPY CANNED MESSAGE TO A BUFFER.          * 
*              PB1BFAVAIL - CHECK FOR BUFFER AVAILABILITY.            * 
*                                                                     * 
** NOTES :                                                            * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PX25MSG( X4INDEX : INTEGER);
  
VAR 
      X4CANMSG : B0BUFPTR;                  _CANNED MESSAGE POINTER    ?
      X4UPMSG  : B0BUFPTR;                  _MESSAGE POINTER TO SVM    ?
      X4WORK   : B0OVERLAY; 
      X4FLCD   : ARRAY [1..4] OF INTEGER; 
      X4MSG    : PACKED ARRAY [0..107] OF CHAR; 
  
VALUE 
      X4FLCD   = ($1402,  $2915,  $412A,  $6B42); 
      X4MSG    = (#  #,                     _LCD AND FCD FIELDS        ?
                  #PORT  XX LINK RESETPORT  XX X25 PSN DOWN#, 
                  #PORT  XX LCN=XXX UNKNOWN#, 
                  #PORT  XX LCN=XXX PKID=XX  CAUSE=XX DIAG=XX#);
  
_$J+? 
  
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*                      FUNCTION X25VAL                                * 
*                                                                     * 
*              CONVERT A CHARACTER TO AN NUMBER.                      * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
FUNCTION X25VAL( RIGHTBYT : BOOLEAN ) : INTEGER;
  
VAR 
      X4CHR1 : CHAR;
      X4CHR2 : CHAR;
  
BEGIN 
IF RIGHTBYT                                 _CONVERT RIGHT BYTE OF WORD?
THEN
  X4WORK.BALCHAR := X4WORK.BARCHAR; 
  
X4CHR1 := JMCNVTO[X4WORK.BAHEX.B0H1]; 
X4CHR2 := JMCNVTO[X4WORK.BAHEX.B0H2]; 
  
X25VAL := ORD(X4CHR1) * $100 + ORD(X4CHR2); 
END; _ FUNCTION X25VAL                                                 ?
  
_$J+? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*                     PX25MSG MAIN PROGRAM                            * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
BEGIN 
IF PB1BFAVAIL(B0THDIS)                      _ENOUGH BUFFER             ?
THEN
  BEGIN 
  ADDR(X4MSG, X4CANMSG);                    _GET ADDRESS OF CANNED MSG ?
  X4CANMSG'.BIINT[1] := X4FLCD[X4INDEX];    _SET SOURCE LCD AND FCD    ?
  X4UPMSG            := PBGET1BF(BEDBSIZE); _GET DEST. BUFFER          ?
  X4UPMSG'.BIINT[1]  := $7D0A;              _SET FCD.  WORD 5 IS       ?
                                            _ RESERVED FOR LINE NUMBER ?
  PBFCOPY(X4CANMSG, X4UPMSG);               _COPY IT                   ?
  
  X4WORK.BAINT := XTLCB'.BZLINO.BDLINO;     _COPY LINE NUMBER          ?
  WITH X4UPMSG' DO
    BEGIN 
    BFFCD    := $08;                        _RESET BUFFER FCD          ?
    BIINT[5] := X4WORK.BAINT;               _STORE LINE NUMBER FOR SVM ?
    BIINT[9] := X25VAL(FALSE);              _CONVERT LINE NUMBER       ?
  
    IF X4INDEX \ 3                          _NEED TO STORE LCN AT LEAST?
    THEN
      BEGIN 
      X4WORK.BAINT := X3IPKPTR.X1BFPTR'.BIINT[6]; 
      BFDATAC[23]  := JMCNVTO[X4WORK.BAHEX.B0H2]; 
      BIINT[13]    := X25VAL(TRUE);         _COPY RIGHT BYTE OF WORD   ?
  
      IF X4INDEX = 4                        _NEED TO STORE PACKET ID,  ?
      THEN                                  _ CAUSE AND DIAG CODES     ?
        BEGIN 
        X4WORK.BAINT := X3IPKPTR.X1BFPTR'.BIINT[7]; 
        BIINT[17]    := X25VAL(FALSE);      _STORE PACKET ID           ?
        BIINT[22]    := X25VAL(TRUE);       _STORE CAUSE CODE          ?
        X4WORK.BAINT := X3IPKPTR.X1BFPTR'.BIINT[8]; 
        BIINT[26]    := X25VAL(FALSE);      _STORE DIAG CODE           ?
        END; _ IF X4INDEX = 4                                          ?
      END; _ IF X4INDEX \ 3                                            ?
    END; _ WITH X4UPMSG                                                ?
  
  GENPFC          := D8ALM; 
  GENSFC.DHINT    := D9OP;
  GENPAR.BABUFPTR := X4UPMSG; 
  WITH  BRTNJUMP[C1PNSMGEN]  DO 
    PBXFER(JENTADDR,JPAGEVAL);
  END; _ IF PB1BFAVAIL                                                 ?
END; _ PROCEDURE PX25MSG                                               ?
  
_$J+? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*                    PX25TELTIP                                       * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW :                                                         * 
*              GENERATES AN UPLINE WORKLIST TO THE X.25 TIP           * 
*                                                                     * 
** INPUT :                                                            * 
*              X3TIPWC = WORKLIST CODE                                * 
*              X3LCCB  = LCCB POINTER                                 * 
*                                                                     * 
** CALLING PROGRAMS :                                                 * 
*              PX2LINK      - LINK HANDLER  (CASE 7 AND 12)           * 
*              PX3PNP       - PROCESS NUMBERED PACKETS                * 
*              PX3GETPACKET - DEQUEUE DOWNLINE PACKETS FOR LEVEL 2    * 
*              PX3DTEC      - DTE CLEARING STATE                      * 
*              PX3DCEC      - DCE CLEARING STATE                      * 
*              PX3RDET      - DTE RESET STATE                         * 
*              PX3PRIMARY   - PRIMARY PROCESSOR  (CASE 1, 6 AND 8)    * 
*              PX3SECONDARY - SECONDARY PROCESSOR                     * 
*                               (CASE 2, 3, 6, 7,9 AND 9)             * 
*              PX25TRANS    - MAIN PROGRAM (LEVEL 2)                  * 
*                                                                     * 
** OUTPUT :                                                           * 
*              XOPARAMS = WORKLIST SENT TO X.25 TIP                   * 
*                                                                     * 
** EXTERNAL SUBROUTINES :                                             * 
*              NONE                                                   * 
** NOTES :                                                            * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PX25TELTIP (X3TIPWC : B08BITS); 
BEGIN 
XOPARAMS.XAWC      := X3TIPWC;              _SET WORKCODE              ?
XOPARAMS.XATCBLCCB := X3LCCB'.LCCB.LCTCBPTR;_SET TCB POINTER           ?
XOPARAMS.XABFRPTR  := NIL;
  
CASE X3TIPWC OF 
  
  L3LINE:                                   _LINE EVENT                ?
    BEGIN 
    XOPARAMS.XALINO    := XIPARAMS.XALINO;  _GET LINE NUMBER           ?
    XOPARAMS.XATCBLCCB := NIL;
    END; _ L3LINE                                                      ?
  
  L3FRGQ:                                   _FRAGMENT QUEUED           ?
    BEGIN 
    XOPARAMS.XABFRPTR := X3IPKPTR.X1BFPTR;  _FRAGMENT ADDRESS          ?
    X3IPKPTR.X1BFPTR  := NIL;               _CLEAR DATA PACKET POINTER ?
    END; _ L3FRGQ                                                      ?
  
  L3TCB:                                    _TCB DOWN                  ?
    BEGIN 
    XOPARAMS.XADATA := D5DOWN;
    END; _ L3TCB                                                       ?
  
  L3BREAK:                                  _UPLINE BREAK              ?
    BEGIN 
    XOPARAMS.XABFRPTR := PBGET1BF(BEDBSIZE);
    WITH XOPARAMS.XABFRPTR' DO
      BEGIN 
      BIINT[1]         := X4BRKFL;          _SET LCD/FCD OF BUFFER     ?
      BFDATAC[X4BRKRC] := CHR(X3BRKRC);     _PLACE BRK REASON CODE     ?
      BFDATAC[X4BRKC]  := CHR(X3CAUSE);     _PLACE BRK CAUSE CODE      ?
      BFDATAC[X4BRKD]  := CHR(X3DIAG.X3SCRC); _PLACE BRK DIAG CODE     ?
      END;  _WITH XOPARAMS.XABFRPTR'  ? 
    END;    _ L3BREAK                 ? 
  
  L3RESET,                                  _UPLINE RESET              ?
  L3INTR,                                   _UPLINE INTERRUPT          ?
  L3INTC,                                   _UPLINE CONFIRMATION       ?
  L3FRGR:                                   _FRAGMENT REQUEST          ?
    BEGIN 
    XOPARAMS.XANEWCN := X3NEWCN;            _GET NEW CN MARKER         ?
    X3NEWCN          := FALSE;              _RESET IT                  ?
    END; _ L3RESET, L3INTR, L3INTC, L3FRGR                             ?
  
  END; _ CASE X3TIPWC                                                  ?
  
PBLSPUT(XOPARAMS.XAWORKLIST,BYWLCB[B0X25TIP]);
END; _ PROCEDURE PX25TELTIP                                            ?
  
_$J+? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*                    PX25CLRQUE                                       * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_?
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW :                                                         * 
*              RELEASE BUFFERS IN A GIVEN QUEUE POINTER               * 
*                (BUFFERS ARE CHAINED BY Q-CHAIN)                     * 
*                                                                     * 
** INPUT :                                                            * 
*              X2PTR = READ QUEUE POINTER                             * 
*                                                                     * 
** CALLING PROGRAMS :                                                 * 
*              PX25FLSHLCCB - INITIALIZE ONE LCCB                     * 
*              PX2INIT      - INITIALIZE LEVEL 2 STATION              * 
*              PX25TRANS    - MAIN PROGRAM (LEVEL 2)                  * 
*                                                                     * 
** OUTPUT :                                                           * 
*              GIVEN QUEUE POINTER IS CLEARED                         * 
*                                                                     * 
** EXTERNAL SUBROUTINES :                                             * 
*                                                                     * 
*              PBRELZRO     - RELEASE BUFFER CHAIN                    * 
*                                                                     * 
** NOTES :                                                            * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PX25CLRQUE (VAR X2PTR  : B0BUFPTR); 
VAR 
      X2PTR1 : B0BUFPTR;
  
BEGIN 
WHILE X2PTR " NIL DO                        _UNTIL END OF CHAIN        ?
  
  BEGIN 
  X2PTR1 := X2PTR'.BCCHAINS[QCHN];          _GET NEXT ONE              ?
  PBRELZRO(X2PTR,BEDBSIZE);                 _RELEASE IT                ?
  X2PTR  := X2PTR1; 
  END; _ WHILE X2PTR " NIL                                             ?
END; _ PROCEDURE PX25CLRQUE                                            ?
  
_$J+? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*                    PX25FLSHLCCB                                     * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW :                                                         * 
*              INITIALIZE ONE LCCB                                    * 
*                                                                     * 
** INPUT :                                                            * 
*              X3PTR  = LCCB POINTER                                  * 
*                                                                     * 
** CALLING PROGRAMS :                                                 * 
*              PX3LNKDOWN   - STOP LINK                               * 
*              PX3DCEC      - DCE CLEALING STATE                      * 
*              PX3RDTE      - DTE RESET STATE                         * 
*              PX3RINIT     - INITIALIZE A CONNECTION AFTER A RESET   * 
*              PX3PRIMARY   - LEVEL 3 PRIMARY STATE                   * 
*              PX3SECONDARY - LEVEL 3 SECONDARY STATE                 * 
*                                                                     * 
** OUTPUT :                                                           * 
*              LCCB CLEANED UP                                        * 
*                                                                     * 
** EXTERNAL SUBROUTINES :                                             * 
*              PX25CLRQUE   - RELEASE BUFFERS ON GIVEN QUEUE          * 
*              PBCLR        - CLEAR BLOCK OF CORE                     * 
*                                                                     * 
** NOTES :                                                            * 
*              THIS ROUTINE DOES NOT CLEAR THE TCB-LCCB POINTERS      * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PX25FLSHLCCB (X3PTR : B0BUFPTR; X3INIT : BOOLEAN);
VAR 
  X3PTR2 : B0BUFPTR;
  
BEGIN                                       _PROCEDURE PX3INITLCCB     ?
_ 
* * * *  DISCARD DATA BUFFERS IF ANY
? 
_ 
* * * *  DOWNLINE DATA PACKET QUEUE 
? 
PX25CLRQUE (X3PTR'.LCCB.LCDPQR);            _DOWNLINE FRG QUEUE        ?
IF X3PTR'.LCCB.LCTCBPTR " NIL               _IF TCB EXISTS             ?
THEN
  BEGIN 
  X3PTR2 := NIL;
  PBQUEMAIN(X3PTR'.LCCB.LCTCBPTR,           _TCB ADDRESS               ?
            X3PTR2,                         _NIL                       ?
            K4PUTBC);                       _TELL BIP TO SEND BACK     ?
  END;
_ 
* * * *  SUPERVISORY PACKET QUEUE 
? 
PX25CLRQUE (X3PTR'.LCCB.LCSPQR);            _PROTOCOL PACKET QUEUE     ?
X3PTR'.LCCB.LCDPQW := NIL;
X3PTR'.LCCB.LCSPQW := NIL;
X3PTR'.LCCB.LCDFRGCNT := 0; 
_ 
* * * *  CLEAR TCB POINTER IN TIMER PACKET IF ONE EXISTS FOR CLEAR
* * * *  INDICATION 
? 
IF X3PTR'.LCCB.LCTMRPKT " NIL 
THEN
  BEGIN 
  X3TMRPKT.X1BUFACSS := X3PTR'.LCCB.LCTMRPKT; 
  IF X3TMRPKT.X1TMRACSS'.BK2UPTR " NIL      _IF THIS TCB STILL POINTED ?
  THEN                                      _TO BY TIMER PACKET AND    ?
  IF X3PTR'.LCCB.LCINVCLR                   _IF THIS CONNECTION WAS    ?
  THEN                                      _WAITING FOR CLEAR REQUEST ?
    BEGIN                                   _THEN                      ?
    XOPARAMS.XAWC      := D0TCB;            _SEND SVM WORKLIST ENTRY   ?
    XOPARAMS.XADATA    := D5DELETE;         _TO DELETE THIS TCB        ?
    XOPARAMS.XATCBLCCB := 
                X3TMRPKT.X1TMRACSS'.BK2UPTR;
    XOPARAMS.XABFRPTR  := NIL;
    PBLSPUT(XOPARAMS.XAWORKLIST,
                            BYWLCB[B0SMWL]);
    END;
  X3TMRPKT.X1TMRACSS'.BK2UPTR := NIL; 
  END;  _LCTMRPKT " NIL?
  
IF X3INIT 
THEN
  BEGIN 
  PBRELZRO (X3PTR'.LCCB.LCACCTPTR,BEDBSIZE);_RELEASE ACCOUNTING BUFFER ?
  X3PTR2 := X3PTR + 4;                      _SKIP TCB,LCCB POINTERS    ?
  PBCLR (X3PTR2,12);                        _CLEAR OUT LCCB            ?
  X3PTR'.LCCB.LCPHPSTATE := X7READY;        _READY STATE               ?
  END;
END; _ PROCEDURE PX25FLSHLCCB                                          ?
  
_$J+? 
_ 
  
     TTTTTTTTTT  RRRRRRRR      AAAAAA    NN      NN    SSSSSS 
     TTTTTTTTTT  RRRRRRRRR    AAAAAAAA   NNN     NN   SSSSSSSS
         TT      RR      RR  AA      AA  NNNN    NN  SS      SS 
         TT      RR      RR  AA      AA  NN NN   NN  SS 
         TT      RRRRRRRRR   AA      AA  NN  NN  NN  SSSSSSSSS
         TT      RRRRRRRR    AAAAAAAAAA  NN   NN NN   SSSSSSSSS 
         TT      RR   RR     AAAAAAAAAA  NN    NNNN          SS 
         TT      RR    RR    AA      AA  NN     NNN  SS      SS 
         TT      RR     RR   AA      AA  NN      NN   SSSSSSSS
         TT      RR      RR  AA      AA  NN      NN    SSSSSS 
  
  
     LL          EEEEEEEEEE  VV      VV  EEEEEEEEEE  LL 
     LL          EEEEEEEEEE  VV      VV  EEEEEEEEEE  LL 
     LL          EE           VV    VV   EE          LL 
     LL          EE           VV    VV   EE          LL 
     LL          EEEEEEEE      VV  VV    EEEEEEEE    LL 
     LL          EEEEEEEE      VV  VV    EEEEEEEE    LL 
     LL          EE             VVVV     EE          LL 
     LL          EE             VVVV     EE          LL 
     LLLLLLLLLL  EEEEEEEEEE      VV      EEEEEEEEEE  LLLLLLLLLL 
     LLLLLLLLLL  EEEEEEEEEE      VV      EEEEEEEEEE  LLLLLLLLLL 
  
  
                               222222 
                              22222222
                             22      22 
                                     22 
                               2222222
                              2222222 
                             22 
                             22 
                             2222222222 
                             2222222222 
  
  
                 PPPPPPPP      GGGGGG    MM      MM 
                 PPPPPPPPP    GGGGGGGG   MMM    MMM 
                 PP      PP  GG      GG  MMMM  MMMM 
                 PP      PP  GG          MM MMMM MM 
                 PPPPPPPPP   GG    GGGG  MM  MM  MM 
                 PPPPPPPP    GG    GGGG  MM      MM 
                 PP          GG      GG  MM      MM 
                 PP          GG      GG  MM      MM 
                 PP           GGGGGGGG   MM      MM 
                 PP            GGGGGG    MM      MM 
? 
_$J+? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*                    PX2TIMER                                         * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_?
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW :                                                         * 
*              INTERFACE TO BASE SYSTEM TIMERS                        * 
*                                                                     * 
** INPUT :                                                            * 
*              XTSLCB   = SUB LCB POINTER                             * 
*              X2TIM    = TIMER WORKCODE                              * 
*              X2ONOFF  = SET (TRUE) OR CANCEL (FALSE) TIMER          * 
*                                                                     * 
** CALLING PROGRAMS :                                                 * 
*              PX2LINK      - STATION HANDLER (CASE 3 AND 5)          * 
*              PX2SECONDARY - SECONDARY HANDLER (CASE 3 AND 5)        * 
*              PX25LNKDOWN  - STOP LINK                               * 
*              PX2INIT      - INITIALIZE LEVEL 2 STATIONS             * 
*              PX2PRESET    - RESET LEVEL 2 PRIMARY                   * 
*              PX2NRCHECK   - CHECK AN INBOUND N(R)                   * 
*              PX2PRIMARY   - LEVEL 2 PRIMARY STATION (CASE 2 AND 7)  * 
*              PX2SRCHECK   - SECONDARY RESPONSE CHECK                * 
*              PX25TRANS    - MAIN PROGRAM (LEVEL 2)                  * 
*                                                                     * 
** OUTPUT :                                                           * 
*              START OR CANCEL INDICATION TO TIMER SERVICE            * 
*                                                                     * 
** EXTERNAL SUBROUTINES :                                             * 
*              PBTMRSRVS    - TIMER SERVICE                           * 
*                                                                     * 
** NOTES :                                                            * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PX2TIMER (X2TIM : B08BITS; X2ONOFF : BOOLEAN);
  
VAR 
      X2TIMVAL   : INTEGER;                 _TIMER VALUE               ?
  
BEGIN 
IF X2TIM = T1TIMER
THEN                                        _LEVEL 1 TIMER             ?
  BEGIN 
  X2TIMPTR.X1BFPTR := XTSLCB'.BZXSLCB.
                        BZT1PKT;            _GET PACKET ADDRESS        ?
  X2TIMVAL         := XTSLCB'.BZXSLCB.
                        BZT1 * 30;          _GET TIMER VALUE           ?
  END 
ELSE
  BEGIN                                     _REGULATION TIMER          ?
  X2TIMPTR.X1BFPTR := XTSLCB'.BZXSLCB.
                        BZT1PKT + 8;        _GET PACKET ADDRESS        ?
  X2TIMVAL         := 300;                  _GET TIMER VALUE (ONE SEC) ?
  END;
_ 
* * * *  START / STOP THE LEVEL 1 OR THE REGULATION TIMER 
? 
IF X2ONOFF
THEN
  BEGIN 
  IF X2TIMPTR.X3BFPTR'.BKACTIVE 
  THEN                                      _DONT RESTART ACTIVE TIMER ?
    IF ((X2TIM = T1TIMER) & XTSLCB'.BZXSLCB.BZT1RUN) !
       (X2TIM = TREGTIMER)
    THEN
      GOTO 9; 
  X2TIMPTR.X3BFPTR'.BKTYPE := BKSET;        _START TIMER               ?
  IF X2TIM = T1TIMER
  THEN
    XTSLCB'.BZXSLCB.BZT1RUN := TRUE;        _INDICATE T1 RUNNING       ?
  END 
ELSE
  IF (X2TIM = T1TIMER) &                    _IF STOPPING T1 TIMER      ?
     (XTSLCB'.BZXSLCB.BZHSTATE " X7DOWN)
  THEN
    BEGIN                                   _THEN START T1(30) TIMER   ?
    X2TIMVAL := 9000;                       _30 SECONDS                ?
    X2TIMPTR.X3BFPTR'.BKTYPE := BKSET;      _SET TIMER                 ?
    XTSLCB'.BZXSLCB.BZT1RUN := FALSE;       _INDICATE T1(30) RUNNING   ?
    END 
  ELSE
    X2TIMPTR.X3BFPTR'.BKTYPE := BKCANCEL;   _STOP TIMER                ?
  
X2TIMPTR.X3BFPTR'.BKTIME      := X2TIMVAL;  _INSERT TIMER VALUE        ?
X2TIMPTR.X3BFPTR'.BK2USRWRD   :=
  ORD (XTSLCB'.BZXSLCB.BZTWC [X2TIM]) + 1;
IF  X2TIMPTR.X3BFPTR'.BK2USRWRD = $100
 THEN 
   X2TIMPTR.X3BFPTR'.BK2USRWRD := 1;
XTSLCB'.BZXSLCB.BZTWC [X2TIM] :=            _SET COUNTER IN SLCB       ?
  CHR (X2TIMPTR.X3BFPTR'.BK2USRWRD);
PBTMRSRVS (X2TIMPTR.X3BFPTR);               _CALL TIMER SERVICES       ?
  
9:  
  
END; _ PROCEDURE PX2TIMER                                              ?
  
_$J+? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*                    PX2INPUT                                         * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_?
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW :                                                         * 
*              TURN INPUT ON OR OFF                                   * 
*                                                                     * 
** INPUT :                                                            * 
*              XTSLCB     = SUB LCB POINTER                           * 
*              X2CMDPKT   = MUX COMMAND PACKET                        * 
*                                                                     * 
** CALLING PROGRAMS :                                                 * 
*              PX2LINK      - LEVEL 2 LINK STATION (CASE 1 AND 5)     * 
*              PX2LNKDOWN   - STOP LINK                               * 
*                                                                     * 
** OUTPUT :                                                           * 
*              COMMAND PACKET TO COMMAND DRIVER                       * 
*                                                                     * 
** EXTERNAL SUBROUTINES :                                             * 
*              PMCDRV       - COMMAND DRIVER PROGRAM                  * 
*                                                                     * 
** NOTES :                                                            * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PX2INPUT( X2ONOFF : BOOLEAN );
BEGIN 
X2CMDPKT.NKLINO := XTLCB'.BZLINO.BDLINO;
IF X2ONOFF                                  _START INPUT               ?
THEN
  BEGIN 
  X2CMDPKT.NKCMD  := NKENBL;                _ENABLE LINE               ?
  X2CMDPKT.NKNOXL := FALSE;                 _NO TRANSLATION            ?
  X2CMDPKT.NKIFCD := 8;                     _FCD FOR FIRST BUFFER      ?
  PMCDRV(X2CMDPKT); 
  X2CMDPKT.NKCMD   := NKINPT;               _INPUT COMMAND             ?
  X2CMDPKT.NKRPRT  := FALSE;                _NO PARITY STRIP           ?
  X2CMDPKT.NKMVB   := FALSE;                _MOVE IN USER FLAGS        ?
  X2CMDPKT.NKISTAI := 4;                    _FIRST STATE INDEX         ?
  X2CMDPKT.NKISPTA := X5ISPTA;              _STATE TABLE ADDRESS       ?
  END 
ELSE
  BEGIN                                     _TERMINATE INPUT           ?
  X2CMDPKT.NKCMD    := NKENDIN;             _TERMINATE INPUT           ?
  X2CMDPKT.NKRELBFS := TRUE;                _RELEASE INPUT BUFFERS     ?
  X2CMDPKT.NKWKFLG  := TRUE;                _WORKLIST BACK TO TIP      ?
  X2CMDPKT.NKWLINDX := B0XTRANS;
  X2CMDPKT.NKWKCOD  := L2TERMIO;
  END;
PMCDRV(X2CMDPKT); 
END; _ PROCEDURE PX2INPUT                                              ?
  
_$J+? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*                    PX25LNKDOWN                                      * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW :                                                         * 
*              DISCARD INBOUND PACKET AND STOP LINK LEVEL             * 
*                                                                     * 
** INPUT :                                                            * 
*              X3IPKPTR  = INPUT PACKET POINTER                       * 
*              XTLCB     = LCB ADDRESS                                * 
*                                                                     * 
** CALLING PROGRAMS :                                                 * 
*              PX2PRIMARY   - LEVEL 2 PRIMARY STATION (CASE 7)        * 
*              PX2LINK      - LINK CONTROL STATION (CASE 6 AND 8)     * 
*              PX3HDPROCESS - PROCESS PACKET HEADER                   * 
*              PX25TRANS    - MAIN PROGRAM (LEVEL 2)                  * 
*                                                                     * 
** OUTPUT :                                                           * 
*              INPUT PACKET RELEASED                                  * 
*              TERMINATE OUTPUT COMMAND PACKET                        * 
*              CANCELING TIMER                                        * 
*                                                                     * 
** EXTERNAL SUBROUTINES :                                             * 
*              PX2FLSHLCCB  - CLEAN LCCB FIELDS                       * 
*              PX2TIMER     - TIMER INTERFACE                         * 
*              PX2INPUT     - TURN INPUT ON OR OFF                    * 
*              PBRELZRO     - RELEASE CHAIN OF BUFFERS                * 
*              PMCDRV       - COMMAND DRIVER                          * 
*                                                                     * 
** NOTES :                                                            * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PX25LNKDOWN;
  
VAR 
      X3LCCB  : B0BUFPTR;                   _WORKING LCCB POINTER      ?
      X3INDEX : INTEGER;                    _FOR LOOP INDEX            ?
      X3CNT   : INTEGER;                    _LIMIT OF FOR LOOP         ?
  
BEGIN 
PBRELZRO(X3IPKPTR.X1BFPTR,BEDBSIZE);        _RELEASE INBOUND PACKET    ?
  
WITH XTSLCB'.BZXSLCB DO 
  BEGIN 
  BZHSTATE := X7DOWN;                       _LINK IS DOWN              ?
  PX2TIMER(T1TIMER,FALSE);                  _STOP T1                   ?
  PX2TIMER(TREGTIMER,FALSE);                _STOP TREG                 ?
  X2CMDPKT.NKLINO  := XTLCB'.BZLINO.        _TURN OFF OUTPUT           ?
                                 BDLINO;
  X2CMDPKT.NKCMD   := NKENDOUT;             _TERMINATE OUTPUT          ?
  X2CMDPKT.NKWKFLG := FALSE;
  PMCDRV (X2CMDPKT);
  PX2INPUT(FALSE);                          _TURN OFF INPUT            ?
  
  BZPKLUP := FALSE;                         _LINK IS DOWN              ?
  BZDCES  := FALSE;                         _RESET DCE RESTARTING      ?
  X3LCCB  := BZFLCCB;                       _FIRST ATTACHED LCCB       ?
  X3CNT   := BZLPVC + BZLSVC;               _LCCB COUNT                ?
  
  FOR X3INDEX := 0 TO X3CNT DO              _FOR ALL LCCBS             ?
    BEGIN 
    PX25FLSHLCCB(X3LCCB,TRUE);              _INITIALIZE ONE LCCB       ?
    X3LCCB := X3LCCB'.LCCB.LCNXTLCCB;       _GET NEXT LCCB             ?
    END; _ FOR X3INDEX                                                 ?
  END; _ WITH XTSLCB                                                   ?
END; _ PROCEDURE PX25LNKDOWN                                           ?
  
_$J+? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*                    PX2INIT                                          * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_?
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW :                                                         * 
*              INITIALIZE PRIMARY SIDE OF THE STATION                 * 
*              INITIALIZE SECONDARY SIDE OF A STATION                 * 
*                                                                     * 
** INPUT :                                                            * 
*              XTSLCB       - SUB LCB POINTER                         * 
*                                                                     * 
** CALLING PROGRAMS :                                                 * 
*              PX2LINK      - STATION HANDLER (CASE 7)                * 
*              PX2SECONDARY - LEVEL 2 SECONDARY HANDLER (CASE 2)      * 
*              PX2PRIMARY   - LEVEL 2 PRIMARY HANDLER (CASE 6)        * 
*                                                                     * 
** OUTPUT :                                                           * 
*              NONE                                                   * 
*                                                                     * 
** EXTERNAL SUBROUTINES :                                             * 
*              PX2TIMER     - TIMER HANDLER                           * 
*              PX25CLRQUE   - RELEASE FRAMES IN SUB LCB               * 
*              PBREL1BF     - RELEASE A BUFFER                        * 
*                                                                     * 
** NOTES :                                                            * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PX2INIT;
VAR 
      X2CNT : INTEGER;
      X2TOP : X0BUFPTR; 
      X2NXT : X0BUFPTR; 
      X2CUR : X0BUFPTR; 
      X2FRQ : ARRAY[0..7] OF B0BUFPTR;
BEGIN 
WITH XTSLCB'.BZXSLCB DO                     _SUB LCB POINTER           ?
  BEGIN 
_ 
* * * *  INITIALIZE PRIMARY SIDE
? 
  BZPSTATE := X8OPER;                       _OPERATIONAL               ?
  PX2TIMER(T1TIMER,FALSE);                  _STOP T1                   ?
  BZPOLL := FALSE;                          _CLEAR POLL CONDITION      ?
  BZRIP  := FALSE;                          _RESET IN PROGRESS         ?
  BZREJ  := FALSE;                          _RESET REJ RCV FLAG        ?
  IF BZRXMT                                 _IF RETRANSMITTING         ?
  THEN
    BZVS := BZLFTR;                         _RESTORE V(S) TO ORIGINAL  ?
  IF BZVS = BZLNRR                          _INITIAL OR NO FRAME PEND  ?
  THEN
    BEGIN 
    FOR X2CNT := 0 TO 7 DO                  _CLEAR FRQ                 ?
      PBRELZRO (BZFRQ[X2CNT],BEDBSIZE); 
    END 
  ELSE                                      _FRAMES PENDING            ?
    BEGIN 
    FOR X2CNT := 0 TO 7 DO
      X2FRQ[X2CNT] := BZFRQ[X2CNT];         _COPY PENDING FRAMES       ?
    FOR X2CNT := 0 TO 7 DO
      BZFRQ[X2CNT] := X2FRQ[(X2CNT+BZLNRR) MOD 8]; _SHIFT AROUND FRAMES?
    BZLFTR := (8 + BZVS - BZLNRR) MOD 8;    _NUMBER OF PENDING FRAMES  ?
    BZRXMT := TRUE;                         _FLAG RETRANSMISSION       ?
    END;
  BZVS   := 0;                              _RESET V(S)                ?
  BZLNRR := 0;                              _RESET LAST N(R)           ?
_ 
* * * *  INITIALIZE SECONDARY SIDE
? 
  BZSSTATE := X9OPER;                       _SECONDARY OPER            ?
  BZVR     := 0;                            _CLEAR V(R)                ?
  BZLNRS   := 0;                            _CLEAR LAST N(R)           ?
  X2TOP.X1BFPTR := NIL; 
  X2NXT.X1BFPTR := NIL; 
  WHILE BZSFQR " NIL DO                     _LOOP UNTIL END            ?
    BEGIN 
    X2CUR.X1BFPTR := BZSFQR;                _GET NEXT FRAME            ?
    BZSFQR        := BZSFQR'.               _DEQUEUE IT                ?
                            BCCHAINS[QCHN]; 
    IF X2CUR.X2BFPTR'.XBFRHDR.XFSU          _IF NOT RR,RNR,REJ         ?
    THEN
      BEGIN 
      IF X2TOP.X1BFPTR = NIL                _TOP OF NEW CHAIN          ?
      THEN
        BEGIN 
        X2TOP.X1BFPTR := X2CUR.X1BFPTR; 
        X2NXT.X1BFPTR := X2CUR.X1BFPTR; 
        END 
      ELSE
        X2NXT.X1BFPTR'.BCCHAINS[QCHN] := X2CUR.X1BFPTR; 
      X2NXT.X1BFPTR := X2CUR.X1BFPTR; 
      END _ NUMBERED FRAME                                             ?
    ELSE
      PBREL1BF(X2CUR.X1BFPTR,BEDBSIZE);     _DISCARD IT                ?
    END; _ WHILE BZSFQR " NIL                                          ?
  
  BZSFQR := X2TOP.X1BFPTR;                  _TOP OF NEW CHAIN          ?
  BZSFQW := X2NXT.X1BFPTR;                  _BOTTOM OF NEW CHAIN       ?
  PX2TIMER(TREGTIMER,FALSE);                _STOP TREG                 ?
  END; _ WITH XTSLCB'.BZXSLCB                                          ?
END; _ PROCEDURE PX2INIT                                               ?
  
_$J+? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*                    PX2GPF                                           * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_?
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW :                                                         * 
*              GENERATES A PROTOCOL FRAME, THEN STORES                * 
*              A FRAME TO THE FSQ POINTER FOR TRANSMISSION            * 
*                                                                     * 
** INPUT :                                                            * 
*              X2OFRTYP  = TYPE OF FRAME TO BE GENERATED              * 
*              XTSLCB    = SUB LCB POINTER                            * 
*              X2OPF     = POLL/FINAL BIT                             * 
*                                                                     * 
** CALLING PROGRAMS :                                                 * 
*              PX2LINK      - STATION CONTROL                         * 
*                              (CASE 1, 2, 3, 4, 5, 9, 10 AND 12)     * 
*              PX2SECONDARY - LEVEL 2 SECONDARY HANDLER               * 
*                              (CASE 1,2,3 AND 5)                     * 
*              PX2PRIMARY   - LEVEL 2 PRIMARY HANDLER (CASE 6)        * 
*              PX2PRESET    - RESET LEVEL 2 PRIMARY STATION           * 
*              PX2SRESET    - RESET LEVEL 2 SECONDARY STATION         * 
*              PX2SRCHECK   - LEVEL 2 SECONDARY RESPONSE CHECK        * 
*                                                                     * 
** OUTPUT :                                                           * 
*              A PROTOCOL FRAME                                       * 
*                                                                     * 
** EXTERNAL SUBROUTINES :                                             * 
*              PBGET1BF     - GET ONE BUFFER                          * 
*              PX25XMIT     - TRANSMITTER                             * 
*                                                                     * 
** NOTES :                                                            * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PX2GPF( X2OFRTYP : B08BITS; X2OPF : BOOLEAN );
  
VAR 
      X2OFRMRSP : BOOLEAN;
      X2VR      : B03BITS;                  _V(R) OWNER RETURNED VALUE ?
BEGIN 
  
X2FRPTR.X1BFPTR := PBGET1BF(BEDBSIZE);      _GET ONE BUFFER            ?
  
WITH X2FRPTR.X2BFPTR'.XBFRHDR,              _FRAME HEADER              ?
     XTSLCB'.BZXSLCB DO                     _SUB LCB POINTER           ?
  
  BEGIN 
  X2FRPTR.X2BFPTR'.XBT1 := FALSE;           _RESET T1 REQUEST          ?
  X2FRPTR.X1BFPTR'.                         _CLEAR QCHN                ?
         BCCHAINS[QCHN] := NIL; 
  X2OFRSET              := [X2OFRTYPE];     _SET TO PROPER VALUE       ?
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*        SET EXTERNAL FRAME TYPE                                      * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
  
  XFTYP     := X2FRMID[X2OFRTYPE];          _OUTBOUND FRAME TYPE       ?
  X2OFRMRSP := TRUE;                        _DEFAULT TO RESPONSE FRAME ?
  XFPF      := X2OPF;                       _SET POLL/FINAL BIT        ?
  IF ([X2SABM,X2DISC,X2CRR,X2CRNR,X2CREJ] & X2OFRSET) " [ ] 
  THEN                                      _IF COMMAND                ?
    BEGIN 
    IF ([X2SABM,X2DISC] & X2OFRSET) " [ ]   _FOR SABM AND DISC         ?
    THEN
      X2FRPTR.X2BFPTR'.XBT1 := TRUE;        _START T1 TIMER            ?
    BZPOLL := X2OPF;                        _REMEMBER POLL CONDITION   ?
    X2OFRMRSP := FALSE;                     _COMMAND FRAMES            ?
    END;
  
  IF BZDCE
  THEN
    X2OFRMRSP := NOT X2OFRMRSP;             _SWITCH STATION SIDES      ?
  
  XFA := XB;                                _SET DEFAULT ADDRESS       ?
  IF X2OFRMRSP
  THEN
    XFA := XA;                              _ADDRESS A                 ?
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*        INSERT N(R) IN NUMBERED FRAMES                               * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
  IF ([X2RR,X2RNR,X2REJ,X2CRR,X2CRNR,X2CREJ] & X2OFRSET) " [ ]
  THEN
    BEGIN 
    X2VR   := BZVR;                         _GET V(R)                  ?
    XFNR   := X2VR;                         _SET FRAME N(R)            ?
    BZLNRS := BZVR;                         _UPDATE LAST N(R)          ?
    END;
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                   * 
*        INSERT FCD/LCD (DEFAULT VALUE)                             * 
*                                                                   * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
  X2FRPTR.X1BFPTR'.BIINT[1] := $0908;       _DEFAULT TO 08-09          ?
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*        FORMAT FRMR FRAME                                            * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
  IF ([X2FRMR] & X2OFRSET) " [ ]            _FRMR FRAME                ?
  THEN
    BEGIN 
    X2FRPTR.X1BFPTR'.BFLCD := 12;           _SPECIAL LCD FOR FRMR      ?
    XFCB2 := 0; 
    XCVR  := BZVR;                          _INSERT V(R)               ?
    XCVS  := BZVS;                          _INSERT V(S)               ?
    XCTYP := X2IFRHDR.XFTYP;                _GET INBOUND TYPE          ?
_ 
* * * *  SET W-X-Y-Z FIELDS AND COMMAND/RESPONSE FLAG 
? 
    XFCB3 := X2RJCODE;                      _SET W-X-Y-Z FIELD         ?
    XCF   := X2CMDRSP;                      _SET COMMAND/RESPONSE FLAG ?
    END; _ FRMR FRAME                                                  ?
  
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*        CALL SFQ MANAGER                                             * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
  IF BZSFQR = NIL 
  THEN
    BZSFQR := X2FRPTR.X1BFPTR               _UPDATE READ POINTER       ?
  ELSE                                      _QUEUE NON EMPTY           ?
    BZSFQW'.BCCHAINS[QCHN] := X2FRPTR.X1BFPTR;
  BZSFQW := X2FRPTR.X1BFPTR;                _UPDATE END OF CHAIN       ?
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*        INITIATE TRANSMISSION                                        * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
  PX25XMIT (XTLCB, 0);
  END; _ WITH...                                                       ?
END; _ PROCEDURE PX2GPF                                                ?
  
_$J+? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*                    PX2PRESET                                        * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_?
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW :                                                         * 
*              RESET PRIMARY SIDE OF A STATION                        * 
*              AND SECONDARY SIDE OF A STATION                        * 
*                                                                     * 
** INPUT :                                                            * 
*              XTSLCB   = SUB LCB POINTER                             * 
*                                                                     * 
** CALLING PROGRAMS :                                                 * 
*              PX2PRIMARY   - EVE 2 PRIMARY HANDLER (CASE 3 AND 4)    * 
*                                                                     * 
** OUTPUT :                                                           * 
*              BZPSTATE  = X8RESET                                    * 
*              SABM FRAME SENT                                        * 
*                                                                     * 
** EXTERNAL SUBROUTINES :                                             * 
*              PX2GPF       - GENERATE PROTOCOL FRAME                 * 
*              PX2TIMER     - TIMER INTERFACE                         * 
*                                                                     * 
** NOTES :                                                            * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PX2PRESET;
  
BEGIN 
WITH XTSLCB'.BZXSLCB DO                     _SUB LCB POINTER           ?
  BEGIN 
  IF BZPSTATE " X8RESET                     _NOT ALREADY IN RESET      ?
  THEN
  BEGIN 
    BZPSTATE := X8RESET;                    _RESET STATE               ?
    BZSSTATE := X9RESET;                    _RESET SECONDARY STATE     ?
    BZRC     := 0;                          _CLEAR RC                  ?
    BZRIP    := TRUE;                       _RESET IN PROGRESS         ?
    PX2TIMER(T1TIMER,FALSE);                _STOP T1                   ?
    PX2GPF(X2SABM,TRUE);                    _SEND SABM (P=1)           ?
    END; _ IF BZPSTATE                                                 ?
  END; _ WITH XTSLCB'.BZXSLCB                                          ?
END; _ PROCEDURE PX2PRESET                                             ?
  
_$J+? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*                    PX2NRCHECK                                       * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_?
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW :                                                         * 
*              CHECKS AN INBOUND N(R)                                 * 
*                                                                     * 
** INPUT :                                                            * 
*              XTSLCB     = SUB LCB POINTER                           * 
*              X2IFRHDR   = INBOUND FRAME HEADER                      * 
*                                                                     * 
** CALLING PROGRAMS :                                                 * 
*              PX2PPROCESSOR -PRIMARY PROCESSOR                       * 
*                                                                     * 
** OUTPUT :                                                           * 
*              X2NRSP  = RETURNED CODE                                * 
*                                                                     * 
** EXTERNAL SUBROUTINES :                                             * 
*              PX2TIMER     - BASE TIMERS INTERFACE                   * 
*              PBRELZRO     - RELEASE CHAIN OF BUFFER CHECK NIL FIRST * 
** NOTES :                                                            * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PX2NRCHECK; 
  
VAR 
      X2IVS    : INTEGER; 
      X2INR    : INTEGER; 
      X2ILNRR  : INTEGER; 
      X2VSCODE : INTEGER; 
      X2CKNR   : ARRAY [BOOLEAN,BOOLEAN] OF INTEGER;
  
VALUE 
      X2CKNR  = (X3NNR,                     _NEW N(R) RECEIVED         ?
                 X3NVSENR,                  _V(S) = N(R) AND NEW N(R)  ?
                 X3ONR,                     _OLD N(R) RECEIVED         ?
                 X3VSENR);                  _V(S) = N(R) RECEIVED      ?
  
PROCEDURE UPLSTNR;
  
BEGIN 
WITH XTSLCB'.BZXSLCB DO 
  BEGIN 
  WHILE BZLNRR " X2IFRHDR.XFNR DO           _NEW N(R) RECEIVED         ?
    BEGIN 
    PBRELZRO(BZFRQ[BZLNRR],BEDBSIZE);       _UP TO N(R)-1              ?
    BZLNRR := BZLNRR + 1;                   _UPDATE LAST N(R) RECEIVED ?
    END; _ WHILE BZLNRR " X2IFRHDR.XFNR                                ?
  END; _ WITH XTSLCB.BZXSLCB                                           ?
END;  _ PROCEDURE UPLSTNR                                              ?
  
BEGIN 
WITH XTSLCB'.BZXSLCB DO                     _SUB LCB POINTER           ?
  BEGIN 
  X2VSCODE := 0;
  X2IVS    := BZVS; 
  X2INR    := X2IFRHDR.XFNR;
  X2ILNRR  := BZLNRR; 
  IF X2IVS < X2ILNRR
  THEN
    BEGIN 
    X2IVS := X2IVS + 8; 
    IF X2ILNRR > X2INR
    THEN
      X2INR := X2INR + 8; 
    END;
  
  IF (X2INR < X2ILNRR)                      _N(R) LESS THAN LAST N(R)  ?
            !                               _ RECEIVED  OR             ?
     (X2IVS < X2INR)                        _ GREATER THAN V(S)        ?
  THEN
    X2VSCODE := X3BNR 
  ELSE                                      _N(R) IN BOUND             ?
    BEGIN 
    X2INR := X2IFRHDR.XFNR; 
_ 
* * * *  FIND CONDITION OF N(R) 
? 
    X2VSCODE := X2CKNR [(X2INR = X2ILNRR), (X2INR = BZVS)]; 
    END;
  
  CASE BZPSTATE OF                          _PRIMARY STATE             ?
  
    X8OPER,                                 _OPERATIONAL               ?
    X8RCOVR:                                _RECOVERY STATE            ?
      BEGIN 
  
      CASE X2VSCODE OF                      _V(S) OWNER CODE           ?
  
        X3BNR:                              _BAD N(R)                  ?
          X2NRSP := X9NR;                   _RESET PRIMARY SIDE        ?
  
        X3NNR,                              _NEW N(R)                  ?
        X3NVSENR,                           _V(S)=N(R) AND NEW N(R)    ?
        X3VSENR:                            _V(S) = N(R)               ?
          BEGIN 
          IF (BZPSTATE = X8OPER) !          _OPERATIONAL STATE         ?
             (X2CMDRSP)                     _ OR A RESPONSE            ?
          THEN
            BEGIN 
            UPLSTNR;                        _UPDATE LAST N(R) RECEIVED ?
            PX2TIMER(T1TIMER,FALSE);        _STOP T1                   ?
            IF BZRXMT                       _RETRANSMITTING            ?
            THEN
              BEGIN 
              IF BZVS " BZLFTR              _NOT ALL BACKED            ?
              THEN
                PX2TIMER(T1TIMER,TRUE);     _RESTART T1                ?
              END 
            ELSE                            _NORMAL STATE              ?
              BEGIN 
              IF X2VSCODE = X3NNR           _N(R) " V(S)               ?
              THEN
                PX2TIMER(T1TIMER,TRUE);     _RESTART T1                ?
              END; _ IF BZRXMT                                         ?
            BZRC   := 0;                    _CLEAR RXMIT COUNTER       ?
            END;
          X2NRSP := X9NP;                   _GOOD RESPONSE             ?
          END; _ X3NNR,X3NVSENR,X3VSNENR                               ?
  
        X3ONR:                              _OLD N(R)                  ?
          X2NRSP := X9NP;                   _PROVIDE GOOD RESPONSE     ?
  
        END; _ CASE X2VSCODE                                           ?
      END; _ X8OPER,X8RCOVR                                            ?
  
    X8RBUSY:                                _REMOTE BUSY               ?
      IF X2VSCODE = X3BNR                   _CHECK ONLY N(R)           ?
      THEN
        X2NRSP := X9NR                      _RESET PRIMARY             ?
      ELSE
        BEGIN 
        X2NRSP := X9NP;                     _CONTINUE                  ?
        IF X2VSCODE " X3ONR                 _NOT OLD N(R)              ?
        THEN
          BEGIN 
          UPLSTNR;                          _UPDATE LAST N(R) RECEIVED ?
          PX2TIMER(T1TIMER,FALSE);          _STOP T1                   ?
          IF X2VSCODE = X3NNR               _NEW N(R) BUT DIDN T       ?
          THEN
            PX2TIMER(T1TIMER,TRUE);         _BACK ALL FRAMES           ?
          END;
        END;
  
      END; _ CASE BZPSTATE                                             ?
  
  END; _ WITH XTSLCB'.BZXSLCB                                          ?
END; _ PROCEDURE PX2NRCHECK                                            ?
  
_$J+? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*                    PX2SRESET                                        * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_?
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW :                                                         * 
*              RESET SECONDARY SIDE OF A STATION                      * 
*                                                                     * 
** INPUT :                                                            * 
*              XTSLCB     = SUB LCB POINTER                           * 
*                                                                     * 
** CALLING PROGRAMS :                                                 * 
*              PX2PRIMARY    - LEVEL 2 PRIMARY HANDLER (CASE 8)       * 
*              PX2PPROCESSOR - LEVEL 2 PRIMARY PROCESSOR              * 
*              PX2SPROCESSOR - LEVEL 2 SECONDARY PROCESSOR            * 
*                                                                     * 
** OUTPUT :                                                           * 
*              NONE                                                   * 
*                                                                     * 
** EXTERNAL SUBROUTINES :                                             * 
*              PX2GPF       - GENERATE PROTOCOL FRAME                 * 
*                                                                     * 
** NOTES :                                                            * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PX2SRESET;
BEGIN 
IF XTSLCB'.BZXSLCB.BZPSTATE " X8RESET       _IF NOT IN RESET STATE     ?
THEN
  BEGIN 
  XTSLCB'.BZXSLCB.BZSSTATE := X9RESET;      _RESET STATE               ?
  PX2GPF(X2FRMR,X2IPF);                     _SEND FRMR                 ?
  END;
END; _ PROCEDURE PX2SRESET                                             ?
  
_$J+? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*                    PX2PRIMARY                                       * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_?
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW :                                                         * 
*              PX2PRIMARY IS CALLED TO SET UP                         * 
*              THE PRIMARY EVENT CODE, FETCH THE ACTION TABLE         * 
*              INDEX AND THEN CALL THE PRIMARY PROCESSOR.             * 
*                                                                     * 
** INPUT :                                                            * 
*              X2PCODE  = PRIMARY EVENT CODE                          * 
*              XTSLCB   = SUB LCB POINTER                             * 
*              XPMATRIX = PRIMARY STATES TRANSITION TABLE             * 
*                                                                     * 
** CALLING PROGRAMS :                                                 * 
*              PX2PPROCESSOR - LEVEL 2 PRIMARY PROCESSOR              * 
*              PX2RECEIVER   - CHECK FOR INCOMING FRAME AND           * 
*                              EXPIRATION OF TIMER                    * 
*                                                                     * 
** OUTPUT :                                                           * 
*              BZPEVENT = X2PCODE(PRIMARY EVENT CODE)                 * 
*                                                                     * 
** EXTERNAL SUBROUTINES :                                             * 
*              PX2TIMER     - TIMER INTERFACE                         * 
*              PX25MSG      - MESSAGE TO NAM DAYFILE                  * 
*              PX2PRESET    - LEVEL 2 PRIMARY RESET                   * 
*              PX2SRESET    - LEVEL 2 SECONDARY RESET                 * 
*              PX2INIT      - INITIALIZE LEVEL 2 STATIONS             * 
*              PX25LNKDOWN  - BRING LINK DOWN                         * 
*              PX2GFP       - GENERATE A FRAME                        * 
*                                                                     * 
** NOTES :                                                            * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PX2PRIMARY; 
  
VAR 
      X2IVS   : INTEGER;
      X2INR   : INTEGER;
      X2PCASE : INTEGER;
  
BEGIN 
WITH XTSLCB'.BZXSLCB DO                     _SUB LCB POINTER           ?
  
  BEGIN 
  BZPEVENT := X2PCODE;                      _STORE EVENT CODE          ?
  X2PCASE  := XPMATRIX[BZPSTATE,BZPEVENT];  _GET ACTION                ?
_ 
  
                 II OPERATIONAL I REMOTEBUSY I RECOVER I RESET I
      +----------++-------------+------------+---------+-------+
      +----------++-------------+------------+---------+-------+
      I PRR      II      0      I     5      I    2    I   0   I
      +----------++-------------+------------+---------+-------+
      I PRNR     II      1      I     0      I    1    I   0   I
      +----------++-------------+------------+---------+-------+
      I PREJ     II      2      I     2      I    2    I   0   I
      +----------++-------------+------------+---------+-------+
      I PFRMR    II      3      I     3      I    3    I   0   I
      +----------++-------------+------------+---------+-------+
      I PUA      II      8      I     8      I    6    I   6   I
      +----------++-------------+------------+---------+-------+
      I PNR      II      0      I     0      I    0    I   0   I
      +----------++-------------+------------+---------+-------+
      I PT1      II      4      I     4      I    4    I   7   I
      +----------++-------------+------------+---------+-------+
? 
  
  CASE X2PCASE OF                           _ACTION CODE               ?
  
    1:                                      _REMOTE BUSY               ?
      BEGIN 
      BZPSTATE := X8RBUSY;
      BZRC     := 0;                        _ALLOW POLLING FOREVER     ?
      END; _ REMOTE BUSY                                               ?
  
    2:                                      _REJECT                    ?
      IF BZREJ = FALSE                      _DISCARD REPEATED REJ FRAME?
      THEN
        BEGIN 
        IF BZPEVENT = X8REJ                 _REAL REJ FRAME            ?
        THEN
          BEGIN 
          PX2TIMER (T1TIMER,FALSE);         _STOP T1                   ?
          BZREJ := (BZVS " X2IFRHDR.XFNR);  _ KEEP TRACK OF IT         ?
          END;
        BZPSTATE := X8OPER;                 _OPERATIONAL STATE         ?
        IF BZVS " X2IFRHDR.XFNR             _RETRANSMIT                ?
        THEN
          BEGIN 
          IF BZRXMT = FALSE                 _NOT ALREADY RETRANSMITTING?
          THEN
            BZLFTR := BZVS                  _REMEMBER LAST V(S)        ?
          ELSE                              _RETRANSMITION PENDING     ?
            BEGIN 
            X2IVS := BZVS;                  _HIGHEST FRAME CURRENTLY   ?
                                            _ RETRANSMITTING           ?
            X2INR := BZLFTR;                _HIGHEST FRAME PREVIOUSLY  ?
                                            _ SENT                     ?
            IF BZLNRR > X2IVS               _ADJUST VALUES TO CHECK    ?
            THEN                            _ WHETHER MORE I-FRAMES    ?
              X2IVS := X2IVS + 8;           _ HAVE BEEN RETRANSMITTED  ?
                                            _ THIS TIME                ?
            IF BZLNRR > X2INR               _MORE I-FRAMES RE-XMITTED  ?
            THEN                            _ THIS TIME                ?
              X2INR := X2INR + 8; 
  
            IF X2IVS > X2INR                _MORE I-FRAMES XMITTED     ?
            THEN                            _ THIS TIME                ?
              BZLFTR := BZVS;               _REMEMBER CURRENT V(S)     ?
            END; _ IF NOT BZRXMT                                       ?
          BZVS   := X2IFRHDR.XFNR;          _BACKSPACE V(S)            ?
          BZRXMT := TRUE;                   _SET RE-XMT CONDITION      ?
          END;
        END; _ REJECT                                                  ?
  
    3:                                      _PRIMARY RESET             ?
      IF X2IFRHDR.XCY                       _*PSN IS REJECTING I-FRAME*?
      THEN                                  _*LINK DOWN WITH MESSAGE. *?
        BEGIN                               _*RETRANSMITTING THE SAME *?
        PX25MSG(2);                         _*FRAME WILL FORCE THE    *?
        PX25LNKDOWN;                        _*SAME ERROR TO REPEAT FOR*?
        END                                 _*EVER.                   *?
      ELSE
        PX2PRESET;                          _RESET PRIMARY             ?
  
    4:                                      _POLL                      ?
      BEGIN 
      BZRC := BZRC + 1;                     _UPDATE RC                 ?
      IF BZRC = BZN2                        _LIMIT REACHED             ?
      THEN
        BEGIN 
        BZDTEPOLL := FALSE; 
        PX2PRESET;                          _RESET PRIMARY             ?
        END 
      ELSE
        IF BZDTEPOLL ! (BZT1RUN = FALSE)
        THEN
          BEGIN 
          BZDTEPOLL := TRUE;                _INDICATE T1(30) EXPIRED   ?
          PX2GPF(X2CRR,TRUE);               _SEND RR (P=1)             ?
          PX2TIMER(T1TIMER,TRUE);           _START T1                  ?
          END 
        ELSE
          BZPSTATE := X8RCOVER;             _RECOVER STATE             ?
      END; _ POLL                                                      ?
  
    5:                                      _REMOTE READY              ?
      BZPSTATE := X8OPER;                   _BACK TO OPER              ?
  
    6:                                      _RESTART CHANNELS          ?
      IF X2IPF = BZPOLL 
      THEN
        IF BZRIP                            _RESET IN PROGRESS         ?
        THEN
          BEGIN 
          BZPOLL := FALSE;                  _CLEAR POLL CONDITION      ?
          PX2INIT;                          _INITIALIZE PRIMARY        ?
        _ X2RSWC := X9PR;                    PRIMARY RESET             ?
        _ NOTE RESTART CHANNELS PROTOCOLS ARE NOT USED AT PRESENT      ?
          PX25MSG (1);                      _ALARM MESSAGE             ?
          END; _ RESTART CHANNELS                                      ?
  
    7:                                      _SEND SABM                 ?
      BEGIN 
      PX2TIMER (T1TIMER,FALSE);             _STOP T1                   ?
      BZRC := BZRC + 1;                     _UPDATE RC                 ?
      IF BZRC = BZN2                        _LIMIT REACHED             ?
      THEN
        BEGIN 
_ 
* * * * UNABLE TO COMPLETE THE RESET SEQUENCE. STOP THE LINK
? 
        PX25MSG (2);                        _LINK INOPERATIVE          ?
        PX25LNKDOWN;                        _STOP THE LINK             ?
        END 
      ELSE
        PX2GPF (X2SABM,TRUE);               _SEND SABM (P=1)           ?
      END; _ SEND SABM                                                 ?
  
    8:                                      _SEND FRMR - UNSOLICITED UA?
      PX2SRESET;
  
    END; _ CASE X2PCASE                                                ?
  
END; _ WITH XTSLCB'.BZXSLCB                                            ?
END; _ PROCEDURE PX2PRIMARY                                            ?
  
_$J+? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*                    PX2PPROCESSOR                                    * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_?
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW :                                                         * 
*              PROCESS ALL INBOUND PRIMARY FRAMES                     * 
*                                                                     * 
** INPUT :                                                            * 
*              XTSLCB      = SUB LCB POINTER                          * 
*              X2IFRTYP    = INBOUND FRAME TYPE                       * 
*                                                                     * 
** CALLING PROGRAMS :                                                 * 
*              PX2RECEIVER  - LEVEL 2 INCOMING FRAME RECEIVER         * 
*                                                                     * 
** OUTPUT :                                                           * 
*              NONE                                                   * 
*                                                                     * 
** EXTERNAL SUBROUTINES :                                             * 
*              PX2SRESET    - LEVEL 2 SECONDARY RESET                 * 
*              PX2NRCHECK   - CHECK INBOUND N(R)                      * 
*              PX2PRIMARY   - EXECUTE PRIMARY ACTION STATES           * 
*                                                                     * 
** NOTES :                                                            * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PX2PPROCESSOR;
VAR 
      X2FRSP : INTEGER; 
      PEVENT : ARRAY[0..9] OF INTEGER;
VALUE 
      PEVENT = (0,6,1,2,3,0,0,0,5,4); 
BEGIN 
WITH XTSLCB'.BZXSLCB DO                     _SUB LCB POINTER           ?
  
  BEGIN 
  
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*        PRIMARY EVENT TRANSLATION                                    * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
  X2PCODE := PEVENT[X2IFRTYP];
  
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*        CHECK FOR UNKNOWN RESPONSE AND BAD LENGTH                    * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
  IF X2CRKNOWN = FALSE                      _UNKNOWN RESPONSE          ?
  THEN
    PX2SRESET                               _SEND FRMR                 ?
  ELSE
    IF X2IFLOK                              _CORRECT LENGTH COMMANDS   ?
    THEN                                    _AND RESPONSES             ?
      BEGIN 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*        CHECK F BIT AND NEW N(R)                                     * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
      X2FRSP := X9FP; 
      IF X2CMDRSP                           _RESPONSE FRAME            ?
      THEN
        IF X2IPF
        THEN
          BEGIN 
          IF BZPOLL = FALSE                 _POLL BIT NOT SET          ?
          THEN
            X2FRSP := X9FR;                 _RESET                     ?
          END 
        ELSE
          IF BZPOLL                         _POLL BIT SET              ?
          THEN
            X2FRSP := X9FI;                 _IGNORE                    ?
  
      IF X2FRSP = X9FP                      _CORRECT F BIT             ?
      THEN
        BEGIN 
        IF (X2PCODE " X8UA) & 
           (X2PCODE " X8FRMR) 
        THEN
          BEGIN 
          PX2NRCHECK;                       _CHECK INBOUND N(R)        ?
          IF X2NRSP = X9NR                  _BAD N(R)                  ?
          THEN
            BEGIN 
            X2RJCODE := XCZV;               _SET FRMR REASON CODE      ?
            PX2SRESET;                      _SEND FRMR                 ?
            END 
          ELSE
            PX2PRIMARY;                     _EXEC PRIMARY STATES       ?
          END _ NUMBERED FRAME                                         ?
        ELSE
          PX2PRIMARY; 
        END  _ X9FP                                                    ?
      ELSE
        IF X2FRSP = X9FR                    _RESET REQUIRED            ?
        THEN
          PX2SRESET;                        _SEND FRMR                 ?
  
      END _ IF X2IFLOK ?
    ELSE
      IF X2CMDRSP                           _FOR COMMANDS OF INCORRECT ?
      THEN
        PX2SRESET;                          _SEND FRMR                 ?
  END; _ WITH XTSLCB'.BZXSLCB                                          ?
END; _ PROCEDURE PX2PPROCESSOR                                         ?
  
_$J+? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*                    PX2REGL                                          * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_?
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW :                                                         * 
*              CHECK BUFFER AVAILABILITY AGAINST X.25 THRESHOLDS      * 
*                                                                     * 
** INPUT :                                                            * 
*              X2LH     = TRUE (CHECK AGAINST HIGH THRESHOLD)         * 
*                       = FALSE(CHECK AGAINST LOW THRESHOLD)          * 
*              X2INFSUP = TRUE (CHECK FOR .LESS THAN. )               * 
*                       = FALSE(CHECK FOR .GREATER OR EQUAL.)         * 
*                                                                     * 
*              X25HBUF  = X.25 HIGH BUFFER THRESHOLD                  * 
*              X25LBUF  = X.25 LOW BUFFER THRESHOLD                   * 
*                                                                     * 
** CALLING PROGRAMS :                                                 * 
*              PX3SECONDARY - LEVEL 2 SECONDARY STATION (CASE 3 AND 5)* 
*              PX2SRCHECK   - SECONDARY RESPONSE CHECK                * 
*              PBDF         - GET FILE 1 REGISTER CONTENTS            * 
*                                                                     * 
** OUTPUT :                                                           * 
*              PX2REGL = TRUE IF RELATION IS VERIFIED                 * 
*                      = FALSE IF NOT VERIFIED                        * 
*                                                                     * 
** EXTERNAL SUBROUTINES :                                             * 
*              NONE                                                   * 
*                                                                     * 
** NOTES :                                                            * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
FUNCTION PX2REGL ( X2INFSUP : BOOLEAN; X2LH : BOOLEAN) : BOOLEAN; 
VAR 
      X2BUFCNT : INTEGER; 
      X2BOOL   : BOOLEAN; 
BEGIN 
PBDF($010C, X2BUFCNT);                      _GET DATA BUFFERS COUNT    ?
X2BOOL   := X2BUFCNT < X25LBUF; 
IF X2LH 
THEN
  X2BOOL :=  X2BUFCNT < X25HBUF ; 
  
PX2REGL := X2BOOL;
IF X2INFSUP 
THEN
  PX2REGL := NOT X2BOOL;
END; _ FUNCTION PX2REGL                                                ?
  
_$J+? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*                    PX2SRCHECK                                       * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_?
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW :                                                         * 
*              SECONDARY RESPONSE CHECK                               * 
*                                                                     * 
** INPUT :                                                            * 
*              XTSLCB     = SUB LCB POINTER                           * 
*              X2IPF      = INBOUND POLL BIT                          * 
*                                                                     * 
** CALLING PROGRAMS :                                                 * 
*              PX2SECONDARY - LEVEL 2 SECONDARY STATION               * 
*                              (CASE 1, 4 AND 7)                      * 
*                                                                     * 
** OUTPUT :                                                           * 
*              BZSSTATE   = UPDATED                                   * 
*              RR OR RNR GENERATED                                    * 
*                                                                     * 
** EXTERNAL SUBROUTINES :                                             * 
*              PX2REGL      - CHECK REGULATION THRESHOLDS             * 
*              PX2TIMER     - BASE TIMERS INTERFACE                   * 
*              PX2GPF       - GENERATE PROTOCOL FRAME                 * 
*                                                                     * 
** NOTES :                                                            * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PX2SRCHECK; 
CONST 
      X2LOW      = FALSE; 
      X2HIGH     = TRUE;
      X2LTHAN    = FALSE; 
      X2GEQUAL   = TRUE;
BEGIN 
  
WITH XTSLCB'.BZXSLCB DO                     _SUB LCB POINTER           ?
  BEGIN 
  
  IF X2IPF = FALSE                          _POLL BIT = 0              ?
  THEN
    BEGIN 
    IF PX2REGL(X2LTHAN,X2LOW) 
    THEN
      BEGIN 
      PX2GPF(X2RNR,FALSE);                  _SEND AN RNR               ?
      PX2TIMER(TREGTIMER,TRUE);             _START TREG                ?
      BZSSTATE := X9BUSY;                   _SECONDARY BUSY            ?
      END 
    ELSE                                    _ABOVE THRESHOLD           ?
      BEGIN 
      IF PX2REGL(X2GEQUAL,X2HIGH) 
      THEN
        IF ((BZIFQR   = NIL)
          ! (BZVS     = ((BZLNRR + BZK) MOD 8))  _WINDOW CLOSED        ?
          ! (BZPSTATE = X8RBUSY))           _REMOTE BUSY               ?
        THEN
          BEGIN 
          PX2TIMER(TREGTIMER,FALSE);        _STOP TREG                 ?
          BZSSTATE := X9OPER;               _BACK TO OPER              ?
          PX2GPF(X2RR,FALSE);               _SEND RR (F=0)             ?
          END;
      END;
    END 
  ELSE                                      _POLL BIT IS SET           ?
    IF PX2REGL(X2LTHAN,X2LOW) 
    THEN
      BEGIN 
      PX2TIMER(TREGTIMER,TRUE);             _START TREG                ?
      BZSSTATE := X9BUSY;                   _SECONDARY BUSY            ?
      PX2GPF(X2RNR,TRUE);                   _SEND RNR (F=1)            ?
      END 
    ELSE
      BEGIN 
      PX2GPF(X2RR,TRUE);                    _SEND RR (F=1)             ?
      PX2TIMER(TREGTIMER,FALSE);            _STOP TREG                 ?
      BZSSTATE := X9OPER;                   _BACK TO OPER              ?
      END;
  END; _ WITH XTSLCB'.BZXSLCB                                          ?
END; _ PROCEDURE PX2SRCHECK                                            ?
  
_$J+? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*                    PX2SECONDARY                                     * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_?
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW :                                                         * 
*              PX2SECONDARY IS CALLED TO SET UP THE                   * 
*              SECONDARY EVENT CODE, FETCH THE ACTION TABLE INDEX     * 
*              AND THEN CALL THE SECONDARY STATES PROCESSOR.          * 
*                                                                     * 
** INPUT :                                                            * 
*              X2SCODE  = SECONDARY EVENT CODE                        * 
*              XTSLCB   = SUB LCB POINTER                             * 
*              XSMATRIX = SECONDARY STATES TRANSITION TABLE           * 
*                                                                     * 
** CALLING PROGRAMS :                                                 * 
*              PX2RECEIVER   - INCOMING FRAME RECEIVER                * 
*              PX2SPROCESSOR - LEVEL 2 SECONDARY PROCESSOR            * 
*                                                                     * 
** OUTPUT :                                                           * 
*              BZSEVENT = X2SCODE (SECONDARY EVENT CODE)              * 
*              X2SCASE  = SECONDARY ACTION INDEX                      * 
*                                                                     * 
** EXTERNAL SUBROUTINES :                                             * 
*              PX2SECONDARY - SECONDARY STATES PROCESSOR              * 
*              PX2GPF       - GENERATE SUP. FRAME                     * 
*              PX2SRCHECK   - SECONDARY RESPONSE CHECK                * 
*              PX2INIT      - INITIALIZE LEVEL 2 STATIONS             * 
*              PX2REGL      - CHECK CCP BUFFER REGULATION             * 
*              PX2TIMER     - TIMER INTERFACE                         * 
*              PBRELZRO     - RELEASE CHAIN OF BUFFERS                * 
*                                                                     * 
** NOTES :                                                            * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PX2SECONDARY; 
  
CONST 
      X2LOW      = FALSE; 
      X2HIGH     = TRUE;
      X2LTHAN    = FALSE; 
      X2GEQUAL   = TRUE;
  
VAR 
      X2SCASE : INTEGER;
  
BEGIN 
WITH XTSLCB'.BZXSLCB DO                     _SUB LCB POINTER           ?
  
  BEGIN 
  BZSEVENT := X2SCODE;                      _STORE EVENT CODE          ?
  X2SCASE  := XSMATRIX [BZSSTATE,X2SCODE];  _GET ACTION INDEX          ?
  
_ 
                   II OPERATIONAL I BUSY I REJECT I RESET I 
          +--------++-------------+------+--------+-------+ 
          +--------++-------------+------+--------+-------+ 
          I SI     II      1      I  3   I   4    I   6   I 
          +--------++-------------+------+--------+-------+ 
          I SSABM  II      2      I  2   I   2    I   2   I 
          +--------++-------------+------+--------+-------+ 
          I STREG  II      0      I  5   I   0    I   0   I 
          +--------++-------------+------+--------+-------+ 
          I CMDNR  II      7      I  7   I   7    I   0   I 
          +--------++-------------+------+--------+-------+ 
? 
  CASE X2SCASE OF                           _SECOND ACTION CODE        ?
  
    1:                                      _IFRAME 1                  ?
      IF X2VRCODE = X4REJ                   _REJECT                    ?
      THEN
        BEGIN 
        PBRELZRO (X2IFRPTR.X1BFPTR, 
                  BEDBSIZE);                _DISCARD FRAME             ?
        BZSSTATE := X9RJECT;                _REJECT STATE              ?
        PX2GPF (X2REJ,X2IPF);               _SEND REJ (F=P)            ?
        END 
      ELSE                                  _CORRECT N(R)              ?
        BEGIN 
        XTL3PKQ := NOT X2SHIFR;             _QUEUE UPLINE IF NOT SHORT ?
        PX2SRCHECK;                         _CHECK FOR RESPONSE        ?
        END; _ IFRAME 1                                                ?
  
    2:                                      _SECOND RESET              ?
      BEGIN 
      PX2GPF (X2UA,X2IPF);                  _SEND UA (F=P)             ?
      _ X2RSWC := X9SR;                      SECONDARY RESET           ?
      _ NOTE RESTART CHANNELS PROTOCOLS ARE NOT USED AT PRESENT        ?
      PX25MSG (1);                          _GENERATE ALARM MESSAGE    ?
      IF BZPSTATE " X8RESET                 _NOT RESET                 ?
      THEN
        PX2INIT                             _INITIALIZE SECONDARY      ?
      ELSE
        BZSSTATE := X9RESET;                _WAIT UA IN S.RESET        ?
      END; _ SECONDARY RESET                                           ?
  
    3:                                      _IFRAME 2                  ?
      BEGIN 
      IF X2VRCODE = X4REJ 
      THEN
        BEGIN 
        PBRELZRO(X2IFRPTR.X1BFPTR,BEDBSIZE);_DISCARD FRAME             ?
        IF X2IPF                            _POLL BIT SET              ?
        THEN
          PX2GPF (X2RNR,TRUE);              _SEND RNR F=1              ?
        END 
      ELSE
        BEGIN                               _CORRECT FRAME             ?
        XTL3PKQ := NOT X2SHIFR;             _QUEUE UPLINE IF NOT SHORT ?
        IF PX2REGL (X2LTHAN,X2HIGH)         _CHECK FOR REGULATION      ?
        THEN
          BEGIN 
          PX2GPF (X2RNR,X2IPF);             _SEND RNR (F=P)            ?
          PX2TIMER (TREGTIMER,TRUE);        _START TREG                ?
          END 
        ELSE
          BEGIN 
          PX2GPF (X2RR,X2IPF);              _SEND RR (F=P)             ?
          BZSSTATE := X9OPER;               _BACK TO OPER              ?
          END;
        END;
      END; _ IFRAME 2                                                  ?
  
    4:                                      _IFRAME 3                  ?
      BEGIN 
      IF X2VRCODE = X4REJ                   _REJECT                    ?
      THEN
        PBRELZRO(X2IFRPTR.X1BFPTR,BEDBSIZE) _DISCARD FRAME             ?
      ELSE
        BEGIN 
        XTL3PKQ := NOT X2SHIFR;             _QUEUE UPLINE IF NOT SHORT ?
        BZSSTATE := X9OPER;                 _ENSURE REJECT STATE EXITED?
        PX2SRCHECK;                         _CHECK FOR RESPONSE        ?
        END;
      END; _ IFRAME 3                                                  ?
  
    5:                                      _BUFCHECK                  ?
      BEGIN 
      IF PX2REGL (X2LTHAN,X2HIGH)           _CHECK REGULATION LEVEL    ?
      THEN
        PX2TIMER (TREGTIMER,TRUE)           _RESTART TREG              ?
      ELSE
        BEGIN                               _END OF REGUL              ?
        PX2TIMER (TREGTIMER,FALSE);         _STOP REGULATION TIMER     ?
        PX2GPF (X2CRR,FALSE);               _SEND RR COMMAND           ?
        BZSSTATE := X9OPER;                 _BACK TO OPER              ?
        END; _ IF PX2REGL                                              ?
      END; _ BUFCHECK                                                  ?
  
    6:                                      _I RECEIVED ON RESET       ?
      BEGIN 
      PBRELZRO (X2IFRPTR.X1BFPTR,BEDBSIZE); _DISCARD FRAME             ?
      END; _ RESET STATE                                               ?
  
    7:                                      _COMMAND N(R)              ?
      PX2SRCHECK;                           _CHECK FOR RESPONSE        ?
  
    END; _ CASE X2SCASE                                                ?
  
  END; _ WITH XTSLCB'.BZSLCB                                           ?
  
IF XTL3PKQ
THEN                                        _LEVEL 3 PACKED AVAILABLE  ?
  BEGIN 
  X3IPKPTR.X1BFPTR := XIPARAMS.XAFRMPTR;    _GET INPUT FRAME PTR       ?
  X3IPKPTR.X1BFPTR'.
    BCCHAINS [QCHN]       := NIL;           _CLEAR QUEUE CHAIN WORD    ?
  X3IPKPTR.X1BFPTR'.BFFCD := 10;            _REMOVE FRAME HEADER       ?
  XTL3FRMR                := TRUE;          _LEVEL 3 FRAME REQUEST     ?
  END;
END; _ PROCEDURE PX2SECONDARY                                          ?
  
_$J+? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*                    PX2SPROCESSOR                                    * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_?
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW :                                                         * 
*              PRE-PROCESSING OF INBOUND SECONDARY FRAMES             * 
*                                                                     * 
** INPUT :                                                            * 
*              XTSLCB     = SUB LCB POINTER                           * 
*              X2IFRTYP   = INBOUND FRAME TYPE                        * 
*              X2CRKNOWN  = RESPONSE KNOWN FLAG                       * 
*              X2VRCODE   = V(R) OWNER RETURNED CODE                  * 
*                                                                     * 
** CALLING PROGRAMS :                                                 * 
*              PX2RECEIVER  - INCOMING FRAME RECEIVER                 * 
*                                                                     * 
** OUTPUT :                                                           * 
*              X2SCODE    = SECONDARY ACTION CODE                     * 
*                                                                     * 
** EXTERNAL SUBROUTINES :                                             * 
*              PX2SRESET    - LEVEL 2 SECONDARY RESET                 * 
*              PX2SECONDARY - SECONDARY STATION                       * 
*                                                                     * 
** NOTES :                                                            * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PX2SPROCESSOR;
BEGIN 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*        SECONDARY EVENT TRANSLATION                                  * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
  X2SCODE := X9CNR;                         _DEFAULT TO CMD N(R)       ?
  IF X2IFRTYP = X2I                         _I FRAME                   ?
  THEN
    X2SCODE := X9I
  ELSE
    IF X2IFRTYP = X2SABM
    THEN
      X2SCODE := X9SABM;
  
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*        CHECK FOR UNKNOWN COMMAND OR BAD LENGTH                      * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
  IF X2CRKNOWN &                            _KNOWN COMMAND             ?
     X2IFLOK                                _CORRECT LENGTH            ?
  THEN
    BEGIN 
  
    CASE X2SCODE OF 
  
      X9I:                                  _I FRAME                   ?
        WITH XTSLCB'.BZXSLCB DO 
        BEGIN 
          X2VRCODE := X4REJ;                _INDICATION TO REJECT THIS ?
          IF BZVR = X2IFRHDR.XFNS           _ INFORMATION FRAME/DEFAULT?
          THEN                              _IF EXPECTED N(S) AND      ?
            IF BZSSTATE " X9BUSY            _NOT BUSY AND              ?
            THEN
              IF X2NRSP = X9NP              _GOOD N(R)                 ?
              THEN
                BEGIN 
                X2VRCODE := X4NSOK;         _EXPECTED N(S)             ?
                BZVR     := BZVR + 1;       _UPDATE V(R)               ?
                END; _  IF BZVR = X2IFRHDR.XFNS ? 
  
          PX2SECONDARY;                     _EXCUTE SECONDARY STATE    ?
        END; _ X9I                                                     ?
  
      X9SABM,                               _SABM FRAME                ?
      X9CNR:                                _COMMAND N(R)              ?
        PX2SECONDARY;                       _EXECUTE SECONDARY STATES  ?
  
      END; _ CASE X2SCODE                                              ?
    END 
  ELSE
    PX2SRESET;                              _SECOND RESET              ?
END; _ PROCEDURE PX2SPROCESSOR                                         ?
  
_$J+? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*                    PX2LINK                                          * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_?
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW :                                                         * 
*              PX2LINK IS CALLED TO PERFORM A SPECIFIC ACTION CODE    * 
*              FOR THE DCE/DTE SIDE OF A STATION FOR ENABLING         * 
*              LINK AND DISABLING LINK                                * 
*                                                                     * 
** INPUT :                                                            * 
*              X2LCASE    = LINK ACTION CODE                          * 
*              X2IPF      = INBOUND P/F BIT                           * 
*              X2OPF      = OUTBOUND P/F BIT                          * 
*              XTSLCB     = SUB LCB POINTER                           * 
*                BZHSTATE = STATION HANDLER STATE                     * 
*                BZPSTATE = PRIMARY STATE                             * 
*                BZRC     = RETRANSMISSION COUNTER                    * 
*                BZN2     = RC LIMIT                                  * 
*                BZTRANST = TRANSPORT TYPE                            * 
*                                                                     * 
** CALLING PROGRAMS :                                                 * 
*              PX2STC       - SET LINK PARAMETERS                     * 
*                                                                     * 
** OUTPUT :                                                           * 
*              GENERATS UNNUMBERED FRAME                              * 
*                                                                     * 
** EXTERNAL SUBROUTINES :                                             * 
*              PX2GPF       - GENERATE PROTOCOL FRAME                 * 
*              PX2TIMER     - BASE TIMERS INTERFACE                   * 
*              PX2INPUT     - INITIALIZE INPUT                        * 
*              PX2INIT      - INITIALIZE LEVEL 2 STATIONS             * 
*              PX25TELTIP   - WORKCODE TO X25TIP                      * 
*              PX25LNKDOWN  - STOP THE LINK                           * 
*              PX25MSG      - MESSAGE TO NAM DAYFILE                  * 
*              PBLSPUT      - QUEUE WORKLIST                          * 
*                                                                     * 
? 
_$J+? 
_ 
** NOTES :                                                            * 
*                                                                     * 
*                           DTE DECISION MATRIX                       * 
*                                                                     * 
*                 II LINK I LINK I  LINK  I   INFO   I                * 
*                 II DOWN I DISC I SET UP I TRANSFER I                * 
*        +--------++------+------+--------+----------+                * 
*        +--------++------+------+--------+----------+                * 
*        I LSTART II   1  I   0  I    0   I     0    I                * 
*        +--------++------+------+--------+----------+                * 
*        I LSTOP  II   8  I   8  I    8   I     8    I                * 
*        +--------++------+------+--------+----------+                * 
*        I LHERR  II   0  I   8  I    8   I     8    I                * 
*        +--------++------+------+--------+----------+                * 
*        I LSABM  II   0  I  10  I    9   I     0    I                * 
*        +--------++------+------+--------+----------+                * 
*        I LDISC  II   0  I   9  I    5   I     8    I                * 
*        +--------++------+------+--------+----------+                * 
*        I LUA    II   0  I   3  I    7   I     0    I                * 
*        +--------++------+------+--------+----------+                * 
*        I LDM    II   0  I   3  I    6   I     8    I                * 
*        +--------++------+------+--------+----------+                * 
*        I LT1    II   0  I   2  I    4   I     0    I                * 
*        +--------++------+------+--------+----------+                * 
*                                                                     * 
*                                                                     * 
*                       DCE DECISION MATRIX                           * 
*                                                                     * 
*                                                                     * 
*                 II LINK I LINK I  LINK  I   INFO   I                * 
*                 II DOWN I DISC I SET UP I TRANSFER I                * 
*        +--------++------+------+--------+----------+                * 
*        +--------++------+------+--------+----------+                * 
*        I LSTART II  11  I   0  I    0   I     0    I                * 
*        +--------++------+------+--------+----------+                * 
*        I LSTOP  II   8  I   0  I    8   I     8    I                * 
*        +--------++------+------+--------+----------+                * 
*        I LHERR  II   0  I   0  I    8   I     8    I                * 
*        +--------++------+------+--------+----------+                * 
*        I LSABM  II   0  I   0  I   12   I     0    I                * 
*        +--------++------+------+--------+----------+                * 
*        I LDISC  II   0  I   0  I    9   I     8    I                * 
*        +--------++------+------+--------+----------+                * 
*        I LUA    II   0  I   0  I    0   I     0    I                * 
*        +--------++------+------+--------+----------+                * 
*        I LDM    II   0  I   0  I    8   I     8    I                * 
*        +--------++------+------+--------+----------+                * 
*        I LT1    II   0  I   0  I    0   I     0    I                * 
*        +--------++------+------+--------+----------+                * 
                                                                      * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PX2LINK(X2LCASE : INTEGER); 
BEGIN 
  
WITH XTSLCB'.BZXSLCB DO                     _SUB LCB POINTER           ?
  
  BEGIN 
  
  CASE X2LCASE OF                           _LINK ACTION CODE          ?
  
    1:                                      _CASE 01                   ?
      BEGIN 
      PX2INPUT(TRUE);                       _START INPUT STATES        ?
      BZHSTATE := X7DIS;                    _LINK DISC                 ?
      PX2GPF(X2DISC,TRUE);                  _SEND DISC (P=1)           ?
      END; _ 01                                                        ?
  
    2:                                      _CASE 02                   ?
      BEGIN 
      BZRC := BZRC + 1;                     _TRANSMIT COUNT            ?
      IF BZRC = BZN2                        _LIMIT REACHED             ?
      THEN
        BEGIN 
        BZRC := 0;                          _CLEAR TRANSMIT COUNT      ?
        PX25MSG(2);                         _UNABLE TO CONNECT         ?
        END;
      IF BZSFQR = NIL                       _IF COMMAND QUEUE IS EMPTY ?
      THEN
        PX2GPF(X2DISC,TRUE);                _SEND DISC (P=1)           ?
      END; _ 02                                                        ?
  
    3:                                      _CASE 03                   ?
      IF X2IPF = BZPOLL                     _IF F=P                    ?
      THEN
        BEGIN 
 40:    BZRC     := 0;                      _CLEAR TRANSMIT COUNT      ?
        BZPOLL   := FALSE;                  _CLEAR POLL CONDITION      ?
        PX2TIMER(T1TIMER,FALSE);            _STOP T1                   ?
        BZHSTATE := X7SETUP;                _LINK SET UP               ?
        PX2GPF(X2SABM,TRUE);                _SEND SABM (P=1)           ?
        END; _ 03                                                      ?
  
    4:                                      _CASE 04                   ?
      BEGIN 
      BZRC := BZRC + 1;                     _INCREASE TRANSMIT COUNT   ?
      IF BZRC = BZN2                        _IF LIMIT REACHED          ?
      THEN
        BEGIN 
        BZRC     := 0;                      _CLEAR TRANSMIT COUNT      ?
        PX25MSG(2);                         _UNABLE TO CONNECT         ?
        BZHSTATE := X7DIS;                  _LINK DISC                 ?
        PX2GPF(X2DISC,TRUE);                _SEND DISC (P=1)           ?
        END 
      ELSE
        PX2GPF(X2SABM,TRUE);                _SEND SABM (P=1)           ?
      END; _ 04                                                        ?
  
    5:                                      _CASE 05                   ?
      BEGIN 
      PX2GPF(X2UA,X2IPF);                   _SEND UA (F=P)             ?
      GOTO 40;                              _SEND SABM                 ?
      END; _ 05                                                        ?
  
    6:                                      _CASE 06                   ?
      IF X2IPF = BZPOLL                     _IF F=P                    ?
      THEN
        BEGIN 
        PX25MSG(2);                         _UNABLE TO CONNECT         ?
        PX25LNKDOWN;                        _STOP THE LINK             ?
        END; _ 06                                                      ?
  
    7:                                      _CASE 07                   ?
     IF X2IPF = BZPOLL                      _IF F=P                    ?
     THEN 
      BEGIN 
 50:  BZPOLL     := FALSE;                  _CLEAR POLL CONDITION      ?
      BZHSTATE   := X7INFO;                 _LINK OPERATIONAL          ?
      BZRXMT     := FALSE;                  _SIGNAL INITIAL SET-UP     ?
      BZLNRR     := BZVS;                   _SIGNAL INITIAL SET-UP     ?
      PX2INIT;                              _INITIALIZE ALL            ?
      BZFRMRPEND := TRUE;                   _FRAME REQUEST             ?
      BZHDLCUP   := TRUE;                   _LINK IS UP                ?
      BZPKLUP    := TRUE;                   _PACKET LEVEL OPERATIONAL  ?
      BZSTLNK    := D5OPER;                 _LINK STATE TO OPERATIONAL ?
      PX25TELTIP(L3LINE);                   _NOTIFY TO X25TIP          ?
      END; _ 07                                                        ?
  
    8:                                      _CASE 08                   ?
      PX25LNKDOWN;                          _STOP THE LINK             ?
      _ END 08                                                         ?
  
    9:                                      _CASE 09                   ?
      BEGIN 
      PX2GPF(X2UA,X2IPF);                   _SEND UA (F=P)             ?
      IF BZHSTATE = X7SETUP 
      THEN
        BEGIN 
        GOTO 50;
        END 
      END; _ 09                                                        ?
  
    10:                                     _CASE 10                   ?
      BEGIN 
      PX2GPF(X2DM,X2IPF);                   _SEND DM (F=P)             ?
      BZHSTATE := X7SETUP;
      END; _ 10                                                        ?
  
    11:                                     _CASE 11                   ?
      BEGIN 
      PX2INPUT(TRUE);                       _START INPUT STATES        ?
      BZHSTATE := X7SETUP;                  _LINK SET UP               ?
      END; _ 11                                                        ?
  
    12:                                     _CASE 12                   ?
      BEGIN 
      PX2GPF(X2UA,X2IPF);                   _SEND UA (F=P)             ?
      GOTO 50;
      END; _ 12                                                        ?
  
    END; _ CASE X2LCASE                                                ?
  END; _ WITH XTSLCB'.BZXSLCB                                          ?
END; _ PROCEDURE PX2LINK                                               ?
  
_$J+? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*                    PX2STC                                           * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_?
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW :                                                         * 
*              PX2STC IS CALLED FROM PX2RECEIVER TO SET UP            * 
*              THE LINK EVENT CODE, FETCH THE ACTION TABLE INDEX      * 
*              AND THEN CALL THE LINK STATES PROCESSOR.               * 
*                                                                     * 
** INPUT :                                                            * 
*              XTWC        = INBOUND WORKCODE                         * 
*              X2IFLOK     = CORRECT INBOUND FRAME LENGTH             * 
*              X2CRKNOWN   = CMD/RSP KNOWN                            * 
*              XTSLCB      = SUB LCB POINTER                          * 
*              XLDCEMATRIX = DCE LINK STATE MATRIX                    * 
*              XLDTEMATRIX = DTE LINK STATE MATRIX                    * 
*                                                                     * 
** CALLING PROGRAMS :                                                 * 
*              PX2RECEIVER  - LEVEL 2 RECEIVER                        * 
*              PX25TRANS    - MAIN PROGRAM (LEVEL 2)                  * 
*                                                                     * 
** OUTPUT :                                                           * 
*              BZHEVENT  = X2LCODE (LINK ACTION CODE)                 * 
*              CASE INDEX FOR PX2LINK                                 * 
*                                                                     * 
** EXTERNAL SUBROUTINES :                                             * 
*              PX2LINK      - LINK STATES PROCESSOR                   * 
*              PBRELZRO     - RELEASE BUFFER CHAIN                    * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PX2STC; 
  
VAR 
      X2LCASE : INTEGER;                    _ACTION INDEX              ?
      L2EVENT : ARRAY[X2ERR..X2FRMR] OF INTEGER;
      X2HSTAT : INTEGER;                    _LOCAL BZHSTATE            ?
  
VALUE 
      L2EVENT = (X7IGN,X7IGN,X7IGN,X7IGN,X7IGN, 
                 X7SABM,X7DM,X7DISC,X7UA,X7IGN);
  
BEGIN 
IF XTWC = L2GDFRM                           _GOOD FRAME RECEIVED       ?
THEN
  BEGIN 
  X2LCODE := X7IGN;                         _PRESET EVENT CODE         ?
  IF X2IFLOK                                _CORRECT LENGHT            ?
  THEN
    IF X2CRKNOWN                            _CMD/RSP KNOWN             ?
    THEN
      X2LCODE := L2EVENT [X2IFRTYP];        _TRANSLATE TO LINK         ?
  END; _ L2GDFRM                                                       ?
X2HSTAT := XTSLCB'.BZXSLCB.BZHSTATE;        _GET LINK STATE LOCAL      ?
XTSLCB'.BZXSLCB.BZHEVENT := X2LCODE;        _SET LINK EVENT            ?
IF X2LCODE = X7IGN                          _ERRORS                    ?
THEN
  PBRELZRO (X2IFRPTR.X1BFPTR,BEDBSIZE)      _RELEASE FRAME             ?
ELSE
  BEGIN 
  IF XTSLCB'.BZXSLCB.BZDCE
  THEN
    X2LCASE := XLDCEMATRIX [X2HSTAT,X2LCODE]
  ELSE
    X2LCASE := XLDTEMATRIX [X2HSTAT,X2LCODE]; 
  PX2LINK (X2LCASE);                        _PERFORM LINK ACTION       ?
  END; _ IF X2LCODE = X7IGN                                            ?
END; _ PROCEDURE PX2STC                                                ?
  
_$J+? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*                    PX2HDDECODE                                      * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_?
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW :                                                         * 
*              DECODES AND PRE-PROCESSES FRAME HEADER                 * 
*              PROVIDES POINTERS NECESSARY FOR FURTHER PROCESSING.    * 
*                                                                     * 
** INPUT :                                                            * 
*              XIPARAMS  = WORKLIST WORK AREA                         * 
*              XTSLCB    = SUB LCB POINTER                            * 
*                                                                     * 
** CALLING PROGRAMS :                                                 * 
*              PX2RECEIVER  - STATION RECEIVER                        * 
*                                                                     * 
** OUTPUT :                                                           * 
*              X2IFRPTR  = INPUT FRAME POINTER                        * 
*              X2IFRHDR  = FRAME HEADER COPY                          * 
*              X2AKNOWN  = TRUE IF ADDRESS KNOWN                      * 
*              X2CRKNOWN = TRUE IF CMD/RSP KNOWN                      * 
*              X2CMDRSP  = FALSE IF CMD, TRUE IF RSP                  * 
*              X2RJCODE  = CMDR/FRMR REASON CODE                      * 
*              X2IFRTYP  = TYPE OF INBOUND FRAME                      * 
*              X2IFRSET  = SET TYPE FOR INBOUND FRAME                 * 
*              X2IFLOK   = FRAME LENGTH VALID                         * 
*                                                                     * 
** EXTERNAL SUBROUTINES :                                             * 
*              PBRELZRO     - RELEASE BUFFERS                         * 
*              PTCTCHR      - COUNT NUMBER OF CHARACTER IN FRAME      * 
*                                                                     * 
** NOTES :                                                            * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PX2HDDECODE;
  
VAR 
      X2REL  : BOOLEAN; 
      NBFSET : ARRAY[0..3] OF INTEGER;
      WORK   : PACKED RECORD
                 CASE X2I : INTEGER OF
                 1: (FMFS : INTEGER); 
                 2: (FIL1 : B08BITS;
                     FM   : B04BITS;
                     FS   : B04BITS); 
                 END; 
  
VALUE 
      NBFSET = (X2RR,X2RNR,X2REJ,X2ERR);
  
  
BEGIN 
X2AKNOWN  := FALSE;                         _ADDRESS UNKNOWN           ?
X2CRKNOWN := FALSE;                         _UNKNOWN CMD/RSP           ?
X2IFRPTR.                                   _GET FRAME POINTER         ?
  X1BFPTR := XIPARAMS.XAFRMPTR; 
X2IFRHDR  := X2IFRPTR.X2BFPTR'.XBFRHDR;     _GET FRAME HEADER          ?
X2RJCODE  := XCWV;                          _SET CMDR/FRMR REASON CODE ?
  
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*        CHECK INBOUND ADDRESS                                        * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
X2IFRLNGTH := PTCTCHR(X2IFRPTR.X1BFPTR);      _GET FRAME LENGTH        ?
IF X2IFRLNGTH \ 2                             _IF FRAME LENGTH OK      ?
THEN
  BEGIN 
  IF X2IFRHDR.XFA = XA                        _ADDRESS A               ?
  THEN
    BEGIN 
    X2CMDRSP := FALSE;                        _COMMAND FRAME           ?
    X2AKNOWN := TRUE;                         _ADDRESS KNOWN           ?
    END;
  IF X2IFRHDR.XFA = XB                        _ADDRESS B               ?
  THEN
    BEGIN 
    X2CMDRSP := TRUE;                         _RESPONSE FRAME          ?
    X2AKNOWN := TRUE;                         _ADDRESS KNOWN           ?
    END;
  END;
IF XTSLCB'.BZXSLCB.BZDCE                    _IF DCE THEN SWITCH        ?
THEN
  X2CMDRSP := NOT X2CMDRSP;                 _STATION SIDES             ?
  
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*        CONVERT TO INTERNAL FRAME TYPE                               * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
X2IFRTYP := X2ERR;                          _PRESET FRAME TYPE         ?
IF X2AKNOWN                                 _IF ADDRESS KNOWN          ?
THEN
  BEGIN 
  
  IF XTSLCB'.BZXSLCB.BZDTEPOLL              _IF L2 INOPERATIVE POLLING ?
  THEN
    BEGIN 
    PX2TIMER(T1TIMER,FALSE);                _STOP T1                   ?
    XTSLCB'.BZXSLCB.BZDTEPOLL := FALSE;     _GOOD FRAME RECEIVED       ?
    END;
  
  WITH WORK DO                              _LOCAL FRAME HEADER        ?
    BEGIN 
    FM := X2IFRHDR.XFM;                     _GET FM                    ?
    FS := X2IFRHDR.XFS;                     _AND FS LOCAL              ?
    IF X2CMDRSP                             _RESPONSE SET              ?
    THEN
_ 
* * * *  CHECK FOR A VALID RESPONSE                                   * 
? 
      BEGIN 
      IF X2IFRHDR.XFSUI                     _S OR U FRAME              ?
      THEN
        BEGIN 
        IF X2IFRHDR.XFSU                    _U FRAME                   ?
        THEN
_ 
* * * *  UNNUMBERED FRAMES SET
? 
          BEGIN 
          IF FMFS = $03 
          THEN
            X2IFRTYP := X2DM;               _DM FRAME                  ?
          IF FMFS = $30 
          THEN
            X2IFRTYP := X2UA;               _UA FRAME                  ?
          IF FMFS = $41 
          THEN
            X2IFRTYP := X2FRMR;             _FRMR FRAME                ?
          END _ U FRAME                                                ?
        ELSE                                _S FRAME                   ?
_ 
* * * *  NUMBERED FRAMES SET
? 
          X2IFRTYP := NBFSET [X2IFRHDR.XFS];_GET RR,RNR,REJ            ?
        END; _ IF XFSUI                                                ?
      END _ RESPONSE SET                                               ?
    ELSE                                    _COMMAND SET               ?
_ 
* * * *  COMMAND FRAMES SET                                           * 
? 
      BEGIN 
      IF X2IFRHDR.XFSUI                     _S OR U FRAME              ?
      THEN
        BEGIN 
        IF X2IFRHDR.XFSU                    _U FRAME                   ?
        THEN
_ 
* * * *  UNNUMBERED FRAMES SET
? 
          BEGIN 
          IF FMFS = $13 
          THEN
            X2IFRTYP := X2SABM;             _SABM FRAME                ?
          IF FMFS = $20 
          THEN
            X2IFRTYP := X2DISC;             _DISC FRAME                ?
          END _ U FRAME                                                ?
        ELSE                                _S FRAME                   ?
_ 
* * * *  NUMBERED FRAMES SET
? 
          X2IFRTYP := NBFSET [X2IFRHDR.XFS];_GET RR,RNR,REJ            ?
        END _ IF XFSUI                                                 ?
      ELSE
        X2IFRTYP := X2I;                    _DATA FRAME                ?
      END; _ IF X2CMDRSP                                               ?
  
    X2IPF := X2IFRHDR.XFPF;                 _GET POLL FINAL BIT        ?
    END; _ WITH WORK                                                   ?
  END;
_ 
* * * *  CONVERT FRAME TYPE TO PASCAL SET, FOR CONVENIENT TESTING 
? 
X2IFRSET := [X2IFRTYPE];                    _CONVERT TO SET TYPE       ?
  
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*        CHECK ADDRESS AND CONTROL BYTE                               * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
X2REL := TRUE;                              _RELEASE - UNLESS CORRECT I?
IF ([X2ERR] & X2IFRSET) = [ ]               _GOOD FRAME                ?
THEN
  BEGIN 
  X2CRKNOWN  := TRUE;                       _KNOWN FRAME               ?
  X2IFLOK    := TRUE; 
  
  IF ([X2SABM,X2DISC,X2DM,X2RR,X2RNR,X2REJ,X2UA] & X2IFRSET) " [ ]
  THEN
    IF X2IFRLNGTH " 2 
    THEN
      BEGIN 
      X2IFLOK  := FALSE;
      X2RJCODE := XCXV + XCWV;              _SET FRMR REASON CODE      ?
      END;
  
  IF ([X2FRMR] & X2IFRSET) " [ ]
  THEN
    IF X2IFRLNGTH " 5 
    THEN
      BEGIN 
      X2IFLOK  := FALSE;
      X2RJCODE := XCXV + XCWV;              _SET FRMR REASON CODE      ?
      END;
  
  IF ([X2I] & X2IFRSET) " [ ] 
  THEN
    BEGIN 
    X2SHIFR := FALSE;                       _RESET SHORT I FRAME FLAG  ?
    IF X2IFRLNGTH = 2 
    THEN
      X2SHIFR := TRUE                       _CHECK FOR SHORT FRAMES    ?
    ELSE
      IF X2IFRLNGTH > 1029
      THEN
        BEGIN 
        X2IFLOK  := FALSE;                  _I-FRAME LENGTH ERROR      ?
        X2RJCODE := XCYV;                   _SET FRMR REASON CODE      ?
        END 
      ELSE
        X2REL := FALSE;                     _GOOD I FRAME - NO RELEASE ?
    END;
  
  END; _IF ([X2ERR] & X2IFRSET) = [ ]                                  ?
  
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*        KEEP ONLY DATA FRAMES                                        * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
IF X2REL                                    _RELEASE BUFFER            ?
THEN
  PBRELZRO (X2IFRPTR.X1BFPTR,BEDBSIZE);     _RELEASE IT                ?
END; _ PROCEDURE PX2HDDECODE                                           ?
  
_$J+? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*                    PX2RECEIVER                                      * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_?
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW :                                                         * 
*              PX2RECEIVER PROCESSES THE L2GDFRM, T1TIMER,            * 
*              TREGTIMER EVENTS.                                      * 
*              IT WILL THEN SWITCH IT TO THE PROPER MODULE.           * 
*                                                                     * 
** INPUT :                                                            * 
*              XTWC     = INBOUND WORKCODE                            * 
*              XTSLCB   = SUB LCB POINTER                             * 
*              X2AKNOWN = VALID ADDRESS                               * 
*              X2CMDRSP = INBOUND CMD/RSP FLAG                        * 
*              X2IFRSET  = SET TYPE FOR INBOUND FRAME                 * 
*                                                                     * 
** CALLING PROGRAMS :                                                 * 
*              PX25TRANS    - MAIN PROGRAM (LEVEL 2)                  * 
*                                                                     * 
** OUTPUT :                                                           * 
*              NONE                                                   * 
*                                                                     * 
** EXTERNAL SUBROUTINES :                                             * 
*              PX2PPROCESSOR - PRIMARY PROCESSOR                      * 
*              PX2SPROCESSOR - SECONDARY PROCESSOR                    * 
*              PX2STC        - CALL LINK CONTROL                      * 
*              PX2HDDECODE   - DECODE FRAME HEADER                    * 
*              PX2PRIMARY    - LEVEL 2 PRIMARY STATION                * 
*              PX2SECONDARY  - LEVEL 2 SECONDARY STATION              * 
*                                                                     * 
** NOTES :                                                            * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PX2RECEIVER;
VAR 
      X2HSTATE : INTEGER; 
  
BEGIN 
  X2HSTATE := XTSLCB'.BZXSLCB.BZHSTATE;     _GET TRANSFER STATE        ?
  
  CASE XTWC OF
  
    T1TIMER:                                _T1 TIMER EXPIRED          ?
      IF X2HSTATE = X7INFO                  _INFO XFER STATE           ?
      THEN
        BEGIN 
        X2PCODE := X8T1;                    _SET PRIMARY CODE          ?
        PX2PRIMARY;                         _CALL PRIMARY              ?
        END 
      ELSE
        BEGIN 
        X2LCODE := X7T1;                    _SET LINK CODE             ?
        PX2STC;                             _CALL LINK CONTROL         ?
        END;
  
    TREGTIMER:                              _TREG EXPIRED              ?
      IF X2HSTATE = X7INFO                  _INFO XFER STATE           ?
      THEN
        BEGIN 
        X2SCODE := X9TREG;                  _SET SECONDARY CODE        ?
        PX2SECONDARY;                       _CALL SECONDARY            ?
        END;
  
    L2GDFRM:                                _GOOD FRAME RECEIVED       ?
      BEGIN 
      PX2HDDECODE;                          _DECODE FRAME HEADER       ?
      IF X2AKNOWN                           _ADDRESS IS KNOWN          ?
      THEN
        IF X2HSTATE = X7INFO                _INFO XFER STATE           ?
        THEN
          BEGIN 
          IF X2CMDRSP                       _RESPONSE                  ?
          THEN
            BEGIN 
            IF ([X2DM] & X2IFRSET) " [ ]    _DM FRAME SHOULD BE HANDLED?
            THEN                            _BY                        ?
              PX2STC                        _STATION CONTROL           ?
            ELSE
              PX2PPROCESSOR;                _PRIMARY PROCESSOR         ?
            END 
          ELSE
            IF ([X2DISC] & X2IFRSET) " [ ]  _DISC FRAME                ?
            THEN
              PX2STC                        _CALL STATION CONTROL      ?
            ELSE
              BEGIN 
              IF [X2I,X2RR,X2RNR,X2REJ] & 
                 X2IFRSET " [ ] 
              THEN
                PX2PPROCESSOR;              _CALL PRIMARY              ?
              PX2SPROCESSOR;                _SECONDARY PROCESSOR       ?
              END 
          END 
        ELSE                                _NOT INFO XFER             ?
         PX2STC;                            _CALL STATION              ?
      END; _ L2GDFRM                                                   ?
  
    END; _ CASE XAWC                                                   ?
END; _ PROCEDURE PX2RECEIVER                                           ?
  
_$J+? 
_ 
  
     TTTTTTTTTT  RRRRRRRR      AAAAAA    NN      NN    SSSSSS 
     TTTTTTTTTT  RRRRRRRRR    AAAAAAAA   NNN     NN   SSSSSSSS
         TT      RR      RR  AA      AA  NNNN    NN  SS      SS 
         TT      RR      RR  AA      AA  NN NN   NN  SS 
         TT      RRRRRRRRR   AA      AA  NN  NN  NN  SSSSSSSSS
         TT      RRRRRRRR    AAAAAAAAAA  NN   NN NN   SSSSSSSSS 
         TT      RR   RR     AAAAAAAAAA  NN    NNNN          SS 
         TT      RR    RR    AA      AA  NN     NNN  SS      SS 
         TT      RR     RR   AA      AA  NN      NN   SSSSSSSS
         TT      RR      RR  AA      AA  NN      NN    SSSSSS 
  
  
     LL          EEEEEEEEEE  VV      VV  EEEEEEEEEE  LL 
     LL          EEEEEEEEEE  VV      VV  EEEEEEEEEE  LL 
     LL          EE           VV    VV   EE          LL 
     LL          EE           VV    VV   EE          LL 
     LL          EEEEEEEE      VV  VV    EEEEEEEE    LL 
     LL          EEEEEEEE      VV  VV    EEEEEEEE    LL 
     LL          EE             VVVV     EE          LL 
     LL          EE             VVVV     EE          LL 
     LLLLLLLLLL  EEEEEEEEEE      VV      EEEEEEEEEE  LLLLLLLLLL 
     LLLLLLLLLL  EEEEEEEEEE      VV      EEEEEEEEEE  LLLLLLLLLL 
  
  
                               333333 
                              33333333
                             33      33 
                                     33 
                                 33333
                                 33333
                                     33 
                             33      33 
                              33333333
                               333333 
  
  
                 PPPPPPPP      GGGGGG    MM      MM 
                 PPPPPPPPP    GGGGGGGG   MMM    MMM 
                 PP      PP  GG      GG  MMMM  MMMM 
                 PP      PP  GG          MM MMMM MM 
                 PPPPPPPPP   GG    GGGG  MM  MM  MM 
                 PPPPPPPP    GG    GGGG  MM      MM 
                 PP          GG      GG  MM      MM 
                 PP          GG      GG  MM      MM 
                 PP           GGGGGGGG   MM      MM 
                 PP            GGGGGG    MM      MM 
  
? 
_$J+? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*                    PX3XAREQCK                                       * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW :                                                         * 
*              FUNCTION RETURNING TRUE IF THE LEVEL 3 NEEDS TO        * 
*              NOTIFY A SUBTIP TO GENERATE MORE DOWNLINE PACKETS      * 
*              AND REQUEST BIP TO SEND UPLINE BACK FOR PRIVIOUS       * 
*              DOWNLINE BLOCKS.                                       * 
*                                                                     * 
** INPUT :                                                            * 
*              X3LCCB  = LCCB POINTER                                 * 
*                                                                     * 
** CALLING PROGRAMS :                                                 * 
*              PX3PNP       - PROCESS NUMBERED PACKETS                * 
*              PX3GETPACKET - GATHER DOWNLINE PACKETS FOR LEVEL 2     * 
*                                                                     * 
** OUTPUT :                                                           * 
*              PX3XAREQCK   - NEED TO SEND THE DOWNLINE PACKET        * 
*                             REQUEST TO A SUBTIP                     * 
*              GENERATION OF BACK TO BIP                              * 
*                                                                     * 
** EXTERNAL SUBROUTINES :                                             * 
*              PBQUEMAIN    - UPLINE BACK TO BE GENERATED             * 
** NOTES :                                                            * 
*                                                                     * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
FUNCTION PX3XAREQCK( I : BOOLEAN ) : BOOLEAN; 
  
VAR 
      DUMPTR : B0BUFPTR;
  
BEGIN 
PX3XAREQCK := FALSE;
IF X3LCCB'.LCCB.LCDFRGCNT <                 _LESS THAN W PACKETS       ?
                          X3LCCB'.LCCB.LCW
THEN
  BEGIN 
  IF X3LCCB'.LCCB.LCTCBPTR'.                _PACKET REQUEST NOT YET    ?
                   BSTCB.BSXFRGREQ = FALSE
  THEN
  BEGIN 
  DUMPTR     := NIL;
  PX3XAREQCK := TRUE; 
  PBQUEMAIN (X3LCCB'.LCCB.LCTCBPTR,         _TCB ADDRESS               ?
             DUMPTR,
             K4PUTBC);
  END 
  ELSE
    BEGIN _IF BSXFRGREQ = TRUE ?
    IF X3LCCB'.LCCB.LCNOBUF                 _IF NO BUFFERS LAST TIME   ?
    THEN
      BEGIN 
      PX3XAREQCK := TRUE;                   _TRY BLOCKHANDLER AGAIN    ?
      X3LCCB'.LCCB.LCNOBUF := FALSE;        _WITH FLAG CLEARED         ?
      END;
    END;  _IF BSXFRGREQ = TRUE ?
  END;
END; _ FUNCTION PX3XAREQCK                                             ?
  
_$J+? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*                            PX3SVMWKL                                * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW :                                                         * 
*              GENERATE A WORKLIST ENTRY TO SVM FOR APPLICATION       * 
*              TO APPLICATION CONNECTION, OR TCB EVENTS.              * 
*                                                                     * 
** INPUT :                                                            * 
*              X3WC    =  SVM WORKCODE                                * 
*              X3DT    =  CMDATA PART OF MESSAGE                      * 
*              X3TCB   =  TCB POINTER                                 * 
*                                                                     * 
** CALLING PROGRAMS :                                                 * 
*              PX3PRIMARY   - LEVEL 3 PRIMARY STATION                 * 
*                              (CASE 1, 4, 6, 10 AND 11)              * 
*              PX25TRANS    - MAIN PROGRAM (LEVEL 3)                  * 
*                                                                     * 
** OUTPUT :                                                           * 
*              MESSAGE SENT TO SVM                                    * 
*                - INCALL BLOCK FOR ICN/EX/R                          * 
*                - ICN/AP/N NORMAL RESPONSE                           * 
*                - ICN/AP/A WITH ABNORMAL RESPONSE CODE               * 
*              TCB EVENT                                              * 
*                                                                     * 
** EXTERNAL SUBROUTINES :                                             * 
*              PBLSPUT  - PUT WORKLIST                                * 
*              PBRELZRO - RELEASE BUFFERS                             * 
*                                                                     * 
** NOTES :                                                            * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PX3SVMWKL( X3WC : B08BITS; X3DT : B08BITS );
  
CONST 
      X3RSNCD   = $F;                       _FCD FOR ICN/AP/A RC       ?
      X3ICNAP   = $0E0C;                    _BUFFER FCD AND LCD FOR    ?
                                            _ ICN/AP/N RESPONSE        ?
BEGIN 
XOPARAMS.XAWC      := X3WC; 
XOPARAMS.XADATA    := X3DT; 
XOPARAMS.XATCBLCCB := X3TCB;                _TCB POINTER               ?
  
XOPARAMS.XABFRPTR  := NIL;
IF X3WC " D0TCB 
THEN
  BEGIN 
  XOPARAMS.XATCBLCCB := X3LCCB;             _LCCB POINTER FOR D0X25    ?
  IF X3DT " D5ICNR                          _IF NOT PAD CONNECTION     ?
  THEN
    BEGIN 
    XOPARAMS.XABFRPTR  := X3IPKPTR.X1BFPTR; _ICN/AP OR ICN/EX POINTER  ?
    X3IPKPTR.X1BFPTR   := NIL;
    IF XOPARAMS.XABFRPTR = NIL              _IF BUFFER IS RELEASED     ?
    THEN
      XOPARAMS.XABFRPTR := PBGET1BF(BEDBSIZE); _GET BUFFER FOR SVM MSG ?
    XOPARAMS.XABFRPTR'.BFFCD := X3OCT4;     _FCD TO ADDRESS LENGTH     ?
                                            _ FIELD LOCATION           ?
    IF X3DT " D5ICXR                        _SEND ICN/AP NORMAL OR     ?
    THEN                                    _ ABNORMAL RESPONSE        ?
      BEGIN 
      PBRELZRO (XOPARAMS.XABFRPTR'.BCCHAINS _RELEASE BUFFERS EXCEPT    ?
              [DBUFLENGTH], BEDBSIZE);      _ FIRST BUFFER             ?
      XOPARAMS.XABFRPTR'.BIINT[1] := X3ICNAP; 
  
      IF X3DT = D5ICAA                      _ABNORMAL ICN/AP RESPONSE  ?
      THEN
        BEGIN 
        XOPARAMS.XABFRPTR'.BFDATAC          _COPY ABNORMAL REASON CODE ?
                     [X3RSNCD] := CHR(X3DIAG.X3SCRC); 
        XOPARAMS.XABFRPTR'.BFLCD := X3RSNCD;
        END;
      END; _ SEND ICN/AP RESPONSE                                      ?
    END; _ X3DT " D5ICNR                                               ?
  END; _ X3WC " D0TCB                                                  ?
  
PBLSPUT(XOPARAMS.XAWORKLIST,                _SEND IT TO SVM            ?
                          BYWLCB[B0SMWL]);
X3DIAG.X3SCRC := 0; 
END; _ PROCEDURE PX3SVMWKL                                             ?
  
_$J+? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*                    PX3GETPACKET                                     * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW :                                                         * 
*              EXTRACT DOWNLINE PACKETS ON A GIVEN LOGICAL CHANNEL    * 
*                                                                     * 
** INPUT :                                                            * 
*              BZNLCCB = CURRENT LCCB                                 * 
*                                                                     * 
** CALLING PROGRAMS :                                                 * 
*              PX25TRANS    - MAIN PROGRAM                            * 
*                                                                     * 
** OUTPUT :                                                           * 
*              X3FIRST   = THE FIRST PACKET POINTER                   * 
*                                                                     * 
** EXTERNAL SUBROUTINES :                                             * 
*              PX3XAREQCK   - PACKET REQUEST TO A SUBTIP              * 
*              PX25TELTIP   - WORKLIST ENTRY TO X25TIP                * 
*                                                                     * 
** NOTES :                                                            * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
FUNCTION PX3GETPACKET (I : INTEGER) : BOOLEAN;
VAR 
      X3PTR     : X0BUFPTR;                 _PACKET ACCESS DEF         ?
      X3LAST    : B0BUFPTR;                 _LAST PAKCET POINTER       ?
      X3SVLCCB  : B0BUFPTR;                 _SAVED LCCB POINTER        ?
      X3CURLCCB : B0BUFPTR;                 _CURRENT LCCB POINTER      ?
  
      X3DONE    : BOOLEAN;
      X3STOP    : BOOLEAN;
  
      X3WORK    : INTEGER;
      X3COUNT   : INTEGER;                  _CURRENT PACKET COUNTER    ?
      X3PKTCNT  : INTEGER;                  _NUMBER OF PACKET TO SEND  ?
      X3MAXPKT  : INTEGER;                  _MAX PACKET CAN BE SENT    ?
  
BEGIN 
X3CURLCCB := XTSLCB'.BZXSLCB.BZNLCCB;       _GET NEXT LCCB FOR PACKETS ?
X3SVLCCB  := X3LCCB;                        _SAVE WORKING LCCB         ?
X3PKTCNT  := 0; 
X3FIRST   := NIL; 
X3LAST    := NIL; 
X3DONE    := FALSE; 
X3MAXPKT  := 2 + XTSLCB'.BZXSLCB.BZK; 
  
_ 
* * *  EXTRACT AVAILABLE PACKETS. 
? 
REPEAT                                      _UNTIL X3DONE              ?
  WITH X3CURLCCB'.LCCB DO 
    BEGIN 
_ 
* * * *  CHECK SUPERVISORY PACKET QUEUE FIRST 
? 
    IF LCSPQR " NIL                         _NOT EMPTY                 ?
    THEN
      BEGIN 
      IF X3FIRST = NIL                      _FIRST DOWNLINE PACKET     ?
      THEN
        BEGIN 
        X3FIRST  := LCSPQR; 
        X3LAST   := X3FIRST;
        X3PKTCNT := 1;                      _AT LEAST ONE PACKET       ?
        END 
      ELSE
        BEGIN 
        X3LAST'.BCCHAINS[QCHN] := LCSPQR; 
        END;
  
      LCSPQR := NIL;                        _CLEAR SUP PACKET QUEUE    ?
  
      WHILE X3LAST'.BCCHAINS[QCHN] " NIL DO _LOOK FOR LAST PACKET      ?
        BEGIN                               _ AND COUNT NUMBER OF NEW  ?
        X3PKTCNT := X3PKTCNT + 1;           _ PACKETS                  ?
        X3LAST   := X3LAST'.BCCHAINS[QCHN]; 
        END; _ WHILE X3LAST.BCCHAINS[QCHN] " NIL                       ?
      END; _ IF LCSPQR " NIL                                           ?
_ 
* * * *  CHECK DOWNLINE DATA PACKET QUEUE 
? 
    X3COUNT := 0;                           _DATA PACKET COUNTER       ?
    X3STOP  := NOT LCDXMITON; 
  
    WHILE (LCDPQR " NIL) & (NOT X3STOP) DO  _QUEUE NOT EMPTY           ?
      BEGIN 
      X3WORK := LCVS - LCLPRR;
      IF X3WORK < 0                         _GET MODULO 8              ?
      THEN
        X3WORK := X3WORK + 8; 
  
      IF X3WORK \ LCW                       _WINDOW IS CLOSED          ?
      THEN
        BEGIN 
        X3STOP   := TRUE; 
        END 
      ELSE                                  _WINDOW IS OPENED          ?
        BEGIN 
        X3COUNT       := X3COUNT + 1;       _UPDATE PACKET COUNT       ?
        X3PTR.X1BFPTR := LCDPQR;            _EXTRACT ONE PACKET        ?
        LCDFRGCNT     := LCDFRGCNT - 1;     _UPDATE DOWNLINE COUNT     ?
        LCDPQR        := LCDPQR'.           _UPDATE READ POINTER       ?
                            BCCHAINS[QCHN]; 
        X3PTR.X1BFPTR'.                     _CLEAR QUEUE CHAIN         ?
                  BCCHAINS[QCHN] := NIL;
        IF X3FIRST = NIL
        THEN
          X3FIRST := X3PTR.X1BFPTR          _FIRST PACKET IN QUEUE     ?
        ELSE                                _NOT FIRST PACKET          ?
          X3LAST'.BCCHAINS[QCHN] := X3PTR.X1BFPTR;
        X3LAST :=X3PTR.X1BFPTR;             _UPDATE END OF CHAIN       ?
  
        WITH X3PTR.X2BFPTR'.XBPKHDR DO
          BEGIN                             _SET P(R) AND P(S)         ?
          XPPS := LCVS; 
          LCVS := LCVS + 1;                 _UPDATE SEND SEQUENCE      ?
  
          IF LCREGULON                      _IF REGULATION ON          ?
          THEN
            XPPR := LCLPRS                  _TAKE OLD P(R)             ?
          ELSE
            BEGIN 
            XPPR   := LCVR;                 _TAKE CURRENT P(R)         ?
            LCLPRS := LCVR;                 _UPDATE IT                 ?
            END; _ IF LCREGULON                                        ?
          END; _ WITH X3PTR.X2BFPTR'                                   ?
  
        X3STOP := X3COUNT = LCW;            _CHECK WINDOW OVERFLOW     ?
        END; _ IF X3WORK < LCW                                         ?
      END; _ WHILE (LCDPQR " NIL) ...                                  ?
  
    LCDWLOCK := X3STOP;                     _REMEMBER OUTPUT CONDITION ?
  
    X3PKTCNT := X3PKTCNT + X3COUNT;         _UPDATE PACKET COUNT       ?
  
    IF LCTCBPTR " NIL                       _TCB EXISTS                ?
    THEN
      BEGIN 
      X3LCCB := X3CURLCCB;
      IF PX3XAREQCK (FALSE) 
      THEN
        BEGIN 
        LCTCBPTR'.BSTCB.BSXFRGREQ := TRUE;
        IF ((LCTCBPTR'.BSTCB.BSQPTR.BABUFPTR " NIL) ! 
            (LCTCBPTR'.BSTCB.BSXDLSRC " NIL)) 
        THEN
          PX25TELTIP (L3FRGR);
        END;
      END;
  
    IF X3PKTCNT \ X3MAXPKT                  _COLLECTED ENOUGH PACKETS  ?
    THEN
      BEGIN 
      XTSLCB'.BZXSLCB.BZNLCCB := LCNXTLCCB; _ASSIGN NETX LCCB          ?
      X3DONE                  := TRUE;      _EXIT                      ?
      END 
    ELSE
      BEGIN 
      X3DONE    := LCNXTLCCB = XTSLCB'.     _COMPLETED ONE LOOP        ?
                                 BZXSLCB.BZNLCCB; 
      X3CURLCCB := LCNXTLCCB; 
      END; _ IF X3PKTCNT \ X3COUNT                                     ?
    END; _ WITH X3CURLCCB                                              ?
  
  UNTIL X3DONE;                             _GOT ENOUGH PACKETS        ?
  
X3LCCB       := X3SVLCCB; 
PX3GETPACKET := X3PKTCNT " 0; 
END; _ FUNCTION PX3GETPACKET                                           ?
  
_$J+? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*                    PX3GPPKT                                         * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW :                                                         * 
*              GENERATES A PROTOCOL PACKET AND QUEUES IT TO LCCB.     * 
*                                                                     * 
** INPUT :                                                            * 
*              X3OPKTYPE = TYPE OF PACKET TO BE GENERATED             * 
*              XTSLCB    = SUB LCB ADDRESS                            * 
*                BZFRMRPEND = FRAME REQUEST PENDING                   * 
*              X3LCCB    = LCCB ADDRESS                               * 
*                LCHN      = LOGICAL CHANNEL NUMBER                   * 
*                LCREGULON = REGULATION IN EFFECT                     * 
*                LCLPRS    = LAST P(R) SENT                           * 
*                LCVR      = NEXT P(R) TO RECEIVE                     * 
*                                                                     * 
** CALLING PROGRAMS :                                                 * 
*              PX3PRIMARY   - PX3FREECN (FREEOUP CONNECTION)          * 
*                              (CASE 1, 4 AND 8)                      * 
*              PX3HDPROCESS - CHECK PACKET HEADER                     * 
*              PX3DTEC      - DTE CLEARING STATE                      * 
*              PX3DCEC      - DCE CLEARING STATE                      * 
*              PX3RDTE      - DTE RESET STATE                         * 
*              PX3PSPROK    - CHECK P(S) AND P(R)                     * 
*              PX3SECONDARY - LEVEL 3 SECONDARY STATION               * 
*                              (CASE 2, 4, 5, 6, 8, 9, 10 AND 11)     * 
*              PX25TRANS    - MAIN PROGRAM (LEVEL 3)                  * 
*                                                                     * 
** OUTPUT :                                                           * 
*              X3OPKPTR = POINTER TO GENERATED PACKET                 * 
*                                                                     * 
** EXTERNAL SUBROUTINES :                                             * 
*              PBGET1BF     - GET ONE DATA BUFFER                     * 
*              PTGETSET     - SET TYPE FOR OUTBOUND PACKET ID         * 
*              PBRELCHN     - RELEASE CHAIN OF BUFFERS                * 
*                                                                     * 
** NOTES :                                                            * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PX3GPPKT( X3OPKTYPE : B08BITS); 
  
VAR 
  X4INT    : INTEGER;                       _TEMPORARY INTEGER         ?
  X3TPKPTR : X0BUFPTR;                      _TEMPORARY BUF PTR         ?
  
BEGIN 
IF XTSLCB'.BZXSLCB.BZDCES = FALSE           _IF NOT DCE RESTARTING     ?
THEN
BEGIN 
PTGETSET(X3OPKTYPE, X3OPKSET);              _CONVERT TO SET TYPE       ?
X3OPKPTR.X1BFPTR := PBGET1BF(BEDBSIZE);     _ACQUIRE BUFFER            ?
  
WITH X3OPKPTR.X2BFPTR'.XBPKHDR DO           _PACKET HEADER             ?
  BEGIN 
  
  XPGFI              := X9MODL8;            _SET GFI (MODULO OF 8)     ?
  XPLCHN             := X3LCCB'.LCCB.LCHN;  _LOGICAL CHANNEL NUMBER    ?
  X3OPKPTR.X1BFPTR'.                        _CLEAR QUEUE CHAIN         ?
      BCCHAINS[QCHN] := NIL;
  XPGPKID            := X3PKTID[X3OPKTYPE]; _EXTERNAL PACKET TYPE      ?
  END; _ WITH PACKET POINTER                                           ?
  
X3OPKPTR.X1BFPTR'.BIINT[1] := X3PFLCD;      _SET DEFAULT PACKET        ?
                                            _ HEADER LCD AND FCD       ?
_ 
* * * *  CLEAR OR RESET PACKETS 
? 
IF ([X5CLEAR,X5RESET] & X3OPKSET.BASETN) " [ ]
THEN
  BEGIN 
  X3OPKPTR.X2BFPTR'.                        _STORE CAUSE CODE          ?
          XBPKHDR.XPCAUSE := X3CAUSE; 
  X3OPKPTR.X2BFPTR'.                        _STORE DIAGNOSTIC CODE     ?
           XBPKHDR.XPDIAG := X3DIAG.X3SCRC; 
  X3OPKPTR.X1BFPTR'.BFLCD := X3OCT5;        _SET BUFFER LCD            ?
  END; _ X5CLRREQ,X5RSTREQ                                             ?
_ 
* * * *  RR OR RNR PACKETS
? 
IF ([X5RR,X5RNR] & X3OPKSET.BASETN) " [ ] 
THEN
  BEGIN 
  WITH X3LCCB'.LCCB DO                      _LCCB POINTER              ?
    BEGIN 
    IF LCREGULON                            _REGULATION IN EFFECT      ?
    THEN
      BEGIN 
      X3OPKPTR.X2BFPTR'.XBPKHDR.XPGPKID := X3PKTID[X5RNR];
      X3OPKPTR.X2BFPTR'.XBPKHDR.XPNPR   := LCLPRS;
      END 
    ELSE
      BEGIN 
      X3OPKPTR.X2BFPTR'.XBPKHDR.XPNPR := LCVR;
      LCLPRS := LCVR; 
      END;
    END; _ WITH X3LCCB                                                 ?
  END; _ X5RR,X5RNR                                                    ?
_ 
* * * *  INTERRUPT REQUEST PACKET 
? 
IF ([X5INTRRPT] & X3OPKSET.BASETN) " [ ]
THEN
  BEGIN 
  X3OPKPTR.X1BFPTR'.BFLCD := X3OCT4;        _USER BYTE (OCTET 4)       ?
  X3OPKPTR.X1BFPTR'.
          BFDATAC[X3OCT4] := CHR(XIPARAMS.XADATA);
  END; _ X5INTRRPT                                                     ?
_ 
* * * *  CALL ACCEPTED PACKET 
? 
IF ([X5CALACC] & X3OPKSET.BASETN) " [ ] 
THEN
  BEGIN 
  IF X3LCCB'.LCCB.LCCNTYPE = N0XAPPL        _A-A CONNECTION            ?
  THEN
    BEGIN 
    IF X3IPKPTR.X1BFPTR'.BFLCD < X3AL12     _NOTHING TO SEND           ?
    THEN
      PBRELCHN(X3IPKPTR.X1BFPTR, BEDBSIZE)
    ELSE
      GOTO 10;
    END; _ N0XAPPL                                                     ?
  END; _ X5CALACC                                                      ?
_ 
* * * * CALL REQUEST PACKET 
? 
IF ([X5CALL] & X3OPKSET.BASETN) " [ ] 
THEN
  BEGIN 
10: 
  X3OCTET.OCTET := X3IPKPTR.X1BFPTR'.BFDATAC[X3AL12]; 
                                            _ADDRESS FIELD VALUES      ?
  X4INT         := X3OCTET.CGADDR           _CALLING DCE ADDR LENGTH   ?
                   + X3OCTET.CDADDR         _CALLED DTE ADDR LENGTH    ?
                     + 1;                   _IN SEMI-OCTETS (RNDED UP) ?
  X4INT         := X4INT DIV 2;             _ADDR LENGTH IN OCTETS     ?
  X3MARK        := X3AL12 + X4INT + 1;      _FACL LENGTH POSITION      ?
  X3OCTET.OCTET := X3IPKPTR.X1BFPTR'.BFDATAC[X3MARK]; 
                                            _FACL LENGTH (OCTETS)      ?
  X3MARK        := X3MARK + X3OCTET.FACL;   _END OF FACL POSITION      ?
  IF ([X5CALACC] & X3OPKSET.BASETN) " [ ]   _CALL ACCEPT PACKET        ?
  THEN
    X3IPKPTR.X1BFPTR'.BFLCD := X3MARK       _SET LCD = END OF FACL     ?
  ELSE   _IF CALL REQUEST PACKET                                       ?
    BEGIN 
    X3OCTET.OCTET := X3IPKPTR.X1BFPTR'.BFDATAC[X3MARK + 4]; 
                                            _USER DATA LENGTH IN 4TH CH?
    X3IPKPTR.X1BFPTR'.BFDATAC[X3MARK + 4] := CHR(0);
                                            _CLEAR USER DATA LENGTH    ?
    X3MARK := X3MARK + X3OCTET.OCINT;       _END OF USER DATA          ?
    X3TPKPTR.X1BFPTR := X3IPKPTR.X1BFPTR; 
    IF X3TPKPTR.X1BFPTR'.BFLCD < X3MARK     _LCD NOT IN THE BUFFER     ?
    THEN
      BEGIN 
      X3MARK := X3MARK - X3TPKPTR.X1BFPTR'.BFLCD; _ LENGTH IN NEXT BUF ?
      X3TPKPTR.X1BFPTR := X3TPKPTR.X1BFPTR'.BCCHAINS[DBUFLENGTH]; 
                                            _CHAINED BUFFER ADDRESS    ?
      X3MARK := X3MARK + X3TPKPTR.X1BFPTR'.BFFCD - 1; _LCD VALUE       ?
      END;
    X3TPKPTR.X1BFPTR'.BFLCD := X3MARK;      _SET LCD = END OF USER DATA?
    IF X3TPKPTR.X1BFPTR'.BCCHAINS[DBUFLENGTH] " NIL _IF BUFFER CHAINED ?
    THEN
      PBRELCHN(X3TPKPTR.X1BFPTR'.BCCHAINS[DBUFLENGTH], BEDBSIZE); 
                                            _RELEASE BUFFER            ?
    END;  _ELSE?
  X3IPKPTR.X1BFPTR'.BFFCD := X3AL12;        _SET FCD TO ADDRESS FIELD  ?
                                            _ LENGTH FIELD             ?
  X3OPKPTR.X1BFPTR'.BCCHAINS[DBUFLENGTH] := X3IPKPTR.X1BFPTR; 
  X3IPKPTR.X1BFPTR := NIL;
  END; _ X5CALL                                                        ?
  
IF X3LCCB'.LCCB.LCSPQR = NIL                _QUEUE IS EMPTY            ?
THEN
  X3LCCB'.LCCB.LCSPQR := X3OPKPTR.X1BFPTR 
ELSE                                        _QUEUE NOT EMPTY           ?
  X3LCCB'.LCCB.LCSPQW'.BCCHAINS [QCHN] := 
    X3OPKPTR.X1BFPTR; 
  X3LCCB'.LCCB.LCSPQW := X3OPKPTR.X1BFPTR;  _END OF CHAIN              ?
IF XTSLCB'.BZXSLCB.BZFRMRPEND               _FRAME REQUEST PENDING     ?
THEN
  XTL3FRMR := TRUE;                         _LAUNCH OUTPUT (LATER)     ?
  
END;  _IF XTSLCB'.BZXSLCB.BZDCES = FALSE                               ?
END; _ PROCEDURE PX3GPPKT                                              ?
  
_$J+? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*                       PX3DTEC                                       * 
*             HANDLES THE DTE CLEARING STATE                          * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW :                                                         * 
*             PX3DTEC CHECKS IF A CONNECTION IS ASSIGNED              * 
*             IF SO, A D5DOWN REQUEST IS SENT UPLINE ELSE             * 
*             THE LOGICAL CHANNEL GOES TO DTE WAITING STATE           * 
*                                                                     * 
** INPUT :                                                            * 
*             X3LCCB  = LCCB POINTER                                  * 
*                                                                     * 
** CALLING PROGRAMS :                                                 * 
*              PX3PRIMARY   - LEVEL 3 PRIMARY STATION                 * 
*                              (CASE 1, 2 AND 8)                      * 
*              PX3HDPROCESS - CHECK INBOUND PACKET HEADER             * 
*              PX3ULPACKET  - DECODE INBOUND PACKET HEADER            * 
*                                                                     * 
** OUTPUT :                                                           * 
*              A CLEAR REQUEST PACKET                                 * 
*              D0TCB/D5DOWN TO SVM                                    * 
*                                                                     * 
** EXTERNAL SUBROUTINES :                                             * 
*              PX3GPPKT     - GENERATE A PACKET                       * 
*              PX25TELTIP   - SEND UPLINE SVM MESSAGE                 * 
*              PBRELZRO     - RELEASE CHAIN OF BUFFERS                * 
*                                                                     * 
** NOTES :                                                            * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PX3DTEC;
BEGIN 
PBRELZRO(X3IPKPTR.X1BFPTR,BEDBSIZE);        _RELEASE PACKET            ?
WITH X3LCCB'.LCCB DO                        _LCCB POINTER              ?
 BEGIN
 IF LCPHPSTATE = X7DCEW                     _IF IN CALL IN PROGRESS    ?
 THEN                                       _PROCESSING OF DTE CLEAR   ?
   LCDTEW := TRUE                           _ DELAYED.                 ?
 ELSE 
  BEGIN 
  IF LCTCBPTR = NIL                         _TCB NOT LINKED            ?
  THEN
    BEGIN 
    IF LCDCEC = FALSE                       _CHECK FOR DCE CLEARING    ?
    THEN
      BEGIN 
      LCPHPSTATE := X7DTEC;                 _DTE CLEARING              ?
      PX3GPPKT(X5CLEAR);                    _CLEAR REQUEST             ?
      END;
    END 
  ELSE                                      _TCB IS LINKED             ?
    BEGIN 
    IF LCDCEC = FALSE                       _DON T REPORT TWICE        ?
    THEN
      IF LCDTEC = FALSE 
      THEN
        BEGIN 
        PX25TELTIP(L3TCB);                  _D0TCB,D5DOWN              ?
        LCDTEC := TRUE;                     _MARK DTE CLEARING         ?
        END;
    END; _ LCTCBPTR = NIL                                              ?
  END; _ ELSE - IF LCPHPSTATE = X7DCEW                                 ?
 END;  _ WITH LCCB                                                     ?
END; _ PROCEDURE PX3DTEC                                               ?
  
_$J+? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*                       PX3DCEC                                       * 
*             HANDLES THE DCE CLEARING STATE                          * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW :                                                         * 
*             PX3DCEC CHECKS IF A CONNECTION IS ASSIGNED              * 
*             IF SO, A D5DOWN REQUEST IS SENT UPLINE ELSE             * 
*             THE LOGICAL CHANNEL GOES BACK TO READY STATE            * 
*                                                                     * 
** INPUT :                                                            * 
*             X3LCCB  = LCCB POINTER                                  * 
*                                                                     * 
** CALLING PROGRAMS :                                                 * 
*              PX3PRIMARY   - LEVEL 3 PRIMARY STATION (CASE 3 AND 8)  * 
*                                                                     * 
** OUTPUT :                                                           * 
*                                                                     * 
** EXTERNAL SUBROUTINES :                                             * 
*             PX25FLSHLCCB - INITIALIZE LCCB                          * 
*             PX3GPPKT     - GENERATE A PACKET                        * 
*             PX25TELTIP   - SEND UPLINE SVM MESSAGE                  * 
*              PBRELZRO     - RELEASE CHAIN OF BUFFERS                * 
*                                                                     * 
** NOTES :                                                            * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PX3DCEC;
VAR 
      X3PSTATE : BOOLEAN; 
BEGIN 
PBRELZRO(X3IPKPTR.X1BFPTR,BEDBSIZE);        _RELEASE PACKET            ?
WITH X3LCCB'.LCCB DO                        _LCCB POINTER              ?
 BEGIN
 IF LCPHPSTATE = X7DCEW                     _IF IN CALL IN PROGRESS    ?
 THEN                                       _PROCESSING OF DCE CLEAR   ?
   LCDCEW := TRUE                           _ DELAYED.                 ?
 ELSE 
  BEGIN 
  IF LCTCBPTR = NIL                         _TCB NOT LINKED            ?
  THEN
    BEGIN 
    X3PSTATE   := (LCPHPSTATE " X7DTEC);    _KEEP TRACK OF STATE       ?
    PX25FLSHLCCB(X3LCCB,TRUE);              _INITIALIZE LCCB           ?
    IF X3PSTATE 
    THEN
      PX3GPPKT(X5CLRCONF);                  _CLEAR CONFIRMATION        ?
    END 
  ELSE                                      _TCB IS LINKED             ?
    BEGIN 
    IF LCDTEC = FALSE                       _D5DOWN NOT SENT YET       ?
    THEN
      BEGIN 
      IF LCDCEC = FALSE 
      THEN
        BEGIN 
        PX25TELTIP(L3TCB);                  _D0TCB,D5DOWN              ?
        LCDCEC := TRUE;                     _DCE CLEARING              ?
        END;
      END 
    ELSE
      IF LCINVCLR 
      THEN
        BEGIN 
        PX25FLSHLCCB(X3LCCB,TRUE);          _INITIALIZE LCCB           ?
        PX3GPPKT(X5CLRCONF);                _SEND CLEAR CONFIRMATION   ?
        END 
      ELSE
        LCDCEC := TRUE;                     _KEEP TRACK OF CLEARING    ?
    END; _ LCTCBPTR = NIL                                              ?
  END; _ ELSE - IF LCPHPSTATE = X7DCEW                                 ?
 END;  _ WITH LCCB                                                     ?
END; _ PROCEDURE PX3DCEC                                               ?
  
_$J+? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*                       PX3RDTE                                       * 
*                  HANDLES THE DTE RESET STATE                        * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
  
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW :                                                         * 
*                  FOR AN A-A CONNECTION A BREAK IS SENT UPLINE.      * 
*                  FOR A TERMINAL CONNECTION A RESET IS SENT.         * 
*                                                                     * 
** INPUT :                                                            * 
*                  X3LCCB   =  LCCB POINTER                           * 
*                                                                     * 
** CALLING PROGRAMS :                                                 * 
*              PX3PNP       - PROCESS NUMBERED PACKET                 * 
*                                                                     * 
** OUTPUT :                                                           * 
*              INDICATION OF UPLINE BREAK TO X25 TIP OR RESET         * 
*              REQUEST PACKET.                                        * 
*                                                                     * 
** EXTERNAL SUBROUTINES :                                             * 
*              PX25TELTIP   - UPLINE WORKLIST TO X25                  * 
*              PX25FLSHLCCB - INITIALIZE LCCB                         * 
*              PX3GPPKT     - GENERATE PACKET                         * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PX3RDTE;
BEGIN 
WITH X3LCCB'.LCCB DO                        _LCCB POINTER              ?
  BEGIN 
  LCPHSSTATE := X8DTER;                     _DTE RESET                 ?
  LCDXMITON  := FALSE;                      _DISABLE OUTPUT            ?
  IF LCCNTYPE = N0XAPPL                     _A-A CONNECTION            ?
  THEN
    BEGIN 
    X3BRKRC       := X3BRDTE;               _RESET REQUEST FROM DTE    ?
    X3CAUSE       := X3BRTC;                _SET CAUSE CODE            ?
    X3DIAG.X3SCRC := X3BRTD;                _SET DIAG CODE             ?
    PX25TELTIP(L3BREAK);                    _UPLINE BREAK              ?
    PX25FLSHLCCB(X3LCCB,FALSE);             _FLUSH BUFFERS             ?
    LCDTER := TRUE; 
    LCUBRK := TRUE;                         _UPLINE BREAK SENT         ?
    END 
  ELSE
    PX3GPPKT(X5RESET);                      _SEND A RESET REQUEST      ?
  END; _ WITH X3LCCB                                                   ?
END; _ PROCEDURE PX3RDTE                                               ?
_$J+? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*                    PX3PRCHECK                                       * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW :                                                         * 
*              CHECK P(R) ON AN UPLINE NUMBERED PACKET                * 
*                                                                     * 
** INPUT :                                                            * 
*              X3LCCB = LCCB POINTER                                  * 
*                LCLPRR = LAST P(R) RECEIVED                          * 
*                LCVS   = NEXT P(S) TO SEND                           * 
*              X3PR   = P(R) TO BE CHECKED                            * 
*                                                                     * 
** CALLING PROGRAMS :                                                 * 
*              PX3PSPROK   - CHECK P(R) AND P(S) FOR DATA PACKET      * 
*                                                                     * 
** OUTPUT :                                                           * 
*              PX3PRCHECK = FALSE IF NO ERRORS                        * 
*                                                                     * 
** EXTERNAL SUBROUTINES :                                             * 
*              NONE                                                   * 
** NOTES :                                                            * 
*              THIS CODE CHECKS FOR LAST P(R) RECEIVED @ P(R) @ V(S)  * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
FUNCTION PX3PRCHECK(X3PR : B03BITS) : BOOLEAN;
VAR 
      X3IVS   : INTEGER;                    _V(S) LOCAL COPY           ?
      X3IPR   : INTEGER;                    _P(R) LOCAL COPY           ?
      X3ILPRR : INTEGER;                    _LAST P(R) LOCAL COPY      ?
      DUMPTR : B0BUFPTR;                    _DUMMY POINTER             ?
BEGIN 
PX3PRCHECK := TRUE;                         _SET TO ERRORS             ?
X3IVS      := X3LCCB'.LCCB.LCVS;            _ACQUIRE V(S)              ?
X3IPR      := X3PR;                         _ACQUIRE P(R)              ?
X3ILPRR    := X3LCCB'.LCCB.LCLPRR;          _ACQUIRE LAST P(R)         ?
IF X3IVS < X3ILPRR
THEN
  BEGIN 
  X3IVS := X3IVS + 8; 
  IF X3ILPRR > X3IPR
  THEN
    X3IPR := X3IPR + 8; 
  END;
  
IF X3ILPRR @ X3IPR                          _CHECK P(R) IN BOUNDS      ?
THEN
  IF X3IPR @ X3IVS
  THEN
    BEGIN 
    PX3PRCHECK := FALSE;
    IF X3ILPRR " X3IPR                      _IF NEW P(R)               ?
    THEN
      BEGIN 
      IF X3LCCB'.LCCB.LCDFRGCNT <           _LESS THAN W PACKETS       ?
                              X3LCCB'.LCCB.LCW
      THEN
        BEGIN 
        DUMPTR := NIL;
        PBQUEMAIN(X3LCCB'.LCCB.LCTCBPTR,    _TCB ADDRESS               ?
                  DUMPTR,                   _NIL                       ?
                  K4PUTBC);                 _TELL BIP TO SEND BACK     ?
        END; _ IF LCDFRGCNT < LCW                                      ?
      END; _ IF X3ILPRR " X3IPR                                        ?
    END; _ IF X3IPR @ X3IVS                                            ?
END; _ FUNCTION PX3PRCHECK                                             ?
  
_$J+? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*                    PX3PSPROK                                        * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW :                                                         * 
*              CHECKS P(S) AND P(R) FOR A DATA PACKET                 * 
*              AND P(R) ONLY FOR RR AND RNR PACKETS                   * 
*                                                                     * 
** INPUT :                                                            * 
*              X3IPKHDR = LOCAL PACKET HEADER                         * 
*              X3LCCB   = LCCB ADDRESS                                * 
*                LCDPQR   = DOWNLINE PACKET QUEUE READ POINTER        * 
*                LCLPRS   = LAST P(R) SENT                            * 
*                LCVR     = NEXT EXPECTED P(S)                        * 
*                LCW      = PACKET LEVEL WINDOW                       * 
*                LCLPRR   = LAST P(R) RECEIVED                        * 
*                                                                     * 
** CALLING PROGRAMS :                                                 * 
*              PX3PNP  - CHECK P(S) AND P(R) FOR RR AND RNR PACKET    * 
*                                                                     * 
** OUTPUT :                                                           * 
*              PX3PSPROK = TRUE IF NO ERRORS                          * 
*              IF NO ERRORS OCURRED THEN                              * 
*              FOR A DATA PACKET:                                     * 
*                LCVR   = LCVR + 1                                    * 
*                LCLPRR = NEWLY RECEIVED P(R)                         * 
*              FOR A RR OR RNR PACKET:                                * 
*                LCLPRR = NEWLY RECEIVED P(R)                         * 
*                                                                     * 
*              IF V(R) - LAST P(R) SENT = W (WINDOW CLOSED)           * 
*              AND NO DOWNLINE DATA OR SEND WINDOW CLOSED 
*                  OR 
*              D-BIT SET IN THE RECEIVED PACKET,
*                THEN A RR PACKET IS GENERATED                        * 
*                                                                     * 
** EXTERNAL SUBROUTINES :                                             * 
*              PX3GPPKT     - GENERATE A PROTOCOL PACKET              * 
*              PX3PRCHECK   - CHECK P(R)                              * 
** NOTES :                                                            * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
FUNCTION PX3PSPROK(I : BOOLEAN) : BOOLEAN;
VAR 
      X3PS   : B03BITS;                     _LOCAL P(S)                ?
      X3PR   : B03BITS;                     _LOCAL P(R)                ?
      X3WORK : INTEGER; 
BEGIN 
WITH X3LCCB'.LCCB DO                        _LCCB POINTER              ?
  BEGIN 
  IF X3IPKTYPE = X5DATA                     _DATA PACKET               ?
  THEN
    BEGIN 
    X3PR := X3IPKHDR.XPPR;                  _ACQUIRE P(R)              ?
    X3PS := X3IPKHDR.XPPS;                  _ACQUIRE P(S)              ?
    PX3PSPROK := FALSE; 
    IF X3PS = LCVR
    THEN
      IF X3PS " ((LCLPRS + LCW) MOD 8)
      THEN
        IF PX3PRCHECK(X3PR) = FALSE 
        THEN
          BEGIN 
          PX3PSPROK := TRUE;
          LCVR      := LCVR + 1;            _UPDATE V(R)               ?
          LCLPRR    := X3PR;                _UPDATE LAST P(R) RCVD     ?
          X3WORK    := LCVR - LCLPRS; 
          IF X3WORK < 0 
          THEN
            X3WORK := X3WORK + 8; 
          IF X3IPKHDR.XPDBIT !              _D-BIT SET    OR           ?
             ((X3WORK = LCW)  &             _(RECEIVE WINDOW CLOSED AND?
                ((LCDPQR = NIL) !           _ (NO DOWNLINE DATA   OR   ?
                                LCDWLOCK))  _  SEND WINDOW CLOSED))    ?
            THEN
              PX3GPPKT(X5RR);               _UNLOCK WINDOW             ?
          END;
    END 
  ELSE                                      _RR OR RNR PACKET          ?
    BEGIN 
    X3PR := X3IPKHDR.XPNPR;                 _ACQUIRE P(R)              ?
    IF PX3PRCHECK(X3PR) 
    THEN
      PX3PSPROK := FALSE                    _ERROR                     ?
    ELSE
      BEGIN 
      PX3PSPROK := TRUE;                    _NO ERRORS                 ?
      LCLPRR    := X3PR;                    _UPDATE LAST P(R) RCVD     ?
      END;
    END;
  END; _ WITH X3LCCB                                                   ?
END; _ FUNCTION PX3PSPROK                                              ?
  
_$J+? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*                    PX3PNP                                           * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW :                                                         * 
*              PROCESS NUMBERED PACKETS                               * 
*                                                                     * 
** INPUT :                                                            * 
*              X3IPKTYPE = INTERNAL PACKET TYPE                       * 
*              X3LCCB    = LCCB POINTER                               * 
*              XTSLCB    = SUB LCB POINTER                            * 
*                                                                     * 
** CALLING PROGRAMS :                                                 * 
*              PX3SECONDARY - LEVEL 3 SECONDARY STATE (CASE 1)        * 
*                                                                     * 
** OUTPUT :                                                           * 
*              IF NO ERRORS:                                          * 
*                DATA PACKET QUEUED UPLINE                            * 
*                LCLPRR : UPDATED                                     * 
*                LCVR   : UPDATED                                     * 
*                LCDXMITON SET (RR) OR RESET(RNR)                     * 
*              IF ANY ERRORS:                                         * 
*                DISCONNECT REQUESTED TO X.25 TIP                     * 
*                                                                     * 
** EXTERNAL SUBROUTINES :                                             * 
*              PX3PSPROK    - CHECK P(S) AND P(R)                     * 
*              PX3XAREQCK   - DOWNLINE PACKET REQUEST TO A SUBTIP     * 
*              PX3RDTE      - DTE RESETTING                           * 
*              PX25TELTIP   - WORKLIST ENTRY TO X25TIP                * 
*              PBRELZRO     - RELEASE A CHAIN OF BUFFERS              * 
*                                                                     * 
** NOTES :                                                            * 
*                                                                     * 
*              THIS PROCEDURE WILL GENERATE A RECYCLED L2FRMR         * 
*              WORKLIST ENTRY WHEN THE FOLLOWING CONDITIONS ARE MET:  * 
*                -A FRAME REQUEST IS PENDING                          * 
*                -THE DOWNLINE WINDOW WAS CLOSED AND A NEW P(R)       * 
*                 JUST OPENED IT.                                     * 
*              THIS WILL THEN FORCE AN OUTPUT WHEN A NO TRAFFIC       * 
*              CONDITION EXISTS.                                      * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PX3PNP; 
VAR 
      X3WORK : INTEGER; 
BEGIN 
WITH X3LCCB'.LCCB DO                        _LCCB POINTER              ?
  BEGIN 
  
  IF X3IPKTYPE = X5DATA                     _DATA PACKET               ?
  THEN
    BEGIN 
    IF PX3PSPROK(FALSE)                     _CKECK P(S) AND P(R)       ?
    THEN
      BEGIN 
_ 
* * * * MOVE M AND Q BIT FROM PACKET HEADER TO BUFFER HEADER
? 
      X3IPKPTR.X2BFPTR'.XBFRGQBIT := X3IPKHDR.XPQBIT; 
      X3IPKPTR.X2BFPTR'.XBFRGMBIT := X3IPKHDR.XPMBIT; 
_ 
* * * *  SKIP FRAME/PACKET HEADER 
? 
      X3IPKPTR.X1BFPTR'.BFFCD       := 13;
      X3IPKPTR.X1BFPTR'.                    _END OF CHAIN              ?
                     BCCHAINS[QCHN] := NIL; 
      IF LCCNTYPE = N0XAPPL                 _A-A CONNECTION            ?
      THEN
        IF LCPHSSTATE " X8FCR               _RESET STATE               ?
        THEN
          PBRELZRO(X3IPKPTR.X1BFPTR,        _DISCARD PACKET            ?
                                BEDBSIZE);
      IF X3IPKPTR.X1BFPTR " NIL 
      THEN
        BEGIN 
        XOPARAMS.XAREQ := PX3XAREQCK (FALSE); 
        PX25TELTIP(L3FRGQ);                 _SEND TO SUB TIP           ?
        END;
      END 
    ELSE
      BEGIN 
      PBRELZRO(X3IPKPTR.X1BFPTR, BEDBSIZE); 
      PX3RDTE;                              _DTE RESET STATE           ?
      END; _ ERROR IF P(S) OR P(R)                                     ?
    END; _ X5DATA                                                      ?
  
  IF ([X5RR,X5RNR] & X3IPKSET.BASETN) " [ ] _RR,RNR PACKETS            ?
  THEN
    BEGIN 
    IF PX3PSPROK(FALSE)                     _CHECK P(R)                ?
    THEN
      LCDXMITON := (X3IPKTYPE = X5RR)       _CHECK XMISSION STATE      ?
    ELSE                                    _INVALID P(R)              ?
      PX3RDTE;                              _DTE RESET STATE           ?
    END; _ X5RR, X5RNR                                                 ?
_ 
* * * *  CHECK IF WINDOW JUST OPENED
? 
  X3WORK := LCVS - LCLPRR;
  IF X3WORK < 0 
  THEN
    X3WORK := X3WORK + 8; 
  IF XTSLCB'.BZXSLCB.BZFRMRPEND             _FRAME REQUEST PENDING     ?
  THEN
    IF LCDWLOCK                             _WINDOW WAS CLOSED         ?
    THEN
      IF X3WORK < LCW                       _AND JUST OPENED           ?
      THEN
        XTL3FRMR := TRUE;                   _LEVEL 3 FRAME REQUEST     ?
  END; _ WITH X3LCCB'LCCB                                              ?
END; _ PROCEDURE PX3PNP                                                ?
  
_$J+? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*                    PX3RINIT                                         * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW :                                                         * 
*              INITIALIZE A CHANNEL AFTER A RESET OCCURED             * 
*                                                                     * 
** INPUT :                                                            * 
*              X3LCCB = LCCB ADDRESS                                  * 
*                                                                     * 
** CALLING PROGRAMS :                                                 * 
*              PX3SECONDARY - LEVEL 3 SECONDARY STATION               * 
*                              (CASE 6, 8, 10 AND 11)                 * 
*                                                                     * 
** OUTPUT :                                                           * 
*              REINITIALIZE LCCB                                      * 
*                                                                     * 
** EXTERNAL SUBROUTINES :                                             * 
*              PX25FLSHLCCB - CLEAN LCCB FILEDS                       * 
*                                                                     * 
** NOTES :                                                            * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PX3RINIT; 
BEGIN 
WITH X3LCCB'.LCCB DO                        _LCCB POINTER              ?
  BEGIN 
  PX25FLSHLCCB(X3LCCB,FALSE);               _FLUSH BUFFERS             ?
  LCPHSSTATE := X8FCR;                      _RESET STATE               ?
  LCDXMITON := TRUE;                        _ENABLE DATA XMISSION      ?
  LCDWLOCK  := FALSE;                       _WINDOW OPENED             ?
  LCDTER    := FALSE; 
  LCDCER    := FALSE; 
  LCUBRK    := FALSE; 
  LCDBRK    := FALSE; 
  LCVR      := 0; 
  LCVS      := 0; 
  LCLPRR    := 0; 
  LCLPRS    := 0; 
  END; _ WITH X3LCCB                                                   ?
END; _ PROCEDURE PX3RINIT                                              ?
  
_$J+? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*                    PX3SECONDARY                                     * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW :                                                         * 
*              PROCESS PACKETS WHEN PRIMARY STATE IS DATA TRANSFER    * 
*                                                                     * 
** INPUT :                                                            * 
*              X8SCASE = CASE CODE TO BE EXECUTED                     * 
*              X3LCCB  = LCCB POINTER                                 * 
*                                                                     * 
** CALLING PROGRAMS :                                                 * 
*              PX3PRIMARY   - LEVEL 3 PRIMARY STATION (CASE 12)       * 
*                                                                     * 
** OUTPUT :                                                           * 
*                                                                     * 
** EXTERNAL SUBROUTINES :                                             * 
*              PX3RDTE      - DTE RESET STATE                         * 
*              PX25TELTIP   - WORKLIST ENTRY TO X25TIP                * 
*              PX3GPPKT     - GENERATE PROTOCOL PACKET                * 
*              PX25FLSHLCCB - CLEAN FIELDS IN GIVEN LCCB              * 
*              PX3RINIT     - INITIALIZE GIVEN LOGICAL CHANNEL        * 
*                             AFTER RESET OCCURED                     * 
*              PBRELZRO     - RELEASE A CHAIN OF BUFFERS              * 
*                                                                     * 
? 
_$J+? 
_ 
** NOTES :                                                            * 
*                   STATE TABLE SVCS                                  * 
*                   ----------------                                  * 
*                                                                     * 
*                    I FLOW    I DTE   I DCE   I                      * 
*                    I CONTROL I RESET I RESET I                      * 
*                    I READY   I       I       I                      * 
*                    I         I       I       I                      * 
*                    I   D1    I  D2   I  D3   I                      * 
*     +--------------+---------+-------+-------+                      * 
*     I RESET        I    6    I  10   I  12   I                      * 
*     I INDICATION   I         I       I       I                      * 
*     +--------------+---------+-------+-------+                      * 
*     I RESET        I    9    I  10   I  12   I                      * 
*     I CONFIRMATION I         I       I       I                      * 
*     +--------------+---------+-------+-------+                      * 
*     I DATA         I    1    I  12   I  12   I                      * 
*     I RR, RNR      I         I       I       I                      * 
*     +--------------+---------+-------+-------+                      * 
*     I INTERRUPT    I    2    I  12   I  12   I                      * 
*     I INDICATION   I         I       I       I                      * 
*     +--------------+---------+-------+-------+                      * 
*     I INTERRUPT    I    3    I  12   I  12   I                      * 
*     I CONFIRMATION I         I       I       I                      * 
*     +--------------+---------+-------+-------+                      * 
*     +--------------+---------+-------+-------+                      * 
*     I DOWNLINE     I    7    I   8   I  11   I                      * 
*     I BREAK        I         I       I       I                      * 
*     +--------------+---------+-------+-------+                      * 
*     I DOWNLINE     I   --    I   8   I  11   I                      * 
*     I RESET        I         I       I       I                      * 
*     +--------------+---------+-------+-------+                      * 
*     I INTERRUPT    I    4    I  --   I  --   I                      * 
*     I REQUEST      I         I       I       I                      * 
*     +--------------+---------+-------+-------+                      * 
*     I INTERRUPT    I    5    I  --   I  --   I                      * 
*     I CONFIRMATION I         I       I       I                      * 
*     +--------------+---------+-------+-------+                      * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
  
_$J+? 
PROCEDURE PX3SECONDARY; 
VAR 
      X8SCASE : INTEGER;                    _CASE CODE                 ?
BEGIN 
WITH X3LCCB'.LCCB DO                        _LCCB POINTER              ?
  BEGIN 
_ 
  * * * *  GET SECONDARY CASE CODE
? 
  LCPHSEVENT := X3SCODE;                    _KEEP TRACK OF EVENT       ?
  X3STATE    := LCPHSSTATE;                 _GET STATE                 ?
_ IF LCPVC = FALSE                           SWITCHED CHANNEL          ?
_ THEN                                                                 ?
    X8SCASE := XASSVCMATRIX[X3STATE,X3SCODE]; 
_/ELSE
    X8SCASE := XASPVCMATRIX[X3STATE,X3EVENT]; /                        ?
  
  CASE X8SCASE OF 
  
    1:                                      _01                        ?
      PX3PNP;                               _PROCESS NUMBERED PACKETS  ?
  
    2:                                      _02                        ?
      BEGIN 
      IF LCCNTYPE = N0XAPPL                 _A-A CONNECTION            ?
      THEN
        BEGIN 
        XOPARAMS.XADATA := ORD(X3IPKPTR.X1BFPTR'.BFDATAC[P2]);
        PX25TELTIP(L3INTR);                 _UPLINE INTERRUPT          ?
        END 
      ELSE
        PX3GPPKT(X5INTCONF);                _PAD CONNECTION            ?
  
      PBRELZRO(X3IPKPTR.X1BFPTR,BEDBSIZE);  _RELEASE PACKET            ?
      END; _ 02                                                        ?
  
    3:                                      _03                        ?
      IF LCCNTYPE = N0XAPPL                 _A-A CONNECTION            ?
      THEN
        PX25TELTIP(L3INTC);                 _UPLINE CONFIRMATION       ?
  
    4:                                      _04                        ?
      PX3GPPKT(X5INTRRPT);                  _INTERRUPT REQUEST         ?
  
    5:                                      _05                        ?
      PX3GPPKT(X5INTCONF);                  _INTERRUPT CONFIRMATION    ?
  
    6:                                      _06                        ?
      BEGIN 
      IF LCCNTYPE = N0XAPPL                 _A-A CONNECTION            ?
      THEN
        BEGIN 
        X3BRKRC := X3BRDCE;                 _RESET FROM DCE            ?
        PX25TELTIP(L3BREAK);                _SEND UPLINE BREAK         ?
        PX25FLSHLCCB(X3LCCB,FALSE);         _FLUSH BUFFERS             ?
        LCPHSSTATE := X8DCER;               _DCE RESET                 ?
        LCUBRK     := TRUE;                 _UPLINE BREAK SENT         ?
        END 
      ELSE                                  _TERMINAL CONNECTION       ?
        BEGIN 
        PX3RINIT;                           _INITIALIZE LCCB           ?
        PX3GPPKT(X5RSTCONF);                _RESET CONFIRMATION        ?
        END;
      END; _ 06                                                        ?
  
    7:                                      _07                        ?
      BEGIN 
      LCPHSSTATE := X8DTER;                 _DTE RESET                 ?
      LCDBRK     := TRUE;                   _BREAK RECEIVED            ?
      LCDTER     := TRUE;                   _RESET PACKET SENT         ?
      PX3GPPKT(X5RESET);                    _SEND RESET REQUEST        ?
      END; _ 07                                                        ?
  
    8:                                      _08                        ?
      BEGIN 
      IF LCUBRK                             _BREAK SENT                ?
      THEN
        BEGIN 
        LCUBRK := FALSE;                    _NOT OUTSTANDING           ?
        LCDTER := FALSE;
        PX3GPPKT(X5RESET);                  _SEND RESET REQUEST        ?
        IF LCDCER                           _DCE RESET                 ?
        THEN
          PX3RINIT;                         _BACK TO READY             ?
        END 
      ELSE
        LCUBRK := FALSE;
      END; _ 08                                                        ?
  
    9:                                      _09                        ?
      BEGIN 
      PX3RDTE;                              _PACKET ERROR              ?
      END; _ 09                                                        ?
  
    10:                                     _10                        ?
      BEGIN 
      IF LCCNTYPE " N0XAPPL                 _TERMINAL CONNECTION       ?
      THEN
        PX3RINIT                            _BACK TO READY             ?
      ELSE      _ A-A CONNECTION  ? 
        BEGIN 
        IF LCDBRK                           _DOWNLINE BREAK OUTSTANDING?
        THEN
          PX25TELTIP(L3RESET);              _BACK IT                   ?
  
        IF LCUBRK                           _UPLINE BREAK OUTSTANDING  ?
        THEN
          LCDCER := TRUE                    _DCE RESET PENDING         ?
        ELSE
          PX3RINIT;                         _BACK TO READY             ?
  
        END; _ A-A CONNECTION                                          ?
      END; _ 10                                                        ?
  
    11:                                     _11                        ?
      BEGIN 
      PX3RINIT;                             _FLOW CONTROL READY        ?
      PX3GPPKT(X5RSTCONF);                  _RESET CONFIRMATION        ?
      PX25TELTIP(L3FRGR);                   _FRAGMENT REQUEST          ?
      END; _ 11                                                        ?
  
    12:                                     _12                        ?
      BEGIN 
      PBRELZRO(X3IPKPTR.X1BFPTR,BEDBSIZE);  _RELEASE PACKET            ?
      LCDXMITON := FALSE; 
      END; _ 12                                                        ?
  
  END; _ CASE X8SCASE                                                  ?
END; _ WITH X3LCCB'.LCCB                                               ?
END; _ PROCEDURE PX3SECONDARY                                          ?
  
_$J+? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*                    PX3CKCALL                                        * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW :                                                         * 
*              GETS THE FACILITY LENGTH FROM INCOMING CALL            * 
*              PACKET AND CALL CONNECTED PACKET. IT ALSO SETS         * 
*              A POINTER TO THE FACILITY FIELD LENGTH POSITION.       * 
** INPUT :                                                            * 
*              INCOMING CALL PACKET.                                  * 
*              CALL CONNECTED PACKET.                                 * 
*                                                                     * 
** CALLING PROGRAMS :                                                 * 
*              PX3PRIMARY  - LEVEL 3 PRIMARY STATION                  * 
*              PX3CHKPKT   - CHECK FOR ERROR CODE OR EXTRACT          * 
*                            INFORMATION FROM INCOMING CALL PACKET    * 
*                                                                     * 
** OUTPUT :                                                           * 
*              X3OCTET = FACILITY FIELD LENGTH.                       * 
*              X3MARK  = INDEX TO FACL FIELD.                         * 
*                                                                     * 
** EXTERNAL SUBROUTINES :                                             * 
*              NONE                                                   * 
** NOTES :                                                            * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PX3CKCALL;
VAR 
      X4INT   : INTEGER;
  
BEGIN 
X3MARK := X1CADDR;
_ 
* * * *  GET LENGTH OF CALLING AND CALLED DTE ADDRESS LENGTH FIELD
? 
X3OCTET.OCTET := X3IPKPTR.X1BFPTR'.         _EXTRACT ADDRESS LENGTH    ?
                         BFDATAC[X3MARK];   _ FIELD                    ?
X4INT         := X3OCTET.CGADDR             _CALLING DTE ADDR LENGTH   ?
                       +  X3OCTET.CDADDR    _ CALLED DTE ADDR LENGTH   ?
                         +  1;              _ CASE OF ODD NUMBER FOR   ?
                                            _ CDADDR + CGADDR          ?
X4INT         := X4INT DIV 2;               _CONVERT TO BYTES SINCE    ?
                                            _ ADDRESS DIGITS IS CODED  ?
                                            _ IN SEMI-OCTET            ?
_ 
* * * *  MOVE MARKER TO FACILITY LENGTH FIELD (FACL)
? 
X3MARK        := X3MARK                     _POSITION OF ADDR LEGH FILD?
                    + X4INT                 _ LENGTH OF DTE ADDRESSES  ?
                     + 1;                   _ TO GET TO FACL           ?
X3OCTET.OCTET := X3IPKPTR.X1BFPTR'.         _EXTRACT FACILITY LENGTH   ?
                         BFDATAC[X3MARK];   _ FIELD                    ?
END; _ PROCEDURE PX3CKCALL                                             ?
  
_$J+? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*                    PX3PRIMARY                                       * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW :                                                         * 
*              PX3PRIMARY IS CALLED TO EXECUTE A SPECIFIC ACTION CODE * 
*              FOR BOTH SVC AND PVC PRIMARY STATE DECISION TABLES.    * 
*                                                                     * 
** INPUT :                                                            * 
*              X8PCASE   = PRIMARY ACTION CASE                        * 
*              X3LCCB    = LCCB POINTER                               * 
*                                                                     * 
** CALLING PROGRAMS :                                                 * 
*              PX25TRANS    - MIAN PROGRAM (LEVEL 3)                  * 
*                                                                     * 
** OUTPUT :                                                           * 
*              ACTION CODE IS PROCESSED                               * 
*              SEVERAL TYPES OF OUTPUTS MAY RESULT:                   * 
*              1.-A PACKET MAY BE SENT TO THE NETWORK                 * 
*              2.-A WORKLIST MAY BE SENT TO THE X25 TIP               * 
*                                                                     * 
** EXTERNAL SUBROUTINES :                                             * 
*              PX3GPPKT     - GENERATE PROTOCOL PACKET                * 
*              PX25TELTIP   - NOTIFY TIP                              * 
*              PX3SECONDARY - CALL SECONDARY PROCESSOR                * 
*              PX3SVMWKL    - WORKLIST ENTRY TO SVM                   * 
*              PX3DTEC      - DTE CLEARING STATE                      * 
*              PX3DCEC      - DCE CLEARING STATE                      * 
*              PX3CKCALL    - GET AN ADDRESS OF FACILITY LENGTH FIELD * 
*              PX25FLSHLCCB - INITIALIZE GIVEN LCCB AND RELEASE       * 
*                             BUFFER                                  * 
*              PBRELCHN     - RELEASE A CHAIN OF BUFFERS              * 
*              PB1BFAVAIL   - CHECK BUFFER AVAILABLTY                 * 
*              PBRELZRO     - RELEASE A CHAIN OF BUFFERS              * 
*                             (CHECK FOR NIL FIRST)                   * 
*              PNACCHOST    - LOOK FOR AVAILABLE HOST                 * 
*              PNGTLLCB     - FIND LLCB ADDRESS ON GIVEN CONNECTION   * 
*              PNGETCB      - GET BUFFER FOR TCB                      * 
*              PNNOTIFY     - REQUEST FOR HOST DISPLAY ON PAD         * 
*                             CONNECTION                              * 
? 
  
_$J+? 
_ 
** NOTES :                                                            * 
*                    SVC PRIMARY STATE TABLE                          * 
*                    -----------------------                          * 
*                                                                     * 
*           I READY I   DTE   I   DCE   I DATA I CALL I  DTE  I  DCE  * 
*           I       I WAITING I WAITING I XFER I COLL I CLEAR I CLEAR * 
*           I       I         I         I      I      I       I       * 
*           I  P1   I   P2    I   P3    I  P4  I  P5  I  P6   I  P7   * 
*-----------+-------+---------+---------+------+------+-------+-------* 
* INCOMING  I   1   I   10    I    2    I   2  I  --  I   2   I   9   * 
* CALL      I       I         I         I      I      I       I       * 
*-----------+-------+---------+---------+------+------+-------+-------* 
* CALL      I   2   I    6    I    2    I   2  I  --  I   2   I   9   * 
* CONNECTED I       I         I         I      I      I       I       * 
*-----------+-------+---------+---------+------+------+-------+-------* 
* CLEAR     I   3   I   11    I    3    I   3  I  --  I   3   I   3   * 
* INDIC     I       I         I         I      I      I       I       * 
*-----------+-------+---------+---------+------+------+-------+-------* 
* CLEAR     I   2   I   10    I    2    I   2  I  --  I   5   I   9   * 
* CONF      I       I         I         I      I      I       I       * 
*-----------+-------+---------+---------+------+------+-------+-------* 
* DRFC      I   2   I   10    I    2    I  12  I  --  I   2   I   9   * 
*           I       I         I         I      I      I       I       * 
*-----------+-------+---------+---------+------+------+-------+-------* 
*-----------+-------+---------+---------+------+------+-------+-------* 
* D5ICAR    I   4   I   --    I   --    I  --  I  --  I  --   I  --   * 
*-----------+-------+---------+---------+------+------+-------+-------* 
* D5ICXN    I   8   I   --    I    8    I  --  I  --  I   8   I   8   * 
*-----------+-------+---------+---------+------+------+-------+-------* 
* D5ICXA    I   7   I   --    I   14    I  --  I  --  I   7   I   7   * 
*-----------+-------+---------+---------+------+------+-------+-------* 
* D5FREE    I   7   I   13    I    7    I   7  I  --  I   7   I   7   * 
*-----------+-------+---------+---------+------+------+-------+-------* 
*                                                                     * 
*                                                                     * 
*          DRFC - DATA, RESET OR FLOW CONTROL                         * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PX3PRIMARY; 
  
VAR 
      X8INT    : INTEGER;                   _USED AS FOR LOOP INDEX    ?
      X8END    : INTEGER; 
      X8ORGTCB : B0BUFPTR;                  _OREGINAL TCB POINTER      ?
      X8LCHN   : B0OVERLAY;                 _LOGICAL CHANNEL NUMBER    ?
      X8PCASE  : INTEGER;                   _CASE INDEX                ?
      X8FLAG   : BOOLEAN;                   _TEMPORARY FLAG            ?
      X8INT2   : INTEGER;                   _TEMPORARY INTEGER         ?
      X8OPUFCL : PACKED RECORD              _OPTIONAL FACILITY CODE    ?
        CASE X : INTEGER OF 
        0: (X8CHR   : CHAR);                _CHARACTER                 ?
        1: (X8PADD  : B08BITS;              _PADDING                   ?
            X8CLASS : B02BITS;              _FACILITY CLASS TYPE       ?
            X8CODE  : B06BITS);             _FACILITY CODE             ?
        2: (X8INTF  : INTEGER);             _IN INTEGER                ?
        END;
  
_$J+? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*                            PX3FREECN                                * 
*                                                                     * 
*                  DELINKS A TCB IF NOT DONE.                         * 
*                  DEQUEUE A TCB FROM ACTIVE TCB CHAIN IN LCB         * 
*                  IF DCE CLEARED GOES BACK TO READY                  * 
*                  IF DTE CLEARED GOES TO DTE CLEARING STATE          * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PX3FREECN;
VAR 
      X8TCBCHN : B0BUFPTR;
  
BEGIN 
WITH X3LCCB'.LCCB DO                        _LCCB POINTER              ?
  BEGIN 
  PBRELZRO(X3IPKPTR.X1BFPTR, BEDBSIZE); 
  IF XTWC = L5SMDLTCB                       _DELETE CONNECTION         ?
  THEN
    BEGIN 
    X8TCBCHN := XTLCB'.BZTCBPTR;            _GET THE FIRST TCB         ?
    IF X8TCBCHN = X3TCB                     _FIRST TCB TO BE DEQUEUED  ?
    THEN
      XTLCB'.BZTCBPTR := X8TCBCHN'.BSTCB.   _DEQUEUE IT                ?
                                   BSCHAIN
    ELSE                                    _SOMEWHERE IN TCB CHAIN    ?
      BEGIN 
      WHILE X8TCBCHN'.BSTCB.BSCHAIN         _LOOK FOR TCB              ?
                                " X3TCB DO
        X8TCBCHN := X8TCBCHN'.BSTCB.BSCHAIN;
  
      X8TCBCHN'.BSTCB.BSCHAIN := X3TCB'.BSTCB.BSCHAIN;
      END;
    END;
  
  IF LCDCEC                                 _DCE CLEARING              ?
  THEN
    BEGIN 
    PX25FLSHLCCB(X3LCCB,TRUE);              _INITIALIZE LCCB           ?
    PX3GPPKT(X5CLRCONF);                    _CLEAR CONFIRAMTION        ?
    END 
  ELSE                                      _DTE CLEARING              ?
    BEGIN                                   _OR HOST BREAKING CN       ?
    IF LCTCBPTR " NIL 
    THEN
      BEGIN 
      X8INT2 := LCPHPSTATE;                 _SAVE PRIMARY STATE        ?
      LCPHPSTATE := X7DTEC;                 _DTE CLEARING              ?
      IF (LCCNTYPE = N0XPAD)                _IF PAD SUBTIP CONNECTION  ?
      THEN
        IF X8INT2 = X7DXFR                  _ AND DATA TRANSFER STATE  ?
        THEN
          BEGIN                             _ AND PDN SUPPORTS INVITE  ?
          X3NETWORK := XTSLCB'.BZXSLCB.BZTRANSTYPE; 
          IF X3NETWORK > X9LPSN 
          THEN                              _ SKIP THE UNDEFINED PSN   ?
            X3NETWORK := X3NETWORK - X9OFFSET;
          X3CEPTR  := X5NETTAB'[X3NETWORK]'[X1CLEAR]; 
          IF X3CEPTR'[X1FIRST].X1INTOCLR
          THEN
            BEGIN 
            LCINVCLR := TRUE;               _DTE INITIATED CLEARING    ?
            PX25TELTIP(L3INVCLR);           _SEND INVITATION TO CLEAR  ?
            GOTO 99;
            END;                            _IN ANY OTHER CASE SEND    ?
          END; _ X8INT2 = X7DXFR ?
      PX3GPPKT(X5CLEAR);                    _CLEAR REQUEST             ?
99: 
      END;
    END;
  END; _ WITH X3LCCB'LCCB                                              ?
END; _ PROCEDURE PX3FREECN                                             ?
_$J+? 
_ 
          * * * * *  PX3PRIMARY MAIN PROGRAM  * * * * * 
? 
BEGIN                                       _PROCEDURE PX3PRIMARY      ?
WITH X3LCCB'.LCCB, X3IPKPTR.X1BFPTR' DO 
  BEGIN 
  IF X3LCCB " NIL                           _EXISTING LCCB             ?
  THEN
    BEGIN 
    LCPHPEVENT := X3PCODE;
    X3EVENT    := X3PCODE;                  _USER EVENT CODE           ?
    X3STATE    := LCPHPSTE;                 _GET STATE                 ?
  _ IF LCPVC = FALSE                                                   ?
  _ THEN                                                               ?
      X8PCASE := XAPSVCMATRIX[X3STATE,X3EVENT]; 
  _ ELSE                                                               ?
  _   X8PCASE := XAPPVCMATRIX[X3STATE,X3EVENT];                        ?
  
    CASE X8PCASE OF 
  
_ 
* * * *  READY  -  INCOMING CALL
? 
    1:                                      _01                        ?
      BEGIN 
      LCLCBPTR    := XTLCB;                 _PLACE LCB POINTER IN LCCB ?
      LCPHPSTATE  := X7DCEW;                _DCE WAITING               ?
      IF LCCNTYPE = N0XAPPL                 _A-A CONNECTION            ?
      THEN
        PX3SVMWKL(D0X25,D5ICXR)             _TELL NAM                  ?
      ELSE
        BEGIN                               _NON A-A CONNECTION        ?
        PBRELZRO(X3IPKPTR.X1BFPTR,          _RELEASE INCOMING PACKET   ?
                               BEDBSIZE);   _ ON PAD CONNECTION        ?
        PX3SVMWKL(D0X25,D5ICNR);            _TELL SVM                  ?
        END;
      END; _ 01                                                        ?
  
_ 
* * * *  READY         - CALL ACCEPTED, CLEAR CONFIRMATION, DRFC
* * * *  DCE WAITING   - INCOMING CALL, CALL ACCEPTED, CLEAR CONF, DRFC 
* * * *  DATA TRANSFER - INCOMING CALL, CALL ACCEPTED, CLEAR CONF 
* * * *  DTE CLEARING  - INCOMING CALL, CALL ACCEPTED, DRFC 
? 
    2:                                      _02                        ?
      IF LCHN = 0 
      THEN
        BEGIN                               _ AND PDN SUPPORTS LCN 0   ?
        X3NETWORK := XTSLCB'.BZXSLCB.BZTRANSTYPE; 
        IF X3NETWORK > X9LPSN 
        THEN                                _ SKIP THE UNDEFINED PSN   ?
          X3NETWORK := X3NETWORK - X9OFFSET;
        X3CEPTR  := X5NETTAB'[X3NETWORK]'[X1CLEAR]; 
        IF X3CEPTR'[X1FIRST].X1LCN0DAT
          THEN
          PX3DTEC;                          _DTE CLEARING              ?
        END _ LCHN = 0 ?
      ELSE
        PX3DTEC;                            _DTE CLEARING              ?
  
_ 
* * * *  READY         - CLEAR INDICATION 
* * * *  DCE WAITING   - CLEAR INDICATION 
* * * *  DATA TRANSFER - CLEAR INDICATION 
* * * *  DCE CLEARING  - CLEAR INDICATION 
* * * *  DTE CLEARING  - CLEAR INDICATION 
? 
    3:                                      _03                        ?
      PX3DCEC;                              _DCE CLEARING              ?
  
_ 
* * * *  READY         - D0TIP : D5ICAR        ICN/AP/R 
? 
    4:                                      _04                        ?
      BEGIN 
      LCW   := ORD (BFDATAC [X3WS]);        _GET PACKET WINDOW         ?
      LCDPL := X3PWR2 [ORD (BFDATAC 
                              [X3DPL])];    _GET DATA PACKET SIZE      ?
      X3TCB'.BSTCB.BSIPRI := ORD(BFDATAC[X3PRI]); 
      X3TCB'.BSTCB.BSUBL  := ORD(BFDATAC[X3UBL]); 
      X3TCB'.BSTCB.BSUBZ  := ORD(BFDATAC[X3UBZ]); 
      PX3GPPKT(X5CALL);                     _SEND CALL REQUEST         ?
      LCPHPSTATE := X7DTEW;                 _DTE WAITING               ?
      END; _ 04                                                        ?
  
_ 
* * * *  DTE CLEARING  - CLEAR CONFIRMATION 
? 
    5:                                      _05                        ?
      BEGIN 
      PBRELZRO(X3IPKPTR.X1BFPTR, BEDBSIZE); 
      PX25FLSHLCCB(X3LCCB,TRUE);            _INITIALIZE LCCB           ?
      END; _ 05                                                        ?
  
_ 
* * * *  DTE WAITING   - CALL ACCEPTED
? 
    6:                                      _06                        ?
      BEGIN 
_ 
* * * *  CHECK FOR FLOW CONTROL NEGOTIATION 
? 
      IF X3IPKLNGTH > 3                     _MAKE SURE DATA EXIST      ?
      THEN
        BEGIN 
        PX3CKCALL;                          _GET FACILITY LENGTH       ?
        X8INT := X3MARK + 1;                _MOVE TO FACILITIES        ?
        IF X3OCTET.FACL " 0                 _FACILITIES EXIST          ?
        THEN
          BEGIN 
          X8END := X8INT  + X3OCTET.FACL;   _SET END OF FACILITIES     ?
          X8FLAG := FALSE;                  _RESET TELENET FACIL. FLAG ?
          WHILE X8INT < X8END DO            _LOOP THRU FACILITIES      ?
            BEGIN 
            X8OPUFCL.X8CHR := BFDATAC[X8INT];          _FACILITY CODE  ?
            X8INT2         := ORD(BFDATAC[X8INT + 1]); _NEXT OCTET     ?
            IF X8OPUFCL.X8CLASS = X3CLSD    _IF CLASS D FACILITY CODE  ?
            THEN
              X3FCLCLS [X3CLSD] := X8INT2;  _LENGTH IS IN NEXT OCTET   ?
            IF X8FLAG                       _IF TELENET FACILITY       ?
            THEN
              BEGIN 
              IF X8OPUFCL.X8INTF = 6        _NEW DATA PACKET LENGTH    ?
              THEN
                LCDPL := X8INT2 * 16; 
              IF X8OPUFCL.X8INTF = 5        _NEW PACKET WINDOW SIZE    ?
              THEN
                LCW := X8INT2;
              END   _ IF X8FLAG                                        ?
            ELSE                            _IF NOT TELENET FACILITY   ?
              BEGIN 
              IF X8OPUFCL.X8INTF = 0        _IF ITI MARKER             ?
              THEN
                BEGIN 
                IF X8INT2 = $21             _IF TELENET ITI CODE       ?
                THEN
                  X8FLAG := TRUE;           _THEN TELENET FACL. FOLLOWS?
                END   _ IF X8OPUFCL.X8INTF = 0                         ?
              ELSE                          _IF NOT ITI MARKER         ?
                BEGIN 
                X8INT2 := ORD(BFDATAC[X8INT + 2]);  _SECOND PARAM.     ?
                IF X8INT2 " 0               _SECOND PARAM IS NON-ZERO  ?
                THEN
                  BEGIN 
                  IF X8OPUFCL.X8INTF = X9DPL  _NEW DATA PACKET LENGTH  ?
                  THEN
                    LCDPL := X3PWR2[X8INT2];
                  IF X8OPUFCL.X8INTF = X9PWS  _NEW PACKET WINDOW SIZE  ?
                  THEN
                    LCW := X8INT2;
                  END; _ IF X8INT2 " 0                                 ?
                END;   _ IF X8OPUFCL.X8INTF " 0                        ?
              END;     _ IF NOT X8FLAG                                 ?
            X8INT := X8INT + X3FCLCLS[X8OPUFCL.X8CLASS];
  
            END; _ WHILE ....                                          ?
          END; _ IF X3OCTET.FACL " 0  FACILITY EXIST                   ?
        END; _ IF X3IPKLNGTH > 3                                       ?
  
      LCPHPSTATE := X7DXFR;                 _DATA TRANSFER             ?
      LCPHSSTATE := X8FCR;                  _FLOW CONTROL READY        ?
      LCDXMITON  := TRUE; 
      X3NEWCN    := TRUE; 
      PX25TELTIP(L3FRGR);                   _FRAGMENT REQUEST          ?
      PX3SVMWKL(D0X25,D5ICAN);              _NORMAL RESPONSE           ?
      END; _ 06                                                        ?
  
_ 
* * * *  READY         - D0TIP : D5ICXA, D5FREE 
* * * *  DTE WAITING   - D0TIP : D5FREE 
* * * *  DCE WAITING   - D0TIP : D5ICXA, D5FREE 
* * * *  DATA TRANSFER - D0TIP : D5FREE 
* * * *  DTE CLEARING  - D0TIP : D5ICXA, D5FREE 
* * * *  DCE CLERAING  - D0TIP : D5ICXA, D5FREE 
? 
    7:                                      _07                        ?
      BEGIN 
      LCDTEC := TRUE;                       _HOST REJECTED CALL        ?
                                            _OR SVM REJECTING PAD CONN ?
                                            _ERROR CODE IN X3DIAG      ?
      PX3FREECN;                            _DELINK TCB                ?
      END; _ 07                                                        ?
  
_ 
* * * *  READY        -  D0TIP : D5ICXN 
* * * *  DCE WAITING  -  D0TIP : D5ICXN 
* * * *  DTE CLEARING -  D0TIP : D5ICXN 
* * * *  DCE CLEARING -  D0TIP : D5ICXN 
? 
    8:                                      _08                        ?
      BEGIN 
      IF LCDCEW ! LCDTEW                    _IF DCE/DTE CLEAR DELAYED  ?
      THEN                                  _FOR IN-CALL WAITING       ?
        GOTO 40;
      IF LCDCEC = FALSE 
      THEN
        BEGIN 
        IF LCDTEC = FALSE 
        THEN
          BEGIN                             _NO ERRORS                 ?
          IF LCCNTYPE = N0XAPPL             _IF A-A CONNECTION         ?
          THEN
            BEGIN 
            LCW   := ORD (BFDATAC [X3WS]);  _GET PACKET WINDOW         ?
            LCDPL := X3PWR2 [ORD (BFDATAC 
                                [X3DPL])];  _GET DATA PACKET SIZE      ?
            X3TCB'.BSTCB.BSCN   := ORD(BFDATAC[X3CN]);
            X3TCB'.BSTCB.BSIPRI := ORD(BFDATAC[X3PRI]); 
            X3TCB'.BSTCB.BSUBL  := ORD(BFDATAC[X3UBL]); 
            X3TCB'.BSTCB.BSUBZ  := ORD(BFDATAC[X3UBZ]); 
            END  _ IF LCCNTYPE = N0XAPPL ?
          ELSE
            BEGIN                           _NON-AA CONNECTION         ?
            X8ORGTCB := XTSLCB'.BZXSLCB.    _ORIGINAL TCB FOR PAD      ?
                                 BZGRPTCB[LCCNTYPE];
            LCW      := X8ORGTCB'.BSTCB.BSLCW;
                                            _DEFAULT PACKET WINDOW SIZE?
            LCDPL    := X3PWR2              _DEFAULT DATA PACKET LENGTH?
                  [XTSLCB'.BZXSLCB.BZPKTLNGTH]; 
  
            IF X3TCB'.BSTCB.BSACON          _AUTO CONNECT SET          ?
            THEN
              PX3SVMWKL (D0TCB, D5CONN)     _ASK SVM FOR CONNECTION    ?
            ELSE
              PNNOTIFY(H2HADONLY,X3TCB);    _QUEUE HOST DISPLAY        ?
            END;
          PX3GPPKT(X5CALACC);               _CALL ACCEPTED             ?
          LCPHPSTATE := X7DXFR;             _DATA TRANSFER             ?
          LCPHSSTATE := X8FCR;              _FLOW CONTROL READY        ?
          LCDXMITON  := TRUE; 
          X3NEWCN    := TRUE; 
          PX25TELTIP(L3FRGR);               _FRAGMENT REQUEST          ?
          END 
        ELSE
          BEGIN                             _DTE CLEARING              ?
          PX3FREECN;                        _DELINK TCB                ?
          PX3DTEC;
          END;
        END 
      ELSE                                  _DCE CLEARING              ?
        BEGIN 
        PX3FREECN;                          _DELINK TCB                ?
        PX3DCEC;
        END;
      END; _ 08                                                        ?
  
_ 
* * * *  DCE CLEARING  - INCOMING CALL,CALL ACCPETED,CLEAR CONF,DRFC
? 
     9:                                     _09                        ?
      PBRELZRO(X3IPKPTR.X1BFPTR,BEDBSIZE);  _RELEASE PACKET            ?
  
_ 
* * * *  DTE WAITING   - INCOMING CALL,CLEAR CONFIRMATION,DRFC
? 
    10:                                     _10                        ?
      BEGIN 
      X3DIAG.X3SCRC := X0RUNP;              _ERROR DETECTED BY LOCAL   ?
                                            _UNKNOWN PACKET FROM REMOTE?
      PX3SVMWKL(D0X25,D5ICAA);              _ABNORMAL RESPONSE TO NAM  ?
      LCDTEC := TRUE;                       _DTE CLEARING              ?
      END; _ 10                                                        ?
  
_ 
* * * *  DTE WAITING   - CLEAR INDICATION 
? 
    11:                                     _11                        ?
      BEGIN 
      IF X3CAUSE " 0                        _CLEAR REQUEST BY PSN      ?
      THEN
        BEGIN 
        X3CAUSE       := X3CAUSE DIV 2; 
        X3DIAG.X3SCRC := ORD(X3PSNCD[X3CAUSE]); 
        END; _IF X3CAUSE " 0 : CLEAR CAUSE CODE EXIST                  ?
      _ NOTE: ERROR CODE (DIAG. FIELD) IN CLEAR INDICATION PACKET      ?
      _       FROM THE REMOTE HOST IS STORED AT PX3CHKPKT.             ?
  
      PX3SVMWKL(D0X25,D5ICAA);              _ABNORMAL RESPONSE TO NAM  ?
      LCDCEC := TRUE;                       _DCE CLEARING              ?
      END; _ 11                                                        ?
  
_ 
* * * *  NON PROTOCOL PACKET
* * * *  DATA TRANSFER - DRFC (DATA, RESET OR FLOW CONTROL) 
? 
    12:                                     _12                        ?
      BEGIN 
      IF ([X5DATA,X5INTRRPT] & X3IPKSET.BASETN) = [ ] 
      THEN
        PBRELZRO(X3IPKPTR.X1BFPTR, BEDBSIZE); 
  
      X3TCB := LCTCBPTR;
      PX3SECONDARY;                         _SWITCH TO SECONDARY STATE ?
      END; _ 12                                                        ?
  
_ 
* * * *  DTE WAITING   - RECEIVED CLEAR REQUEST 
? 
    13:                                     _13                        ?
      BEGIN 
      IF LCDCEC = FALSE                     _IF NOT DCE CLEARING       ?
      THEN
        LCDTEC  := TRUE;                    _HOST REJECTED CALL        ?
      PX3FREECN;                            _DELINK TCB                ?
      END; _ 13                                                        ?
  
_ 
* * * * INCOMING CALL REJECTED
? 
    14:                                     _14                        ?
      BEGIN 
      IF LCDCEW ! LCDTEW                    _IF DELAYED CLEAR          ?
      THEN
40:     BEGIN 
        IF LCDCEW                           _IF DCE WAIT               ?
        THEN
          BEGIN 
          LCPHPSTATE := X7DCEC;             _DCE CLEAR                 ?
          PX3DCEC;                          _PROCESS DELAYED DCE CLEAR ?
          END 
        ELSE                                _IF DTE WAIT               ?
          BEGIN 
          LCPHPSTATE := X7DTEC;             _DTE CLEAR                 ?
          PX3DTEC;                          _PROCESS DELAYED DTE CLEAR ?
          END;
        LCDCEW := FALSE;                    _CLEAR DELAYED CLEAR FLAGS ?
        LCDTEW := FALSE;
        END 
      ELSE
        BEGIN 
        LCPHPSTATE := X7DTEC;               _MOVE OUT FROM DCE WAITING ?
        PX3DTEC;                            _DTE CLEARING              ?
        END;
      END; _ 14                                                        ?
  
      END; _ CASE X8PCASE                                              ?
    END; _ IF X3LCCB " NIL                                             ?
  END; _ WITH X3LCCB'.LCCB                                             ?
END; _ PROCEDURE PX3PRIMARY                                            ?
_$J+? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*                    PX3CHKPKT                                        * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW :                                                         * 
*              CONVERTS EXTERNAL ERROR AND STATUS BYTES               * 
*              INTO AN INTERNAL SET                                   * 
*                                                                     * 
** INPUT :                                                            * 
*              X25NETTAB = NETWORK TABLE                              * 
*              X3IPKPTR  = INPUT PACKET POINTER                       * 
*              X3IPKTYPE = INPUT PACKET TYPE                          * 
*              XTSLCB    = SUB LCB POINTER                            * 
*                BZTRANSTYPE  = TRANSPORT TYPE                        * 
*                                                                     * 
** CALLING PROGRAMS :                                                 * 
*              PX3ULPACKET  - DECODE PACKET HEADER                    * 
*                                                                     * 
** OUTPUT :                                                           * 
*              X3PCODE  = PRIMARY EVENT CODE                          * 
*              X3ALARM  = ALARM FLAG                                  * 
*              X3WARNING= WARNING FLAG                                * 
*              LCCNTYPE = CONNECTION TYPE                             * 
*                                                                     * 
** EXTERNAL SUBROUTINES :                                             * 
*              PX3CKCALL    - GET ADDRESS OF FACILITY FIELD           * 
*              PX25MSG      - MESSAGE TO NAM DAYFILE                  * 
*                                                                     * 
** NOTES :                                                            * 
*                                                                     * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PX3CHKPKT;
VAR 
      X4ENT     : ARRAY [X5CLEAR
                          .. X5RESTART] 
                                OF INTEGER; 
      X4INT     : INTEGER;
      X4DN      : B0OVERLAY;
      X4ENTTYPE : INTEGER;
      X4RUN     : BOOLEAN;
      X4DIAG    : BOOLEAN;
      X4RCHRG   : BOOLEAN;                  _REVERSE CHARGE CALL FLAG  ?
      X4FCODE   : B0OVERLAY;
      X4GRPTCB  : B0BUFPTR; 
      X4DNCHR   : CHAR; 
      X4BFR       : B0BUFPTR;               _LOGIN ACCOUNT INFO BUFFER ?
  
VALUE 
      X4ENT     = 
                  (X1CLEAR,                 _CLEAR INDICATION PACKET   ?
                   X1RESET,                 _RESET INDICATION PACKET   ?
                   X1RSTART);               _RESTART INDICATION PACKET ?
  
BEGIN 
  
X4DIAG  := FALSE;                           _INITIAL SETTING           ?
X4RCHRG := FALSE;                           _NOT A REVERSE CHARGE CALL ?
_ 
* * * *  CHECK FOR INCOMING CALL PACKET 
? 
IF X3IPKTYPE = X5CALL                       _INCOMING CALL REQUEST     ?
THEN WITH X3IPKPTR.X1BFPTR' DO
  BEGIN 
  IF X3LCCB'.LCCB.LCTCBPTR " NIL            _CHECK FOR COLLISION OF    ?
  THEN                                      _INCOMING CALL AND         ?
    BEGIN                                   _OUTGOING A-A CALL         ?
    X3PCODE       := X7ERROR;               _CLEAR LOGICAL CHANNEL     ?
    X3DIAG.X3SCRC := X0RNBL;
    GOTO 10;
    END;
  PX3CKCALL;                                _SKIP DTE CALLING/CALLED   ?
                                            _ ADDRESS FIELDS           ?
_ 
* * * *  MOVE MARKER TO CALL USER DATA FIELD
? 
  X4INT := X3MARK + 1;                      _POSITION OF 1ST FACL CODE ?
  X3MARK := X3MARK + X3OCTET.OCINT + 1;     _POSITION OF USR DATA FIELD?
_ 
* * * * VERIFY REVERSE CHARGING PARAMETER 
? 
  IF X3OCTET.OCINT " 0                      _IF FACL CODE EXISTS       ?
  THEN
    BEGIN 
    IF XTSLCB'.BZXSLCB.BZDCE                _IF DCE                    ?
    THEN
      BEGIN                                 _FACILITY CODE NOT ALLOWED ?
      X3PCODE := X7ERROR;                   _SET ERROR CODE FOR CLEAR  ?
      X3CAUSE := X3INVFACL;                 _FACILITY NOT ALLOWED      ?
      GOTO 10;
      END;
    WHILE X4INT < X3MARK DO                 _POINTER IS IN FACL FIELD  ?
      BEGIN 
      X4FCODE.BA1CHAR := BFDATAC[X4INT];
                                            _FACILITY CODE             ?
      X4DN.BA1CHAR := BFDATAC[X4INT+1]; 
                                            _FACILITY PARAMETER        ?
      IF X4FCODE.BAINT = $01                _IF CODE FOR REV CHARGING  ?
      THEN
        X4RCHRG := X4DN.BABOOL.B0B0;        _SET TO FACILITY VALUE     ?
      X4FCODE.BAINT := X4FCODE.BAINT DIV $40; _ISOLATE FACL LENGTH     ?
      IF X4FCODE.BAINT = X3CLSD 
      THEN
        X3FCLCLS[X3CLSD] := X4DN.BAINT + 2; 
      X4INT := X4INT + X3FCLCLS[X4FCODE.BAINT]; 
      END; _ WHILE X4INT < X3MARK                                      ?
    END; _ IF X3OCTET.OCINT " 0                                        ?
  X4ENTTYPE     := N0XUNDEFF; 
  X3DIAG.X3SCRC := 0; 
  
  X4INT := BFLCD - X3MARK + 1;              _USER DATA LENGTH          ?
  IF X4INT > 0                              _IF USER DATA EXISTS       ?
  THEN                                      _ EXIST IN PACKET          ?
    BEGIN 
    X4GRPTCB := BCCHAINS[DBUFLENGTH]; 
    IF X4GRPTCB " NIL                       _IF CHAINED BUFFER EXISTS  ?
    THEN
      X4INT := X4INT + X4GRPTCB'.BFLCD      _ACCUMULATE DATA LENGTH    ?
                     - X4GRPTCB'.BFFCD + 1; 
                                            _PLACE CALL USER DATA LNGTH?
    BFDATAC[X3MARK + 3] := CHR(X4INT);      _IN 4TH OCTET OF USER DATA ?
    X3OCTET.OCTET := BFDATAC [X3MARK];      _EXTRACT SUBTIP CONNECTION ?
_ 
* * * *  GET SUBTIP CONNECTION TYPE 
? 
    FOR X4INT := N0XPAD TO N0X2USR DO       _LOOP THRU SUBTIP TABLE    ?
      IF X3SUBTIP[X4INT].CNTYPE             _CONNECTION TYPE EXIST IN  ?
                          = X3OCTET.CUSRDT  _ THE FIRST OCTET OF CALL  ?
      THEN                                  _ USER DATA                ?
        BEGIN 
        X4ENTTYPE := X3SUBTIP[X4INT].SUBTIP;
_ 
* * * *  GET DESTINATION HOST ID (ONLY FOR A - A) 
? 
        X4DNCHR     := BFDATAC[X3MARK+7];   _EXTRACT FRIST CHAR AND    ?
        X4DN.BAINT  := 0;                   _RESET WORD                ?
        X4DN.BAHEX.B0H3 := JNCNVTFROM[X4DNCHR]; _SET UPPER HEX DIGIT   ?
        X4DNCHR     := BFDATAC[X3MARK+8];   _EXTRACT SECOND CHAR AND   ?
        X4DN.BAHEX.B0H4 := JNCNVTFROM[X4DNCHR]; _SET LOWER HEX DIGIT   ?
        X3LCCB'.LCCB.LCHNODE := X4DN.BAINT; _PLACE HOST NODE IN LCCB   ?
        X4INT       := N0X2USR + 1;         _GET OUT FROM LOOP         ?
        END; _IF X3SUBTIP[X4ENT]......                                 ?
    END; _CALL USER DATA EXIST                                         ?
  
  X3LCCB'.LCCB.LCCNTYPE := X4ENTTYPE; 
  IF X4ENTTYPE = N0XPAD                     _PAD SUBTIP                ?
  THEN WITH X3LCCB'.LCCB DO 
    BEGIN 
_ 
* * * *  FORMAT THE BUFFER TO HOLD THE LOGIN ACCTNG INFORMATION 
? 
    X4BFR     := PBGET1BF(BEDBSIZE);        _BUFFER FOR ACCOUNT INFO   ?
    LCACCTPTR := X4BFR;                     _SAVE PTR IN LCCB          ?
    X4INT     := X3IPKPTR.X1BFPTR'.BFFCD;   _SAVE CURRENT FCD          ?
    X3IPKPTR.X1BFPTR'.BFFCD := X1CADDR;     _SET FIRST BUFF POSITION TO?
                                            _DTE ADDRESS LENGHTS       ?
    PBFCOPY(X3IPKPTR.X1BFPTR,X4BFR);        _SAVE CALL INFO FOR SVM    ?
    X3IPKPTR.X1BFPTR'.BFFCD := X4INT;       _RESTORE FCD               ?
    END;  _WITH X3LCCB'.LCCB? 
  IF X4ENTTYPE = N0XUNDEFF                  _CONNECTION WAS NOT FOUND  ?
  THEN
    BEGIN 
    X3PCODE     := X7ERROR;                 _SET ERROR CODE FOR CLEAR  ?
    X3DIAG.X3SCRC := X0RUNS;                _ REQUEST PACKET           ?
                                            _ERROR DETECTED BY REMOTE  ?
                                            _UNKNOWN SUBTIP CONNECTION ?
    END 
  ELSE
    IF X4ENTTYPE " N0XAPPL                  _REV CHARGE IF NOT A-A     ?
    THEN
      BEGIN 
      IF X4RCHRG
      THEN
        BEGIN 
        X4GRPTCB := XTSLCB'.BZXSLCB.BZGRPTCB[X4ENTTYPE];
                                            _GET GROUP TCB ADDRESS     ?
        IF X4GRPTCB " NIL                   _GROUP TCB DEFINED AND     ?
        THEN
         BEGIN
         IF X4GRPTCB'.BSTCB.BSXWEPAY = FALSE _ REV CHARGE NOT ALLOWED  ?
         THEN 
          BEGIN 
          X3CAUSE   := X3NOCHRG;            _REV CHARGE NOT ALLOWED    ?
          X3PCODE   := X7ERROR;             _SET ERROR CODE FOR CLEAR  ?
          END _IF (XAGRPTCB = NIL) ...                                 ?
         END _IF X4GRPTCB " NIL                                        ?
        ELSE
          IF XTLCB'.BZCNFPEND               _IF GROUP TCBS MISSING     ?
          THEN
            BEGIN 
            X3DIAG.X3SCRC := X0RNLL;        _THEN TEMP NOT AVAILABLE   ?
            X3PCODE := X7ERROR;             _FORCE CLEAR               ?
            END; _IF BZCNFPEND                                         ?
        END; _IF X4DIAG = FALSE                                        ?
      END; _IF X4ENTTYPE " N0XAPPL                                     ?
  
10:                                         _COLLISION OF IN/OUT CALLS ?
  END  _ INCOMING CALL PACKET                                          ?
_ 
* * * *  PROCESS CLEAR, RESET OR RESTART REQUEST PACKET 
? 
ELSE
  BEGIN 
  X3NETWORK := XTSLCB'.BZXSLCB.BZTRANSTYPE; 
  IF X3NETWORK > X9LPSN 
  THEN
    X3NETWORK := X3NETWORK - X9OFFSET;      _SKIP THE GAP OF THE NAMES ?
  X3ALARM   := FALSE;                       _CLEAR ALARM               ?
  X3WARNING := TRUE;                        _CLEAR WARNING             ?
  X4ENTTYPE := X4ENT[X3IPKTYPE];            _SET PACKET TYPE           ?
  X3CAUSE   := X3IPKPTR.X2BFPTR'.           _GET CAUSE FIELD           ?
                          XBPKHDR.XPCAUSE;
  IF X3IPKPTR.X1BFPTR'.BFLCD \ 14           _DIAG FIELD IS SET         ?
  THEN
    BEGIN 
    X4DIAG        := TRUE;
    X3DIAG.X3SCRC := X3IPKPTR.X2BFPTR'.XBPKHDR.XPDIAG;
    END;
  
_ 
* * * *  INITIALIZE ALL FIELDS
? 
  X3CEPTR  := X5NETTAB'[X3NETWORK]'[X4ENTTYPE]; 
  X4INT    := X1FIRST;                      _SET TO FIRST ENTRY        ?
  X4RUN    := TRUE; 
  
  WHILE X4RUN DO
    BEGIN 
    WITH X3CEPTR'[X4INT] DO                   _CURRENT ENTRY           ?
      BEGIN 
      IF X1CAUSE = X3CAUSE
      THEN
        IF ((X3DIAG.X3SCRC = X1DIAG)        _DIAGNOSTIC CODE EXISTS    ?
                                & X4DIAG) 
           ! X1SBCHECK                      _ OR SINGLE BYTE CHECK     ?
        THEN
          BEGIN 
          X4RUN     := FALSE; 
          X3PCODE   := X1PCODE;             _GET PRIMARY CODE          ?
          X3ALARM   := X1ALARM;             _GET ALARM BIT             ?
          X3WARNING := X1WARNING;           _GET WARNING BIT           ?
          END; _ IF ....                                               ?
  
      X4INT := X4INT + 1;                   _GET NEXT ENTRY            ?
      IF X1LASTENT                          _END OF ENTRIES            ?
      THEN
        X4RUN := FALSE; 
  
      END; _ WITH X3CEPTR'[X4INT]                                      ?
    END; _ WHILE X4RUN                                                 ?
  
  IF X3ALARM ! X3WARNING
  THEN
    PX25MSG(4);                             _SENT ALARM MESSAGE TO NAM ?
  
  END; _ IF PACKET NOT INCOMING CALL                                   ?
END; _ PROCEDURE PX3CHKPKT                                             ?
  
_$J+? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*                    PX3HDPROCESS                                     * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW :                                                         * 
*              CHECKS FOR PACKET LENGTH. HANDLES SPECIAL              * 
*              PROCESSING OF RESTART AND INTERRUPT PACKETS.           * 
*              CHECKS FOR INVALID PACKET TYPES ON PVC CHANNEL.        * 
*                                                                     * 
** INPUT :                                                            * 
*              X3LCCB  = LCCB ADDRESS                                 * 
*              X3IPKHDR= LOCAL PACKET HEADER                          * 
*                                                                     * 
** CALLING PROGRAMS :                                                 * 
*              PX3ULPACKET  - DECODE INBOUND PACKET HEADER            * 
*                                                                     * 
** OUTPUT :                                                           * 
*              ALL PACKETS EXCEPT DATA PACKETS ARE RELEASED.          * 
*              NORMAL LINK OPERATIONAL INFORMATIVE                    * 
*              RESTART PACKET IS CONFIRMED                            * 
*                                                                     * 
** EXTERNAL SUBROUTINES :                                             * 
*              PX3DTEC      - DTE CLEARING STATE                      * 
*              PX25LNKDOWN  - DISCARD PACKET, STOP LINK LEVEL         * 
*              PX3GPPKT     - GENERATE PROTOCOL PACKET                * 
*              PX25MSG      - GENERATE MESSAGE TO NAM DAYFILE         * 
*              PTCTCHR      - COUNT NUMBER OF CHARACTERS IN PACKET    * 
*                                                                     * 
** NOTES :                                                            * 
*                                                                     * 
*                                                                     * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PX3HDPROCESS; 
VAR 
      X3PTR  : B0BUFPTR;
      X3LOOP : INTEGER; 
      X3CNT  : INTEGER; 
      X3STOP : BOOLEAN; 
  
BEGIN 
X3IPKLNGTH := PTCTCHR(X3IPKPTR.X1BFPTR);    _NUMBER OF CHARACTER IN    ?
                                            _ INBOUND PACKET           ?
X3IPLOK    := TRUE; 
CASE X3IPKTYPE OF 
  
  X5INTRRPT:                                _INTERRUPT INDICATION      ?
    BEGIN                                   _ PACKET                   ?
    X3IPLOK := X3IPKLNGTH = 4;
    END;  _ X5INTRRPT                                                  ?
  
  X5RR,                                     _RECEIVE READY PACKET      ?
  X5RNR:                                    _RECEIVE NOT READY PACKET  ?
    BEGIN 
    X3IPLOK := X3IPKLNGTH = 3;
    END;  _ X5RR OR X5RNR                                              ?
  
  X5CALCNN:                                 _CALL CONNECTED PACKET     ?
    BEGIN 
    X3IPLOK := X3IPKLNGTH \ 3;
    END; _ X5CALACC                                                    ?
  
  X5DATA:                                   _DATA PACKET               ?
    BEGIN 
    X3IPKLNGTH := X3IPKLNGTH - 3; 
    X3IPLOK    := X3IPKLNGTH \ 0; 
    END; _ X5DATA                                                      ?
  
  X5DIAG,                                   _DIAGNOSTIC PACKET         ?
  X5STRCONF:                                _RESTART CONFIRMATION      ?
    BEGIN                                   _ PACKET                   ?
    PX25MSG(4);                             _SEND AN ALARM MSG TO NAM  ?
    IF X3IPKTYPE = X5STRCONF                _IF RESTART CONFIRMATION   ?
    THEN
      PX25LNKDOWN;                          _DISCONNECT THE LINK       ?
    END; _ X5STRCONF                                                   ?
  
  X5RESTART:                                _RESTART INDICATION PACKET ?
    BEGIN 
    XTSLCB'.BZXSLCB.BZDCES := TRUE;         _DCE RESTARTING            ?
    END; _ X5RESTART                                                   ?
  
  END; _ CASE X3IPKTYPE                                                ?
IF X3IPLOK = FALSE                          _INCORRECT LENGTH          ?
THEN
  BEGIN 
  PX3DTEC;                                  _DTE CLEARING STATE        ?
  X3PCODE := X7ERROR;                       _NO FURTHER PROCESS NEEDED ?
  END 
ELSE
  IF X3LCCB'.LCCB.LCPVC                     _PVC CHANNEL               ?
  THEN
    IF ([X5CALL,X5CALACC,X5CLEAR,X5CLRCONF] & X3IPKSET.BASETN) " [ ]
                                            _INVALID PACKETS           ?
    THEN
      BEGIN 
      PX25MSG(4);                           _SEND ALARM MSG TO NAM     ?
      PX25LNKDOWN;                          _STOP LINK LEVEL           ?
      END;
END; _ PROCEDURE PX3HDPROCESS                                          ?
_$J+? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*                    PX3ULPACKET                                      * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW :                                                         * 
*              DECODES AND PRE-PROCESSES PACKET HEADER.               * 
*              PROVIDES POINTERS NECESSARY FOR FURTHER PROCESSING     * 
*                                                                     * 
** INPUT :                                                            * 
*              XIPARAMS = WORKLIST WORK AREA                          * 
*              BZPKLUP  = PACKET LEVEL OPERATIONAL                    * 
*                                                                     * 
** CALLING PROGRAMS :                                                 * 
*              PX25TRANS   - MAIN PROGRAM                             * 
*                                                                     * 
** OUTPUT :                                                           * 
*              X3IPKPTR = INPUT PACKET POINTER                        * 
*              X3IPKHDR = LOCAL COPY OF PACKET HEADER                 * 
*              XTLCB    = LCB ADDRESS                                 * 
*              XTSLCB   = SUB LCB ADDRESS                             * 
*              X3LCCB   = LCCB ADDRESS                                * 
*                                                                     * 
** EXTERNAL SUBROUTINES :                                             * 
*              PX3CHKPKT    - CHECK PACKET HEADER                     * 
*              PX3HDPROCESS - PROCESS HEADER                          * 
*              PX3DTEC      - HANDLE DTE CLEARING                     * 
*              PBRELZRO     - RELEASE BUFFERS                         * 
*              PTGETSET     - GENERATES SET TYPE FOR INBOUND PACKET ID* 
*                                                                     * 
** NOTES :                                                            * 
*                                                                     * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PX3ULPACKET;
  
VAR 
      X3CNT   : INTEGER;
      X3CKPKT : BOOLEAN;
  
BEGIN 
X3PCODE   := X7ERROR;                       _PRIMARY FUNCTION CODE     ?
X3IPKTYPE := X7ERROR;                       _INBOUND PACKET ID         ?
  
X3DIAG.X3SCRC := X0RPLN;                    _ERROR DETECTED BY REMOTE  ?
                                            _X.25 PACKET LEVEL NOT     ?
                                            _ OPERATIONAL              ?
IF XTSLCB'.BZXSLCB.BZPKLUP                  _PACKET LEVEL OPERATIONAL  ?
THEN
  BEGIN 
  X3DIAG.X3SCRC := X0RMN8;                  _ERROR DETECTED BY REMOTE  ?
                                            _ERROR IN INCOMING PACKET  ?
  IF X3IPKHDR.XPDPGFI = X9MODL8             _MAKE SURE MODULO 8 IN GFID?
  THEN                                      _ (GENERAL FORMAT ID)      ?
    BEGIN 
    X3DIAG.X3SCRC := 0; 
    X3CKPKT       := FALSE; 
    X3PCODE       := X7DRFC;                _DATA, RESET, FLOW CONTROL ?
    X3SCODE       := X8DFC;                 _DATA, FLOW CONTROL        ?
  
    IF X3IPKHDR.XPKIDL = FALSE              _DATA PACKET               ?
    THEN
      X3IPKTYPE := X5DATA 
    ELSE
      IF X3IPKHDR.XPNPKID = X6RR            _RECEIVE READY PACKET      ?
      THEN
        X3IPKTYPE := X5RR 
      ELSE
        IF X3IPKHDR.XPNPKID = X6RNR         _RECEIVE NOT READY PACKET  ?
        THEN
          X3IPKTYPE := X5RNR
        ELSE
          BEGIN 
          X3PCODE    := X7ERROR;            _UNDEFINED SO FAR          ?
          FOR X3CNT := X5CALL TO            _SCAN TABLE TO FIND A      ?
                             X5DIAG DO      _EXPECTED PACKET ID        ?
            IF X3PKTBL[X3CNT].PKTID =       _ ASSIGN P-CODE S-CODE AND ?
                         X3IPKHDR.XPGPKID   _ INTERNAL PACKET TYPE     ?
            THEN
              BEGIN 
              X3PCODE   := X3PKTBL[X3CNT].PCODE;
              X3SCODE   := X3PKTBL[X3CNT].SCODE;
              X3CKPKT   := X3PKTBL[X3CNT].CKPKT;
              X3IPKTYPE := X3CNT; 
              END;
  
          IF X3PCODE = X7SKIP               _IF RESTART INDICATION,DIAG?
          THEN                              _OR RESTART CONFIRMATION   ?
            IF X3IPKHDR.XPLCHN " 0          _LCHN FIELD MUST BE 0      ?
            THEN
              BEGIN 
              X3PCODE := X7ERROR;           _ERROR FOUND               ?
              X3CKPKT := FALSE;             _NO NEED FOR MORE CHECKING ?
              END;
  
          IF X3CKPKT                        _NEED MORE CHECK FOR       ?
          THEN                              _ INCOMING CALL PACKET OR  ?
            PX3CHKPKT;                      _ CLEAR, RESET AND RESTART ?
                                            _ INDICATION PACKET        ?
  
          END;  _INBOUND PACKET NON DATA OR FLOW CONTROL               ?
  
    END;  _IF MODULO OF 8 IS USED                                      ?
  END;  _IF LINK OPERATIONAL                                           ?
  
PTGETSET(X3IPKTYPE,X3IPKSET); 
IF X3PCODE " X7ERROR                        _PACKET IS GOOD SO FAR     ?
THEN
  PX3HDPROCESS
ELSE                                        _ERROR FOUND IN PACKET     ?
  BEGIN 
  PBRELZRO(X3LCCB'.LCCB.LCACCTPTR,BEDBSIZE); _RELEASE ACCOUNTING BUFFER?
  PX3DTEC;                                  _SEND CLEAR REQUEST PACKET ?
  END;
                                            _ RELEASE INBOUND PACKET   ?
  
_ 
* * * *  DISCARD INBOUND ERRONIOUS PACKET 
? 
IF ([X7ERROR, 
     X5RESTART,X5STRCONF,X5DIAG,
     X5RESET,  X5RSTCONF] & X3IPKSET.BASETN) " [ ]
THEN
  PBRELZRO(X3IPKPTR.X1BFPTR, BEDBSIZE); 
  
END; _ PROCEDURE PX3ULPACKET                                           ?
  
_$J+? 
BEGIN 
XTDBGA [XTDBGI] := BWWLENTRY[OPS].B0TIPWLE; _SAVE WORKLIST ENTRY       ?
XTDBGI          := (XTDBGI + 1) MOD 25;     _UPDATE INDEX INTO ARRAY   ?
  
WITH XIPARAMS DO
  BEGIN 
  XAWORKLIST := BWWLENTRY[OPS]; 
  XTWC       := XAWC; 
  
  IF XTWC @ L2TERMIO
  THEN                                      _LEVEL 2 WORKCODE          ?
    PBLCBP (XALINO.BDLINO, XTLCB)           _GET LCB POINTER           ?
  ELSE
    BEGIN                                   _LEVEL 3 WORKCODE          ?
    X3TCB  := XATCBLCCB;                    _GET TCB POINTER           ?
    XTLCB  := X3TCB'.BSTCB.BSLCBP;          _GET LBC POINTER           ?
    X3LCCB := X3TCB'.BSTCB.BSLCCBPTR;       _GET LCCB ADDRESS          ?
    X3DIAG.X3SCRC := 0; 
    END;
  END;
  
XTSLCB := XTLCB'.BZSLCBPTR;                 _GET SUB-LCB POINTER       ?
  
WITH XTSLCB'.BZXSLCB, XIPARAMS DO           _INDEX TO SUB-LCB          ?
  BEGIN 
  
  CASE  XTWC  OF                            _PROCESS BY WORKCODE       ?
_$J+? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*                LEVEL 2 MAIN PROGRAM                                 * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_ 
  * * * *  PROCESSING LINE EVENTS 
? 
  L5SMEN:                                   _ENABLE LINE REQUEST       ?
    BEGIN                                   _ BRING LINK UP BETWEEN    ?
                                            _ CCP AND PSN              ?
    BZNLCCB := BZFLCCB;                     _SET NEXT LCCB TO 1ST LCCB ?
    BZDAREQ := FALSE; 
_ 
    * * * *  T1 IS IN MULTIPLES OF 100MS
    * * * *  CONVERT IT INTO MULTIPLES OF 3-1/3 MS
? 
    IF BZT1PKT = NIL                        _NOT ASSIGNED YET          ?
    THEN
      BEGIN 
      BZT1PKT := PBGET1BF (B0S16);          _GET 2 8 WORD BUFFERS      ?
      X2TIMPTR.X1BFPTR := BZT1PKT;
      PBCLR (X2TIMPTR.X1BFPTR, 16); 
      WITH X2TIMPTR.X3BFPTR' DO             _TIMER DEFINITION          ?
        BEGIN 
        BKWLINDX  := B0XTRANS;              _LEVEL WORKLIST            ?
        BKWKCODE  := T1TIMER;               _T1 EXPIRATION             ?
        BK1USRWRD := XALINO.BDLINO; 
        END; _ WITH X2TIMPTR                                           ?
  
      X2TIMPTR.X1BFPTR := X2TIMPTR.X1BFPTR + 8; 
      WITH X2TIMPTR.X3BFPTR' DO             _TIMER DEFINITION          ?
        BEGIN 
        BKWLINDX  := B0XTRANS;              _LEVEL 2 WORKLIST          ?
        BKWKCODE  := TREGTIMER;             _TRG EXPIRATION            ?
        BK1USRWRD := XALINO.BDLINO; 
        END; _ WITH X2TIMPTR                                           ?
      END; _ IF BZT1PKT = NIL                                          ?
  
    BZHSTATE := X7DOWN;                     _INITIAL LINK STATE        ?
    X2LCODE  := X7START;                    _START LINK CODE           ?
    PX2STC;                                 _CALL LINK CONTROL         ?
    END; _ L5SMEN                                                      ?
  
  L5SMDA:                                   _DISABLE LINE REQUEST      ?
    BEGIN 
    BZLOCK           := TRUE;               _LOCK OUT MUX LVL XMITTER  ?
    X3IPKPTR.X1BFPTR := NIL;
    PX25LNKDOWN;                            _BRING LINE DOWN           ?
    BZDAREQ          := TRUE; 
    END; _ L5SMDA                                                      ?
  
  L2TERMIO:                                 _I/O SEQUENCE TERMINATED   ?
    BEGIN 
    BZHEVENT   := X7ERROR;
    BZPSTATE   := X8ERROR;
    BZPEVENT   := X8ERROR;
    BZSSTATE   := X9ERROR;
    BZSEVENT   := X9ERROR;
    BZHDLCUP   := FALSE;
    BZPOLL     := FALSE;
    BZRXMT     := FALSE;
    BZOON      := FALSE;
    BZREJ      := FALSE;
    BZFRMRPEND := FALSE;
    BZVS       := 0;
    BZVR       := 0;
    BZLNRR     := 0;
    BZLNRS     := 0;
    BZLFTR     := 0;
    BZRC       := 0;
    BZFRMCNT   := 0;
  
    PX25CLRQUE (BZSFQR);                    _CLEAR SUP QUEUE           ?
    PX25CLRQUE (BZIFQR);
  
    IF BZIFQW = BZLFRM                      _LAST I FRM XMITTED        ?
    THEN
      BZLFRM := NIL;
    IF BZSFQW = BZLFRM                      _LAST S FRM XMITTED        ?
    THEN
      BZLFRM := NIL;
  
    BZSFQW := NIL;
    BZIFQW := NIL;
  
    IF BZLFRM " NIL                         _LAST TRANSMITTED FRAME    ?
    THEN
      BEGIN 
      X2FRPTR.X1BFPTR := BZLFRM;            _COPY FRAME                ?
      IF X2FRPTR.X2BFPTR'.XBFRHDR.XFSUI     _CHECK FOR NON I-FRAME     ?
      THEN
        PBRELZRO (BZLFRM, BEDBSIZE);        _RELEASE IT                ?
      BZLFRM := NIL;                        _RESET POINTER             ?
      END; _ IF BZLFRM " NIL                                           ?
  
    FOR X3MARK := 0 TO 7 DO 
      PBRELZRO (BZFRQ[X3MARK],BEDBSIZE);
  
    BZSTLNK := D5INOP;                      _LINE INOPERATIVE          ?
    IF BZDAREQ                              _DISABLE LINE REQUEST      ?
    THEN                                    _ OUTSTANING               ?
      BEGIN 
      IF BZT1PKT " NIL                      _FIRST LINE DISABLE REQUEST?
      THEN
        BEGIN 
        BZSTLNK := D5DISA;
_ 
          * * *  RELEASE TIMER PACKETS IF LINE DISABLE REQUESTED
? 
        BZT1PKT'.BIINT[16] := 0;            _CLEAR BUFFER CHAIN WORD   ?
        PBREL1BF (BZT1PKT, B0S16);          _RELEASE TIMER BUFFERS     ?
        X2CMDPKT.NKCMD   := NKDISL;         _ISSUE DISABLE LINE        ?
        X2CMDPKT.NKLINO  := XALINO.BDLINO;  _LINE NUMBER               ?
        X2CMDPKT.NKWKFLG := FALSE;          _NO WORKCODE               ?
        PMCDRV (X2CMDPKT);
        END; _ IF BZT1PKT " NIL                                        ?
      END; _  IF BZDAREQ                                               ?
  
    BZLOCK := FALSE;
    PX25TELTIP (L3LINE);
    END; _ L2TERMIO                                                    ?
  
  L2MUXBT:                                  _MUX BUFFER THRASHOLD HIT  ?
    BEGIN                                   _BUFFERS RELEASED BY PMWOLP?
    IF BZHSTATE = X7INFO                    _IF LINK UP IS UP          ?
    THEN
      BEGIN 
      IF BZSSTATE = X9OPER                  _CHANGE SECONDARY SIDE TO  ?
      THEN
        BZSSTATE := X9BUSY;                 _BUSY IF IT WAS OPERATIONAL?
      PX2TIMER (T1TIMER,FALSE);             _STOP T1 TIMER             ?
      X2TIMPTR.X3BFPTR := BZT1PKT + 8;      _GET ADDRESS OF REGULATION ?
      IF NOT X2TIMPTR.X3BFPTR'.BKACTIVE     _TIMER AND IF NOT ACTIVE   ?
      THEN
        BEGIN 
        PX2GPF (X2CRNR,FALSE);              _SEND *RNR* - ASSUME BUFFER?
        PX2TIMER (TREGTIMER,TRUE);          _AND START REGULATION TIMER?
        END; _ BKACTIVE = FALSE ? 
      END; _ BZHSTATE = X7INFO ?
    END;
  
  L2BDFRM:                                  _BAD FRAME RECEIVED        ?
    PBRELZRO (XAFRMPTR, BEDBSIZE);          _RELEASE IT                ?
  
  L2GDFRM:                                  _GOOD FRAME RECEIVED       ?
    BEGIN 
    BZLOCK := TRUE;                         _LOCK OUT MUX LVL XMITTER  ?
    PX2RECEIVER;                            _CALL RECEIVER             ?
    PX25XMIT (XTLCB, XTWC);                 _CALL TRANSMITTER          ?
_ 
* * * *  GET COUNT IN FRAME RETENTION QUEUE 
? 
    XTCNT1 := 0;                            _CLEAR COUNT               ?
    FOR XTCNT2 := 0 TO 7 DO 
      IF BZFRQ[XTCNT2] " NIL
      THEN
        XTCNT1 := XTCNT1 + 1; 
    XTCNT1 := XTCNT1 + BZFRMCNT;            _GET TOTAL COUNT           ?
_ 
* * * * RETURN FRAME STATUS 
? 
    XTL3FRMR := FALSE;                      _SET TO FALSE              ?
    IF XTCNT1 < X2EXTRA + BZK               _NEED MORE FRAMES          ?
    THEN
      IF BZFRMRPEND = FALSE                 _REQUEST NOT SENT YET      ?
      THEN
        XTL3FRMR := TRUE;                   _REQUEST FRAMES            ?
    END; _ L2GDFRM                                                     ?
  
  T1TIMER:  
    BEGIN 
    X2TIMPTR.X1BFPTR := BZT1PKT;            _GET PACKET ADDRESS        ?
110:  
    IF BZT1PKT " NIL                        _TIMER PACKETS ASSIGNED    ?
    THEN
      IF BZTWC [XTWC] =                     _AND MATCHING WAIT COUNTS  ?
         CHR (X2TIMPTR.X3BFPTR'.BK2USRWRD)
      THEN
        BEGIN 
        BZLOCK := TRUE;                     _LOCK OUT MUX LVL XMITTER  ?
        IF BZOON                            _OBT HAS NOT COME YET      ?
        THEN
          IF XTWC = T1TIMER 
          THEN
            PX2TIMER (T1TIMER, TRUE);       _START T1 TIMER            ?
        PX2RECEIVER;
        PX25XMIT (XTLCB, XTWC); 
        END;
    END; _ T1TIMER                                                     ?
  
  TREGTIMER:  
    BEGIN 
    X2TIMPTR.X1BFPTR :=  BZT1PKT + 8;       _GET PACKET ADDRESS        ?
    GOTO 110; 
    END; _ TREGTIMER                                                   ?
  
  L5HARDERR:                                _HARD ERROR FROM PTLINIT   ?
    BEGIN 
    BZLOCK  := TRUE;                        _LOCK OUT MUX LVL XMITTER  ?
    X2LCODE := X7HERR;                      _HARD ERROR CODE           ?
    PX2STC;                                 _CALL LINK CONTROL         ?
    END; _ L5HARDERR                                                   ?
  
_$J+? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*                LEVEL 3 MAIN PROGRAM                                 * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_ 
* * * *  PROCESS START AND STOP REGULATION REQUESTS 
? 
  TPSTARTIN,                                _START REGULATION          ?
  TPSTOPIN:                                 _STOP REGULATION           ?
    BEGIN 
    IF X3LCCB " NIL                         _EXISTING LCCB             ?
    THEN
      BEGIN 
      WITH X3LCCB'.LCCB DO
        IF XTWC = TPSTARTIN                 _WORKCODE = START          ?
        THEN
          BEGIN 
          X3FLG1    := LCREGULON; 
          LCREGULON := FALSE; 
          IF X3FLG1 
          THEN
            PX3GPPKT (X5RR);
          END 
        ELSE
          LCREGULON := TRUE;                _SET REGULATION            ?
      END; _ LCCB " NIL                                                ?
    END; _ TPSTARTIN,TPSTOPIN                                          ?
  
_ 
* * * *  PROCESS CONNECTION EVENTS
? 
  L5TCB:                                    _TCB EVENTS                ?
    BEGIN 
    X3LCCB := XATCBLCCB;                    _LCCB ADDRESS FROM WLE     ?
    X3TCB  := X3LCCB'.LCCB.LCTCBPTR;        _TCB POINTER FROM LCCB     ?
    X3IPKPTR.X1BFPTR := XABFRPTR;           _SET INBOUND BUFFER PTR    ?
    XTLCB   := X3TCB'.BSTCB.BSLCBP;         _LCB POINTER FROM TCB      ?
  
    X3PCODE := X3D0TIP[XADATA];             _SET PRIMARY STATUS EVENT  ?
    IF X3PCODE = X7ICXA _OR X7ICNA?         _HOST/SVM REJECTING CALL   ?
    THEN
      BEGIN 
      X3DIAG.X3SCRC    := XARC;             _ERROR REASON CODE HERE    ?
      X3IPKPTR.X1BFPTR := NIL;              _NO BUFFER GIVEN           ?
      XTLCB := X3LCCB'.LCCB.LCLCBPTR;       _LCB POINTER FROM LCCB     ?
      END;
    XTSLCB  := XTLCB'.BZSLCBPTR;            _SLCB POINTER FROM LCB     ?
    PX3PRIMARY;                             _DO THE THING              ?
    END; _ L5TCB                                                       ?
  
_ 
* * * *  PROCESS BREAK/RESET,INTERRUPT LOGIC
? 
  L5BREAK,                                  _DOWNLINE BREAK            ?
  L5RESET,                                  _DOWNLINE RESET            ?
  L5INTR,                                   _INTERRUPT REQUEST         ?
  L5INTC:                                   _INTERRUPT CONFIRMATION    ?
    BEGIN 
    IF X3LCCB " NIL                         _NOT DISCONNECTING         ?
    THEN
      BEGIN 
      IF XTWC = L5BREAK                     _IF DOWNLINE BREAK         ?
      THEN
        BEGIN 
        X3BRKRC := X3BRDTE;                 _BREAK FROM DTE            ?
        X3CAUSE := ORD(XABFRPTR'.BFDATAC[X4BRKC]);
                                            _CAUSE CODE FROM BUFFER    ?
        X3DIAG.X3SCRC := ORD(XABFRPTR'.BFDATAC[X4BRKD]);
                                            _DIAG CODE FROM BUFFER     ?
        PBRELZRO(XABFRPTR, BEDBSIZE);       _RELEASE BUFFER            ?
        END;  _ IF L5BREAK  ? 
      PTGETSET(0, X3IPKSET);                _CLEAR PACKET SET TYPE     ?
      X3PCODE := X7DRFC;                    _DATA,RESET,INTERRUPT      ?
      X3SCODE := X3CSCOD [XTWC];            _SECONDARY CODE            ?
      PX3PRIMARY;                           _PRIMARY STATES            ?
      END; _ X3LCCB " NIL                                              ?
    END; _ L5BREAK,L5RESET,L5INTR,L5INTC                               ?
  
_ 
* * * *  PROCESS DELETE TCB REQUEST 
? 
  L5SMDLTCB:                                _DELETE TCB REQUEST        ?
    BEGIN 
    IF X3LCCB " NIL                         _ IF LCCB EXISTING         ?
    THEN
      BEGIN 
      X3CAUSE       := 0;                   _NO CLEAR CAUSE CODE       ?
      X3DIAG.X3SCRC := X3TCB'.BSTCB.BSDIAG; _CLEAR DIAG CODE FROM TCB  ?
      X3PCODE := X7FREE;                    _FREE THE CONNECTION       ?
      PX3PRIMARY;                           _CALL PRIMARY STATES       ?
      END;
     IF X3LCCB'.LCCB.LCINVCLR = FALSE       _INV TO CLR NOT SENT       ?
     THEN 
       PX3SVMWKL (D0TCB, D5DELE);           _TCB READY TO BE RELEASED  ?
    END; _ L5SMDLTCB                                                   ?
  
_ 
* * * *  PROCESS THE DOWNLINE FRAGMENT QUEUED 
? 
  TPFRGQ: 
    BEGIN 
    XTL3FRMR := BZFRMRPEND;                 _IF FRAME REQUEST PENDING  ?
    END; _ TPFRGQ                                                      ?
  
_ 
* * * *  PROCESS TIME EXPIRED WAITING FOR CLEAR INDICATION RESPONSE TO
* * * *  INVITATION TO CLEAR
? 
    L5SENDCLR:  
      BEGIN 
          X3LCCB'.LCCB.LCINVCLR := FALSE; 
          PX3GPPKT(X5CLEAR);                _SEND CLEAR REQUEST        ?
          PX3SVMWKL (D0TCB, D5DELE);        _TCB READY TO BE RELEASED  ?
      END; _L5SENDCLR?
  
  END; _ CASE XTWC                                                     ?
  END; _ WITH XTSLCB.BZXSLCB, XIPARAMS                                 ?
  
WITH XTSLCB'.BZXSLCB DO 
  BEGIN 
  
_ 
* * * *  PROCESS LEVEL 3 INPUT PACKETS
? 
  IF XTL3PKQ
  THEN
    BEGIN 
    X3CAUSE  := 0;                          _RESET CAUSE CODE          ?
    X3IPKHDR := X3IPKPTR.X2BFPTR'.XBPKHDR;  _EXTRACT PACKET HEADER     ?
    PN5SRCH (XIPARAMS.XALINO,               _TRY TO GET LOGICAL CHANNEL?
             X3IPKHDR.XPLCHN,               _ CONTROL BLOCK FOR THIS   ?
             X3LCCB);                       _ CONNECTION               ?
  
    IF X3LCCB " NIL                         _FOUND LCCB                ?
    THEN
      PX3ULPACKET                           _VERIFY INBOUND PACKET     ?
    ELSE
      BEGIN 
      PX25MSG(3); 
      X3PCODE := X7SKIP;                    _NO ACTION                 ?
      PBRELZRO (X3IPKPTR.X1BFPTR, BEDBSIZE);
      END;
  
    IF X3PCODE " X7ERROR                    _NO PACKET HEADER ERRORS   ?
    THEN
      IF X3PCODE " X7SKIP                   _SKIP AROUND PRIMARY       ?
      THEN
        PX3PRIMARY;                         _CALL PRIMARY STATES       ?
  
    XTL3PKQ := FALSE; 
    END; _ IF XTL3PKQ                                                  ?
  
  IF BZDCES                                 _DCE RESTARTING            ?
  THEN
    BEGIN 
    X3LCCB  := BZFLCCB;                     _GET FIRST LCCB            ?
    X3SVCNT := BZLPVC + BZLSVC;             _GET LCCB COUNT            ?
    X3FLG1  := FALSE; 
    FOR X3LCHN := 0 TO X3SVCNT DO           _CHECK ALL LCCBS           ?
      BEGIN 
      WITH X3LCCB'.LCCB DO
        BEGIN 
        IF LCPHPSTATE " X7READY             _LCCB NOT READY            ?
        THEN
          BEGIN 
          X3FLG1 := TRUE; 
          IF LCPHPSTATE = X7DTEW            _CALL REQUEST PENDING      ?
          THEN
            BEGIN 
            PX3SVMWKL(D0X25,D5ICAA);        _ABNORMAL RESPONSE TO NAM  ?
            LCDCEC := TRUE;                 _FAKE DCE CLEARING         ?
            END 
          ELSE
            PX3DCEC;                        _FAKE DCE CLEARING         ?
          END;  _IF LCPHPSTATE " X7READY                               ?
        X3LCCB := LCNXTLCCB;                _GET NEXT LCCB             ?
        END;  _WITH X3LCCB'.LCCB DO                                    ?
      END;  _FOR X3LCHN := 0 TO X3SVCNT DO                             ?
    IF X3FLG1 = FALSE 
    THEN
      BEGIN 
      BZDCES := FALSE;                      _CLEAR DCE RESTARTING      ?
      X3LCCB := BZFLCCB;                    _GET FIRST LCCB            ?
      PX3GPPKT(X5STRCONF);                  _SEND A RESTART CONF       ?
      END;
    END;  _IF BZDCES                                                   ?
  
_ 
* * * *  PROCESS LEVEL 3 FRAME REQUESTS 
? 
  IF XTL3FRMR 
  THEN
    BEGIN 
    BZFRMRPEND := TRUE;                     _STILL PENDING             ?
    XTL3FRMR   := FALSE;
  
    IF PX3GETPACKET (0)                     _CHECK OUTSTANDING PACKET  ?
    THEN                                    _PACKETS WRER FOUND        ?
      BEGIN 
      BZLOCK     := TRUE; 
      X3MARK     := 1;                      _INIT COUNTER              ?
      BZFRMRPEND := FALSE;
      IF BZIFQR = NIL                       _QUEUE IS EMPTY            ?
      THEN
        BZIFQR := X3FIRST                   _TOP OF CHAIN              ?
      ELSE
        BZIFQW'.BCCHAINS[QCHN] := X3FIRST;  _QUEUE TO END OF CNAIN     ?
      BZIFQW := X3FIRST;
      WHILE BZIFQW'.BCCHAINS[QCHN] " NIL DO 
        BEGIN                               _FIND END OF CHAIN         ?
        X3MARK := X3MARK + 1;               _UPDATE COUNT              ?
        BZIFQW := BZIFQW'.BCCHAINS [QCHN];  _UPDATE CHAIN              ?
        END; _ WHILE LOOP                                            ?
      BZFRMCNT := BZFRMCNT + X3MARK;        _SAVE FRAME COUNT          ?
  
      PX25XMIT (XTLCB, XTWC);               _CALL TRANSMITTER          ?
      END; _ IF PX3GETPACKET (0)                                     ?
    END; _ IF XTL3FRMR                                                 ?
  
  END; _ WITH XTSLCB'.BZXSLCB                                          ?
END; _ PROCEDURE PX25TRANS                                             ?
  
