*COMDECK PILCBINIT
_$J+? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*                    PILCBINIT                                        * 
*                                                                     * 
*        INITIALIZE SUBLCBS AND LCBS FROM NCB INFORMATION             * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_$R-,G-,I-? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW -  THIS PROCEDURE INITIALIZES COUPLER SUBLCBS AND         * 
*              CONFIGURED LCBS.                                       * 
*                                                                     * 
** INPUT -     NHCBPTR  - POINTER TO TEMPORARY ARRAY OF COUPLER AND   * 
*                         TRUNK CONTROL BLOCK POINTERS.               * 
*              NHCBTYP  - POINTER TO TEMPORARY ARRAY OF CONTROL BLOCK * 
*                         TYPES.                                      * 
*              CSUBLCBP - POINTER TO  ARRAY OF SUBLCBS                * 
*              CGLCBP   - POINTER TO ARRAY OF LCBS                    * 
*                                                                     * 
** CALLING PROGRAMS -                                                 * 
*              PINIT - CALL SEQUENCE OF INITIALIZATION PROCEDURES     * 
*                                                                     * 
** OUTPUT -    INITIALIZED LCBS AND COUPLER SUBLCBS                   * 
*                                                                     * 
** EXTERNAL SUBROUTINES -                                             * 
*              PBXFER  - TRANSFER CONTROL TO ANOTHER MODULE           * 
*              PBHALT  - HALT THE SYSTEM                              * 
*              PBLCBP  - PUT LCB ADDRESS INTO VARIABLE                * 
*                                                                     * 
** NOTES -                                                            * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PILCBINIT;
CONST 
      CACOUPLER = 0;                        _ COUPLER LINK             ?
      CATRUNK   = 1;                        _ TRUNK LINK               ?
VAR 
      I         : INTEGER;                  _ INDEX                    ?
      J         : INTEGER;                  _ INDEX                    ?
      K         : INTEGER;                  _ INDEX                    ?
      L         : INTEGER;                  _ INDEX                    ?
      M         : INTEGER;                  _ TEMPORARY                ?
      CAPORT    : INTEGER;                  _ CURRENT PORT             ?
      CAFNFV    : INTEGER;                  _ FNFV COUNT               ?
      CAFRSTFN  : INTEGER;                  _ FIRST FN IN SERIES       ?
      CALASTFN  : INTEGER;                  _ LAST FN IN SERIES        ?
BEGIN 
_ 
* * * *  INITIALIZE COUPLER SUBLCBS AND TRUNK LCBS
? 
  
  J := C4SUBLCB - C0NCPLR ;                 _ INITIALIZE SUBLCB INDEX  ?
  FOR I := 1 TO NHNOLNKS DO                 _ FOR EACH LINK DEFINED    ?
    CASE NHCBTYP'[I] OF 
  
      CACOUPLER:                            _ IF LINK IS FOR COUPLER   ?
        BEGIN 
        J := J + 1;                         _ INCREMENT SUBLCB INDEX   ?
        WITH CSUBLCBP'[J] DO                _ WITH INDEXED SUBLCB      ?
          BEGIN 
          BZLINO.BDSUBPORT := J;            _ SAVE INDEX AS SUBPORT    ?
          BZTIPTYP         := N0COUPLER;    _ PUT TIP TYPE INTO SUBLCB ?
          BZTCBPTR         := NHCBPTR'[I];  _ POINT TO COUPLER CTRL BLK?
          ADDR(CSUBLCB'[J],NHCBPTR'[I]'     _ PUT PTR TO SUBLCB INTO   ?
                             .BHCCB.BHLCBP);_ CPLR CB                  ?
          END;
        END; _ CACOUPLER ?
  
      CATRUNK:                              _ IF LINK IS FOR TRUNK     ?
        BEGIN 
_  ******  CAUTION - HIDDEN *IF DEF,HLIP  ******  ? 
*IF DEF,HLIP
        CAPORT := NHCBPTR'[I]'.TRKCB.TRLINO _ GET PORT NO. FROM TRCB   ?
                 DIV $100;
        WITH CGLCBP'[CAPORT] DO             _ INITIALIZE TRUNK LCB     ?
          BEGIN 
          BZLINO.BDPORT := CAPORT;          _ PORT                     ?
          BZTIPTYP      := N0HDLC;          _ TIP TYPE                 ?
          BZLTYP        := N0LA;            _ LINE TYPE                ?
          BZCNFST       := NHCBPTR'[I]'.    _ GET STATUS FROM TRUNK    ?
                           TRKCB.TRCNFST; 
          PBLCBP(BZLINO,NHCBPTR'[I]'.TRKCB  _ PUT LCB PTR IN TRUNK CB  ?
                                    .TRLCBP); 
          BZTCBPTR         := NHCBPTR'[I];  _ POINT TO TRUNK CTRL BLK  ?
          END;
*ENDIF
_  ******  CAUTION - HIDDEN *ENDIF FOR LIP CODE  ******  ?
        END; _ CATRUNK ?
      END; _ CASE ? 
  
_ 
* * * *  INITIALIZE LCBS FROM NCB 
? 
  
IF C4LCBS > C0NPBL
THEN
  WITH CPNCBFILEPTR' DO                     _ WITH NCB                 ?
    BEGIN 
    I := NHCE + 1;                          _ GET FIRST NCB PORT ENTRY ?
    K := CFTABL[NHCE].CFLENGTH;             _ NUMBER OF LINES          ?
    FOR J := 1 TO K DO                      _ FOR EACH PORT            ?
      BEGIN 
      CAPORT := CFTABL[I].CFCNFENT.CFLINO   _ GET PORT NO. FROM NCB    ?
                                 .BDPORT; 
      WITH CGLCBP'[CAPORT] DO               _ SET LCB FIELDS FOR PORT  ?
        BEGIN 
        BZALCNT := PSETALM;                 _ PRESET ALARM COUNTER     ?
        BZLINO  := CFTABL[I].CFCNFENT       _ LINE NO.                 ?
                            .CFLINO;
        I       := I + 1;                   _ INCREMENT NCB INDEX      ?
        WITH CFTABL[I].CFCNFENT DO          _ WITH CURRENT NCB ENTRY   ?
          BEGIN 
          BZLTYP := CFLTYP;                 _ LINE TYPE                ?
          BZTIPT  := CFTTYP;                _ TERMINAL TYPE            ?
          IF CFAUTO 
          THEN
            BEGIN 
            BZAUTO   := TRUE; 
            BZARSPD  := CFARSPD;            _ALLOW RE-AUTOREC OF SPEED ?
            BZHIAUTO := CFHIAUTO;           _HI/LO AUTOREC RANGE       ?
            END 
          ELSE
            BZSUBTIP := CFSUBT; 
          IF CFTTYP = N1SYNAUTO             _ IF SYNC AUTO REC         ?
          THEN
            BZSYNAUTO := TRUE;              _ SET BIT IN LCB           ?
          IF (BZLTYP = N0L1) !              _ IF SWITCHED LINE SET     ?
             (BZLTYP = N0L5) !              _ BIT IN LCB               ?
             (BZLTYP = N0L6)
          THEN
            BZSWLINE := TRUE; 
          END;
        I       := I + 1;                   _ INCREMENT NCB INDEX      ?
        IF CFTABL[I].CFCNFENT.CFLSTAT = 0   _ IF ENABLED STATUS        ?
        THEN
          BZCNFST := C7ENABLED              _ SET LINE CNF STATE ENABLD?
        ELSE
          BZCNFST := C7DISABLED;            _ELSE SET CNF STATE DISABLD?
        IF (N0LAST < BZLTYP) !              _ IF LINE TYPE INVALID     ?
           (BJTIPT[BZTIPT].BJAT = NIL)      _ OR TIP NOT PRESENT       ?
        THEN
          BZCNFST := C7NOTCNF;              _ LINE NOT CONFIGURED      ?
        IF BZTIPTYPE \ N0MLIA               _ IF NOT A STANDARD TIP    ?
        THEN                                _ CHECK FOR USER TIP       ?
          IF (BZTIPTYPE < N0UTT1) !         _ AND LESS THAN N0UTT1     ?
             (BZTIPTYPE > N13270)           _ OR GREATER THAN N13270   ?
          THEN
            BZCNFST := C7NOTCNF;            _ SET TIP NOT CONFIGURED   ?
        IF BZSYNAUTO                        _ IF SYNC AUTO LINE        ?
        THEN
          IF BYWLCB[B0HASP].BYPRADDR = 0    _ IF HASP NOT PRESENT      ?
          THEN
            IF BYWLCB[B0MLBSC].BYPRADDR = 0 _ AND BSC NOT PRESENT      ?
            THEN
              IF BYWLCB[B0M4WL].BYPRADDR = 0_ AND MODE4 NOT PRESENT    ?
              THEN
                BZCNFST := C7NOTCNF;        _ LINE NOT CONFIGURED      ?
_  ******  CAUTION - HIDDEN *IF DEF,X25  ******  ?
*IF DEF,X25 
        IF BZTIPTYPE = N1X25                _ IF X25 TYPE TIP          ?
        THEN                                _ AND NOT CONFIGURED       ?
          BEGIN 
          IF BZCNFST " C7NOTCNF 
          THEN
            BEGIN 
            BZSLCBPTR := B3SBUF.BABUFPTR;   _ START OF X25 SUB-LCB     ?
            ADDR (CGLCBP'[CAPORT],          _ PUT ADDRESS OF LINE INTO ?
               BZSLCBPTR'.BZXSLCB.BZLCBPTR);_ LCB                      ?
            B3SBUF.BAINT :=                 _ BUMP START OF BUFFERS    ?
                   B3SBUF.BAINT + 48; 
            END;
          END; _ BZTIPTYPE = N1X25 ?
*ENDIF
_  ******  CAUTION - HIDDEN *ENDIF FOR X25 CODE  ******  ?
        CAFNFV  := CFTABL[I].CFCNFENT       _ NUMBER OF FN/FV PAIRS    ?
                           .CFFNFVCNT;
        IF (CAFNFV > 0) &                   _ IF THERE ARE FN/FV PAIRS ?
           (BZCNFST " C7NOTCNF)             _ AND VALID LINE           ?
        THEN
        WITH BJTIPT[BZTIPT] DO              _ WITH TIP TYPE TABLE ENTRY?
          BEGIN 
          D0AT  := BJAT;                    _ ACTION TABLE FOR TIP     ?
          PBLCBP(BZLINO,D0CB);              _ LCB ADDRESS              ?
          CAFRSTFN := I + 1;                _ FIRST FN                 ?
          CALASTFN := I + CAFNFV;           _ LAST FN                  ?
          ADDR (CFTABL[I],D0BFR);           _ GET ADDRESS OF FN/FV(S)  ?
          D0BFR'.BFFCD := 2;                _ FIRST CHAR. DISPLACEMENT ?
          D0BFR'.BFLCD := (CAFNFV * 2) + 1; _ LCD                      ?
          D0IVT := TRUE;                    _ DUMMY BUFFER             ?
          D0FDT := D0LCBFDT;                _ USE BASE LCB FDT         ?
          PBXFER (BRTNJUMP[C1PNCONF]. 
                           JENTADDR,
                  BRTNJUMP[C1PNCONF]. 
                           JPAGEVAL); 
          IF CONFIGOK " D3AC                _ IF ERROR                 ?
          THEN
            BZCNFST := C7NOTCNF;            _ LINE NOT CONFIGURED      ?
_  ******  CAUTION - HIDDEN *IF DEF,X25  ******  ?
*IF DEF,X25 
          IF BZTIPTYPE = N1X25
          THEN
            WITH BZSLCBPTR'.BZXSLCB DO
              BEGIN 
              I := BZFRMCNT;                _PKT SIZE PLACED BY FN/FV  ?
              BZFRMCNT := 0;                _CLEAR THE FIELD           ?
              IF I @ 10                     _IF THE VALUE LOG BASE 2   ?
              THEN
                L := I                      _SAVE IT                   ?
              ELSE                          _IF THE VALUE IS REAL      ?
                BEGIN 
                L :=  4;                    _LOWEST VALID LOG VALUE    ?
                M := 16;                    _SMALLEST PACKET SIZE      ?
                WHILE M < 1024 DO           _WHILE PACKET SIZE IS VALID?
                  BEGIN 
                  IF I @ M                  _IF VALUE WITHIN A BOUNDRY ?
                  THEN
                    GOTO 10;
                  L := L + 1;               _NEXT LOG VALUE            ?
                  M := M * 2;               _NEXT BOUNDARY VALUE       ?
                  END;
                END;
10:           IF L < 4                      _LESS THAN LOWEST LIMIT    ?
              THEN
                BZCNFST := C7NOTCNF         _ERROR, LINE NOT CONFIGURED?
              ELSE
                BZPKTLNGTH := L;            _CONVERTED LOG VALUE PLACED?
              END;
*ENDIF
_  ******  CAUTION - HIDDEN *ENDIF FOR X25 CODE  ******  ?
          I := CALASTFN + 1;                _NEXT PORT ENTRY           ?
          END 
          ELSE                              _ NO FN/FV PAIRS          ? 
            I := I + CAFNFV + 1;            _ GET NEXT PORT ENTRY     ? 
        END; _ WITH CGLCBP ?
      END; _ FOR J ?
    END;  _ WITH CPNCBFILEPTR' ?
_ 
*              ---- SET UP BEGINNING OF BUFFERS ----
? 
    B3SBUF.BAINT := B3SBUF.BAINT +          _BUMP START OF BUFFERS     ?
                    BEDBSIZE'.BEMSK.BAINT;  _PAST FIRST BUFFER ENTRY   ?
    B3SBUF.BASET := B3SBUF.BASET -          _MASK BACK TO EVEN BUFFER  ?
                    BEDBSIZE'.BEMSK.BASET;  _BOUNDARY                  ?
  
  INST ($6400, ADDRBUF);                    _ PUT ENTRY IN ADDRESS TBL ?
END; _ PILCBINIT ?
