//MVS0150 JOB  (SMP),
//             'INSTALL IEFACTRT',
//             CLASS=A,
//             MSGCLASS=A,
//             MSGLEVEL=(1,1),
//             REGION=4096K
//*********************************************************************
//*
//*                       MVS 3.8 SYSGEN
//*                       ==============
//*
//* DESC: Install USERMOD ZUM0002 TO provide step accounting
//*       information and a step-to-RC summary
//*
//*********************************************************************
//*
/*MESSAGE  *******************************************
/*MESSAGE  *                                         *
/*MESSAGE  * This Usermod becomes effective only     *
/*MESSAGE  * if you do an IPL with the CLPA option   *
/*MESSAGE  *                                         *
/*MESSAGE  *******************************************
//CLEANUP EXEC PGM=IDCAMS
//SYSPRINT DD  SYSOUT=*
//SYSIN    DD  *
 DELETE SYS1.UMODSRC(IEFACTRT) NONVSAM
 SET MAXCC = 0
 SET LASTCC = 0
//ADD     EXEC PGM=IEBUPDTE,PARM=NEW
//SYSPRINT DD  SYSOUT=*
//SYSUT2   DD  DISP=SHR,DSN=SYS1.UMODSRC
//SYSIN    DD  DATA,DLM=$$
./ ADD NAME=IEFACTRT
         MACRO
&NAME  STEPWTO &MSG
         MVC   WTOL,STMSG            , Move LIST macro to dyn. storage
         AIF   (T'&MSG NE 'O').MSG
         MVC   WTOL+4(WTO001L),STEPMSG    , insert message text
         AGO   .WTO
.MSG     ANOP
         MVC   WTOL+4(WTO001L),&MSG       , insert message text
.WTO     ANOP
         LA    R1,WTOL               , point to LIST macro
         WTO   MF=(E,(1))            , and issue WTO SVC
         MEXIT
         MEND
* FUNCTION
*    THIS MODULE IS ENTERED AT JOB & STEP TERMINATION. IF THE
*    MODULE WAS ENTERED FOR STEP TERMINATION, THE CPU TIME IS
*    EXAMINED FOR A ZERO.  IF THE STEP CPU TIME IS ZERO,
*    THE MODULE RETURNS TO THE CALLING ROUTINE.
*    OTHERWISE A LAYOUT IS WRITTEN TO SYSOUT USING IEFYS.
*    FOR JOB TERMINATION ONLY ONE SENTENCE IS WRITTEN.
* ENTRY POINTS -
*         IEFACTRT
* INPUT
*    REGISTER 0 CONTAINS A BINARY 16 IF THE MODULE WAS ENTERED
*    FOR JOB TERMINATION.  IT CONTAINS A BINARY 12 IF ENTERED
*    FOR STEP TERMINATION.
*    REGISTER 1 POINTS TO A LIST OF 4 BYTE ADDRESSES FOR THE
*    FOLLOWING TEN PARAMETERS:
*    1 - COMMON EXIT PARAMETER AREA ( CONTAINING
*        36 BYTES OF THE FOLLOWING JOB INFORMATION ):
*    JOBNAME (8 BYTES)
*    TIME STAMP (8 BYTES)
*    SYSTEM ID (4 BYTES)
*    USER ID (8 BYTES)
*    STEP #, SMF OPTIONS, RESTART INDICATOR, JOB CLASS (4 BYTES)
*    USER COMMUNICATIONS AREA (4 BYTES)
*    THIS FIELD IS ZEROED AT JOB TERMINATION.
*    2 - STEP NAME (ADDRESS IS ZERO FOR JOB TERM ENTRY)  ( 8 BYTES)
*    3 - PROGRAMMERS NAME                                (20 BYTES)
*    4 - JOB EXECUTION TIME (NOT USED BY THIS ROUTINE)   ( 4 BYTES)
*    5 - JOB ACCOUNTING FIELDS (NOT USED)
*    6 - STEP EXECUTION TIME                             ( 4 BYTES)
*    7 - STEP ACCOUNTING FIELDS (NOT USED)
*    8 - FLAGS AND STEP NUMBER (NOT USED)                ( 2 BYTES)
*    9 - TERMINATION STATUS (NOT USED)                   ( 2 BYTES)
*    10 - SMF TERMINATION RECORD
* OUTPUT
*    THE JOB & STEP TERMINATION RECORDS CREATED BY SMF ARE WRITTEN TO
*    THE SMF DATA SET AFTER THE RECORD TYPE FIELD HAS BEEN
*    MODIFIED.
*    AT JOB TERM. THE RECORD IS
*    WRITTEN TO THE SYSOUT DATA SET USING THE IEFYS ROUTINE.
*    AN ERROR MESSAGE IS WRITTEN TO THE CONSOLE IF THE SMF
*    JOB/STEP TERM. RECORD CANNOT BE WRITTEN SUCCESSFULLY.
*   RETURN CODES
*    REGISTER 15 CONTAINS A RETURN CODE OF 4 INDICATING THAT THE
*    JOB SHOULD BE CANCELED. ALL OTHER RETURN CODES INDICATE
*    CONTINUATION OF THE JOB.
*    REGISTER 1 CONTAINS A RETURN CODE OF 4 INDICATING THAT THE
*    SMF TERMINATION RECORD SHOULD NOT BE WRITTEN. ALL OTHER
*    RETURN CODES INDICATE THAT THE TERMINATION RECORD IS TO
*    BE WRITTEN TO THE SMF DATA SET.
* EXTERNAL REFERENCES - IEFYS
* EXITS,NORMAL - RETURN TO CALLER
* EXITS,ERROR - NONE, RETURN CODES INDICATE ACTION
* TABLES/WORK AREAS - DSECTS FOR WTO RCD AND JOB MSG
* ATTRIBUTES - STANDARD
* CHARACTER CODE DEPENDENCY - NONE
         EJECT
LINKREG  EQU   7                     , Used for CALL
DATAREG  EQU   8                     , Workarea base register
PARMREG  EQU   9                     , Register loaded from R1
SMFBASE  EQU   10                    , SMF record base register
CODEREG  EQU   11                    , code base register
         EJECT                       ,
IEFACTRT BSPENTER RENT=YES,BASE=R11,HEADER='BSP'
         BLANK STEPMSG               , we need SPACES here
         LR    PARMREG,R1            , Set up parameter list base reg
         USING PARMLIST,PARMREG      , tell assembler
***********************************************************************
*        Save R0 to R3                                                *
*        Analyze R3.                                                  *
*        R3 = 16 ===> Job termination                                 *
*        R3 = 12 ===> Step termination                                *
***********************************************************************
         LR    R3,R0                 , save R0
         CH    R3,=H'16'             , Is this job termination
         BE    NOWTO                 , BIF yes
         CH    R3,=H'12'             , Is this step termination?
         BNE   EXITF                 , BIF not
***********************************************************************
*        Make initial WTO on first step                               *
***********************************************************************
         L     R2,PLCEPADR           , get address of CEP
         USING CEPLIST,R2            , tell assembler
         CLI   CEPSNUM,X'01'         , first step?
         BNE   NOWTO                 , BIF not. Else issue WTO
         STEPWTO WTO001              , Issue WTO with heading
         XC    CEPUCOMT,CEPUCOMT     , clear trailer
         DROP  R2                    , not needed any more
NOWTO    DS    0H                    , WTO done or omitted
***********************************************************************
*        Build Work Area                                              *
***********************************************************************
         ZAP   YEAR,=P'0'            , Set up year
         MVC   MONTHT,MONTHT1        , and monthtable
         LA    R4,MSG                , point to msg area
         ST    R4,MSGADR             , and save address
         CH    R3,=H'16'             , Job termination?
         BE    JOBTERM               , BIF yes
         EJECT
***********************************************************************
*        Step Termination Processor                                   *
***********************************************************************
         L     SMFBASE,PLSMFADR      , Get address of SMF record (4)
         USING SMF4,SMFBASE          , And tell assembler
         CLI   SMF4RTY,4             , Is this really Record Type 4?
         BE    GOON                  , Proceed
         CLI   SMF4RTY,5             , Is this perhaps record type 5?
         BE    GOON                  , Proceed
         B     EXITF                 , invalid record, get out
GOON     DS    0H
         USING PSA,R0                , tell assembler
         L     R1,PSAAOLD            , get address of ASCB
         DROP  R0
         USING ASCB,R1               , tell assembler
         L     R1,ASCBJBNI           , point to jobname field(s)
         DROP  R1
         USING CHKEY,R1              , tell assembler
         CLI   CHPROCSN,C' '         , Procstep name present
         BNH   NOPROC                , no, don't copy it
         MVC   SMPTEP,CHPROCSN       , insert procstep name
NOPROC   DS    0H
         CLI   CHSTEP,C' '           , step name present
         BNH   NOSTEP                , no, don't copy it
         MVC   SMSTEP,CHSTEP         , insert step name
*        MVC   SMSTEP,SMF4STMN       , Move stepname to WTO message
         DROP  R1                    , not needed any more
NOSTEP   DS    0H
         MVC   SMPROG,SMF4PGMN       , Move program name to WTO
         MVC   SMHEAD,SMF4JBN        , Move in Jobname name
TSTFLUSH DS    0H                    , Test if step was flushed
         TM    SMF4STI,B'00000001'   , Step flushed?
         BNO   TSTABND               , If not, test if abend
         MVC   SMSCC,=CL8'*FLUSH*'   , indicate flush
         B     SENDWTO               , and issue WTO
TSTABND  DS    0H
         TM    SMF4STI,B'00000010'   , Step abended?
         BNO   NORMEND               , if not, process normal RC
         TM    SMF4SCC,B'10000000'   , user abend?
         BO    USERABND              , BIF yes
         MVC   SMSCCP,=CL4'AB S'     , indicate System Abend
         X2CHRTRN TMPCCC,SMF4SCC,LEN=2 make abcode printable
         MVC   SMSCCC(3),SYSCCC      , insert 3 char system code
         B     SENDWTO               , and issue WTO
USERABND DS    0H                    , user abend
         MVC   SMSCCP,=CL4'AB U'     , indicate User Abend
         X2CHRTRN SMSCCC,SMF4SCC,LEN=2 make abcode printable
*        B     SENDWTO               , and issue WTO
         B     FORMATRC              , and format number
NORMEND  DS    0H                    , normal end of step
         MVC   SMSCCP,=C'RC= '       , indicate normal RC
FORMATRC DS    0H                    , format
         XR    R4,R4                 , Clear
         ICM   R4,B'0011',SMF4SCC    , Get RC into register
         N     R4,=XL4'7FFF'         , Turn off high order bit
         CVD   R4,DWORD              , Make decimal
         UNPK  SMSCCC,DWORD+5(3)     , make EBCDIC
         OI    SMSCC+7,X'F0'         , set nibble
SENDWTO  DS    0H                    , now send a message
         STEPWTO                     , issue WTO with step info
         L     R1,PLSETADR           , Get addr of STEP CPU time used
         CLC   STEPNULL(3),0(R1)     , Is it 0
         BE    EXITF                 , Then exit
         $TITLE 'Build Line 1'
***********************************************************************
*        ZEILE 1 AUFBEREITEN                                          *
***********************************************************************
         MVC   MSG(1),ASTERIKS       , Asteriks in pos 1
         MVC   MSG+1(131),MSG        , propagate to end of line
         BAL   LINKREG,WRITE         , go and write line
         $TITLE 'Build Line 2'
***********************************************************************
*        ZEILE 2 AUFBEREITEN                                          *
***********************************************************************
* Step number
*
         XR    R2,R2                 , Clear workreg
         IC    R2,SMF4STN            , insert step number
         CVD   R2,DWORD              , make decimal number
         MVC   MSG+1(6),MASKSTN      , insert edit mask
         ED    MSG+1(6),DWORD+5      , and make printable
         MVC   MSG+7(18),MSGTXT1     , fixed inserte
         MVC   MSG+25(8),SMF4JBN     , jobname from SMF4 record
*
         MVC   MSG+33(14),MSGTXT2    , fixed insert
         MVC   MSG+47(8),SMF4STMN    , stepname from SMF4 record
*
         MVC   MSG+55(18),MSGTXT3    , fixed insert
         MVC   MSG+73(8),SMF4PGMN    , Program name
*---------------------------------------------------------------------*
*        Make current date printable                                  *
*        DATE contains 00YYDDD+                                       *
*        DATEP contains 0YYMMDD+                                      *
*---------------------------------------------------------------------*
         ZAP   DATE,SMF4STID         , Date = 00YYDDD+
         MVO   YEAR,DATE+1(1)        , Year = 0YY+
         ZAP   RE1,YEAR              , place into workfield
         DP    RE1,=P'4'             , Divide by 4
         CP    RE1+2(1),=P'0'        , is result Remainder = 0
         BNE   Z2A                   , bif not, no leapyear
         MVC   MONTHT+2(2),=X'029C'  , else indicate 29 days in Feb
Z2A      DS    0H                    , Test for valid date
         LA    R2,MONTHT             , point to table: Days/month
         LA    R3,12                 , get number of entries
Z2B      DS    0H
         CP    DATE+2(2),0(2,R2)     , is DDD within month?
         BNH   Z2C                   , BIF yes, R3 contains month num
         SP    DATE+2(2),0(2,R2)     , Else subtract number of days
*                                    , for this month
         LA    R2,2(R2)              , Go to next table entry
         BCT   R3,Z2B                , Go araound again
         LA    R3,12                 , If we get here, date is wrong
         MVC   DATE+2(2),=X'001C'    , then assume January first
Z2C      DS    0H                    , R3 = 12 - Monthnum + 1
         SH    R3,=H'13'             , R3 now contains -Monthnum
         LPR   R3,R3                 , make positive
         CVD   R3,DWORD              , DWORD = 0000000000000MM+
         SR    R3,R3                 , clear R3
         ZAP   DATEP,DATE+2(2)       , DATEP=0000DD+
         SRP   DATEP,4(R3),5         , Shift 4 digits: DATEP = DD0000+
         AP    DATEP,YEAR            , DATEP = DD00YY+
         SRP   DWORD+5(3),2(R3),5    , Shift 2 digits; DWORD = ..MM00+
         AP    DATEP,DWORD+5(3)      , Datep = DDMMYY+
         MVC   MSG+94(10),MASKDATE   , move mask to print area
         ED    MSG+94(10),DATEP      , make printable
         MVC   MSG+81(15),MSGTXT4    , insert fixed text
*---------------------------------------------------------------------*
*        Process step start and end times                             *
*---------------------------------------------------------------------*
         LA    R3,SMF4SIT            , Step start time
         L     R2,0(R3)              , get into R2
         BAL   LINKREG,TIME          , convert
         MVC   MSG+108(10),MASKZ1    , insert edit mask
         ED    MSG+108(10),ZEIT      , make printable
         MVC   MSG+104(6),MSGTXT5    , insert fixed text
*
         LA    R3,SMF4TME            , point to step end time
         L     R2,0(R3)              , get time into R2
         BAL   LINKREG,TIME          , convert to decimal
         MVC   MSG+120(10),MASKZ1    , insert print mask
         ED    MSG+120(10),ZEIT      , make printable
         MVC   MSG+118(4),MSGTXT6    , insert fixed text
         MVI   MSG+130,C' '          , insert trailing space
         BAL   LINKREG,WRITE         , write the line
         $TITLE 'Build Line 3'
***********************************************************************
*        ZEILE 3 AUFBEREITEN                                          *
***********************************************************************
         MVI   MSG+2,C' '              AUSBLANKEN
         MVC   MSG+3(128),MSG+2        DRUCKBEREICH
         LA    R3,SMF4TME
         L     R2,0(R3)                STEP TERMINATION TIME
         LA    R3,SMF4SIT
         L     R3,0(R3)                STEP INITIALISATION TIME
         SR    R2,R3                   VERWEILZEIT
         LA    R3,SMF4DTE              TERMINATION DATUM
         LA    R4,SMF4STID             INITIALISATION DATUM
         MVC   DWORD+4(4),0(R3)
         SP    DWORD+4(4),0(4,R4)
         BZ    Z3A                     STEP LIEF NICHT UEBER 24 UHR
         A     R2,=F'8640000'          ANZAHL SEK PRO TAG ZUADDIEREN
Z3A      DS    0H
         BAL   LINKREG,TIME            UMWANDELN IN DEZIMALDARSTELLUNG
         MVC   MSG+22(13),MASKZ2       AUFBEREITEN
         ED    MSG+22(13),ZEIT
         MVC   MSG+10(13),MSGTXT7
*
*        LH    R3,SMF4RSH0             RESEVIERTER SPEICHER LADEN
*        CVD   R3,DWORD
*        MVC   MSG+72(6),MASKSTN       AUFBEREITEN
*        ED    MSG+72(6),DWORD+5
         MVC   MSG+74(4),SMF4SID       CPUID IN DRUCKBEREICH
         MVC   MSG+46(27),MSGTXT10
*
         LA    R3,SMF4FLG              ANFANG DES SMF4 SATZES
         AH    R3,SMF4RLCT             + OFFSET DER RELOCATE SECTION
         L     R2,0(R3)                PAGEIN
         CVD   R2,DWORD
         MVC   MSG+98(6),MASKSTN       PAGEIN AUFBEREITEN
         ED    MSG+98(6),DWORD+5
         MVC   MSG+78(20),MSGTXT11
         BAL   LINKREG,WRITE
         $TITLE 'Build Line 4'
***********************************************************************
*        ZEILE 4 AUFBEREITEN                                          *
***********************************************************************
         LA    R3,SMF4LENN
         AH    R3,SMF4LENN
         MVC   FULLW+1(3),1(3)         CPU-ZEIT LADEN
         MVI   FULLW,X'00'
         MVC   CPU,FULLW
         L     R2,FULLW
*                                      ADD SRB TIME TO TCB TIME
         MVC   FULLW,99(SMFBASE)
         L     R4,FULLW
         SRL   R4,8
         AR    R2,R4
         ST    R2,CPU
*
         BAL   LINKREG,TIME            UMWANDELN IN DEZIMALDARSTELLUNG
         MVC   MSG+22(13),MASKZ2       AUFBEREITEN
         ED    MSG+22(13),ZEIT
         MVC   MSG+10(13),MSGTXT8
*
         LH    R3,SMF4H0ST             USED CORE LADEN
         CVD   R3,DWORD
         MVC   MSG+72(6),MASKSTN       AUFBEREITEN
         ED    MSG+72(6),DWORD+5
         MVC   MSG+46(27),MSGTXT9
*
         LA    R3,SMF4FLG              ANFANG DES SMF4 SATZES
         AH    R3,SMF4RLCT             + OFFSET DER RELOCATE SECTION
         L     R2,4(R3)                PAGEOUT
         CVD   R2,DWORD                UMWANDELN IN DEZIMAL
         MVC   MSG+98(6),MASKSTN       AUFBEREITEN
         ED    MSG+98(6),DWORD+5
         MVC   MSG+78(20),MSGTXT12
         BAL   LINKREG,WRITE
         $TITLE 'Build Line 5'
***********************************************************************
*        ZEILE 5 AUFBEREITEN                                          *
***********************************************************************
         MVC   MSG+3(128),MSG+2        AUSBLANKEN DES DRUCKBEREICHES
         MVC   CPUKORR,CPU
         CLC   SMF4SID(4),=C'BSP2'
         BE    Z5A
         CLC   SMF4SID(4),=C'BSP3'
         BE    Z5C
         ZAP   KORRFAKT,KORRA          CPUA KORRIGIERTE CPU-ZEIT
         B     Z5B
Z5A      DS    0H
         ZAP   KORRFAKT,KORRB          CPUB KORRIGIERTE CPU-ZEIT
         B     Z5B
Z5C      ZAP   KORRFAKT,KORRC          CPUC KORRIGIERTE CPU-ZEIT
Z5B      DS    0H
         L     R3,CPU                  GET BIN CPU TIME
         MH    R3,=H'10'               MULTIPLY WITH TEN
         ZAP   DWORD,KORRFAKT
         CVB   R4,DWORD
         SR    R2,R2
         DR    R2,R4                   DIVIDE WITH KORRFAKTOR
         ST    R3,CPUKORR              STORE NEW CPU TIME
         LR    R2,R3                   EDIT FOR OUTPUT
         BAL   LINKREG,TIME
         MVC   MSG+22(13),MASKZ2
         ED    MSG+22(13),ZEIT
         MVC   MSG+10(13),MSGTXT18
         MVC   MSG+72(5),MASKFAKT
         ED    MSG+72(5),KORRFAKT
         MVC   MSG+36(37),MSGTXT19
         MVC   MSG+79(10),MSGTXT20
         BAL   LINKREG,WRITE
         MVC   MSG+3(128),MSG+2        AUSBLANKEN DES DRUCKBEREICHES
         BAL   LINKREG,WRITE
         $TITLE 'Build Line 6'
***********************************************************************
*        ZEILE 6 AUFBEREITEN                                          *
***********************************************************************
         MVC   MSG+6(13),MSGTXT13
         BAL   LINKREG,WRITE
         $TITLE 'Build Line 7'
***********************************************************************
*        ZEILE 7 AUFBEREITEN                                          *
***********************************************************************
         MVC   MSG+6(13),MSG+2        AUSBLANKEN DES DRUCKBEREICHES
         LA    R2,SMF4NCI              ANZAHL DER EINGELESENEN KARTEN
         MVC   FULLW,0(R2)
         L     R2,FULLW
         CVD   R2,DWORD                UMWANDELN IN DEZIMAL
         MVC   MSG+50(6),MASKSTN       AUFBEREITEN
         ED    MSG+50(6),DWORD+5
         MVC   MSG+6(44),MSGTXT14
         BAL   LINKREG,WRITE
         $TITLE 'Build Line 8'
***********************************************************************
*        ZEILE 8 AUFBEREITEN                                          *
***********************************************************************
         MVC   MSG+3(128),MSG+1        AUSBLANKEN DES DRUCKBEREICHES
         LA    R4,SMF4LENN
         LH    R2,0(R4)
         AH    R4,=H'2'                IN R4 @ DES DATA SET ENTRIES
         SRA   R2,3(0)                 GETEILT DURCH 8
         BZ    Z9                      KEINE DATASETS ALLOCIERT
         LH    R3,=H'10'               ANZAHL AUSGABE PRO ZEILE
         LA    R5,MSG+5                @ DRUCKBEREICH
Z8A      DS    0H
         MVC   HALFW,=X'0000'          HALFWORD LOESCHEN
         MVN   HALFW+1(1),2(R4)        NUMBER OF CHANNEL ADDRESS
         TR    HALFW+1(1),TRTAB        UEBERSETZEN HEX IN CHAR
         MVC   1(1,R5),HALFW+1         CHANNEL ADDRESS IN AUSGABE
         MVI   HALFW+1,X'00'
         MVN   HALFW+1(1),3(R4)        UNIT ADDRESS 2. TEIL
         TR    HALFW+1(1),TRTAB        UEBERSETZEN IN CHAR
         MVC   3(1,R5),HALFW+1         IN DRUCKBEREICH
         MVO   HALFW,3(1,R4)           UNIT ADDRESS 1. TEIL
         TR    HALFW(1),TRTAB          UEBERSETZEN IN CHAR
         MVC   2(1,R5),HALFW           IN DRUCKBEREICH
         CLC   1(3,R5),=X'F0F0F0'      DUMMY DATA SET ?
         BNE   Z8A1
         MVC   1(3,R5),=C'DMY'
Z8A1     DS    0H
         MVC   FULLW,4(R4)             EXCP LADEN
         L     R6,FULLW
         CVD   R6,DWORD                     UMWANDELN DEZIMAL
         MVC   4(8,R5),MASKEXCP             AUSGEBEN
         ED    4(8,R5),DWORD+4
         AH    R5,=H'12'               AUSGABEINDEX ERHOEHEN
         BCT   R3,Z8B                  NOCH NICHT VOLL
*
         BAL   LINKREG,WRITE
         MVC   MSG+3(128),MSG+2        AUSBLANKEN DRUCKBEREICH
         LH    R3,=H'10'               10 DATASETS PRO ZEILE
         LA    R5,MSG+5                @ DRUCKBEREICH
*
Z8B      DS    0H
         AH    R4,=H'8'                LAENGE EINER EXCP INFORMATION
         BCT   R2,Z8A                  SCHON ALLE ABGEARBEITET?
         CH    R3,=H'10'               SATZ SCHON AUSGEGEBEN
         BE    Z9
         BAL   LINKREG,WRITE
         $TITLE 'Build Line 9'
***********************************************************************
*        ZEILE 9 AUFBEREITEN                                          *
***********************************************************************
Z9       DS    0H
         MVC   MSG+3(128),MSG+2        AUSBLANKEN
         BAL   LINKREG,WRITE
         $TITLE 'Build Line 10'
***********************************************************************
*        ZEILE 10 AUFBEREITEN                                         *
***********************************************************************
*        AUSGABE DER KOSTEN DES LAUFES                                *
*                                                                     *
*                       MASCHINE          PREIS PRO MINUTE            *
*            TEST        4341 CPUB         66,-- DM                   *
*            PRODUKTION  4341 CPUA        180,-- DM                   *
*            MVS TEST    4341 CPUC        180,-- DM                   *
*                                                                     *
*         LAEUFT EIN PROGRAMM AUF EINER ANDEREN MASCHINE WIRD ZUR     *
*         UMRECHNUNG DER CPU-ZEIT EINE ROUTINE VORGESEHEN.            *
***********************************************************************
         DS    0H
         L     R2,CPUKORR              CPU IN HUNDERTSTEL SEC
         CVD   R2,DWORD                UMWANDELN IN DEZIMAL
         CLC   SMF4JBN+7(1),=C'Q'      LAUF
         BE    TEST                    ---> TEST
         CLC   SMF4JBN+7(1),=C'U'      LAUF
         BE    TEST                    ---> TEST
         CLC   SMF4JBN+7(1),=C'X'      LAUF
         BE    TEST                    ---> TEST
         CLC   SMF4JBN+7(1),=C'Y'      LAUF
         BE    TEST                    ---> TEST
         CLC   SMF4JBN+7(1),=C'Z'      LAUF
         BE    TEST                    ---> TEST
         CLC   SMF4SID(4),=C'BSP1'     LAUF AUF CPUA
         BE    Z10B                    ---> PRODUKTION
*---------------------------------------------------------------------*
*        MVS TEST (CPUC)                                              *
*---------------------------------------------------------------------*
         MP    DWORD,PMMVS             * PREIS PRO MINUTE
         DP    DWORD,=P'60'                         -''-
         B     Z10D
*---------------------------------------------------------------------*
*        TEST     (CPUB)                                              *
*---------------------------------------------------------------------*
TEST     DS    0H
         MP    DWORD,PMTEST            * PREIS PRO MINUTE
         DP    DWORD,=P'60'                         -''-
         B     Z10D
*---------------------------------------------------------------------*
*        PRODUKTION (CPUA)                                            *
*---------------------------------------------------------------------*
Z10B     DS    0H
         MP    DWORD,PMPROD            * PREIS PRO MINUTE
         DP    DWORD,=P'60'                         -''-
*---------------------------------------------------------------------*
*        AUFBEREITEN ZUR AUSGABE                                      *
*---------------------------------------------------------------------*
Z10D     DS    0H
         MVC   MSG+76(10),MASKPR
         ED    MSG+76(10),DWORD+2
         MVC   MSG+43(33),MSGTXT15
         MVC   MSG+86(4),MSGTXT17
         BAL   LINKREG,WRITE
         L     R2,0(R9)
         ZAP   CPU,DWORD(6)               PREIS DES STEPS
         ZAP   DWORD,CPU                  RECHTSBUENDIG AUSRICHTEN
         CVB   R3,DWORD                   UMWANDELN IN BINAER
         MVC   FULLW,32(R2)               COMMUNIKATION FELD
         MVI   FULLW,X'00'                1.BYTE WIRD NICHT BENUTZT
         A     R3,FULLW                   PREIS SUMMIEREN
         ST    R3,FULLW
         MVC   33(3,R2),FULLW+1           ZURUECKSCHREIBEN
         $TITLE 'Build Line 11'
***********************************************************************
*        ZEILE 11                                                     *
***********************************************************************
         MVC   MSG+1(131),MSG             STERNCHEN ZEILE
         BAL   LINKREG,WRITE
***********************************************************************
         B     EXITF
         EJECT
***********************************************************************
*        JOB TERMINATION                                              *
***********************************************************************
JOBTERM  DS    0H
         B     EXITF
         MVC   MSG(1),ASTERIKS         STERN IN 1 POSITION
         MVC   MSG+1(131),MSG          STERNCHEN ZEILE
         L     R2,0(R9)
         MVC   FULLW,32(R2)               PREIS LADEN
         MVI   FULLW,X'00'                1. BYTE WIRD NICHT BENUTZT
         L     R3,FULLW
         CVD   R3,DWORD                   UMWANDELN IN DEZIMAL
         MVC   MSG+76(10),MASKPR
         ED    MSG+76(10),DWORD+4
         MVC   MSG+43(33),MSGTXT16
         MVC   MSG+86(4),MSGTXT17
         BAL   LINKREG,WRITE
         MVI   MSG,C' '                   CLEAR MESSAGE
         MVC   MSG+1(132),MSG
         L     SMFBASE,PLSMFADR           Get address of SMF5 record
         USING SMF5,SMFBASE               Tell assembler
         TM    SMF5JBTI,B'01000000'       CANCELLED BY IEFUJV
         BNO   UJI
         LA    R3,IEFUJV
         LA    R4,13
LOOP01   DS    0H
         MVC   MSG(50),0(R3)
         BAL   LINKREG,WRITE
         LA    R3,50(R3)
         BCT   R4,LOOP01
         B     EXITF
UJI      DS    0H
         TM    SMF5JBTI,B'00100000'       CANCELLED BY IEFUJI
         BNO   EXITF
         LA    R3,IEFUJI
         LA    R4,5
LOOP02   DS    0H
         MVC   MSG(50),0(R3)
         BAL   LINKREG,WRITE
         LA    R3,50(R3)
         BCT   R4,LOOP02
         B     EXITF
         EJECT
***********************************************************************
*        AUFBEREITEN DER UHRZEITEN                                    *
*                                                                     *
*        EINGABE IN R2 IN BINAERER FORM UHRZEIT IN 100' SEC           *
*        AUSGABE IN ZEIT IN DER FORM 0HHMMSS11V                       *
*        R3 UND DWORD WERDEN ALS ZWISCHENSPEICHER BENUTZT             *
***********************************************************************
TIME     DS    0H
         SRDA  R2,32(0)                     SHIFT DIVIDENT INTO R3
         D     R2,=F'360000'                100' SEC PRO STUNDE
         CVD   R3,DWORD                     STD AUFBEREITEN
         ZAP   ZEIT,DWORD+6(2)
         SR    R3,R3
         SRP   ZEIT,6(0),0                  STD NACH VORNE SCHIEBEN
*
         SRDA  R2,32(0)                     DIVIDENT NACH R3
         D     R2,=F'6000'                  100' SEC PRO MINUTE
         CVD   R3,DWORD                     MIN AUFBEREITEN
         SR    R3,R3
         SRP   DWORD+4(4),4(0),0
         AP    ZEIT,DWORD+4(4)              MINUTEN IN ZEIT SPEICHERN
         CVD   R2,DWORD                     SEC AUFBERIETEN
         AP    ZEIT,DWORD+4(4)              UND SPEICHERN
         BR    LINKREG
         EJECT
***********************************************************************
*        WRITE TO SYSOUT MIT IEFYS                                    *
***********************************************************************
WRITE    DS    0H
         MVC   36(4,12),MSGADR              ADDRESSE DER MESSAGE
         MVC   42(2,12),MSGLEN              LAENGE
         L     R15,VIEFYS
         BALR  R14,R15                      SATZ SCHREIBEN
*
*
         BR    LINKREG                      RUECKSPRUNG
         EJECT
***********************************************************************
*        ENDROUTINEN                                                  *
***********************************************************************
EXITF    DS    0H
         XR    R1,R1                    , Clear R1
         L     R2,4(R13)                , get to higher save area
         ST    R1,24(R13)               , Set R1 of SA to 0
         BSPRET RC=0                    , return to caller
         EJECT
***********************************************************************
*        LITERALE                                                     *
***********************************************************************
         LTORG
***********************************************************************
*        DEFINITION DER KONSTANTEN                                    *
***********************************************************************
WTO001   DC    CL50'IEFACTRT - Stepname  Procstep  Program   Retcode'
WTO001L  EQU   *-WTO001
STMSG    WTO   '---------1---------2---------3---------4---------5',   C
               ROUTCDE=14,DESC=(6,7),MF=L
STMSGL   EQU   *-STMSG
STEPNULL DC    X'000000'               CPU TIME FOR STEP FLUSH
VIEFYS   DC    V(IEFYS)                  ENTRY ZUM SCHREIBEN AUF SYSOUT
MASKDATE DC    XL10'402120204B20204B2020'
MASKEXCP DC    XL8'4B20202020202120'
MASKFAKT DC    XL5'4021216B20'
MASKSTN  DC    XL6'402020202120'
MASKZ1   DC    XL10'402120204B20204B2020'
MASKZ2   DC    XL13'402120207A20207A20206B2020'
MASKPR   DC    XL10'4020204B2021206B2020'
MONTHT1  DC    XL24'031C028C031C030C031C030C031C031C030C031C030C031C'
TRTAB    DC    XL16'F0F1F2F3F4F5F6F7F8F9C1C2C3C4C5C6'
         DC    C'Charge per minute for TEST:'
PMTEST   DC    PL2'050'
         DC    C'Charge per minute for PRODUKTION:'
PMPROD   DC    PL2'100'
         DC    C'Charge per minute for MVS TEST:'
PMMVS    DC    PL2'100'
         DC    C'Multiplier for BSP1 in tenth:'
KORRA    DC    PL2'10'
         DC    C'Multiplier for BSP2 in tenth:'
KORRB    DC    PL2'10'
         DC    C'Multiplier for BSP3 in tenth:'
KORRC    DC    PL2'10'
***********************************************************************
*        DEFINITION DER KONSTANTEN FUER SYSOUT AUSGABE                *
***********************************************************************
MSGLEN   DC    H'132'
ASTERIKS DC    C'*'
MSGTXT1  DC    CL18'. Jobstep of job:'
MSGTXT2  DC    CL14'    Stepname:'
MSGTXT3  DC    CL18'    Program name:'
MSGTXT4  DC    CL15'   Executed on'
MSGTXT5  DC    CL6' from'
MSGTXT6  DC    CL4' to '
MSGTXT7  DC    CL13'elapsed time'
MSGTXT8  DC    CL13'    CPU time'
MSGTXT9  DC    CL27'    Virtual Storage used:'
MSGTXT10 DC    CL27'           CPU-Identifier:'
MSGTXT11 DC    CL20'           Page-in:'
MSGTXT12 DC    CL20'K         Page-out:'
MSGTXT13 DC    CL13'I/O Operations:'
MSGTXT14 DC    CL44'Number of records read via DD * or DD DATA:'
MSGTXT15 DC    CL33'Charge for step (w/o SYSOUT):'
MSGTXT16 DC    CL33'Charge for job (w/o SYSOUT):'
MSGTXT17 DC    CL4'   '
MSGTXT18 DC    CL13'  corr. CPU:'
MSGTXT19 DC    CL37'  CPU time has been corrected by  1 /'
MSGTXT20 DC    CL10'multiplier'
IEFUJV   DC    CL50'* JOB cancelled by IEFUJV                        *'
         DC    CL50'* CHECKING BETWEEN 7 A.M.AND 6 P.M.              *'
         DC    CL50'*                                                *'
         DC    CL50'*  1. MAX. 10 JOBCARDS ARE ALLOWED               *'
         DC    CL50'*  2. COLUMN 71 OF EACH JOBCARD MUST BE BLANK    *'
         DC    CL50'*  3. PRTY MUST BE LOWER THAN 7                  *'
         DC    CL50'*  4. FOR TEST-JOBS (SUFFIX U,X,Y,Z) ONLY        *'
         DC    CL50'*     LAST JOBCARD MUST BE BLANK FROM COLUMN 58  *'
         DC    CL50'*      CLASS        MAX. TIME                    *'
         DC    CL50'*        F           30 SEC                      *'
         DC    CL50'*        A           10 MIN                      *'
         DC    CL50'*        T,D          5 MIN                      *'
         DC    CL50'**************************************************'
IEFUJI   DC    CL50'* JOB CANCELLED BY IEFUJI                        *'
         DC    CL50'*                                                *'
         DC    CL50'*  1. WRONG JOBNAME                              *'
         DC    CL50'*  2. WRONG ACCOUNTINGNUMBER                     *'
         DC    CL50'**************************************************'
         EJECT
***********************************************************************
*        WORKAREA                                                     *
***********************************************************************
WORKAREA DSECT
         DS    18F                   , standard save area
DWORD    DS    D                     , Doubleword workarea
CPU      DS    F                     , CPU time, uncorrected
CPUKORR  DS    F                     , CPU time corrected
FULLW    DS    F                     , fullword workarea
MSGADR   DS    F                     , address of message area
HALFW    DS    H                     , halfword workarea
MSG      DS    CL132                 , workarea for messages
MONTHT   DS    CL24                  , Days/month table
YEAR     DS    PL2                   , Current year (0YY+)
DATE     DS    PL4                   , Packed date in 00YYDDD+ format
DATEP    DS    PL4                   , Packed date in 0YYMMDD+ format
KORRFAKT DS    PL2                   , multiplier for correct CPU time
WTOL     DS    CL(STMSGL)            , WTO buffer
RE1      DS    CL3                   , temporary work field
ZEIT     DS    PL5                   , Time stored as 0HHMMSSTT+
STEPMSG  DS    0CL(WTO001L)          , Message Template
SMHEAD   DS    CL8                   , Message Header
         DS    CL3                   , Separator
SMSTEP   DS    CL8                   , Stepname that invoked procedure
         DS    CL2                   , Separator
SMPTEP   DS    CL8                   , Stepname
         DS    CL2                   , Separator
SMPROG   DS    CL8                   , Program Name
         DS    CL2                   , Separator
SMSCC    DS    0CL8                  , Step Completion Code
*                                    , RC: 0004
*                                    , AB U1234
*                                    , AB S 0C7
*                                    , *FLUSH**
SMSCCP   DS    CL4                   , Prefix, like RC= , AB S, or AB U
SMSCCC   DS    CL4                   , CC Value
         DS    CL(L'STEPMSG+*-STEPMSG)
TMPCCC   DS    0CL4                  , temp field for System Code
         DS    CL1
SYSCCC   DS    CL3
WALEN    EQU *-WORKAREA              ,
         EJECT
SMF4     DSECT
         IFASMFR 4
SMF5     DSECT
         IFASMFR 5
SMF34    DSECT
         IFASMFR 34
         EJECT
MYTCB   IKJTCB LIST=YES
         EJECT
MYPSA    IHAPSA
         EJECT
MYTIOT   DSECT
         IEFTIOT1
         EJECT
MYCSCB   DSECT
         IEECHAIN
         EJECT
         IHAASCB DSECT=YES
PARMLIST DSECT
PLCEPADR DS    F                     , address of common exit parm area
PLSTPADR DS    F                     , address of stepname
PLPGNADR DS    F                     , address of programmer's name
PLJETADR DS    F                     , address of job execution time
PLJAFADR DS    F                     , address of job accounting info
PLSETADR DS    F                     , address of step execution time
PLSAFADR DS    F                     , address of step accounting info
PLFSNADR DS    F                     , address of flag and step num
PLTSTADR DS    F                     , address of termination status
PLSMFADR DS    F                     , address of termination record
CEPLIST  DSECT                       , Common Exit Parameter List
CEPJOBN  DS    CL8                   , Jobname
CEPTIME  DS    CL8                   , Time stamp
CEPSYSID DS    CL4                   , SMF System Id
CEPUID   DS    CL8                   , User Id
CEPSNUM  DS    CL1                   , Step number
CEPSMFOP DS    CL1                   , SMF Option
CEPRSTID DS    CL1                   , restart indicator
CEPJCLAS DS    CL1                   , Job class
CEPUCOMM DS    0F                    , User Communication Area
CEPUCOMH DS    C                     , User Communication Area Header
CEPUCOMT DS    CL3                   , User Communication Area Trailer
         BSPEND
         END
$$
//COPY    EXEC PGM=IEBCOPY
//SYSPRINT DD  SYSOUT=*
//MACLIB2  DD  DISP=SHR,DSN=SYS2.MACLIB
//UMODMAC  DD  DISP=SHR,DSN=SYS1.UMODMAC
//SYSIN    DD  *
 COPY INDD=((MACLIB2,R)),OUTDD=UMODMAC
//ASM    EXEC SMPASM,M=IEFACTRT,COND=(0,NE)
//RECAPP EXEC SMPAPP,COND=(0,NE)
//SMPPTFIN DD  *
++USERMOD (ZUM0002).
++VER (Z038) FMID(EBB1102).
++MOD(IEFACTRT) TXLIB(UMODOBJ).
//SMPCNTL  DD  *
 REJECT  SELECT(ZUM0002).
 RESETRC.
 RECEIVE SELECT(ZUM0002).
 APPLY   SELECT(ZUM0002)
         DIS(WRITE)
         .
