*COMDECK X25L2D3
_$J+? 
_ 
  
                     XX      XX    222222    5555555555 
                      XX    XX    22222222   5555555555 
                       XX  XX    22      22  55 
                        XXXX             22  55 
                         XX        2222222    5555555 
                         XX       2222222      5555555
                        XXXX     22                  55 
                       XX  XX    22          55      55 
                      XX    XX   2222222222   55555555
                     XX      XX  2222222222    555555 
  
  
  
                LL            222222    DDDDDDDD      333333
                LL           22222222   DDDDDDDDD    33333333 
                LL          22      22  DD      DD  33      33
                LL                  22  DD      DD          33
                LL            2222222   DD      DD      33333 
                LL           2222222    DD      DD      33333 
                LL          22          DD      DD          33
                LL          22          DD      DD  33      33
                LLLLLLLLLL  2222222222  DDDDDDDDD    33333333 
                LLLLLLLLLL  2222222222  DDDDDDDD      333333
  
  
  
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*                    PXLVL2                                           * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_$R-,G-,I-? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW -                                                         * 
** INPUT -                                                            * 
** CALLING PROGRAMS                                                   * 
** OUTPUT -                                                           * 
** EXTERNAL SUBROUTINES -                                             * 
** NOTES -                                                            * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PXL2D3; 
  
CONST 
*CALL X25CON01
  
TYPE
  
*CALL X25TYP02
*CALL X25TYP07
*CALL X25TYP08
  
VAR 
  
      XIPARAMS : X0PARAMS;                  _INPUT WORKLIST            ?
      XOPARAMS : X0PARAMS;                  _OUTPUT WORKLIST           ?
      X2LCB    : BZLCBP;                    _LCB POINTER               ?
      X2SLCB   : B0BUFPTR;                  _SUB LCB POINTER           ?
      X2LCCB   : B0BUFPTR;                  _LCCB POINTER              ?
      X2IFRPTR : X0BUFPTR;                  _INPUT FRAME POINTER       ?
      X2OFRPTR : X0BUFPTR;                  _OUTPUT FRAME POINTER      ?
  
_$J+? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*                    PX2L3Q                                           * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW -                                                         * 
*              QUEUE A WORKLIST TO X.25 LEVEL 3                       * 
*                                                                     * 
** INPUT -                                                            * 
*              X2L3WC = WORKLIST WORKCODE                             * 
*              X2LCB  = LCB POINTER                                   * 
*                                                                     * 
** CALLING PROGRAMS                                                   * 
*              PXL2D3        -MAIN LEVEL 2 CODE                       * 
*              PX2IFQM       -I FRAME QUEUE MANAGER                   * 
*                                                                     * 
** OUTPUT -                                                           * 
*              WORKLIST QUEUED TO X.25 LEVEL 3                        * 
*                                                                     * 
** EXTERNAL SUBROUTINES -                                             * 
*              PBLSPUT       -QUEUE A WORKLIST                        * 
*                                                                     * 
** NOTES -                                                            * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PX2L3Q( X2L3WC : B08BITS);
  
BEGIN 
WITH XOPARAMS DO                            _OUTPUT WORKLIST           ?
  
  BEGIN 
  XAWC := X2L3WC;                           _SET WORKCODE              ?
  XALINO := X2LCB'.BZLINO;                  _SET LINE NUMBER           ?
  IF X2L3WC = L2PKQ                         _PACKET QUEUED             ?
  THEN
    BEGIN 
    XAFRMPTR := XIPARAMS.XAFRMPTR;          _GET IT FROM INPUT         ?
    XAFRMPTR'.BFFCD := XAFRMPTR'.BFFCD + 2; _SKIP FRAME HEADER         ?
    WITH X2LCB'.BZSLCBPTR'.BZXSLCB DO       _SUB LCB POINTER           ?
      BEGIN 
      IF ( BZFRMCNT < BZK ) & 
         ( ^BZFRMRPEND) 
      THEN
        XAREQ := TRUE 
      ELSE
        XAREQ := FALSE; 
      END; _WITH SUB LCB POINTER? 
    END; _IF X2L3WC = L2PKQ?
  
  PBLSPUT(XAWORKLIST,BYWLCB[B0XL3]);
  END; _WITH XOPARAMS?
END; _PROCEDURE PX2L3Q? 
_$J+? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*                    PX2CSLCB                                         * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW -                                                         * 
*              CLEAN UP SUB LCB FIELDS                                * 
*                                                                     * 
** INPUT -                                                            * 
*              X3SLCB = SUB LCB POINTER                               * 
*                                                                     * 
** CALLING PROGRAMS                                                   * 
*              PXL2D3        -MAIN LEVEL 2 CODE                       * 
*                                                                     * 
** OUTPUT -                                                           * 
** EXTERNAL SUBROUTINES -                                             * 
*              PBRELCHN      -RELEASE BUFFER CHAIN                    * 
*                                                                     * 
** NOTES -                                                            * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PX2CSLCB; 
VAR 
      X2PTR : B0BUFPTR; 
  
BEGIN 
WITH X2SLCB'.BZXSLCB DO                     _SUB LCB POINTER           ?
  BEGIN 
  BZFRMCNT := 0;
  BZLFRM := NIL;                            _LAST FRAME                ?
  BZOON := FALSE;                           _OUTPUT ON                 ?
  
  WHILE BZNFTS " NIL DO                     _RELEASE PENDING           ?
    BEGIN                                   _FRAMES                    ?
    X2PTR := BZNFTS'.BCCHAINS[QCHN];
    PBRELCHN(BZNFTS,BEDBSIZE);
    BZNFTS := X2PTR;
    END; _WHILE BZNFTS " NIL? 
  
  END; _WITH X2SLCB' DO?
END; _PROCEDURE PX2CSLCB? 
_$J+? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*                    PX2IFQM                                          * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW -                                                         * 
*              I FRAME QUEUE MANAGER                                  * 
*                                                                     * 
** INPUT -                                                            * 
*              X2QMWC = REASON CODE FOR CALLING PX2IFQM               * 
*              X2SLCB = SUB LCB POINTER                               * 
*              XIPARAMS = INPUT WORKLIST                              * 
*                                                                     * 
** CALLING PROGRAMS                                                   * 
*              PXL2D3        -LEVEL 2 MAIN CODE                       * 
*              PX2XMITTER    -TRANSMITTER                             * 
*                                                                     * 
** OUTPUT -                                                           * 
** EXTERNAL SUBROUTINES -                                             * 
*              PBHALT        -HALT SYSTEM                             * 
*              PX2L3Q        -QUEUE WORKLIST TO LEVEL 3               * 
*              PBRELCHN      -RELEASE BUFFERS                         * 
*                                                                     * 
** NOTES -                                                            * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_ 
THIS I FRAME QUEUE MANAGER IS COMPLETELY STUBBED. IT WORKS IN 
CONJUNCTION WITH THE NTS TIP. 
  
EXPECTED WORKCODES ARE: 
  L3PKQ: PACKETS QUEUES FROM LEVEL 3. DEPENDING ON THE STATUS 
         OF THE FRAME QUEUE, SEVERAL POINTERS ARE EITHER SET
         OR INITIALIZED. (NEXT-FRAME-TO-SEND, LAST-FRAME-IN-QUEUE 
         CURRENT FRAME COUNT IS UPDATED.
  
  L2IFRMR: INTERNAL LEVEL 2 FRAME REQUEST FORM LEVEL 2 TRANSMITTER. 
         IF FRAMES ARE STILL PENDING, THE RETURNED FRAME POINTER
         IS SET TO NEXT-FRAME-TO-SEND, NEXT-FRAME-TO-SEND IS
         UPDATED AND NEXT-FRAME-TO-ACK IS SET TO THE VALUE OF THE 
         FRAME POINTER (***** THERE IS NO ANTICIPATION *****).
         IF THE FRAME COUNT IS LESS THEN TWICE THE LINK LEVEL 
         WINDOW A FRAME REQUEST IS ISSUED TO LEVEL 3. 
  
  MMOBUX: THIS WORKCODE IS GENERATED BY THE NTS TIP UPON RECEIPT
         OF A FRAME. IT HOLDS THE JUST RECEIVED BUFFER ADDRESS. 
         FRAME COUNT IS DECREMENTED, AND BUFFERS ARE RELEASED.
         IF THE RECEIVED MMOBUX IS OUT OF SEQUENCE(BUFFER ADDRESS 
         NOT EQUAL NEXT-FRAME-TO-ACK PBHALT IS CALLED). 
  
? 
PROCEDURE PX2IFQM( X2QMWC : B08BITS); 
CONST 
  
  
  
VAR 
  
      X2CNT : B08BITS;
      X2PTR : B0BUFPTR; 
  
BEGIN 
WITH X2SLCB'.BZXSLCB,                       _SUB LCB POINTER           ?
     XIPARAMS DO                            _INPUT WORKLIST            ?
  
  BEGIN 
  
  CASE X2QMWC OF
  
    L3PKQ:                                  _PACKETS QUEUED            ?
      BEGIN 
      X2PTR := XAFRMPTR;                    _FIRST PACKET ADDRESS      ?
      X2CNT := 1; 
  
      WHILE X2PTR'.BCCHAINS[QCHN] " NIL DO
        BEGIN 
        X2CNT := X2CNT + 1;                 _UPDATE PACKET COUNT       ?
        X2PTR := X2PTR'.BCCHAINS[QCHN];     _FIND END OF CHAIN         ?
        END; _WHILE X2PTR'...?
  
      IF BZLFRM = NIL                       _QUEUE IS EMPTY            ?
      THEN
        BEGIN 
        BZNFTS := XAFRMPTR;                 _TOP OF CHAIN              ?
        BZLFRM := X2PTR;                    _END OF CHAIN              ?
        BZFRMCNT := BZFRMCNT + X2CNT; 
        END 
      ELSE                                  _QUEUE NON EMPTY           ?
        BEGIN 
        BZLFRM'.BCCHAINS[QCHN] := XAFRMPTR; 
        BZFRMCNT := BZFRMCNT + X2CNT; 
        END; _IF BZLFRM = NIL?
      END; _L3PKQ?
  
    MMOBUX:                                 _OUTPUT BUFFER XMITTED     ?
      BEGIN 
      BZOON := FALSE;                       _RESET OUTPUT ACTIVE       ?
        BZFRMCNT := BZFRMCNT -1;            _DECREASE COUNT            ?
      END; _MMOBUX? 
  
    L2IFRMR:                                _INTERNAL FRAME REQUEST    ?
      BEGIN 
      IF BZNFTS " NIL                       _FRAMES PENDING            ?
      THEN
        BEGIN 
        X2OFRPTR.X1BFPTR := BZNFTS;         _GIVE NEXT TO SEND         ?
        BZNFTS := BZNFTS'.BCCHAINS[QCHN];   _UPDATE CHAIN              ?
        IF BZNFTS = NIL                     _PICKED UP LAST ONE        ?
        THEN
          BZLFRM := NIL;                    _CLEAR END OF CHAIN        ?
        END 
      ELSE
        X2OFRPTR.X1BFPTR := NIL;            _NONE FOUND                ?
  
      IF ( BZFRMCNT < BZK ) &               _IF LESS THAN K FRAMES     ?
          ( ^BZFRMRPEND )                   _L2FRMR NOT SENT YET       ?
      THEN
        PX2L3Q(L2FRMR);                     _REQUEST MORE FRAMES       ?
      END; _L2IFRMR?
  
    END; _CASE X2QMWC OF? 
  END; _WITH X2SLCB'? 
END; _PROCEDURE PX2IFQM?
_$J+? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*                    PX2XMITTER                                       * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW -                                                         * 
*              LEVEL 2 STUBBED TRANSMITTER                            * 
*                                                                     * 
** INPUT -                                                            * 
*              X2SLCB = SUB LCB POINTER                               * 
*                BZOON= OUTPUT ON                                     * 
*                                                                     * 
** CALLING PROGRAMS                                                   * 
*              PXL2D3        -LEVEL 2 MAIN CODE                       * 
*                                                                     * 
** OUTPUT -                                                           * 
*              WORKLIST QUEUED TO THE NTS TIP                         * 
*                                                                     * 
** EXTERNAL SUBROUTINES -                                             * 
*              PX2IFQM       -I FRAME QUEUE MANAGER                   * 
*              PBLSPUT       -GENERATE WORKLIST ENTRY                 * 
*                                                                     * 
** NOTES -                                                            * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PX2XMITTER; 
BEGIN 
  
WITH X2SLCB'.BZXSLCB DO                     _SUB LCB POINTER           ?
  BEGIN 
  
  IF ^BZOON                                 _OUTPUT NOT ACTIVE         ?
  THEN
    BEGIN 
    PX2IFQM(L2IFRMR);                       _REQUEST I FRAME           ?
    IF X2OFRPTR.X1BFPTR " NIL               _WE GOT ONE                ?
    THEN
      BEGIN 
      BZOON := TRUE;
      WITH XOPARAMS DO                      _OUTPUT WORKLIST           ?
        BEGIN 
        XAWC := L2OUTPUT;                   _OUTPUT WORKCODE           ?
_ 
* * * *  RETRIEVE OUTBOUND LINE NUMBER
? 
        PN5SRCH(X2LCB'.BZLINO,X2OFRPTR.X2BFPTR'.XBPKHDR.XPLCHN, 
                X2LCCB);
        XALINO := X2LCCB'.LCCB.LCLINO;
        XAFRMPTR := X2OFRPTR.X1BFPTR;       _FRAME POINTER             ?
        XAFRMPTR'.BFFCD := 8; 
        PBLSPUT(XAWORKLIST,BYWLCB[B0NTSWL]);
        END; _WITH XOPARAMS?
      END; _IF X2OFRPTR " NIL?
    END; _IF ^BZOON?
  END; _WITH X2SLCB'? 
END; _PROCEDURE PX2XMITTER? 
_$J+? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*                                                                     * 
*              PXL2D3 MAIN PROGRAM                                    * 
*              RUNS BOTH AT OPS AND MUX LEVEL                         * 
*              BUT MUX CANNOT INTERRUPT OPS LEVEL                     * 
*                                                                     * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
BEGIN 
  
WITH XIPARAMS DO                            _INPUT WORKLIST            ?
  BEGIN 
  XAWORKLIST := BWWLENTRY[LEVELNO]; 
  PBLCBP(XALINO.BDLINO,X2LCB);              _ACQUIRE LCB POINTER       ?
  X2SLCB := X2LCB'.BZSLCBPTR;               _SUB LCB POINTER           ?
  
  CASE XAWC OF                              _INPUT WORKCODE            ?
  
    L2GDFRM:                                _GOOD FRAME RECEIVED       ?
      BEGIN 
      XOPARAMS.XAWC := MMOBUX;              _SEND MMOBUX               ?
_ 
* * * *  NTS LINE NUMBER IS RETREIVED FROM THE LCCB 
? 
      X2IFRPTR.X1BFPTR := XAFRMPTR;         _INBOUND FRAME ADDRESS     ?
      PN5SRCH(X2LCB'.BZLINO,X2IFRPTR.X2BFPTR'.XBPKHDR.XPLCHN, 
              X2LCCB);                      _GET LCCB ADDRESS          ?
      XOPARAMS.XALINO := X2LCCB'.LCCB.LCLINO; _NTS LINE NUMBER         ?
      PBLSPUT(XOPARAMS.XAWORKLIST,BYWLCB[B0NTSWL]); 
      PX2L3Q(L2PKQ);                        _PASS IT TO LEVEL 3        ?
      END; _L2GDFRM?
  
    L2BDFRM:                                _BAD FRAME RECEIVED        ?
      PBRELCHN(XAFRMPTR,BEDBSIZE);          _RELEASE IT                ?
  
    L3STARTLNK:                             _START LINK REQUEST        ?
      BEGIN 
      X25LINO := XALINO;                    _KEEP TRACK OF LINE NUMBER ?
      PX2L3Q(L2LNKUP);                      _LINK OPERATIONAL          ?
      PX2L3Q(L2FRMR);                       _FRAME REQUEST             ?
      END; _L3STARTLNK? 
  
    L3STOPLNK:                              _STOP LINK REQUEST         ?
      BEGIN 
      PX2CSLCB;                             _CLEAN UP SUB LCB          ?
      PX2L3Q(L2LNKDOWN);                    _LINK INOPERATIVE          ?
      END; _L3STOPLNK?
  
    L3PKQ:                                  _PKTS QUEUED FROM LVL 3    ?
      BEGIN 
      PX2IFQM(L3PKQ);                       _CHAIN NEW DATA FRAMES     ?
      PX2XMITTER;                           _TRY TO TRANSMIT           ?
      END; _L3PKQ?
  
_ 
* * * *  THE FOLLOWING CODE RUNS BOTH AT OPS AND MUX LEVEL
? 
    MMOBUX:                                 _OUTPUT BUFFER TRANSMITTED ?
      BEGIN 
      PX2IFQM(MMOBUX);
      PX2XMITTER;                           _TRY TO TRANSMIT           ?
      END; _MMOBUX? 
  
    END; _CASE XAWC?
  END; _WITH XIPARAMS?
END; _PROCEDURE PXL2D3? 
