*DECK NS$XPD
USETEXT COM$NS
USETEXT DEF$NS
USETEXT DTSB$NS 
USETEXT ERR$NS
USETEXT NAT$NS
USETEXT NDCB$NS 
USETEXT NPT$NS
USETEXT NST$NS
USETEXT PFC$NS
USETEXT PIC$NS
USETEXT SMB$NS
USETEXT SMD$NS
USETEXT STC$NS
  
PROC NS$XPD(ERRCODE);        # PROCESS DUMP/LOAD PROCEDURE DIRECTIVES  #
  
# TITLE NS$XPD - PROCESS DUMP/LOAD PROCEDURE DIRECTIVES.               #
  
      BEGIN    # NS$XPD # 
# 
**    NS$XPD - PROCESS DUMP/LOAD PROCEDURE DIRECTIVES.
* 
*     J.C. LEE    1981
* 
*     THIS ROUTINE PROCESSES DUMP/LOAD PROCEDURE DIRECTIVES.
* 
*     PROC NS$XPD(ERRCODE)
* 
*     ENTRY:  
*       NONE. 
* 
*     EXIT: 
*       ERRCODE.
* 
*     METHOD: 
*       CLEAR ERRCODE.
*       LOCATE PICB.
*       SET DONE TO FALSE.
*       SET I TO 0. 
*       WHILE NOT DONE
*         AND ERRCODE EQ 0
*         AND LQ NAT$PENDI: 
*       DO
*         INCREMENT INDEX TO NEXT DIRECTIVE.
*         UPDATE PICB DIRECTIVE INDEX.
*         CLEAR SECONDARY STATE.
*         STORE DIRECTIVE IN NAT. 
*         CASE ON PRIMARY STATE TO DETERMINE IF DIRECTIVE IS
*         VALID FOR THE PROCEDURE CONTROL BLOCK IN PROCESS: 
*         1) ILLEGAL STATE: 
*            DAYFILE MESSAGE AND ABORT. 
*         2) SAM-LOAD:  
*            CASE ON XPCB DIRECTIVE CODE. 
*            (ILLEGAL, LOAD, START, ILLEGAL, ILLEGAL, 
*             ILLEGAL, ILLEGAL) 
*         3) NPU-DUMP:  
*            CASE ON XPCB DIRECTIVE CODE. 
*            (DUMP, LOAD, START, ILLEGAL, ILLEGAL,
*             ILLEGAL, SAVE-DUMP, ILLEGAL)
*         4) NPU-LOAD:  
*            CASE ON XPCB DIRECTIVE.
*            (DUMP, LOAD, START, ILLEGAL, START-C,
*             LOAD-NCB, ILLEGAL, ILLEGAL) 
*         EXECUTE XPCB DIRECTIVE. 
*       ENDWHILE
* 
# 
  
      ITEM ERRCODE    U;     # ERROR CODE                              #
  
      $BEGIN
      XREF
        BEGIN 
        PROC NS$DBG;         # TRACE PROCEDURE CALLS                   #
        END 
      $END
  
      XREF
        BEGIN 
        PROC MOVEOK;         # ALLOW TSB TO MOVE                       #
        PROC NETPUT;         # NETPUT                                  #
        PROC NS$FBH;         # FORMAT ABH FOR NETWORK SM               #
        FUNC NS$FEC U;       # FORMAT ERROR CODE                       #
        PROC NS$FLN;         # SEND NPU/DT/R(LOAD NDCB)                #
        PROC NS$FLR;         # FIND LOAD MODULE RECORD                 #
        PROC NS$GNW;         # GET NPU WORD                            #
        PROC NS$INL;         # INITIATE NPU LOAD                       #
        PROC NS$MSG;         # DISPATCH MESSAGE                        #
        PROC NS$SDB;         # SEND DUMP BATCH                         #
        PROC NS$SLB;         # SEND LOAD BATCH                         #
        PROC NS$SLT;         # START RESPONSE TIMER                    #
        PROC NS$TNA;         # TERMINATE NPU ACTIVITY                  #
        PROC RECALL;         # MACREL RECALL                           #
        PROC RETERN;         # MACREL RETURN                           #
        PROC RETTSB;         # RELEASE TSB                             #
        PROC TSBINFO;        # LOCATE TSB                              #
        PROC WRITEF;         # MACREL WRITEF                           #
        END 
  
      STATUS XPCBCODE        # CASES FOR XPCB DIRECTIVE PROCESSING     #
        DUMP,                # DUMP SPECIFIED AREA                     #
        LOAD,                # LOAD SPECIFIED MODULE                   #
        START,               # START NPU, WAIT FOR RESPONSE            #
        STARTC,              # RESTORE NDCB, START NPU                 #
        LOADNCB,             # LOAD NDCB                               #
        SAVENDF,             # SAVE NPU DUMP FILE                      #
        ENDSPCB,             # END OF SPCB                             #
        ENDDPCB,             # END OF DPCB                             #
        ENDLPCB,             # END OF LPCB                             #
        ILLEGAL,             # ILLEGAL XPCB DIRECTIVE                  #
        ; 
  
      ITEM CODE       U;     # DIRECTIVE CODE                          #
      ITEM DONE       B;     # CURRENT DIRECTIVE PROCESSED             #
      ITEM K          I;     # TEMPORARY, PICB INDEX                   #
      ITEM I          I;     # INDUCTION VARIABLE                      #
      ITEM LMNAME     C(6);  # LOAD MODULE NAME                        #
      ITEM PICBTSBN   U;     # TSB NO OF PICB TSB                      #
      ITEM RI         U;     # RANDOM INDEX OF FIRST MODULE RECORD     #
      ITEM SS         U;     # TEMPORARY VARIABLE                      #
      ITEM TSBFWA     U;     # TSB FWA                                 #
      ITEM TSBSIZE    U;     # TSB SIZE                                #
  
      ARRAY VDIRTAB [0:DIRCODE"ENDPCB"] S(1); 
        BEGIN                # VALID DIRECTIVE TABLE FOR XPCB          #
        ITEM LSAMCODE S:XPCBCODE(00,06,18) = [ # VALID SPCB DIRECTIVE  #
          S"ILLEGAL", 
          S"LOAD",
          S"ILLEGAL", 
          S"ILLEGAL", 
          S"STARTC",
          S"ILLEGAL", 
          S"ILLEGAL", 
          S"ILLEGAL", 
          S"ILLEGAL", 
          S"ILLEGAL", 
          S"ILLEGAL", 
          S"ILLEGAL", 
          S"ILLEGAL", 
          S"ILLEGAL", 
          S"ILLEGAL", 
          S"ENDSPCB", 
                                             ]; 
        ITEM DNPUCODE S:XPCBCODE(00,24,18) = [ # VALID DPCB DIRECTIVE  #
          S"DUMP",
          S"LOAD",
          S"START", 
          S"ILLEGAL", 
          S"ILLEGAL", 
          S"ILLEGAL", 
          S"SAVENDF", 
          S"ILLEGAL", 
          S"ILLEGAL", 
          S"ILLEGAL", 
          S"ILLEGAL", 
          S"ILLEGAL", 
          S"ILLEGAL", 
          S"ILLEGAL", 
          S"ILLEGAL", 
          S"ENDDPCB", 
                                             ]; 
        ITEM LNPUCODE S:XPCBCODE(00,42,18) = [ # VALID LPCB DIRECTIVE  #
          S"DUMP",
          S"LOAD",
          S"START", 
          S"ILLEGAL", 
          S"STARTC",
          S"LOADNCB", 
          S"ILLEGAL", 
          S"ILLEGAL", 
          S"ILLEGAL", 
          S"ILLEGAL", 
          S"ILLEGAL", 
          S"ILLEGAL", 
          S"ILLEGAL", 
          S"ILLEGAL", 
          S"ILLEGAL", 
          S"ENDLPCB", 
                                             ]; 
        END 
  
      DEF L$EM30     # 3 #; 
      DEF DM$EM30     # DM$LOCAL+DM$EVENT+DM$NAMLOG #; # ROUTING OPT   #
      ARRAY MSG$EM30 [0:0] S(L$EM30); 
        BEGIN 
        ITEM EM27$TEXT  C(0,0,27) =              # EVENT MESSAGE TEXT  #
          ["NPUNAME, LOADING (XXXXXX). "];
        ITEM EM30$NPNAM C(0,00,7);           # NPU NAME                #
        ITEM EM30$LMNAM C(01,48,06);             # LOAD MODULE NAME    #
        ITEM EM30$END   U(02,42,18) = [0];       # END OF TEXT         #
        END 
  
      $BEGIN
      DEF L$EM60      # 4 #;
      DEF DM$EM60     # DM$LOCAL+DM$NAMLOG #;          # ROUTING OPT   #
      ARRAY MSG$EM60 [0:0] S(L$EM60); 
        BEGIN 
        ITEM EM60$TEXT  C(0,0,32) =          # MESSAGE TEXT            #
          ["NPUNAME, ILLEGAL PICB DIRECTIVE."]; 
        ITEM EM60$NPNAM C(0,00,7);           # NPU NAME                #
        ITEM EM60$END   U(3,12,48) = [0];    # END OF TEXT             #
        END 
      $END
  
      DEF L$EM11      # 3 #;
      DEF DM$EM11     # DM$LOCAL+DM$EVENT+DM$NAMLOG #; # ROUTING OPT   #
      ARRAY MSG$EM11 [0:0] S(L$EM11); 
        BEGIN 
        ITEM EM11$TEXT  C(0,0,28) =          # EVENT MESSAGE TEXT      #
          ["NPUNAME, SAM LOAD COMPLETED."]; 
        ITEM EM11$NPNAM C(0,00,7);           # NPU NAME                #
        ITEM EM11$END   U(02,48,12) = [0];   # END OF TEXT             #
        END 
  
      DEF L$EM22      # 4 #;
      DEF DM$EM22     # DM$LOCAL+DM$EVENT+DM$NAMLOG #; # ROUTING OPT   #
      ARRAY MSG$EM22 [0:0] S(L$EM22); 
        BEGIN 
        ITEM EM22$TEXT  C(0,0,32) =          # EVENT MESSAGE TEXT      #
          ["NPUNAME, DUMP XXXXXXX COMPLETED."]; 
        ITEM EM22$NPNAM C(0,00,7);           # NPU NAME                #
        ITEM EM22$NDPFN C(1,24,7);           # NPU DUMP FILE PFN       #
        ITEM EM22$END   U(3,12,48) = [0];    # END OF TEXT             #
        END 
  
      DEF L$EM31      # 3 #;
      DEF DM$EM31     # DM$LOCAL+DM$EVENT+DM$NAMLOG #; # ROUTING OPT   #
      ARRAY MSG$EM31 [0:0] S(L$EM31); 
        BEGIN 
        ITEM EM31$TEXT  C(0,0,24) =          # EVENT MESSAGE TEXT      #
          ["NPUNAME, LOAD COMPLETED."]; 
        ITEM EM31$NPNAM C(0,00,7);           # NPU NAME                #
        ITEM EM31$END   U(2,24,36) = [0];    # END OF TEXT             #
        END 
  
      DEF L$XPDABT   # 2 #; 
      DEF DM$XPDABT  # DM$LOCAL+DM$ABORT #;  # ROUTING OPTIONS         #
      ARRAY MSG$XPDABT [0:0] S(L$XPDABT); 
        BEGIN 
        ITEM XPDA$TEXT  C(0,0,18) =              # MESSAGE TEXT        #
          ["INVALID NPU STATE."]; 
        ITEM XPDA$END   U(01,48,12) = [0];       # END OF TEXT         #
        END 
  
      SWITCH XPCBCASE:XPCBCODE # STATUS SWITCH FOR DIRECTIVE PROCESSING#
        C$DUMP:DUMP,           # DUMP DIRECTIVE                        #
        C$LOAD:LOAD,           # LOAD DIRECTIVE                        #
        C$START:START,         # START DIRECTIVE                       #
        C$STARTC:STARTC,       # STARTC DIRECTIVE                      #
        C$LOADNCB:LOADNCB,     # LOAD NCB DIRECTIVE                    #
        C$SAVENDF:SAVENDF,     # SAVE NDF DIRECTIVE                    #
        C$ENDSPCB:ENDSPCB,     # END DIRECTIVE IN SPCB                 #
        C$ENDDPCB:ENDDPCB,     # END DIRECTIVE IN DPCB                 #
        C$ENDLPCB:ENDLPCB,     # END DIRECTIVE IN LPCB                 #
        C$ILLEGAL:ILLEGAL;     # ILLEGAL DIRECTIVE                     #
  
      SWITCH NPSCASE:PRISTATE  # STATUS SWITCH FOR NPU PRIMARY STATE   #
        NPS0:NPS$NONO,         # IDLE STATE                            #
        NPS1:NPS$LSAM,         # LOADING SAM                           #
        NPS2:NPS$DNPU,         # DUMPING NPU                           #
        NPS3:NPS$LNPU,         # LOADING NPU                           #
        NPS0:NPS$DNDCB;        # DUMPING NDCB                          #
  
      CONTROL EJECT;
  
      $BEGIN
      NS$DBG("XPD");
      $END
  
      ERRCODE = 0;
      DONE = FALSE; 
      I = 0;
      PICBTSBN = NAT$PITSBN[0];          # TSB NUMBER OF PICB TSB      #
      TSBINFO(TSBSIZE,TSBFWA,PICBTSBN);  # LOCATE PICB                 #
      P<PICB> = TSBFWA;                  # FWA OF PICB                 #
  
      FOR K = 0 WHILE NOT DONE
        AND ERRCODE EQ 0
        AND I LQ NAT$PENDI[0] 
      DO                     # PROCESS NEXT XPCB DIRECTIVE             #
        BEGIN 
        I = NAT$PDIRI[0] + 1; # INCREMENT INDEX TO NEXT DIRECTIVE      #
        NAT$PDIRI[0] = I;              # UPDATE PICB DIRECTIVE INDEX   #
        NAT$SSTATE[0] = 0;             # CLEAR SECONDARY STATE         #
        NAT$PCBDIR[0] = PICB$ENTRY[I]; # STORE DIRECTIVE IN NAT        #
        CODE = NAT$CODE[0];            # DIRECTIVE CODE                #
# 
        CASE ON PRIMARY STATE TO DETERMINE IF DIRECTIVE IS VALID
        FOR THE PROCEDURE CONTROL BLOCK CURRENTLY BEING PROCESSED 
# 
        SS = NAT$PSTATE[0];            # PRIMARY STATE                 #
        GOTO NPSCASE[SS]; 
  
NPS0:                        # ILLEGAL STATE, ABORT NS                 #
        BEGIN 
        NS$MSG(MSG$XPDABT,L$XPDABT,DM$XPDABT);
        END 
  
NPS1:                        # LOADING SAM                             #
        CODE = LSAMCODE[CODE];
        GOTO NPSXPCB; 
  
NPS2:                        # DUMPING NPU                             #
        CODE = DNPUCODE[CODE];
        GOTO NPSXPCB; 
  
NPS3:                        # LOADING NPU                             #
        CODE = LNPUCODE[CODE];
        GOTO NPSXPCB; 
  
NPSXPCB:                     # SWITCH ON XPCB DIRECTIVE CODE           #
        GOTO XPCBCASE[CODE];
  
C$DUMP:                      # PROCESS DUMP DIRECTIVE                  #
        NS$SDB;                        # SEND DUMP BATCH               #
        NAT$SSTATE[0] = S"NSS$WDUMP";  # WAITING FOR DUMP RESPONSE     #
        NS$SLT;                        # START RESPONSE TIMER          #
        GOTO EXITXPCB;                 # EXIT DIRECTIVE PROCESSING     #
  
C$LOAD:                      # PROCESS LOAD DIRECTIVE                  #
        LMNAME = NAT$LMNAME[0];        # NAME OF LOAD MODULE           #
        NS$FLR(LMNAME,RI,SS,ERRCODE);  # FIND LOAD MODULE ON NLF       #
SENDLB: 
        IF ERRCODE EQ 0 
        THEN                           # LOAD MODULE FOUND             #
          BEGIN 
          NS$SLB(LMNAME,RI,ERRCODE);   # SEND LOAD BATCH               #
  
          IF ERRCODE EQ 0 
          THEN                         # LOAD BATCH SENT               #
            BEGIN 
            NS$SLT;                    # START RESPONSE TIMER          #
            NAT$SSTATE[0] = S"NSS$WLOAD"; # WAITING FOR LOAD RESPONSE  #
            EM30$NPNAM[0] = NPNAM;     # NPU NAME                      #
            EM30$LMNAM[0] = LMNAME;    # LOAD MODULE NAME              #
            NS$MSG(MSG$EM30,L$EM30,DM$EM30); # DISPATCH EVENT MSG      #
            END 
          END 
  
        GOTO EXITXPCB;                 # EXIT DIRECTIVE PROCESSING     #
  
C$START:                     # PROCESS START DIRECTIVE                 #
        NS$FBH(LNPUDTSR,TRUE);         # FORMAT ABH FOR NETWORK SM     #
        PFCSFC[0] = NPUDT;             # FORMAT NPU/DT/R(START)        #
        NPUPO[0] = NAT$PN[0];          # SET PORT NUMBER               #
        NPUSP[0] = NAT$SPN[0];         # SET SUBPORT NUMBER            #
        NPULS[0] = NAT$LSN[0];         # SET LOAD SEQUENCE NO          #
        NPUCC[0] = CMDCODE"CC$STRTR";  # SET COMMAND CODE              #
        NETPUT(ABH$WORD,SMB$BUFFER);   # SEND NPU/DT/R(START)          #
        NAT$SSTATE[0] = S"NSS$WSTART"; # WAITING FOR START RESPONSE    #
        NS$SLT;                        # START RESPONSE TIMER          #
        GOTO EXITXPCB;                 # EXIT DIRECTIVE PROCESSING     #
  
C$STARTC:                    # PROCESS STARTC DIRECTIVE                #
        IF NAT$PSTATE[0] EQ S"NPS$LSAM" 
        THEN                           # LOADING SAM                   #
          BEGIN                        # SEND NPU/DT/R(STARTC)         #
          NS$FBH(LNPUDTSC,TRUE);       # FORMAT ABH FOR NETWORK SM     #
          PFCSFC[0] = NPUDT;
          NPUPO[0] = NAT$PN[0];        # SET PORT NUMBER               #
          NPUSP[0] = NAT$SPN[0];       # SET SUBPORT NUMBER            #
          NPULS[0] = NAT$LSN[0];       # SET LOAD SEQUENCE NUMBER      #
          NPUCC[0] = CMDCODE"CC$STRTC";# SET COMMAND CODE              #
          NETPUT(ABH$WORD,SMB$BUFFER); # SEND STARTC REQUEST           #
          GOTO NEXTDIR;                # PROCESS NEXT SPCB DIRECTIVE   #
          END 
  
        NS$FLN(FALSE);                 # SEND NPU/DT/R (LOAD NDCB)     #
        NAT$SSTATE[0] = S"NSS$WNDCB";  # WAITING FOR LOAD NDCB RESPONSE#
        NS$SLT;                        # START RESPONSE TIMER          #
        GOTO EXITXPCB;                 # EXIT DIRECTIVE PROCESSING     #
  
C$LOADNCB:                   # PROCESS LOAD NCB DIRECTIVE              #
        IF NPT$NCBSZ[NTORD] LQ NAT$NCBSZ[0] 
        THEN                           # NCB SIZE WITHIN ALLOWED LIMIT #
          BEGIN                        # LOAD NCB INTO NPU             #
          LMNAME = "NCB";              # LOAD MODULE IS NCB            #
          RI = NPT$NCBRI[NTORD];       # RANDOM INDEX OF NCB ON NCF    #
          NAT$NCBFWA[0] = NAT$DIRP2[0];          # NCB FWA             #
          NAT$LMNAME[0] = LMNAME;      # SAVE LOAD MODULE NAME         #
          END 
  
        ELSE                           # NCB SIZE EXCEEDS ALLOWED LIMIT#
          BEGIN 
          ERRCODE = NS$FEC(EC"ERR$FILE",FEC"ERR$NCBSIZ"); 
          END 
  
        GOTO SENDLB;                   # SEND LOAD BATCH               #
  
C$SAVENDF:  
        NAT$F$SNDF[0] = TRUE;          # SET SAVE NPU DUMP FLAG        #
        GOTO NEXTDIR;                  # CONTINUE WITH NEXT DIRECTIVE  #
  
C$ILLEGAL:                   # PROCESS ILLEGAL XPCB DIRECTIVE          #
        $BEGIN
        EM60$NPNAM[0] = NPNAM;         # NPU NAME                      #
        NS$MSG(MSG$EM60,L$EM60,DM$EM60); # DISPATCH MESSAGE            #
        $END
  
        NAT$DEC[0] = NAT$DEC[0] + 1;   # INCREMENT DIRECTIVE ERROR CNT #
        IF NAT$DEC[0] GR MAX$DEC
        THEN                           # ILLEGAL DIRECTIVE IN PICB     #
          BEGIN 
          ERRCODE = NS$FEC(EC"ERR$FILE",FEC"ERR$PICBD");
          END 
  
        GOTO NEXTDIR;                  # CONTINUE WITH NEXT DIRECTIVE  #
  
C$ENDSPCB:                   # PROCESS END OF SAM LOAD PROCEDURE       #
        STC$SAML = STC$SAML + 1;       # INCREMENT NO OF SAM LOADS     #
        EM11$NPNAM[0] = NPNAM;         # NPU NAME                      #
        NS$MSG(MSG$EM11,L$EM11,DM$EM11); # DISPATCH MESSAGE            #
        TSBINFO(TSBSIZE,TSBFWA,NPT$NSTTSB[NTORD]); # LOCATE NST        #
        P<NST> = TSBFWA;
        NST$SAMSPC[0] = 0; # CLEAR CONSECUTIVE SAM PREEMPT COUNT       #
        MOVEOK(NPT$NSTTSB[NTORD]); # ALLOW NST TO MOVE                 #
        NS$TNA;                        # TERMINATE NPU ACTIVITY        #
        GOTO EXITXPCB;                 # EXIT DIRECTIVE PROCESSING     #
  
C$ENDDPCB:                   # PROCESS END OF NPU DUMP PROCEDURE       #
        TSBINFO(TSBSIZE,TSBFWA,NAT$NDTSBN[0]);   # LOCATE DUMP TSB     #
        P<DTSB$HDR> = TSBFWA; 
        P<DTSB$FET> = TSBFWA + L$DTSBHDR; # FWA OF DUMP FET            #
        WRITEF(DTSB$FET);              # WRITE END OF FILE TO NPXXXYY  #
  
        EM22$NPNAM[0] = NPNAM;         # SET NPU NAME                  #
        EM22$NDPFN[0] = DFET$LFN[0];   # SET PFN OF NPU DUMP FILE      #
        NS$MSG(MSG$EM22,L$EM22,DM$EM22); # DISPATCH MESSAGE            #
  
        STC$DUMPS = STC$DUMPS + 1;     # INCREMENTS DUMPS GENERATED    #
        TSBINFO(TSBSIZE,TSBFWA,NPT$NSTTSB[NTORD]); # LOCATE NST TSB    #
        P<NST> = TSBFWA;               # FWA OF NST                    #
        TSBINFO(TSBSIZE,TSBFWA,NAT$SMTSBN[0]); # LOCATE DUMP NDCB RESP #
        P<NDCB> = TSBFWA;              # FWA OF DUMP NDCB RESPONSE     #
        NST$DPDATE[0] = DTSB$PDATE[0]; # MOST RECENT DUMP DATE/TIME    #
        NST$NDFPFN[0] = DFET$LFN[0];   # MOST RECENT DUMP FILE PFN     #
        NS$GNW(NDCB,LNPUDTDN,NDCBINDEX"NDCB$HALTC",SS); 
        NST$NHC[0] = SS;               # SET NPU HALT CODE             #
        NS$GNW(NDCB,LNPUDTDN,NDCBINDEX"NDCB$PREG",SS);
        NST$NPR[0] = SS;               # RESET NPU P-REGISTER CONTENT  #
        MOVEOK(NPT$NSTTSB[NTORD]);     # ALLOW NST TO MOVE             #
        MOVEOK(NAT$SMTSBN[0]);         # ALLOW NDCB DUMP RESP TO MOVE  #
        RECALL(DTSB$FET);              # WAIT UNTIL WRITEF COMPLETES   #
        RETERN(DTSB$FET);              # RETURN NPU DUMP FILE          #
        RECALL(DTSB$FET);              # WAIT UNTIL RECALL COMPLETES   #
        RETTSB(NAT$NDTSBN[0]);         # RELEASE DUMP TSB              #
        NAT$NDTSBN[0] = 0;             # CLEAR DUMP TSB NUMBER         #
        NAT$F$SNDF[0] = FALSE;         # CLEAR SAVE NDF FLAG           #
        NS$INL(ERRCODE);               # INITIATE NPU LOAD             #
        GOTO NEXTDIR;                  # CONTINUE WITH NEXT DIRECTIVE  #
  
C$ENDLPCB:                   # PROCESS END OF NPU LOAD PROCEDURE       #
        EM31$NPNAM[0] = NPNAM;         # SET NPU NAME                  #
        NS$MSG(MSG$EM31,L$EM31,DM$EM31); # DISPATCH EVENT MESSAGE      #
  
        TSBINFO(TSBSIZE,TSBFWA,NPT$NSTTSB[NTORD]); # LOCATE NST        #
        P<NST> = TSBFWA;               # UPDATE NST                    #
        NST$LPDATE[0] = NAT$LPDATE[0]; # SET MOST RECENT LOAD DATE/TIME#
        NST$LC[0] = NST$LC[0] + 1;     # INCREMENT LOAD COUNT          #
        NST$SLFC[0] = 0; # CLEAR SUCCESSIVE LOAD FAILURE COUNT         #
  
        IF CURTIME LS NST$DTIMER[0] 
        THEN                 # ANOTHER LOAD BEFORE DTIMER EXPIRES      #
          BEGIN              # INCREMENT LOAD COUNT WITHIN DTIMER      #
          NST$LCOUNT[0] = NST$LCOUNT[0] + 1;
          END 
  
        ELSE                 # DTIMER ALREADY TIMES OUT                #
          BEGIN 
          NST$DTIMER[0] = CURTIME + DTIMER; # RESTART DTIMER           #
          NST$LCOUNT[0] = 1; # RESET LOAD COUNT WITHIN DTIMER TO 1     #
          END 
  
        MOVEOK(NPT$NSTTSB[NTORD]);     # ALLOW NST TO MOVE             #
  
        IF NAT$F$RMTL[0]
        THEN                           # LOADING REMOTE NPU            #
          BEGIN 
          STC$REML = STC$REML + 1;     # INCREMENT REMOTE LOAD COUNT   #
          NS$FBH(LNPUIN,TRUE);         # FORMAT ABH FOR NPU/IN/N       #
          PFCSFC[0] = NPUINN; 
          NPUPO[0] = NAT$PN[0];        # SET PORT NUMBER               #
          NPUSP[0] = NAT$SPN[0];       # SET SUBPORT NUMBER            #
          NPULT[0] = LOADTYPE"LT$REMOT";  # SET REMOTE LOAD TYPE       #
  
          NETPUT(ABH$WORD,SMB$BUFFER); # SEND NPU/IN/N                 #
          END 
  
        ELSE                           # LOADING LOCAL NPU             #
  
          STC$LOCL = STC$LOCL + 1;     # INCREMENT NO OF LOCAL LOADS   #
  
        NS$TNA;                        # TERMINATE NPU ACTIVITY        #
  
        GOTO EXITXPCB;                 # EXIT DIRECTIVE PROCESSING     #
  
EXITXPCB:                    # DIRECTIVE DONE, EXIT XPCB PROCESSING    #
        DONE = TRUE;
  
NEXTDIR:  
        END 
  
  
      MOVEOK(PICBTSBN);      # ALLOW PICB TO MOVE                      #
  
      RETURN; 
      END   # NS$XPD #
      TERM
