*DECK NS$IND
USETEXT COM$NS
USETEXT DEF$NS
USETEXT DTSB$NS 
USETEXT ERR$NS
USETEXT NAT$NS
USETEXT NPT$NS
USETEXT NDCB$NS 
USETEXT NDF$NS
USETEXT PIC$NS
USETEXT PFC$NS
USETEXT PRF$NS
USETEXT SMB$NS
USETEXT SMD$NS
  
PROC NS$IND(ERRCODE);        # INITIATE NPU DUMP                       #
  
# TITLE NS$IND - INITTIATE NPU DUMP.                                   #
  
      BEGIN    # NS$IND # 
# 
**    NS$IND - INITIATE NPU DUMP. 
* 
*     J.C. LEE    1981
* 
*     THIS ROUTINE INITIATES NPU DUMP.
* 
*     PROC NS$IND(ERRCODE)
* 
*     ENTRY:  
*       NONE. 
* 
*     EXIT: 
*       ERRCODE - IF A BAD DPCB FOUND IN NLF. 
* 
*     METHOD: 
*       CLEAR NPU-STATE.
*       SET NPU-PRIMARY-STATE TO "DUMPING NPU". 
*       LOCATE PICB-TSB.
*       IF DPCB EXISTS: 
*         SET XPCB-DIRECTIVE INDEX TO PICB INDEX OF 
*           DPCB HEADER.
*         SET XPCB-END-DIRECTIVE INDEX TO PICB-INDEX
*           OF DPCB END DIRECTIVE.
*         FORMAT EVENT MESSAGE AND DISPATCH IT. 
*         DEFINE NDF TO DEFINE A NPU DUMPFILE NPXXXYY.
*         IF NO ERROR:  
*           IF "RT" IS SPECIFIED IN NS CONTROL CARD:  
*             FORMAT AND NETPUT NPU/REL/R.
*           REQUEST TSB FOR NPU DUMP TSB. 
*           STORE TSBN IN DUMP-TSBN.
*           INITIALIZE NDF PREFIX TABLE IN SM BUFFER. 
*           TRANSFER NDF PREFIX TABLE TO NPU DUMP BUFFER. 
*           START GLOBAL TIMER. 
*       ELSE: 
*         SET ERROR CODE AND EXIT.
* 
# 
  
      ITEM ERRCODE    U;     # ERROR CODE                              #
  
      $BEGIN
      XREF
        BEGIN 
        PROC NS$DBG;         # TRACE PROCEDURE CALL                    #
        END 
      $END
  
      XREF
        BEGIN 
        FUNC EDATE;          # CONVERT PACKED DATE TO DISPLAY CODE     #
        FUNC ETIME;          # CONVERT PACKED TIME TO DISPLAY CODE     #
        PROC MOVEOK;         # ALLOW TSB TO MOVE                       #
        PROC NS$ABH;         # FORMAT ABH                              #
        FUNC NS$CHD C(4);              # CONVERT TO DISPLAY -CODED HEX #
        FUNC NS$FEC U;       # FORMAT ERROR CODE                       #
        PROC NS$GNW;         # GET NPU WORD                            #
        PROC NS$LSN;         # INCREMENT LOAD SEQUENCE NUMBER          #
        PROC NS$MSG;         # DISPATCH MESSAGE                        #
        PROC NS$NDF;         # DEFINE NDF                              #
        PROC NS$SGT;         # START ACTIVITY TIMER                    #
        PROC NETPUT;         # NETPUT                                  #
        PROC PDATE;          # GET PACKED BINARY DATE/TIME             #
        PROC REQTSB;         # REQUEST TSB                             #
        PROC TSBINFO;        # LOCATE TSB                              #
        PROC VERSION;        # GET OPERATING SYSTEM VERSION            #
        END 
  
      ITEM I          I;     # INDEX TO DPCB HEADER                    #
      ITEM K          I;     # INDEX TO LAST DPCB DIRECTIVE            #
      ITEM NDFPFN     C(7);  # PFN OF NPU DUMP FILE                    #
      ITEM OPSVERSION C(10);           # OPERATING SYSTEM VERSION      #
      ITEM PICBTSBN   U;     # TSB NUMBER OF PICB                      #
      ITEM TEMP       U;     # TEMPORARY VARIABLE                      #
      ITEM TSBN       U;     # TSB NUMBER                              #
      ITEM TSBFWA     U;     # TSB FWA                                 #
      ITEM TSBSIZE    U;     # TSB SIZE                                #
  
      ARRAY COMMENT [0:0] S(7); 
        BEGIN # PREFIX TABLE COMMENT LISTABLE BY CATALOG/ITEMIZE       #
        ITEM NDFCOMMENT C(0,0,70) =    # COMMENT TEXT                  #
          ["  NPUNAME/VARNPU MEMORY DUMP FOR HALT XXXX AT AAAA."];
        ITEM CMTNPUNAME C(0,12,7);     # NPU NAME                      #
        ITEM CMTNPUVAR  C(1,0,6);      # NPU VARIANT NAME              #
        ITEM CMTHALT    C(3,48,4);     # NPU HALT CODE                 #
        ITEM CMTPREG    C(4,36,4);     # NPU P-REGISTER CONTENT        #
        END 
  
      ARRAY STAT [0:0] S(1);
        BEGIN 
        ITEM STATWORD   U(00,00,60);   # PARAMETER FOR VERSION CALL    #
        ITEM BC         U(00,00,12);   # NO OF 12-BIT BYTES TO RETURN  #
        ITEM SB         U(00,12,12);   # STARTING BYTE IN SOURCE FIELD #
        ITEM BP         U(00,24,12);   # STARTING BYTE IN RECEIVING FIL#
        ITEM WADDR      I(00,42,18);   # ADDRESS TO RECEIVE VERSION NO #
        END 
  
      DEF L$EM21     # 3 #;                      # LENGTH IN CM WORDS  #
      DEF DM$EM21    # DM$LOCAL+DM$EVENT+DM$NAMLOG #; # ROUTE OPTION   #
      ARRAY MSG$EM21 [0:0] S(L$EM21); 
        BEGIN 
        ITEM EM21$TEXT  C(0,0,22) =              # EVENT MESSAGE TEXT  #
          ["NPUNAME, DUMP STARTED."]; 
        ITEM EM21$NPNAM C(0,00,7);               # NPU NAME            #
        ITEM EM21$END   U(2,12,48) = [0];        # END OF TEXT         #
        END 
  
      ARRAY ABH [0:0] S(1); 
        BEGIN # APPLICATION BLOCK HEADER WORD FOR NPD/REL/SM           #
        ITEM ABH$ABT    U(00,00,06) = [APPCMD]; 
        ITEM ABH$ADR    U(00,06,12) = [0];
        ITEM ABH$ABN    U(00,18,18) = [0];
        ITEM ABH$ACT    U(00,36,04) = [CT60TRANS];
        ITEM ABH$DBC    U(00,40,08) = [0];
        ITEM ABH$TLC    U(00,48,12) = [LNPD]; 
        END 
  
      ARRAY SM$NPDREL [0:0] S(LNPD);
        BEGIN # NPD/REL/SM   #
        ITEM SM$PFCSFC  U(00,00,16) = [NPDREL]; # PFC/SFC CODE         #
        ITEM SM$F1      U(00,16,44) = [0];
        END 
  
CONTROL EJECT;
  
      $BEGIN
      NS$DBG("IND");         # TRACE CALL                              #
      $END
  
      ERRCODE = 0;
      NAT$STATE[0] = 0;                  # CLEAR NPU STATE             #
      NAT$PSTATE[0] = S"NPS$DNPU";       # PRIMARY STATE = DUMPING NPU #
# 
      LOCATE PICB 
# 
      PICBTSBN = NAT$PITSBN[0];          # TSB NUMBER OF PICB          #
      TSBINFO(TSBSIZE,TSBFWA,PICBTSBN);  # LOCATE PICB                 #
      P<PICB> = TSBFWA;                  # FWA OF PICB                 #
      I = PICB$HDRL + PICB$PARWL;        # INDEX TO DPCB HEADER        #
      K = I + PICB$LDPCB[PICB$HDRL] - 1; # INDEX TO LAST DPCB DIRECTIVE#
  
      IF PICB$PCBID[I] EQ ID$DPCB            # VALID IDENTIFIER        #
        AND K LQ PICB$BS[0]                  # DPCB SIZE WITHIN LIMIT  #
        AND PICB$CODE[K] EQ DIRCODE"ENDPCB"  # END DIRECTIVE EXISTS    #
      THEN                               # VALID DPCB                  #
        BEGIN                            # INITIATE NPU DUMP PROCEDURE #
        NAT$PDIRI[0] = I;                # CURRENT DPCB DIRECTIVE INDEX#
        NAT$PENDI[0] = K;                # LAST DPCB DIRECTIVE INDEX   #
        EM21$NPNAM[0] = NPNAM;           # SET NPU NAME                #
        NS$MSG(MSG$EM21,L$EM21,DM$EM21); # SEND EVENT MESSAGE          #
  
        NS$NDF(NDFPFN,ERRCODE);          # DEFINE NDF                  #
  
        IF ERRCODE EQ 0 
        THEN                             # NDF DEFINED                 #
          BEGIN 
          REQTSB(L$DTSB,TSBFWA,TSBN);    # REQUEST TSB FOR DUMP TSB    #
  
          NAT$NDTSBN[0] = TSBN;          # SAVE DUMP TSB NUMBER IN NAT #
          P<DTSB$HDR> = TSBFWA;          # FWA OF DTSB                 #
          PDATE(DTSB$HDR);               # SET PACKED BINARY DATE/TIME #
          DTSB$ID[0] = DTSB$IDENT;       # SET TSB IDENTIFIER          #
          DTSB$BS[0] = L$DTSB;           # SET TSB SIZE                #
  
          $BEGIN
          IF RT EQ ASC$YY 
          THEN                           # RELEASE TRACE FILE          #
            NETPUT(ABH,SM$NPDREL); # SEND NPD/REL/SM TO NIP            #
          $END
# 
          INITIALIZE FET FOR SEQUENTIAL WRITE OF NDF
# 
          P<DTSB$FET> = P<DTSB$HDR> + L$DTSBHDR; # FWA OF FET          #
          DFET$LFN[0] = NDFPFN;                  # SET LFN             #
          DFET$FM[0] = TRUE;                     # SET BINARY FILE MODE#
          DFET$COMP[0] = TRUE;                   # SET COMPLETE BIT    #
          P<DTSB$BUF> = P<DTSB$FET> + L$DFET;    # FWA OF CIO BUFFER   #
          DFET$LEN[0] = L$DFET - 5;              # FET LENGTH          #
          DFET$FIRST[0] = P<DTSB$BUF>;           # FIRST PTR           #
          DFET$IN[0] = P<DTSB$BUF> + L$PRFNDF;   # IN PTR              #
          DFET$OUT[0] = P<DTSB$BUF>;             # OUT PTR             #
          DFET$LIMIT[0] = P<DTSB$BUF> + L$DBUF;  # LIMIT PTR           #
# 
          FORMAT PREFIX TABLE FOR NDF 
# 
          P<PRF$TABLE> = P<DTSB$BUF>; 
          PRF$ID[0] = PRF$IDENT;       # PREFIX TABLE IDENTIFIER       #
          PRF$WC[0] = L$PRFNDF;        # SET NDF PREFIX TABLE SIZE     #
          PRF$LFN[0] = NDFPFN;         # SET DUMP FILE LFN             #
          TEMP = EDATE(DTSB$DDATE[0]); # GET DISPLAY-CODED DUMP DATE   #
          PRF$DATE[0] = C<1,8>TEMP;    # SET DUMP DATE                 #
          TEMP = ETIME(DTSB$DTIME[0]); # GET DISPLAY-CODED DUMP TIME   #
          PRF$TIME[0] = C<1,8>TEMP;    # SET DUMP TIME                 #
          STATWORD[0] = 0;             # SET UP PARAMETERS FOR VERSION #
          BC[0] = 5;
          WADDR[0] = LOC(OPSVERSION); 
          VERSION(STAT);               # GET VERSION OF OPERATING SYS  #
          PRF$OPS[0] = OPSVERSION;     # SET OPS VERSION               #
          PRF$NSVER[0] = NSVER[0];     # SET NS VERSION                #
          CMTNPUNAME[0] = NPNAM;       # SET NPU NAME IN COMMENT       #
          PRF$NPNAME[0] = NPNAM;       # SET NPU NAME                  #
  
          TSBN = NAT$SMTSBN[0];        # TSB NO OF DUMP NDCB RESPONSE  #
          TSBINFO(TSBSIZE,TSBFWA,TSBN);    # LOCATE NDCB TSB           #
          P<NDCB> = TSBFWA;            # FWA OF DUMP NDCB RESPONSE     #
          NS$GNW(NDCB,LNPUDTDN,NDCBINDEX"NDCB$PREG",TEMP);
          PRF$NPPREG[0] = TEMP;        # SET P-REGISTER HEX VALUE      #
          CMTPREG[0] = NS$CHD(TEMP);   # DISPLAY-CODED HEX P-REG       #
          PRF$NPUVAR[0] = NPT$NPUVAR[NTORD];     # SET NPU VARIANT     #
          CMTNPUVAR[0] = NPT$NPUVAR[NTORD]; # SET NPU VARIANT NAME     #
          PRF$NPUID[0] = NPT$NN[NTORD];          # SET NPU NODE NO     #
          NS$GNW(NDCB,LNPUDTDN,NDCBINDEX"NDCB$HALTC",TEMP); 
          PRF$NPHALT[0] = TEMP;        # SET HEX HALT CODE             #
          CMTHALT[0] = NS$CHD(TEMP);   # DISPLAY-CODED HEX HALT CODE   #
          PRF$COMMNT[0] = NDFCOMMENT[0];
          MOVEOK(TSBN);                # ALLOW NDCB TSB TO MOVE        #
          NS$LSN; # ASSIGN LSN FOR DUMP SEQUENCE                       #
  
  
          NS$SGT;                      # START ACTIVITY TIMER          #
  
          END 
        END 
  
      ELSE                             # NLF ERROR-BAD DPCB            #
        BEGIN 
        ERRCODE = NS$FEC(EC"ERR$FILE",FEC"ERR$DPCB"); 
        END 
  
      MOVEOK(PICBTSBN);                # ALLOW PICB TSB TO MOVE        #
  
      RETURN; 
      END   # NS$IND #
      TERM
