PROBE 
PRGM PROBE; 
#  TITLE PROBE - MEASUREMENT REPORT TOOL.                             # 
  
      BEGIN  # PROBE #
  
# 
***   PROBE - INTERNAL MEASUREMENT TOOL.
* 
*     *PROBE* IS AN INTERNAL TOOL THAT MEASURES THE FOLLOWING DATA: 
*         1.  THE NUMBER OF TIMES A PPU ROUTINE WAS LOADED. 
*         2.  THE NUMBER OF *CIO* SYSTEM REQUESTS BY FUNCTION NUMBER. 
*         3.  THE NUMBER OF PPU REQUESTS TO *CPUMTR* BY FUNCTION
*             NUMBER. 
*         4.  THE NUMBER OF MTR REQUESTS TO *CPUMTR* BY FUNCTION
*             NUMBER. 
*         5.  A SET OF I/O STATISTICS FOR BUFFERED I/O DEVICES. 
* 
* 
*     *PROBE* IS A SEGMENT TO *CPUMTR* THAT IS SELECTABLE AT DEADSTART
*     TIME BY AN IPRDECK ENTRY.  WHEN THE *PROBE* SEGMENT IS DISABLED 
*     AT DEADSTART TIME, *CPUMTR* WILL REQUIRE NO ADDITIONAL TIME OR
*     SPACE OVER THAT REQUIRED BEFORE THE SEGMENT WAS INSTALLED.
* 
* 
*     *PROBE* WILL GENERATE A REPORT FROM THE DATA COLLECTED BY THE 
*     *PROBE* FACILITY OF *CPUMTR*.  *PROBE* WILL GET INPUT TO ANALYZE
*     FROM EITHER THE SYSTEM TABLES OR FROM A FILE CONTAINING DATA
*     FROM A PREVIOUS *PROBE* RUN.  *PROBE* IS ACTIVATED BY THE 
*     FOLLOWING.
* 
*     PROBE(P1,P2,...,PN) 
* 
*     PRGM PROBE. 
* 
*     ENTRY.  INPUTS TO PROBE ARE:  
* 
*             PROBE(P1,P2,...,PN) 
* 
*     WHERE PN MAY BE ONE OF THE FOLLOWING: 
* 
*         P = LFN1   BINARY FILE TO WRITE.  DEFAULT IS *STATS*. 
* 
*         P = 0      NO BINARY FILE IS TO BE WRITTEN. 
* 
*         L = LFN2   REPORT FILE.  DEFAULT IS *OUTPUT*. 
* 
*         L = 0      NO REPORT GENERATED. 
* 
*         B = LFN3   BINARY FILE TO READ.  DEFAULT IS *STATS*.
* 
*                    REWIND BINARY FILES, LFN1 AND LFN3, BEFORE AND 
*                    AFTER THE OPERATION.  DEFAULT IS NO REWIND.
* 
*         OP = P     PROCESSING OPTIONS WHERE P MAY BE: 
*                    R  READ DATA FROM SYSTEM TABLES AND WRITE TO 
*                       BINARY FILE SPECIFIED BY THE *P* PARAMETER
*                       AND REPORT FILE AS SPECIFIED. 
* 
*                    C  SAME AS *R* OPTION EXCEPT THE SYSTEM TABLES 
*                       WILL BE CLEARED AFTER THEY ARE READ.
* 
*                    P  GENERATE REPORT FROM DATA ON BINARY 
*                       FILE SPECIFIED BY THE *B* PARAMETER.
* 
* 
*         LO = X     SORT OPTION FOR PPU PROGRAM LOAD INFORMATIOM.
* 
*                    F  DATA IS SORTED BY FREQUENCY OF LOADS
*                       (DEFAULT SORT OPTION IF *LO* IS OMITTED). 
* 
*                    R  DATA IS SORTED BY  FREQUENCY OF LOADS AND 
*                       PROGRAM RESIDENCE, IN THAT ORDER. 
* 
*                    A  DATA IS SORTED ALPHABETICALLY BY PPU
*                       PROGRAM NAME. 
* 
* 
* 
*     EXIT.       REPORT IS COMPLETE OR ERROR CONDITION ENCOUNTERED.
* 
* 
*     MESSAGES. 
* 
*         NO REPORT GENERATED.
*             THE *L* OPTION ON THE COMMAND WAS SET 
*             TO ZERO.
* 
*         *PROBE* REPORT COMPLETE.
*             *PROBE* PRINTED A COMPLETE REPORT.
* 
*         *PROBE* COMMAND ERROR.
*             AN ERROR HAS BEEN DETECTED WITHIN THE COMMAND.
*             CORRECT THE COMMAND AND RETRY.
* 
*         ERROR IN *OP* SPECIFICATIONS. 
*             THE *OP* PARAMETER HAS AN INCORRECT OPTION
*             SPECIFIED.  CORRECT AND RETRY.
* 
*         ERROR IN *LO* SPECIFICATION.
*             THE LIST OPTION PARAMETER HAS AN INCORRECT
*             OPTION SPECIFIED.  CORRECT AND RETRY. 
* 
*         DUPLICATE FILE NAME ERROR.
*             THE FILES FOR INPUT AND OUTPUT HAVE THE 
*             SAME NAME.  CHANGE AND RETRY. 
* 
*         COMMAND OPTION MISMATCH.
*             THE *OP* PARAMETERS, *R* OR *C*, ARE SPECIFIED
*             WITHOUT A *P* PARAMETER BEING SPECIFIED.
*             CORRECT AND RETRY.
* 
*         NO VERSION DATA ON FILE.
*             THE FILE SPECIFIED BY THE *B* OPTION ON THE 
*             COMMAND HAS NO VERSION DATA.  CHECK 
*             FILE FOR CORRECTNESS. 
* 
*         NO STATISTICAL AREA DATA ON FILE. 
*             THE FILE SPECIFIED BY THE *B* OPTION ON THE 
*             COMMAND HAS NO STATISTICAL DATA AREA DATA.
*             CHECK FILE FOR CORRECTNESS. 
* 
*         NO *PROBE* DATA ON FILE.
*             THE FILE SPECIFIED BY THE *B* OPTION ON THE 
*             COMMAND HAS NO *PROBE* DATA.  CHECK 
*             FILE FOR CORRECTNESS. 
* 
*         NO *PROBE* DATA AVAILABLE.
*             THE SYSTEM FAILED TO RETURN ANY DATA.  NO REPORT
*             WILL BE GENERATED NOR WILL A FILE BE CREATED. 
* 
*         PROBE VERSION MISMATCH. 
*             THE VERSION UNDER WHICH THE DATA WAS BUILT
*             IS NOT THE CURRENT PROBE VERSION. 
* 
*     NOTES.
*          1.  THE FILE NAMES MUST BE UNIQUE. 
* 
*          2.  IF THE *OP* PARAMETER IS EQUAL TO *R* OR *C* 
*              THEN THE *P* PARAMETER CAN NOT BE EQUAL TO ZERO. 
* 
*          3.  IF THE *OP* PARAMETER IS EQUAL TO *P* THEN NO
*              BINARY FILE IS WRITTEN, EVEN IF SPECIFIED ON 
*              THE *P* PARAMETER. 
* 
*          4.  THE FOLLOWING SET OF COMMANDS IS AN EXAMPLE
*              OF THE METHOD TO INSTALL *PROBE*.  THE FOLLOWING IS
*              ASSUMED- 
* 
*              1.  THE SYSTEM *OPL* IS ASSIGNED TO THE CONTROL POINT. 
* 
*              2.  THE FOLLOWING LIBRARY IS AVAILABLE EITHER ON THE 
*                  SYSTEM OR ON A LOCAL FILE- 
* 
*                    SRVLIB - LIBRARY CONTAINING *SYMPL*/*COMPASS*
*                             SERVICE ROUTINES. 
* 
*              3.  THE RESULTANT BINARY WILL BE ON FILE *LGO*.
* 
*              4.  LISTING WILL BE ON FILE *OUTPUT*.
* 
*                  MODIFY(LO=E,Z)/*EDIT PROBE 
*                  SYMPL(I,LXR=OUTPUT,B=FILEA)
*                  COMPASS(I,L=OUTPUT,B=FILEA,S=NOSTEXT)
*                  LDSET(LIB=SRVLIB,PRESET=ZERO)
*                  LOAD(FILEA)
*                  NOGO(LGO,PROBE)
* 
*              IF ERRORS OCCUR CONSULT THE SITE ANALYST.
* 
*     COPYRIGHT CONTROL DATA SYSTEMS INC.  1992.
# 
  
                                               CONTROL EJECT; 
  
# 
****  PRGM PROBE - XREF LIST BEGIN. 
# 
  
      XREF
        BEGIN 
        PROC ABORT;                  # ABNORMAL TERMINATION # 
        PROC CSARG;                  # CRACK COMMAND #
        PROC INPUT;                  # INPUT DATA # 
        PROC MESSAGE;                # OUTPUT DAYFILE MESSAGE # 
        PROC RPCLOSE;                # CLOSE FILE # 
        PROC RPEJECT;                # PAGE EJECT # 
        PROC RPTCIO;                 # *CIO* REQUEST REPORT # 
        PROC RPTIOS;                 # I/O STATISTICS REPORT #
        PROC RPTMON;                 # MONITOR MODE REQUESTS #
        PROC RPTMPP;                 # *MTR* PERFORMANCE REPORT # 
        PROC RPTMTR;                 # MONITOR REQUEST REPORT # 
        PROC RPTPLD;                 # *PLD* REPORT # 
        PROC RPTPMD;                 # PROGRAM MODE REQUESTS #
        PROC RPTPST;                 # *PROBE* STATISTICS REPORT #
        END 
  
# 
****  PRGM PROBE - XREF LIST END. 
# 
  
      DEF LISTCON    #0#;            # COMDECK LIST CONTROL # 
*CALL COMAMSS 
*CALL COMSPDT 
*CALL COMUPRB 
  
      ARRAY MSG [0:1] S(3); 
        BEGIN 
        ITEM MSG$TEXT   C(00,00,28) = [   ##
        " NO REPORT GENERATED.",     # NO REPORT GENERATED #
        " *PROBE* REPORT COMPLETE."];  # *PROBE* REPORT COMPLETE #
        ITEM MSG$TERM   I(02,48,12) = [2(0)];  # MESSAGE TERMINATOR # 
        END 
  
                                                     CONTROL EJECT; 
  
      CSARG;                         # CRACK COMMAND #
      INPUT;                         # INPUT DATA # 
  
      IF ARG$L[0] EQ 0
      THEN
        BEGIN  # GENERATE NO REPORT # 
        MESSAGE(MSG$TEXT[0],SYSUDF1); 
        STOP; 
        END  # GENERATE NO REPORT # 
  
      RPTPST;                        # INTERVAL OF REPORT # 
      RPTMTR;                        # MONITOR REQUESTS # 
  
      RPEJECT(LOC(OUTFET)); 
  
      RPTMON;                        # MONITOR MODE REQUESTS #
      RPTPMD;                        # PROGRAM MODE REQUESTS #
      RPTMPP;                        # *MTR* PERFORMANCE REQUESTS # 
  
      RPEJECT(LOC(OUTFET)); 
  
      RPTCIO;                        # *CIO* REPORT GENERATOR # 
  
      RPEJECT(LOC(OUTFET)); 
  
      RPTPLD;                        # *PLD* REPORT # 
  
      RPEJECT(LOC(OUTFET)); 
  
      RPTIOS;                        # I/O STATISTICS REPORT #
  
      RPCLOSE(LOC(OUTFET));          # CLOSE OUTPUT FILE #
  
      MESSAGE(MSG$TEXT[1],SYSUDF1); 
  
      END  # PROBE #
  
    TERM
PROC CSARG; 
# TITLE CSARG - COMMAND PROCESSOR.                            # 
      BEGIN  # COMMAND PROCESSOR #
  
# 
**    CSARG - COMMAND ARGUMENT PROCESSOR. 
* 
*     CHECKS FOR CORRECT PROBE PARAMETERS THROUGH A 
*     *SYMPL* CALL TO ASARG.
* 
*     PROC CSARG
* 
*     EXIT   COMMAND ARGUMENTS SET IN *ARGLIST*.
* 
*     MESSAGES
* 
*         *PROBE* COMMAND ERROR.
*             AN ERROR HAS BEEN DETECTED WITHIN THE COMMAND.
*             CORRECT THE COMMAND AND RETRY.
* 
*         ERROR IN *OP* SPECIFICATIONS. 
*             THE *OP* PARAMETER HAS AN INCORRECT OPTION
*             SPECIFIED.  CORRECT AND RETRY.
* 
*         ERROR IN *LO* SPECIFICATION.
*             THE LIST OPTION PARAMETER HAS AN INCORRECT
*             OPTION SPECIFIED.  CORRECT AND RETRY. 
* 
*         DUPLICATE FILE NAME ERROR.
*             THE FILES FOR INPUT AND OUTPUT HAVE THE 
*             SAME NAME.  CHANGE AND RETRY. 
* 
*         COMMAND OPTION MISMATCH.
*             THE *OP* PARAMETERS, *R* OR *C*, ARE SPECIFIED
*             WITHOUT A *P* PARAMETER BEING SPECIFIED.
*             CORRECT AND RETRY.
* 
*         NOTES 
* 
*           THERE IS A CALL TO THE PRESET ROUTINE TO
*           PRESET ALL THE COMMON BLOCKS. 
# 
  
  
# 
****  PROC CSARG - XREF LIST BEGIN. 
# 
  
      XREF
        BEGIN 
        PROC ABORT;                  # ABNORMAL TERMINATION # 
        PROC MESSAGE;                # OUTPUT DAYFILE MESSAGE # 
        PROC PRESET;                 # PRESET CONSTANTS # 
        PROC RPHEAD;                 # OUTPUT PAGE HEADER # 
        PROC RPOPEN;                 # OPEN FILE #
        PROC XARG;                   # CRACK COMMAND #
        END 
  
# 
****  PROC CSARG - XREF LIST END. 
# 
  
      DEF OPTION     #0#;            # *ASARG* OPTION # 
  
      DEF LISTCON    #0#;            # COMMON DECK LIST OPTION #
*CALL COMAMSS 
*CALL COMSPDT 
*CALL COMUOUT 
*CALL COMUPRB 
  
  
      ITEM ARGLIST    U;             # ARGUMENT TABLE ADDRESS # 
      ITEM FLAG       U;             # ERROR FLAG FROM *ASARG* #
  
# 
*     ERROR MESSAGES. 
# 
  
      ARRAY MSG [0:5] S(4); 
        BEGIN 
        ITEM MSG$TEXT   C(00,00,38) = [  ## 
        " *PROBE* COMMAND ERROR.",  ##
        " ERROR IN *OP* SPECIFICATION.",  ##
        " ERROR IN *LO* SPECIFICATION.",  ##
        " DUPLICATE FILE NAME ERROR.",  ##
        "PROBE VERSION 1.0.",  ## 
        " COMMAND OPTION MISMATCH."];  # #
        ITEM MSG$TERM   U(03,48,12) = [6(0)];  # MESSAGE TERMINATOR # 
        END 
  
                                     CONTROL EJECT; 
# 
*     CRACK COMMAND AND VALIDATE OPTIONS. 
# 
  
      PRESET(ARGLIST);               # PRESET ARGUMENTS AND COMMON
                                       BLOCKS # 
      XARG(ARGLIST,OPTION,FLAG);     # CRACK COMMAND #
  
      IF FLAG NQ 0
      THEN                           # COMMAND ERROR #
        BEGIN 
        MESSAGE(MSG[0],SYSUDF1);
        ABORT;
        END 
  
     IF ARG$L[0] NQ 0 
     THEN 
       BEGIN
       RPOPEN(ARG$L,LOC(OUTFET),DEFLT$HDR);  # OPEN FILE #
       RPHEAD(LOC(OUTFET),MSG$TEXT[4],5,19);  # PAGE HEADER # 
       END
  
# 
*     CHECK PROCESSING OPTION.
# 
  
  
      IF ARG$OP[0] NQ "P"            ## 
        AND ARG$OP[0] NQ "R"         ## 
        AND ARG$OP[0] NQ "C"         ## 
      THEN
        BEGIN 
        MESSAGE(MSG[1],SYSUDF1);     # ERROR IN *OP* SPECIFICATIONS # 
        ABORT;
        END 
  
# 
*     CHECK SORT OPTION.
# 
  
      IF ARG$LO[0] NQ "F"            ## 
        AND ARG$LO[0] NQ "R"         ## 
        AND ARG$LO[0] NQ "A"         ## 
      THEN
        BEGIN 
        MESSAGE(MSG[2],SYSUDF1);     # ERROR IN *LO* SPECIFICATION #
        ABORT;
        END 
  
# 
*     CHECK FOR FILE UNIQUENESS.
# 
  
      IF (ARG$OP[0] EQ "P" AND ARG$L[0] EQ ARG$B[0])  ##
        OR ((ARG$OP EQ "R" OR ARG$OP[0] EQ "C")  ## 
        AND (ARG$P[0] EQ ARG$L[0]))  ## 
      THEN
        BEGIN 
        MESSAGE(MSG[3],SYSUDF1);     # DUPLICATE FILE NAME ERROR #
        ABORT;
        END 
  
# 
*     CHECK FILE FOR OPTION MISMATCH. 
# 
  
      IF((ARG$OP[0] EQ "R" OR ARG$OP[0] EQ "C")  ## 
        AND ARG$P[0] EQ 0)  ##
      THEN
        BEGIN 
        MESSAGE(MSG[5],SYSUDF1);     # COMMAND OPTION MISMATCH #
        ABORT;
        END 
  
      RETURN; 
      END  # CSARG #
  
    TERM
PROC  INPUT;
# TITLE INPUT - INPUT OF RAW DATA.                                    # 
      BEGIN  # INPUT #
  
# 
**    INPUT - RAW DATA INPUT. 
* 
*     *INPUT* IS USED TO INPUT RAW DATA FILES TO *PROBE* EITHER 
*     GENERATED BY *SFM* FROM THE SYSTEM TABLES (THIS MAKES 
*     THE DATA CURRENT) OR READ FROM A FILE CREATED BY A
*     PREVIOUS *PROBE* RUN. 
* 
*     THE INDIVIDUAL METHODS INVOLVE: 
* 
*      1.  *SFM* CALL.
* 
*       A.  THE CREATION OF AN RA + 1 REQUEST.
* 
*       B.  THE ISSUING OF THE REQUEST. 
* 
*       C.  THE TRANSFER OF THE CONTENTS OF THE *SFM* 
*           BUFFER TO THE WORKING BUFFERS.
* 
*      2.  PREVIOUSLY CREATED FILE. 
* 
*       A.  DETERMINES WHICH FILE IS TO BE READ.
* 
*       B.  READS IN THE FILE.
* 
*       C.  TRANSFERS THE FILE TO THE WORKING BUFFER
*           AND SETS THE *FET* POINTERS.
* 
*      PROC INPUT 
* 
*      EXIT  DATA READ IN.
* 
*      MESSAGES 
* 
*         NO VERSION DATA ON FILE.
*              THE FILE SPECIFIED BY THE *B* OPTION ON THE
*              COMMAND HAS NO VERSION DATA.  CHECK
*              FILE FOR CORRECTNESS.
* 
*         NO STATISTICAL AREA DATA ON FILE. 
*              THE FILE SPECIFIED BY THE *B* OPTION ON THE
*              COMMAND HAS NO STATISTICAL DATA AREA DATA. 
*              CHECK FILE FOR CORRECTNESS.
* 
*         NO *PROBE* DATA ON FILE.
*              THE FILE SPECIFIED BY THE *B* OPTION ON THE
*              COMMAND HAS NO *PROBE* DATA.  CHECK
*              FILE FOR CORRECTNESS.
* 
*         NO *PROBE* DATA AVAILABLE.
*              THE SYSTEM FAILED TO RETURN ANY DATA.  NO REPORT 
*              WILL BE GENERATED NOR WILL A FILE BE CREATED.
* 
*         *PROBE* VERSION MISMATCH. 
*               THE VERSION UNDER WHICH THE DATA WAS BUILT
*               IS NOT THE CURRENT *PROBE* VERSION. 
# 
  
# 
****  PROC INPUT - XREF LIST BEGIN. 
# 
  
      XREF
        BEGIN 
        PROC ABORT;                  # ABNORMAL TERMINATION # 
        PROC DATE;                   # GET CURRENT DATE # 
        PROC MESSAGE;                # OUTPUT DAYFILE MESSAGE # 
        PROC READ;                   # READ IN FILE # 
        PROC READW;                  # READ TO WORKING BUFFER # 
        PROC REWIND;                 # REWIND FILE #
        PROC SYSTEM;                 # CALL TO SYSTEM # 
        PROC TIME;                   # GET CURRENT TIME # 
        PROC WRITER;                 # WRITE TO FILE #
        PROC WRITEW;                 # FLUSH WORKING BUFFER # 
        PROC ZSETFET;                # SET UP FET # 
        END 
  
# 
****  PROC INPUT - XREF LIST END. 
# 
  
  
      DEF LISTCON    #0#;            # COMMON DECK LIST CONTROL # 
*CALL COMAMSS 
*CALL COMAFET 
*CALL COMSPDT 
*CALL COMUPRB 
  
      ITEM STAT       I;             # READ STATUS #
      ITEM TEMP1      I;             # TEMPORARY CELL # 
  
  
# 
*     ERROR MESSAGES. 
# 
  
      ARRAY MSA [0:4] S(3); 
        BEGIN 
        ITEM MSA$TEXT   C(00,00,28) = [  ## 
        " NO VERSION DATA ON FILE.",  # NO VERSION DATA ON FILE # 
        " NO STATISTICAL AREA DATA ON FILE.",  # NO STATISTICAL DATA #
        " NO *PROBE* DATA ON FILE.",  # NO *PROBE* DATA ON FILE # 
        " NO *PROBE* DATA AVAILABLE.",  # NO *PROBE* DATA AVAILABLE # 
        " *PROBE* VERSION MISMATCH."];  # *PROBE* VERSION MISMATCH #
        ITEM MSA$TERM   U(02,48,12) = [5(0)];  # MESSAGE TERMINATOR # 
        END 
  
# 
*     *SFM* FUNCTION AND SUBFUNCTION DEFINITIONS. 
# 
  
      DEF IOSF       #O"11"#;        # *IOSF* SUBFUNCTION CODE        # 
      DEF PDAF       #O"03"#;        # *PROBE* SUBFUNCTION CODE       # 
      DEF RSDF       #O"22"#;        # *SFM* FUNCTION CODE            # 
      DEF SDIF       #O"02"#;        # *SDA* SUBFUNCTION CODE         # 
  
# 
*     *SFM* SYSTEM REQUEST PARAMETER BLOCK. 
# 
  
      ARRAY SFMCALL [0:0] S(1);      # SFM SYSTEM REQUEST BLOCK       # 
        BEGIN 
        ITEM SFMPRGNAME C(00,00,03) = ["SFM"];
        ITEM SFMRCALLBT U(00,18,06) = [O"20"];
        ITEM SFMFNCTION U(00,24,12) = [RSDF]; 
        ITEM SFMFETADDR U(00,42,18);
        END 
  
                                                     CONTROL EJECT; 
  
# 
*     READ  A PREVIOUSLY BUILT DATA FILE INTO 
*     THE TABLES SPECIFIED BY THE *B* PARAMETER.
# 
  
      IF ARG$OP[0] EQ "P" 
      THEN                           # CHECK FOR PREVIOUSLY CREATED 
                                       FILE OPTION #
        BEGIN  # READ RAW DATA #
  
# 
*     READ IN VERSION DATA. 
# 
  
        ZSETFET(LOC(BFET[0]),ARG$B[0],LOC(CBUF[0]),CBUFL,RFETL);
  
        IF ARG$R[0] NQ 0  ##
        THEN  # REWIND FILE # 
          BEGIN 
          REWIND(BFET[0],RCL);
          END 
  
        READ(BFET[0],RCL);
  
        SFM$LEN[VRSN] = FET$IN[0] - FET$OUT[0];  # SET BUFFER LENGTH #
  
        READW(BFET[0],VBUF[0],VBUFL,STAT);
        IF STAT LS 0
        THEN                         # CHECK FOR EMPTY FILE # 
          BEGIN 
          MESSAGE(MSA[0],SYSUDF1);   # NO VERSION DATA ON FILE #
          ABORT;
          END 
  
        SFM$BUFF[VRSN] = LOC(VBUF);  # SET BUFFER ADDRESS # 
  
        IF VBUF$VRSN[0] NQ VERS$PVER
        THEN                         # CHECK FOR MATCHING VERSIONS #
          BEGIN 
          MESSAGE(MSA[4],SYSUDF1);   # *PROBE* VERSION MISMATCH # 
          ABORT;
          END 
  
# 
*     READ IN STATISTICAL DATA. 
# 
  
        FET$IN[0] = FET$FRST[0];     # RESET FET POINTERS # 
        FET$OUT[0] = FET$IN[0]; 
        READ(BFET[0],RCL);
  
        SFM$LEN[SDA] = FET$IN[0] - FET$OUT[0];  # SET BUFFER LENGTH # 
  
        READW(BFET[0],SBUF[0],SBUFL,STAT);
  
        IF STAT LS 0
        THEN                         # CHECK FOR EMPTY FILE # 
          BEGIN 
          MESSAGE(MSA[1],SYSUDF1);   # NO STATISTICAL AREA DATA 
                                       ON FILE #
          ABORT;
          END 
  
        SFM$BUFF[SDA] = LOC(SBUF);   # SET BUFFER ADDRESS # 
  
# 
*     READ IN *PROBE* DATA. 
# 
  
        FET$IN[0] = FET$FRST[0];     # RESET FET POINTERS # 
        FET$OUT[0] = FET$IN[0]; 
  
        READ(BFET[0],RCL);
  
        SFM$LEN[PROBE] = FET$IN[0] - FET$OUT[0];  # SET BUFFER LENGTH # 
  
        READW(BFET[0],PBUF[0],PBUFL,STAT);
        IF STAT LS 0
        THEN                         # CHECK FOR EMPTY FILE # 
          BEGIN 
          MESSAGE(MSA[2],SYSUDF1);   # NO *PROBE* DATA ON FILE #
          ABORT;
          END 
  
        SFM$BUFF[PROBE] = LOC(PBUF);
  
# 
*     READ IN INPUT/OUTPUT STATISTICS.
# 
  
        FET$IN[0] = FET$FRST[0];     # RESET FET POINTERS, READ DATA  # 
        FET$OUT[0] = FET$IN[0]; 
  
        READ(BFET[0],RCL);
  
        SFM$LEN[IOS] = FET$IN[0] - FET$OUT[0];
  
        READW(BFET[0],IBUF[0],IBUFL,STAT);
        IF STAT LS 0 THEN 
          BEGIN                      # IF NO INPUT/OUTPUT DATA        # 
          SFM$AVBL[IOS] = TRUE; 
          END 
        ELSE
          BEGIN                      # INPUT/OUTPUT DATA              # 
          SFM$AVBL[IOS] = FALSE;
          END 
  
        SFM$BUFF[IOS] = LOC(IBUF);
  
        IF ARG$R[0] NQ 0  ##
        THEN  # REWIND FILE # 
          BEGIN 
          REWIND(BFET[0],RCL);
          END 
  
        RETURN ;
        END  # READ RAW DATA #
  
# 
*     BUILD VERSION TABLE.
# 
      TIME(VBUF$CLOCK);              # CURRENT TIME # 
      DATE(VBUF$DATE);               # CURRENT DATE # 
      VBUF$VRSN[0] = VERS$PVER;      # CURRENT *PROBE* VERSION #
  
# 
*     BUILD STATISTICAL DATA AND *PROBE* DATA TABLES. 
# 
  
      IF ARG$OP[0] EQ "R" 
      THEN                           # CHECK FOR READ OPTION #
        BEGIN 
        TEMP1 = 1;                   # READ *PROBE* DATA TABLES # 
        END 
  
      IF ARG$OP[0] EQ "C" 
      THEN                           # CHECK FOR READ/CLEAR OPTION #
        BEGIN 
        TEMP1 = 3;                   # READ AND CLEAR *PROBE* DATA
                                       TABLES # 
        END 
  
      SFM$RDWR[SDA] = TEMP1;         # SET TO RETURN OR CLEAR TABLES  # 
      SFM$RDWR[PROBE] = TEMP1;
  
      SFM$SFNC[IOS] = IOSF;          # SET *SFM* SUBFUNCTION CODES    # 
      SFM$SFNC[SDA] = SDIF; 
      SFM$SFNC[PROBE] = PDAF; 
  
      SFM$LEN[VRSN] = 5;             # SET BUFFER LENGTHS             # 
      SFM$LEN[IOS] = IBUFL; 
      SFM$LEN[SDA] = SBUFL; 
      SFM$LEN[PROBE] = PBUFL; 
  
      SFM$BUFF[VRSN] = LOC(VBUF);    # SET FWA-S                      # 
      SFM$BUFF[IOS] = LOC(IBUF);
      SFM$BUFF[SDA] = LOC(SBUF);
      SFM$BUFF[PROBE] = LOC(PBUF);
  
      SFMFETADDR[0] = LOC(SFMBLOCK[VRSN+1]);
      SYSTEM(SFMCALL,RCL);           # CALL *SFM*, RETURN SYSTEM DATA # 
  
  
      IF ARG$P[0] EQ 0
      THEN
        BEGIN  # CHECK FOR ARCHIVE FILE # 
        RETURN; 
        END    # CHECK FOR ARCHIVE FILE # 
  
      IF SFM$AVBL[PROBE]
      THEN
        BEGIN  # NO *PROBE* DATA AVAILABLE #
        MESSAGE(MSA[3],SYSUDF1);
        ABORT;
        END  # NO *PROBE* DATA AVAILABLE #
  
# 
*     WRITE TABLES TO FILE SPECIFIED BY *P* PARAMETER.
# 
  
      IF ARG$P[0] NQ 0
      THEN
        BEGIN  # WRITE ARCHIVE FILE # 
        ZSETFET(LOC(BFET[0]),ARG$P[0],LOC(CBUF[0]),CBUFL,RFETL);
  
        IF ARG$R[0] NQ 0
        THEN                         # REWIND FILE #
          BEGIN 
          REWIND(BFET[0],RCL);
          END 
  
        WRITEW(BFET[0],VBUF[0],SFM$LEN[VRSN],STAT); 
        WRITER(BFET[0],RCL);
        IF NOT SFM$AVBL[SDA]
        THEN  # NO DATA PRESENT # 
          BEGIN 
          WRITEW(BFET[0],SBUF[0],SFM$LEN[SDA],STAT);
          END 
  
        WRITER(BFET[0],RCL);
  
        IF NOT SFM$AVBL[PROBE]
        THEN  # NO DATA PRESENT # 
          BEGIN 
          WRITEW(BFET[0],PBUF[0],SFM$LEN[PROBE],STAT);
          END 
  
        WRITER(BFET[0],RCL);
  
        IF NOT SFM$AVBL[IOS] THEN 
          BEGIN                      # IF *IOS* DATA PRESENT          # 
          WRITEW(BFET[0],IBUF[0],SFM$LEN[IOS],STAT);
          END 
  
        WRITER(BFET[0],RCL);
  
        IF ARG$R[0] NQ 0
        THEN                         # REWIND FILE #
          BEGIN 
          REWIND(BFET[0],RCL);
          END 
  
        END  # WRITE ARCHIVE FILE # 
  
      RETURN; 
      END  # INPUT #
  
    TERM
PROC  RPTCIO; 
# TITLE RPTCIO - GENERATE *CIO* REQUESTS REPORT.                       #
  
      BEGIN  # RPTCIO # 
  
# 
**    RPTCIO - GENERATE *CIO* REQUESTS REPORT.
* 
*     THIS PROCEDURE WILL TAKE THE RAW DATA AND FORMAT IT 
*     INTO THE *CIO* REQUEST REPORT.  IT WILL DELETE ALL
*     OF THE FUNCTION CODES WHICH HAVE NO CALLS.
* 
*     PROC RPTCIO 
* 
*     EXIT  REPORT PRINTED. 
* 
*     NOTES 
*          THE *TTCIO* TABLE IS FILLED OUT WITH THE NON EXISTENT
*          FUNCTION CODES.
# 
  
# 
****  PROC RPTCIO - XREF LIST BEGIN.
# 
  
      XREF
        BEGIN 
        PROC RPLINE;                 # OUTPUT LINE #
        PROC RPSPACE;                # OUTPUT BLANK LINE #
        FUNC XCDD  C(10);            # CONVERT TO DISPLAY # 
        END 
  
# 
****  PROC RPTCIO - XREF LIST END.
# 
  
      DEF HDRMAIN    #"CIO REQUESTS"#;  # MAIN HEADER # 
      DEF HDRCOLUMN  #"FUNCTION             CALLS"#;  # HEADERS # 
      DEF HDRTOTAL   #"TOTAL CIO FUNCTIONS PROCESSED"#;  # LABEL FOR
                                                           TOTAL #
      DEF TTCIL      #O"200"#;       # INDEX FOR *CIO* LABELS # 
  
      DEF LISTCON    #0#;            # COMMON DECK LIST CONTROL # 
*CALL COMAMSS 
*CALL COMSPDT 
*CALL COMUFMT 
*CALL COMUOUT 
*CALL COMUPRB 
  
      ITEM COUNT      I;             # TOTAL *CIO* CALL COUNTS #
      ITEM I          I;             # LOOP CONTROL COUNTER # 
      ITEM PLINE      B;             # OUTPUT LINE CONTROL #
      ITEM TEMP       C(10);         # WORKING STORAGE #
  
      BASED 
      ARRAY CIO [0:0] S(1); 
        BEGIN 
        ITEM CIO$CNT    U(00,00,60);  # NUMBER OF *CIO* CALLS # 
        ITEM CIO$CNT1   U(00,00,30);
        ITEM CIO$CNT2   U(00,30,30);
        END 
  
      ARRAY HEAD [0:0] S(6);
        BEGIN 
        ITEM HEAD$TEXT  C(00,00,60);  # TOTAL LINE #
        ITEM HEAD$TEX0  C(00,00,30);  # LEFT COLUMN # 
        ITEM HEAD$TEX1  C(03,00,30);  # RIGHT COLUMN #
        END 
  
      ARRAY LINE [0:0] S(3);
        BEGIN 
        ITEM LINE$NAME  C(00,00,20);  # *CIO* FUNCTION NAME # 
        ITEM LINE$CNT   C(02,00,08) ;  # *CIO* FUNCTION COUNT # 
        ITEM LINE$FILL  C(02,48,02) = [" "];  # FILLER #
        END 
  
      ARRAY TTCIO [0:TTCIL] S(2); 
        BEGIN 
        ITEM TTCIO$NAME C(00,00,20) = [  ## 
        "RPHR(000)",                 # READ PHYSICAL RECORD # 
        "WPHR(004)",                 # WRITE PHYSICAL RECORD #
        "READ(010)",                 # BUFFER READ #
        "WRITE(014)",                # BUFFER WRITE # 
        "READSKP(020)",              # READS SKIP # 
        "WRITER(024)",               # WRITE END OF RECORD #
        "****(30)      ",            # FILLER # 
        "WRITEF(034)",               # WRITE END OF FILE #
        "BKSP(040)",                 # BACKSPACE FILE # 
        "BKSPRU(044)",               # BACKSPACE ONE RECORD # 
        "REWIND(050)",               # REWIND FILE #
        "****(54)      ",            # FILLER # 
        "UNLOAD(060)",               # REWIND AND UNLOAD FILE # 
        "****(64)      ",            # FILLER # 
        "RETURN(070)",               # RELEASE FILE # 
        "****(74)     ",             # FILLER # 
        "OPEN(100)",                 # READ, NO REWIND #
        "OPEN(104)",                 # WRITE, NO REWIND # 
        "POSMF(110)",                # POSITION MULTIFILE TAPE #
        "EVICT(114)",                # RELEASE FILE SPACE # 
        "OPEN(120)",                 # NO REWIND #
        "****(124)      ",           # FILLER # 
        "CLOSE(130)",                # NO REWIND #
        "****(134)      ",           # FILLER # 
        "OPEN(140)",                 # READ AND REWIND #
        "OPEN(144)",                 # WRITE AND REWIND # 
        "CLOSE(150)",                # REWIND # 
        "****(154)      ",           # FILLER # 
        "OPEN(160)",                 # ALTER AND REWIND # 
        "****(164)      ",           # FILLER # 
        "CLOSE(170)",                # REWIND AND UNLOAD #
        "CLOSE(174)",                # REWIND # 
        "READCW(200)",               # CONTROL WORD READ #
        "WRITECW(204)",              # CONTROL WORD WRITE # 
        "READLS(210)",               # READ NONSTOP WITH LIST # 
        "REWRITE(214)",              # BUFFER REWRITE IN PLACE #
        "****(220)      ",           # FILLER # 
        "REWRITER(224)",             # END OF RECORD REWRITE IN PLACE # 
        "RPHRLS(230)",               # READ PRUS WITH LIST #
        "REWRITEF(234)",             # END OF FILE REWRITE IN PLACE # 
        "SKIPF(240)",                # SKIP FORWARD # 
        "OVWRITE(244)",              # OVERWRITE #
        "READNS(250)",               # READ NONSTOP # 
        "OVWRITE(254)",              # OVERWRITE RETURN # 
        "READN(260)",                # READ FORMATTED TAPE #
        "WRITEN(264)",               # WRITE FORMATTED TAPE # 
        "****(270)      ",           # FILLER # 
        "****(274)      ",           # FILLER # 
        "OPEN(300)",                 # READ REAL, NO REWIND # 
        "****(304)      ",           # FILLER # 
        "****(310)      ",           # FILLER # 
        "****(314)      ",           # FILLER # 
        "****(320)      ",           # FILLER # 
        "****(324)      ",           # FILLER # 
        "CLOSE(330)",                # NO REWIND #
        "****(334)      ",           # FILLER # 
        "OPEN(340)",                 # READ REEL AND REWIND # 
        "****(344)      ",           # FILLER # 
        "CLOSE(350)",                # REWIND # 
        "****(354)      ",           # FILLER # 
        "****(360)      ",           # FILLER # 
        "****(364)      ",           # FILLER # 
        "CLOSE(370)",                # REWIND AND UNLOAD #
        "****(374)      ",           # FILLER # 
        "****(400)      ",           # FILLER # 
        "****(404)      ",           # FILLER # 
        "****(410)      ",           # FILLER # 
        "****(414)      ",           # FILLER # 
        "****(420)      ",           # FILLER # 
        "****(424)      ",           # FILLER # 
        "****(430)      ",           # FILLER # 
        "****(434)      ",           # FILLER # 
        "****(440)      ",           # FILLER # 
        "****(444)      ",           # FILLER # 
        "****(450)      ",           # FILLER # 
        "****(454)      ",           # FILLER # 
        "****(460)      ",           # FILLER # 
        "****(464)      ",           # FILLER # 
        "****(470)      ",           # FILLER # 
        "****(474)      ",           # FILLER # 
        "****(500)      ",           # FILLER # 
        "****(504)      ",           # FILLER # 
        "****(510)      ",           # FILLER # 
        "****(514)      ",           # FILLER # 
        "****(520)      ",           # FILLER # 
        "****(524)      ",           # FILLER # 
        "****(530)      ",           # FILLER # 
        "****(534)      ",           # FILLER # 
        "****(540)      ",           # FILLER # 
        "****(544)      ",           # FILLER # 
        "****(550)      ",           # FILLER # 
        "****(554)      ",           # FILLER # 
        "****(560)      ",           # FILLER # 
        "****(564)      ",           # FILLER # 
        "****(570)      ",           # FILLER # 
        "****(574)      ",           # FILLER # 
        "READEI(600)",               # READ TO EOI #
        "****(604)      ",           # FILLER # 
        "****(610)      ",           # FILLER # 
        "****(614)      ",           # FILLER # 
        "****(620)      ",           # FILLER # 
        "****(624)      ",           # FILLER # 
        "****(630)      ",           # FILLER # 
        "****(634)      ",           # FILLER # 
        "SKIPB(640)",                # SKIP BACKWARD #
        ];
        END 
  
                                               CONTROL EJECT; 
  
  
# 
*     PRINT REPORT HEADER.
# 
  
      P<CIO> = SFM$BUFF[PROBE]+TCIO;  # SET FWA OF *CIO* ARRAY #
  
      RPSPACE(LOC(OUTFET),SP"SPACE",1);  # OUTPUT BLANK LINE #
  
      RPLINE(LOC(OUTFET),HDRMAIN,10,12,END$LN); 
  
      RPSPACE(LOC(OUTFET),SP"SPACE",1);  # OUTPUT BLANK LINE #
  
      HEAD$TEX0[0] = HDRCOLUMN;      # COLUMN HEADERS # 
      HEAD$TEX1[0] = HDRCOLUMN; 
  
      RPLINE(LOC(OUTFET),HEAD,10,60,END$LN);
  
      RPSPACE(LOC(OUTFET),SP"SPACE",1);  # OUTPUT BLANK LINE #
  
      PLINE = TRUE;                  # SET THE CONTINUE OUTPUT FLAG # 
  
      SLOWFOR I = 0 STEP 1 UNTIL (TCIOL - 1)
      DO
        BEGIN  # COLLECTION OF *CIO* DATA # 
        IF CIO$CNT2[I] NQ 0 
        THEN                         # CHECK FOR NO DATA #
          BEGIN  # OUTPUT DATA #
          LINE$NAME[0] = TTCIO$NAME[2*I+0];  # *CIO* FUNCTION NAME #
          COUNT = COUNT + CIO$CNT2[I];
          TEMP = XCDD(CIO$CNT2[I]);  # *CIO* FUNCTION COUNT # 
          LINE$CNT[0] = C<2,8>TEMP; 
  
          IF PLINE
          THEN                       # CONTINUE LINE FORMAT # 
            BEGIN 
            RPLINE(LOC(OUTFET),LINE,10,30,CONT$LN);  # OUTPUT CURRENT 
                                                       LINE # 
            PLINE = FALSE;
            END 
  
          ELSE                       # END LINE FORMAT #
            BEGIN 
            RPLINE(LOC(OUTFET),LINE,40,30,END$LN);
            PLINE = TRUE; 
            END 
  
          END  # OUTPUT DATA #
  
        IF CIO$CNT1[I] NQ 0 
        THEN                         # CHECK FOR NO DATA #
          BEGIN  # OUTPUT DATA #
          LINE$NAME[0] = TTCIO$NAME[2*I+1];  # *CIO* FUNCTION NAME #
  
          COUNT = COUNT + CIO$CNT1[I];
  
          TEMP = XCDD(CIO$CNT1[I]);  # *CIO* FUNCTION COUNT # 
          LINE$CNT[0] = C<2,8>TEMP; 
          IF NOT PLINE
          THEN                       # END LINE FORMAT #
            BEGIN 
            RPLINE(LOC(OUTFET),LINE,40,30,END$LN);
            PLINE = TRUE; 
            END 
  
          ELSE
            BEGIN  # CONTINUE LINE FORMAT # 
            RPLINE(LOC(OUTFET),LINE,10,30,CONT$LN); 
            PLINE = FALSE;
            END 
  
          END  # OUTPUT DATA #
  
        END  # COLLECTION OF *CIO* DATA # 
  
# 
*     OUTPUT TOTAL NUMBER OF *CIO* FUNCTIONS PROCESSED. 
# 
  
      RPSPACE(LOC(OUTFET),SP"SPACE",1);  # OUTPUT BLANK LINE #
  
      HEAD$TEX0[0] = HDRTOTAL;
      TEMP = XCDD(COUNT);            # CONVERT *CIO* FUNCTIONS COUNT #
      HEAD$TEX1[0] = TEMP;           # SET OUTPUT # 
  
      RPLINE(LOC(OUTFET),HEAD,10,60,END$LN);
  
      END  # RPTCIO # 
  
    TERM
PROC  RPTIOS; 
# TITLE RPTIOS - GENERATE I/O STATISTICS REPORT.                      # 
      BEGIN  # RPTIOS # 
  
# 
**    RPTIOS - GENERATE I/O STATISTICS REPORT.
* 
*     ROUTINE *RPTIOS* FORMATS THE DATA RETURNED FROM *SFM* 
*     FUNCTION *RSDF*, SUBFUNCTION *IOSF*, IF ANY, INTO A SET 
*     OF STATISTICS.
* 
*     PROC RPTIOS 
* 
*     EXIT  I/O STATISTICS, IF PRESENT ADDED TO OUTPUT FILE.
* 
*     MESSAGES
* 
*         NO I/O STATISTICS.
*              THE CALL TO *SFM* RETURNED NO I/O STATISTICS.
# 
  
# 
****  PROC RPTIOS - XREF LIST BEGIN.
# 
  
      XREF
        BEGIN 
        PROC RPLINE;                 # OUTPUT LINE #
        PROC RPSPACE;                # OUTPUT BLANK LINE #
        FUNC XCDD       C(10);       # CONVERT TO DISPLAY # 
        END 
  
# 
****  PROC RPTIOS - XREF LIST END.
# 
  
      DEF HDRMAIN 
        #"I/O STATISTICS FOR "#;
      DEF HDRTOTL 
        #"  TOTALS                         "#;
      DEF HDRCOLUMN1
        #"     CBT-S          SECTORS                      "#;
      DEF HDRCOLUMN2
        #"  TRANSFERRED     TRANSFERRED      READS   WRITES"#;
  
      DEF LISTCON    #0#;            # COMMON DECK LIST CONTROL # 
      DEF IOSBLEN    #9#;            # IOS BLOCK LENGTH # 
  
*CALL COMAMSS;
*CALL COMSPDT;
*CALL COMUFMT;
*CALL COMUOUT;
*CALL COMUPRB;
  
      ITEM I          I;             # LOOP CONTROL COUNTER # 
      ITEM J          I;             # LOOP CONTROL COUNTER # 
      ITEM K          I;             # END OF LOOP COUNTER #
      ITEM TEMP       C(10);         # WORKING STORAGE #
      ITEM TOTREAD    I;             # TOTAL READS #
      ITEM TOTWRIT    I;             # TOTAL READS #
  
      BASED ARRAY IOSTATBUFF [0:0] S(1);
        BEGIN 
        ITEM DEVICETYPE U(00,00,12); # DEVICE TYPE #
        ITEM ESTORDINAL C(00,12,03); # EST ORDINAL IN DISPLAY CODE #
        ITEM IOSRCNT    U(00,00,30); # READ COUNT # 
        ITEM IOSWCNT    U(00,30,30); # WRITE COUNT #
        END 
  
      ARRAY HEAD [0:0] S(6);
        BEGIN 
        ITEM HEAD$TEXT  C(00,00,60); # TOTAL LINE # 
        END 
  
      ARRAY IOSLINE [0:0] S(5); 
        BEGIN 
        ITEM TRANSFER   C(00,00,30); # SECTIONS TRANSFERRED # 
        ITEM FILLERONE  C(03,00,04)= ["    "];
        ITEM NUM$READS  C(03,24,06); # NUMBER OF READS #
        ITEM FILLERTWO  C(04,00,03)= ["   "]; 
        ITEM NUM$WRITE  C(04,18,06); # NUMBER OF WRITES # 
        ITEM FILLERTRE  C(04,54,01)= [" "]; 
        END 
  
      ARRAY TRANSFERED [1:IOSBLEN] P(4);
        BEGIN 
        ITEM TRAWORDS C(00,00,40) = [ 
        "      1              1-40B              ", 
        "     2-3           41B-140B             ", 
        "     4-7          141B-340B             ", 
        "   10B-17B        341B-740B             ", 
        "   20B-37B        741B-1740B            ", 
        "   40B-77B       1741B-3740B            ", 
        "  100B-177B      3741B-7740B            ", 
        "  200B-MORE      7741B-MORE             ", 
        ];
        END 
  
# 
*     MAIN CODE STARTS HERE WITH CHECK FOR DATA RETURNED. 
# 
      IF SFM$AVBL[IOS] THEN 
        BEGIN                        # IF NO STATISTICS AVAILABLE # 
        RPLINE(LOC(OUTFET)," NO I/O STATISTICS. ",10,20,END$LN);
        RETURN;                      # RETURN # 
        END 
# 
*     FORMAT OUTPUT TABLE FOR EACH BLOCK RETURNED.
# 
      K = SFM$LEN[IOS] / IOSBLEN;    # CALCULATE LOOP COUNT # 
      FOR I = 1 STEP 1 UNTIL K DO 
        BEGIN                        # UNTIL END OF DATA #
# 
*     POSITION BASED ARRAY TO FIRST WORD ADDRESS. 
# 
        P<IOSTATBUFF> = SFM$BUFF[IOS];
# 
*     FORMAT HEADER ENTRY WITH DEVICE TYPE AND EST ORDINAL. 
# 
        RPSPACE(LOC(OUTFET),SP"SPACE",1); 
        C<0,19>HEAD$TEXT[0] = HDRMAIN;
        C<19,02>HEAD$TEXT[0] = "  ";
        C<21,02>HEAD$TEXT[0] = C<0,2>DEVICETYPE[0]; 
        C<23,03>HEAD$TEXT[0] = ESTORDINAL[0]; 
        C<26,02>HEAD$TEXT[0] = ": ";
        RPLINE(LOC(OUTFET),HEAD,10,28,END$LN);
        RPSPACE(LOC(OUTFET),SP"SPACE",1); 
        HEAD$TEXT[0] = HDRCOLUMN1;
        RPLINE(LOC(OUTFET),HEAD,10,60,END$LN);
        HEAD$TEXT[0] = HDRCOLUMN2;
        RPLINE(LOC(OUTFET),HEAD,10,60,END$LN);
# 
*     FORMAT READ AND WRITE COUNTS FOR EACH DEVICE. 
# 
        TOTREAD = 0;                 # FIRST CLEAR TOTALS # 
        TOTWRIT = 0;
        FOR J = 1 STEP 1 UNTIL IOSBLEN - 1 DO 
          BEGIN                      # UNTIL DONE FOR DEVICE #
          TRANSFER = TRAWORDS[J]; 
          TOTREAD = TOTREAD + IOSRCNT[J]; 
          TEMP = XCDD(IOSRCNT[J]);   # CONVERT READ COUNT # 
          NUM$READS = C<4,6>TEMP; 
          TOTWRIT = TOTWRIT + IOSWCNT[J]; 
          TEMP = XCDD(IOSWCNT[J]);   # CONVERT WRITE COUNT #
          NUM$WRITE = C<4,6>TEMP; 
          RPLINE(LOC(OUTFET),IOSLINE,10,50,END$LN); 
          END 
# 
*     FORMAT TRAILER WITH TOTALS. 
# 
        RPSPACE(LOC(OUTFET),SP"SPACE",1); 
        C<0,31>HEAD$TEXT[0] = HDRTOTL;
        TEMP = XCDD(TOTREAD);        # CONVERT READ TOTAL # 
        C<32,08>HEAD$TEXT[0] = C<2,8>TEMP;
        C<40,01>HEAD$TEXT[0] = " "; 
        TEMP = XCDD(TOTWRIT);        # CONVERT WRITE TOTAL #
        C<41,08>HEAD$TEXT[0] = C<2,8>TEMP;
        RPLINE(LOC(OUTFET),HEAD,10,51,END$LN);
        RPSPACE(LOC(OUTFET),SP"SPACE",1); 
# 
*     REPOSITION FIRST WORD ADDRESS.
# 
        SFM$BUFF[IOS] = SFM$BUFF[IOS] + IOSBLEN;
        END 
      END  # RPTCIO # 
    TERM
PROC RPTMON;
# TITLE RPTMON - GENERATE *MTR* REQUEST REPORT                        # 
  
      BEGIN  # RPTMON # 
  
# 
**    RPTMON - GENERATE *MTR* REQUEST REPORT. 
* 
*     THE REPORT IS GENERATED FROM THE RAW DATA AND 
*     MATCHED WITH THE APPROPRIATE FUNCTION.
* 
*     PROC RPTMON 
* 
*     EXIT   REPORT PRINTED.
# 
  
# 
****  PROC RPTMON - XREF LIST BEGIN.
# 
  
      XREF
        BEGIN 
        PROC RPLINE;                 # OUTPUT LINE #
        PROC RPSPACE;                # OUTPUT BLANK LINE #
        FUNC XCDD C(10);             # CONVERT TO DISPLAY # 
        FUNC XCOD C(10);             # CONVERT TO OCTAL DISPLAY # 
        END 
  
# 
****  PROC RPTMON - XREF LIST END.
# 
  
      DEF HDRCOLUMN  #"CPU0      CPU1"#;  # COLUMN HEADERS #
      DEF HDRMTR     #"MTR REQUESTS"#;   # REPORT TYPE #
      DEF HDRSUBTOT  #"SUBTOTAL"#;   # COLUMN TOTAL # 
      DEF HDRTOTAL   #"TOTAL"#;      # TOTAL OF COLUMNS # 
  
      DEF LISTCON    #0#;            # COMMON DECK LIST CONTROL # 
  
*CALL COMAMSS 
*CALL COMSPDT 
*CALL COMUFMT 
*CALL COMUOUT 
*CALL COMUPRB 
  
  
      ITEM COUNT0     I;             # CPU 0 COUNTER #
      ITEM COUNT1     I;             # CPU 1 COUNTER #
      ITEM I          I;             # LOOP CONTROL # 
      ITEM TEMP       C(10);         # WORKING STORAGE #
  
      ARRAY HEAD [0:0] S(3);
        BEGIN 
        ITEM HEAD$TEX0  C(00,00,30);  # TOTAL LINE #
        ITEM HEAD$TEX1  C(00,00,20);  # TOTAL HEADERS # 
        ITEM HEAD$TEX2  C(01,12,08);  # SUBTOTAL COUNT #
        ITEM HEAD$TEX3  C(01,30,04);  # CPU 0 HEADER #
        ITEM HEAD$TEX4  C(02,12,08);  # TOTAL COUNT # 
        ITEM HEAD$TEX5  C(02,30,04);  # CPU 1 HEADER #
        END 
  
      ARRAY LINE [0:0] S(3);         # OUTPUT LINE FORMAT # 
        BEGIN 
        ITEM LINE$BLANK C(00,00,30) = [" "];  # BLANK FILL #
        ITEM LINE$NAME  C(00,12,04);  # FUNCTION NAME # 
        ITEM LINE$LPAR  C(00,36,01) = ["("];  # LEFT PARENTHESIS #
        ITEM LINE$NUM   C(00,42,02);  # FUNCTION CODE # 
        ITEM LINE$RPAR  C(00,54,01) = [")"];  # RIGHT PARENTHESIS # 
        ITEM LINE$MCPU0 C(01,12,08);  # MONITOR MODE - CPU 0 COUNT #
        ITEM LINE$MCPU1 C(02,12,08);  # MONITOR MODE - CPU 1 COUNT #
        END 
  
      ARRAY MMTR [1:MXP1] S(1);      # FUNCTION NAMES # 
        BEGIN 
        ITEM MMTR$TEXT  C(00,00,04) = [  ## 
        "CSWF",                      # SWITCH CPU # 
        "ARTF",                      # UPDATE RUNNING TIME #
        "CSLF",                      # CHECK SUBCP TIME LIMIT # 
        "EPRF",                      # ENTER PROGRAM MODE REQUEST # 
        "RCLF",                      # RECALL CPU # 
        "MFLF",                      # MODIFY FL #
        "MRAF",                      # MODIFY RA #
        "MSCF",                      # MONITOR STEP CONTROL # 
        "PRQF",                      # PROCESS RECALL REQUEST QUEUE # 
        "TCSF",                      # SWITCH CPU ON TIME SLICE # 
        "PCXF",                      # PROCESS ALTERNATE CPU SWITCH # 
        "ARMF",                      # ADVANCE RUNNING TIME - MMF 
                                     MODE # 
        "UCCF",                      # UPDATE CTI CLOCK # 
        "CRAF",                      # CHANGE RA #
        "ADTF",                      # ADVANCE DATE AND TIME #
        "SKCF"];                     # SET K DISPLAY COMPLETE BIT # 
        END 
  
# 
*      THE SECTION OF THE *PROBE* DATA BUFFER WHICH CONTAINS
*      THE NUMBER OF *MTR* REQUESTS.
# 
  
      BASED 
      ARRAY MTR [1:1] S(1); 
        BEGIN 
        ITEM MTR$CNT1   U(00,00,30);  # MONITOR MODE - CPU 1 COUNT #
        ITEM MTR$CNT0   U(00,30,30);  # MONITOR MODE - CPU 0 COUNT #
        END 
  
                                                     CONTROL EJECT; 
  
  
# 
*     GENERATE *MTR* REQUEST  REPORT. 
# 
  
      P<MTR> = SFM$BUFF[PROBE]+TMTR;  ##
  
# 
*     OUTPUT REPORT HEADER. 
# 
  
      RPSPACE(LOC(OUTFET),SP"SPACE",1);  # OUTPUT BLANK LINE #
  
      RPLINE(LOC(OUTFET),HDRMTR,10,12,END$LN);
  
      RPSPACE(LOC(OUTFET),SP"SPACE",1);  # OUTPUT BLANK LINE #
  
      HEAD$TEX0[0] = " ";            # CLEAR LINE # 
  
      RPLINE(LOC(OUTFET),HDRCOLUMN,25,14,END$LN); 
  
      FASTFOR I = 1 STEP 1 UNTIL MXP1 
      DO
        BEGIN 
        LINE$NAME[0] = MMTR$TEXT[I];  # SET FUNCTION NAME # 
        TEMP = XCOD(I);              # SET FUNCTION CODE #
        LINE$NUM[0] = C<8,2>TEMP; 
        COUNT0 = COUNT0 + MTR$CNT0[I];  # CPU 0 COUNT # 
        TEMP = XCDD(MTR$CNT0[I]);    # SET MONITOR MODE - CPU 0 COUNT # 
        LINE$MCPU0[0] = C<2,8>TEMP; 
        COUNT1 = COUNT1 + MTR$CNT1[I];  # CPU 1 COUNT # 
        TEMP = XCDD(MTR$CNT1[I]);    # SET MONITOR MODE - CPU 1 COUNT # 
        LINE$MCPU1[0] = C<2,8>TEMP; 
  
        RPLINE(LOC(OUTFET),LINE,10,30,END$LN);
        END 
  
# 
*     OUTPUT CUMULATIVE TOTALS. 
# 
  
      HEAD$TEX0[0] = " ";            # CLEAR LINE # 
      HEAD$TEX1[0] = HDRSUBTOT;      # SUBTOTAL # 
      TEMP = XCDD(COUNT0);
      HEAD$TEX2[0] = C<2,8>TEMP;     # SET CPU 0 COUNT #
      TEMP = XCDD(COUNT1);
      HEAD$TEX4[0] = C<2,8>TEMP;     # SET CPU 1 COUNT #
  
      RPLINE(LOC(OUTFET),HEAD,10,30,END$LN);
  
      HEAD$TEX0[0] = " ";            # CLEAR LINE # 
      HEAD$TEX1[0] = HDRTOTAL;       # TOTAL #
      TEMP = XCDD(COUNT0 + COUNT1);  # CPU 0 + CPU 1 = TOTAL #
      HEAD$TEX2[0] = C<2,8>TEMP;     # SET COUNT #
  
      RPLINE(LOC(OUTFET),HEAD,10,30,END$LN);
  
      END  # RPTMON # 
  
    TERM
PROC RPTMPP;
# TITLE RPTMPP - PERFORMANCE REPORT GENERATOR.                        # 
  
      BEGIN  # RPTMPP # 
  
# 
**    RPTMPP - PERFORMANCE REPORT GENERATOR.
* 
*     THIS CODE WILL PRODUCE THE PROBE *MTR* PERFORMANCE
*     PARAMETERS.  THESE ARE FOUND IN LOW CORE. 
* 
*     PROC RPTMPP 
* 
*     EXIT   REPORT PRINTED.
# 
  
# 
****  PROC RPTMPP - XREF LIST BEGIN.
# 
  
      XREF
        BEGIN 
        PROC RPLINE;                 # OUTPUT LINE #
        PROC RPSPACE;                # OUTPUT BLANK LINE #
        FUNC XCDD  C(10);            # CONVERT TO DISPLAY # 
        END 
  
# 
****  PROC RPTMPP - XREF LIST END.
# 
  
      DEF MPPL0      #"MTR PERFORMANCE PARAMETERS"#;
      DEF MPPL1      #"WORST CASE *MXN* TIME ="#; 
      DEF MPPL2      #"WORST CASE CYCLE TIME ="#; 
      DEF MPPL3      #"CPUMTR PERFORMANCE PARAMETERS"#; 
      DEF MPPL4      #"EM STORAGE MOVES ="#;
      DEF MPPL5      #"CM STORAGE MOVES ="#;
      DEF MPPL6      #"PP PRIORITY EXCHANGE REQUESTS ="#; 
      DEF MPPL7      #"1RO PERFORMANCE PARAMETERS"#;
      DEF MPPL8      #"NUMBER OF ROLLOUTS ="#;
      DEF MPPL9      #"NUMBER OF SECTORS ROLLED ="#;
      DEF MPPL10     #"1SJ PERFORMANCE PARAMETERS"#;
      DEF MPPL11     #"ROLLOUTS FOR RESOURCE LIMITS ="#;
      DEF MPPL12     #"TIME SLICES ="#; 
      DEF MPPL13     #"COMMUNICATIONS BUFFER NOT AVAILABLE ="#; 
      DEF MPPL14     #"MISSED CLOCK UPDATES ="#;
      DEF MPPL15     #"ROLLOUTS TO SECONDARY DEVICES ="#; 
      DEF MPPL16     #"SECTORS ROLLED TO SECONDARY DEVICES ="#; 
      DEF MPPL17     #"EJT SCANS ="#; 
      DEF MPPL18     #"SCHEDULABLE JOBS="#; 
      DEF MPPL19     #"JOBS PREEMPTED ="#;
      DEF MPPL20     #"JOBS SCHEDULED ="#;
      DEF MPPL21     #"JOBS SCHEDULED NO CONSTRAINTS ="#; 
      DEF MPPL22     #"EJT SCANS WITH INSUFFICIENT CM ="#;
      DEF MPPL23     #"EJT SCANS WITH INSUFFICIENT EM ="#;
      DEF MPPL24     #"EJT SCANS WITH NO CONTROL POINT ="#; 
      DEF MPPL25     #"PSEUDO-ROLLOUTS = "#;
      DEF MPPL26     #"PSEUDO-CONTROL POINT ROLLOUTS = "#;
      DEF MPPL27     #"DIRECT MOVES = "#; 
      DEF MPPL28     #"PSEUDO-CONTROL POINT NOT AVAILABLE ="#;
      DEF MPPL29     #"MMF I/O PERFORMANCE PARAMETERS"#;
      DEF MPPL30     #"BRT ENTRIES ACTIVE ="#;
      DEF MPPL31     #"WORST CASE BRT ENTRIES ACTIVE ="#; 
      DEF MPPL32     #"BRT ENTRIES REJECTED ="#;
      DEF MPPL33     #"TOTAL BRT ENTRIES CREATED ="#; 
      DEF MPPL34     #"CURRENT MTE CYCLE TIME ="#;
      DEF MPPL35     #"WORST CASE MTE CYCLE TIME = "#;
      DEF MPPL36     #"BATI INTERLOCK ATTEMPTS ABANDONED = "#;
      DEF MPPL37     #"TOTAL BAT REQUESTS FROM CPUMTR = "#; 
  
      DEF LISTCON    #0#;            # COMMON DECK LIST CONTROL # 
  
*CALL COMAMSS 
*CALL COMSPDT 
*CALL COMUFMT 
*CALL COMUOUT 
*CALL COMUPRB 
  
      ITEM TEMP       C(10);         # WORKING STORAGE #
  
      ARRAY LINE [0:0] S(6);         # REPORT OUTPUT LINE # 
        BEGIN 
        ITEM LINE$BLL   C(00,00,60) = [" "];  # BLANK FILL #
        ITEM LINE$LABS  C(00,00,43);  # DATA LABELS # 
        ITEM LINE$DATA  C(04,06,10);  # DATA OUTPUT # 
        END 
  
# 
*     SNAPSHOT OF CMR STATISTICAL DATA AREA.
*      THE SNAPSHOT IS TAKEN BY *SFM* AND PASSED
*      WITH THE DATA. 
# 
  
      BASED 
      ARRAY SDX [0:0] S(18);
        BEGIN 
        ITEM SDX$1SJEJ  U(00,00,24);  # EJT SCANS # 
        ITEM SDX$1SJSJ  U(00,24,36);  # SCHEDULABLE JOBS #
        ITEM SDX$1SJJP  U(01,12,24);  # JOBS PREEMPTED #
        ITEM SDX$1SJJS  U(01,36,24);  # JOBS SCHEDULED #
        ITEM SDX$1SJJN  U(02,12,24);  # JOBS SCHEDULED NO CONSTRAINTS # 
        ITEM SDX$1SJIC  U(02,36,24);  # EJT SCANS INSUFFICIENT CM # 
        ITEM SDX$1SJIE  U(03,12,24);  # EJT SCANS INSUFFICIENT EM # 
        ITEM SDX$1SJNC  U(03,36,24);  # EJT SCANS NO CP # 
        ITEM SDX$1SJRR  U(04,12,24);  # ROLLOUTS FOR RESOURCE LIMITS #
        ITEM SDX$1SJTS  U(04,36,24);  # TIME SLICES # 
        ITEM SDX$MTRMC  U(05,12,12);  # MTR MISSED CLOCK UPDATES #
        ITEM SDX$MTRWX  U(05,24,12);  # WORST CASE *MXN* TIME # 
        ITEM SDX$MTRWC  U(05,36,12);  # WORST CASE *MTR* CYCLE TIME # 
        ITEM SDX$CMM    U(06,00,60);  # CM STORAGE MOVES #
        ITEM SDX$EMM    U(07,00,60);  # EM STORAGE MOVES #
        ITEM SDX$DMM    U(08,00,60);  # DIRECT MOVES #
        ITEM SDX$CBN    U(09,00,60);  # NO COMMUNICATION BUFFER # 
        ITEM SDX$PRX    U(10,00,60);  # PP PRIORITY EXCHANGES # 
        ITEM SDX$ROT    U(11,00,60);  # ROLLOUTS #
        ITEM SDX$POT    U(12,00,60);  # PSEUDO-ROLLOUTS # 
        ITEM SDX$PCT    U(13,00,60);  # PCP ROLLOUTS #
        ITEM SDX$ROS    U(14,00,60);  # SECONDARY ROLLOUTS #
        ITEM SDX$SOT    U(15,00,60);  # SECTORS ROLLED OUT #
        ITEM SDX$SOS    U(16,00,60);  # SECONDARY SECTORS ROLLED OUT #
        ITEM SDX$PCN    U(17,00,60);  # NO PSEUDO-CONTROL POINTS #
        ITEM SDX$DMCBA  U(18,00,12);  # CURRENT *BRT* ENTRIES ACTIVE #
        ITEM SDX$DMMBA  U(18,12,12);  # MAXIMUM *BRT* ENTRIES ACTIVE #
        ITEM SDX$DMBER  U(18,24,12);  # *BRT* ENTRIES REJECTED #
        ITEM SDX$DMTBE  U(18,36,24);  # TOTAL *BRT* ENTRIES CREATED # 
        ITEM SDX$DMCCT  U(19,00,12);  # CURRENT *MTE* CYCLE TIME #
        ITEM SDX$DMMCT  U(19,12,12);  # MAXIMUM *MTE* CYCLE TIME #
        ITEM SDX$DMBIA  U(19,24,12);  # *BATI* INTLK TRIES ABANDONED #
        ITEM SDX$DMTBR  U(19,36,24);  # TOTAL *BAT* REQUESTS #
        ITEM SDX$DMCS   U(20,00,60);  # UNUSED ITEM - REMOVE LATER #
        END 
  
                                                     CONTROL EJECT; 
  
      RPSPACE(LOC(OUTFET),SP"SPACE",3);  # OUTPUT BLANK LINE #
  
      P<SDX> = SFM$BUFF[SDA]; 
  
      RPLINE(LOC(OUTFET),MPPL0,10,26,END$LN); 
  
      LINE$LABS[0] = MPPL1; 
      TEMP = XCDD(SDX$MTRWX); 
      LINE$DATA[0] = TEMP;           # WORST CASE CYCLE TIME #
  
      RPLINE(LOC(OUTFET),LINE,12,60,END$LN);
  
      LINE$LABS[0] = MPPL2; 
      TEMP = XCDD(SDX$MTRWC); 
      LINE$DATA[0] = TEMP;           # WORST CASE *MXN* TIME #
  
      RPLINE(LOC(OUTFET),LINE,12,60,END$LN);
  
      LINE$LABS[0] = MPPL14;
      TEMP = XCDD(SDX$MTRMC); 
      LINE$DATA[0] = TEMP;           # MISSED CLOCK UPDATES # 
  
      RPLINE(LOC(OUTFET),LINE,12,60,END$LN);
  
  
      RPSPACE(LOC(OUTFET),SP"SPACE",1);  # OUTPUT BLANK LINE #
  
  
      RPLINE(LOC(OUTFET),MPPL3,10,29,END$LN);  # SECTION HEADER # 
  
      LINE$LABS[0] = MPPL4; 
      TEMP = XCDD(SDX$EMM); 
      LINE$DATA[0] = TEMP;           # EM STORAGE MOVES # 
  
      RPLINE(LOC(OUTFET),LINE,12,60,END$LN);
  
      LINE$LABS[0] = MPPL5; 
      TEMP = XCDD(SDX$CMM); 
      LINE$DATA[0] = TEMP;           # CM STORAGE MOVES # 
  
      RPLINE(LOC(OUTFET),LINE,12,60,END$LN);
  
      LINE$LABS[0] = MPPL27;
      TEMP = XCDD(SDX$DMM); 
      LINE$DATA[0] = TEMP;           # DIRECT MOVES # 
  
      RPLINE(LOC(OUTFET),LINE,12,60,END$LN);
  
      LINE$LABS[0] = MPPL13;
      TEMP = XCDD(SDX$CBN); 
      LINE$DATA[0] = TEMP;           # COMMUNICATIONS BUFFER NOT
                                       AVAILABLE COUNT #
  
      RPLINE(LOC(OUTFET),LINE,12,60,END$LN);
  
      LINE$LABS[0] = MPPL6; 
      TEMP = XCDD(SDX$PRX); 
      LINE$DATA[0] = TEMP;           # SET PP EXCHANGE REQUESTS # 
  
      RPLINE(LOC(OUTFET),LINE,12,60,END$LN);
  
      LINE$LABS[0] = MPPL28;
      TEMP = XCDD(SDX$PCN); 
      LINE$DATA[0] = TEMP;           # PSEUDO-CONTROL POINT NOT 
                                       AVAILABLE #
  
      RPLINE(LOC(OUTFET),LINE,12,60,END$LN);
  
      LINE$DATA[0] = " ";  # BLANK FILL # 
  
      RPSPACE(LOC(OUTFET),SP"SPACE",1);  # OUTPUT BLANK LINE #
  
      RPLINE(LOC(OUTFET),MPPL7,10,26,END$LN);  # SECTION HEADER # 
  
      LINE$LABS[0] = MPPL8; 
      TEMP = XCDD(SDX$ROT); 
      LINE$DATA[0] = TEMP;           # ROLLOUTS # 
  
      RPLINE(LOC(OUTFET),LINE,12,60,END$LN);
  
      LINE$LABS[0] = MPPL25;
      TEMP = XCDD(SDX$POT); 
      LINE$DATA[0] = TEMP;           # PSEUDO-ROLLOUTS #
  
      RPLINE(LOC(OUTFET),LINE,12,60,END$LN);
  
      LINE$LABS[0] = MPPL26;
      TEMP = XCDD(SDX$PCT); 
      LINE$DATA[0] = TEMP;           # PCP ROLLOUTS # 
  
      RPLINE(LOC(OUTFET),LINE,12,60,END$LN);
  
      LINE$LABS[0] = MPPL15;
      TEMP = XCDD(SDX$ROS); 
      LINE$DATA[0] = TEMP;           # SECONDARY ROLLOUTS # 
  
      RPLINE(LOC(OUTFET),LINE,12,60,END$LN);
  
      LINE$LABS[0] = MPPL9; 
      TEMP = XCDD(SDX$SOT); 
      LINE$DATA[0] = TEMP;           # SECTORS ROLLED # 
  
      RPLINE(LOC(OUTFET),LINE,12,60,END$LN);
  
      LINE$LABS[0] = MPPL16;
      TEMP = XCDD(SDX$SOS); 
      LINE$DATA[0] = TEMP;           # SECTORS ROLLED TO SECONDARY
                                       DEVICES #
  
      RPLINE(LOC(OUTFET),LINE,12,60,END$LN);
  
      RPSPACE(LOC(OUTFET),SP"SPACE",1);  # OUTPUT BLANK LINE #
  
      RPLINE(LOC(OUTFET),MPPL10,10,26,END$LN);  # SECTION HEADER #
  
      LINE$LABS[0] = MPPL17;
      TEMP = XCDD(SDX$1SJEJ); 
      LINE$DATA[0] = TEMP;           # EJT SCANS #
  
      RPLINE(LOC(OUTFET),LINE,12,60,END$LN);
  
      LINE$LABS[0] = MPPL18;
      TEMP = XCDD(SDX$1SJSJ); 
      LINE$DATA[0] = TEMP;           # SCHEDULABLE JOBS # 
  
      RPLINE(LOC(OUTFET),LINE,12,60,END$LN);
  
      LINE$LABS[0] = MPPL19;
      TEMP = XCDD(SDX$1SJJP); 
      LINE$DATA[0] = TEMP;           # JOBS PREEMPTED # 
  
      RPLINE(LOC(OUTFET),LINE,12,60,END$LN);
  
      LINE$LABS[0] = MPPL20;
      TEMP = XCDD(SDX$1SJJS); 
      LINE$DATA[0] = TEMP;           # JOBS SCHEDULED # 
  
      RPLINE(LOC(OUTFET),LINE,12,60,END$LN);
  
      LINE$LABS[0] = MPPL21;
      TEMP = XCDD(SDX$1SJJN); 
      LINE$DATA[0] = TEMP;           # JOBS SCHEDULED NO CONSTRAINTS #
  
      RPLINE(LOC(OUTFET),LINE,12,60,END$LN);
  
      LINE$LABS[0] = MPPL22;
      TEMP = XCDD(SDX$1SJIC); 
      LINE$DATA[0] = TEMP;           # EJT SCANS INSUFFICIENT CM #
  
      RPLINE(LOC(OUTFET),LINE,12,60,END$LN);
  
      LINE$LABS[0] = MPPL23;
      TEMP = XCDD(SDX$1SJIE); 
      LINE$DATA[0] = TEMP;           # EJT SCANS INSUFFICIENT EM #
  
      RPLINE(LOC(OUTFET),LINE,12,60,END$LN);
  
      LINE$LABS[0] = MPPL24;
      TEMP = XCDD(SDX$1SJNC); 
      LINE$DATA[0] = TEMP;           # EJT SCANS NO CONTROL POINT # 
  
      RPLINE(LOC(OUTFET),LINE,12,60,END$LN);
  
      LINE$LABS[0] = MPPL11;
      TEMP = XCDD(SDX$1SJRR); 
      LINE$DATA[0] = TEMP;           # ROLLOUTS FOR RESOURCE LIMITS # 
  
      RPLINE(LOC(OUTFET),LINE,12,60,END$LN);
  
      LINE$LABS[0] = MPPL12;
      TEMP = XCDD(SDX$1SJTS); 
      LINE$DATA[0] = TEMP;           # TIME SLICES #
  
      RPLINE(LOC(OUTFET),LINE,12,60,END$LN);
  
      RPSPACE(LOC(OUTFET),SP"SPACE",1);  # OUTPUT BLANK LINE #
  
      RPLINE(LOC(OUTFET),MPPL29,10,30,END$LN);  # SECTION HEADER #
  
      LINE$LABS[0] = MPPL30;
      TEMP = XCDD(SDX$DMCBA); 
      LINE$DATA[0] = TEMP;           # CURRENT *BRT* ENTRIES ACTIVE # 
  
      RPLINE(LOC(OUTFET),LINE,12,60,END$LN);
  
      LINE$LABS[0] = MPPL31;
      TEMP = XCDD(SDX$DMMBA); 
      LINE$DATA[0] = TEMP;           # WORST CASE *BRT* ENTRIES 
                                       ACTIVE # 
  
      RPLINE(LOC(OUTFET),LINE,12,60,END$LN);
  
      LINE$LABS[0] = MPPL32;
      TEMP = XCDD(SDX$DMBER); 
      LINE$DATA[0] = TEMP;           # *BRT* ENTRIES REJECTED # 
  
      RPLINE(LOC(OUTFET),LINE,12,60,END$LN);
  
      LINE$LABS[0] = MPPL33;
      TEMP = XCDD(SDX$DMTBE); 
      LINE$DATA[0] = TEMP;           # TOTAL *BRT* ENTIRES CREATED #
  
      RPLINE(LOC(OUTFET),LINE,12,60,END$LN);
  
      LINE$LABS[0] = MPPL34;
      TEMP = XCDD(SDX$DMCCT); 
      LINE$DATA[0] = TEMP;           # CURRENT *MTE* CYCLE TIME # 
  
      RPLINE(LOC(OUTFET),LINE,12,60,END$LN);
  
      LINE$LABS[0] = MPPL35;
      TEMP = XCDD(SDX$DMMCT); 
      LINE$DATA[0] = TEMP;           # WORST CASE *MTE* CYCLE TIME #
  
      RPLINE(LOC(OUTFET),LINE,12,60,END$LN);
  
      LINE$LABS[0] = MPPL36;
      TEMP = XCDD(SDX$DMBIA); 
      LINE$DATA[0] = TEMP;           # *BATI* INTERLOCK ATTEMPTS
                                       ABANDONED #
  
      RPLINE(LOC(OUTFET),LINE,12,60,END$LN);
  
      LINE$LABS[0] = MPPL37;
      TEMP = XCDD(SDX$DMTBR); 
      LINE$DATA[0] = TEMP;           # TOTAL *BAT* REQUESTS # 
  
      RPLINE(LOC(OUTFET),LINE,12,60,END$LN);
  
  
      END  # RPTMPP # 
  
    TERM
PROC RPTMTR;
# TITLE RPTMTR - GENERATE *CPUMTR* MONITOR FUNCTION REPORT            # 
      BEGIN  # RPTMTR # 
  
# 
**    RPTMTR - GENERATE *CPUMTR* MONITOR FUNCTION REPORT. 
* 
*     THE RAW DATA IS PROCESSED THRU MACTCHING WITH THE 
*     APPROPRIATE FUNCTION FOUND IN THE *TFTN* TABLE. 
* 
*     PROC RPTMTR 
* 
*     EXIT   REPORT PRINTED.
# 
  
# 
****  PROC RPTMTR - XREF LIST BEGIN.
# 
  
      XREF
        BEGIN 
        PROC RPLINE;                 # OUTPUT LINE #
        PROC RPSPACE;                # OUTPUT BLANK LINE #
        FUNC XCDD  C(10);            # CONVERT TO DISPLAY # 
        FUNC XCOD  C(10);            # CONVERT OCTAL TO DISPLAY # 
        END 
  
# 
****  PROC RPTMTR - XREF LIST END.
# 
  
# 
*     REPORT HEADERS. 
# 
  
      DEF HDRCPU0    #"CPU0"#;       # CPU 0 HEADER # 
      DEF HDRCPU1    #"CPU1"#;       # CPU 1 HEADER # 
      DEF HDRMONR    #"MONITOR REQUESTS"#;  # MONITOR REQUESTS #
      DEF HDRMTRM    #"MONITOR MODE"#;  # MONITOR MODE #
      DEF HDRPRGM    #"PROGRAM MODE"#;  # PROGRAM MODE #
      DEF HDRSUBTOT  #"SUBTOTAL"#;   # SUBTOTAL # 
      DEF HDRTOTAL   #"TOTAL"#;      # TOTAL #
  
      DEF LISTCON    #0#;            # COMMON DECK LIST CONTROL # 
*CALL COMAMSS 
*CALL  COMSPDT
*CALL COMUFMT 
*CALL  COMUOUT
*CALL COMUPRB 
  
      ITEM COUNT0     I;             # CPU 0 COUNT - PROGRAM MODE # 
      ITEM COUNT1     I;             # CPU 0 COUNT - MONITOR MODE # 
      ITEM COUNT2     I;             # CPU 1 COUNT - MONITOR MODE # 
      ITEM I          I;             # LOOP CONTROL # 
      ITEM TEMP       C(10);         # WORKING STORAGE #
  
# 
*     OUTPUT LINE.
# 
  
      ARRAY HEAD [0:0] S(6);
        BEGIN 
        ITEM HEAD$TEX0  C(00,00,60);  # TOTAL ENTRY # 
        ITEM HEAD$TEX1  C(00,00,20);  # SUBTOTAL #
        ITEM HEAD$TEX2  C(01,12,08);  # COUNTER # 
        ITEM HEAD$TEX3  C(01,24,12);  # COLUMN HEADER # 
        ITEM HEAD$TEX4  C(01,48,04);  # SUBCOLUMN HEADER #
        ITEM HEAD$TEX5  C(03,30,12);  # COLUMN HEADER # 
        ITEM HEAD$TEX6  C(03,30,08);  # SUBCOLUMN HEADER #
        ITEM HEAD$TEX7  C(03,12,08);  # COUNT HEADER #
        ITEM HEAD$TEX8  C(04,30,08);  # SUBCOLUMN HEADER #
        ITEM HEAD$TEX9  C(04,12,08);  # COUNTER # 
        END 
  
# 
*     OUTPUT LINE.
# 
  
      ARRAY LINE [0:0] S(5);
        BEGIN 
        ITEM LINE$BLANK C(00,00,50) = [" "];  # BLANK FILL ARRAY #
        ITEM LINE$NAME  C(00,06,04);  # FUNCTION NAME # 
        ITEM LINE$LPAR  C(00,30,01) = ["("];  # LEFT PARENTHESIS #
        ITEM LINE$NUM   C(00,36,03);  # FUNCTION CODE # 
        ITEM LINE$RPAR  C(00,54,01) = [")"];  # RIGHT PARENTHESIS # 
        ITEM LINE$PCPU0 C(01,12,08);  # PROGRAM MODE - CPU 0 COUNT #
        ITEM LINE$MCPU0 C(03,12,08);  # MONITOR MODE - CPU 0 COUNT #
        ITEM LINE$MCPU1 C(04,12,08);  # MONITOR MODE - CPU 1 COUNT #
        END 
  
# 
*      THE SEGMENT OF THE *PROBE* DATA WHICH CONTAINS THE 
*      NUMBER OF MONITOR REQUESTS FOR CPU 0 AND CPU 1 IN
*      MONITOR MODE.
# 
  
      BASED 
      ARRAY MTR [0:0] S(1); 
        BEGIN 
        ITEM MTR$CNT1   (00,00,30);  # MONITOR MODE - CPU 1 COUNT # 
        ITEM MTR$CNT0   (00,30,30);  # MONITOR MODE - CPU 0 COUNT # 
        END 
  
# 
*      THE SEGMENT OF THE *PROBE* DATA WHICH CONTAINS THE 
*      NUMBER OF MONITOR REQUESTS FOR CPU 0 IN PROGRAM MODE.
# 
  
      BASED 
      ARRAY PRG [0:0] S(1); 
        BEGIN 
        ITEM PRG$CNT    (00,00,60);  # PROGRAM MODE - CPU 0 COUNT # 
        END 
  
                                               CONTROL EJECT; 
  
# 
*     GENERATE MONITOR REQUEST REPORT.
# 
  
      P<MTR> = SFM$BUFF[PROBE]+TPPU;
      P<PRG> = SFM$BUFF[PROBE]+TPRG;
  
# 
*      OUTPUT REPORT HEADER.
# 
  
      RPSPACE(LOC(OUTFET),SP"SPACE",1);  # OUTPUT BLANK LINE #
  
      RPLINE(LOC(OUTFET),HDRMONR,10,16,END$LN); 
  
      RPSPACE(LOC(OUTFET),SP"SPACE",1);  # OUTPUT BLANK LINE #
  
      RPLINE(LOC(OUTFET),HDRPRGM,24,12,CONT$LN);
      RPLINE(LOC(OUTFET),HDRMTRM,45,12,END$LN); 
  
      RPLINE(LOC(OUTFET),HDRCPU0,28,4,CONT$LN); 
      RPLINE(LOC(OUTFET),HDRCPU0,45,4,CONT$LN); 
      RPLINE(LOC(OUTFET),HDRCPU1,55,4,END$LN);
  
      RPSPACE(LOC(OUTFET),SP"SPACE",1);  # OUTPUT BLANK LINE #
  
  
# 
*     OUTPUT MONITOR FUNCTION REPORT. 
# 
  
      SLOWFOR I = 0 STEP 1 UNTIL TPPUL
      DO
        BEGIN  # OUTPUT MONITOR REPORT #
        LINE$NAME[0] = TFTN$TEXT[I+CPUM];  # SET FUNCTION NAME #
        TEMP = XCOD(I + CPUM);         # SET FUNCTION CODE #
        LINE$NUM[0] = C<7,3>TEMP; 
        COUNT0 = COUNT0 + PRG$CNT[I];  # TOTAL CPU 0 #
        TEMP = XCDD(PRG$CNT[I]);     # SET PROGRAM MODE - CPU 0 COUNT # 
        LINE$PCPU0[0] = C<2,8>TEMP; 
        COUNT1 = COUNT1 + MTR$CNT0[I];
        TEMP = XCDD(MTR$CNT0[I]);    # SET MONITOR MODE - CPU 0 COUNT # 
        LINE$MCPU0[0] = C<2,8>TEMP; 
        COUNT2 = COUNT2 +MTR$CNT1[I]; 
        TEMP = XCDD(MTR$CNT1[I]);    # SET MONITOR MODE - CPU 1 COUNT # 
        LINE$MCPU1[0] = C<2,8>TEMP; 
  
        RPLINE(LOC(OUTFET),LINE,10,50,END$LN);
        END  # OUTPUT MONITOR REPORT #
  
# 
*     OUTPUT CUMULATIVE TOTALS. 
# 
  
      HEAD$TEX0[0] = " ";            # CLEAR LINE # 
      HEAD$TEX1[0] = HDRSUBTOT;      # SUBTOTAL # 
      TEMP = XCDD(COUNT1);
      HEAD$TEX7[0] = C<2,8>TEMP;     # SET COUNT TOTAL #
      TEMP = XCDD(COUNT2);
      HEAD$TEX9[0] = C<2,8>TEMP;     # SET COUNT TOTAL #
  
      RPLINE(LOC(OUTFET),HEAD,10,60,END$LN);
  
      HEAD$TEX0[0] = " ";            # CLEAR LINE # 
      HEAD$TEX1[0] = HDRTOTAL;       # TOTAL #
      TEMP = XCDD(COUNT0);
      HEAD$TEX2[0] = C<2,8>TEMP;     # SET COUNT TOTAL #
      HEAD$TEX6[0] = " "; 
      TEMP = XCDD(COUNT1 + COUNT2);  # TOTAL CPU 0 AND CPU 1 #
      HEAD$TEX9[0] = C<2,8>TEMP;     # SET COUNT TOTAL #
  
      RPLINE(LOC(OUTFET),HEAD,10,60,END$LN);
  
      END  # RPTMTR # 
  
    TERM
PROC RPTPLD;
# TITLE RPTPLD - GENERATE *PLD* REPORT.                               # 
      BEGIN  # RPTPLD # 
  
# 
**    RPTPLD - GENERATE PROGRAM LIBRARY DIRECTORY REPORT. 
* 
*     *RPTPLD* SORTS THE RAW DATA IN ONE OF THREE WAYS, 
*     ALPHABETICALLY, FREQUENCY OF LOADS, AND RESIDENCY.
*     ONCE THE SORT IS DONE THE REPORT IS PRINTED.
* 
*     PROC RPTPLD 
* 
*     EXIT   REPORT PRINTED.
# 
  
  
# 
****  PROC RPTPLD - XREF LIST BEGIN.
# 
  
      XREF
        BEGIN 
        PROC RPLINE;                 # OUTPUT LINE #
        PROC RPSPACE;                # OUTPUT BLANK LINE #
        FUNC XCDD  C(10);            # CONVERT TO DISPLAY CODE #
        END 
  
# 
****   PROC RPTPLD - XREF LIST END. 
# 
  
      DEF HDRCOLUMN  #"NAME   LOC   LOADS"#;  # COLUMN HEADER # 
      DEF HDRMAIN    #"PPU PROGRAM LOADS"#;  # SECTION HEADER # 
  
      DEF LISTCON    #0#;            # COMMON DECK LIST CONTROL # 
  
*CALL COMAMSS 
*CALL COMSPDT 
*CALL COMUFMT 
*CALL  COMUOUT
*CALL COMUPRB 
  
      ITEM FLAG       I;             # PROGRAM RESIDENCE #
      ITEM I          I;             # LOOP CONTROL # 
      ITEM J          I;             # LOOP CONTROL # 
      ITEM NOTDONE    B;             # SORT COMPLETION CONDITION #
      ITEM OFFSET     I;             # OFFSET FOR SECOND COLUMN # 
      ITEM TEMP       I;             # DO LOOP COUNTER #
  
# 
*     COUNTERS. 
# 
  
      ARRAY COUNT [0:3] S(1); 
        BEGIN 
        ITEM COUNT$RES  U(00,00,60);
        END 
  
# 
*     REPORT COLUMN HEADERS.
# 
  
      ARRAY HEADER [0:3] S(3);
        BEGIN 
        ITEM HEADER$TEXT C(00,00,28) = [  ##
        "NUMBER OF ASR PROGRAMS =",  ## 
        "NUMBER OF CMR PROGRAMS =",  ## 
        "NUMBER OF DSK PROGRAMS =",  ## 
        "NUMBER OF PLD ENTRIES ="];  ## 
        ITEM HEADER$TERM U(02,48,12) = [4(0)];  # MESSAGE TERMINATOR #
        END 
  
# 
*     HEADER LINE OUTPUT. 
# 
  
      ARRAY HEAD [0:0] S(6);
        BEGIN 
        ITEM HEAD$TEXT  C(00,00,60);  # TOTAL HEADER LINE # 
        ITEM HEAD$TEX1  C(00,00,30);  # LEFT HALF OF HEADER LINE #
        ITEM HEAD$TEX2  C(02,24,08);  # CUMULATIVE TOTALS # 
        ITEM HEAD$TEX3  C(03,00,30);  # RIGHT HALF OF HEADER LINE # 
        END 
  
# 
*     OUTPUT LINE BREAKDOWN.
# 
  
      ARRAY LINE [0:0] S(3);
        BEGIN 
        ITEM LINE$BLANK C(00,00,30) =[" "];  # BLANK FILL ENTRY # 
        ITEM LINE$NAME  C(00,00,03);  # PROGRAM NAME #
        ITEM LINE$LOC   C(00,42,03);  # PROGRAM RESIDENCE # 
        ITEM LINE$CNT   C(01,00,08);  # NUMBER OF LOADS # 
        END 
  
# 
*     *PLD* TABLE BREAKDOWN.
# 
  
      BASED 
      ARRAY PLD [0:0] S(1); 
        BEGIN 
        ITEM PLD$ENTRY  U(00,00,60);  # TABLE ENTRY # 
        ITEM PLD$NAME   C(00,00,03);  # PPU PROGRAM NAME #
        ITEM PLD$LOC    U(00,18,06);  # PROGRAM RESIDENCE # 
        ITEM PLD$CNT    U(00,30,30);  # NUMBER OF LOADS # 
        END 
  
# 
*     RESIDENCY DEFINITION. 
# 
  
      ARRAY RES [0:2] S(1); 
        BEGIN 
        ITEM RES$TEXT   C(00,00,03) = [  ## 
        "ASR",                       # ALTERNATE SYSTEM LIBRARY # 
        "CMR",                       # CM RESIDENCE # 
        "DSK"                        # DISK RESIDENT #
        ];
        END 
  
                                               CONTROL EJECT; 
  
# 
*     SET FWA OF *PLD* TABLE. 
# 
  
      P<PLD> = SFM$BUFF[PROBE] + TSPL;
      TEMP = SFM$LEN[PROBE] - TPRDL - 2;
  
# 
*     SORT *PLD* TABLE ALPHABETICALLY.
# 
  
      IF ARG$LO[0] EQ "A" 
      THEN                           # CHECK FOR ALPHABETIC SORT #
        BEGIN  # ALPHABETIC SORT #
        NOTDONE = TRUE;              # SORT NOT COMPLETE #
        SLOWFOR J = 0 STEP 1 WHILE NOTDONE
        DO
          BEGIN  # CONTINUE SORTING # 
          NOTDONE = FALSE;           # SORT COMPLETE #
          SLOWFOR I=0 STEP 1 UNTIL TEMP 
          DO
            BEGIN 
            IF PLD$ENTRY[I+1] NQ 0  # # 
            AND PLD$NAME[I+1] LS PLD$NAME[I]
            THEN
              BEGIN 
              PLD$ENTRY[I+1] == PLD$ENTRY[I]; 
              NOTDONE = TRUE;        # SORT NOT COMPLETE #
              END 
  
            END 
  
          END  # CONTINUE SORTING # 
  
        END  # ALPHABETIC SORT #
  
# 
*     SORT *PLD* TABLE BASED ON NUMBER OF LOADS.
# 
  
      IF ARG$LO[0] EQ "F"            ## 
        OR ARG$LO[0] EQ "R" 
      THEN                           # CHECK FOR NUMBER OF LOADS SORT 
                                       OPTION # 
        BEGIN  # NUMBER OF LOADS SORT # 
        NOTDONE = TRUE;              # ASSUME TABLE IS SORTED # 
        SLOWFOR J = 0 STEP 1 WHILE NOTDONE
        DO
          BEGIN  # CONTINUE SORTING # 
          NOTDONE = FALSE;           # SORT COMPLETE #
          SLOWFOR I=0 STEP 1 UNTIL TEMP 
          DO
            BEGIN 
            IF PLD$ENTRY[I+1] NQ 0  # # 
            AND PLD$CNT[I+1] GR PLD$CNT[I]
            THEN
              BEGIN 
              PLD$ENTRY[I+1] == PLD$ENTRY[I]; 
              NOTDONE = TRUE;        # INDICATE SORT NOT FINISHED # 
              END 
  
            END 
  
          END  # CONTINUE SORTING # 
  
        END  # NUMBER OF LOADS SORT # 
  
# 
*     SORT *PLD* TABLE BASED ON PROGRAM RESIDENCE.
# 
  
      IF ARG$LO[0] EQ "R" 
      THEN
        BEGIN  # RESIDENCY SORT # 
        NOTDONE = TRUE;              # ASSUME FILE SORTED # 
        SLOWFOR J = 0 STEP 1 WHILE NOTDONE
        DO
          BEGIN  # CONTINUE SORTING # 
          NOTDONE = FALSE;           # SORT COMPLETE #
          SLOWFOR I=0 STEP 1 UNTIL TEMP 
          DO
            BEGIN 
            IF PLD$ENTRY[I+1] NQ 0  # # 
            AND PLD$LOC[I+1] LS PLD$LOC[I]
            THEN
              BEGIN 
              PLD$ENTRY[I+1] == PLD$ENTRY[I]; 
              NOTDONE = TRUE;        # INDICATE FILE NOT SORTED # 
              END 
  
            END 
  
          END  # CONTINUE SORTING # 
  
        END  # RESIDENCY SORT # 
  
# 
*     GENERATE *PLD* REPORT.
# 
  
      OFFSET = ((SFM$LEN[PROBE] - (TPRDL)) + 1)/2;  # TABLE OFFSET #
  
  
# 
*     OUTPUT THE HEADERS FOR THE *PLD* REPORT.
# 
  
      RPSPACE(LOC(OUTFET),SP"SPACE",1);  # OUTPUT BLANK LINE #
  
      RPLINE(LOC(OUTFET),HDRMAIN,10,17,END$LN);  # PPU LOADS #
  
      RPSPACE(LOC(OUTFET),SP"SPACE",1);  # OUTPUT BLANK LINE #
  
      HEAD$TEX1[0] = HDRCOLUMN;      # COLUMN HEADERS # 
      HEAD$TEX3[0] = HDRCOLUMN; 
  
      RPLINE(LOC(OUTFET),HEAD,10,60,END$LN);
  
# 
*     OUTPUT THE DATA IN TWO COLUMNS DETERMINED BY THE OFFSET.
# 
  
      SLOWFOR I=0 STEP 1 UNTIL (OFFSET - 1) 
      DO
        BEGIN  # OUTPUT LINE #
        LINE$NAME[0] = PLD$NAME[I];  # SET PPU PROGRAM NAME # 
        LINE$LOC[0] = RES$TEXT[PLD$LOC[I]];  # SET PROGRAM RESIDENCE #
  
        COUNT$RES[PLD$LOC[I]] = COUNT$RES[PLD$LOC[I]] + 1;
        COUNT$RES[3] = COUNT$RES[3] + 1;
  
        FLAG = XCDD(PLD$CNT[I]);     # SET NUMBER OF LOADS #
        LINE$CNT = C<2,8>FLAG;
        RPLINE(LOC(OUTFET),LINE,10,30,CONT$LN); 
  
        IF (I + OFFSET) GQ TEMP 
        OR PLD$ENTRY[I + OFFSET] EQ 0  # #
        THEN
          BEGIN  # CHECK OUTPUT TERMINATION # 
          RPLINE(LOC(OUTFET),00,00,00,END$LN);
          END  # CHECK OUTPUT TERMINATION # 
  
        ELSE
          BEGIN  # CONTINUED OUTPUT LINE #
          LINE$NAME[0] = PLD$NAME[I+OFFSET];  # SET PPU PROGRAM NAME #
          LINE$LOC[0] = RES$TEXT[PLD$LOC[I+OFFSET]];  # SET PROGRAM 
                                                        RESIDENCE # 
  
          COUNT$RES[PLD$LOC[I+OFFSET]] = COUNT$RES[PLD$LOC[I+OFFSET]] 
            + 1;
          COUNT$RES[3] = COUNT$RES[3] + 1;
  
          FLAG = XCDD(PLD$CNT[I+OFFSET]);  # SET NUMBER OF LOADS #
          LINE$CNT = C<2,8>FLAG;
          RPLINE(LOC(OUTFET),LINE,40,30,END$LN);
          END  # CONTINUED OUTPUT LINE #
  
        END  # OUTPUT LINE #
  
# 
*     CUMULATIVE DATA OUTPUT. 
# 
  
      RPSPACE(LOC(OUTFET),SP"SPACE",1);  # OUTPUT BLANK LINE #
  
      SLOWFOR I=0 STEP 1 UNTIL 3
      DO
        BEGIN  # OUTPUT COLUMN COUNT TOTALS # 
        HEAD$TEX1[0] = HEADER$TEXT[I];
        FLAG = XCDD(COUNT$RES[I]);   # OUTPUT RESIDENCY TOTALS #
        HEAD$TEX3[0] = " ";          # BLANK FILL # 
        HEAD$TEX2[0] = C<2,8>FLAG;
  
        RPLINE(LOC(OUTFET),HEAD,10,40,END$LN);
  
        END  # OUTPUT COLUMN COUNT TOTALS # 
  
      END  # RPTPLD # 
  
    TERM
PROC RPTPMD;
# TITLE RPTPMD - GENERATE PROGRAM *MTR* REQUESTS REPORT.              # 
  
      BEGIN  # RPTPMD # 
  
# 
**    RPTPMD - GENERATE PROGRAM *MTR* REQUESTS REPORT.
* 
*     BY MATCHING THE RAW DATA WITH THE FUNCTION CODES IN 
*     *PMTR* ARRAY, THIS CODE WILL OUTPUT THE CONVERTED 
*     DATA. 
* 
*     PROC RPTPMD 
* 
*     EXIT   REPORT PRINTED.
# 
  
# 
****  PROC RPTPMD - XREF LIST BEGIN.
# 
  
      XREF
        BEGIN 
        PROC RPLINE;                 # OUTPUT LINE #
        PROC RPSPACE;                # OUTPUT BLANK LINE #
        FUNC XCDD C(10);             # CONVERT TO DISPLAY # 
        FUNC XCOD C(10);             # CONVERT TO OCTAL DISPLAY # 
        END 
  
# 
****  PROC RPTPMD - XREF LIST END.
# 
  
      DEF LISTCON #0#;               # COMMON DECK LIST CONTROL # 
*CALL COMAMSS 
*CALL COMSPDT 
*CALL COMUFMT 
*CALL COMUOUT 
*CALL COMUPRB 
  
      ITEM COUNT      U;             # TOTAL COUNTER #
      ITEM I          I;             # LOOP CONTROL # 
      ITEM TEMP       C(10);         # WORKING STORAGE #
  
  
# 
*      OUTPUT LINE FORMAT.
# 
  
      ARRAY LINE [0:0] S(2);
        BEGIN 
        ITEM LINE$BLANK C(00,00,20) = [" "];  # BLANK LINE #
        ITEM LINE$NAME  C(00,12,04);  # FUNCTION NAME # 
        ITEM LINE$LPAR  C(00,36,01) = ["("];  # LEFT PARENTHESIS #
        ITEM LINE$NUM   C(00,42,02);  # FUNCTION CODE # 
        ITEM LINE$RPAR  C(00,54,01) = [")"];  # RIGHT PARENTHESIS # 
        ITEM LINE$PCPU0 C(01,12,08);  # PROGRAM MODE - CPU 0 COUNT #
        END 
  
# 
*      PROGRAM MODE CONVERSION LIST.
# 
  
      ARRAY PMTR [0:PMX1] S(1); 
        BEGIN 
        ITEM PMTR$TEXT  C(00,00,04) = [  ## 
        "MSTF",                      # STORAGE MOVE # 
        "PMRF",                      # PROCESS INTER-MACHINE REQUEST #
        "MECF"];                     # MOVE EXTENDED MEMORY STORAGE # 
        END 
  
# 
*      THE SEGMENT OF THE *PROBE* DATA WHICH CONTAINS THE 
*      PROGRAM MODE INFORMATION.
# 
  
      BASED 
      ARRAY PRG [0:0] S(1); 
        BEGIN 
        ITEM PRG$CNT    U(00,00,60);  # PROGRAM MODE - CPU 0 COUNT #
        END 
  
                                               CONTROL EJECT; 
  
      P<PRG> = SFM$BUFF[PROBE] + TMNR;  # LOCATING STATISTICS # 
  
# 
*     OUTPUT REPORT HEADER. 
# 
  
      RPSPACE(LOC(OUTFET),SP"SPACE",3);  # OUTPUT BLANK LINE #
  
      RPLINE(LOC(OUTFET),"PROGRAM MODE",10,12,END$LN);
  
      RPSPACE(LOC(OUTFET),SP"SPACE",1);  # OUTPUT BLANK LINE #
  
      RPLINE(LOC(OUTFET),"CPU0",25,4,END$LN); 
  
  
# 
*     OUTPUT PROGRAM MODE *MTR* REQUESTS. 
# 
  
      FASTFOR I = 0 STEP 1 UNTIL PMX1 
      DO
        BEGIN 
        LINE$NAME[0] = PMTR$TEXT[I];  # SET FUNCTION NAME # 
        TEMP = XCOD(I); 
        LINE$NUM[0] = C<8,2>TEMP;    # SET FUNCTION CODE #
        COUNT = COUNT + PRG$CNT[I];  # TOTAL STATISTICS # 
        TEMP = XCDD(PRG$CNT[I]);
        LINE$PCPU0[0] = C<2,8>TEMP;  # SET COUNT #
  
        RPLINE(LOC(OUTFET),LINE,10,20,END$LN);
  
        END 
  
# 
*     OUTPUT CUMULATIVE TOTALS. 
# 
  
      RPLINE(LOC(OUTFET),"TOTAL",15,5,CONT$LN);  # TOTAL LABEL OUTPUT # 
      TEMP = XCDD(COUNT);            # CONVERTED TOTAL #
  
      RPLINE(LOC(OUTFET),C<2,8>TEMP,22,8,END$LN); 
  
      END  # RPTPMD # 
  
    TERM
PROC RPTPST;
# TITLE RPTPST - GENERATE VERSION REPORT.                             # 
  
      BEGIN  # RPTPST # 
  
# 
**    RPTPST - GENERATE VERSION REPORT. 
* 
*     *RPTPST* WILL PRODUCE THE *PROBE* STATISTICS
*     REPORT. 
* 
*     PROC RPTPST 
* 
*     EXIT   REPORT PRINTED.
# 
  
# 
****  PROC RPTPST -  XREF LIST BEGIN. 
# 
  
      XREF
        BEGIN 
        FUNC EDATE  C(10);           # CONVERT PACKED DATE #
        FUNC ETIME  C(10);           # CONVERT PACKED TIME #
        PROC RPLINE;                 # OUTPUT LINE #
        END 
  
# 
****   PROC RPTPST - XREF LIST END. 
# 
  
      DEF HDRPST1    #"START OF SAMPLE INTERVAL"#;  # LINE LABEL #
      DEF HDRPST2    #"END OF SAMPLE INTERVAL"#;  # LINE LABEL #
  
      DEF LISTCON    #0#;            # COMMON DECK LIST CONTROL # 
  
*CALL COMAMSS 
*CALL COMSPDT 
*CALL COMUFMT 
*CALL COMUOUT 
*CALL COMUPRB 
  
      ITEM TEMP       C(10);         # WORKING STORAGE #
  
      ARRAY LINE [0:0] S(6);
        BEGIN 
        ITEM LINE$LABS  C(00,00,30);  # DATA LABELS # 
        ITEM LINE$DATE  C(03,00,10);  # DATE #
        ITEM LINE$BLANK C(04,00,10) = [" "];  # BLANK WORD #
        ITEM LINE$TIME  C(05,00,10);  # TIME #
        END 
  
      BASED 
      ARRAY SAMPLE [0:1] S(1);
        BEGIN 
        ITEM SAMPLE$DATE U(00,24,18);  # PACKED DATE #
        ITEM SAMPLE$TIME U(00,42,18);  # PACKED TIME #
        END 
  
                                               CONTROL EJECT; 
  
      P<SAMPLE> = SFM$BUFF[PROBE];  # LOCATE DATA ARRAY # 
  
# 
*     OUTPUT VERSION DATA.
# 
  
      LINE$LABS[0] = VERS$PVER;      # *PROBE* VERSION #
      LINE$DATE[0] = VERS$DATE;      # CURRENT DATE # 
      LINE$TIME[0] = VERS$TIME;      # CURRENT TIME # 
  
      RPLINE(LOC(OUTFET),LINE,10,60,END$LN);
  
      LINE$LABS[0] = HDRPST1;        # START SAMPLE INTERVAL #
      TEMP = EDATE(SAMPLE$DATE[1]); 
      LINE$DATE[0] = TEMP;           # CONVERTED DATE # 
      TEMP = ETIME(SAMPLE$TIME[1]); 
      LINE$TIME[0] = TEMP;           # CONVERTED TIME # 
  
      RPLINE(LOC(OUTFET),LINE,10,60,END$LN);
  
      LINE$LABS[0] = HDRPST2;        # END SAMPLE INTERVAL #
      TEMP = EDATE(SAMPLE$DATE[0]); 
      LINE$DATE[0] = TEMP;           # CONVERTED DATE # 
      TEMP = ETIME(SAMPLE$TIME[0]); 
      LINE$TIME[0] = TEMP;           # CONVERTED TIME # 
  
      RPLINE(LOC(OUTFET),LINE,10,60,END$LN);
  
# 
*     ADJUST THE *PROBE* TABLE POINTERS TO ALLOW FOR THE
*     DIFFERENCE BETWEEN THE SYSTEM AND *SFM* TABLE BUILD.
# 
  
      SFM$BUFF[PROBE] = SFM$BUFF[PROBE] + 1;  # ADJUST TABLE POINTER #
      SFM$LEN[PROBE] = SFM$LEN[PROBE] - 1;  # ADJUST TABLE LENGTH # 
  
      END  # RPTPST # 
  
    TERM
*WEOR 
          IDENT  PRESET 
          ENTRY  PRESET 
          SST 
          SYSCOM B1 
          TITLE  PRESET - SET UP *PROBE* ARGUMENT LIST. 
*COMMENT  SET UP *PROBE* ARGUMENT LIST. 
          COMMENT  COPYRIGHT CONTROL DATA SYSTEMS INC.  1992. 
  
*CALL     COMCMAC 
 PRESET   SPACE  4,15 
**        COMMON DECKS. 
  
*CALL     COMSMTR 
 PRESET   SPACE  4,15 
          LIST   X
*CALL     COMSPDT 
          LIST   *
 PRESET   SPACE  4,15 
***       PRESET - SET UP *PROBE* ARGUMENT LIST.
* 
*         PRESET(ARGLIST);   (*SYMPL* CALL) 
* 
*         EXIT   (ARGLIST) = ADDRESS OF ARGUMENT LIST.
* 
*         USES   A - 6. 
*                B - 1. 
*                X - 6. 
* 
*         MACROS ARG. 
  
  
PRESET    SUBR               ENTRY/EXIT 
          SB1    1
          SX6    ARGLIST     ADDRESS OF ARGUMENT LIST 
          SA6    X1 
          EQ     PRESETX     RETURN 
  
*         ARGUMENT LIST.
  
 ARGLIST  BSS    0
 L        ARG    LASV,L           OUTPUT FILE 
 P        ARG    PASV,P           INPUT FILE NAME 
 B        ARG    BASV,B,400B      BINARY FILE NAME
 R        ARG    -RASV,R,400B     REWIND OPTION 
 OP       ARG    OPASV,OP,400B    PROCESSING OPTION 
 LO       ARG    LOASV,LO,400B    SORT OPTION 
  
*         DEFAULT VALUES. 
  
 LASV     DATA   0LOUTPUT 
 PASV     DATA   0LSTATS
 BASV     DATA   0LSTATS
 RASV     DATA   0LR
 OPASV    DATA   0LP
 LOASV    DATA   0LF
  
          USE    /TFTNB/
  
*CALL     COMDTFN 
          LIST   X
  
          USE    /VERS/ 
  
          CON    10H"TIME"
          CON    10H"DATE"
          DATA   30H"PVERS" 
*CALL     COMUPRB 
  
          END 
