Overview
CALNDR2– Simple ISPF Calendar application in FORTRAN(G/H), PL/I(F) and GCC for MVS38J / Hercules
(current version 0.9.00 2022-03-20)
FORTRAN G, FORTRAN H and PL/I (F) are three other IBM compilers included in the legacy OS MVS 3.8J TK3 and TK4- distributions.
Note, other open-source compilers are available on volume, SYSCPK, of the TK3 and TK4- distributions. SYSCPK is a set of compilers and tools assembled over time by Jay Moseley. More information can be obtained at this site.
After some thought, I decided to embark on extending the educational and learning solutions of the CALNDRs display project to use FORTRAN G and H, PL/I (F) and MVS GCC to further demonstrate high-level language usability for ISPF applications while maintaining the same end-user experience.
Remember, IBM Fortran and PL/I compliers are from the late 1960’s.
GCC for MVS is open-source; version (GCC) 3.2.3 MVS V8.5 is used in this exercise.
Although error checking should be performed after each ISPF service call, it is overlooked intentionally for the purpose of this demonstration project!
ISPLINK in v2.2
ISPLINK, included in Wally Mclaughlin’s ISPF-like product, is a interface module using a parameter address list (PAL) whose address is passed in register 1. The PAL is a series of full-words containing all parameters related to a ISPF Service. That is, a list of addresses pointing to the actual contents of each passed variable named ‘calling convention’ in this post..
Therefore, all source programs invoking ISPLINK must adhere to this register convention including marking the end of the variable length PAL (last parameters high-order bit OR-ed with an X’80’).
Compiler Observations
Fortran G Level 21 1976
- Adheres to calling convention when interpreting CALL statement
- External program name in a CALL statement can be no longer than 6 bytes
- External program can be invoked as a CALL or Function
- Most Variables types (INTEGER, REAL, DOUBLE, etc.) have a storage length of 4-bytes or multiple of 4-bytes, but some exceptions exist
- Variable names can be no longer that 7 characters
- Variable names inherit a variable type (INTEGER, REAL, etc.) based on 1st character of variable name, but this can be overridden via the IMPLICIT statement
- Arrays are zero based (1st occurrence is A(0); 2nd occurrence is A(1))
- DD for file FT06F001 must be allocated to TSO session
- General format to request ISPF Services, lastrc = ISPLNK(parm,parm,…)
- Module ISPLNK is used for ISPLINK service requests and can be invoked as a CALL or function call
Fortran H Level 21.8 ( JUN 74 )
- Same as FORTRAN G
PL/I (F) ver5.5
- Adheres to calling convention when interpreting CALL statement with exceptions:
- String variables and literals use compiler DOPE vectors which require special handling to access actual content from a parameter address list
- Other variables types appear to adhere to calling convention
- DECLARE EXTERNAL ENTRY statement for ISPLINK uses OPTIONS(ASM INTER RETCODE) to set the return code via PLIRETV() (not supported in PL/I (F))
- The build-in function PLIRETV is used to retrieve the return code (R15 value from called program) by testing variable PLIRETV() after the ISPLINK call (not supported in PL/I (F))
GCC 3.2.3 MVS V8.5
- Adheres to calling convention when interpreting CALL statement with exceptions:
- Last parameters high-order bit is NOT marked with X’80’
- CALL or Function must use pointer designation in call list to pass variable/literal address correctly for use by ISPLINK
- In general, GCC uses DD STDIN, STDOUT, and ?? as standard IO similar to SYSIN and SYSPRINT
- STDOUT should be allocated to TSO session
A New Bridge!
To bridge the varying compiler parameter address list construction behaviors, a new common API will be utilized to pre-process ISPF service requests variable parameter lists before invoking ISPLINK in Wally’s ISPF-like product to meet ISPLINK calling conventions. The functional objective of the new API is to:
- Use a module name suitable for all compilers in this exercise (Fortran being the driver)
- Use the same ISPLINK parameters as dictated by ISPF Service name
- Support a feedback code (return code variable) using the first parameter position in the call list
- Support a feedback code when invoked as a function by returning a return code to the designated variable used in the function
- Use inbound return code value to indicate a PL/I (F) environment on a per call basis to signal handling of strings in DOPE Vectors
- Use a designated literal in call list to indicate marking of last parameters high-order bit (X’80)
- Support being invoked via CALL or Function
Testing Environment
This project underwent developed and testing under MVS 3.8J TK3 / TSO / ISPF v2.2 with no security/authorization system (i.e. RAKF) using the listed compilers above. The MVS 3.8J OS ran under Hercules 3.13 in a Windows 10 Pro platform.
Although not required for this exercise, the system LINKLIST was modified to include run-time libraries, SYS1.PL1LIB and SYS1.FORTLIB as a proactive action.
The ISPLINK API bridge tested ISPF service requests, notably, CONTROL, VDEFINE, VDELETE, DISPLAY, VREPLACE and, PQUERY due to use in the CALNDR2 CPs developed in this exercise. The remaining ISPF Services as outlined in the SPF Dialogue Management Services manual (SC34-2036-1) will require further validation and assumed supported by ISPF v2.2.
One last note… The project was also tested under the TK4- update 8 version distribution.
Using the new API, LBISPL
LBISPL acts as a “broker” between the source program and ISPLINK adhering to ISPLINK parameter rules.
For a CALL, the following format is utilized (actual syntax varies per language used):
o CALL LBISPL (RC,ISPLINK service name, parameters…)
After the first parameter (4-byte return code, integer, binary value), ISPLINK parameters follow using the same format as dictated by ISPLINK!
After LBISPL returns to the calling program, the source program can test variable RC for success or failure of requested ISPF Service.
For a FUNCTION call, the following format is utilized (actual syntax varies per language used):
o LASTRC = LBISPL (RC,ISPLINK service name, parameters…)
After the first parameter (4-byte return code, integer, binary value), ISPLINK parameters follow using the same format as dictated by ISPLINK!
After LBISPL returns from the function, the source program can test variable LASTRC for success or failure of requested ISPF Service.
When using LBISPL in PL/I (F), the RC must be set to 1 before each call as depicted below (declaration of variables not listed):
o RC = 01; /* PL/I (F) call type */
o CALL LBISPL (RC,’CONTROL ‘,’ERRORS ‘,’RETURN ‘);
When using LBISPL in GCC, the last parameter must be the literal “VL=” as depicted below (declaration of variables not listed):
o lbispl (&rc,”CONTROL “,”ERRORS “,”RETURN “,”VL=”);
Using FORTRAN G
CALNDRFG uses the same message definitions, but a new panel definition (PCALNDRF) is required.
Why?
In FORTRAN G, the standard storage utilization for each array element is 4-bytes per array occurrence. Therefore, each week of the calendar needs a new length of 28 contiguous bytes (4*7=28) to properly display and page the 1993 calendar! All strings are declared as arrays in CALNDRFG.
The logic flow closely simulates that of COBOL CALNDRC, but varies when IF-THEN-ELSE structures are used in FORTRAN due to the level of this compiler (forces the use of GO TO statements).
Two assembler subroutines were written to convert binary values to character format and vise-versa.
Two functions were written to facilitate forward and backward paging.
A CLIST is required to invoke this program.
------------------------ Calendar Sample using FORTG -------------------------- Command ===> Scroll ==> PAGE Dummy dates: Year: 1993 MM / DD S M T W T F S Starting ===> 01 / 01 ------------------------------- Ending ===> 12 / 31 ¦ JAN 1 2 ¦ ¦ 3 4 5 6 7 8 9 ¦ ¦ 10 11 12 13 14 15 16 ¦ ¦ 17 18 19 20 21 22 23 ¦ ¦ 24 25 26 27 28 29 30 ¦ ¦ 31 1 2 3 4 5 6 ¦ ¦ FEB 7 8 9 10 11 12 13 ¦ ------------------------------- Enter UP or DOWN command to scroll through calendar.
Using FORTRAN H
CALNDRFH contains the same source statements as CALNDRFG except for program name and some constant changes, the FORTRAN H compiler is used.
Using PL/I (F)
CALNDRP uses the same panel and message definitions from the original CALNDR installation.
CALNDRP defines external entries, character variables, calendar content, 4-byte integer binary variables and an error message structure. The logic flow closely simulates that of COBOL CALNDRC.
Subroutine LBWTRMP is used to display messages from PL/I (F) on the TSO terminal (using TPUT to report ISPF DISPLAY errors).
------------------------ Calendar Sample using PL/I -------------------------- Command ===> Scroll ==> PAGE Dummy dates: Year: 1993 MM / DD S M T W T F S Starting ===> 01 / 01 ----------------------------- Ending ===> 12 / 31 ¦ JAN 1 2 ¦ ¦ 3 4 5 6 7 8 9 ¦ ¦ 10 11 12 13 14 15 16 ¦ ¦ 17 18 19 20 21 22 23 ¦ ¦ 24 25 26 27 28 29 30 ¦ ¦ 31 1 2 3 4 5 6 ¦ ¦ FEB 7 8 9 10 11 12 13 ¦ ----------------------------- Enter UP or DOWN command to scroll through calendar.
Using GCC for MVS
CALNDRGC uses the same panel and message definitions from the original CALNDR installation.
CALNDRGC defines external entries, character variables, calendar content, 4-byte integer binary variables and an error message structure.
The logic flow closely simulates that of COBOL CALNDRC.
Subroutine LBWTRMP is used to display messages from PL/I (F) on the TSO terminal (using TPUT to report ISPF DISPLAY errors).
Two functions were written to facilitate forward and backward paging.
A CLIST is required to invoke this program.
------------------------ Calendar Sample using GCC -------------------------- Command ===> Scroll ==> PAGE Dummy dates: Year: 1993 MM / DD S M T W T F S Starting ===> 01 / 01 ----------------------------- Ending ===> 12 / 31 ¦ JAN 1 2 ¦ ¦ 3 4 5 6 7 8 9 ¦ ¦ 10 11 12 13 14 15 16 ¦ ¦ 17 18 19 20 21 22 23 ¦ ¦ 24 25 26 27 28 29 30 ¦ ¦ 31 1 2 3 4 5 6 ¦ ¦ FEB 7 8 9 10 11 12 13 ¦ ----------------------------- Enter UP or DOWN command to scroll through calendar.
CALNDR2 Programs
All CALNDR2 CPs attempt to follow the same logic flow for comparison purposes across languages. FORTRAN required special focus due to IF-THEN-ELSE and GO TO statement usage!
All calls from the various CALENDAR CPs are considered static, thus, creating a composite load module.
If you are an experienced FORTRAN, PL/I F, or GCC MVS developer and notice any improvements to the CALNDR2 CPs and/or further/better exploit the utilized higher-level language, please use the below contact information link to communicate your thoughts!
Look forward to your feedback.
Larry Belmontes
Prerequisites
Two user-mods, ZP60014 and ZP60038, are REQUIRED to process CLIST symbolic variables via the IKJCT441 API on MVS 3.8J or before using ISPF Services sharing CLIST variables.
More information on the above user-mods (ZP60014 and ZP60038) can be obtained from the following website:
http://www.prycroft6.com.au/vs2mods/
More information on ISPF 2.x user-mods can be obtained from the ISPF 2.x distribution tape (HET).
ISPF v2.1 (Wally Mclaughlin’s product) or greater must be installed on MVS38J.
Software Disclaimer
No guarantee; No warranty; Install / Use at your own risk.
This software is provided “AS IS” and without any expressed or implied warranties, including, without limitation, the implied warranties of merchantability and fitness for a particular purpose.
The author requests keeping authors name intact to any modified versions.
In addition, the author requests readers to submit any code modifications / enhancements and associated comments for consideration into a subsequent release (giving credit to contributors) thus, improving overall functionality benefiting the MVS 3.8J hobbyist public domain community.
Access CALNDR2 now for a demo!
Take CALNDR2 for a ‘test drive’ before downloading and installing onto your MVS38J system.
Point your TN3270 terminal emulator using SSL to
URL: mywhs.belmontes.net
PORT: 5000
SSL : Version 3
Once connected, log on using any of the TK4- default user ids and passcodes.
After successful logon, select option I (I for ISPF) from the TSO Applications Menu. Note, option I is not listed on the menu – this is intentional.
From the ISPF PRIMARY OPTION MENU, type L in the command field (OPTION ==>) and press ENTER to display the ShareABitOfIT Software Demo Menu.
Each of the CALNDR2 CPs can be accesses via the command line.
To access the Fortran G version, type TSO CCLNDRFG in the command field (OPTION ==>) and press ENTER.
Use PF7/PF8 to scroll the calendar display panel.
Use PF3 to end.
To access the Fortran H version, type TSO CCLNDRFH.
To access the PL/I F version, type TSO CALNDRP.
To access the GCC version, type TSO CCLNDRGC.
Use PF3 to exit from ISPF and TSO Applications Menu returning to the TSO READY prompt.
Log off TSO.
Terminate 3270 session.
Installing CALNDR2 Software
After downloading the ZIP file, the approach for this installation procedure is to transfer the distribution content from the your personal computing device to MVS with minimal JCL and continue the installation procedure using supplied JCL from the MVS CNTL data set under TSO.
- Click here to download the CALNDR2 zip file to your PC local drive.
The below README file includes a ZIP file content list, pre-installation requirements and installation steps.
CALNDR2 for MVS3.8J / Hercules ============================== Date: 03/20/2022 Release V0R9M00 * Author: Larry Belmontes Jr. * https://ShareABitofIT.net/CALNDR2-in-MVS38J * Copyright (C) 2022 Larry Belmontes, Jr. ---------------------------------------------------------------------- | CALNDR2 I n s t a l l a t i o n R e f e r e n c e | ---------------------------------------------------------------------- The approach for this installation procedure is to transfer the distribution content from your personal computing device to MVS with minimal JCL and to continue the installation procedure using supplied JCL from the MVS CNTL data set under TSO. Below are descriptions of ZIP file content, pre-installation requirements (notes, credits) and installation steps. Good luck and enjoy this software as added value to MVS 3.8J! -Larry Belmontes ====================================================================== * I. C o n t e n t o f Z I P F i l e | ====================================================================== o $INST00.JCL Define Alias for HLQ CALNDR2 in Master Catalog o $INST01.JCL Load CNTL data set from distribution tape o $RECVXMI.JCL Receive XMI SEQ to MVS PDSs o CALNDR2.V0R9M00.HET Hercules Emulated Tape (HET) multi-file volume with VOLSER of VS0900 containing software distribution. o RECVXMIT.V0R9M00.XMI XMIT file containing software distribution. o DSCLAIMR.TXT Disclaimer o PREREQS.TXT Required user-mods o README.TXT This File Note: CALNDRs must be installed as a pre-requisite due to use of ----- selected components. More information at:CALNDRs in MVS38JNote: The appropriate compilers must be installed as a pre-requiste ----- on your system (Fortran G, Fortran H, PL/I (F), GCC). Note: ISPF v2.1 or higher must be installed under MVS3.8J TSO ----- including associated user-mods per ISPF Installation Pre-reqs. ====================================================================== * II. P r e - i n s t a l l a t i o n R e q u i r e m e n t s | ====================================================================== o The Master Catalog password may be required for some installation steps. o Tape files use device 480. o As default, DASD files will be loaded to VOLSER=MVSDLB, type 3350 device. Below is a DATASET List after tape distribution load for reference purposes: DATA-SET-NAME------------------------------- VOLUME ALTRK USTRK ORG FRMT % XT CALNDR2.V0R9M00.ASM MVSDLB 80 22 PO FB 27 1 CALNDR2.V0R9M00.CLIST MVSDLB 4 1 PO FB 25 1 CALNDR2.V0R9M00.CNTL MVSDLB 20 11 PO FB 55 1 CALNDR2.V0R9M00.HELP MVSDLB 4 1 PO FB 25 1 CALNDR2.V0R9M00.ISPF MVSDLB 20 1 PO FB 5 1 CALNDR2.V0R9M00.MACLIB MVSDLB 2 1 PO FB 50 1 **END** TOTALS: 130 TRKS ALLOC 37 TRKS USED 6 EXTENTS Confirm the TOTAL track allocation is available on MVSDLB. Note: A different DASD device type may be used to yield different usage results. o TSO user-id with sufficient access rights to update SYS2.CMDPROC, SYS2.CMDLIB, SYS2.HELP, SYS2.LINKLIB and/or ISPF libraries. o For installations with a security system (e.g. RAKF), you MAY need to insert additional JOB statement information. // USER=???????,PASSWORD=???????? o Names of ISPCLIB (Clist), ISPMLIB (Message), ISPLLIB (Load) and/or ISPPLIB (Panel) libraries. o Download ZIP file to your PC local drive. o Unzip the downloaded file into a temp directory on your PC device. o Install pre-requisite (if any) software and/or user modifications. ====================================================================== * III. I n s t a l l a t i o n S t e p s | ====================================================================== +--------------------------------------------------------------------+ | Step 1. Define Alias for HLQ CALNDR2 in MVS User Catalog | +--------------------------------------------------------------------+ | JCL Member: CALNDR2.V0R9M00.CNTL($INST00) | +--------------------------------------------------------------------+ ______________________________________________________________________ //CALNDR20 JOB (SYS),'Def CALNDR2 Alias', <-- Review and Modify // CLASS=A,MSGCLASS=X, <-- Review and Modify // MSGLEVEL=(1,1),NOTIFY=&SYSUID <-- Review and Modify //* -------------------------------------------------------* //* * CALNDR2 in MVS3.8J TSO / Hercules * //* * JOB: $INST00 Define Alias for HLQ CALNDR2 * //* * Note: The master catalog password will be required * //* -------------------------------------------------------* //DEFALIAS EXEC PGM=IDCAMS //SYSPRINT DD SYSOUT=* //SYSIN DD * PARM GRAPHICS(CHAIN(SN)) LISTCAT ALIAS ENT(CALNDR2) IF LASTCC NE 0 THEN - DEFINE ALIAS(NAME(CALNDR2) RELATE(SYS1.UCAT.MVS)) /* // ______________________________________________________________________ Figure 1: $INST00 JCL a) Copy and paste the above JCL to a PDS member, update JOB statement to conform to your installation standard. b) Submit the job. c) Review job output for successful DEFINE ALIAS. Note: Job step DEFALIAS returns RC=0004 due to LISTCAT function completing with condition code of 4 and DEFINE ALIAS function completing with condition code of 0. +--------------------------------------------------------------------+ | Step 2. Determine software installation source | +--------------------------------------------------------------------+ | HET or XMI ? | +--------------------------------------------------------------------+ a) Software can be installed from two sources, HET or XMI. - For tape installation (HET), proceed to STEP 4. **** or - For XMIT installation (XMI), proceed to next STEP. +--------------------------------------------------------------------+ | Step 3. Load XMIPDS data set from XMI SEQ file | +--------------------------------------------------------------------+ | JCL Member: CALNDR2.V0R9M00.CNTL($RECVXMI) | +--------------------------------------------------------------------+ ______________________________________________________________________ //RECV000A JOB (SYS),'Receive CALNDR2 XMI', <-- Review and Modify // CLASS=A,MSGCLASS=X,REGION=0M, <-- Review and Modify // MSGLEVEL=(1,1),NOTIFY=&SYSUID <-- Review and Modify //* -------------------------------------------------------* //* * JOB: $RECVXMI Receive Application XMI Files * //* -------------------------------------------------------* //RECV PROC HLQ=CALNDR2,VRM=V0R9M00,TYP=XXXXXXXX, // DSPACE='(TRK,(10,05,40))',DDISP='(,CATLG,DELETE)', // DUNIT=3350,DVOLSER=MVSDLB <-- Review and Modify //* //RECV370 EXEC PGM=RECV370 //STEPLIB DD DSN=SYS2.LINKLIB,DISP=SHR <-- Review and Modify //RECVLOG DD SYSOUT=* //XMITIN DD DISP=SHR,DSN=&&XMIPDS(&TYP) //SYSPRINT DD SYSOUT=* //SYSUT1 DD DSN=&&SYSUT1, // UNIT=SYSALLDA,SPACE=(CYL,(10,05)),DISP=(,DELETE,DELETE) //SYSUT2 DD DSN=&HLQ..&VRM..&TYP,DISP=&DDISP, // UNIT=&DUNIT,SPACE=&DSPACE,VOL=SER=&DVOLSER //SYSIN DD DUMMY //SYSUDUMP DD SYSOUT=* // PEND //* RECEIVE XMIPDS TEMP //XMIPDS EXEC RECV,TYP=XMIPDS,DSPACE='(CYL,(10,05,10),RLSE)' //RECV370.XMITIN DD DISP=SHR,DSN=your.transfer.xmi <-- XMI File //RECV370.SYSUT2 DD DSN=&&XMIPDS,DISP=(,PASS), // UNIT=SYSDA,SPACE=&DSPACE //* RECEIVE CNTL, HELP, CLIST, ISPF, ASM, MACLIB //CNTL EXEC RECV,TYP=CNTL,DSPACE='(TRK,(20,10,10))' //HELP EXEC RECV,TYP=HELP,DSPACE='(TRK,(04,02,02))' //CLIST EXEC RECV,TYP=CLIST,DSPACE='(TRK,(04,02,02))' //ISPF EXEC RECV,TYP=ISPF,DSPACE='(TRK,(20,05,10))' //ASM EXEC RECV,TYP=ASM,DSPACE='(TRK,(80,10,10))' //MACLIB EXEC RECV,TYP=MACLIB,DSPACE='(TRK,(02,02,02))' // ______________________________________________________________________ Figure 2: $RECVXMI.JCL a) Transfer CALNDR2.V0R9M00.XMI to MVS using your 3270 emulator. Make note of the DSN assigned on MVS transfer. Use transfer IND$FILE options: NEW BLKSIZE=3200 LRECL=80 RECFM=FB Ensure the DSN on MVS exists with the correct DCB information: ORG=PS BLKSIZE=3200 LRECL=80 RECFM=FB b) Copy and paste the above JCL to a PDS member, update JOB statement to conform to your installation standard. Review JCL and apply any modifications per your installation including the DSN assigned during the transfer above for the XMI file. d) Submit the job. e) Review job output for successful load of the following PDSs: CALNDR2.V0R9M00.ASM CALNDR2.V0R9M00.CLIST CALNDR2.V0R9M00.CNTL CALNDR2.V0R9M00.HELP CALNDR2.V0R9M00.ISPF CALNDR2.V0R9M00.MACLIB f) Subsequent installation steps will be submitted from members contained in the CNTL data set. g) Proceed to STEP 6. **** +--------------------------------------------------------------------+ | Step 4. Load CNTL data set from distribution tape | +--------------------------------------------------------------------+ | JCL Member: CALNDR2.V0R9M00.CNTL($INST01) | +--------------------------------------------------------------------+ ______________________________________________________________________ //CALNDR21 JOB (SYS),'Install CNTL PDS', <-- Review and Modify // CLASS=A,MSGCLASS=X, <-- Review and Modify // MSGLEVEL=(1,1),NOTIFY=&SYSUID <-- Review and Modify //* -------------------------------------------------------* //* * CALNDR2 for MVS3.8J TSO / Hercules * //* * JOB: $INST01 Load CNTL PDS from distribution tape * //* * Note: Uses tape drive 480 * //* -------------------------------------------------------* //LOADCNTL PROC HLQ=CALNDR2,VRM=V0R9M00,TVOLSER=VS0900, // TUNIT=480,DVOLSER=MVSDLB,DUNIT=3350 <-- Review and Modify //LOAD001 EXEC PGM=IEBCOPY //SYSPRINT DD SYSOUT=* //INCNTL DD DSN=&HLQ..&VRM..CNTL.TAPE,UNIT=&TUNIT, // VOL=SER=&TVOLSER,DISP=OLD,LABEL=(1,SL) //CNTL DD DSN=&HLQ..&VRM..CNTL, // UNIT=&DUNIT,VOL=SER=&DVOLSER, // SPACE=(TRK,(20,10,10)),DISP=(,CATLG), // DCB=(RECFM=FB,LRECL=80,BLKSIZE=3600) // PEND //STEP001 EXEC LOADCNTL Load CNTL PDS //SYSIN DD * COPY INDD=INCNTL,OUTDD=CNTL // ______________________________________________________________________ Figure 3: $INST01 JCL a) Before submitting the above job, the distribution tape must be made available to MVS by issuing the following command from the Hercules console: DEVINIT 480 X:\dirname\CALNDR2.V0R9M00.HET READONLY=1 where X:\dirname is the complete path to the location of the Hercules Emulated Tape file. b) Issue the following command from the MVS console to vary device 480 online: V 480,ONLINE c) Copy and paste the above JCL to a PDS member, update JOB statement to conform to your installation standard. Review JCL and apply any modifications per your installation. d) Submit the job. e) Review job output for successful load of the CNTL data set. f) Subsequent installation steps will be submitted from members contained in the CNTL data set. +--------------------------------------------------------------------+ | Step 5. Load Other data sets from distribution tape | +--------------------------------------------------------------------+ | JCL Member: CALNDR2.V0R9M00.CNTL($INST02) | +--------------------------------------------------------------------+ ______________________________________________________________________ //CALNDR22 JOB (SYS),'Install Other PDSs', <-- Review and Modify // CLASS=A,MSGCLASS=X, <-- Review and Modify // MSGLEVEL=(1,1),NOTIFY=&SYSUID <-- Review and Modify //* -------------------------------------------------------* //* * CALNDR2 for MVS3.8J TSO / Hercules * //* * JOB: $INST02 Load other PDS from distribution tape * //* * Tape Volume: File 1 - CNTL * //* * File 2 - CLIST * //* * File 3 - HELP * //* * File 4 - ISPF * //* * File 5 - ASM * //* * File 6 - MACLIB * //* * Note: Default TAPE=480, DASD=3350 on MVSDLB * //* -------------------------------------------------------* //LOADOTHR PROC HLQ=CALNDR2,VRM=V0R9M00,TVOLSER=VS0900, // TUNIT=480,DVOLSER=MVSDLB,DUNIT=3350 <-- Review and Modify //LOAD02 EXEC PGM=IEBCOPY //SYSPRINT DD SYSOUT=* //INCLIST DD DSN=&HLQ..&VRM..CLIST.TAPE,UNIT=&TUNIT, // VOL=SER=&TVOLSER,DISP=OLD,LABEL=(2,SL) //INHELP DD DSN=&HLQ..&VRM..HELP.TAPE,UNIT=&TUNIT, // VOL=SER=&TVOLSER,DISP=OLD,LABEL=(3,SL) //INISPF DD DSN=&HLQ..&VRM..ISPF.TAPE,UNIT=&TUNIT, // VOL=SER=&TVOLSER,DISP=OLD,LABEL=(4,SL) //INASM DD DSN=&HLQ..&VRM..ASM.TAPE,UNIT=&TUNIT, // VOL=SER=&TVOLSER,DISP=OLD,LABEL=(5,SL) //INMACLIB DD DSN=&HLQ..&VRM..MACLIB.TAPE,UNIT=&TUNIT, // VOL=SER=&TVOLSER,DISP=OLD,LABEL=(6,SL) //CLIST DD DSN=&HLQ..&VRM..CLIST,UNIT=&DUNIT,VOL=SER=&DVOLSER, // SPACE=(TRK,(04,02,02)),DISP=(,CATLG), // DCB=(RECFM=FB,LRECL=80,BLKSIZE=3600) //HELP DD DSN=&HLQ..&VRM..HELP,UNIT=&DUNIT,VOL=SER=&DVOLSER, // SPACE=(TRK,(04,02,02)),DISP=(,CATLG), // DCB=(RECFM=FB,LRECL=80,BLKSIZE=3600) //ISPF DD DSN=&HLQ..&VRM..ISPF,UNIT=&DUNIT,VOL=SER=&DVOLSER, // SPACE=(TRK,(20,05,10)),DISP=(,CATLG), // DCB=(RECFM=FB,LRECL=80,BLKSIZE=3600) //ASM DD DSN=&HLQ..&VRM..ASM,UNIT=&DUNIT,VOL=SER=&DVOLSER, // SPACE=(TRK,(80,10,10)),DISP=(,CATLG), // DCB=(RECFM=FB,LRECL=80,BLKSIZE=3600) //MACLIB DD DSN=&HLQ..&VRM..MACLIB,UNIT=&DUNIT,VOL=SER=&DVOLSER, // SPACE=(TRK,(02,02,02)),DISP=(,CATLG), // DCB=(RECFM=FB,LRECL=80,BLKSIZE=3600) // PEND //* //STEP001 EXEC LOADOTHR Load ALL other PDSs //SYSIN DD * COPY INDD=INCLIST,OUTDD=CLIST COPY INDD=INHELP,OUTDD=HELP COPY INDD=INISPF,OUTDD=ISPF COPY INDD=INASM,OUTDD=ASM COPY INDD=INMACLIB,OUTDD=MACLIB // ______________________________________________________________________ Figure 4: $INST02 JCL a) Member $INST02 installs remaining data sets from distribution tape. b) Review and update JOB statement and other JCL to conform to your installation standard. c) Before submitting the above job, the distribution tape must be made available to MVS by issuing the following command from the Hercules console: DEVINIT 480 X:\dirname\CALNDR2.V0R9M00.HET READONLY=1 where X:\dirname is the complete path to the location of the Hercules Emulated Tape file. d) Issue the following command from the MVS console to vary device 480 online: V 480,ONLINE e) Submit the job. f) Review job output for successful loads. +--------------------------------------------------------------------+ | Step 6. Install TSO parts | +--------------------------------------------------------------------+ | JCL Member: CALNDR2.V0R9M00.CNTL($INST03) | +--------------------------------------------------------------------+ ______________________________________________________________________ //CALNDR23 JOB (SYS),'Install TSO Parts', <-- Review and Modify // CLASS=A,MSGCLASS=X, <-- Review and Modify // MSGLEVEL=(1,1),NOTIFY=&SYSUID <-- Review and Modify //* -------------------------------------------------------* //* * CALNDR2 for MVS3.8J TSO / Hercules * //* * * //* * JOB: $INST03 Install TSO parts * //* * * //* * Note: Duplicate members are over-written. * //* -------------------------------------------------------* //STEP001 EXEC PGM=IEBCOPY //SYSPRINT DD SYSOUT=* //INCLIST DD DSN=CALNDR2.V0R9M00.CLIST,DISP=SHR //INHELP DD DSN=CALNDR2.V0R9M00.HELP,DISP=SHR //OUTCLIST DD DSN=SYS2.CMDPROC,DISP=SHR //OUTHELP DD DSN=SYS2.HELP,DISP=SHR //SYSIN DD * COPY INDD=((INCLIST,R)),OUTDD=OUTCLIST SELECT MEMBER=NO#MBR# /*dummy entry no mbrs! */ COPY INDD=((INHELP,R)),OUTDD=OUTHELP SELECT MEMBER=NO#MBR# /*dummy entry no mbrs! */ /* // ______________________________________________________________________ Figure 5: $INST03 JCL a) Member $INST03 installs TSO component(s). Note: If no TSO components are included for this distribution, ----- RC = 4 is returned by the corresponding IEBCOPY step. b) Review and update JOB statement and other JCL to conform to your installation standard. c) Submit the job. d) Review job output for successful load(s). +--------------------------------------------------------------------+ | Step 7. Install CALNDR2 Programs | +--------------------------------------------------------------------+ | JCL Member: CALNDR2.V0R9M00.CNTL($INST04) | +--------------------------------------------------------------------+ ______________________________________________________________________ //CALNDR24 JOB (SYS),'Install CALNDR2', <-- Review and Modify // CLASS=A,MSGCLASS=X, <-- Review and Modify // MSGLEVEL=(1,1),NOTIFY=&SYSUID <-- Review and Modify //* -------------------------------------------------------* //* * CALNDR2 for MVS3.8J TSO / Hercules * //* * * //* * JOB: $INST04 * //* * Install CALNDR2 Programs * //* * * //* * - Install libraries marked... * //* * - Search for '<--TARGET' * //* * - Update install libraries per your * //* * installation standard * //* * - ISPF System Library marked... * //* * - Search for '<--ISPF SYS LLIB' * //* * - Update system library per your * //* * installation standard * //* * - Compiler STEPLIBs marked... * //* * - Search for '<--Complr STEPLIB' * //* * - Update compiler STEPLIB per your * //* * installation standard * //* * - Compiler Run-time libraries marked... * //* * - Search for '<--RUN-TIME Lib' * //* * - Update compiler RUN-TIME library per your * //* * installation standard * //* * * //* -------------------------------------------------------* //* //* -------------------------------------------------------* //* * * //* * PROC: ASMLKED * //* * Assembler Link-Edit * //* * * //* -------------------------------------------------------* //ASML PROC HLQ=WHATHLQ,VRM=VXRXMXX, // MBR=WHOWHAT //* //ASM EXEC PGM=IFOX00, // PARM='NODECK,LOAD,RENT,TERM,XREF' //SYSGO DD DSN=&&LOADSET,DISP=(MOD,PASS),SPACE=(CYL,(1,1)), // UNIT=VIO,DCB=(DSORG=PS,RECFM=FB,LRECL=80,BLKSIZE=800) //SYSLIB DD DSN=SYS1.MACLIB,DISP=SHR // DD DSN=SYS1.AMODGEN,DISP=SHR // DD DSN=SYS2.MACLIB,DISP=SHR ** YREG ** // DD DSN=&HLQ..&VRM..MACLIB,DISP=SHR * myMACLIB ** //SYSTERM DD SYSOUT=* //SYSPRINT DD SYSOUT=* //SYSPUNCH DD DSN=NULLFILE //SYSUT1 DD UNIT=VIO,SPACE=(CYL,(6,1)) //SYSUT2 DD UNIT=VIO,SPACE=(CYL,(6,1)) //SYSUT3 DD UNIT=VIO,SPACE=(CYL,(6,1)) //SYSIN DD DSN=&HLQ..&VRM..ASM(&MBR),DISP=SHR <--INPUT //* //LKED EXEC PGM=IEWL,PARM='MAP,LIST,LET,RENT,XREF', // COND=(0,NE,ASM) //SYSLIN DD DSN=&&LOADSET,DISP=(OLD,DELETE) // DD DDNAME=SYSIN //SYSLMOD DD DUMMY //SYSPRINT DD SYSOUT=* //SYSUT1 DD UNIT=VIO,SPACE=(CYL,(5,2)) //SYSIN DD DUMMY //* // PEND //* -------------------------------------------------------* //* * * //* * PROC: FGLKED * //* * Fortran G Link-Edit * //* * * //* -------------------------------------------------------* //FGL PROC HLQ=WHATHLQ,VRM=VXRXMXX, // MBR=WHOWHAT //* //FORT EXEC PGM=IEYFORT,REGION=100K //STEPLIB DD DUMMY //SYSPRINT DD SYSOUT=* //SYSPUNCH DD DSN=NULLFILE //SYSLIN DD DSNAME=&LOADSET,DISP=(MOD,PASS),UNIT=SYSSQ, * // SPACE=(80,(200,100),RLSE),DCB=BLKSIZE=80 //SYSIN DD DSN=&HLQ..&VRM..ASM(&MBR),DISP=SHR <--INPUT //* //LKED EXEC PGM=IEWL,REGION=96K,PARM=(XREF,LET,LIST),COND=(4,LT,FORT) //SYSLIB DD DUMMY //SYSLMOD DD DUMMY //SYSPRINT DD SYSOUT=* //SYSUT1 DD UNIT=SYSDA,SPACE=(1024,(100,10),RLSE),DCB=BLKSIZE=1024, * // DSNAME=&SYSUT1 //SYSLIN DD DSNAME=&LOADSET,DISP=(OLD,DELETE) // DD DDNAME=SYSIN //SYSIN DD DUMMY //* // PEND //* -------------------------------------------------------* //* * * //* * PROC: FHLKED * //* * Fortran H Link-Edit * //* * * //* -------------------------------------------------------* //FHL PROC HLQ=WHATHLQ,VRM=VXRXMXX, // MBR=WHOWHAT //* //FORT EXEC PGM=IEKAA00,REGION=228K //STEPLIB DD DUMMY //SYSPRINT DD SYSOUT=* //SYSPUNCH DD DSN=NULLFILE //SYSLIN DD DSNAME=&LOADSET,UNIT=SYSSQ,DISP=(MOD,PASS), * // SPACE=(400,(200,50),RLSE) //SYSIN DD DSN=&HLQ..&VRM..ASM(&MBR),DISP=SHR <--INPUT //* //LKED EXEC PGM=IEWL,REGION=96K,PARM=(XREF,LET,LIST),COND=(4,LT,FORT) //SYSLIB DD DUMMY //SYSLMOD DD DUMMY //SYSPRINT DD SYSOUT=* //SYSUT1 DD UNIT=SYSDA,SPACE=(1024,(200,20),RLSE),DCB=BLKSIZE=1024, * // DSNAME=&SYSUT1 //SYSLIN DD DSNAME=&LOADSET,DISP=(OLD,DELETE) // DD DDNAME=SYSIN //SYSIN DD DUMMY //* // PEND //* -------------------------------------------------------* //* * * //* * PROC: PLIFLKED * //* * PL/I (F) Link-Edit * //* * * //* -------------------------------------------------------* //PLIFL PROC HLQ=WHATHLQ,VRM=VXRXMXX, // MBR=WHOWHAT //* //PL1L EXEC PGM=IEMAA,PARM='LOAD,NODECK',REGION=128K //SYSPRINT DD SYSOUT=* //SYSPUNCH DD DSN=NULLFILE //SYSLIN DD DSNAME=&&LOADSET,DISP=(MOD,PASS),UNIT=SYSDA, * // SPACE=(80,(250,100)) //SYSUT3 DD DSNAME=&&SYSUT3,UNIT=SYSDA,SPACE=(80,(250,250)), * // DCB=BLKSIZE=80 //SYSUT1 DD DSNAME=&&SYSUT1,UNIT=SYSDA,SPACE=(1024,(60,60),,CONTIG),* // SEP=(SYSUT3,SYSLIN),DCB=BLKSIZE=1024 //SYSIN DD DSN=&HLQ..&VRM..ASM(&MBR),DISP=SHR <--INPUT //* //LKED EXEC PGM=IEWL,REGION=96K,PARM=(XREF,LIST),COND=(9,LT,PL1L) //SYSLIB DD DUMMY //SYSLMOD DD DUMMY //SYSPRINT DD SYSOUT=* //SYSUT1 DD UNIT=SYSDA,SPACE=(1024,(200,20),RLSE),DCB=BLKSIZE=1024, * // DSNAME=&SYSUT1 //SYSLIN DD DSNAME=&LOADSET,DISP=(OLD,DELETE) // DD DDNAME=SYSIN //SYSIN DD DUMMY //* // PEND //* -------------------------------------------------------* //* * * //* * PROC: GCCLKED * //* * GCC MVS Link-Edit * //* * * //* -------------------------------------------------------* //GCCL PROC HLQ=WHATHLQ,VRM=VXRXMXX, // MBR=WHOWHAT, // SOUT='*', // PDPPREF='PDPCLIB', // COPTS='-S -v', // COS1='-ansi -pedantic-errors', // COS2='-o dd:out -', // INFILE='', // OUTFILE='' //* //GCC EXEC PGM=GCC,REGION=4096K, // PARM='&COS1 &COPTS &COS2' //STEPLIB DD DUMMY //* //* INCLUDE SHOULD HAVE YOUR OWN HEADERS ADDED //* //INCLUDE DD DSN=&PDPPREF..INCLUDE,DISP=SHR,DCB=BLKSIZE=32720 //SYSINCL DD DSN=&PDPPREF..INCLUDE,DISP=SHR,DCB=BLKSIZE=32720 //SYSIN DD DSN=&INFILE,DISP=SHR //OUT DD DSN=&&TEMP,DISP=(,PASS),UNIT=SYSALLDA, // DCB=(LRECL=80,BLKSIZE=6160,RECFM=FB), // SPACE=(6160,(500,500)) //SYSPRINT DD SYSOUT=&SOUT //SYSTERM DD SYSOUT=&SOUT //* //ASM EXEC PGM=IFOX00, // PARM='DECK,NOLIST', // COND=(4,LT,GCC) //SYSLIB DD DSN=SYS1.MACLIB,DISP=SHR,DCB=BLKSIZE=32720 // DD DSN=&PDPPREF..MACLIB,DISP=SHR //SYSUT1 DD UNIT=SYSALLDA,SPACE=(CYL,(20,10)) //SYSUT2 DD UNIT=SYSALLDA,SPACE=(CYL,(10,10)) //SYSUT3 DD UNIT=SYSALLDA,SPACE=(CYL,(10,10)) //SYSPRINT DD SYSOUT=&SOUT //SYSLIN DD DUMMY //SYSGO DD DUMMY //SYSPUNCH DD DSN=&&OBJSET,UNIT=SYSALLDA,SPACE=(80,(200,200)), // DISP=(,PASS) //SYSIN DD DSN=&&TEMP,DISP=(OLD,DELETE) //* //LKED EXEC PGM=IEWL,PARM='&LOPTS', // COND=((4,LT,GCC),(4,LT,ASM)) //SYSLIN DD DSN=&&OBJSET,DISP=(OLD,DELETE) // DD DDNAME=SYSIN //SYSIN DD DUMMY //SYSLIB DD DSN=&PDPPREF..NCALIB,DISP=SHR //SYSLMOD DD DSN=&OUTFILE, // DISP=SHR //SYSUT1 DD UNIT=SYSALLDA,SPACE=(CYL,(2,1)) //SYSPRINT DD SYSOUT=&SOUT //* // PEND //* //* -------------------------------------------------------* //* * Assemble Link-Edit LBCC2I to ISPLLIB * //* -------------------------------------------------------* //LBCC2I EXEC ASML,HLQ=CALNDR2,VRM=V0R9M00,MBR=LBCC2I, // PARM.ASM='NODECK,LOAD,TERM,XREF', // PARM.LKED='MAP,LIST,LET,XREF' //LKED.SYSLMOD DD DISP=SHR, // DSN=XXXXXXXX.ISPLLIB(&MBR) <--TARGET //* //* -------------------------------------------------------* //* * Assemble Link-Edit LBCI2C to ISPLLIB * //* -------------------------------------------------------* //LBCI2C EXEC ASML,HLQ=CALNDR2,VRM=V0R9M00,MBR=LBCI2C, // PARM.ASM='NODECK,LOAD,TERM,XREF', // PARM.LKED='MAP,LIST,LET,XREF' //LKED.SYSLMOD DD DISP=SHR, // DSN=XXXXXXXX.ISPLLIB(&MBR) <--TARGET //* //* -------------------------------------------------------* //* * Assemble Link-Edit LBISPL to ISPLLIB * //* -------------------------------------------------------* //LBISPL EXEC ASML,HLQ=CALNDR2,VRM=V0R9M00,MBR=LBISPL, // PARM.ASM='NODECK,LOAD,TERM,XREF,RENT', // PARM.LKED='MAP,LIST,LET,RENT,XREF,REUS,REFR' //LKED.SYSLMOD DD DISP=SHR, // DSN=XXXXXXXX.ISPLLIB(&MBR) <--TARGET //LKED.SYSLIB DD DSNAME=ISP.V2R2M0.LLIB,DISP=SHR <--ISPF SYS LLIB //* //* -------------------------------------------------------* //* * Assemble Link-Edit LBWTRM to ISPLLIB * //* -------------------------------------------------------* //LBWTRM EXEC ASML,HLQ=CALNDR2,VRM=V0R9M00,MBR=LBWTRM, // PARM.ASM='NODECK,LOAD,TERM,XREF', // PARM.LKED='MAP,LIST,LET,XREF' //LKED.SYSLMOD DD DISP=SHR, // DSN=XXXXXXXX.ISPLLIB(&MBR) <--TARGET //* //* -------------------------------------------------------* //* * Assemble Link-Edit LBWTRMP to ISPLLIB * //* -------------------------------------------------------* //LBWTRMP EXEC ASML,HLQ=CALNDR2,VRM=V0R9M00,MBR=LBWTRMP, // PARM.ASM='NODECK,LOAD,TERM,XREF', // PARM.LKED='MAP,LIST,LET,XREF' //LKED.SYSLMOD DD DISP=SHR, // DSN=XXXXXXXX.ISPLLIB(&MBR) <--TARGET //* //* -------------------------------------------------------* //* * Fortran G Link-Edit CALNDRFG to ISPLLIB * //* -------------------------------------------------------* //CALNDRFG EXEC FGL,HLQ=CALNDR2,VRM=V0R9M00,MBR=CALNDRFG, // PARM.FORT='LIST,MAP', // PARM.LKED='MAP,LIST,LET,XREF' //FORT.STEPLIB DD DSN=SYSC.LINKLIB,DISP=SHR <--Complr STEPLIB //LKED.SYSLIB DD DSNAME=SYSC.FORTLIB,DISP=SHR <--RUN-TIME Lib // DD DSNAME=XXXXXXXX.ISPLLIB,DISP=SHR <--Subroutines // DD DSNAME=ISP.V2R2M0.LLIB,DISP=SHR <--ISPF SYS LLIB //LKED.SYSLMOD DD DISP=SHR, // DSN=XXXXXXXX.ISPLLIB(&MBR) <--TARGET //* //* -------------------------------------------------------* //* * Fortran H Link-Edit CALNDRFH to ISPLLIB * //* -------------------------------------------------------* //CALNDRFH EXEC FHL,HLQ=CALNDR2,VRM=V0R9M00,MBR=CALNDRFH, // PARM.FORT='LIST,MAP', // PARM.LKED='MAP,LIST,LET,XREF' //FORT.STEPLIB DD DSN=SYSC.LINKLIB,DISP=SHR <--Complr STEPLIB //LKED.SYSLIB DD DSNAME=SYSC.FORTLIB,DISP=SHR <--RUN-TIME Lib // DD DSNAME=XXXXXXXX.ISPLLIB,DISP=SHR <--Subroutines // DD DSNAME=ISP.V2R2M0.LLIB,DISP=SHR <--ISPF SYS LLIB //LKED.SYSLMOD DD DISP=SHR, // DSN=XXXXXXXX.ISPLLIB(&MBR) <--TARGET //* //* -------------------------------------------------------* //* * PL/I (F) Link-Edit CALNDRP to ISPLLIB * //* -------------------------------------------------------* //CALNDRP EXEC PLIFL,HLQ=CALNDR2,VRM=V0R9M00,MBR=CALNDRP, // PARM.PL1L='LOAD,NODECK,XREF,EXTREF,LIST,ATR,SOURCE2', // PARM.LKED='MAP,LIST,LET,XREF' //PL1L.STEPLIB DD DSN=SYSC.LINKLIB,DISP=SHR <--Complr STEPLIB //LKED.SYSLIB DD DSNAME=SYSC.PL1LIB,DISP=SHR <--RUN-TIME Lib // DD DSNAME=XXXXXXXX.ISPLLIB,DISP=SHR <--Subroutines // DD DSNAME=ISP.V2R2M0.LLIB,DISP=SHR <--ISPF SYS LLIB //LKED.SYSLMOD DD DISP=SHR, // DSN=XXXXXXXX.ISPLLIB(&MBR) <--TARGET //* //* -------------------------------------------------------* //* * GCC MVS Link-Edit CALNDRGC to ISPLLIB * //* -------------------------------------------------------* //CALNDRGC EXEC GCCL,HLQ=CALNDR2,VRM=V0R9M00,MBR=CALNDRGC, // PARM.ASM='DECK,LIST', // PARM.LKED='MAP,XREF,LET,LIST' //GCC.STEPLIB DD DSN=SYS2.GCC.LINKLIBN,DISP=SHR <--Complr STEPLIB //GCC.SYSIN DD DSN=&HLQ..&VRM..ASM(&MBR),DISP=SHR //LKED.SYSLIB DD // DD DSNAME=XXXXXXXX.ISPLLIB,DISP=SHR <--Subroutines // DD DSNAME=ISP.V2R2M0.LLIB,DISP=SHR <--ISPF SYS LLIB //LKED.SYSLMOD DD DISP=SHR, // DSN=XXXXXXXX.ISPLLIB(&MBR) <--TARGET // ______________________________________________________________________ Figure 6: $INST04 JCL a) Member $INST04 installs program(s). b) Review and update JOB statement and other JCL to conform to your installation standard. c) Submit the job. d) Review job output for successful completion. Below is a JOB LOG of all steps and return codes for $INST04 for comparison purposes: 15.09.01 JOB 2897 $HASP373 CALNDR24 STARTED - INIT 1 - CLASS A - SYS BSP1 15.09.01 JOB 2897 IEF403I CALNDR24 - STARTED - TIME=15.09.01 15.09.01 JOB 2897 IEFACTRT - Stepname Procstep Program Retcode 15.09.01 JOB 2897 CALNDR24 LBCC2I ASM IFOX00 RC= 0000 15.09.01 JOB 2897 CALNDR24 LBCC2I LKED IEWL RC= 0000 15.09.01 JOB 2897 CALNDR24 LBCI2C ASM IFOX00 RC= 0000 15.09.01 JOB 2897 CALNDR24 LBCI2C LKED IEWL RC= 0000 15.09.01 JOB 2897 CALNDR24 LBISPL ASM IFOX00 RC= 0000 15.09.01 JOB 2897 CALNDR24 LBISPL LKED IEWL RC= 0000 15.09.01 JOB 2897 CALNDR24 LBWTRM ASM IFOX00 RC= 0000 15.09.01 JOB 2897 CALNDR24 LBWTRM LKED IEWL RC= 0000 15.09.02 JOB 2897 CALNDR24 LBWTRMP ASM IFOX00 RC= 0000 15.09.02 JOB 2897 CALNDR24 LBWTRMP LKED IEWL RC= 0000 15.09.02 JOB 2897 CALNDR24 CALNDRFG FORT IEYFORT RC= 0000 15.09.02 JOB 2897 CALNDR24 CALNDRFG LKED IEWL RC= 0000 15.09.02 JOB 2897 CALNDR24 CALNDRFH FORT IEKAA00 RC= 0004 15.09.02 JOB 2897 CALNDR24 CALNDRFH LKED IEWL RC= 0000 15.09.02 JOB 2897 CALNDR24 CALNDRP PL1L IEMAA RC= 0004 15.09.02 JOB 2897 CALNDR24 CALNDRP LKED IEWL RC= 0000 15.09.03 JOB 2897 CALNDR24 CALNDRGC GCC GCC RC= 0000 15.09.03 JOB 2897 CALNDR24 CALNDRGC ASM IFOX00 RC= 0000 15.09.03 JOB 2897 CALNDR24 CALNDRGC LKED IEWL RC= 0000 15.09.03 JOB 2897 IEF404I CALNDR24 - ENDED - TIME=15.09.03 15.09.03 JOB 2897 $HASP395 CALNDR24 ENDED +--------------------------------------------------------------------+ | Step 8. Install ISPF parts | +--------------------------------------------------------------------+ | JCL Member: CALNDR2.V0R9M00.CNTL($INST05) | +--------------------------------------------------------------------+ ______________________________________________________________________ //CALNDR25 JOB (SYS),'Install ISPF Parts', <-- Review and Modify // CLASS=A,MSGCLASS=X, <-- Review and Modify // MSGLEVEL=(1,1),NOTIFY=&SYSUID <-- Review and Modify //* -------------------------------------------------------* //* * CALNDR2 in MVS3.8J TSO / Hercules * //* * * //* * JOB: $INST05 Install ISPF parts * //* * * //* * Note: Duplicate members are over-written. * //* * * //* * * //* * - Uses ISPF 2.1 product from Wally Mclaughlin * //* * - Install libraries marked... * //* * - Search for '<--TARGET' * //* * - Update install libraries per your * //* * installation standard * //* * * //* -------------------------------------------------------* //* //* -------------------------------------------------------* //* * * //* * PROC: PARTSISPF * //* * Copy ISPF Parts * //* * * //* -------------------------------------------------------* //PARTSI PROC HLQ=MYHLQ,VRM=VXRXMXX, // CLIB='XXXXXXXX.ISPCLIB', // MLIB='XXXXXXXX.ISPMLIB', // PLIB='XXXXXXXX.ISPPLIB', // SLIB='XXXXXXXX.ISPSLIB', // TLIB='XXXXXXXX.ISPTLIB' //* //* -------------------------------------------------------* //* * * //* * CLIB Member Installation * //* * * //* * Suggested Location: * //* * DSN defined or concatenated to ISPCLIB DD * //* * * //* * Note: If you use a new PDS, it must be defined * //* * before executing this install job AND the * //* * ISPF start-up procedure should include the * //* * new PDS in the ISPCLIB allocation step. * //* * * //* -------------------------------------------------------* //ADDCLIB EXEC PGM=IEBCOPY //SYSPRINT DD SYSOUT=* //CLIBIN DD DSN=&HLQ..&VRM..ISPF,DISP=SHR //CLIBOUT DD DSN=&CLIB,DISP=SHR //SYSIN DD DUMMY //* //* -------------------------------------------------------* //* * * //* * MLIB Member Installation * //* * * //* * Suggested Location: * //* * DSN defined or concatenated to ISPMLIB DD * //* * * //* * Note: If you use a new PDS, it must be defined * //* * before executing this install job AND the * //* * ISPF start-up procedure should include the * //* * new PDS in the ISPMLIB allocation step. * //* * * //* -------------------------------------------------------* //ADDMLIB EXEC PGM=IEBCOPY //SYSPRINT DD SYSOUT=* //MLIBIN DD DSN=&HLQ..&VRM..ISPF,DISP=SHR //MLIBOUT DD DSN=&MLIB,DISP=SHR //SYSIN DD DUMMY //* //* -------------------------------------------------------* //* * * //* * PLIB Member Installation * //* * * //* * Suggested Location: * //* * DSN defined or concatenated to ISPPLIB DD * //* * * //* * Note: If you use a new PDS, it must be defined * //* * before executing this install job AND the * //* * ISPF start-up procedure should include the * //* * new PDS in the ISPPLIB allocation step. * //* * * //* -------------------------------------------------------* //ADDPLIB EXEC PGM=IEBCOPY //SYSPRINT DD SYSOUT=* //PLIBIN DD DSN=&HLQ..&VRM..ISPF,DISP=SHR //PLIBOUT DD DSN=&PLIB,DISP=SHR //SYSIN DD DUMMY //* //* -------------------------------------------------------* //* * * //* * SLIB Member Installation * //* * * //* * Suggested Location: * //* * DSN defined or concatenated to ISPSLIB DD * //* * * //* * Note: If you use a new PDS, it must be defined * //* * before executing this install job AND the * //* * ISPF start-up procedure should include the * //* * new PDS in the ISPSLIB allocation step. * //* * * //* -------------------------------------------------------* //ADDSLIB EXEC PGM=IEBCOPY //SYSPRINT DD SYSOUT=* //SLIBIN DD DSN=&HLQ..&VRM..ISPF,DISP=SHR //SLIBOUT DD DSN=&SLIB,DISP=SHR //SYSIN DD DUMMY //* //* //* -------------------------------------------------------* //* * * //* * TLIB Member Installation * //* * * //* * Suggested Location: * //* * DSN defined or concatenated to ISPTLIB DD * //* * * //* * Note: If you use a new PDS, it must be defined * //* * before executing this install job AND the * //* * ISPF start-up procedure should include the * //* * new PDS in the ISPTLIB allocation step. * //* * * //* -------------------------------------------------------* //ADDTLIB EXEC PGM=IEBCOPY //SYSPRINT DD SYSOUT=* //TLIBIN DD DSN=&HLQ..&VRM..ISPF,DISP=SHR //TLIBOUT DD DSN=&TLIB,DISP=SHR //SYSIN DD DUMMY //* // PEND //* //ISPF EXEC PARTSI,HLQ=CALNDR2,VRM=V0R9M00, // CLIB='XXXXXXXX.ISPCLIB', <--TARGET // MLIB='XXXXXXXX.ISPMLIB', <--TARGET // PLIB='XXXXXXXX.ISPPLIB', <--TARGET // SLIB='XXXXXXXX.ISPSLIB', <--TARGET // TLIB='XXXXXXXX.ISPTLIB' <--TARGET //ADDCLIB.SYSIN DD * CLIB COPY INDD=((CLIBIN,R)),OUTDD=CLIBOUT SELECT MEMBER=CCLNDRFG SELECT MEMBER=CCLNDRFH SELECT MEMBER=CCLNDRGC //ADDMLIB.SYSIN DD * MLIB COPY INDD=((MLIBIN,R)),OUTDD=MLIBOUT SELECT MEMBER=NO#MBR# /*dummy entry no mbrs! */ //ADDPLIB.SYSIN DD * PLIB COPY INDD=((PLIBIN,R)),OUTDD=PLIBOUT SELECT MEMBER=PCALNDRF //ADDSLIB.SYSIN DD * SLIB COPY INDD=((SLIBIN,R)),OUTDD=SLIBOUT SELECT MEMBER=NO#MBR# /*dummy entry no mbrs! */ //ADDTLIB.SYSIN DD * TLIB COPY INDD=((TLIBIN,R)),OUTDD=TLIBOUT SELECT MEMBER=NO#MBR# /*dummy entry no mbrs! */ // ______________________________________________________________________ Figure 7: $INST05 JCL a) Member $INST05 installs ISPF component(s). Note: If no ISPF components are included for this distribution, ----- RC = 4 is returned by the corresponding IEBCOPY step. b) Review and update JOB statement and other JCL to conform to your installation standard. c) Review and update DD statements for ISPCLIB (clist), ISPMLIB (messages), and/or ISPPLIB (panel) library names. The DD statements are tagged with '<--TARGET'. d) Submit the job. e) Review job output for successful load(s). +--------------------------------------------------------------------+ | Step 9. Install Other Program(s) | +--------------------------------------------------------------------+ | JCL Member: CALNDR2.V0R9M00.CNTL($INST40) | +--------------------------------------------------------------------+ ______________________________________________________________________ //CALNR240 JOB (SYS),'Install Other Pgms', <-- Review and Modify // CLASS=A,MSGCLASS=X, <-- Review and Modify // MSGLEVEL=(1,1),NOTIFY=&SYSUID <-- Review and Modify //* -------------------------------------------------------* //* * CALNDR2 for MVS3.8J TSO / Hercules * //* * * //* * JOB: $INST40 * //* * Install xxxxxx Programs * //* * **Note: Dummy job, no other programs! * //* * * //* * * //* -------------------------------------------------------* //* //* -------------------------------------------------------* //* * IEFBR14 * //* -------------------------------------------------------* //DUMMY EXEC PGM=IEFBR14 //SYSPRINT DD SYSOUT=* // ______________________________________________________________________ Figure 8: $INST40 JCL Note: No other programs require installation. ----- Please proceed to next step. a) Member $INST40 installs additional programs. b) Review and update JOB statement and other JCL to conform to your installation standard. c) Submit the job. d) Review job output for successful completion. +--------------------------------------------------------------------+ | Step 10. Validate CALNDR2 | +--------------------------------------------------------------------+ The purpose of this step is to execute different CALNDR components to display a yearly calendar. Each program offer the same function, but the underlying source language is different. a) To execute the Fortran G solution - From the ISPF Main Menu, enter the following command: TSO %CCLNDRFG To exit, use PF3. b) To execute the Fortran H solution - From the ISPF Main Menu, enter the following command: TSO %CCLNDRFH To exit, use PF3. c) To execute the PL/I (F) solution - From the ISPF Main Menu, enter the following command: TSO CALNDRP To exit, use PF3. d) To execute the GCC solution - From the ISPF Main Menu, enter the following command: TSO %CCLNDRGC To exit, use PF3. ________________________________________________________________________________ ------------------------ Calendar Sample using GCC -------------------------- Command ===> Scroll ==> PAGE Dummy dates: Year: 1993 MM / DD S M T W T F S Starting ===> 01 / 01 ----------------------------- Ending ===> 12 / 31 ¦ JAN 1 2 ¦ ¦ 3 4 5 6 7 8 9 ¦ ¦ 10 11 12 13 14 15 16 ¦ ¦ 17 18 19 20 21 22 23 ¦ ¦ 24 25 26 27 28 29 30 ¦ ¦ 31 1 2 3 4 5 6 ¦ ¦ FEB 7 8 9 10 11 12 13 ¦ ----------------------------- Enter UP or DOWN command to scroll through calendar. ________________________________________________________________________________ Figure 9a: Sample PCALNDR Calendar Panel Note- solution language is displayed on header line e) Validation for CALNDR2 is complete. +--------------------------------------------------------------------+ | Step 11. Done | +--------------------------------------------------------------------+ a) Congratulations! You completed the installation for CALNDR2. +--------------------------------------------------------------------+ | Step 12. Incorporate CALNDR2 into ISPF UTILITY SELECTION Menu | +--------------------------------------------------------------------+ a) Not applicable. Enjoy CALNDR2 for ISPF 2.x on MVS 3.8J! ====================================================================== * IV. S o f t w a r e I n v e n t o r y L i s t | ====================================================================== - CALNDR2.V0R9M00.ASM . CALNDRFG TSO CP Fortran G pgm w ISPF services to display calendar . CALNDRFH TSO CP Fortran H pgm w ISPF services to display calendar . CALNDRGC TSO CP GCC MVS pgm w ISPF services to display calendar . CALNDRP TSO CP PL/I (F) pgm w ISPF services to display calendar . LBCC2I Convert Character Digit to Integer (for Fortran CP) . LBCI2N Convert Integer to Character Digits (for Fortran CP) . LBISPL Source pgm - ISPLINK API . LBWTRM Write Message to TSO Terminal Display . LBWRTMP Write Message to TSO Terminal Display - PL/I (F) version - CALNDR2.V0R9M00.CLIST . README Dummy member, this is intentional - CALNDR2.V0R9M00.CNTL . $INST00 Define Alias for HLQ CALNDR2 . $INST01 Load CNTL data set from distribution tape (HET) . $INST02 Load other data sets from distribution tape (HET) . $INST03 Install TSO Parts . $INST04 Install CALNDR2 CP and utilities . $INST05 Install ISPF Parts . $INST40 Install Other programs . $RECVXMI Receive XMI SEQ to MVS PDSs via RECV370 . DSCLAIMR Disclaimer . PREREQS Required User-mods . README Documentation and Installation instructions - CALNDR2.V0R9M00.HELP . README Dummy member, this is intentional - CALNDR2.V0R9M00.ISPF . PCALNDRF Calendar Panel for CALNDRF (Fortran G) . CCLNDRFG Fortran G Calendar CLIST . CCLNDRFH Fortran H Calendar CLIST . CCLNDRGC GCC MVS Calendar CLIST - CALNDR2.V0R9M00.MACLIB . README Dummy member, this is intentional
In Closing
With four more solutions, you are provided with compare and contrast opportunities across additional higher-level languages using (attempting to use) the same logic flow.
While creating the various CALNDR2 CPs, some additional subroutines were necessary to satisfy the exercise which include:
- LBWTRM – display message on TSO terminal
- LBWTRMP – same as LBWTRM for PL/I (F)
- LBCI2C – convert 4-byte integer (binary value) to character numeric format
- LBCC2I – convert character numeric format to 4-byte integer (binary value)
The following manuals were referenced in this exercise:
- GC28-6515-10 IBM S/360 and S/370 FORTRAN IV Language
- GC28-2007-4 Time Sharing System FORTRAN IV
- SC28-6852-1 IBM OS FORTRAN H Programmer’s Guide
- C28-6594-4 IBM S/360 PL/1 (F) Programmer’s Guide
- GC33-4021-1 OS/VS Assembler Programmer’s Guide
- SC34-2036-1 System Productivity Facility Dialog Management Services
This was a learning and educational exercise, indeed!
Try translating between computer languages near real-time… Your head will spin.
The biggest challenge (for me!) was attention to detail regarding language syntax, variable declaration, and statement delimiters. Not to mention reviewing assembler code generated by each compiler to confirm address parameter list composition.
Thanks and Enjoy!
Version History
Date | Version | Description |
2022-03-20 | 0.9.00 | ♦ Initial version released to MVS 3.8J hobbyist public domain |
This is all just great, thank you very much.
Now even if BREXX integrated with ISPF we would have an environment very similar to the “real” one
Thanks, Marco.
It was a challenge but worth the sharing with the MVS 3.8J community.