0% found this document useful (0 votes)
176 views61 pages

IPLINFO

Download as txt, pdf, or txt
Download as txt, pdf, or txt
Download as txt, pdf, or txt
You are on page 1/ 61

/* REXX */

/* */
/* AUTHOR: Mark Zelden */
/* */
/* Trace ?r */
/* ============================================================ */
/* */
/* NOTE TO SELF: */
/* */
/* Don't forget to check / update the JES2 node offset table */
/* for each new OS release and the JES3 FMID table. */
/* */
/* ============================================================ */
/* */
/*********************************************************************/
/* */
/* D I S C L A I M E R */
/* ------------------- */
/* */
/* This program is FREEWARE. Use at your own risk. Neither Mark */
/* Zelden, nor other contributing organizations or individuals */
/* accept any liability of any kind howsoever arising out of the use */
/* of this program. You are free to use and modify this program as */
/* you desire, however, the author does ask that you leave his name */
/* in the source and give credit to him as the original programmer. */
/* */
/*********************************************************************/
/* IPLINFO: DISPLAY SYSTEM INFORMATION ON TERMINAL */
/*********************************************************************/
/* */
/* IPLINFO can be called as an interactive exec / ISPF edit macro */
/* or in batch to display various system information. The result */
/* will be displayed in an ISPF browse data set if ISPF is active. */
/* */
/* IPLINFO can also be called as a REXX function to return from 1 */
/* to 20 variables used in the exec at their final value. If more */
/* than one variable is requested the variables are returned with */
/* a blank or user defined delimiter between each variable so they */
/* may be parsed if desired. */
/* */
/* See below for the sytax of each method. */
/* */
/*********************************************************************/
/* */
/* EXECUTION SYNTAX: */
/* */
/* TSO %IPLINFO <option> */
/* */
/* VALID OPTIONS ARE 'ALL', 'IPL', 'VERsion', 'STOrage', 'CPU', */
/* 'IPA', 'SYMbols', 'VMAp', 'PAGe', 'SMF', 'SUB', */
/* 'ASId', 'LPA', 'LNKlst', 'APF' and 'SVC' */
/* */
/* ** 'ALL' is the default option */
/* ** Options may be abbreviated by using 3 or more characters */
/* */
/* ** A 2nd parameter option of 'NOBrowse' may also be specified to */
/* eliminate browsing the output even when ISPF is active. This */
/* will allow any IPLINFO output to be trapped and parsed from */
/* another exec or edit macro if desired. The 'NOBrowse' option */
/* can also be specified as the only option and it will produce */
/* all IPLINFO output without browsing it. */
/* */
/* ** A 2nd parameter option of 'EDIt' may also be specified to */
/* EDIT the output instead of browsing it. The 'EDIt' option */
/* can also be specified as the only option and it will produce */
/* all IPLINFO output without editing it. */
/* */
/* ** The following options are not documented above as standard */
/* options nor in the help panel: */
/* "ASVt" - an alias for the "ASId" option */
/* "ASM" - an alias for the "PAGE" option */
/* "SSI" - an alias for the "SUB" option */
/* "SSN" - an alias for the "SUB" option */
/* "STOre" - an alias for the "STORage" option */
/* "MEMory" - an alias for the "STORage" option */
/* "SUBsystems" - an alias for the "SUB" option */
/* "NOBrowse" - the NOBrowse option */
/* "EDIt" - the EDIt option */
/* */
/* Examples: */
/* TSO %IPLINFO (Display all information) */
/* TSO %IPLINFO VMAP (Display a Virtual Storage Map) */
/* TSO %IPLINFO SYM (Display Static System Symbols) */
/* TSO %IPLINFO SUB (Display Subsystem Information) */
/* TSO %IPLINFO APF (Display APF Library List) */
/* TSO %IPLINFO ALL NOB (Display all infomation, don't browse O/P) */
/* TSO %IPLINFO SUB NOB (Display subsys info, don't browse O/P) */
/* TSO %IPLINFO NOBROWSE (Display all infomation, don't browse O/P) */
/* TSO %IPLINFO ALL EDI (Display all infomation, edit O/P) */
/* TSO %IPLINFO SUB EDI (Display subsys info, edit O/P) */
/* TSO %IPLINFO EDIT (Display all infomation, edit O/P) */
/* */
/* Edit macro invocation: */
/* IPLINFO (Display all information) */
/* IPLINFO VMAP (Display a Virtual Storage Map) */
/* IPLINFO SYM (Display Static System Symbols) */
/* IPLINFO SUB (Display Subsystem Information) */
/* IPLINFO APF (Display APF Library List) */
/* IPLINFO ALL NOB (Display all infomation, don't browse O/P) */
/* IPLINFO SUB NOB (Display subsys info, don't browse O/P) */
/* IPLINFO NOBROWSE (Display all infomation, don't browse O/P) */
/* IPLINFO ALL EDIT (Display all infomation, edit O/P) */
/* IPLINFO SUB EDIT (Display subsys info, edit O/P) */
/* IPLINFO EDIT (Display all infomation, edit O/P) */
/* */
/* Sample Unix System Services WEB Server execution via links: */
/* <a href="/cgi-bin/iplinfo">MVS Information</a> */
/* <a href="/cgi-bin/iplinfo?vmap">Virtual Storage Map</a> */
/* <a href="/cgi-bin/iplinfo?symbols">Static System Symbols</a> */
/* <a href="/cgi-bin/iplinfo?sub">Subsystem Information</a> */
/* <a href="/cgi-bin/iplinfo?apf">APF Library List</a> */
/* */
/*********************************************************************/
/* */
/* FUNCTION SYNTAX: */
/* */
/* IPLINFO(VAR,var1_name) */
/* IPLINFO(VAR,var1_name,var2_name,var3_name, ... var20_name) */
/* */
/* Examples: */
/* sysname = IPLINFO(VAR,GRSNAME) */
/* pvtsize = IPLINFO(VAR,GDAPVTSZ) */
/* */
/* */
/* /* REXX one line IPL information using IPLINFO rexx function */ */
/* IPL_SUM = IPLINFO(VAR,ipldate,ipltime,iplvol,ipladdr,iplparm) */
/* Parse var IPL_SUM ipldate ipltime iplvol ipladdr iplparm */
/* Say 'Date:'ipldate ' Time:'ipltime ' Vol:'iplvol , */
/* ' Load addr:'ipladdr ' LOADPARM:'iplparm */
/* */
/* */
/* NOTE: The default delimeter between returned variables is a */
/* blank. However, this can be problematic when the returned */
/* value contains a blank or is null. You can optionally */
/* change the delimiter from a blank to one of your choice */
/* by using "VAR2" instead of "VAR" in the function call and */
/* specifying the delimiter character(s) as the next operand */
/* prior to the list of variables you want returned. */
/* */
/* */
/* FUNCTION SYNTAX - "VAR2" / USER DEFINED DELIMITER: */
/* */
/* IPLINFO(VAR2,'dlm',var1_name) */
/* IPLINFO(VAR2,'dlm',var1_name,var2_name,var3_name, ... var20_name) */
/* */
/* Example: */
/* /* REXX one line IPL information using IPLINFO rexx function */ */
/* IPL_SUM = IPLINFO(VAR2,'@@',ipldate,ipltime,iplvol, , */
/* ipladdr,iplparm) */
/* Parse var IPL_SUM ipldate '@@' ipltime '@@' iplvol '@@' , */
/* ipladdr '@@' iplparm */
/* Say 'Date:'ipldate ' Time:'ipltime ' Vol:'iplvol , */
/* ' Load addr:'ipladdr ' LOADPARM:'iplparm */
/* */
/*********************************************************************/
/* */
/* NOTE: The dynamic APF and dynamic LNKLST code in this exec */
/* use undocumented IBM control blocks and may break at */
/* any time! */
/* ... tested on MVS ESA V4.3 up through z/OS 2.1. */
/* */
/* NOTE: The LNKLST SET displayed is the LNKLST SET of the address */
/* space running this exec, not necessarily the most */
/* current one. For the current LNKLST SET either: */
/* 1) Run this exec in batch. */
/* 2) Log off and on TSO before executing this exec. */
/* 3) Issue SETPROG LNKLST,UPDATE,JOB=userid (B4 execution) */
/* */
/* NOTE: The APF flag in the LNKLST display is the status if the */
/* data set is accessed VIA LNKLST. Therefore, if IEASYSxx */
/* specifies LNKAUTH=LNKLST, all entires are marked as APF=Y. */
/* */
/*********************************************************************/
LASTUPD = '06/17/2019' /* date of last update */
/*********************************************************************/
/* */
/* B E G I N C U S T O M I Z A T I O N S E C T I O N */
/* */
/* You may changes the variables below to your preference. */
/* You may only choose the options that are commented out. */
/* */
/* DATEFMT - Controls date format: ISO ; USA ; EUR */
/* VMAP - Controls VMAP order: HIGHFIRST ; LOWFIRST */
/* */
/*********************************************************************/
DATEFMT = 'ISO' /* ISO 8601 format YYYY-MM-DD (new default) */
/* DATEFMT = 'USA' */ /* USA format MM/DD/YYYY (original format) */
/* DATEFMT = 'EUR' */ /* EUR format DD/MM/YYYY */
/*********************************************************************/
VMAP = 'HIGHFIRST' /* new default - show VMAP from top down */
/* VMAP = 'LOWFIRST' */ /* the old way - show from bottom up */
/* Please let me know if you "need" the old way (LOWFIRST) as I */
/* will probably remove the duplicate code in the future. */
/*********************************************************************/
/* */
/* E N D C U S T O M I Z A T I O N S E C T I O N */
/* */
/*********************************************************************/
Signal On Syntax name SIG_ALL /* trap syntax errors */
Signal On Novalue name SIG_ALL /* trap uninitialized variables */
Arg OPTION,VAR.1,VAR.2,VAR.3,VAR.4,VAR.5,VAR.6,VAR.7,VAR.8,VAR.9, ,
VAR.10,VAR.11,VAR.12,VAR.13,VAR.14,VAR.15,VAR.16,VAR.17,VAR.18, ,
VAR.19,VAR.20,VAR.21
Parse source . EXEC_TYPE . . . . . ENV . .
MML = Substr(LASTUPD,1,2) /* MM from MM/DD/YYYY */
DDL = Substr(LASTUPD,4,2) /* DD from MM/DD/YYYY */
YYYYL = Substr(LASTUPD,7,4) /* YYYY from MM/DD/YYYY */
If DATEFMT = 'USA' then , /* USA format date? */
LASTUPD = LASTUPD /* date as MM/DD/YYYY */
If DATEFMT = 'EUR' then , /* EUR format date? */
LASTUPD = DDL'/'MML'/'YYYYL /* date as DD/MM/YYYY */
If DATEFMT = 'ISO' then , /* ISO format date? */
LASTUPD = YYYYL'-'MML'-'DDL /* date as YYYY-MM-DD */
SYSISPF = 'NOT ACTIVE' /* set SYSISPF=NOT ACTIVE */
FUNCDLM = ' ' /* Delimiter default for function call */
If ENV <> 'OMVS' then /* are we under unix ? */
If Sysvar('SYSISPF')='ACTIVE' then do /* no, is ISPF active? */
If Pos('NOB',OPTION) = 0 then , /* NOBrowse not used? */
Address ISREDIT "MACRO (OPTION)" /* YES,allow use as macro */
OPTION = Translate(OPTION) /* ensure upper case for edit macro */
Address ISPEXEC "VGET ZENVIR" /* ispf version */
SYSISPF = 'ACTIVE' /* set SYSISPF = ACTIVE */
End
/*********************************************************************/
/* Process options */
/*********************************************************************/
BROWSEOP = 'YES' /* default is to browse OP under ISPF */
EDITOP = 'NO' /* output is not in edit mode */
/*********************************************************************/
If SYSISPF = 'NOT ACTIVE' & Pos('EDI',OPTION) <> 0 then /* EDIT is */
call INVALID_OPTION /* not valid if ISPF isn't active */
If OPTION = '' then OPTION = 'ALL' /* Default option. Change to IPL */
/* or something else - may want to change help panel if changed */
If Abbrev('NOBROWSE',OPTION,3) = 1 then , /* NOBROWSE only opt? */
OPTION = 'ALL NOBROWSE' /* yes, use all option */
If Abbrev('EDIT',OPTION,3) = 1 then , /* EDITonly opt? */
OPTION = 'ALL EDIT' /* yes, use all option */
If Abbrev('NOBROWSE',Word(OPTION,2),3) = 1 then do /* NOBROWSE USED? */
OPTION = Word(OPTION,1) /* separate out option */
BROWSEOP = 'NO' /* set BROWSEOP flag to NO */
End
If Abbrev('EDIT',Word(OPTION,2),3) = 1 then do /* EDIT USED? */
OPTION = Word(OPTION,1) /* separate out option */
EDITOP = 'YES' /* set EDITOP flag to YES */
End
/*********************************************************************/
If OPTION <> 'IPL' & , /* check for IPL option */
Abbrev('VERSION',OPTION,3) <> 1 & , /* check for VERsion option */
Abbrev('STORAGE',OPTION,3) <> 1 & , /* check for STOrage option */
Abbrev('STORE',OPTION,3) <> 1 & , /* check for STOre option */
Abbrev('MEMORY',OPTION,3) <> 1 & , /* check for MEMory option */
OPTION <> 'CPU' & , /* check for CPU option */
OPTION <> 'IPA' & , /* check for IPA option */
Abbrev('SYMBOLS',OPTION,3) <> 1 & , /* check for SYMbols option */
Abbrev('VMAP',OPTION,3) <> 1 & , /* check for VMAp option */
Abbrev('PAGE',OPTION,3) <> 1 & , /* check for PAGe option */
Abbrev('ASM',OPTION,3) <> 1 & , /* check for ASM option */
Abbrev('AUX',OPTION,3) <> 1 & , /* check for ASM option */
OPTION <> 'SMF' & , /* check for SMF option */
OPTION <> 'SSI' & , /* check for SSI option */
OPTION <> 'SSN' & , /* check for SSN option */
OPTION <> 'SUB' & , /* check for SUB option */
Abbrev('SUBSYSTEMS',OPTION,3) <> 1 & , /* check for SUB option */
Abbrev('ASID',OPTION,3) <> 1 & , /* check for ASId option */
Abbrev('ASVT',OPTION,3) <> 1 & , /* check for ASVt option */
OPTION <> 'LPA' & , /* check for LPA option */
Abbrev('LNKLST',OPTION,3) <> 1 & , /* check for LNKlst option */
Abbrev('LINKLIST',OPTION,3) <> 1 & , /* check for LINklist option*/
OPTION <> 'APF' & , /* check for APF option */
OPTION <> 'SVC' & , /* check for SVC option */
OPTION <> 'ALL' & , /* check for ALL option */
Substr(OPTION,1,3) <> 'VAR' , /* check for VAR option */
then call INVALID_OPTION /* no valid option... */
Numeric digits 20 /* dflt of 9 not enough */
/* 20 can handle 64-bit */
Call COMMON /* control blocks needed by multiple routines */
Call HEADING /* Heading sub-routine */
Select
When OPTION = 'ALL' | Substr(OPTION,1,3) = 'VAR' then do
Call IPL /* IPL information */
Call VERSION /* Version information */
Call STOR /* Storage information */
Call CPU /* CPU information */
Call IPA /* Initialization info. */
Call SYMBOLS /* Symbols information */
Call VMAP /* Virt. Storage Map */
Call PAGE /* Page DSN information */
Call SMF /* SMF DSN information */
Call SUB /* Subsystem information */
Call ASID /* ASID usage information*/
Call LPA /* LPA List information */
Call LNKLST /* LNKLST information */
Call APF /* APF List information */
Call SVC /* SVC information */
End /* when OPTION = 'ALL' */
When Abbrev('VERSION',OPTION,3) = 1 then call VERSION
When Abbrev('STORAGE',OPTION,3) = 1 then call STOR
When Abbrev('STORE',OPTION,3) = 1 then call STOR
When Abbrev('MEMORY',OPTION,3) = 1 then call STOR
When Abbrev('SYMBOLS',OPTION,3) = 1 then call SYMBOLS
When Abbrev('VMAP',OPTION,3) = 1 then call VMAP
When Abbrev('ASM',OPTION,3) = 1 then call PAGE
When Abbrev('AUX',OPTION,3) = 1 then call PAGE
When Abbrev('SSI',OPTION,3) = 1 then call SUB
When Abbrev('SSN',OPTION,3) = 1 then call SUB
When Abbrev('SUBSYSTEMS',OPTION,3) = 1 then call SUB
When Abbrev('PAGE',OPTION,3) = 1 then call PAGE
When Abbrev('ASID',OPTION,3) = 1 then call ASID
When Abbrev('ASVT',OPTION,3) = 1 then call ASID
When Abbrev('LNKLST',OPTION,3) = 1 then call LNKLST
When Abbrev('LINKLIST',OPTION,3) = 1 then call LNKLST
Otherwise interpret "Call" OPTION
End /* select */
/*********************************************************************/
/* Done looking at all control blocks */
/*********************************************************************/
/*********************************************************************/
/* IPLINFO called as a function with an alternate delimiter. */
/* Return variable names and exit */
/*********************************************************************/
If Substr(OPTION,1,4) = 'VAR2' & EXEC_TYPE='FUNCTION' then do
"DROPBUF" /* remove data stack */
FUNCDLM = VAR.1 /* function delimiter */
ALL_VARS = Value(VAR.2) /* at least one var */
Do V = 3 to 21 /* check for others */
If VAR.V = '' then leave /* done, leave loop */
Else ALL_VARS = ALL_VARS || , /* concat additional */
FUNCDLM || Value(VAR.V) /* var + dlm at end */
End /* end Do V */
Return ALL_VARS /* return vars */
End
/*********************************************************************/
/* IPLINFO called as a function. Return variable names and exit */
/*********************************************************************/
If Substr(OPTION,1,3) = 'VAR' & EXEC_TYPE='FUNCTION' then do
"DROPBUF" /* remove data stack */
ALL_VARS = Value(VAR.1) /* at least one var */
Do V = 2 to 20 /* check for others */
If VAR.V = '' then leave /* done, leave loop */
Else ALL_VARS = ALL_VARS || , /* concat additional */
FUNCDLM || Value(VAR.V) /* var + dlm at end */
End /* end Do V */
Return ALL_VARS /* return vars */
End
/*********************************************************************/
/* If ISPF is active and the BROWSEOP option is set (default) then */
/* browse the output - otherwise write to the terminal */
/*********************************************************************/
If SYSISPF = 'ACTIVE' & BROWSEOP = 'YES' , /* ISPF active and */
then call BROWSE_ISPF /* BROWSEOP option set? */
Else do queued() /* ISPF is not active */
Parse pull line /* pull queued lines */
Say line /* say lines */
End /* else do */
Exit 0 /* End IPLINFO - RC 0 */
/*********************************************************************/
/* End of main IPLINFO code */
/*********************************************************************/
/*********************************************************************/
/* Start of sub-routines */
/*********************************************************************/
INVALID_OPTION: /* Invalid option sub-routine */
If SYSISPF = 'ACTIVE' then do
Queue ' '
Queue ' ******************************************************'
If OPTION <> '?' then,
Queue ' * Invalid IPLINFO option. *'
Queue ' * Please hit PF1/HELP two times for valid options. *'
Queue ' ******************************************************'
Queue ' '
OPTION = 'Invalid'
Call BROWSE_ISPF
Exit 16
End
Else do
Call CKWEB /* call CKWEB sub-routine */
Say Copies('*',79)
Say " "
If OPTION <> '?' then,
Say "Invalid IPLINFO option."
Say " "
Say "EXECUTION SYNTAX: %IPLINFO <option>"
Say " "
Say "VALID OPTIONS ARE 'ALL', 'IPL', 'VERsion'," ,
"'STOrage', 'CPU', 'IPA', 'SYMbols',"
Say " 'VMAp', 'PAGe', 'SMF', 'SUB'," ,
"'ASId', 'LPA', 'LNKlst' or 'LINklist' and 'APF'"
Say " "
Say "** 'ALL' is the default option"
Say "** OPTIONS may be abbreviated by using 3 or more characters"
Say " "
Say Copies('*',79)
If OPTION = '?' then Exit 0
Else exit 16
End
return

HEADING: /* Heading sub-routine */


Call CKWEB /* call CKWEB sub-routine */
Call RDATE 'TODAY' /* call RDATE sub-routine */
DAY = Word(RESULT,3) /* weekday from RDATE */
MMT = Substr(RESULT,1,2) /* MM from MM/DD/YYYY */
DDT = Substr(RESULT,4,2) /* DD from MM/DD/YYYY */
YYYYT = Substr(RESULT,7,4) /* YYYY from MM/DD/YYYY */
If DATEFMT = 'USA' then , /* USA format date? */
DATE = Substr(RESULT,1,10) /* date as MM/DD/YYYY */
If DATEFMT = 'EUR' then , /* EUR format date? */
DATE = DDT'/'MMT'/'YYYYT /* date as DD/MM/YYYY */
If DATEFMT = 'ISO' then , /* ISO format date? */
DATE = YYYYT'-'MMT'-'DDT /* date as YYYY-MM-DD */
JUL = Substr(RESULT,7,8) /* date as YYYY.DDD */
CURNNNNN = Substr(RESULT,16,5) /* date as NNNNN */
Queue Copies('*',79)
Queue Copies('*',15) || ,
Center('IPLINFO - SYSTEM INFORMATION FOR' GRSNAME,49) || ,
Copies('*',15)
Queue Copies('*',79)
Queue ' '
Queue 'Today is 'DAY DATE '('JUL'). The local time is 'TIME()'.'
Return

CKWEB: /* Create HTML needed for web page output sub-routine */


If ENV = 'OMVS' then do /* Are we under OMVS? */
Do CKWEB = __ENVIRONMENT.0 to 1 by -1 /* check env. vars */
If pos('HTTP_',__ENVIRONMENT.CKWEB) <> 0 then do /* web server */
Say 'Content-type: text/html'
Say ''
Say '<title>Mark''s MVS Utilities - IPLINFO</title>'
Say '<meta name="author" content="Mark Zelden -' ,
'mark@mzelden.com">'
Say '<meta name="description" content="' || ,
'IPLINFO -' OPTION 'option.' ,
'Last updated on' LASTUPD ||'. Written by' ,
'Mark Zelden. Mark''s MVS Utilities -' ,
'http://www.mzelden.com/mvsutil.html">'
Say '<meta http-equiv="pragma" content="no-cache">'
Say '<body BGCOLOR="#000000" TEXT="#00FFFF">'
Say '<pre>'
Leave /* exit loop */
End /* if pos */
End /* do CKWEB */
End
Return

COMMON: /* Control blocks needed by multiple routines */


CVT = C2d(Storage(10,4)) /* point to CVT */
CVTFLAG2 = Storage(D2x(CVT+377),1) /* CVT flag byte 2 */
CVTEXT2 = C2d(Storage(D2x(CVT + 328),4)) /* point to CVTEXT2 */
PRODNAME = Storage(D2x(CVT - 40),7) /* point to mvs version */
If Substr(PRODNAME,3,1) >= 3 then do /* HBB3310 ESA V3 & > */
CVTOSLV0 = Storage(D2x(CVT + 1264),1) /* Byte 0 of CVTOSLVL */
CVTOSLV1 = Storage(D2x(CVT + 1265),1) /* Byte 1 of CVTOSLVL */
CVTOSLV2 = Storage(D2x(CVT + 1266),1) /* Byte 2 of CVTOSLVL */
CVTOSLV3 = Storage(D2x(CVT + 1267),1) /* Byte 3 of CVTOSLVL */
CVTOSLV4 = Storage(D2x(CVT + 1268),1) /* Byte 4 of CVTOSLVL */
CVTOSLV5 = Storage(D2x(CVT + 1269),1) /* Byte 5 of CVTOSLVL */
CVTOSLV6 = Storage(D2x(CVT + 1270),1) /* Byte 6 of CVTOSLVL */
CVTOSLV7 = Storage(D2x(CVT + 1271),1) /* Byte 6 of CVTOSLVL */
End
If Bitand(CVTOSLV0,'08'x) = '08'x then , /* HBB4410 ESA V4 & > */
ECVT = C2d(Storage(D2x(CVT + 140),4)) /* point to CVTECVT */
FMIDNUM = Storage(D2x(CVT - 32),7) /* point to fmid */
JESCT = C2d(Storage(D2x(CVT + 296),4)) /* point to JESCT */
JESCTEXT = C2d(Storage(D2x(JESCT +100),4)) /* point to JESPEXT */
JESPJESN = Storage(D2x(JESCT + 28),4) /* name of primary JES */
CVTSNAME = Storage(D2x(CVT + 340),8) /* point to system name */
GRSNAME = Strip(CVTSNAME,'T') /* del trailing blanks */
CSD = C2d(Storage(D2x(CVT + 660),4)) /* point to CSD */
SMCA = Storage(D2x(CVT + 196),4) /* point to SMCA */
SMCA = Bitand(SMCA,'7FFFFFFF'x) /* zero high order bit */
SMCA = C2d(SMCA) /* convert to decimal */
ASMVT = C2d(Storage(D2x(CVT + 704),4)) /* point to ASMVT */
CVTSCPIN = D2x(CVT+832) /* point to SCPINFO */
If Bitand(CVTOSLV5,'08'x) = '08'x then do /* z/OS 1.10 and above */
ECVTSCPIN = D2x(ECVT+876) /* point to cur SCPINFO */
SCCB = C2d(Storage(ECVTSCPIN,4)) /* Service Call Cntl Blk*/
End
Else SCCB = C2d(Storage(CVTSCPIN,4)) /* Service Call Cntl Blk*/
RCE = C2d(Storage(D2x(CVT + 1168),4)) /* point to RCE */
MODEL = C2d(Storage(D2x(CVT - 6),2)) /* point to cpu model */
/*********************************************************************/
/* The CPU model is stored in packed decimal format with no sign, */
/* so to make the model printable, it needs to be converted back */
/* to hex. */
/*********************************************************************/
MODEL = D2x(MODEL) /* convert back to hex */
PCCAVT = C2d(Storage(D2x(CVT + 764),4)) /* point to PCCA vect tb*/
If Bitand(CVTOSLV1,'01'x) = '01'x then do /* OS/390 R2 and above */
ECVTIPA = C2d(Storage(D2x(ECVT + 392),4)) /* point to IPA */
IPASCAT = Storage(D2x(ECVTIPA + 224),63) /* SYSCAT card image */
End
zARCH = 1 /* default ARCHLVL */
If Bitand(CVTOSLV2,'01'x) = '01'x then do /* OS/390 R10 and above */
FLCARCH = Storage('A3',1) /* FLCARCH in PSA */
If C2d(FLCARCH) <> 0 then zARCH=2 /* non-zero is z/Arch. */
End
Return

IPL: /* IPL information sub-routine */


Queue ' '
/*********************************************************************/
/* The IPL date is stored in packed decimal format - so to make */
/* the date printable, it needs to be converted back to hex and */
/* the packed sign needs to be removed. */
/*********************************************************************/
/* Converting binary fields to time of day format is described */
/* in the MVS SMF manual. */
/*********************************************************************/
IPLTIME = C2d(Storage(D2x(SMCA + 336),4)) /* IPL Time - binary */
IPLDATE = C2d(Storage(D2x(SMCA + 340),4)) /* IPL Date - 0CYYDDDF */
If IPLDATE >= 16777231 then do /* is C = 1 ? */
IPLDATE = D2x(IPLDATE) /* convert back to hex */
IPLDATE = Substr(IPLDATE,2,5) /* keep YYDDD */
IPLDATE = '20'IPLDATE /* use 21st century date*/
End
Else do
IPLDATE = D2x(IPLDATE) /* convert back to hex */
IPLDATE = Left(IPLDATE,5) /* keep YYDDD */
IPLDATE = '19'IPLDATE /* use 20th century date*/
End
IPLYYYY = Substr(IPLDATE,1,4) /* YYYY portion of date */
IPLDDD = Substr(IPLDATE,5,3) /* DDD portion of date */
Call RDATE IPLYYYY IPLDDD /* call RDATE subroutine*/
IPLDAY = Word(RESULT,3) /* weekday from RDATE */
MMI = Substr(RESULT,1,2) /* MM from MM/DD/YYYY */
DDI = Substr(RESULT,4,2) /* DD from MM/DD/YYYY */
YYYYI = Substr(RESULT,7,4) /* YYYY from MM/DD/YYYY */
If DATEFMT = 'USA' then , /* USA format date? */
IPLDATE = Substr(RESULT,1,10) /* date as MM/DD/YYYY */
If DATEFMT = 'EUR' then , /* EUR format date? */
IPLDATE = DDI'/'MMI'/'YYYYI /* date as DD/MM/YYYY */
If DATEFMT = 'ISO' then , /* ISO format date? */
IPLDATE = YYYYI'-'MMI'-'DDI /* date as YYYY-MM-DD */
IPLJUL = Substr(RESULT,7,8) /* date as YYYY.DDD */
IPLNNNNN = Substr(RESULT,16,5) /* date as NNNNN */
IPLHH = Right(IPLTIME%100%3600,2,'0') /* IPL hour */
IPLMM = Right(IPLTIME%100//3600%60,2,'0') /* IPL minute */
IPLSS = Right(IPLTIME%100//60,2,'0') /* IPL seconds */
IPLTIME = IPLHH':'IPLMM':'IPLSS /* time in HH:MM:SS */
/* */
ASMFLAG2 = Storage(D2x(ASMVT + 1),1) /* point to ASMFLAG2 */
If Bitand(ASMFLAG2,'08'x) = '08'x then , /* Check ASMQUICK bit */
IPLCLPA = 'without CLPA' /* bit on - no CLPA */
Else IPLCLPA = 'with CLPA' /* bit off - CLPA */
RESUCB = C2d(Storage(D2x(JESCT + 4),4)) /* point to SYSRES UCB */
IPLVOL = Storage(D2x(RESUCB + 28),6) /* point to IPL volume */
If Bitand(CVTOSLV1,'20'x) <> '20'x then , /* Below HBB5510 ESA V5 */
IPLADDR = Storage(D2x(RESUCB + 13),3) /* point to IPL address */
Else do
CVTSYSAD = C2d(Storage(D2x(CVT + 48),4)) /* point to UCB address */
IPLADDR = Storage(D2x(CVTSYSAD + 4),2) /* point to IPL UCB */
IPLADDR = C2x(IPLADDR) /* convert to EBCDIC */
End
SMFNAME = Storage(D2x(SMCA + 16),4) /* point to SMF name */
SMFNAME = Strip(SMFNAME,'T') /* del trailing blanks */
AMCBS = C2d(Storage(D2x(CVT + 256),4)) /* point to AMCBS */
If Bitand(CVTOSLV2,'80'x) <> '80'x then do /*Use CAXWA B4 OS/390 R4*/
ACB = C2d(Storage(D2x(AMCBS + 8),4)) /* point to ACB */
CAXWA = C2d(Storage(D2x(ACB + 64),4)) /* point to CAXWA */
MCATDSN = Storage(D2x(CAXWA + 52),44) /* master catalog dsn */
MCATDSN = Strip(MCATDSN,'T') /* remove trailing blnks*/
MCATUCB = C2d(Storage(D2x(CAXWA + 28),4)) /* point to mcat UCB */
MCATVOL = Storage(D2x(MCATUCB + 28),6) /* master catalog VOLSER*/
End
Else do /* OS/390 R4 and above */
MCATDSN = Strip(Substr(IPASCAT,11,44)) /* master catalog dsn */
MCATVOL = Substr(IPASCAT,1,6) /* master catalog VOLSER*/
IPASCANL = Storage(d2x(ECVTIPA+231),1) /* mcat alias level */
IPASCTYP = Storage(d2x(ECVTIPA+230),1) /* mcat catalog type */
AMCBSFLG = Storage(D2x(AMCBS + 96),1) /* AMCBS flags */
AMCBSALV = C2d(Storage(D2x(AMCBS + 155),1)) /* AMCBS - alias level */
If IPASCANL = ' ' then IPASCANL = 1 /* SYSCAT col 17 blank / dflt */
If IPASCTYP = ' ' then IPASCTYP = 1 /* SYSCAT col 16 blank / dflt */
CTYP.0 = 'VSAM'
CTYP.1 = 'ICF. SYS%-SYS1 conversion was not active at IPL time'
CTYP.2 = 'ICF. SYS%-SYS1 conversion was active at IPL time'
End
Queue 'The last IPL was 'IPLDAY IPLDATE '('IPLJUL')' ,
'at 'IPLTIME' ('CURNNNNN - IPLNNNNN' days ago).'
Queue 'The IPL was done 'IPLCLPA'.'
Queue 'The system IPL address was 'IPLADDR' ('IPLVOL').'
If Bitand(CVTOSLV0,'08'x) = '08'x then do /* HBB4410 ESA V4 1 & > */
ECVTSPLX = Storage(D2x(ECVT+8),8) /* point to SYSPLEX name*/
ECVTLOAD = Storage(D2x(ECVT+160),8) /* point to LOAD PARM */
IPLPARM = Strip(ECVTLOAD,'T') /* del trailing blanks */
SEPPARM = Substr(IPLPARM,1,4) Substr(IPLPARM,5,2),
Substr(IPLPARM,7,1) Substr(IPLPARM,8,1)
SEPPARM = Strip(SEPPARM,'T') /* del trailing blanks */
Queue 'The IPL LOAD PARM used was 'IPLPARM' ('SEPPARM').'
If Bitand(CVTOSLV1,'20'x) = '20'x then do /* HBB5510 ESA V5 & > */
CVTIXAVL = C2d(Storage(D2x(CVT+124),4)) /* point to IOCM */
IOCIOVTP = C2d(Storage(D2x(CVTIXAVL+208),4)) /* IOS Vector Table */
CDA = C2d(Storage(D2x(IOCIOVTP+24),4)) /* point to CDA */
End
CVTTZ = Storage(D2x(CVT + 304),4) /* point to cvttz */
CKTZBYTE = Storage(D2x(CVT + 304),1) /* need to chk 1st byte */
If bitand(CKTZBYTE,'80'x) = '80'x then , /* chk for negative */
CVTTZ = C2d(CVTTZ,4) /* negative offset C2d */
Else CVTTZ = C2d(CVTTZ) /* postitive offset C2d */
CVTTZ = CVTTZ * 1.048576 / 3600 /* convert to hours */
If Format(CVTTZ,3,1) = Format(CVTTZ,3,0) , /* don't use decimal if */
then CVTTZ = Strip(Format(CVTTZ,3,0)) /* not needed */
Else CVTTZ = Strip(Format(CVTTZ,3,1)) /* display 1 decimal */
Queue 'The local time offset from GMT time is' CVTTZ 'hours.'
If Bitand(CVTOSLV1,'10'x) = '10'x then do /* HBB5520 ESA V5.2 & > */
ECVTHDNM = Storage(D2x(ECVT+336),8) /* point to hardware nam*/
ECVTLPNM = Storage(D2x(ECVT+344),8) /* point to LPAR name */
If Bitand(CVTOSLV2,'01'x) = '01'x then do /* OS/390 R10 & above */
MIFID = C2d(Storage(D2X(CDA+252),1)) /* MIF ID in decimal */
MIFID = D2x(MIFID) /* MIF ID in hex */
If Bitand(CVTOSLV3,'04'x) = '04'x then do /* z/OS 1.4 and above*/
IOCCSSID = C2d(Storage(d2x(CVTIXAVL+275),1))
IOCCSSID = D2x(IOCCSSID) /* CSS ID in hex */
End
If zARCH = 2 then , /* z/Architechture */
Queue 'The system is running in z/Architecture mode' ,
'(ARCHLVL = 2).'
Else , /* ESA/390 mode */
Queue 'The system is running in ESA/390 mode (ARCHLVL = 1).'
End /* If Bitand(CVTOSLV2,'01'x) = '01'x */
If ECVTHDNM <> ' ' & ECVTLPNM <> ' ' then do
CSDPLPN = C2d(Storage(D2x(CSD + 252),1)) /* point to LPAR #*/
/* CSDPLPN not valid for z990 (T-REX) or z890 for LPAR number */
CPOFF = 0 /* init offset to next PCCA entry */
PCCA = 0 /* init PCCA to 0 */
Do until PCCA <> 0 /* do until we find a valid PCCA */
PCCA = C2d(Storage(D2x(PCCAVT + CPOFF),4)) /* point to PCCA */
If PCCA <> 0 then do
LPAR_# = X2d(Storage(D2x(PCCA + 6),2)) /* LPAR # in hex */
LPAR_# = D2x(LPAR_#) /* display as hex */
End /* if PCCA <> 0 */
Else CPOFF = CPOFF + 4 /* bump up offset for next PCCA */
End /* do until PCCA <> 0 */
If Bitand(CVTOSLV2,'01'x) = '01'x then do /* OS/390 R10 & > */
Queue 'The Processor name is' Strip(ECVTHDNM)'.' ,
'The LPAR name is' Strip(ECVTLPNM)'.'
If Bitand(CVTOSLV3,'04'x) = '04'x then /* z/OS 1.4 and above*/
Queue ' ' Strip(ECVTLPNM) 'is (HMC defined) LPAR ID =' ,
LPAR_#', MIF ID =' mifid 'and CSS ID = 'IOCCSSID'.'
Else ,
Queue ' ' Strip(ECVTLPNM) 'is (HMC defined) LPAR ID =' ,
LPAR_# 'and MIF ID =' mifid'.'
Queue ' ' Strip(ECVTLPNM) 'is PR/SM partition number' ,
CSDPLPN' (internal value from the CSD).'
End /* If Bitand(CVTOSLV2,'01'x) = '01'x */
Else ,
Queue 'The Processor name is' Strip(ECVTHDNM)'.' ,
'The LPAR name is' Strip(ECVTLPNM)' (LPAR #'CSDPLPN').'
End /* If ECVTHDNM <> ' ' & ECVTLPNM <> ' ' */
Else if ECVTHDNM <> ' ' then ,
Queue 'The Processor name is' Strip(ECVTHDNM)'.'
If Bitand(CVTOSLV1,'20'x) = '20'x , /* HBB5510 ESA V5 & above */
& ECVTSPLX <> 'LOCAL' then do /* and not a local sysplex */
JESDSNID = X2d(Storage(D2x(JESCTEXT+120),2)) /*ID for temp dsns*/
Queue 'The sysplex name is' Strip(ECVTSPLX)'. This was system' ,
'number' Format(JESDSNID) 'added to the sysplex.'
End /* If Bitand(CVTOSLV1,'20'x) = '20'x */
Else queue 'The sysplex name is' Strip(ECVTSPLX)'.'
End /* If Bitand(CVTOSLV1,'10'x) = '10'x */
End
Queue 'The GRS system id (SYSNAME) is 'GRSNAME'.'
If Bitand(CVTOSLV1,'10'x) = '10'x then do /* HBB5520 ESA V5.2 & > */
ECVTGMOD = C2d(Storage(D2x(ECVT + 266),1)) /* GRS mode */
GMOD.0 = "NONE" /* Stem for GRS mode: ECVTGNON EQU 0 */
GMOD.1 = "RING" /* Stem for GRS mode: ECVTGRNG EQU 1 */
GMOD.2 = "STAR" /* Stem for GRS mode: ECVTGSTA EQU 2 */
Queue ' The GRS mode is' GMOD.ECVTGMOD' (NONE, RING or STAR).'
End
Queue 'The SMF system id (SID) is 'SMFNAME'.'
If Bitand(CVTOSLV1,'20'x) <> '20'x then do /* Below HBB5510 ESA V5 */
IOCON = Storage(D2x(CVTEXT2 + 6),2) /* HCD IODFxx or MVSCP*/
/* IOCONFIG ID=xx */
Queue 'The currently active IOCONFIG or HCD IODF is 'IOCON'.'
End
Else do
IODF = Storage(D2X(CDA+32),44) /* point to IODF name */
IODF = Strip(IODF,'T') /* del trailing blanks*/
CONFIGID = Storage(D2X(CDA+92),8) /* point to CONFIG */
EDT = Storage(D2X(CDA+104),2) /* point to EDT */
IOPROC = Storage(D2X(CDA+124),8) /* point to IODF Proc */
IODATE = Storage(D2X(CDA+156),8) /* point to IODF date */
IOTIME = Storage(D2X(CDA+164),8) /* point to IODF time */
IODESC = Storage(D2X(CDA+172),16) /* point to IODF desc */
Queue 'The currently active IODF data set is 'IODF'.'
Queue ' Configuration ID =' CONFIGID ' EDT ID =' EDT
If Substr(IOPROC,1,1) <> '00'x & ,
Substr(IOPROC,1,1) <> '40'x then do /* is token there? */
Queue ' TOKEN: Processor Date Time Description'
Queue ' 'IOPROC' 'IODATE' 'IOTIME' 'IODESC
End
End
Queue 'The Master Catalog is 'MCATDSN' on 'MCATVOL'.'
If Bitand(CVTOSLV2,'80'x) = '80'x then do /* OS/390 R4 and above */
Queue ' The catalog alias level was 'IPASCANL' at IPL time.'
Queue ' The catalog alias level is currently' AMCBSALV'.'
Queue ' The catalog type is 'CTYP.IPASCTYP'.'
If Bitand(AMCBSFLG,'40'x) = '40'x then ,
Queue ' SYS%-SYS1 conversion is currently active.'
Else ,
Queue ' SYS%-SYS1 conversion is not currently active.'
End
/*If OPTION = 'IPL' then interpret call 'VERSION' */ /* incl version*/
Return

VERSION: /* Version information sub-routine */


Queue ' '
Call SUB 'FINDJES' /* call SUB routine with FINDJES option */
If JESPJESN = 'JES3' then do /* Is this JES3? */
If ENV = 'OMVS' then do /* running under Unix System Services */
JES3FMID = Storage(D2x(JESSSVT+644),8) /* JES3 FMID */
Select /* determine JES3 version from FMID */
When JES3FMID = 'HJS5521' then JESLEV = 'SP 5.2.1'
When JES3FMID = 'HJS6601' then JESLEV = 'OS 1.1.0'
When JES3FMID = 'HJS6604' then JESLEV = 'OS 2.4.0'
When JES3FMID = 'HJS6606' then JESLEV = 'OS 2.6.0'
When JES3FMID = 'HJS6608' then JESLEV = 'OS 2.8.0'
When JES3FMID = 'HJS6609' then JESLEV = 'OS 2.9.0'
When JES3FMID = 'HJS7703' then JESLEV = 'OS 2.10.0'
When JES3FMID = 'HJS7705' then JESLEV = 'z 1.2.0'
When JES3FMID = 'HJS7707' then JESLEV = 'z 1.4.0'
When JES3FMID = 'HJS7708' then JESLEV = 'z 1.5.0'
When JES3FMID = 'HJS7720' then JESLEV = 'z 1.7.0'
When JES3FMID = 'HJS7730' then JESLEV = 'z 1.8.0'
When JES3FMID = 'HJS7740' then JESLEV = 'z 1.9.0'
When JES3FMID = 'HJS7750' then JESLEV = 'z 1.10.0'
When JES3FMID = 'HJS7760' then JESLEV = 'z 1.11.0'
When JES3FMID = 'HJS7770' then JESLEV = 'z 1.12.0'
When JES3FMID = 'HJS7780' then JESLEV = 'z 1.13.0'
When JES3FMID = 'HJS7790' then JESLEV = 'z 2.1.0'
When JES3FMID = 'HJS77A0' then JESLEV = 'z 2.2.0'
When JES3FMID = 'HJS77B0' then JESLEV = 'z 2.3.0'
Otherwise JESLEV = JES3FMID /* if not in tbl, use FMID as ver */
End /* select */
JESNODE = '*not_avail*' /* can't do under USS */
End /* if env = 'omvs' */
Else do /* if not running under Unix System Services, use TSO VARs */
JESLEV = SYSVAR('SYSJES') /* TSO/E VAR for JESLVL */
JESNODE = SYSVAR('SYSNODE') /* TSO/E VAR for JESNODE*/
End
End
Else do /* JES2 */
JESLEV = Strip(Storage(D2x(JESSUSE),8)) /* JES2 Version */
/* offset in $HCCT - CCTNDENM */
Select
When Substr(JESLEV,1,8) == 'z/OS 2.3' | , /* z/OS 2.3 */
Substr(JESLEV,1,8) == 'z/OS 2.2' then, /* z/OS 2.2 */
JESNODE = Strip(Storage(D2x(JESSUS2+664),8)) /* JES2 NODE */
When Substr(JESLEV,1,8) == 'z/OS 2.1' | , /* z/OS 2.1 */
Substr(JESLEV,1,8) == 'z/OS1.13' | , /* z/OS 1.13 */
Substr(JESLEV,1,8) == 'z/OS1.12' | , /* z/OS 1.12 */
Substr(JESLEV,1,8) == 'z/OS1.11' then, /* z/OS 1.11 */
JESNODE = Strip(Storage(D2x(JESSUS2+656),8)) /* JES2 NODE */
When Substr(JESLEV,1,8) == 'z/OS1.10' | , /* z/OS 1.10 */
Substr(JESLEV,1,8) == 'z/OS 1.9' then, /* z/OS 1.9 */
JESNODE = Strip(Storage(D2x(JESSUS2+708),8)) /* JES2 NODE */
When Substr(JESLEV,1,8) == 'z/OS 1.8' then, /* z/OS 1.8 */
JESNODE = Strip(Storage(D2x(JESSUS2+620),8)) /* JES2 NODE */
When Substr(JESLEV,1,8) == 'z/OS 1.7' then, /* z/OS 1.7 */
JESNODE = Strip(Storage(D2x(JESSUS2+616),8)) /* JES2 NODE */
When Substr(JESLEV,1,8) == 'z/OS 1.5' | , /* z/OS 1.5 & 1.6 */
Substr(JESLEV,1,8) == 'z/OS 1.4' then /* z/OS 1.4 */
JESNODE = Strip(Storage(D2x(JESSUS2+532),8)) /* JES2 NODE */
When Substr(JESLEV,1,7) == 'OS 2.10' | , /* OS/390 2.10 and */
Substr(JESLEV,1,8) == 'z/OS 1.2' then, /* z/OS 1.2 */
JESNODE = Strip(Storage(D2x(JESSUS2+452),8)) /* JES2 NODE */
When Substr(JESLEV,1,6) == 'OS 1.1' | , /* OS/390 1.1 or */
Substr(JESLEV,1,4) == 'SP 5' then , /* ESA V5 JES2 */
JESNODE = Strip(Storage(D2x(JESSUS2+336),8)) /* JES2 NODE */
When Substr(JESLEV,1,5) == 'OS 1.' | , /* OS/390 1.2 */
Substr(JESLEV,1,5) == 'OS 2.' then, /* through OS/390 2.9 */
JESNODE = Strip(Storage(D2x(JESSUS2+372),8)) /* JES2 NODE */
Otherwise , /* Lower than ESA V5 */
If ENV = 'OMVS' then JESNODE = '*not_avail*'
else JESNODE = SYSVAR('SYSNODE') /* TSO/E VAR for JESNODE*/
End /* select */
End /* else do */
/* */
CVTVERID = Storage(D2x(CVT - 24),16) /* "user" software vers.*/
CVTRAC = C2d(Storage(D2x(CVT + 992),4)) /* point to RACF CVT */
RCVT = CVTRAC /* use RCVT name */
RCVTID = Storage(D2x(RCVT),4) /* point to RCVTID */
/* RCVT, ACF2, or RTSS */
SECNAM = RCVTID /* ACF2 SECNAME = RCVTID*/
If RCVTID = 'RCVT' then SECNAM = 'RACF' /* RCVT is RACF */
If RCVTID = 'RTSS' then SECNAM = 'Top Secret' /* RTSS is Top Secret */
RACFVRM = Storage(D2x(RCVT + 616),4) /* RACF Ver/Rel/Mod */
RACFVER = Substr(RACFVRM,1,1) /* RACF Version */
RACFREL = Substr(RACFVRM,2,2) /* RACF Release */
If Bitand(CVTOSLV2,'01'x) <> '01'x then , /* below OS/390 R10 */
RACFREL = Format(RACFREL) /* Remove leading 0 */
RACFMOD = Substr(RACFVRM,4,1) /* RACF MOD level */
RACFLEV = RACFVER || '.' || RACFREL || '.' || RACFMOD
If RCVTID = 'RCVT' | RCVTID = 'RTSS' then ,
RCVTDSN = Strip(Storage(D2x(RCVT + 56),44)) /* RACF prim dsn or */
/* TSS Security File */
If SECNAM = 'ACF2' then do
SSCVT = C2d(Storage(D2x(JESCT+24),4)) /* point to SSCVT */
Do while SSCVT <> 0
SSCTSNAM = Storage(D2x(SSCVT+8),4) /* subsystem name */
If SSCTSNAM = 'ACF2' then do
ACCVT = C2d(Storage(D2x(SSCVT + 20),4)) /* ACF2 CVT */
ACCPFXP = C2d(Storage(D2x(ACCVT - 4),4)) /* ACCVT prefix */
ACCPIDL = C2d(Storage(D2x(ACCPFXP + 8),2)) /* Len ident area */
LEN_ID = ACCPIDL-4 /* don't count ACCPIDL and ACCPIDO in len */
ACCPIDS = Strip(Storage(D2x(ACCPFXP + 12),LEN_ID)) /*sys ident*/
ACF2DSNS = C2d(Storage(D2x(ACCVT + 252) ,4)) /* ACF2 DSNs */
ACF2DNUM = C2d(Storage(D2x(ACF2DSNS + 16),2)) /* # OF DSNs */
Leave
End
SSCVT = C2d(Storage(D2x(SSCVT+4),4)) /* next sscvt or zero */
End /* Do while SSCVT <> 0 */
End
/* */
CVTDFA = C2d(Storage(D2x(CVT + 1216),4)) /* point to DFP ID table*/
DFAPROD = C2d(Storage(D2x(CVTDFA +16),1)) /* point to product byte*/
If DFAPROD = 0 then do /* DFP not DF/SMS */
DFAREL = C2x(Storage(D2x(CVTDFA+2),2)) /* point to DFP release */
DFPVER = Substr(DFAREL,1,1) /* DFP Version */
DFPREL = Substr(DFAREL,2,1) /* DFP Release */
DFPMOD = Substr(DFAREL,3,1) /* DFP Mod Lvl */
DFPRD = 'DFP' /* product is DFP */
DFLEV = DFPVER || '.' || DFPREL || '.' || DFPMOD
End
Else do /* DFSMS not DFP */
DFARELS = C2x(Storage(D2x(CVTDFA+16),4)) /* point to DF/SMS rel */
DFAVER = X2d(Substr(DFARELS,3,2)) /* DF/SMS Version */
DFAREL = X2d(Substr(DFARELS,5,2)) /* DF/SMS Release */
DFAMOD = X2d(Substr(DFARELS,7,2)) /* DF/SMS Mod Lvl */
DFPRD = 'DFSMS' /* product is DF/SMS */
DFLEV = DFAVER || '.' || DFAREL || '.' || DFAMOD
If DFAPROD = 2 then DFLEV = 'OS/390' DFLEV
If DFAPROD = 3 then do
DFLEV = 'z/OS' DFLEV
/* Next section of code doesn't work because CRT is in key 5 */
/*
CVTCBSP = C2d(Storage(D2x(CVT + 256),4)) /* point to AMCBS */
CRT = C2d(Storage(D2x(CVTCBSP + 124),4)) /* point to CRT */
CRTFMID = Storage(D2x(CRT + 472),7) /* DFSMS FMID */
*/
End /* if DFAPROD = 3 */
JESSMSIB = C2d(Storage(D2x(JESCTEXT+84),4)) /* point to SMS SSIB */
IGDSSIVT = C2d(Storage(D2x(JESSMSIB+32),4)) /* SMS vector table */
IGDSMS = Storage(D2x(IGDSSIVT+132),2) /* IGDSMSxx suffix */
SMSACDS = Strip(Storage(D2x(IGDSSIVT+44),44)) /* ACDS */
SMSCMDS = Strip(Storage(D2x(IGDSSIVT+88),44)) /* COMMDS */
End
/* */
CVTTVT = C2d(Storage(D2x(CVT + 156),4)) /* point to TSO vect tbl*/
TSVTLVER = Storage(D2x(CVTTVT+100),1) /* point to TSO Version */
TSVTLREL = Storage(D2x(CVTTVT+101),2) /* point to TSO Release */
TSVTLREL = Format(TSVTLREL) /* Remove leading 0 */
TSVTLMOD = Storage(D2x(CVTTVT+103),1) /* point to TSO Mod Lvl */
TSOLEV = TSVTLVER || '.' || TSVTLREL || '.' || TSVTLMOD
/* */
CHKVTACT = Storage(D2x(CVTEXT2+64),1) /* VTAM active flag */
If bitand(CHKVTACT,'80'x) = '80'x then do /* vtam is active */
CVTATCVT = C2d(Storage(D2x(CVTEXT2 + 65),3)) /* point to VTAM AVT */
ISTATCVT = C2d(Storage(D2x(CVTATCVT + 0),4)) /* point to VTAM CVT */
ATCVTLVL = Storage(D2x(ISTATCVT + 0),8) /* VTAM Rel Lvl VOVRP */
VTAMVER = Substr(ATCVTLVL,3,1) /* VTAM Version V */
VTAMREL = Substr(ATCVTLVL,4,1) /* VTAM Release R */
VTAMMOD = Substr(ATCVTLVL,5,1) /* VTAM Mod Lvl P */
If VTAMMOD = ' ' then VTAMLEV = VTAMVER || '.' || VTAMREL
else VTAMLEV = VTAMVER || '.' || VTAMREL || '.' || VTAMMOD
/* */
ATCNETID = Strip(Storage(D2x(ISTATCVT + 2080),8)) /* VTAM NETID */
ATCNQNAM = Strip(Storage(D2x(ISTATCVT + 2412),17)) /* VTAM SSCPNAME*/
VTAM_ACTIVE = 'YES'
End /* if bitand (vtam is active) */
Else VTAM_ACTIVE = 'NO'
If Bitand(CVTOSLV1,'80'x) = '80'x then do /* HBB4430 ESA V4.3 & > */
ECVTTCP = D2x(ECVT + 176) /* TCPIP */
TSAB = C2d(Storage(ECVTTCP,4)) /* point to TSAB */
TSABLEN = C2d(Storage(D2x(TSAB+4),2)) /* Length of TSAB */
TSEBNUM = (TSABLEN - 64) / 128 /* Number of TSEBs */
TCPANUM = 0 /* counter of act TSEBs */
TCP_ACTIVE = 'NO' /* Init active flag */
Do SCNTSEBS = 1 to TSEBNUM /* Scan TSEB loop */
TSEB = TSAB + 64 + (SCNTSEBS-1)*128
TCPASID = C2x(Storage(D2x(TSEB + 56),2)) /* asid or zero */
If TCPASID <> 0 then do /* active asid */
TCP_ACTIVE = 'YES'
TCPANUM = TCPANUM + 1 /* add 1 to active count */
TCPSTATUS = Storage(D2x(TSEB + 8),1)
TCPNAME.TCPANUM = Storage(D2x(TSEB + 16),8)
TCPNUM.TCPANUM = C2x(Storage(D2x(TSEB + 24),1))
TCPVER.TCPANUM = C2x(Storage(D2x(TSEB + 26),2))
TCPASID.TCPANUM = TCPASID '('Right(X2d(TCPASID),4)')'
Select
When Bitand(TCPSTATUS,'80'x) = '80'x then TCPST = 'Active'
When Bitand(TCPSTATUS,'40'x) = '40'x then TCPST = 'Terminating'
When Bitand(TCPSTATUS,'20'x) = '20'x then TCPST = 'Down'
When Bitand(TCPSTATUS,'10'x) = '10'x then TCPST = 'Stopped'
Otherwise say 'Bad TCPSTATUS! Contact Mark Zelden' TCPSTATUS
End /* select */
TCPST.TCPANUM = TCPST
End /* If TCPASID <> 0 */
End /* Do SCNTSEBS = 1 to TSEBNUM */
End /* If Bitand(CVTOSLV1,'80'x) = '80'x */
If Bitand(CVTOSLV1,'02'x) <> '02'x then , /* Below OS/390 R1 */
Queue 'The MVS version is 'PRODNAME' - FMID 'FMIDNUM'.'
Else do
PRODNAM2 = Storage(D2x(ECVT+496),16) /* point to product name*/
PRODNAM2 = Strip(PRODNAM2,'T') /* del trailing blanks */
VER = Storage(D2x(ECVT+512),2) /* point to version */
REL = Storage(D2x(ECVT+514),2) /* point to release */
MOD = Storage(D2x(ECVT+516),2) /* point to mod level */
VRM = VER'.'REL'.'MOD
Queue 'The OS version is 'PRODNAM2 VRM' - FMID' ,
FMIDNUM' ('PRODNAME').'
End
If CVTVERID <> ' ' then ,
Queue 'The "user" system software version is' Strip(CVTVERID,'T')'.'
Queue 'The primary job entry subsystem is 'JESPJESN'.'
Queue 'The 'JESPJESN 'level is 'JESLEV'.' ,
'The 'JESPJESN 'node name is 'JESNODE'.'
If SECNAM <> 'RACF' | RACFVRM < '2608' then do
Queue 'The security software is 'SECNAM'.'
If SECNAM = 'ACF2' then do
Queue 'The ACF2 level is' ACCPIDS'.'
Queue ' There are 'ACF2DNUM' ACF2 data sets in use:'
Do ADSNS = 1 to ACF2DNUM
ADSOFF = ACF2DSNS + 24 + (ADSNS-1)*64
ACF2TYPE = Storage(D2x(ADSOFF) , 8)
ACF2DSN = Storage(D2x(ADSOFF + 16),44)
Queue ' ' ACF2TYPE '-' ACF2DSN
End
End /* if secname = 'ACF2' */
If Bitand(CVTOSLV6,'40'x) = '40'x then nop /* z/OS 2.2 and above */
Else Queue ' The RACF level is 'RACFLEV'.' /*dont show racflev*/
If SECNAM = 'Top Secret' then ,
Queue ' The TSS Security File data set is' RCVTDSN'.'
If SECNAM = 'RACF' then ,
Queue ' The RACF primary data set is' RCVTDSN'.'
End
Else do
/* RACF system */
RCVTDSDT = C2d(Storage(D2x(RCVT + 224),4)) /* point to RACFDSDT*/
DSDTNUM = C2d(Storage(D2x(RCVTDSDT+4),4)) /* num RACF dsns */
DSDTPRIM = Storage(D2x(RCVTDSDT+177),44) /* point to prim ds */
DSDTPRIM = Strip(DSDTPRIM,'T') /* del trail blanks */
DSDTBACK = Storage(D2x(RCVTDSDT+353),44) /* point to back ds */
DSDTBACK = Strip(DSDTBACK,'T') /* del trail blanks */
If Bitand(CVTOSLV6,'40'x) = '40'x then do /* z/OS 2.2 and above */
Queue 'The security software is' Word(PRODNAM2,1) ,
'Security Server (RACF).'
Queue 'The RACF level is' PRODNAM2 VRM || '.'
End
Else do
Queue 'The security software is' Word(PRODNAM2,1) ,
'Security Server (RACF).' ,
'The FMID is HRF' || RACFVRM || '.'
End
If DSDTNUM = 1 then do
Queue ' The RACF primary data set is' DSDTPRIM'.'
Queue ' The RACF backup data set is' DSDTBACK'.'
End
Else do
Queue ' RACF is using a split database. There are' DSDTNUM ,
'pairs of RACF data sets:'
RDTOFF = 0 /* init cur offset to 0 */
DSDTENTY_SIZE = 352 /* dsdtenty size */
Do RDSNS = 1 to DSDTNUM
DSDTPRIM = Storage(D2x(RCVTDSDT+177+RDTOFF),44) /* prim dsn */
DSDTPRIM = Strip(DSDTPRIM,'T') /* del blnks*/
DSDTBACK = Storage(D2x(RCVTDSDT+353+RDTOFF),44) /* bkup dsn */
DSDTBACK = Strip(DSDTBACK,'T') /* del blnks*/
RDTOFF = RDTOFF + DSDTENTY_SIZE /* next tbl entry */
Queue ' Primary #'RDSNS' - ' DSDTPRIM
Queue ' Backup #'RDSNS' - ' DSDTBACK
End /* do RDSNS = 1 to DSDTNUM */
End
End /* else do */
Queue 'The' DFPRD 'level is' DFLEV'.'
If DFPRD = 'DFSMS' then do
Queue ' The SMS parmlib member is IGDSMS'igdsms'.'
Queue ' The SMS ACDS data set name is' SMSACDS'.'
Queue ' The SMS COMMDS data set name is' SMSCMDS'.'
End
Queue 'The TSO level is 'TSOLEV'.'
If SYSISPF = 'ACTIVE' then do /* is ISPF active? */
Address ISPEXEC "VGET ZISPFOS" /* yes, is it OS?390? */
If RC = 0 then do /* yes, get OS/390 var */
ISPFLEV = Strip(Substr(ZISPFOS,10,15)) /* only need version */
Address ISPEXEC "VGET ZENVIR" /* ispf internal rel var*/
ISPFLEVI = Substr(ZENVIR,1,8) /* internal ISPF release*/
Queue 'The ISPF level is 'ISPFLEV' ('ISPFLEVI').'
End /* if RC */
Else do /* not OS/390 - use old variables */
Address ISPEXEC "VGET ZPDFREL" /* get pdf release info */
ISPFLEV = Substr(ZENVIR,6,3) /* ISPF level */
PDFLEV = Substr(ZPDFREL,5,3) /* PDF level */
Queue 'The ISPF level is 'ISPFLEV'. The PDF level is' PDFLEV'.'
End /* else do */
End /* if SYSISPF */
If VTAM_ACTIVE = 'YES' then do
Queue 'The VTAM level is 'VTAMLEV'.'
Queue ' The NETID is' ATCNETID'. The SSCPNAME is' ATCNQNAM'.'
End /* if VTAM_ACTIVE = YES */
Else Queue 'The VTAM level is not available - VTAM is not active.'
If Bitand(CVTOSLV1,'80'x) = '80'x then do /* HBB4430 ESA V4.3 & > */
If TCP_ACTIVE = 'YES' then do
Queue 'The TCP/IP stack is active. ',
'There are 'TCPANUM' active TSEBs out of 'TSEBNUM'.'
Queue ' SI Proc Vers ASID ( dec) Status'
Queue ' -- -------- ---- ---- ------ ------'
Do LSI = 1 to TCPANUM
Queue ' 'Right(TCPNUM.LSI,2)' 'TCPNAME.LSI' 'TCPVER.LSI' ',
TCPASID.LSI' 'TCPST.LSI
End
End /* if TCP_ACTIVE = YES */
Else Queue 'The TCP level is not available - TCP is not active.'
End /* If Bitand(CVTOSLV1,'80'x) = '80'x */
Return

STOR: /* Storage information sub-routine */


Queue ' '
CVTRLSTG = C2d(Storage(D2x(CVT + 856),4)) /* point to store at IPL*/
CVTRLSTG = CVTRLSTG/1024 /* convert to Megabytes */
If zARCH <> 2 then do /* not valid in 64-bit */
CVTEORM = C2d(Storage(D2x(CVT + 312),4)) /* potential real high */
CVTEORM = (CVTEORM+1)/1024/1024 /* convert to Megabytes */
ESTOR = C2d(Storage(D2x(RCE + 160),4)) /* point to ESTOR frames*/
ESTOR = ESTOR*4/1024 /* convert to Megabytes */
End
/**********************************************************/
/* At z/OS 2.1 CVTRLSTG was not always correct. The code */
/* below gets the value from the RSM Internal Table */
/* field 'RITTOTALONLINESTORAGEATIPL'. */
/* The RIT is documented in the MVS Data Areas manual */
/* - This was a bug fixed by APAR OA48094 */
/**********************************************************/
/*
If Bitand(CVTOSLV6,'80'x) = '80'x then do /* z/OS 2.1 and above */
CVTPVTP = C2d(Storage(D2x(CVT+356),4)) /* point page vect tbl */
PVTRIT = C2x(Storage(D2x(CVTPVTP+4),4)) /* RSM internal tbl OCO */
RITOLSTG = X2d(C2x(Storage(D2x(X2d(PVTRIT)+X2d(128)),8)))
RITOLSTG = RITOLSTG/1024/1024 /* convert to Megabytes */
CVTRLSTG = RITOLSTG /* change the name for code below */
End
*/
If Bitand(CVTOSLV0,'08'x) = '08'x then do /* HBB4410 ESA V4 & > */
ECVTEORM = C2d(Storage(d2x(ECVT+600),8)) /* potential real high */
RECONFIG = (ECVTEORM-CVTRLSTG*1024*1024+1)/(1024*1024) /* amt of */
/* reconfigurable stor */
End
If Bitand(CVTOSLV5,'40'x) = '40'x then do /* z/OS 1.7 and above */
RCECADSUsed = C2d(Storage(D2x(RCE + 572),2)) /* CADS current use */
RCECADSHW = C2d(Storage(D2x(RCE + 574),2)) /* CADS high water */
End
Call STORAGE_GDA_LDA
If Bitand(CVTOSLV2,'01'x) = '01'x then do /* OS/390 R10 and above */
SCCBSAI = C2d(Storage(D2x(SCCB + 10),1)) /* real stor incr. in M */
If SCCBSAI = 0 then do /* If 0, use SCCBSAIX */
SCCBSAIX = C2d(Storage(D2x(SCCB + 100),4)) /* real stor incr in M*/
SCCBSAI = SCCBSAIX /* using SCCBSAI later */
End
SCCBSAR = C2d(Storage(D2x(SCCB + 8),2)) /* # of. incr installed */
End
If zARCH <> 2 then do /* not valid in 64-bit */
Queue 'The real storage size at IPL time was 'Format(CVTRLSTG,,0)'M.'
Queue 'The potential real storage size is' ,
Format(CVTEORM,,0)'M.'
If ESTOR > 0 then
Queue 'The expanded storage size is 'ESTOR'M.'
Else
Queue 'The system has no expanded storage.'
End /* If zARCH <> 2 */
Else Queue 'The real storage online at IPL time' ,
'was 'Format(CVTRLSTG,,0)'M.'
If Bitand(CVTOSLV2,'01'x) = '01'x then , /* OS/390 R10 and above */
If SCCBSAI <> 0 then ,
Queue 'The real storage increment size is 'SCCBSAI'M with' ,
SCCBSAR 'increments installed.'
If Bitand(CVTOSLV0,'08'x) = '08'x then do /* HBB4410 ESA V4 & > */
Queue 'The potential real storage size is' ,
(ECVTEORM+1)/(1024*1024)'M.'
Queue 'The reconfigurable storage size is 'reconfig'MB.'
End
Queue 'The private area size <16M is 'GDAPVTSZ'K.'
Queue 'The private area size >16M is 'GDAEPVTS'M.'
Queue 'The CSA size <16M is 'GDACSASZ'K.'
Queue 'The CSA size >16M is 'GDAECSAS'K.'
Queue 'The SQA size <16M is 'GDASQASZ'K.'
Queue 'The SQA size >16M is 'GDAESQAS'K.'
Queue 'The maximum V=R region size is 'GDAVRSZ'K.'
Queue 'The default V=R region size is 'GDAVREGS'K.'
Queue 'The maximum V=V region size is 'LDASIZEA'K.'
If Bitand(CVTOSLV5,'40'x) = '40'x then do /* z/OS 1.7 and above */
Queue 'The current number of CADS (MAXCADs)' ,
'in use is 'RCECADSUsed'.'
Queue 'The maximum number of CADS (MAXCADs)' ,
'used since IPL is 'RCECADSHW'.'
End
Return

CPU: /* CPU information sub-routine */


Queue ' '
If Bitand(CVTOSLV3,'01'x) = '01'x then , /* z/OS 1.6 & above >16 CPs*/
NUMCPU = C2d(Storage(D2x(CSD + 212),4)) /* point to # of CPUS */
Else,
NUMCPU = C2d(Storage(D2x(CSD + 10),2)) /* point to # of CPUS */
SCCBNCPS = C2d(Storage(d2x(SCCB + 16),2)) /* Max No. of CPUs */
/* */
Queue 'The CPU model number is 'MODEL'.'
Queue 'The number of online CPUs is 'NUMCPU'.' ,
'The maximum number of CPUs is 'SCCBNCPS'.'
If Bitand(CVTOSLV3,'20'x) = '20'x & , /* z/OS 1.1 and above */
Bitand(CVTOSLV3,'01'x) <> '01'x then do /* but below z/OS 1.6 */
CSDICPUS = C2d(Storage(D2x(CSD+161),1)) /* CPUs online @ IPL */
Queue ' The number of CPUs online at IPL time was 'CSDICPUS'.'
End
If Bitand(CVTOSLV3,'01'x) = '01'x then do /* z/OS 1.6 and above */
CSDICPUS = C2d(Storage(D2x(CSD+161),1)) /* CPUs online @ IPL */
CSDIIFAS = C2d(Storage(D2x(CSD+162),1)) /* zAAPs online @ IPL */
Queue ' The number of GPs online at IPL time was 'CSDICPUS'.'
If CSDIIFAS <> 0 then ,
Queue ' The number of zAAPs online at IPL time was 'CSDIIFAS'.'
If Bitand(CVTOSLV4,'02'x) = '02'x then do /* zIIP (SUP) support */
CSDISUPS = C2d(Storage(D2x(CSD+163),1)) /* zIIPs online @ IPL */
If CSDISUPS <> 0 then ,
Queue ' The number of zIIPs online at IPL time was 'CSDISUPS'.'
End
End
/* */
CPNUM = 0
FOUNDCPUS = 0
FOUNDZAPS = 0
FOUNDZIPS = 0
Do until FOUNDCPUS = NUMCPU
PCCA = C2d(Storage(D2x(PCCAVT + CPNUM*4),4)) /* point to PCCA */
If PCCA <> 0 then do
CPUVER = Storage(D2x(PCCA + 4),2) /* point to VERSION */
CPUID = Storage(D2x(PCCA + 6),10) /* point to CPUID */
IDSHORT = Substr(CPUID,2,5)
PCCAATTR = Storage(D2x(PCCA + 376),1) /* attribute byte */
PCCARCFF = Storage(D2x(PCCA + 379),1) /* reconfig flag */
CP_TYP = '' /* init to null for now */
If Bitand(PCCAATTR,'01'x) = '01'x then do /* check PCCAIFA */
CP_TYP = '(zAAP)' /* zAAP / IFA CP */
FOUNDZAPS = FOUNDZAPS + 1
End
If Bitand(PCCAATTR,'04'x) = '04'x then do /* check PCCAzIIP */
CP_TYP = '(zIIP)' /* zIIP processor */
FOUNDZIPS = FOUNDZIPS + 1
End
If Bitand(PCCARCFF,'80'x) = '80'x then , /* check PCCACWLM */
CP_TYP = '(WLM)' /* WLM controlled CP */
CPNUM_M = D2x(CPNUM) /* display in hex */
If Bitand(CVTOSLV3,'01'x) = '01'x then , /* z/OS 1.6 & above */
CPNUM_M = Right(CPNUM_M,2,'0') /* display as 2 digits*/
Queue 'The CPU serial number for CPU 'CPNUM_M' is ' || ,
CPUID' ('IDSHORT'), version code' CPUVER'.' CP_TYP
FOUNDCPUS = FOUNDCPUS + 1
End
CPNUM = CPNUM + 1
End /* do until */
/**************************************************/
/* SUs/SEC and MIPS calculations */
/* SYS1.NUCLEUS(IEAVNP10) CSECT IRARMCPU */
/**************************************************/
RMCT = C2d(Storage(D2x(CVT+604),4)) /* point to RMCT */
SU = C2d(Storage(D2x(RMCT+64),4)) /* CPU Rate Adjustment */
SUSEC = Format((16000000/SU),7,2) /* SUs per second */
MIPSCP = NUMCPU-FOUNDZAPS-FOUNDZIPS /* Don't include special*/
/* processors for MIPs */
MIPS = Format((SUSEC/48.5) * MIPSCP,6,2) /* SRM MIPS calculation */
/* (48.5) borrowed from */
/* Thierry Falissard */
Queue 'The service units per second per online CPU is' Strip(SUSEC)'.'
Queue 'The approximate total MIPS (SUs/SEC / 48.5 * # general CPUs)' ,
'is' Strip(MIPS)'.'
/*
RMCTCCT = C2d(Storage(D2x(RMCT+4),4)) /* cpu mgmt control tbl */
CCVUTILP = C2d(Storage(D2x(RMCTCCT+102),2)) /* CPU Utilization */
Queue 'The approximate CPU utilization is' CCVUTILP'%.'
*/
If Bitand(CVTOSLV3,'20'x) = '20'x then do /* z/OS 1.1 and above */
/* w/APAR OW55509 */
RCT = C2d(Storage(D2x(RMCT+228),4)) /* Resource Control Tbl */
RCTLACS = C2d(Storage(D2x(RCT+196),4)) /* 4 hr MSU average */
RCTIMGWU = C2d(Storage(D2x(RCT+28),4)) /* Image defined MSUs */
RCTCECWU = C2d(Storage(D2x(RCT+32),4)) /* CEC MSU Capacity */
If RCTCECWU <> 0 then do
Queue 'The MSU capacity for this CEC is' RCTCECWU'.'
Queue 'The defined MSU capacity for this LPAR is' RCTIMGWU'.'
End
If RCTLACS <> 0 then do
Queue 'The 4 hour MSU average usage is' RCTLACS'.'
If RCTLACS >= RCTIMGWU & RCTIMGWU <> RCTCECWU then ,
Queue ' ** This LPAR is currently being "soft capped". **'
End
End
/* */
If Bitand(CVTOSLV5,'20'x) = '20'x then do /* z/OS 1.8 and above */
IEAVESVT = C2d(Storage(D2x(CVT + 868),4)) /* supv. vect tbl IHASVT*/
SVTAFFB = Storage(D2x(IEAVESVT + 12),1) /* aff-dispatch byte */
If Bitand(SVTAFFB,'80'x) = '80'x then ,
Queue 'The HiperDispatch feature is active on this LPAR.'
Else Queue 'The HiperDispatch feature is not active on this LPAR.'
CPCRPERC = C2d(Storage(D2x(IEAVESVT+1008),4)) /* CPCR Percent */
If CPCRPERC <> 0 then
Queue 'The CP Credits feature is active on this CPC/LPAR' ,
'at' CPCRPERC'%.'
End
/**************************************************/
/* Central Processing Complex Node Descriptor */
/**************************************************/
If Bitand(CVTOSLV1,'20'x) = '20'x then do /* HBB5510 ESA V5 & > */
CVTHID = C2d(Storage(D2x(CVT + 1068),4)) /* point to SHID */
CPCND_FLAGS = Storage(D2x(CVTHID+22),1) /* pnt to CPCND FLAGS */
If CPCND_FLAGS <> 0 then do /* Is there a CPC? */
CPCND_VALID = Bitand(CPCND_FLAGS,'E0'x) /* Valid flags */
CPCND_INVALID = Bitand('40'x) /* Invalid flag */
If CPCND_VALID <> CPCND_INVALID then do /* Is it valid? */
CPCND_TYPE = Storage(D2x(CVTHID+26),6) /* Type */
CPCND_MODEL = Storage(D2x(CVTHID+32),3) /* Model */
CPCND_MAN = Storage(D2x(CVTHID+35),3) /* Manufacturer */
CPCND_PLANT = Storage(D2x(CVTHID+38),2) /* Plant of manufact. */
CPCND_SEQNO = Storage(D2x(CVTHID+40),12) /* Sequence number */
CPC_ID = C2x(Storage(D2x(CVTHID+55),1)) /* CPC ID */
Queue ' '
/* Queue 'Central Processing Complex (CPC) Node Descriptor:' */
Queue 'Central Processing Complex (CPC) Information:'
Queue ' CPC ND =',
CPCND_TYPE'.'CPCND_MODEL'.'CPCND_MAN'.'CPCND_PLANT'.'CPCND_SEQNO
If Bitand(CVTOSLV3,'10'x) = '10'x then do /*z/OS 1.2 & above*/
Call GET_CPCSI /* Get CPC SI (STSI) information sub-routine */
Queue ' CPC SI =' CPCSI_TYPE'.'CPCSI_MODEL'.' || ,
CPCSI_MAN'.'CPCSI_PLANT'.'CPCSI_CPUID
Queue ' Model:' CPCSI_MODELID
End /* If Bitand(CVTOSLV3,'10'x) = '10'x */
Queue ' CPC ID =' CPC_ID
Queue ' Type('CPCND_TYPE') Model('CPCND_MODEL')',
'Manufacturer('CPCND_MAN') Plant('CPCND_PLANT')',
'Seq Num('CPCND_SEQNO')'
If Bitand(CVTOSLV3,'20'x) = '20'x then do /*z/OS 1.1 & above*/
RMCTX1M = Storage(D2x(RMCT+500),4) /* Microcode addr */
/* in RMCTX1 */
If RMCTX1M <> '7FFFF000'x then do /* skip VM/FLEX/ES*/
RMCTX1M = C2d(RMCTX1M) /* change to dec. */
MCL = Storage(D2x(RMCTX1M + 40),8) /* Microcode lvl */
MCLDRV = Substr(MCL,1,4) /* Driver only.. */
If Datatype(MCLDRV,'Number') = 1 then , /* if all numeric */
MCLDRV = Format(MCLDRV) /* rmv leading 0s */
Queue ' The Microcode level of this CPC is' MCL || ,
' (Driver' MCLDRV').'
End /* If RMCTX1M <> '7FFFF000'x */
End /* If Bitand(CVTOSLV3,'20'x) = '20'x */
End /* if CPCND_VALID <> CPCND_INVALID */
Else do
If Bitand(CVTOSLV3,'10'x) = '10'x then do /*z/OS 1.2 & above*/
Call GET_CPCSI /* Get CPC SI (STSI) information sub-routine */
Queue ' '
Queue 'Central Processing Complex (CPC) Information:'
Queue ' CPC SI =' CPCSI_TYPE'.'CPCSI_MODEL'.' || ,
CPCSI_MAN'.'CPCSI_PLANT'.'CPCSI_CPUID
Queue ' Model:' CPCSI_MODELID
End /* if Bitand(CVTOSLV3,'10'x) = '10'x */
End /* else do */
End /* if CPCND_FLAGS <>0 */
End
Return

IPA: /* IPA information sub-routine */


Queue ' '
/*********************************************************************/
/* IPL parms from the IPA */
/*********************************************************************/
If Bitand(CVTOSLV1,'01'x) = '01'x then do /* OS/390 R2 and above */
IPAICTOD = Storage(D2x(ECVTIPA + 8),8) /* point to IPL TOD */
IPALPARM = Storage(D2x(ECVTIPA + 16),8) /* point to LOAD PARM */
IPALPDSN = Storage(D2x(ECVTIPA + 48),44) /* load parm dsn name */
IPALPDDV = Storage(D2x(ECVTIPA + 92),4) /* load parm dev number */
IPAHWNAM = Storage(D2x(ECVTIPA + 24),8) /* point to HWNAME */
IPAHWNAM = Strip(IPAHWNAM,'T') /* del trailing blanks */
IPALPNAM = Storage(D2x(ECVTIPA + 32),8) /* point to LPARNAME */
IPALPNAM = Strip(IPALPNAM,'T') /* del trailing blanks */
IPAVMNAM = Storage(D2x(ECVTIPA + 40),8) /* point to VMUSERID */
/**************************/
/* PARMS in LOADxx */
/**************************/
IPANUCID = Storage(D2x(ECVTIPA + 23),1) /* NUCLEUS ID */
IPAIODF = Storage(D2x(ECVTIPA + 96),63) /* IODF card image */
IPASPARM = Storage(D2x(ECVTIPA + 160),63) /* SYSPARM card image */
/*IPASCAT= Storage(D2x(ECVTIPA + 224),63)*//* SYSCAT card image */
IPASYM = Storage(D2x(ECVTIPA + 288),63) /* IEASYM card image */
IPAPLEX = Storage(D2x(ECVTIPA + 352),63) /* SYSPLEX card image */
If Bitand(CVTOSLV2,'01'x) = '01'x then do /* OS/390 R10 and above */
IPAPLNUMX = Storage(D2x(ECVTIPA + 2134),2) /* number of parmlibs */
IPAPLNUM = IPAPLNUMX
End
Else , /* OS/390 R10 and above */
IPAPLNUM = Storage(D2x(ECVTIPA + 2148),2) /* number of parmlibs */
IPAPLNUM = C2d(IPAPLNUM) /* convert to decimal */
POFF = 0
Do P = 1 to IPAPLNUM
IPAPLIB.P = Storage(D2x(ECVTIPA+416+POFF),63) /* PARMLIB cards */
IPAPLFLG.P = Storage(D2x(ECVTIPA+479+POFF),1) /* flag bits */
If Bitand(IPAPLFLG.P,'20'x) = '20'x then , /* volser from cat? */
IPAPLIB.P = Overlay(' ',IPAPLIB.P,46) /* no, clear it */
POFF = POFF + 64
End
IPANLID = Storage(D2x(ECVTIPA + 2144),2) /* NUCLSTxx member used */
IPANUCW = Storage(D2x(ECVTIPA + 2146),1) /* load wait state char */
IPAICTOD = C2x(IPAICTOD) /* make "readable" for REXXTOD call */
Call REXXTOD IPAICTOD /* convert TOD to YYYY.DDD HH:MM:SS.ttt */
TOD_RESY = Substr(RESULT,1,4) /* year portion from REXXTOD */
TOD_RESD = Substr(RESULT,6,3) /* day portion from REXXTOD */
TOD_REST = Substr(RESULT,10,8) /* time portion from REXXTOD */
Call RDATE TOD_RESY TOD_RESD /* call RDATE- format for ISO/USA/EUR */
MMIPA = Substr(RESULT,1,2) /* MM from MM/DD/YYYY */
DDIPA = Substr(RESULT,4,2) /* DD from MM/DD/YYYY */
YYYYIPA = Substr(RESULT,7,4) /* YYYY from MM/DD/YYYY */
If DATEFMT = 'USA' then , /* USA format date? */
IPAIDATE = Substr(RESULT,1,10) /* date as MM/DD/YYYY */
If DATEFMT = 'EUR' then , /* EUR format date? */
IPAIDATE = DDIPA'/'MMIPA'/'YYYYIPA /* date as DD/MM/YYYY */
If DATEFMT = 'ISO' then , /* ISO format date? */
IPAIDATE = YYYYIPA'-'MMIPA'-'DDIPA /* date as YYYY-MM-DD */
Queue 'Initialization information from the IPA:'
Queue ' IPL TIME (GMT):' IPAIDATE ,
'('TOD_RESY'.'TOD_RESD') at' TOD_REST
Queue ' IPLPARM =' IPALPARM '(merged)'
Queue ' IPL load parameter data set name: 'IPALPDSN
Queue ' IPL load parameter data set device address: 'IPALPDDV
Queue ' HWNAME='IPAHWNAM ' LPARNAME='IPALPNAM ,
' VMUSERID='IPAVMNAM
Queue ' ' /* add blank line for readability */
Queue ' LOADxx parameters from the IPA' ,
'(LOAD' || Substr(IPALPARM,5,2) || '):'
Queue ' *---+----1----+----2----+----3----+----4' || ,
'----+----5----+----6----+----7--'
If Bitand(CVTOSLV2,'01'x) = '01'x then do /* OS/390 R10 & above */
IPAARCHL = Storage(D2x(ECVTIPA + 2143),1) /* ARCHLVL (1 or 2) */
Queue ' ARCHLVL 'IPAARCHL
End
If IPASYM <> '' then queue ' IEASYM 'IPASYM
If IPAIODF <> '' then queue ' IODF 'IPAIODF
If IPANUCID <> '' then queue ' NUCLEUS 'IPANUCID
If IPANLID <> '' then queue ' NUCLST 'IPANLID' 'IPANUCW
Do P = 1 to IPAPLNUM
Queue ' PARMLIB 'IPAPLIB.P
End
If IPASCAT <> '' then queue ' SYSCAT 'IPASCAT
If IPASPARM <> '' then queue ' SYSPARM 'IPASPARM
If IPAPLEX <> '' then queue ' SYSPLEX 'IPAPLEX
/**************************/
/* PARMS in IEASYSxx */
/**************************/
Queue ' ' /* add blank line for readability */
Queue ' IEASYSxx parameters from the IPA: ',
' (Source)'
Call BUILD_IPAPDETB /* Build table for init parms */
TOTPRMS = 0 /* tot num of specified or defaulted parms */
Do I = 1 to IPAPDETB.0
Call EXTRACT_SYSPARMS IPAPDETB.I /* extract parms from the IPA */
End
/********************************************************************/
/* Uncommment a sample below to test IPA PAGE parm "split" code: */
/* PRMLINE.32 = 'SWAP SWAP=(SYS1.SWAP.TEST) IEASYSXX' */
/* PRMLINE.32 = 'NONVIO NONVIO=(SYS1.PAGE.TEST) IEASYSXX' */
/* PRMLINE.32 = 'NONVIO NONVIO=(SYS1.PAGE1,SYS1.PAGE2) IEASYSXX' */
/* PRMLINE.32 = 'NONVIO ' || , */
/* 'NONVIO=(SYS1.PAGE1,SYS1.PAGE2,SYS1.PAGE3,SYS1.PAGE4) IEASYSXX' */
/********************************************************************/
Call SORT_IPA /* sort IPA parms */
Call SPLIT_IPA_PAGE /* split page/swap dsn parms */
Do I = 1 to TOT_IPALINES /* add ipa parms */
If I = TOT_IPALINES then , /* to stack and */
IPALINE.I = Translate(IPALINE.I,' ',',') /* remove comma */
Queue IPALINE.I /* from last parm */
End
End
Return

SYMBOLS: /* System Symbols information sub-routine */


Queue ' '
/*********************************************************************/
/* Find System Symbols - ASASYMBP MACRO */
/* ECVT+X'128' = ECVTSYMT */
/* 2nd half word = # of symbols , after that each entry is 4 words */
/* 1st word = offset to symbol name */
/* 2nd word = length of symbol name */
/* 3rd word = offset to symbol value */
/* 4th word = length of symbol value */
/*********************************************************************/
If Bitand(CVTOSLV1,'10'x) = '10'x then do /* HBB5520 ESA V5.2 & > */
ECVTSYMT = C2d(Storage(D2x(ECVT + 296),4)) /* point to ECVTSYMT */
NUMSYMBS = C2d(Storage(D2x(ECVTSYMT + 2),2)) /* number of symbols */
Queue 'Static System Symbol Values:'
Do I = 1 to NUMSYMBS
SOFF = I*16-16
NAMOFF = C2d(Storage(D2x(ECVTSYMT+4+SOFF),4)) /*offset to name */
NAMLEN = C2d(Storage(D2x(ECVTSYMT+8+SOFF),4)) /*length of name */
VALOFF = C2d(Storage(D2x(ECVTSYMT+12+SOFF),4)) /*offset to value*/
VALLEN = C2d(Storage(D2x(ECVTSYMT+16+SOFF),4)) /*length of value*/
SYMNAME = Storage(D2x(ECVTSYMT+4+NAMOFF),NAMLEN) /*symbol name */
If VALLEN = 0 then VALNAME = '' /* null value */
Else ,
VALNAME = Storage(D2x(ECVTSYMT+4+VALOFF),VALLEN) /* symbol value */
Queue ' ' Left(SYMNAME,10,' ') '=' VALNAME
End /* do NUMSYMBS */
End
Return

VMAP: /* Virtual Storage Map sub-routine */


Arg VMAPOPT
If option <> 'ALL' then,
Call STORAGE_GDA_LDA /* GDA/LDA stor routine */
SYSEND = X2d(LDASTRTS) + (LDASIZS*1024) - 1 /* end of system area */
SYSEND = D2x(SYSEND) /* display in hex */
If GDAVRSZ = 0 then do /* no v=r */
VRSTRT = 'N/A '
VREND = 'N/A '
VVSTRT = LDASTRTA /* start of v=v */
VVEND = X2d(LDASTRTA) + (LDASIZEA*1024) - 1 /* end of v=v */
VVEND = D2x(VVEND) /* display in hex */
End
Else do
VRSTRT = LDASTRTA /* start of v=r */
VREND = X2d(LDASTRTA) + (GDAVRSZ*1024) - 1 /* end of v=r */
VREND = D2X(VREND) /* display in hex */
VVSTRT = LDASTRTA /* start of v=v */
VVEND = X2d(LDASTRTA) + (LDASIZEA*1024) - 1 /* end of v=v */
VVEND = D2x(VVEND) /* display in hex */
End
GDACSA = C2d(Storage(D2x(CVTGDA + 108),4)) /* start of CSA addr */
GDACSAH = D2x(GDACSA) /* display in hex */
CSAEND = (GDACSASZ*1024) + GDACSA - 1 /* end of CSA */
CSAEND = D2x(CSAEND) /* display in hex */
CVTSMEXT = C2d(Storage(D2x(CVT +1196),4)) /* point to stg map ext.*/
CVTMLPAS = C2d(Storage(D2x(CVTSMEXT+ 8),4)) /* start of MLPA addr */
CVTMLPAS = D2x(CVTMLPAS) /* display in hex */
If CVTMLPAS <> 0 then do
CVTMLPAE = C2d(Storage(D2x(CVTSMEXT+12),4)) /* end of MLPA addr */
CVTMLPAE = D2x(CVTMLPAE) /* display in hex */
MLPASZ = X2d(CVTMLPAE) - X2d(CVTMLPAS) + 1 /* size of MLPA */
MLPASZ = MLPASZ/1024 /* convert to Kbytes */
End
Else do /* no MLPA */
CVTMLPAS = 'N/A '
CVTMLPAE = 'N/A '
MLPASZ = 0
End
CVTFLPAS = C2d(Storage(D2x(CVTSMEXT+16),4)) /* start of FLPA addr */
CVTFLPAS = D2x(CVTFLPAS) /* display in hex */
If CVTFLPAS <> 0 then do
CVTFLPAE = C2d(Storage(D2x(CVTSMEXT+20),4)) /* end of FLPA addr */
CVTFLPAE = D2x(CVTFLPAE) /* display in hex */
FLPASZ = X2d(CVTFLPAE) - X2d(CVTFLPAS) + 1 /* size of FLPA */
FLPASZ = FLPASZ/1024 /* convert to Kbytes */
End
Else do /* no FLPA */
CVTFLPAS = 'N/A '
CVTFLPAE = 'N/A '
FLPASZ = 0
End
CVTPLPAS = C2d(Storage(D2x(CVTSMEXT+24),4)) /* start of PLPA addr */
CVTPLPAS = D2x(CVTPLPAS) /* display in hex */
CVTPLPAE = C2d(Storage(D2x(CVTSMEXT+28),4)) /* end of PLPA addr */
CVTPLPAE = D2x(CVTPLPAE) /* display in hex */
PLPASZ = X2d(CVTPLPAE) - X2d(CVTPLPAS) + 1 /* size of PLPA */
PLPASZ = PLPASZ/1024 /* convert to Kbytes */
GDASQA = C2d(Storage(D2x(CVTGDA + 144),4)) /* start of SQA addr */
GDASQAH = D2x(GDASQA) /* display in hex */
SQAEND = (GDASQASZ*1024) + GDASQA - 1 /* end of SQA */
SQAEND = D2x(SQAEND) /* display in hex */
CVTRWNS = C2d(Storage(D2x(CVTSMEXT+32),4)) /* start of R/W nucleus */
CVTRWNS = D2x(CVTRWNS) /* display in hex */
CVTRWNE = C2d(Storage(D2x(CVTSMEXT+36),4)) /* end of R/W nucleus */
CVTRWNE = D2x(CVTRWNE) /* display in hex */
RWNUCSZ = X2d(CVTRWNE) - X2d(CVTRWNS) + 1 /* size of R/W nucleus */
RWNUCSZ = Format(RWNUCSZ/1024,,0) /* convert to Kbytes */
CVTRONS = C2d(Storage(D2x(CVTSMEXT+40),4)) /* start of R/O nucleus */
CVTRONS = D2x(CVTRONS) /* display in hex */
CVTRONE = C2d(Storage(D2x(CVTSMEXT+44),4)) /* end of R/O nucleus */
CVTRONE = D2x(CVTRONE) /* display in hex */
RONUCSZ = X2d(CVTRONE) - X2d(CVTRONS) + 1 /* size of R/O nucleus */
RONUCSZ = Format(RONUCSZ/1024,,0) /* convert to Kbytes */
RONUCSZB = X2d('FFFFFF') - X2d(CVTRONS) + 1 /* size of R/O nuc <16M */
RONUCSZB = Format(RONUCSZB/1024,,0) /* convert to Kbytes */
RONUCSZA = X2d(CVTRONE) - X2d('1000000') + 1 /* size of R/O nuc >16M */
RONUCSZA = Format(RONUCSZA/1024,,0) /* convert to Kbytes */
CVTERWNS = C2d(Storage(D2x(CVTSMEXT+48),4)) /* start of E-R/W nuc */
CVTERWNS = D2x(CVTERWNS) /* display in hex */
CVTERWNE = C2d(Storage(D2x(CVTSMEXT+52),4)) /* end of E-R/W nuc */
CVTERWNE = D2x(CVTERWNE) /* display in hex */
ERWNUCSZ = X2d(CVTERWNE) - X2d(CVTERWNS) + 1 /* size of E-R/W nuc */
ERWNUCSZ = ERWNUCSZ/1024 /* convert to Kbytes */
GDAESQA = C2d(Storage(D2x(CVTGDA + 152),4)) /* start of ESQA addr */
GDAESQAH = D2x(GDAESQA) /* display in hex */
ESQAEND = (GDAESQAS*1024) + GDAESQA - 1 /* end of ESQA */
ESQAEND = D2x(ESQAEND) /* display in hex */
CVTEPLPS = C2d(Storage(D2x(CVTSMEXT+56),4)) /* start of EPLPA addr */
CVTEPLPS = D2x(CVTEPLPS) /* display in hex */
CVTEPLPE = C2d(Storage(D2x(CVTSMEXT+60),4)) /* end of EPLPA addr */
CVTEPLPE = D2x(CVTEPLPE) /* display in hex */
EPLPASZ = X2d(CVTEPLPE) - X2d(CVTEPLPS) + 1 /* size of EPLPA */
EPLPASZ = EPLPASZ/1024 /* convert to Kbytes */
CVTEFLPS = C2d(Storage(D2x(CVTSMEXT+64),4)) /* start of EFLPA addr */
CVTEFLPS = D2x(CVTEFLPS) /* display in hex */
If CVTEFLPS <> 0 then do
CVTEFLPE = C2d(Storage(D2x(CVTSMEXT+68),4)) /* end of EFLPA addr */
CVTEFLPE = D2x(CVTEFLPE) /* display in hex */
EFLPASZ = X2d(CVTEFLPE) - X2d(CVTEFLPS) + 1 /* size of EFLPA */
EFLPASZ = EFLPASZ/1024 /* convert to Kbytes */
End
Else do /* no EFLPA */
CVTEFLPS = 'N/A '
CVTEFLPE = 'N/A '
EFLPASZ = 0
End
CVTEMLPS = C2d(Storage(D2x(CVTSMEXT+72),4)) /* start of EMLPA addr */
CVTEMLPS = D2x(CVTEMLPS) /* display in hex */
If CVTEMLPS <> 0 then do
CVTEMLPE = C2d(Storage(D2x(CVTSMEXT+76),4)) /* end of EMLPA addr */
CVTEMLPE = D2x(CVTEMLPE) /* display in hex */
EMLPASZ = X2d(CVTEMLPE) - X2d(CVTEMLPS) + 1 /* size of EMLPA */
EMLPASZ = EMLPASZ/1024 /* convert to Kbytes */
End
Else do /* no EMLPA */
CVTEMLPS = 'N/A '
CVTEMLPE = 'N/A '
EMLPASZ = 0
End
GDAECSA = C2d(Storage(D2x(CVTGDA + 124),4)) /* start of ECSA addr */
GDAECSAH = D2x(GDAECSA) /* display in hex */
ECSAEND = (GDAECSAS*1024) + GDAECSA - 1 /* end of ECSA */
ECSAEND = D2x(ECSAEND) /* display in hex */
GDAEPVT = C2d(Storage(D2x(CVTGDA + 168),4)) /* start of EPVT addr */
GDAEPVTH = D2x(GDAEPVT) /* display in hex */
EPVTEND = (GDAEPVTS*1024*1024) + GDAEPVT - 1 /* end of EPVT */
EPVTEND = D2x(EPVTEND) /* display in hex */
If VMAPOPT <> 'NODISP' then do /* no display of vmap desired */
Queue ' '
Queue 'Virtual Storage Map:'
Queue ' '
If VMAP = 'HIGHFIRST' then do
If Bitand(CVTOSLV2,'01'x) = '01'x then , /* OS/390 R10 and above */
Queue ' Storage Area Start End Size' ,
' Used Conv HWM'
Else ,
Queue ' Storage Area Start End Size' ,
' Used Conv'
Queue ' '
Queue ' Ext. Private ' Right(GDAEPVTH,8,'0') ' ' ,
Right(EPVTEND,8,'0') Right(GDAEPVTS,8,' ')'M'
If Bitand(CVTOSLV2,'01'x) = '01'x then , /* OS/390 R10 and above */
Queue ' Ext. CSA ' Right(GDAECSAH,8,'0') ' ' ,
Right(ECSAEND,8,'0') Right(GDAECSAS,8,' ')'K' ,
Right(GDA_ECSA_ALLOC,8,' ')'K ' ,
Right(GDAECSAHWM,7,' ')'K'
Else ,
Queue ' Ext. CSA ' Right(GDAECSAH,8,'0') ' ' ,
Right(ECSAEND,8,'0') Right(GDAECSAS,8,' ')'K' ,
Right(GDA_ECSA_ALLOC,8,' ')'K'
Queue ' Ext. MLPA ' Right(CVTEMLPS,8,'0') ' ' ,
Right(CVTEMLPE,8,'0') Right(EMLPASZ,8,' ')'K'
Queue ' Ext. FLPA ' Right(CVTEFLPS,8,'0') ' ' ,
Right(CVTEFLPE,8,'0') Right(EFLPASZ,8,' ')'K'
Queue ' Ext. PLPA ' Right(CVTEPLPS,8,'0') ' ' ,
Right(CVTEPLPE,8,'0') Right(EPLPASZ,8,' ')'K'
If Bitand(CVTOSLV2,'01'x) = '01'x then , /* OS/390 R10 and above */
Queue ' Ext. SQA ' Right(GDAESQAH,8,'0') ' ' ,
Right(ESQAEND,8,'0') Right(GDAESQAS,8,' ')'K' ,
Right(GDA_ESQA_ALLOC,8,' ')'K' Right(GDA_ECSA_CONV,7,' ')'K',
Right(GDAESQAHWM,7,' ')'K'
Else ,
Queue ' Ext. SQA ' Right(GDAESQAH,8,'0') ' ' ,
Right(ESQAEND,8,'0') Right(GDAESQAS,8,' ')'K' ,
Right(GDA_ESQA_ALLOC,8,' ')'K' Right(GDA_ECSA_CONV,7,' ')'K'
Queue ' Ext. R/W Nucleus ' Right(CVTERWNS,8,'0') ' ' ,
Right(CVTERWNE,8,'0') Right(ERWNUCSZ,8,' ')'K'
Queue ' Ext. R/O Nucleus ' Right('1000000',8,'0') ' ' ,
Right(CVTRONE,8,'0') Right(RONUCSZA,8,' ')'K' ,
'(Total' RONUCSZ'K)'
Queue ' 16M line -----------------------------'
Queue ' R/O Nucleus ' Right(CVTRONS,8,'0') ' ' ,
Right('FFFFFF',8,'0') Right(RONUCSZB,8,' ')'K',
'(Spans 16M line)'
Queue ' R/W Nucleus ' Right(CVTRWNS,8,'0') ' ' ,
Right(CVTRWNE,8,'0') Right(RWNUCSZ,8,' ')'K'
If Bitand(CVTOSLV2,'01'x) = '01'x then , /* OS/390 R10 and above */
Queue ' SQA ' Right(GDASQAH,8,'0') ' ' ,
Right(SQAEND,8,'0') Right(GDASQASZ,8,' ')'K' ,
Right(GDA_SQA_ALLOC,8,' ')'K' Right(GDA_CSA_CONV,7,' ')'K' ,
Right(GDASQAHWM,7,' ')'K'
Else ,
Queue ' SQA ' Right(GDASQAH,8,'0') ' ' ,
Right(SQAEND,8,'0') Right(GDASQASZ,8,' ')'K' ,
Right(GDA_SQA_ALLOC,8,' ')'K' Right(GDA_CSA_CONV,7,' ')'K'
Queue ' PLPA ' Right(CVTPLPAS,8,'0') ' ' ,
Right(CVTPLPAE,8,'0') Right(PLPASZ,8,' ')'K'
Queue ' FLPA ' Right(CVTFLPAS,8,'0') ' ' ,
Right(CVTFLPAE,8,'0') Right(FLPASZ,8,' ')'K'
Queue ' MLPA ' Right(CVTMLPAS,8,'0') ' ' ,
Right(CVTMLPAE,8,'0') Right(MLPASZ,8,' ')'K'
If Bitand(CVTOSLV2,'01'x) = '01'x then , /* OS/390 R10 and above */
Queue ' CSA ' Right(GDACSAH,8,'0') ' ' ,
Right(CSAEND,8,'0') Right(GDACSASZ,8,' ')'K' ,
Right(GDA_CSA_ALLOC,8,' ')'K ' ,
Right(GDACSAHWM,7,' ')'K'
Else ,
Queue ' CSA ' Right(GDACSAH,8,'0') ' ' ,
Right(CSAEND,8,'0') Right(GDACSASZ,8,' ')'K' ,
Right(GDA_CSA_ALLOC,8,' ')'K'
Queue ' Private V=V ' Right(VVSTRT,8,'0') ' ' ,
Right(VVEND,8,'0') Right(LDASIZEA,8,' ')'K'
Queue ' Private V=R ' Right(VRSTRT,8,'0') ' ' ,
Right(VREND,8,'0') Right(GDAVRSZ,8,' ')'K'
Queue ' System ' Right(LDASTRTS,8,'0') ' ' ,
Right(SYSEND,8,'0') Right(LDASIZS,8,' ')'K'
If zARCH = 2 then ,
Queue ' PSA 00000000 00001FFF 8K'
Else ,
Queue ' PSA 00000000 00000FFF 4K'
End /* if VMAP = 'HIGHFIRST' */
Else do /* VMAP <> 'HIGHFIRST' */
If Bitand(CVTOSLV2,'01'x) = '01'x then , /* OS/390 R10 and above */
Queue ' Storage Area Start End Size' ,
' Used Conv HWM'
Else ,
Queue ' Storage Area Start End Size' ,
' Used Conv'
Queue ' '
If zARCH = 2 then ,
Queue ' PSA 00000000 00001FFF 8K'
Else ,
Queue ' PSA 00000000 00000FFF 4K'
Queue ' System ' Right(LDASTRTS,8,'0') ' ' ,
Right(SYSEND,8,'0') Right(LDASIZS,8,' ')'K'
Queue ' Private V=R ' Right(VRSTRT,8,'0') ' ' ,
Right(VREND,8,'0') Right(GDAVRSZ,8,' ')'K'
Queue ' Private V=V ' Right(VVSTRT,8,'0') ' ' ,
Right(VVEND,8,'0') Right(LDASIZEA,8,' ')'K'
If Bitand(CVTOSLV2,'01'x) = '01'x then , /* OS/390 R10 and above */
Queue ' CSA ' Right(GDACSAH,8,'0') ' ' ,
Right(CSAEND,8,'0') Right(GDACSASZ,8,' ')'K' ,
Right(GDA_CSA_ALLOC,8,' ')'K ' ,
Right(GDACSAHWM,7,' ')'K'
Else ,
Queue ' CSA ' Right(GDACSAH,8,'0') ' ' ,
Right(CSAEND,8,'0') Right(GDACSASZ,8,' ')'K' ,
Right(GDA_CSA_ALLOC,8,' ')'K'
Queue ' MLPA ' Right(CVTMLPAS,8,'0') ' ' ,
Right(CVTMLPAE,8,'0') Right(MLPASZ,8,' ')'K'
Queue ' FLPA ' Right(CVTFLPAS,8,'0') ' ' ,
Right(CVTFLPAE,8,'0') Right(FLPASZ,8,' ')'K'
Queue ' PLPA ' Right(CVTPLPAS,8,'0') ' ' ,
Right(CVTPLPAE,8,'0') Right(PLPASZ,8,' ')'K'
If Bitand(CVTOSLV2,'01'x) = '01'x then , /* OS/390 R10 and above */
Queue ' SQA ' Right(GDASQAH,8,'0') ' ' ,
Right(SQAEND,8,'0') Right(GDASQASZ,8,' ')'K' ,
Right(GDA_SQA_ALLOC,8,' ')'K' Right(GDA_CSA_CONV,7,' ')'K' ,
Right(GDASQAHWM,7,' ')'K'
Else ,
Queue ' SQA ' Right(GDASQAH,8,'0') ' ' ,
Right(SQAEND,8,'0') Right(GDASQASZ,8,' ')'K' ,
Right(GDA_SQA_ALLOC,8,' ')'K' Right(GDA_CSA_CONV,7,' ')'K'
Queue ' R/W Nucleus ' Right(CVTRWNS,8,'0') ' ' ,
Right(CVTRWNE,8,'0') Right(RWNUCSZ,8,' ')'K'
Queue ' R/O Nucleus ' Right(CVTRONS,8,'0') ' ' ,
Right('FFFFFF',8,'0') Right(RONUCSZB,8,' ')'K',
'(Spans 16M line)'
Queue ' 16M line -----------------------------'
Queue ' Ext. R/O Nucleus ' Right('1000000',8,'0') ' ' ,
Right(CVTRONE,8,'0') Right(RONUCSZA,8,' ')'K' ,
'(Total' RONUCSZ'K)'
Queue ' Ext. R/W Nucleus ' Right(CVTERWNS,8,'0') ' ' ,
Right(CVTERWNE,8,'0') Right(ERWNUCSZ,8,' ')'K'
If Bitand(CVTOSLV2,'01'x) = '01'x then , /* OS/390 R10 and above */
Queue ' Ext. SQA ' Right(GDAESQAH,8,'0') ' ' ,
Right(ESQAEND,8,'0') Right(GDAESQAS,8,' ')'K' ,
Right(GDA_ESQA_ALLOC,8,' ')'K' Right(GDA_ECSA_CONV,7,' ')'K',
Right(GDAESQAHWM,7,' ')'K'
Else ,
Queue ' Ext. SQA ' Right(GDAESQAH,8,'0') ' ' ,
Right(ESQAEND,8,'0') Right(GDAESQAS,8,' ')'K' ,
Right(GDA_ESQA_ALLOC,8,' ')'K' Right(GDA_ECSA_CONV,7,' ')'K'
Queue ' Ext. PLPA ' Right(CVTEPLPS,8,'0') ' ' ,
Right(CVTEPLPE,8,'0') Right(EPLPASZ,8,' ')'K'
Queue ' Ext. FLPA ' Right(CVTEFLPS,8,'0') ' ' ,
Right(CVTEFLPE,8,'0') Right(EFLPASZ,8,' ')'K'
Queue ' Ext. MLPA ' Right(CVTEMLPS,8,'0') ' ' ,
Right(CVTEMLPE,8,'0') Right(EMLPASZ,8,' ')'K'
If Bitand(CVTOSLV2,'01'x) = '01'x then , /* OS/390 R10 and above */
Queue ' Ext. CSA ' Right(GDAECSAH,8,'0') ' ' ,
Right(ECSAEND,8,'0') Right(GDAECSAS,8,' ')'K' ,
Right(GDA_ECSA_ALLOC,8,' ')'K ' ,
Right(GDAECSAHWM,7,' ')'K'
Else ,
Queue ' Ext. CSA ' Right(GDAECSAH,8,'0') ' ' ,
Right(ECSAEND,8,'0') Right(GDAECSAS,8,' ')'K' ,
Right(GDA_ECSA_ALLOC,8,' ')'K'
Queue ' Ext. Private ' Right(GDAEPVTH,8,'0') ' ' ,
Right(EPVTEND,8,'0') Right(GDAEPVTS,8,' ')'M'
End /* else do (VMAP <> 'HIGHFIRST') */

If bitand(CVTOSLV3,'02'x) = '02'x then do /* z/OS 1.5 and above? */


/* Yes, get HVSHARE info from the RCE */
RCELVSHRSTRT = C2d(Storage(D2x(RCE + 544),8)) /* low virt addr */
/* for 64-bit shr */
RCELVSHRSTRT_D = C2x(Storage(D2x(RCE + 544),8)) /* make readable */
VSHRSTRT_D = Substr(RCELVSHRSTRT_D,1,8) , /* address range */
Substr(RCELVSHRSTRT_D,9,8) /* display */
RCELVHPRSTRT = C2d(Storage(D2x(RCE + 552),8)) /* low virt addr */
/* for 64-bit prv */
RCELVHPRSTRT_D = C2d(Storage(D2x(RCE + 552),8)) -1 /*make readable */
RCELVHPRSTRT_D = Right(D2x(RCELVHPRSTRT_D),16,'0') /* address */
VHPRSTRT_D = Substr(RCELVHPRSTRT_D,1,8) , /* range */
Substr(RCELVHPRSTRT_D,9,8) /* display */
TOTAL_VHSHR = RCELVHPRSTRT - RCELVSHRSTRT /* total shared */
TOTAL_VHSHR = TOTAL_VHSHR/1024/1024 /* change to MB */
TOTAL_VHSHR = FORMAT_MEMSIZE(TOTAL_VHSHR) /* format size */

RCELVSHRSTRT = RCELVSHRSTRT/1024/1024 /* change to MB */


RCELVSHRSTRT = FORMAT_MEMSIZE(RCELVSHRSTRT) /* format size */

RCELVHPRSTRT = RCELVHPRSTRT/1024/1024 /* change to MB */


RCELVHPRSTRT = FORMAT_MEMSIZE(RCELVHPRSTRT) /* format size */

RCELVSHRPAGES = C2d(Storage(D2x(RCE + 584),8)) /* shr pages */


RCELVSHRPAGES = (RCELVSHRPAGES*4)/1024 /* change to MB */
RCELVSHRPAGES = FORMAT_MEMSIZE(RCELVSHRPAGES) /* format size */

RCELVSHRGBYTES = C2d(Storage(D2x(RCE + 592),8)) /* shr bytes HWM */


RCELVSHRGBYTES = RCELVSHRGBYTES/1024/1024 /* change to MB */
RCELVSHRGBYTES = FORMAT_MEMSIZE(RCELVSHRGBYTES) /* format size */

Queue ' '


Queue ' 64-Bit Shared Virtual Storage (HVSHARE):'
Queue ' '
Queue ' Shared storage total:' TOTAL_VHSHR
Queue ' Shared storage range:' RCELVSHRSTRT'-'RCELVHPRSTRT ,
'('VSHRSTRT_D' - 'VHPRSTRT_D')'
Queue ' Shared storage allocated:' RCELVSHRPAGES
Queue ' Shared storage allocated HWM:' RCELVSHRGBYTES

End /* If bitand(CVTOSLV3,'02'x) = '02'x */

If bitand(CVTOSLV5,'08'x) = '08'x then do /* z/OS 1.10 and above */


/* Yes, get HVCOMMON info from the RCE */
RCEHVCommonStrt = C2d(Storage(D2x(RCE + 872),8)) /*low virt addr */
/*for 64-bit cmn*/
CommonStrt_D = C2x(Storage(D2x(RCE + 872),8)) /*make readable */
CommonStrt_D = Substr(CommonStrt_D,1,8) , /* address range*/
Substr(CommonStrt_D,9,8) /* display */

RCEHVCommonEnd = C2d(Storage(D2x(RCE + 880),8)) /*high virt addr*/


/*for 64-bit cmn*/
RCEHVCommonEnd = RCEHVCommonEnd + 1 /* Add 1 to addr*/
CommonEnd_D = C2x(Storage(D2x(RCE + 880),8)) /*make readable */
CommonEnd_D = Substr(CommonEnd_D,1,8) , /* address range*/
Substr(CommonEnd_D,9,8) /* display */

TOTAL_VHCOMN = RCEHVCommonEnd-RCEHVCommonStrt /* total common */


TOTAL_VHCOMN = TOTAL_VHCOMN/1024/1024 /* change to MB */
TOTAL_VHCOMN = FORMAT_MEMSIZE(TOTAL_VHCOMN) /* format size */

RCEHVCommonStrt = RCEHVCommonStrt/1024/1024 /* chg to MB */


RCEHVCommonStrt = FORMAT_MEMSIZE(RCEHVCommonStrt) /* format size */

RCEHVCommonEnd = RCEHVCommonEnd/1024/1024 /* chg to MB */


RCEHVCommonEnd = FORMAT_MEMSIZE(RCEHVCommonEnd) /* format size */

RCEHVCommonPAGES = C2d(Storage(D2x(RCE + 888),8)) /* comn pages */


RCEHVCommonPAGES = (RCEHVCommonPAGES*4)/1024 /* chg to MB */
RCEHVCommonPAGES = FORMAT_MEMSIZE(RCEHVCommonPAGES) /*format size*/
RCEHVCommonHWMBytes = C2d(Storage(D2x(RCE + 896),8)) /* comn HWM */
RCEHVCommonHWMBytes = RCEHVCommonHWMBytes/1024/1024 /*chg to MB */
RCEHVCommonHWMBytes = FORMAT_MEMSIZE(RCEHVCommonHWMBytes) /* fmt */

Queue ' '


Queue ' 64-Bit Common Virtual Storage (HVCOMMON):'
Queue ' '
Queue ' Common storage total:' TOTAL_VHCOMN
Queue ' Common storage range:' RCEHVCommonStrt'-'RCEHVCommonEnd ,
'('CommonStrt_D' - 'CommonEnd_D')'
Queue ' Common storage allocated:' RCEHVCommonPAGES
Queue ' Common storage allocated HWM:' RCEHVCommonHWMBytes
End /* If bitand(CVTOSLV5,'08'x) = '08'x */
If Bitand(CVTOSLV5,'10'x) = '10'x & , /* z/OS 1.9 and above & */
Bitand(CVTFLAG2,'01'x) = '01'x then do /* CVTEDAT on (z10 >)? */
LARGEMEM = 1 /* set LARGEMEM avail flg*/
RCEReconLFASize = C2d(Storage(D2x(RCE + 760),8)) /* recon lfarea */
RCENonReconLFASize = C2d(Storage(D2x(RCE + 768),8)) /* LFAREA */
/* Comment out or delete the next 2 lines of code if you want the */
/* large memory displays even if you specified or defaulted to */
/* LFAREA=0M (z/OS 1.9 & above) and have the hardware support. */
If RCEReconLFASize = 0 & RCENonReconLFASize = 0 then , /* both 0? */
LARGEMEM = 0
If Bitand(CVTOSLV6,'80'x) = '80'x then do /* z/OS 2.1 and above */
PL = 1 /* pageable1m + 2.1 & > */
/*****************/
/* 2G frame code */
/*****************/
RCE2GMemoryObjects = ,
C2d(Storage(D2x(RCE + 1256),8)) /* Number of 2G objects */
RCE2GNonReconLFASize = ,
C2d(Storage(D2x(RCE + 1272),8)) /* 2G frame area in 2G units */
RCE2GNonReconLFAUsed = ,
C2d(Storage(D2x(RCE + 1280),8)) /* used 2G frames */
RCE2GHWM = ,
C2d(Storage(D2x(RCE + 1288),4)) /* 2G used frames HWM */
If RCE2GNonReconLFASize <> 0 then LARGEMEM = 1 /* lfarea used */
End
Else PL = 0 /* no pageable1m */
End /* If Bitand(CVTOSLV5,'10'x) */
Else LARGEMEM = 0 /* < z/OS 1.9/no hw supt */
If LARGEMEM = 1 then do /* z/OS 1.10 & above */
RCELargeMemoryObjects = ,
C2d(Storage(D2x(RCE + 744),8)) /*tot large mem objs */
RCELargePagesBackedinReal = ,
C2d(Storage(D2x(RCE + 752),8)) /* tot lrg obj pages */
RCELFAvailGroups = ,
C2d(Storage(D2x(RCE + 796),4)) /* avial lrg frames */
RCEReconLFAUsed = ,
C2d(Storage(D2x(RCE + 776),8)) /* # recon 1M frames alloc */
RCENonReconLFAUsed = ,
C2d(Storage(D2x(RCE + 784),8)) /* # nonrecon 1M frames alloc */

LFASize = RCEReconLFASize + RCENonReconLFASize /* LFAREA size*/


LFA_Used = RCEReconLFAUsed + RCENonReconLFAUsed /* used LFAREA*/
LFA_Alloc1M = RCELargePagesBackedinReal /* 1M alloc */
LFA_Alloc4K = LFA_Used - LFA_Alloc1M /* 4K alloc */

If PL = 1 then do /* z/OS 2.1 / pageable1m support */


RCELargeUsed4K = ,
C2d(Storage(D2x(RCE + 1032),4)) /* 4K used for 1M req */
LFA_Alloc4K = RCELargeUsed4K /* chg var name for old code */
RceLargeAllocatedPL = ,
C2d(Storage(D2x(RCE + 1244),4)) /* # used pageable1m */
RceLargeUsedPLHWM = ,
C2d(Storage(D2x(RCE + 1252),4)) /* pageable1m HWM */
End

LFASize = FORMAT_MEMSIZE(LFASize) /* format size */


LFA_Avail = FORMAT_MEMSIZE(RCELFAvailGroups) /* format size */
LFA_Alloc1M = FORMAT_MEMSIZE(LFA_Alloc1M) /* format size */
LFA_Alloc4K = FORMAT_MEMSIZE(LFA_Alloc4K) /* format size */

If PL = 1 then do /* z/OS 2.1 + pageable1m support */


RceLargeAllocatedPL = FORMAT_MEMSIZE(RceLargeAllocatedPL)
RceLargeUsedPLHWM = FORMAT_MEMSIZE(RceLargeUsedPLHWM)
/*****************/
/* 2G frame code */
/*****************/
LFA2G_Size = FORMAT_MEMSIZE(RCE2GNonReconLFASize*2048)
LFA2G_Used = FORMAT_MEMSIZE(RCE2GNonReconLFAUsed*2048)
LFA2G_avail = ((RCE2GNonReconLFASize-RCE2GNonReconLFAUsed)*2048)
LFA2G_avail = FORMAT_MEMSIZE(LFA2G_avail)
LFA2G_Max = RCE2GHWM*2048
LFA2G_Max = FORMAT_MEMSIZE(LFA2G_Max)
End

If Bitand(CVTOSLV5,'04'x) = '04'x then do /* z/OS 1.12 and above */


RceLargeUsed1MHWM = ,
C2d(Storage(D2x(RCE + 804),4)) /*large pg HWM alloc behalf 1M */
RceLargeUsed4KHWM = ,
C2d(Storage(D2x(RCE + 808),4)) /*large pg HWM alloc behalf 4K */
LFA_Max1M = FORMAT_MEMSIZE(RceLargeUsed1MHWM) /* format size */
LFA_Max4K = FORMAT_MEMSIZE(RceLargeUsed4KHWM) /* format size */
End

Queue ' '


Queue ' 64-Bit Large Memory Virtual Storage (LFAREA):'
Queue ' '
If PL = 1 then do /* z/OS 2.1 / pageable1m support */
Queue ' Large memory area (LFAREA) :' LFASize ',' LFA2G_Size
Queue ' Large memory storage available:' LFA_Avail ',' ,
LFA2G_avail
End
Else do
Queue ' Large memory area (LFAREA) :' LFASize
Queue ' Large memory storage available:' LFA_Avail
End
Queue ' Large memory storage allocated (1M):' LFA_Alloc1M
Queue ' Large memory storage allocated (4K):' LFA_Alloc4K
If Bitand(CVTOSLV5,'04'x) = '04'x then do /* z/OS 1.12 and above */
Queue ' Large memory storage allocated HWM (1M):' LFA_Max1M
Queue ' Large memory storage allocated HWM (4K):' LFA_Max4K
End
If PL = 1 then do /* z/OS 2.1 / pageable1m support */
Queue ' Large memory storage allocated (PAGEABLE1M):' ,
RceLargeAllocatedPL
Queue ' Large memory storage allocated HWM (PAGEABLE1M):' ,
RceLargeUsedPLHWM
Queue ' Large memory storage allocated (2G):' LFA2G_Used ,
'/' RCE2GNonReconLFAUsed 'pages'
Queue ' Large memory storage allocated HWM (2G):' LFA2G_Max ,
'/' RCE2GHWM 'pages'
End
Queue ' Large memory objects allocated:' RCELargeMemoryObjects
If PL = 1 then , /* z/OS 2.1 / pageable1m support */
Queue ' Large memory objects allocated (2G):' RCE2GMemoryObjects
End
End /* If VMAPOPT <> 'NODISP' */
Return

PAGE: /* Page Data Sets information sub-routine */


Queue ' '
Queue 'Page Data Set Usage:'
Queue ' Type Full Slots Dev Volser Data Set Name'
ASMPART = C2d(Storage(D2x(ASMVT + 8),4)) /* Pnt to Pag Act Ref Tbl */
PARTSIZE = C2d(Storage(D2x(ASMPART+4),4)) /* Tot number of entries */
PARTDSNL = C2d(Storage(D2x(ASMPART+24),4)) /* Point to 1st pg dsn */
PARTENTS = ASMPART+80 /* Point to 1st parte */
Do I = 1 to PARTSIZE
If I > 1 then do
PARTENTS = PARTENTS + 96
PARTDSNL = PARTDSNL + 44
End
CHKINUSE = Storage(D2x(PARTENTS+9),1) /* in use flag */
If Bitand(CHKINUSE,'80'x) = '80'x then iterate /* not in use */
PGDSN = Storage(D2x(PARTDSNL),44) /* page data set name */
PGDSN = Strip(PGDSN,'T') /* remove trailing blanks */
PARETYPE = Storage(D2x(PARTENTS+8),1) /* type flag */
Select
When Bitand(PARETYPE,'80'x) = '80'x then PGTYPE = ' PLPA '
When Bitand(PARETYPE,'40'x) = '40'x then PGTYPE = ' COMMON '
When Bitand(PARETYPE,'20'x) = '20'x then PGTYPE = ' DUPLEX '
When Bitand(PARETYPE,'10'x) = '10'x then PGTYPE = ' LOCAL '
Otherwise PGTYPE = '??????'
End /* Select */
If PGTYPE = ' LOCAL ' then do
PAREFLG1 = Storage(D2x(PARTENTS+9),1) /* PARTE flags */
If Bitand(PAREFLG1,'10'x) = '10'x then PGTYPE = ' LOCAL NV'
End
PAREUCBP = C2d(Storage(D2x(PARTENTS+44),4)) /* point to UCB */
PGUCB = C2x(Storage(D2x(PAREUCBP+4),2)) /* UCB address */
PGVOL = Storage(D2x(PAREUCBP+28),6) /* UCB volser */
PARESZSL = C2d(Storage(D2x(PARTENTS+16),4)) /* total slots */
PARESZSL = Right(PARESZSL,9,' ') /* ensure 9 digits */
PARESLTA = C2d(Storage(D2x(PARTENTS+20),4)) /* avail. slots */
PGFULL = ((PARESZSL-PARESLTA) / PARESZSL) * 100 /* percent full */
PGFULL = Format(PGFULL,3,2) /* force 2 decimals */
PGFULL = Left(PGFULL,3) /* keep intiger only */
Queue ' 'PGTYPE' 'PGFULL'% 'PARESZSL' 'PGUCB' ' ,
PGVOL' 'PGDSN
End /* do I=1 to partsize */
/*********************************************************************/
/* SCM - Storage Class Memory */
/* ASMVX - SYS1.MODGEN(ILRASMVX) pointed to in SYS1.MODGEN(ILRASMVT) */
/*********************************************************************/
/*If Bitand(CVTOSLV5,'01'x) = '01'x then do */ /* z/OS 1.13 and > */
If Bitand(CVTOSLV6,'80'x) = '80'x then do /* z/OS 2.1 and above */
SCMSTATUS = 'NOT-USED' /* set dflt to not used */
ASMVX = C2d(Storage(D2x(ASMVT + 1236),4)) /* point to ASM tbl ext */
SCMBLKSAVAIL = C2d(Storage(D2x(ASMVX + 8),8)) /* SCM blks avail */
SCMNVBC = C2d(Storage(D2x(ASMVX + 16),8)) /* SCM blks used */
SCMERRS = C2d(Storage(D2x(ASMVX + 24),8)) /* bad SCM blks */
If (SCMBLKSAVAIL > 0) then do /* SCM is used */
SCMSTATUS = 'IN-USE ' /* status is IN-USE */
SCMPCTUSED = Trunc(SCMNVBC*100/SCMBLKSAVAIL) /* percent used */
SCMPCTUSED = Format(SCMPCTUSED,3,2) /* format for display */
SCMPCTUSED = Left(SCMPCTUSED,3) /* format for display */
Call FORMAT_COMMAS SCMBLKSAVAIL /* format with commas */
SCMBLKSAVAIL = FORMATTED_WHOLENUM /* save number */
Call FORMAT_COMMAS SCMNVBC /* format with commas */
SCMNVBC = FORMATTED_WHOLENUM /* save number */
Call FORMAT_COMMAS SCMERRS /* format with commas */
SCMERRS = FORMATTED_WHOLENUM /* save number */
SCMBLKSAVAIL = Right(SCMBLKSAVAIL,16) /* format for display */
SCMNVBC = Right(SCMNVBC,16) /* format for display */
SCMERRS = Right(SCMERRS,16) /* format for display */
End
Queue ' '
Queue 'Storage Class Memory:'
Queue ' STATUS FULL SIZE USED' ,
' IN-ERROR'
If SCMSTATUS = 'NOT-USED' then Queue ' ' SCMSTATUS
Else do
Queue ' ' SCMSTATUS ' ' SCMPCTUSED || '% ' ,
SCMBLKSAVAIL SCMNVBC SCMERRS
End
End
Return

SMF: /* SMF Data Set information sub-routine */


Queue ' '
Queue 'SMF Data Set Usage:'
Queue ' Name Volser Size(Blks) %Full Status'
SMCAMISC = Storage(D2x(SMCA + 1),1) /* misc. indicators */
If bitand(SMCAMISC,'80'x) <> '80'x then do /* smf active ?? */
Queue ' *** SMF recording not being used ***'
Return
End
SMCAFRDS = C2d(Storage(D2x(SMCA + 244),4)) /* point to first RDS */
SMCALRDS = C2d(Storage(D2x(SMCA + 248),4)) /* point to last RDS */
SMCASMCX = C2d(Storage(D2x(SMCA + 376),4)) /* point to SMCX */
SMCXLSBT = Storage(D2x(SMCASMCX + 88),1) /* logstream bits */
If Bitand(SMCXLSBT,'80'x) = '80'x then do /* logstream recording? */
If SMCAFRDS = SMCALRDS then do
Queue ' *** SMF LOGSTREAM recording is active ***'
Queue ' *** LOGSTREAM information not available via REXX ***'
Return
End
Else do
Queue ' *** SMF LOGSTREAM recording is active ***'
Queue ' *** LOGSTREAM information not available via REXX ***'
Queue ' *** SMF data sets listed below not in use ***'
End
End /* If Bitand(SMCXLSBT,'80'x) */
If SMCAFRDS = SMCALRDS then do
Queue ' *** No SMF data sets available ***'
Return
End
Do until SMCAFRDS = SMCALRDS /* end loop when next rds ptr = last */
RDSNAME = Strip(Storage(D2x(SMCAFRDS + 16),44)) /* smf dsn */
RDSVOLID = Storage(D2x(SMCAFRDS + 60),6) /* smf volser */
RDSCAPTY = C2d(Storage(D2x(SMCAFRDS + 76),4)) /* size in blks */
RDSNXTBL = C2d(Storage(D2x(SMCAFRDS + 80),4)) /* next avl blk */
/* RDSPCT = (RDSNXTBL / RDSCAPTY) * 100 */ /* not how mvs does it */
RDSPCT = Trunc((RDSNXTBL / RDSCAPTY) * 100) /* same as mvs disp. */
RDSFLG1 = Storage(D2x(SMCAFRDS + 12),1) /* staus flags */
Select
When Bitand(RDSFLG1,'10'x) = '10'x then RDSSTAT = 'FREE REQUIRED'
When Bitand(RDSFLG1,'08'x) = '08'x then RDSSTAT = 'DUMP REQUIRED'
When Bitand(RDSFLG1,'04'x) = '04'x then RDSSTAT = 'ALTERNATE'
When Bitand(RDSFLG1,'02'x) = '02'x then RDSSTAT = 'CLOSE PENDING'
When Bitand(RDSFLG1,'01'x) = '01'x then RDSSTAT = 'OPEN REQUIRED'
When Bitand(RDSFLG1,'00'x) = '00'x then RDSSTAT = 'ACTIVE'
Otherwise RDSSTAT = '??????'
End /* Select */
If (RDSSTAT = 'ACTIVE' | RDSSTAT = 'DUMP REQUIRED') , /* display */
& RDSPCT = 0 then RDSPCT = 1 /* %full the same way mvs does */
SMCAFRDS = C2d(Storage(D2x(SMCAFRDS + 4),4)) /* point to next RDS */
If Length(RDSNAME) < 26 then do
Queue ' ' Left(RDSNAME,25,' ') RDSVOLID Right(RDSCAPTY,11,' ') ,
' 'Format(RDSPCT,5,0) ' ' RDSSTAT
End
Else do
Queue ' ' RDSNAME
Queue copies(' ',27) RDSVOLID Right(RDSCAPTY,11,' ') ,
' 'Format(RDSPCT,5,0) ' ' RDSSTAT
End
End
Return

SUB: /* Subsystem information sub-routine */


Arg SUBOPT
SSCVT = C2d(Storage(D2x(JESCT+24),4)) /* point to SSCVT */
SSCVT2 = SSCVT /* save address for second loop */
If SUBOPT <> 'FINDJES' then do
Queue ' '
Queue 'Subsystem Communications Vector Table:'
Queue ' Name Hex SSCTADDR SSCTSSVT' ,
' SSCTSUSE SSCTSUS2 Status'
End /* if subopt */
Do until SSCVT = 0
SSCTSNAM = Storage(D2x(SSCVT+8),4) /* subsystem name */
SSCTSSVT = C2d(Storage(D2x(SSCVT+16),4)) /* subsys vect tbl ptr */
SSCTSUSE = C2d(Storage(D2x(SSCVT+20),4)) /* SSCTSUSE pointer */
SSCTSUS2 = C2d(Storage(D2x(SSCVT+28),4)) /* SSCTSUS2 pointer */
If SUBOPT = 'FINDJES' & SSCTSNAM = JESPJESN then do
JESSSVT = SSCTSSVT /* save SSVTSSVT for "version" section */
/* this points to JES3 Subsystem Vector */
/* Table, mapped by IATYSVT */
JESSUSE = SSCTSUSE /* save SSCTSUSE for "version" section */
/* this points to version for JES2 */
JESSUS2 = SSCTSUS2 /* save SSCTSUS2 for "version" section */
/* this points to $HCCT for JES2 */
Leave /* found JES info for version section, exit loop */
End /* if subopt */
SSCTSNAX = C2x(SSCTSNAM) /* chg to EBCDIC for non-display chars */
Call XLATE_NONDISP SSCTSNAM /* translate non display chars */
SSCTSNAM = RESULT /* result from XLATE_NONDISP */
If SSCTSSVT = 0 then SSCT_STAT = 'Inactive'
Else SSCT_STAT = 'Active'
If SUBOPT <> 'FINDJES' then do
Queue ' ' SSCTSNAM ' ' SSCTSNAX ,
' ' Right(D2x(SSCVT),8,0) ' ' Right(D2x(SSCTSSVT),8,0) ,
' ' Right(D2x(SSCTSUSE),8,0) ' ' Right(D2x(SSCTSUS2),8,0) ,
' ' SSCT_STAT ' '
End /* if SUBOPT */
/*SSCTSSID = C2d(Storage(D2x(SSCVT+13),1)) */ /* subsys identifier */
/*If bitand(SSCTSSID,'02'x) = '02'x then JESPJESN = 'JES2' */
/*If bitand(SSCTSSID,'03'x) = '03'x then JESPJESN = 'JES3'*/
SSCVT = C2d(Storage(D2x(SSCVT+4),4)) /* next sscvt or zero */
End /* do until sscvt = 0 */
If SUBOPT <> 'FINDJES' then do
Queue ' '
Queue 'Supported Subsystem Function Codes:'
Do until SSCVT2 = 0 /* 2nd loop for function codes */
SSCTSNAM = Storage(D2x(SSCVT2+8),4) /* subsystem name */
SSCTSSVT = C2d(Storage(D2x(SSCVT2+16),4)) /* subsys vect tbl ptr */
SSCTSNAX = C2x(SSCTSNAM) /* chg to EBCDIC for non-display chars */
Call XLATE_NONDISP SSCTSNAM /* translate non display chars */
SSCTSNAM = RESULT /* result from XLATE_NONDISP */
Queue ' ' SSCTSNAM '(X''' || SSCTSNAX || ''')'
If SSCTSSVT <> 0 then do
SSVTFCOD = SSCTSSVT + 4 /* pt to funct. matrix*/
SSFUNCTB = Storage(D2X(SSVTFCOD),255) /* function matrix */
TOTFUNC = 0 /* counter for total functions per subsystem */
Drop FUNC. /* init stem to null for saved functions */
Do SUPFUNC = 1 TO 255
If Substr(SSFUNCTB,SUPFUNC,1) <> '00'x then do /* supported? */
TOTFUNC = TOTFUNC + 1 /* tot functions for this subsystem */
FUNC.TOTFUNC = SUPFUNC /* save function in stem */
End
End /* do supfunc */
/***************************************************************/
/* The following code is used to list the supported function */
/* codes by ranges. For example: 1-10,13,18-30,35,70,143-145 */
/***************************************************************/
If TOTFUNC >= 1 then do /* begin loop to list function codes */
ALLCODES = '' /* init var to nulls */
NEWRANGE = 'YES' /* init newrange flag to YES */
FIRSTRNG = 'YES' /* init firstrng flag to YES */
Do FCODES = 1 to TOTFUNC /* loop though codes */
JUNK = TOTFUNC + 1 /* prevent NOVALUE cond. */
FUNC.JUNK = '' /* in func.chknext at end */
CHKNEXT = FCODES + 1 /* stem var to chk next code */
If FUNC.FCODES + 1 = FUNC.CHKNEXT then do /* next matches */
If NEWRANGE = 'YES' & FIRSTRNG = 'YES' then do /* first */
ALLCODES = ALLCODES || FUNC.FCODES || '-' /* in new */
NEWRANGE = 'NO' /* range - seperate */
FIRSTRNG = 'NO' /* with a dash */
Iterate /* get next code */
End /* if newrange = 'yes' & firstrng = 'yes' */
If NEWRANGE = 'YES' & FIRSTRNG = 'NO' then do /* next */
ALLCODES = ALLCODES || FUNC.FCODES /* matches, but */
NEWRANGE = 'NO' /* is not the first, don't add dash */
Iterate /* get next code */
End /* if newrange = 'yes' & firstrng = 'no' */
Else iterate /* same range + not first - get next code */
End /* func.fcodes + 1 */
If FCODES = TOTFUNC then , /* next doesn't match and this */
ALLCODES = ALLCODES || FUNC.FCODES /* is the last code */
Else do /* next code doesn't match - seperate with comma */
ALLCODES = ALLCODES || FUNC.FCODES || ','
NEWRANGE = 'YES' /* re-init newrange flag to YES */
FIRSTRNG = 'YES' /* re-init firstrng flag to YES */
End
End /* do fcodes = 1 to totfunc */
/*************************************************************/
/* The code below splits up the ranges to multiple lines if */
/* they won't all fit on a single line due to IPLINFO lrecl. */
/*************************************************************/
FUN_MAXL = 68 /* max length b4 need to split out codes */
If Length(ALLCODES) <= FUN_MAXL then , /* fits on one line */
Queue ' Codes:' ALLCODES
Else do /* need to split up */
FUNSPLT = Pos(',',ALLCODES,FUN_MAXL-6) /* split at comma */
ALLCODES_1 = Substr(ALLCODES,1,FUNSPLT) /* 1st part */
ALLCODES_2 = Strip(Substr(ALLCODES,FUNSPLT+1,FUN_MAXL))
Queue ' Codes:' ALLCODES_1
Queue ' ' ALLCODES_2
End /* else do */
End /* if totfunc >= 1 */
End
Else queue ' *Inactive*'
SSCVT2 = C2d(Storage(D2x(SSCVT2+4),4)) /* next sscvt or zero */
End /* do until sscvt2 = 0 */
End /* if subopt <> 'findjes' */
Return

ASID: /* ASVT Usage sub-routine */


Queue ' '
CVTASVT = C2d(Storage(D2x(CVT+556),4)) /* point to ASVT */
ASVTMAXU = C2d(Storage(D2x(CVTASVT+516),4)) /* max number of entries */
ASVTMAXI = C2d(Storage(D2x(CVTASVT+500),4)) /* MAXUSERS from ASVT */
ASVTAAVT = C2d(Storage(D2x(CVTASVT+480),4)) /* free slots in ASVT */
ASVTSTRT = C2d(Storage(D2x(CVTASVT+492),4)) /* RSVTSTRT from ASVT */
ASVTAST = C2d(Storage(D2x(CVTASVT+484),4)) /* free START/SASI */
ASVTNONR = C2d(Storage(D2x(CVTASVT+496),4)) /* RSVNONR from ASVT */
ASVTANR = C2d(Storage(D2x(CVTASVT+488),4)) /* free non-reusable */
Queue 'ASID Usage Summary from the ASVT:'
Queue ' Maximum number of ASIDs:' Right(ASVTMAXU,5,' ')
Queue ' '
Queue ' MAXUSER from IEASYSxx:' Right(ASVTMAXI,5,' ')
Queue ' In use ASIDs:' Right(ASVTMAXI-ASVTAAVT,5,' ')
Queue ' Available ASIDs:' Right(ASVTAAVT,5,' ')
Queue ' '
Queue ' RSVSTRT from IEASYSxx:' Right(ASVTSTRT,5,' ')
Queue ' RSVSTRT in use:' Right(ASVTSTRT-ASVTAST,5,' ')
Queue ' RSVSTRT available:' Right(ASVTAST,5,' ')
Queue ' '
Queue ' RSVNONR from IEASYSxx:' Right(ASVTNONR,5,' ')
Queue ' RSVNONR in use:' Right(ASVTNONR-ASVTANR,5,' ')
Queue ' RSVNONR available:' Right(ASVTANR,5,' ')
Return

LPA: /* LPA List sub-routine */


CVTSMEXT = C2d(Storage(D2x(CVT + 1196),4)) /* point to stg map ext.*/
CVTEPLPS = C2d(Storage(D2x(CVTSMEXT+56),4)) /* start vaddr of ELPA */
NUMLPA = C2d(Storage(D2x(CVTEPLPS+4),4)) /* # LPA libs in table */
LPAOFF = 8 /* first ent in LPA tbl */
Queue ' '
Queue 'LPA Library List ('NUMLPA' libraries):'
Queue ' POSITION DSNAME'
Do I = 1 to NUMLPA
LEN = C2d(Storage(D2x(CVTEPLPS+LPAOFF),1)) /* length of entry */
LPDSN = Storage(D2x(CVTEPLPS+LPAOFF+1),LEN) /* DSN of LPA library */
LPAOFF = LPAOFF + 44 + 1 /* next entry in table*/
LPAPOS = Right(I,3) /* position in LPA list */
RELLPPOS = Right('(+'I-1')',6) /* relative position in list */
Queue LPAPOS RELLPPOS ' ' LPDSN
End
Return

LNKLST: /* LNKLST sub-routine */


If Bitand(CVTOSLV1,'01'x) <> '01'x then do /* below OS/390 R2 */
CVTLLTA = C2d(Storage(D2x(CVT + 1244),4)) /* point to lnklst tbl */
NUMLNK = C2d(Storage(D2x(CVTLLTA+4),4)) /* # LNK libs in table */
LLTAPFTB = CVTLLTA + 8 + (NUMLNK*45) /* start of LLTAPFTB */
LNKOFF = 8 /*first ent in LBK tbl */
LKAPFOFF = 0 /*first ent in LLTAPFTB*/
Queue ' '
Queue 'LNKLST Library List ('NUMLNK' Libraries):'
Queue ' POSITION APF DSNAME'
Do I = 1 to NUMLNK
LEN = C2d(Storage(D2x(CVTLLTA+LNKOFF),1)) /* length of entry */
LKDSN = Storage(D2x(CVTLLTA+LNKOFF+1),LEN) /* DSN of LNK lib */
CHKAPF = Storage(D2x(LLTAPFTB+LKAPFOFF),1) /* APF flag */
If bitand(CHKAPF,'80'x) = '80'x then LKAPF = 'Y' /* flag on */
else LKAPF = ' ' /* APF flag off */
LNKOFF = LNKOFF + 44 + 1 /*next entry in tbl*/
LKAPFOFF = LKAPFOFF + 1 /* next entry in LLTAPFTB */
LNKPOS = Right(I,3) /*position in list */
RELLKPOS = Right('(+'I-1')',6) /* relative position in list */
Queue LNKPOS RELLKPOS ' ' LKAPF ' ' LKDSN
End
End
Else do /* OS/390 1.2 and above - PROGxx capable LNKLST */
ASCB = C2d(Storage(224,4)) /* point to ASCB */
ASSB = C2d(Storage(D2x(ASCB+336),4)) /* point to ASSB */
DLCB = C2d(Storage(D2x(ASSB+236),4)) /* point to CSVDLCB */
DLCBFLGS = Storage(d2x(DLCB + 32),1) /* DLCB flag bits */
SETNAME = Storage(D2x(DLCB + 36),16) /* LNKLST set name */
SETNAME = Strip(SETNAME,'T') /* del trailing blanks*/
CVTLLTA = C2d(Storage(D2x(DLCB + 16),4)) /* point to lnklst tbl*/
LLTX = C2d(Storage(D2x(DLCB + 20),4)) /* point to LLTX */
NUMLNK = C2d(Storage(D2x(CVTLLTA+4),4)) /* # LNK libs in table*/
LLTAPFTB = CVTLLTA + 8 + (NUMLNK*45) /* start of LLTAPFTB */
LNKOFF = 8 /*first ent in LLT tbl*/
VOLOFF = 8 /*first ent in LLTX */
LKAPFOFF = 0 /*first ent in LLTAPFTB*/
If Bitand(DLCBFLGS,'10'x) = '10'x then , /* bit for LNKAUTH */
LAUTH = 'LNKLST' /* LNKAUTH=LNKLST */
Else LAUTH = 'APFTAB' /* LNKAUTH=APFTAB */
Queue ' '
Queue 'LNKLST Library List - Set:' SETNAME ,
' LNKAUTH='LAUTH '('NUMLNK' Libraries):'
If LAUTH = 'LNKLST' then ,
Queue ' (All LNKLST data sets marked APF=Y due to' ,
'LNKAUTH=LNKLST)'
Queue ' POSITION APF VOLUME DSNAME'
Do I = 1 to NUMLNK
LEN = C2d(Storage(D2x(CVTLLTA+LNKOFF),1)) /* length of entry */
LKDSN = Storage(D2x(CVTLLTA+LNKOFF+1),LEN) /* DSN of LNK lib */
LNKVOL = Storage(D2x(LLTX+VOLOFF),6) /* VOL of LNK lib */
CHKAPF = Storage(D2x(LLTAPFTB+LKAPFOFF),1) /* APF flag */
If bitand(CHKAPF,'80'x) = '80'x then LKAPF = 'Y' /* flag on */
else LKAPF = ' ' /* APF flag off */
LNKOFF = LNKOFF + 44 + 1 /*next entry in LLT*/
VOLOFF = VOLOFF + 8 /*next vol in LLTX */
LKAPFOFF = LKAPFOFF + 1 /* next entry in LLTAPFTB */
LNKPOS = Right(I,3) /*position in list */
RELLKPOS = Right('(+'I-1')',6) /* relative position in list */
Queue LNKPOS RELLKPOS ' ' LKAPF ' ' LNKVOL ' ' LKDSN
End
End
Return

APF: /* APF List sub-routine */


CVTAUTHL = C2d(Storage(D2x(CVT + 484),4)) /* point to auth lib tbl*/
If CVTAUTHL <> C2d('7FFFF001'x) then do /* dynamic list ? */
NUMAPF = C2d(Storage(D2x(CVTAUTHL),2)) /* # APF libs in table */
APFOFF = 2 /* first ent in APF tbl */
Queue ' '
Queue 'APF Library List ('NUMAPF' libraries):'
Queue ' ENTRY VOLUME DSNAME'
Do I = 1 to NUMAPF
LEN = C2d(Storage(D2x(CVTAUTHL+APFOFF),1)) /* length of entry */
VOL = Storage(D2x(CVTAUTHL+APFOFF+1),6) /* VOLSER of APF LIB */
DSN = Storage(D2x(CVTAUTHL+APFOFF+1+6),LEN-6) /* DSN of apflib */
APFOFF = APFOFF + LEN +1
APFPOS = Right(I,4) /*position in APF list*/
Queue ' 'APFPOS ' ' VOL ' ' DSN
End
End
Else Do
ECVT = C2d(Storage(D2x(CVT + 140),4)) /* point to CVTECVT */
ECVTCSVT = C2d(Storage(D2x(ECVT + 228),4)) /* point to CSV table */
APFA = C2d(Storage(D2x(ECVTCSVT + 12),4)) /* APFA */
AFIRST = C2d(Storage(D2x(APFA + 8),4)) /* First entry */
ALAST = C2d(Storage(D2x(APFA + 12),4)) /* Last entry */
LASTONE = 0 /* flag for end of list */
NUMAPF = 1 /* tot # of entries in list */
Do forever
DSN.NUMAPF = Storage(D2x(AFIRST+24),44) /* DSN of APF library */
DSN.NUMAPF = Strip(DSN.NUMAPF,'T') /* remove blanks */
CKSMS = Storage(D2x(AFIRST+4),1) /* DSN of APF library */
if bitand(CKSMS,'80'x) = '80'x /* SMS data set? */
then VOL.NUMAPF = '*SMS* ' /* SMS control dsn */
else VOL.NUMAPF = Storage(D2x(AFIRST+68),6) /* VOL of APF lib */
If Substr(DSN.NUMAPF,1,1) <> X2c('00') /* check for deleted */
then NUMAPF = NUMAPF + 1 /* APF entry */
AFIRST = C2d(Storage(D2x(AFIRST + 8),4)) /* next entry */
if LASTONE = 1 then leave
If AFIRST = ALAST then LASTONE = 1
End
Queue ' '
Queue 'APF Library List - Dynamic ('NUMAPF - 1' libraries):'
Queue ' ENTRY VOLUME DSNAME'
Do I = 1 to NUMAPF-1
APFPOS = Right(I,4) /*position in APF list*/
Queue ' 'APFPOS ' ' VOL.I ' ' DSN.I
End
End
Return

SVC: /* SVC information sub-routine */


/*********************************************************************/
/* See SYS1.MODGEN(IHASVC) for descriptions of SVC attributes */
/*********************************************************************/
CVTABEND = C2d(Storage(D2x(CVT+200),4)) /* point to CVTABEND */
SCVT = CVTABEND /* this is the SCVT - mapped by IHASCVT */
SCVTSVCT = C2d(Storage(D2x(SCVT+132),4)) /* point to SVCTABLE */
SCVTSVCR = C2d(Storage(D2x(SCVT+136),4)) /* point to SVC UPD TBL */
Call FIND_NUC 'IGCERROR' /* Find addr of IGCERROR in NUC MAP */
IGCERROR_ADDR = RESULT /* Save address of IGCERROR */
Call FIND_NUC 'IGCRETRN' /* Find addr of IGCRETRN in NUC MAP */
IGCRETRN_ADDR = RESULT /* Save address of IGCRETRN */
Call FIND_NUC 'IGXERROR' /* Find addr of IGXERROR in NUC MAP */
IGXERROR_ADDR = RESULT /* Save address of IGXERROR */
Call VMAP 'NODISP' /* call virt. stor map routine, "no display" */
/*********************************************************************/
/* The following code is needed to prevent errors in FIND_SVC_LOC */
/* routine "Select" because the VMAP sub-routine sets the address */
/* variables to "N/A" when MLPA/E-MLPA/FLPA/E-FLPA do not exist. */
/*********************************************************************/
If CVTMLPAS = 'N/A' then CVTMLPAS = 0 /* MLPA strt does not exist */
If CVTMLPAE = 'N/A' then CVTMLPAE = 0 /* MLPA end does not exist */
If CVTFLPAS = 'N/A' then CVTFLPAS = 0 /* FLPA strt does not exist */
If CVTFLPAE = 'N/A' then CVTFLPAE = 0 /* FLPA end does not exist */
If CVTEFLPS = 'N/A' then CVTEFLPS = 0 /* E-FLPA strt does not exist */
If CVTEFLPE = 'N/A' then CVTEFLPE = 0 /* E-FLPA end does not exist */
If CVTEMLPS = 'N/A' then CVTEMLPS = 0 /* E-MLPA strt does not exist */
If CVTEMLPE = 'N/A' then CVTEMLPE = 0 /* E-MLPA end does not exist */
/*********************************************************************/
/* A little house keeping */
/*********************************************************************/
SVCACT_TOT = 0 /* total number of active std SVCs */
SVCUNUSED_TOT = 0 /* total number of unused std SVCs */
SVCAPF_TOT = 0 /* total number of std SVCs requiring APF */
SVCESR_T1_TOT = 0 /* total number of active Type 1 ESR SVCs */
SVCESR_T2_TOT = 0 /* total number of active Type 2 ESR SVCs */
SVCESR_T3_TOT = 0 /* total number of active Type 3/4 ESR SVCs */
SVCESR_T6_TOT = 0 /* total number of active Type 6 ESR SVCs */
/*********************************************************************/
/* Standard SVC table display loop */
/*********************************************************************/
Queue ' '
Queue 'SVC Table:'
Queue ' Num Hex EP-Addr Location AM TYP APF ESR ASF AR NP UP' ,
'CNT Old-EPA LOCKS'
Do SVCLST = 0 to 255
SVCTENT = Storage(D2x(SCVTSVCT+(SVCLST*8)),8) /* SVC Table Entry */
SVCTENTU = Storage(D2x(SCVTSVCR+(SVCLST*24)),24) /* SVC UP TBL ENT */
SVCOLDA = Substr(SVCTENTU,1,4) /* OLD EP Address */
SVCOLDAR = C2x(SVCOLDA) /* OLD addr readable */
SVCOLDAR = Right(SVCOLDAR,8,'0') /* ensure leading zeros */
SVCURCNT = C2d(Substr(SVCTENTU,21,2)) /* SVC update count */
SVCAMODE = Substr(SVCTENT,1,1) /* AMODE indicator */
SVCEPA = Substr(SVCTENT,1,4) /* Entry point addr */
SVCEPAR = C2x(SVCEPA) /* EPA - readable */
SVCEPAR = Right(SVCEPAR,8,'0') /* ensure leading zeros */
SVCATTR1 = Substr(SVCTENT,5,1) /* SVC attributes */
SVCATTR3 = Substr(SVCTENT,6,1) /* SVC attributes */
SVCLOCKS = Substr(SVCTENT,7,1) /* Lock attributes */
/**************************/
/* Save EPAs of ESR SVCs */
/**************************/
If SVCLST = 109 then SVC109AD = SVCEPA
If SVCLST = 116 then SVC116AD = SVCEPA
If SVCLST = 122 then SVC122AD = SVCEPA
If SVCLST = 137 then SVC137AD = SVCEPA
/**************************/
/* Check amode */
/**************************/
If Bitand(SVCAMODE,'80'x) = '80'x then SVC_AMODE = '31'
Else SVC_AMODE = '24'
/**************************/
/* Check SVC type flag */
/**************************/
Select /* determine SVC type */
When Bitand(SVCATTR1,'C0'x) = 'C0'x then SVCTYPE = '3/4'
When Bitand(SVCATTR1,'80'x) = '80'x then SVCTYPE = ' 2 '
When Bitand(SVCATTR1,'20'x) = '20'x then SVCTYPE = ' 6 '
When Bitand(SVCATTR1,'00'x) = '00'x then SVCTYPE = ' 1 '
Otherwise SVCTYPE = '???'
End /* select */
If SVCLST = 109 then SVCTYPE = ' 3 ' /* 109 is type 3 ESR, not 2 */
/**************************/
/* Check other SVC flags */
/**************************/
SVCAPF = ' ' ; SVCESR = ' ' ; SVCNP = ' ' /* init as blanks */
SVCASF = ' ' ; SVCAR = ' ' ; SVCUP = ' ' /* init as blanks */
If Bitand(SVCATTR1,'08'x) = '08'x then SVCAPF = 'APF'
If Bitand(SVCATTR1,'04'x) = '04'x then SVCESR = 'ESR'
If Bitand(SVCATTR1,'02'x) = '02'x then SVCNP = 'NP'
If Bitand(SVCATTR1,'01'x) = '01'x then SVCASF = 'ASF'
If Bitand(SVCATTR3,'80'x) = '80'x then SVCAR = 'AR'
If SVCURCNT <> 0 then SVCUP = 'UP' /* this SVC has been updated */
If SVCURCNT = 0 then do /* svc never updated */
SVCURCNT = ' '
SVCOLDAR = ' '
End
Else do /* most, if not all UP nums are sngl digit- center display */
If SVCURCNT < 10 then SVCURCNT = Right(SVCURCNT,2,' ') || ' '
Else SVCURCNT = Right(SVCURCNT,3,' ')
End /* else do */
/**************************/
/* Check lock flags */
/**************************/
SVCLL = ' ' ; SVCCMS = ' ' ; SVCOPT = ' ' /* init as blanks */
SVCALLOC = ' ' ; SVCDISP = ' ' /* init as blanks */
If Bitand(SVCLOCKS,'80'x) = '80'x then SVCLL = 'L' /* LOCAL */
If Bitand(SVCLOCKS,'40'x) = '40'x then SVCCMS = 'C' /* CMS */
If Bitand(SVCLOCKS,'20'x) = '20'x then SVCOPT = 'O' /* OPT */
If Bitand(SVCLOCKS,'10'x) = '10'x then SVCALLOC = 'S' /* SALLOC */
If Bitand(SVCLOCKS,'08'x) = '08'x then SVCDISP = 'D' /* DISP */
/*********************************/
/* location, location, location */
/*********************************/
SVCLOCA = Bitand(SVCEPA,'7FFFFFFF'x) /* zero high order bit */
SVCLOCA = C2d(SVCLOCA) /* need dec. for compare*/
Call FIND_SVC_LOC SVCLOCA /* determine SVC loc */
SVCLOC = RESULT /* Save Result */

If SVCLOCA = IGCERROR_ADDR | , /* this SVC */


SVCLOCA = IGCRETRN_ADDR then do /* is not used */
SVC_AMODE = ' ' /* blank out amode */
SVCAPF = '*** Not Used ***' /* replace other */
SVCESR = '' /* fields to line */
SVCASF = '' /* up "locks" due */
SVCAR = '' /* to "not used" */
SVCNP = '' /* display */
SVCUP = '' /* */
SVCURCNT = '' /* */
SVCOLDAR = ' ' /* */
SVCUNUSED_TOT = SVCUNUSED_TOT + 1 /* add 1 to unused tot */
End /* If SVCLOCA = IGCERROR_ADDR */
Else do /* used SVC */
SVCACT_TOT = SVCACT_TOT + 1 /* add 1 to tot active */
If SVCAPF = 'APF' then ,
SVCAPF_TOT = SVCAPF_TOT + 1 /* add 1 to APF total */
End /* Else do */

Queue ' ' Right(SVCLST,3,' ') '('Right(D2x(SVCLST),2,0)')' ,


SVCEPAR SVCLOC SVC_AMODE SVCTYPE SVCAPF SVCESR SVCASF ,
SVCAR SVCNP SVCUP SVCURCNT SVCOLDAR ,
SVCLL || SVCCMS || SVCOPT || SVCALLOC || SVCDISP
End /* Do SVCLST = 0 to 255 */
/*********************************************************************/
/* ESR SVC tables display loop */
/*********************************************************************/
Do SVCESRL = 1 to 4 /* ESR display loop */
If SVCESRL = 1 then do
SVCEAD = C2d(SVC116AD) /* Type 1 ESR tbl */
SVCEHD = 'Type 1 (SVC 116' /* Type/SVC for heading */
End
If SVCESRL = 2 then do
SVCEAD = C2d(SVC122AD) /* Type 2 ESR tbl */
SVCEHD = 'Type 2 (SVC 122' /* Type/SVC for heading */
End
If SVCESRL = 3 then do
SVCEAD = C2d(SVC109AD) /* Type 3 ESR tbl */
SVCEHD = 'Type 3 (SVC 109' /* Type/SVC for heading */
End
If SVCESRL = 4 then do
SVCEAD = C2d(SVC137AD) /* Type 6 ESR tbl */
SVCEHD = 'Type 6 (SVC 137' /* Type/SVC for heading */
End
SVCESRMX = C2d(Storage(D2x(SVCEAD+4),4)) /* Max # ESR entries */
Queue ' '
Queue 'SVC Table for ESR' SVCEHD '- Maximum ESR Number Supported' ,
'is' SVCESRMX'):'
Queue ' Num Hex EP-Addr Location AM TYP APF ASF AR NP' ,
'LOCKS'
SVCEAD = SVCEAD + 8 /* bump past ESR hdr */
Do SVCELST = 0 to SVCESRMX
SVCETENT = Storage(D2x(SVCEAD+(SVCELST*8)),8) /* SVC Tbl Entry */
SVCEAMODE = Substr(SVCETENT,1,1) /* AMODE indicator */
SVCEEPA = Substr(SVCETENT,1,4) /* Entry point addr */
SVCEEPAR = C2x(SVCEEPA) /* EPA - readable */
SVCEEPAR = Right(SVCEEPAR,8,'0') /* ensure leading zeros */
SVCEATTR1 = Substr(SVCETENT,5,1) /* SVC attributes */
SVCEATTR3 = Substr(SVCETENT,6,1) /* SVC attributes */
SVCELOCKS = Substr(SVCETENT,7,1) /* Lock attributes */
/**************************/
/* Check amode */
/**************************/
If Bitand(SVCEAMODE,'80'x) = '80'x then SVCE_AMODE = '31'
Else SVCE_AMODE = '24'
/**************************/
/* Check SVC type flag */
/**************************/
Select /* determine SVC type */
When Bitand(SVCEATTR1,'C0'x) = 'C0'x then SVCETYPE = '3/4'
When Bitand(SVCEATTR1,'80'x) = '80'x then SVCETYPE = ' 2 '
When Bitand(SVCEATTR1,'20'x) = '20'x then SVCETYPE = ' 6 '
When Bitand(SVCEATTR1,'00'x) = '00'x then SVCETYPE = ' 1 '
Otherwise SVCETYPE = '???'
End /* select */
/**************************/
/* Check other SVC flags */
/**************************/
SVCEAPF = ' ' ; SVCENP = ' ' /* init as blanks */
SVCEASF = ' ' ; SVCEAR = ' ' /* init as blanks */
SVCEESR = ' '
If Bitand(SVCEATTR1,'08'x) = '08'x then SVCEAPF = 'APF'
If Bitand(SVCEATTR1,'04'x) = '04'x then SVCEESR = 'ESR'
If Bitand(SVCEATTR1,'02'x) = '02'x then SVCENP = 'NP'
If Bitand(SVCEATTR1,'01'x) = '01'x then SVCEASF = 'ASF'
If Bitand(SVCEATTR3,'80'x) = '80'x then SVCEAR = 'AR'
/**************************/
/* Check lock flags */
/**************************/
SVCELL = ' ' ; SVCECMS = ' ' ; SVCEOPT = ' ' /* init as blanks*/
SVCEALLOC = ' ' ; SVCEDISP = ' ' /* init as blanks*/
If Bitand(SVCELOCKS,'80'x) = '80'x then SVCELL = 'L' /* LOCAL */
If Bitand(SVCELOCKS,'40'x) = '40'x then SVCECMS = 'C' /* CMS */
If Bitand(SVCELOCKS,'20'x) = '20'x then SVCEOPT = 'O' /* OPT */
If Bitand(SVCELOCKS,'10'x) = '10'x then SVCEALLOC = 'S' /* SALLOC */
If Bitand(SVCELOCKS,'08'x) = '08'x then SVCEDISP = 'D' /* DISP */
/*********************************/
/* location, location, location */
/*********************************/
SVCELOCA = Bitand(SVCEEPA,'7FFFFFFF'x) /* zero high order bit */
SVCELOCA = C2d(SVCELOCA) /* need dec. for compare*/
Call FIND_SVC_LOC SVCELOCA /* determine SVC loc */
SVCELOC = RESULT /* Save Result */
If SVCELOCA = IGXERROR_ADDR then do /* this SVC is not used */
SVCE_AMODE = ' ' /* blank out amode */
SVCEAPF = '* Unused *' /* replace other fields */
SVCEASF = '' /* to line up "locks" */
SVCEAR = '' /* due to "unused" */
SVCENP = '' /* display */
End /* If SVCELOCA = IGXERROR_ADDR */
Else do /* used SVC */
If SVCESRL = 1 then ,
SVCESR_T1_TOT = SVCESR_T1_TOT + 1 /* add 1 to TYPE 1 tot */
If SVCESRL = 2 then ,
SVCESR_T2_TOT = SVCESR_T2_TOT + 1 /* add 1 to TYPE 2 tot */
If SVCESRL = 3 then ,
SVCESR_T3_TOT = SVCESR_T3_TOT + 1 /* add 1 to TYPE 3/4 tot*/
If SVCESRL = 4 then ,
SVCESR_T6_TOT = SVCESR_T6_TOT + 1 /* add 1 to TYPE 6 tot */
End /* Else do */

Queue ' ' Right(SVCELST,3,' ') '('Right(D2x(SVCELST),2,0)')' ,


SVCEEPAR SVCELOC SVCE_AMODE SVCETYPE SVCEAPF SVCEASF ,
SVCEAR SVCENP ,
SVCELL || SVCECMS || SVCEOPT || SVCEALLOC || SVCEDISP
End

End /* Do SVCESRL = 1 to 4 */
Queue ' '
Queue ' SVC Usage Summary:'
Queue ' Total number of active standard SVCs (including ESR' ,
'slots) =' SVCACT_TOT
Queue ' Total number of unused standard SVCs =' SVCUNUSED_TOT
Queue ' Total number of active standard SVCs' ,
'requiring APF auth =' SVCAPF_TOT
Queue ' Total number of active Type 1 ESR SVCs =' SVCESR_T1_TOT
Queue ' Total number of active Type 2 ESR SVCs =' SVCESR_T2_TOT
Queue ' Total number of active Type 3/4 ESR SVCs =' SVCESR_T3_TOT
Queue ' Total number of active Type 6 ESR SVCs =' SVCESR_T6_TOT
Return

FIND_SVC_LOC: /* determine virtual storage location of SVC */


Arg SVC_LOC
Select
When SVC_LOC >= X2d(VVSTRT) & SVC_LOC <= X2d(VVEND) ,
then SVCLOC = 'PRIVATE ' /* never, but coded anyway */
When SVC_LOC >= X2d(GDACSAH) & SVC_LOC <= X2d(CSAEND) ,
then SVCLOC = 'CSA '
When SVC_LOC >= X2d(CVTMLPAS) & SVC_LOC <= X2d(CVTMLPAE) ,
then SVCLOC = 'MLPA '
When SVC_LOC >= X2d(CVTFLPAS) & SVC_LOC <= X2d(CVTFLPAE) ,
then SVCLOC = 'FLPA '
When SVC_LOC >= X2d(CVTPLPAS) & SVC_LOC <= X2d(CVTPLPAE) ,
then SVCLOC = 'PLPA '
When SVC_LOC >= X2d(GDASQAH) & SVC_LOC <= X2d(SQAEND) ,
then SVCLOC = 'SQA '
When SVC_LOC >= X2d(CVTRWNS) & SVC_LOC <= X2d(CVTRWNE) ,
then SVCLOC = 'R/W Nuc '
When SVC_LOC >= X2d(RONUCSZB) & SVC_LOC <= X2d('FFFFFF') ,
then SVCLOC = 'R/O Nuc '
When SVC_LOC >= X2d('1000000') & SVC_LOC <= X2d(CVTRONE) ,
then SVCLOC = 'E-R/O Nuc'
When SVC_LOC >= X2d(CVTERWNS) & SVC_LOC <= X2d(CVTERWNE) ,
then SVCLOC = 'E-R/W Nuc'
When SVC_LOC >= X2d(GDAESQAH) & SVC_LOC <= X2d(ESQAEND) ,
then SVCLOC = 'E-SQA '
When SVC_LOC >= X2d(CVTEPLPS) & SVC_LOC <= X2d(CVTEPLPE) ,
then SVCLOC = 'E-PLPA '
When SVC_LOC >= X2d(CVTEFLPS) & SVC_LOC <= X2d(CVTEFLPE) ,
then SVCLOC = 'E-FLPA '
When SVC_LOC >= X2d(CVTEMLPS) & SVC_LOC <= X2d(CVTEMLPE) ,
then SVCLOC = 'E-MLPA '
When SVC_LOC >= X2d(GDAECSAH) & SVC_LOC <= X2d(ECSAEND) ,
then SVCLOC = 'E-CSA '
When SVC_LOC >= X2d(GDAEPVTH) & SVC_LOC <= X2d(EPVTEND) ,
then SVCLOC = 'E-PRIVATE' /* never, but coded anyway */
Otherwise SVCLOC = '???? '
End /* select */
Return SVCLOC

FIND_NUC: /* Find EP address of "ARG" in NUC MAP */


Arg NUC_NAME
CVTNUCMP = C2d(Storage(D2x(CVT+1200),4)) /* NUC map address */
NUCMAPEND = C2d(Storage(D2x(CVTNUCMP+8),4)) /* End of nucmap */
/* NUCMAPLEN = C2d(Storage(D2x(CVTNUCMP+13),3)) */ /* tbl length */
NUC_CURA = CVTNUCMP+16 /* Curent tbl entry */
Do while NUC_CURA < NUCMAPEND /* go though tbl */
NUC_EP = Storage(D2x(NUC_CURA),8) /* Nuc EP name */
If NUC_EP = NUC_NAME then do /* NUC_NAME found? */
NUC_ADDR = C2d(Storage(D2x(NUC_CURA+8),4)) /* yes, save addr */
Leave /* leave this loop */
End /* If NUC_EP = NUC_NAME */
Else NUC_CURA = NUC_CURA + 16 /* bump to next entry */
End /* do while */
Return NUC_ADDR

XLATE_NONDISP: /* translate non-display characters to a "." */


Arg XLATEPRM
XLATELEN = Length(XLATEPRM) /* length of parm passed to routine */
Do I = 1 to XLATELEN /* check each byte for */
If (Substr(XLATEPRM,I,1) >= '00'x & , /* non-display characters */
Substr(XLATEPRM,I,1) < '40'x ) | , /* and replace each */
Substr(XLATEPRM,I,1) = 'FF'x then , /* character that */
XLATEPRM = OVERLAY('.',XLATEPRM,I) /* is non-displayable */
End /* with a period (.) */
Return XLATEPRM

STORAGE_GDA_LDA: /* GDA/LDA Storage values sub-routine */


ASCB = C2d(Storage(224,4)) /* point to cur ASCB */
ASCBLDA = C2d(Storage(D2x(ASCB + 48),4)) /* point to LDA */
CVTGDA = C2d(Storage(D2x(CVT + 560),4)) /* point to GDA */
LDASTRTA = Storage(D2x(ASCBLDA + 60),4) /* point to V=V start */
LDASTRTA = C2x(LDASTRTA) /* display in hex */
LDASIZEA = C2d(Storage(D2x(ASCBLDA + 64),4)) /* point to V=V size */
LDASIZEA = LDASIZEA/1024 /* convert to Kbytes */
LDASTRTS = Storage(D2x(ASCBLDA + 92),4) /* pt. to sysarea start */
LDASTRTS = C2x(LDASTRTS) /* display in hex */
LDASIZS = C2d(Storage(D2x(ASCBLDA + 96),4)) /* pt. to sysarea size */
LDASIZS = LDASIZS/1024 /* convert to Kbytes */
GDAPVTSZ = C2d(Storage(D2x(CVTGDA + 164),4)) /* point to MAX PVT<16M */
GDAPVTSZ = GDAPVTSZ/1024 /* convert to Kbytes */
GDAEPVTS = C2d(Storage(D2x(CVTGDA + 172),4)) /* point to MAX PVT>16M */
GDAEPVTS = GDAEPVTS/1024/1024 /* convert to Mbytes */
GDACSASZ = C2d(Storage(D2x(CVTGDA + 112),4)) /* point to CSA<16M */
GDACSASZ = GDACSASZ/1024 /* convert to Kbytes */
GDAECSAS = C2d(Storage(D2x(CVTGDA + 128),4)) /* point to CSA>16M */
GDAECSAS = GDAECSAS/1024 /* convert to Kbytes */
GDASQASZ = C2d(Storage(D2x(CVTGDA + 148),4)) /* point to SQA<16M */
GDASQASZ = GDASQASZ/1024 /* convert to Kbytes */
GDAESQAS = C2d(Storage(D2x(CVTGDA + 156),4)) /* point to SQA>16M */
GDAESQAS = GDAESQAS/1024 /* convert to Kbytes */
GDAVRSZ = C2d(Storage(D2x(CVTGDA + 196),4)) /* point to V=R global */
GDAVRSZ = GDAVRSZ/1024 /* convert to Kbytes */
GDAVREGS = C2d(Storage(D2x(CVTGDA + 200),4)) /* point to V=R default */
GDAVREGS = GDAVREGS/1024 /* convert to Kbytes */
GDA_CSA_ALLOC = C2d(Storage(D2x(CVTGDA + 432),4)) /* CSA amt alloc */
GDA_CSA_ALLOC = Format(GDA_CSA_ALLOC/1024,,0) /* conv to Kbytes */
GDA_ECSA_ALLOC = C2d(Storage(D2x(CVTGDA + 436),4)) /* ECSA amt alloc */
GDA_ECSA_ALLOC = Format(GDA_ECSA_ALLOC/1024,,0) /* conv to Kbytes */
GDA_SQA_ALLOC = C2d(Storage(D2x(CVTGDA + 440),4)) /* SQA amt alloc */
GDA_SQA_ALLOC = Format(GDA_SQA_ALLOC/1024,,0) /* conv to Kbytes */
GDA_ESQA_ALLOC = C2d(Storage(D2x(CVTGDA + 444),4)) /* ESQA amt alloc */
GDA_ESQA_ALLOC = Format(GDA_ESQA_ALLOC/1024,,0) /* conv to Kbytes */
GDA_CSA_CONV = C2d(Storage(D2x(CVTGDA + 448),4)) /* CSA => SQA amt */
GDA_CSA_CONV = Format(GDA_CSA_CONV/1024,,0) /* conv to Kbytes */
GDA_ECSA_CONV = C2d(Storage(D2x(CVTGDA + 452),4)) /* ECSA=>ESQA amt */
GDA_ECSA_CONV = Format(GDA_ECSA_CONV/1024,,0) /* conv to Kbytes */
/*********************************************************************/
/* High Water Marks for SQA/ESQA/CSA/ECSA added in OS/390 R10 */
/*********************************************************************/
If Bitand(CVTOSLV2,'01'x) = '01'x then do /* OS/390 R10 and above */
GDASQAHWM = C2d(Storage(D2x(CVTGDA + 536),4)) /* SQA HWM */
GDASQAHWM = Format(GDASQAHWM/1024,,0) /* conv to Kbytes */
GDAESQAHWM = C2d(Storage(D2x(CVTGDA + 540),4)) /* ESQA HWM */
GDAESQAHWM = Format(GDAESQAHWM/1024,,0) /* conv to Kbytes */
If Bitand(CVTOSLV5,'08'x) = '08'x then do /* z/OS 1.10 and above */
GDATotalCSAHWM = C2d(Storage(D2x(CVTGDA+552),4)) /* CSA HWM */
GDATotalCSAHWM = Format(GDATotalCSAHWM/1024,,0) /* conv to Kb */
GDATotalECSAHWM = C2d(Storage(D2x(CVTGDA+556),4)) /* ECSA HWM */
GDATotalECSAHWM = Format(GDATotalECSAHWM/1024,,0) /* conv to Kb */
GDACSAHWM = GDATotalCSAHWM /* set var used for VMAP disp */
GDAECSAHWM = GDATotalECSAHWM /* set var used for VMAP disp */
End
Else do /* use pre z/OS 1.10 values for CSA/ECSA HWM */
GDACSAHWM = C2d(Storage(D2x(CVTGDA + 544),4)) /* CSA HWM */
GDACSAHWM = Format(GDACSAHWM/1024,,0) /* conv to Kbytes */
GDAECSAHWM = C2d(Storage(D2x(CVTGDA + 548),4)) /* ECSA HWM */
GDAECSAHWM = Format(GDAECSAHWM/1024,,0) /* conv to Kbytes */
End
End
Return

EXTRACT_SYSPARMS: /* Extract IEASYSxx values from the IPA */


Parse arg IEASPARM
IEASPARM = Strip(IEASPARM,'T') /* remove trailing blnks*/
If IEASPARM = '<notdef>' then return /*"blank" parm in IHAIPA*/
/*********************************************************************/
/* This next section of code removes IEASYSxx parameters from the */
/* IPA output display for parms that are obsolete or undocumented */
/* but still have to be accounted for when parsing out the parms */
/* and values from the IPA control block. */
/*********************************************************************/
If Bitand(CVTOSLV3,'08'x) = '08'x then , /* z/OS 1.3 and above */
If Substr(IEASPARM,1,3) = 'IPS'then return /* remove IPS parm */
If Bitand(CVTOSLV3,'02'x) = '02'x then , /* z/OS 1.5 and above */
If Pos('ILM',IEASPARM) <> 0 then return /* remove ILM parms */
If Bitand(CVTOSLV5,'04'x) = '04'x then do /* z/OS 1.11 and above */
If Pos('IQP',IEASPARM) <> 0 then return /* remove IQP parm */
If Pos('CPCR',IEASPARM) <> 0 then return /* remove CPCR parm */
If Pos('DDM',IEASPARM) <> 0 then return /* remove DDM parm */
End
If Bitand(CVTOSLV5,'01'x) = '01'x then do /* z/OS 1.13 and above */
If Pos('RTLS',IEASPARM) <> 0 then return /* remove RTLS parm */
End
/*********************************************************************/
IPAOFF = ((I-1) * 8) /* offset to next entry */
IPASTOR = D2x(ECVTIPA + 2152 + IPAOFF) /* point to PDE addr */
IPAPDE = C2x(Storage((IPASTOR),8)) /* point to PDE */
If IPAPDE = 0 then return /* parm not specified and has no default */
TOTPRMS = TOTPRMS + 1 /* tot num of specified or defaulted parms */
IPAADDR = Substr(IPAPDE,1,8) /* PARM address */
IPALEN = X2d(Substr(IPAPDE,9,4)) /* PARM length */
IPAPRM = Storage((IPAADDR),IPALEN) /* PARM */
IPASRC = Substr(IPAPDE,13,4) /* PARM source */
If X2d(IPASRC) = 65535 then PRMSRC = 'Operator' /* operator parm */
Else
If X2d(IPASRC) = 0 then PRMSRC = 'Default' /* default parm */
Else
PRMSRC = 'IEASYS' || X2c(IPASRC) /* IEASYSxx parm */
PRMLINE = ' 'IEASPARM'='IPAPRM
/**************************************************/
/* This check just below is for parms that do not */
/* have an equal sign in IEASYSxx. */
/**************************************************/
If IEASPARM = 'PRESCPU' | ,
IEASPARM = 'WARNUND' | ,
IEASPARM = 'CVIO' | ,
IEASPARM = 'CLPA' then PRMLINE = ' 'IEASPARM
Else PRMLINE = ' 'IEASPARM'='IPAPRM
PRMLINE.TOTPRMS = IEASPARM PRMLINE PRMSRC
PRMLINE.0 = TOTPRMS
Return

BUILD_IPAPDETB: /* Build table for lookup for IPA values */


NUM=1
IPAPDETB.NUM = 'ALLOC ' ; NUM = NUM + 1
IPAPDETB.NUM = 'APF ' ; NUM = NUM + 1
IPAPDETB.NUM = 'APG ' ; NUM = NUM + 1
IPAPDETB.NUM = 'BLDL ' ; NUM = NUM + 1
IPAPDETB.NUM = 'BLDLF ' ; NUM = NUM + 1
IPAPDETB.NUM = 'CLOCK ' ; NUM = NUM + 1
IPAPDETB.NUM = 'CLPA ' ; NUM = NUM + 1
IPAPDETB.NUM = 'CMB ' ; NUM = NUM + 1
IPAPDETB.NUM = 'CMD ' ; NUM = NUM + 1
IPAPDETB.NUM = 'CON ' ; NUM = NUM + 1
IPAPDETB.NUM = 'CONT ' ; NUM = NUM + 1
IPAPDETB.NUM = 'COUPLE ' ; NUM = NUM + 1
IPAPDETB.NUM = 'CPQE ' ; NUM = NUM + 1
IPAPDETB.NUM = 'CSA ' ; NUM = NUM + 1
IPAPDETB.NUM = 'CSCBLOC ' ; NUM = NUM + 1
IPAPDETB.NUM = 'CVIO ' ; NUM = NUM + 1
IPAPDETB.NUM = 'DEVSUP ' ; NUM = NUM + 1
IPAPDETB.NUM = 'DIAG ' ; NUM = NUM + 1
IPAPDETB.NUM = 'DUMP ' ; NUM = NUM + 1
IPAPDETB.NUM = 'DUPLEX ' ; NUM = NUM + 1
IPAPDETB.NUM = 'EXIT ' ; NUM = NUM + 1
IPAPDETB.NUM = 'FIX ' ; NUM = NUM + 1
IPAPDETB.NUM = 'GRS ' ; NUM = NUM + 1
IPAPDETB.NUM = 'GRSCNF ' ; NUM = NUM + 1
IPAPDETB.NUM = 'GRSRNL ' ; NUM = NUM + 1
IPAPDETB.NUM = 'ICS ' ; NUM = NUM + 1
IPAPDETB.NUM = 'IOS ' ; NUM = NUM + 1
IPAPDETB.NUM = 'IPS ' ; NUM = NUM + 1
IPAPDETB.NUM = 'LNK ' ; NUM = NUM + 1
IPAPDETB.NUM = 'LNKAUTH ' ; NUM = NUM + 1
IPAPDETB.NUM = 'LOGCLS ' ; NUM = NUM + 1
IPAPDETB.NUM = 'LOGLMT ' ; NUM = NUM + 1
IPAPDETB.NUM = 'LOGREC ' ; NUM = NUM + 1
IPAPDETB.NUM = 'LPA ' ; NUM = NUM + 1
IPAPDETB.NUM = 'MAXCAD ' ; NUM = NUM + 1
IPAPDETB.NUM = 'MAXUSER ' ; NUM = NUM + 1
IPAPDETB.NUM = 'MLPA ' ; NUM = NUM + 1
IPAPDETB.NUM = 'MSTRJCL ' ; NUM = NUM + 1
IPAPDETB.NUM = 'NONVIO ' ; NUM = NUM + 1
IPAPDETB.NUM = 'NSYSLX ' ; NUM = NUM + 1
IPAPDETB.NUM = 'NUCMAP ' ; NUM = NUM + 1
If Bitand(CVTOSLV1,'04'x) = '04'x then do /* OS/390 R3 and above */
IPAPDETB.NUM = 'OMVS ' ; NUM = NUM + 1
End
Else do
IPAPDETB.NUM = 'RESERVED' ; NUM = NUM + 1
End
IPAPDETB.NUM = 'OPI ' ; NUM = NUM + 1
IPAPDETB.NUM = 'OPT ' ; NUM = NUM + 1
IPAPDETB.NUM = 'PAGE-OPR' ; NUM = NUM + 1
IPAPDETB.NUM = 'PAGE ' ; NUM = NUM + 1
IPAPDETB.NUM = 'PAGNUM ' ; NUM = NUM + 1
IPAPDETB.NUM = 'PAGTOTL ' ; NUM = NUM + 1
IPAPDETB.NUM = 'PAK ' ; NUM = NUM + 1
IPAPDETB.NUM = 'PLEXCFG ' ; NUM = NUM + 1
IPAPDETB.NUM = 'PROD ' ; NUM = NUM + 1
IPAPDETB.NUM = 'PROG ' ; NUM = NUM + 1
IPAPDETB.NUM = 'PURGE ' ; NUM = NUM + 1
IPAPDETB.NUM = 'RDE ' ; NUM = NUM + 1
IPAPDETB.NUM = 'REAL ' ; NUM = NUM + 1
IPAPDETB.NUM = 'RER ' ; NUM = NUM + 1
IPAPDETB.NUM = 'RSU ' ; NUM = NUM + 1
IPAPDETB.NUM = 'RSVNONR ' ; NUM = NUM + 1
IPAPDETB.NUM = 'RSVSTRT ' ; NUM = NUM + 1
IPAPDETB.NUM = 'SCH ' ; NUM = NUM + 1
IPAPDETB.NUM = 'SMF ' ; NUM = NUM + 1
IPAPDETB.NUM = 'SMS ' ; NUM = NUM + 1
IPAPDETB.NUM = 'SQA ' ; NUM = NUM + 1
IPAPDETB.NUM = 'SSN ' ; NUM = NUM + 1
IPAPDETB.NUM = 'SVC ' ; NUM = NUM + 1
IPAPDETB.NUM = 'SWAP ' ; NUM = NUM + 1
IPAPDETB.NUM = 'SYSNAME ' ; NUM = NUM + 1
IPAPDETB.NUM = 'SYSP ' ; NUM = NUM + 1
IPAPDETB.NUM = 'VAL ' ; NUM = NUM + 1
IPAPDETB.NUM = 'VIODSN ' ; NUM = NUM + 1
IPAPDETB.NUM = 'VRREGN ' ; NUM = NUM + 1
If Bitand(CVTOSLV2,'80'x) = '80'x then do /* OS/390 R4 and above */
IPAPDETB.NUM = 'RTLS ' ; NUM = NUM + 1
End
If Bitand(CVTOSLV2,'04'x) = '04'x then do /* OS/390 R8 and above */
IPAPDETB.NUM = 'UNI ' ; NUM = NUM + 1 /* added by APAR OW44581*/
End
If Bitand(CVTOSLV3,'20'x) = '20'x then do /* z/OS 1.1 and above */
IPAPDETB.NUM = 'ILMLIB ' ; NUM = NUM + 1
IPAPDETB.NUM = 'ILMMODE ' ; NUM = NUM + 1
End
If Bitand(CVTOSLV3,'08'x) = '08'x then do /* z/OS 1.3 and above */
IPAPDETB.NUM = 'IKJTSO ' ; NUM = NUM + 1
IPAPDETB.NUM = 'LICENSE ' ; NUM = NUM + 1
End
If Bitand(CVTOSLV3,'02'x) = '02'x then do /* z/OS 1.5 and above */
IPAPDETB.NUM = '<notdef>' ; NUM = NUM + 1 /*"blank" def in IHAIPA */
IPAPDETB.NUM = 'HVSHARE ' ; NUM = NUM + 1
IPAPDETB.NUM = 'ILM ' ; NUM = NUM + 1
/********************************************************************/
/* If you have a z/OS 1.5 or z/OS 1.6 system without OA09649, you */
/* may have to delete the next 3 lines of code. */
/********************************************************************/
IPAPDETB.NUM = '<notdef>' ; NUM = NUM + 1 /*"blank" def in IHAIPA */
IPAPDETB.NUM = '<notdef>' ; NUM = NUM + 1 /*"blank" def in IHAIPA */
IPAPDETB.NUM = 'PRESCPU ' ; NUM = NUM + 1 /* added by OA09649 */
End
If Bitand(CVTOSLV5,'40'x) = '40'x then do /* z/OS 1.7 and above */
NUM = NUM-3
IPAPDETB.NUM = 'DRMODE ' ; NUM = NUM + 1
IPAPDETB.NUM = 'CEE ' ; NUM = NUM + 1
IPAPDETB.NUM = 'PRESCPU ' ; NUM = NUM + 1
End
If Bitand(CVTOSLV5,'10'x) = '10'x then do /* z/OS 1.9 and above */
IPAPDETB.NUM = 'LFAREA ' ; NUM = NUM + 1
End
If Bitand(CVTOSLV5,'08'x) = '08'x then do /* z/OS 1.10 and above */
IPAPDETB.NUM = 'CEA ' ; NUM = NUM + 1
IPAPDETB.NUM = 'HVCOMMON' ; NUM = NUM + 1
IPAPDETB.NUM = 'AXR ' ; NUM = NUM + 1
End
If Bitand(CVTOSLV5,'08'x) = '08'x then do /* z/OS 1.10 and above */
/********************************************************************/
/* If you have z/OS 1.10 without OA27495, you may have to delete */
/* the next line of code. If you have z/OS 1.9 with OA27495 and */
/* wish to see the "ZZ" value, change the check above from: */
/* If Bitand(CVTOSLV5,'08'x) = '08'x then do */
/* to: */
/* If Bitand(CVTOSLV5,'10'x) = '10'x then do */
/********************************************************************/
IPAPDETB.NUM = 'ZZ ' ; NUM = NUM + 1
End
If Bitand(CVTOSLV5,'04'x) = '04'x then do /* z/OS 1.11 and above */
NUM = NUM - 1
IPAPDETB.NUM = 'ZAAPZIIP' ; NUM = NUM + 1
IPAPDETB.NUM = 'IQP' ; NUM = NUM + 1
IPAPDETB.NUM = 'CPCR' ; NUM = NUM + 1
IPAPDETB.NUM = 'DDM' ; NUM = NUM + 1
End
If Bitand(CVTOSLV5,'02'x) = '02'x then do /* z/OS 1.12 and above */
IPAPDETB.NUM = 'AUTOR' ; NUM = NUM + 1
End
If Bitand(CVTOSLV5,'01'x) = '01'x then do /* z/OS 1.13 and above */
IPAPDETB.NUM = 'CATALOG' ; NUM = NUM + 1
IPAPDETB.NUM = 'IXGCNF' ; NUM = NUM + 1
End
If Bitand(CVTOSLV6,'80'x) = '80'x then do /* z/OS 2.1 and above */
IPAPDETB.NUM = 'PAGESCM' ; NUM = NUM + 1
IPAPDETB.NUM = 'WARNUND' ; NUM = NUM + 1
IPAPDETB.NUM = 'HZS' ; NUM = NUM + 1
IPAPDETB.NUM = 'GTZ' ; NUM = NUM + 1
IPAPDETB.NUM = 'HZSPROC' ; NUM = NUM + 1
End
If Bitand(CVTOSLV6,'40'x) = '40'x then do /* z/OS 2.2 and above */
IPAPDETB.NUM = 'SMFLIM' ; NUM = NUM + 1
IPAPDETB.NUM = 'IEFOPZ' ; NUM = NUM + 1
End
If Bitand(CVTOSLV6,'10'x) = '10'x then do /* z/OS 2.3 and above */
IPAPDETB.NUM = 'RACF' ; NUM = NUM + 1
IPAPDETB.NUM = 'FXE' ; NUM = NUM + 1
IPAPDETB.NUM = 'IZU' ; NUM = NUM + 1
IPAPDETB.NUM = 'SMFTBUFF' ; NUM = NUM + 1 /* APAR OA52828 */
IPAPDETB.NUM = 'DIAG1' ; NUM = NUM + 1 /* IBM use only */
IPAPDETB.NUM = 'OSPROTECT'; NUM = NUM + 1 /* APAR OA54807 */
IPAPDETB.NUM = 'ICSF' ; NUM = NUM + 1 /* APAR OA55378 */
IPAPDETB.NUM = 'ICSFPROC' ; NUM = NUM + 1 /* APAR OA55378 */
End
IPAPDETB.0 = NUM-1
Return

SPLIT_IPA_PAGE: /* Split up page data set parms to multiple lines */


TOT_IPALINES = 0
Do SPLIT = 1 to PRMLINE.0
TOT_IPALINES = TOT_IPALINES+1 /* add one total lines */
IPA_PDE = Word(PRMLINE.SPLIT,1) /* keyword */
IPA_PRM = Word(PRMLINE.SPLIT,2) /* value */
IPA_SRC = Word(PRMLINE.SPLIT,3) /* IEASYSxx, dlft, or OPR */
IPA_LEN = Length(IPA_PRM)
If IPA_PDE = 'NONVIO' | IPA_PDE = 'PAGE' | ,
IPA_PDE = 'PAGE-OPR' | IPA_PDE = 'SWAP' then do
MORE = 'YES' /* init flag for more subparms */
FIRST = 'YES' /* init flag for first subparm */
SPLITPOS = 1
Do until MORE = 'NO'
SPLITPOS = Pos(',',IPA_PRM)
If SPLITPOS = 0 then do
If FIRST = 'YES' then do
IPALINE.TOT_IPALINES = ' 'IPA_PRM || ','
IPALINE.TOT_IPALINES = ,
Overlay(IPA_SRC,IPALINE.TOT_IPALINES,68)
End
Else do
MBLNK = ''
If IPA_PDE = 'NONVIO' then MBLNK = ' ' /* align */
If IPA_PDE = 'PAGE-OPR' then MBLNK = ' ' /* align */
IPALINE.TOT_IPALINES = MBLNK' 'IPA_PRM || ','
IPALINE.TOT_IPALINES = ,
Overlay(IPA_SRC,IPALINE.TOT_IPALINES,68)
End
MORE = 'NO' /* no more subparms */
End /* if SPLITPOS = 0 */
Else do
IPAPRM_SPLIT = Substr(IPA_PRM,1,SPLITPOS)
If FIRST = 'YES' then IPALINE.TOT_IPALINES = ' 'IPAPRM_SPLIT
Else do
MBLNK = ''
If IPA_PDE = 'NONVIO' then MBLNK = ' ' /* align */
If IPA_PDE = 'PAGE-OPR' then MBLNK = ' ' /* align */
IPALINE.TOT_IPALINES = MBLNK' 'IPAPRM_SPLIT
End
IPA_PRM = Substr(IPA_PRM,SPLITPOS+1,IPA_LEN-SPLITPOS)
IPA_LEN = Length(IPA_PRM)
TOT_IPALINES = TOT_IPALINES+1 /* add one total lines */
FIRST = 'NO'
End
End /* do until more=no */
End
Else do
IPALINE.TOT_IPALINES = ' 'IPA_PRM || ','
IPALINE.TOT_IPALINES = Overlay(IPA_SRC,IPALINE.TOT_IPALINES,68)
End
End
Return

SORT_IPA: Procedure expose PRMLINE.


/* bubble sort the IPA list */
SORT_DONE = 0
SORT_RECS = PRMLINE.0
Do while SORT_DONE = 0
SORT_DONE = 1
Do I = 1 to SORT_RECS - 1
J = I + 1
If PRMLINE.I > PRMLINE.J then do
SORT_DONE = 0
TEMP_SORT = PRMLINE.J
PRMLINE.J = PRMLINE.I
PRMLINE.I = TEMP_SORT
End /* if */
End /* do i=1 to sort_recs */
SORT_RECS = SORT_RECS - 1
End /* do while */
Return

GET_CPCSI:
SI_OFF=0
IRALCCT = C2d(Storage(D2x(RMCT+620),4)) /* point to IRALCCT */
/* (undocumented) */
If Bitand(CVTOSLV5,'08'x) = '08'x then , /* z/OS 1.10 and above */
SI_OFF = 128 /* additional offset to CPC SI info in IRALCCT */
/****************************************************************/
/* If you have z/OS 1.12 or z/OS 1.13 with z13 support */
/* maintenance applied you will have to uncomment either the */
/* first 2 lines or the 2nd 2 lines to fix the CPCSI display. */
/* The 2nd set should work for z/OS 1.12 or z/OS 1.13 systems */
/* that do have the maintenance and also for those systems that */
/* do not have the maintenance. */
/****************************************************************/
/*If Bitand(CVTOSLV5,'02'x) = '02'x then , */ /* z/OS 1.12 and > */
/* SI_OFF = 384 */ /* additional offset to CPC SI info in IRALCCT */
/*If C2x(Storage(D2x(IRALCCT+10),1)) <> '40' then , *//* z13 support */
/* SI_OFF = 384 */ /* additional offset to CPC SI info in IRALCCT */
If Bitand(CVTOSLV6,'80'x) = '80'x then , /* z/OS 2.1 and above */
SI_OFF = 384 /* additional offset to CPC SI info in IRALCCT */
/****************************************************************/
/* The check below was added for a reported problem on */
/* z/OS 2.3 at RSU1812 or RSU1903. I'm not sure what APAR(s) */
/* broke this or if the same APAR could apply to earlier z/OS */
/* versions. */
/* */
/* If the CPU node display doesn't look right, delete the code */
/* that changes the offset to 392 or comment it out. */
/****************************************************************/
If Bitand(CVTOSLV6,'10'x) = '10'x then /* z/OS 2.3 and above */
/* (MODEL='3906' | MODEL='3907') | */ /* z/OS 2.3 + z14 */
/* (MODEL='2964' | MODEL='2965') then */ /* z/OS 2.3 + z13 */
SI_OFF = 392 /* additional offset to CPC SI info in IRALCCT */
CPCSI_TYPE = Storage(D2x(IRALCCT+332+SI_OFF),4) /* Type */
CPCSI_MODEL = Storage(D2x(IRALCCT+336+SI_OFF),4) /* Model */
CPCSI_MODEL = Strip(CPCSI_MODEL) /* Remove blanks */
CPCSI_MAN = Storage(D2x(IRALCCT+384+SI_OFF),16) /* Manufacturer */
CPCSI_MAN = Strip(CPCSI_MAN) /* Remove blanks */
CPCSI_PLANT = Storage(D2x(IRALCCT+400+SI_OFF),4) /* Plant */
CPCSI_PLANT = Strip(CPCSI_PLANT) /* Remove blanks */
CPCSI_CPUID = Storage(D2x(IRALCCT+352+SI_OFF),16) /* CPUID */
CPCSI_MODELID = Storage(D2x(IRALCCT+592+SI_OFF),4) /* Model ID */
CPCSI_MODELID = Strip(CPCSI_MODELID) /* Remove blanks */
/* CPCSI_MODELID may not be valid on emulated */
/* z/OS systems like FLEX, HERC and z/PDT */
Return

FORMAT_MEMSIZE:
/****************************************************************/
/* The following code is used to display the storage size in */
/* the largest possible unit. For example, 1023G and 1025G are */
/* displayed as 1023G and 1025G, but 1024G is displayed as 1T. */
/* The size passed to the routine must be in MB. */
/****************************************************************/
Arg SIZE_IN_MB
Select
When SIZE_IN_MB < 1024 then do
MUNITS = 'M'
End
When SIZE_IN_MB >= 1024 & SIZE_IN_MB < 1048576 then do
If SIZE_IN_MB/1024 == TRUNC(SIZE_IN_MB/1024) then do
SIZE_IN_MB = SIZE_IN_MB/1024
MUNITS = 'G'
End
Else MUNITS = 'M'
End
When SIZE_IN_MB >= 1048576 & SIZE_IN_MB < 1073741824 then do
If SIZE_IN_MB/1048576 == TRUNC(SIZE_IN_MB/1048576) then do
SIZE_IN_MB = SIZE_IN_MB/1048576
MUNITS = 'T'
End
Else do
If SIZE_IN_MB/1024 == TRUNC(SIZE_IN_MB/1024) then do
SIZE_IN_MB = SIZE_IN_MB/1024
MUNITS = 'G'
End
Else MUNITS = 'M'
End
End
When SIZE_IN_MB >= 1073741824 & ,
SIZE_IN_MB <= 17591112302592 then do
If SIZE_IN_MB/1073741824 == TRUNC(SIZE_IN_MB/1073741824) ,
then do
SIZE_IN_MB = SIZE_IN_MB/1073741824
MUNITS = 'P'
End
Else do
SIZE_IN_MB = SIZE_IN_MB/1048576
MUNITS = 'T'
End
End
When SIZE_IN_MB = 17592186040320 then do
SIZE_IN_MB = 'NOLIMIT' /* 16384P */
MUNITS = ''
End
When SIZE_IN_MB > 17592186040320 then do
SIZE_IN_MB = '*NOLIMT' /* >16384P (16EB) ?? */
MUNITS = ''
End
Otherwise do
Queue ' '
Queue 'Error in FORMAT_MEMSIZE code. Contact Mark Zelden.'
Queue 'SIZE_IN_MB=' SIZE_IN_MB
Queue ' '
SIZE_IN_MB = '*ERROR*'
MUNITS = ''
End
End /* select */
STOR_SIZE = SIZE_IN_MB || MUNITS
Return STOR_SIZE

BROWSE_ISPF: /* Browse output if ISPF is active */


Address ISPEXEC "CONTROL ERRORS RETURN"
Address TSO
prefix = sysvar('SYSPREF') /* tso profile prefix */
uid = sysvar('SYSUID') /* tso userid */
If prefix = '' then prefix = uid /* use uid if null prefix */
If prefix <> '' & prefix <> uid then /* different prefix than uid */
prefix = prefix || '.' || uid /* use prefix.uid */
ddnm1 = 'DDO'||random(1,99999) /* choose random ddname */
ddnm2 = 'DDP'||random(1,99999) /* choose random ddname */
junk = MSG('OFF')
"ALLOC FILE("||ddnm1||") UNIT(SYSALLDA) NEW TRACKS SPACE(2,1) DELETE",
" REUSE LRECL(80) RECFM(F B) BLKSIZE(3120)"
"ALLOC FILE("||ddnm2||") UNIT(SYSALLDA) NEW TRACKS SPACE(1,1) DELETE",
" REUSE LRECL(80) RECFM(F B) BLKSIZE(3120) DIR(1)"
junk = MSG('ON')
"Newstack"
/*************************/
/* IPLINFOP Panel source */
/*************************/
If Substr(ZENVIR,6,1) >= 4 then
If EDITOP = 'YES' then ,
Queue ")PANEL KEYLIST(ISRSPEC,ISR)"
Else ,
Queue ")PANEL KEYLIST(ISRSPBC,ISR)"
Queue ")ATTR"
Queue " _ TYPE(INPUT) INTENS(HIGH) COLOR(TURQ) CAPS(OFF)" ,
"FORMAT(&MIXED)"
If EDITOP = 'YES' then ,
Queue " | AREA(DYNAMIC) EXTEND(ON) SCROLL(ON) USERMOD('20')"
Else ,
Queue " | AREA(DYNAMIC) EXTEND(ON) SCROLL(ON)"
Queue " + TYPE(TEXT) INTENS(LOW) COLOR(BLUE)"
Queue " @ TYPE(TEXT) INTENS(LOW) COLOR(TURQ)"
Queue " % TYPE(TEXT) INTENS(HIGH) COLOR(GREEN)"
Queue " ! TYPE(OUTPUT) INTENS(HIGH) COLOR(TURQ) PAD(-)"
Queue " 01 TYPE(DATAOUT) INTENS(LOW)"
Queue " 02 TYPE(DATAOUT) INTENS(HIGH)"
If EDITOP = 'YES' then do
Queue " 03 TYPE(DATAOUT) SKIP(ON) /* FOR TEXT ENTER CMD. FIELD */"
Queue " 04 TYPE(DATAIN) INTENS(LOW) CAPS(OFF) FORMAT(&MIXED)"
Queue " 05 TYPE(DATAIN) INTENS(HIGH) CAPS(OFF) FORMAT(&MIXED)"
Queue " 06 TYPE(DATAIN) INTENS(LOW) CAPS(IN) FORMAT(&MIXED)"
Queue " 07 TYPE(DATAIN) INTENS(HIGH) CAPS(IN) FORMAT(&MIXED)"
Queue " 08 TYPE(DATAIN) INTENS(LOW) FORMAT(DBCS) OUTLINE(L)"
Queue " 09 TYPE(DATAIN) INTENS(LOW) FORMAT(EBCDIC) OUTLINE(L)"
Queue " 0A TYPE(DATAIN) INTENS(LOW) FORMAT(&MIXED) OUTLINE(L)"
Queue " 0D TYPE(DATAIN) INTENS(LOW) CAPS(IN) FORMAT(&MIXED)" || ,
" COLOR(BLUE)"
Queue " 20 TYPE(DATAIN) INTENS(LOW) CAPS(IN) FORMAT(&MIXED)"
End
Else do
Queue " 0B TYPE(DATAOUT) INTENS(HIGH) FORMAT(DBCS)"
Queue " 0C TYPE(DATAOUT) INTENS(HIGH) FORMAT(EBCDIC)"
Queue " 0D TYPE(DATAOUT) INTENS(HIGH) FORMAT(&MIXED)"
Queue " 10 TYPE(DATAOUT) INTENS(LOW) FORMAT(DBCS)"
Queue " 11 TYPE(DATAOUT) INTENS(LOW) FORMAT(EBCDIC)"
Queue " 12 TYPE(DATAOUT) INTENS(LOW) FORMAT(&MIXED)"
End
If EDITOP = 'YES' then do
Queue ")BODY WIDTH(&ZWIDTH) EXPAND(//)"
Queue "@EDIT @&ZTITLE / / %Columns!ZCL !ZCR +"
End
Else do
Queue ")BODY EXPAND(//)"
Queue "%BROWSE @&ZTITLE / / %Line!ZLINES %Col!ZCOLUMS+"
End
Queue "%Command ===>_ZCMD / / %Scroll ===>_Z +"
Queue "|ZDATA ---------------/ /-------------------------|"
Queue "| / / |"
Queue "| --------------------/-/-------------------------|"
Queue ")INIT"
Queue " .HELP = IPLINFOH"
If EDITOP = 'YES' then ,
Queue " .ZVARS = 'ZSCED'"
Else ,
Queue " .ZVARS = 'ZSCBR'"
Queue " &ZTITLE = 'Mark''s MVS Utilities - IPLINFO'"
Queue " &MIXED = MIX"
Queue " IF (&ZPDMIX = N)"
Queue " &MIXED = EBCDIC"
If EDITOP = 'YES' then do
Queue " VGET (ZSCED) PROFILE"
Queue " IF (&ZSCED = ' ')"
Queue " &ZSCED = 'CSR'"
End
Else do
Queue " VGET (ZSCBR) PROFILE"
Queue " IF (&ZSCBR = ' ')"
Queue " &ZSCBR = 'CSR'"
End
Queue ")REINIT"
Queue " .HELP = IPLINFOH"
If EDITOP = 'YES' then ,
Queue " REFRESH(ZCMD,ZSCED,ZDATA,ZCL,ZCR)"
Else ,
Queue " REFRESH(ZCMD,ZSCBR,ZDATA,ZLINES,ZCOLUMS)"
Queue ")PROC"
Queue " &ZCURSOR = .CURSOR"
Queue " &ZCSROFF = .CSRPOS"
Queue " &ZLVLINE = LVLINE(ZDATA)"
If EDITOP = 'YES' then ,
Queue " VPUT (ZSCED) PROFILE"
Else ,
Queue " VPUT (ZSCBR) PROFILE"
Queue ")END"
/* */
Address ISPEXEC "LMINIT DATAID(PAN) DDNAME("ddnm2")"
Address ISPEXEC "LMOPEN DATAID("pan") OPTION(OUTPUT)"
Do queued()
Parse pull panline
Address ISPEXEC "LMPUT DATAID("pan") MODE(INVAR)" ,
"DATALOC(PANLINE) DATALEN(80)"
End
Address ISPEXEC "LMMADD DATAID("pan") MEMBER(IPLINFOP)"
/* Address ISPEXEC "LMFREE DATAID("pan")" */
"Delstack"
"Newstack"
/*************************/
/* IPLINFOH Panel source */
/*************************/
If Substr(ZENVIR,6,1) >= 4 then
Queue ")PANEL KEYLIST(ISRSPBC,ISR)"
Queue ")ATTR DEFAULT(!+_)"
Queue " _ TYPE(INPUT) INTENS(HIGH) COLOR(TURQ) CAPS(OFF)" ,
"FORMAT(&MIXED)"
Queue " + TYPE(TEXT) INTENS(LOW) COLOR(BLUE)"
Queue " @ TYPE(TEXT) INTENS(LOW) COLOR(TURQ)"
Queue " ! TYPE(TEXT) INTENS(HIGH) COLOR(GREEN)"
Queue " # AREA(SCRL) EXTEND(ON)"
Queue ")BODY EXPAND(//)"
Queue "!HELP @&ZTITLE / / "
Queue "!Command ===>_ZCMD / / "
Queue "#IPLHSCR " || ,
" #"
Queue ")AREA IPLHSCR"
Queue "@EXECUTION SYNTAX:!TSO %IPLINFO <option> "
Queue "+VALID OPTIONS ARE 'ALL', 'IPL', 'VERsion'," ||,
" 'STOrage', 'CPU', 'IPA', 'SYMbols',"
Queue "+ 'VMAp', 'PAGe', 'SMF', " ||,
"'SUB', 'ASId', 'LPA', 'LNKlst', 'APF' and 'SVC'"
Queue "@**+OPTIONS may be abbreviated by using 3 or more characters "
Queue "+Examples: "
Queue "! TSO %IPLINFO +(Display all Information) "
Queue "! TSO %IPLINFO IPL +(Display IPL Information) "
Queue "! TSO %IPLINFO VER +(Display Version Information) "
Queue "! TSO %IPLINFO STOR +(Display Storage Information) "
Queue "! TSO %IPLINFO CPU +(Display CPU Information) "
Queue "! TSO %IPLINFO IPA +(Display Initialization Information) "
Queue "! TSO %IPLINFO SYM +(Display Static System Symbols) "
Queue "! TSO %IPLINFO VMAP +(Display a Virtual Storage Map) "
Queue "! TSO %IPLINFO PAGE +(Display Page Data Set Usage",
"Information)"
Queue "! TSO %IPLINFO SMF +(Display SMF Data Set Usage Information)"
Queue "! TSO %IPLINFO SUB +(Display Subsystem Information) "
Queue "! TSO %IPLINFO ASID +(Display ASID Usage Information) "
Queue "! TSO %IPLINFO LPA +(Display LPA List Information) "
Queue "! TSO %IPLINFO LNK +(Display LNKLST Information) "
Queue "! TSO %IPLINFO APF +(Display APF List Information) "
Queue "! TSO %IPLINFO SVC +(Display SVC Information) "
Queue "@&ADLINE"
Queue ")INIT"
Queue " .HELP = ISR10000"
Queue " &ZTITLE = 'Mark''s MVS Utilities - IPLINFO'"
Queue " &L1 = 'Mark''s MVS Utilities -'"
Queue " &L2 = 'http://www.mzelden.com/mvsutil.html'"
Queue " &ADLINE = '&L1 &L2'"
Queue " &MIXED = MIX"
Queue " IF (&ZPDMIX = N)"
Queue " &MIXED = EBCDIC"
Queue ")END"
/* */
Do queued()
Parse pull panline
Address ISPEXEC "LMPUT DATAID("pan") MODE(INVAR)" ,
"DATALOC(PANLINE) DATALEN(80)"
End
Address ISPEXEC "LMMADD DATAID("pan") MEMBER(IPLINFOH)"
Address ISPEXEC "LMFREE DATAID("pan")"
"Delstack"
"EXECIO" Queued() "DISKW" ddnm1 "(FINIS"
zerrsm = 'IPLINFO' LASTUPD
zerrlm = 'IPLINFO -' OPTION 'option.' ,
'Last updated on' LASTUPD ||'. Written by' ,
'Mark Zelden. Mark''s MVS Utilities -' ,
'http://www.mzelden.com/mvsutil.html'
zerralrm = 'NO' /* msg - no alarm */
zerrhm = 'IPLINFOH' /* help panel */
address ISPEXEC "LIBDEF ISPPLIB LIBRARY ID("||ddnm2||") STACK"
address ISPEXEC "SETMSG MSG(ISRZ002)"
address ISPEXEC "LMINIT DATAID(TEMP) DDNAME("||ddnm1||")"
If EDITOP = 'YES' then ,
address ISPEXEC "EDIT DATAID("||temp") PANEL(IPLINFOP)"
Else ,
address ISPEXEC "BROWSE DATAID("||temp") PANEL(IPLINFOP)"
address ISPEXEC "LMFREE DATAID("||temp")"
address ISPEXEC "LIBDEF ISPPLIB"
junk = MSG('OFF')
"FREE FI("||ddnm1||")"
"FREE FI("||ddnm2||")"
Return

REXXTOD:
/* REXX */
/* */
/* AUTHOR: Mark Zelden */
/* */
/***********************************************************/
/* Convert TOD string which is units since January 1, 1990 */
/* Result is in format of YYYY.DDD HH:MM:SS.ttt */
/* */
/* Examples: */
/* REXXTOD B92E37543F000000 --> 2003.086 05:06:06.435 */
/* REXXTOD C653258535522000 --> 2010.205 13:23:45.154 */
/* REXXTOD C8B8D8A516A77000 --> 2011.328 16:09:07.768 */
/***********************************************************/
Arg TODIN
/* Numeric Digits 16 */ /* commented out, IPLINFO already higher */
TODIN = Left(TODIN,13,0) /* rtn can only handle 1000s of a second */
TODIN = X2d(TODIN) /* convert to decimal for arithmetic */
TODIN = TODIN % 1000
TTT = TODIN // 1000 /* 1000s of a second - ".ttt" */
TODIN = TODIN % 1000
SS = TODIN // 60; /* Seconds - "SS" */
TODIN = TODIN % 60
MM = TODIN // 60; /* Minutes - "MM" */
TODIN = TODIN % 60
HH = TODIN // 24; /* Hours - "HH" */
TODIN = TODIN % 24

TODIN = TODIN + 1 /* add 1 to remainder, needed for next */


/* section of code taken from "RDATE" */

/* Determine YYYY and DDD */


if TODIN>365 then TODIN=TODIN+1
YEARS_X4=(TODIN-1)%1461
DDD=TODIN-YEARS_X4*1461
if TODIN > 73415 then DDD = DDD +1
EXTRA_YEARS=(DDD*3-3)%1096
DDD=DDD-(EXTRA_YEARS*1096+2)%3
YYYY=YEARS_X4*4+EXTRA_YEARS+1900

/* Format prior to result */


DDD = Right(DDD,3,'0')
HH = Right(HH,2,'0')
MM = Right(MM,2,'0')
SS = Right(SS,2,'0')
TTT = Right(TTT,3,'0')

TOD_VAL = YYYY'.'DDD HH':'MM':'SS'.'TTT


/* Say TOD_VAL; Exit 0 */
Return TOD_VAL
FORMAT_COMMAS:
/* REXX - Format whole number with commas */
/* */
/* AUTHOR: Mark Zelden */
/* */
Arg WHOLENUM

WHOLENUM = Strip(WHOLENUM)
COMMAVAR3 = ''
Parse var WHOLENUM COMMAVAR1
COMMAVAR1 = Reverse(COMMAVAR1)
Do while COMMAVAR1 <> ''
Parse var COMMAVAR1 COMMAVAR2 4 COMMAVAR1
If COMMAVAR3 = '' then COMMAVAR3 = COMMAVAR2
Else COMMAVAR3 = COMMAVAR3','COMMAVAR2
End
FORMATTED_WHOLENUM = Reverse(COMMAVAR3)
Return FORMATTED_WHOLENUM

/* rexx */
RDATE:
/* */
/* AUTHOR: Mark Zelden */
/* */
/************************************************/
/* Convert MM DD YYYY , YYYY DDD, or NNNNN to */
/* standard date output that includes the day */
/* of the week and the number of days (NNNNN) */
/* from January 1, 1900. This is not the same */
/* as the Century date! Valid input dates range */
/* from 01/01/1900 through 12/31/2172. */
/* */
/* A parm of "TODAY" can also be passed to */
/* the date conversion routine. */
/* MM DD YYYY can also be specifed as */
/* MM/DD/YYYY or MM-DD-YYYY. */
/* */
/* The output format is always as follows: */
/* MM/DD/YYYY.JJJ NNNNN WEEKDAY */
/* */
/* The above value will be put in the special */
/* REXX variable "RESULT" */
/* example: CALL RDATE TODAY */
/* example: CALL RDATE 1996 300 */
/* example: CALL RDATE 10 26 1996 */
/* example: CALL RDATE 10/26/1996 */
/* example: CALL RDATE 10-26-1996 */
/* example: CALL RDATE 35363 */
/* result: 10/26/1996.300 35363 Saturday */
/************************************************/
arg P1 P2 P3

If Pos('/',P1) <> 0 | Pos('-',P1) <> 0 then do


PX = Translate(P1,' ','/-')
Parse var PX P1 P2 P3
End

JULTBL = '000031059090120151181212243273304334'
DAY.0 = 'Sunday'
DAY.1 = 'Monday'
DAY.2 = 'Tuesday'
DAY.3 = 'Wednesday'
DAY.4 = 'Thursday'
DAY.5 = 'Friday'
DAY.6 = 'Saturday'

Select
When P1 = 'TODAY' then do
P1 = Substr(date('s'),5,2)
P2 = Substr(date('s'),7,2)
P3 = Substr(date('s'),1,4)
call CONVERT_MDY
call THE_END
end
When P2 = '' & P3 = '' then do
call CONVERT_NNNNN
call THE_END
end
When P3 = '' then do
call CONVERT_JDATE
call DOUBLE_CHECK
call THE_END
end
otherwise do
call CONVERT_MDY
call DOUBLE_CHECK
call THE_END
end
end /* end select */
/* say RDATE_VAL; exit 0 */
return RDATE_VAL
/**********************************************/
/* E N D O F M A I N L I N E C O D E */
/**********************************************/

CONVERT_MDY:
if P1<1 | P1>12 then do
say 'Invalid month passed to date routine'
exit 12
end
if P2<1 | P2>31 then do
say 'Invalid day passed to date routine'
exit 12
end
if (P1=4 | P1=6 | P1=9 | P1=11) & P2>30 then do
say 'Invalid day passed to date routine'
exit 12
end
if P3<1900 | P3>2172 then do
say 'Invalid year passed to date routine. Must be be 1900-2172'
exit 12
end
BASE = Substr(JULTBL,((P1-1)*3)+1,3)
if (P3//4=0 & P3<>1900 & P3<>2100) then LEAP= 1
else LEAP = 0
if P1 > 2 then BASE = BASE+LEAP
JJJ = BASE + P2
MM = P1
DD = P2
YYYY = P3
return

CONVERT_NNNNN:
if P1<1 | P1>99712 then do
say 'Invalid date passed to date routine. NNNNN must be 1-99712'
exit 12
end
/* Determine YYYY and JJJ */
if P1>365 then P1=P1+1
YEARS_X4=(P1-1)%1461
JJJ=P1-YEARS_X4*1461
if P1 > 73415 then JJJ = JJJ +1
EXTRA_YEARS=(JJJ*3-3)%1096
JJJ=JJJ-(EXTRA_YEARS*1096+2)%3
YYYY=YEARS_X4*4+EXTRA_YEARS+1900
P1 = YYYY ; P2 = JJJ ; call CONVERT_JDATE

CONVERT_JDATE:
MATCH = 'N'
if P1<1900 | P1>2172 then do
say 'Invalid year passed to date routine. Must be be 1900-2172'
exit 12
end
if P2<1 | P2>366 then do
say 'Invalid Julian date passed to date routine'
exit 12
end
if (P1//4=0 & P1<>1900 & P1<>2100) then LEAP= 1
else LEAP = 0
ADJ1 = 0
ADJ2 = 0
Do MM = 1 to 11
VAL1 = Substr(JULTBL,((MM-1)*3)+1,3)
VAL2 = Substr(JULTBL,((MM-1)*3)+4,3)
if MM >=2 then ADJ2 = LEAP
if MM >=3 then ADJ1 = LEAP
if P2 > VAL1+ADJ1 & P2 <= VAL2+ADJ2 then do
DD = P2-VAL1-ADJ1
MATCH = 'Y'
leave
end
end
if MATCH <> 'Y' then do
MM = 12
DD = P2-334-LEAP
end

YYYY = P1
JJJ = P2
return

DOUBLE_CHECK:
if MM = 2 then do
if DD > 28 & LEAP = 0 then do
say 'Invalid day passed to date routine'
exit 12
end
if DD > 29 & LEAP = 1 then do
say 'Invalid day passed to date routine'
exit 12
end
end
if LEAP = 0 & JJJ > 365 then do
say 'Invalid Julian date passed to date routine'
exit 12
end
return

THE_END:
YR_1900 = YYYY-1900
NNNNN = (YR_1900*365) +(YR_1900+3)%4 + JJJ
if YYYY > 1900 then NNNNN = NNNNN-1
if YYYY > 2100 then NNNNN = NNNNN-1
INDEX = NNNNN//7 /* index to DAY stem */
WEEKDAY = DAY.INDEX

DD = Right(DD,2,'0')
MM = Right(MM,2,'0')
YYYY = Strip(YYYY)
NNNNN = Right(NNNNN,5,'0')
JJJ = Right(JJJ,3,'0')

RDATE_VAL = MM||'/'||DD||'/'||YYYY||'.'||JJJ||' '||NNNNN||' '||WEEKDAY


return

SIG_ALL:
SIGTYPE = Condition('C') /* condition name */
If SIGTYPE = 'SYNTAX' then , /* SYNTAX error ? */
SIGINFO = Errortext(RC) /* rexx error message */
Else SIGINFO = Condition('D') /* condition description */
SIGLINE = Strip(Sourceline(SIGL)) /* error source code */
Say 'SIGNAL -' SIGTYPE 'ERROR:' SIGINFO , /* display the error info */
'on source line number' SIGL':' /* and line number */
Say '"'SIGLINE'"' /* error source code */
"Delstack" /* delete data stack */
Exit 16 /* exit RC=16 */

You might also like