//MARKASM JOB (0),'ASM DUPTIME',CLASS=A,MSGCLASS=T //* //* CHANGE SYS9.LINKLIB (AT THE END OF THIS JOB) TO ONE OF YOUR //* NON-APF LINKLIST LIBRARIES. //* IF YOU HAVE MY DATETIME LIBRARY INSTALLED THEN JUST RUN THIS JOB. //* -ELSE REMOVE THE CODE THAT NEEDS MY LIBRARY AS PER COMMENTS AT //* THE TOP OF THE SOURCE CODE THEN RUN THIS JOB. //* //ASMLKD EXEC ASMFCL,MAC='SYS1.AMODGEN',MAC1='MVSSRC.SYM101.F01', // PARM.ASM='OBJECT,NODECK,TERM,XREF(SHORT)', // PARM.LKED='LIST,MAP,NCAL,AC=0' //ASM.SYSLIB DD DISP=SHR,DSN=SYS1.MACLIB // DD DISP=SHR,DSN=SYS1.AMODGEN // DD DISP=SHR,DSN=MVSSRC.SYM101.F01 // DD DISP=SHR,DSN=CBT249.FILE352 PGM MACRO // DD DISP=SHR,DSN=INSTALL.UTILS.DATETIME IPL TIME UTILITY //ASM.SYSIN DD * * * BASED ON MEMBER TSO033 FROM CBT249.FILE353 ON TURNKEY3 WHICH DISPLAYS * HOW LONG SINCE THE LAST IPL BASED ON HOW LONG THE *MASTER TASK HAS * BEEN RUNNING. * * CBT249.FILE352 MUST BE IN THE SYSLIB DD LIST... I HAVE MADE * MINIMAL CHANGES TO THE CODE SO IT STILL REQUIRES MACROS IN THAT * FILE. * ALSO THE MAIN CHANGES I HAVE MADE ARE TO CALL A PROGRAM THAT * SHOULD BE INSTALLED IN ONE OF YOUR LINKLIST LIBRARIES FROM MY * DATE UTILITY LIBRARY, SO YOU NEED THE MACROS FOR THAT IN YOUR * SYSLIB DD LIST ALSO (OR REMOVE THE EXTRA CODE I ADDED; FOUND * IN TWO BLOCKS BOOKMARKED BY 'MID'). * * --- ASSEMBLE INTO A LINKLIST LIBRARY * --- DOES N O T HAVE TO BE AUTHORISED * --- MAY BE RUN FROM TSO ('DUPTIME') OR BATCH ('EXEC PGM=DUPTIME') * * MY CHANGES * (1) REMOVED THE UNREFERENCED WTOR/TGET CODE THAT WAS IN THE MEMBER * (2) ADDED THE SECOND OUTPUT LINE TO DISPLAY THE IPL DATE AND TIME, * WHICH REQUIRES MY DATE LIBRARY; IF YOU DON'T HAVE THAT REMOVE * THAT SECOND OUTPUT LINE CODE. --> MY LIBRARY USES A DIFFERENT * TIME CALCULATION, IT USES THE RMCTTOD COUNTER TO DETERMINE THE * UPTIME AS THAT IS MORE ACCURATE THAN CHECKING HOW LONG *MASTER * HAS BEEN RUNNING (ALTHOUGH FOR ALL PRACTICAL PURPOSES THE * RESULTS WILL BE VIRTUALLY IDENTICAL, I JUST WANTED TO DO IT * CORRECTLY (AND TO PLAY WITH TIMESTAMP CALCULATIONS)). * LINKREG EQU 6 LINK REGISTER * DUPTIME PGM ,PGM TO SHOW EXEC JOBS AND STC EXTRACT MF=(E,EXTRACT) L R1,ANSWER (R1)=ADDR OF TSO FLAG FROM EXTRACT MVC TSOFLAG,0(R1) MOVE IN THE ANSWER TO OUR FLAG SPACE * LA R0,X'26' SET SYSEVENT CODE ICM R0,B'1100',=H'1' SET ASID TO 1 LA R1,RTNAREA -> RETURN AREA SVC 95 DO IT L R4,4(,R1) GET TOTAL TRANSACTIVE TIME SRDL R4,32 MOVE INTO R5 FOR DIVIDE. D R4,=F'1024' CONVERT TO SECONDS. SLR R4,R4 IGNORE REMAINDER. D R4,=F'3600' DIVIDE TO GET HOURS. SAVEHRS STM R4,R5,SAVEREGS SAVE HRS/REM FOR LATER SLR R4,R4 D R4,=F'24' DIVIDE TO GET TOTAL DAYS CVD R5,WRKD CONVERT DAYS MVC UPDAYS-1(4),=X'40202120' MOVE IN PATTERN DAYS ED UPDAYS-1(4),WRKD+6 AND EDIT THE VALUE LR R5,R4 ESTABLISH NEW HOURS.... HOURS L R4,SAVEREGS GET BACK HOURS REMAINDER CVD R5,WRKD CONVERT HOURS - UNPK UPHH,WRKD+6(2) - TO PRINTABLE FORMAT. OI UPHH+1,X'F0' FIXUP SIGN BYTE. MVI UPHH+2,C':' SEPARATOR. SRDL R4,32 MOVE REMAINDER OVER FOR DIVIDE. D R4,=F'60' GET MINUTES. CVD R5,WRKD CONVERT MINUTES - UNPK UPMM(2),WRKD+6(2) - TO PRINTABLE FORMAT. OI UPMM+1,X'F0' FIXUP SIGN BYTE. MVI UPMM+2,C':' SEPARATOR. CVD R4,WRKD REMAINDER IS SECONDS. UNPK UPSS(2),WRKD+6(2) CONVERT SEC TO PRINTABLE FORMAT. OI UPSS+1,X'F0' FIXUP SIGN. SPACE 2 * AND MEMORY STATUS LA R1,MSGWTO BAL LINKREG,PUTMSG SHOVEL IT OUT * MID - add extra output line * caution, using a customised 'WTO' from the CBT file * that uses offsets from +4 instead of the normal +8 UDATEMAC ERROR=MIDSKIP,REQ=IPL,DATA=UDATEVAR MVC MSGWTO2+20(4),D370YEAR MVC MSGWTO2+25(2),D370MMDD MVC MSGWTO2+28(2),D370MMDD+2 MVC MSGWTO2+34(2),D370TIME MVC MSGWTO2+37(2),D370TIME+2 MVC MSGWTO2+40(2),D370TIME+4 LA R1,MSGWTO2 BAL LINKREG,PUTMSG SHOVEL IT OUT MIDSKIP CNOP 0,4 * MID - end extra B $$EOJ EJECT *.....................................................................* * LOCAL SUBROUTINE FOR IO TO OPER/USER * *.....................................................................* SPACE * * ENTER WITH WTO,WTOR LIST FORM POINTED TO BY R1 * * BAL LINKREG,PUTMSG OR * * USES R14 FOR WORK * * PUTMSG DS 0H TM TSOFLAG,X'80' IS IT TSO? BO TPUTIT YES-> GO DO TPUT SVC 35 NO-> USE WTO BR LINKREG TPUTIT DS 0H LH R0,0(,R1) GET LENGTH OF WTO MESSAGE S R0,=F'4' SUBTRACT OFF HEADER LA R1,4(,R1) BUMP MSG ADDRESS PAST HDR TPUT (1),(0),R DO THE TPUT BR LINKREG EJECT *.....................................................................* * LIST FORMS OF MACROS * *.....................................................................* SPACE 2 EXTRACT EXTRACT ANSWER,'S',FIELDS=(TSO),MF=L EJECT *.....................................................................* * VARIABLES * *.....................................................................* SPACE 2 SWITCH DC XL1'00' TSOFLAG DC X'00' ='80' IF TSO. '00' IF NOT TSO ANSWER DC F'0' ADDRESS POINTER FOR EXTRACT SPACE 2 WRKD DC D'0' RMCTPTR DS F SAVEREGS DS 4F RTNAREA DS 3F EJECT *.....................................................................* * MESSAGE FORMATS * *.....................................................................* SPACE 2 MSGWTO WTO 'SYSTEM HAS BEEN UP FOR XXX DAYS HH:MM:SS ', X ROUTCDE=(11),MF=L ORG MSGWTO+4 BUFFER DS CL72 ORG MSGWTO+27 UPDAYS DS CL3 ORG MSGWTO+36 UPHH DS CL2 DS CL1 UPMM DS CL2 DS CL1 UPSS DS CL2 ORG * MID - add extra output line * ..1....+....2....+....3....+....4.... MSGWTO2 WTO 'LAST IPL WAS ON yyyy/mm/dd AT HH:MM:SS ', X ROUTCDE=(11),MF=L EJECT UDATEVAR DSECT=NO * MID - end extra *.....................................................................* * LITERALS * *.....................................................................* SPACE 2 LTORG END //ASM.SYSTERM DD SYSOUT=* //LKED.SYSLMOD DD DSN=SYS9.LINKLIB(DUPTIME),DISP=SHR //