*COMDECK X25NTSD4 
_$J+? 
_ 
  
               NN      NN  TTTTTTTTTT    SSSSSS 
               NNN     NN  TTTTTTTTTT   SSSSSSSS
               NNNN    NN      TT      SS      SS 
               NN NN   NN      TT      SS 
               NN  NN  NN      TT      SSSSSSSSS
               NN   NN NN      TT       SSSSSSSSS 
               NN    NNNN      TT              SS 
               NN     NNN      TT      SS      SS 
               NN      NN      TT       SSSSSSSS
               NN      NN      TT        SSSSSS 
  
  
  
          DDDDDDDD    BBBBBBBB      GGGGGG          44
          DDDDDDDDD   BBBBBBBBB    GGGGGGGG        444
          DD      DD  BB      BB  GG      GG      4444
          DD      DD  BB      BB  GG             44 44
          DD      DD  BBBBBBBBB   GG    GGGG    44  44
          DD      DD  BBBBBBBBB   GG    GGGG   44   44
          DD      DD  BB      BB  GG      GG  4444444444
          DD      DD  BB      BB  GG      GG  4444444444
          DDDDDDDDD   BBBBBBBBB    GGGGGGGG         44
          DDDDDDDD    BBBBBBBB      GGGGGG          44
  
  
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*                    PNTSTIP                                          * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_$R-,G-,I-? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW -                                                         * 
*     N E T W O R K  T E R M I N A L  S T I M U L A T O R             * 
*                  I N T E R F A C E                                  * 
** INPUT -                                                            * 
*              BWWLENTRY[OPS] = WORKLIST ENTRY                        * 
*                                                                     * 
** CALLING PROGRAMS                                                   * 
*              PBMON         -SYSTEM MONITOR                          * 
*                                                                     * 
** OUTPUT -                                                           * 
** EXTERNAL SUBROUTINES -                                             * 
** NOTES -                                                            * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_ 
THE NTS TIP IS USED TO DRIVE FICTICIOUS ASYNC LINES.
IT HAS TWO MAIN PURPOSES: 
  -ACT AS A REAL ASYNC TERMINAL FOR THE NTS STIMULATOR. 
  -ACT AS A PAD TERMINAL FOR THE X.25 SOFTWARE. 
HENCE THE SAME VIRTUAL TERMINAL IS LOGGED-IN TWICE. 
  
DOWNLINE THE NTS TIP PROCESSES THE FOLLOWING FUNCTIONS: 
  -A0SMEN 
  -A0SMDA 
  -A0SMRCTCB
  SVM IS MODIFIED NOT TO CALL PTLINIT FOR THESES LINES. 
  -A0QUEOUT : 
      ONLY ONE EXTERNAL DOWNLINE BLOCK FROM THE HOST IS 
      EXPECTED.VIZ.THE BANNER.RECEIPT OF THIS TURNS ON
      BSLOGGED IN THE NTS LINES' TCB.ALL OTHER DOWNLINE 
      BLOCKS WILL BE FROM THE LOP,AND THUS HAVE THE 
      INTERNAL BIT SET.THE LOP COMMANDS ARE PROCESSED 
      BY PSLPCMD  . 
  
      BSLOGGED    I   Y   I   N   I 
     ------------------------------ 
      INTERNAL    I Y I N I Y I N I 
     ------------------------------ 
     ------------------------------ 
      BACK IT     I   I X I   I X I 
     -------------------------------
      DISCARD IT  I   I X I X I X I 
     -------------------------------
      PSLPCMD  ;  I X I   I   I   I 
     -------------------------------
      SET BSLOGGEDI   I   I   I X I 
     -------------------------------
  
  
UPLINE TWO WORKLISTS ARE SUPPORTED: 
  -L2OUTPUT : FRAME SENT BY X.25 LEVEL 2. THIS FRAME IS SENT
              UPLINE AS AN MSG BLOCK, AND AN MMOBUX WORKLIST
              IS QUEUED BACK TO X.25 LEVEL 2. 
              THESE WORKLISTS ARE ONLY EXPECTED DURING NTS
            UNIT TEST,WHEN BLOCKS DESTINED FOR OUTPUT BY THE
            X.25 TIP ARE REROUTED TO THE NTS TIP. 
  -MMOBUX   : OUTPUT BUFFER TRANSMITTED. THIS ONLY MEANS THAT 
              X.25 LEVEL 2 CORRECTLY RECEIVED THE L2GDFRM 
              WORKLIST. 
  
TWO WORKLISTS RELATING TO MONITORING ARE SUPPORTED. 
  
  
  -MONOUT    : MONITOR BLOCK SENT FROM X.25.THIS BLOCK IS SENT
               UPLINE AS A MSG BLOCK,ON THE ASSOCIATED NTS LINE.
  
  -MONTIM    : MONITOR TIMEOUT WORKLIST INITIATES THE TWO MONITOR 
               ROUTINES PSX25MON AND PSLINMON.
  
TWO WORLISTS FROM X.25 ARE RECEIVED AS RESPONSES TO NTS WORKLISTS 
  
  -C0ICS     : WORKLIST SENT FROM X.25 AS RESPONSE TO INITIATE CALL 
               WORKLIST FROM NTS ( A0ICS).
               THIS GENERATES A MESSAGE TO THE LOP. 
  
  -C0TCS     : WORKLIST SENT FROM X.25 AS RESPONSE TO TERMINATE CALL
               WORKLIST FROM NTS (A0TCS) OR DUE TO CALL CLEARING IN 
               X.25 WITHOUT A0TCS.
               THIS GENERATES A MESSAGE TO THE LOP. 
? 
PROCEDURE PNTSD4; 
CONST 
      N5MAXCN       = 4;                    _ MAX NO. OF CONN TYPES    ?
      IC            = 2;                    _ INITIATE CALL            ?
      TC            = 3;                    _ TERMINATE CALL           ?
*CALL X25CON01
  
TYPE
  
*CALL X25TYP02
*CALL X25TYP07
*CALL X25TYP08
  
VAR 
  
     XIPARAMS : X0PARAMS;                   _INPUT WORKLIST            ?
     XOPARAMS : X0PARAMS;                   _OUTPUT WORKLIST           ?
     XSLCB    : BZLCBP;                     _LCB POINTER               ?
     XSLCCB   : B0BUFPTR;                   _LCCB POINTER              ?
     XNOBFPTR : B0BUFPTR;                   _BUFFER POINTER            ?
     N5CMDT   : ARRAY [1..6] OF INTEGER;    _ LOP COMMAND TABLE        ?
     N5RCTB   : ARRAY [0..6] OF INTEGER;    _ REASON CODE TABLE        ?
     N5LPMSG  : ARRAY [1..10]OF INTEGER;    _ CANNED LOP MESSAGE       ?
     N5CNTYPE : ARRAY [1..N5MAXCN] OF INTEGER; _ CONNECTION TYPES     ? 
     N5CHFOUND  :   BOOLEAN;                _FLAG SET IF CHANNEL FOUND ?
     N4MONPTR    :  B0BUFPTR  ;             _ TEMP MON POINTER         ?
     N5MONPTR    :  B0BUFPTR  ;             _ TEMP MON POINTER         ?
     N6MONPTR    :  B0BUFPTR  ;             _ TEMP MON POINTER         ?
     N5LCCB      :  B0BUFPTR  ;             _ TEMP LCCB POINTER        ?
     N6LCCB      :  B0BUFPTR  ;             _ TEMP LCCB POINTER        ?
     XSWK     :  B0OVERLAY;                  _ WORKLIST BLOCK         ? 
     N5LOCPTR     :    B0BUFPTR  ;          _ LOCAL BUF PNTR           ?
     N6CNTYPE    :  INTEGER;                _ LOCAL CN TYPE VARIABLE   ?
     N5LCBTCB    :  B0OVERLAY;              _ PNTR TO LCB AND TCB      ?
     N5RSNCODE   : INTEGER;                 _ REASON CODE FOR RESPONSE ?
     N5CMD       : INTEGER;                 _ INTERNAL COMMAND VALUE   ?
     N5SAVE      : INTEGER;                 _ SEE PSPRLNCMD            ?
  
_    * * *  BIP INTERFACE                                              ?
     XDLBLOCK : B0BUFPTR; 
  
VALUE 
  
     N5CMDT   = ( #LN#,     _01?            _ LINK LINE COMMAND        ?
                  #IC#,     _02?            _ INITIATE CALL CMD        ?
                  #TC#,     _03?            _ TERMINATE CALL CMD       ?
                  #IM#,     _04?            _ INITIATE MONITOR CMD     ?
                  #TM#,     _05?            _ TERMINATE MONITOR CMD    ?
                  #CR#);    _06?            _ COMMAND REJECT           ?
  
     N5RCTB   = ( #00#,                     _ NORMAL RESPONSE          ?
                  #01#,                     _ VARIABLE                 ?
                  #02#,                     _ VARIABLE                 ?
                  #03#,                     _ X25 LINE INACTIVE        ?
                  #04#,                     _ VARIABLE                 ?
                  #05#,                     _ X25 LINE STATUS INVALID  ?
                  #06# );                   _ UNSOLICITED C0TCS        ?
  
     N5LPMSG =( $1308,                      _                          ?
                $0000,                      _                          ?
                $0000,                      _                          ?
                $0000,                      _                          ?
                $0000,                      _ COMMAND CODE             ?
                #//#,                       _ FILL                     ?
                #NN#,                       _ CHNL,LN NO. OR CN TYPE   ?
                #/R#,                       _ FILL                     ?
                #C=#,                       _ FILL                     ?
                #RC#);                      _ REASON CODE              ?
  
     N5CNTYPE =(#PD#,                       _ PAD CONNECTION           ?
                #LA#,                       _ LINK ACCESS              ?
                #IX#,                       _ INTERACTIVE X25 LINE     ?
                #US# );                     _ USER CONTYP              ?
  
_$J+? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*                    PSSETTIME                                        * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW -                                                         * 
*     ROUTINE TO INITIATE ONE SECOND TIMER                            * 
*                                                                     * 
** INPUT -                                                            * 
   *        NONE                                                      * 
*                                                                     * 
** CALLING PROGRAMS                                                   * 
*               AAAAAAA                                               * 
*               BBBBBBB                                               * 
*                                                                     * 
** NOTES -                                                            * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PSSETTIME;
  
CONST 
     N5PKTSIZE = 8;                         _SIZE OF TIMER PACKET      ?
  
VAR 
     N5TENSEC   : INTEGER;                  _TEN SECOND INTERVAL       ?
     N5PKTPTR  : B7PKTPTR;                  _ POINTER TO TIMER PACKET  ?
  
VALUE 
     N5TENSEC = 3030;                       _ TEN SECOND INTERVAL      ?
  
BEGIN 
     IF N5PKTPTR = NIL                      _ IF NO TIMER PACKET       ?
     THEN 
     N5PKTPTR := PBGET1BF(B0S8);            _ GET 8 WORD BUFFER        ?
     PBCLR(N5PKTPTR,N5PKTSIZE);             _ CLEAR PACKET             ?
     WITH N5PKTPTR' DO                      _ WITH TIMER PACKET        ?
       BEGIN
       BKWLINDEX := B0NTSWL;                _ SET WORKLIST INDEX       ?
       BKWKCODE := MONTIM;                  _ SET WORKCODE             ?
       BKTIME := N5TENSEC;                  _ SET INTERVAL             ?
       BKTYPE := BKSET;                     _ SET TO SET TIMER         ?
       BK2UPTR:= N5PKTPTR;                  _ POINT TO ITSELF          ?
       END; 
_ 
* * * * SEND TO TIMER SERVICES
? 
     PBTMRSRV(N5PKTPTR);
  
END;
_$J+? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*                    PSTELLSVM                                        * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW -                                                         * 
*              GENERATE AND QUEUE A SERVICE MESSAGE                   * 
*                                                                     * 
** INPUT -                                                            * 
*              XSSVMWC = WORKCODE FOR SVM                             * 
*              XALINO  = LINE NUMBER(FROM XIPARAMS)                   * 
*              XATCBLCCB = TCB ADDRESS(FROM XIPARAMS)                 * 
*                                                                     * 
** CALLING PROGRAMS                                                   * 
** OUTPUT -                                                           * 
*              WORKLIST QUEUED TO SVM                                 * 
*                                                                     * 
** EXTERNAL SUBROUTINES -                                             * 
*              PBLSPUT       -QUEUE A WORKLIST                        * 
*                                                                     * 
** NOTES -                                                            * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PSTELLSVM( XSSVMWC : B08BITS);
  
BEGIN 
WITH XOPARAMS DO                            _OUTPUT WORKLIST           ?
  BEGIN 
  
  XAWC := XSSVMWC;                          _WORKCODE                  ?
  
  CASE XSSVMWC OF 
  
    C0LINOP,                                _ENABLE LINE               ?
    C0LNDA:                                 _DISABLE LINE              ?
      BEGIN 
      XALINO := XIPARAMS.XALINO;
      XABFRPTR := NIL;                      _CLEAR BUFFER POINTER      ?
      END; _C0LINOP,C0LNDA? 
  
    C0RCTCB:                                _RECONFIGURE TCB           ?
      XATCBLCCB := XIPARAMS.XABFRPTR; 
  
    END; _CASE XSSVMWC? 
  PBLSPUT(XAWORKLIST,BYWLCB[B0SMWL]); 
  END; _WITH XOPARAMS?
END; _PROCEDURE PSTELLSVM?
_$J+? 
_$J+? 
_ 
************************************************************************
*                                                                      *
*                       PSLINMON                                       *
*                                                                      *
*                                                                      *
************************************************************************
? 
_$R-,G-,I-? 
_ 
************************************************************************
*                                                                      *
** OVERVIEW -                                                          *
*    THIS ROUTINE GATHERS STATISTICS FOR A PARTICULAR X25 LINE.        *
*    THE STATISTICS GATHERED CONSISTS OF A 6 WORD ENTRY FOR THE LINE   *
*    FOLLOWED BY A 6 WORD ENTRY FOR EACH ACTIVE CHANNEL ON THE LINE.   *
*    THE LINE ENTRY HAS THE FORMAT                                     *
          ------------------- 
          I       T   M     I 
          ------------------- 
          I       NNNN      I 
          ------------------- 
          I       L   N     I 
          ------------------- 
          I       NNNN      I 
          ------------------- 
          I      F   R      I 
          ------------------- 
          I     BZFRMCNT    I 
          ------------------- 
*    THE CHANNEL ENTRY HAS THE FORMAT                                  *
          ------------------- 
          I       NNN       I 
          ------------------- 
          I      U   F      I 
          ------------------- 
          I     UFRGCNT     I 
          ------------------- 
          I      D   F      I 
          ------------------- 
          I     DFRGCNT     I 
          ------------------- 
************************************************************************
? 
PROCEDURE PSLINMON(NTSTCBPTR: B0BUFPTR);
  
CONST 
      N5MAXWRD = 55;                        _ MAX WORD COUNT IN BUFF   ?
      N5READY = 1;
VAR 
     N5MONHD    : ARRAY[1..6] OF INTEGER;   _ 6 WORD HEADER FOR BLOCK  ?
     N5LINMSG   : ARRAY[1..6] OF INTEGER;   _ 6 WORD ENTRY PER CHANNEL ?
     N5LNBFR    :  B0BUFPTR;                _ POINTER TO TEMP BUFFER   ?
     N6LNBFR    :  B0BUFPTR;                _ POINTER TO TEMP BUFFER   ?
     N7LNBFR    :  B0BUFPTR;                _ POINTER TO TEMP BUFFER   ?
     N5WRDCNT   :  INTEGER;                 _WORD COUNT IN BUFFER      ?
     N5LCCB     :  B0BUFPTR;                _ LOCAL LCCB POINTER       ?
     N6LCCB     :  B0BUFPTR;                _ LOCAL LCCB POINTER       ?
     I          :  INTEGER ;                _ LOOP COUNTER             ?
     N5VCNUM    : INTEGER;                  _TOTAL NUMBER OF PVC AND   ?
                                            _ SVC                      ?
     N5INDEX    : INTEGER;                  _INDEX                     ?
  
VALUE 
     N5MONHD    = ( #TM#,$0000,             _ SYSTEM ONE SECOND CLOCK  ?
                    #LN#,$0000,             _ LINE NO.                 ?
                    #FR#,$0000);            _ FRAME COUNT              ?
  
     N5LINMSG   =  ( #CH#,$0000,            _ CHANNEL NO.              ?
                      #UF#,$0000,           _ UPLINE FRAG COUNT        ?
                      #DF#,$0000);          _ DOWNLINE FRAG COUNT      ?
  
BEGIN 
     WITH NTSTCBPTR'.BSTCB DO               _ WITH NTS TCB DO          ?
       BEGIN
_ 
* * * *   SET LOCAL PNTR FOR X25 LCB
? 
       N5LCBTCB.BABUFPTR := BSLINK; 
_ 
* * * *  GET BUFFER 
? 
     N5LNBFR := PBGET1BF(BEDBSIZE);         _ GET DATA BUFFER          ?
     N6LNBFR := N5LNBFR;                    _ SET TEMP BUFF PNTR       ?
     WITH N6LNBFR' DO                       _ WITH THIS BUFFER         ?
       BEGIN
       BFLCD := 13;                         _ SET LCD                  ?
       BFFCD := 12;                         _ SET FCD                  ?
       BFDATAC[12] := CHR(4);               _ SET DBC                  ?
       BFDATAC[13] := CHR(42);              _ SET * BEFORE TM          ?
  
       N5WRDCNT := 7;                       _ SET WORD COUNT           ?
_ 
* * * * SET UP HEADER BLOCK 
? 
     N5MONHD[2] := CASECNTR;                _ SET CLOCK TIME           ?
     N5MONHD[4] := N5LCBTCB.BALCBP'.BZLINO   _ SET LINE NUMBER OF X25  ?
                   .BDLINO; 
     N5MONHD[6] := N5LCBTCB.BALCBP'          _ SET FRAME COUNT         ?
                   .BZSLCBPTR'.BZXSLCB.BZFRMCNT;
_ 
* * * *  TRANSFER HEADER TO BUFFER
? 
     FOR I := 1 TO 6 DO 
     BIINT[N5WRDCNT + I] := N5MONHD[I];     _ TRANSFER TO BUFFER       ?
  
     BFLCD := BFLCD + 12;                   _ UPDATE LCD               ?
      N5WRDCNT := N5WRDCNT + 6;             _ UPDATE BUFFER WORD COUNT ?
  
     END; 
  
_ 
* * * * NOW LOOP THRU CHANNELS
? 
     WITH N5LCBTCB.BALCBP' DO                _ WITH X25 LCB FIELDS DO  ?
       BEGIN
       N6LCCB := BZSLCBPTR'.BZXSLCB.BZFLCCB;_ POINT TO FIRST LCCB      ?
  
       WITH BZSLCBPTR'.BZXSLCB DO 
         N5VCNUM := BZLPVC + BZLSVC;
  
       FOR N5INDEX := 0 TO N5VCNUM DO 
          BEGIN 
          IF N6LCCB'.LCCB.LCPHPSTATE " N5READY
          THEN
          BEGIN 
          WITH N6LCCB'.LCCB DO              _ WITH LCCB FIELDS DO      ?
           BEGIN
           N5LINMSG[2] := LCHN;             _ SET CHANNEL NUMBER       ?
           N5LINMSG[4] := LCUFRGCNT;        _ SET UPLINE FRG CNT       ?
           N5LINMSG[6] := LCDFRGCNT;        _ SET DWNLNE FRG CNT       ?
           END; 
_ 
* * * *  NOW TRANSFER TO BUFFER 
? 
      WITH N6LNBFR' DO                      _ WITH DATA BUFFER         ?
        BEGIN 
         FOR I := 1 TO 6 DO 
         BIINT[N5WRDCNT + I] := N5LINMSG[I];_ COPY TO BUFFER           ?
         BFLCD := BFLCD + 12;               _ UPDATE LCD               ?
         N5WRDCNT := N5WRDCNT + 6;          _ UPDATE BUFFER WORD COUNT ?
        END;
          END; _ IF N6LCCB'.LCCB........       ?
  
       IF N5WRDCNT >N5MAXWRD                _ IF THIS BUFFER FULL      ?
       THEN 
_ 
* * * * CHAIN NEW BUFFER
? 
         BEGIN
         N7LNBFR := PBGET1BF(BEDBSIZE);     _ GET NEW BUFFER           ?
         N6LNBFR'.BCCHAINS[DBUFLENGTH] := N7LNBFR; _ CHAIN TO PREVIOUS ?
         N6LNBFR := N7LNBFR;                _ POINT TO LATEST          ?
         WITH N6LNBFR' DO 
           BEGIN
           BFLCD := 13;                     _ SET LCD                  ?
           BFFCD := 12;                     _ SET FCD                  ?
           BFDATAC[12] := CHR(42);          _ SET STAR IN BUFFER       ?
           BFDATAC[13] := CHR(42);          _ SET STAR IN BUFFER       ?
           END; 
         N5WRDCNT := 7;                     _ RESET WORD COUNT         ?
         END; 
         N6LCCB := N6LCCB'.LCCB.LCNXTLCCB;
  
         END; _FOR N5INDEX TO N5VCNUM?
  
_ 
* * * *  NOW SEND BUFFERS UPLINE
? 
         B1BUFF := N5LNBFR;                 _ SET B1BUFF TO HEAD OF CHN?
         N5LNBFR := NIL;                    _ RESET LOCAL POINTER      ?
         N6LNBFR := NIL;                    _ RESET LOCAL POINTER      ?
         N7LNBFR := NIL;                    _ RESET LOCAL POINTER      ?
         B1TCB := NTSTCBPTR;                _ SET B1TCB FOR UPLINE TCB ?
         B1BT := HTMSG;                     _ SET MSG-BLOCK TYPE       ?
         WITH  BSFLGWRD  DO 
           BEGIN
           BSINPBUF := B1BUFF;              _SET UP UNLINE DATA        ?
           KTIGNRCN := FALSE;               _IGNOR CANCEL              ?
           KTSEND   := TRUE;                _SEND THIS DATA TO HOST    ?
           KTCKSP   := TRUE;                _CHECK FOR SPECIAL         ?
           KTBLKT   := HTMSG;               _MSG TYPE BLOCK            ?
_ 
           * * *  CALL UPLINE TIP SERVICE  * * *
? 
           PBULTS(B1TCB); 
  
           KTWORD   := 0;                   _CLEAR BIP FLAG WORD       ?
           END;  _ WITH BSTCB, BSFLGWRD ? 
         END; 
  
  END; _ WITH BSTCB ? 
END; _ PSLINMON  ?
_$J+? 
  
_ 
************************************************************************
*                                                                      *
*                       PSX25MON                                       *
*                                                                      *
*                                                                      *
************************************************************************
? 
_$R-,G-,I-? 
_ 
************************************************************************
*                                                                      *
** OVERVIEW -                                                          *
*    THIS ROUTINE GATHERS STATISTICS ON THE X25 TIP.                   *
*    EACH CALL TO PSX25MON ADDS A 10 WORD ENTRY TO A STATS BUFFER.     *
*    THE ENTRY TAKES THE FORM:-                                        *
          ------------------- 
          I      T   M      I 
          ------------------- 
          I       TTTT      I 
          ------------------- 
          I      D   B      I 
          ------------------- 
          I       BEBAC     I 
          ------------------- 
          I       C  X      I 
          ------------------- 
          I       NNNN      I 
          ------------------- 
          I       C  3      I 
          ------------------- 
          I       NNNN      I 
          ------------------- 
          I       C  2      I 
          ------------------- 
          I       NNNN      I 
          ------------------- 
************************************************************************
? 
PROCEDURE PSX25MON; 
CONST 
     N5MAXCNT = 5;                          _ MAX ENTRIES PER BUFFER   ?
  
  
  
VAR 
     N5MONMSG  : ARRAY [1..10]  OF INTEGER; _ CONTAINS SKELETON MON MSG?
      N5MONCNT   : INTEGER;                 _ NUMBER ENTRIES IN BUFFER ?
      N5MONBUF   : B0BUFPTR;                _ POINTS TO DATA BUFFER    ?
      I          : INTEGER;                 _ LOOP COUNT               ?
      N5MONWORD  : INTEGER;                 _ WORD IN MON BUFFER       ?
  
VALUE 
      N5MONMSG = ( #TM#,$0000,              _ CURRENT TIME IN SECONDS  ?
                   #DB#,$0000,              _ DATA BUFFERS AVAILABLE   ?
                   #CX#,$0000,              _ X25 WORKLIST COUNT       ?
                   #C3#,$0000,              _ L3  WORKLIST COUNT       ?
                   #C2#,$0000);             _ L2  WORKLIST COUNT       ?
  
  
BEGIN 
_ 
* * * *  SET UP VALUES IN CANNED MESSAGE
? 
     N5MONMSG[2] := CASECNTR;               _ SET TIME IN WORD 2       ?
     N5MONMSG[4] := BECTLBK[B0S3].BEBAC;    _ DATA BUFFER COUNT        ?
     N5MONMSG[6] := BYWLCB[B0X25TIP].BYCNT; _ X25 WKLIST COUNT         ?
     N5MONMSG[8] := BYWLCB[B0XL3].BYCNT;    _ L3 WKLIST COUNT          ?
     N5MONMSG[10]:= BYWLCB[B0XL2].BYCNT;    _ L2 WKLIST COUNT          ?
_ 
* * * * CHECK IF BUFFER AVAILABLE 
? 
     IF N5MONBUF = NIL                      _ IF NOT AVAILABLE         ?
     THEN 
       BEGIN
       N5MONBUF := PBGET1BF(BEDBSIZE);      _ GET A DATA BUFFER        ?
       N5MONCNT := 0;                       _ RESET MONITOR ENTRY COUNT?
_ 
* * * *   SET UP BUFFER HEADER FIELDS 
? 
       WITH N5MONBUF' DO
         BEGIN
         BFLCD := 13;                       _ SET LCD                  ?
         BFFCD := 12;                       _ SET FCD                  ?
         N5MONWORD := 7;                    _ SET WORD COUNT IN BUFFER ?
         END; 
       END;  _ IF NO BUFFER ? 
  
_ 
* * **  MOVE CANNED MESSAGE INTO BUFFER 
? 
     WITH N5MONBUF' DO
     BEGIN
     FOR I:= 1 TO 10 DO                     _ LOOP THRU CANNED MESSAGE ?
       BIINT[N5MONWORD +I] := N5MONMSG[I];  _ MOVE INTO BUFFER         ?
     N5MONWORD := N5MONWORD +10;            _ UPDATE POSITION IN BUFFER?
     N5MONCNT := N5MONCNT + 1;              _ UPDATE NO.ENTRIES        ?
     BFLCD    := BFLCD + 20;                _ UPDATE LCD               ?
_ 
* * * *  IF BUFFER FULL,SHIP IT UPLINE
? 
     IF N5MONCNT = N5MAXCNT                 _ IF AT MAXIMUM            ?
     THEN 
       BEGIN
       N5MONCNT := 0;                       _ RESET NO. OF ENTRIES     ?
       B1BUFF:= N5MONBUF;                   _ SET B1BUFF FOR POI RTNS  ?
       N5MONBUF := NIL;                     _ RESET LOCAL POINTER      ?
       B1TCB    := N5MONPTR;                _ SET TCB PNTR FOR POI RTN ?
       BFDATAC[12] := CHR(4);               _ SET DBC                  ?
       BFDATAC[13] := CHR(42);              _ SET STAR IN BUFFER       ?
       B1BT      := HTMSG;                  _ SET MSG TYPE BLOCK TYPE  ?
       WITH  B1TCB'.BSTCB, BSFLGWRD  DO 
         BEGIN
         BSINPBUF := B1BUFF;                _SET UP UNLINE DATA        ?
         KTIGNRCN := FALSE;                 _IGNOR CANCEL              ?
         KTSEND   := TRUE;                  _SEND THIS DATA TO HOST    ?
         KTCKSP   := TRUE;                  _CHECK FOR SPECIAL         ?
         KTBLKT   := HTMSG;                 _MSG TYPE BLOCK            ?
_ 
         * * *  CALL UPLINE TIP SERVICE  * * *
? 
         PBULTS(B1TCB); 
  
         KTWORD   := 0;                     _CLEAR BIP FLAG WORD       ?
         END;  _ WITH BSTCB, BSFLGWRD ? 
      END;
    END;
END;
_$J+? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * **
*                                                                      *
*                     PSLOPMSG                                         *
*                                                                      *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * **
? 
_$R-,G-,I-? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * **
*                                                                      *
*                                                                      *
**  OVERVIEW -                                                         *
*              GENERATES A MESSAGE UPLINE TO LOP                       *
*              THESE WILL USUALLY BE RESPONSES TO                      *
*              MESSAGES RECEIVED DOWNLINE FROM LOP                     *
*                                                                      *
**  INPUT -                                                            *
*                                                                      *
*         CMDCD - COMMAND CODE(INDEX INTO ARRAY CMDT)                  *
*         RCODE - REASON  CODE(INDEX INTO ARRAY RCTB)                  *
*         NSAVE - CHANNEL,LINE,OR CONN. TYPE                           *
**                                                                     *
**  CALLING PROGRAMS -                                                 *
*                                                                      *
*        PSLPCMD - PROCESS LOP COMMAND                                 *
*                                                                      *
**  CALLS-                                                             *
*                                                                      *
*                                                                      *
**  NOTES-                                                             *
*                                                                      *
**** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
? 
     PROCEDURE PSLOPMSG( VAR CMDCD,RC,N5SAVE: INTEGER); 
CONST 
  
VAR 
     N5LOPBUF   : B0BUFPTR;                 _ POINTS TO LOP MESSAGE BUF?
     N5LPWRD    : INTEGER;                  _ LATEST WORD IN MESSAGE   ?
  
  
BEGIN 
  
_ 
* * * *  SET COMMAND,REASON CODE AND NN IN N5LPMSG
? 
     N5LPMSG[5] := N5CMDT[CMDCD];           _ SET COMMAND CODE         ?
     N5LPMSG[7] := N5SAVE;                  _ SET NN                   ?
     N5LPMSG[10] := N5RCTB[RC];             _ SET REASON CODE          ?
     N5SAVE  := 0;                          _ RESET NN                 ?
  
_ 
* * * *  TRANSFER CANNED MESSAGE TO BUFFER
? 
  
     N5LOPBUF := PBGET1BF(BEDBSIZE);        _ GET DATA BUFFER         ? 
  
     WITH N5LOPBUF' DO
       BEGIN
       FOR N5LPWRD:= 1 TO 10 DO 
         BIINT[N5LPWRD] := N5LPMSG[N5LPWRD];_ COPY MESSAGE TO BUFFER   ?
  
_ 
* * * * SEND LOP MESSAGE TO SVM FOR ROUTING TO HOST 
? 
  
       GENPFC := D8USER;                    _ USER                     ?
       GENSFC := D9OPMSG;                   _ OPERATOR MESSAGE         ?
       OP.BABUFPTR := N5LOPBUF;             _ POINTER TO MESSAGE BUFFER?
       END; _ WITH N5LOPBUF  ?
  
     WITH BRTNJUMP[C1PNSMGEN] DO
       PBXFER(JENTADDR,JPAGEVAL);           _ PASS MESSAGE TO SVM      ?
  
END;     _ PROCEDURE PSLPMSG     ?
_$J+? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * **
*                                                                      *
*                     PSPRLNCMD                                        *
*                                                                      *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * **
? 
_$R-,G-,I-? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * **
*                                                                      *
*                                                                      *
**  OVERVIEW -                                                         *
*          PROCESS LN COMMAND FROM LOP                                 *
*                                                                      *
**  INPUT -                                                            *
*                                                                      *
**                                                                     *
**  CALLING PROGRAMS -                                                 *
*                                                                      *
*                                                                      *
**  CALLS-                                                             *
*                                                                      *
*                                                                      *
**  NOTES-                                                             *
*                                                                      *
**** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
? 
_        DECISION TABLE FOR LN COMMAND
--------------------------------------------------------- 
  NTS LINE LINKED   I         N         I       Y       I 
--------------------------------------------------------- 
  X25 LINE VALID    I     Y     I   N   I               I  LCB AVAILABLE
--------------------------------------------------------- 
  X25 LINE ACTIVE   I   Y   I N I       I               I  ENABLED IN LCB 
--------------------------------------------------------- 
  X25 LINE LINKED   I N I Y I   I       I               I  BOOLEAN IN SLCB
========================================================= 
  SET REASON CODE   I 0 I 5 I 3 I   4   I        2      I 
--------------------------------------------------------- 
  SET BSNTSINIT     I X I   I   I       I               I 
--------------------------------------------------------- 
  SET BZX2NLNK      I X I   I   I       I               I  POINTER TO NTSTCB
--------------------------------------------------------- 
  SET  BSLINK       I X I   I   I       I               I  POINTER TO X25(S)LCB 
--------------------------------------------------------- 
? 
PROCEDURE PSPRLNCMD( VAR N5RSNCODE,N5NUMVAL,N5SAVE : INTEGER);
BEGIN 
  
  
      WITH B1TCB'.BSTCB DO                  _ WITH NTS LINE TCB        ?
        BEGIN 
        IF BSNTSINIT                        _ IF NTS LINE LINKED [TCB] ?
        THEN
        N5RSNCODE := 2                      _ SET REASON CODE          ?
        ELSE
          BEGIN                             _ NTS LINE NOT LINKED      ?
          PBLCBP(N5NUMVAL,XSLCB);           _ LOCATE X25 LCB           ?
          IF(XSLCB = NIL)                   _ IF LCB NOT FOUND         ?
     !(          XSLCB'.BZTIPTYPE "N1X25)   _ OR NOT X25 LINE          ?
          THEN
            N5RSNCODE := 4                  _ LINE NOT VALID           ?
          ELSE                              _ NOT LINKED AND VALID     ?
            WITH XSLCB'.BZSLCBPTR'          _ WITH SLCB FIELDS         ?
                 .BZXSLCB DO
              IF ^BZHDLCUP                  _ IF X25 LINE NOT ACTIVE   ?
              THEN
                N5RSNCODE := 3              _ SET REASON CODE          ?
              ELSE
_ 
* * * *   NOT LINKED AND ACTIVE AND VALID 
? 
                IF BZX2NLNK " NIL           _ IF X25 LINE LINKED       ?
                THEN
                  N5RSNCODE := 5            _ SET REASON CODE          ?
                ELSE
                  BEGIN                     _ ALL CONDITIONS MET       ?
                  N5RSNCODE :=0;            _ SET REASON CODE          ?
                  BSNTSINIT := TRUE;        _ NTS LINE LINKED          ?
                  BZX2NLNK := B1TCB;        _ SET X25 TO NTS LINK      ?
                  BSLINK := XSLCB;          _ NTS TCB LINK TO X25      ?
                  END;
            END; _ NOT ALREADY LINKED?
         END;  _ WITH B1TCB'.BSTCB ?
  
  
END;  _ PROCESS LN COMMAND ?
_$J+? 
_ 
************************************************************************
*                                                                      *
*                            PSLPCMD                                   *
*                                                                      *
************************************************************************
? 
_ 
************************************************************************
*                                                                      *
**  OVERVIEW  -                                                        *
*              PROCESS LOP COMMAND RECEIVED                            *
*                                                                      *
**  INPUT -                                                            *
************************************************************************
? 
_ 
************************************************************************
* LOP MESSAGE FORMATS.
* --------------------
*   NTS WILL PROCESS THE FOLLOWING COMMANDS AND GENERATE THE RESPONSES
*       COMMAND                               RESPONSE
*       -------                               --------
* ASSOCIATE NTS LINE WITH X.25 LINE 
* --------------------------------- 
*       LN//NN/                                LN//NN/RC=RR 
  
* INITIATE CALL SEQUENCE ON ASSOCIATED X.25 LINE. 
* ----------------------------------------------- 
*       IC//CT/                                IC//CC/RC=RR 
*                                             IC//CT/RC=RR
* TERMINATE CALL SEQUENCE ON ASSOCIATED X.25 LINE.
* ------------------------------------------------
  
*       TC//CC/                                TC//CC/RC=RR 
  
* INITIATE MONITOR ON ASSOCIATED X.25 LINE. 
* ----------------------------------------- 
  
*       IM                                    IM    RC=RR 
  
* TERMINATE MONITOR ON ASSOCIATED X.25 LINE.
* ------------------------------------------
  
*       TM                                    TM    RC=RR 
*   WHERE 
*     RR         =        REASON CODE (0 FOR NORMAL RESPONSE) 
*     NN         =        LINE NUMBER(   IN ASCII     ) 
*     CT         =        CONNECTION TYPE ( PD=  PAD CONNECTION,
*                                           LA=  LINK ACCESS, 
*                                           IX= INTERACTIVE X25 LINE, 
*                                           US= USER SUBTIP   ) 
*     CC         =        CHANNNEL NUMBER.(  IN ASCII  )
*   ALL HEXADECIMAL DIGITS ARE CONVERTED INTERNALLY TO BINARY FORMAT. 
? 
_ 
* TABLE OF REASON CODES FOR LOP MESSAGE RESPONSES.
* ------------------------------------------------
  
  
  
*   =============================================================== 
*   I COMMAND  I  RC I TYPE I   DESCRIPTION                       I 
*   =============================================================== 
*   I  LN      I     I      I  NTS-X25 LINK COMMAND               I 
*   I          I  0  I   I  I  LINKAGE COMPLETE                   I 
*   I          I  1  I   E  I  INVALID PARAMETER                  I 
*   I          I  2  I   E  I  NTS LINE ALREADY LINKED            I 
*   I          I  3  I   E  I  X25 LINE NOT ACTIVE                I 
*   I          I  4  I   E  I  X25 LINE NOT FOUND                 I 
*   I          I  5  I   E  I  X25 LINE ALREADY LINKED            I 
*   --------------------------------------------------------------- 
*   I  IC      I     I      I  INITIATE CALL                      I 
*   I          I  0  I   I  I  CALL INITIATED[FOLLOWS ......]     I 
*   I          I  1  I   E  I  INVALID CONNECTION TYPE            I 
*   I          I  2  I   I  I  CALL ALREADY INITIATED             I 
*   I          I  3  I   E  I  X25 LINE NOT ACTIVE                I 
*   I          I  4  I   E  I  READY CHNL NOT AVAILABLE           I 
*   I          I  5  I   E  I  X25 LINE NOT LINKED                I 
*   I          I  6  I   E  I  CALL REJ BY CLEAR REQUEST          I 
*   --------------------------------------------------------------- 
*   I  TC      I     I      I  TERMINATE CALL                     I 
*   I          I  0  I   I  I  CALL TERMINATED [ FOLLOWS .......] I 
*   I          I  1  I   E  I  INVALID CHANNEL NUMBER             I 
*   I          I  2  I   E  I  X25 CHANNEL NOT FOUND              I 
*   I          I  3  I   E  I  X25 LINE NOT ACTIVE                I 
*   I          I  4  I   E  I  CHANNEL NOT ACTIVE                 I 
*   I          I  5  I   E  I  X25 LINE NOT LINKED                I 
*   I          I  6  I   E  I  UNSOLICITED C0TCS FROM X25         I 
*   --------------------------------------------------------------- 
*   I  IM      I     I      I  INITIATE MONITOR                   I 
*   I          I  0  I   I  I  MONITOR INITIATED                  I 
*   I          I  1  I   E  I  MONITOR ALREADY INITIATED          I 
*   I          I  3  I   E  I  X25 LINE NOT ACTIVE                I 
*   I          I  2  I   I  I  FIRST LINE MONITORED               I 
*   I          I  5  I   E  I  X25 LINE NOT LINKED                I 
*   --------------------------------------------------------------- 
*   I  TM      I     I      I  TERMINATE MONITOR                  I 
*   I          I  0  I   I  I  MONITOR TERMINATED                 I 
*   I          I  1  I   E  I  MONITOR NOT ACTIVE ON THIS LINE    I 
*   I          I  3  I   E  I  X25 LINE NOT ACTIVE                I 
*   I          I  2  I   I  I  LAST MONITORED LINE REMOVED        I 
*   I          I  5  I   E  I  X25 LINE NOT LINKED                I 
*   --------------------------------------------------------------- 
*   I  CR      I     I      I  COMMAND REJECTED                   I 
*   I          I  1  I   E  I  INVALID COMMAND CODE               I 
*   =============================================================== 
  
* TYPE: - 
*        E    ERROR RESPONSE
*        I    INFORMATIVE RESPONSE
  
*     [FOLLOWS .......] IMPLIES TRIGGERED BY RESPONSE FROM X25 TIP. 
*                      I.E. RECEIPT OF C0TCS,C0ICS WORKLIST.
************************************************************************
? 
  
PROCEDURE PSLPCMD;
  
CONST 
     LN = 01;                               _ LINE ASSOCIATION         ?
     IC = 02;                               _ INITIATE CALL            ?
     TC = 03;                               _ TERMINATE CALL           ?
     IM = 04;                               _ INITIATE MONITOR         ?
     TM = 05;                               _ TERMINATE MONITOR        ?
     RC = 06;                               _ REJECT COMMAND           ?
     RCPRESET = 10;                         _ PRESET REASON CODE       ?
  
VAR 
     N5RSNCODE   : INTEGER;                 _ REASON CODE FOR RESPONSE ?
     N5WKLSTFLG  : BOOLEAN;                 _ WORKLIST FLAG            ?
     N5CMDOK     : BOOLEAN;                 _ COMMAND VALID FLAG       ?
     N5CMD       : INTEGER;                 _ INTERNAL COMMAND VALUE   ?
     I           : INTEGER;                 _ LOOP VARIABLE            ?
     N5SAVE      : INTEGER;                 _ SEE PSPRLNCMD            ?
     N5NUMOK     : BOOLEAN;                 _ NUMERIC FIELD VALID      ?
     N5NUM       : B018BITS;                _ VALUE FROM PBFMAH        ?
     N5NUMVAL    : INTEGER;                 _ VALUE FROM N5NUM         ?
     FCHARNM     : INTEGER;                 _ FIRST CHAR NUMBER        ?
     N5CMDWRD    : INTEGER;                 _ WORD FOR COMMAND TYPE    ?
     N5PARWRD    : INTEGER;                 _ WORD FOR PARAMETER       ?
     N5TMPCMD    : INTEGER;                 _ TEMP STORE FOR CMD       ?
     N5TMPPAR    : INTEGER;                 _ TEMP STORE FOR PAR       ?
  
BEGIN 
_ 
* * * *   PRESET VALUES 
? 
     N5RSNCODE := RCPRESET;                 _ PRESET REASON CODE       ?
     N5WKLSTFLG := FALSE;                   _ PRESET WORKLIST FLAG     ?
     N5CMDOK := FALSE;                      _ PRESET COMMAND OK FLAG   ?
     FCHARNM := 34;                         _ FIRST CHAR OF NUMBER     ?
     N5CMDWRD := 16;                        _ WORD IN BUF FOR CMD      ?
     N5PARWRD := 18;                        _ WORD IN BUF FOR PAR      ?
     N5TMPCMD := B1BUFF'.BIINT[N5CMDWRD];   _ SET COMMAND IN TEMP      ?
     N5TMPPAR := B1BUFF'.BIINT[N5PARWRD];   _ SET PAR IN TEMP          ?
  
_ 
* * * *    INITIAL PROCESSING OF CERTAIN COMMANDS.
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII 
  
* * * *      -----------------------------------------------
             I          CHECK COMMAND                      I
             -----------------------------------------------
             I           COMMAND VALID                     I
             -----------------------------------------------
             I                Y                 I     N    I
             -----------------------------------------------
             I      COMMAND = LN OR TC          I          I
             -----------------------------------I          I
             I           Y           I    N     I          I
             -----------------------------------I          I
             I   CONVERT ASCII FIELD I          I          I
             I   TO NUMERIC FIELD    I          I          I
             ------------------------I          I          I
             I   NUMBER VALID        I          I          I
             ------------------------I          I          I
             I     Y     I     N     I          I          I
             ------------------------I          I          I
             I           I  RC = 1   I          I  RC = 1  I
             ===============================================
? 
_ 
* * * *   SET INTERNAL LOP COMMAND CODE 
? 
      FOR I := 1 TO 6 DO                    _ LOOP THRU COMMAND TABLE  ?
  
      IF N5TMPCMD = N5CMDT[I]               _ IF COMMAND FOUND IN TABLE?
      THEN
        BEGIN 
        N5CMDOK := TRUE;                    _ VALID COMMAND CODE       ?
        N5CMD :=   I;                       _ SET INTERNAL COMMAND CODE?
        I :=6;                              _ SET I TO EXIT LOOP       ?
        END; _ IF N5TMPCMD,FOR LOOP?
  
      IF ^N5CMDOK                           _ IF COMMAND NOT VALID     ?
      THEN
        BEGIN 
        N5CMD := RC;                        _   SET TO REJECT COMMAND  ?
        N5RSNCODE := 1;                     _   SET REASON CODE        ?
        N5SAVE := N5TMPCMD;                 _   SET PARAM  2           ?
        END 
      ELSE                                  _ VALID COMMAND            ?
        IF(N5CMD = LN)                      _ IF LINE LINK COMMAND     ?
         !(N5CMD = TC)                      _ OR TERMINATE CALL        ?
        THEN
          BEGIN 
_ 
* * * *    GET NUMERIC FIELD AND CONVERT TO INTEGER 
? 
          N5NUMOK := PBFMAH(N5NUM,B1BUFF,FCHARNM);_ CONVERT WORD 18    ?
          N5NUMVAL := N5NUM.B0WORD.BAINT;   _INTEGER VALUE FROM N5NUM  ?
          IF N5CMD = LN                     _ IF LINE COMMAND          ?
          THEN
          N5NUMVAL := N5NUMVAL * $100;      _ SHIFT LINE NO. 8 BITS    ?
  
          IF ^N5NUMOK                       _IF INVALID INTEGER        ?
          THEN
            BEGIN 
            N5SAVE := N5TMPPAR;             _ SET INVALID FIELD        ?
            N5RSNCODE := 1;                 _ SET REASON CODE          ?
            END;
          END;
  
     PBRELCHN(B1BUFF,BEDBSIZE);             _ RELEASE MSG BUFFER       ?
_ 
* * * *    END INITIAL PROCESSING 
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
? 
     WITH B1TCB'.BSTCB DO                   _ WITH TCB FIELDS          ?
      IF N5RSNCODE = RCPRESET               _ IF NO ERRORS SO FAR      ?
        THEN
          IF N5CMD = LN                     _ IF COMMAND IS LN         ?
          THEN
            BEGIN 
            N5SAVE := N5TMPPAR;             _ SET PARAM  2             ?
            PSPRLNCMD(N5RSNCODE,N5NUMVAL,N5SAVE)_ PROCESS LINE LNK CMD ?
            END 
  
          ELSE                              _ NOT LN COMMAND           ?
            IF BSLINK = NIL                 _ IF NTS LINE NOT LINKED   ?
            THEN
              N5RSNCODE := 5                _ SET REASON CODE          ?
            ELSE
              BEGIN 
              N5LCBTCB.BABUFPTR := BSLINK;  _ PNTR TO X25 LCB          ?
              IF ^N5LCBTCB.BALCBP'.BZSLCBPTR'.BZXSLCB.BZHDLCUP
                                            _ IF X25 LINE NOT ACTIVE  ? 
              THEN
                N5RSNCODE := 3              _ SET REASON CODE          ?
              ELSE                          _ LINE LINKED AND ACTIVE   ?
_ 
* * * *   PROCESS OTHER COMMANDS. IC,TC,IM,TM.
? 
  
          CASE  N5CMD OF
_$J+? 
_ 
------------------------------------
CONNECTION TYPE VALID I  Y  I  N  I 
====================================
SET WORK CODE A0ICS   I  X  I     I 
------------------------------------
SET LINE NO.          I  X  I     I 
------------------------------------
SET CONNECT TYPE      I  X  I     I 
------------------------------------
SET WKLSTFLG          I  X  I     I 
------------------------------------
SET REASON CODE       I     I  1  I 
------------------------------------
? 
      IC:                                   _ INITIATE CALL SEQUENCE   ?
  
      BEGIN 
      N5RSNCODE := 1;                       _ SET FOR POSSIBLE ERROR   ?
      FOR I := 1 TO N5MAXCN DO              _ LOOP THRU CN TYPE TABLE  ?
        IF N5TMPPAR = N5CNTYPE[I]           _ IF MATCH FOUND           ?
        THEN
          BEGIN 
          N5RSNCODE := 0;                   _ RESET REASON CODE        ?
          N6CNTYPE  := I;                   _ SET CN TYPE              ?
          N5SAVE := N5TMPPAR;               _ SET PARAM  2             ?
          I         := N5MAXCN;             _ EXIT LOOP                ?
          END;   _ END DO LOOP ?
  
      IF N5RSNCODE = 0                      _ IF CN TYPE VALID         ?
      THEN
        WITH XOPARAMS DO                    _ WITH OUTPUT WKLIST RECORD?
        BEGIN 
        XAWC  := A0ICS;                     _ SET WORK CODE            ?
        XALINO:= N5LCBTCB.BALCBP'.BZLINO;    _ SET LINE NO OF X25 LINE ?
        XACNTYPE:= N6CNTYPE;                _ SET CN TYPE              ?
        N5WKLSTFLG := TRUE;                 _ SET WORKLIST FLAG        ?
        END;  _ WITH XOPARAMS,IF ?
  
      END;    _ IC  ? 
  
_$J+? 
_ 
------------------------------------------
CHANNEL NO. VALID       I   Y   I   N   I 
------------------------------------------
CHANNEL ACTIVE          I Y I N I       I 
==========================================
SET WORK CODE           I X I   I       I 
------------------------------------------
SET LINE NO.            I X I   I       I 
------------------------------------------
SET LCCB PTR.           I X I   I       I 
------------------------------------------
SEND WORKLIST A0TCS     I X I   I       I 
------------------------------------------
SET REASON CODE         I   I 4 I   1   I 
------------------------------------------
------------------------------------------
? 
      TC:                                   _ TERMINATE CALL SEQUENCE  ?
      BEGIN 
      N5CHFOUND := FALSE;                   _ PRESET CHANNNEL FOUND FLG?
     N5RSNCODE := 2;                        _ RESET REASON CODE        ?
     WITH N5LCBTCB.BALCBP'.BZSLCBPTR'.BZXSLCB DO _ WITH X25 LCB FIELDS ?
       BEGIN
       N5LCCB := NIL;                       _ CLEAR POINTER            ?
       N6LCCB := BZFLCCB;                   _ STORE FIRST LCCB POINTER ?
_ 
* * * *   LOCATE LCCB WITH THE REQUIRED CHANNEL NO. 
? 
       REPEAT                               _ LOOP THRU LCCB CHAIN     ?
       IF N6LCCB'.LCCB.LCHN = N5NUMVAL      _ IF CHANNEL MATCHES       ?
       THEN 
         BEGIN
         N5CHFOUND := TRUE;                 _ SET CHANNEL FOUND FLAG   ?
         N5LCCB:= N6LCCB;                   _ SET TO EXIT REPEAT LOOP  ?
         END
       ELSE 
         N6LCCB := N6LCCB'.LCCB.LCNXTLCCB   _ POINT TO NEXT            ?
  
       UNTIL ((N6LCCB = BZFLCCB)            _ UNTIL FOUND OR END OF CHN?
       ! (N5LCCB "NIL));
  
       IF N5CHFOUND                         _ IF CHANNEL FOUND         ?
       THEN 
_ 
* * * *  SET UP WORKLIST
? 
       WITH XOPARAMS DO 
         BEGIN
         XAWC := A0TCS;                     _ SET WORKCODE             ?
         XALINO := N5LCBTCB.BALCBP'.BZLINO; _ SET X25 LINE NO.         ?
         XABFRPTR := N5LCCB;                _ SET LCCB ADRESS          ?
         N5WKLSTFLG := TRUE;                _ SET WORKLIST FLAG        ?
         N5RSNCODE := 0;                    _ RESET REASON CODE        ?
         N5SAVE := N5TMPPAR;                _ SET PARAM 2              ?
         END
       ELSE 
         N5RSNCODE := 2;
       END; 
  
  
      END; _ TC ? 
_$J+? 
  
_ 
------------------------------------------
THIS LINE MONITORED     I   N   I   Y   I 
------------------------------------------
MONITOR COUNT ZERO      I Y I N I       I 
==========================================
SET REASON CODE         I 2 I 0 I   1   I 
------------------------------------------
------------------------------------------
SET N5MONPTR TO TCB     I X I   I       I 
------------------------------------------
LINK TCB TO CHAIN       I   I X I       I 
------------------------------------------
LINK TCB TO ITSELF      I X I   I       I 
------------------------------------------
  
? 
      IM:                                   _ INITIATE MONITOR COMMAND ?
     BEGIN
     IF BSMONPTR = NIL                      _ IF NOT MONITORED         ?
     THEN 
       IF N5MONPTR = NIL                    _ IF NONE MONITORED        ?
       THEN 
         BEGIN
         X25MONFLG := TRUE;                 _MONITOR ENABLED           ?
         N5MONPTR := B1TCB;                 _ POINT TO THIS TCB        ?
         BSMONPTR := B1TCB;                 _ POINT TO ITSELF ALSO     ?
         N5RSNCODE := 2;                    _ SET REASON CODE          ?
         END
       ELSE                                 _ IF ADDING TO MONITOR CHN ?
         BEGIN
         BSMONPTR := N5MONPTR;              _ CHN TO PRESENT FIRST     ?
         N5MONPTR := B1TCB;                 _ MAKE THIS NEW FIRST      ?
         N5RSNCODE := 0;                    _ SET REASON CODE          ?
         END _ ELSE ? 
     ELSE                                   _ IF ALREADY MONITORED     ?
       N5RSNCODE := 1;                      _ SET REASON CODE          ?
  
_ 
* * * *  IF THIS IS FIRST SET UP MONITOR TIMER
? 
      IF N5RSNCODE = 2                      _ IF FIRST TO MONITOR      ?
      THEN
        PSSETTIME;                          _ SET TIMER FOR MONITOR    ?
  
_ 
* * * * IF VALID NEW MONITOR REQUEST SET FLAG IN X25 LCB
? 
      IF N5RSNCODE " 1                      _ IF VALID REQUEST         ?
      THEN
   N5LCBTCB.BALCBP'.BZSLCBPTR'.BZXSLCB.BZMONFLG := TRUE;_ SET MON FLAG ?
  
     END; _ IM ?
  
_ 
LINE MONITORED(BSMONPTR" NIL)    I       Y       I     N     I
--------------------------------------------------------------
FIRST IN QUEUE (N5MONPTR=B1TCB)  I   Y   I   N   I           I
--------------------------------------------------------------
LAST IN QUEUE(BSMONPTR=B1TCB)    I Y I N I Y I N I           I
==============================================================
CLEAR N5MONPTR                   I X I   I   I   I           I
--------------------------------------------------------------
POINT N5MONPTR TO NEXT           I   I X I   I   I           I
--------------------------------------------------------------
LOCATE PREVIOUS IN CHAIN         I   I   I X I X I           I
--------------------------------------------------------------
POINT PREVIOUS TO ITSELF         I   I   I X I   I           I
--------------------------------------------------------------
POINT PREVIOUS TO NEXT           I   I   I   I X I           I
--------------------------------------------------------------
CLEAR BSMONPTR                   I X I X I X I X I           I
--------------------------------------------------------------
SET N5RSNCODE                    I   I   I   I   I     0     I
==============================================================
? 
      TM:                                   _ TERMINATE MONITOR COMMAND?
     BEGIN
     IF BSMONPTR " NIL                      _ IF LINE MONITORED        ?
     THEN 
       BEGIN
       N5RSNCODE := 0;                      _ SET NORMAL REASON CODE   ?
       IF N5MONPTR = B1TCB                  _ IF THIS IS FIRST         ?
       THEN 
_ 
* * * * PROCESS WHEN FIRST IN QUEUE 
? 
         IF BSMONPTR = B1TCB                _ IF THIS IS ALSO LAST     ?
         THEN 
           BEGIN
           X25MONFLG := FALSE;              _MONITOR DISABLED          ?
           N5MONPTR := NIL;                 _ CLEAR MONITOR POINTER    ?
           N5RSNCODE := 2;                  _ONLY ONE LINE MONITORED   ?
           END
         ELSE 
           N5MONPTR := BSMONPTR             _ POINT TO NEXT            ?
       ELSE                                 _ IF NOT FIRST             ?
_ 
* * * *  PROCESS WHEN NOT FIRST IN QUEUE
? 
         BEGIN
_ 
* * * *  LOCATE PREVIOUS TCB IN CHAIN 
? 
         N5LOCPTR := N5MONPTR;              _ POINT LOC PTR TO FIRST   ?
         WHILE N5LOCPTR'.BSTCB.BSMONPTR " B1TCB DO _ WHILE NEXT NOT THI?
           N5LOCPTR := N5LOCPTR'.BSTCB.BSMONPTR;       _ UPDATE POINTER?
_ 
* * * *  N5LOCPTR NOW POINTS TO PREVIOUS IN QUEUE 
? 
         IF BSMONPTR = B1TCB                _ IF LAST                  ?
         THEN 
           N5LOCPTR'.BSTCB.BSMONPTR := N5LOCPTR  _ POINT PREV TO ITSELF?
         ELSE 
          N5LOCPTR'.BSTCB.BSMONPTR := BSMONPTR; _ POINT PREV TO NEXT ?
        END;                                 _ WHEN NOT FIRST IN QUEUE? 
_ 
* * * *     NOW CLEAR THIS TCBS POINTER 
? 
      BSMONPTR := NIL;  _ CLEAR POINTER ? 
  N5LCBTCB.BALCBP'.BZSLCBPTR'.BZXSLCB.BZMONFLG :=FALSE;_SET X25 MON FLG?
      END                                   _ IF LINE MONITORED      ?
    ELSE
      N5RSNCODE := 1;                       _ SET REASON CODE          ?
    END;  _  TM  ?
  END;  _ CASE N5CMD    ? 
END;
_$J+? 
     IF N5RSNCODE " RCPRESET                _ IF INVALID COMMAND       ?
     THEN 
       PSLOPMSG(N5CMD,N5RSNCODE,N5SAVE);    _ SEND LOP MESSAGE         ?
  
     IF N5WKLSTFLG                          _ IF WORKLIST TO SEND      ?
     THEN 
       PBLSPUT(XOPARAMS.XAWORKLIST,BYWLCB[B0XL3]); _ SEND WORKLIST     ?
  
END;  _ PSLPCMD  ?
_$J+? 
  
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*              PNTSD4 MAIN CODE                                      *
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
BEGIN 
XIPARAMS.XAWORKLIST := BWWLENTRY[OPS];
WITH XIPARAMS DO                            _INPUT WORKLIST            ?
  
  BEGIN 
  
  CASE XAWC OF
  
    A0SMEN:                                 _ENABLE LINE               ?
      BEGIN 
      NTSUP    := TRUE;                     _ SET FOR PSEUDO LINES     ?
      PSTELLSVM(C0LINOP); 
      END; _A0SMEN? 
  
    A0SMDA:                                 _DISABLE LINE              ?
      PSTELLSVM(C0LNDA);
  
    A0SMRCTCB:                              _RECONFIGURE TCB           ?
      PSTELLSVM(C0RCTCB); 
  
  
    A0QUEOUT:                               _ OUTPUT IN QUEUE          ?
      BEGIN 
      B1TCB := XABFRPTR;                    _ POINT TO TCB             ?
  
      WITH B1TCB'.BSTCB DO                  _ WITH TCB FIELDS DO       ?
        BEGIN 
        XSWK.BAINT := 0;
  
        WHILE(BSQPTR.BABUFPTR " NIL ) DO    _ WHILE MORE BLOCKS IN Q   ?
          BEGIN 
          XDLBLOCK := NIL;                  _CLEAR DOWNLINE DATA PTR   ?
          PBQUEMAINT(B1TCB, XDLBLOCK, 0, 0);_GET DOWNLINE DATA         ?
          B1BUFF   := XDLBLOCK; 
  
          IF B1BUFF'.BFINTBLK               _ IF INTERNAL BLK(LOP MSG) ?
          THEN
_ 
* * * *  PROCESS INTERNAL BLOCK 
? 
            IF BSLOGGED                     _ IF LINE LOGGED IN        ?
            THEN
              PSLPCMD                       _ PROCESS LOP COMMAND      ?
            ELSE
              PBRELCHN(B1BUFF,BEDBSIZE)     _ DISCARD IF NOT LOGGED IN ?
          ELSE
_ 
* * * *  PROCESS EXTERNAL BLOCK 
? 
            BEGIN 
            PBRELCHN(B1BUFF,BEDBSIZE);      _ RELEASE BUFFERS          ?
            IF ^BSLOGGED                    _ IF   NOT   LOGGED IN     ?
            THEN
            BSLOGGED := TRUE;               _ SET LOGGED IN FLAG       ?
            END;                            _ EXTERNAL BLOCKS          ?
          END;                              _ WHILE MORE BLOCKS        ?
  
        END; _ WITH ? 
      END;  _ A0QUEOUT    ? 
  
_ 
******************************************************************* 
******************  PROCESS UPLINE WORKLISTS  ********************* 
******************************************************************* 
? 
    L2OUTPUT:                               _LEVEL 2 FRAME             ?
      BEGIN 
      PBLCBP(XALINO.BDLINO,XSLCB);          _ACQUIRE LCB POINTER       ?
      B1TCB := XSLCB'.BZTCBPTR; 
      IF B1TCB " NIL THEN                   _DISCARD IF DOWN           ?
        BEGIN 
      B1BUFF := XABFRPTR; 
      B1BT := HTMSG;
_ 
* * * *  INSERT DATA BLOCK CLARIFIER
* * * *  TRANSPARENT DATA IS USED 
? 
      XNOBFPTR := PBGET1BF(BEDBSIZE); 
      WITH XNOBFPTR' DO 
        BEGIN 
        BFDATAC[12] := CHR(4);              _DBC                       ?
        BFFCD := 12;                        _LEAVE SPACE               ?
        BFLCD := 12;                        _FOR DN/SN/CN/BT           ?
        BCCHAINS[DBUFLENGTH] := B1BUFF; 
        END; _WITH XNOBFPTR?
      B1BUFF := XNOBFPTR; 
      WITH  B1TCB'.BSTCB, BSFLGWRD  DO
        BEGIN 
        BSINPBUF := B1BUFF;                 _SET UP UNLINE DATA        ?
        KTIGNRCN := FALSE;                  _IGNOR CANCEL              ?
        KTSEND   := TRUE;                   _SEND THIS DATA TO HOST    ?
        KTCKSP   := TRUE;                   _CHECK FOR SPECIAL         ?
        KTBLKT   := HTMSG;                  _MSG TYPE BLOCK            ?
_ 
        * * *  CALL UPLINE TIP SERVICE  * * * 
? 
        PBULTS(B1TCB);
  
        KTWORD   := 0;                      _CLEAR BIP FLAG WORD       ?
        END;  _ WITH BSTCB, BSFLGWRD ?
  
      XOPARAMS.XAWC := MMOBUX;
      XOPARAMS.XALINO := X25LINO; 
      XOPARAMS.XABFRPTR := XABFRPTR;
      PBLSPUT(XOPARAMS.XAWORKLIST,BYWLCB[B0XL2]); 
      END; _B1TCB " NIL?
      END; _L2OUTPUT? 
  
    MMOBUX:                                 _OUTPUT TRANSMITTED        ?
      BEGIN 
_ 
* * * *  NO RESPONSE AS MMOBUX NOT EXPECTED 
? 
      END; _MMOBUX? 
  
  
_ 
******************************************************************* 
******************  PROCESS MONITOR WORKLISTS ********************* 
******************************************************************* 
? 
      MONOUT:                               _ MONITOR OUTPUT FROM X.25 ?
        BEGIN 
      B1TCB := N5MONPTR;
      IF B1TCB " NIL THEN                   _DISCARD IF DOWN           ?
        BEGIN 
      B1BUFF := XABFRPTR; 
      B1BT := HTMSG;
      WITH  B1TCB'.BSTCB, BSFLGWRD  DO
        BEGIN 
        BSINPBUF := B1BUFF;                 _SET UP UNLINE DATA        ?
        KTIGNRCN := FALSE;                  _IGNOR CANCEL              ?
        KTSEND   := TRUE;                   _SEND THIS DATA TO HOST    ?
        KTCKSP   := TRUE;                   _CHECK FOR SPECIAL         ?
        KTBLKT   := HTMSG;                  _MSG TYPE BLOCK            ?
_ 
        * * *  CALL UPLINE TIP SERVICE  * * * 
? 
        PBULTS(B1TCB);
  
        KTWORD   := 0;                      _CLEAR BIP FLAG WORD       ?
        END;  _ WITH BSTCB, BSFLGWRD ?
      END;  _ IF B1TCB " NIL ?
      END;  _ MONOUT    ? 
  
      MONTIM:                               _ TIMEOUT WORKLIST RECEIVED?
        BEGIN 
        IF (N5MONPTR " NIL)   &             _MONITORING LINE           ?
           (PBBFAVAIL(3,BEDBSIZE,B0TH3LV))
        THEN
          BEGIN 
          PSX25MON;                         _ MONITOR X.25 TIP         ?
  
          N6MONPTR := N5MONPTR;             _ SET POINTER TO TCB FOR   ?
                                            _ FIRST MONITORED LINE     ?
          REPEAT                            _ LOOP THRU MONITORED LINES?
          N4MONPTR := N6MONPTR;             _ UPDATE N4 POINTER        ?
  
          PSLINMON(N4MONPTR);               _ MONITOR  ASSOCIATED LINE ?
          N6MONPTR := N4MONPTR'.BSTCB.BSMONPTR;   _ POINT TO NEXT TCB  ?
          UNTIL N6MONPTR = N5MONPTR;        _ UNTIL BACK AT START      ?
          PSSETTIME;                        _ SEND TIMER WORKLIST      ?
          END;
        END; _ MONTIM   ? 
  
_ 
******************************************************************* 
*****************  PROCESS RESPONSE WORKLISTS ********************* 
******************************************************************* 
? 
  
      C0ICS:                                _ RESPONSE TO A0ICS        ?
        BEGIN 
_ 
* * * * SET VARIABLES FOR LOP COMMAND 
? 
        N5CMD := IC;                        _ SET COMMAND CODE         ?
        N5SAVE := XATCBLCCB'.LCCB.LCHN;     _ CHANNEL NO.              ?
_ 
* * * *  SET REASON CODE
? 
        IF XAFLG2 
        THEN
          IF XAFLG1 
          THEN
            N5RSNCODE := 6                  _CALL REJECTED CLR REQ     ?
          ELSE
            N5RSNCODE := 4                  _ CHANNEL NOT AVAILABLE    ?
        ELSE
          N5RSNCODE := 0;                   _NORMAL RESPONSE           ?
  
        PSLOPMSG(N5CMD,N5RSNCODE,N5SAVE);   _ SEND MESSAGE             ?
        END;
  
      C0TCS:                                _ RESPONSE TO A0TCS        ?
       BEGIN
_ 
* * * *  SET VARIABLES FOR LOP COMMAND
? 
       N5CMD := TC;                         _ SET COMMAND CODE         ?
       N5SAVE := XATCBLCCB'.LCCB.LCHN;      _ SET CHANNEL NO.          ?
       N5RSNCODE := 0;                      _ SET REASON CODE          ?
  
       PSLOPMSG(N5CMD,N5RSNCODE,N5SAVE);    _SEND MESSAGE              ?
       END; 
  
  
    END; _CASE XAWC?
  END; _WITH XIPARAMS, B1TCB'.BSTCB?
END; _PROCEDURE PNTSD4? 
