*COMDECK PTLINIT
_$J+? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*                   P T L I N I T                                     * 
*                                                                     * 
*         LINE INITIALIZER                                            * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_$R-,G-,I-? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW  - THIS PROCEDURE INITIALIZES A LINE FOR USE BY THE       * 
*              APPROPRIATE TERMINAL INTERFACE PROGRAM (TIP). THE      * 
*              CLA MUST BE TURNED ON, A HOST AVAILABLE, SUPERVISION   * 
*              AVAILABLE *CS*, NOT IN SEVERE BUFFER REGULATION AND    * 
*              *DSR* SIGNAL MUST BE PRESENT BEFORE THE LINE IS TURNED * 
*              OVER TO A TIP. PTLINIT ALSO PERFORMS SYNC AUTO REC.    * 
*              FOR HASP/BSC/MODE4 HARDWIRED/SWITCHED TYPE LINES.      * 
*              PTLINIT DOES NOT KEY OFF THE RING INDICATOR *RI* SIGNAL* 
*              FOR SWITCHED LINES, *DTR* IS PUT UP ON SWITCHED LINES  * 
*              IF A HOST/SUPERVISION/REGULATION NOT SEVERE SITUATION  * 
*              IS PRESENT. CONVERSELY *DTR* IS DROPPED WHEN ONE OF THE* 
*              ABOVE IS LOST.                                         * 
*                                                                     * 
** INPUT(S)  - WORKLISTS FOR SERVICE MODULE                           * 
*                *A0SMEN*   - ENABLE LINE                             * 
*                *A0SMDA*   - DISABLE LINE                            * 
*                *A0SMNH*   - NOHOST/SUPEVISION PRESENT               * 
*            - WORKLISTS FROM MUX SYSTEM                              * 
*                *MMHARDERR* - HARD ERROR ON LINE                     * 
*                *A0TIMEOUT* - TIMEOUT ON LINE TIMER                  * 
*                *MMCLAS*    - STATUS FROM CLA                        * 
*            - WORKLISTS FROM SYNC-AUTO INPUT STATES                  * 
*                *LSOHENQ*/*LENQ*/*LACK*/*LWACK*/*LNAK*               * 
*                                                                     * 
**OUTPUT(S)  - *A0SMEN* TO TIPS(S)                                    * 
*              *A0SMDA* TO SVM                                        * 
*                                                                     * 
** EXTERNAL SUBROUTINES -                                             * 
*            - PBCOIN        - LAUNCH COMMAND TO MUX                  * 
*            - PBLSPUT       - PUT WORKLIST ENTRY                     * 
*            - RETURN        - RETURN TO ADDRESS                      * 
*            - ADDR          - GET ADDRESS                            * 
*            - PBLCBP        - GET LCB ADDRESS                        * 
*            - PBPUTYP       - PUT WORKLIST TO TIP TYPE               * 
*            - PNACCHOST     - CHECK HOST AVAILIBILITY                * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PTLINIT;
  
LABEL 
  999;
  
CONST 
  
  L0SEC      = 0;                           _STOP TIMER                ?
  LHSEC      = 1;                           _HALF SECOND TIMER         ?
  LRSEC      = 2;                           _REAL ONE SECOND TIMER     ?
  L1SEC      = 3;                           _1 SEC DELAY               ?
  L3SEC      = 7;                           _3 SEC DELAY               ?
  L5SEC      = 11;                          _5 SEC DELAY               ?
  L6SEC      = 13;                          _6 SEC DELAY               ?
  L15SEC     = 31;                          _15 SEC DELAY              ?
  L30SEC     = 61;                          _30 SEC DELAY              ?
  L40SEC     = 81;                          _40 SEC DELAY              ?
  
  LHASPRETRY = 1;                           _TIMES TO AUTO-REC HASP    ?
  LBSCRETRY  = 2;                           _TIMES TO AUTO-REC BSC     ?
  
  LSOHENQ    = A0WK1;                       _HASP - SOH ENQ RECEIVED   ?
  LENQ       = A0WK2;                       _BSC  - ENQ RECEIVED       ?
  LACK0      = A0WK3;                       _     - ACK0 RECEIVED      ?
  LWACK      = A0WK4;                       _     - WACK RECEIVED      ?
  LNAK       = A0WK5;                       _     - NAK RECEIVED       ?
  LTERMIO    = A0WK6;                       _TERMINATE INPUT/OUTPUT    ?
  LREPEAT    = A0WK7;                       _REPEAT LINE INITIALIZATION?
  
  LISTAI     = 4;                           _SYNC-AUTO INPUT STATE     ?
  
VAR 
  LIDBGI     : INTEGER;                     _INDEX TO NEXT WORKLIST    ?
  LIDBGA     : ARRAY [0..24] OF BWTIPWLE;   _SAVED WORKLIST ENTRY ARRAY?
  LILCBP     : BZLCBP;                      _CURRENT LINE POINTER      ?
  LIWKCODE   : INTEGER;                     _CURRENT WORKCODE          ?
  LICMDPKT   : NKINCOM;                     _COMMAND PACKET            ?
  LILINO     : INTEGER;                     _LINE NUMBER               ?
  I          : INTEGER;                     _LOOP CONTROL              ?
_ 
** PROCEDURE NAME - P T 2 S E T T I M E R 
* 
** OVERVIEW       - THIS PROCEDURE IS CALLED TO SET THE LINE TIMER
*                   WITH THE PASSED VARIABLE. THE LINE WAIT COUNT,
*                   *BZWTCOUNT* IS ALSO BUMPED. 
* 
** INPUT(S)       - STATE  - NEW LINE STATE 
*                   TIME   - TIMER VALUE IN 1/2 SECOND INCREMENTS 
*                   LILINO - LINE NUMBER PASSED VIA LEVEL 1 VARIABLES 
? 
PROCEDURE PT2SETTIMER (STATE : INTEGER; TIME : INTEGER);
  
BEGIN 
LILCBP'.BZSTATE   := STATE;                 _NEW LINE TO NEW STATE     ?
LILCBP'.BZWTCOUNT := LILCBP'.BZWTCOUNT + 1; _BUMP WAIT COUNT           ?
BLTIMTBL'[LILINO].BLTIME :=TIME;            _SET LINE TIMER            ?
END;
_ 
** PROCEDURE NAME - P T 2 C P K T 
* 
** OVERVIEW       - THIS PROCEDURE CLEARS 3 WORDS OF COMMAND
*                   PACKET. 
* 
**
? 
PROCEDURE PT2CPKT;
  
BEGIN 
LICMDPKT.NKWD2.BAINT := 0;
LICMDPKT.NKWD3.BAINT := 0;
LICMDPKT.NKWD4.BAINT := 0;
END; _ PT2CPKT ?
_ 
** PROCEDURE NAME - P T 2 T E R M I O 
* 
** OVERVIEW       - THIS PROCEDURE IS CALLED TO TERMINATE OUTPUT/ 
*                   INPUT ON A SPECIFIC LINE AND SETS UP THE LINE 
*                   TO RETURN CONTROL AFTER THE TERMINATE INPUT 
*                   IS COMPLETED. 
* 
** INPUT(S)       - LILCBP   - *GLOBL$* LINE POINTER
*                   LICMDPKT - LEVEL 1 MUX COMMAND PACKET 
* 
** SPECIAL NOTE   - THIS PROCEDURE DOES NOT RETURN TO IT'S CALLER.
*                 - MODEM STATE CHANGED TO *MSTIDL* 
? 
PROCEDURE PT2TERMIO;
  
BEGIN 
RETADR (LILCBP'.BZRET2ADDR);                _SAVE ADDRESS OF CALLER    ?
LILCBP'.BZRET1ADDR := 0;                    _CLEAR *PT2IO* RETURN ADDR ?
LILCBP'.BZWTCOUNT := LILCBP'.BZWTCOUNT + 1; _BUMP CONTENTION COUNT     ?
PT2CPKT;                                    _CLEAR PACKET              ?
LICMDPKT.NKWKFLG  := FALSE;                 _NO WORKCODE REQUIRED      ?
LICMDPKT.NKRELBFS := FALSE;                 _DO NOT RELEASE OUTPUT BFR ?
LICMDPKT.NKCMD    := NKENDOT;               _TERMINATE OUTPUT COMMAND  ?
PBCOIN (LICMDPKT);                          _LAUNCH COMMAND TO MUX     ?
PT2CPKT;                                    _CLEAR PACKET              ?
LICMDPKT.NKWKFLG  := TRUE;                  _WORKCODE REQUIRED ON INPUT?
LICMDPKT.NKWKCODE := LTERMIO;               _WORKCODE TO RECEIVE       ?
LICMDPKT.NKWLINDX := B0LIWL;                _WORKLIST INDEX            ?
LICMDPKT.NKCMD    := NKENDIN;               _TERMINATE INPUT COMMAND   ?
PBCOIN (LICMDPKT);                          _LAUNCH COMMAND TO MUX     ?
GOTO EXIT 999;                              _EXIT PDQ                  ?
END; _ PROCEDURE PT2TERMIO ?
_ 
** PROCEDURE NAME - P T 2 I O 
* 
** OVERVIEW       - THIS PROCEDURE ISSUES INPUT/INPUT AFTER OUTPUT
*                   COMMANDS TO THE MUX SUB-SYSTEM FOR SYNC AUTO- 
*                   REC TYPE LINES. 
* 
** INPUT          - COMMAND TO SEND TO MUX
* 
** SPECIAL NOTE   - THIS PROCEDURE DOES NOT RETURN TO IT'S CALLER 
? 
PROCEDURE PT2IO (COMMAND : INTEGER);
  
BEGIN 
RETADR (LILCBP'.BZRET1ADDR);                _SAVE CALLER(S) RETURN     ?
LILCBP'.BZRET2ADDR := 0;                    _CLEAR PT2TERMIO RETURN    ?
LICMDPKT.NKCMD   := COMMAND;                _COMMAND TO MUX            ?
LICMDPKT.NKRPRT  := TRUE;                   _STRIP PARITY              ?
LICMDPKT.NKISTAI := LISTAI;                 _INPUT STATE SYNC-AUTO     ?
PBCOIN (LICMDPKT);                          _LAUNCH COMMAND TO MUX     ?
GOTO EXIT 999;                              _EXIT PDQ - AWAIT WORKCODE ?
END; _ PROCEDURE PT2IO ?
_ 
** PROCEDURE NAME - P T 2 C N T R L 
* 
** OVERVIEW       - THIS PROCEDURE IS USED BY SYNC AUTO-REC TYPE LINES
*                   TO CHANGE THE DEFAULT TERMINAL CLASS AND RESET THE
*                   CLA WITH THE APPROPRIATE SYN CHARACTER. 
* 
** INPUT          - NONE
? 
PROCEDURE PT2CNTRL; 
  
BEGIN 
PT2CPKT;                                    _CLEAR PACKET              ?
LICMDPKT.NKCMD  := NKCONTROL;               _CONTROL COMMAND           ?
LICMDPKT.NKTCLS := BJTIPTYPE[LILCBP'. 
                   BZSVTIPTYPE].BJDFTC;     _DEFAULT TERMINAL CLASS    ?
PBCOIN (LICMDPKT);
END; _ PROCEDURE PT2CNTRL ? 
_ 
** PROCEDURE NAME - P T 2 S T A T U S 
* 
** OVERVIEW       - THIS PROCEDURE IS CALLED TO TURN ISON ON THE LINE.
* 
** INPUT(S)       - LICMDPKT - LEVEL 1 COMMAND PACKET 
*                   LILCBP   - LINE CONTROL BLOCK POINTER 
* 
** EXTERNAL SUBROUTINES - 
*                   PBCOIN - MUX COMMAND PROCESSOR
* 
** SPECIAL NOTE   - MODEM STATE NOT CHANGED 
? 
PROCEDURE PT2STATUS;
BEGIN 
PT2CPKT;
LICMDPKT.NKCMD       := NKSTATUS; 
PBCOIN (LICMDPKT);                          _CALL MUX SUBSYSTEM        ?
END; _ PT2STATUS ?
_ 
** PROCEDURE NAME - P T 2 I S R 
* 
** OVERVIEW       - THIS PROCEDURE IS CALL TO ISSUE AN ISR REQUEST TO 
*                   THE MUX SUBSYSTEM.  STATUS SHOULD BE RETURNED 
*                   WHEN ISON IS ON.
* 
** INPUT          - NONE. 
* 
**
? 
PROCEDURE PT2ISR(INDEX:INTEGER);
  
BEGIN 
PT2CPKT;
LICMDPKT.NKCMD   := NKISR;                  _ISR REQUEST               ?
LICMDPKT.NKNSTA := INDEX;                   _SET INDEX AS INDICATED    ?
PBCOIN (LICMDPKT);                          _ISSUE REQUEST TO MUX      ?
END; _ PT2ISR ? 
_ 
** PROCEDURE NAME - P T 2 P A S S 
* 
** OVERVIEW       - THIS PROCEDURE IS CALLED TO PASS THE LINE 
*                   THE TIP.
* 
**
? 
PROCEDURE PT2PASS;
  
BEGIN 
LOCK;                                       _CHECK MODEMSTATES         ?
IF NAPORT'[LILINO].NAMSI " MSTERR           _IF NO ERROR               ?
THEN
  BEGIN 
  BWWLENTRY[OPS].CMSMLEY.CMWKCODE := A0SMEN; _NOTIFY THE TIP           ?
  LILCBP'.BZTIPTYPE := LILCBP'.BZSVTIPTYPE; _RESTORE TIP TYPE          ?
  PBPUTYP(BWWLENTRY[OPS]);                  _PASS LINE TO TIP          ?
  PT2CPKT;                                  _CLEAR PACKET              ?
  LICMDPKT.NKCMD  :=  NKINIL;               _IDLE LINE                 ?
  LICMDPKT.NKLTYP  :=  LILCBP'.BZLTYP;      _PASS LINE TYPE            ?
  LICMDPKT.NKMDMST := N4IDL;                _MODEM STATE TO IDLE       ?
  PBCOIN(LICMDPKT);                         _CALL MUX SUBSYSTEM        ?
  UNLOCK;                                   _UNLOCK INTERRUPTS         ?
  PT2ISR(MSTIDL);                           _FORCE STATUS              ?
  PT2SETTIMER (LTIP,L0SEC);                 _CHANGE STATE              ?
  END 
ELSE
  UNLOCK;                                   _ALLOW INTERRUPTS          ?
GOTO EXIT 999;
END; _ PT2PASS ?
_ 
** PROCEDURE NAME - P T 2 E N A B L E 
* 
** OVERVIEW       - THIS PROCEDURE IS CALLED TO ENABLE A LINE.
* 
** INPUT(S)       - LICMDPKT - LEVEL 1 COMMAND PACKET 
*                   LILCBP   - *GLOBL$* LINE CONTROL BLOCK POINTER
* 
** EXTERNAL SUBROUTINES - 
*                 - PBCOIN - MUX COMMAND PROCESSOR
* 
** SPECIAL NOTE   - MODEM STATE CHANGED TO *MSTENB* 
? 
PROCEDURE PT2ENABLE;
  
BEGIN 
LICMDPKT.NKCMD  := NKENBL;                  _ENABLE COMMAND TO MUX     ?
PT2CPKT;                                    _CLEAR PACKET WORDS 2, 3, 4?
LICMDPKT.NKTCLS := BJTIPTYPE[LILCBP'.BZSVTIPTYPE] 
                            .BJDFTC;        _DEFAULT TERMINAL CLASS    ?
PBCOIN (LICMDPKT);                          _LAUNCH COMMAND TO MUX     ?
END; _ PROCEDURE PT2ENABLE ?
_ 
** PROCEDURE NAME - P T 2 D I S A B L E 
* 
** OVERVIEW       - THIS PROCEDURE DISABLED A LINE AND MAKES A WORKLIST 
*                   TO THE SERVICE MODULE.
* 
** INPUT(S)       - *D5DISA* OR *D5INOP* - REASON FOR DISABLING LINE
*                 - LEVEL 1 VARIABLES 
*                     - LICMDPKT - COMMAND PACKET 
* 
** EXTERNAL SUBROUTINES - 
*                 - PBCOIN  - MUX COMMAND PROCESSOR 
*                 - PBLSPUT - MAKE WORKLIST ENTRY 
? 
PROCEDURE PT2DISABLE (DATA : INTEGER);
  
BEGIN 
PT2CPKT;                                    _CLEAR PACKET              ?
LICMDPKT.NKCMD := NKDISL;                   _DISABLE COMMAND TO MUX    ?
PBCOIN (LICMDPKT);                          _LAUNCH COMMAND            ?
BWWLENTRY[OPS].CMSMLEY.CMDATA   := DATA;    _*D5DISA* OR *D5INOP*      ?
BWWLENTRY[OPS].CMSMLEY.CMWKCODE := D0LINE;  _LINE EVENT WORKCODE       ?
IF (DATA = D5DISA) !                        _ONLY SEND IF DISABLE      ?
   (LILCBP'.BZCNFST " C7DOWN)               _OR ACTUAL CHANGE IN STATUS?
THEN
  PBLSPUT (BWWLENTRY[OPS],BYWLCB[B0SMWL]);  _NOTIFY SVM                ?
END; _ PROCEDURE PT2DISABLE ? 
_ 
** FUNCTION NAME  - P T 2 C H K T I P 
* 
** OVERVIEW       - THIS FUNCTION DETERMINES IF A TIP IS PRESENT
*                   IN THE SYSTEM.
* 
** INPUT(S)       - TIP WORKLIST INDEX
*                   TIP TYPE
* 
** OUTPUT         - TRUE IF TIP PRESENT 
* 
** LEVEL 2 SUBROUTINE - 
*                 - PT2CNTRL     - RESET CLA WITH SYNC CHARACTER
? 
FUNCTION PT2CHKTIP (L0WLINDX, L0TIP : INTEGER): BOOLEAN;
  
BEGIN 
PT2CHKTIP := FALSE;                         _ASSUME TIP NOT PRSENT     ?
IF BYWLCB[L0WLINX].BYPRADDR " 0             _IF TIP PRESENT            ?
THEN
  IF LILCBP'.BZRET2ADDR = 0                 _IF TERMIO NOT ACTIVE      ?
  THEN
    BEGIN 
    PT2CHKTIP := TRUE;                      _RETURN TRUE               ?
    LILCBP'.BZSVTIPTYPE := L0TIP;           _CHANGE DEFAULT TIP TYPE   ?
    BLTIMTBL'[LILINO].BLTRESET := L3SEC;    _SET OUTPUT TIMER          ?
    PT2CNTRL; 
    END;
END; _ FUNCTION PT2CHKTIP ? 
_ 
** PROCEDURE NAME - P T 2 R T U R N 
* 
** OVERVIEW       - THIS PROCEDURE RETURN(S) TO PASSED ADDRESS
* 
** INPUT          - ADDRESS TO RETURN TO *PT2TERMIO* OR *PT2IO* CALLER
? 
PROCEDURE PT2RTURN (VAR ADDRESS : INTEGER); 
  
BEGIN 
IF ADDRESS " 0                              _IF VALID RETURN ADDRESS   ?
THEN
  RETURN (ADDRESS);                         _RETURN TO CALLER          ?
ADDRESS := 0;                               _CLEAR RETURN ADDRESS      ?
END; _ PROCEDURE PT2RTURN ? 
_ 
** PROCEDURE NAME - P T 2 R E S O U R C E 
* 
** OVERVIEW       - THIS PROCEDURE IS CALLED TO CHECK IF RESOURCES ARE
*                   ARE AVAILABLE TO ENABLE THE LINE. 
* 
** INPUTS - NONE
* 
** EXTERNAL SUBROUTINES - PNACCHOST - CHECK IF HOST IS ACCESSIBLE 
* 
? 
PROCEDURE PT2RESOURCE;
BEGIN 
IF PNACCHOST (0)                            _IF HOST(S) AVAILABLE      ?
THEN
  IF CS " 0                                 _AND SUPERVISION PRESENT   ?
  THEN
    IF NPUREG \ 2                           _AND NOT IN REGULATION     ?
    THEN
      BEGIN 
      IF LILCBP'.BZLTYP = N0LA              _IF LINE TYPE A            ?
      THEN
        PT2STATUS;                          _TURN ISON ON FIRST        ?
      PT2ENABLE;                            _ENABLE DTR + ISON         ?
      PT2SETTIMER(LENABL,L1SEC);            _WAIT FOR RESPONSE.        ?
      GOTO EXIT 999                         _EXIT PTLINIT AND WAIT     ?
      END;
PT2SETTIMER (LWRESO,L40SEC);                _WAIT FOR RESOURCES        ?
END; _ PT2RESOURCE ?
_ 
** PROCEDURE NAME - P T 2 R E T R Y 
* 
** OVERVIEW       - THIS PROCEDURE WILL DISABLE AND RETRY THE LINE. 
* 
? 
PROCEDURE PT2RETRY; 
  
BEGIN 
PT2DISABLE (D5INOP);                        _DISABLE THE LINE          ?
PT2SETTIMER(LRETRY,L5SEC);                  _RETRY IN 5 SECONDS        ?
END; _ PT2RETRY ? 
_ 
** PROCEDURE NAME - P T 2 R E P E A T 
* 
** OVERVIEW       - THIS PROCEDURE DISABLES THE LINE AND
*                 - RETRIES THE LINE WITHOUT NOTIFYING
*                 - THE SERVICE MODULE. 
* 
** INPUTS         - NONE. 
* 
** EXTERNAL SUBROUTINES - NONE. 
* 
? 
PROCEDURE PT2REPEAT;
BEGIN 
PT2CPKT;                                    _CLEAR PACKET              ?
LICMDPKT.NKCMD  :=  NKDISL;                 _DISABLE COMMAND           ?
PBCOIN (LICMDPKT);                          _ISSUE COMMAND             ?
PT2SETTIMER (LRETRY,L5SEC);                 _SET STATE TO RETRY        ?
END;  _ PROCEDURE PT2REPEAT ? 
_ 
** PROCEDURE NAME - P T 2 T E S T 
* 
** OVERVIEW       - TEST IF DSR IS RETURNED 
* 
**
? 
PROCEDURE PT2TEST;
BEGIN 
WITH BWWLENTRY[OPS].B0EWLQ DO 
  BEGIN 
  IF MMSCI = M0DSR                          _IF DSR                    ?
  THEN
    BEGIN 
    NAPORT'[LILINO].NACRC := 0;             _INITIALIZE COUNTER        ?
    PT2SETTIMER (LWSIGNALS,L30SEC);         _WAIT FOR OTHER SIGNALS    ?
    END  _ IF MMSCI = M0DSR ? 
  ELSE
    BEGIN 
    IF MMSCI =M0RING                        _IF RING SET TIMER         ?
    THEN
      PT2SETTIMER (LWDSR,L30SEC); 
    END; _ ELSE MMSCI = M0DSR ? 
  END; _ WITH BWWLENTRY ? 
END; _ PT2TEST ?
_$J+? 
_ 
* * * *  S  T  A  R  T      P  T  L  I  N  I  T 
? 
BEGIN 
LIDBGA[LIDBGI] := BWWLENTRY[OPS].B0TIPWLE;  _SAVE WORKLIST ENTRY       ?
LIDBGI         := (LIDBGI + 1) MOD 25;      _UPDATE INDEX INTO ARRAY   ?
WITH BWWLENTRY[OPS].B0EWLQ DO               _USING MUX ARRAY DEFINITION?
  BEGIN 
  LICMDPKT.NKWD0.BAINT  := 0;               _CLEAR FIRST WORD OF PKT   ?
  LIWKCODE := MMWKCODE;                     _GET WORKCODE              ?
  LICMDPKT.NKLINO := MMLINO;                _PUT LINE INTO COMMAND PKT ?
  PBLCBP (MMLINO,LILCBP);                   _GET ADDRESS OF LINE       ?
  LILINO   := MMPORT;                       _GET LINE NUMBER           ?
  END; _ WITH BWWLENTRY[OPS]... ? 
IF LIWKCODE = A0SMNH                        _IF LOST HOST OR BUFFER(S) ?
THEN
  BEGIN 
  PT2CPKT;                                  _CLEAR PACKET              ?
  FOR I := C0NPBL+1 TO C4LCBS DO
    BEGIN 
    ADDR (CGLCBP'[I],LILCBP);               _GET LINE ADDRESS          ?
    IF LILCBP'.BZTIPTYPE = N0LINIT          _IF INITIALIZER HAS LINE   ?
    THEN
      IF LILCBP'.BZSWLINE                   _AND A SWITCHED LINE       ?
      THEN
        IF (LILCBP'.BZSTATE =LWDSR) !       _AND WAITING DSR           ?
          (LILCBP'.BZSTATE = LENABL)
        THEN
          BEGIN 
          LICMDPKT.NKLINO := I * $100;      _LINE NUMBER               ?
          LILINO          := I;             _USED BY *PT2SETTIMER*     ?
          LICMDPKT.NKCMD  := NKDISL;        _DROP *DTR* TO MODEM       ?
          PBCOIN (LICMDPKT);                _LAUNCH TO MUX SYSTEM      ?
          PT2SETIMER(LRETRY,L5SEC);         _RETRY IN 5 SECOINDS       ?
          END; _ BZSTATE = LCLARDY ?
    END; _ FOR I... ? 
  GOTO 999;                                 _ EXIT PDQ                 ?
  END; _ LIWKCODE = A0SMNH ?
WITH LILCBP' DO                             _USING LINE POINTER        ?
  BEGIN 
  IF BZSTATE = LTIP                         _IF LINE  IS NOT OURS      ?
  THEN                                      _ACCEPT ANY WORKCODES      ?
    IF LIWKCODE " A0SMEN                    _EXCEPT ENABLE LINE        ?
    THEN
      BEGIN 
      IF BZTIPTYPE " N0LINIT                _IF NOT UNDER CONTROL      ?
      THEN
        PBPUTYP (BWWLENTRY[OPS]);           _PASS WORKCODE TO TIP      ?
      GOTO 999;                             _EXIT PDQ                  ?
      END;
  IF LIWKCODE " A0TIMEOUT                   _IF NOT TIMEOUT            ?
  THEN
    BZWTCOUNT  := BZWTCOUNT + 1;            _INCREMENT TIMER CHECK     ?
  BLTIMTBL'[LILINO].BLTIME := 0;            _KILL ANY TIMERS           ?
_ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                      *
*     PROCESS WORKLIST ENTRIES ON WORK CODE                            *
*                                                                      *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ? 
  CASE LIWKCODE OF                          _PROCESS ON WORK CODE      ?
  
_ 
****  CLA STATUS RECEIVED 
? 
    MMCLAS:                                 _CLA STATUS RETURNED       ?
  
      CASE BZSTATE OF                       _PROCESS ON STATE          ?
  
        LWCLAON:                            _WAITING CLA ON STATUS     ?
          PT2RESOURCE;                      _TRY TO ENABLE             ?
  
        LENABL:                             _ENABLING THE LINE         ?
  
          BEGIN 
          WITH BWWLENTRY[OPS].B0EWLQ DO 
            BEGIN 
            IF MMSCI = M0NDSR               _IF NO DSR, WAIT ON DSR    ?
            THEN
              PT2SETTIMER (LWDSR,L0SEC)     _STOP TIMER, ISON ON       ?
            ELSE
              BEGIN 
              PT2TEST                       _CHECK DSR                 ?
              END; _ ELSE MMSCI = MODSR ? 
            END; _ WITH BWWLENTRY ? 
          END; _ LEANBL ? 
  
        LWDSR:                              _WAITING FOR DSR RESPONSE  ?
          PT2TEST;                          _CHECK DSR                 ?
  
        LWSIGNALS:                          _WAIT FOR OTHER SIGNALS    ?
          WITH BWWLENTRY [OPS].B0EWLQ DO
            BEGIN 
            IF MMSCI = M0NALL               _IF NOT ALL SIGNALS        ?
            THEN
                BEGIN 
                WITH NAPORT'[LILINO] DO 
                  BEGIN 
                  IF NACRC  < 3             _IF A REASONABLE TIME      ?
                  THEN
                    PT2SETTIMER (LCSIGNALS,L1SEC)  _WAIT 1.25 SECONDS  ?
                  ELSE
                    BEGIN 
                    IF NACRC  < 8 
                    THEN
                      BEGIN 
                      PT2SETTIMER (LCSIGNALS,L5SEC) _ELSE WAIT 5 SECOND?
                      END 
                    ELSE
                      PT2SETTIMER (LCSIGNALS,L30SEC) _WAIT 30 SECONDS  ?
                    END 
                  END _ WITH NAPORT'[LILINO] ?
                END  _ IF SCI = M0NALL ?
            ELSE
              IF MMSCI = M0ALL              _OTHERWISE, IF ALL SIGNALS ?
              THEN                          _PRESENT, WAIT 1.5 SECONDS ?
                BEGIN 
                PT2SETTIMER (LCSTABLE,L1SEC);_SEE IF STILL THERE       ?
                NAPORT'[LILINO].NACRC := 0  _KILL COUNTER              ?
                END 
            END; _ WITH BWWLENTRY ? 
  
        LSTABLE:                            _ALL SIGNALS STABLE        ?
          BEGIN 
          WITH BWWLENTRY[OPS].B0EWLQ DO 
            BEGIN 
            IF MMSCI = M0LUP                _ IF STATUS SHOWS LINE UP  ?
            THEN
              BEGIN 
              IF BZSYNAUTO = FALSE          _IF NOT SYNC AUTO REC      ?
              THEN
                PT2PASS                     _PASS LINE TO TIP          ?
              ELSE
                BEGIN 
                REPEAT
                  BEGIN 
                  IF PT2CHKTIP (B0HASP,N1HASP)_IF HASP TIP PRESENT     ?
                  THEN
                    BEGIN 
                    BZBSCTRY := LHASPRETRY; _TIMES TO TRY HASP        ? 
                    REPEAT
                      BEGIN 
                      BZBSCTRY := BZBSCTRY - 1;_DECREMENT TIMES        ?
                      BZSTATE := LSYNCHASP; _CHANGE STATE              ?
                      PT2TERMIO;            _TERMINATE INPUT/OUTPUT    ?
                      PT2SETTIMER (LSYNCHASP,L6SEC);
                      PT2IO (NKINPT);       _AWAIT HASP INPUT          ?
                      IF LIWKCODE = LSOHENQ _CORRECT HASP RESPONSE     ?
                      THEN
                        BEGIN 
                        PT2TERMIO;          _TERMINATE POSSIBLE INPUT  ?
                        PT2ENABLE;          _ENABLE THE LINE           ?
                        PT2PASS;            _PASS LINE TO TIP.         ?
                        END;
                      END;
                    UNTIL BZBSCTRY = 0;     _RETRY COUNT = 0           ?
                   END; _ HASP TIP PRESENT ?
                  IF PT2CHKTIP (B0MLBSC,N1BSC)_SEE IF BSC TIP PRESENT  ?
                  THEN
                    BEGIN 
                    BZBSCTRY := LBSCRETRY;  _BSC RETRY COUNT           ?
                    REPEAT
                      BEGIN 
                      BZBSCTRY :=   BZBSCTRY - 1; _DECREMENT COUNT     ?
                      BZSTATE := LSYNCBSC;  _CHANGE STATE              ?
                      PT2TERMIO;            _TERMINATE INPUT/OUTPUT    ?
                      PT2SETTIMER (LSYNCBSC,L3SEC); 
                      PT2IO (NKINPT);       _AWAIT BSC INPUT           ?
                      IF LIWKCODE " A0TIMEOUT _IF NOT A TIME - OUT     ?
                      THEN
                        BEGIN 
                        ADDR(SANAKM,LICMDPKT.NKOBP);  _SEND NAK        ?
                        PT2SETTIMER (LSYNCBSC,L3SEC);_OUTPUT TIMER     ?
                        PT2IO (NKDOUT);     _OUTPUT EOT                ?
                        PT2TERMIO;          _TERMINATE INPUT/OUTPUT    ?
                        PT2ENABLE;          _ENABLE THE LINE           ?
                        PT2PASS;            _PASS THE LINE TO TIP      ?
                        END; _ NOT A0TIMEOUT ?
                      END;
                    UNTIL BZBSCTRY = 0;       _RETRY COUNT = 0         ?
                    END; _ BSC TIP PRESENT ?
                  IF PT2CHKTIP (B0M4WL,N1M4)_IF MODE 4 PRESENT         ?
                  THEN
                    BEGIN 
                    BZSTATE := LSYNCMD4;    _SET STATE TO MODE 4       ?
                    PT2TERMIO;              _TERMINATE INPUT/OUTPUT    ?
                    PT2ENABLE;              _ENABLE THE LINE           ?
                    PT2PASS                 _PASS THE LINE TO TIP      ?
                    END; _ IF MD4 ? 
                  IF BZSWLINE               _IF THIS IS A SWITCHED LINE?
                  THEN                      _THEN START OVER           ?
                    PT2REPEAT;
                  END; _ REPEAT LOOP ?
                UNTIL FALSE;                _INFINITE LOOP             ?
                END; _ ELSE BZSYNAUTO = TRUE ?
              END; _ MOLUP ?
            END; _ WITH BWWLENTRY ? 
          END; _ LSTABLE ?
      END; _ MMCLAS ? 
_ 
****  HARD ERROR WORKLIST ENTRY 
? 
    A0HARDERR:                              _HARD ERROR                ?
  
      BEGIN 
      IF BZSTATE > LSTABLE                  _IF I/O ACTIVE             ?
      THEN
        PT2TERMIO;                          _TERMINATE I/O             ?
      PT2RETRY;                             _RETRY IN 5 SECONDS        ?
      NAPORT'[LILINO].NACRC := 0;           _CLEAR COUNTER             ?
      END; _ A0HARDERR ?
  
_ 
****  TIME - OUT WORKLIST ENTRY 
? 
    A0TIMEOUT:                              _TIME - OUT                ?
      WITH BWWLENTRY [OPS].B0EWLQ DO
        BEGIN 
        IF MMWTCOUNT = BZWTCOUNT            _IF LEAGAL TIME - OUT      ?
        THEN
          BEGIN 
          BZWTCOUNT := BZWTCOUNT  + 1;      _INVALIDATE OTHER TIMERS   ?
          CASE BZSTATE OF 
            LRETRY:                         _RETRY THE LINE            ?
              BEGIN 
              NAPORT'[LILINO].NACRC := 0;   _INITIALIZE COUNTER        ?
              BZRET1ADDR  :=  0;            _CLEAR RETURN ADDRESS      ?
              BZRET2ADDR  :=  0;            _CLEAR RETURN ADDRESS      ?
              IF BZSYNAUTO                  _IF SYNC AUTO RECOGNITION  ?
              THEN
                BZSVTIPTYPE  := N1SYNAUTO;  _RESET SAVED TIP TYPE      ?
              PT2CPKT;                      _CLEAR CMD PACKET          ?
              LICMDPKT.NKCMD := NKINIL;     _INITIALIZE CMD            ?
              IF BZLTYP = N0LA              _IF LINE TYPE A            ?
              THEN
                LICMDPKT.NKCMS := PTLINA;   _CHANGE ADDR OF PTR TABLE  ?
              LICMDPKT.NKLTYP  := BZLTYP;   _PASS LINE TYPE            ?
              LICMDPKT.NKMDMS  := N4LNI;
              PBCOIN(LICMDPKT);             _LAUNCH COMMAND TO MUX     ?
              PT2CPKT;                      _CLEAR PACKET              ?
              LICMDPKT.NKCMD  := NKCONTROL; _ISSUE CONTROL CMD         ?
              LICMDPKT.NKTCLSA  := BJTIPTYPE[BZSVTI].BJDFTC; _DEF TC   ?
              LICMDPKT.NKSRF1  := TRUE;     _SET ISR                   ?
              LICMDPKT.NKFUN1  := N0ISR;    _INPUT SUPERVISION ON      ?
              PBCOIN(LICMDPKT);             _LAUNCH CMD TO MUX         ?
              PT2SETIMER (LWCLAO,L1SEC)     _WAIT FOR CLA ON FROM      ?
                                            _MODEM STATES              ?
              END; _ LRETRY ? 
  
            LWSIGNALS,                      _WAIT FOR OTHER SIGNALS    ?
            LWCLAON,                        _WAITING FOR CLA RESPONSE  ?
            LENABL,                         _ENABLING LINE             ?
            LSTABLE:                        _LINE STABLE               ?
              BEGIN 
              PT2RETRY;                     _RETRY THE LINE            ?
              PT2SETTIMER (LRETRY,L30SEC)   _RETRY IN 30 SECONDS       ?
              END;
  
            LWDSR:                          _WAITING ON DSR            ?
  
              BEGIN 
              PT2REPEAT                     _REPEAT PROCEDURE          ?
              END; _ CASE LWDSR ? 
            LWRESO:                         _WAITING FOR RESOURCES     ?
              PT2RESOURCE;                  _CHECK RESOURCES           ?
  
            LCSIGNALS:                      _CHECK FOR OTHER SIGNALS   ?
              BEGIN 
              WITH NAPORT'[LILINO] DO 
                BEGIN 
                NACRC := (NACRC + 1) MOD 100; _INCREMENT COUNTER       ?
                PT2STATUS;                  _TURN ON ISON              ?
                PT2ISR(MSTWOT);             _SEND ISR                  ?
                PT2SETTIMER (LWSIGNALS,L30SEC);_WAIT FOR OTHER SIGNALS ?
                END _ WITH NAPORT'[LILINO] ?
              END; _LCSIGNALS ? 
  
            LCSTABLE:                       _CHCK STABILITY            ?
              BEGIN 
              PT2STATUS;                    _TURN ISON ON              ?
              PT2ISR (MSTSBC);              _TURN ON ISR               ?
              PT2SETTIMER (LSTABLE,L1SEC);  _WAIT                      ?
              END;  _ LCSTABLE ?
  
            LSYNCHASP,                      _SYNC AUTO REC HASP        ?
            LSYNCBSC:                       _BSC AUTO REC              ?
              BEGIN 
              PT2RTURN(BZRET1ADDR)          _RETURN TO PT2IO CALLER    ?
              END;
  
            END;  _ CASE OF BZSTATE ? 
          END; _ IF MMWTCOUTN = BZWTCOUNT ? 
        END; _ WITH BWWLENTRY ? 
  
    A0SMEN: 
    BEGIN 
    IF BZTCBPTR " NIL                       _SHOULD NEVER HAPPEN       ?
    THEN
      PBHALT (J0LNBAD);                     _BRING NPU TO ITS KNEES    ?
    IF BZSYNAUTO                            _IF SYSNC AUTO LINE        ?
    THEN
      BEGIN 
      BZLBTOMUX := NIL;                     _CLEAR LAST BLOCK TO MUX   ?
      BZTIPTYPE := N1SYNAUTO;               _SYNC-AUTO IS TIP-TYPE     ?
      END; _ IF BZSYNAUTO ? 
    IF BZTIPTYPE " N0LINIT                  _IF CURRENTLY CONTROLLING  ?
    THEN
      BZSVTIPTYPE := BZTIPTYPE;             _SAVE TIP TYPE             ?
    BZTIPTYPE   := N0LINIT;                 _LINE INITIALIZER HAS LINE ?
    PT2REPEAT;                              _CLEAR OUT LINE            ?
    END; _ A0SMEN ? 
_ 
****  DISABLE LINE WORK LIST ENTRY
? 
    A0SMDA: 
      BEGIN 
      IF BZSTATE >LSTABLE                   _IF I/O ACTIVE             ?
      THEN
        PT2TERMIO;                          _TERMINATE I/O             ?
      PT2DISABLE(D5DISA);                   _DISABLE THE LINE          ?
      PT2CPKT;                              _CLEAR PACKET              ?
      LICMDPKT.NKCMD := NKCLRL;             _CLEAR THE LINE            ?
      PBCOIN(LICMDPKT);                     _ISSUE COMMAND TO MUX      ?
      PT2SETTIMER (LTIP,L0SEC);             _RELEASE THE LINE          ?
      END; _ A0SMDA ? 
_ 
****  INPUT/OUTPUT TERMINATED WORKLIST ENTRY
? 
    LTERMIO:                                _TERMINATION OF I/O        ?
      CASE BZSTATE OF 
        LSYNCHASP,                          _HASP AUTO REC             ?
        LSYNCMD4,                           _MODE 4                    ?
        LSYNCBSC:                           _BSC AUTO REC              ?
          PT2RTURN (BZRET2ADDR);            _RETURN TO CALLER          ?
        END; _ CASE BZSTATE ? 
_ 
****  SOHENQ SYNC AUTO WORKCODE RECEIVED
? 
    LSOHENQ:                                _HASP SOH ENQ              ?
      BEGIN 
      IF BZSTATE = LSYNCHASP                _IF IN HASP STATE          ?
        THEN
        PT2RTURN (BZRET1ADDR);              _RETURN TO PT2IO CALLER    ?
      IF PT2CHKTIP (B0HASP,N1HASP)          _AND HASP TIP PRESENT      ?
      THEN
        BEGIN 
        PT2TERMIO;                          _TERMINATE INPUT/OUTPUT    ?
        PT2ENABLE;                          _ENABLE THE LINE           ?
        PT2PASS                             _PASS LINE TO TIP          ?
        END; _ IF HASP TIP ?
      END; _ LSOHENQ ?
_ 
****  LENQ, LACK0, LWACK, LNAK SYNC AUTO WORKCODES RECEIVED 
? 
    LENQ,                                   _BSC ENQ                   ?
    LACK0,                                  _BSC ACK0                  ?
    LWACK,                                  _BSC WACK                  ?
    LNAK:                                   _BSC NAK                   ?
      BEGIN 
      IF BZSTATE =LSYNCBSC                  _IF LOOKING FOR BSC        ?
      THEN
        PT2RTURN (BZRET1ADDR);              _RETURN TO CALLER          ?
      IF PT2CHKTIP (B0MLBSC,N1BSC)          _AND BSC TIP PRESENT       ?
      THEN
        BEGIN 
        PT2CPKT;                            _CLEAR PACKET              ?
        ADDR (SANAKM,LICMDPKT.NKOBP);       _SEND NAK TO BSC DEVICE    ?
        PT2SETTIMER (LSYNCBSC,L3SEC);       _OUTPUT TIMER              ?
        PT2IO (NKDOUT);                     _OUTPUT EOT                ?
        PT2TERMIO;                          _TERMINATE INPUT/OUTPUT    ?
        PT2ENABLE;                          _ENABLE THE LINE           ?
        PT2PASS;                            _PASS THE LINE TO TIP      ?
        END; _ BSC TIP PRESENT ?
      END; _ LENQ... ?
    LREPEAT:                                _REPEAT INITIALIZATION     ?
      BEGIN 
      IF BZSTATE > LSTABLE                  _IF I/O GOING ON           ?
      THEN
        PT2TERMIO;                          _TERMINATE I/O             ?
      PT2REPEAT;
      END; _ CASE OF LREPEAT ?
    END; _ CASE LIWKCODE ?
  END; _ WITH LILCBP' DO? 
999:  
END; _ PROCEDURE PTLINIT ?
_$J+ PAGE EJECT ? 
_$I-,R-,G- ?
_***********************************************************************
************************************************************************
**                                                                    **
**             PTLMUX2 - LINE INITIALIZER AT MUX LEVEL                **
**                                                                    **
************************************************************************
************************************************************************
*                                                                      *
** OVERVIEW -                                                          *
*         PTLMUX2 MOVES A WORKLIST ENTRY FROM THE MUX LEVEL TO THE     *
*         OPS LEVEL.                                                   *
*                                                                      *
** INPUTS -                                                            *
*         WORKLIST ENTRIES GENERATED BY PTCLAS (STATUS HANDLER) SERVE  *
*         AS INPUTS TO PTLMUX2.                                        *
*                                                                      *
** OUTPUTS -                                                           *
*         WORKLIST ENTRY AT OPS LEVEL.                                 *
*                                                                      *
************************************************************************
***********************************************************************?
PROCEDURE PTLMUX2;                     _MUX LEVEL INITIALIZATION PGM   ?
  VAR 
    CMDPKT    : NKINCOM;               _COMMAND DRIVER PACKET          ?
BEGIN 
  WITH BWWLENTRY[MUX2].B0EWLQ DO
    BEGIN 
    IF MMWKCODE = A0WK7                _IF SOFT HARDWARE ERROR, CLEAR  ?
    THEN                               _THE LINE                       ?
      BEGIN 
      CMDPKT.NKWD0.BAINT  := 0; 
      CMDPKT.NKWD2.BAINT  := 0; 
      CMDPKT.NKLINO       := MMLINO;   _INSERT LINE NUMBER             ?
      CMDPKT.NKCMD        := NKCLRL;
      PBCOIN(CMDPKT);                  _ISSUE CLEAR TO CLA             ?
      END; _ IF ((MMWKCODE = A0WK7 ?
    END; _ WITH BWWLENTRY[MUX2].B0EWLQ ?
  PBLSPUT (BWWLENTRY[MUX2],BYWLCB[B0LIWL]); _WORKLIST ENTRY INTO OPS WL?
END;                                   _END PTLMUX2                    ?
_***********************************************************************
***********************************************************************?
