initial commit
This commit is contained in:
commit
85607f1391
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
.vscode/
|
BIN
doc/ARCHIVER 6.1.4 User's Guide.pdf
Normal file
BIN
doc/ARCHIVER 6.1.4 User's Guide.pdf
Normal file
Binary file not shown.
BIN
doc/Algol_F_Compiler_Level_2_1.pdf
Normal file
BIN
doc/Algol_F_Compiler_Level_2_1.pdf
Normal file
Binary file not shown.
BIN
doc/Algol_F_Level_2_1_ICR_General_Information_Manual.pdf
Normal file
BIN
doc/Algol_F_Level_2_1_ICR_General_Information_Manual.pdf
Normal file
Binary file not shown.
BIN
doc/Algol_F_Library_Level_2_1.pdf
Normal file
BIN
doc/Algol_F_Library_Level_2_1.pdf
Normal file
Binary file not shown.
BIN
doc/BASIC360 Compile.pdf
Executable file
BIN
doc/BASIC360 Compile.pdf
Executable file
Binary file not shown.
BIN
doc/BASIC360 Execution.pdf
Executable file
BIN
doc/BASIC360 Execution.pdf
Executable file
Binary file not shown.
BIN
doc/BASIC360 Unload.pdf
Executable file
BIN
doc/BASIC360 Unload.pdf
Executable file
Binary file not shown.
BIN
doc/BREXX External Function feature.pdf
Normal file
BIN
doc/BREXX External Function feature.pdf
Normal file
Binary file not shown.
BIN
doc/BREXX370 String Array functions.pdf
Normal file
BIN
doc/BREXX370 String Array functions.pdf
Normal file
Binary file not shown.
BIN
doc/BREXX370_Formatted_Screens_Guide_V2R5M2.pdf
Normal file
BIN
doc/BREXX370_Formatted_Screens_Guide_V2R5M2.pdf
Normal file
Binary file not shown.
BIN
doc/BREXX370_Installation_Guide_V2R5M2.pdf
Normal file
BIN
doc/BREXX370_Installation_Guide_V2R5M2.pdf
Normal file
Binary file not shown.
BIN
doc/BREXX370_Migration_Notice_V2R1M0.pdf
Normal file
BIN
doc/BREXX370_Migration_Notice_V2R1M0.pdf
Normal file
Binary file not shown.
BIN
doc/BREXX370_Migration_Notice_V2R2M0.pdf
Normal file
BIN
doc/BREXX370_Migration_Notice_V2R2M0.pdf
Normal file
Binary file not shown.
BIN
doc/BREXX370_Migration_Notice_V2R3M0.pdf
Normal file
BIN
doc/BREXX370_Migration_Notice_V2R3M0.pdf
Normal file
Binary file not shown.
BIN
doc/BREXX370_Migration_Notice_V2R4M0.pdf
Normal file
BIN
doc/BREXX370_Migration_Notice_V2R4M0.pdf
Normal file
Binary file not shown.
BIN
doc/BREXX370_Migration_Notice_V2R5M1.pdf
Normal file
BIN
doc/BREXX370_Migration_Notice_V2R5M1.pdf
Normal file
Binary file not shown.
BIN
doc/BREXX370_Migration_Notice_V2R5M2.pdf
Normal file
BIN
doc/BREXX370_Migration_Notice_V2R5M2.pdf
Normal file
Binary file not shown.
BIN
doc/BREXX370_Users_Guide_V2R5M2.pdf
Normal file
BIN
doc/BREXX370_Users_Guide_V2R5M2.pdf
Normal file
Binary file not shown.
BIN
doc/BREXX370_VSAM_Guide_V2R5M2.pdf
Normal file
BIN
doc/BREXX370_VSAM_Guide_V2R5M2.pdf
Normal file
Binary file not shown.
BIN
doc/Basic360 draft.pdf
Executable file
BIN
doc/Basic360 draft.pdf
Executable file
Binary file not shown.
13689
doc/CALL_360_BASIC_Reference_Handbook_1970.pdf
Normal file
13689
doc/CALL_360_BASIC_Reference_Handbook_1970.pdf
Normal file
File diff suppressed because one or more lines are too long
BIN
doc/CS-TR-79-731.pdf
Normal file
BIN
doc/CS-TR-79-731.pdf
Normal file
Binary file not shown.
BIN
doc/EDIT 3.3 User's Guide.pdf
Normal file
BIN
doc/EDIT 3.3 User's Guide.pdf
Normal file
Binary file not shown.
File diff suppressed because one or more lines are too long
BIN
doc/HerculesGeneralInfo.pdf
Normal file
BIN
doc/HerculesGeneralInfo.pdf
Normal file
Binary file not shown.
BIN
doc/HerculesInstallation.pdf
Normal file
BIN
doc/HerculesInstallation.pdf
Normal file
Binary file not shown.
BIN
doc/HerculesMessagesandCodes.pdf
Normal file
BIN
doc/HerculesMessagesandCodes.pdf
Normal file
Binary file not shown.
BIN
doc/HerculesOperationsandUtilities.pdf
Normal file
BIN
doc/HerculesOperationsandUtilities.pdf
Normal file
Binary file not shown.
BIN
doc/HerculesReferenceSummary.pdf
Normal file
BIN
doc/HerculesReferenceSummary.pdf
Normal file
Binary file not shown.
BIN
doc/HerculesUserReference.pdf
Normal file
BIN
doc/HerculesUserReference.pdf
Normal file
Binary file not shown.
108
doc/Hercules_Q_Public_License.htm
Normal file
108
doc/Hercules_Q_Public_License.htm
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 3.0//EN" "html.dtd">
|
||||||
|
<HTML>
|
||||||
|
<HEAD><TITLE>Hercules: Q Public License</TITLE>
|
||||||
|
</HEAD>
|
||||||
|
<BODY BGCOLOR="#ffffcc" TEXT="#000000" LINK="#0000A0"
|
||||||
|
VLINK="#008040" ALINK="#000000">
|
||||||
|
<h1>THE Q PUBLIC LICENSE version 1.0</h1>
|
||||||
|
<hr noshade>
|
||||||
|
<font size="2">Copyright (C) 1999 Trolltech AS, Norway.<br>
|
||||||
|
</font><font size="1">Everyone is permitted to copy and<br>
|
||||||
|
distribute this license document. </font>
|
||||||
|
<p>The intent of this license is to establish freedom to share and
|
||||||
|
change the software regulated by this license under the open source
|
||||||
|
model.</p>
|
||||||
|
<p>This license applies to any software containing a notice placed by
|
||||||
|
the copyright holder saying that it may be distributed under the terms
|
||||||
|
of the Q Public License version 1.0. Such software is herein referred
|
||||||
|
to as the Software. This license covers modification and distribution
|
||||||
|
of the Software, use of third-party application programs based on the
|
||||||
|
Software, and development of free software which uses the
|
||||||
|
Software.</p>
|
||||||
|
<center>
|
||||||
|
<h2>Granted Rights</h2>
|
||||||
|
</center>
|
||||||
|
<p>1. You are granted the non-exclusive rights set forth in this
|
||||||
|
license provided you agree to and comply with any and all conditions
|
||||||
|
in this license. Whole or partial distribution of the Software, or
|
||||||
|
software items that link with the Software, in any form signifies
|
||||||
|
acceptance of this license.</p>
|
||||||
|
<p>2. You may copy and distribute the Software in unmodified form
|
||||||
|
provided that the entire package, including - but not restricted to -
|
||||||
|
copyright, trademark notices and disclaimers, as released by the
|
||||||
|
initial developer of the Software, is distributed.</p>
|
||||||
|
<p>3. You may make modifications to the Software and distribute your
|
||||||
|
modifications, in a form that is separate from the Software, such as
|
||||||
|
patches. The following restrictions apply to modifications:</p>
|
||||||
|
<blockquote>
|
||||||
|
<p>a. Modifications must not alter or remove any copyright notices in
|
||||||
|
the Software.</p>
|
||||||
|
<p>b. When modifications to the Software are released under this
|
||||||
|
license, a non-exclusive royalty-free right is granted to the initial
|
||||||
|
developer of the Software to distribute your modification in future
|
||||||
|
versions of the Software provided such versions remain available under
|
||||||
|
these terms in addition to any other license(s) of the initial
|
||||||
|
developer.</p>
|
||||||
|
</blockquote>
|
||||||
|
<p>4. You may distribute machine-executable forms of the Software or
|
||||||
|
machine-executable forms of modified versions of the Software,
|
||||||
|
provided that you meet these restrictions:</p>
|
||||||
|
<blockquote>
|
||||||
|
<p>a. You must include this license document in the distribution.</p>
|
||||||
|
<p>b. You must ensure that all recipients of the machine-executable
|
||||||
|
forms are also able to receive the complete machine-readable source
|
||||||
|
code to the distributed Software, including all modifications, without
|
||||||
|
any charge beyond the costs of data transfer, and place prominent
|
||||||
|
notices in the distribution explaining this.</p>
|
||||||
|
<p>c. You must ensure that all modifications included in the
|
||||||
|
machine-executable forms are available under the terms of this
|
||||||
|
license.</p>
|
||||||
|
</blockquote>
|
||||||
|
<p>5. You may use the original or modified versions of the Software to
|
||||||
|
compile, link and run application programs legally developed by you or
|
||||||
|
by others.</p>
|
||||||
|
<p>6. You may develop application programs, reusable components and
|
||||||
|
other software items that link with the original or modified versions
|
||||||
|
of the Software. These items, when distributed, are subject to the
|
||||||
|
following requirements:</p>
|
||||||
|
<blockquote>
|
||||||
|
<p>a. You must ensure that all recipients of machine-executable forms
|
||||||
|
of these items are also able to receive and use the complete
|
||||||
|
machine-readable source code to the items without any charge beyond
|
||||||
|
the costs of data transfer.</p>
|
||||||
|
<p>b. You must explicitly license all recipients of your items to use
|
||||||
|
and re-distribute original and modified versions of the items in both
|
||||||
|
machine-executable and source code forms. The recipients must be able
|
||||||
|
to do so without any charges whatsoever, and they must be able to
|
||||||
|
re-distribute to anyone they choose.</p>
|
||||||
|
<p>c. If the items are not available to the general public, and the
|
||||||
|
initial developer of the Software requests a copy of the items, then
|
||||||
|
you must supply one.</p>
|
||||||
|
</blockquote>
|
||||||
|
<center>
|
||||||
|
<h2>Limitations of Liability</h2>
|
||||||
|
</center>
|
||||||
|
<p>In no event shall the initial developers or copyright holders be
|
||||||
|
liable for any damages whatsoever, including - but not restricted to -
|
||||||
|
lost revenue or profits or other direct, indirect, special, incidental
|
||||||
|
or consequential damages, even if they have been advised of the
|
||||||
|
possibility of such damages, except to the extent invariable law, if
|
||||||
|
any, provides otherwise.</p>
|
||||||
|
<center>
|
||||||
|
<h2>No Warranty</h2>
|
||||||
|
</center>
|
||||||
|
<p>The Software and this license document are provided AS IS with NO
|
||||||
|
WARRANTY OF ANY KIND, INCLUDING THE WARRANTY OF DESIGN,
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.</p>
|
||||||
|
<center>
|
||||||
|
<h2>Choice of Law</h2>
|
||||||
|
</center>
|
||||||
|
<p>This license is governed by the Laws of England.
|
||||||
|
<p><center><hr width=15% noshade>
|
||||||
|
<p>
|
||||||
|
</center>
|
||||||
|
|
||||||
|
<small>
|
||||||
|
<p>Last updated 3 December 2000
|
||||||
|
</BODY>
|
||||||
|
</HTML>
|
46233
doc/IBM_Pascal_Compiler_Aug81.pdf
Normal file
46233
doc/IBM_Pascal_Compiler_Aug81.pdf
Normal file
File diff suppressed because one or more lines are too long
Binary file not shown.
BIN
doc/INTERCOMM Basic System Macros Release 9 - 10 1986.pdf
Normal file
BIN
doc/INTERCOMM Basic System Macros Release 9 - 10 1986.pdf
Normal file
Binary file not shown.
BIN
doc/INTERCOMM COBOL Programmers Guide Release 9 - 10 1989.pdf
Normal file
BIN
doc/INTERCOMM COBOL Programmers Guide Release 9 - 10 1989.pdf
Normal file
Binary file not shown.
BIN
doc/INTERCOMM Concepts and Facilities Release 9 1987.pdf
Normal file
BIN
doc/INTERCOMM Concepts and Facilities Release 9 1987.pdf
Normal file
Binary file not shown.
BIN
doc/INTERCOMM Generalized Front End Facility Release 9 1982.pdf
Normal file
BIN
doc/INTERCOMM Generalized Front End Facility Release 9 1982.pdf
Normal file
Binary file not shown.
BIN
doc/INTERCOMM Message Mapping Utilities Release 9 1983.pdf
Normal file
BIN
doc/INTERCOMM Message Mapping Utilities Release 9 1983.pdf
Normal file
Binary file not shown.
BIN
doc/INTERCOMM Messages and Codes Release 9 198 6.pdf
Normal file
BIN
doc/INTERCOMM Messages and Codes Release 9 198 6.pdf
Normal file
Binary file not shown.
BIN
doc/INTERCOMM Operating Reference Manual Release 9 1983.pdf
Normal file
BIN
doc/INTERCOMM Operating Reference Manual Release 9 1983.pdf
Normal file
Binary file not shown.
BIN
doc/INTERCOMM Planning Guide Release 9 1982.pdf
Normal file
BIN
doc/INTERCOMM Planning Guide Release 9 1982.pdf
Normal file
Binary file not shown.
BIN
doc/INTERCOMM System Control Commands Release 9 1982.pdf
Normal file
BIN
doc/INTERCOMM System Control Commands Release 9 1982.pdf
Normal file
Binary file not shown.
308
doc/JES2 COMMANDS.html
Normal file
308
doc/JES2 COMMANDS.html
Normal file
@ -0,0 +1,308 @@
|
|||||||
|
<!DOCTYPE HTML PUBLIC>
|
||||||
|
<link rel="manifest" href="https://www.oocities.org/geocities-archive/manifest.json">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=0.5">
|
||||||
|
<meta http-equiv="Cache-control" content="public, min-fresh:2400000">
|
||||||
|
<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">
|
||||||
|
<style type="text/css"> html { max-width:1024px;overflow:auto;} </style>
|
||||||
|
<script language="JavaScript" type="text/javascript">
|
||||||
|
if (window == top) {
|
||||||
|
//document.write('<div style="height:30px;"></div><div id="content" style="max-width:1022px;overflow:auto">');
|
||||||
|
}
|
||||||
|
else {document.write('<div id="content" style="max-width:804px;max-height:3var width = window.innerWidth || (window.document.documentElement.clientWidth || window.document.body.clientWidth);
|
||||||
|
var height = window.innerHeight || (window.document.documentElement.clientHeight || window.document.body.clientHeight);1500px;overflow:auto">');} </script>
|
||||||
|
|
||||||
|
<script language="JavaScript" src="https://www.oocities.org/js_source/geovck08.js"></script>
|
||||||
|
<html>
|
||||||
|
<head><title>JES2 COMMANDS</title></head>
|
||||||
|
<BODY BGCOLOR="black" TEXT="white" LINK="yellow" VLINK="red" ALINK="black">
|
||||||
|
|
||||||
|
<br>
|
||||||
|
<FONT SIZE="7">
|
||||||
|
<H1><B><I>JES2 COMMANDS</I></B><H1>
|
||||||
|
<font size="3">
|
||||||
|
<p>
|
||||||
|
<pre>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
$AA,ALL / ACTIVATES JOB QUEUE
|
||||||
|
$ADD PRT(####) / ADD PRT DYNAMICALLY
|
||||||
|
$ADD RMT(####) / ADD RJE WORKSTATION DYNAMICALLY
|
||||||
|
$AJ### / ACTIVATES JOB BY NUMBER
|
||||||
|
$AQ,ALL / ACTIVATE ALL CLASSES
|
||||||
|
$AQ,C=CLASSNAME / ACTIVATE A CLASSNAME
|
||||||
|
$A'JOBNAME' / ACTIVATE BY JOBNAME
|
||||||
|
$BPRT#,D / BACKSPACE PRINTER TO BEGINING OF DATASET
|
||||||
|
$BPRT ,DS / BACKSPACE PRINTER
|
||||||
|
$BPRT ,DSXX / BACKSPACE PRINTER
|
||||||
|
$BPRT ,XXXX / BACKSPACE PRINTER
|
||||||
|
$BPUN / BACKSPACE PUNCH
|
||||||
|
$CA,ALL / CANCELS ALL AUTOMATIC COMMANDS
|
||||||
|
$CJ### / CANCEL JOB BY JOB NUMBER
|
||||||
|
$CJ###,P / CANCELS JOB AND HELD OUTPUT
|
||||||
|
$CJ ,DUMP / CANCEL JOB BY JOB NUMBER WITH DUMP
|
||||||
|
$CJ'JOBNAME' / CANCEL JOB BY JOBNAME
|
||||||
|
$CPRT / CANCELS PRINTER
|
||||||
|
$CPUN / CANCELS PUNCH
|
||||||
|
$CS / CANCEL STARTED TASK
|
||||||
|
$CS1-32767,P / PURGES STARTED TASK OUTPUT
|
||||||
|
$DA / DISPLAYS ALL ACTIVE
|
||||||
|
$DAPPL(*),NODE=XX / DISPLAYS APPLID FOR NODE
|
||||||
|
$DA,D / DISPLAYS ACTIVE DEVICES
|
||||||
|
$DA,L=A / DISPLAYS ACTIVE JOBS
|
||||||
|
$D ACTRMT / DISPLAYS ACTIVE RJE WORKSTATIONS IN THE MAS
|
||||||
|
$D DESTID / DISPLAYS FORMS
|
||||||
|
$DF / DISPLAYS FORMS
|
||||||
|
$DI / DISPLAYS INITIATORS
|
||||||
|
$DI A-K / DISPLAYS INIT`S A THRU K
|
||||||
|
$D JOBCLASS / DISPLAYS JOB BY ????
|
||||||
|
$DJ### / DISPLAYS JOB BY NUMBER
|
||||||
|
$D JOBDEF / DISPLAYS JQE'S
|
||||||
|
$DJ'JOBNAME' / DISPLAYS JOB BY JOBNAME
|
||||||
|
$D LINE / DISPLAYS
|
||||||
|
$D M / DISPLAYS A MESSAGE TO JCL OF JOB
|
||||||
|
$D MASDEF / DISPLAYS
|
||||||
|
$DMJ##,'XXXX' / DISPLAYS A MESSAGE TO JCL OF JOB
|
||||||
|
$DMNXX,'XXXX' / DISPLAYS A MESSAGE TO REMOTE NODE
|
||||||
|
$DN,ALL / CAUSES PROBLEMS FOR WTO
|
||||||
|
$DNODE(NJENSS2) / DISPLAYS NODE
|
||||||
|
$DN,Q=XEQ_,L=A / DISPLAYS JOBS WAITING EXECUTION
|
||||||
|
$DN,Q=XEQ# / # FOR CLASS
|
||||||
|
$DN,Q=XMT / DISPLAYS JOBS IN THE XMITTER QUEUE
|
||||||
|
$DN,Q=HOLD / DISPLAYS JOBS IN HOLD QUEUE
|
||||||
|
$DN=LOCAL / DISPLAYS JOB ROUTED TO LOCAL PRINTER
|
||||||
|
$DN,R=R3Ø / DISPLAYS JOBS ROUTED TO SPECIFIC PRINTER
|
||||||
|
$DPATH(SAN) / DISPLAYS NJE PATH FOR A NODE
|
||||||
|
$D PCE / DISPLAYS
|
||||||
|
$D PRT# / DISPLAYS
|
||||||
|
$DQ,ALL / DISPLAYS QUEUE
|
||||||
|
$DQ,OUT / DISPLAYS QUEUE .......
|
||||||
|
$DQ,Q=HOLD / SUMMARIZES JOBS IN THE HOLD QUEUE
|
||||||
|
$DQ,Q=XEQ / SUMMARIZES JOBS IN THE ALLOCATE QUEUE
|
||||||
|
$DQ,Q=XMT / SUMMARIZES JOBS IN THE XMITTER QUEUE
|
||||||
|
$DQ,Q=XEQ# / FOR CLASS DISPLAY ....
|
||||||
|
$D REBLD / DISPLAYS ALL JOE'S AND JQE'S ON THE REBUILD
|
||||||
|
$DSPOOL / DISPLAYS PERCENT OF SPOOL USED
|
||||||
|
$DSPL / DISPLAYS PERCENT OF SPOOL USED
|
||||||
|
$DSPL,JOBS=Ø2 / DISPLAYS PERCENT OF SPOOL USED OVER 2%
|
||||||
|
$DSPL,ALL / DISPLAYS PERCENT OF SPOOL USED BY VOLUMES
|
||||||
|
$DT##### / DISPLAYS ??????????????
|
||||||
|
$DU,ALL / DISPLAYS ALL UNITS
|
||||||
|
$DU,L=A / DISPLAYS NETWORK EQUIPMENT
|
||||||
|
$DU,LNE2Ø / DISPLAYS A NETWORK LINE
|
||||||
|
$DU,LNES,L=A / DISPLAYS NETWORK LINES
|
||||||
|
$DU,LOGON1 / DISPLAY LOGON1
|
||||||
|
$DU,OFFLOAD / DISPLAYS OFFLOAD
|
||||||
|
$DU,OFFS / DISPLAYS OFFLOAD
|
||||||
|
$DU,PRT# / DISPLAYS PRINTER
|
||||||
|
$DU,RDRI / DISPLAYS STATUS OF ALL INTERNAL READERS
|
||||||
|
$DU,RDR# / DISPLAYS STATUS OF A READER
|
||||||
|
$DU,RMTS / DISPLAYS REMOTES
|
||||||
|
$DU,TP / DISPLAYS STATUS OF NJE CONNECTIONS
|
||||||
|
$DU,TP,L=A / DISPLAYS ALL TP LINES
|
||||||
|
$DX,USERID / DISPLAYS USER NAME & PHONE NUMBER
|
||||||
|
$D'JOBNAME' / DISPLAYS JOB BY JOBNAME
|
||||||
|
$E CKPTLOCK,HELDBY= / RESETS THE CHECKPOINT LOCK
|
||||||
|
$EPRT / RESTART PRINTER
|
||||||
|
$EJ / RESTART JOB BY JOB NUMBER
|
||||||
|
$ELNEX / RESTART SNA SESSION ON LINE X
|
||||||
|
$E MEMBER / RESTARTS JOBS FROM A FAILED MEMBER
|
||||||
|
$FPRT ,XXXX / FORWARD SPACE PRINT XXXX AMOUNT OF LINES
|
||||||
|
$HJ / HOLD JOB BY JOBNUMBER
|
||||||
|
$HJ'JOBNAME' / HOLD JOB BY JOBNAME
|
||||||
|
$HQ,ALL / HOLD ALL QUEUES
|
||||||
|
$HQ,C=X / HOLD QUEUE CLASSES X
|
||||||
|
$IPRT / INTERRUPT PRINTER
|
||||||
|
$LJ###,H / LIST JOB FOR QUEUED OUTPUT
|
||||||
|
$LJ###,ALL / LIST JOB FOR ALL
|
||||||
|
$L'JOBNAME' / LIST JOB BY JOBNAME
|
||||||
|
$NPRT / REPEATS JOBS OUTPUT FOR DUPLICATE COPY
|
||||||
|
$NJXXX / REPEATS JOB ON PRINTER
|
||||||
|
$OJXXXX / RELEASES DATASETS FOR A JOB
|
||||||
|
$OJXXXX,Q=CLASS / RELEASES DATASETS FOR A JOB
|
||||||
|
$OQ,Q=_,C,D=X / RELEASES JOB CLASSES
|
||||||
|
$PJ / STOP AND DELETE JOB UPON COMPLETION OF C/A
|
||||||
|
$P'XXXX' / STOP AND DELETE JOB UPON COMPLETION OF C/A
|
||||||
|
$PI / DRAIN INITIATORS
|
||||||
|
$PI5-9 / DRAIN INIT'S 5 THRU 9
|
||||||
|
$PLNE# / DRAIN LINE
|
||||||
|
$PLNE1-1Ø4 / DRAINS LINES
|
||||||
|
$PLGN / STOP THE JES2 VTAM INTERFACE
|
||||||
|
$POFF1.JT / DRAINS THE JOB TRANSMITTER
|
||||||
|
$PLOGON1 / DRAINS LOGON1 (RJE)
|
||||||
|
$PPRT / DRAIN PRINTER
|
||||||
|
$PPUN / DRAIN PUNCH
|
||||||
|
$PRDR / DRAIN READER
|
||||||
|
$P'JOBNAME' / PURGE JOB BY JOBNAME`
|
||||||
|
$PQ,Q=D / PURGE JOB BY CLASS
|
||||||
|
$RALL,J=J ,D=LOCAL / REROUTES REMOTE JOB TO LOCAL PRINTER
|
||||||
|
$SIA-K / START INIT'S A THRU K
|
||||||
|
$SLNES / START LINES
|
||||||
|
$SLNE197 / START LINE 197
|
||||||
|
$SL2Ø.JR1 / STARTS LINE 2Ø'S JOB RECEIVER
|
||||||
|
$SL2Ø.JR1 / STARTS LINE 2Ø'S JOB TRANSMITTER
|
||||||
|
$SLOGON1 / START LOGON1
|
||||||
|
$SN,A=SNAJES2A / TO START A LINE CONNECTION
|
||||||
|
$SN,N=PWRAPL / TO START EXECNODE CONNECTION
|
||||||
|
$SPRT / START PRINTER
|
||||||
|
$SPUN / START PUNCH
|
||||||
|
$SRDR / START READER
|
||||||
|
$TA,ALL / DISPLAYS AUTOMATIC COMMANDS
|
||||||
|
$TA,ID=##,'CMD' / MODIFY AUTOMATIC
|
||||||
|
$TIX,XXX / CHANGE INIT'S FOR CLASS
|
||||||
|
$TJXXXXX,P=x / SETS EXECUTION PRIORITY FOR A JOB
|
||||||
|
$TJXXXXX,C=# / RESETS CLASS
|
||||||
|
$TNODE(*) / DISPLAYS INFO ON ALL NODES.
|
||||||
|
$TOJ ,ALL,P= / RESET OUTPUT OUTOUT PRIORITY
|
||||||
|
$TOJ ,ALL,D=LOCAL / RESET DESTINATION OUTPUT TO LOCAL
|
||||||
|
$TOJ ,ALL,D=REMOTE / RESET DESTINATION OUTPUT TO REMOTE
|
||||||
|
$T MEMBER / SETS A MEMBER OF A MAS TO INDEPENDENT MODE
|
||||||
|
$TPRT ,F=FORMNAME / RESET FORMNAME
|
||||||
|
$TPRINTDEF /
|
||||||
|
$TPRT ,LIM=Ø-1ØØØØ / RESET LIMITS ON PRINTER
|
||||||
|
$TPRT ,Q= / CHANGE SYSOUT QUEUE FOR PRINTER
|
||||||
|
$TPRT ,R=LOCAL / RESET ROUTING
|
||||||
|
$TPRT ,S=Y / RESET SEPARATOR STATUS TO YES
|
||||||
|
$TPRT3,T=P11 / SET BUFFER FOR PRINTER 3
|
||||||
|
$TPRT2,R=(R1,LOCAL) / RESET ROUTING FOR PRINTER FOR REMOTE & LOCAL
|
||||||
|
$TPRT2,O=RESET / RESET FORMS FLASH
|
||||||
|
$TOFF1.ST,WS=)/Q),Q=ABC / ??????
|
||||||
|
$TR.PR1.PR1,R=(R1) / FOR REMOTE PRINT AT REMOTE
|
||||||
|
$ZPRT / HALTS PRINTER
|
||||||
|
$ZI / HALTS INIT'S
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
MISC COMMANDS
|
||||||
|
|
||||||
|
$HJXXXX;$EJXXXX;$CJXXXX;$TJXXXX,S=SSSS;$AJXXXX - MOVES JOB TO ANOTHER SYS
|
||||||
|
|
||||||
|
$SOFFLOAD1,TYPE=TRANSMIT / ??????
|
||||||
|
$TOFF1.ST,WS=(/Q),Q=ABC / ??????
|
||||||
|
$TOFF2.ST,WS=(Q/),Q=ABC / ??????
|
||||||
|
$POFF2.JT
|
||||||
|
$POFF2.JR
|
||||||
|
$POFF2.SR
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<script language="JavaScript" type="text/javascript">
|
||||||
|
var width = window.innerWidth || (window.document.documentElement.clientWidth || window.document.body.clientWidth);
|
||||||
|
var height = window.innerHeight || (window.document.documentElement.clientHeight || window.document.body.clientHeight);
|
||||||
|
var d = document;
|
||||||
|
if (width>=639 && height>=468 || top.location.href == window.location.href) {
|
||||||
|
}
|
||||||
|
rp_account = '9645';rp_site = '17527';rp_zonesize = '1527362-51';rp_slot = 'ad_group_786919';rp_adtype = 'js';rp_smartfile = '[SMART FILE URL]';
|
||||||
|
d.write('<script language="JavaScript" type="text/javascript"');
|
||||||
|
d.write(' src="https://ads.rubiconproject.com/ad/9645.js">');
|
||||||
|
d.write('<\/scr'+'ipt>');}</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
|
||||||
|
</div><style>
|
||||||
|
.zoomout { -webkit-transition: -webkit-transform 0.5s ease;
|
||||||
|
-moz-transition: -moz-transform 0.5s ease;
|
||||||
|
-o-transition: -o-transform 0.5s ease;
|
||||||
|
transition: transform 0.5s;
|
||||||
|
-ms-transition: transform 0.5s ease;}
|
||||||
|
.zoomin {
|
||||||
|
filter: blur(0)
|
||||||
|
-webkit-transform: scaleY(1.15);
|
||||||
|
-moz-transform: scaleY(1.15);
|
||||||
|
-o-transform: scaleY(1.15);
|
||||||
|
transform: scaleYY(1.15);
|
||||||
|
-ms-transform: scaleY(1.15);
|
||||||
|
}
|
||||||
|
#archive:hover { zoom:101%;)
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<script language="JavaScript" type="text/javascript">
|
||||||
|
<!--
|
||||||
|
var width = window.innerWidth || (window.document.documentElement.clientWidth || window.document.body.clientWidth);
|
||||||
|
var height = window.innerHeight || (window.document.documentElement.clientHeight || window.document.body.clientHeight);
|
||||||
|
var d = document;
|
||||||
|
|
||||||
|
if (width>=806 && height>=468 || top.location.href == window.location.href) {
|
||||||
|
d.write('<div id="archive" onMouseOver="className=\'zoomin\';this.style.zIndex=\'99\'" onMouseOut="className=\'zoomout\';this.style.zIndex=\'5\'" style="padding-left:25px;background-image:url(https://www.oocities.org/d.jpg); background-repeat:repeat-x; filter:alpha(opacity=88); -moz-opacity:0.88 ; opacity:0.88; position:fixed; background-color:#FFFFFF; width:100%; min-width:970px; overflow:hidden; left:0px; top:0px; font-family:times; font-size:9px; border-bottom:5px solid #f7f7f7; color:#000000;background-color:#ffffe0;z-Index:5;"><font style="font-size:16px" color="#000000"> This Page is an outdated, user-generated website brought to you by an archive</font><font style="font-family:times; font-size:9px" color="#000000">.It was mirrored from Geocities at the end of October, 2009.<br>For any questions concerning this page try to contact the respective author. (To report any malicious content send the URL to oocities(at gmail dot com). For question about the archive visit: <a style="color:#005577" href="//oocities.org" target="_new" title="geocities archive">OoCities.org</a>.</font><div onClick="archive.style.display=\'none\'" onMouseOver="style.cursor=\'pointer\'" style="font-size:17px;position:absolute;left:3px;top:3px;color:#999;line-height:20px">[x]</div><div onClick="archive.style.display=\'none\';footer.style.display=\'none\'" onMouseOver="style.cursor=\'pointer\'" style="font-size:19px;position:absolute;right:30px;top:0px;color:#777;line-height:20px">[x]</div></div>');
|
||||||
|
var x = d.getElementById('content').offsetWidth;
|
||||||
|
d.write('<div id="foot" style="position:fixed;left:1018px;top:31px;z-index:10;padding-bottom:3px"><div id="ft72">');
|
||||||
|
rp_account = '9645';
|
||||||
|
rp_site = '17527';
|
||||||
|
rp_zonesize = '55620-15';
|
||||||
|
rp_slot = 's';
|
||||||
|
rp_adtype = 'iframe';
|
||||||
|
rp_width = '300';
|
||||||
|
rp_height = '250';
|
||||||
|
rp_smartfile = '[SMART FILE URL]';
|
||||||
|
d.write('<script language="JavaScript" type="text/javascript"');
|
||||||
|
d.write('src="https://ads.rubiconproject.com/ad/9645.js">');
|
||||||
|
d.write('<\/scr'+'ipt></div>');
|
||||||
|
if ( height>=543) {
|
||||||
|
var cb = Math.random();
|
||||||
|
var iframe = "&fr=" + (window != top);
|
||||||
|
var ref = "";
|
||||||
|
try {
|
||||||
|
if (window != top) {
|
||||||
|
ref = "&rf="+escape(d.referrer);
|
||||||
|
}
|
||||||
|
} catch (ignore) { }
|
||||||
|
d.write('<script id="rp3" language="JavaScript" type="text/javascript"');
|
||||||
|
d.write('src="https://optimized-by.rubiconproject.com/a/9645/17527/55620-15.js?cb='+cb+ref+iframe+'"></script>')
|
||||||
|
}
|
||||||
|
|
||||||
|
d.write('<div id="ft73"><span onClick="foot.style.display=\'none\'" style="font-size:16px;position:relative;left:7px;color:#555;background-color:ccc;line-height:19px"> \[x\]close <\/span><\/div>');
|
||||||
|
|
||||||
|
|
||||||
|
if ( width-x>=440 || width>=1425) {
|
||||||
|
d.write('<div id="footer" style="position:fixed;left:1310px;top:31px;z-index:11;padding-bottom:3px"><div id="ft74">');
|
||||||
|
|
||||||
|
var cb = Math.random();
|
||||||
|
var iframe = "&fr=" + (window != top);
|
||||||
|
var ref = "";
|
||||||
|
try {
|
||||||
|
if (window != top) {
|
||||||
|
ref = "&rf="+escape(d.referrer);
|
||||||
|
}
|
||||||
|
} catch (ignore) { }
|
||||||
|
d.write('<script id="rp3" language="JavaScript" type="text/javascript"');
|
||||||
|
d.write('src="https://optimized-by.rubiconproject.com/a/9645/17527/55620-15.js?cb='+cb+ref+iframe+'">')
|
||||||
|
d.write('<\/scr'+'ipt><\/div><div id="ft75">');
|
||||||
|
|
||||||
|
var cb = Math.random();
|
||||||
|
var iframe = "&fr=" + (window != top);
|
||||||
|
var ref = "";
|
||||||
|
try {
|
||||||
|
if (window != top) {
|
||||||
|
ref = "&rf="+escape(d.referrer);
|
||||||
|
}
|
||||||
|
} catch (ignore) { }
|
||||||
|
d.write('<script id="rp4" language="JavaScript" type="text/javascript"');
|
||||||
|
d.write('src="https://optimized-by.rubiconproject.com/a/9645/17527/55620-15.js?cb='+cb+ref+iframe+'">');
|
||||||
|
d.write('<\/scr'+'ipt></div></div>');
|
||||||
|
}}
|
||||||
|
-->
|
||||||
|
</script>
|
||||||
|
<script type="text/javascript">
|
||||||
|
if (x<=1015){d.getElementById('foot').style.left = x + "px";}
|
||||||
|
d.getElementById('footer').style.left = x + d.getElementById('foot').offsetWidth + "px";
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<script type="text/javascript">
|
||||||
|
<!--
|
||||||
|
var _gaq = _gaq || [];
|
||||||
|
_gaq.push(['_setAccount', 'UA-26808115-1']);
|
||||||
|
_gaq.push(['_setDomainName', 'oocities.org']);
|
||||||
|
_gaq.push(['_trackPageview']);
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
|
||||||
|
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
|
||||||
|
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
|
||||||
|
})();
|
||||||
|
-->
|
||||||
|
</script><script type="text/javascript"> window.google_analytics_uacct = "UA-26808115-1"; </script>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
BIN
doc/JES2 Command Subset.pdf
Normal file
BIN
doc/JES2 Command Subset.pdf
Normal file
Binary file not shown.
BIN
doc/JES2_ALT_IPL.png
Normal file
BIN
doc/JES2_ALT_IPL.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 46 KiB |
BIN
doc/MVS_TK4-_v1.00_Users_Manual.pdf
Normal file
BIN
doc/MVS_TK4-_v1.00_Users_Manual.pdf
Normal file
Binary file not shown.
BIN
doc/NJE38_Installation_and_Usage_Guide.pdf
Normal file
BIN
doc/NJE38_Installation_and_Usage_Guide.pdf
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
doc/Pascal_360_Oct74.pdf
Normal file
BIN
doc/Pascal_360_Oct74.pdf
Normal file
Binary file not shown.
BIN
doc/README_MVS_TK4-_v1.00_update_01.pdf
Normal file
BIN
doc/README_MVS_TK4-_v1.00_update_01.pdf
Normal file
Binary file not shown.
BIN
doc/README_MVS_TK4-_v1.00_update_02.pdf
Normal file
BIN
doc/README_MVS_TK4-_v1.00_update_02.pdf
Normal file
Binary file not shown.
BIN
doc/README_MVS_TK4-_v1.00_update_03.pdf
Normal file
BIN
doc/README_MVS_TK4-_v1.00_update_03.pdf
Normal file
Binary file not shown.
BIN
doc/README_MVS_TK4-_v1.00_update_04.pdf
Normal file
BIN
doc/README_MVS_TK4-_v1.00_update_04.pdf
Normal file
Binary file not shown.
BIN
doc/README_MVS_TK4-_v1.00_update_05.pdf
Normal file
BIN
doc/README_MVS_TK4-_v1.00_update_05.pdf
Normal file
Binary file not shown.
BIN
doc/README_MVS_TK4-_v1.00_update_06.pdf
Normal file
BIN
doc/README_MVS_TK4-_v1.00_update_06.pdf
Normal file
Binary file not shown.
BIN
doc/README_MVS_TK4-_v1.00_update_07.pdf
Normal file
BIN
doc/README_MVS_TK4-_v1.00_update_07.pdf
Normal file
Binary file not shown.
BIN
doc/README_MVS_TK4-_v1.00_update_08.pdf
Normal file
BIN
doc/README_MVS_TK4-_v1.00_update_08.pdf
Normal file
Binary file not shown.
BIN
doc/RPF V1R9M4 User's Guide.pdf
Normal file
BIN
doc/RPF V1R9M4 User's Guide.pdf
Normal file
Binary file not shown.
11542
doc/SC26-3770-1_OS_Assembler_H_Messages_Jun72.pdf
Normal file
11542
doc/SC26-3770-1_OS_Assembler_H_Messages_Jun72.pdf
Normal file
File diff suppressed because one or more lines are too long
BIN
doc/SH20-6162-1_PASCAL_VS_Programmers_Guide_198104.pdf
Normal file
BIN
doc/SH20-6162-1_PASCAL_VS_Programmers_Guide_198104.pdf
Normal file
Binary file not shown.
BIN
doc/SH20-6162-2_Pascal_VS_Programmers_Guide_3rd_ed_198502.pdf
Normal file
BIN
doc/SH20-6162-2_Pascal_VS_Programmers_Guide_3rd_ed_198502.pdf
Normal file
Binary file not shown.
BIN
doc/procedure_parameters.odt
Normal file
BIN
doc/procedure_parameters.odt
Normal file
Binary file not shown.
790
doc/smpart1.txt
Normal file
790
doc/smpart1.txt
Normal file
@ -0,0 +1,790 @@
|
|||||||
|
./ ADD NAME=SMPINTRO 0100-01039-01039-1901-00055-00055-00000-WSBG
|
||||||
|
|
||||||
|
INTRODUCTION TO MY 1988 SMP ARTICLE
|
||||||
|
|
||||||
|
|
||||||
|
My article, which explains the basic concepts of SMP and SMP/E,
|
||||||
|
was written in 1988, and is still almost completely applicable today.
|
||||||
|
I'm going to show you, in a few pages, how to understand SMP/E. Let's
|
||||||
|
first just say a few vitriolic, but true, introductory words.
|
||||||
|
|
||||||
|
IBM has a habit of "only touting its latest stuff". They tell
|
||||||
|
us: "Here's our product SMP/E, which helps you maintain your MVS
|
||||||
|
system!" What they don't tell you are the concepts that are necessary
|
||||||
|
to grasp, so an intelligent person can get a basic understanding of
|
||||||
|
SMP/E ideas in a reasonable amount of time.
|
||||||
|
|
||||||
|
In order to understand SMP/E, you have to understand where it
|
||||||
|
came from. SMP/E came from an effort to automate and keep track of
|
||||||
|
the SYSGEN process, and how to put subsequent fixes on an already-
|
||||||
|
generated MVS operating system. It is my fervent and passionate
|
||||||
|
belief, that if you don't understand the SYSGEN process, you'll never
|
||||||
|
have a clue to really understanding what SMP/E is all about.
|
||||||
|
|
||||||
|
Problem: We don't do SYSGENs any more today, to construct an
|
||||||
|
MVS system. The reason is that IBM has done them for us, before they
|
||||||
|
shipped us the new system. The information from their SYSGEN of our
|
||||||
|
system is buried in the JCLIN information, in the target SMP/E control
|
||||||
|
datasets, of the system that they ship us.
|
||||||
|
|
||||||
|
Previously, we could not dig that information out. Now we can.
|
||||||
|
In the newer SMP/E releases, after Release 1.3, there is an "un-JCLIN"
|
||||||
|
process in SMP/E, otherwise known as the GENERATE command. Using
|
||||||
|
GENERATE, we can re-create assembly and link-edit information which
|
||||||
|
is buried in the SMP/E datasets--the same information, like the SYSGEN
|
||||||
|
information, that tells us how the pieces of our system were put
|
||||||
|
together in the first place.
|
||||||
|
|
||||||
|
So, we begin our journey as I take you back in time--to a time
|
||||||
|
that IBM will never admit ever existed--to the (ancient) time when
|
||||||
|
SYSGENs were done, to build MVS systems. We must go back there.
|
||||||
|
Because, if we don't ever go back there, we'll never have a clue to
|
||||||
|
understanding what IBM is selling us now--this nice, neat, clever,
|
||||||
|
intricate SMP/E product.
|
||||||
|
|
||||||
|
This is the truth. Isn't "official IBM" great? They don't give
|
||||||
|
us what we need, because it's based on history, and they can't admit
|
||||||
|
that history exists, because they want to sell us their newest stuff!
|
||||||
|
|
||||||
|
That's why we have USERS helping each other, and that's why I'm
|
||||||
|
helping you. It took me 4 long years to learn what could have taken 3
|
||||||
|
weeks, with a decent explanation, that wasn't there. Once I learned
|
||||||
|
the stuff, I vowed to provide the explanation too!
|
||||||
|
|
||||||
|
So let's go learn about SMP/E from the beginning--the beginning
|
||||||
|
of time!
|
||||||
|
|
||||||
|
./ ADD NAME=SMPART 0101-88080-01038-1339-00732-00734-00000-WSBG
|
||||||
|
|
||||||
|
SMP DE-MYSTIFIED
|
||||||
|
|
||||||
|
Sam Golob
|
||||||
|
MVS Systems Programmer
|
||||||
|
|
||||||
|
|
||||||
|
Many otherwise-expert MVS systems programmers shy away from
|
||||||
|
doing operating system maintenance. Many new MVS systems programmers
|
||||||
|
have a very hard time getting started with doing this necessary work.
|
||||||
|
That is not because the work is intrinsically difficult, but because
|
||||||
|
IBM, until recently, has not provided to-the-point introduction to
|
||||||
|
their very good SMP maintenance products. We propose to do so. After
|
||||||
|
these several pages, the reader should feel much more confident with
|
||||||
|
IBM's SMP products and SMP literature.
|
||||||
|
|
||||||
|
SMP stands for "System Modification Program". It is exactly
|
||||||
|
that. SMP does every operation necessary to maintain the MVS operating
|
||||||
|
system: source updates, assemblies, linkedits, copy operations, and
|
||||||
|
zaps. It keeps a thorough accounting of everything it did, and it also
|
||||||
|
allows the user to back out bad changes to the system. Every facility
|
||||||
|
provided in SMP is for this purpose, and this purpose only.
|
||||||
|
|
||||||
|
The PURPOSE OF SMP must be constantly borne in mind when trying
|
||||||
|
to navigate its forbidding vocabulary. All of the strange words:
|
||||||
|
JCLIN, UCLIN, FUNCTION, DLIB, RESTORE, RELFILE, and so forth, are only
|
||||||
|
labels for things that are NECESSARY TO KEEP TRACK OF THE OPERATING
|
||||||
|
SYSTEM MAINTENANCE. THEY ARE NOTHING MORE THAN THAT. We'll try to
|
||||||
|
straighten you out on most of them, so they are put in their proper
|
||||||
|
perspective and their purpose is understood.
|
||||||
|
|
||||||
|
Just for the record, IBM distributes two types of SMP. SMP
|
||||||
|
Release 4, known as SMP4, is the old version. It is provided free
|
||||||
|
with the operating system, and it works. It just doesn't have so many
|
||||||
|
bells and whistles. IBM has a much more enhanced product, known as
|
||||||
|
SMP Extended, or SMP/E. A large majority of MVS installations use
|
||||||
|
SMP/E, and its use is recommended. Most of the principles I will
|
||||||
|
discuss apply equally to both versions, since my purpose is to provide
|
||||||
|
enough insight and perspective for the reader to be comfortable with
|
||||||
|
the IBM literature. The name "SMP" will suffice for reference to things
|
||||||
|
applicable to both versions. Features particular to SMP/E will be
|
||||||
|
labeled as such.
|
||||||
|
|
||||||
|
We must begin by describing how IBM has historically distributed
|
||||||
|
its MVS Operating System releases. That process is known as "SYSGEN".
|
||||||
|
How the SYSGEN process works must be clearly understood before one can
|
||||||
|
hope to get a clear picture of how SMP works. IBM does not describe the
|
||||||
|
contrast and connection between SYSGEN and SMP clearly enough in its SMP
|
||||||
|
literature. Therefore, we will now discuss how the SYSGEN process
|
||||||
|
works.
|
||||||
|
|
||||||
|
MVS was always (and is still) extremely flexible to the
|
||||||
|
individual customer's needs and hardware configuration. Each customer's
|
||||||
|
operating system was intended to be configured by the customer, and not
|
||||||
|
just dumped in by the manufacturer, as is true with many other operating
|
||||||
|
systems. IBM therefore distributes the individual pieces of the system,
|
||||||
|
and it is up to the customer to put them together so that he creates a
|
||||||
|
complete working system that is appropriate to his needs. Since the
|
||||||
|
customer does not have the smarts of the IBM system designers, IBM gives
|
||||||
|
him the means to accomplish the feat of system construction in a rather
|
||||||
|
straightforward way. This is what the SYSGEN is.
|
||||||
|
|
||||||
|
The individual components of MVS, whether they be assembler
|
||||||
|
macros, source, linkedited csects, sample JCL, or other ELEMENTS, are
|
||||||
|
distributed to the customer in individual partitioned datasets or
|
||||||
|
libraries. These are called DISTRIBUTION LIBRARIES appropriately.
|
||||||
|
Members of Distribution Libraries can be pictured as the BRICKS FROM
|
||||||
|
WHICH THE BUILDING WILL BE BUILT. Where then is the PATTERN or DESIGN
|
||||||
|
for the building? The pattern is put into a system of assembler
|
||||||
|
macros known as "SYSGEN MACROS". The SYSGEN MACROS contain the smarts
|
||||||
|
for building the operating system, and we must trust that IBM supports
|
||||||
|
them correctly.
|
||||||
|
|
||||||
|
What must the customer do, then? The customer must code a
|
||||||
|
system configuration deck of assembler statements which contain the
|
||||||
|
SYSGEN MACROS that are appropriate for his installation's hardware and
|
||||||
|
software configuration. IBM refers to this deck as the STAGE I SYSGEN
|
||||||
|
DECK. A working operating system, called the TARGET SYSTEM, cannot be
|
||||||
|
made unless a STAGE I SYSGEN DECK has been coded, either by IBM in a
|
||||||
|
sample generated system, or by the customer.
|
||||||
|
|
||||||
|
What next? The STAGE I DECK is assembled, using the
|
||||||
|
DISTRIBUTION LIBRARIES as the source for the SYSGEN MACROS. The
|
||||||
|
assembler output is a large JCL stream divided into a number of JOBS,
|
||||||
|
usually six of them. This output, which has assembly, linkedit, copy,
|
||||||
|
and other steps in it, is called the STAGE II DECK. The STAGE II DECK
|
||||||
|
has the actual JCL which creates the executing operating system
|
||||||
|
libraries (called the "TARGET LIBRARIES") from the building blocks in
|
||||||
|
the distribution libraries. In essence, the STAGE II DECK BUILDS THE
|
||||||
|
BUILDING FROM THE BRICKS. This is the gist of the SYSGEN process.
|
||||||
|
Most of its smarts come from IBM, which coded the SYSGEN macros to
|
||||||
|
correctly build the TARGET OPERATING SYSTEM.
|
||||||
|
|
||||||
|
The logical next question is: What if a piece of the system
|
||||||
|
doesn't work? How do you correctly replace that piece in the context
|
||||||
|
of the whole system? Do you have to do the entire SYSGEN all over
|
||||||
|
again? The answer of course is NO, but the principle of what happens
|
||||||
|
here is of utmost importance to our topic. THIS IS WHAT SMP AND ITS
|
||||||
|
PREDECESSORS ARE ALL ABOUT.
|
||||||
|
|
||||||
|
Let us begin to answer the question of how to replace a bad
|
||||||
|
piece of the system--a bad brick, so to speak. Put a good brick into
|
||||||
|
the same place. If the bad component is in source form, an update
|
||||||
|
to the source and a reassembly and relinkedit must be done. If the
|
||||||
|
component was distributed in object code form, the new object code
|
||||||
|
must be relinkedited to replace the old csect in the appropriate load
|
||||||
|
module(s). Again, how do we know the PATTERN where the new csect fits
|
||||||
|
into the system? We know it from the SYSGEN STAGE II DECK. That's how
|
||||||
|
that csect got there originally. IBM fixes to the system, called "PTFs"
|
||||||
|
or "Program Temporary Fixes" were originally applied to the system
|
||||||
|
libraries by pulling out the appropriate job steps from the SYSGEN
|
||||||
|
STAGE II deck and replacing the offending csects by IBM's replacements.
|
||||||
|
A program called AMAPTFLE, which is probably not used today, was an aid
|
||||||
|
in that process. This historical anecdote, if you will, gives insight
|
||||||
|
into what SMP was designed to do automatically.
|
||||||
|
|
||||||
|
We have to answer one more question before we get into how SMP
|
||||||
|
operates. What if IBM changes the PATTERN of how it is putting the
|
||||||
|
system together. Suppose for example, that IBM breaks one module into
|
||||||
|
two or three modules. In that case, IBM will change the appropriate
|
||||||
|
SYSGEN MACRO(S), and a new SYSGEN STAGE II DECK will have to be
|
||||||
|
assembled. The STAGE I DECK that was coded by the user does not have
|
||||||
|
to be changed. It must only be reassembled against the changed macros.
|
||||||
|
The part of the SYSGEN STAGE II that is affected by the module change
|
||||||
|
will have to be rerun. The new TARGET LOAD MODULES to be executed
|
||||||
|
will then be linkedited correctly according to the new pattern
|
||||||
|
designed by IBM.
|
||||||
|
|
||||||
|
Now we are in a position to start talking about what SMP does.
|
||||||
|
SMP automatically accomplishes the processes we just talked about,
|
||||||
|
with the exception of assembling the STAGE II SYSGEN DECK. Once the
|
||||||
|
STAGE II DECK is created and fed into SMP (through a process known
|
||||||
|
as "JCLIN"), SMP "knows the pattern" of how the TARGET SYSTEM is put
|
||||||
|
together, and it can apply system changes in an automated and audited
|
||||||
|
way.
|
||||||
|
|
||||||
|
I must emphasize from the start that SMP is designed primarily
|
||||||
|
for APPLYING FIXES TO AN ALREADY CREATED SYSTEM. Its accommodation to
|
||||||
|
creating a completely new system is just that--a necessary
|
||||||
|
accommodation, but once the structure of a new system is fed into SMP,
|
||||||
|
using the SMP process called "JCLIN" of the SYSGEN STAGE II DECK,
|
||||||
|
fixes can be applied to that new system speedily and efficiently.
|
||||||
|
|
||||||
|
There is one more fact of great value here. IBM made an
|
||||||
|
important decision once SMP (which is an efficient way of applying
|
||||||
|
system fixes) was invented and debugged. It was no longer necessary
|
||||||
|
for them to REPLACE ENTIRE RELEASES OF MVS, and require a NEW SYSGEN
|
||||||
|
each time. With SMP comfortably in place, many extensive system
|
||||||
|
revisions could be accomplished as A SUM OF INDIVIDUAL MODULE
|
||||||
|
REPLACEMENTS, or PTFs. The application of a large number of PTFs thus
|
||||||
|
ELIMINATED THE FREQUENT DISTRIBUTION OF NEW MVS RELEASES. Therefore
|
||||||
|
the PRESENCE OF SMP CHANGED MVS MAINTENANCE from NEW RELEASE orientation
|
||||||
|
to INCREMENTAL PTF organization. This means, in other words, a change
|
||||||
|
in emphasis from RUNNING ENTIRE SYSGENS to the SUCCESSIVE APPLICATION
|
||||||
|
OF PTF FIXES TO THE SYSTEM.
|
||||||
|
|
||||||
|
Now, onward and upward to the mechanics of SMP, both in handling
|
||||||
|
fixes, and in handling a major system change.
|
||||||
|
|
||||||
|
The single basic unit of work in SMP is called a "SYSMOD", or
|
||||||
|
"system modification". There are four kinds of SYSMODs: these are
|
||||||
|
"FUNCTION" sysmods, "PTFS", "APARS", and "USERMODS". Every SYSMOD
|
||||||
|
has a seven-character ID, which must begin with an alphabetic character.
|
||||||
|
|
||||||
|
A FUNCTION SYSMOD basically represents A SEPARATE PRODUCT. One
|
||||||
|
piece of MVS, such as "data management", may be composed of a number of
|
||||||
|
separate FUNCTIONs, each of which owns a distinct "piece of the piece".
|
||||||
|
The currently consolidated data management package of MVS/370, known as
|
||||||
|
DFP, consists of three FUNCTIONs. DFP replaces a conglomeration of
|
||||||
|
over thirty separate FUNCTIONS which covered the data-management area
|
||||||
|
before. The seven-character SYSMOD ID of a FUNCTION has a special
|
||||||
|
name. It is called an "FMID", or "Function Modification IDentifier".
|
||||||
|
EVERY SYSMOD OF ANY TYPE MUST BE OWNED BY AN FMID. In other words,
|
||||||
|
every SYSMOD must belong to a product (a FUNCTION) which OWNS it.
|
||||||
|
Every piece or ELEMENT of the system MUST ALSO BE OWNED by a unique
|
||||||
|
FMID.
|
||||||
|
|
||||||
|
A FUNCTION SYSMOD can belong to another FUNCTION or FMID, or
|
||||||
|
it may be a PRIMARY FUNCTION. A PRIMARY FUNCTION SYSMOD is the only
|
||||||
|
SYSMOD that is not owned by another FMID, since it is, by definition,
|
||||||
|
the base level of a program product.
|
||||||
|
|
||||||
|
A real illustration of this is the control program of MVS/370.
|
||||||
|
The BASE FUNCTION of MVS/370 has the FMID of EBB1102. EBB1102 is the
|
||||||
|
original MVS release 3.8, and it does not belong to any other product.
|
||||||
|
MVS SP 1.3.0 is a rewriting of many (but not all) of the modules of
|
||||||
|
MVS 3.8. MVS SP 1.3.0 has its own FMID of JBB1326, which BELONGS TO
|
||||||
|
THE FMID EBB1102. The modules that were rewritten BELONG to FMID
|
||||||
|
JBB1326. Now MVS SP 1.3.3 is in turn a partial rewriting of MVS SP
|
||||||
|
1.3.0. Therefore, the FMID of MVS SP 1.3.3, which is JBB1329, BELONGS
|
||||||
|
to the FMID JBB1326, which in turn belongs to EBB1102, the base MVS
|
||||||
|
release. The MVS SP 1.3.3 revised modules belong to FMID JBB1329.
|
||||||
|
Finally, the current MVS/370 release, MVS SP 1.3.5, is a rewriting of
|
||||||
|
some of the modules of MVS SP 1.3.3. Therefore all of its rewritten
|
||||||
|
pieces belong to its FMID of JBB1356. JBB1356 itself belongs to
|
||||||
|
JBB1329, which in turn belongs to JBB1326, whose primary FMID is
|
||||||
|
EBB1102. Please notice that EBB1102 was never superseded by the
|
||||||
|
higher levels of MVS/370. This illustrates the product relationship
|
||||||
|
of FMID numbers, when whole sections of a base product have been
|
||||||
|
revised by IBM.
|
||||||
|
|
||||||
|
On the other hand, separate non-overlapping products will have
|
||||||
|
separate, completely unrelated FMIDS. The important fact is that
|
||||||
|
every SYSMOD that is not a FUNCTION SYSMOD, and many FUNCTION SYSMODS
|
||||||
|
themselves, MUST BE OWNED BY AN FMID. No SYSMOD or system objects
|
||||||
|
(called "ELEMENTS" in general) can belong to more than one FMID. All
|
||||||
|
ELEMENTS (macros, load module csects, etc.) must belong to one and
|
||||||
|
only one FMID.
|
||||||
|
|
||||||
|
We are now at the point where we want to know several things.
|
||||||
|
First, what does an SMP environment consist of? Second, how do SYSMODS
|
||||||
|
get onto an SMP-controlled system. Third, how do the ELEMENTS, the
|
||||||
|
PIECES OF THE SYSTEM, relate to the SYSMODS. Fourth, how does all
|
||||||
|
this SMP stuff fit in with what we already know about the SYSGEN
|
||||||
|
process, and how does SMP build an actual working operating system?
|
||||||
|
|
||||||
|
Answering these four questions constitutes the goal of this
|
||||||
|
article. With an understanding of the answers, any person can easily
|
||||||
|
negotiate IBM's SMP literature and thereby gain real competence in
|
||||||
|
SMP use. (BOB, PLEASE PUT EMPHASIS ON THIS PARAGRAPH - - -.)
|
||||||
|
|
||||||
|
Let us discuss the SMP environment. Roughly, the concept of
|
||||||
|
an SMP environment breaks down to two things: first, a set of
|
||||||
|
LIBRARIES controlled by SMP, and second, special SMP CONTROL DATASETS
|
||||||
|
which keep accounting of all the system changes that occurred. A
|
||||||
|
sequential SMP LOG records and time-stamps all significant actions
|
||||||
|
which are occurring during SMP processing.
|
||||||
|
|
||||||
|
The set of libraries controlled by SMP is broken down into
|
||||||
|
two types of libraries. There are TARGET LIBRARIES, which contain
|
||||||
|
copies of actual working system code. And there are DISTRIBUTION
|
||||||
|
LIBRARIES, which have the pieces from which the system is built. The
|
||||||
|
concept of DISTRIBUTION LIBRARIES and TARGET (or "SYSTEM") LIBRARIES
|
||||||
|
corresponds exactly to what we discussed before, concerning the SYSGEN
|
||||||
|
process. In fact, there is no difference. We have seen that with the
|
||||||
|
SYSGEN process, the DISTRIBUTION libraries are SUPPLIED INITIALLY by
|
||||||
|
IBM and the TARGET libraries are CREATED FROM THE DISTRIBUTION
|
||||||
|
LIBRARIES using the STAGE II SYSGEN DECK. With SMP however, (once an
|
||||||
|
initial operating system has been created) the TARGET LIBRARIES are
|
||||||
|
supplied first, using material sent by IBM in the form of SYSMODS.
|
||||||
|
These are plugged into the actual working operating system libraries
|
||||||
|
by SMP. Then they are tested, and if the changes are good, they can
|
||||||
|
then be put into the DISTRIBUTION LIBRARIES PERMANENTLY. Thus, the
|
||||||
|
usual SMP flow is from IBM-supplied SYSMODS, to TARGET LIBRARIES, and
|
||||||
|
then to DISTRIBUTION LIBRARIES. This is the opposite of the flow of
|
||||||
|
changes during the SYSGEN PROCESS.
|
||||||
|
|
||||||
|
Our discussion of control datasets must be based on the three
|
||||||
|
PROCESSES OF SMP FLOW. These are called "RECEIVE", "APPLY", and
|
||||||
|
"ACCEPT". RECEIVE, APPLY, and ACCEPT are the SMP-language equivalent
|
||||||
|
of: taking a new SYSMOD into the SMP environment, putting its pieces
|
||||||
|
into the TARGET libraries into the proper places, and finally, storing
|
||||||
|
its pieces in the DISTRIBUTION libraries for archival and possible
|
||||||
|
later use. Again, the flow is: IBM-supplied SYSMODS, to TARGET
|
||||||
|
libraries, to DISTRIBUTION libraries.
|
||||||
|
|
||||||
|
How do the RECEIVE, APPLY, and ACCEPT processes work? We shall
|
||||||
|
discuss them briefly in order. Please bear in mind that our aim is to
|
||||||
|
simplify the discussion and keep it conceptual. Once the concepts are
|
||||||
|
understood, and the vocabulary words associated with them are learned,
|
||||||
|
then the IBM literature will become quite readable.
|
||||||
|
|
||||||
|
RECEIVE basically involves STORING A NEW SYSMOD and recording
|
||||||
|
some vital statitstics about it, so that it is pre-digested a bit by
|
||||||
|
SMP. The text of the entire SYSMOD is stored in a partitioned dataset
|
||||||
|
called the "PTS" or "PTF Temporary Store Data Set". In the older
|
||||||
|
version of SMP, SMP4, the control information taken during the RECEIVE
|
||||||
|
process is stored in the PTS also. However, in the new SMP/E, all
|
||||||
|
control information is stored in VSAM files known as "ZONES". The
|
||||||
|
VSAM file which stores the control information from the RECEIVE process
|
||||||
|
is known as the "GLOBAL ZONE". The text of the SYSMOD thus goes to
|
||||||
|
the PTS as before, but the control information is stored in the
|
||||||
|
GLOBAL ZONE.
|
||||||
|
|
||||||
|
There are certain SYSMODS which are RECEIVED a bit
|
||||||
|
differently. These are SYSMODS which have what are known in SMP
|
||||||
|
language as "RELFILES". The word RELFILE roughly translates to
|
||||||
|
"IEBCOPY". If a modification has large numbers of linkedited
|
||||||
|
csects, macros, ISPF panels, or other ELEMENTS, which are suitable for
|
||||||
|
direct IEBCOPY into TARGET LIBRARIES, then those ELEMENTs included in
|
||||||
|
the SYSMOD which have SIMILAR RECORD FORMAT AND RECORD LENGTH can be
|
||||||
|
loaded into a single pds. This pds is unloaded onto the SYSMOD
|
||||||
|
distribution tape using IEBCOPY, and its file sequence order on the
|
||||||
|
tape is very important. If the Sysmod Specification File on the
|
||||||
|
tape (known as the "SMPMCS") calls for THREE RELFILES for instance,
|
||||||
|
then the next three files on the tape, hopefully IEBCOPY unloaded,
|
||||||
|
are known as RELFILE(1), RELFILE(2), and RELFILE(3) respectively.
|
||||||
|
|
||||||
|
The RECEIVE process on a SYSMOD with RELFILES is then the
|
||||||
|
following: The SMPMCS, which contains the SMP control statements of
|
||||||
|
the SYSMOD, is read from the tape. The number of RELFILES (3 in our
|
||||||
|
example) is determined from the "RELFILES (3)" keyword in the SMPMCS.
|
||||||
|
The three files on the tape which follow the SMPMCS file are then
|
||||||
|
unloaded to a disk pack (determined by the "SMPTLIB" DD statement in
|
||||||
|
the SMP job) and given special names, which SMP will understand during
|
||||||
|
later APPLY and ACCEPT processing of the SYSMOD. These names are of
|
||||||
|
the format: PREFIX.sysmodid.Fn, where n is 1, for the first relfile,
|
||||||
|
2 for the second, and so forth. The prefix is set in the global zone
|
||||||
|
for SMP/E (or in the PTS system entry in SMP4) and is not changed
|
||||||
|
during the entire process. Therefore, when a SYSMOD with RELFILES is
|
||||||
|
RECEIVED, the relfile libraries are loaded from tape to disk. The
|
||||||
|
elements they contain are thus readied, so that the APPLY and ACCEPT
|
||||||
|
processes to follow can selectively copy them to where they will be
|
||||||
|
needed. Meanwhile, the SMPMCS is itself copied to the PTS, and its
|
||||||
|
control information is dealt with as we discussed before.
|
||||||
|
|
||||||
|
With SMP/E there is a bit more to the RECEIVE process. Besides
|
||||||
|
the RECEIVE of SYSMODS, one must also RECEIVE SYSMOD ERROR INFORMATION.
|
||||||
|
This is known as "HOLDDATA". HOLDDATA consists of a list of "++HOLD"
|
||||||
|
and "++RELEASE" control statements in sequential order. Each such
|
||||||
|
statement points to a PTF or an APAR SYSMOD. The purpose of the ++HOLD
|
||||||
|
statement is to prevent SMP/E from APPLYing a PTF that is in error,
|
||||||
|
known as a "PE PTF". A ++RELEASE statement that is RECEIVED AFTER a
|
||||||
|
++HOLD statement against the same SYSMOD will UNDO THE EFFECT of the
|
||||||
|
++HOLD statement. The ORDER in which the statements are RECEIVED is
|
||||||
|
of paramount importance. SMP/E will honor the ++RELEASE only if it
|
||||||
|
occurs AFTER ALL ++HOLD statements for that particular SYSMOD. The
|
||||||
|
HOLDDATA is kept in the SMP/E GLOBAL ZONE.
|
||||||
|
|
||||||
|
A quick word about UN-doing the RECEIVE of a SYSMOD. A RECEIVE
|
||||||
|
can be undone by an SMP process called "REJECT". To REJECT a SYSMOD
|
||||||
|
that has been RECEIVEd causes the SYSMOD to be erased from the PTS and
|
||||||
|
its control information associated with the RECEIVE process to be
|
||||||
|
wiped out. If the SYSMOD has RELFILES, the disk-loaded copies are
|
||||||
|
deleted. The SYSMOD cannot then be RE-APPLIED or RE-ACCEPTED unless
|
||||||
|
it is RE-RECEIVED. REJECTing a SYSMOD WILL NOT AFFECT THE STATUS of a
|
||||||
|
SYSMOD that has ALREADY BEEN APPLIED OR ACCEPTED. It stays in the
|
||||||
|
TARGET libraries and in the DLIBs.
|
||||||
|
|
||||||
|
OK, we've talked about getting the SYSMOD into SMP. Now is a
|
||||||
|
good time to mention the syntax of SMP MODIFICATION CONTROL STATMENTS,
|
||||||
|
before going to the details of APPLY and ACCEPT processing.
|
||||||
|
|
||||||
|
Rule number one is that all SYSMOD control statements (known
|
||||||
|
in IBMese as MCS or "Modification Control Statements") must begin
|
||||||
|
with the characters "++" in columns 1 and 2 of the SYSMOD's card-image
|
||||||
|
records. The other keywords and parameters in SYSMOD syntax are
|
||||||
|
free-flowing. Extra blanks don't count. Columns 73 to 80 are
|
||||||
|
not used in the SYSMOD statements themselves, but they are required
|
||||||
|
for IEBUPDTE source and macro update cards, so you have to be careful
|
||||||
|
and one can't renumber a SYSMOD. Comments are as in the PL/I language.
|
||||||
|
They begin with the characters "/*" and end with the characters "*/".
|
||||||
|
Everything in between these specific strings, even on many successive
|
||||||
|
lines, is treated by SMP as a comment. All SMP statements must end in
|
||||||
|
a period, ".". The period is the delimiter for statements in SMP
|
||||||
|
syntax, and one must be EXCEEDINGLY careful with them.
|
||||||
|
|
||||||
|
Every SYSMOD must begin with the statements: "++ FUNCTION",
|
||||||
|
"++ PTF", "++ APAR", or "++ USERMOD", followed by the seven character
|
||||||
|
SYSMOD ID enclosed in parentheses, and delimited by a period. We've
|
||||||
|
already discussed FUNCTION sysmods. PTF sysmods or "PTFs" are (after
|
||||||
|
the invention of SMP and the change in IBM's maintenance philosophy)
|
||||||
|
really PERMANENT SYSTEM FIXES, although their name stands for "Program
|
||||||
|
Temporary Fix". The TEMPORARY fixes are called "APARs", which is
|
||||||
|
really a short term for "APAR FIX". APAR stands for "Authorized
|
||||||
|
Program Analysis Report", and it really refers to a problem that was
|
||||||
|
reported to IBM. IBM assigns a number to each problem, and when the
|
||||||
|
problem is fixed, the temporary fix itself is assigned the same
|
||||||
|
number. This number (or something very close to it) is what SMP uses
|
||||||
|
for the APAR SYSMOD ID. APAR SYSMODS are intended to be replaced, or
|
||||||
|
"SUPERSEDED" by permanent fixes, or PTFs. They are therefore not
|
||||||
|
usually "ACCEPTED" into the distribution libraries. More about this
|
||||||
|
later.
|
||||||
|
|
||||||
|
USERMODs are packaged SMP SYSMODS written by the individual
|
||||||
|
installation for its own needs, usually to modify some IBM code. They
|
||||||
|
look like PTFs or APARs, but SMP puts them in a special category so
|
||||||
|
that they stay a bit distant from the real IBM maintenance. The user
|
||||||
|
has flexibility to assign almost any seven character SYSMOD ID to his
|
||||||
|
USERMOD, but each different SYSMOD must have a unique ID, and it is
|
||||||
|
wise to steer clear of IBM-type names. USERMODs are also usually
|
||||||
|
not ACCEPTed into IBM distribution libraries (also known as "DLIBS")
|
||||||
|
because they are likely to overlay IBM code there. USERMODs should
|
||||||
|
only be ACCEPTed if you really know what you are doing.
|
||||||
|
|
||||||
|
We'll quickly explain the concepts of the other strange keywords
|
||||||
|
you're likely to find at the top of SMP SYSMODS. I don't intend to
|
||||||
|
be exhaustive. The idea is to cut through the ice and give you some
|
||||||
|
idea of what is happening.
|
||||||
|
|
||||||
|
"++ VER" means "version of the operating system", or perhaps
|
||||||
|
"domain of SMP activity" would also be an appropriate explanation.
|
||||||
|
The values for this parameter have 4 characters, and there aren't too
|
||||||
|
many valid choices. "Z038" means MVS 3.8 and upwards thru XA. ("Z037"
|
||||||
|
or MVS 3.7 probably isn't used anymore.) "C150" means CICS 1.5 and
|
||||||
|
upwards. There are a few more of them. These values almost never
|
||||||
|
change, and within the same domain of activity, you always find the
|
||||||
|
same value. The ++VER values were originally intended to differentiate
|
||||||
|
between similar maintenance on different MVS releases, but because of
|
||||||
|
the evolution of the SMP product since those "old" days, it doesn't
|
||||||
|
have that importance any more. The purpose of the ++VER statement has
|
||||||
|
been largely taken over by the FMID. It is necessary and required,
|
||||||
|
however; it must be included in all SYSMODs.
|
||||||
|
|
||||||
|
Inside of the ++VER sentence (and before the period) you'll
|
||||||
|
most likely see the FMID, PRE, REQ, and SUP keywords. FMID has been
|
||||||
|
discussed. Every SYSMOD must belong to a unique FMID. In the
|
||||||
|
parentheses following the FMID keyword, the FMID which will own the
|
||||||
|
SYSMOD must be specified. PRE and SUP are quite simple. In the
|
||||||
|
parentheses following the PRE keyword, and separated by spaces or
|
||||||
|
commas, is a list of SYSMOD IDs which have to be present before OUR
|
||||||
|
SYSMOD can be put onto the system, or "APPLIED". The "prerequisite
|
||||||
|
SYSMODs" must have been already APPLIED themselves, or else they have
|
||||||
|
to be APPLIED together with this new SYSMOD. Otherwise if all the
|
||||||
|
PREs or prerequisites are not present, the new SYSMOD will not go on.
|
||||||
|
|
||||||
|
REQ is like PRE, but the SYSMODs that are REQuired for the
|
||||||
|
new SYSMOD, must BE APPLIED IN THE SAME RUN as the new SYSMOD. It
|
||||||
|
is seldom necessary to use the "REQ" keyword. Ususally "PRE" will
|
||||||
|
suffice.
|
||||||
|
|
||||||
|
Following the SUP keyword is a list of SYSMODS that are
|
||||||
|
effectively replaced, or "SUPERSEDED" by the new SYSMOD. This keyword
|
||||||
|
is used when the intent is that the new material to be added to the
|
||||||
|
system COMPLETELY OBSOLETES all the material from all of the SYSMODs
|
||||||
|
in the SUP list. If only SOME of the material in a previous SYSMOD
|
||||||
|
or PTF will be replaced, that SYSMOD should be placed in the PRE list
|
||||||
|
or "prerequisite list". For a SYSMOD to be superseded or "SUPed"
|
||||||
|
(to use the common parlance) its purpose in the operating system
|
||||||
|
should be COMPLETELY REPLACED by the later SYSMOD.
|
||||||
|
|
||||||
|
Our new SYSMOD may have a sequence of "++IF FMID(fmidnam) THEN
|
||||||
|
REQ(sysmdid)." statements. This will happen if we have different
|
||||||
|
levels of the same product, as we mentioned earlier regarding the
|
||||||
|
various MVS/370 product levels. If our SYSMOD is for a lower level of
|
||||||
|
the product, and the installation has both that level and a higher
|
||||||
|
level, it may be necessary to apply another fix to satisfy the
|
||||||
|
requirements of the higher level. SMP is informed of this by means of
|
||||||
|
a coded ++IF statement in the lower level SYSMOD. If the higher level
|
||||||
|
referred to (in the ++IF statement) is not present on our system, then
|
||||||
|
our fix suffices for us, and it will go on to our system normally. If
|
||||||
|
our installation has the higher level of the product also, the lower
|
||||||
|
level SYSMOD will not go on without the sysmod id in the REQ keyword
|
||||||
|
of the ++IF statement also being present. The FMID name within the
|
||||||
|
++IF statement is usually for a higher level of the product than the
|
||||||
|
current SYSMOD is for.
|
||||||
|
|
||||||
|
Below all this "version", PRE, SUP and IF stuff is the actual
|
||||||
|
fix. A "++MOD" statement followed by object code signifies an object
|
||||||
|
module replacement of a CSECT. A "++SRC" statement followed by source
|
||||||
|
code is a complete source code replacement. A "++SRCUPD" statement or
|
||||||
|
"++ MACUPD" statement followed by IEBUPDTE control cards signifies
|
||||||
|
updates to an existing source module or macro. A "++MAC" statement
|
||||||
|
is followed by the complete replacement for the macro. Keywords in
|
||||||
|
these statements supply necessary additional instructions so that the
|
||||||
|
change is done according to the author's or IBM's specifications and
|
||||||
|
requirements. Specification of the destination libraries for the
|
||||||
|
ELEMENT to be changed is also accomplished by these keywords.
|
||||||
|
|
||||||
|
A single SYSMOD can contain fixes for many system ELEMENTS.
|
||||||
|
Each element to be changed must have its own ++SRC, ++MOD, +SRCUPD,
|
||||||
|
++MAC or ++MACUPD control card, followed by the new replacement or
|
||||||
|
additional material for that element. An approximate limit to the
|
||||||
|
number of element fixes in one SYSMOD is set by a global SMP parameter
|
||||||
|
called "PEMAX". It is advisable to set PEMAX to a high number, usually
|
||||||
|
to 9999.
|
||||||
|
|
||||||
|
One more important note. Libraries in SMP control statements
|
||||||
|
are referred to by their DDNAMES ONLY. These must be one to eight
|
||||||
|
characters long. It is safe and wise practice in SMP work to ALWAYS
|
||||||
|
MAKE THE DDNAME OF THE LIBRARY CORRESPOND TO THE LOWEST-LEVEL
|
||||||
|
QUALIFIER OF ITS DATASET NAME. DATASET NAME PREFIXES DON'T COUNT TO
|
||||||
|
THE SMP PROGRAM. It is therefore advisable to use the SAME SMP JCL
|
||||||
|
PROCEDURE when doing system modifications to one system. The JCL of
|
||||||
|
that PROC will uniquely and unchangeably determine the destination
|
||||||
|
libraries of the SMP action. Thus, the SMP control information and
|
||||||
|
the actual contents of the affected libraries will always be kept in
|
||||||
|
synchronization. (SMP/E has a facility for determining dataset names
|
||||||
|
by dynamic allocation. These dynamically determined library names are
|
||||||
|
called "DDDEFs". I want to keep the discussion here simple, and I
|
||||||
|
will not dwell on DDDEFS, except to say that they DYNAMICALLY
|
||||||
|
accomplish what DD cards do in a JCL procedure.)
|
||||||
|
|
||||||
|
This will take some of the mystery away from what a SYSMOD
|
||||||
|
looks like. Now once it is RECEIVEd, how do we APPLY it to the
|
||||||
|
TARGET LIBRARIES?
|
||||||
|
|
||||||
|
When thinking about APPLYing SYSMODS to our system, we must
|
||||||
|
never forget that the PURPOSE OF A SYSMOD IS TO SUPPLY NEW COMPONENTS
|
||||||
|
for our operating system or our product. THE APPLY PROCESS PUTS THE
|
||||||
|
NEW PIECES OR ELEMENTS INTO THEIR PROPER PLACES IN THE EXECUTING
|
||||||
|
LIBRARIES OF THE SYSTEM, the TARGET LIBRARIES. IT ALSO KEEPS DETAILED
|
||||||
|
TRACK OF WHAT IT HAS DONE.
|
||||||
|
|
||||||
|
APPLY can ONLY be done to a SYSMOD that has been RECEIVED. The
|
||||||
|
RECEIVE process has put the SYSMOD into the SMP staging areas, the PTS
|
||||||
|
and possibly the UNLOADED RELFILES, and has done some preliminary
|
||||||
|
accounting in the SMP/E GLOBAL ZONE or the SMP4 PTS. The APPLY
|
||||||
|
process will pick the SYSMOD up from there. Accounting for the APPLY
|
||||||
|
process is done in SMP/E using a VSAM cluster called the TARGET ZONE,
|
||||||
|
and in SMP4 using several partitioned datasets, the most important of
|
||||||
|
which is called the "CDS" or "Control Data Set".
|
||||||
|
|
||||||
|
A word about ELEMENT ACCOUNTING. If a SYSMOD will replace an
|
||||||
|
ELEMENT (a macro or a module or source code - a MAC, a MOD, or SRC),
|
||||||
|
that ELEMENT acquires an "RMID" (or "Replacement Module ID") equal to
|
||||||
|
the SYSMOD ID of the SYSMOD which replaced it. Since the piece
|
||||||
|
was completely replaced, each MAC, MOD, or SRC ELEMENT can have ONLY
|
||||||
|
ONE RMID. If on the other hand, the SYSMOD will UPDATE A MACRO,
|
||||||
|
UPDATE SOURCE, or ZAP A LOAD MODULE, then that ELEMENT acquires a
|
||||||
|
"UMID" ("Update Module ID") equal to the SYSMOD ID that updated it.
|
||||||
|
One macro or module can have MANY UMIDS, because it is possible to
|
||||||
|
update a single ELEMENT many times, and in many ways.
|
||||||
|
|
||||||
|
Now back to APPLY processing. Many SYSMODS can be APPLIED
|
||||||
|
together in one run. This is one of the great conveniences of the SMP
|
||||||
|
product. When APPLYing more than one SYSMOD, the programmer can
|
||||||
|
SELECT a list of individual SYSMODS by their seven-character SYSMOD
|
||||||
|
IDs. This is done in the SMPCNTL DD statement, where one enters the
|
||||||
|
"APPLY" parameter into the SMP job. One simply states "APPLY SELECT
|
||||||
|
(sysmdid,sysmdid, ...).". We can also select just one SYSMOD to
|
||||||
|
APPLY, if that is what we want.
|
||||||
|
|
||||||
|
Before we get too far, I must mention "APPLY CHECK", which is
|
||||||
|
a dry run of the APPLY process. By inclusion of the word "CHECK"
|
||||||
|
in an APPLY request, SMP will do a dry run. All SMP control
|
||||||
|
information will be verified, just as if the real APPLY was being
|
||||||
|
done. With APPLY CHECK however, no real library updates are done, and
|
||||||
|
the SYSMODS will not really be APPLIED to the system. A report will
|
||||||
|
be generated that tells us what WOULD be done. "ACCEPT" and "RESTORE"
|
||||||
|
processing, to be mentioned later, also have the "CHECK" facility. IT
|
||||||
|
IS ALMOST ALWAYS ADVISABLE TO DO APPLY CHECK BEFORE DOING THE REAL
|
||||||
|
APPLY.
|
||||||
|
|
||||||
|
We continue. It is also possible to do what is called a MASS
|
||||||
|
APPLY. MASS APPLY works as follows. By simply stating the word APPLY
|
||||||
|
in the SMPCNTL DD statement of an SMP job, SMP will ATTEMPT TO APPLY
|
||||||
|
ALL RECEIVED SYSMODS THAT ARE ELIGIBLE FOR THE SYSTEM but have not
|
||||||
|
been APPLIED yet. SMP will look at ALL THE UNAPPLIED RECEIVED SYSMODS
|
||||||
|
and will BUILD A SYSMOD SELECT LIST. It will then proceed to APPLY
|
||||||
|
ALL THE SELECTED SYSMODS to your system. It is possible to EXCLUDE a
|
||||||
|
list of SYSMODS specifically from a MASS APPLY, by using the EXCLUDE
|
||||||
|
or "E" parameter in the APPLY control statement. In SMP/E (but not in
|
||||||
|
SMP4) there is an additional way to exclude a SYSMOD from an APPLY.
|
||||||
|
This is through the use of a "++HOLD" modification control statement
|
||||||
|
which has been RECEIVED previous to this APPLY request. MASS APPLY
|
||||||
|
is the normal means of APPLYing IBM's periodic system maintenance
|
||||||
|
known as "PUTs" (Program Update Tapes) to the system, because this
|
||||||
|
maintenance consists of large numbers of PTFs, perhaps several hundred
|
||||||
|
of them, and it is inconvenient to SELECT them individually.
|
||||||
|
|
||||||
|
There is another APPLY option called APPLY with the GROUP
|
||||||
|
parameter. "APPLY GROUP" works very much like "APPLY SELECT" for
|
||||||
|
APPLYing a list of SYSMODS. The difference concerns missing
|
||||||
|
prerequisites. If "APPLY GROUP(sysmdid,...)" is coded instead of
|
||||||
|
"APPLY SELECT", and if a necessary prerequisite SYSMOD has not been
|
||||||
|
included in the explicit SELECT list, SMP will go to the trouble of
|
||||||
|
adding all such necessary prerequisites to the SELECT list before
|
||||||
|
doing the APPLY. It is only necessary that the added SYSMODS have
|
||||||
|
been previously RECEIVED. "APPLY GROUP" is good if you are not sure
|
||||||
|
what other PTFs are necessary to include, when you are APPLYing new
|
||||||
|
PTFs that you really want. It does use extra overhead, but it should
|
||||||
|
be used for avoiding multiple SMP runs when some prerequisites may be
|
||||||
|
missing.
|
||||||
|
|
||||||
|
BYPASS. This is a useful facility of SMP APPLY processing,
|
||||||
|
especially during APPLY CHECK, when you're determining if the APPLY
|
||||||
|
should work. The BYPASS parameter of APPLY (and ACCEPT) allows SYSMODS
|
||||||
|
to be APPLIED to the system, even though they are missing prerequisites
|
||||||
|
or other requirements. During a real APPLY situation, the BYPASS
|
||||||
|
parameter will allow the putting on of a SYSMOD in an exceptional
|
||||||
|
circumstance, when there is no other way of getting it on. During
|
||||||
|
a CHECK situation however, it is advisable to BYPASS ALL OR MOST ERROR
|
||||||
|
CONDITIONS on the first try. This is because SMP WILL OFTEN STOP
|
||||||
|
FURTHER ACTION when it encounters the FIRST ERROR.
|
||||||
|
|
||||||
|
For instance (to use an SMP/E example), suppose SYSMODS B and C
|
||||||
|
both require SYSMOD A, and SYSMOD A has a ++HOLD against it. When we
|
||||||
|
try to APPLY CHECK SELECT SYSMODS A, B, and C together, and we don't
|
||||||
|
have a BYPASS (HOLDERROR) coded, SMP will not tell us how the three
|
||||||
|
SYSMODS will APPLY, and what ELEMENTS they will affect. It will
|
||||||
|
simply say that it cannot APPLY SYSMODS B and C because it could not
|
||||||
|
APPLY SYSMOD A. On our next try, if we did code BYPASS (HOLDERROR) in
|
||||||
|
the APPLY CHECK, SMP/E would give us a complete report of the ELEMENTs
|
||||||
|
affected by all three SYSMODS, because the BYPASS allowed the
|
||||||
|
simulation of a completed APPLY, and all the consequences of the APPLY
|
||||||
|
will show in the report.
|
||||||
|
|
||||||
|
As a matter of procedure, most people BYPASS every error
|
||||||
|
condition during APPLY CHECK, but some try not to use BYPASS on the
|
||||||
|
real APPLY. They exert much effort to completely clean up the APPLY
|
||||||
|
CHECK so that they can avoid coding a BYPASS for the real APPLY run.
|
||||||
|
I personally leave the BYPASS in during the REAL APPLY runs too. I
|
||||||
|
just make sure that the APPLY CHECK will show the exact result that
|
||||||
|
I want to achieve. My approach avoids an excessive number of APPLY
|
||||||
|
CHECK runs, which can take a long time. This is a matter of personal
|
||||||
|
preference. The important thing is that THE REAL APPLY SHOULD ALWAYS
|
||||||
|
BE DONE WITH THE SAME PARAMETERS AS THE LAST SATISFACTORY APPLY CHECK
|
||||||
|
RUN.
|
||||||
|
|
||||||
|
Our final word on APPLY processing will be to show how the
|
||||||
|
PATTERN OF THE SYSTEM is determined or changed during APPLY. SYSTEM
|
||||||
|
PATTERNS are communicated to SMP by means of the "JCLIN" facility.
|
||||||
|
JCLIN consists of MODEL JCL statements for ASSEMBLY, LINKEDIT or COPY
|
||||||
|
steps. SMP reads these statements, and uses them to determine how
|
||||||
|
source can be reassembled after a MACRO change, or how load modules
|
||||||
|
of one or many csects (called LMODs by SMP) are linkedited from
|
||||||
|
component parts, including all linkedit control statements and
|
||||||
|
attributes. JCLIN is only associated with TARGET LIBRARIES and the
|
||||||
|
TARGET ZONE, not with DISTRIBUTION LIBRARIES, which have only separate
|
||||||
|
pieces of the system. JCLIN tells SMP how to construct the working
|
||||||
|
programs of the system from their component pieces.
|
||||||
|
|
||||||
|
This is reminiscent of our discussion of the SYSGEN process.
|
||||||
|
In fact, JCLIN is the means of communicating the contents of the
|
||||||
|
SYSGEN STAGE II DECK to SMP. A JCLIN stream can be put into SMP in
|
||||||
|
two ways. The first way is by means of a dataset of JCL, which is
|
||||||
|
referred to the SMP job by the SMPJCLIN DD statement. The second
|
||||||
|
means is from within a SYSMOD itself. This second way is called
|
||||||
|
"INLINE JCLIN". The JCL stream is included in the text of the SYSMOD
|
||||||
|
and preceded with a "++ JCLIN." statement. This will cause the JCL
|
||||||
|
pattern to be read into the TARGET ZONE or CDS when the SYSMOD is
|
||||||
|
APPLIED.
|
||||||
|
|
||||||
|
The APPLY process is reversed with the RESTORE process. RESTORE
|
||||||
|
takes off SYSMODS that have already been APPLIED but NOT ACCEPTED.
|
||||||
|
SMP provides a RESTORE CHECK facility so the user can determine in
|
||||||
|
advance if the RESTORE will work. RESTORE allows you to back off bad
|
||||||
|
SYSMODS if they are causing trouble during your system tests, after
|
||||||
|
APPLYs have been done.
|
||||||
|
|
||||||
|
We shall talk about ACCEPTing the APPLIED SYSMODS into the DLIBS.
|
||||||
|
The ACCEPT process of SMP takes the ELEMENT REPLACEMENTS which have
|
||||||
|
already been APPLYed to the system (and presumably tested), and puts
|
||||||
|
them into the DISTRIBUTION LIBRARIES to archive them. This also allows
|
||||||
|
them to be used in a subsequent SYSGEN or IOGEN (a partial SYSGEN to
|
||||||
|
rearrange IO-configuration related ELEMENTS). ACCEPT is thus a very
|
||||||
|
important process.
|
||||||
|
|
||||||
|
Control information for the ACCEPT processing is kept, for SMP/E,
|
||||||
|
in a VSAM cluster known as a DLIB ZONE. Each DLIB ZONE must be paired
|
||||||
|
with a corresponding TARGET ZONE. This is because SMP will normally
|
||||||
|
ACCEPT only SYSMODS that have already been APPLIED, and the TARGET
|
||||||
|
ZONE has the control information for the APPLIED SYSMODS. It is
|
||||||
|
possible for ONE GLOBAL ZONE to control SEVERAL PAIRS OF TARGET AND
|
||||||
|
DLIB ZONES, so that several sets of system libraries can be maintained
|
||||||
|
out of one SMP/E configuration.
|
||||||
|
|
||||||
|
For SMP4, control information for ACCEPT is kept in two
|
||||||
|
partitioned data sets, the "ACDS" or "Alternate Control Data Set"
|
||||||
|
and the "ACRQ" or "Alternate Conditional Requisite Queue Data Set".
|
||||||
|
(There is also a "CRQ" dataset for APPLY information.) These datasets
|
||||||
|
correspond to the information that is kept in the DLIB ZONE for SMP/E.
|
||||||
|
|
||||||
|
ACCEPT control parameters are similar to those for APPLY,
|
||||||
|
as we discussed above. It is always advisable to do ACCEPT CHECK
|
||||||
|
runs before doing a real ACCEPT run, just to make sure the job will
|
||||||
|
achieve the desired result. Doing ACCEPT CHECK runs will make it
|
||||||
|
possible to fix errors before the ACCEPT run. Once a SYSMOD has been
|
||||||
|
ACCEPTed on the SYSTEM, it cannot be removed, except by another SYSMOD
|
||||||
|
that will SUPERSEDE it and replace all its ELEMENTS.
|
||||||
|
|
||||||
|
In order for an ELEMENT to be used in a subsequent SYSGEN or
|
||||||
|
IOGEN, its SYSMOD must first be ACCEPTED. This loads the ELEMENT into
|
||||||
|
its proper DISTRIBUTION LIBRARY. As we stated before, the SYSGEN
|
||||||
|
PROCESS uses the material in the DLIBS to build the system, and one
|
||||||
|
doesn't want back-level code to creep into his system after an IOGEN
|
||||||
|
has been done. It is therefore mandatory to do a MASS ACCEPT before
|
||||||
|
a SYSGEN or IOGEN is done.
|
||||||
|
|
||||||
|
There is a special case of ACCEPT processing which allows SMP
|
||||||
|
to simulate the SYSGEN process. This type of ACCEPT processing is
|
||||||
|
called "ACCEPT NOAPPLY", and its purpose is to replace SYSGEN MACROS
|
||||||
|
and other pieces of the DISTRIBUTION LIBRARIES so a newly updated
|
||||||
|
SYSGEN STAGE II DECK can be created. This new STAGE II DECK will
|
||||||
|
reflect the NEW PATTERN that IBM has planned for the new version of
|
||||||
|
the operating system. ACCEPT NOAPPLY processing replenishes the
|
||||||
|
DLIBS directly from RECEIVED SYSMODS, bypassing the TARGET LIBRARIES
|
||||||
|
entirely. After the ACCEPT NOAPPLY has been done, and the DLIBS
|
||||||
|
reflect the state of the new system, a STAGE II SYSGEN DECK is assembled
|
||||||
|
from the installation's STAGE I DECK, and the new STAGE II DECK
|
||||||
|
is made known to SMP through the JCLIN process. When a subsequent
|
||||||
|
APPLY of the same SYSMODS is done, all their ELEMENTS will fit into
|
||||||
|
the system according to their proper new pattern.
|
||||||
|
|
||||||
|
We shall finish our discussion with the topics of "UCLIN" and
|
||||||
|
"LIST". Then I'll let you try your hand at the SMP books. You'll
|
||||||
|
probably find them clear and well-written now, because you're past the
|
||||||
|
"vocabulary barrier". Any words I haven't defined here can probably
|
||||||
|
be found in the glossaries of the SMP publications, and you can be on
|
||||||
|
your way.
|
||||||
|
|
||||||
|
UCLIN for SMP CONTROL DATASETS roughly corresponds to ZAP for
|
||||||
|
data. UCLIN provides the facility for ARBITRARILY CHANGING SMP
|
||||||
|
CONTROL INFORMATION. Sometimes SMP control entries must be adjusted
|
||||||
|
to allow a PTF to be APPLIED or ACCEPTED properly. For example,
|
||||||
|
suppose PTF B is intended to replace ELEMENT A, but our installation
|
||||||
|
has modified ELEMENT A with a USERMOD. Our intention is to replace
|
||||||
|
ELEMENT A with IBM's new version of it, supplied by PTF B. After the
|
||||||
|
element is replaced, we will refit our USERMOD to the new version.
|
||||||
|
This is what we want, but SMP will not let us do it. That is because
|
||||||
|
PTF B doesn't "know", in its "PRE" and "SUP" keywords about our
|
||||||
|
USERMOD, which tagged ELEMENT A with a UMID equal to the USERMOD's
|
||||||
|
SYSMOD ID. The APPLY CHECK run to APPLY PTF B will report an ID
|
||||||
|
CHECK, stopping PTF B from going on.
|
||||||
|
|
||||||
|
One way to get around this situation is to use UCLIN processing
|
||||||
|
to remove the strange UMID from ELEMENT A before doing the APPLY for
|
||||||
|
PTF B. Then PTF B can be APPLIED without any trouble, and it will
|
||||||
|
replace ELEMENT A on the system, achieving the result that we want.
|
||||||
|
(Another approach is to BYPASS ID CHECKS and force PTF B on. The
|
||||||
|
UCLIN approach seems cleaner to me.)
|
||||||
|
|
||||||
|
UCLIN can also be used to replace large pieces of SMP control
|
||||||
|
data. SMP has a facility called UNLOAD, that converts entire SMP
|
||||||
|
entries, or even an entire ZONE into UCLIN control statements. This
|
||||||
|
may prove useful to some users. The point is that the UCLIN facility
|
||||||
|
gives us fine control on the SMP entries, outside of the RECEIVE,
|
||||||
|
APPLY, ACCEPT milieu. We must obviously be very careful with UCLIN,
|
||||||
|
and we should only use it when we know exactly what we are doing.
|
||||||
|
Sometimes an IBM-supplied PTF will recommend the application of UCLIN.
|
||||||
|
This should also be done with care, because a previous SYSMOD may
|
||||||
|
have done the proper adjustment already.
|
||||||
|
|
||||||
|
"LIST" allows the SMP user to DISPLAY ALL SMP CONTROL
|
||||||
|
INFORMATION, and it is obviously the tool to use when determining if
|
||||||
|
UCLIN is necessary, and if your UCLIN worked properly. LIST has much
|
||||||
|
more general-purpose use in SMP. It is THE WAY TO DO SMP INQUIRY.
|
||||||
|
With SMP4, it is practically the only way find out SMP control
|
||||||
|
information. (There are a few other tools around, including a
|
||||||
|
"LISTCDS" TSO command on file 300 of the CBT tape.) With SMP/E, there
|
||||||
|
is an extensive ISPF INQUIRY SYSTEM that takes the place of the LIST
|
||||||
|
function for most routine lookups. LIST can still be used for big
|
||||||
|
inquiries in batch. The SMP books have much information on the use
|
||||||
|
of the LIST command.
|
||||||
|
|
||||||
|
That's all for now, but I hope it's enough to achieve our
|
||||||
|
purpose. Now you can hit the books, and use SMP carefully, but with
|
||||||
|
confidence.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
474
doc/smpart2.txt
Normal file
474
doc/smpart2.txt
Normal file
@ -0,0 +1,474 @@
|
|||||||
|
SMP DEMYSTIFIED: Part II
|
||||||
|
By Sam Golob
|
||||||
|
|
||||||
|
Modification Control Statements
|
||||||
|
|
||||||
|
Now is a good time to mention the syntax of SMP Modification Control
|
||||||
|
Statements, before going into the details of RECEIVE, APPLY, and ACCEPT
|
||||||
|
processing.
|
||||||
|
|
||||||
|
Rule number one is that all SYSMOD control statements (known in IBMese
|
||||||
|
as MCS) must begin with the characters ++ in columns 1 and 2 of the
|
||||||
|
SYSMOD's card-image records. The other keywords and parameters in
|
||||||
|
SYSMOD syntax are free-flowing. Extra blanks don't count. Columns 73
|
||||||
|
to 80 are not used in the SYSMOD statements themselves, but are required
|
||||||
|
for IEBUPDTE source and macro update cards. A SYSMOD cannot be
|
||||||
|
renumbered. Comments are as in the PL/I language, they begin with the
|
||||||
|
characters /* and end with the characters */. Everything in between
|
||||||
|
these characters, even on many successive lines, is treated by SMP as a
|
||||||
|
comment. All SMP statements must end in a period. The period is the
|
||||||
|
delimiter for statements in SMP syntax, and one must be exceedingly
|
||||||
|
careful with them.
|
||||||
|
|
||||||
|
Every SYSMOD must begin with the statements: ++ FUNCTION, ++ PTF,
|
||||||
|
++ APAR, or ++ USERMOD, followed by the seven character SYSMOD ID
|
||||||
|
enclosed in parentheses, and delimited by a period. FUNCTION
|
||||||
|
SYSMODS have already been covered in the first part of this article
|
||||||
|
(Technical Support, December 1988).
|
||||||
|
|
||||||
|
PTF SYSMODS or PTFs are (after the invention of SMP and the change in
|
||||||
|
IBM's maintenance philosophy) really permanent system fixes, even though
|
||||||
|
their name stands for Program Temporary Fix. The temporary fixes are
|
||||||
|
now called APARs, which is really a short term for APAR FIX. APAR
|
||||||
|
stands for Authorized Program Analysis Report, and it refers to a
|
||||||
|
problem that was reported to IBM. IBM assigns a number to each problem,
|
||||||
|
and when the problem is fixed, the temporary fix itself is assigned the
|
||||||
|
same number. This number (or something very close to it) is what SMP
|
||||||
|
uses for the APAR SYSMOD ID. APAR SYSMODS are intended to be replaced,
|
||||||
|
or superseded, by permanent fixes, or PTFs. They are therefore not
|
||||||
|
usually ACCEPTed into the Distribution Libraries.
|
||||||
|
|
||||||
|
USERMODs are packaged SMP SYSMODS written by the individual
|
||||||
|
installation, usually to modify some IBM code. They look like PTFs or
|
||||||
|
APARs, but SMP puts them in a special category so that they stay a bit
|
||||||
|
distant from the real IBM maintenance. The user has flexibility to
|
||||||
|
assign almost any seven character SYSMOD ID to a USERMOD, but each
|
||||||
|
different SYSMOD must have a unique ID, and it is wise to steer clear of
|
||||||
|
IBM-type names. USERMODs are also usually not ACCEPTed into IBM
|
||||||
|
Distribution Libraries (also known as DLIBs) because they are likely to
|
||||||
|
overlay IBM code there. USERMODs should only be ACCEPTed if you really
|
||||||
|
know what you are doing.
|
||||||
|
|
||||||
|
I'll quickly explain the concepts of other keywords you're likely to
|
||||||
|
find at the top of SMP SYSMODS. I don't intend to be exhaustive. The
|
||||||
|
idea is to cut through the ice and give you some idea of what is
|
||||||
|
happening.
|
||||||
|
|
||||||
|
++ VER means version of the operating system, or perhaps "domain of SMP
|
||||||
|
activity" would also be an appropriate explanation. The values for this
|
||||||
|
parameter have four characters, and there aren't too many valid choices.
|
||||||
|
Z038 means MVS 3.8 and upwards through XA. (Z037 or MVS 3.7 probably
|
||||||
|
isn't used anymore.) C150 means CICS 1.5 and upward. These values
|
||||||
|
almost never change, and within the same domain of activity, you always
|
||||||
|
find the same value. The ++VER values were originally intended to
|
||||||
|
differentiate between similar maintenance on different MVS releases, but
|
||||||
|
because of the evolution of the SMP product since those days, it isn't
|
||||||
|
as important any more. The purpose of the ++VER statement has been
|
||||||
|
largely taken over by the FMID. It is still required, however, and must
|
||||||
|
be included in all SYSMODs.
|
||||||
|
|
||||||
|
Inside the ++VER statement are the FMID, PRE, REQ, and SUP keywords.
|
||||||
|
FMID has been discussed. Every SYSMOD must belong to a unique FMID. In
|
||||||
|
the parentheses following the FMID keyword, the FMID which will own the
|
||||||
|
SYSMOD must be specified.
|
||||||
|
|
||||||
|
PRE and SUP are quite simple. In the parentheses following the PRE
|
||||||
|
keyword, and separated by spaces or commas, is a list of SYSMOD IDs
|
||||||
|
which have to be present before the new SYSMOD can be APPLYed. The
|
||||||
|
prerequisite SYSMODs must have been already APPLYed themselves, or else
|
||||||
|
they have to be APPLYed together with this new SYSMOD. If all the PREs
|
||||||
|
or prerequisites are not present, the new SYSMOD will not go on.
|
||||||
|
|
||||||
|
REQ is like PRE, but the SYSMODs that are REQuired for the new SYSMOD,
|
||||||
|
must be APPLYed in the same run as the new SYSMOD. It is seldom
|
||||||
|
necessary to use the REQ keyword, usually PRE will suffice.
|
||||||
|
|
||||||
|
Following the SUP keyword is a list of SYSMODS that are effectively
|
||||||
|
replaced, or SUPERSEDED by the new SYSMOD. SUP is used when the intent
|
||||||
|
of the new material is to completely obsolete all the material from all
|
||||||
|
of the SYSMODs in the SUP list. If only some of the material in a
|
||||||
|
previous SYSMOD or PTF will be replaced, that SYSMOD should be placed in
|
||||||
|
the PRE list or prerequisite list. For a SYSMOD to be superseded or
|
||||||
|
SUPed (to use the common parlance) its purpose in the operating system
|
||||||
|
should be completely replaced by the later SYSMOD.
|
||||||
|
|
||||||
|
The new SYSMOD may have a sequence of ++IF FMID(fmidnam) THEN
|
||||||
|
REQ(sysmdid) statements. This happens if different levels of the same
|
||||||
|
product exist, as mentioned earlier regarding the various MVS/370
|
||||||
|
product levels. If the new SYSMOD is for a lower level of the product,
|
||||||
|
and the installation has both that level and a higher level, it may be
|
||||||
|
necessary to apply another fix to satisfy the requirements of the higher
|
||||||
|
level. SMP is informed of this by a coded ++IF statement in the lower
|
||||||
|
level SYSMOD. If the higher level referred to in the ++IF statement is
|
||||||
|
not present on the system, then the fix suffices, and it will go on to
|
||||||
|
the system normally. If the installation has the higher level of the
|
||||||
|
product also, the lower level SYSMOD will not go on without the presence
|
||||||
|
of the SYSMOD ID in the REQ keyword of the ++IF statement. The FMID
|
||||||
|
name within the ++IF statement is usually for a higher level of the
|
||||||
|
product than the current SYSMOD is for.
|
||||||
|
|
||||||
|
Below all this VER, PRE, SUP and IF stuff is the actual fix. A ++MOD
|
||||||
|
statement followed by object code signifies an object module replacement
|
||||||
|
of a CSECT. A ++SRC statement followed by source code is a complete
|
||||||
|
source code replacement. A ++MAC statement is followed by the complete
|
||||||
|
replacement for the macro. A ++SRCUPD statement or ++ MACUPD statement
|
||||||
|
followed by IEBUPDTE control cards signifies updates to an existing
|
||||||
|
source module or macro. Keywords in these statements supply necessary
|
||||||
|
additional instructions so that the change is done according to the
|
||||||
|
author's or IBM's specifications. Specification of the destination
|
||||||
|
libraries for the ELEMENT to be changed is also accomplished by these
|
||||||
|
keywords.
|
||||||
|
|
||||||
|
A single SYSMOD can contain fixes for many system ELEMENTs. Each ELEMENT
|
||||||
|
to be changed must have its own ++SRC, ++MOD, +SRCUPD, ++MAC or ++MACUPD
|
||||||
|
control card, followed by the replacement or additional material for
|
||||||
|
that ELEMENT. An approximate limit to the number of element fixes in
|
||||||
|
one SYSMOD is set by a global SMP parameter called PEMAX. It is
|
||||||
|
advisable to set PEMAX to a high number, usually 9999.
|
||||||
|
|
||||||
|
One more important note. Libraries in SMP control statements are
|
||||||
|
referred to by their DDNAMES only, which are one to eight characters
|
||||||
|
long. It is a safe and wise practice in SMP work to always make the
|
||||||
|
DDNAME of the library correspond to the lowest-level qualifier of its
|
||||||
|
dataset name. Dataset name prefixes don't count to the SMP program. It
|
||||||
|
is therefore advisable to use the same SMP JCL procedure when doing
|
||||||
|
system modifications to one system. The JCL of that PROC will uniquely
|
||||||
|
and unchangeably determine the destination libraries of the SMP action.
|
||||||
|
Thus, the SMP control information and the actual contents of the
|
||||||
|
affected libraries will always be kept in synchronization. (SMP/E has a
|
||||||
|
facility for determining dataset names by dynamic allocation. These
|
||||||
|
dynamically determined library names are called DDDEFs. DDDEFS,
|
||||||
|
dynamically accomplish what DD cards do in a JCL procedure.)
|
||||||
|
|
||||||
|
The SMP Work Flow
|
||||||
|
|
||||||
|
The discussion of control datasets is based on the three processes of
|
||||||
|
SMP flow. These are RECEIVE, APPLY, and ACCEPT. RECEIVE, APPLY, and
|
||||||
|
ACCEPT are the SMP- language equivalents of: taking a new SYSMOD into
|
||||||
|
the SMP environment, putting its pieces into the Target Libraries in the
|
||||||
|
proper places, and finally, storing its pieces in the Distribution
|
||||||
|
Libraries for archival and possible later use. Again, the flow is:
|
||||||
|
IBM-supplied SYSMODS, to Target Libraries, to Distribution Libraries.
|
||||||
|
|
||||||
|
How do the RECEIVE, APPLY, and ACCEPT processes work? I will discuss
|
||||||
|
these processes briefly in order, with the aim of keeping the discussion
|
||||||
|
conceptual. Once the concepts are understood, and the vocabulary words
|
||||||
|
associated with them are learned, then the IBM literature will become
|
||||||
|
readable.
|
||||||
|
|
||||||
|
RECEIVE
|
||||||
|
|
||||||
|
RECEIVE basically involves storing a new SYSMOD and recording some vital
|
||||||
|
statistics about it, so that it is pre-digested by SMP. The text of the
|
||||||
|
entire SYSMOD is stored in a partitioned dataset called the PTS, or PTF
|
||||||
|
Temporary Store dataset. In the older version of SMP, SMP4, the control
|
||||||
|
information taken during the RECEIVE process is stored in the PTS also.
|
||||||
|
However, in SMP/E, all control information is stored in VSAM files known
|
||||||
|
as ZONEs. The VSAM file which stores the control information from the
|
||||||
|
RECEIVE process is known as the GLOBAL ZONE. The text of the SYSMOD
|
||||||
|
thus goes to the PTS as before, but the control information is stored in
|
||||||
|
the GLOBAL ZONE.
|
||||||
|
|
||||||
|
Certain SYSMODS are RECEIVEd a bit differently. These are SYSMODS which
|
||||||
|
have what are known in SMP language as RELFILE. The word RELFILE
|
||||||
|
roughly translates to IEBCOPY. If a modification has large numbers of
|
||||||
|
linkedited csects, macros, ISPF panels, or other ELEMENTs, which are
|
||||||
|
suitable for direct IEBCOPY into Target Libraries, then those ELEMENTs
|
||||||
|
included in the SYSMOD which have similar record format and record
|
||||||
|
length can be loaded into a single PDS. This PDS is unloaded onto the
|
||||||
|
SYSMOD distribution tape using IEBCOPY, and its file sequence order on
|
||||||
|
the tape is very important. If the Sysmod Specification File on the
|
||||||
|
tape (known as the SMPMCS) calls for three RELFILEs for instance, then
|
||||||
|
the next three files on the tape, hopefully IEBCOPY unloaded, are known
|
||||||
|
as RELFILE(1), RELFILE(2), and RELFILE(3) respectively.
|
||||||
|
|
||||||
|
The RECEIVE process on a SYSMOD with RELFILE is the following: The
|
||||||
|
SMPMCS, which contains the SMP control statements of the SYSMOD, is read
|
||||||
|
from the tape. The number of RELFILEs (three in this example) is
|
||||||
|
determined from the RELFILES (3) keyword in the SMPMCS. The three files
|
||||||
|
on the tape which follow the SMPMCS file are then unloaded to a disk
|
||||||
|
pack (determined by the SMPTLIB DD statement in the SMP job) and given
|
||||||
|
special names, which SMP will understand during later APPLY and ACCEPT
|
||||||
|
processing of the SYSMOD. These names are of the format:
|
||||||
|
prefix.sysmodid.Fn, where n is 1, for the first relfile, 2 for the
|
||||||
|
second, and so forth. The prefix is set in the GLOBAL ZONE for SMP/E
|
||||||
|
(or in the PTS system entry in SMP4) and is not changed during the
|
||||||
|
entire process. When a SYSMOD with RELFILEs is RECEIVEd, the Relfile
|
||||||
|
Libraries are loaded from tape to disk. The elements they contain are
|
||||||
|
thus readied, so that the APPLY and ACCEPT processes to follow can
|
||||||
|
selectively copy them to where they will be needed. Meanwhile, the
|
||||||
|
SMPMCS is itself copied to the PTS, and its control information is dealt
|
||||||
|
with as discussed before.
|
||||||
|
|
||||||
|
With SMP/E there is a bit more to the RECEIVE process. Besides the
|
||||||
|
RECEIVE of SYSMODS, one must also RECEIVE SYSMOD error information. This
|
||||||
|
is known as HOLDDATA. HOLDDATA consists of a list of ++HOLD and
|
||||||
|
++RELEASE control statements in sequential order. Each of these
|
||||||
|
statements point to a PTF or an APAR SYSMOD. The purpose of the ++HOLD
|
||||||
|
statement is to prevent SMP/E from APPLYing a PTF that is in error,
|
||||||
|
known as a PE PTF. A ++RELEASE statement that is RECEIVED after a
|
||||||
|
++HOLD statement against the same SYSMOD will undo the effect of the
|
||||||
|
++HOLD statement. The order in which the statements are RECEIVED is of
|
||||||
|
paramount importance. SMP/E will honor the ++RELEASE only if it occurs
|
||||||
|
after all ++HOLD statements for that particular SYSMOD. The HOLDDATA is
|
||||||
|
kept in the SMP/E GLOBAL ZONE.
|
||||||
|
|
||||||
|
A quick word about undoing the RECEIVE of a SYSMOD. A RECEIVE can be
|
||||||
|
undone by an SMP process called REJECT. To REJECT a SYSMOD that has
|
||||||
|
been RECEIVEd causes the SYSMOD to be erased from the PTS and its
|
||||||
|
control information associated with the RECEIVE process to be wiped out.
|
||||||
|
If the SYSMOD has RELFILEs, the disk-loaded copies are deleted. The
|
||||||
|
SYSMOD cannot then be APPLIED or ACCEPTED unless it is re-RECEIVED.
|
||||||
|
REJECTing a SYSMOD will not affect the status of a SYSMOD that has
|
||||||
|
already been APPLYed or ACCEPTed. It stays in the Target Libraries and
|
||||||
|
in the Distribution Libraries.
|
||||||
|
|
||||||
|
APPLY
|
||||||
|
|
||||||
|
Now once a SYSMOD is RECEIVEd, how is it APPLYed to the Target
|
||||||
|
Libraries?
|
||||||
|
|
||||||
|
When thinking about APPLYing SYSMODS to your system, never forget that
|
||||||
|
the purpose of a SYSMOD is to supply new components for the operating
|
||||||
|
system or a product. The APPLY process puts the new pieces or elements
|
||||||
|
into their proper places in the executing libraries of the system, the
|
||||||
|
Target Libraries. It also keeps detailed track of what was done.
|
||||||
|
|
||||||
|
APPLY can only be done to a SYSMOD that has been RECEIVEd. The RECEIVE
|
||||||
|
process has put the SYSMOD into the SMP staging areas, the PTS, and
|
||||||
|
possibly the unloading RELFILE, and has done some preliminary accounting
|
||||||
|
in the SMP/E GLOBAL ZONE or the SMP4 PTS. The APPLY process will pick
|
||||||
|
up the SYSMOD from there. Accounting for the APPLY process is done in
|
||||||
|
SMP/E using a VSAM cluster called the TARGET ZONE, and in SMP4 using
|
||||||
|
several partitioned datasets, the most important of which is called the
|
||||||
|
CDS or Control Data Set.
|
||||||
|
|
||||||
|
A word about ELEMENT accounting. If a SYSMOD will replace an ELEMENT,
|
||||||
|
that ELEMENT acquires an RMID (Replacement Module ID) equal to the
|
||||||
|
SYSMOD ID of the SYSMOD which replaced it. Since the piece was
|
||||||
|
completely replaced, each MAC, MOD, or SRC ELEMENT can have only one
|
||||||
|
RMID. If on the other hand, the SYSMOD will update a MACRO, update
|
||||||
|
SOURCE, or zap a LOAD MODULE, then that ELEMENT acquires a UMID (Update
|
||||||
|
Module ID) equal to the SYSMOD ID that updated it. One macro or module
|
||||||
|
can have many UMIDS, because it is possible to update a single ELEMENT
|
||||||
|
many times.
|
||||||
|
|
||||||
|
Now back to APPLY processing. Many SYSMODS can be APPLYed together in
|
||||||
|
one run. This is one of the great conveniences of the SMP product. The
|
||||||
|
programmer can select a list of individual SYSMODS by their
|
||||||
|
seven-character SYSMOD IDs in the SMPCNTL DD statement, where the APPLY
|
||||||
|
parameter is entered into the SMP job. This is accomplished simply by
|
||||||
|
stating APPLY SELECT (sysmdid,sysmdid, ...).. Just one SYSMOD can be
|
||||||
|
selected to APPLY, if that is what is desired.
|
||||||
|
|
||||||
|
It is almost always advisable to do APPLY CHECK before doing the real
|
||||||
|
APPLY. APPLY CHECK is a dry run of the APPLY process. All SMP control
|
||||||
|
information will be verified, just as if the real APPLY was being done.
|
||||||
|
With APPLY CHECK however, no real library updates are done, and the
|
||||||
|
SYSMODS will not really be APPLYed to the system. A report will be
|
||||||
|
generated that tells what would be done. ACCEPT and RESTORE processing,
|
||||||
|
to be mentioned later, also have the CHECK facility.
|
||||||
|
|
||||||
|
It is also possible to do what is called a MASS APPLY. By simply stating
|
||||||
|
the word APPLY in the SMPCNTL DD statement of an SMP job, SMP will
|
||||||
|
attempt to APPLY all RECEIVEd SYSMODS that are eligible for the system
|
||||||
|
but have not been APPLYed yet. SMP will look at all the un-APPLYed
|
||||||
|
RECEIVEd SYSMODS and will build a SYSMOD SELECT list. SMP will then
|
||||||
|
proceed to APPLY all the selected SYSMODS to the system.
|
||||||
|
|
||||||
|
It is possible to EXCLUDE a list of SYSMODS specifically from a MASS
|
||||||
|
APPLY, by using the EXCLUDE or E parameter in the APPLY control
|
||||||
|
statement. In SMP/E (but not in SMP4) there is an additional way to
|
||||||
|
exclude a SYSMOD from an APPLY. This is through a ++HOLD modification
|
||||||
|
control statement which has been RECEIVEd previous to the APPLY request.
|
||||||
|
|
||||||
|
MASS APPLY is the normal means of APPLYing IBM's periodic system
|
||||||
|
maintenance known as PUTs (Program Update Tapes) to the system, because
|
||||||
|
this maintenance consists of large numbers of PTFs, perhaps several
|
||||||
|
hundred of them, and it is inconvenient to SELECT them individually.
|
||||||
|
|
||||||
|
There is another APPLY option called APPLY GROUP. APPLY GROUP works
|
||||||
|
very much like APPLY SELECT for APPLYing a list of SYSMODS. The
|
||||||
|
difference concerns missing prerequisites. If APPLY GROUP(sysmdid,...)
|
||||||
|
is coded instead of APPLY SELECT, SMP will go to the trouble of adding
|
||||||
|
all necessary prerequisites to the SELECT list before doing the APPLY.
|
||||||
|
It is only necessary that the added SYSMODS have been previously
|
||||||
|
RECEIVEd. APPLY GROUP is handy for APPLYing new PTFs when information
|
||||||
|
is unknown about other necessary PTFs. This option does use extra
|
||||||
|
overhead, but it can be used to avoid multiple SMP runs when some
|
||||||
|
prerequisites may be missing.
|
||||||
|
|
||||||
|
BYPASS is a useful facility of SMP APPLY processing, especially during
|
||||||
|
APPLY CHECK for determining if the APPLY should work. The BYPASS
|
||||||
|
parameter (also available with ACCEPT) of APPLY allows SYSMODS to be
|
||||||
|
APPLYed to the system, even though prerequisites or other requirements
|
||||||
|
are missing. During a real APPLY situation, the BYPASS parameter will
|
||||||
|
allow putting on a SYSMOD in an exceptional circumstance, when there is
|
||||||
|
no other way of getting it on. During a CHECK situation however, it is
|
||||||
|
advisable to BYPASS all or most error conditions on the first try. This
|
||||||
|
is because SMP will often stop further action when it encounters the
|
||||||
|
first ERROR.
|
||||||
|
|
||||||
|
For instance, suppose SYSMODS B and C both require SYSMOD A, and SYSMOD
|
||||||
|
A has a ++HOLD against it. When trying to APPLY CHECK SELECT SYSMODS A,
|
||||||
|
B, and C together, without a BYPASS (HOLDERROR) coded, SMP will not
|
||||||
|
indicate how the three SYSMODS will APPLY, and what ELEMENTs they will
|
||||||
|
affect. SMP will simply say that it cannot APPLY SYSMODS B and C
|
||||||
|
because it could not APPLY SYSMOD A. On the next try, if a BYPASS
|
||||||
|
(HOLDERROR) is coded in the APPLY CHECK, SMP/E would give a complete
|
||||||
|
report of the ELEMENTs affected by all three SYSMODS, because the BYPASS
|
||||||
|
allowed the simulation of a completed APPLY, and all the consequences of
|
||||||
|
the APPLY will show in the report.
|
||||||
|
|
||||||
|
As a matter of procedure, most people BYPASS every error condition
|
||||||
|
during APPLY CHECK, but some try not to use BYPASS on the real APPLY.
|
||||||
|
They exert much effort to completely clean up the APPLY CHECK so they
|
||||||
|
can avoid coding a BYPASS for the real APPLY run. I personally leave the
|
||||||
|
BYPASS in during the real APPLY runs too. I just make sure that the
|
||||||
|
APPLY CHECK will show the exact result that I want to achieve. My
|
||||||
|
approach avoids an excessive number of APPLY CHECK runs, which can take
|
||||||
|
a long time. This is a matter of personal preference. The important
|
||||||
|
thing is that the real APPLY should always be done with the same
|
||||||
|
parameters as the last satisfactory APPLY CHECK run.
|
||||||
|
|
||||||
|
The final point on APPLY processing is to show how the pattern of the
|
||||||
|
system is determined or changed during APPLY. System patterns are
|
||||||
|
communicated to SMP by means of the JCLIN facility. JCLIN consists of
|
||||||
|
MODEL JCL statements for ASSEMBLY, LINKEDIT or COPY steps. SMP reads
|
||||||
|
these statements, and uses them to determine how source can be
|
||||||
|
reassembled after a MACRO change, or how load modules of one or many
|
||||||
|
csects (called LMODs by SMP) are linkedited from component parts,
|
||||||
|
including all linkedit control statements and attributes. JCLIN is only
|
||||||
|
associated with Target Libraries and the TARGET ZONE, not with
|
||||||
|
Distribution Libraries, which have only separate pieces of the system.
|
||||||
|
JCLIN tells SMP how to construct the working programs of the system from
|
||||||
|
their component pieces.
|
||||||
|
|
||||||
|
This is reminiscent of our discussion of the SYSGEN process. In fact,
|
||||||
|
JCLIN is the means of communicating the contents of the SYSGEN STAGE II
|
||||||
|
DECK to SMP. A JCLIN stream can be put into SMP in two ways. The first
|
||||||
|
way is by means of a dataset of JCL, which is referred to in the SMP job
|
||||||
|
by the SMPJCLIN DD statement. The second means is from within a SYSMOD
|
||||||
|
itself. This second way is called INLINE JCLIN. The JCL stream is
|
||||||
|
included in the text of the SYSMOD and preceded with a ++ JCLIN
|
||||||
|
statement. This will cause the JCL pattern to be read into the TARGET
|
||||||
|
ZONE or CDS when the SYSMOD is APPLYed.
|
||||||
|
|
||||||
|
RESTORE
|
||||||
|
|
||||||
|
The APPLY process is reversed with the RESTORE process. RESTORE takes
|
||||||
|
off SYSMODS that have already been APPLYed but not ACCEPTed. SMP
|
||||||
|
provides a RESTORE CHECK facility so the user can determine in advance
|
||||||
|
if the RESTORE will work. RESTORE allows bad SYSMODS to be backed off
|
||||||
|
if they are causing trouble during system tests, after APPLYs have been
|
||||||
|
done.
|
||||||
|
|
||||||
|
ACCEPT
|
||||||
|
|
||||||
|
The ACCEPT process of SMP takes the ELEMENT replacements which have
|
||||||
|
already been APPLYed to the system (and presumably tested), and puts
|
||||||
|
them into the Distribution Libraries to archive them. This also allows
|
||||||
|
them to be used in a subsequent SYSGEN or IOGEN (a partial SYSGEN to
|
||||||
|
rearrange IO-configuration related ELEMENTS). ACCEPT is thus a very
|
||||||
|
important process.
|
||||||
|
|
||||||
|
Control information for the ACCEPT processing is kept, for SMP/E, in a
|
||||||
|
VSAM cluster known as a DLIB ZONE. Each DLIB ZONE must be paired with a
|
||||||
|
corresponding TARGET ZONE. This is because SMP will normally ACCEPT
|
||||||
|
only SYSMODS that have already been APPLYed, and the TARGET ZONE has the
|
||||||
|
control information for the APPLYed SYSMODS. It is possible for one
|
||||||
|
GLOBAL ZONE to control several pairs of TARGET and DLIB ZONES, so that
|
||||||
|
several sets of system libraries can be maintained out of one SMP/E
|
||||||
|
configuration.
|
||||||
|
|
||||||
|
For SMP4, control information for ACCEPT is kept in two partitioned
|
||||||
|
datasets, the ACDS (Alternate Control Data Set) and the ACRQ (Alternate
|
||||||
|
Conditional Requisite Queue Data Set). There is also a CRQ dataset for
|
||||||
|
APPLY information. These datasets correspond to the information that is
|
||||||
|
kept in the DLIB ZONE for SMP/E.
|
||||||
|
|
||||||
|
ACCEPT control parameters are similar to those for APPLY, as discussed
|
||||||
|
above. It is always advisable to do ACCEPT CHECK runs before doing a
|
||||||
|
real ACCEPT run, just to make sure the job will achieve the desired
|
||||||
|
result. Doing ACCEPT CHECK runs will make it possible to fix errors
|
||||||
|
before the ACCEPT run. Once a SYSMOD has been ACCEPTed on the SYSTEM,
|
||||||
|
it cannot be removed, except by another SYSMOD that will supersede it
|
||||||
|
and replace all its ELEMENTS.
|
||||||
|
|
||||||
|
In order for an ELEMENT to be used in a subsequent SYSGEN or IOGEN, its
|
||||||
|
SYSMOD must first be ACCEPTed. This loads the ELEMENT into its proper
|
||||||
|
Distribution Library. As stated before, the SYSGEN process uses the
|
||||||
|
material in the DLIBS to build the system, and one doesn't want
|
||||||
|
back-level code to creep into the system after an IOGEN has been done.
|
||||||
|
It is therefore mandatory to do a MASS ACCEPT before a SYSGEN or IOGEN
|
||||||
|
is done.
|
||||||
|
|
||||||
|
There is a special case of ACCEPT processing which allows SMP to
|
||||||
|
simulate the SYSGEN process. This type of ACCEPT processing is called
|
||||||
|
ACCEPT NOAPPLY, and its purpose is to replace SYSGEN MACROS and other
|
||||||
|
pieces of the Distribution Libraries so a newly updated SYSGEN STAGE II
|
||||||
|
DECK can be created. This new STAGE II DECK will reflect the new
|
||||||
|
pattern that IBM has planned for the new version of the operating
|
||||||
|
system. ACCEPT NOAPPLY processing replenishes the DLIBS directly from
|
||||||
|
RECEIVEd SYSMODS, bypassing the Target Libraries entirely. After the
|
||||||
|
ACCEPT NOAPPLY has been done, and the DLIBS reflect the state of the new
|
||||||
|
system, a STAGE II SYSGEN DECK is assembled from the installation's
|
||||||
|
STAGE I DECK, and the new STAGE II DECK is made known to SMP through the
|
||||||
|
JCLIN process. When a subsequent APPLY of the same SYSMODS is done, all
|
||||||
|
their ELEMENTs will fit into the system according to their proper new
|
||||||
|
pattern.
|
||||||
|
|
||||||
|
UCLIN and LIST
|
||||||
|
|
||||||
|
UCLIN for SMP control datasets roughly corresponds to ZAP for data.
|
||||||
|
UCLIN provides the facility for arbitrarily changing SMP control
|
||||||
|
information. Sometimes SMP control entries must be adjusted to allow a
|
||||||
|
PTF to be APPLYed or ACCEPTed properly. For example, suppose PTF B is
|
||||||
|
intended to replace ELEMENT A, but the installation has modified ELEMENT
|
||||||
|
A with a USERMOD. The intention is to replace ELEMENT A with IBM's new
|
||||||
|
version of it, supplied by PTF B. After the element is replaced, the
|
||||||
|
USERMOD will be refitted to the new version. This is what is intended,
|
||||||
|
but SMP will not allow it. That is because PTF B doesn't know, in its
|
||||||
|
PRE and SUP keywords about the USERMOD, which tagged ELEMENT A with a
|
||||||
|
UMID equal to the USERMOD's SYSMOD ID. The APPLY CHECK run to APPLY PTF
|
||||||
|
B will report an ID CHECK, stopping PTF B from going on.
|
||||||
|
|
||||||
|
One way to get around this situation is to use UCLIN processing to
|
||||||
|
remove the strange UMID from ELEMENT A before doing the APPLY for PTF B.
|
||||||
|
Then PTF B can be APPLYed without any trouble, and it will replace
|
||||||
|
ELEMENT A on the system, achieving the desired result. (Another approach
|
||||||
|
is to BYPASS ID CHECKS and force PTF B on. The UCLIN approach seems
|
||||||
|
cleaner to me.)
|
||||||
|
|
||||||
|
UCLIN can also be used to replace large pieces of SMP control data. SMP
|
||||||
|
has a facility called UNLOAD, that converts entire SMP entries, or even
|
||||||
|
an entire ZONE into UCLIN control statements. This may prove useful to
|
||||||
|
some users. The UCLIN facility provides fine control on the SMP
|
||||||
|
entries, outside of the RECEIVE, APPLY, ACCEPT milieu. Obviously, UCLIN
|
||||||
|
should be used with extreme caution, and only by someone who knows
|
||||||
|
exactly what they are doing. Sometimes an IBM-supplied PTF will
|
||||||
|
recommend the application of UCLIN. This should also be done with care,
|
||||||
|
because a previous SYSMOD may have done the proper adjustment already.
|
||||||
|
|
||||||
|
LIST allows the SMP user to display all SMP control information, and it
|
||||||
|
is obviously the tool to use for determining if UCLIN is necessary, and
|
||||||
|
if your UCLIN worked properly. LIST also has considerable
|
||||||
|
general-purpose use in SMP. It is the way to do SMP inquiry. With SMP4,
|
||||||
|
it is practically the only way to find out SMP control information.
|
||||||
|
(There are a few other tools around, including a LISTCDS TSO command on
|
||||||
|
file 300 of the CBT tape.) With SMP/E, there is an extensive ISPF
|
||||||
|
Inquiry System that takes the place of the LIST function for most
|
||||||
|
routine lookups. LIST can still be used for big inquiries in batch.
|
||||||
|
The SMP books have much information on the use of the LIST command.
|
||||||
|
|
||||||
|
|
||||||
|
End Of Lesson
|
||||||
|
|
||||||
|
Now you can try your hand at the SMP books. You'll probably find them
|
||||||
|
clear and well-written now, because you're past the vocabulary barrier.
|
||||||
|
Any words I haven't defined here can probably be found in the glossaries
|
||||||
|
of the SMP publications, and you will be on your way.
|
||||||
|
|
||||||
|
After you hit the books, you can use SMP carefully, but with confidence.
|
||||||
|
|
||||||
|
|
BIN
doc/tstvs.pdf
Normal file
BIN
doc/tstvs.pdf
Normal file
Binary file not shown.
9
src/CMDPROC/FREE.CLIST
Normal file
9
src/CMDPROC/FREE.CLIST
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
PROC 1 FREE$DS CONTROL LIST
|
||||||
|
/*CONLIST SYMLIST
|
||||||
|
/* PURPOSE: "FREE" DATASET AND "WHOGOT" DATASET
|
||||||
|
/* CONTRIBUTED: F. DAVID MCRITCHIE 1985/02/04
|
||||||
|
IF &SUBSTR(1:1,&FREE$DS.) = &STR(') THEN DO
|
||||||
|
SET L = &LENGTH(&FREE$DS.)
|
||||||
|
SET FREE$DS = &SUBSTR(2:&EVAL(&L - 1),&FREE$DS)
|
||||||
|
END
|
||||||
|
FREE DS('&FREE$DS')
|
29
src/CMDPROC/GOTDSN.CLIST
Normal file
29
src/CMDPROC/GOTDSN.CLIST
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
PROC 1 DSN INFORM
|
||||||
|
/* GOTDSN: DETERMINE IF THE PERSON TESTING HAS THE DSNAME ALLOCATED
|
||||||
|
/* NO PROVISION MADE FOR MEMBERNAME
|
||||||
|
/* CONTRIBUTED: DAVID MCRITCHIE, "THE REXX MACROS TOOLBOX", 1989/09/04
|
||||||
|
SET INFORM = &SYSCAPS(&INFORM.)
|
||||||
|
SET SYSOUTTRAP = 400
|
||||||
|
LISTALC STA
|
||||||
|
SET N = &SYSOUTLINE
|
||||||
|
SET SYSOUTTRAP = 0
|
||||||
|
SET I = 1
|
||||||
|
SET LP = &STR((
|
||||||
|
DO WHILE &I <= &N
|
||||||
|
SET DX = &STR(&&SYSOUTLINE&I..)
|
||||||
|
SET DX = &STR(&DX.)
|
||||||
|
SET IX = &SYSINDEX(&STR(&LP.),&STR(&DX.))
|
||||||
|
IF &IX ^= 0 THEN SET DX = &SUBSTR(1:&EVAL(&IX. - 1),&STR(&DX.))
|
||||||
|
/* WRITE &IX. _ &DX. _ &DSN. _ &LP.
|
||||||
|
IF X&SUBSTR(1:1,&STR(&DX.)) = X&STR( ) THEN GOTO NIX
|
||||||
|
IF X&STR(&DX.). = X&STR(&DSN.). THEN DO
|
||||||
|
IF INFORM = &INFORM THEN -
|
||||||
|
WRITE GOTDSN -- YES YOU ARE ALLOCATED TO &DSN. <---<<
|
||||||
|
EXIT CODE(0)
|
||||||
|
END
|
||||||
|
NIX: -
|
||||||
|
SET I = &I. + 1
|
||||||
|
END
|
||||||
|
IF INFORM = &INFORM THEN -
|
||||||
|
WRITE GOTDSN -- YOU ARE NOT ALLOCATED TO &DSN.
|
||||||
|
EXIT CODE(4)
|
3
src/CMDPROC/HELLO2.CLIST
Normal file
3
src/CMDPROC/HELLO2.CLIST
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
WRITE HELLO, FROM CLIST IN CMDPROC!
|
||||||
|
WRITE &SYSSMFID
|
||||||
|
EXIT
|
161
src/EXEC/ADDCMDS.REX
Normal file
161
src/EXEC/ADDCMDS.REX
Normal file
@ -0,0 +1,161 @@
|
|||||||
|
/* REXX ADDCMDS Add one command table to the currently-resident
|
||||||
|
copy of ISPCMDS. The user's personal command
|
||||||
|
table may thus be dynamically spliced to ISPCMDS.
|
||||||
|
Changes to the user's personal command table may
|
||||||
|
be implemented at any time by re-running this.
|
||||||
|
|
||||||
|
Written by Frank Clarke in the Dark Ages
|
||||||
|
|
||||||
|
Impact Analysis
|
||||||
|
. SYSPROC TRAPOUT
|
||||||
|
|
||||||
|
Modification History
|
||||||
|
19981027 fxc REXXSKEL at last, v.19980225;
|
||||||
|
19991117 fxc upgrade from v.19980225 to v.19991109;
|
||||||
|
|
||||||
|
*/ arg argline
|
||||||
|
address ISPEXEC /* REXXSKEL ver.19991109 */
|
||||||
|
arg parms "((" opts
|
||||||
|
|
||||||
|
signal on syntax
|
||||||
|
signal on novalue
|
||||||
|
|
||||||
|
call TOOLKIT_INIT /* conventional start-up -*/
|
||||||
|
rc = trace(tv)
|
||||||
|
info = parms /* to enable parsing */
|
||||||
|
|
||||||
|
"CONTROL ERRORS RETURN" /* I'll handle my own errors */
|
||||||
|
call A_INIT /* -*/
|
||||||
|
call B_TABLE_OPS /* -*/
|
||||||
|
|
||||||
|
exit /*@ ADDCMDS */
|
||||||
|
/*
|
||||||
|
. ----------------------------------------------------------------- */
|
||||||
|
A_INIT: /*@ */
|
||||||
|
if branch then call BRANCH
|
||||||
|
address ISPEXEC
|
||||||
|
|
||||||
|
parse value "0 0" with,
|
||||||
|
adds dels del_list
|
||||||
|
parse value info exec_name with,
|
||||||
|
tblname .
|
||||||
|
if tblname = "ADDCMDS" then tblname = "TMPCMDS"
|
||||||
|
if Length(tblname) < 5 then tblname = tblname"CMDS"
|
||||||
|
if monitor then say,
|
||||||
|
"Using" tblname
|
||||||
|
|
||||||
|
return /*@ A_INIT */
|
||||||
|
/*
|
||||||
|
. ----------------------------------------------------------------- */
|
||||||
|
B_TABLE_OPS: /*@ */
|
||||||
|
if branch then call BRANCH
|
||||||
|
address ISPEXEC
|
||||||
|
|
||||||
|
"TBQUERY" tblname /* tell me about this table */
|
||||||
|
if rc > 12 then do /* doesn't exist, maybe ? */
|
||||||
|
zerrsm = "TBQUERY error"
|
||||||
|
if Symbol("zerrlm") = "LIT" then,
|
||||||
|
zerrlm = "No additional diagnostics produced."
|
||||||
|
zerrlm = exec_name "("BRANCH("ID")")",
|
||||||
|
zerrlm
|
||||||
|
address ISPEXEC "SETMSG MSG(ISRZ002)"
|
||||||
|
sw.0error_found = "1"; return
|
||||||
|
drop zerrlm /* make it a LIT again */
|
||||||
|
end
|
||||||
|
|
||||||
|
if rc = 12 then "TBOPEN" tblname "NOWRITE" /* 12 = 'not open' */
|
||||||
|
|
||||||
|
"TBSORT" tblname "FIELDS(ZCTVERB,C,D)"
|
||||||
|
do forever /* for every row in the table */
|
||||||
|
"TBSKIP" tblname /* get next row */
|
||||||
|
if rc > 0 then leave
|
||||||
|
if monitor then say,
|
||||||
|
" Working" zctverb
|
||||||
|
do forever /* found a match on ISPCMDS */
|
||||||
|
"TBSCAN ISPCMDS NOREAD ARGLIST(ZCTVERB) CONDLIST(EQ)"
|
||||||
|
if rc > 0 then leave
|
||||||
|
if monitor then say,
|
||||||
|
" Delete from ISPCMDS"
|
||||||
|
"TBDELETE ISPCMDS" /* get rid of it */
|
||||||
|
del_list = del_list zctverb /* make note of it */
|
||||||
|
dels = dels + 1 /* count a deleted row */
|
||||||
|
end /* forever (inner) */
|
||||||
|
"TBADD ISPCMDS" /* ... add a new line */
|
||||||
|
adds = adds + 1 /* count an added row */
|
||||||
|
"TBTOP ISPCMDS" /* reposition to row 0 */
|
||||||
|
end /* forever (outer) */
|
||||||
|
|
||||||
|
"TBEND " tblname /* close and end */
|
||||||
|
|
||||||
|
if sw.0show then do /* user asked for a list */
|
||||||
|
"TBTOP ISPCMDS" /* reset to top */
|
||||||
|
do forever
|
||||||
|
"TBSKIP ISPCMDS" /* get another row */
|
||||||
|
if rc > 0 then leave /* end of table */
|
||||||
|
say Left(zctverb,8) Right(zcttrunc,2) Left(zctact,66)
|
||||||
|
say " " Left(zctdesc,72)
|
||||||
|
end /* forever */
|
||||||
|
end /* SHOW */
|
||||||
|
|
||||||
|
ZERRSM = "A="adds "D="dels /* short message */
|
||||||
|
ZERRLM = adds "lines were added;" dels "lines deleted."
|
||||||
|
if dels <> 0 & ABS(adds-dels) > 1 then do
|
||||||
|
ZERRSM = ZERRSM "(!)"
|
||||||
|
ZERRLM = ZERRLM "Deleted verbs:" del_list
|
||||||
|
ZERRALRM = "YES"
|
||||||
|
end
|
||||||
|
else ZERRALRM = "NO"
|
||||||
|
address ISPEXEC "SETMSG MSG(ISRZ002)"
|
||||||
|
|
||||||
|
return /*@ B_TABLE_OPS */
|
||||||
|
/*
|
||||||
|
. ----------------------------------------------------------------- */
|
||||||
|
LOCAL_PREINIT: /*@ customize opts */
|
||||||
|
address TSO
|
||||||
|
|
||||||
|
sw.0show = SWITCH("SHOW") /* user asked for a list ? */
|
||||||
|
|
||||||
|
return /*@ LOCAL_PREINIT */
|
||||||
|
/*
|
||||||
|
. ----------------------------------------------------------------- */
|
||||||
|
HELP: /*@ */
|
||||||
|
address TSO;"CLEAR"
|
||||||
|
if helpmsg <> "" then do ; say helpmsg; say ""; end
|
||||||
|
ex_nam = Left(exec_name,8) /* predictable size */
|
||||||
|
say " "ex_nam" adds a user-command-table to the in-storage copy "
|
||||||
|
say " of ISPCMDS. Any existing command-table entries "
|
||||||
|
say " with matching names are deleted before the new "
|
||||||
|
say " commands are added. "
|
||||||
|
say " "
|
||||||
|
say " Syntax: "ex_nam" [cmd-tbl-name] (Defaults)"
|
||||||
|
say " (( [SHOW] "
|
||||||
|
say " "
|
||||||
|
say " "
|
||||||
|
say " If cmd-tbl-name is not specified, the name defaults "
|
||||||
|
say " to 'TMPCMDS' for execname=ADDCMDS, and to the name of"
|
||||||
|
say " the routine for any aliases. "
|
||||||
|
pull
|
||||||
|
"CLEAR"
|
||||||
|
say " Debugging tools provided include:"
|
||||||
|
say " "
|
||||||
|
say " MONITOR: displays key information throughout processing."
|
||||||
|
say " Displays most paragraph names upon entry."
|
||||||
|
say " "
|
||||||
|
say " NOUPDT: by-pass all update logic."
|
||||||
|
say " "
|
||||||
|
say " BRANCH: show all paragraph entries."
|
||||||
|
say " "
|
||||||
|
say " TRACE tv: will use value following TRACE to place"
|
||||||
|
say " the execution in REXX TRACE Mode."
|
||||||
|
say " "
|
||||||
|
say " "
|
||||||
|
say " Debugging tools can be accessed in the following manner:"
|
||||||
|
say " "
|
||||||
|
say " TSO" exec_name" parameters (( debug-options"
|
||||||
|
say " "
|
||||||
|
say " For example:"
|
||||||
|
say " "
|
||||||
|
say " TSO" exec_name " (( MONITOR TRACE ?R"
|
||||||
|
address ISPEXEC "CONTROL DISPLAY REFRESH"
|
||||||
|
exit /*@ HELP */
|
||||||
|
/****** REXXSKEL back-end removed to save space. *******/
|
389
src/EXEC/ALISTER.REX
Normal file
389
src/EXEC/ALISTER.REX
Normal file
@ -0,0 +1,389 @@
|
|||||||
|
/* REXX ALIST Display the user's current allocations
|
||||||
|
|
||||||
|
Written by Frank Clarke, Oldsmar, FL
|
||||||
|
|**-***-***-***-***-***-***-***-***-***-***-***-***-***-***-***-**|
|
||||||
|
| |
|
||||||
|
| WARNING: EMBEDDED COMPONENTS. |
|
||||||
|
| |
|
||||||
|
|**-***-***-***-***-***-***-***-***-***-***-***-***-***-***-***-**|
|
||||||
|
*/
|
||||||
|
address TSO /* default address */
|
||||||
|
tv = ""
|
||||||
|
signal on syntax
|
||||||
|
parse source sys_id how_invokt exec_name DD_nm DS_nm as_invokt cmd_env,
|
||||||
|
addr_spc usr_tokn
|
||||||
|
if ds_nm <> "?" then do /* explicit invocation */
|
||||||
|
say exec_name "cannot be invoked explicitly."
|
||||||
|
say " "
|
||||||
|
say " It must be part of your SYSPROC or SYSEXEC allocation,"
|
||||||
|
say " and invoked implicitly because it requires ISPF facilities"
|
||||||
|
say " and these are incompatible with a command library which is"
|
||||||
|
say " not part of your defined environment."
|
||||||
|
say " "
|
||||||
|
exit
|
||||||
|
end
|
||||||
|
if Sysvar("sysispf") = "NOT ACTIVE" then do
|
||||||
|
arg line
|
||||||
|
line = line "(( RESTARTED" /* tell the next invocation */
|
||||||
|
"ISPSTART CMD("exec_name line")" /* Invoke ISPF if nec. */
|
||||||
|
exit /* ...and restart it */
|
||||||
|
end
|
||||||
|
|
||||||
|
arg target "((" opts
|
||||||
|
opts = Strip( opts , "T" , ")" ) /* clip trailing paren */
|
||||||
|
if Word(target,1) = "?" then call HELP /* ...and don't come back */
|
||||||
|
|
||||||
|
parse var opts "TRACE" tv .
|
||||||
|
parse value tv "O" with tv .
|
||||||
|
rc = Trace(tv)
|
||||||
|
address ISPEXEC /* default address for ISPF */
|
||||||
|
"CONTROL ERRORS RETURN"
|
||||||
|
|
||||||
|
call A_INIT /* -*/
|
||||||
|
call B_GET_ALLOCATIONS /* -*/
|
||||||
|
call C_LOAD_TABLE /* -*/
|
||||||
|
call D_TABLE_OPS /* -*/
|
||||||
|
call E_REDO_ALLOC /* -*/
|
||||||
|
|
||||||
|
exit /*@ ALIST */
|
||||||
|
/*
|
||||||
|
. ----------------------------------------------------------------- */
|
||||||
|
A_INIT: /*@ */
|
||||||
|
address TSO
|
||||||
|
|
||||||
|
restarted = WordPos("RESTARTED",opts)>0/* called from READY-mode ? */
|
||||||
|
parse value "0 ISR00000 YES" with,
|
||||||
|
got_one zerrhm zerralrm zerrsm zerrlm
|
||||||
|
t_nam = "T"Right(Time(s),5,0) /* T32855 maybe #*/
|
||||||
|
|
||||||
|
parse value "?" with,
|
||||||
|
ddname dsnames. disp. tk_globalvars ,
|
||||||
|
ddlist ,
|
||||||
|
.
|
||||||
|
|
||||||
|
return /*@ A_INIT */
|
||||||
|
/*
|
||||||
|
. ----------------------------------------------------------------- */
|
||||||
|
B_GET_ALLOCATIONS: /*@ */
|
||||||
|
address TSO
|
||||||
|
|
||||||
|
tgt_list = ""
|
||||||
|
|
||||||
|
do ii = 1 to Words(target) /* for every target spec */
|
||||||
|
this_tgt = Word(target,ii)
|
||||||
|
if this_tgt = "ISPF" then, /* expand ISPF */
|
||||||
|
tgt_list = tgt_list "ISPPLIB ISPMLIB ISPSLIB ISPTLIB",
|
||||||
|
"ISPTABL ISPLLIB ISPPROF"
|
||||||
|
else,
|
||||||
|
if this_tgt = "CMDS" |, /* expand CMDS */
|
||||||
|
this_tgt = "COMMANDS" then,
|
||||||
|
call BA_Q_ALTLIB /* -*/
|
||||||
|
/* tgt_list = tgt_list "SYSPROC SYSEXEC" */
|
||||||
|
else, /* just add to the list */
|
||||||
|
tgt_list = tgt_list this_tgt
|
||||||
|
end /* ii */
|
||||||
|
|
||||||
|
ln. = "" /* setup array */
|
||||||
|
rc = Outtrap("ln.") /* open trap */
|
||||||
|
"LISTA ST"
|
||||||
|
rc = Outtrap("off") /* close trap */
|
||||||
|
call BB_GET_STACKS /* -*/
|
||||||
|
|
||||||
|
dds_to_realloc = ""
|
||||||
|
ds_stack. = ""
|
||||||
|
redo_alloc = "0"
|
||||||
|
|
||||||
|
return /*@ B_GET_ALLOCATIONS */
|
||||||
|
/*
|
||||||
|
. ----------------------------------------------------------------- */
|
||||||
|
BA_Q_ALTLIB: /*@ */
|
||||||
|
address TSO
|
||||||
|
|
||||||
|
$x = Outtrap("alt.") /* set up outtrap */
|
||||||
|
"ALTLIB DISPLAY" /* get ddname-list */
|
||||||
|
$x = Outtrap("OFF") /* release trap */
|
||||||
|
|
||||||
|
do bax = 1 to alt.0
|
||||||
|
parse var alt.bax "DDNAME=" baxddn .
|
||||||
|
tgt_list = tgt_list baxddn
|
||||||
|
end /* bax */
|
||||||
|
|
||||||
|
return /*@ BA_Q_ALTLIB */
|
||||||
|
/*
|
||||||
|
Build lists of DSNames by DDName and store in a stem array indexed
|
||||||
|
by DDName.
|
||||||
|
. ----------------------------------------------------------------- */
|
||||||
|
BB_GET_STACKS: /*@ */
|
||||||
|
address TSO
|
||||||
|
/* Build DDName stack */
|
||||||
|
do bbx = 1 to ln.0, /* for each trapped line */
|
||||||
|
until Substr(ln.bbx,1,1) <> "-" /* ...skip the header */
|
||||||
|
end /* bbx */
|
||||||
|
|
||||||
|
start = bbx
|
||||||
|
do bbx = start to ln.0 /* for each trapped line */
|
||||||
|
if Left(ln.bbx,1) = ' ' then do /* it's a DDname */
|
||||||
|
if Substr(ln.bbx,3,1) <> " " then do /* new DDName */
|
||||||
|
parse var ln.bbx ddname disp .
|
||||||
|
ddlist = ddlist ddname
|
||||||
|
end /* DDName */
|
||||||
|
dsnames.ddname = dsnames.ddname dsname
|
||||||
|
disp.ddname = disp
|
||||||
|
end /* DDname */
|
||||||
|
else dsname = Word(ln.bbx,1) /* it's a DSName */
|
||||||
|
end /* bbx */
|
||||||
|
|
||||||
|
return /*@ BB_GET_STACKS */
|
||||||
|
/*
|
||||||
|
. ----------------------------------------------------------------- */
|
||||||
|
C_LOAD_TABLE: /*@ */
|
||||||
|
address ISPEXEC
|
||||||
|
|
||||||
|
if tgt_list = "" then tgt_list = ddlist
|
||||||
|
|
||||||
|
"TBCREATE " t_nam " NAMES(DDNAME DSNAME DISP) NOWRITE"
|
||||||
|
disp = "?"
|
||||||
|
|
||||||
|
do Words(tgt_list) /* every DDName */
|
||||||
|
parse var tgt_list ddname tgt_list
|
||||||
|
ds_stack.ddname = dsnames.ddname
|
||||||
|
disp = disp.ddname
|
||||||
|
do Words(dsnames.ddname)
|
||||||
|
parse var dsnames.ddname dsname dsnames.ddname
|
||||||
|
"TBADD" t_nam /* add to table #*/
|
||||||
|
got_one = "1"
|
||||||
|
end /* dsnames */
|
||||||
|
end /* Words(tgt_list) */
|
||||||
|
|
||||||
|
return /*@ C_LOAD_TABLE */
|
||||||
|
/*
|
||||||
|
. ----------------------------------------------------------------- */
|
||||||
|
D_TABLE_OPS: /*@ */
|
||||||
|
address ISPEXEC
|
||||||
|
|
||||||
|
if got_one then do
|
||||||
|
call DEIMBED /* expose the panel -*/
|
||||||
|
$ddn = $ddn.PLIB
|
||||||
|
"LIBDEF ISPPLIB LIBRARY ID("$ddn") STACK"
|
||||||
|
|
||||||
|
"TBTOP" t_nam /* */
|
||||||
|
"CONTROL DISPLAY SAVE" /* In case of re-invocation */
|
||||||
|
do forever
|
||||||
|
"TBDISPL" t_nam "PANEL(FCALLOC) CURSOR(ACTION) AUTOSEL(NO)"
|
||||||
|
if rc > 4 then leave
|
||||||
|
do ztdsels
|
||||||
|
curact = Translate(action)
|
||||||
|
"CONTROL DISPLAY SAVE"
|
||||||
|
select
|
||||||
|
when curact = "E" then do /* Edit */
|
||||||
|
"EDIT DATASET('"dsname"')"
|
||||||
|
save_rc = rc
|
||||||
|
end /* Edit */
|
||||||
|
when curact = "V" then do /* View */
|
||||||
|
"VIEW DATASET('"dsname"') CONFIRM(NO)"
|
||||||
|
save_rc = rc
|
||||||
|
end /* View */
|
||||||
|
when curact = "B" then do /* Browse */
|
||||||
|
"BROWSE DATASET('"dsname"')"
|
||||||
|
save_rc = rc
|
||||||
|
end /* Browse */
|
||||||
|
when curact = "D" then do /* DUP */
|
||||||
|
address TSO "DUP '"dsname"' ID"
|
||||||
|
save_rc = rc
|
||||||
|
if rc <> 0 then do
|
||||||
|
ZERRSM = "RC ="rc
|
||||||
|
ZERRLM = "DUP ended abnormally"
|
||||||
|
end
|
||||||
|
end /* CLONE */
|
||||||
|
when curact = "F" then do /* Free */
|
||||||
|
redo_alloc = "1"
|
||||||
|
if WordPos(ddname,dds_to_realloc) = 0 then,/* new DDName */
|
||||||
|
dds_to_realloc = dds_to_realloc ddname
|
||||||
|
dsid = WordPos(dsname,ds_stack.ddname) /* in the list ? */
|
||||||
|
if dsid > 0 then,
|
||||||
|
ds_stack.ddname = DelWord(ds_stack.ddname,dsid,1)
|
||||||
|
end /* Free */
|
||||||
|
when curact = "X" then do /* UnDisplay */
|
||||||
|
"TBDELETE" t_nam /* drop this row */
|
||||||
|
end /* UnDisplay */
|
||||||
|
otherwise nop
|
||||||
|
end /* Select */
|
||||||
|
"CONTROL DISPLAY RESTORE"
|
||||||
|
if save_rc <> 0 then,
|
||||||
|
"SETMSG MSG(ISRZ002)"
|
||||||
|
save_rc = 0
|
||||||
|
if ztdsels = 1 then, /* never do the last one */
|
||||||
|
ztdsels = 0
|
||||||
|
else "TBDISPL" t_nam /* next row #*/
|
||||||
|
end /* ztdsels */
|
||||||
|
action = "" /* clear for re-display */
|
||||||
|
end /* forever */
|
||||||
|
"CONTROL DISPLAY RESTORE" /* In case of re-invocation */
|
||||||
|
|
||||||
|
"LIBDEF ISPPLIB"
|
||||||
|
"TBCLOSE" t_nam
|
||||||
|
address TSO "FREE FI("$ddn")"
|
||||||
|
end /* got_one */
|
||||||
|
else do
|
||||||
|
"TBEND" t_nam /* #*/
|
||||||
|
ZERRSM = "No datasets" /* short message */
|
||||||
|
ZERRLM = "No datasets were allocated as specified/implied."
|
||||||
|
"SETMSG MSG(ISRZ002)"
|
||||||
|
end
|
||||||
|
|
||||||
|
return /*@ D_TABLE_OPS */
|
||||||
|
/*
|
||||||
|
. ----------------------------------------------------------------- */
|
||||||
|
E_REDO_ALLOC: /*@ */
|
||||||
|
address TSO /* ready for some TSO work */
|
||||||
|
|
||||||
|
if redo_alloc then do
|
||||||
|
do fidx = 1 to Words(dds_to_realloc)/* for each DDName */
|
||||||
|
ddname = Word(dds_to_realloc,fidx) /* grab it */
|
||||||
|
alloc_list = "" /* initialize */
|
||||||
|
|
||||||
|
if Words(ds_stack.ddname) > 0 then,
|
||||||
|
do didx = 1 to Words(ds_stack.ddname) /* for each DSName */
|
||||||
|
alloc_list = alloc_list "'"Word(ds_stack.ddname,didx)"'"
|
||||||
|
end
|
||||||
|
|
||||||
|
if alloc_list <> "" then, /* re-ALLOC */
|
||||||
|
"ALLOC FI("ddname") DA("alloc_list") SHR REU"
|
||||||
|
else "FREE FI("ddname")"
|
||||||
|
end /* fidx */
|
||||||
|
end /* redo_alloc */
|
||||||
|
|
||||||
|
return /*@ E_REDO_ALLOC */
|
||||||
|
/*
|
||||||
|
. ----------------------------------------------------------------- */
|
||||||
|
HELP: /*@ */
|
||||||
|
address TSO "CLEAR"
|
||||||
|
say " "
|
||||||
|
say " ALIST displays a scrollable list of allocated datasets."
|
||||||
|
say " The list may be limited to specific DDNames or "
|
||||||
|
say " specific sets of DDNames. "
|
||||||
|
say " "
|
||||||
|
say " Syntax: ALIST [ddname-list] [CMDS] [ISPF] "
|
||||||
|
say " [ ? ] "
|
||||||
|
say " "
|
||||||
|
say " [ddname-list] is a blank-delimited list of filenames "
|
||||||
|
say " to be displayed. "
|
||||||
|
say " [CMDS] is equivalent to 'SYSPROC SYSEXEC' "
|
||||||
|
say " [ISPF] is equivalent to 'ISPPLIB ISPMLIB ISPSLIB "
|
||||||
|
say " ISPTLIB ISPLLIB ISPPROF ISPTABL' "
|
||||||
|
say " "
|
||||||
|
say " ALIST may be invoked from READY-mode. "
|
||||||
|
say " "
|
||||||
|
exit /*@ HELP */
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------- */
|
||||||
|
SYNTAX: /*@ */
|
||||||
|
errormsg = "REXX error" rc "in line" sigl":" errortext(rc)
|
||||||
|
say errormsg
|
||||||
|
say sourceline(sigl)
|
||||||
|
trace "?r"
|
||||||
|
nop
|
||||||
|
exit /*@ SYNTAX */
|
||||||
|
/*
|
||||||
|
Parse out the embedded components at the back of the source code.
|
||||||
|
. ----------------------------------------------------------------- */
|
||||||
|
DEIMBED: Procedure expose, /*@ */
|
||||||
|
(tk_globalvars) ddnlist $ddn. daid.
|
||||||
|
|
||||||
|
address TSO
|
||||||
|
|
||||||
|
fb80po.0 = "NEW UNIT(VIO) SPACE(5 5) TRACKS DIR(40)",
|
||||||
|
"RECFM(F B) LRECL(80) BLKSIZE(0)"
|
||||||
|
parse value "" with ddnlist $ddn. daid.
|
||||||
|
|
||||||
|
lastln = sourceline()
|
||||||
|
currln = lastln /* */
|
||||||
|
if Left(sourceline(currln),2) <> "*/" then return
|
||||||
|
|
||||||
|
currln = currln - 1 /* previous line */
|
||||||
|
"NEWSTACK"
|
||||||
|
do while sourceline(currln) <> "/*"
|
||||||
|
text = sourceline(currln) /* save with a short name ! */
|
||||||
|
if Left(text,3) = ")))" then do /* package the queue */
|
||||||
|
parse var text ")))" ddn mbr . /* PLIB PANL001 maybe */
|
||||||
|
if Pos(ddn,ddnlist) = 0 then do /* doesn't exist */
|
||||||
|
ddnlist = ddnlist ddn /* keep track */
|
||||||
|
$ddn = ddn || Random(999)
|
||||||
|
$ddn.ddn = $ddn
|
||||||
|
"ALLOC FI("$ddn")" fb80po.0
|
||||||
|
address ISPEXEC "LMINIT DATAID(DAID) DDNAME("$ddn")"
|
||||||
|
daid.ddn = daid
|
||||||
|
end
|
||||||
|
daid = daid.ddn
|
||||||
|
address ISPEXEC "LMOPEN DATAID("daid") OPTION(OUTPUT)"
|
||||||
|
do queued()
|
||||||
|
parse pull line
|
||||||
|
address ISPEXEC "LMPUT DATAID("daid") MODE(INVAR)",
|
||||||
|
"DATALOC(LINE) DATALEN(80)"
|
||||||
|
end
|
||||||
|
address ISPEXEC "LMMADD DATAID("daid") MEMBER("mbr")"
|
||||||
|
address ISPEXEC "LMCLOSE DATAID("daid")"
|
||||||
|
end /* package the queue */
|
||||||
|
else push text /* onto the top of the stack */
|
||||||
|
currln = currln - 1 /* previous line */
|
||||||
|
end /* while */
|
||||||
|
"DELSTACK"
|
||||||
|
|
||||||
|
return /*@ DEIMBED */
|
||||||
|
/*
|
||||||
|
)))PLIB FCALLOC
|
||||||
|
)ATTR
|
||||||
|
% TYPE(TEXT) INTENS(HIGH) SKIP(ON)
|
||||||
|
+ TYPE(TEXT) INTENS(LOW) SKIP(ON)
|
||||||
|
_ TYPE(INPUT) INTENS(HIGH)
|
||||||
|
! TYPE(OUTPUT) INTENS(HIGH) SKIP(ON)
|
||||||
|
)BODY EXPAND(||)
|
||||||
|
%|-| Current Allocations |-|
|
||||||
|
%COMMAND ===>_ZCMD
|
||||||
|
%SCROLL ===>_AMT +
|
||||||
|
+
|
||||||
|
+ DDName DSName Disp
|
||||||
|
)MODEL
|
||||||
|
_Z+ !DDNAME + !DSNAME + !DISP +
|
||||||
|
)INIT
|
||||||
|
.ZVARS = '(ACTION)'
|
||||||
|
.HELP = FCALLOCH
|
||||||
|
)REINIT
|
||||||
|
IF (&MSG = ' ')
|
||||||
|
&ACTION = ' '
|
||||||
|
REFRESH (&ACTION)
|
||||||
|
)END
|
||||||
|
)))PLIB FCALLOCH
|
||||||
|
)ATTR
|
||||||
|
% TYPE(TEXT) INTENS(HIGH) SKIP(ON)
|
||||||
|
+ TYPE(TEXT) INTENS(LOW) SKIP(ON)
|
||||||
|
_ TYPE(INPUT) INTENS(HIGH)
|
||||||
|
! TYPE(OUTPUT) INTENS(HIGH) SKIP(ON)
|
||||||
|
@ TYPE(OUTPUT) INTENS(LOW) SKIP(ON)
|
||||||
|
)BODY EXPAND(��)
|
||||||
|
%TUTORIAL �-� Current Allocations �-� TUTORIAL
|
||||||
|
%Next Selection ===>_ZCMD
|
||||||
|
|
||||||
|
+
|
||||||
|
Panel FCALLOC shows the current allocations for the DDNames you specified
|
||||||
|
(or ALL DDNames).
|
||||||
|
|
||||||
|
For each shown dataset you may select among several actions:
|
||||||
|
|
||||||
|
%B+-%BROWSE +Browse the selected dataset.
|
||||||
|
|
||||||
|
%E+-%EDIT +Edit the selected dataset.
|
||||||
|
|
||||||
|
%V+-%VIEW +View the selected dataset.
|
||||||
|
|
||||||
|
%D+-%DUP +You may make a copy (either filled or empty) of the
|
||||||
|
selected dataset. Subroutine DUP will be called to
|
||||||
|
perform this function.
|
||||||
|
|
||||||
|
%F+-%FREE +This is effective only for DDNames which are not under
|
||||||
|
the control of ISPF since those files are necessarily
|
||||||
|
OPEN while ISPF is active.
|
||||||
|
|
||||||
|
)PROC
|
||||||
|
)END
|
||||||
|
*/
|
213
src/EXEC/BLOXX.REX
Normal file
213
src/EXEC/BLOXX.REX
Normal file
@ -0,0 +1,213 @@
|
|||||||
|
/* REXX BLOX create block letters from an input string.
|
||||||
|
for each of eight lines
|
||||||
|
for each letter in string
|
||||||
|
get pattern for letter
|
||||||
|
get sub-pattern for this line
|
||||||
|
build slug
|
||||||
|
attach to line
|
||||||
|
write the line
|
||||||
|
|
||||||
|
Written by Frank Clarke, Oldsmar, FL
|
||||||
|
|
||||||
|
*/
|
||||||
|
address TSO
|
||||||
|
signal on syntax
|
||||||
|
|
||||||
|
tv="" ; odsn="" /* ensure values */
|
||||||
|
sav = ""
|
||||||
|
parse upper arg instr "((" parms /* get parameters */
|
||||||
|
if instr="" & parms="" then call HELP /* no parms at all */
|
||||||
|
parms = Strip(parms,T,")") /* clip trailing paren */
|
||||||
|
|
||||||
|
parse value KEYWD("TRACE") "O" with tv .
|
||||||
|
odsn = KEYWD("OUTPUT") /* output to file ? */
|
||||||
|
if Pos("(",odsn) > 0 then, /* has a left banana */
|
||||||
|
if Pos(")",odsn) = 0 then, /* but no right banana */
|
||||||
|
odsn = Space(odsn")",0) /* add one */
|
||||||
|
|
||||||
|
prompt = \SWITCH("NOPROMPT")
|
||||||
|
diagnose = SWITCH("DIAGNOSE")
|
||||||
|
instr = Strip(instr) /* clean the input */
|
||||||
|
rc = Trace(tv)
|
||||||
|
|
||||||
|
if odsn <> "" then do /* was a value */
|
||||||
|
"ALLOC FI(BLOXDD) DA("odsn") SHR REU"
|
||||||
|
if rc > 0 then do /* doesn't exist ? */
|
||||||
|
"ALLOC FI(BLOXDD) DA("odsn") NEW REU SPACE(1) TRACKS",
|
||||||
|
" RECFM(V B) LRECL(121) BLKSIZE(1210) UNIT(SYSDA)"
|
||||||
|
if rc > 0 then do /* ...and couldn't create it! */
|
||||||
|
say "Allocation failed for "odsn"."
|
||||||
|
exit
|
||||||
|
end /* alloc NEW */
|
||||||
|
end /* alloc SHR */
|
||||||
|
end /* alloc dataset */
|
||||||
|
else "ALLOC FI(BLOXDD) DA(*) SHR REU" /* to the terminal */
|
||||||
|
|
||||||
|
call SET_PATN /* -*/
|
||||||
|
if tv = "O" then "CLEAR" /* clear screen */
|
||||||
|
|
||||||
|
if instr = "" then do /* no input ? */
|
||||||
|
say ":" /* initial prompt */
|
||||||
|
"NEWSTACK"
|
||||||
|
pull instr
|
||||||
|
"DELSTACK"
|
||||||
|
end
|
||||||
|
|
||||||
|
do forever
|
||||||
|
do while instr <> ""
|
||||||
|
if length(instr) > 8 then do /* too long */
|
||||||
|
parse var instr instr 9 sav /* save the excess */
|
||||||
|
end
|
||||||
|
|
||||||
|
do i = 1 to 7 /* for 7 lines */
|
||||||
|
outline="" /* clear it */
|
||||||
|
do j = 1 to Length(instr) /* for each letter */
|
||||||
|
ltr = Substr(instr,j,1) /* isolate it */
|
||||||
|
ltrpos = Pos(ltr,choices) /* where in the array ? */
|
||||||
|
if ltrpos = 0 then ltrpos = 47 /* set to blank */
|
||||||
|
byte = Substr(patn.ltrpos,i*2-1,2)
|
||||||
|
if diagnose then say ltr byte X2B(byte)
|
||||||
|
slug = X2B(byte) /* character-to-binary */
|
||||||
|
slug = Translate(slug," ","0") /* off -> blank */
|
||||||
|
slug = Translate(slug,ltr,"1") /* on -> letter */
|
||||||
|
outline = outline slug /* splice to the line */
|
||||||
|
end /* j for length(instr) */
|
||||||
|
queue outline /* into the queue */
|
||||||
|
end /* i for 7 lines */
|
||||||
|
instr = ""
|
||||||
|
queue " " /* blank line */
|
||||||
|
queue " " /* blank line */
|
||||||
|
|
||||||
|
rc = Trace("O")
|
||||||
|
rc = Trace(tv)
|
||||||
|
if sav <> "" then do /* was there excess ? */
|
||||||
|
instr = sav /* restore it */
|
||||||
|
sav = "" /* indicate "no excess" */
|
||||||
|
end
|
||||||
|
end /* while instr filled */
|
||||||
|
|
||||||
|
if prompt then,
|
||||||
|
if instr = "" then do /* no more input ? */
|
||||||
|
say ":" /* prompt for more */
|
||||||
|
"NEWSTACK"
|
||||||
|
pull instr
|
||||||
|
"DELSTACK"
|
||||||
|
end
|
||||||
|
if instr = "" then leave /* prompt was refused */
|
||||||
|
end /* forever */
|
||||||
|
|
||||||
|
rc = Trace("O") ; rc = Trace(tv)
|
||||||
|
"EXECIO" queued() "DISKW BLOXDD (FINIS" /* flush to output */
|
||||||
|
"FREE FI(BLOXDD)"
|
||||||
|
|
||||||
|
exit
|
||||||
|
/*
|
||||||
|
. ----------------------------------------------------------------- */
|
||||||
|
SET_PATN: /*@ */
|
||||||
|
patn. = "" /* storage for patterns */
|
||||||
|
patn.1 = "081422417F4141" /* A */
|
||||||
|
patn.2 = "7E41417E41417E" /* B */
|
||||||
|
patn.3 = "3E41404040413E" /* C */
|
||||||
|
patn.4 = "7C42414141427C" /* D */
|
||||||
|
patn.5 = "7F40407C40407F" /* E */
|
||||||
|
patn.6 = "7F40407C404040" /* F */
|
||||||
|
patn.7 = "7E41404047417E" /* G */
|
||||||
|
patn.8 = "4141417F414141" /* H */
|
||||||
|
patn.9 = "1C08080808081C" /* I */
|
||||||
|
patn.10 = "7F02020202423C" /* J */
|
||||||
|
patn.11 = "41424478444241" /* K */
|
||||||
|
patn.12 = "4040404040407F" /* L */
|
||||||
|
patn.13 = "41635549414141" /* M */
|
||||||
|
patn.14 = "41615149454341" /* N */
|
||||||
|
patn.15 = "3E41414141413E" /* O */
|
||||||
|
patn.16 = "7E41417E404040" /* P */
|
||||||
|
patn.17 = "3E41414145423D" /* Q */
|
||||||
|
patn.18 = "7E41417E444241" /* R */
|
||||||
|
patn.19 = "3E41403E01413E" /* S */
|
||||||
|
patn.20 = "7F080808080808" /* T */
|
||||||
|
patn.21 = "4141414141413E" /* U */
|
||||||
|
patn.22 = "41414141221408" /* V */
|
||||||
|
patn.23 = "41414141494936" /* W */
|
||||||
|
patn.24 = "41221408142241" /* X */
|
||||||
|
patn.25 = "41221408080808" /* Y */
|
||||||
|
patn.26 = "7F02040810207F" /* Z */
|
||||||
|
patn.27 = "3E43454951613E" /* 0 */
|
||||||
|
patn.28 = "0818080808083E" /* 1 */
|
||||||
|
patn.29 = "3E41020408103E" /* 2 */
|
||||||
|
patn.30 = "7F020C0201413E" /* 3 */
|
||||||
|
patn.31 = "2040487F080808" /* 4 */
|
||||||
|
patn.32 = "7F40407E01017E" /* 5 */
|
||||||
|
patn.33 = "0408103E41413E" /* 6 */
|
||||||
|
patn.34 = "7F020408080808" /* 7 */
|
||||||
|
patn.35 = "3E41413E41413E" /* 8 */
|
||||||
|
patn.36 = "3E41413E040810" /* 9 */
|
||||||
|
patn.37 = "22227F227F2222" /* # */
|
||||||
|
patn.38 = "143E403E013E14" /* $ */
|
||||||
|
patn.39 = "21522408122542" /* % */
|
||||||
|
patn.40 = "0018241825423D" /* & */
|
||||||
|
patn.41 = "0022143E142200" /* * */
|
||||||
|
patn.42 = "04081010100804" /* ( */
|
||||||
|
patn.43 = "10080404040810" /* ) */
|
||||||
|
patn.44 = "0000003E000000" /* - */
|
||||||
|
patn.45 = "00181800181800" /* : */
|
||||||
|
patn.46 = "00000000000000" /*blank */
|
||||||
|
patn.47 = "00181800181808" /* ; */
|
||||||
|
patn.48 = "3E410104080008" /* ? */
|
||||||
|
choices ="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789#$%&*()-: ;?"
|
||||||
|
return /*@ SET_PATN */
|
||||||
|
/*
|
||||||
|
. ----------------------------------------------------------------- */
|
||||||
|
HELP: /*@ */
|
||||||
|
"CLEAR" /* clear screen */
|
||||||
|
say " "
|
||||||
|
say " BLOX is a REXX routine which will build 8x7 block letters "
|
||||||
|
say " from text you specify. "
|
||||||
|
say " "
|
||||||
|
say " BLOX can handle strings to length=8 and will write either to "
|
||||||
|
say " the screen-face or to a file you name. Syntax for BLOX is: "
|
||||||
|
say " BLOX <string> <options> "
|
||||||
|
say " "
|
||||||
|
say " <options>: OUTPUT output-dsname "
|
||||||
|
say " "
|
||||||
|
exit /*@ HELP */
|
||||||
|
|
||||||
|
/*-------------------------------------------------------------------*/
|
||||||
|
KEYWD: Procedure expose kw parms /*@ */
|
||||||
|
arg kw .
|
||||||
|
if Wordpos(kw,parms) = 0 then,
|
||||||
|
kw_val = ""
|
||||||
|
else,
|
||||||
|
if Wordpos(kw,parms) = 1 then,
|
||||||
|
kwa = kw" "
|
||||||
|
else kwa = " "kw" "
|
||||||
|
parse var parms . value(kwa) kw_val .
|
||||||
|
if kw_val <> "" then parms = Delword(parms,Wordpos(value(kw),parms),2)
|
||||||
|
return kw_val /*@ KEYWD */
|
||||||
|
|
||||||
|
/*-------------------------------------------------------------------*/
|
||||||
|
SWITCH: /*@ */
|
||||||
|
arg kw .
|
||||||
|
sw_val = Wordpos(value(kw),parms) > 0
|
||||||
|
if sw_val then parms = Delword(parms,Wordpos(value(kw),parms),1)
|
||||||
|
return sw_val /*@ SWITCH */
|
||||||
|
|
||||||
|
/*-------------------------------------------------------------------*/
|
||||||
|
SYNTAX: /*@ */
|
||||||
|
errormsg = "REXX error" rc "in line" sigl":" errortext(rc)
|
||||||
|
say errormsg
|
||||||
|
say sourceline(sigl)
|
||||||
|
Trace "?R"
|
||||||
|
nop
|
||||||
|
exit /*@ SYNTAX */
|
||||||
|
|
||||||
|
/* Work area for creating new patterns: */
|
||||||
|
|
||||||
|
/* ....... */
|
||||||
|
/* ....... */
|
||||||
|
/* ....... */
|
||||||
|
/* ....... */
|
||||||
|
/* ....... */
|
||||||
|
/* ....... */
|
||||||
|
/* ....... */
|
||||||
|
/* ....... */
|
||||||
|
/* ....... */
|
197
src/EXEC/CMDS.REX
Normal file
197
src/EXEC/CMDS.REX
Normal file
@ -0,0 +1,197 @@
|
|||||||
|
/* REXX COMMANDS Show the contents of xxxCMDS and allow
|
||||||
|
selection and parameter entry.
|
||||||
|
|**-***-***-***-***-***-***-***-***-***-***-***-***-***-***-***-**|
|
||||||
|
| |
|
||||||
|
| WARNING: EMBEDDED COMPONENTS. |
|
||||||
|
| |
|
||||||
|
|**-***-***-***-***-***-***-***-***-***-***-***-***-***-***-***-**|
|
||||||
|
*/
|
||||||
|
address TSO
|
||||||
|
arg line
|
||||||
|
exec_name = Sysvar(Sysicmd)
|
||||||
|
if Sysvar(sysispf) = "NOT ACTIVE" then do
|
||||||
|
line = line "(( RESTARTED" /* tell the next invocation */
|
||||||
|
"ISPSTART CMD("exec_name line")" /* Invoke ISPF if nec. */
|
||||||
|
exit /* ...and restart it */
|
||||||
|
end
|
||||||
|
restarted = WordPos("RESTARTED",opts)>0/* called from READY-mode ? */
|
||||||
|
tv = ""
|
||||||
|
arg parms "((" opts
|
||||||
|
opts = Strip(opts,"T",")") /* lop trailing banana */
|
||||||
|
|
||||||
|
parse var opts "TRACE" tv .
|
||||||
|
parse value tv "O" with tv . /* guarantee a value */
|
||||||
|
rc = Trace(tv)
|
||||||
|
|
||||||
|
if parms = "?" then call HELP
|
||||||
|
parse value parms "ISP" with cmdtblID .
|
||||||
|
$tn$ = cmdtblID"CMDS" /* ISPCMDS by default */
|
||||||
|
|
||||||
|
address ISPEXEC
|
||||||
|
"CONTROL ERRORS RETURN"
|
||||||
|
call DEIMBED /* extract panel FCCMDSP -*/
|
||||||
|
$ddn = $ddn.PLIB
|
||||||
|
"LIBDEF ISPPLIB LIBRARY ID("$ddn") STACK"
|
||||||
|
"TBTOP" $tn$
|
||||||
|
do forever
|
||||||
|
"TBDISPL" $tn$ "PANEL(FCCMDSP) CURSOR(ACTION) AUTOSEL(NO)"
|
||||||
|
if rc > 4 then leave
|
||||||
|
do ztdsels
|
||||||
|
select
|
||||||
|
when action = "S" then do /* Select */
|
||||||
|
"CONTROL DISPLAY SAVE" /* in case we display s'thing */
|
||||||
|
(zctact)
|
||||||
|
"CONTROL DISPLAY RESTORE" /* return from display */
|
||||||
|
end
|
||||||
|
when WordPos(action,"D") > 0 then,
|
||||||
|
"TBDELETE" $tn$
|
||||||
|
when WordPos(action,"E B") > 0 then do
|
||||||
|
call F_FIXTBL /* -*/
|
||||||
|
end
|
||||||
|
otherwise nop
|
||||||
|
end /* Select */
|
||||||
|
if ztdsels = 1 then, /* never do the last one */
|
||||||
|
ztdsels = 0
|
||||||
|
else "TBDISPL" $tn$ /* next row */
|
||||||
|
end /* ztdsels */
|
||||||
|
action = "" /* clear for re-display */
|
||||||
|
end /* forever */
|
||||||
|
"LIBDEF ISPPLIB"
|
||||||
|
|
||||||
|
if restarted then do
|
||||||
|
@@ = OutTrap("ll.")
|
||||||
|
exit 4
|
||||||
|
end
|
||||||
|
exit /*@ COMMANDS */
|
||||||
|
/*
|
||||||
|
. ----------------------------------------------------------------- */
|
||||||
|
F_FIXTBL: /*@ */
|
||||||
|
address ISPEXEC
|
||||||
|
|
||||||
|
save. = ""
|
||||||
|
parse value zctverb zcttrunc zctact with ,
|
||||||
|
save.vb save.tr save.act
|
||||||
|
save.desc = zctdesc
|
||||||
|
do forever
|
||||||
|
"DISPLAY PANEL(FCCMDFIX)"
|
||||||
|
if rc > 0 then leave
|
||||||
|
end
|
||||||
|
if save.vb = zctverb then,
|
||||||
|
if save.tr = zcttrunc then,
|
||||||
|
if save.act = zctact then,
|
||||||
|
if save.desc = zctdesc then return
|
||||||
|
"TBMOD" $tn$
|
||||||
|
|
||||||
|
return /*@ F_FIXTBL */
|
||||||
|
/*
|
||||||
|
. ----------------------------------------------------------------- */
|
||||||
|
HELP: /*@ */
|
||||||
|
say "HELP for" Sysvar(Sysicmd) "not available"
|
||||||
|
exit /*@ HELP */
|
||||||
|
/*
|
||||||
|
Parse out the embedded components at the back of the source code.
|
||||||
|
|
||||||
|
The components are enclosed in a comment whose start and end are on
|
||||||
|
individual lines for easier recognition.
|
||||||
|
|
||||||
|
Each component is identified by a triple-close-paren ")))" in
|
||||||
|
column 1 followed by a DDName and a membername. The text of the
|
||||||
|
component begins on the next line.
|
||||||
|
|
||||||
|
There are no restrictions on the DDName, but it is probably a good
|
||||||
|
idea to pick a name which relates to its use so that mainline
|
||||||
|
processing can, for example, determine what sort of LIBDEF to do.
|
||||||
|
Note also that a 3-digit random number will be generated for each
|
||||||
|
DDName to guard against the possibility that processing may be
|
||||||
|
interleaved or recursive. It is up to the programmer to add the
|
||||||
|
code to properly LIBDEF each component type.
|
||||||
|
. ----------------------------------------------------------------- */
|
||||||
|
DEIMBED: Procedure expose, /*@ */
|
||||||
|
ddnlist $ddn. daid.
|
||||||
|
|
||||||
|
address TSO
|
||||||
|
|
||||||
|
fb80po.0 = "NEW UNIT(VIO) SPACE(5 5) TRACKS DIR(40)",
|
||||||
|
"RECFM(F B) LRECL(80) BLKSIZE(0)"
|
||||||
|
parse value "" with ddnlist $ddn. daid.
|
||||||
|
|
||||||
|
lastln = sourceline()
|
||||||
|
currln = lastln /* */
|
||||||
|
if Left(sourceline(currln),2) <> "*/" then return
|
||||||
|
|
||||||
|
currln = currln - 1 /* previous line */
|
||||||
|
"NEWSTACK"
|
||||||
|
address ISPEXEC
|
||||||
|
do while sourceline(currln) <> "/*"
|
||||||
|
text = sourceline(currln) /* save with a short name ! */
|
||||||
|
if Left(text,3) = ")))" then do /* package the queue */
|
||||||
|
parse var text ")))" ddn mbr . /* PLIB PANL001 maybe */
|
||||||
|
if Pos(ddn,ddnlist) = 0 then do /* doesn't exist */
|
||||||
|
ddnlist = ddnlist ddn /* keep track */
|
||||||
|
$ddn = ddn || Random(999)
|
||||||
|
$ddn.ddn = $ddn
|
||||||
|
address TSO "ALLOC FI("$ddn")" fb80po.0
|
||||||
|
"LMINIT DATAID(DAID) DDNAME("$ddn")"
|
||||||
|
daid.ddn = daid
|
||||||
|
end
|
||||||
|
daid = daid.ddn
|
||||||
|
"LMOPEN DATAID("daid") OPTION(OUTPUT)"
|
||||||
|
do queued()
|
||||||
|
parse pull line
|
||||||
|
"LMPUT DATAID("daid") MODE(INVAR) DATALOC(LINE) DATALEN(80)"
|
||||||
|
end
|
||||||
|
"LMMADD DATAID("daid") MEMBER("mbr")"
|
||||||
|
"LMCLOSE DATAID("daid")"
|
||||||
|
end /* package the queue */
|
||||||
|
else push text /* onto the top of the stack */
|
||||||
|
currln = currln - 1 /* previous line */
|
||||||
|
end /* while */
|
||||||
|
address TSO "DELSTACK"
|
||||||
|
|
||||||
|
return /*@ DEIMBED */
|
||||||
|
/*
|
||||||
|
)))PLIB FCCMDSP
|
||||||
|
)ATTR
|
||||||
|
% TYPE(TEXT) INTENS(HIGH) SKIP(ON)
|
||||||
|
+ TYPE(TEXT) INTENS(LOW) SKIP(ON)
|
||||||
|
_ TYPE(INPUT) INTENS(HIGH) CAPS(ON)
|
||||||
|
! TYPE(OUTPUT) INTENS(HIGH) SKIP(ON)
|
||||||
|
)BODY EXPAND(ºº)
|
||||||
|
%º-º Current Command Table Contents º-º
|
||||||
|
%COMMAND ===>_ZCMD %SCROLL ===>_AMT +
|
||||||
|
+
|
||||||
|
+ CmdName CmdDescription
|
||||||
|
)MODEL
|
||||||
|
_Z+ !ZCTVERB + !ZCTDESC
|
||||||
|
)INIT
|
||||||
|
.ZVARS = '(ACTION)'
|
||||||
|
)REINIT
|
||||||
|
IF (&MSG = ' ')
|
||||||
|
&ACTION = ' '
|
||||||
|
REFRESH (&ACTION)
|
||||||
|
)END
|
||||||
|
)))PLIB FCCMDFIX
|
||||||
|
)ATTR
|
||||||
|
% TYPE(TEXT) INTENS(HIGH) SKIP(ON)
|
||||||
|
+ TYPE(TEXT) INTENS(LOW) SKIP(ON)
|
||||||
|
_ TYPE(INPUT) INTENS(HIGH) CAPS(ON)
|
||||||
|
} TYPE(INPUT) INTENS(HIGH) CAPS(OFF)
|
||||||
|
! TYPE(OUTPUT) INTENS(HIGH) SKIP(ON)
|
||||||
|
)BODY EXPAND(ºº)
|
||||||
|
%º-º Current Command Table Line Contents º-º
|
||||||
|
%COMMAND ===>_ZCMD
|
||||||
|
%SCROLL ===>_AMT +
|
||||||
|
+
|
||||||
|
+ Verb ===>_zctverb +
|
||||||
|
|
||||||
|
+ Truncation ===>_z+
|
||||||
|
|
||||||
|
+ Action ===>_zctact
|
||||||
|
|
||||||
|
+ Description ===>}zctdesc
|
||||||
|
|
||||||
|
)INIT
|
||||||
|
.ZVARS = '(ZCTTRUNC)'
|
||||||
|
)PROC
|
||||||
|
)END
|
||||||
|
*/
|
129
src/EXEC/CPUID.REX
Normal file
129
src/EXEC/CPUID.REX
Normal file
@ -0,0 +1,129 @@
|
|||||||
|
/* CPUID -- Display CPU information from REXX */
|
||||||
|
/* article in TSO TIMES, Fall 1993, by John Andrisan */
|
||||||
|
/* of IBM ISSC subdivision in Long Beach California */
|
||||||
|
/*********************************************************************/
|
||||||
|
/* A TSO REXX Exec to get information aobut CPUs from the MVS */
|
||||||
|
/* control blocks: DVT, SMCA, CSD, PCCAVT, and PCCA; then show CPU */
|
||||||
|
/* number, id serial number, type, SMF id letter, and anything else */
|
||||||
|
/* that looks interesting. */
|
||||||
|
/* */
|
||||||
|
/* The control block chain that I want to follow: */
|
||||||
|
/* location 10x --> CVT */
|
||||||
|
/* CVT+C4x --> SMCA */
|
||||||
|
/* SMCA+16 contains the SMF id */
|
||||||
|
/* CVT+294x --> CSD */
|
||||||
|
/* CSD+4, +8 and + 10 contain */
|
||||||
|
/* some interesting cpu counts */
|
||||||
|
/* CVT+2FCx --> PCCAVT */
|
||||||
|
/* PCCAVT+0 --> PCCA for CPU 0 */
|
||||||
|
/* PCCAVT+4 --> PCCA for CPU 1 */
|
||||||
|
/* ... etc. */
|
||||||
|
/* PCCAVT+60 --> PCCA for CPU 15 */
|
||||||
|
/* PCCA+4 contains the cpu id, serial#, type */
|
||||||
|
/* PCCA+24 --> virtual PSA */
|
||||||
|
/* PCCA+28 --> real PSA */
|
||||||
|
/*********************************************************************/
|
||||||
|
/* ---------begin available "The REXX Macros Toolbox" only portion*/
|
||||||
|
"CLS" /* clear screen*/
|
||||||
|
say '----- information obtained via WHICH CPU ------'
|
||||||
|
"WHICH CPU"
|
||||||
|
say ' '
|
||||||
|
say '----- information from CPUID -- Display CPU information'
|
||||||
|
/* ------------ end available "The REXX Macros Toolbox" only portion*/
|
||||||
|
arg what .
|
||||||
|
if what='?' then do /* offer the user some help */
|
||||||
|
say ' use: COMMAND ===> CPUID'
|
||||||
|
say ' No parms are required'
|
||||||
|
say ' You will be shown the SMF id letter defining this system,'
|
||||||
|
say ' the CPU id, serial number, and CPU type of each CPU,'
|
||||||
|
say ' This exec (CPUID) only works on TSO.'
|
||||||
|
end
|
||||||
|
if address() /='TSO' then do
|
||||||
|
say 'This exec only works in MVS/TSO.'
|
||||||
|
exit 4
|
||||||
|
end
|
||||||
|
call init /* set up some constants */
|
||||||
|
CVT=storage('10',4)
|
||||||
|
CVT=bitand(CVT,'7FFFFFFF'x) /* zero high bit */
|
||||||
|
SMCA=storage(d2x(c2d(CVT)+x2d('C4')),4) /* get to SMCA */
|
||||||
|
SMCA=bitand(SMCA,'7FFFFFFF'x)
|
||||||
|
SMCASID=storage(d2x(c2d(SMCA)+16),4)
|
||||||
|
say 'SMF id=' SMCASID
|
||||||
|
CSD=storage(d2x(c2d(CVT)+x2d('294')),4) /* get to CSD */
|
||||||
|
CSD=bitand(CSD,'7FFFFFFF'x) /* zero high bit */
|
||||||
|
/* the counts shown next may change whil you run*/
|
||||||
|
nr_cpus=c2d(storage(d2x(c2d(CSD)+10),2)) /* get nr cur alive */
|
||||||
|
say 'nr cpus currently alive:' nr_cpus /* whatever that is */
|
||||||
|
job_avail_cpus=x2b(c2x(storage(d2x(c2d(csd)+4),2)))
|
||||||
|
say count_bits(job_avail_cpus) 'available for jobs'
|
||||||
|
srb_avail_cpus=x2b(c2x(storage(d2x(c2d(csd)+8),2)))
|
||||||
|
say count_bits(srb_avail_cpus) 'available for srbs'
|
||||||
|
cur_alive_cpus=x2b(c2x(storage(d2x(c2d(CSD)+10),2)))
|
||||||
|
say count_bits(cur_alive_cpus) 'currently alive'
|
||||||
|
say ' '
|
||||||
|
PCCAAVT=storage(d2x(c2d(CVt)+x2d('2FC')),4) /* get to PCCAVT */
|
||||||
|
PCCAAVT=bitand(PCCAAVT,'7FFFFFFF'x) /* zero high bit*/
|
||||||
|
|
||||||
|
say '-----CPU-------------- PSA PSA '
|
||||||
|
say '# ver id serial type vaddr raddr status:'
|
||||||
|
do i=0 to 60 by 4
|
||||||
|
PCCA=storage(d2x(c2d(PCCAAVT)+i),4) /* get the i-th PCCA */
|
||||||
|
PCCA=bitand(PCCA,'7FFFFFFF'x) /* zero high bit */
|
||||||
|
if PCCA=='00000000'x then iterate i /* avoid empty entry */
|
||||||
|
info=storage(c2x(PCCA),32)
|
||||||
|
if substr(job_avail_cpus,i%4+1,1)='1' then jobs='jobs'
|
||||||
|
else jobs='no-jobs'
|
||||||
|
if substr(srb_avail_cpus,i%4+1,1)='1' then srbs='srbs'
|
||||||
|
else jobs='no-srbs'
|
||||||
|
if substr(cur_alive_cpus,i%4+1,1)='1' then alive='alive'
|
||||||
|
else alive='no-alive'
|
||||||
|
/* as run "The REXX Macros Toolbox" 1993/12/16
|
||||||
|
SMF id= H901
|
||||||
|
nr cpus currently alive: 5
|
||||||
|
5 available for jobs
|
||||||
|
5 available for srbs
|
||||||
|
2 currently alive
|
||||||
|
|
||||||
|
-----CPU-------------- PSA PSA
|
||||||
|
# ver id serial type vaddr raddr status:
|
||||||
|
00 52 0 12495 3090 8000F6F0 00157240 jobs srbs no-alive
|
||||||
|
01 52 1 12495 3090 7800F9F0 00134030 jobs srbs no-alive
|
||||||
|
02 52 2 12495 3090 0000F980 0002F040 jobs srbs no-alive
|
||||||
|
03 52 3 12495 3090 0000F960 00068040 jobs srbs no-alive
|
||||||
|
04 52 4 12495 3090 1000F7F0 000A2040 jobs srbs no-alive
|
||||||
|
05 a: 9 & 00070C30 0080007B no-srbs srbs no-alive
|
||||||
|
*/
|
||||||
|
say ,
|
||||||
|
/*cpu number:*/ right(i%4,2,'0')' ',
|
||||||
|
/*cpu ver : */ substr(info,5,2)' ',
|
||||||
|
/*cpuid: */ substr(info,7,1),
|
||||||
|
/*cpu serial:*/ substr(info,8,5)' ',
|
||||||
|
/*cpu type: */ substr(info,13,4)' ',
|
||||||
|
/*PSA vaddr:*/ c2x(substr(info,24,4))' ',
|
||||||
|
/*PSA raddr:*/ c2x(substr(info,28,4))' ',
|
||||||
|
/* the status shown next may change while you run*/,
|
||||||
|
/*status:*/ jobs srbs alive
|
||||||
|
end
|
||||||
|
exit 0
|
||||||
|
/* ------------------- subroutines ---------------------- */
|
||||||
|
count_bits:
|
||||||
|
arg bit_string .
|
||||||
|
bit_sum = 0
|
||||||
|
do bit=1 to length(bit_string)
|
||||||
|
if substr(bit_string,bit,1)='1' then bit_sum=bit_sum + 1
|
||||||
|
end
|
||||||
|
return bit_sum
|
||||||
|
X2B: /* X2B is a function for hex to binary string conversion*/
|
||||||
|
arg arg .
|
||||||
|
bitout=''
|
||||||
|
do i=1 to length(arg)
|
||||||
|
t=substr(arg,i,1)
|
||||||
|
bitout=bitout||hex.t
|
||||||
|
end
|
||||||
|
return bitout
|
||||||
|
init: /* constants needed in x2b */
|
||||||
|
hex.0='0000'; hex.1='0001'; hex.2='0010'; hex.3='0011';
|
||||||
|
hex.4='0100'; hex.5='0101'; hex.6='0110'; hex.7='0111';
|
||||||
|
hex.8='1000'; hex.9='1001'; hex.A='1010'; hex.B='1011';
|
||||||
|
hex.C='1100'; hex.D='1101'; hex.E='1110'; hex.F='1111';
|
||||||
|
return
|
75
src/EXEC/EX.REX
Normal file
75
src/EXEC/EX.REX
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
/* REXX */
|
||||||
|
/* */
|
||||||
|
/* AUTHOR: Mark Zelden */
|
||||||
|
/* */
|
||||||
|
/* Last update: 05/15/2002 */
|
||||||
|
/*****************************************************************/
|
||||||
|
/* XEDIT - EDIT a data set from anywhere. */
|
||||||
|
/* */
|
||||||
|
/* Best used when set up in the ISPF command table with an */
|
||||||
|
/* abbreviation of "XE". */
|
||||||
|
/* VERB T ACTION */
|
||||||
|
/* XEDIT 2 SELECT CMD(%XEDIT &ZPARM) NEWAPPL(ISR) */
|
||||||
|
/* */
|
||||||
|
/* Fully qualified data set names are now optional, regardless */
|
||||||
|
/* of the TSO PROFILE PREFIX setting. PREFIX.DATA.SET.NAME will */
|
||||||
|
/* be tried first, then DATA.SET.NAME for data sets that are */
|
||||||
|
/* not fully qualified. */
|
||||||
|
/* */
|
||||||
|
/*****************************************************************/
|
||||||
|
/* COMMAND SYNTAX: */
|
||||||
|
/* */
|
||||||
|
/* XE DATA.SET.NAME <volser> (VOLSER is optional) */
|
||||||
|
/* */
|
||||||
|
/* XE 'MY.PDS(ABC*)' */
|
||||||
|
/* XE PDS.NOTCAT USER01 */
|
||||||
|
/* */
|
||||||
|
/* If not set up as an ISPF command, then you can still */
|
||||||
|
/* invoke the exec by typing: TSO %XEDIT DATA.SET.NAME */
|
||||||
|
/*****************************************************************/
|
||||||
|
Parse UPPER ARG DSN VOL
|
||||||
|
|
||||||
|
If DSN= '' then do /* no DSN specified */
|
||||||
|
say 'Please enter positional parameter dsn -' /* prompt for dsn */
|
||||||
|
parse upper pull DSN /* get dsn response */
|
||||||
|
End
|
||||||
|
|
||||||
|
Address ISPEXEC
|
||||||
|
"CONTROL ERRORS RETURN"
|
||||||
|
"VGET ZPCFMCN PROFILE"
|
||||||
|
If ZPCFMCN = '/' then CONF = 'YES'
|
||||||
|
else CONF = 'NO'
|
||||||
|
/************************************/
|
||||||
|
/* check if EDIT RECOVERY is needed */
|
||||||
|
/************************************/
|
||||||
|
EDITOK = 'NOTOK'
|
||||||
|
Do while EDITOK = 'NOTOK'
|
||||||
|
"EDREC QUERY"
|
||||||
|
If RC = 4 then do
|
||||||
|
"DISPLAY PANEL(ISREDM02)"
|
||||||
|
DISPRC = RC
|
||||||
|
"VGET ZVERB"
|
||||||
|
If DISPRC = 0 then do
|
||||||
|
If ZEDCMD = '' then "EDREC PROCESS PASSWORD(" || PSWD || ")"
|
||||||
|
If ZEDCMD = 'C' then "EDREC CANCEL"
|
||||||
|
If ZEDCMD = 'D' then "EDREC DEFER"
|
||||||
|
End
|
||||||
|
Else if DISPRC = 8 & ZVERB = 'CANCEL' then "EDREC CANCEL"
|
||||||
|
Else EXIT 0
|
||||||
|
End
|
||||||
|
Else EDITOK = 'OK'
|
||||||
|
End
|
||||||
|
RC = 0
|
||||||
|
/************************************/
|
||||||
|
/* end of RECOVERY CHECK */
|
||||||
|
/************************************/
|
||||||
|
"EDIT DATASET("DSN") VOLUME("VOL")" , /* try userid.DSN first */
|
||||||
|
"CONFIRM("CONF")"
|
||||||
|
If RC = 4 then RC = 0
|
||||||
|
If RC <> 0 then do /* not found - try again */
|
||||||
|
DSN = Strip(Translate(DSN,"","'")) /* remove quotes if used */
|
||||||
|
"EDIT DATASET('"DSN"') VOLUME("VOL")" , /* try DSN specified */
|
||||||
|
"CONFIRM("CONF")"
|
||||||
|
End
|
||||||
|
If RC = 4 then RC = 0
|
||||||
|
If RC <> 0 then "SETMSG MSG("ZERRMSG")" /* not found - issue msg */
|
60
src/EXEC/GETTRID.REX
Normal file
60
src/EXEC/GETTRID.REX
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
/* REXX -
|
||||||
|
statistics 0122-92148-93314-0817-00056-00087-00000-REXX
|
||||||
|
sys6.cbt.file078(rexx)
|
||||||
|
returns the name of the terminal -- e.g.
|
||||||
|
terminal = gettrid(); say terminal
|
||||||
|
+------------------------------------------------------------------+
|
||||||
|
| Name: GETTRID |
|
||||||
|
| Type: REXX exec |
|
||||||
|
| Purpose: Extract the ACEETRID from the RACF ACEE. |
|
||||||
|
| Release: MVS/ESA v4.2.2 and TSO/E v2.4 |
|
||||||
|
| Programmer: John Kalinich |
|
||||||
|
| Date: 3/10/93 |
|
||||||
|
| Abstract: A sub-function to extract the VTAM terminal id from |
|
||||||
|
| the RACF Accessor Environment Element. The ACEE is |
|
||||||
|
| not fetch protected. This function works in ACF2 |
|
||||||
|
| systems. |
|
||||||
|
| |
|
||||||
|
| Call Format: GETTRID() |
|
||||||
|
| |
|
||||||
|
| Logic: Extracts address of ASCB (PSAAOLD at x'224') |
|
||||||
|
| Extracts address of ASXB (ASCB+x'6C') |
|
||||||
|
| Extracts address of ACEE (ASXB+x'C8') |
|
||||||
|
| Extracts ACEETRID |
|
||||||
|
+------------------------------------------------------------------+ */
|
||||||
|
trace
|
||||||
|
|
||||||
|
ascb_ptr = get_ptr(224,0)
|
||||||
|
asxb_ptr = get_ptr(ascb_ptr,'6c')
|
||||||
|
acee_ptr = get_ptr(asxb_ptr,'c8')
|
||||||
|
aceetrid = get_data(acee_ptr,'40',8)
|
||||||
|
exit aceetrid
|
||||||
|
|
||||||
|
/* +-----------------------------------------+
|
||||||
|
| Procedures and functions defined below. |
|
||||||
|
+-----------------------------------------+ */
|
||||||
|
|
||||||
|
get_ptr: procedure
|
||||||
|
/* +-----------------------------------------+
|
||||||
|
| returns a 4 byte pointer as hexadecimal |
|
||||||
|
| string at address addr+offset. |
|
||||||
|
| ADDR and OFFSET must be HEX strings. |
|
||||||
|
+-----------------------------------------+ */
|
||||||
|
arg addr, offset
|
||||||
|
temp = d2x(x2d(addr) + x2d(offset))
|
||||||
|
return c2x(storage(temp,4))
|
||||||
|
exit
|
||||||
|
|
||||||
|
get_data: procedure
|
||||||
|
/* +-----------------------------------------+
|
||||||
|
| returns LENGTH bytes at ADDR+OFFSET as |
|
||||||
|
| an EBCDIC string. |
|
||||||
|
| ADDR and OFFSET must be HEX strings. |
|
||||||
|
| LENGTH must be a decimal string. |
|
||||||
|
+-----------------------------------------+ */
|
||||||
|
arg addr, offset, length
|
||||||
|
temp = d2x(x2d(addr) + x2d(offset))
|
||||||
|
return storage(temp,length)
|
||||||
|
exit
|
||||||
|
/* J. KALINICH, X4521 */
|
||||||
|
/* EXEC TO GET THE RACF ACEE TERMINAL ID */
|
3
src/EXEC/HELLO1.REX
Normal file
3
src/EXEC/HELLO1.REX
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
/*Rexx*/
|
||||||
|
Say 'Hello, From EXEC!'
|
||||||
|
Exit
|
3586
src/EXEC/IPLINFO.REX
Normal file
3586
src/EXEC/IPLINFO.REX
Normal file
File diff suppressed because it is too large
Load Diff
242
src/EXEC/JOBCARDS.REX
Normal file
242
src/EXEC/JOBCARDS.REX
Normal file
@ -0,0 +1,242 @@
|
|||||||
|
/* REXX JOBCARDS Create/Maintain application-specific and
|
||||||
|
user-specific jobcard-sets.
|
||||||
|
|**-***-***-***-***-***-***-***-***-***-***-***-***-***-***-***-**|
|
||||||
|
| |
|
||||||
|
| WARNING: EMBEDDED COMPONENTS. |
|
||||||
|
| See text following TOOLKIT_INIT |
|
||||||
|
| |
|
||||||
|
|**-***-***-***-***-***-***-***-***-***-***-***-***-***-***-***-**|
|
||||||
|
|
||||||
|
Written by Frank Clarke, Houston, 19980504
|
||||||
|
|
||||||
|
Impact Analysis
|
||||||
|
. ISPPLIB JOBC (embedded)
|
||||||
|
. SYSPROC TRAPOUT
|
||||||
|
|
||||||
|
Modification History
|
||||||
|
19990712 fxc adapted for PMU
|
||||||
|
20010216 fxc adapted for NMR
|
||||||
|
|
||||||
|
*/
|
||||||
|
address ISPEXEC /* REXXSKEL ver.19980225 */
|
||||||
|
arg parms "((" opts
|
||||||
|
|
||||||
|
signal on syntax
|
||||||
|
signal on novalue
|
||||||
|
|
||||||
|
call TOOLKIT_INIT /* conventional start-up -*/
|
||||||
|
rc = trace(tv)
|
||||||
|
info = parms /* to enable parsing */
|
||||||
|
|
||||||
|
"CONTROL ERRORS RETURN" /* */
|
||||||
|
call A_INIT /* -*/
|
||||||
|
call B_PANEL /* -*/
|
||||||
|
dd = ""
|
||||||
|
do Words(ddnlist) /* each LIBDEF DD */
|
||||||
|
parse value ddnlist dd with dd ddnlist
|
||||||
|
$ddn = $ddn.dd /* PLIB322 <- PLIB */
|
||||||
|
"LIBDEF ISP"dd
|
||||||
|
address TSO "FREE FI("$ddn")"
|
||||||
|
end
|
||||||
|
ddnlist = ddnlist dd
|
||||||
|
|
||||||
|
exit /*@ JOBCARDS */
|
||||||
|
/*
|
||||||
|
. ----------------------------------------------------------------- */
|
||||||
|
A_INIT: /*@ */
|
||||||
|
if branch then call BRANCH
|
||||||
|
address ISPEXEC
|
||||||
|
|
||||||
|
parse value "" with,
|
||||||
|
pfkey
|
||||||
|
"VGET (JOB1) PROFILE"
|
||||||
|
"VGET (ZACCTNUM) SHARED"
|
||||||
|
if job1 = "" then do /* build a new set */
|
||||||
|
call Z_RESET /* -*/
|
||||||
|
"VPUT (JOB1 JOB2 JOB3 JOB4) PROFILE"
|
||||||
|
end /* JOB1 missing */
|
||||||
|
call DEIMBED /* unload panels -*/
|
||||||
|
dd = ""
|
||||||
|
do Words(ddnlist) /* each LIBDEF DD */
|
||||||
|
parse value ddnlist dd with dd ddnlist
|
||||||
|
$ddn = $ddn.dd /* PLIB322 <- PLIB */
|
||||||
|
"LIBDEF ISP"dd "LIBRARY ID("$ddn") STACK"
|
||||||
|
end
|
||||||
|
ddnlist = ddnlist dd
|
||||||
|
|
||||||
|
return /*@ A_INIT */
|
||||||
|
/*
|
||||||
|
. ----------------------------------------------------------------- */
|
||||||
|
B_PANEL: /*@ */
|
||||||
|
if branch then call BRANCH
|
||||||
|
address ISPEXEC
|
||||||
|
|
||||||
|
"VGET (ZPF03 ZPF05) PROFILE"
|
||||||
|
zpf03_save = zpf03 /* preserve original values */
|
||||||
|
zpf05_save = zpf05 /* */
|
||||||
|
parse value "END END" with zpf03 zpf05 .
|
||||||
|
"VPUT (ZPF03 ZPF05) PROFILE"
|
||||||
|
do forever
|
||||||
|
"DISPLAY PANEL(JOBC)"
|
||||||
|
if rc > 0 then do
|
||||||
|
if pfkey = "F5" then nop /* Cancel */
|
||||||
|
else "VPUT (JOB1 JOB2 JOB3 JOB4) PROFILE"
|
||||||
|
leave
|
||||||
|
end /* */
|
||||||
|
if zcmd = "RESET" then call Z_RESET /* -*/
|
||||||
|
end /* forever */
|
||||||
|
zpf03 = zpf03_save /* restore */
|
||||||
|
zpf05 = zpf05_save /* */
|
||||||
|
"VPUT (ZPF03 ZPF05) PROFILE"
|
||||||
|
|
||||||
|
return /*@ B_PANEL */
|
||||||
|
/*
|
||||||
|
. ----------------------------------------------------------------- */
|
||||||
|
Z_RESET: /*@ */
|
||||||
|
if branch then call BRANCH
|
||||||
|
address ISPEXEC
|
||||||
|
|
||||||
|
job1 = "//"Userid()"A JOB ("zacctnum"),'DEFAULT JOBCARDS',"
|
||||||
|
job2 = "// NOTIFY="Userid()",CLASS=X,MSGCLASS=W"
|
||||||
|
job3 = "//*"
|
||||||
|
job4 = "//*"
|
||||||
|
|
||||||
|
return /*@ Z_RESET */
|
||||||
|
/*
|
||||||
|
Parse out the embedded components at the back of the source code.
|
||||||
|
. ----------------------------------------------------------------- */
|
||||||
|
DEIMBED: Procedure expose, /*@ */
|
||||||
|
(tk_globalvars) ddnlist $ddn. daid.
|
||||||
|
|
||||||
|
address TSO
|
||||||
|
|
||||||
|
fb80po.0 = "NEW UNIT(VIO) SPACE(5 5) TRACKS DIR(40)",
|
||||||
|
"RECFM(F B) LRECL(80) BLKSIZE(0)"
|
||||||
|
parse value "" with ddnlist $ddn. daid.
|
||||||
|
|
||||||
|
lastln = sourceline()
|
||||||
|
currln = lastln /* */
|
||||||
|
if Left(sourceline(currln),2) <> "*/" then return
|
||||||
|
|
||||||
|
currln = currln - 1 /* previous line */
|
||||||
|
"NEWSTACK"
|
||||||
|
address ISPEXEC
|
||||||
|
do while sourceline(currln) <> "/*"
|
||||||
|
text = sourceline(currln) /* save with a short name ! */
|
||||||
|
if Left(text,3) = ")))" then do /* package the queue */
|
||||||
|
parse var text ")))" ddn mbr . /* PLIB PANL001 maybe */
|
||||||
|
if Pos(ddn,ddnlist) = 0 then do /* doesn't exist */
|
||||||
|
ddnlist = ddnlist ddn /* keep track */
|
||||||
|
$ddn = ddn || Random(999)
|
||||||
|
$ddn.ddn = $ddn
|
||||||
|
address TSO "ALLOC FI("$ddn")" fb80po.0
|
||||||
|
"LMINIT DATAID(DAID) DDNAME("$ddn")"
|
||||||
|
daid.ddn = daid
|
||||||
|
end
|
||||||
|
daid = daid.ddn
|
||||||
|
"LMOPEN DATAID("daid") OPTION(OUTPUT)"
|
||||||
|
do queued()
|
||||||
|
parse pull line
|
||||||
|
"LMPUT DATAID("daid") MODE(INVAR) DATALOC(LINE) DATALEN(80)"
|
||||||
|
end
|
||||||
|
"LMMADD DATAID("daid") MEMBER("mbr")"
|
||||||
|
"LMCLOSE DATAID("daid")"
|
||||||
|
end /* package the queue */
|
||||||
|
else push text /* onto the top of the stack */
|
||||||
|
currln = currln - 1 /* previous line */
|
||||||
|
end /* while */
|
||||||
|
address TSO "DELSTACK"
|
||||||
|
|
||||||
|
return /*@ DEIMBED */
|
||||||
|
/*
|
||||||
|
. ----------------------------------------------------------------- */
|
||||||
|
LOCAL_PREINIT: /*@ customize opts */
|
||||||
|
address TSO
|
||||||
|
|
||||||
|
|
||||||
|
return /*@ LOCAL_PREINIT */
|
||||||
|
/*
|
||||||
|
. ----------------------------------------------------------------- */
|
||||||
|
HELP: /*@ */
|
||||||
|
address TSO;"CLEAR"
|
||||||
|
if helpmsg <> "" then do ; say helpmsg; say ""; end
|
||||||
|
ex_nam = Left(exec_name,8) /* predictable size */
|
||||||
|
|
||||||
|
say " HELP for" exec_name
|
||||||
|
say " "
|
||||||
|
say " "ex_nam" helps you build a set of default jobcards for use"
|
||||||
|
say " by routines which submit background jobs. "
|
||||||
|
say " "
|
||||||
|
say " Syntax: "ex_nam" <no parms> "
|
||||||
|
say " "
|
||||||
|
say " You will be presented with a panel on which you "
|
||||||
|
say " can make any necessary changes to your personal "
|
||||||
|
say " default jobcards. "
|
||||||
|
say " "
|
||||||
|
"NEWSTACK" ; pull ; "CLEAR" ; "DELSTACK"
|
||||||
|
say " Debugging tools provided include:"
|
||||||
|
say " "
|
||||||
|
say " MONITOR: displays key information throughout processing."
|
||||||
|
say " Displays most paragraph names upon entry."
|
||||||
|
say " "
|
||||||
|
say " NOUPDT: by-pass all update logic."
|
||||||
|
say " "
|
||||||
|
say " BRANCH: show all paragraph entries."
|
||||||
|
say " "
|
||||||
|
say " TRACE tv: will use value following TRACE to place"
|
||||||
|
say " the execution in REXX TRACE Mode."
|
||||||
|
say " "
|
||||||
|
say " "
|
||||||
|
say " Debugging tools can be accessed in the following manner:"
|
||||||
|
say " "
|
||||||
|
say " TSO" exec_name" parameters (( debug-options"
|
||||||
|
say " "
|
||||||
|
say " For example:"
|
||||||
|
say " "
|
||||||
|
say " TSO" exec_name " (( MONITOR TRACE ?R"
|
||||||
|
|
||||||
|
address ISPEXEC "CONTROL DISPLAY REFRESH"
|
||||||
|
exit /*@ HELP */
|
||||||
|
/* REXXSKEL back-end removed for space */
|
||||||
|
/*
|
||||||
|
)))PLIB JOBC
|
||||||
|
)ATTR
|
||||||
|
% TYPE(TEXT) INTENS(HIGH) SKIP(ON)
|
||||||
|
+ TYPE(TEXT) INTENS(LOW) SKIP(ON)
|
||||||
|
_ TYPE(INPUT) INTENS(HIGH) CAPS(ON)
|
||||||
|
! TYPE(OUTPUT) INTENS(HIGH) SKIP(ON)
|
||||||
|
@ TYPE(OUTPUT) INTENS(LOW) SKIP(ON)
|
||||||
|
)BODY EXPAND(��)
|
||||||
|
%�-� Local JOBCARD Specification �-�
|
||||||
|
%COMMAND ===>_ZCMD
|
||||||
|
|
||||||
|
+
|
||||||
|
+ Enter%RESET+on the command line to reset your jobcards to the
|
||||||
|
+ default settings.
|
||||||
|
+
|
||||||
|
+ Use%PF 5+to%CANCEL+changes made here.
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+(1)_JOB1
|
||||||
|
+(2)_JOB2
|
||||||
|
+(3)_JOB3
|
||||||
|
+(4)_JOB4
|
||||||
|
+
|
||||||
|
)INIT
|
||||||
|
&ZCMD = ''
|
||||||
|
)REINIT
|
||||||
|
&ZCMD = ''
|
||||||
|
)PROC
|
||||||
|
IF (.PFKEY = 'PF03')
|
||||||
|
&PFKEY = 'F3'
|
||||||
|
.RESP = END
|
||||||
|
IF (.PFKEY = 'PF05')
|
||||||
|
&PFKEY = 'F5'
|
||||||
|
.RESP = END
|
||||||
|
VER (&JOB1,NB)
|
||||||
|
VER (&JOB2,NB)
|
||||||
|
VER (&JOB3,NB)
|
||||||
|
VER (&JOB4,NB)
|
||||||
|
REFRESH(*)
|
||||||
|
)END
|
||||||
|
*/
|
19
src/EXEC/PARMS.REX
Normal file
19
src/EXEC/PARMS.REX
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
/* Rexx */
|
||||||
|
address TSO
|
||||||
|
parse upper arg instr "((" parms
|
||||||
|
parms = strip(parms,T,")")
|
||||||
|
|
||||||
|
if instr="" & parms="" then call HELP
|
||||||
|
else do
|
||||||
|
say "Instruction: " || instr
|
||||||
|
say "Parameters : " || parms
|
||||||
|
end
|
||||||
|
exit
|
||||||
|
|
||||||
|
|
||||||
|
HELP:
|
||||||
|
"CLS"
|
||||||
|
say "********************************************************"
|
||||||
|
say "* YOUR STRINGS WERE EMPTY. HOW DARE YOU. *"
|
||||||
|
say "********************************************************"
|
||||||
|
return
|
11
src/EXEC/POINT.MAWK
Normal file
11
src/EXEC/POINT.MAWK
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
#! mawk
|
||||||
|
# Awk - Point(x,y)
|
||||||
|
#
|
||||||
|
BEGIN {
|
||||||
|
p["x"]=10
|
||||||
|
p["y"]=42
|
||||||
|
z = "ZZ"
|
||||||
|
p[ z ]=999
|
||||||
|
p[ 4 ]=5
|
||||||
|
for (i in p) print( i, ":", p[i] )
|
||||||
|
}
|
408
src/EXEC/POST.REX
Normal file
408
src/EXEC/POST.REX
Normal file
@ -0,0 +1,408 @@
|
|||||||
|
/* REXX POST ...a notation on the ISPF LOG
|
||||||
|
|**-***-***-***-***-***-***-***-***-***-***-***-***-***-***-***-**|
|
||||||
|
| |
|
||||||
|
| WARNING: EMBEDDED COMPONENTS. |
|
||||||
|
| See text following TOOLKIT_INIT |
|
||||||
|
| |
|
||||||
|
|**-***-***-***-***-***-***-***-***-***-***-***-***-***-***-***-**|
|
||||||
|
|
||||||
|
Written by Frank Clarke, Oldsmar FL
|
||||||
|
|
||||||
|
Impact Analysis
|
||||||
|
. SYSPROC TRAPOUT
|
||||||
|
|
||||||
|
Modification History
|
||||||
|
20010612 fxc REXXSKEL v.20010524; enable full-screen entry of text
|
||||||
|
if not specified as a parm.
|
||||||
|
20011002 fxc fixed scroll-amt field;
|
||||||
|
|
||||||
|
*/
|
||||||
|
arg argline
|
||||||
|
address ISPEXEC /* REXXSKEL ver.20010524 */
|
||||||
|
arg parms "((" opts
|
||||||
|
|
||||||
|
signal on syntax
|
||||||
|
signal on novalue
|
||||||
|
|
||||||
|
call TOOLKIT_INIT /* conventional start-up -*/
|
||||||
|
rc = trace(tv)
|
||||||
|
info = parms /* to enable parsing */
|
||||||
|
"CONTROL ERRORS RETURN" /* I'll handle my own */
|
||||||
|
|
||||||
|
parse arg parms "((" /* preserve case */
|
||||||
|
info = parms /* to enable parsing */
|
||||||
|
|
||||||
|
call A_INIT /* -*/
|
||||||
|
call B_POST /* -*/
|
||||||
|
|
||||||
|
/* \sw.nested then call DUMP_QUEUE -*/
|
||||||
|
exit /*@ POST */
|
||||||
|
/*
|
||||||
|
. ----------------------------------------------------------------- */
|
||||||
|
A_INIT: /*@ */
|
||||||
|
if branch then call BRANCH
|
||||||
|
address TSO
|
||||||
|
|
||||||
|
/* = '------------------------' template for max length */
|
||||||
|
zerrsm = 'LOG message via POST: '
|
||||||
|
zerralrm = "NO"
|
||||||
|
zerrhm = "ISR00000"
|
||||||
|
|
||||||
|
return /*@ A_INIT */
|
||||||
|
/*
|
||||||
|
. ----------------------------------------------------------------- */
|
||||||
|
B_POST: /*@ */
|
||||||
|
if branch then call BRANCH
|
||||||
|
address ISPEXEC
|
||||||
|
|
||||||
|
rc = 0 /* init */
|
||||||
|
if parms = "" then do /* text not specified */
|
||||||
|
call DEIMBED /* extract panel -*/
|
||||||
|
call BA_SETUP_LIBDEF /* enable panel -*/
|
||||||
|
call BG_GET_TEXT /* -*/
|
||||||
|
end
|
||||||
|
|
||||||
|
if rc = 0 then do /* text available */
|
||||||
|
zerrlm = info
|
||||||
|
"LOG MSG(ISRZ002)" /* This line posts to the log */
|
||||||
|
end
|
||||||
|
else do
|
||||||
|
zerrsm = "Entry declined"
|
||||||
|
zerrlm = "Non-zero RC from NOTETXT intercepted. No note was",
|
||||||
|
"posted to the LOG."
|
||||||
|
zerralrm = "YES"
|
||||||
|
"SETMSG MSG(ISRZ001)"
|
||||||
|
end
|
||||||
|
|
||||||
|
if parms = "" then, /* text not specified */
|
||||||
|
call BZ_DROP_LIBDEF /* -*/
|
||||||
|
|
||||||
|
return /*@ B_POST */
|
||||||
|
/*
|
||||||
|
. ----------------------------------------------------------------- */
|
||||||
|
BA_SETUP_LIBDEF: /*@ */
|
||||||
|
if branch then call BRANCH
|
||||||
|
address ISPEXEC
|
||||||
|
|
||||||
|
dd = ""
|
||||||
|
do Words(ddnlist) /* each LIBDEF DD */
|
||||||
|
parse value ddnlist dd with dd ddnlist
|
||||||
|
$ddn = $ddn.dd /* PLIB322 <- PLIB */
|
||||||
|
"LIBDEF ISP"dd "LIBRARY ID("$ddn") STACK"
|
||||||
|
end
|
||||||
|
ddnlist = ddnlist dd
|
||||||
|
|
||||||
|
return /*@ BA_SETUP_LIBDEF */
|
||||||
|
/*
|
||||||
|
. ----------------------------------------------------------------- */
|
||||||
|
BG_GET_TEXT: /*@ */
|
||||||
|
if branch then call BRANCH
|
||||||
|
address ISPEXEC
|
||||||
|
|
||||||
|
"DISPLAY PANEL(NOTETXT)"
|
||||||
|
|
||||||
|
return /*@ BG_GET_TEXT */
|
||||||
|
/*
|
||||||
|
. ----------------------------------------------------------------- */
|
||||||
|
BZ_DROP_LIBDEF: /*@ */
|
||||||
|
if branch then call BRANCH
|
||||||
|
address ISPEXEC
|
||||||
|
|
||||||
|
dd = ""
|
||||||
|
do Words(ddnlist) /* each LIBDEF DD */
|
||||||
|
parse value ddnlist dd with dd ddnlist
|
||||||
|
$ddn = $ddn.dd /* PLIB322 <- PLIB */
|
||||||
|
"LIBDEF ISP"dd
|
||||||
|
address TSO "FREE FI("$ddn")"
|
||||||
|
end
|
||||||
|
ddnlist = ddnlist dd
|
||||||
|
|
||||||
|
return /*@ BZ_DROP_LIBDEF */
|
||||||
|
/*
|
||||||
|
. ----------------------------------------------------------------- */
|
||||||
|
LOCAL_PREINIT: /*@ customize opts */
|
||||||
|
address TSO
|
||||||
|
|
||||||
|
|
||||||
|
return /*@ LOCAL_PREINIT */
|
||||||
|
/* subroutines below LOCAL_PREINIT are not selected by SHOWFLOW */
|
||||||
|
/*
|
||||||
|
Parse out the embedded components at the back of the source code.
|
||||||
|
. ----------------------------------------------------------------- */
|
||||||
|
DEIMBED: Procedure expose, /*@ */
|
||||||
|
(tk_globalvars) ddnlist $ddn. daid.
|
||||||
|
|
||||||
|
address TSO
|
||||||
|
|
||||||
|
fb80po.0 = "NEW UNIT(VIO) SPACE(5 5) TRACKS DIR(40)",
|
||||||
|
"RECFM(F B) LRECL(80) BLKSIZE(0)"
|
||||||
|
parse value "" with ddnlist $ddn. daid.
|
||||||
|
|
||||||
|
lastln = sourceline()
|
||||||
|
currln = lastln /* */
|
||||||
|
if Left(sourceline(currln),2) <> "*/" then return
|
||||||
|
|
||||||
|
currln = currln - 1 /* previous line */
|
||||||
|
"NEWSTACK"
|
||||||
|
address ISPEXEC
|
||||||
|
do while sourceline(currln) <> "/*"
|
||||||
|
text = sourceline(currln) /* save with a short name ! */
|
||||||
|
if Left(text,3) = ")))" then do /* package the queue */
|
||||||
|
parse var text ")))" ddn mbr . /* PLIB PANL001 maybe */
|
||||||
|
if Pos(ddn,ddnlist) = 0 then do /* doesn't exist */
|
||||||
|
ddnlist = ddnlist ddn /* keep track */
|
||||||
|
$ddn = ddn || Random(999)
|
||||||
|
$ddn.ddn = $ddn
|
||||||
|
address TSO "ALLOC FI("$ddn")" fb80po.0
|
||||||
|
"LMINIT DATAID(DAID) DDNAME("$ddn")"
|
||||||
|
daid.ddn = daid
|
||||||
|
end
|
||||||
|
daid = daid.ddn
|
||||||
|
"LMOPEN DATAID("daid") OPTION(OUTPUT)"
|
||||||
|
do queued()
|
||||||
|
parse pull line
|
||||||
|
"LMPUT DATAID("daid") MODE(INVAR) DATALOC(LINE) DATALEN(80)"
|
||||||
|
end
|
||||||
|
"LMMADD DATAID("daid") MEMBER("mbr")"
|
||||||
|
"LMCLOSE DATAID("daid")"
|
||||||
|
end /* package the queue */
|
||||||
|
else push text /* onto the top of the stack */
|
||||||
|
currln = currln - 1 /* previous line */
|
||||||
|
end /* while */
|
||||||
|
address TSO "DELSTACK"
|
||||||
|
|
||||||
|
return /*@ DEIMBED */
|
||||||
|
/*
|
||||||
|
. ----------------------------------------------------------------- */
|
||||||
|
HELP: /*@ */
|
||||||
|
address TSO;"CLEAR"
|
||||||
|
if helpmsg <> "" then do ; say helpmsg; say ""; end
|
||||||
|
ex_nam = Left(exec_name,8) /* predictable size */
|
||||||
|
|
||||||
|
say " "
|
||||||
|
say " "ex_nam" will insert a message of your choice to the ISPF Log "
|
||||||
|
say " dataset. This may be useful for tracking your time when "
|
||||||
|
say " involved in multiple projects. "
|
||||||
|
say " "
|
||||||
|
say " Syntax: "ex_nam" <text> "
|
||||||
|
say " "
|
||||||
|
say " <text> is any message you wish inserted onto the log. If "
|
||||||
|
say " <text> is not specified as a parm, you will be "
|
||||||
|
say " prompted to enter it. "
|
||||||
|
say " "
|
||||||
|
"NEWSTACK"; pull ; "CLEAR" ; "DELSTACK "
|
||||||
|
say " Debugging tools provided include: "
|
||||||
|
say " "
|
||||||
|
say " BRANCH: show all paragraph entries. "
|
||||||
|
say " "
|
||||||
|
say " TRACE tv: will use value following TRACE to place the execution in"
|
||||||
|
say " REXX TRACE Mode. "
|
||||||
|
say " "
|
||||||
|
say " "
|
||||||
|
say " Debugging tools can be accessed in the following manner: "
|
||||||
|
say " "
|
||||||
|
say " TSO "ex_nam" parameters (( debug-options "
|
||||||
|
say " "
|
||||||
|
say " For example: "
|
||||||
|
say " "
|
||||||
|
say " TSO "ex_nam" (( MONITOR TRACE ?R "
|
||||||
|
|
||||||
|
address ISPEXEC "CONTROL DISPLAY REFRESH"
|
||||||
|
exit /*@ HELP */
|
||||||
|
/*
|
||||||
|
. ----------------------------------------------------------------- */
|
||||||
|
/*
|
||||||
|
. ----------------------------------------------------------------- */
|
||||||
|
BRANCH: Procedure expose, /*@ */
|
||||||
|
sigl exec_name
|
||||||
|
rc = trace("O") /* we do not want to see this */
|
||||||
|
arg brparm .
|
||||||
|
|
||||||
|
origin = sigl /* where was I called from ? */
|
||||||
|
do currln = origin to 1 by -1 /* inch backward to label */
|
||||||
|
if Right(Word(Sourceline(currln),1),1) = ":" then do
|
||||||
|
parse value sourceline(currln) with pgfname ":" . /* Label */
|
||||||
|
leave ; end /* name */
|
||||||
|
end /* currln */
|
||||||
|
|
||||||
|
select
|
||||||
|
when brparm = "NAME" then return(pgfname) /* Return full name */
|
||||||
|
when brparm = "ID" then do /* wants the prefix */
|
||||||
|
parse var pgfname pgfpref "_" . /* get the prefix */
|
||||||
|
return(pgfpref)
|
||||||
|
end /* brparm = "ID" */
|
||||||
|
otherwise
|
||||||
|
say left(sigl,6) left(pgfname,40) exec_name "Time:" time("L")
|
||||||
|
end /* select */
|
||||||
|
|
||||||
|
return /*@ BRANCH */
|
||||||
|
/*
|
||||||
|
. ----------------------------------------------------------------- */
|
||||||
|
DUMP_QUEUE: /*@ Take whatever is in stack */
|
||||||
|
rc = trace("O") /* and write to the screen */
|
||||||
|
address TSO
|
||||||
|
|
||||||
|
"QSTACK" /* how many stacks? */
|
||||||
|
stk2dump = rc - tk_init_stacks /* remaining stacks */
|
||||||
|
if stk2dump = 0 & queued() = 0 then return
|
||||||
|
say "Total Stacks" rc , /* rc = #of stacks */
|
||||||
|
" Begin Stacks" tk_init_stacks , /* Stacks present at start */
|
||||||
|
" Excess Stacks to dump" stk2dump
|
||||||
|
|
||||||
|
do dd = rc to tk_init_stacks by -1 /* empty each one. */
|
||||||
|
say "Processing Stack #" dd " Total Lines:" queued()
|
||||||
|
do queued();pull line;say line;end /* pump to the screen */
|
||||||
|
"DELSTACK" /* remove stack */
|
||||||
|
end /* dd = 1 to rc */
|
||||||
|
|
||||||
|
return /*@ DUMP_QUEUE */
|
||||||
|
/* Handle CLIST-form keywords added 20020513
|
||||||
|
. ----------------------------------------------------------------- */
|
||||||
|
CLKWD: Procedure expose info /*@ hide all except info */
|
||||||
|
arg kw
|
||||||
|
kw = kw"(" /* form is 'KEY(DATA)' */
|
||||||
|
kw_pos = Pos(kw,info) /* find where it is, maybe */
|
||||||
|
if kw_pos = 0 then return "" /* send back a null, not found*/
|
||||||
|
rtpt = Pos(") ",info" ",kw_pos) /* locate end-paren */
|
||||||
|
slug = Substr(info,kw_pos,rtpt-kw_pos+1) /* isolate */
|
||||||
|
info = Delstr(info,kw_pos,rtpt-kw_pos+1) /* excise */
|
||||||
|
parse var slug (kw) slug /* drop kw */
|
||||||
|
slug = Reverse(Substr(Reverse(Strip(slug)),2))
|
||||||
|
return slug /*@CLKWD */
|
||||||
|
/* Handle multi-word keys 20020513
|
||||||
|
. ----------------------------------------------------------------- */
|
||||||
|
KEYWD: Procedure expose info /*@ hide all vars, except info*/
|
||||||
|
arg kw
|
||||||
|
kw_pos = wordpos(kw,info) /* find where it is, maybe */
|
||||||
|
if kw_pos = 0 then return "" /* send back a null, not found*/
|
||||||
|
kw_val = word(info,kw_pos+Words(kw))/* get the next word */
|
||||||
|
info = Delword(info,kw_pos,2) /* remove both */
|
||||||
|
return kw_val /*@ KEYWD */
|
||||||
|
/*
|
||||||
|
. ----------------------------------------------------------------- */
|
||||||
|
KEYPHRS: Procedure expose, /*@ */
|
||||||
|
info helpmsg exec_name /* except these three */
|
||||||
|
arg kp
|
||||||
|
wp = wordpos(kp,info) /* where is it? */
|
||||||
|
if wp = 0 then return "" /* not found */
|
||||||
|
front = subword(info,1,wp-1) /* everything before kp */
|
||||||
|
back = subword(info,wp+1) /* everything after kp */
|
||||||
|
parse var back dlm back /* 1st token must be 2 bytes */
|
||||||
|
if length(dlm) <> 2 then /* Must be two bytes */
|
||||||
|
helpmsg = helpmsg "Invalid length for delimiter("dlm") with KEYPHRS("kp")"
|
||||||
|
if wordpos(dlm,back) = 0 then /* search for ending delimiter*/
|
||||||
|
helpmsg = helpmsg "No matching second delimiter("dlm") with KEYPHRS("kp")"
|
||||||
|
if helpmsg <> "" then call HELP /* Something is wrong */
|
||||||
|
parse var back kpval (dlm) back /* get everything b/w delim */
|
||||||
|
info = front back /* restore remainder */
|
||||||
|
return Strip(kpval) /*@ KEYPHRS */
|
||||||
|
/*
|
||||||
|
. ----------------------------------------------------------------- */
|
||||||
|
NOVALUE: /*@ */
|
||||||
|
say exec_name "raised NOVALUE at line" sigl
|
||||||
|
say " "
|
||||||
|
say "The referenced variable is" condition("D")
|
||||||
|
say " "
|
||||||
|
zsigl = sigl
|
||||||
|
signal SHOW_SOURCE /*@ NOVALUE */
|
||||||
|
/*
|
||||||
|
. ----------------------------------------------------------------- */
|
||||||
|
SHOW_SOURCE: /*@ */
|
||||||
|
call DUMP_QUEUE /* Spill contents of stacks -*/
|
||||||
|
if sourceline() <> "0" then /* to screen */
|
||||||
|
say sourceline(zsigl)
|
||||||
|
rc = trace("?R")
|
||||||
|
nop
|
||||||
|
exit /*@ SHOW_SOURCE */
|
||||||
|
/*
|
||||||
|
. ----------------------------------------------------------------- */
|
||||||
|
SS: Procedure /*@ Show Source */
|
||||||
|
arg ssbeg ssend .
|
||||||
|
if ssend = "" then ssend = 10
|
||||||
|
if \datatype(ssbeg,"W") | \datatype(ssend,"W") then return
|
||||||
|
ssend = ssbeg + ssend
|
||||||
|
do ssii = ssbeg to ssend ; say Strip(sourceline(ssii),'T') ; end
|
||||||
|
return /*@ SS */
|
||||||
|
/*
|
||||||
|
. ----------------------------------------------------------------- */
|
||||||
|
SWITCH: Procedure expose info /*@ */
|
||||||
|
arg kw
|
||||||
|
sw_val = Wordpos(kw,info) > 0 /* exists = 1; not found = 0 */
|
||||||
|
if sw_val then /* exists */
|
||||||
|
info = Delword(info,Wordpos(kw,info),1) /* remove it */
|
||||||
|
return sw_val /*@ SWITCH */
|
||||||
|
/*
|
||||||
|
. ----------------------------------------------------------------- */
|
||||||
|
SYNTAX: /*@ */
|
||||||
|
errormsg = exec_name "encountered REXX error" rc "in line" sigl":",
|
||||||
|
errortext(rc)
|
||||||
|
say errormsg
|
||||||
|
zsigl = sigl
|
||||||
|
signal SHOW_SOURCE /*@ SYNTAX */
|
||||||
|
/*
|
||||||
|
Can call TRAPOUT.
|
||||||
|
. ----------------------------------------------------------------- */
|
||||||
|
TOOLKIT_INIT: /*@ */
|
||||||
|
address TSO
|
||||||
|
info = Strip(opts,"T",")") /* clip trailing paren */
|
||||||
|
|
||||||
|
parse source sys_id how_invokt exec_name DD_nm DS_nm,
|
||||||
|
as_invokt cmd_env addr_spc usr_tokn
|
||||||
|
|
||||||
|
parse value "" with tv helpmsg .
|
||||||
|
parse value 0 "ISR00000 YES" "Error-Press PF1" with,
|
||||||
|
sw. zerrhm zerralrm zerrsm
|
||||||
|
|
||||||
|
if SWITCH("TRAPOUT") then do
|
||||||
|
"TRAPOUT" exec_name parms "(( TRACE R" info
|
||||||
|
exit
|
||||||
|
end /* trapout */
|
||||||
|
|
||||||
|
if Word(parms,1) = "?" then call HELP /* I won't be back */
|
||||||
|
|
||||||
|
"QSTACK" ; tk_init_stacks = rc /* How many stacks? */
|
||||||
|
|
||||||
|
parse value SWITCH("BRANCH") SWITCH("MONITOR") SWITCH("NOUPDT") with,
|
||||||
|
branch monitor noupdt .
|
||||||
|
|
||||||
|
parse value mvsvar("SYSNAME") sysvar("SYSNODE") with,
|
||||||
|
#tk_cpu node .
|
||||||
|
|
||||||
|
sw.nested = sysvar("SYSNEST") = "YES"
|
||||||
|
sw.batch = sysvar("SYSENV") = "BACK"
|
||||||
|
sw.inispf = sysvar("SYSISPF") = "ACTIVE"
|
||||||
|
|
||||||
|
parse value KEYWD("TRACE") "O" with tv .
|
||||||
|
tk_globalvars = "exec_name tv helpmsg sw. zerrhm zerralrm ",
|
||||||
|
"zerrsm zerrlm tk_init_stacks branch monitor ",
|
||||||
|
"noupdt"
|
||||||
|
|
||||||
|
call LOCAL_PREINIT /* for more opts -*/
|
||||||
|
|
||||||
|
return /*@ TOOLKIT_INIT */
|
||||||
|
|
||||||
|
/* -------------- REXXSKEL back-end removed for space -------------- */
|
||||||
|
/*
|
||||||
|
)))PLIB NOTETXT
|
||||||
|
)ATTR
|
||||||
|
% TYPE(TEXT) INTENS(HIGH) SKIP(ON)
|
||||||
|
+ TYPE(TEXT) INTENS(LOW) SKIP(ON)
|
||||||
|
_ TYPE(INPUT) INTENS(LOW) CAPS(ON)
|
||||||
|
{ TYPE(INPUT) INTENS(LOW) CAPS(OFF)
|
||||||
|
@ TYPE(TEXT) INTENS(HIGH) COLOR(YELLOW)
|
||||||
|
! TYPE(INPUT) INTENS(NON)
|
||||||
|
)BODY EXPAND(ºº)
|
||||||
|
@º-º% Specify Logging Text @º-º
|
||||||
|
%COMMAND ===>_ZCMD
|
||||||
|
%SCROLL ===>_ZAMT+
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+
|
||||||
|
Please enter the text to be posted to the LOG file:
|
||||||
|
+
|
||||||
|
Text ===>{info
|
||||||
|
+
|
||||||
|
)INIT
|
||||||
|
)PROC
|
||||||
|
)END
|
||||||
|
*/
|
180
src/EXEC/REDIT.REX
Normal file
180
src/EXEC/REDIT.REX
Normal file
@ -0,0 +1,180 @@
|
|||||||
|
/*****************************************************************
|
||||||
|
A COMPLETE DSNAME MUST BE PROVIDED
|
||||||
|
-- CAN BE ENCLOSED IN QUOTES, IF YOU SO WISH.
|
||||||
|
-- MEMBERNAME MAY BE INCLUDED AS PART OF DSNAME.
|
||||||
|
-- WILL NOT PREFIX THE USERID TO THE DSNAME.
|
||||||
|
A DATASET LEVELNAME MAY BE PROVIDED IN WHICH CASE
|
||||||
|
-- ALL OTHER OPTIONS WILL BE IGNORED, MEMBERNAME NOT ALLOWED
|
||||||
|
E.G. ==> $BROWSE IS03.*.TEXT
|
||||||
|
*****************************************************************/
|
||||||
|
/* ---INSURE DSNAME IS SURROUNDED BY QUOTES AND ... */
|
||||||
|
/* --- CREATE RDSNAME (WITHOUT MEMBERNAME) TO CHECK RACF */
|
||||||
|
PARSE ARG TOKEN; TOKEN=TRANSLATE(TOKEN)
|
||||||
|
PARSE VAR TOKEN DSNAME ' ' TOKEN
|
||||||
|
SYSUID = SYSVAR('SYSUID')
|
||||||
|
TOKEN = ' '||TOKEN||' '
|
||||||
|
MACRO=KEYWORD('MACRO')
|
||||||
|
NEW =PROCESS('NEW')
|
||||||
|
PANEL=KEYWORD('PANEL')
|
||||||
|
TRACE=PROCESS('TRACE')
|
||||||
|
|
||||||
|
IF TOKEN \= '' THEN
|
||||||
|
SAY 'UNRESOLVED OPERANDS ARE:' TOKEN
|
||||||
|
|
||||||
|
L = LENGTH(DSNAME)
|
||||||
|
XX = SUBSTR(DSNAME,1,1)SUBSTR(DSNAME,L,1)
|
||||||
|
IF XX = "''" THEN DSNAME = SUBSTR(DSNAME,2,L-2)
|
||||||
|
|
||||||
|
/* MUST NOT HAVE MEMBERNAME*/
|
||||||
|
CDSNAME = DSNAME
|
||||||
|
PARSE VAR CDSNAME LEVEL '(' MEMBER ')'
|
||||||
|
if member \= '' then cdsname = level
|
||||||
|
if datatype(member, "Whole number") = 1 then
|
||||||
|
DO
|
||||||
|
/* dealing with a GDG dataset so get the correct dsn*/
|
||||||
|
Call OutTrap "ListCat.", "*", "noconcat"
|
||||||
|
"ListCat Entry('"cdsname"') GDG all"
|
||||||
|
|
||||||
|
if rc > 0 then signal failure
|
||||||
|
|
||||||
|
if member > 0 then
|
||||||
|
errmsg('GDG relative numbers > 0 do not exist')
|
||||||
|
|
||||||
|
lineno = listcat.0 + member /* relative goes backward*/
|
||||||
|
parse var listcat.lineno "NONVSAM--" cdsname
|
||||||
|
member = "" /* finished with relative number as member*/
|
||||||
|
END
|
||||||
|
|
||||||
|
RDSNAME = CDSNAME /* RACF NAME */
|
||||||
|
I = POS('*',cdsname)
|
||||||
|
IF I \= 0 THEN DO
|
||||||
|
/* E.G. ==> TSO $BROWSE IS03.*.CNTL */
|
||||||
|
ADDRESS "ISPEXEC" "VGET ZDLDSNLV PROFILE"
|
||||||
|
OLD = ZDLDSNLV
|
||||||
|
ZDLDSNLV = CDSNAME
|
||||||
|
ADDRESS "ISPEXEC" " VPUT ZDLDSNLV PROFILE"
|
||||||
|
/* ACCORDING TO Q417856 QUALIFIED DATASET*/
|
||||||
|
/* SHOULD HAVE USED LMMDISP. */
|
||||||
|
/* METHOD USED HAS PANEL OPTIONS AVAILABLE*/
|
||||||
|
ADDRESS "ISPEXEC" "SELECT PGM(ISRUDL) PARM(ISRUDLP)"
|
||||||
|
ZDLDSNLV = OLD
|
||||||
|
ADDRESS "ISPEXEC" "VPUT ZDLDSNLV PROFILE"
|
||||||
|
RETURN 0
|
||||||
|
END
|
||||||
|
|
||||||
|
RMEMBER = MEMBER
|
||||||
|
|
||||||
|
/* ----------- CHECK FOR EXISTENCE OF THE DATASET ----*/
|
||||||
|
IF MEMBER \= '' THEN
|
||||||
|
IF POS('*',MEMBER) = 0 ,
|
||||||
|
THEN CDSNAME = DSNAME
|
||||||
|
|
||||||
|
CHK = SYSDSN("'"CDSNAME"'")
|
||||||
|
IF CHK = 'MEMBER NOT FOUND' THEN DO
|
||||||
|
IF NEW = "NEW" THEN CHK = "OK"
|
||||||
|
ELSE SAY CHK||" -- USE OPTION ""NEW"" TO ALLOW"
|
||||||
|
END
|
||||||
|
|
||||||
|
IF CHK = "OK" THEN DO
|
||||||
|
/* ------- MAKE AVAILABLE TO OTHER CLISTS --------*/
|
||||||
|
ADDRESS "ISPEXEC" " VPUT DSNAME SHARED"
|
||||||
|
ADDRESS "ISPEXEC" " VPUT RDSNAME SHARED"
|
||||||
|
|
||||||
|
/* ------- TRAP SYSOUT FOR RACF CHECKING ---------*/
|
||||||
|
TRAP.=
|
||||||
|
|
||||||
|
X = OUTTRAP("TRAP.","*")
|
||||||
|
"LD DATASET('"RDSNAME"') GENERIC"
|
||||||
|
X= OUTTRAP("OFF")
|
||||||
|
|
||||||
|
IF SUBSTR(TRAP.1,1,3) = "ICH" THEN
|
||||||
|
IF SUBSTR(TRAP.1,1,8) \= ICH35003 THEN DO
|
||||||
|
ZEDSMSG = 'NOT AUTHORIZED'
|
||||||
|
ZEDLMSG = TRAP.1 '-- HIT ENTER NOT PFK-3'
|
||||||
|
|
||||||
|
ADDRESS "ISPEXEC" " SETMSG MSG(ISRZ000)"
|
||||||
|
RETURN 12
|
||||||
|
END
|
||||||
|
|
||||||
|
/* ------- DATASET EXISTS AND RACF S/B HAPPY ------*/
|
||||||
|
BYPX:
|
||||||
|
ADDRESS "ISPEXEC" "CONTROL ERRORS RETURN"
|
||||||
|
ADDRESS "ISPEXEC" "EDIT DATASET('"DSNAME"')" MACRO PANEL
|
||||||
|
RCX = RC
|
||||||
|
SELECT;
|
||||||
|
|
||||||
|
WHEN RCX = 0 THEN DO
|
||||||
|
ZEDSMSG="SAVED"
|
||||||
|
zedlmsg="$EDIT 0 - Normal completion, data was saved"
|
||||||
|
end
|
||||||
|
|
||||||
|
WHEN RCX = 4 THEN DO
|
||||||
|
ZEDSMSG=""
|
||||||
|
zedlmsg="$EDIT RC=4",
|
||||||
|
"- Normal completion, data was not saved"
|
||||||
|
end
|
||||||
|
|
||||||
|
when rcx = 16 then do
|
||||||
|
zedsmsg="No members";
|
||||||
|
zedlmsg="$EDIT 16 - No members in library"
|
||||||
|
end
|
||||||
|
|
||||||
|
otherwise
|
||||||
|
if zerrsm = "DATA SET IN USE" then
|
||||||
|
Address "TSO" "WHOGOT" dsname
|
||||||
|
|
||||||
|
zedsmsg = zerrsm
|
||||||
|
zedlmsg = zerrlm 'RC='rcx
|
||||||
|
address "ISPEXEC" "setmsg msg(isrz000)"
|
||||||
|
exit 1
|
||||||
|
end /* of select and other-wise statements(s) */
|
||||||
|
|
||||||
|
if rcx \= 4 then
|
||||||
|
ADDRESS "ISPEXEC" " SETMSG MSG(ISRZ000)"
|
||||||
|
|
||||||
|
X = MSG('OFF')
|
||||||
|
ADDRESS "TSO" "FREE DATASET('"RDSNAME"')"
|
||||||
|
X = MSG('ON')
|
||||||
|
RETURN RCX
|
||||||
|
END /* Select */
|
||||||
|
|
||||||
|
/* ----------- DATASET DOES NOT EXIST ----------------*/
|
||||||
|
SAY "'"DSNAME"'" CHK
|
||||||
|
ZEDSMSG = 'INVALID DSN'
|
||||||
|
ZEDLMSG = "FAILED -- "CHK" -- '"DSNAME"'"
|
||||||
|
ADDRESS "ISPEXEC" " SETMSG MSG(ISRZ000)"
|
||||||
|
SAY "TSO $EDIT" DSNAME "FAILED DUE TO '"CHK"'"
|
||||||
|
SAY "AN EXAMPLE WITH A CORRECT SYNTAX IS ===> TSO $EDIT" ,
|
||||||
|
SYSUID".LIBR.CNTL"
|
||||||
|
SAY "TSO $EDIT FAILED FOR DSNAME="DSNAME" DUE TO '"CHK"'"
|
||||||
|
RETURN 12
|
||||||
|
Exit /* End */
|
||||||
|
|
||||||
|
PROCESS: PROCEDURE EXPOSE TOKEN
|
||||||
|
ARG SUBTOKEN
|
||||||
|
I = POS(' '||SUBTOKEN||' ',TOKEN)
|
||||||
|
IF I=0 THEN RETURN ''
|
||||||
|
TOKENX = SUBSTR(TOKEN,1,I) || SUBSTR(TOKEN,I+2+LENGTH(SUBTOKEN))
|
||||||
|
TOKEN = TOKENX
|
||||||
|
RETURN SUBTOKEN
|
||||||
|
|
||||||
|
KEYWORD:
|
||||||
|
PARSE ARG KEY
|
||||||
|
KEY1 = ' '||KEY||'('
|
||||||
|
PARSE VAR TOKEN LEFT (KEY1) VALUE ')' RIGHT
|
||||||
|
TOKEN = LEFT RIGHT
|
||||||
|
IF VALUE = "" THEN RETURN ''
|
||||||
|
RETURN KEY"("VALUE")"
|
||||||
|
|
||||||
|
ErrMsg: Procedure expose RC;
|
||||||
|
Parse arg Text;
|
||||||
|
Say Center(" "Text" ", 79, "*");
|
||||||
|
RC = 12;
|
||||||
|
Exit RC; /* do not return */
|
||||||
|
|
||||||
|
/* In the event of a failure following ListCat, emit it */
|
||||||
|
Failure:
|
||||||
|
Do I = 1 to ListCat.0;
|
||||||
|
Say ListCat.I;
|
||||||
|
End;
|
||||||
|
Exit RC;
|
11
src/EXEC/RXSYS.rex
Normal file
11
src/EXEC/RXSYS.rex
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
/* REXX */
|
||||||
|
RC=IMPORT(MVSCBS)
|
||||||
|
CVT=storage('10',4)
|
||||||
|
CVT=bitand(CVT,'7FFFFFFF'x)
|
||||||
|
CSD=storage(d2x(c2d(CVT)+x2d('294')),4)
|
||||||
|
Say "SMFID: "||peeks(smca()+16,4)
|
||||||
|
Say "CPUS: "||c2d(storage(d2x(c2d(CSD)+10),2))
|
||||||
|
Say "UPTIME: "||mvsvar(MVSUP)
|
||||||
|
Say "USERID: "||sysvar("sysuid")
|
||||||
|
|
||||||
|
Exit
|
16
src/EXEC/WHO.REX
Normal file
16
src/EXEC/WHO.REX
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
/*REXX*/
|
||||||
|
|
||||||
|
sysuid = sysvar("sysuid")
|
||||||
|
syspref = sysvar("syspref")
|
||||||
|
sysproc = sysvar("sysproc")
|
||||||
|
if syspref = "" then syspref="**NOPREFIX**"
|
||||||
|
say " userid="sysuid", syspref="syspref", proc="sysproc
|
||||||
|
terminal = gettrid()
|
||||||
|
say " VTAM Terminal ID="terminal
|
||||||
|
|
||||||
|
/* LOCATION -- TELLS USER WHERE LOGGEDON ON */
|
||||||
|
/* SYSUID -- USER'S IDENTIFICATION */
|
||||||
|
/* SYSPREF -- DATA SET NAME PREFIX WHICH THE USER SETS */
|
||||||
|
/* USING THE PROFILE COMMAND */
|
||||||
|
/* SYSPROC -- LOGON PROCEDURE NAME */
|
||||||
|
/* TERMINAL-- VTAM TERMINAL ID AS FOUND BY GETTRID */
|
30
src/EXEC/submit.py
Normal file
30
src/EXEC/submit.py
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
import sys
|
||||||
|
import os
|
||||||
|
import subprocess
|
||||||
|
|
||||||
|
def submit_jcl(job, mvshost="sysa"):
|
||||||
|
mvsport = 3505
|
||||||
|
jcldir = "/home/gmgauthier/Retro/MVS/src/JCLLIB/"
|
||||||
|
subjcl = os.path.join(jcldir, f"{job}.jcl")
|
||||||
|
subcmd = f"cat {subjcl} | nc -w1 {mvshost} {mvsport}"
|
||||||
|
|
||||||
|
try:
|
||||||
|
subprocess.run(subcmd, shell=True, check=True)
|
||||||
|
except subprocess.CalledProcessError as e:
|
||||||
|
print(f"Error executing command: {e}")
|
||||||
|
return 1
|
||||||
|
|
||||||
|
return 0
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
if len(sys.argv) < 2:
|
||||||
|
print("Usage: python script.py <job> [mvshost]")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
job = sys.argv[1]
|
||||||
|
mvshost = sys.argv[2] if len(sys.argv) > 2 else "sysa"
|
||||||
|
|
||||||
|
exit_code = submit_jcl(job, mvshost)
|
||||||
|
sys.exit(exit_code)
|
12
src/EXEC/submit.rex
Normal file
12
src/EXEC/submit.rex
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
#!/usr/local/bin/rexx
|
||||||
|
/* change shebang above to point to REXX interpreter */
|
||||||
|
/* Submit JCL to MVS using socket 3505 card reader */
|
||||||
|
/* Uses the netcat command */
|
||||||
|
PARSE ARG job mvshost .
|
||||||
|
IF mvshost = "" THEN mvshost = "sysa"
|
||||||
|
mvsport = 3505
|
||||||
|
jcldir = "/home/gmgauthier/Retro/MVS/src/JCLLIB/"
|
||||||
|
subjcl = jcldir||job||".jcl"
|
||||||
|
subcmd = "cat" subjcl "| nc -w1" mvshost mvsport
|
||||||
|
ADDRESS SYSTEM subcmd
|
||||||
|
RETURN 0
|
396
src/JCLLIB/23-XDMPTST-21_AUG_24-10.53.13_AM.txt
Normal file
396
src/JCLLIB/23-XDMPTST-21_AUG_24-10.53.13_AM.txt
Normal file
@ -0,0 +1,396 @@
|
|||||||
|
XX XX DDDDDDDDD MM MM PPPPPPPPPPP TTTTTTTTTTTT SSSSSSSSSS TTTTTTTTTTTT
|
||||||
|
XX XX DDDDDDDDDD MMM MMM PPPPPPPPPPPP TTTTTTTTTTTT SSSSSSSSSSSS TTTTTTTTTTTT
|
||||||
|
XX XX DD DD MMMM MMMM PP PP TT SS SS TT
|
||||||
|
XX XX DD DD MM MM MM MM PP PP TT SS TT
|
||||||
|
XX XX DD DD MM MMMM MM PP PP TT SSS TT
|
||||||
|
XXXX DD DD MM MM MM PPPPPPPPPPPP TT SSSSSSSSS TT
|
||||||
|
XXXX DD DD MM MM PPPPPPPPPPP TT SSSSSSSSS TT
|
||||||
|
XX XX DD DD MM MM PP TT SSS TT
|
||||||
|
XX XX DD DD MM MM PP TT SS TT
|
||||||
|
XX XX DD DD MM MM PP TT SS SS TT
|
||||||
|
XX XX DDDDDDDDDD MM MM PP TT SSSSSSSSSSSS TT
|
||||||
|
XX XX DDDDDDDDD MM MM PP TT SSSSSSSSSS TT
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
JJJJJJJJJJ 2222222222 3333333333 AAAAAAAAAA
|
||||||
|
JJJJJJJJJJ 222222222222 333333333333 AAAAAAAAAAAA
|
||||||
|
JJ 22 22 33 33 AA AA
|
||||||
|
JJ 22 33 AA AA
|
||||||
|
JJ 22 33 AA AA
|
||||||
|
JJ 22 3333 AAAAAAAAAAAA
|
||||||
|
JJ 22 3333 AAAAAAAAAAAA
|
||||||
|
JJ 22 33 AA AA
|
||||||
|
JJ JJ 22 33 AA AA
|
||||||
|
JJ JJ 22 33 33 AA AA
|
||||||
|
JJJJJJJJ 222222222222 333333333333 AA AA
|
||||||
|
JJJJJJ 222222222222 3333333333 AA AA
|
||||||
|
|
||||||
|
|
||||||
|
****A START JOB 23 XDMPTST XDMPTST ROOM 10.53.13 AM 21 AUG 24 PRINTER1 SYS HMVS JOB 23 START A****
|
||||||
|
****A START JOB 23 XDMPTST XDMPTST ROOM 10.53.13 AM 21 AUG 24 PRINTER1 SYS HMVS JOB 23 START A****
|
||||||
|
****A START JOB 23 XDMPTST XDMPTST ROOM 10.53.13 AM 21 AUG 24 PRINTER1 SYS HMVS JOB 23 START A****
|
||||||
|
****A START JOB 23 XDMPTST XDMPTST ROOM 10.53.13 AM 21 AUG 24 PRINTER1 SYS HMVS JOB 23 START A****
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
J E S 2 J O B L O G
|
||||||
|
|
||||||
|
|
||||||
|
10.53.13 JOB 23 IEF677I WARNING MESSAGE(S) FOR JOB XDMPTST ISSUED
|
||||||
|
10.53.13 JOB 23 $HASP373 XDMPTST STARTED - INIT 1 - CLASS A - SYS HMVS
|
||||||
|
10.53.13 JOB 23 IEF403I XDMPTST - STARTED - TIME=10.53.13
|
||||||
|
10.53.13 JOB 23 IEFACTRT DATA /ASSIST /00:00:00.01/00:00:00.12/00000/XDMPTST
|
||||||
|
10.53.13 JOB 23 IEF404I XDMPTST - ENDED - TIME=10.53.13
|
||||||
|
10.53.13 JOB 23 $HASP395 XDMPTST ENDED
|
||||||
|
|
||||||
|
|
||||||
|
------ JES2 JOB STATISTICS ------
|
||||||
|
|
||||||
|
|
||||||
|
21 AUG 24 JOB EXECUTION DATE
|
||||||
|
|
||||||
|
|
||||||
|
9 CARDS READ
|
||||||
|
|
||||||
|
|
||||||
|
93 SYSOUT PRINT RECORDS
|
||||||
|
|
||||||
|
|
||||||
|
0 SYSOUT PUNCH RECORDS
|
||||||
|
|
||||||
|
|
||||||
|
0.00 MINUTES EXECUTION TIME
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
1 //XDMPTST JOB 1,XDMPTST,MSGCLASS=A JOB 23
|
||||||
|
2 // EXEC ASSIST,PARM=
|
||||||
|
3 XXASSIST PROC
|
||||||
|
4 XXDATA EXEC PGM=ASSIST,REGION=4096K,PARM='BATCH,MACRO=H'
|
||||||
|
5 XXSTEPLIB DD DSN=SYSC.LINKLIB,DISP=SHR
|
||||||
|
6 XXSYSPRINT DD SYSOUT=*
|
||||||
|
7 XXSYSIN2 DD DDNAME=SYSIN2 (ONLY NEEDED IF &$DATARD=1: 2 READERS) 00010110
|
||||||
|
8 XXSYSPRINT DD SYSOUT=*,DCB=(RECFM=FA,LRECL=133,BLKSIZE=133) PRINTER 00010120
|
||||||
|
9 XXSYSPUNCH DD SYSOUT=B,DCB=(RECFM=F,LRECL=80,BLKSIZE=80) PUNCH 00010130
|
||||||
|
10 XXSYSUT1 DD UNIT=SYSDA,DISP=(,DELETE),SPACE=(3520,(100,10)), 00010140
|
||||||
|
XX DCB=(RECFM=F,BLKSIZE=3520) DISK INTERMEDIATE 00010150
|
||||||
|
11 XXSYSLIB DD DSN=SYS1.MACLIB,DISP=SHR 00010160
|
||||||
|
12 XX DD DSN=SYSC.MACLIB,DISP=SHR
|
||||||
|
13 //SYSIN DD * GENERATED STATEMENT
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
STMT NO. MESSAGE
|
||||||
|
-
|
||||||
|
13 IEF686I DDNAME REFERRED TO ON DDNAME KEYWORD IN PRIOR STEP WAS NOT RESOLVED
|
||||||
|
IEF236I ALLOC. FOR XDMPTST DATA
|
||||||
|
IEF237I 253 ALLOCATED TO STEPLIB
|
||||||
|
IEF237I 253 ALLOCATED TO SYS00046
|
||||||
|
IEF237I JES2 ALLOCATED TO SYSPRINT
|
||||||
|
IEF237I DMY ALLOCATED TO SYSIN2
|
||||||
|
IEF237I JES2 ALLOCATED TO SYSPRINT
|
||||||
|
IEF237I JES2 ALLOCATED TO SYSPUNCH
|
||||||
|
IEF237I 252 ALLOCATED TO SYSUT1
|
||||||
|
IEF237I 150 ALLOCATED TO SYSLIB
|
||||||
|
IEF237I 253 ALLOCATED TO
|
||||||
|
IEF237I JES2 ALLOCATED TO SYSIN
|
||||||
|
IEF142I XDMPTST DATA - STEP WAS EXECUTED - COND CODE 0000
|
||||||
|
IEF285I SYSC.LINKLIB KEPT *--------0
|
||||||
|
IEF285I VOL SER NOS= SYSCPK.
|
||||||
|
IEF285I UCSYSCPK KEPT *--------0
|
||||||
|
IEF285I VOL SER NOS= SYSCPK.
|
||||||
|
IEF285I JES2.JOB00023.SO0102 SYSOUT
|
||||||
|
IEF285I JES2.JOB00023.SO0103 SYSOUT
|
||||||
|
IEF285I JES2.JOB00023.SO0104 SYSOUT
|
||||||
|
IEF285I SYS24234.T105313.RA000.XDMPTST.R0000001 DELETED *--------0
|
||||||
|
IEF285I VOL SER NOS= WORK01.
|
||||||
|
IEF285I SYS1.MACLIB KEPT *--------0
|
||||||
|
IEF285I VOL SER NOS= MVSRES.
|
||||||
|
IEF285I SYSC.MACLIB KEPT *--------0
|
||||||
|
IEF285I VOL SER NOS= SYSCPK.
|
||||||
|
IEF285I JES2.JOB00023.SI0101 SYSIN
|
||||||
|
IEF373I STEP /DATA / START 24234.1053
|
||||||
|
IEF374I STEP /DATA / STOP 24234.1053 CPU 0MIN 00.01SEC SRB 0MIN 00.00SEC VIRT 584K SYS 196K
|
||||||
|
**** JOB NAME: XDMPTST JOBCARD READ 2024/234 10:53:13 370/148 VS2 R03.8 HMVS ******************************************************
|
||||||
|
* *
|
||||||
|
* STEP NUMBER: 1 USER CORE: 584K START TIME: 10:53:13 CPU TIME: 00:00:00.01 ACTIVE TIME: 00:00:00.02 *
|
||||||
|
* STEP NAME: DATA SYSTEM CORE: 196K STOP TIME: 10:53:13 SRB TIME: 00:00:00.00 ALLOC TIME: 10:53:13 *
|
||||||
|
* PROGRAM NAME: ASSIST REGION SIZE: 4096K ELAPSED TIME: 00:00:00.12 TCB TIME: 00:00:00.01 PROGRAM LOAD: 10:53:13 *
|
||||||
|
* CONDITION CODE: 00000 PERFORMANCE GROUP: 004 *
|
||||||
|
* JES2 CARDS: 0 SERVICE UNITS PAGES IN/OUT # SWAPS PAGES SWAP IN/OUT VIO PAGES IN/OUT *
|
||||||
|
* 24 0 / 0 0 0 / 0 0 / 0 *
|
||||||
|
* *
|
||||||
|
* ADDR/UNIT I/O COUNT ADDR/UNIT I/O COUNT ADDR/UNIT I/O COUNT ADDR/UNIT I/O COUNT ADDR/UNIT I/O COUNT ADDR/UNIT I/O COUNT *
|
||||||
|
* 253/D3350 0 253/D3350 0 252/D3350 0 150/D3350 0 253/D3350 0 *
|
||||||
|
************************************************************************************************************************************
|
||||||
|
IEF375I JOB /XDMPTST / START 24234.1053
|
||||||
|
IEF376I JOB /XDMPTST / STOP 24234.1053 CPU 0MIN 00.01SEC SRB 0MIN 00.00SEC
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
*** ASSIST 4.0/A2-11/06/80 370/65:OS-MVS INS=SDFP7/X=BGHO, CHECK/TRC/=1180, OPTS=CDKMPRX PENN STATE UNIV ***
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
PAGE 1
|
||||||
|
|
||||||
|
LOC OBJECT CODE ADDR1 ADDR2 STMT SOURCE STATEMENT
|
||||||
|
000000 1 XDMPTST CSECT
|
||||||
|
000000 2 USING XDMPTST,15
|
||||||
|
000000 E060 F00E 0004 0000E 3 XDUMP AREA,4
|
||||||
|
000006 E060 F012 0004 00012 4 XDUMP AREA+4,4
|
||||||
|
00000C 07FE 5 BR 14
|
||||||
|
00000E 0102030410203040 6 AREA DC X'0102030410203040'
|
||||||
|
7 END XDMPTST
|
||||||
|
|
||||||
|
*** NO STATEMENTS FLAGGED - NO WARNINGS, NO ERRORS
|
||||||
|
|
||||||
|
*** DYNAMIC CORE AREA USED: LOW: 268 HIGH: 340 LEAVING: 519584 FREE BYTES. AVERAGE: 76 BYTES/STMT ***
|
||||||
|
|
||||||
|
*** ASSEMBLY TIME = 0.000 SECS, 8000 STATEMENTS/SEC ***
|
||||||
|
|
||||||
|
*** PROGRAM EXECUTION BEGINNING - ANY OUTPUT BEFORE EXECUTION TIME MESSAGE IS PRODUCED BY USER PROGRAM ***
|
||||||
|
|
||||||
|
BEGIN XSNAP - CALL 1 AT C0000006 USER STORAGE
|
||||||
|
|
||||||
|
CORE ADDRESSES SPECIFIED- 00000E TO 000012
|
||||||
|
000000 E060F00E 0004E060 F0120004 07FE0102 03041020 3040F5F5 F5F5F5F5 00000000 *..0.....0............ 555555....*
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
BEGIN XSNAP - CALL 2 AT C000000C USER STORAGE
|
||||||
|
|
||||||
|
CORE ADDRESSES SPECIFIED- 000012 TO 000016
|
||||||
|
000000 E060F00E 0004E060 F0120004 07FE0102 03041020 3040F5F5 F5F5F5F5 00000000 *..0.....0............ 555555....*
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
*** EXECUTION TIME = 0.000 SECS. 3 INSTRUCTIONS EXECUTED - 3000 INSTRUCTIONS/SEC ***
|
||||||
|
|
||||||
|
*** FIRST CARD NOT READ: NO CARDS READ:FILE UNOPENED
|
||||||
|
|
||||||
|
*** AM004 - NORMAL USER TERMINATION BY RETURN ***
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
XX XX DDDDDDDDD MM MM PPPPPPPPPPP TTTTTTTTTTTT SSSSSSSSSS TTTTTTTTTTTT
|
||||||
|
XX XX DDDDDDDDDD MMM MMM PPPPPPPPPPPP TTTTTTTTTTTT SSSSSSSSSSSS TTTTTTTTTTTT
|
||||||
|
XX XX DD DD MMMM MMMM PP PP TT SS SS TT
|
||||||
|
XX XX DD DD MM MM MM MM PP PP TT SS TT
|
||||||
|
XX XX DD DD MM MMMM MM PP PP TT SSS TT
|
||||||
|
XXXX DD DD MM MM MM PPPPPPPPPPPP TT SSSSSSSSS TT
|
||||||
|
XXXX DD DD MM MM PPPPPPPPPPP TT SSSSSSSSS TT
|
||||||
|
XX XX DD DD MM MM PP TT SSS TT
|
||||||
|
XX XX DD DD MM MM PP TT SS TT
|
||||||
|
XX XX DD DD MM MM PP TT SS SS TT
|
||||||
|
XX XX DDDDDDDDDD MM MM PP TT SSSSSSSSSSSS TT
|
||||||
|
XX XX DDDDDDDDD MM MM PP TT SSSSSSSSSS TT
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
JJJJJJJJJJ 2222222222 3333333333 AAAAAAAAAA
|
||||||
|
JJJJJJJJJJ 222222222222 333333333333 AAAAAAAAAAAA
|
||||||
|
JJ 22 22 33 33 AA AA
|
||||||
|
JJ 22 33 AA AA
|
||||||
|
JJ 22 33 AA AA
|
||||||
|
JJ 22 3333 AAAAAAAAAAAA
|
||||||
|
JJ 22 3333 AAAAAAAAAAAA
|
||||||
|
JJ 22 33 AA AA
|
||||||
|
JJ JJ 22 33 AA AA
|
||||||
|
JJ JJ 22 33 33 AA AA
|
||||||
|
JJJJJJJJ 222222222222 333333333333 AA AA
|
||||||
|
JJJJJJ 222222222222 3333333333 AA AA
|
||||||
|
|
||||||
|
|
||||||
|
****A END JOB 23 XDMPTST XDMPTST ROOM 10.53.13 AM 21 AUG 24 PRINTER1 SYS HMVS JOB 23 END A****
|
||||||
|
****A END JOB 23 XDMPTST XDMPTST ROOM 10.53.13 AM 21 AUG 24 PRINTER1 SYS HMVS JOB 23 END A****
|
||||||
|
****A END JOB 23 XDMPTST XDMPTST ROOM 10.53.13 AM 21 AUG 24 PRINTER1 SYS HMVS JOB 23 END A****
|
||||||
|
****A END JOB 23 XDMPTST XDMPTST ROOM 10.53.13 AM 21 AUG 24 PRINTER1 SYS HMVS JOB 23 END A****
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
6
src/JCLLIB/ASSIST1.jcl
Normal file
6
src/JCLLIB/ASSIST1.jcl
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
//ASSIST01 JOB (ASSIST1),NOTIFY=&SYSUID,MSGCLASS=A,
|
||||||
|
// REGION=2048K,MSGLEVEL=(1,1)
|
||||||
|
//JOBPROC DD DSN=SYSC.PROCLIB,DISP=SHR
|
||||||
|
//ASSIST EXEC ASSIST,PARM='NOBATCH,MACRO=F'
|
||||||
|
//SYSIN DD DSN=@05054.SRCLIB.ASM(HELLO),DISP=SHR
|
||||||
|
//
|
11
src/JCLLIB/ASSTEST.jcl
Normal file
11
src/JCLLIB/ASSTEST.jcl
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
//HELLO JOB MSGCLASS=A,NOTIFY=@05054,CLASS=A
|
||||||
|
//JOBPROC DD DSN=SYSC.PROCLIB,DISP=SHR
|
||||||
|
// EXEC ASSIST,PARM='MACRO=F'
|
||||||
|
//SYSIN DD *
|
||||||
|
HELLO CSECT
|
||||||
|
BALR 12,0
|
||||||
|
USING *,12
|
||||||
|
XPRNT =CL19'0 ',19
|
||||||
|
XPRNT =CL19'0HELLO FROM ASSIST',19
|
||||||
|
XPRNT =CL19'0 ',19
|
||||||
|
END
|
16
src/JCLLIB/BASIC1UP.jcl
Normal file
16
src/JCLLIB/BASIC1UP.jcl
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
//@050541 JOB (BASIC),'BASIC INTERACTIVE',NOTIFY=&SYSUID,
|
||||||
|
// CLASS=S,
|
||||||
|
// MSGCLASS=A,
|
||||||
|
// MSGLEVEL=(1,1)
|
||||||
|
//*
|
||||||
|
//* BASIC INTERACTIVE
|
||||||
|
//*
|
||||||
|
//S1 EXEC PGM=BASIC1UP
|
||||||
|
//STEPLIB DD DSN=SYSC.LINKLIB,DISP=SHR
|
||||||
|
// DD DSN=SYSC.PL1LIB,DISP=SHR
|
||||||
|
//SYSPRINT DD SYSOUT=*
|
||||||
|
//RENUMFL DD DUMMY,DCB=BLKSIZE=80
|
||||||
|
//SYSIN DD DSN=@05054.SRCLIB.BASIC(MYMORT1),DISP=SHR
|
||||||
|
//KEYINPT DD *
|
||||||
|
"THIS IS A TEST"
|
||||||
|
//
|
14
src/JCLLIB/BASICMON.jcl
Normal file
14
src/JCLLIB/BASICMON.jcl
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
//@050541 JOB (BASICMON),'BATCH BASIC',NOTIFY=&SYSUID,
|
||||||
|
// CLASS=S,
|
||||||
|
// MSGCLASS=H,
|
||||||
|
// MSGLEVEL=(1,1)
|
||||||
|
//*
|
||||||
|
//* CHANGE THE MEMBER NAME ON LINE 11
|
||||||
|
//*
|
||||||
|
//S1 EXEC PGM=BASICMON
|
||||||
|
//STEPLIB DD DSN=SYSC.LINKLIB,DISP=SHR
|
||||||
|
// DD DSN=SYSC.PL1LIB,DISP=SHR
|
||||||
|
//SYSPRINT DD SYSOUT=*
|
||||||
|
//RENUMFL DD DUMMY,DCB=BLKSIZE=80
|
||||||
|
//SYSIN DD DSN=@05054.SRCLIB.BASIC(TRIGPLOT),DISP=SHR
|
||||||
|
//
|
42
src/JCLLIB/BASREST.jcl
Normal file
42
src/JCLLIB/BASREST.jcl
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
//RESTORE JOB MSGLEVEL=(1,1),MSGCLASS=H,CLASS=A,TYPRUN=SCAN,
|
||||||
|
// USER=HERC01,PASSWORD=CUL8TR,NOTIFY=&SYSUID
|
||||||
|
//*
|
||||||
|
//RECV370 PROC
|
||||||
|
//RECV370 EXEC PGM=RECV370,REGION=1024K
|
||||||
|
//RECVLOG DD SYSOUT=* RECV370 OUTPUT MESSAGES
|
||||||
|
//SYSPRINT DD SYSOUT=* IEBCOPY OUTPUT MESSAGES
|
||||||
|
//SYSIN DD DUMMY IEBCOPY REQUIRES
|
||||||
|
//SYSUT1 DD UNIT=SYSDA, WORK DATASET
|
||||||
|
// SPACE=(CYL,(10,10)),
|
||||||
|
// DCB=BLKSIZE=5600
|
||||||
|
//XMITIN DD DDNAME=XMITIN INPUT DATASET
|
||||||
|
//SYSUT2 DD DDNAME=XMITOUT OUTPUT DATASET
|
||||||
|
// PEND
|
||||||
|
//*
|
||||||
|
//STEP1 EXEC PGM=IDCAMS
|
||||||
|
//SYSPRINT DD SYSOUT=*
|
||||||
|
//SYSIN DD *
|
||||||
|
DELETE 'HERC01.BASBETA.TEMP' NONVSAM PURGE
|
||||||
|
DELETE 'HERC01.BASBETA.LOADLIB' NONVSAM PURGE
|
||||||
|
DELETE 'HERC01.BASBETA.CNTL' NONVSAM PURGE
|
||||||
|
SET LASTCC=0
|
||||||
|
SET MAXCC=0
|
||||||
|
//*
|
||||||
|
//*
|
||||||
|
//STEP2 EXEC RECV370
|
||||||
|
//XMITIN DD DISP=SHR,DSN=HERC01.BASBETA.XMI
|
||||||
|
//XMITOUT DD DSN=HERC01.BASBETA.TEMP,DISP=(NEW,CATLG,DELETE),
|
||||||
|
// UNIT=WORK,SPACE=(TRK,(10,10,10),RLSE),
|
||||||
|
// DCB=(DSORG=PO,RECFM=FB,LRECL=80,BLKSIZE=3120)
|
||||||
|
//*
|
||||||
|
//STEP3 EXEC RECV370
|
||||||
|
//XMITIN DD DISP=SHR,DSN=HERC01.BASBETA.TEMP(BASLOAD)
|
||||||
|
//XMITOUT DD DSN=HERC01.BASBETA.LOADLIB,DISP=(NEW,CATLG,DELETE),
|
||||||
|
// UNIT=TSO,SPACE=(TRK,(10,10,10),RLSE),
|
||||||
|
// DCB=(DSORG=PO,RECFM=U,BLKSIZE=4096)
|
||||||
|
//*
|
||||||
|
//STEP4 EXEC RECV370
|
||||||
|
//XMITIN DD DISP=(SHR,DELETE,KEEP),DSN=HERC01.BASBETA.TEMP(BASCNTL)
|
||||||
|
//XMITOUT DD DSN=HERC01.BASBETA.CNTL,DISP=(NEW,CATLG,DELETE),
|
||||||
|
// UNIT=TSO,SPACE=(TRK,(10,10,10),RLSE),
|
||||||
|
// DCB=(RECFM=FB,LRECL=80,BLKSIZE=3120)
|
19
src/JCLLIB/GCCCOMP.JCL
Normal file
19
src/JCLLIB/GCCCOMP.JCL
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
//GMG001C JOB CLASS=A,MSGCLASS=H,NOTIFY=GMGAUTH,REGION=4M
|
||||||
|
//GCCPRC EXEC PROC=GCCCL,OUTFILE='GMGAUTH.TEST.LOADLIB(HELLO)',
|
||||||
|
// INFILE='GMGAUTH.SRCLIB(HELLO)'
|
||||||
|
//COMP.SYSPRINT DD SYSOUT=*,DCB=(LRECL=132,BLKSIZE=132)
|
||||||
|
//LKED.SYSIN DD *
|
||||||
|
INCLUDE SYSLIB(MVSSTART)
|
||||||
|
INCLUDE SYSLIB(MVSSUPA)
|
||||||
|
INCLUDE SYSLIB(STDIO)
|
||||||
|
INCLUDE SYSLIB(STDLIB)
|
||||||
|
INCLUDE SYSLIB(CTYPE)
|
||||||
|
INCLUDE SYSLIB(STRING)
|
||||||
|
INCLUDE SYSLIB(TIME)
|
||||||
|
INCLUDE SYSLIB(ERRNO)
|
||||||
|
INCLUDE SYSLIB(ASSERT)
|
||||||
|
INCLUDE SYSLIB(LOCALE)
|
||||||
|
INCLUDE SYSLIB(MATH)
|
||||||
|
INCLUDE SYSLIB(SETJMP)
|
||||||
|
INCLUDE SYSLIB(SIGNAL)
|
||||||
|
NAME HELLO(R)
|
11
src/JCLLIB/GCCCOMP.jcl
Normal file
11
src/JCLLIB/GCCCOMP.jcl
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
//@050541 JOB CLASS=A,
|
||||||
|
// MSGCLASS=H,
|
||||||
|
// NOTIFY=&SYSUID,
|
||||||
|
// REGION=4M
|
||||||
|
//GCCPRC EXEC PROC=GCCCL,
|
||||||
|
// OUTFILE='@05054.LOADLIB(HELLO)',
|
||||||
|
// INFILE='@05054.SRCLIB(HELLOC)'
|
||||||
|
//COMP.SYSPRINT DD SYSOUT=*,DCB=(LRECL=132,BLKSIZE=132)
|
||||||
|
//LKED.SYSIN DD *
|
||||||
|
NAME HELLO(R)
|
||||||
|
//
|
11
src/JCLLIB/GCCHELLO.JCL
Normal file
11
src/JCLLIB/GCCHELLO.JCL
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
//GMG0002 JOB (GCC),'C Program Example',
|
||||||
|
// NOTIFY=GMGAUTH,
|
||||||
|
// CLASS=A,MSGCLASS=H,
|
||||||
|
// MSGLEVEL=(1,1),
|
||||||
|
// REGION=4M,TIME=1440
|
||||||
|
//*
|
||||||
|
//STEP1 EXEC GCCCG,INFILE='GMGAUTH.SRCLIB(HELLO)'
|
||||||
|
//*****************************************************
|
||||||
|
//* COMPILE.SYSIN ONLY NEEDED IF INFILE ABOVE DOES NOT EXIST
|
||||||
|
//*****************************************************
|
||||||
|
//*OMPILE.SYSIN DD DSN=GMGAUTH.SRCLIB(HELLO),DISP=(SHR)
|
7
src/JCLLIB/GCCRUN.JCL
Normal file
7
src/JCLLIB/GCCRUN.JCL
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
//GMG0001A JOB CLASS=A,MSGCLASS=H,NOTIFY=GMGAUTH
|
||||||
|
//EXECGO EXEC PGM=HELLO,REGION=5000K
|
||||||
|
//STEPLIB DD DSN=GMGAUTH.TEST.LOADLIB,DISP=SHR
|
||||||
|
//SYSPRINT DD SYSOUT=*,DCB=(LRECL=132,BLKSIZE=132)
|
||||||
|
//SYSTERM DD SYSOUT=*,DCB=(LRECL=132,BLKSIZE=132)
|
||||||
|
//SYSABEND DD SYSOUT=*
|
||||||
|
//SYSIN DD DUMMY
|
8
src/JCLLIB/GCCRUN.jcl
Normal file
8
src/JCLLIB/GCCRUN.jcl
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
//@050541 JOB CLASS=A,MSGCLASS=H,NOTIFY=&SYSUID
|
||||||
|
//EXECGO EXEC PGM=HELLO,REGION=4M
|
||||||
|
//STEPLIB DD DSN=@05054.LOADLIB,DISP=SHR
|
||||||
|
//SYSPRINT DD SYSOUT=*,DCB=(LRECL=132,BLKSIZE=132)
|
||||||
|
//SYSTERM DD SYSOUT=*,DCB=(LRECL=132,BLKSIZE=132)
|
||||||
|
//SYSABEND DD SYSOUT=*
|
||||||
|
//SYSIN DD DUMMY
|
||||||
|
//
|
6
src/JCLLIB/HELLOALG.jcl
Normal file
6
src/JCLLIB/HELLOALG.jcl
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
//HELLOALG JOB (ALGOL),'HELLO WORLD IN ALGOL',NOTIFY=&SYSUID,
|
||||||
|
// CLASS=A,MSGCLASS=A,MSGLEVEL=(1,1),TIME=1440
|
||||||
|
//HELLO EXEC ALGOFCG,REGION.ALGOL=192K,REGION.GO=512K
|
||||||
|
//ALGOL.SYSIN DD DSN=@05054.SRCLIB.ALG(HELLO),DISP=SHR
|
||||||
|
//GO.ALGLDD01 DD SYSOUT=*
|
||||||
|
//
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user