*COMDECK HLIP 
_$J+? 
_ 
*********************************************************************** 
*                                                                     * 
*   COPYRIGHT CONTROL DATA CORPORATION 1975, 1976, 1977, 1978, 1979.  * 
*   1980, 1981, 1982, 1983, 1984, 1985.                               * 
*                                                                     * 
*                         VERSION 1.1                                 * 
*                                                                     * 
*********************************************************************** 
? 
_ 
************************************************************************
*                                                                      *
*        P L L I P Q   -   QUEUE OUTPUT TO THE TRUNK CONTROL BLOCK     *
*                                                                      *
************************************************************************
? 
_$G-,R-,I-    NON RECURSIVE, INTERRUPTABLE ?
_ 
************************************************************************
*                                                                      *
** OVERVIEW - THIS PROCEDURE QUEUES DATA FROM BIP TO THE TRUNK CONTROL *
*             BLOCK FOR A LIP SUPPORTED LINK.  IT ALSO QUEUES MESSAGES *
*             THAT ARE INTERNALLY GENERATED BY THE LIP TO THE TRUNK    *
*             CONTROL BLOCK TO AWAIT OUTPUT.  IF THE ENTRY BEING ADDED *
*             CAUSES THE QUEUE TO GO FROM EMPTY TO NON-EMPTY AND       *
*             OUTPUT IS NOT ACTIVE, A WORKLIST ENTRY IS MADE TO THE    *
*             OPS LEVEL LIP TO INITIATE OUTPUT.                        *
*                                                                      *
** INPUT    - TRKPTR POINTER TO THE TRUNK CONTROL BLOCK                *
*             B1BUFF POINTER TO THE DATA BUFFER(S) TO BE QUEUED        *
*                                                                      *
** OUTPUT   - DATA QUEUED TO TRUNK CONTROL BLOCK AND WORKLIST TO OPS   *
*             LEVEL LIP WHEN QUEUE GOES NON-EMPTY WHILE OUTPUT IS      *
*             INACTIVE.                                                *
*                                                                      *
** EXTERNAL SUBROUTINES USED -                                         *
*             1) PBLSPUT - SEND WORKLIST ENTRY TO OPS LEVEL HDLC LIP   *
*             2) PNSGATH - GATHER STATISTICS ON DOWNLINE DATA BLOCKS   *
*                                                                      *
** NOTES    -                                                          *
*                                                                      *
************************************************************************
? 
PROCEDURE PLLIPQ; 
  
CONST 
  P20     = 3;
  TS      = 30; 
  
VAR 
  H4BUFQ  : B0BUFPTR;                       _WORKING VARIABLE FOR QUEUE?
  H4BPRI  : BOOLEAN;                        _BLOCK PRIORITY            ?
  
BEGIN 
WITH TRKPTR'.TRKCB,B1BUFF' DO 
  BEGIN 
  IF BFDATAC[BTPT] " CHR($8F)               _IF NOT AN INTERNAL BLOCK  ?
  THEN
    PNSGATH (TRLCBP, B1BUFF , J0TRSEND);    _GATHER XMITTED CHARS STATS?
  H4BPRI := ORD(BFDATAC[BTPT]) > $7F;       _EXTRACT BLOCK PRIORITY BIT?
  BCCHAINS[QCHN] := NIL;                    _CLEAR BLOCK'S QUEUE PTR   ?
  IF TRLNKQPTR[H4BPRI] = NIL                _IF LINK QUEUE IS EMPTY    ?
  THEN
    BEGIN 
    TRLNKQPTR[H4BPRI] := B1BUFF;            _SET QUEUE POINTER TO BLOCK?
    IF TRPRISTE = P20                       _IF TRUNK IS IDLE          ?
    THEN                                    _SEND WLE TO START OUTPUT  ?
      WITH BWWLENTRY[OPS].B0EWLQ DO         _OPS LEVEL WORKLIST AREA   ?
        BEGIN 
        MMWKCOD := IEXBLKINQ;               _OUTPUT IN QUEUE WORKCODE  ?
        MMLINO  := TRLINO;                  _LINE NUMBER FOR TRUNK     ?
        PBLSPUT(BWWLENTRY[OPS],             _QUEUE WORKLIST TO HDLC LIP?
                BYWLCB[B0HDLC]);
        END;
    END 
  ELSE                                      _LINK QUEUE IS NON-EMPTY   ?
    BEGIN 
    H4BUFQ := TRLNKQPTR[H4BPRI];            _ADDRESS OF FIRST ENTRY    ?
    WHILE H4BUFQ'.BCCHAINS[QCHN] " NIL DO   _WHILE NOT AT END OF QUEUE ?
      H4BUFQ := H4BUFQ'.BCCHAINS[QCHN];     _ADVANCE TO NEXT ENTRY     ?
    H4BUFQ'.BCCHAINS[QCHN] := B1BUFF;       _ADD THIS BLOCK AT THE END ?
    END;
  TRLCTSE := CASECNTR + TS + 1;             _SET TS EXPIRE TIME        ?
  END; _WITH TRCB AND DATA BLOCK? 
  
END; _PROCEDURE PLLIPQ? 
_$J+? 
PROCEDURE PLIP; 
LABEL 90; 
CONST 
  PR1 = TRUE ;                              _ PRIORITY ONE.            ?
  PR2 = FALSE ;                             _ PRIORITY TWO.            ?
  T1 = 2;                                   _ T1 TIME INTERVAL.        ?
  T2 = 4;                                   _ T2 TIME INTERVAL         ?
  TR = 120;                                 _ TR TIME INTERVAL.        ? RN1
  TS = 30;                                  _ TS TIME INTERVAL.        ?
  HC0  = 0; 
  HC11 = 1; 
  HC12 = 2; 
  HC2  = 3; 
  HC3  = 4; 
  HC25 = 6;                                 _ AWAITING RESPONSE TO SIM.?
  HC4  = 5; 
  LC0  = 0; 
  LC1  = 1; 
  LC2  = 2; 
  LC3  = 3; 
  LM1 = 1;
  LM2 = 2;
  LM3 = 3;
  LM4 = 4;
  LM5 = 5;                                  _ AWAIT-ENABLED STATE.     ?
  LM6 = 6;                                  _ I/O TERMINATE W/O TCC AC-?
  LM7 = 7;                                  _  TIVE,AND WITH TCC ACTIVE?
  LM0 = 0;                                  _ I/O TERMINATE FOR DISABLE?
  LINIT = 3;
  LIDLE = 4;
  RC1 = 10 ;                                _ T1 RETRY COUNT.          ?
  RC2 = 60 ;                                _ BUSY RETRY COUNT.        ?
  K = 6;                                    _ K AND MODULUS FOR        ?
  MODULUS = 8;                              _  HDLC PROTOCOL.          ?
  NSADJUST = 2 ;                            _ C-FIELD N(S) ADJUSTER.   ?
  NRADJUST = 32 ;                           _ C-FIELD N(R) ADJUSTER.   ?
  PFADJUST = 16 ;                           _ C-FIELD P/F ADJUSTER.    ?
  DM   = $0F ;                              _ DM RESPONSE CONSTANT.    ?
  RIM  = $07 ;                              _ RIM RESPONSE CONSTANT.   ?
  UA   = $63 ;                              _ UA RESPONSE CONSTANT.    ?
  CMDR = $87 ;                              _ CMDR RESPONSE CONSTANT.  ?
  RR   = $01 ;                              _ RECEIVE READY CONSTANT.  ?
  RNR  = $05 ;                              _ RCV NOT READY CONSTANT.  ?
  REJ  = $09 ;                              _ REJECT CONSTANT.         ?
  UI   = $03 ;                              _ UI CONSTANT.             ?
  SARM = $0F ;                              _ SARM COMMAND CONSTANT.   ?
  I    = $00 ;                              _ I CONSTANT.              ?
  DISC = $43 ;                              _ DISC COMMAND CONSTANT.   ?
  SIM  = $07 ;                              _ SIM COMMAND CONSTANT.    ?
  
                                            _ PRIMARY STATE VALUES.    ?
  P0 = 0 ;
  P1 = 1 ;
  P2 = 2 ;
  P20= 3 ;
  P21=4 ; 
  P3 = 5 ;
  P4 = 6 ;
  P5 = 7 ;
  P6 = 8 ;
  P7 = 9 ;
  P8 = 10;
                                            _ SECONDARY STATE VALUES   ?
  S0 = 0 ;
  S1 = 1 ;
  S2 = 2 ;
  S3 = 3 ;
  ISPFRM = A0WK1 ;                          _ GOOD FRAME FROM I.S.P.   ?
  BADFRM = A0WK2 ;                          _ BAD FRAME.               ?
  RSPFRM = A0WK3 ;                          _ RESPONSE FRAME.          ?
  CMDFRM = A0WK4 ;                          _ COMMAND FRAME.           ?
  IOTERM = A0WK8;                           _ TERMINATED I/O WORK CODE.?
  LMXMTCMP = MMOBUX;                        _ LINE MANAGEMENT TRANSMIT ?
                                            _      FUNCTION COMPLETED. ?
VAR 
  LNAME : PACKED ARRAY [0..7] OF CHAR;      _LIP NAME TO LOCATE IN DMP? 
  LDBGI : INTEGER;                          _INDEX TO NEXT WORKLIST    ?
  LDBGA : ARRAY [0..24] OF BWTIPWLE;        _SAVED WORKLIST ENTRY ARRAY?
  LIPPARAMS : IELIPPARAMS;
  NSS,NR,P,F,CMD,RSP : INTEGER ;
  PR : BOOLEAN ;                            _ PRIORITY FLAG.           ?
  CMDPKT : NKINCOM;                         _ COMMAND PACKET.          ?
  LCB : INTEGER;
  TRUNKNS : INTEGER;                        _ NS BEING USED FOR LOAD   ?
  FLAGS : PACKED RECORD 
          CASE I : INTEGER OF 
          0:(SPARE1   : B08BITS;
             CHROVL   : CHAR);
          1:(SPARE2   : B08BITS;
             PRIORITY : BOOLEAN;
             EOB      : BOOLEAN;
             SPARE3   : B06BITS); 
          END;
  
VALUE 
  LNAME = (#HDLCLIP #); 
  
  LDBGA = (#COPYRIGHT CONTROL DATA CORP. 1975, 1985#);
PROCEDURE P7LDP;FORWARD;
PROCEDURE XMT;FORWARD;
PROCEDURE HCRESET;FORWARD;
PROCEDURE P0IMREQ;FORWARD;
_$J+? 
FUNCTION IC(F:INTEGER) : INTEGER ;
BEGIN 
  WITH TRKPTR'.TRKCB DO 
    BEGIN 
    IC := 1;                                _ IC > 0                   ?
    IF TRI[TRNSO] = NIL                     _ IF NO FRAMED TO REXMIT   ?
    THEN
      IF TRTEXTQPTR[PR1] = NIL              _ AND NO SUBBLOCKS REMAIN  ?
      THEN
        IF TRTEXTQPTR[PR2] = NIL            _ IN TEXT QUEUES           ?
        THEN
          IF TRLNKQPTR[PR1] = NIL           _ AND NO BLOCKS REMAIN     ?
          THEN
            IF TRLNKQPTR[PR2] = NIL         _ IN LINK QUEUES           ?
            THEN                            _ OTHERWISE                ?
              IC := 0;                      _ IC= 0                    ?
    END; _ WITH TRKPTR'TRKCB ?
END; _ FUNCTION IC ?
  
PROCEDURE PLREADYI; 
CONST 
  MAXNRSUBBL = 16;                          _ MAX NR SUBBLOCKS IN FRAME?
VAR 
  NRSUBBL,                                  _ SUBBLOCK COUNTER         ?
  FRAMESIZE : INTEGER ; 
  NOMORTEXT,NOMOROOM : BOOLEAN ;
  
PROCEDURE ADDTOFRAME(PR:BOOLEAN) ;
VAR SIZESUBBLK : INTEGER ;
  
PROCEDURE ADDSUBBLK ; 
VAR FRMLPTR : B0BUFPTR ;
BEGIN _ PROC ADDSUBBLK ?
  WITH TRKPTR'.TRKCB DO 
    BEGIN 
    WITH TRTEXTQPTR[PR]' DO 
      BEGIN 
      IF TRI[TRNSO] = NIL                   _ IF THIS IS THE FIRST     ?
      THEN
        TRI[TRNSO] := TRTEXTQPTR[PR]        _  SUBBLOCK IN FRAME,SET   ?
      ELSE
        FRMLPTR'.BCCHAINS[DBUFLENGTH]       _   FRQ POINTER-ELSE CHAIN ?
              := TRTEXTQPTR[PR] ;           _    SUBBLOCK TO PREVIOUS  ?
                                            _    SUBBLOCK.             ?
      FRMLPTR := TRTEXTQPTR[PR] ;           _ SET LAST-SUBBLOCK-IN-FRM ?
      TRTEXTQPTR[PR] := BCCHAINS[DBUFLENGTH];_ POINTER AND UPDATE TEXT ?
      BCCHAINS[DBUFLENGTH] := NIL;           _  Q POINTER TO REFLECT   ?
                                            _    SUBBLK REMOVAL; ZERO  ?
                                            _     REMOVED SUBBLK CHAIN.?
      BFFCD  := BFFCD -2;                   _ SET FCD BACK (FOR LENGTH ?
      BFCHAR[BFFCD]   := CHR(SIZESUBBLK);   _ SET LENGTH FIELD         ?
      FLAGS.PRIORITY  := PR;                _ SET                      ?
      FLAGS.EOB       :=                    _   UP                     ?
                  (TRTEXTQPTR[PR] = NIL);   _     FLAGS                ?
      BFCHAR[BFFCD+1] := FLAGS.CHROVL;      _ AND PUT THEM INTO BUFFER ?
      END; _ WITH TRTEXTQPTR[PR]' ?         _  AND FLAGS FIELDS).      ?
  
    FRAMESIZE := FRAMESIZE + SIZESUBBLK ;   _ UPDATE FRAME SIZE.       ?
    NRSUBBL := NRSUBBL + 1;                 _ COUNT SUBBLOCKS IN FRAME ?
    IF NRSUBBL > MAXNRSUBBL                 _ DECLARE FRAME FULL IF    ?
    THEN
      NOMOROOM := TRUE;                     _ MAX NR OF SUBBL REACHED  ?
    END; _ WITH TRKPTR'.TRKCB ? 
  END; _ PROC ADDSUBBLOCK ? 
  
FUNCTION SUBBLKFITS(SBPTR : B0BUFPTR) 
                    : BOOLEAN ; 
BEGIN 
  WITH SBPTR' DO
    BEGIN                                   _ THE SUBBLOCK SIZE IS THE ?
    SIZESUBBLK := BFLCD - BFFCD + 3 ;       _   BUFFER CHARACTER COUNT ?
    SUBBLKFITS :=                           _    PLUS 2 (LENGTH,FLAG   ?
      FRAMESIZE + SIZESUBBLK @ TRKPTR'.     _     FIELDS).             ?
                  TRKCB.TRFRMSIZE;
    END; _ WITH SUBPTR' ? 
  END; _ FUNC SUBBLKFITS ?
_ 
* * PROCEDURE ADDTOFRAME
? 
BEGIN 
  WITH TRKPTR'.TRKCB DO 
    IF TRTEXTQPTR[PR] " NIL                 _IF TEXT QUEUE NOT EMPTY,  ?
    THEN
      IF SUBBLKFITS(TRTEXTQPTR[PR])         _  THEN CONCATENATE THE    ?
      THEN
        ADDSUBBLK                           _   FIRST SUBBLOCK IF IT   ?
      ELSE
        NOMOROOM := TRUE                    _     FITS.                ?
    ELSE
      IF TRLNKQPTR[PR] = NIL                _IF TEXT QUEUE WAS EMPTY,  ?
      THEN
        NOMORTEXT := TRUE                   _  AND LINK QUEUE IS NOT,  ?
      ELSE
        IF SUBBLKFITS(TRLNKQPTR[PR])        _    AND FIRST SUBBLOCK IN ?
        THEN                                _      LINK QUEUE FITS,    ?
          BEGIN 
          TRTEXTQPTR[PR] := TRLNKQPTR[PR];  _  THEN MOVE FIRST BLOCK   ?
          TRLNKQPTR[PR] :=                  _    IN LINK QUEUE TO MAKE ?
            TRLNKQPTR[PR]'.BCCHAINS[QCHN];  _      NEW TEXT QUEUE,     ?
          TRTEXTQPTR[PR]'.BCCHAINS[QCHN]    _        AND CONCATENATE   ?
            := NIL ;                        _         THE FIRST        ?
          ADDSUBBLK ;                       _           SUBBLOCK.      ?
          END 
        ELSE
          NOMOROOM := TRUE;                 _  NO MORE ROOM.           ?
  END; _ PROC ADDTOFRAME ?
_ 
* * * MAIN PROCEDURE PLREADYI 
? 
BEGIN 
  WITH TRKPTR'.TRKCB DO 
    BEGIN 
    FRAMESIZE := 2;                         _ INITIAL FRAME SIZE(A/C). ?
    NRSUBBL := 0;                           _ INITIALIZE SUBBLOCK CTR  ?
    NOMORTEXT := FALSE; 
    NOMOROOM := FALSE ; 
    REPEAT                                  _CONCATENATE PRIORITY ONE  ?
      ADDTOFRAME(PR1)                       _  BLOCKS,IF POSSIBLE,UNTIL?
    UNTIL NOMORTEXT ! NOMOROOM ;            _    NO MORE OR MAX FRM SZE?
    IF NOT NOMOROOM 
    THEN
      BEGIN                                 _ IF ROOM LEFT,            ?
      NOMORTEXT := FALSE ;
      REPEAT                                _  CONCATENATE PRIORITY TWO?
        ADDTOFRAME(PR2)                     _    BLOCKS UNTIL NO MORE  ?
      UNTIL NOMORTEXT ! NOMOROOM ;          _      OR MAX FRAME SIZE.  ?
      END; _ NOT NOMOROOM ? 
    WITH TRI[TRNSO]' DO 
      BEGIN 
      BFFCD := BFFCD - 2;                   _ MOVE BACK FCD AND PUT    ?
      BFCHAR[BFFCD] := CHR(0);
      IF TRREMOTE                           _  A AND C FIELDS PRIOR TO ?
      THEN
        BFCHAR[BFFCD] := CHR(1);            _    FIRST SUBBLOCK        ?
      BFCHAR[BFFCD+1] := CHR(TRNSO * NSADJUST); 
      END; _ WITH TRI[TRNSO]' ? 
    END; _ WITH TRKPTR'.TRKCB ? 
  END; _ PROCEDURE PLREADYI ? 
  
PROCEDURE CLEANUP;
VAR 
  PR  : BOOLEAN;
  J   : INTEGER;
  BUF : B0BUFPTR; 
BEGIN 
  WITH TRKPTR'.TRKCB DO 
    BEGIN 
    TRFRMPTR := NIL;                        _ CLEAR PRIMARY TCC PARAMS.?
    TRCMDCFLD := 0; 
    FOR J := 0 TO 7 DO                      _ RELEASE BUFFERS IN FRAME ?
      IF TRI[J] " NIL 
      THEN                                  _  RETENTION QUEUE. SET    ?
        BEGIN 
        IF TRI[J] = TRTCCOB                 _   FLAG FOR TCC TO RELEASE?
        THEN
          TRTCCREL := TRUE                  _    IF TCC IS PROCESSING  ?
        ELSE
          PBRELCHN(TRI[J],BEDBSIZE);        _     THE BUFFERS.         ?
        TRI[J] := NIL;
        END;
    FOR PR := FALSE TO TRUE DO              _ FOR EACH PRIORITY:       ?
      BEGIN 
      PBRELZRO(TRTEXTQPTR[PR],BEDBSIZE);    _ RELEASE TEXT Q BFRS.     ?
      PBRELZRO(TRTBRF[PR],BEDBSIZE);        _ RELEASE XMT REASSEMBLY   ?
      WHILE TRLNKQPTR[PR] " NIL DO          _  BFRS,AND                ?
        BEGIN 
        BUF := TRLNKQPTR[PR];               _   RELEASE BFRS FOR       ?
        TRLNKQPTR[PR] := TRLNKQPTR[PR]'.    _    ALL BLOCKS QUEUED     ?
                         BCCHAINS[QCHN];    _     ON THE LINK.         ?
        PBRELCHN(BUF,BEDBSIZE); 
        END;
      END;
    END;
END;
  
PROCEDURE TSSM(DATA:INTEGER); 
BEGIN 
  WITH TRKPTR'.TRKCB,BWWLENTRY[OPS].CMSMLEY DO
    BEGIN 
    CMDATA := DATA; 
    CMWKCODE := D0LINE; 
    CMLINO.BDLINO := TRLINO;                _ LINE NUMBER.             ?
    PBLSPUT(BWWLENTRY[OPS],BYWLCB[B0SMWL]); _ PASS TO SM WORK LIST.    ?
    TRITSS := TRUE;                         _ SET INITIAL STATUS SENT. ?
    END;
END;
  
PROCEDURE PLIOSTOP; 
VAR 
  ENDCMD : NKINCOM;                         _ COMMAND PACKET.          ?
BEGIN 
  WITH TRKPTR'.TRKCB,ENDCMD DO
    BEGIN 
    NKCMD := NKENDOUT;                      _ TERMINATE OUTPUT COMMAND.?
    NKLINO := TRLINO;                       _ LINE NUMBER.             ?
    NKRELBFS := FALSE;                      _ DONT RELEASE BUFFERS.    ?
    NKWKFLG := FALSE;                       _ NO WORK LIST ENTRY.      ?
    PBCOIN(ENDCMD);                         _ ISSUE COMMAND.           ?
    NKCMD := NKENDIN;                       _ TERMINATE INPUT COMMAND. ?
    NKRELBFS := TRUE;                       _ RELEASE BUFFERS.         ?
    NKWKFLG := TRUE;                        _ MAKE WORK LIST ENTRY.    ?
    NKWLINDX := B0HDLC;                     _ (WORK LIST INDEX         ?
    NKWKCOD := IOTERM;                      _   AND WORK CODE.)        ?
    PBCOIN(ENDCMD);                         _ ISSUE COMMAND.           ?
    END;
END;
  
PROCEDURE LC3TR;
BEGIN 
  WITH CNCEOVLY[OPS],TRKPTR'.TRKCB DO       _ CE ERROR FILE, TCB       ?
  BEGIN 
    CNCECODE := CELPTIMO;                   _TIMEOUT ON IDLE BLOCK     ?
    HLINO    := TRLINO;                     _LINE NUMBER               ?
    HLNID    := TRTNID;                     _REMOTE NODE ID            ?
  END;
  PNCEFILE(4);
  TSSM(D5INOP);                             _ SEND TRUNK INOP SM.      ?
  CLEANUP;                                   _  WORK;CLEAN UP OUTPUT.  ?
  HCRESET;                                   _ RESTART HDLC.           ?
  TRKPTR'.TRKCB.TRLCSTE := LC1;              _ SET LC STATE TO WAITING-?
  END;                                       _                FOR-SEND.?
  
PROCEDURE LCXMT(SUBTYPE : INTEGER); 
VAR 
  BFR:B0BUFPTR; 
BEGIN 
  BFR    := B1BUFF;                         _ SAVE B1BUFF CONTENTS     ?
  B1BUFF := PBGET1BUF(BEDBSIZE);            _ GET A BUFFER             ?
  WITH B1BUFF' DO 
    BEGIN 
    BFLCD := BTPT + 1;                      _ SET UP LCD.              ?
    BFDATAC[DN]   := CHR(TRKPTR'.TRKCB.     _ PUT IN DN(LRN)           ?
                         TRTNID); 
    BFDATAC[SN]   := CHR(CKLOCNODE);        _        SN,               ?
    BFDATAC[CN]   := CHR(0);                _        AND CN.           ?
    BFDATAC[BTPT] := CHR($8F);              _ PUT IN ACTL BLOCK TYPE   ?
    BFDATAC[BTPT+1] := CHR(SUBTYPE);        _  WITH PRIORITY  AND SET  ?
    END;                                    _   SUBBLK TYPE FROM PARAM.?
  IF SUBTYPE = LINIT                        _IF ATTTEMPTING TO BRING UP?
  THEN                                      _LINE THEN CLEAN UP OUTPUT ?
    CLEANUP;                                _BUFFERS                   ?
  PLLIPQ;                                   _ QUEUE BLOCK FOR XMISSION ?
  B1BUFF := BFR;                            _ RESTORE B1BUFF CONTENTS  ?
END;
PROCEDURE LCBLKRECVD; 
VAR 
  TEMPLLCB : B0BUFPTR;                      _ TEMPORARY LLCB POINTER   ?
  BLKT     : INTEGER;                       _ TEMPORARY BLOCK TYPE     ?
  BLKT2    : INTEGER;                       _ TEMPORARY SUB BLOCK TYPE ?
  TABLE    : B0BUFPTR;                      _ POINTER FOR TABLE LOOK UP?
BEGIN 
  WITH TRKPTR'.TRKCB,B1BUFF' DO CASE TRLCSTE OF _CASE LINK-CNTRL STATE:?
    LC1 : PBRELCHN(B1BUFF,BEDBSIZE);        _ AWAITING SEND:DISCARD IT.?
    LC2 :                                   _ AWAITING-LINIT:          ?
      BEGIN 
      IF ORD(BFDATAC[BTPT]) MOD 16 = 15     _   IF THIS IS A LINIT     ?
      THEN
        IF ORD(BFDATAC[BTPT+1]) = LINIT     _    BLOCK FROM PROPER     ?
        THEN
          IF ORD(BFDATAC[DN]) = CKLOCNOD    _      WITH PROPER DN      ?
          THEN
            IF ORD(BFDATAC[SN]) = TRTNID    _      AND PROPER SN       ?
            THEN
            BEGIN 
              TSSM(D5OPER);                 _ SEND TRUNK OPRTNL SM.    ?
              IF TRREMOTE THEN LCXMT(LINIT);_ IF REMOTE NODE,TRANSMIT  ?
                                            _     LINIT BLOCK.         ?
              TRLCTRE := CASECNTR + TR + 1; _     SET TR EXPIRE TIME.  ?
              TRLCSTE := LC3;               _     SET LINK-CONTROL     ?
            END;                            _     STATE TO OPERATING.  ?
      PBRELCHN(B1BUFF,BEDBSIZE);            _ RELEASE THE BLOCK        ?
      END;
    LC3 :                                   _ OPERATING:               ?
      BEGIN 
      TRLCTRE := CASECNTR + TR + 1;         _   SET TR EXPIRATION TIME.?
      BLKT  := ORD(BFDATAC[BTPT]);          _ GET BLOCK TYPE FROM BUFF ?
      BLKT2 := ORD(BFDATAC[BTPT+1]);        _ GET SUB BLOCK TYPE       ?
                                            _ FROM BUFFER              ?
      IF (BLKT MOD 16 = 15)                 _ IF HTACTL BLOCK          ?
      THEN
        IF BLKT2 = LIDLE                    _ IF BLOCK IS A LIDLE      ?
        THEN
          PBRELCHN (B1BUFF, BEDBSIZE)       _ DISCARD IT               ?
        ELSE
          IF BLKT2 = LINIT                  _ IF BLOCK IS A LINIT      ?
          THEN
            BEGIN 
            PBRELCHN(B1BUFF,BEDBSIZE);      _        DISCARD IT AND    ?
            IF TRREMOTE THEN LC3TR;         _         FAIL TRUNK IF    ?
            END                             _          REMOTE NPU;     ?
          ELSE
            PBRELCHN (B1BUFF,BEDBSIZE)
      ELSE                                  _ NOT BLOCK TYPE 15        ?
        BEGIN 
        B1BUFF'.BIINT[3] := 0;              _ CLEAR QCHN WORD          ?
        B1BUFF'.BIINT[4] := 0;              _ CLEAR NEXT WORD          ?
        PNSGATH (TRLCBP,B1BUFF,J0TRRCVE);   _COUNT CHARS. RECEIVED     ?
        PBSWLE (B1BUFF);                    _ SWITCH THE BLOCK         ?
        END;
      END;
    END;
END;
PROCEDURE LCNOTSND; 
BEGIN 
  WITH TRKPTR'.TRKCB DO                     _ IF   LINK CONTROL STATE  ?
  IF TRLCSTE = LC2                          _ IS AWAITING LINIT        ?
  THEN
    BEGIN 
    CLEANUP;                                _    CLEAN UP OUTPUT BFRS, ?
    TRLCSTE := LC1;                         _     AND CHANGE STATE TO  ?
    END                                     _      AWAITING-SEND.      ?
  ELSE
    IF TRLCSTE = LC3                        _  ELSE IF LINK CONTROL IS ?
    THEN                                    _  OPERATIOONAL            ?
      BEGIN 
      CLEANUP;                              _    RELEASE OUTPUT BFRS.  ?
      WITH CNCEOVLY[OPS] DO                 _ CE ERROR FILE            ?
        BEGIN 
        CNCECODE := CELPPROTF;              _PROTOCOL FAILURE (HDLC)   ?
        HLINO    := TRLINO;                 _LINE NUMBER               ?
        HLNID    := TRTNID;                 _REMOTE NODE ID            ?
        END;
      PNCEFILE(4);                          _SEND CE ERROR MESSAGE     ?
      TSSM(D5INOP);                         _ SEND TRUNK INOP SM.      ?
      TRLCSTE := LC1;                       _    WHEN GOING INOP,AND   ?
      END;                                  _    CHANGE STATE TO AWAIT-?
                                            _    ING-SEND.             ?
END;
  
PROCEDURE ABTDMPLD; 
  
VAR 
  LPTR : B0BUFPTR;
  
BEGIN 
IF TRKPTR'.TRKCB.TRLOADFLG                  _ IF LOADING               ?
THEN
  BEGIN 
  TRKPTR'.TRKCB.TRLOADFLG := FALSE;         _ NO LONGER LOADING        ?
  LOADFLG := FALSE; 
  TRUNKNS := 0; 
  LPTR := TRKPTR'.TRKCB.TRUI;               _ GET ANY LOAD BLOCK(S)    ?
  WHILE LPTR " NIL DO                       _ RELEASE ALL DATA QUEUED  ?
    BEGIN 
    TRKPTR'.TRKCB.TRUI := TRKPTR'.TRKCB 
                 .TRUI'.BCCHAINS[QCHN]; 
    LPTR'.BIINT[3] := 0;
    LPTR'.BIINT[4] := 0;
    PBRELCHN (LPTR,BEDBSIZE); 
    LPTR := TRKPTR'.TRKCB.TRUI; 
    END; _ WHILE LPTR " NIL ? 
  TRKPTR'.TRKCB.TRUI := NIL;                _ LOAD POINTER             ?
  TRKPTR'.TRKCB.TRPRISTE := P0; 
  END;
END; _ PROCEDURE ABTDMPLD ? 
PROCEDURE HCLDPRSP(RC : INTEGER;BLK : B0BUFPTR);
  
CONST 
  CI = P5;
  BC = P11; 
  ILOAD = 1;
  
VAR 
  LSFC : DHSFCTYPE; 
  LROUTE : BOOLEAN; 
  
BEGIN 
LROUTE := TRUE;                             _ DEFAULT - ROUTE BLOCK    ?
IF RC = 0                                   _ IF NOT ERR               ?
THEN
  BEGIN 
  IF BLK " NIL                              _ IF BLOCK FROM SAM-P      ?
  THEN
    BEGIN 
    BLK'.BIINT[3] := 0;                     _ CLEAR QUEUE CHAIN        ?
    BLK'.BIINT[4] := 0; 
    LSFC.DHINT := ORD(BLK'.BFDATAC[SFC]);   _ GET RESPONSE TYPE        ?
    IF BLK'.BFDATAC[CI] = CHR(ILOAD)        _ IF LOAD BLOCK            ?
    THEN
      IF LSFC.DHRTYPE " SMABNORMAL          _ AND NOT ERROR REPLY      ?
      THEN
        IF BLK'.BFDATAC[BC] = CHR(0)        _ AND NOT LAST BLOCK       ?
        THEN
          BEGIN 
          LROUTE := FALSE;                  _ DO NOT ROUTE BUFFER      ?
          PBRELCHN (BLK,BEDBSIZE);          _ RELEASE THE BUFFER       ?
          END;
    IF LROUTE 
    THEN
      PBSWLE (BLK);                         _ GIVE BLOCK TO BIP        ?
    IF LSFC.DHRTYPE = SMABNORMAL            _ IF SAM-P ERROR           ?
    THEN
      BEGIN 
10: 
      ABTDMPLD;                             _ ABORT THE DUMP/LOAD      ?
      TRKPTR'.TRKCB.TRPRISTE := P0; 
      TRKPTR'.TRKCB.TRHCSTE := HC12;        _ CHANGE TO TIMING STATE   ?
      TRKPTR'.TRKCB.TRHCTE  := CASECNTR + 40; 
      END;
    END; _ BLK " NIL ?
  END _ RC = 0 ?
ELSE _ RC " 0 ? 
  BEGIN 
  IF BLK " NIL
  THEN                                      _ RELEASE THE BUFFER       ?
    BEGIN 
    PBRELCHN (BLK,BEDBSIZE);
    GOTO 10;                                _ GO ABORT DUMP/LOAD       ?
    END; _ BLK " NIL ?
  END; _ ELSE RC " 0 ?
END; _ PROCEDURE HCLDPRSP ? 
PROCEDURE HCRESET;
BEGIN 
  WITH TRKPTR'.TRKCB DO                     _ PERFORM P0START          ?
    BEGIN 
    TRPRISTE := P0;                         _ GO TO BASIC HDLC STATE   ?
    TRNSU := 0;                             _ INITIAL NSU.             ?
    TRNSO := 0;                             _ INITIAL NSO.             ?
    TRRC := RC1;                            _ INITIAL RETRY COUNT.     ?
    TRP := 1; 
    TRCMDCFLD := SARM;                      _ SEND SARM.               ?
    XMT;
    TRPRISTE := P1;                         _ SET STATE TO LINK-SET-UP.?
    TRT1ET := CASECNTR + T1 + 1;            _ SET T1 EXPIRE TIME.      ?
    TRHCSTE := HC11;                        _ SET HDLC CONTROL STATE TO?
    END;                                    _ AWAITING RESPONSE TO SARM?
END;
  
PROCEDURE HCINOP; 
BEGIN 
  WITH TRKPTR'.TRKCB DO CASE TRHCSTE OF     _ ACT PER HDLC-CNTRL STATE:?
    HC11,HC25 :                             _  AWAITING RESPONSE TO    ?
      BEGIN                                 _   SARM OR SIM:           ?
      TRHCSTE := HC12;                      _   CHANGE TO TIMING STATE.?
      TRHCTE := CASECNTR + 40;              _   SET EXPIRATION TIME TO ?
      END;                                  _    NOW + 20 SECONDS.     ?
    HC2 :                                   _  SENDING:                ?
      BEGIN 
      LCNOTSND;                             _   REPORT  NOT-SENDING TO ?
      TRHCSTE := HC12;                      _    LINK CONTROL;CHANGE   ?
      TRHCTE := CASECNTR + 40;              _     TO TIMING STATE WITH ?
      END;                                  _      EXPIRATION IN 20 SEC?
    HC3 : 
      BEGIN                                 _  LOADING:                ?
      HCLDPRSP(1,NIL);                      _ SEND BACK BAD-LOAD RSPNSE?
      TRHCSTE := HC12;                      _ SET STATE TO TIMING,     ?
      TRHCTE := CASECNTR + 40;              _  WITH EXPRTN IN 20 SECS. ?
      END;
    END;
END;
PROCEDURE HCPRIM; 
BEGIN 
  WITH TRKPTR'.TRKCB DO CASE TRHCSTE OF     _ CASE HDLC-CNTROL STATE:  ?
    HC11,HC12,HC4 :                         _  AWAITING-RSPNS-TO-SARM, ?
                                            _   TIMING,OR AWAITING     ?
      BEGIN                                 _    DOWNLINE LOAD BLOCK:  ?
      TRHCSTE := HC25;                      _    CHANGE TO WAITING-FOR-?
      P0IMREQ;                              _     SIM-RESPONSE STATE   ?
      END;                                  _      AND CALL HDLC TO    ?
                                            _       SEND ACROSS AN SIM.?
    HC2 :                                   _  SENDING :               ?
      BEGIN                                 _    REPORT NOT-SENDING    ?
      LCNOTSND;                             _     TO LINK CONTROL,     ?
      TRHCSTE := HC25;                      _      CHANGE TO AWAITING- ?
      P0IMREQ;                              _       SIM-RESPONSE,AND   ?
      END;                                  _        CALL HDLC TO SEND ?
                                            _         ACROSS AN SIM.   ?
    END;
END;
PROCEDURE HCPLDUAUI;
  
VAR 
  LPTR : B0BUFPTR;
  
BEGIN 
  WITH TRKPTR'.TRKCB DO 
    BEGIN 
    HCLDPRSP(0,  LIPPARAMS.IEFRMPTR);       _ SEND BACK GOOD LOAD RSP, ?
                                            _  WITH RSPNSE UI,IF ANY.  ?
      LIPPARAMS.IEFRMPTR := NIL;            _ CLEAR FRAME POINTER.     ?
    IF (TRLOADFLG) &                        _ IF STILL LOADING         ?
       (TRUNKNS = NS)                       _ AND NS STILL AVAILABLE   ?
    THEN
      BEGIN 
      IF TRUI " NIL 
      THEN
        BEGIN 
        LPTR := TRUI'.BCCHAINS[QCHN]; 
        TRUI'.BIINT[3] := 0;
        TRUI'.BIINT[4] := 0;
        PBRELCHN (TRUI,BEDBSIZE); 
        TRUI := LPTR; 
        IF TRUI " NIL 
        THEN
          BEGIN 
          TRUI'.BIINT[4] := UI; 
          TRUI'.BFFCD := TRUI'.BFFCD -2;
          P7LDP;
          END 
        ELSE
          TRHCSTE := HC4; 
        END 
      ELSE
        TRHCSTE := HC4; 
      END 
    ELSE
      ABTDMPLD;                             _ABORT DUMP/LOAD           ?
    END;                                    _   STATE.                 ?
END;
PROCEDURE NRBUMP ;
VAR PR : BOOLEAN; 
BEGIN 
  WITH TRKPTR'.TRKCB,LIPPARAMS DO BEGIN 
    WHILE IEFRMPTR " NIL DO BEGIN 
      WITH IEFRMPTR' DO BEGIN 
        IF BFRPP THEN                       _ IF SUBBLK PRIORITY POSTED?
          BEGIN                             _  IN THIS BUFFER,         ?
          PR := BFRPRFG;                    _   COPY TO PR FLAG AND    ?
          BFRPP := FALSE;                   _    CLEAR BUFFER          ?
          BFRPRFG := FALSE;                 _     FLAGS.               ?
          END;
        IF TRRBRF[PR] = NIL                 _ IF FIRST SUBBLK OF BLOCK,?
          THEN TRRBRF[PR] := IEFRMPTR       _ THEN SET REASSEMBLY-FIRST?
          ELSE TRRBRL[PR]'.BCCHAINS         _  POINTER,ELSE CHAIN TO   ?
               [DBUFLENGTH] := IEFRMPTR;    _   PREVIOUS SUBBLOCK.     ?
        TRRBRL[PR] := IEFRMPTR;             _ UPDATE REASSEMBLY-LAST   ?
        IEFRMPTR := BCCHAINS[DBUFLENGTH];   _  POINTER, AND UPDATE     ?
        BCCHAINS[DBUFLENGTH] := NIL;        _   FRAME POINTER TO       ?
                                            _    REFLECT REMOVED SUBBLK?
        IF BFREBFG THEN BEGIN               _ IF LAST SUBBLK OF BLOCK, ?
          BFREBFG := FALSE;                 _ CLEAR BUFFER FLAG AND    ?
          B1BUFF := TRRBRF[PR];             _  THEN EMPTY              ?
          TRRBRF[PR] := NIL;                _   REASSEMBLY QUEUE AND   ?
          LCBLKRECVD;                       _    PASS BLK TO LINK CNTRL?
          END;
        END;
      END;
    TRNR := (TRNR + 1) MOD MODULUS ;        _ UPDATE N(R).             ?
    END;
  END;
PROCEDURE NRRESET;
BEGIN 
  WITH TRKPTR'.TRKCB DO 
    BEGIN 
    PBRELZRO(TRRBRF[PR1],BEDBSIZE);         _ RELEASE REASSEMBLY QUEUE ?
    PBRELZRO(TRRBRF[PR2],BEDBSIZE);         _  BFRS FOR EACH PRIORITY. ?
    TRNR := 0;                              _ ZERO N(R).               ?
    END;
END;
PROCEDURE NSUSET ;
BEGIN 
  WITH TRKPTR'.TRKCB DO 
    WHILE TRNSU " NR DO BEGIN               _ FOR EACH ACKED FRAME:    ?
      WHILE TRI[TRNSU] " NIL DO             _ FOR EACH SUBBLK THEREIN: ?
        WITH TRI[TRNSU]' DO BEGIN 
          IF TRTBRF[BFTPRFG] = NIL          _   IF FIRST SUBBLK OF BLK ?
            THEN TRTBRF[BFTPRFG]            _     THEN SET REASSEMBLY- ?
                 := TRI[TRNSU]              _      FIRST PTR,ELSE      ?
            ELSE TRTBRL[BFTPRFG]'.BCCHAINS  _       CHAIN SUBBLK TO    ?
                 [DBUFLENGTH] := TRI[TRNSU];_        PREVIOUS SUBBLK.  ?
          TRTBRL[BFTPRFG] := TRI[TRNSU] ;   _   SET REASSEMBLY-LAST PTR?
          TRI[TRNSU] := BCCHAINS[DBUFLENGTH _   AND UPDATE FRQ SLOT    ?
                                          ];_     FROM SUBBLK CHAIN.   ?
          BCCHAINS[DBUFLENGTH] := NIL;      _   ZERO SUBBLK CHAIN.     ?
          FLAGS.CHROVL := BFCHAR[BFFCD+1];
          BFFCD := J1FRSTCHAR ;             _   RESTORE FCD PAST L,F.  ?
          IF FLAGS.EOB                      _ IF LAST SUBBLOCK OF BLOCK?
          THEN
            PBRELCHN (TRTBRF[BFTPRFG], BEDBSIZE); _ RELEASE BUFFERS    ?
          END;
      TRNSU := (TRNSU + 1) MOD MODULUS ;    _ ADVANCE NSU(ONCE FOR EACH?
      TRT2ET := 0;                          _ RESET T2                 ?
      END;                                  _  ACKNOWLEDGED FRAME).    ?
  END;
PROCEDURE OUTPUT(VAR FIRSTWORD:INTEGER);
BEGIN 
  WITH TRKPTR'.TRKCB,CMDPKT,BWWLENTRY[OPS].BWLIPPARAMS DO 
    CASE TRLMSTE OF                         _ CASE LINE MNGEMENT STATE:?
      LM1,LM2,LM5 :                         _    NOT READY FOR I/O:    ?
        BEGIN 
        IEWKCOD := LMXMTCMP;                _     MAKE TRANSMIT-CMPLETE?
        IELINO.BDLINO := TRLINO;            _      WLE FOR THIS TRUNK  ?
        PBLSPUT(BWWLENTRY[OPS],BYWLCB[B0HDLC]);_    (HDLC FAKEOUT).    ?
        END;
      LM3 :                                 _   READY FOR I/O:         ?
        BEGIN 
        TRLMSTE := LM4;                     _     SET LM STATE TO OUT- ?
        NKCMD := NKDOUT;                    _      PUTTING. SET UP     ?
        NKLINO := TRLINO;                   _       OUTPUT COMMAND IN  ?
        ADDR(FIRSTWORD,NKOBP);              _         CMD PACKET.      ?
        PBCOIN(CMDPKT);                     _         ISSUE CMD.       ?
        TRLMTE := CASECNTR + 3;             _     SET TIMEOUT TIME.    ?
        END;
      LM6 : TRLMSTE := LM7;                 _   TERMINATING I/O: CHANGE?
      END;                                  _    TO TERMINATING-WITH-  ?
                                            _     TCC-WAITING.         ?
END;
PROCEDURE XMTLDP; 
BEGIN 
  WITH TRKPTR'.TRKCB DO 
    BEGIN 
    OUTPUT(TRLDPTR'.BIINT[1]);              _ OUTPUT LOAD/DUMP BLOCK.  ?
    TRTCCOB := TRLDPTR;                     _SET TCC IN-PROCESS-BFR PTR?
    TRLDPTR := NIL;                         _ ZERO TCC PARAM.          ?
    TRXMTING := TRUE;                       _ SET TCC-TRANSMITTING FLG.?
    END;
END;
PROCEDURE XMTSEC ;
BEGIN 
  WITH TRKPTR'.TRKCB DO BEGIN 
    TRXMTCFLD := TRRSPCFLD + TRF * PFADJUST;_ SET UP C-FIELD FROM      ?
    IF TRREMOTE                             _ SET A-FIELD.             ?
      THEN TRXMTAFLD := 0 
      ELSE TRXMTAFLD := 1;
    TRRSPCFLD := 0;                         _  PARAMS,THEN ZERO PARAMS.?
    TRF := 0 ;
    OUTPUT(TRWD1XMT);                       _ LAUNCH RESPONSE.         ?
    TRLSTXMTPRI := FALSE ;                  _ ESTABLISH                ?
    TRXMTING := TRUE ;                      _  TCC FLAGS.              ?
    END;
  END;
PROCEDURE XMTPRI ;
BEGIN 
  WITH TRKPTR'.TRKCB DO BEGIN 
    IF TRCMDCFLD " 0
      THEN BEGIN
        TRXMTCFLD := TRCMDCFLD + TRP * PFADJUST ;  _ SET UP C-FIELD.   ?
        IF TRREMOTE                                _ SET UP A-FIELD.   ?
          THEN TRXMTAFLD := 1 
          ELSE TRXMTAFLD := 0;
        TRCMDCFLD := 0 ;                    _        ZERO PARAM.       ?
        OUTPUT(TRWD1XMT);                   _        LAUNCH COMMAND.   ?
        END 
      ELSE BEGIN
        OUTPUT(TRFRMPTR'.BIINT[1]) ;        _  LAUNCH FRAME.           ?
        TRTCCOB := TRFRMPTR;                _SET TCC IN-PROCESS-BFR PTR?
        TRFRMPTR := NIL ;                   _  ZERO FRAME POINTER.     ?
        END;
    TRLSTXMTPRI := TRUE ;                   _ESTABLISH TCC FLAGS.      ?
    TRXMTING := TRUE ;
    END;
  END;
PROCEDURE XMT ; 
BEGIN 
  WITH TRKPTR'.TRKCB DO 
    IF NOT TRXMTING THEN                    _ IF XMT CHANNEL NOT BUSY: ?
      IF TRLSTXMTPRI                        _  IF LAST XMT WAS PRIMARY,?
        THEN IF TRRSPCFLD " 0 
          THEN XMTSEC                       _    GIVE SECONDARY PRIORTY?
          ELSE IF(TRCMDCFLD " 0) ! (TRFRMPTR " NIL) _                  ?
            THEN XMTPRI                             _                  ?
            ELSE IF TRLDPTR " NIL 
              THEN XMTLDP 
              ELSE _NOTHING TO TRANSMIT?
        ELSE IF(TRCMDCFLD " 0) ! (TRFRMPTR " NIL)   _                  ?
          THEN XMTPRI                       _    ELSE GIVE PRIMARY     ?
          ELSE IF TRRSPCFLD " 0             _            THE PRIORITY. ?
            THEN XMTSEC 
            ELSE IF TRLDPTR " NIL 
              THEN XMTLDP 
              ELSE;_NOTHING TO TRANSMIT?
END;
PROCEDURE A1 ;
BEGIN 
  WITH TRKPTR'.TRKCB DO BEGIN 
    TRPRISTE := P2 ;                        _ CHANGE PRIMARY STATE TO  ?
    IF TRI[TRNSO] = NIL THEN PLREADYI;      _ XMTING. GET NEW FRAME IF ?
    TRFRMPTR := TRI[TRNSO] ;                _ REQRD. SET POINTER FOR   ?
    XMT ;                                   _ TCC AND CALL TCC.        ?
    TRNSO := (TRNSO + 1) MOD MODULUS ;      _ BUMP NEXT OUTPUT INDEX.  ?
    END;
  END;
PROCEDURE AR1 ; 
BEGIN 
  WITH TRKPTR'.TRKCB DO BEGIN 
    NSUSET ;                                _ REMOVE ACKNOWLEDGED FRMS ?
    TRNSO := NR;                            _ ESTABLISH NEXT OUTPUT PTR?
    A1;                                     _  AND TRANSMIT FRAME.     ?
    END;
  END;
PROCEDURE AR2 ; 
BEGIN 
  WITH TRKPTR'.TRKCB DO BEGIN 
    NSUSET ;                                _ REMOVE ACKNOWLEDGED FRMS,?
    TRRC := RC2 ;                           _  SET RETRY COUNT,        ?
    TRT1ET := CASECNTR + T1 + 1;            _   SET T1 EXPIRE TIME,    ?
    TRPRISTE := P4;                         _    AND SET STATE TO      ?
    END;                                    _     BUSY RECOVERY.       ?
  END;
PROCEDURE AR3 ; 
BEGIN 
  WITH TRKPTR'.TRKCB DO BEGIN 
    TRP := 1;                               _ SET PARAMETERS AND CALL  ?
    TRCMDCFLD := RNR;                       _ TCC TO SEND RNR(P=1).    ?
    XMT;
    TRRC := RC1 ;                           _ SET RETRY COUNT,         ?
    TRT1ET := CASECNTR + T1 + 1;            _  SET T1 EXPIRE TIME,     ?
    TRPRISTE := P3;                         _   AND CHANGE PRIMARY     ?
    END;                                    _    STATE TO TIMEOUT      ?
  END;                                      _     RECOVERY.            ?
PROCEDURE MISCHK; 
  BEGIN 
  WITH TRKPTR'.TRKCB DO 
    IF RSP = RIM                            _ IF RIM RESPONSE,         ?
      THEN
        BEGIN 
        TRPRISTE := P0;                     _ GO TO BASIC STATE, AND   ?
        HCPRIM;                             _  TELL HDLC CONTROL.      ?
        END 
      ELSE IF RSP = CMDR                    _ IF COMMAND REJECT RSPNSE,?
        THEN
          BEGIN 
            WITH CNCEOVLY[OPS] DO           _ CE ERROR FILE            ?
              BEGIN 
              CNCECODE := CELPCMDRJ;        _HDLC COMMAND REJECT       ?
              HLINO    := TRLINO;           _LINE NUMBER               ?
              HLNID    := TRTNID;           _REMOTE NODE ID            ?
              END;
            PNCEFILE(4);                    _SEND CE ERROR MESSAGE     ?
            HCINOP;                         _ PERFORM INOPERATIVE WORK.?
          TRPRISTE := P0;                   _   AND GO TO BASIC STATE. ?
          END;
  END;
FUNCTION P0LOADOK (DUMMY : INTEGER) : BOOLEAN;
  
VAR 
  LPTR : B0BUFPTR;
  
BEGIN 
P0LOADOK := FALSE;
LPTR := PN1GTPTR (NS,DELOCDN);              _ GET POINTER TO NS ID     ?
IF LPTR " NIL                               _ IF NS FOUND              ?
THEN
  IF LPTR'.BRTYP1.BRLNKTYP = NLCOUPLER      _ IF NS AVAIL. VIA COUPLER ?
  THEN
    IF LOADFLG = FALSE
    THEN
      IF TRKPTR'.TRKCB.TRIGNRLR = FALSE     _ ALLOWED TO LOAD VIA TRUNK?
      THEN
        BEGIN 
        TRUNKNS := NS;                      _ GET TRUNK NS             ?
        TRKPTR'.TRKCB.TRLOADFLG := TRUE;    _ SET TRUNK FLAG WORD      ?
        LOADFLG := TRUE;                    _ GLOBAL LOADING           ?
        P0LOADOK := TRUE; 
        END;
END; _ FUNCTION P0LOADOK ?
PROCEDURE P0IMREQ;
  
VAR 
  DUMMY : INTEGER;
  
  BEGIN 
  WITH TRKPTR'.TRKCB DO 
    BEGIN 
    IF P0LOADOK (DUMMY)                     _ IF LOAD OK               ?
    THEN
      BEGIN 
      TRRC := RC1;                          _ INITIAL RETRY COUNT.     ?
      TRP := 1; 
      TRCMDCFLD := SIM;                     _ SEND SIM.                ?
      XMT;
      TRPRISTE := P6;                       _ SET STATE TO IM.         ?
      TRT1ET := CASECNTR + T1 + 1;          _ SET T1 EXPIRE TIME.      ?
      END 
    ELSE _ LOAD NOT OK ?
      BEGIN 
      HCINOP;                               _ PERFORM HCPRC0 AS IN GID ?
      TRPRISTE := P0; 
      END; _ ELSE P06LOADOK = FALSE ? 
    END;
  END;
PROCEDURE P1RSP ; 
BEGIN 
  IF (RSP = UA) & (F = 1)                   _ IF SARM ACKNOWLEDGED     ?
  THEN
  WITH TRKPTR'.TRKCB DO 
    BEGIN 
    IF NOT TRREMOTE                         _ IF LOCAL NODE, TRANSMIT  ?
    THEN                                    _ LINIT BLOCK.             ?
      LCXMT(LINIT); 
    TRLCSTE := LC2;                         _ CHANGE TO AWAITING-LINIT ?
    TRHCSTE := HC2;                         _ CHANGE TO SENDING STATE  ?
    IF IC(F) " 0
    THEN
      A1                                    _   XMT FRAMES IF IC " 0.  ?
    ELSE
      AR3;
    END 
  ELSE
    MISCHK;                                 _ CHECK FOR RIM OR CMDR.   ?
  END;
PROCEDURE P1T1 ;
BEGIN 
  WITH TRKPTR'.TRKCB DO BEGIN 
    IF TRRC = 0                             _ IF RETRY LIMIT REACHED,  ?
      THEN
        BEGIN 
        HCINOP;                             _  TELL HDLC CONTROL INOP  ?
        TRPRISTE := P0;                     _  AND GO TO BASIC STATE.  ?
        END 
      ELSE BEGIN
        TRP := 1 ;                          _ SEND SARM COMMAND AGAIN  ?
        TRCMDCFLD := SARM ; 
        XMT ;                               _  AND DECREMENT COUNTER.  ?
        TRRC := TRRC - 1 ;
        TRT1ET := CASECNTR + T1 + 1;        _ SET T1 EXPIRE TIME.      ?
        END;
    END;
  END;
PROCEDURE P2XMTCMP ;
VAR DIFF : INTEGER; 
BEGIN 
  WITH TRKPTR'.TRKCB DO BEGIN 
    IF TRNSO - TRNSU \ 0                    _ SET DIFF TO NUMBER OF    ?
      THEN DIFF := TRNSO - TRNSU            _  TRANSMITTED BUT UNACK-  ?
      ELSE DIFF := MODULUS + TRNSO - TRNSU ;_   NOWLEDGED I-FRAMES.    ?
    IF DIFF = K                             _ IF AT LIMIT,             ?
      THEN BEGIN
        TRT1ET := CASECNTR + T1 + 1;        _  SET T1 EXPIRE TIME,CHNGE?
        TRPRISTE := P21;                    _  STATE TO MODULUS LIMIT. ?
        END 
      ELSE IF IC(F) = 0                     _  IF NO INFO AVAILABLE,   ?
        THEN
          BEGIN 
            TRPRISTE := P20;                _   SET PRIMARY STATE IDLE ?
            TRT2ET   := CASECNTR + T2       _SET T2 TO WAIT FOR ACK    ?
          END 
        ELSE A1                             _   SEND NEXT FRAME.       ?
    END;
  END;
PROCEDURE P2P20RSP; 
BEGIN 
  WITH TRKPTR'.TRKCB DO 
    IF RSP = RR                             _ IF RECEIVE READY,        ?
      THEN NSUSET                           _  ACCEPT ACKNOWLEDGE.     ?
      ELSE IF RSP = RNR                     _  IF RECEIVE NOT READY,   ?
        THEN AR2                            _   DO BUSY RECOVERY.      ?
        ELSE IF RSP = REJ                   _   IF REJECT RESPONSE,    ?
          THEN AR1                          _    ABORT AND CONTINUE    ?
          ELSE MISCHK;                      _    XMTING;ELSE CHK IF    ?
                                            _     CMDR OR RIM RESPONSE.?
  END;
PROCEDURE P20IC;
BEGIN 
  A1;                                       _ SEND NEXT FRAME.         ?
END;
PROCEDURE P21RSP ;
BEGIN 
  WITH TRKPTR'.TRKCB DO 
    IF RSP = RR                             _ IF RECEIVE READY:        ?
      THEN IF IC(F) " 0                     _  IF TRAFFIC REMAINS,     ?
        THEN
          BEGIN 
          NSUSET;                           _   ACCEPT ACKNOWLEDGE     ?
          A1;                               _   AND CONTINUE XMTING;   ?
          END 
        ELSE                                _  IF NO TRAFFIC REMAINS,  ?
          BEGIN 
          NSUSET;                           _   ACCEPT ACKNOWLEDGE     ?
          TRPRISTE := P20;                  _   AND CHANGE STATE TO    ?
          END                               _    NO INFORMATION.       ?
      ELSE IF RSP = RNR                     _ IF RECEIVE NOT READY,    ?
        THEN AR2                            _  DO BUSY RECOVERY.       ?
        ELSE IF RSP = REJ                   _ IF REJECT RESPONSE,      ?
          THEN AR1                          _  ABORT AND CONTINUE XMT. ?
          ELSE MISCHK;                      _ CHECK FOR CMDR/RIM RSPNSE?
  END;
PROCEDURE P21T1 ; 
BEGIN 
  AR3 ;                                     _ SEND RNR,ETC.            ?
  END;
PROCEDURE P3RSP ; 
BEGIN 
  WITH TRKPTR'.TRKCB DO 
    IF (RSP = RR) & (F = 1)                 _ IF RECEIVE READY:        ?
      THEN IF NR " TRNSO                    _   IF NOT ALL ACKED,      ?
        THEN AR1                            _     ABORT/CONTINUE XMT.  ?
        ELSE IF IC(F) " 0                   _   IF ALL ACKED AND       ?
          THEN                              _   TRAFFIC REMAINS,       ?
            BEGIN 
            NSUSET;                         _    ACCEPT ACKNOWLEDGE    ?
            A1;                             _    AND CONTINUE XMTING.  ?
            END 
          ELSE                              _   IF ALL ACKED AND NO    ?
            BEGIN                           _    TRAFFIC REMAINS,      ?
            NSUSET;                         _    ACCEPT ACKNOWLEDGE AND?
            TRPRISTE := P20;                _    CHANGE STATE TO NO    ?
            END                             _               INFORMATION?
      ELSE IF (RSP = RNR) & (F = 1)         _ IF RECEIVE NOT READY,    ?
        THEN AR2                            _  ABORT AND BUSY RECOVERY.?
        ELSE IF (RSP = REJ) & (F = 1)       _ IF REJECT RESPONSE,      ?
          THEN AR1                          _  ABORT/CONTINUE XMTING.  ?
          ELSE MISCHK;                      _ CHECK FOR CMDR OR RIM.   ?
  END;
PROCEDURE P3P4T1; 
BEGIN 
  WITH TRKPTR'.TRKCB DO BEGIN 
    IF TRRC = 0                             _ IF RETRY LIMIT REACHED,  ?
      THEN
        BEGIN 
        HCINOP;                             _  TELL HDLC CONTROL INOP  ?
        TRPRISTE := P0;                     _  AND GO TO BASIC STATE.  ?
        END 
      ELSE BEGIN
        TRP := 1 ;                          _ SEND RNR COMMAND AGAIN,  ?
        TRCMDCFLD := RNR ;
        XMT;                                _  DECREMENT COUNTER,      ?
        TRRC := TRRC - 1 ;
        TRT1ET := CASECNTR + T1 + 1;        _   AND SET T1 EXPIRE TIME.?
        END;
    END;
  END;
PROCEDURE P4RSP ; 
BEGIN 
  IF RSP = REJ                              _ IF REJECT RESPONSE       ?
    THEN AR1                                _  ABORT/CONTINUE XMTING.  ?
    ELSE MISCHK;                            _ CHECK FOR RIM OR CMDR.   ?
  END;
PROCEDURE P6RSP ; 
BEGIN 
  WITH TRKPTR'.TRKCB DO BEGIN 
    IF (RSP = UA) & (F = 1)                 _ IF UNNUMBERED ACKNOWLEDGE?
      THEN
        BEGIN 
        TRPRISTE := P7;                     _  CHANGE STATE TO WAIT-FOR?
        GENPFC := D8NPU;                    _ FIRST-LDP-BLOCK AND      ?
        GENSFC.DHINT := D9IN;               _ REQUEST DUMP/LOAD        ?
        GENPAR.BABUFPTR := TRLCBP;          _ LCB ADDRESS              ?
        PBXFER (BRTNJUMP[C1PNSMGEN].JENTADDR,   _ CALL PNSMGEN         ?
            BRTNJUMP[C1PNSMGEN].JPAGEVAL);  _ SET HDLC STATE TO        ?
        TRHCSTE := HC4;                     _ AWAITING LOAD            ?
        END;
    END;
  END;
PROCEDURE P6T1 ;
BEGIN 
  WITH TRKPTR'.TRKCB DO BEGIN 
    IF (TRRC = 0) !                         _ IF RETRY LIMIT REACHED,  ?
       (TRUNKNS " NS)                       _ OR NS CHANGED OR DROPPED ?
      THEN
        BEGIN 
        ABTDMPLD;                           _ ABORT DUMP LOAD          ?
        HCINOP;                             _  TELL HDLC CONTROL INOP  ?
        TRPRISTE := P0;                     _  AND GO TO BASIC STATE.  ?
        END 
      ELSE BEGIN
        TRT1ET := CASECNTR + T1 + 1;        _ SET T1 EXPIRE TIME,      ?
        TRRC := TRRC - 1 ;                  _ DECREMENT COUNTER,       ?
        TRP := 1 ;
        TRCMDCFLD := SIM ;                  _ AND SEND SET-INITIALIZA- ?
        XMT;                                _ TION-MODE COMMAND AGAIN. ?
        END;
    END;
  END;
PROCEDURE P7RSP;
  BEGIN 
  IF RSP = RIM THEN HCPRIM;                 _ IF RIM,                  ?
  END;                                      _  TELL HDLC CONTROL.      ?
PROCEDURE P7LDP;
  BEGIN 
  WITH TRKPTR'.TRKCB DO BEGIN 
    TRPRISTE := P8;                         _ SET STATE TO LOADING.    ?
    TRRC := RC1;                            _ INITIAL RETRY COUNT.     ?
    TRT1ET := CASECNTR + T1 + 1;            _ SET T1 EXPIRE TIME,      ?
    TRLDPTR := TRUI;                        _ GIVE LDP FRAME TO TCC.   ?
    XMTLDP; 
    END;
  END;
PROCEDURE P8RSP ; 
BEGIN 
  WITH TRKPTR'.TRKCB DO BEGIN 
    IF (RSP = UA) ! (RSP = UI)              _ IF UNNUMBERED ACK OR INFO?
      THEN
        BEGIN 
        TRPRISTE := P7;                     _ AWAIT NEXT LDP BLOCK     ?
        HCPLDUAUI;                          _  TELL HDLC CONTROL       ?
        END;
    END;
  END;
PROCEDURE P8T1; 
BEGIN 
WITH TRKPTR'.TRKCB DO 
  BEGIN 
  IF (TRRC = 0) !                           _ IF RE-TRY COUNT ZERO     ?
     (TRUNKNS " NS)                         _ OR LOST NS               ?
  THEN
    BEGIN 
    ABTDMPLD;                               _ ABORT DUMP LOAD          ?
    HCINOP;                                 _  TELL HDLC CONTROL INOP  ?
    TRPRISTE := P0; 
    END 
  ELSE
    BEGIN 
    TRLDPTR := TRUI;                        _ RE-TRY SENDING BLOCK     ?
    XMTLDP; 
    TRT1ET := CASECNTR + T1 + 1;            _ TIME-OUT PERIOD          ?
    TRRC := TRRC -1;                        _ DECREMENT RE-TRY COUNTER ?
    END;
  END; _ WITH TRKPTR'... ?
END; _ PROCEDURE P8T1 ? 
PROCEDURE B1 ;
BEGIN 
  WITH TRKPTR'.TRKCB DO BEGIN 
    ABTDMPLD;                               _ ABORT DUMP LOAD          ?
    IF (TRHCSTE = HC3) !                    _ IF LOADING OR WAITING FOR?
       (TRHCSTE = HC4)
    THEN                                    _ LOAD BLK THEN            ?
        HCRESET;                            _ RESET FUNCTION           ?
    NRRESET;                                _ RESET N(R).              ?
    TRF := 1 ;                              _ F = 1.                   ?
    TRRSPCFLD := UA ;                       _ SEND UA.                 ?
    XMT ; 
    TRSECSTE := S1 ;                        _ RECEIVE STATE.           ?
    END;
  END;
PROCEDURE B2 ;
BEGIN 
  WITH TRKPTR'.TRKCB DO BEGIN 
    TRRSPCFLD := CMDR ;                     _ SEND COMMAND REJECT.     ?
    XMT ; 
    TRSECSTE := S0 ;                        _ BASIC STATE.             ?
    END;
  END;
PROCEDURE B3 ;
BEGIN 
  WITH TRKPTR'.TRKCB DO BEGIN 
    NRBUMP ;                                _ BLOCK REASSEMBLY.        ?
    TRRSPCFLD := RR + TRNR                  _ SEND RR RESPONSE.        ?
                      *NRADJUST ; 
    XMT ; 
    TRSECSTE := S1 ;                        _ CHANGE STATE TO RECEIVE. ?
    END;
  END;
PROCEDURE BR1 ; 
BEGIN 
  WITH TRKPTR'.TRKCB DO BEGIN 
    TRRSPCFLD := REJ + TRNR                 _ SEND REJECT RESPONSE.    ?
                       *NRADJUST ;
    XMT ; 
    TRSECSTE := S2 ;                        _ CHANGE STATE TO REJ.     ?
    END;
  END;
PROCEDURE BR2 ; 
BEGIN 
  WITH TRKPTR'.TRKCB DO BEGIN 
    TRRSPCFLD := RNR + TRNR                 _ SEND RNR RESPONSE.       ?
                       *NRADJUST ;
    XMT ; 
    TRSECSTE := S3 ;                        _ CHANGE STATE TO BUSY.    ?
    END;
  END;
PROCEDURE S0CMD ; 
BEGIN 
  IF(CMD = SARM) & (P = 1)                  _ IF SARM COMMAND,         ?
    THEN B1                                 _  SEND UA(F=1) AND GO TO  ?
    ELSE IF NOT((CMD = I) !                 _  RCV STATE. IF NEF,      ?
                ((CMD = RNR) & (P = 1)))    _   SEND COMMAND REJECT    ?
      THEN B2 ;                             _    AND GO TO BASIC STATE.?
  END;
PROCEDURE S1CMD ; 
BEGIN 
  WITH TRKPTR'.TRKCB DO 
    BEGIN 
    IF (CMD = SARM) & (P = 1)               _ IF SARM COMMAND,         ?
    THEN
      B1                                    _  SEND UA(F=1) AND GO TO  ?
    ELSE                                    _  RCV STATE               ?
      IF (CMD = RNR) & (P = 1)              _  IF RNR COMMAND          ?
      THEN
        BEGIN 
        TRF := 1;                           _   SEND RR(F=1).          ?
        TRRSPCFLD := RR + TRNR * NRADJUST;
        XMT;
        END 
      ELSE
        IF (CMD = I)                        _  IF INFORMATION :        ?
        THEN
          IF NSS " TRNR                     _    IF NS NOT PROPER,     ?
          THEN
            BR1                             _     SEND REJECT,REJ STE. ?
          ELSE
            IF LIPPARAMS.IELBE              _     IF BUSY,             ?
            THEN
              BR2                           _      SEND RNR,BUSY STATE.?
            ELSE
              BEGIN                         _      PERFORM BLOCK REAS- ?
              NRBUMP;                       _      SEMBLY AND BUMP NR. ?
              TRRSPCFLD := RR + TRNR        _      SEND RR RESPONSE.   ?
                                *NRADJUST;
              XMT;
              END 
        ELSE
          GOTO EXIT 90;                     _ BAD BLOCK, GOTO RECOVERY ?
    END;                                    _  GO TO BASIC STATE.      ?
END;
  
PROCEDURE S2CMD ; 
BEGIN 
  WITH TRKPTR'.TRKCB DO 
    IF (CMD = SARM) & (P = 1)               _ IF SARM COMMAND,SEND UA  ?
    THEN
      B1                                    _  AND GO TO RECEIVE STATE.?
    ELSE
      IF (CMD = RNR) & (P = 1)              _  IF RNR COMMAND,         ?
      THEN
        BEGIN                               _   SEND REJ RESPONSE.     ?
        TRF := 1 ;
        TRRSPCFLD := REJ + TRNR * NRADJUST; 
        XMT;
        END 
      ELSE
        IF (CMD = I)                        _   IF INFORMATION:        ?
        THEN
          IF NSS = TRNR                     _    IF NS IS PROPER:      ?
          THEN
            IF LIPPARAMS.IELBE              _     IF BUSY,             ?
            THEN
              BR2                           _      SEND RNR,GO BUSY ST.?
            ELSE
              B3                            _      ACCEPT I,GO RCV ST. ?
          ELSE                              _    IMPROPER NS- IGNORE.  ?
        ELSE
          B2;                               _  NOT LEGAL COMMAND-SEND  ?
END;                                        _   CMDR AND GO TO BASIC ST?
  
PROCEDURE S3CMD ; 
BEGIN 
  WITH TRKPTR'.TRKCB DO 
    IF (CMD = SARM) & (P = 1)               _ IF SARM COMMAND,         ?
    THEN
      B1                                    _  SEND UA AND GO TO RCV   ?
    ELSE
      IF (CMD = RNR) & (P = 1)              _  STATE.IF RNR COMMAND,   ?
      THEN
        BEGIN 
        TRF := 1;                           _   SEND REJ               ?
        BR1;                                _    RESPONSE,AND CHANGE   ?
        END                                 _     TO REJECT STATE.     ?
      ELSE
        IF NOT(CMD = I) 
        THEN
          B2;                               _   NOT LEGAL COMMAND-SEND ?
END;                                        _    CMDR AND GO BASIC STE.?
  
PROCEDURE TCCXMTCMP ; 
BEGIN 
  WITH TRKPTR'.TRKCB DO 
    BEGIN 
    IF TRTCCREL THEN PBRELCHN(TRTCCOB,BEDBSIZE); _ IF RELEASE FLAG SET,?
    TRTCCOB := NIL;                              _  RELEASE OUTPUT BFRS?
    TRTCCREL := FALSE;                           _   AND CLEAR FIELDS. ?
    TRXMTING := FALSE;                      _ RESET TRANSMITTING FLAG. ?
                                            _ IF PRIMARY STATE IS P2   ?
    IF (TRPRISTE = P2) & (TRFRMPTR = NIL)   _  WITH I-FRAME TRANSMITTED?
      THEN P2XMTCMP ;                       _   THEN CALL PROTOCOL     ?
    XMT ;                                   _    PROCEDURE; CHECK FOR  ?
    END;                                    _     ANY OUTSTANDING XMT  ?
  END;                                      _      REQUEST.            ?
PROCEDURE HCLDP;
BEGIN 
WITH TRKPTR'.TRKCB DO 
  BEGIN 
  IF TRUI " NIL                             _ IF DUMP/LOAD DATA PRESENT?
  THEN
    WITH TRUI' DO 
    BEGIN 
    BFDATAC[BFFCD-1] := CHR(UI);            _ PUT A/C FIELDS           ?
    BFDATAC[BFFCD-2] := CHR(0);             _ IN FRONT                 ?
    BFFCD := BFFCD-2;                       _ SET NEW FCD              ?
    IF TRHCSTE " HC4                        _ IF NOT EXPECTING         ?
    THEN
      HCLDPRSP (1,NIL)                      _ ERROR                    ?
    ELSE
      BEGIN 
      TRHCSTE := HC3;                       _ SET TO LOADING           ?
      P7LDP;                                _ CALL HDLC                ?
      END; _ ELSE TRHCSTE = HC4 ? 
    END; _ TRUI " NIL ? 
  END; _ WITH TRKPTR'... ?
END; _ PROCEDURE HCLDP ?
PROCEDURE LM1TE;
BEGIN 
  WITH TRKPTR'.TRKCB,CMDPKT DO
    BEGIN 
    NKCMD := NKCLRL;                        _ CLEAR COMMAND.           ?
    NKLINO := TRLINO;                       _ LINE NUMBER.             ?
    PBCOIN(CMDPKT);                         _ ISSUE CLEAR CMD.         ?
    NKCMD := NKINIL;                        _ INITIALIZE COMMAND.      ?
    NKWD2.BAINT := 0; 
    NKWD3.BAINT := 0; 
    NKWD4.BAINT := 0; 
    NKLTYP  :=  N0LA;                       _SPECIFY LINE TYPE         ?
    NKMDMST := N4LNI;                       _ SET MODEM STATE TO MSTLNI?
    PBCOIN(CMDPKT);                         _ ISSUE INITIALIZE CMD.    ?
    NKWD2.BAINT := 0; 
    NKWD3.BAINT := 0; 
    NKWD4.BAINT := 0; 
    NKCMD := NKCONTROL;                     _ CONTROL COMMAND.         ?
    NKTCLS := N0THDLC;                      _ TERMINAL CLASS.          ?
    NKSRF1 := TRUE;                         _ SET REQUESTED FUNCTION   ?
    NKFUN1 := N0ISR;                        _ INPUT STATUS REQUEST     ?
    NKSRF2 := FALSE;                        _ LAST FUNCTION            ?
    NKFUN2 := 0;                            _ TERMINATE CASE           ?
    PBCOIN(CMDPKT);                         _ ISSUE CONTROL CMD.       ?
    TRLMSTE := LM2;                         _ SET LINE STATE TO AWAIT- ?
    TRLMTE := CASECNTR + 3;                 _  ING-CLA-ON AND SET LINE-?
    END;                                    _   TIME-EXPIRATION TO 1   ?
END;                                        _    SEC FROM NOW.         ?
PROCEDURE DECODECONTROLFIELD
          (VAR CMDRSP,PF : INTEGER) ; 
VAR 
  CFIELD : PACKED RECORD CASE X:INTEGER OF
            0:(DUM1,B81 : B08BITS); 
            1:(DUM2 : B08BITS;B86 : B03BITS;
               B5 : B01BIT;B42 : B03BITS; 
               B1 : B01BIT);
            2:(DUM3 : B011BITS; 
               B51 : B05BITS);
            3:(DUM4 : B012BITS; 
               B41 : B04BITS);
            4:(DUM5 : B014BITS; 
               B21 : B02BITS);
            END;
BEGIN 
  WITH CFIELD DO BEGIN
    B81 := LIPPARAMS.IECFIELD ;             _MOVE C-FIELD TO OVERLAY.  ?
    PF := B5 ;                              _EXTRACT P/F BIT.          ?
    IF B21 = 3                              _IF UNNUMBERED FRAME,      ?
      THEN CMDRSP := B81 - B51 + B41        _ EXTRACT COMMAND/RESPONSE ?
      ELSE BEGIN                            _   FROM UNNUMBERED FORMAT.?
        NR := B86 ;                         _ EXTRACT N(R).            ?
        IF B1 = 0                           _ IF I-FRAME,              ?
          THEN BEGIN
            CMDRSP := 0 ;                   _  SET COMMAND OF ZERO.    ?
            NSS := B42 ;                    _  EXTRACT N(S).           ?
            END 
          ELSE CMDRSP := B41 ;              _ EXTRACT COMMAND/RESPONSE ?
        END;                                _  FROM SUPERVISORY FORMAT.?
    END;
  END;
_$J+? 
_ 
************************************************************************
*                                                                      *
*               ---- BEGIN MAIN PROGRAM   P L I P    ----              *
*                                                                      *
************************************************************************
? 
BEGIN 
LDBGA [LDBGI] := BWWLENTRY[OPS].B0TIPWLE;   _SAVE WORKLIST ENTRY       ?
LDBGI         := (LDBGI + 1) MOD 25;        _UPDATE INDEX INTO ARRAY   ?
  LIPPARAMS := BWWLENTRY[OPS].BWLIPPARAMS;  _LOCAL COPY OF WORKLIST    ?
  WITH LIPPARAMS DO BEGIN 
    TRKPTR := CGLCBP'[IELINO.BDPORT].BZTCBPTR;
    IF IEWKCODE = ISPFRM THEN               _ IF INPUT STATE PROGRAM   ?
      WITH IEFRMPTR' DO                     _  WORK CODE,MODIFY PARAMS:?
        BEGIN 
        IECFIELD := ORD(BFDATAC[BFFCD + 1]);_    C-FIELD FROM A/C BFR. ?
        IF BFIE 
        THEN
          BEGIN 
          BFIE := NOT BFABRT;               _DONT TREAT ABRT AS INP ERR?
          IEWKCODE := BADFRM; 
          END 
        ELSE
          BEGIN 
          TRKPTR'.TRKCB.TRCIEC := 0;        _ RESET CONSEC IE COUNTER  ?
          IF BFDATAC[BFFCD] = CHR(2)        _ IF SPECIAL FROM SAM-P    ?
          THEN
            IEWKCODE := RSPFRM              _ SET AS RESPONSE FRAME    ?
          ELSE
            IF ((BFDATAC[BFFCD] = CHR(0)) 
              = TRKPTR'.TRKCB.TRREMOTE) 
            THEN
              IEWKCODE := CMDFRM
            ELSE
              IEWKCODE := RSPFRM; 
          PBREL1BF (IEFRMPTR, BEDBSIZE);    _ RELEASE A/C BUFFER       ?
          END;
        END;
    CASE IEWKCODE OF                        _ CASE THE WORK CODE.      ?
      RSPFRM : BEGIN                        _ 1.RESPONSE FROM SECONDARY?
        DECODECONTROLFIELD(RSP,F) ;         _ :EXTRACT C-FIELD ELEMENTS?
        CASE TRKPTR'.TRKCB.TRPRISTE OF
          P0 : IF RSP = RIM THEN HCPRIM;    _ IF RIM, TELL HDLC        ?
                                            _ EXECUTE PROTOCOL         ?
          P1 : P1RSP ;                      _   ACCORDING TO PRIMARY   ?
          P2,P20 : P2P20RSP;                _    STATE.                ?
          P21: P21RSP;
          P3 : P3RSP ;
          P4 : P4RSP ;
          P6 : P6RSP ;
          P7 : P7RSP; 
          P8 : P8RSP ;
          END;
        PBRELZRO(IEFRMPTR,BEDBSIZE);        _ :RELEASE FRAME BUFFERS   ?
        END;                                _   IF ANY.                ?
      CMDFRM : BEGIN                        _ 2.COMMAND FROM PRIMARY.  ?
        DECODECONTROLFIELD(CMD,P) ;         _ :EXTRACT C-FIELD ELEMENTS?
        CASE TRKPTR'.TRKCB.TRSECSTE OF
          S0 : S0CMD ;                      _ :EXECUTE PROTOCOL PROCE- ?
          S1 : S1CMD ;                      _  DURE ACCORDINGOTO       ?
          S2 : S2CMD ;                      _   SECONDARY STATE.       ?
          S3 : S3CMD ;
          END;
        PBRELZRO(IEFRMPTR,BEDBSIZE);        _ :RELEASE FRAME BUFFERS   ?
        END;                                _   IF ANY.                ?
      BADFRM : BEGIN                        _ 3.BAD FRAME(CRC ERROR).  ?
90: 
        IF IEFRMPTR'.BFIE 
        THEN                                _ REAL INPUT ERROR         ?
          BEGIN 
           PNSGATH (TRKPTR'.TRKCB.TRLCBP,   _BUMP BAD BLOCK STATISTICS ?
                    NIL,J0BADBLK);
            WITH TRKPTR'.TRKCB DO 
            BEGIN 
              TRCIEC := TRCIEC + 1;         _ BUMP CONSEC IE COUNTER   ?
              IF TRCIEC = 0 THEN            _ OVERFLOW OF COUNTER      ?
              WITH CNCEOVLY [OPS] DO
              BEGIN 
                CNCECODE := CELPBADFRM;     _ RECEIVED N CONSEC BAD FRM?
                HLINO    := TRLINO;         _ INSERT TRUNK NUMBER      ?
                HLNID    := TRTNID;         _ INSERT REMOTE NODE ID    ?
                PNCEFILE (4);               _ SEND CE ERROR MESSAGE    ?
              END;
            END;
          END;
        PBRELZRO(IEFRMPTR,BEDBSIZE);        _ RELEASE ANY BUFFERS      ?
        END;                                _ END - BADFRM             ?
      LMXMTCMP :                            _ 4.OUTPUT COMPLETED.      ?
        BEGIN 
        WITH TRKPTR'.TRKCB DO               _ : IF LINE MANAGEMENT     ?
          BEGIN 
          IF TRLMSTE = LM4                  _   STATE IS OUTPUTTING,   ?
            THEN TRLMSTE := LM3             _    CHANGE TO IDLING.     ?
            ELSE IF TRLMSTE = LM7           _     IF STATE IS TERMINA- ?
              THEN TRLMSTE := LM6;          _      TING WITH TCC WAIT- ?
                                            _       ING,CHANGE TO TER- ?
                                            _        MINATING W/O WAIT.?
          TCCXMTCMP;                        _ : CALL TCC ROUTINE.      ?
          END;
        END;
      IEXBLKINQ :                           _ 5.BLOCK IN OUTPUT QUEUE  ?
        BEGIN 
        IF TRKPTR'.TRKCB.TRPRISTE = P20     _ IF TRUNK IS IDLE         ?
        THEN
          P20IC;                            _ CALL PRIMARY TO TRANSMITT?
        END;
      IETIME:                               _ 7.PERIODIC FUNCTIONS.    ?
        FOR LCB := 1 TO C0NPBL DO           _   FOR EACH TRUNK.        ?
        BEGIN 
          TRKPTR := CGLCBP'[LCB].BZTCBPTR;  _ GET TCB POINTER          ?
          IF TRKPTR " NIL 
          THEN
            WITH TRKPTR'.TRKCB DO           _ TCB ASSIGNED AND         ?
            IF CGLCBP'[LCB].BZDIAG = FALSE  _ NOT IN DIAGNOSTIC MODE   ?
            THEN
            BEGIN 
            IF CASECNTR > TRT1ET THEN       _   IF T1 EXPIRED,         ?
              CASE TRPRISTE OF              _    CALL APPROPRIATE      ?
                P1 : P1T1;                  _     PROCEDURE,PER HDLC   ?
                P21: P21T1;                 _      PRIMARY STATE.      ?
                P3,P4 : P3P4T1; 
                P6 : P6T1;
                P8 : P8T1;
                END;
            IF  CASECNTR > TRT2ET           _ IF T2 HAS EXPIRED WHILE  ?
            THEN
              IF TRT2ET " 0                 _  AWAITING ACK            ?
              THEN
                IF (TRPRISTE = P2) !        _   ACKNOWLEDGEMENT        ?
                   (TRPRISTE = P20) 
                THEN                        _ IN NORMAL STATES         ?
                  BEGIN 
                  AR3;                      _ POLL FOR ACKNOWLEDGEMENT ?
                  TRT2ET := 0;              _ RESET T2                 ?
                  END;
            IF CASECNTR > TRHCTE            _   IF HDLC-CONTROL TIMER  ?
            THEN
              IF TRHCSTE = HC12             _    EXPIRED WHILE IN TIM- ?
              THEN                          _     ING STATE, EXECUTE   ?
                HCRESET;                    _      HCRESET             ?
            IF CASECNTR > TRLCTRE           _   IF LINK-CONTROL TR EX- ?
            THEN
              IF TRLCSTE = LC3              _    PIRED WHILE WAITING,  ?
              THEN
                LC3TR;                      _     EXECUTE LC3TR.       ?
            IF CASECNTR > TRLCTSE           _   IF LINK-CONTROL TS EX- ?
            THEN
              IF TRLCSTE = LC2              _  PIRED, IF AWAITING LINIT?
              THEN                          _  THEN                    ?
                BEGIN 
                IF NOT TRREMOTE 
                THEN                        _ IF LOCAL NODE,TRANSMIT   ?
                  LCXMT(LINIT);             _ LINIT BLOCK              ?
                END 
              ELSE                          _ ELSE                     ?
                IF TRLCSTE = LC3            _ IF OPERATIONAAL THEN     ?
                THEN
                  LCXMT (LIDLE);            _TRANSMIT LINE IDLE BLOCK  ?
            IF CASECNTR > TRLMTE            _   IF LINE-MANAGEMENT TIME?
            THEN                            _    EXPIRED, PROCESS PER  ?
              IF (TRLMSTE = LM2) !          _     LM STATE:            ?
                 (TRLMSTE = LM4) !          _  IF OUTPUTTING THEN      ?
                 (TRLMSTE = LM5)
              THEN
                BEGIN 
                PLIOSTOP;                   _ TERMINATE I/O AND SET    ?
                IF TRLMSTE = LM4            _ LINE MANAGEMENT STATE TO ?
                THEN                        _ TERMINATING OR TERMINATE ?
                  TRLMSTE := LM7            _ AND WAIT FOR TCC         ?
                ELSE
                  TRLMSTE := LM6; 
                END 
              ELSE
                IF TRLMSTE = LM1            _ IF CONDITIONING THE LINE ?
                THEN
                  LM1TE;                    _ THEN CONDITION  THE LINE ?
                                            _        WITH-TCC-WAITING. ?
            IF CASECNTR > TRTOI + 60
            THEN                            _ IF ENUF TIME SINCE TRUNK ?
              IF NOT TRITSS 
              THEN                          _  INIT,AND NO STATUS SENT ?
                TSSM(D5INOP);               _   YET, SEND INOP STATUS. ?
            END;
          END;
      A0HARDERR :                           _ 8.HARD ERROR ON LINE.    ?
        WITH TRKPTR'.TRKCB DO 
        IF TRLMSTE > LM1                    _ IF LINE MANAGEMENT STATE ?
        THEN                                _ CONDITIONED AND NOT      ?
          IF TRLMSTE < LM6                  _ DISABLED AND NOT ALREADY ?
          THEN                              _ TERMINATING WITH OR      ?
            BEGIN                           _ WITHOUT WAIT FOR TCC THEN?
            PLIOSTOP;                       _ FLUSH I/O AND TERMINATE  ?
            IF TRLMSTE = LM4                _ IF WAITING FOR TCC       ?
            THEN                            _ THEN                     ?
              TRLMSTE := LM7                _ TERMINATING WITH TCC WAIT?
            ELSE                            _ ELSE                     ?
              TRLMSTE := LM6;               _ TERMINATING              ?
            END;
      MMCLAS :                              _ 9.CLA STATUS.            ?
        BEGIN 
        WITH TRKPTR'.TRKCB DO 
        IF TRKPTR'.TRKCB.TRLMSTE = LM2
        THEN
          BEGIN 
          IF IESCI = 0
          THEN
            WITH TRKPTR'.TRKCB,CMDPKT DO
            BEGIN 
            NKCMD := NKSTATUS;              _TURN ISON ON.             ?
            NKWD2.BAINT := 0; 
            NKWD3.BAINT := 0; 
            NKWD4.BAINT := 0; 
            PBCOIN (CMDPKT);                _CALL MUX SUBSYSYTEM       ?
            NKCMD  := NKENBL;               _ ENABLE COMMAND.          ?
            NKTCLS := N0THDLC;              _ TERMINAL CLASS.          ?
            NKLINO := TRLINO;               _ LINE NUMBER.             ?
            NKIFCD := 0;                    _ FCD FROM NJTECT.         ?
            NKNOXL := FALSE;                _ NO CODE TRANSLATE.       ?
            PBCOIN(CMDPKT);                 _ ISSUE ENABLE CMD.        ?
            TRLMSTE := LM5;                 _ SET AWAIT-ENABLED STATE. ?
            TRLMTE := CASECNTR + 31;        _ WAIT UP TO 30 SECONDS.   ?
            END;
          END 
        ELSE
          IF TRKPTR'.TRKCB.TRLMSTE = LM5
          THEN
            IF IESCI = 2
            THEN
              WITH TRKPTR'.TRKCB,CMDPKT DO
              BEGIN 
              NKCMD := NKINPT;              _ INPUT COMMAND.           ?
              NKLINO := TRLINO;             _ LINE NUMBER.             ?
              NKRPRT := FALSE;              _ NO PARITY STRIP.         ?
              NKUOPS := 0;                  _ ALL USER FLAGS OFF.      ?
              NKMVB := TRUE;                _ MOVE THE USER FLGS.      ?
              NKISTAI := 4;                 _ INITIAL INPUT STATE.     ?
              NKISPTA := 0; 
              PBCOIN(CMDPKT);               _ ISSUE INPUT COMMAND.     ?
              TRLMSTE := LM3;               _ SET LINE STATE TO IDLING.?
              TRXMTING := FALSE;            _ CLEAR TRANSMITTING FLAG  ?
              END;
        END;
      IELDP :                               _10.DOWNLINE LOAD/CUMP.    ?
        BEGIN 
          HCLDP;                            _ :PASS TO HDLC CONTROL.   ?
        END;
      IELDT :                               _11. LOAD/DUMP ABORTED     ?
        ABTDMPLD; 
      A0SMEN :                              _12.ENABLE TRUNK.          ?
        BEGIN 
        WITH TRKPTR'.TRKCB DO 
          BEGIN                             _ INITIALIZE THE LCB       ?
          TRREMOTE := FALSE;                _ ASSUME LOCAL NPU         ?
          IF CKLOCNODE > TRTNID             _ MASTER SLAVE RELATIONSHIP?
          THEN                              _ BASED OF NPU NODE        ?
            TRREMOTE := TRUE;               _ ADDRESSES                ?
          TRWD1XMT := $0504;                _ STE LCD/FCD AND FLAG     ?
          TRWD2XMT := $9900;                _ WORDS FOR SHORT TCC XMT  ?
          TRTOI := CASECNTR;                _ POST INITIALIZATION TIME ?
          TRLCSTE := LC1;                   _ LINK STATE = AWAIT SEND  ?
          END; _ WITH TRKPTR'.TRKCB ? 
        LM1TE;                              _ :CONDITION LINE.         ?
        HCRESET;                            _ :START HDLC.             ?
        END;
      A0SMDA :                              _13.DISABLE TRUNK.         ?
        BEGIN 
        WITH TRKPTR'.TRKCB DO 
          BEGIN 
          TRLCSTE := LC0;                   _DO NOT QUEUE LINK PROTOCOL?
          IF TRLMSTE < LM6                  _ IF I/O NOT ALREADY       ?
          THEN                              _ STOPPED THEN             ?
            IF TRLMSTE > LM0                _ STOP I/O AND FLUSH WLES  ?
            THEN
              PLIOSTOP;                     _ CHANGE LINE MANAGEMENT   ?
          TRLMSTE := LM0;                   _ TO DISABLED              ?
          END;
        END;
      IOTERM :                              _14.I/O TERMINATED.        ?
        BEGIN 
        WITH TRKPTR'.TRKCB DO 
          BEGIN                             _ :ISSUE MUX DISABLE CMND. ?
          CMDPKT.NKLINO := TRLINO;          _   LINE NUMBER.           ?
          CMDPKT.NKCMD := NKDISL;           _   COMMAND.               ?
          PBCOIN(CMDPKT);                   _   ISSUE COMMAND.         ?
          IF TRLMSTE > LM0                  _ IF LINE TERMINATING I/O  ?
          THEN
            BEGIN 
            IF TRLMSTE > LM5
            THEN
              BEGIN 
              TRLMSTE := LM1;               _ CHANGE TO TIMING STATE   ?
              TRLMTE := CASECNTR + 10;      _ AND SET TIMER FOR 10     ?
              IF TRLMSTE = LM7              _ AND IF TCC ACTIVE THEN   ?
              THEN                          _ CALL TCCXMTCMP           ?
                TCCXMTCMP;
              END; _ IF TRLMSTE > LM5 ? 
            END _ IF TRLMSTE > LM0 ?
          ELSE _ TRUNK TO BE DISABLED ? 
            BEGIN 
            BWWLENTRY[OPS].CMSMLEY.CMWKCOD  _ SEND DISABLED LINE WORK  ?
              := D0LINE;
            BWWLENTRY[OPS].CMSMLEY.CMDATA   _ LIST ENTRY TO SERVICE    ?
              := D5DISA;
            PBLSPUT(BWWLENTRY[OPS], 
              BYWLCB[B0SMWL]);              _ MODULE                   ?
                                            _    THE LINK IS DOWN      ?
            CLEANUP;                        _     RELEASE ALL          ?
            IF TRTCCREL 
            THEN
              PBRELCHN(TRTCCOB,BEDBSIZE);   _      OUTBOUND AND        ?
            NRRESET;                        _        INCOMING MSG BFRS.?
            TRTCCREL := FALSE;              _     CLEAR REL BUFFERS FLG?
            PBRELZRO(TRUI,BEDBSIZE);        _     RELEASE LOAD/DUMP    ?
            END;
          END;
        END;
      END;
    END;
  END;
PROCEDURE PLIPML; 
BEGIN 
  PBLSPUT(BWWLENTRY[MUX2],BYWLCB[B0HDLC]);  _ PASS WLE TO OPS LEVEL LIP?
END;
PROCEDURE PLIPTC; 
BEGIN 
  BWWLENTRY[OPS].BWLIPPARAMS.IEWKCODE       _ SET PARAMS FOR LIP TO    ?
                          := IETIME ;        _  PERFORM TIMED FUNCTNS. ?
  PLIP;                                     _ CALL THE LIP DIRECTLY    ?
END;
