*COMDECK PINCBINIT
_$J+? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*                    PINCBINIT                                        * 
*                                                                     * 
*        BUILD ROUTING TABLES FROM NPU CONFIGURE BLOCK (NCB)          * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_$R-,G-,I-? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW -  THIS PROCEDURE MOVES THE NCB FROM LOW TO HIGH BUFFER   * 
*              AREA, THEN BUILDS, CLEARS, AND INITIALIZES ROUTING     * 
*              TABLES IN LOW BUFFER AREA, BUMPING START OF BUFFERS    * 
*              PAST EACH ADDED TABLE.                                 * 
*                                                                     * 
** INPUTS -    NPU CONFIGURE BLOCK AT START OF BUFFER AREA.           * 
*              B3SBUF POINTS TO START OF BUFFERS.                     * 
*                                                                     * 
** CALLING PROGRAMS -                                                 * 
*              PINIT - CALL SEQUENCE OF INITIALIZATION PROCEDURES     * 
*                                                                     * 
** OUTPUTS -   THE FOLLOWING ROUTING TABLES BUILT AND INITIALIZED :   * 
*                COUPLER CONTROL BLOCKS                               * 
*                TRUNK CONTROL BLOCKS                                 * 
*                LOCAL DN TABLE                                       * 
*                LOCAL SUPERVISOR TABLE                               * 
*                LOGICAL LINK CONTROL BLOCKS (NHLLCBS)                * 
*              THE FOLLOWING GLOBAL VALUES ARE DETERMINED             * 
*                B3SBUF    - START OF BUFFERS                         * 
*                C4LCBS    - NUMBER OF LINES                          * 
*                C4SUBLCBS - NUMBER OF SUBLCBS                        * 
*                C0NPBL    - NUMBER OF TRUNKS                         * 
*                C0NCPLR   - NUMBER OF LOCAL HOSTS                    * 
*                NHCBPTR   - POINTER TO TEMPORARY ARRAY OF COUPLER    * 
*                            AND TRUNK CONTROL BLOCK POINTERS         * 
*                NHCBTYP   - ARRAY OF CONTROL BLOCK TYPES             * 
*                DELOCDN   - POINTER TO ROUTING TABLE                 * 
*                DESUPDN   - POINTER TO SUPERVISOR TABLE              * 
*                                                                     * 
** EXTERNAL SUBROUTINES -                                             * 
*              ADDR     - PUT MODULE ADDRESS INTO POINTER VARIABLE    * 
*              PBHALT   - HALT THE SYSTEM                             * 
*              PN1GTPTR - POINT TO TYPE 1 TABLE ENTRY                 * 
*              PN1SRCH  - GET TYPE 1 TABLE ENTRY POINTER              * 
*              PN2ADD   - MAKE AN ADDITION TO A TYPE 2 TABLE          * 
*                                                                     * 
** NOTES -     COMDECK PINCBINIT MUST BE LOCATED BEFORE PINIT AND ALL * 
*              INITIALIZATION COMDECKS WHICH EXECUTE AFTER IT,        * 
*              BECAUSE THE MEMORY AREA PRECEEDING PINCBINIT IS        * 
*              OVERLAID BY THE NCB.                                   * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PINCBINIT;
CONST 
      NCTERM    = 1;                        _ TERMINAL NODE            ?
      NCENABLED = 0;                        _ ROUTING ENABLED FOR DATA ?
      NCDISABLE = 1;                        _ ROUTING DISABLED FOR DATA?
      NCIGNRLR = 2;                         _ IGNORE LOAD REQUESTS     ?
      NCLOCKED  = 3;                        _ NO ROUTING VIA NODE      ?
      NCMAXTAB  = 6;                        _ MAX NUMBER OF NCB TABLES ?
      NTRKSIZE  = $2C;                      _ DUMMY LENGTH OF TRK CB   ?
VAR 
      NCBP      : 'CFNCBFILE;               _ LOCAL POINTER TO NCB     ?
      I         : INTEGER;                  _ NCB TABLE INDEX          ?
      J         : INTEGER;                  _ CB PTR INDEX             ?
      K         : INTEGER;                  _ INDEX USED TO CLEAR CBS  ?
      L         : INTEGER;                  _ INDEX TO GCLLCB          ?
      M         : INTEGER;                  _ HOST NAME CHARACTER INDEX?
      NCBLENGTH : B0OVERLAY;                _ LENGTH OF NCB            ?
      NCNE      : INTEGER;                  _ NODE TABLE INDEX         ?
      NCLE      : INTEGER;                  _ LINK TABLE INDEX         ?
      NCRE      : INTEGER;                  _ ROUTING TABLE INDEX      ?
      NCHE      : INTEGER;                  _ HOST TABLE INDEX         ?
      NCSE      : INTEGER;                  _ SUPERVISOR TABLE INDEX   ?
      NCE       : INTEGER;                  _ END OF TABLE INDEX       ?
      NCS       : INTEGER;                  _ START OF TABLE INDEX     ?
      NCNODES   : INTEGER;                  _ NUMBER OF NODES          ?
      NCHOSTS   : INTEGER;                  _ NUMBER OF HOSTS          ?
      NCID      : INTEGER;                  _ CURRENT DN               ?
      NCRTOK    : BOOLEAN;                  _ ROUTING AVAILABLE  TO DN ?
      NCPDN     : B0BUFPTR;                 _ DN TABLE ENTRY PTR       ?
      NCPTAB    : B0BUFPTR;                 _ TABLE/CTRL BLK PTR       ?
      NCPLLCB   : B0BUFPTR;                 _ LLCB PTR                 ?
      NCSTATUS  : 'ARRAY[1..1,1..3] OF      _ DN  ROUTING STATUS       ?
                                  B02BITS;
      FRMSIZES  : ARRAY[0..3] OF INTEGER;   _ FRAME SIZES FOR TRUNK    ?
  
VALUE 
      FRMSIZES  = ( 256, 500, 1050, 1050);
  
PROCEDURE PI2LLCBINIT;
BEGIN 
WHILE NCPDN'.BRTYP1 " BREND DO              _ FOR EACH ID IN DN TABLE  ?
  WITH CPNCBFILEPTR' DO 
  BEGIN 
  WITH NCPDN'.BRTYP1 DO                     _ WITH CURRENT DN ENTRY    ?
  CASE NCSTAT'[BRID,J] OF                   _ CASE ROUTING STATUS FOR  ?
                                            _ DN VIA CURRENT NODE      ?
    NCENABLED,
    NCDISABLE : 
      BEGIN 
      NCPLLCB := B3SBUF.BABUFPTR;           _ POINT TO CURRENT LLCB    ?
      B3SBUF.BABUFPTR :=                    _ BUMP B3SBUF OVER LLCB    ?
                 B3SBUF.BABUFPTR + NHLLCBSIZE;
      NCLLCB := NCLLCB + 1;                 _ COUNT LLCBS FOR PBCHKREG ?
      WITH NCPLLCB'.BLLLCB.                 _ WITH LLCB                ?
                  BLSPART DO
        BEGIN 
        BLCHAIN := B3SBUF.BABUFPTR;         _ CHAIN TO NEXT LLCB       ?
        BLDN    := CFTABL[I].CFNODNO;       _ LL DN FROM NCB NODE ID   ?
        BLSN    := BRID;                    _ LL SN FROM LOC DN TABLE  ?
        IF BRLNKT = NLTRUNK                 _ IF LINK THRU             ?
        THEN                                _ A TRUNK - SET REMOTE     ?
          BLSNRMT := TRUE;                  _ NODE SOURCE              ?
        IF NCSTAT'[BRID,J] = NCENABLED      _ GET ROUTING STATUS       ?
        THEN
          BLCNFST := C7DOWN 
        ELSE
          BLCNFST := C7DISABLED;
  
        IF CFTABL[I].CFNODTYPE = NLCOUPLER
  
        THEN
          BEGIN 
          BLDNHST := TRUE;                  _ SET DN AS HOST           ?
          BLCONDIR := NCPTAB;               _ POINT TO COUPLER CONTROL ?
                                            _ BLOCK                    ?
          IF BRTYPE = NRHOST                _ IF SOURCE NODE A         ?
          THEN                              _ COUPLER THEN SET SOURCE  ?
            BLSNHST := TRUE;                _ NODE AS HOST             ?
          END _ TYPE = NLCOUPLER ?
  
        ELSE  _ TYPE = NCTERM ? 
  
          BEGIN 
          BLSNHST := TRUE;                  _ SN NODE IS ALWAYS HOST   ?
          BLCDS   := TRUE;                  _ SET CONNECTION DIRECTORY ?
          BMLLCB.BMLST  := NCPLLCB;         _ SET UP LAST ACTIVE NHLLCB?
          IF BMLLCB.BMFRST = NIL            _ IF THIS IS FIRST ENTRY OF?
          THEN                              _ THE ACTIVE NHLLCBS THEN  ?
            BMLLCB.BMFRST := NCPLLCB;       _ SET UP FIRST ENTRY OF    ?
          END; _ ELSE TYPE = NCTERM ?       _ ACTIVE NHLLCBS           ?
        END _ WITH NCPLLCB' ? 
      END; _ NCENABLED ?
    END; _ CASE ? 
  NCPDN := NCPDN + 2;                       _ POINT TO NXT DN TBL ENTRY?
  END; _ WHILE NCPDN ?
END; _ PROCEDURE PI2LLCBINIT ?
BEGIN 
_ 
* * * *  DETERMINE NCB SIZE 
? 
  
NCBP := B3SBUF.BABUFPTR;                    _ POINT TO START OF NCB    ?
I    := 1;                                  _ STARTING WITH FIRST TABLE?
WITH NCBP' DO 
  BEGIN 
  K := 0;                                   _ INIT NCB TABLE COUNTER   ?
  WHILE CFTABL[I].CFTBLT " #E# DO           _ WHILE NOT AT END OF NCB  ?
    BEGIN 
  
    CASE CFTABL[I].CFTBLT OF                _ SET UP NCB TABLE INDICES ?
  
      #N# :                                 _ NODE                     ?
        BEGIN 
        NCNE    := I; 
        NCNODES := CFTABL[I].CFLENGTH;      _ SAVE NUMBER OF NODES     ?
        I := I + CFTABL[I].CFLENG + 1;      _ POINT TO NEXT NCB TABLE  ?
        END;
      #L# :                                 _ LINK                     ?
        BEGIN 
        NCLE := I;
        NHNOLNKS := CFTABL[I].CFLENGTH;     _ SAVE NO. LNK CBS NEEDED  ?
        I := I + CFTABL[I].CFLENG + 1;      _ POINT TO NEXT NCB TABLE  ?
        END;
      #R# :                                 _ ROUTING                  ?
        BEGIN 
        NCRE := I;
        C0NNODE := CFTABL[I].CFLENGTH;      _ SAVE MAX NODE NUMBER     ?
        I := I + CFTABL[I].CFLENG + 1;      _ POINT TO NEXT NCB TABLE  ?
        END;
      #H# :                                 _ HOSTS                    ?
        BEGIN 
        NCHE := I;
        NCHOSTS := CFTABL[I].CFLENGTH;      _ SAVE NUMBER OF HOSTS     ?
        I := I + 1 + NCHOSTS * 4;           _ POINT TO NEXT NCB TABLE  ?
        END;
      #S# :                                 _ SUPERVISOR               ?
        BEGIN 
        NCSE := I;
        I := I + CFTABL[I].CFLENG + 1;      _ POINT TO NEXT NCB TABLE  ?
        END;
      #C# :                                 _ CONFIGURE                ?
        BEGIN 
        NHCE := I;
        FOR J := 1 TO CFTABL[NHCE].CFLENG DO_ FOR EACH PORT IN NCB     ?
          BEGIN 
          I := I + 3;                       _ BUMP INDEX OVER BASE DEFS?
          I := I + CFTABL[I].CFCNFENT       _ BUMP INDEX PAST FNFV PRS ?
                            .CFFNFV;
          END;
        I := I + 1;                         _ BUMP TO NEXT TABLE ENTRY ?
        END; _ #C# ?
      END; _ CASE ? 
      IF I > NCBMAX                         _ NCB TOO LONG             ?
      THEN
10: 
        PBHALT (J0NCBTL);                   _ HALT - BAD NCB           ?
      IF K @ NCMAXTAB                       _ IF NUMBER OF NCB TABLES  ?
      THEN                                  _  IS STILL WITHIN RANGE,  ?
        K := K + 1                          _  BUMP TABLE COUNT.       ?
      ELSE                                  _ OTHERWISE,               ?
        GOTO 10;                            _ HALT - TOO MANY TABLES   ?
    END; _ WHILE ?
  
    IF NCNE * NCLE * NCRE * NCHE * NCSE = 0 _ IF NO NODE LINK ROUTING  ?
    THEN                                    _ HOST OR SUPERVISION TABLE?
      GOTO 10;                              _ THEN HALT                ?
  
  END; _ WITH NCBP' ? 
NCBLENGTH.BAINT := I + 4;                   _ COMPUTE LENGTH OF NCB    ?
  
_ 
* * * *  MOVE NCB TO HIGH BUFFERS 
? 
  
ADDR(NCBP,CPNCBFILEPTR);                    _ FIND UPPER LIMIT FOR NCB ?
CPNCBFILEPTR := CPNCBFILEPTR - NCBLEN.BAINT;_ GET START ADDR OF NEW NCB?
FOR I := 1 TO NCBLENGTH.BAINT DO            _ COPY NCB TO HIGH BUFFERS ?
  CPNCBFILE'.CFWORD[I] := NCBP'.CFWORD[I];  _ CPY NCB TO HIGH BUFFERS  ?
  
_ 
* * * *  TRANSFER NCF VERSION AND NPU INFORMATION TO GLOBLS 
? 
  
NHNCFVER[1] := NCBP'.CFVERS[1];             _ COPY NCF VERSION TO GLBLS?
NHNCFVER[2] := NCBP'.CFVERS[2]; 
NHNPUGO  := NCBP'.CFOPTI.CFGO;              _ CPY GO REQ INFO TO GLOBLS?
IF NCBP'.CFOPTI.CFDUMP                      _ CPY DUMP INFO TO NDCB    ?
THEN
  BEGIN 
  NHNDCB.NDDUMP[1] := #Y#;
  NHNDCB.NDDUMP[2] := #Y#;
  END 
ELSE
  BEGIN 
  NHNDCB.NDDUMP[1] := #N#;
  NHNDCB.NDDUMP[2] := #N#;
  END;
  
_ 
* * * *  INITIALIZE VARIABLES 
? 
  
NHCBPTR     := CPNCBFILEPTR - NHNOLNKS;     _ SET UP TEMPORARY CB PTRS ?
                                            _ IN SCRATCH AREA BEFOR NCB?
NHCBTYP     := NHCBPTR - NHNOLNKS;          _ ALSO SET UP TEMP TYPES   ?
                                            _ ARRAY FOR POINTERS       ?
NCSTATUS    := NHCBTYP - 3*NCBP'.           _ SET UP TEMP STATUS ARRAY ?
               CFTABL[NCRE].CFLENGTH;       _ IN SCRATCH AREA          ?
ADDR(CPNCBF',B1BUFF);                       _ SAVE ENDING ADDRESS      ?
NCBLENGTH.BAINT := B3SBUF.BAINT;            _ USE NCBLENGTH TO         ?
REPEAT                                      _ CLEAR BUFFERS            ?
  NCBLEN.BAINTPTR' := 0;
  NCBLEN.BAINT := NCBLEN.BAINT + 1; 
UNTIL NCBLEN.BABUFPTR = B1BUFF;             _ CLEAR UP TO COPY OF NCB  ?
C0NPBL      := 0;                           _ CLEAR TRUNK COUNT        ?
C0NCPLR     := 0;                           _ CLEAR COUPLER COUNT      ?
C4SUBLCBS := 2;                             _ INITIALIZE SUBLCB COUNT  ?
INST ($C400,B3SBUF,$6400,ADDRTBL);          _ SET LOCATION OF TABLES   ?
WITH CPNCBFILEPTR' DO                       _ WITH NCB                 ?
  BEGIN 
  
_ 
* * * *  SET UP COUPLER AND TRUNK CONTROL BLOCKS FROM LINK TABLE
? 
  
  NCE  := NCLE + CFTABL[NCLE].CFLENGTH;     _ COMPUTE END OF LINK TABL ?
  NCS  := NCLE + 1;                         _ GET FIRST LINK ENTRY     ?
  J := 1;                                   _ INIT TEMP CB PTR INDEX   ?
  FOR I := NCS TO NCE DO                    _ FOR EACH LINK TABLE ENTRY?
    BEGIN 
    NHCBPTR'[J] := B3SBUF.BABUFPTR;         _ SET LOCAL PTR TO NXT CB  ?
    NHCBTYP'[J] := CFTABL[I].CFLNKTYP;      _ SAVE CB TYPE             ?
    CASE CFTABL[I].CFLNKTYP OF              _ CASE LINK TYPE           ?
  
      NLCOUPLER:                            _ COUPLER                  ?
  
        BEGIN 
        C4SUBLCB := C4SUBLCB + 1;           _ INCREMENT SUBLCB COUNT   ?
        C0NCPLR    := C0NCPLR  + 1;         _ INCREMENT HOST COUNT     ?
        B3SBUF.BABUFPTR := B3SBUF.BABUFPTR  _ BUMP B3SBUF PAST CCB     ?
                           + NHCCBSIZE; 
        WITH NHCBPTR'[J]',BHCCB DO          _ WITH CURRENT CPLR CB     ?
          BEGIN 
          IF (CFTABL[I].CFLNKNO = 1)        _ DETERMINE COUPLER NUMBER ?
            ! (CFTABL[I].CFLNKNO = $C)
          THEN
            BEGIN 
            BHCPCONN  := $600;              _ CONNECTION NO. FOR CPLR 1?
            ACPLR1    := C4SUBLCB;          _ SET LINE NUMBER          ?
            ADDR(BHTIMPKT,BHTIMPKT.BK2UPTR);  _ SAVE PACKET POINTER    ?
            END 
          ELSE
            BEGIN 
            BHCPCONN  := $680;              _ CONNECTION NO. FOR CPLR 2?
            ACPLR2    := C4SUBLCB;          _ SET LINE NUMBER          ?
            BHTIMPKT.BK1USRWRD := C4SUBLCB; _ SET LINE NUMBER          ?
            END;
          BHTIMPKT.BK1USRWRD := C4SUBLCB;   _ SET LINE NUMBER          ?
          ADDR(BHTIMPKT,BHTIMPKT.BK2UPTR);  _ SAVE PACKET POINTER      ?
          BHTIMPKT.BKTIME    := 5;          _ AVERAGE 15 MILLESECONDS  ?
          BHTIMPKT.BKTYPE    := BKSET;
          BHTIMPKT.BKWLINDEX := B0COWL;     _ SHIP TIMEOUTS TO THE HIP ?
          BHTIMPKT.BKWKCODE  := A0TIMEOUT;
          BHCPAMASK := $FF9D;               _ INTERRUPT MASK FOR CPLR  ?
          IF CFTABL[I].CFLNKS = NCDISABLE   _ PUT LINK STATE INTO      ?
          THEN                              _ COUPLER CONTROL BLOCK    ?
            BHCNFST := C7DISABLED 
          ELSE
            BHCNFST := C7ENABLED; 
          IF CFTABL[I].CFLNKS = NCIGNRLR    _ LINK AVAILABLE FOR       ?
          THEN                              _ LOADING OF NPU           ?
            BHIGNRLR := TRUE;               _ NO                       ?
          END; _ WITH NHCBPTR ? 
        END; _ CASE NLCOUPLER ? 
  
_  ******  CAUTION - HIDDEN *IF DEF,HLIP  ******  ? 
*IF DEF,HLIP
      NLTRUNK :                             _ TRUNK                    ?
  
        WITH NHCBPTR'[J]',TRKCB DO          _ WITH CURRENT TRUNK CB    ?
          BEGIN 
          IF NHTRCBSIZE = 0                 _ IF LIP NOT PRESENT       ?
          THEN                              _ USE DEFAULT LENGTH OF TCB?
            NHTRCBSIZE := NTRKSIZE; 
          C0NPBL            := C0NPBL + 1;  _ INCREMENT TRUNK COUNT    ?
          B3SBUF.BABUFPTR := B3SBUF.BABUFPTR_ BUMP B3SBUF PAST TRCB    ?
                             + NHTRCBSIZE;
          TRLINO    := CFTABL[I].           _ PUT PORT INTO TRUNK CB   ?
                           CFLNKNO*$100;
          K := CFTABL[I].CFFRMSIZE;         _ GET FRAME SIZE OF TRUNK  ?
          TRFRMSIZE := FRMSIZES[K];         _ INSERT CORRECT SIZE      ?
          IF CFTABL[I].CFLNKS = NCDISABLE   _ PUT LINK STATE INTO      ?
          THEN                              _ TRUNK CONTROL BLOCK      ?
            TRCNFST := C7DISABLED 
          ELSE
            TRCNFST := C7ENABLED; 
          IF CFTABL[I].CFLNKS = NCIGNRLR    _ IGNORE LOAD REGUESTS     ?
          THEN                              _ OVER THE LINK            ?
            TRIGNRLR := TRUE;               _ YES                      ?
          END; _ CASE NLTRUNK ? 
*ENDIF
_  ******  CAUTION - HIDDEN *ENDIF FOR LIP CODE  ******  ?
      END; _ CASES ?
  
    J := J + 1;                             _ INCRMNT TEMP CB PTR INDX ?
    END; _ FOR I ?
  
_ 
* * * *  BUILD ROUTING TABLES 
? 
  
  DELOCDN := B3SBUF.BABUFPTR;               _ ESTABLISH DN PTR TABLE   ?
  INST ($6400, ADDRLOC);                    _ PUT ENTRY IN ADDRESS TBL ?
  NCE  := NCRE + CFTABL[NCRE].CFLENGTH;     _ FIND END OF ROUTING TABLE?
  NCS  := NCRE + 1;                         _ GET FIRST ROUTING ENTRY  ?
  FOR I := NCS TO NCE DO                    _ FOR EA ROUTING TBL ENTRY ?
    BEGIN 
    WITH B3SBUF.BABUFPTR'.BRTYP1,           _ WITH DN TABLE ENTRY,     ?
         CFTABL[I] DO                       _ AND ROUTING TABLE ENTRY  ?
      BEGIN 
      NCID := I - NCS + 1;                  _ GET CURRENT DN           ?
      NCSTAT'[NCID,1] := CFRST1;            _ GET ROUTING STATUS       ?
                                            _  TO NODE 1               ?
      NCSTAT'[NCID,2] := CFRST2;            _ GET ROUTING STATUS       ?
                                            _  TO NODE 2               ?
      NCSTAT'[NCID,3] := CFRST3;            _ GET ROUTING STATUS       ?
                                            _  TO NODE 3               ?
      NCRTOK    := FALSE;                   _ ASSUME NOT ROUTING FOR DN?
      FOR J := 1 TO NCNODES DO              _ UNLESS UNLOCKED STATUS   ?
        IF NCSTAT'[NCID,J] " NCLOCKED       _ IS FOUND.                ?
        THEN
          NCRTOK := TRUE; 
      IF NCRTOK = FALSE                     _ IF NO ROUTING            ?
      THEN
        IF CFRTYPE = NCTERM                 _ AND TERMINAL NODE        ?
        THEN
          IF CFLNKO " 0                     _ AND LINK ORDINAL         ?
          THEN
            NCRTOK := TRUE;                 _ SET ROUTING ALLOWED      ?
      IF NCRTOK                             _ IF ROUTING AVAILABLE     ?
      THEN
        BEGIN 
        BRID   := I - NCS + 1;              _ PUT ID INTO DN TABLE     ?
        IF CFLNKO " 0                       _ IF NCB LNK ORDNL NOT ZRO ?
        THEN
          BEGIN 
          BRPTR := NHCBPTR'[CFLNKO];        _  SET DN TBL PTR TO ITS CB?
          BRTYPE := CFRTYPE;                _  PUT ROUTING TYPE INTO   ?
                                            _  TABLE.                  ?
          IF CFTABL[NCLE + CFLNKO].CFLNKTYP _  IF FOREIGN ROUTING      ?
             = NLTRUNK
          THEN
           BEGIN
           BRLNKTYPE := NLTRUNK;            _ LINK VIA TRUNK           ?
_  ******  CAUTION - HIDDEN *IF DEF,HLIP  ******  ? 
*IF DEF,HLIP
           WITH BRPTR' DO                   _ WITH TRUNK CB DO         ?
            CASE CFRTYPE OF                 _ CASE ROUTING TYPE        ?
  
              NCTERM:                       _ FOREIGN NPU              ?
                TRKCB.TRTNID := BRID;       _ PUT NPU ID INTO TRNK CB  ?
  
              NLCOUPLER:                    _ FOREIGN HOST             ?
                IF TRKCB.TRHN1ID = 0        _ PUT HOST ID INTO TRNK CB ?
                THEN
                  TRKCB.TRHN1ID := BRID 
                ELSE
                  TRKCB.TRHN2ID := BRID;
  
              END; _CASE? 
*ENDIF
_  ******  CAUTION - HIDDEN *ENDIF FOR LIP CODE  ******  ?
             END
            ELSE                            _ NOT FOREIGN ROUTING      ?
             BRLNKTYPE := NLCOUPLER;        _ LINK VIA COUPLER         ?
          END 
  
        ELSE                                _ LNK ORD IS ZRO           ?
          BEGIN 
          BRPTR     := NIL;                 _ CLEAR SN TABLE PTR       ?
          CKLOCNODE := BRID;                _ THIS IS LOCAL NODE ID    ?
          BRLNKTYPE := NLTERM;              _ LINK IS TO THIS NODE     ?
          BRTYPE    := NRTERMINAL;          _ TERMINAL NODE            ?
          END;
        B3SBUF.BABUFPTR := B3SBUF.BABUFPTR  _ ADVANCE B3SBUF FOR NXT DN?
                                    + 2;
        END; _ IF ROUTING AVAILABLE ? 
      END; _ WITH ? 
    END; _ FOR I := NCS ? 
  B3SBUF.BABUFPTR'.BRTYP1 := BREND;         _ MAKE TERMINATE ENTRY,    ?
  B3SBUF.BABUFPTR := B3SBUF.BABUFPTR + 2;   _  AND ADVANCE B3SBUF      ?
  
_ 
* * * *  BUILD HOST TABLE 
? 
  
  DEHOSTABLE := B3SBUF.BABUFPTR;            _ ESTABLISH HOST TABLE     ?
  NCS        := NCHE + 1;                   _ GET FIRST HOST ENTRY     ?
  FOR I := 1 TO NCHOSTS DO                  _ FOR EACH HOST TABLE ENTRY?
    BEGIN 
    WITH B3SBUF.BABUFPTR'.BRTYP3,           _ SET INDEX TO HOST TABLE  ?
         CFTABL[NCS].CFHENTRY DO            _ AND TABLE ENTRY IN NCB   ?
      BEGIN 
      FOR M := 1 TO 7 DO                    _ STORE HOST NAME          ?
        BRHOST[M] := CFHNAME[M];
      BRHOST[8] := # #;                     _ WITH TRAILING BLANK      ?
      BRNODE    := CFHRO;                   _ STORE HOST NODE          ?
  
      END; _WITH .... DO? 
  
    B3SBUF.BABUFPTR := B3SBUF.BABUFPTR + 5; _ ADVANCE B3SBUF           ?
    NCS             := NCS + 4;             _ AND TABLE ENTRY POINTER  ?
  
    END; _FOR I := 1 TO NCHOSTS DO? 
  
  B3SBUF.BABUFPTR'.BRTYP3.BRLAST := BREND;  _ STORE TERMINATE ENTRY    ?
  B3SBUF.BABUFPTR := B3SBUF.BABUFPTR + 2;   _ ADVANCE B3SBUF           ?
  
_ 
* * * *  BUILD SUPERVISOR TABLE 
? 
  
  DESUPDN := B3SBUF.BABUFPTR;               _ ESTABLISH SUPERVISOR TABL?
  NCE  := NCSE + CFTABL[NCSE].CFLENGTH;     _ FIND END OF NCB SUP TABLE?
  NCS  := NCSE + 1;                         _ GET FIRST SUP ENTRY      ?
  FOR I := NCS TO NCE DO                    _ FOR EA NCB SUP TBL ENTRY ?
   WITH CFTABL[I] DO                        _ WITH NCB SUP TABLE ENTRY ?
    BEGIN 
    B3SBUF.BABUFPTR'.BIINT[1] := 0;         _ INITIALIZE TABLE         ?
    NCPDN := PN1GTPTR(CFRORD,DELOCDN);      _ GET DN TABLE ENTRY       ?
    IF NCPDN " NIL                          _ IF DN ENTRY FOUND        ?
    THEN
    WITH B3SBUF.BABUFPTR'.BRTYP1 DO         _ WITH DN TABLE ENTRY,     ?
      BEGIN 
      BRID   := CFRORD;                     _ PUT ID INTO LOC SUP TABLE?
      BRPTR  := NCPDN'.BRTYP1.BRPTR;        _ CPY CB PTR FROM DN TO SUP?
      BRTYPE := CFSUPTYPE;                  _ PUT TYPE INTO SUP TABLE  ?
      END 
    ELSE                                    _ IF DN ENTRY NOT FOUND    ?
      PBHALT(J0NCBTL);                      _ HALT - BAD NCB           ?
    B3SBUF.BABUFPTR := B3SBUF.BABUFPTR + 2; _ ADVANCE B3SBUF           ?
    END; _ FOR I := NCS ? 
  B3SBUF.BABUFPTR'.BRTYP1 := BREND;         _ MAKE TERMINATE ENTRY,    ?
  B3SBUF.BABUFPTR := B3SBUF.BABUFPTR + 2;   _  AND ADVANCE B3SBUF      ?
  
_ 
* * * *  ESTABLISH LOGICAL LINKS
? 
  
  L    := 1;                                _ INDEX TO GCLLCB          ?
  NCE  := NCNE + CFTABL[NCNE].CFLENGTH;     _ FIND END OF NODE TABLE   ?
  NCS := NCNE + 1;                          _ GET FIRST NODE ENTRY     ?
  FOR I := NCS TO NCE DO                    _ FOR EA NODE TABLE ENTRY  ?
    BEGIN 
    NCPDN := DELOCDN;                       _ POINT TO TOP OF DN TABLE ?
    J     := I - NCS + 1;                   _ FIND NODE INDEX          ?
    CASE CFTABL[I].CFNODTYP OF              _ WHICH NODE TYPE          ?
  
      NLCOUPLER :                           _ HOST                     ?
        BEGIN                               _ GET CPLR CB              ?
        NCPTAB := PN1SRCH(CFTABL[I].CFNODNO,
                          DELOCDN); 
        IF NCPTAB " NIL                     _ IF CPLR CB EXISTS        ?
        THEN
          BEGIN 
          NCPTAB'.BHCCB.BHLLCB := B3SBUF.   _ START LLCB AT B3SBUF     ?
                                  BABUFPTR; 
          GCLLCB[L] := B3SBUF.BABUFPTR;     _ LLCB POINTER FOR COUPLER ?
          L         := L + 1;               _ BUMP INDEX               ?
          PI2LLCBINIT;                      _INITIALIZE LLCBS          ?
          END; _ IF NCPTAB " NIL ?
        END; _ NLCOUPLER ?
  
      NCTERM: PI2LLCBINIT;                  _ TERMINAL                 ?
  
    END; _ CASE CFTABL[I].CFNODTYPE ? 
    NCPLLCB'.BLLLCB.BLSPART.BLCHAIN := NIL; _ LAST LLCB CHAIN IS NIL   ?
  
    END; _ FOR I := NCS ? 
  
  IF NCLLCB > 10                            _ IF MORE THAN 10 LLCBS    ?
  THEN
    BEGIN 
    BFTHRESH[B0TH2LV] := BFTHRESH[B0TH1LV] +
      NCLLCB; 
    BFTHRESH[B0TH3LV] := BFTHRESH[B0TH2LV] +
      NCLLCB; 
    END 
  ELSE
    NCLLCB := 10;                           _ ELSE SET OFFSET TO 10    ?
  
  C4LCBS := CFTABL[NHCE].CFLENGTH + C0NPBLS;_ SET C4LCBS TO NO. LINES  ?
  L := 0;                                   _ INITIALIZE LINE NUMBER   ?
  IF C4LCBS > C0NPBL                        _ IF LINES PRESENT         ?
  THEN
    BEGIN 
    I := NHCE+1;                            _ START AT LINE ENTRY      ?
    FOR J := C0NPBL + 1 TO C4LCBS DO
      BEGIN 
      K := CFTABL[I].CFCNFENT.CFLINO        _ GET PORT NUMBER          ?
                             .BDPORT; 
      IF K > L                              _ GET HIGHEST PORT #       ?
      THEN
        L := K;                             _ SAVE IT                  ?
      I := I + 2;                           _ BUMP TO FN/FV PAIR       ?
      I := CFTABL[I].CFCNFENT.              _ ADD THE # OF FN/FV(S)    ?
           CFFNFVCNT + I + 1; 
      END; _ FOR ?
    C4LCBS := L;                            _ NOW SET IN PORT NUMBER   ?
    END; _ C4LCBS > C0NPBL ?
  END; _ WITH CFNCB' ?
END; _PINCBINIT?
