*DECK NS$INL
USETEXT ERR$NS
USETEXT NAT$NS
USETEXT PIC$NS
  
PROC NS$INL(ERRCODE);        # INITIATE NPU LOAD                       #
  
# TITLE NS$INL - INITIATE NPU LOAD.                                    #
  
      BEGIN    # NS$INL # 
# 
**    NS$INL - INITIATE NPU LOAD. 
* 
*     J.C. LEE    1981
* 
*     THIS ROUTINE INITIATES NPU LOAD.
* 
*     PROC NS$INL(ERRCODE)
* 
*     ENTRY:  
*       NONE. 
* 
*     EXIT: 
*       ERRCODE - IF A BAD PICB RECORD FOUND. 
* 
*     METHOD: 
*       CLEAR ACTIVITY-RETRY-COUNT. 
*       CLEAR NPU-STATE.
*       SET NPU-PRIMARY-STATE TO "LOADING NPU". 
*       LOCATE PICB-TSB.
*       IF PICB EXISTS: 
*         SET XPCB-DIRECTIVE-INDEX TO PICB-INDEX
*           OF LPCB-HEADER. 
*         SET XPCB-END-DIRECTIVE-INDEX TO PICB-INDEX
*           OF LPCB END DIRECTIVE.
*         START GLOBAL TIMER. 
*       ELSE
*         SET ERROR CODE. 
* 
# 
  
      ITEM ERRCODE    U;     # ERROR CODE                              #
  
      $BEGIN
      XREF
        BEGIN 
        PROC NS$DBG;         # TRACE PROCEDURE CALL                    #
        END 
      $END
  
      XREF
        BEGIN 
        PROC TSBINFO;        # LOCATE TSB                              #
        PROC MOVEOK;         # ALLOW TSB TO MOVE                       #
        FUNC NS$FEC U;       # FORMAT ERROR CODE                       #
        PROC NS$LSN;         # INCREMENT LOAD SEQUENCE NUMBER          #
        PROC NS$SGT;         # START ACTIVITY TIMER                    #
        END 
  
      ITEM I          I;     # PICB INDEX OF FIRST LPCB ENTRY          #
      ITEM K          I;     # PICB INDEX OF LAST LPCB ENTRY           #
      ITEM PICBTSBN   U;     # TSB NUMBER OF PICB                      #
      ITEM TSBFWA     U;     # TSB FWA                                 #
      ITEM TSBSIZE    U;     # TSB SIZE                                #
  
CONTROL EJECT;
      $BEGIN
      NS$DBG("INL");         # TRACE CALL                              #
      $END
  
      ERRCODE = 0;
      NAT$STATE[0] = 0;                  # CLEAR NPU STATE             #
      NAT$PSTATE[0] = S"NPS$LNPU";       # PRIMARY STATE - LOADING NPU #
  
      PICBTSBN = NAT$PITSBN[0];          # PICB TSB NUMBER             #
      TSBINFO(TSBSIZE,TSBFWA,PICBTSBN);  # LOCATE PICB TSB             #
      P<PICB> = TSBFWA;                  # FWA OF PICB                 #
      I = PICB$HDRL + PICB$PARWL + PICB$LDPCB[PICB$HDRL]; # HEADER INDX#
      K = I + PICB$LLPCB[PICB$HDRL] - 1; # INDEX TO LAST LPCB DIRECTIVE#
  
      IF PICB$PCBID[I] EQ ID$LPCB                # VALID IDENTIFIER    #
        AND K LQ PICB$BS[0]                      # LPCB SIZE OK        #
         AND PICB$CODE[K] EQ DIRCODE"ENDPCB"     # END DIRECTIVE EXISTS#
      THEN                               # VALID LPCB                  #
        BEGIN                            # INITIATE NPU LOAD PROCEDURE #
        NAT$PDIRI[0] = I;                # CURRENT LPCB DIRECTIVE INDEX#
        NAT$PENDI[0] = K;                # LAST LPCB DIRECTIVE INDEX   #
        NS$LSN; # ASSIGN LSN FOR LOAD SEQUENCE                         #
        NS$SGT;                          # START ACTIVITY TIMER        #
        END 
  
      ELSE                               # NLF ERROR-BAD LPCB          #
        BEGIN 
        ERRCODE = NS$FEC(EC"ERR$FILE",FEC"ERR$LPCB"); 
        END 
  
      MOVEOK(PICBTSBN);                  # ALLOW PICB TO MOVE          #
  
      RETURN; 
      END   # NS$INL #
      TERM
