cdc:nos2.source:nam5871:ndlnftm
Table of Contents
NDLNFTM
Table Of Contents
- [00008] PROC NDLNFTM
- [00012] NCF TERMINATION ROUTINE.
- [00051] PROC SSTATS
- [00052] PROC NDLEM2
- [00053] PROC MOVEI
- [00054] PROC NDLSST
- [00055] PROC NDLWNCF
- [00056] FUNC XCDD C(10)
- [00070] PROC CHKTRUNK
- [00103] PROC NDLEM2
- [00104] FUNC XCDD C(10)
- [00119] PROC MAXPORT(NODENO,PORTNO)
- [00186] PROC SETPTR(NODENO)
- [00218] PROC CHECKPORT(ERRORV,PORTNO,NODENO)
- [00291] PROC CHECKERR (NODENO)
- [00321] PROC NDLEM2
- [00322] FUNC XCDD C(10)
- [00378] PROC BLDNCB
- [00382] BLDNCB - BUILD NPU CONFIGURE BLOCKS.
- [00414] PROC SSTATS
- [00453] PROC BLDCNFG(BC$BPOS,BC$WC)
- [00457] BLDCNFG - BUILD LINE CONFIGURATION TABLE(C-TABLE).
- [00496] PROC SSTATS
- [00497] PROC READ
- [00498] PROC READW
- [00499] PROC RECALL
- [00580] PROC LINK$INFO
- [00584] LINK$INFO - MAKE ENTRIES FOR TRUNKS AND COUPLERS.
- [00625] PROC SSTATS
- [00765] PROC NCBINIT
- [00769] NCBINIT - NCB INITIALIZATION.
- [00802] PROC SSTATS
- [00908] PROC NCBTERM
- [00912] NCBTERM - NCB TERMINATION
- [00942] PROC ABORT
- [00943] PROC LFGCKSM
- [00944] PROC LFGHDRW
- [00945] PROC LFGMOVW
- [00946] PROC MESSAGE
- [01103] PROC NPUINFO
- [01107] NPUINFO - NPU INFORMATION.
- [01144] PROC SSTATS
- [01279] PROC PACKWDS(TABLE,BIT,WC,TOTALWC)
- [01283] PACKWDS - PACK WORDS INTO NCB BUFFER.
Source Code
- NDLNFTM.txt
- *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
cdc/nos2.source/nam5871/ndlnftm.txt ยท Last modified: 2023/08/05 17:22 by Site Administrator