*DECK NS$N04
USETEXT COM$NS
USETEXT DEF$NS
USETEXT NAT$NS
USETEXT NDCB$NS
USETEXT NPT$NS
USETEXT NST$NS
USETEXT SMB$NS
USETEXT SMD$NS
PROC NS$N04(ERRCODE); # PROCESS NPU/DT/N (DUMP NDCB) #
# TITLE NS$N04 - PROCESS NPU/DT/N (DUMP NDCB). #
BEGIN # NS$N04 #
#
** NS$N04 - PROCESS NPU/DT/N (DUMP NDCB).
*
* J.C. LEE 1981
*
* THIS ROUTINE PROCESSES NPU/DT/N (DUMP NDCB).
*
* PROC NS$N04(ERRCODE)
*
* ENTRY:
* NONE.
*
* EXIT:
* ERRCODE.
*
* METHOD:
* RESET RETRY COUNT TO 0.
* IF LONG-TERM-DUMP FLAG = "YY", SET FLAG IN NPT.
* IF LONG-TERM-DUMP FLAG = "NN", CLEAR FLAG IN NPT.
* ELSE, SET FLAG TO DEFAULT-DUMP FLAG.
* CALCULATE TSB SIZE AND ALLOCATE TSB FOR NDCB.
* MOVE NDCB DATA TO TSB.
* FORMAT NETWORK LOG FILE MESSAGE TO INFORM THE NOP
* THE HALT CODE AND P-REGISTER CONTENT.
* DETERMINATE IF NPU IS DUMPED.
* IF RELOAD DUMP FLAG IS GARBAGE:
* IF NPU LOADED TOO OFTEN:
* INHIBIT NPU DUMP.
* IF NS NOT IN NORMAL MODE:
* SET NS TO START UP MODE.
* ELSE
* IF LONG-TERM-DUMP FLAG IS GARBAGE:
* SET DUMP-NPU TO "YY".
* ELSE, SET DUMP-NPU TO LONG-TERM-DUMP FLAG.
* ELSE:
* SET DUMP-NPU TO RELOAD-DUMP FLAG.
* IF IN DEBUG MODE, SET DUMP-NPU TO "YY".
* IF DUMP-NPU EQ "YY", INITIATE NPU DUMP.
* ELSE, INITIATE NPU LOAD.
* IF NO ERROR FROM DUMP/LOAD, PROCESS NEXT
* NEXT XPCB DIRECTIVE.
*
#
ITEM ERRCODE U; # ERROR CODE #
$BEGIN
XREF
BEGIN
PROC NS$DBG; # TRACE PROCEDURE CALL #
END
$END
XREF
BEGIN
PROC MOVE; # MOVE DATA #
PROC MOVEOK; # ALLOW TSB TO MOVE #
PROC NS$GNW; # GET NPU WORD #
PROC NS$IND; # INITIATE NPU DUMP PROCEDURE #
PROC NS$INL; # INITIATE NPU LOAD PROCEDURE #
PROC NS$MSG; # DISPATCH MESSAGE #
PROC NS$XPD; # PROCESS NEXT XPCB DIRECTIVE #
PROC REQTSB; # REQUEST TSB #
PROC TSBINFO; # LOCATE TSB #
FUNC NS$CHD C(4); # CONVERT HEX CHARACTER TO DISPLAY-CODED #
END
ITEM DUMPNPU U; # DUMP NPU SETTING #
ITEM FLAG B; # LONG TERM DUMP FLAG IN NPT #
ITEM LTDF U; # LONG TERM DUMP FLAG IN NDCB #
ITEM NHC U; # NPU HALT CODE #
ITEM NPR U; # NPU P-REGISTER #
ITEM RDF U; # RELOAD DUMP FLAG IN NDCB #
ITEM TSBFWA U; # TSB FWA #
ITEM TSBN U; # TSB NUMBER #
ITEM TSBSIZE U; # TSB SIZE #
DEF L$M04 # 3 #;
DEF DM$M04 # DM$LOCAL+DM$NAMLOG #; # ROUTING OPTION #
ARRAY MSG$M04 [0:0] S(L$M04);
BEGIN
ITEM M04$TEXT C(0,0,27) = # MESSAGE TEXT #
["NPUNAME, HALT XXXX AT AAAA."];
ITEM M04$NPNAM C(0,00,7); # NPU NAME #
ITEM M04$NHC C(1,24,04); # NPU HALT CODE #
ITEM M04$NPR C(2,12,04); # NPU P-REGISTER #
ITEM M04$END U(2,42,18) = [0]; # END OF TEXT #
END
CONTROL EJECT;
$BEGIN
NS$DBG("N04"); # TRACE CALL #
$END
ERRCODE = 0;
NAT$RETRYS[0] = 0;
NS$GNW(SMB$BUFFER,LNPUDTDN,NDCBINDEX"NDCB$RDF",RDF);
NS$GNW(SMB$BUFFER,LNPUDTDN,NDCBINDEX"NDCB$LTDF",LTDF);
IF LTDF EQ ASC$YY
THEN # LONG TERM DUMP FLAG SET #
FLAG = TRUE;
ELSE
BEGIN
IF LTDF EQ ASC$NN
THEN # LONG TERM DUMP FLAG CLEARED #
FLAG = FALSE;
ELSE
FLAG = NPT$F$DFDM[NTORD]; # SET TO DEFAULT DUMP FLAG #
END
NPT$F$LTDF[NTORD] = FLAG; # UPDATE NPT LONG TERM LTDF FLAG#
TSBSIZE = (2*ABHTLC[0] + 14) / 15; # TSB SIZE FOR NDCB #
REQTSB(TSBSIZE,TSBFWA,TSBN); # ALLOCATE TSB FOR NDCB #
P<NDCB> = TSBFWA; # NDCB TSB FWA #
MOVE(TSBSIZE,SMB$BUFFER,NDCB); # MOVE NDCB DATA TO TSB #
NDCB$WORD[0] = 0; # CLEAR NDCB TSB HEADER WORD #
NDCB$ID[0] = NDCB$IDENT; # NDCB IDENTIFIER #
NDCB$BS[0] = TSBSIZE; # NDCB TSB SIZE #
NAT$SMTSBN[0] = TSBN; # SAVE NDCB TSB NUMBER IN NAT #
MOVEOK(TSBN); # ALLOW NDCB TSB TO MOVE #
NS$GNW(SMB$BUFFER,LNPUDTDN,NDCBINDEX"NDCB$HALTC",NHC);
NS$GNW(SMB$BUFFER,LNPUDTDN,NDCBINDEX"NDCB$PREG",NPR);
#
FORMAT NETWORK LOG FILE MESSAGE TO INFORM THE NPU
HALT CODE AND P-REGISTER CONTENT
#
M04$NPNAM[0] = NPNAM; # SET NPU NAME #
M04$NHC[0] = NS$CHD(NHC); # DISPLAY-CODED HEX HALT CODE #
M04$NPR[0] = NS$CHD(NPR); # DISPLAY-CODED HEX P-REGISTER #
NS$MSG(MSG$M04,L$M04,DM$M04); # DISPATCH MESSAGE #
#
DETERMINE IF NPU IS TO BE DUMPED
#
TSBN = NPT$NSTTSB[NTORD]; # TSB NUMBER OF NST #
TSBINFO(TSBSIZE,TSBFWA,TSBN); # LOCATE NST #
P<NST> = TSBFWA; # FWA OF NST #
IF RDF NQ ASC$YY
AND RDF NQ ASC$NN
THEN # RELOAD DUMP FLAG IS GARBAGE #
BEGIN
IF CURTIME LS NST$DTIMER[0]
AND NST$LCOUNT[0] GQ MAX$LC
THEN # NPU LOADED TOO OFTEN #
DUMPNPU = ASC$NN; # INHIBIT NPU DUMP #
ELSE
BEGIN
IF NSM NQ M$NORMAL # NS STARTED UP FOR LESS THAN 10 MIN #
AND NST$LC[0] EQ 0 # INITIAL LOAD REQUEST FOR THIS NPU #
THEN # THE SPECIFIED FDP DICTATES WHETHER TO DUMP NPU #
DUMPNPU = NSM; # SET TO NS START-UP MODE #
ELSE
BEGIN
IF LTDF NQ ASC$YY
AND LTDF NQ ASC$NN
THEN # LONG TERM DUMP FLAG IS GARBAGE#
DUMPNPU = ASC$YY; # DUMP NPU #
ELSE
DUMPNPU = LTDF; # SET TO LONG TERM DUMP SETTING #
END
END
END
ELSE
DUMPNPU = RDF; # SET TO RELOAD DUMP SETTING #
IF NST$SLFC[0] GR 1
THEN # SUCCESSIVE LOAD FAILURE #
DUMPNPU = ASC$NN; # INHIBIT NPU DUMP #
MOVEOK(TSBN); # ALLOW NST TO MOVE #
IF MODE$DEBUG
THEN # DEBUG MODE ACTIVATED, DUMP NPU #
DUMPNPU = ASC$YY;
IF DUMPNPU EQ ASC$YY
THEN # TAKE NPU DUMP #
NS$IND(ERRCODE); # INITIATE NPU DUMP PROCEDURE #
ELSE # INHIBIT NPU DUMP #
NS$INL(ERRCODE); # INITIATE NPU LOAD PROCEDURE #
IF ERRCODE EQ 0
THEN # PROCESS PROCEDURE DIRECTIVES #
NS$XPD(ERRCODE);
RETURN;
END # NS$N04 #
TERM