*DECK,DUMPERS 
*IF,DEF,TRACE 
USETEXT IP$COM
USETEXT MISC$ 
USETEXT TCH$COM 
USETEXT TSB$COM 
USETEXT ACN$COM 
USETEXT DCB$COM 
USETEXT TCB$COM 
USETEXT UCB$COM 
      PROC DUMPERS; 
      BEGIN 
 #
*1DC  DUMPERS 
* 
*     1. PROC NAME           AUTHOR              DATE 
*        DUMPERS             G. A. VALENCIA      08/06/80 
* 
*     2. FUNCTIONAL DESCRIPTION.
*        SYMBOLICALY DUMP VARIOUS RBF TABLES AND CONTROL BLOCKS AFTER AN
*        ABNORMAL TERMINATION.  THIS OVERLAY IS LOADED AND EXECUTED ONLY
*        AFTER AN ERROR OCCURS (REPRIEVE PROCESSING). 
* 
*     3. METHOD USED. 
*        THE ACTUAL DUMPING ROUTINES, DMP$ACN, DMP$TCB, ETC. ARE CREATED
*        IN FORTRAN.  ANY MODIFICATIONS MADE TO THESE STRUCTURES
*        REQUIRE NEW DUMPING ROUTINES TO BE GENERATED (IN ORDER TO GET
*        ANY MEANINGFUL DUMPS).  ALL NON-ZERO ACN$TABLE ENTRIES ARE 
*        DUMPED ALONG WITH THEIR ASSOCIATED CONRTOL BLOCKS (INCLUDING 
*        ALL PSEUDO-ACN ENTRIES BUT THE LAST TWO).
* 
*     4. ENTRY PARAMETERS. NONE 
* 
*     5. EXIT PARAMETERS. NONE
* 
*     6. SYMPL TEXTS USED.
*        IP$COM 
*        MISC$
*        TSB$COM
*        ACN$COM
*        DCB$COM
*        TCB$COM
*        UCB$COM
* 
*     7. ROUTINES CALLED. 
*        DMP$ACN
*        DMP$DCB
*        DMP$DCL
*        DMP$TCB
*        DMP$TCD
*        DMP$UCB
*        DMP$UCL
* 
*     8. DAYFILE MESSAGES. NONE 
* 
 #
  
# 
      CALL COMMON DECK DMP$PRT (INSTEAD OF USING SYMPLTEXT DMP$PRT) 
      TO GET THE TABLE DUMPER HEADER PROPERLY INITIALIZED.  SYMPL 
      DOES NOT ALLOW COMMON BLOCKS TO BE PRESET WITHIN SYMPL TEXTS. 
# 
      CONTROL PACK; 
      CONTROL PRESET; 
      CONTROL NOLIST;          # THE NEXT CARD IS *CALL,DMP$PRT        #
*CALL,DMP$PRT 
      CONTROL LIST; 
  
      XREF PROC CLOSE;         # CLOSE SPITOUT FILE (OPENED BY DMP$ZB5)#
      XREF PROC DMP$ACN;       # DUMP AN ACN$TABLE ENTRY               #
      XREF PROC DMP$DCB;       # DUMP A WORDS 0 THRU  1 OF A DCB       #
      XREF PROC DMP$DCL;       # DUMP A WORDS 2 THRU 13 OF A DCB       #
      XREF PROC DMP$TCB;       # DUMP A TERMINAL CONTROL BLOCK         #
      XREF PROC DMP$TCD;       # DUMP A TCB$DEVICE CONTROL BLOCK       #
      XREF PROC DMP$UCB;       # DUMP A WORDS 0 THRU  1 OF A UCB       #
      XREF PROC DMP$UCL;       # DUMP A WORDS 2 THRU  9 OF A UCB       #
      XREF PROC WRITER;        # WRITE AN -EOR- ON THE SPITOUT FILE    #
  
      XREF ARRAY SPITOUT[1:1] S(6);;# SPITOUT FET (DEFINED IN DMP$ZB5) #
  
      ITEM I,J;                # INDUCTION VARIABLES                   #
      ITEM NOPARAM;            # UNUSED PARAMETER ON PROCEDURE CALLS   #
      ITEM OPTION C(10);       # CLOSE PROC PARAMETER (NO REWIND)      #
  
      FOR I = LOWER$ACN STEP 1 UNTIL UPPER$ACN - 2
      DO
        BEGIN 
        IF ACN$WORD[I] NQ ZERO
        THEN
          BEGIN                # ACN CURRENTLY IN USE                  #
          DMP$ACN(LOC(ACN$TABLE)+(I-1), NOPARAM, I);
          IF ACN$DEVTYPE[I] EQ S"CONSOLE" 
          THEN
            BEGIN              # DUMP TCB AND ALL TCB$DEVICE ENTRIES   #
            DMP$TCB(ADDRESS[ACN$CB[I]], NOPARAM, I);
            P<TCB> = ADDRESS[ACN$CB[I]];
            IF TCB$NDEVICE GR ZERO
            THEN
              BEGIN 
              FOR J=0 STEP 1 UNTIL TCB$NDEVICE - 1
              DO
                BEGIN 
                DMP$TCD(ADDRESS[ACN$CB[I]] + TCB$SIZE + TCB$DEVSIZE*J,
                        NOPARAM, J+1);
                END 
              END 
            END                # DUMP TCB AND ALL TCB$DEVICE ENTRIES   #
          IF ACN$DEVTYPE[I] EQ S"CARD$READER" 
          THEN
            BEGIN              # DUMP FULL UCB ONLY IF FILE IS ACTIVE  #
            DMP$UCB(ADDRESS[ACN$CB[I]], NOPARAM, I);
            P<UCB> = ADDRESS[ACN$CB[I]];
            IF UCB$FILEACT
            THEN
              BEGIN 
              DMP$UCL(ADDRESS[ACN$CB[I]], NOPARAM, I);
              END 
            END                # DUMP FULL UCB ONLY IF FILE IS ACTIVE  #
          IF ACN$DEVTYPE[I] EQ S"LINE$PRINTER"
          OR ACN$DEVTYPE[I] EQ S"PUNCH" 
          OR ACN$DEVTYPE[I] EQ S"PLOTTER" 
          THEN
            BEGIN              # DUMP FULL DCB ONLY IF FILE IS ACTIVE  #
            DMP$DCB(ADDRESS[ACN$CB[I]], NOPARAM, I);
            P<DCB> = ADDRESS[ACN$CB[I]];
            IF DCB$FILEACT
            THEN
              BEGIN 
              DMP$DCL(ADDRESS[ACN$CB[I]], NOPARAM, I);
              END 
            END                # DUMP FULL DCB ONLY IF FILE IS ACTIVE  #
          END                  # ACN CURRENTLY IN USE                  #
        END 
      I = 0;                   # SET LEVEL FOR -EOR- TO BE WRITTEN     #
      WRITER(SPITOUT,I);       # WRITE AN -EOR- ON THE SPITOUT FILE    #
      OPTION = "REWIND";       # REWIND SPITOUT AFTER CLOSING          #
      CLOSE(SPITOUT,OPTION);   # CLOSE SPITOUT FILE (FLUSH CIO BUFFER) #
      END 
      TERM
*ENDIF
