*DECK NDLNFTM
USETEXT NDLDATT
USETEXT NDLER2T
USETEXT NDLFETT
USETEXT NDLNCFT
USETEXT NDLPS2T
USETEXT NDLTBLT
PROC NDLNFTM;
BEGIN
*IF,DEF,IMS
#
** NDLNFTM - NCF TERMINATION ROUTINE.
*
* D.K. ENDO 81/10/12
*
* THIS PROCEDURE DOES ALL THE FINAL PROCESSING IN THE CREATION OF
* AN NCF.
*
* PROC NDLNFTM
*
* ENTRY NONE.
*
* EXIT NONE.
*
* METHOD
*
* CALL PROC THAT BUILDS NCB-S.
* FOR EACH CROSS REFERENCE TABLE,
* SORT THE TABLE.
* WRITE TABLE TO NCF.
* SORT THE LINE RECORD INDEX.
* WRITE LINE RECORD INDEX TO NCF.
* IF NO ERRORS,
* THEN,
* SET GOOD NCF FLAG.
* OTHERWISE,
* CLEAR GOOD NCF FLAG.
* PUT ERROR MESSAGE IN PREFIX TABLE.
* SORT NCF INDEX.
* PUT PREFIX TABLE IN FRONT OF NCF INDEX.
* WRITE INDEX TO NCF.
* DE-ALLOCATE TABLE SPACE.
*
#
*ENDIF
#
**** PROC NDLNFTM - XREF LIST BEGINS.
#
XREF
BEGIN
PROC SSTATS; # ALLOC SPECIFIED NUM OF WORDS TO TABLE #
PROC NDLEM2; # MAKES ENTRIES IN PASS2 ERROR FILE #
PROC MOVEI; # MOVES BLOCKS OF MEMORY IN FL #
PROC NDLSST; # DOES A SORT OF TBL USING SHELL-S METHOD #
PROC NDLWNCF; # WRITES RECORD/TABLE TO NCF #
FUNC XCDD C(10); #CONVERTS INTEGER TO DISPALY CODE #
END
#
****
#
DEF NCF$EMSG #"ERRORS DETECTED IN THE CREATION OF THIS NCF."#;
DEF PT$SIZE # 15 #; # TOTAL SIZE OF PRFX TABLE #
ITEM BBP; # BEGINNING BIT POSITION #
ITEM ENT$CNT; # ENTRY COUNT #
ITEM FRST$WRD; # FIRST WORD TO BEGIN SORT ON #
ITEM ITEMP; # INTEGER TEMPORARY #
ITEM LENGTH; # LENGTH OF TABLE TO BE WRITTEN TO NCF #
ITEM MASK; # MASK OF KEY TO BE SORTED ON #
CONTROL EJECT;
PROC CHKTRUNK;
BEGIN
*IF,DEF,IMS
#
**
*
* CHKTRUNK - CHECKS PORT NUMBER ALLOCATION OF TRUNK STATEMENTS.
*
* Y. C. YIP 82/09/09
*
* THIS PROC SEARCHES PHYSICAL LINK TABLE FOR TRUNK LINKS
* AND CHECK IF PORTS ASSIGNED ARE VALID.
*
* Y.C. YIP 82/09/09
*
* ENTRY - NONE
*
* EXIT - NONE
*
* METHOD
*
* FOR EVERY NODE ASSOCIATED WITH A TRUNK, GET ITS
* MAXIMUM PORT NUMBER USED BY CALLING A LOCAL PROCEDURE
* MAXPORT AND STORE THE MAXIMUM PORT NUMBER USED BY
* BY THAT NODE IN MAXPORT. THEN IT CHECKS IF ALL PORT
* NUMBERS 1 THROUGH MAXPORT ARE USED ELSE AN ERROR
* MESSAGE IS GENERATED.
*
#
*ENDIF
# DATA DEFINITION #
XREF
BEGIN
PROC NDLEM2; #PASS 2 ERROR MESSAGE GENERATOR#
FUNC XCDD C(10); #CONVERTS INTEGER TO DISPLAY CODE #
END
ARRAY USEMAP[0:4] S(1); # FOR NODE MAP #
BEGIN
ITEM NMAP(0,0,60) = [5(0)] ; # CLEAR MAP #
END
ITEM INDIX1; # LOOP INDEX #
DEF OVCH # -1 #; #LINE NUMBER FOR OVERALL ERROR CHECK#
ITEM MPTNO; # MAXIMUM PORT NUMBER #
ITEM WRDPTR ; # WORD POINTER #
ITEM BITPTR ; # BIT POINTER #
CONTROL EJECT;
# FIRST LOCAL PROCEDURE #
# #
# #
PROC MAXPORT(NODENO,PORTNO);
*IF,DEF,IMS
#
**
*
* MAXPORT - OBTAINS MAXIMUM PORT NUMBER AT A NPU NODE.
*
* Y.C. YIP 82/09/09
*
* THIS PROCEDURE OBTAINS THE MAXIMUM PORT NUMBER USED BY A
* NPU NODE AT EITHER END OF A TRUNK.
*
* PROC MAXPORT(NODENO,PORTNO)
*
* ENTRY - NODENO = NODE NUMBER TO BE CHECKED
*
* PORTNO = RETURN PARAMETER TO STORE THE MAXIMUM PORT
* NUMBER SPECIFIED FOR THAT NODE
*
* EXIT - NODENO = UNCHANGED.
* PORTNO = VALUE OF THE MAXIMUM PORT NUMBER.
*
* METHOD
*
* THE PHYSICAL LINK TABLE IS LOOPED TO FIND A MATCH OF THE
* NODE NUMBER WITH THE NODE NUMBER AT EITHER END OF THE TRUNK.
* IF A MATCH IS FOUND A MAXIMUM PORT NUMBER IS STORED AND
* BE USED TO COMPARE WITH SUBSEQUENT PORT NUMBERS FOUND.
* THE SEARCH STOPS AT THE END OF THE PHYSICAL LINK TABLE AND
* PORTNO CONTAINS THE VALUE OF THE MAXIMUM PORT NUMBER.
*
#
*ENDIF
BEGIN
ITEM PORTNO; # PORT NUMBER #
ITEM NODENO; #NODE NUMBER #
ITEM INDIX; # LOOP VARIABLE #
# *
*
#
FOR INDIX=1 STEP 1 UNTIL PLWC[0] # GO THROUGH PLLINK TABLE #
DO
BEGIN
IF PLTYPE[INDIX] EQ 1 # A TRUNK LINK ? #
THEN
BEGIN
IF PLNID1[INDIX] EQ NODENO # MATCH IN NODE NO #
THEN
BEGIN
IF PLP1[INDIX] GR PORTNO THEN # GET HIGHER PORTNO #
PORTNO=PLP1[INDIX]; # GET BIGGER OF PORTNO #
END
ELSE
BEGIN
IF PLNID2[INDIX] EQ NODENO # SAME FOR OTHER SIDE #
THEN
BEGIN
IF PLP2[INDIX] GR PORTNO # GET HIGHER PORTNO #
THEN PORTNO = PLP2[INDIX] ;
END
END
END
END
RETURN; # RETURN TO CALLING PROCEDURE #
END # END OF MAXPORT #
CONTROL EJECT;
# LOCAL PROCEDURE #
PROC SETPTR(NODENO);
*IF,DEF,IMS
#
**
* PROC SETPTR
*
* Y.C. YIP 82/09/09
*
* THIS PROCEDURE SETS THE WORD AND BIT POINTER IN THE NODE MAP.
*
* PROC SETPTR(NODENO)
*
* ENTRY - NODENO = NODE NUMBER.
*
* EXIT - WRDPTR SET TO THE WORD NUMBER WITHIN THE NODE MAP
* BITPTR SET TO THE BIT OF THAT SPECIFIC WORD INDICATED
* BY WRDPTR.
*
* METHOD
*
* WORD NUMBER COMPUTED BY (NODENO - 1)/60
* BITPTR COMPUTED BY (NODENO - 1) - 60*WRDPTR
#
*ENDIF
BEGIN
ITEM NODENO; # NODE NUMBER#
WRDPTR = (NODENO -1)/60; # SET WORD POINTER #
BITPTR = (NODENO -1) -60*WRDPTR; # SETS BIT POINTER #
RETURN;
END # END OF SETPTR #
CONTROL EJECT;
# LOCAL PROCEDURE #
PROC CHECKPORT(ERRORV,PORTNO,NODENO);
BEGIN
*IF,DEF,IMS
#
**
*
* CHECKPORT - CHECKS IF A PORT NUMBER IS DEFINED IN THE
* PHYSICAL LINK TABLE.
*
* Y.C. YIP 82/09/09
*
* THIS PROCEDURE CHECKS FOR VALID PORT NUMBER
*
* PROC CHECKPORT(ERRORV,PORTNO,NODENO)
*
* ENTRY - ERRORV = ERROR FLAG
* PORTNO = PORT NUMBER BEING CHECKED
* NODENO = NODE NUMBER OF THE TRUNK
*
* EXIT - ERRORV SET TO TRUE IF THERE IS NO MATCH ELSE FALSE
* PORTNO = UNCHANGED
* NODENO = UNCHANGED
*
* METHOD
*
* ERRORV IS SET TO FALSE
* THE PHYSICAL LINK TABLE IS SCANNED TO
* FIND A MATCH FOR THE NODE NUMBER AND PORT NUMBER GIVEN AS
* PARAMETERS. IF A MATCH IS FOUND ERRORV IS SET TO TRUE.
*
*
#
*ENDIF
ITEM ERRORV B; # BOOLEAN FOR ERROR SIGNAL #
ITEM PORTNO ; # PORTNO #
ITEM NODENO ; # NODE NUMBER BEING CHECKED #
ITEM INDIX; # LOOP VARIABLE #
FOR INDIX=1 STEP 1 UNTIL PLWC[0] # SCAN PLLINK TABLE #
DO
BEGIN
IF PLTYPE[INDIX] EQ 1 #LINK IS A TRUNK #
THEN
BEGIN
IF PLNID1[INDIX] EQ NODENO # TRY TO MATCH NODE NO#
THEN
BEGIN
IF PLP1[INDIX] EQ PORTNO # IF MATCH FOUND #
THEN
BEGIN
ERRORV=FALSE; #NO ERROR #
RETURN;
END
END
ELSE
BEGIN
IF PLNID2[INDIX] EQ NODENO # IF MATCH FOUND #
THEN
BEGIN
IF PLP2[INDIX] EQ PORTNO # IF PORTNO MATCH #
THEN
BEGIN
ERRORV= FALSE ; # NO ERRROR #
RETURN ; # RETURN CONTROL TO CALLING PROGRAM #
END
END
END
END
END # END FOR LOOP #
ERRORV=TRUE ; # NO MATCH FOUND #
RETURN;
END # END OF CHECKPORT #
CONTROL EJECT;
PROC CHECKERR (NODENO) ;
*IF,DEF,IMS
#
**
*
* CHECKERR - CHECKS FOR PORT NUMBER SPECIFICATION ERROR.
*
* Y.C. YIP 82/09/09
*
* THIS PROC CHECKS VALIDITY OF ALL PORTS USED AT A NODE NUMBER
*
* PROC CHECKERR(NODENO)
*
* ENTRY - NODENO = NODE NUMBER BEING CHECKED
*
* EXIT - NODENO = UNCHANGED.
*
* METHOD
*
* CHECKERR CALLS MAXPORT TO FIND OUT THE MAXIMUM
* PORT NUMBER FOR THAT NODE. IT THEN CALLS
* CHECKPORT TO DETECT INVALID PORT NUMBERS USED
* IN THE RANGE 1 THROUGH MAXPORT, IF SO, IT GENERATES
* ERROR 157 WITH PORT NUMBER AS THE CLARIFIER WORD.
*
#
*ENDIF
BEGIN
XREF
BEGIN
PROC NDLEM2; #REFERENCE TO PASS 2 ERROR ROUTINE #
FUNC XCDD C(10); # CONVERSION FROM INTEGER TO DISPLAY CODE#
END
ITEM ERRORC B ; #BOOLEAN FOR ERROR CONDITION #
ITEM CTEMP C(10) ; # TEMP FOR DISPLAY CODE #
ITEM MPTNO ; #MAXIMUM PORT NUMBER #
ITEM INDIX2 ; # LOOP VCARIABLE INDEX #
ITEM CONT B; # BOOLEAN TO SKIP DUPLICATE ERROR MESSAGES #
SETPTR(NODENO) ; # SETS BIT MAP #
IF B<BITPTR,1>NMAP[WRDPTR] EQ 0
THEN # NO CHECKED BEFORE #
BEGIN
B<BITPTR,1>NMAP[WRDPTR]=1; # SET MASK #
MPTNO=0; #CLEAR MAX PORT NUMBER FOR COMPARISON #
MAXPORT(NODENO,MPTNO);
# FIND OUT MAXIMUM PORT NUMBER #
ERRORC=FALSE; #PRESET ERROR#
CONT = TRUE; # SETTING CONTINUE FLAG TO TRUE #
FOR INDIX2=MPTNO STEP -1 WHILE CONT
DO
BEGIN
IF INDIX2 EQ 1 # IF LAST ENTRY #
THEN
BEGIN
CONT = FALSE; # DISCONTINUE THE LOOP #
END
CHECKPORT(ERRORC,INDIX2,NODENO);
IF ERRORC
THEN #CALLS ERROR MESSAGE DISPLAY #
BEGIN
CTEMP=XCDD(NODENO); #CONVERTS TO DISPLAY CODE #
NDLEM2(ERR157,OVCH,CTEMP); #ERROR MESSAGE#
CONT = FALSE; # AVOID DUPLICATE ERROR MESSAGES#
END
END
END
RETURN;
END # END OF CHECKERR#
CONTROL EJECT;
#*
* CHKTRUNK CODE BEGINS HERE
*
*
#
FOR INDIX1=1 STEP 1 UNTIL PLWC[0] # SCAN PL TABLE #
DO
BEGIN
IF PLTYPE[INDIX1] EQ 1 # IF LINK IS A TRUNK #
THEN
BEGIN
CHECKERR(PLNID1[INDIX1]) ; #CHECKS NODE 1 #
CHECKERR(PLNID2[INDIX1]) ; #CHECKS NODE 2 ON THE TRUNK #
END
END
END # END OF CHKTRUNK #
CONTROL EJECT;
PROC BLDNCB;
BEGIN
*IF,DEF,IMS
#
** BLDNCB - BUILD NPU CONFIGURE BLOCKS.
*
* D.K. ENDO 81/10/13
*
* THIS PROCEDURE BUILDS AN NCB FOR EACH NPU DEFINED AND WRITES IT
* TO THE NCF.
*
* PROC BLDNCB
*
* ENTRY NONE.
*
* EXIT NONE.
*
* METHOD
*
* IF NO FATAL ERRORS,
* INITIALIZE TABLES AND TABLE HEADERS.
* FOR EACH ENTRY IN THE NPU TABLE,
* CLEAR TABLES.
* ENTER NPU INFORMATION.
* ENTER PHYSICAL LINK AND LOGICAL LINK INFORMATION.
* ENTER SUPERVISOR INFORMATION.
* DO FINAL STEP TO COMPLETE NCB.
* DE-ALLOCATE TABLES.
*
#
*ENDIF
#
**** PROC BLDNCB - XREF LIST BEGINS.
#
XREF
BEGIN
PROC SSTATS; # ALLOCATES SPACE FOR TABLES ON REQUEST #
END
#
****
#
DEF CKSM$ENT # 0 #; # INITIAL CHECK SUM ENTRY -- ZERO #
DEF RT$RS$ONE # 1 #; # ROUTING TABLE STATUS -- DISABLED #
DEF RT$RS$TWO # 2 #; # ROUTING TABLE STATUS -- ROUTE TO OWN DN #
DEF RT$RS$ZERO # 0 #; # ROUTING TABLE STATUS -- ENABLED #
ITEM CRNT$NPU; # POINTER TO CRNT NPU IN NPU XREF TABLE #
ITEM CRNT$SUP; # POINTER TO CRNT SUPLINK ENTRY #
ITEM SUP$INDX; # CURRENT INDEX INTO SUPLINK TABLE #
ARRAY END$IND [0:0] S(1);
BEGIN # END OF NCB INDICATOR #
ITEM END$IDENT U(0,44,8) = [O"105"];
ITEM END$ZBYT U(0,52,8) = [0];
END
DEF MXNDT # 3 #;
DEF NFBFLNGTH # O"1000" #;
ARRAY NCF$BUFFER [0:NFBFLNGTH] S(1);
BEGIN
ITEM NCFWB (0,0,60); # CIO BUFFER FOR WRITING NCB-S #
END
ARRAY NODE$TABLE [0:MXNDT] S(1);
BEGIN
ITEM NDTNAME U(0,44,8);
ITEM NDT$ENT U(0,52,8);
ITEM NDT$TYP U(0,44,2);
ITEM NDT$NID U(0,52,8);
ITEM NDT$WRD U(0,44,16);
END
DEF MXNIT # 0 #;
ARRAY NPU$INFO [0:MXNIT] S(1);
BEGIN
ITEM NIT$DP B(0,46,1);
ITEM NIT$OP B(0,47,1);
ITEM NIT$WRD U(0,44,16);
END
CONTROL EJECT;
PROC BLDCNFG(BC$BPOS,BC$WC);
BEGIN
*IF,DEF,IMS
#
** BLDCNFG - BUILD LINE CONFIGURATION TABLE(C-TABLE).
*
* D.K. ENDO 81/10/13
*
* THIS PROCEDURE BUILDS THE LINE CONFIGURE TABLE AND
* PACKS IT INTO THE NCB.
*
* PROC BLDCNFG(BC$BPOS,BC$WPOS)
*
* ENTRY BC$BPOS = CURRENT BIT POSITION IN THE NCB BUFFER.
* BC$WPOS = CURRENT NPU WORD COUNT.
*
* EXIT BC$WPOS = UPDATED WORD COUNT WITH C-TABLE.
*
* METHOD
*
* SEARCH LINE CONFIG FILE INDEX FOR ENTRY FOR CURRENT NPU.
* IF ENTRY WAS FOUND,
* READ IN RECORD WITH CURRENT NPU-S LINE CONFIGURE INFO.
* PUT THE ENTRY COUNT IN C-TABLE HEADER.
* PUT C-TABLE IN THE NCB.
* IF ENTRY WAS FOUND,
* FOR ENTRY IN THE RECORD,
* IF -NI- VALUE IS ZERO,
* THEN,
* PUT ENTRY IN THE NCB.
* OTHERWISE,
* FOR EACH ITERATION OF THE PORT NUMBER UNTIL -NI- VALUE
* PUT ENTRY IN THE NCB.
*
#
*ENDIF
ITEM BC$BPOS; # CURRENT BIT POSITION IN NCB BUFFER #
ITEM BC$WC; # TOTAL SIZE OF NCB IN NPU WORDS #
#
**** PROC BLDCNFG - XREF LIST BEGINS HERE.
#
XREF
BEGIN
PROC SSTATS; # ALLOCATES MORE TABLE SPACE ON REQUEST #
PROC READ; # READS RECORD INTO BUFFER #
PROC READW; # READS SPECIFIED NUMBER OF WORDS #
PROC RECALL; # RETURNS CONTROL WHEN RECALL BIT IS SET #
END
#
****
#
ITEM CRNT$ENT; # POINTER TO CRNT ENTRY IN LINE CONF REC #
ITEM ENTRY$LENG; # LENGTH OF CURRENT LINE ENTRY #
ITEM FOUND B; # SET WHEN ENTRY IN INDEX IS FOUND #
ITEM I; # SCRATCH ITEM #
ITEM ITEMP; # INTEGER TEMPORARY #
ITEM ITEMP2; # SECOND INTEGER TEMPORARY #
ITEM NI$VALUE; # -NI- VALUE OF CURRENT LINE ENTRY #
ITEM STATIS; # STATUS RETURNED BY READ #
ARRAY C$TABLE$HDR [0:0] S(1);
BEGIN
ITEM CTAB$ID U(0,44,8) = [O"103"];
ITEM CTAB$ENT U(0,52,8);
ITEM CTABWORD (0,0,60);
END
CONTROL EJECT;
# #
# BLDCNFG CODE BEGINS HERE #
# #
FOUND = FALSE;
CTAB$ENT[0] = 0; # CLEAR CONFIG TABLE ENTRY COUNT #
FOR I=2 STEP LCRENTSZ WHILE NOT FOUND AND I LS LCRWC[1]
DO # SEARCH FOR ENTRY IN INDEX #
BEGIN
IF LCRNAME[I] EQ NPNAME[CRNT$NPU]
THEN # IF ENTRY IS FOUND #
BEGIN
FOUND = TRUE; # SET FOUND FLAG #
LR$RR[0] = LCRRANINDX[I+1]; # INITIALIZE FET TO READ #
LRFIRST[0] = LOC(LCRWB); # THE RECORD #
LRIN[0] = LOC(LCRWB);
LROUT[0] = LOC(LCRWB);
LRLIMIT[0] = LOC(LCRWB) + PRULNGTH + 1;
LRCODE[0] = 3;
LRILNG[0] = LCRWC[1] + 1;
LRIFWA[0] = LOC(LIN$CON$INDX);
READ(LRFET); # READ THE RECORD #
RECALL(LRFET);
CTAB$ENT[0] = LCRENT[I]; # PUT ENTRY COUNT IN C-TABL#
END # HEADER #
END
PACKWDS(LOC(C$TABLE$HDR),BC$BPOS,1,BC$WC); # HEADER -> NCB BUFFR #
IF FOUND # IF THERE WERE LINES DEFINED ON THIS NPU #
THEN
BEGIN
STATIS = TRNS$OK; # INITIALIZE STATUS #
FOR CRNT$ENT=0 WHILE STATIS EQ TRNS$OK
DO # FOR EACH ENTRY #
BEGIN # MOVE TEMPLET TO ENTRY #
READW(LRFET,LIN$CON$REC,1,STATIS); # READ HEADER OF ENTRY #
IF STATIS EQ TRNS$OK # IF NOT END OF RECORD #
THEN
BEGIN
ENTRY$LENG = LCWC[0]; # SAVE LENGTH OF ENTRY #
NI$VALUE = LCNI[0]; # SAVE -NI- VALUE FOR ENTRY #
READW(LRFET,LIN$CON$REC,ENTRY$LENG,STATIS);
IF NI$VALUE EQ 0 # IF NOT A GROUP DEFINITION #
THEN
BEGIN # PUT ENTRY IN NCB BUFFER #
PACKWDS(P<LIN$CON$REC>,BC$BPOS,ENTRY$LENG,BC$WC);
END
ELSE # THIS ENTRY IS A GROUP #
BEGIN
ITEMP2 = LCPORT[0] + NI$VALUE - 1;
FOR ITEMP=LCPORT[0] STEP 1 UNTIL ITEMP2
DO # FOR EACH ITERATION #
BEGIN # PUT ENTRY IN NCB BUFFER #
LCPORT[0] = ITEMP; # SET PORT FIELD #
PACKWDS(P<LIN$CON$REC>,BC$BPOS,ENTRY$LENG,BC$WC);
END
END
END
END
END
RETURN; # **** RETURN **** #
END # BLDCNFG #
CONTROL EJECT;
PROC LINK$INFO;
BEGIN
*IF,DEF,IMS
#
** LINK$INFO - MAKE ENTRIES FOR TRUNKS AND COUPLERS.
*
* D.K. ENDO 81/10/21
*
* THIS PROCEDURE ENTERS COUPLER AND TRUNK INFORMATION INTO THE
* NODE, LINK, AND ROUTING TABLES.
*
* PROC LINK$INFO
*
* ENTRY NONE.
*
* EXIT NONE.
*
* METHOD
*
* FOR EACH ENTRY IN THE PHYSICAL LINK XREF TABLE:
* SELECT CASE THAT APPLIES:
* CASE 1(COUPLER):
* IF THIS COUPLER BELONGS TO CURRENT NPU,
* MAKE ENTRY IN N-TABLE FOR THIS COUPLER.
* MAKE ENTRY IN L-TABLE FOR THIS COUPLER.
* ENTER THE LINK ORDINAL FOR THIS COUPLER INTO R-TABLE.
* DETERMINE ROUTING STATUS FOR THIS COUPLER.
* CASE 2(TRUNK):
* IF CURRENT NPU IS REFERENCED BY THIS TRUNK,
* MAKE ENTRY IN L-TABLE FOR THIS TRUNK.
* FOR EACH ENTRY IN THE LOGLINK XREF TABLE:
* IF BOTH LOGLINK NPU NODE ID = BOTH TRUNK NODE ID,
* IF ORIGIN NODE ID OF NPU = CURRENT NPU NODE ID,
* THEN,
* ENTER LINK ORDINAL IN R-TABLE ENTRY FOR TERM NODE.
* OTHERWISE,
* ENTER LINK ORDINAL IN R-TABLE ENTRY FOR HOST NODE.
*
#
*ENDIF
#
**** PROC LINK$INFO - XREF LIST BEGINS.
#
XREF
BEGIN
PROC SSTATS; # ALLOCATES TABLE SPACE ON REQUEST #
END
#
****
#
DEF LKT$ST$ONE # 1 #; # LINK TABLE STATUS -- DISABLED #
DEF LKT$ST$TWO # 2 #; # LINK TABLE STATUS -- ENABLED, NO LOAD #
DEF LKT$TYP$TRNK # 1 #;# LINK TABLE TYPE -- INDICATES A TRUNK #
ITEM I; # SCRATCH ITEM #
ITEM J; # SCRATCH ITEM #
ITEM RS$POS; # POINTER TO CURRENT ROUTING STAT POSITION#
SWITCH LINKJUMP COUPLER,
TRUNK;
# LINK$INFO CODE BEGINS HERE #
# #
RS$POS = 2; # POINT TO 2ND ROUTING STATUS POSITION #
FOR I=1 STEP 1 UNTIL PLWC[0]
DO # FOR EACH ENTRY IN THE PHYSICAL LINK TAB #
BEGIN
IF LKT$LENG LQ LKT$ENT[0] + 1
THEN # NEED TO ALLOCATE MORE TABLE SPACE #
BEGIN
SSTATS(P<LINK$TABLE>,5);
END
GOTO LINKJUMP[PLTYPE[I]]; # JUMP TO APPROPRIATE PARAGRAPH #
COUPLER:
IF PLNID1[I] EQ NPNID[CRNT$NPU]
THEN # IF CRNT NPU SUPPORTS THIS COUP#
BEGIN
NDT$ENT[0] = NDT$ENT[0] + 1; # MAKE ENTRY IN L-TABL#
NDT$NID[NDT$ENT[0]] = PLHNID[I];
LKT$ENT[0] = LKT$ENT[0] + 1; # MAKE ENTRY IN N-TABL#
LKT$ADD[LKT$ENT[0]] = PLLOC[I] + 1;
RT$LO[PLHNID[I]] = LKT$ENT[0]; # ENTER LO IN R-TABLE #
B<RS$POS,2>RT$RS[PLHNID[I]] = RT$RS$TWO;
FOR J=1 STEP 1 UNTIL LLWC[0]
DO # DETERMINE ROUTING STATUS BY #
BEGIN # GOING THRU LOGLINK XREF #
IF LLHNID1[J] EQ PLHNID[I]
THEN # HOST NODE 1 MATCHES CRNT COUP #
BEGIN
IF LLST[J] # IF LOGLINK IS DISABLE #
THEN
BEGIN # SET CORRESPONDING ROUTING STAT#
B<RS$POS,2>RT$RS[LLHNID2[J]] = RT$RS$ONE;
END
ELSE # LOGLINK IS ENABLED #
BEGIN # SET CORRESPONDING ROUTING STAT#
B<RS$POS,2>RT$RS[LLHNID2[J]] = RT$RS$ZERO;
END
END
ELSE # HOST NODE 1 DOES NOT MATCH CRNT COUPLER #
BEGIN
IF LLHNID2[J] EQ PLHNID[I]
THEN # HOST NODE 2 MATCHES CRNT COUP #
BEGIN
IF LLST[J] # IF LOGLINK IS DISABLED #
THEN
BEGIN # SET CORRESPONDING ROUTING STAT#
B<RS$POS,2>RT$RS[LLHNID1[J]] = RT$RS$ONE;
END
ELSE # LOGLINK IS ENABLED #
BEGIN # SET CORRESPONDING ROUTING STAT#
B<RS$POS,2>RT$RS[LLHNID1[J]] = RT$RS$ZERO;
END
END
END
END
RS$POS = RS$POS + 2; # POINT TO NEXT ROUTING STATUS #
END # POSITION #
TEST I;
TRUNK:
IF PLNID1[I] EQ NPNID[CRNT$NPU] OR
PLNID2[I] EQ NPNID[CRNT$NPU]
THEN # IF CRNT NPU SUPPORTS THIS TRNK#
BEGIN # MAKE TRUNK ENTRY IN L-TABLE #
LKT$ENT[0] = LKT$ENT[0] + 1;
LKT$FRAME[LKT$ENT[0]] = PLFRAME[I] ; # ASSIGN FRAME CODE #
LKT$TYP[LKT$ENT[0]] = LKT$TYP$TRNK;
IF PLNID1[I] EQ NPNID[CRNT$NPU]
THEN # IF CRNT NPU IS NODE ID 1 #
BEGIN
LKT$ADD[LKT$ENT[0]] = PLP1[I]; # PUT PORT NUM IN ENTRY #
RT$LO[PLNID2[I]] = LKT$ENT[0]; # PUT LINK ORD IN ROUT TBL#
IF PLST[I] # IF TRUNK IS DISABLED #
THEN
BEGIN
LKT$ST[LKT$ENT[0]] = LKT$ST$ONE; # ENTER STATUS #
END
ELSE # TRUNK IS ENABLED #
BEGIN
IF PLNLD2[I] # IF NOLOAD2 IS SET #
THEN
BEGIN
LKT$ST[LKT$ENT[0]] = LKT$ST$TWO; # ENTER STATUS #
END
END
END
ELSE # CRNT NPU IS NODE ID 2 #
BEGIN
LKT$ADD[LKT$ENT[0]] = PLP2[I]; # PUT PORT NUM IN ENTRY #
RT$LO[PLNID1[I]] = LKT$ENT[0]; # PUT LINK ORD IN ROUT TBL#
IF PLST[I] # IF TRUNK IS DISABLED #
THEN
BEGIN
LKT$ST[LKT$ENT[0]] = LKT$ST$ONE; # ENTER STATUS #
END
ELSE # TRUNK IS ENABLED #
BEGIN
IF PLNLD1[I] # IF NOLOAD1 IS SET #
THEN
BEGIN
LKT$ST[LKT$ENT[0]] = LKT$ST$TWO; # ENTER STATUS #
END
END
END
FOR J=1 STEP 1 UNTIL LLWC[0]
DO # ENTER LINK ORDINAL IN R-TABLE #
BEGIN # BY GOING THRU LOGLINK XREF #
IF (LLNID1[J] EQ PLNID1[I] AND LLNID2[J] EQ PLNID2[I]) OR
(LLNID2[J] EQ PLNID1[I] AND LLNID1[J] EQ PLNID2[I])
THEN
BEGIN
IF LLNID1[J] EQ NPNID[CRNT$NPU]
THEN # IF ORIGIN NODE ID OF NPU #
BEGIN # MATCHES CRNT NPU NODE ID #
RT$LO[LLHNID2[J]] = LKT$ENT[0];
END # ENTER LO IN T-NODE ID ENTRY #
ELSE # ORIGIN AND CRNT NPU NODE ID DO NOT MATCH#
BEGIN # ENTER LO IN HOST NODE ID ENTRY#
RT$LO[LLHNID1[J]] = LKT$ENT[0];
END
END
END
END
END
RETURN; # **** RETURN **** #
END # LINK$INFO #
CONTROL EJECT;
PROC NCBINIT;
BEGIN
*IF,DEF,IMS
#
** NCBINIT - NCB INITIALIZATION.
*
* D.K. ENDO 81/10/22
*
* THIS PROCEDURE ALLOCATES AND INITIALIZES TABLES FOR BUILDING NCB.
*
* PROC NCBINIT
*
* ENTRY NONE.
*
* EXIT NONE.
*
* METHOD
*
* POINT NCF FET TO CIO BUFFER.
* INITIALIZE VERSION TABLE.
* CLEAR NPU INFO ENTRY.
* INITIALIZE NODE TABLE.
* ALLOCATE AND INITIALIZE LINK TABLE.
* SORT THE PHYSICAL LINK TABLE.
* DETERMINE THE MAXIMUM NODE I.D. USED.
* ALLOCATE AND INITIALIZE ROUTING TABLE (SIZE = MAX NODE I.D.).
* ALLOCATE AND INITIALIZE SUPERVISOR TABLE.
* ALLOCATE AND INITIALIZE HOST TABLE.
* ALLOCATE BUFFER FOR PACKING NCB IN.
*
#
*ENDIF
#
**** PROC NCBINIT - XREF LIST BEGINS.
#
XREF
BEGIN
PROC SSTATS; # ALLOCATES TABLE SPACE ON REQUEST #
END
#
****
#
ITEM I; # SCRATCH ITEM #
ITEM MAX$NID; # HIGHEST NODE I.D. USED #
DEF COUP$TYPE # 0 #; # VALUE IN PLINK TBL INDICATING A COUPLER #
DEF HT$ID # O"110" #; # HOST TABLE IDENTIFIER -- ASCII -H- #
DEF LKT$ID # O"114" #; # LINK TABLE IDENTIFIER -- ASCII -L- #
DEF NDT$ID # O"116" #; # NODE TABLE IDENTIFIER -- ASCII -N- #
DEF RT$ID # O"122" #; # ROUTING TABLE IDENTIFIER -- ASCII -R- #
DEF ST$ID # O"123" #; # SUPERVISORY TABLE IDENT -- ASCII -S- #
DEF RT$TYP$TNODE # 1 #;# ROUTING TABLE TYPE FOR TERMINAL NODE #
# NCBINIT CODE BEGINS HERE #
# #
NCFFIRST[0] = LOC(NCFWB[0]); # POINT NCF FET TO BUFFER #
NCFIN[0] = LOC(NCFWB[0]);
NCFOUT[0] = LOC(NCFWB[0]);
NCFLIMIT[0] = LOC(NCFWB[0]) + NFBFLNGTH + 1;
# INITIALIZE NPU INFORMATION ENTRY #
NIT$WRD[0] = 0; # CLEAR ENTRY #
# INITIALIZE NODE TABLE #
FOR I=0 STEP 1 UNTIL MXNDT
DO
BEGIN
NDT$WRD[I] = 0; # CLEAR NODE TABLE #
END
NDTNAME[0] = NDT$ID; # ENTER TABLE IDENTIFIER #
# INITIALIZE LINK TABLE #
SSTATS(P<LINK$TABLE>,MXLKT); # ALLOCATE SPACE FOR LINK TABLE#
FOR I=0 STEP 1 UNTIL MXLKT
DO
BEGIN
LKTWORD[I] = 0; # CLEAR TABLE #
END
LKTNAME[0] = LKT$ID; # ENTER TABLE IDENTIFIER #
# INITIALIZE ROUTING TABLE #
MAX$NID = 0; # CLEAR MAXIMUM NODE I.D. #
FOR I=1 STEP 1 UNTIL NPWC[0]
DO # CHECK NPU XREF FOR MAX NODE I.D. #
BEGIN
IF NPNID[I] GR MAX$NID
THEN
BEGIN
MAX$NID = NPNID[I];
END
END
# SORT PHYSICAL LINK XREF TABLE #
NDLSST(PLINK$XREF,2,0,42,2,PLWC[0]/2);
FOR I=1 STEP 1 UNTIL PLWC[0]
DO # CHECK PHYSICAL LINK XREF FOR MAX NODE ID#
BEGIN
IF PLTYPE[I] EQ COUP$TYPE
THEN
BEGIN
IF PLHNID[I] GR MAX$NID
THEN
BEGIN
MAX$NID = PLHNID[I];
END
END
END # ALLOC SPACE FOR ROUTING TABLE #
SSTATS(P<ROUTING$TABL>,MAX$NID + 1);
FOR I=0 STEP 1 UNTIL MAX$NID
DO
BEGIN
RTWORD[I] = 0; # CLEAR TABLE #
END
RTNAME[0] = RT$ID; # ENTER ROUTING TABLE IDENTIFIER #
RT$ENT[0] = MAX$NID; # SET ENTRY COUNT #
FOR I=1 STEP 1 UNTIL NPWC[0]
DO # IDENTIFY TERMINAL NODES IN TABLE #
BEGIN
RT$TYP[NPNID[I]] = RT$TYP$TNODE;
END
# INITIALIZE SUPERVISOR TABLE #
SSTATS(P<SUP$TABLE>,MXSUPT); # ALLOCATE SPACE FOR TABLE #
FOR I=0 STEP 1 UNTIL MXSUPT
DO
BEGIN
ST$WRD[0] = 0; # CLEAR TABLE #
END
ST$NAM[0] = ST$ID; # ENTER TABLE IDENTIFIER #
# INITIALIZE HOST TABLE #
SSTATS(P<HOST$TABLE>,MXHT); # ALLOCATE SPACE FOR TABLE #
FOR I=0 STEP 1 UNTIL MXHT
DO
BEGIN
HTWORD[I] = 0; # CLEAR TABLE #
END
HTNAME[0] = HT$ID; # ENTER TABLE IDENTIFIER #
# ALLOC SPACE FOR LINE CONFIG REC BUFFER #
IF LC$LENG LS MXLC
THEN # IF NOT ENOUGH SPACE FOR ONE ENTRY #
BEGIN
SSTATS(P<LIN$CON$REC>,MXLC - LC$LENG);
END
# INITIALIZE NCB BUFFER #
SSTATS(P<NCB$BUFFER>,MXNCB); # ALLOCATE SPACE FOR BUFFER #
# OTHER INITIALIZATION #
CRNT$SUP = 1; # INITIALIZE POINTER INTO SUPERVISOR TABLE#
RETURN; # **** RETURN **** #
END # NCBINIT #
CONTROL EJECT;
PROC NCBTERM;
BEGIN
*IF,DEF,IMS
#
** NCBTERM - NCB TERMINATION
*
* D.K. ENDO 81/10/22
*
* THIS PROCEDURE PACKS THE NCB AND CALLS LFG PROCEDURES TO FORMAT
* IT INTO NPU DATA SERVICE MESSAGES.
*
* PROC NCBTERM
*
* ENTRY NONE.
*
* EXIT NONE.
*
* METHOD
*
* SORT HOST TABLE.
* PACK TABLES INTO NCB BUFFER.
* CALCULATE THE NUMBER OF PACKETS THE NCB IS.(PACKET = 105 NPU WRDS)
* FOR EACH PACKET:
* CALCULATE THE CHECK SUM.
* MOVE WORDS INTO SM BUFFER.
* CREATE SM HEADER AND WRITE TO NCF.
*
#
*ENDIF
#
**** PROC NCBTERM - XREF LIST BEGINS.
#
XREF
BEGIN
PROC ABORT; # CAUSES NDLP TO ABORT #
PROC LFGCKSM; # CALCULATE CHECK SUM #
PROC LFGHDRW; # CREATES HEADER AND WRITES SM TO FILE #
PROC LFGMOVW; # MOVES WORD INTO SM BUFFER #
PROC MESSAGE; # SENDS MESSAGE TO DAYFILE #
END
#
****
#
XDEF
BEGIN
BASED ARRAY WFET [0:0] S(5);
BEGIN # BASED ARRAY USED TO POINT TO NCF FET #
ITEM WFET$WRD (0,0,60);
END
BASED ARRAY OUTPUT [0:0] S(5);
BEGIN # BASED ARRAY USED TO POINT TO OUTPUT FET #
ITEM OUTPUT$WRD (0,0,60);
END
END
DEF DEFBC$ # 64 #; # DEFAULT BATCH COUNT VALUE #
DEF BPOS # 36 #; # BIT POSITION COUNTED FROM LEFT FOR SHIFT#
DEF NCF$MEMINC # 20 #; # NCF$INDEX DYNMC MEMORY ALLOC INCREMENTS #
DEF PSIZE16 # 105 #; # PACKET SIZE IN 16 BIT WORDS #
DEF PSIZE60 # 28 #; # PACKET SIZE IN 60 BIT WORDS #
DEF WPOS # 2 #; # WORD POSITION FOR SHIFTING #
ITEM BIT$POS; # CURRENT BIT POSITION FOR PACKING NCB #
ITEM CKSUM; # CHECK SUM VALUE #
ITEM CRNT$WORD; # POINTER TO NEXT PACKET IN NCB BUFFER #
ITEM DUMMY; # SCRATCH ITEM #
ITEM EOP B; # END OF PARTITION FLAG #
ITEM I; # SCRATCH ITEM #
ITEM IW60; # NUMBER OF 60 BIT WORDS MOVED #
ITEM J; # SCRATCH ITEM #
ITEM LPAK; # NUMBER OF 16 BIT WORDS IN LAST PACKET #
ITEM NEW$P B; # NEW PARTITION FLAG #
ITEM NPAK; # NUMBER OF PACKETS #
ITEM NWDS16; # NUMBER OF 16 BIT WORDS #
ITEM SUCCESS B; # STATUS FLAG RETURNED BY LFGHDRW #
ITEM WC16; # NUMBER OF 16 BIT WORDS IN NCB #
ARRAY INDEX$ENTRY [0:0] S(1);
BEGIN
ITEM IE$TYPE U(0,0,12) = [O"1603"]; # RECORD TYPE #
ITEM IENID U(0,12,8); # NPU NODE I.D. #
ITEM IEWC U(0,20,16); # NCB 16-BIT WORD CNT #
ITEM IEZFIL U(0,36,24) = [0]; # ZERO FILL WORD #
ITEM IEWORD (0,0,60);
END
ARRAY NCBERR [0:0] S(3);
BEGIN
ITEM NCBMSG C(0,0,20) = [" NCB CREATION ERROR."];
ITEM NCBZBYT (2,0,60) = [0];
END
ARRAY RECORD$HDR [0:0] S(1);
BEGIN
ITEM RHNAME C(0,0,7) = ["NCB"]; # RECORD NAME #
ITEM RHZFIL U(0,42,18) = [0]; # ZERO FILL WORD #
ITEM RHWORD (0,0,60);
END
# #
# NCBTERM CODE BEGINS HERE #
# #
WC16 = 0;
BIT$POS = 0;
NCBWC[0] = 1;
# PACK CHECK SUM ENTRY INTO NCB BUFFER #
I = 0; # SAME AS CKSM$ENT #
PACKWDS(LOC(I),BIT$POS,1,WC16);
# PACK NPU INFORMATION INTO NCB BUFFER #
PACKWDS(LOC(NPU$INFO),BIT$POS,1,WC16);
# PACK NODE TABLE INTO NCB BUFFER #
PACKWDS(LOC(NODE$TABLE),BIT$POS,NDT$ENT[0]+1,WC16);
# PACK LINK TABLE INTO NCB BUFFER #
PACKWDS(P<LINK$TABLE>,BIT$POS,LKT$ENT[0] + 1,WC16);
# PACK ROUTING TABLE INTO NCB BUFFER #
PACKWDS(P<ROUTING$TABL>,BIT$POS,RT$ENT[0]+1,WC16);
# SORT HOST TABLE #
FRST$WRD = 1; # OFFSET OF FIRST WORD TO BE SORTED #
BBP = 0; # BEGINNING BIT POSITION OF KEY #
MASK = 42; # LENGTH IN BITS OF KEY #
NDLSST(HOST$TABLE,FRST$WRD,BBP,MASK,HTENTSZ,HT$ENT[0]);
# SORT HOST TABLE #
# PACK HOST TABLE INTO NCB BUFFER #
NWDS16 = (HT$ENT[0] * HTENTSZ) + 1;
PACKWDS(P<HOST$TABLE>,BIT$POS,NWDS16,WC16);
# PACK SUPERVISOR TABLE INTO NCB BUFFER #
PACKWDS(P<SUP$TABLE>,BIT$POS,ST$ENT[0] + 1,WC16);
# BUILD LINE CONFIG TABLE AND PACK INTO BUFF#
BLDCNFG(BIT$POS,WC16);
# PACK END INDICATOR INTO NCB BUFFER #
PACKWDS(LOC(END$IND),BIT$POS,1,WC16);
# CALCULATE REST OF CHECK SUM AND PUT IN NCB#
# CHECK SUM NCB AND ADD TO TOTAL #
LFGCKSM(LOC(NCBWORD[1]),43,WC16-1,CKSUM);
NPCKSM[CRNT$NPU] = NPCKSM[CRNT$NPU] + CKSUM;
# CHECK SUM NPU XREF ENTRY AND ADD TO TOTAL #
LFGCKSM(LOC(NPWORD[CRNT$NPU]),59,7,CKSUM);
NPCKSM[CRNT$NPU] = NPCKSM[CRNT$NPU] + CKSUM;
# CHECK SUM VERSION/LEVEL AND ADD TO TOTAL #
LFGCKSM(LOC(PT$PVER[0]),15,1,CKSUM);
NPCKSM[CRNT$NPU] = NPCKSM[CRNT$NPU] + CKSUM;
NPCSSB[CRNT$NPU] = TRUE; # SET CHECK SUM SIGN BIT #
B<0,16>NCBWORD[1] = NPCKSM[CRNT$NPU]; # PUT CHECK SUM IN NCB #
# FORMAT NCB INTO SM AND WRITE TO NCF #
NPAK = WC16 / PSIZE16; # CALCULATE NUMBER OF PACKETS #
LPAK = WC16 - (NPAK * PSIZE16); # CALCULATE REMAINDER #
IF LPAK NQ 0 # IF REMAINDER IS NOT ZERO #
THEN
BEGIN
NPAK = NPAK + 1; # INCREMENT NUMBER OF PACKETS #
END
CRNT$WORD = 1; # SET POINTER TO 1ST WORD OF BUF#
NEW$P = TRUE; # SET NEW PARTITION FLAG #
NWDS16 = PSIZE16; # SET NUMBER OF WORDS IN PACKET #
IENID[0] = NPNID[CRNT$NPU]; # PUT NPU NODE ID IN INDEX WORD #
IEWC[0] = WC16; # PUT WORD COUNT IN INDEX WORD #
J = 0; # CLEAR SCRATCH ITEM FOR BEGINNING ADDR #
P<WFET> = LOC(NCFFET); # POINT ARRAY TO NCF FET #
P<OUTPUT> = LOC(OUTFET); # POINT ARRAY TO OUTPUT FET #
EOP = FALSE; # CLEAR END OF PARTITION FLAG #
IF NCF$LENG LQ (NCFWC[0]+1)*NCFENTSZ
THEN # ALLOCATE MORE MEMORY FOR NCF #
BEGIN # INDEX IF NEEDED #
SSTATS(P<NCF$INDEX>,NCF$MEMINC);
END
FOR I=1 STEP 1 UNTIL NPAK
DO # FOR EACH PACKET #
BEGIN
IF I EQ NPAK # IF THIS IS LAST PACKET #
THEN
BEGIN
EOP = TRUE; # SET END OF PARTITION FLAG #
IF LPAK NQ 0 # IF LAST PACKET IS SMALLER THAN OTHER #
THEN # PACKETS #
BEGIN
NWDS16 = LPAK; # SET NUMBER OF WORDS TO PACKET SIZE #
END
END
# CALCULATE CHECK SUM #
LFGCKSM(LOC(NCBWORD[CRNT$WORD]),59,NWDS16,CKSUM);
# MOVE WORDS INTO SM BUFFER #
LFGMOVW(CRNT$WORD,WPOS,BPOS,NWDS16,IW60,CKSUM,NCB$BUFFER);
# CREATE HEADER AND WRITE TO NCF #
LFGHDRW(IEWORD[0],RHWORD[0],IW60,NWDS16,NEW$P,TRUE,EOP,J,DUMMY,
SUCCESS,0,0,0,DEFBC$,NCF$INDEX);
IF NOT SUCCESS
THEN # IF NCB WRITE WAS NOT SUCCESSFUL #
BEGIN
MESSAGE(NCBERR,0); # PUT MESSAGE INTO DAYFILE #
ABORT; # ABORT JOB #
END
CRNT$WORD = CRNT$WORD + PSIZE60; # MOVE POINTER TO NEXT PACKET #
END
RETURN; # **** RETURN **** #
END # NCBTERM #
CONTROL EJECT;
PROC NPUINFO;
BEGIN
*IF,DEF,IMS
#
** NPUINFO - NPU INFORMATION.
*
* D.K. ENDO 81/10/22
*
* THIS PROCEDURE ENTERS NPU INFORMATION INTO THE NODE TABLE AND NPU
* INFORMATION ENTRY. IT ALSO SETS THE ROUTING STATUS AND BUILDS THE
* HOST TABLE.
*
* PROC NPUINFO
*
* ENTRY NONE.
*
* EXIT NONE.
*
* METHOD
*
* CLEAR THE NODE, LINK, HOST AND SUPERVISOR TABLES.
* SET ALL THE ROUTING STATUS FIELDS TO -LOCKED-.
* MAKE OP ENTRY IN NPU INFORMATION ENTRY.
* MAKE ENTRY IN NODE TABLE FOR CRNT NPU.
* SET ROUTING STATUS FOR CRNT NPU TO -ROUTING TO SELF-.
* FOR EACH ENTRY IN THE LOGLINK XREF TABLE:
* IF CURRENT NPU NODE ID = TERMINAL NODE ID OF THIS LOGLINK,
* IF LOGLINK IS DISABLED,
* THEN,
* SET THE STATUS CORRESPONDING TO THE HOST NODE TO -DISABLED-.
* OTHERWISE,
* SET THE STATUS CORRESPONDING TO THE HOST NODE TO -ENABLED-.
* MAKE ENTRY IN HOST TABLE FOR THIS HOST.
*
#
*ENDIF
#
**** PROC NPUINFO - XREF LIST BEGINS.
#
XREF
BEGIN
PROC SSTATS; # ALLOCATES MORE TABLE SPACE ON REQUEST #
END
#
****
#
DEF NDT$TNODE # 1 #; # VALUE INDICATING TERMINAL NODE #
ITEM HT$PNTR; # POINTER INTO HOST TABLE #
ITEM I; # SCRATCH ITEM #
ITEM J; # SCRATCH ITEM #
DEF MXAT # 45 #;
ARRAY ASCII$TABLE [0:MXAT] S(1); # TABLE TO CONVERT DISPLAY CODE #
BEGIN # TO ASCII #
ITEM A$CHAR (0,0,60) = [O"72", # COLON #
O"101", # A #
O"102", # B #
O"103", # C #
O"104", # D #
O"105", # E #
O"106", # F #
O"107", # G #
O"110", # H #
O"111", # I #
O"112", # J #
O"113", # K #
O"114", # L #
O"115", # M #
O"116", # N #
O"117", # O #
O"120", # P #
O"121", # Q #
O"122", # R #
O"123", # S #
O"124", # T #
O"125", # U #
O"126", # V #
O"127", # W #
O"130", # X #
O"131", # Y #
O"132", # Z #
O"060", # 0 #
O"061", # 1 #
O"062", # 2 #
O"063", # 3 #
O"064", # 4 #
O"065", # 5 #
O"066", # 6 #
O"067", # 7 #
O"070", # 8 #
O"071", # 9 #
,,,,,,,, # +,-,*,/,(,>,$,= #
O"040" # BLANK #
];
END
CONTROL EJECT;
# #
# NPUINFO CODE BEGINS HERE #
# #
# CLEAR AND INITIALIZE TABLES #
NIT$WRD[0] = 0; # CLEAR NPU INFO ENTRY #
NDT$ENT[0] = 0; # CLEAR NODE TABLE ENTRY COUNT #
FOR I=1 STEP 1 UNTIL MXNDT
DO
BEGIN
NDT$WRD[I] = 0; # CLEAR NODE TABLE #
END
LKT$ENT[0] = 0; # CLEAR LINK TABLE ENTRY COUNT #
FOR I=1 STEP 1 UNTIL LKT$LENG-1
DO
BEGIN
LKTWORD[I] = 0; # CLEAR ENTRY COUNT #
END
FOR I=1 STEP 1 UNTIL RT$ENT[0]
DO
BEGIN
RT$RS[I] = O"77"; # SET ROUTING STATUS TO LOCKED #
RT$LO[I] = 0; # CLEAR POINTERS TO LINK TABLE #
END
HT$ENT[0] = 0; # CLEAR HOST TABLE ENTRY COUNT #
FOR I=1 STEP 1 UNTIL HT$LENG - 1
DO
BEGIN
HTWORD[I] = 0; # CLEAR HOST TABLE #
END
HT$PNTR = 1; # INITIALIZE CRNT POINTER INTO TABLE #
ST$ENT[0] = 0; # CLEAR SUPERVISOR TABLE ENTRY COUNT #
FOR I=1 STEP 1 UNTIL ST$LENG - 1
DO
BEGIN
ST$WRD[I] = 0; # CLEAR SUPERVISOR TABLE #
END
# ENTER NPU INFORMATION #
NIT$DP[0] = NPDMP[CRNT$NPU]; # SET DUMP FLAG #
NIT$OP[0] = NPOPGO[CRNT$NPU]; # SET OPERATOR GO STATUS #
NDT$ENT[0] = 1; # SET NODE TABLE ENTRY COUNT #
NDT$TYP[NDT$ENT[0]] = NDT$TNODE; # SET 1ST ENTRY TO TERMINAL NODE#
NDT$NID[NDT$ENT[0]] = NPNID[CRNT$NPU]; # SET NODE I.D. #
B<0,2>RT$RS[NPNID[CRNT$NPU]] = RT$RS$TWO; # SET STATUS #
FOR I=1 STEP 1 UNTIL LLWC[0]
DO # FOR EACH ENTRY IN THE LOGLINK #
BEGIN # XREF TABLE #
IF LLHNID2[I] EQ NPNID[CRNT$NPU]
THEN # IF LOGLINK IS TO CRNT NPU #
BEGIN # SET ROUTING STATUS #
IF LLST[I]
THEN
BEGIN # SET STATUS TO DISABLED #
B<0,2>RT$RS[LLHNID1[I]] = 1;
END
ELSE
BEGIN # SET STATUS TO ENABLED #
B<0,2>RT$RS[LLHNID1[I]] = 0;
END
HT$ENT[0] = HT$ENT[0] + 1; # INCREMENT HOST TABLE ENTRY CNT#
IF HT$ENT[0] * HTENTSZ GQ HT$LENG
THEN # IF NEED MORE TABLE SPACE #
BEGIN
SSTATS(P<HOST$TABLE>,HTENTSZ); # ALLOCATE MORE SPACE #
END
HT$SORT[HT$PNTR] = LLHNAME[I]; # ENTER HOST NAME TO BE #
# SORTED #
HT$RO[HT$PNTR] = LLHNID1[I]; # ENTER ROUTING ORDINAL #
HT$CH2[HT$PNTR] = A$CHAR[C<0,1>LLHNAME[I]];
HT$PNTR = HT$PNTR + 1;
FOR J=1 STEP 2 UNTIL 5
DO # CONVERT HOST NAME TO ASCII AND PUT IN #
BEGIN # TABLE #
HT$CH1[HT$PNTR] = A$CHAR[C<J,1>LLHNAME[I]];
HT$CH2[HT$PNTR] = A$CHAR[C<J+1,1>LLHNAME[I]];
HT$PNTR = HT$PNTR + 1;
END
END
END
RETURN; # **** RETURN **** #
END # NPUINFO #
CONTROL EJECT;
PROC PACKWDS(TABLE,BIT,WC,TOTALWC);
BEGIN
*IF,DEF,IMS
#
** PACKWDS - PACK WORDS INTO NCB BUFFER.
*
* D.K. ENDO 81/10/22
*
* THIS PROCEDURE, GIVEN A TABLE, PACKS THE TABLE INTO THE NCB
* BUFFER.
*
* PROC PACKWDS(TABLE,BIT,WC,TOTALWC)
*
* ENTRY TABLE = NCB TABLE TO BE PACKED.
* BIT = CURRENT BIT TO BEGIN PACKING WORDS.
* WC = TOTAL NUMBER OF NPU WORDS IN TABLE.
* TOTALWC = TOTAL NUMBER OF NPU WORDS PACKED SO FAR.
*
* EXIT TOTALWC = TOTAL NUMBER OF NPU WORDS INCLUDING TABLE
* JUST PACKED.
*
* METHOD
*
* FOR EACH NPU WORD:
* IT CAN FIT AT LEAST ONE MORE NPU INTO CRNT CP WORD,
* THEN,
* PACK NPU WORD.
* INCREMENT BIT POSITION.
* OTHERWISE,
* IF BIT POSITION POINTS TO END OF CP WORD,
* THEN,
* INCREMENT CP WORD COUNT.
* POINT BIT POSITION TO BEGINNING OF NEW WORD.
* PACK NPU WORD
* INCREMENT BIT POSITION
* OTHERWISE,
* CALCULATE REMAINING SPACE IN CP WORD
* PACK WHAT CAN FIT OF NPU WORD
* INCREMENT CP WORD COUNT
* POINT BIT POSITION TO BEGINNING OF NEW WORD.
* PACK REMAINDER OF NPU WORD
* RE-SET BIT POSITION.
*
#
*ENDIF
BASED ARRAY TABLE [1:1] S(1);
BEGIN
ITEM T$ENT U(0,44,16);
END
ITEM BIT; # CURRENT BIT POSITION #
ITEM WC; # WORD COUNT OF TABLE #
ITEM TOTALWC; # TOTAL WORD COUNT IN NCB #
# #
ITEM INDX; # INDEX FOR TABLE #
ITEM J; # SCRATCH ITEM #
ITEM K; # SCRATCH ITEM #
CONTROL EJECT;
# #
# PACKWDS CODE BEGINS HERE #
# #
FOR INDX=1 STEP 1 UNTIL WC
DO # FOR EACH ENTRY IN TABLE #
BEGIN
IF BIT LQ 44 # IF CAN FIT AT LEAST ONE MORE ENTRY #
THEN
BEGIN # PACK INTO NCB BUFFER #
B<BIT,16>NCBWORD[NCBWC[0]] = T$ENT[INDX];
BIT = BIT + 16; # INCREMENT BIT POSITION #
END
ELSE # CAN NOT FIT ONE ENTRY #
BEGIN
IF BIT EQ 60 # IF POINTER IS AT VERY END OF WORD #
THEN
BEGIN
BIT = 0; # RESET BIT POSITION TO BEGIN #
NCBWC[0] = NCBWC[0] + 1; # INCREMENT BUFFER WORD COUNT #
IF NCBWC[0] GQ NCB$LENG # IF LENGTH REACHES TABLE SPACE #
THEN
BEGIN
SSTATS(P<NCB$BUFFER>,50);
END
B<BIT,16>NCBWORD[NCBWC[0]] = T$ENT[INDX]; # PACK ENTRY #
BIT = 16; # RESET BIT POSITION #
END
ELSE # MUST DIVIDE ENTRY OVER TWO WORDS #
BEGIN
J = 60 - BIT; # CALCULATE REMAINDER OF WORD #
B<BIT,J>NCBWORD[NCBWC[0]] = B<0,J>T$ENT[INDX]; # PACK ENTRY#
NCBWC[0] = NCBWC[0] + 1; # INCREMENT NCB WORD COUNT #
IF NCBWC[0] GQ NCB$LENG # IF LENGTH REACHES TABLE SPACE #
THEN
BEGIN
SSTATS(P<NCB$BUFFER>,50);
END
BIT = 0; # RESET BIT POSITION #
K = 16 - J; # CALCULATE REMAINDER OF ENTRY #
B<BIT,K>NCBWORD[NCBWC[0]] = B<J,K>T$ENT[INDX]; # PACK ENTRY#
BIT = K; # RESET BIT POSITION #
END
END
END
TOTALWC = TOTALWC + WC; # INCREMENT TOTAL WORD COUNT #
RETURN; # **** RETURN **** #
END # PACKWDS #
CONTROL EJECT;
# #
# BLDNCB CODE BEGINS HERE #
# #
IF ERRCNT EQ 0 # IF NO FATAL ERRORS WERE DETECTED #
THEN
BEGIN # INITIALIZE TABLES AND TABLE HEADERS #
NCBINIT;
FOR CRNT$NPU=1 STEP 1 UNTIL NPWC[0]
DO
BEGIN
NPUINFO; # CLEAR TABLES AND ENTER NPU INFORMATION #
LINK$INFO; # ENTER PHYSICAL LINK INFORMATION #
FOR SUP$INDX=CRNT$SUP STEP 1 WHILE (SLTNID[SUP$INDX] EQ
NPNID[CRNT$NPU]) AND NOT
(SUP$INDX GR SLTWC[0])
DO # FOR EACH SUPERVISORY LINK FOR THIS NPU #
BEGIN
ST$ENT[0] = ST$ENT[0] + 1; # INCREMENT ENTRY COUNT #
IF ST$ENT[0] GR ST$LENG # IF NEED MORE TABLE SPACE, #
THEN # REQUEST FOR MORE #
BEGIN
SSTATS(P<SUP$TABLE>,5);
END
ST$TYP[ST$ENT] = SLTTYPE[SUP$INDX]; # ENTER TYPE #
ST$RO[ST$ENT] = SLTHNID[SUP$INDX]; # ENTER ROUTING ORD #
END
CRNT$SUP = SUP$INDX;
NCBTERM; # PACK TABLE, BUILD C-TABLE, FORMAT SM, #
END # WRITE TO NCF #
# RETURN TABLE SPACE #
SSTATS(P<LINK$TABLE>,-LKT$LENG);
SSTATS(P<ROUTING$TABL>,-RT$LENG);
SSTATS(P<SUP$TABLE>,-ST$LENG);
SSTATS(P<HOST$TABLE>,-HT$LENG);
SSTATS(P<NCB$BUFFER>,-NCB$LENG);
SSTATS(P<LIN$CON$REC>,-LC$LENG);
END
RETURN; # **** RETURN **** #
END # BLDNCB #
CONTROL EJECT;
# #
# NDLNFTM CODE BEGINS HERE #
# #
CHKTRUNK ; #CALLS PROC THAT CHECKS PORTS #
BLDNCB; # CALL PROC THAT BUILDS NCB-S #
# #
FRST$WRD = 2; # SET POINTER TO 1ST WORD TO BE SORTED #
BBP = 0; # SET BEGINNING BIT POSITION POINTER #
MASK = 42; # SET NUMBER OF BITS TO BE USED AS KEY #
# SORT NPU XREF TABLE AND WRITE TO NCF #
NDLSST(NPU$XREF,FRST$WRD,BBP,MASK,NPENTSZ,NPWC[0]); # SORT TABLE #
NPWC[0] = (NPWC[0] * NPENTSZ) + 1; # CALCULATE WORD COUNT #
LENGTH = NPWC[0]+1; # SAVE LENGTH OF TABLE #
NDLWNCF(TABLE"NX",P<NPU$XREF>,LENGTH); # WRITE NPU XREF TO NCF #
# SORT PHYS LINK XREF TBL AND WRITE TO NCF #
NDLSST(PLINK$XREF,FRST$WRD,BBP,MASK,PLENTSZ,PLWC[0]); #SORT TABLE#
PLWC[0] = (PLWC[0] * PLENTSZ) + 1; # CALCULATE WORD COUNT #
LENGTH = PLWC[0] + 1; # SAVE LENGTH OF TABLE #
NDLWNCF(TABLE"PH",P<PLINK$XREF>,LENGTH); #WRT PHYS LNK TBL TO NCF#
# SORT LOGLINK XREF TABLE AND WRITE TO NCF #
NDLSST(LOGLINK$XREF,FRST$WRD,BBP,MASK,LLENTSZ,LLWC[0]);
LLWC[0] = (LLWC[0] * LLENTSZ) + 1; # CALCULATE WORD COUNT #
LENGTH = LLWC[0] + 1; # SAVE LENGTH OF TABLE #
NDLWNCF(TABLE"LL",P<LOGLINK$XREF>,LENGTH); #WRITE LL XREF TO NCF#
# SORT LINE XREF TABLE AND WRITE TO NCF #
ENT$CNT = LCTWC[1] - 1; # CALCULATE ENTRY SIZE #
NDLSST(LINE$XREF,FRST$WRD,BBP,MASK,LCTENTSZ,ENT$CNT);
LENGTH = LCTWC[1] + 1; # SAVE LENGTH OF TABLE #
NDLWNCF(TABLE"LX",P<LINE$XREF>,LENGTH); # WRITE LINE XREF TO NCF#
# SORT DEVICE XREF TABLE AND WRITE TO NCF #
ENT$CNT = DCWC[1] - 1; # CALCULATE ENTRY COUNT #
NDLSST(DEVICE$XREF,FRST$WRD,BBP,MASK,DCENTSZ,ENT$CNT);
LENGTH = DCWC[1] + 1; # SAVE LENGTH OF TABLE #
NDLWNCF(TABLE"DX",P<DEVICE$XREF>,LENGTH); #WRITE DEV XREF TO NCF#
# SORT LINE RECORD INDEX AND WRITE TO NCF #
MASK = 24; #CHANGE MASK, FRST$WRD AND BBP REMAIN SAME#
ENT$CNT = LIWC[1] - 1; # CALCULATE ENTRY COUNT #
NDLSST(LIN$REC$INDX,FRST$WRD,BBP,MASK,LIENTSZ,ENT$CNT);
LENGTH = LIWC[1] + 1; # SAVE LENGTH OF TABLE #
NDLWNCF(TABLE"LI",P<LIN$REC$INDX>,LENGTH); #WRTE LREC INDX TO NCF#
# #
IF ERRCNT EQ 0 # NO FATAL ERRORS HAVE BEEN DETECTED #
THEN
BEGIN
NCFGOOD[0] = TRUE; # SET FLAG INDICATING NCF IS GOOD #
END
ELSE # FATAL ERRORS DETECTED #
BEGIN
NCFGOOD[0] = FALSE; # CLEAR GOOD NCF FLAG #
PT$TITLE[0] = NCF$EMSG; # PUT ERROR MSG IN RECORD HEADER#
END
MASK = 20; # SET MASK FOR SORT ON NCF INDEX #
NDLSST(NCF$INDEX,FRST$WRD,BBP,MASK,NCFENTSZ,NCFWC[0]);
NCFWC[0] = (NCFWC[0] * NCFENTSZ) + 1; # CONVERT TO WORD COUNT #
ITEMP = NCFWC[0]; # SAVE INDEX WORD COUNT IN TEMPORARY #
MOVEI(NCFWC[0]+1,LOC(NCF$INDEX),LOC(NCF$INDEX)+PT$SIZE);
MOVEI(PT$SIZE,LOC(PRFX$TABLE),LOC(NCF$INDEX));
NDLWNCF(TABLE"NI",P<NCF$INDEX>,PT$SIZE + ITEMP + 1);
NDLEM2(0,0,0); # FLUSH OUT PASS 2 ERROR FILE BUFFER #
# RETURN TABLE SPACE NOT NEEDED #
SSTATS(P<CONSOLE$MAP>,-CM$LENG);
SSTATS(P<COUP$TABLE>,-CT$LENG);
SSTATS(P<DEVICE$XREF>,-DC$LENG);
SSTATS(P<LIN$CON$INDX>,-LCR$LENG);
SSTATS(P<LIN$CON$REC>,-LC$LENG);
SSTATS(P<LIN$REC$INDX>,-LI$LENG);
SSTATS(P<LINE$RECORD>,-LR$LENG);
SSTATS(P<LINE$XREF>,-LCT$LENG);
SSTATS(P<LLINK$TABLE>,-LLT$LENG);
SSTATS(P<LOGLINK$XREF>,-LL$LENG);
SSTATS(P<NCF$INDEX>,-NCF$LENG);
SSTATS(P<NPU$TABLE>,-NT$LENG);
SSTATS(P<NPU$XREF>,-NP$LENG);
SSTATS(P<PLINK$XREF>,-PL$LENG);
SSTATS(P<SUPLINK$TABL>,-SLT$LENG);
SSTATS(P<TNI$TABLE>,-TNI$LENG);
RETURN; # **** RETURN **** #
END # NDLNFTM #
TERM