MVS TOOLS AND TRICKS OF THE TRADE June 1989 Sam Golob MVS Systems Programmer sbgolob@cbttape.org RETRIEVING MATERIAL FROM IBM'S SOURCE TAPES This monthly column is for sharing practical advice and techniques which can be employed in your shop. We hope to provide stimulating discussion and help to as large a group of MVS systems programmers as possible. As many of you already know, this column depends largely on you, the reading public, for contributions and ideas. We greatly appreciate calls and messages from interested readers who will ask me to write about some favorite trick or method of theirs. Just send a message to sbgolob@cbttape.org. Please include your phone number. A quick word about software tools. This column is task oriented. In other words, the idea is to learn how to get a job done. Whatever software tool will work, is fine. We have tried, however, to make all of the techniques as accessible to as many people as possible, REGARDLESS OF BUDGET. For this reason, we refer to the many quality public-domain offerings available on the Connecticut Bank and Trust MVS Tape (known as the CBT Tape) and the NaSPA V.I.P. MVS tapes. To obtain a CBT tape (which contains HUNDREDS of software packages), go online to www.cbttape.org. Our topic this month concerns an uncommon MVS skill, a method of EASILY RETRIEVING MATERIAL FROM IBM's "SYMBOLIC" OPTIONAL MATERIAL SOURCE TAPES. Many shops keep these tapes in boxes, stuffed into some out-of-the-way corner. It may surprise you, that you can actually ASSEMBLE AND LINKEDIT BASE VERSIONS OF IBM CODE on five or ten minutes' notice, if these tapes have been set up properly. I know. I do it all the time. The paper copies or on-line material provided by these assemblies or source listings are much easier to follow than fiche (and paper can be taken to places where you don't have a fiche reader). They can often provide research information that is much more detailed than what can be found in any manual. Of course, source is usually only provided at THE BASE LEVEL OF A SOFTWARE RELEASE. For the higher levels, you have to refer to fiche, but often the logic is completely apparent from the provided machine-readable source. So how can we get started? Our first objective is to find out WHERE THE SOURCE CODE FOR A GIVEN MODULE IS. A secondary related question is: if there are several levels of a product, are we pulling the source FROM THE BEST LEVEL FOR OUR SYSTEM? After we get the source at the proper level, the second question is: CAN WE ACTUALLY ASSEMBLE THIS SOURCE TO OBTAIN A LISTING OR A LOAD MODULE? The rest of the way, we shall show how to prepare your source tapes for easy retrievability. Documentation for the entire system can be found on files 188 and 189 of the CBT tape. FACT. IBM source tapes are NON-LABELED tapes, whose card-image files are unloaded in IEBUPDTE SYSIN FORMAT on one or many tape files. The tape files usually have a block size of 12000. Since the tapes are non-labeled, IT IS POSSIBLE TO ASSIGN AN ARBITRARY 6-CHARACTER VOLSER TO EACH TAPE. This can be done (in good conscience) with paper labels, once you've decided on a labeling scheme that suits you. IT IS NOT NECESSARY TO HAVE "GOOD NAMES". ANY UNIQUE NAME ON EACH TAPE WILL BE FINE. We now need two software tools from the CBT tape. The first and most important is the TAPEMAP program on file 299. The second (believe it or not) is the CBT tape's own compress-decompress program called "CBT973" whose source is on file 2. You should assemble and linkedit these programs in your shop. It is very preferable (though not entirely necessary) to use a version of TAPEMAP from a very recent CBT tape (version 299 or higher), because that version can read a CBT-compressed file in IEBUPDTE SYSIN format directly, and REPORT ALL THE MEMBER NAMES of the unloaded AND COMPRESSED members. TAPEMAP reads a tape and produces two reports. The first report does what most tape mapping utilities do, and a little more. It shows block sizes and block counts from scanning (and optionally from tape labels). It has very accurate footage counts for all the files, if it obtained them from scanning. In addition, TAPEMAP recognizes tape files IN ABOUT TEN STANDARD UNLOAD FORMATS, and IT REPORTS ANY FORMAT IT RECOGNIZES (e.g. IEBCOPY, IEBUPDTE, SMPPTFIN, or even CBT973 in the most recent incarnation). This special unload format information appears in report one, on the left side next to the name and description of the file. TAPEMAP's REPORT TWO is special. If TAPEMAP recognized a special-format file, such as IEBUPDTE or IEBCOPY, the NAMES OF ALL ITS MEMBERS ARE SHOWN IN THIS REPORT. Remember that IBM's source tape files are all in IEBUPDTE unload format, so that TAPEMAP's REPORT TWO WILL LIST ALL THE NAMES OF THE UNLOADED MEMBERS. This will be the key to finding WHICH FILE(S) ON WHICH TAPE(S) CONTAIN THE SOURCE MEMBERS YOU ARE LOOKING FOR. It only remains to find a way of placing the TAPEMAP reports from each source tape in a file or a PDS so that access to member names and file numbers will be easy and convenient. Once the location of your source is determined, a standard tape-load job will load a partitioned dataset with your source from the appropriate tape file. How should we proceed? A bing-bang-boom quick solution is provided by the extremely versatile "PDS Program Product, version 8.x" that is on file 182 of the CBT tape. Once "PDS" is available, with its global (over an entire partitioned dataset) FIND capability for search strings, instant access to member names becomes a reality. I do as follows. I label all my source tapes. Then I use canned JCL in the form of repeated executions of a PROC (see figure one) to TAPEMAP each tape. I run the two outputs into two members of a "tapemap PDS", LRECL 133, that contains only TAPEMAP reports. I then execute the "PDS" program product against the library of TAPEMAP reports, and use the FIND command to get all occurrences of the module name I want to find. If there is more than one occurrence, I need merely decide which tape better reflects my current level of the module. Then, knowing the location of the module, I load it from the correct tape, down to disk. You can go this far, and get a big improvement over the previous situation (of not using the source at all). This much organization is adequate for most people, if the source tapes can be strategically placed somewhere near the computer room, where you or the operators can get to them. In my shop, I had to go one step further. Our problem was limited shelf space in the computer room. Boxes of sixty-or-so various-sized out-of-house tapes was far too confusing for our operators to handle. The fact that the tapes were non-labeled made the situation completely impossible to manage without my personal intervention. I wanted to be able to load source down when I was dialed in from home. Here was my big idea. Wait. The IBM tapes are in IEBUPDTE SYSIN format. The CBT tape is in IEBUPDTE SYSIN format too, but is further compressed by the CBT973 program. Why not carefully compress many source tapes onto a few large super-reels to keep in the computer room. Let them be standard-labeled with revealing file names. Then a slightly more complicated disk-load job would perform the function that I desire, and the operators would be able to handle it for me at a distance. Careful planning would be necessary. The first step, as before, was to assign volume serial designations and put paper labels on all the tapes, then TAPEMAP them all. The process stows the two reports as two members of the "map partitioned dataset" for each tape read. Then we use the footage counts from all the "report one" listings to plan which tapes can fit on the larger tapes to fill them up. My rough experience was that the compressed files occupied about 60 percent of the footage that the uncompressed ones did. Then, the individual compress-combine jobs had to be laid out for each big tape. This was tedious. See figure two for an example. The planned larger tapes were INITted, and the "combine" jobs were run carefully, under my supervision. Since the original IBM tapes are unlabelled, mounting the wrong source tape at this stage would mess the process up. Once the large tapes have been created, the new version of TAPEMAP, which can read CBT973-compressed IEBUPDTE files and report member names, is used to map the larger tapes and add their reports to the "map partitioned dataset". Then, once a member is found on a large tape, a reload job (figure three) is run to load the correct file to disk. This is my system. At this point, we are capable of loading any of our source to disk in a short time. But I promised you ASSEMBLIES. For that, you have to know where to get the IBM Internal ASSEMBLER MACROS. IBM code often uses the normal system macros in SYS1.MACLIB and SYS1.AMODGEN. However, each of their program products may have its own "pet collection" of macros to make coding easier for the developers. IBM source-maintained program products such as JES2, JES3, and CICS have their own macros in distribution libraries, such as SYS1.HASPSRC, SYS1.JES3MAC, and CICS.MACLIB. Other object-oriented program products have what is called "private macro libraries" or PVTMACS, that are contained in the symbolic machine-readable optional material source tapes we are talking about. Usually the private macros from one program product are found on a single separate file of the optional materials tape for that product. You can sometimes spot the PVTMACS file from a TAPEMAP "report two" listing by the diversity of member names in the one file. Source modules in one file usually have names that are similar to each other. Macros in one file usually don't. If you have access to any of IBM's printed material describing the contents of their "optional materials" tapes (this is usually in the program directory), the component designation "AAPVT" denotes a "private macro" library for a product. Look at the TAPEMAP "report two" listings for all your tapes and see if you can spot all the private macro libraries. You can then combine them all (if there are no common members) into a large macro library you can call SYS1.PVTMACS. You may need more than one such library because of source material at various product levels, such as VTAM 2.1 and VTAM 2.2. Just make sure the concatenation sequence during assembly is "latest level first", or whatever is appropriate for the circumstances. By saving the "private macro" libraries online, and by loading individual source modules to disk as needed, the objective of doing quick assemblies of IBM source code can often be achieved. See figure four for an example of such an assembly. I would like to close by mentioning the existence of a fine product which is very interesting to use. This is the SLAC (Stanford Linear ACcelerator) version of Assembler H version 2. Of course, your site must be licensed for Assembler H version 2 to run the SLAC assembler. The SLAC assembler is about a one-fifth rewrite of IBM's assembler H version 2, and is functionally stabilized at about a 1984 or 1985 PUT Level. It has many additional features which are fun to use, among which is a complete report of WHERE EVERY MACRO CAME FROM, or EVEN IF IT IS MISSING. There are many many other helpful features. I feel bad that IBM did not adopt most of them (yet). I run the SLAC assembler in my shop, calling it by the program name AEV90. It is not too easy to obtain the SLAC assembler, but anyone who is really interested can contact me through the magazine, and if you're persistent, I'll try to direct you so you can get a copy. Good luck with all of this. See you next month. * * * * * * * * * * * * * * * * * * * * * FIGURE ONE. //TSTBFP2M JOB (TS,2322),'TECH.SUPP-SAM.GOLOB',CLASS=M,NOTIFY=TSTBSSG, // MSGLEVEL=(1,1),MSGCLASS=T TYPRUN=HOLD //* //**************************************************************** //* * //* OUTPUT OF TAPEMAP PROGRAM SENT TO TST.SYMTAPE.MAPS * //* * //**************************************************************** //TAPEMAP PROC VOL=XXXXXX,M='M',DRIVE=TAPE //TAKEMAP EXEC PGM=TAPEMAP //STEPLIB DD DSN=TST.TSO.CMDLIB,DISP=SHR //SYSPRINT DD DSN=&&TMP,DISP=(NEW,PASS,DELETE),UNIT=SYSDA, // SPACE=(CYL,(3,3)),DCB=(RECFM=FBA,LRECL=133,BLKSIZE=3059) //SYSPRNT2 DD DSN=&&TMP1,DISP=(NEW,PASS,DELETE),UNIT=SYSDA, // SPACE=(CYL,(3,3)),DCB=(RECFM=FBA,LRECL=133,BLKSIZE=3059) //SYSUT1 DD UNIT=&DRIVE,VOL=(PRIVATE,,,,SER=(&VOL)), // DISP=SHR,LABEL=(,BLP,EXPDT=98000) //COPYMAP EXEC PGM=DSCOPY //SYSPRINT DD SYSOUT=* //IN1 DD DISP=(OLD,DELETE),DSN=&&TMP //IN2 DD DISP=(OLD,DELETE),DSN=&&TMP1 //OUT1 DD DISP=SHR,DSN=TST.SYMTAPE.MAPS(&VOL) //OUT2 DD DISP=SHR,DSN=TST.SYMTAPE.MAPS(&VOL&M) // PEND //MAP001 EXEC TAPEMAP,VOL=DFP110 //MAP002 EXEC TAPEMAP,VOL=DFP111 //MAP003 EXEC TAPEMAP,VOL=DFP112 //MAP004 EXEC TAPEMAP,VOL=DFP210 * * * * * * * * * * * * * * * * * * * * * FIGURE TWO. //TSTBCP2S JOB (TS,2322),'TECH.SUPP-SAM.GOLOB',CLASS=M,NOTIFY=TSTBSSG, // MSGLEVEL=(1,1),MSGCLASS=T TYPRUN=HOLD //* //******************************************************************// //* COMPRESS IBM SYMLIB - SOURCE TAPES - USING THE CBT973 //* DATA COMPRESSION PROGRAM, AFTER THE MANNER OF THE //* CBT MVS MODS TAPES. //******************************************************************// //* //* CBTSYM1 JOB DESIGNED TO OUTPUT TO 2400 FT REEL. //* CBTSYM2 THRU CBTSYM6 JOBS DESIGNED TO OUTPUT TO 3600 FT REEL. //* //* //CONDENSE PROC LI=01,VI=SYM,LO=01,VO=NSY001,TAP=011,SRC=MVSIPO, // T01=482,T02=483 //COPYIN EXEC PGM=DSCOPY //SYSPRINT DD SYSOUT=* //IN DD DSN=SYMLIB.FIL,DISP=(SHR,PASS),UNIT=&T01, // LABEL=(&LI,NL,EXPDT=98000),VOL=(,RETAIN,,,SER=&VI&TAP), // DCB=(RECFM=FB,LRECL=80,BLKSIZE=12000) //OUT DD DSN=&TMP&LO,DISP=(NEW,KEEP,DELETE),UNIT=3380, // VOL=SER=WORK02,DCB=*.IN,SPACE=(TRK,(90,90),RLSE) //* //COMPRES EXEC PGM=CBT973,PARM=COMPRESS //INPUT DD DSN=&TMP&LO,DISP=(OLD,DELETE) //OUTPUT DD DSN=&SRC..&VI&TAP..F&LI,DISP=(NEW,KEEP,DELETE), // UNIT=&T02,LABEL=(&LO,SL,EXPDT=98000), // VOL=(,RETAIN,SER=&VO), // DCB=(DEN=4,RECFM=VB,LRECL=94,BLKSIZE=32716) // PEND //* //ALLOC1 EXEC PGM=IEFBR14 //DD3 DD DSN=TST.MAP1.TEMP,DISP=(NEW,KEEP,DELETE),UNIT=3380, // VOL=SER=WORK02,DCB=(RECFM=FBA,LRECL=133,BLKSIZE=3059,DSORG=PS), // SPACE=(TRK,(30,30)) //* //* //MERGE1 EXEC PGM=DSCOPY //SYSPRINT DD SYSOUT=* //IN01 DD DISP=SHR,DSN=TST.SYMTAPE.MAPS(SYM011) // DD DISP=SHR,DSN=TST.SYMTAPE.MAPS(SYM012) // DD DISP=SHR,DSN=TST.SYMTAPE.MAPS(SYM013) // DD DISP=SHR,DSN=TST.SYMTAPE.MAPS(SYM014) // DD DISP=SHR,DSN=TST.SYMTAPE.MAPS(SYM011M) // DD DISP=SHR,DSN=TST.SYMTAPE.MAPS(SYM012M) // DD DISP=SHR,DSN=TST.SYMTAPE.MAPS(SYM013M) // DD DISP=SHR,DSN=TST.SYMTAPE.MAPS(SYM014M) //OUT01 DD DISP=OLD,DSN=TST.MAP1.TEMP,UNIT=3380,VOL=SER=WORK02 //* //TAPEC1 EXEC PGM=DSCOPY //SYSPRINT DD SYSOUT=* //IN02 DD DISP=OLD,DSN=TST.MAP1.TEMP,UNIT=3380,VOL=SER=WORK02 //OUT02 DD DSN=B.INFO.ABOUT.TAPE,DISP=(NEW,KEEP,DELETE),UNIT=483, // DCB=(RECFM=VBA,LRECL=137,BLKSIZE=32747), // VOL=(PRIVATE,RETAIN,SER=NSY001),LABEL=(01,SL,EXPDT=98000) //* //ALLOC2 EXEC PGM=IEFBR14 //DD3 DD DSN=TST.MAP1.TEMP,DISP=(OLD,DELETE),UNIT=3380, // VOL=SER=WORK02 //* //* //C001 EXEC CONDENSE,TAP=011,VO=NSY001,LI=01,LO=02 //C002 EXEC CONDENSE,TAP=011,VO=NSY001,LI=02,LO=03 //C003 EXEC CONDENSE,TAP=011,VO=NSY001,LI=03,LO=04 //C004 EXEC CONDENSE,TAP=011,VO=NSY001,LI=04,LO=05 //C005 EXEC CONDENSE,TAP=011,VO=NSY001,LI=05,LO=06 //C006 EXEC CONDENSE,TAP=011,VO=NSY001,LI=06,LO=07 //C007 EXEC CONDENSE,TAP=011,VO=NSY001,LI=07,LO=08 //C008 EXEC CONDENSE,TAP=011,VO=NSY001,LI=08,LO=09 //C009 EXEC CONDENSE,TAP=011,VO=NSY001,LI=09,LO=10 //C010 EXEC CONDENSE,TAP=011,VO=NSY001,LI=10,LO=11 //C011 EXEC CONDENSE,TAP=011,VO=NSY001,LI=11,LO=12 //C012 EXEC CONDENSE,TAP=011,VO=NSY001,LI=12,LO=13 //C013 EXEC CONDENSE,TAP=011,VO=NSY001,LI=13,LO=14 //C014 EXEC CONDENSE,TAP=011,VO=NSY001,LI=14,LO=15 //C015 EXEC CONDENSE,TAP=011,VO=NSY001,LI=15,LO=16 //C016 EXEC CONDENSE,TAP=011,VO=NSY001,LI=16,LO=17 //C017 EXEC CONDENSE,TAP=011,VO=NSY001,LI=17,LO=18 //C018 EXEC CONDENSE,TAP=011,VO=NSY001,LI=18,LO=19 //C019 EXEC CONDENSE,TAP=011,VO=NSY001,LI=19,LO=20 //C020 EXEC CONDENSE,TAP=011,VO=NSY001,LI=20,LO=21 //C021 EXEC CONDENSE,TAP=012,VO=NSY001,LI=01,LO=22 //C022 EXEC CONDENSE,TAP=012,VO=NSY001,LI=02,LO=23 //C023 EXEC CONDENSE,TAP=012,VO=NSY001,LI=03,LO=24 //C024 EXEC CONDENSE,TAP=012,VO=NSY001,LI=04,LO=25 //C025 EXEC CONDENSE,TAP=012,VO=NSY001,LI=05,LO=26 //C026 EXEC CONDENSE,TAP=012,VO=NSY001,LI=06,LO=27 //C027 EXEC CONDENSE,TAP=012,VO=NSY001,LI=07,LO=28 //C028 EXEC CONDENSE,TAP=012,VO=NSY001,LI=08,LO=29 //C029 EXEC CONDENSE,TAP=012,VO=NSY001,LI=09,LO=30 //C030 EXEC CONDENSE,TAP=012,VO=NSY001,LI=10,LO=31 //C031 EXEC CONDENSE,TAP=012,VO=NSY001,LI=11,LO=32 //C032 EXEC CONDENSE,TAP=012,VO=NSY001,LI=12,LO=33 //C033 EXEC CONDENSE,TAP=012,VO=NSY001,LI=13,LO=34 //C034 EXEC CONDENSE,TAP=012,VO=NSY001,LI=14,LO=35 //C035 EXEC CONDENSE,TAP=012,VO=NSY001,LI=15,LO=36 //C036 EXEC CONDENSE,TAP=012,VO=NSY001,LI=16,LO=37 //C037 EXEC CONDENSE,TAP=012,VO=NSY001,LI=17,LO=38 //C038 EXEC CONDENSE,TAP=012,VO=NSY001,LI=18,LO=39 //C039 EXEC CONDENSE,TAP=012,VO=NSY001,LI=19,LO=40 //C040 EXEC CONDENSE,TAP=013,VO=NSY001,LI=01,LO=41 //C041 EXEC CONDENSE,TAP=013,VO=NSY001,LI=02,LO=42 //C042 EXEC CONDENSE,TAP=013,VO=NSY001,LI=03,LO=43 //C043 EXEC CONDENSE,TAP=013,VO=NSY001,LI=04,LO=44 //C044 EXEC CONDENSE,TAP=013,VO=NSY001,LI=05,LO=45 //C045 EXEC CONDENSE,TAP=013,VO=NSY001,LI=06,LO=46 //C046 EXEC CONDENSE,TAP=013,VO=NSY001,LI=07,LO=47 //C047 EXEC CONDENSE,TAP=013,VO=NSY001,LI=08,LO=48 //C048 EXEC CONDENSE,TAP=013,VO=NSY001,LI=09,LO=49 //C049 EXEC CONDENSE,TAP=013,VO=NSY001,LI=10,LO=50 //C050 EXEC CONDENSE,TAP=013,VO=NSY001,LI=11,LO=51 //C051 EXEC CONDENSE,TAP=013,VO=NSY001,LI=12,LO=52 //C052 EXEC CONDENSE,TAP=013,VO=NSY001,LI=13,LO=53 //C053 EXEC CONDENSE,TAP=013,VO=NSY001,LI=14,LO=54 //C054 EXEC CONDENSE,TAP=013,VO=NSY001,LI=15,LO=55 //C055 EXEC CONDENSE,TAP=013,VO=NSY001,LI=16,LO=56 //C056 EXEC CONDENSE,TAP=013,VO=NSY001,LI=17,LO=57 //C057 EXEC CONDENSE,TAP=013,VO=NSY001,LI=18,LO=58 //C058 EXEC CONDENSE,TAP=013,VO=NSY001,LI=19,LO=59 //C059 EXEC CONDENSE,TAP=013,VO=NSY001,LI=20,LO=60 //C060 EXEC CONDENSE,TAP=014,VO=NSY001,LI=01,LO=61 //C061 EXEC CONDENSE,TAP=014,VO=NSY001,LI=02,LO=62 //C062 EXEC CONDENSE,TAP=014,VO=NSY001,LI=03,LO=63 //C063 EXEC CONDENSE,TAP=014,VO=NSY001,LI=04,LO=64 //C064 EXEC CONDENSE,TAP=014,VO=NSY001,LI=05,LO=65 //C065 EXEC CONDENSE,TAP=014,VO=NSY001,LI=06,LO=66 //C066 EXEC CONDENSE,TAP=014,VO=NSY001,LI=07,LO=67 //C067 EXEC CONDENSE,TAP=014,VO=NSY001,LI=08,LO=68 //C068 EXEC CONDENSE,TAP=014,VO=NSY001,LI=09,LO=69 //* //TESTA EXEC PGM=TAPEMAP //SYSPRINT DD SYSOUT=* //SYSPRNT2 DD SYSOUT=* //SYSUT1 DD UNIT=483,VOL=(PRIVATE,RETAIN,,,SER=(NSY001)), // DISP=SHR,LABEL=(,BLP,EXPDT=98000) //* * * * * * * * * * * * * * * * * * * * * * FIGURE THREE. //TSTBSP2U JOB (TS,2322),'TECH.SUPP-SAM.GOLOB',CLASS=M,NOTIFY=TSTBSSG, // MSGLEVEL=(1,1),MSGCLASS=T TYPRUN=HOLD //* //******************************************************************// //* UNLOAD SYMLIB FILE FROM CBT973-COMPRESSED SL SYMLIB TAPES *// //* SAM GOLOB - NEWSWEEK INCORPORATED *// //******************************************************************// //* //UPDATEO PROC V1=NSY001, INPUT TAPE VOLUME // P=CBT973, DECOMPRESSION PROGRAM // P1=IEBUPDTE, PROGRAM TO PROCESS IEBUPDTE SYSIN //* STREAM. // VO=WORK02, OUTPUT DASD VOLUME // LAB=, INPUT TAPE LABEL NUMBER // WORK1=SYSDA, TEMP DATASET UNIT TYPE // WORK2=3380, DASD OUTPUT TYPE FOR OUTPUT PDS // PFX=TSTBSSG, FIRST LEVEL INDEX FOR OUTPUT DS // INDEX=MVSIPO, FIRST LEVEL INDEX FOR INPUT DS // DSP='CATLG', OUTPUT DATASET DISPOSITION // UNT=481, TYPE UNIT NAME // TY=SL, TAPE FILE LABEL // PRI=60, PRIMARY ALLOCATION // SEC=60, SECONDARY ALLOCATION // DIR=91, NUMBER OF DIRECTORY BLOCKS // ALLOC=TRK, ALLOC INCREMENT // LR=80, LRECL // BKI=32716, INPUT BLOCKSIZE // BKO=6160, OUTPUT BLOCKSIZE // FM=FB RECFM //UPDATE1 EXEC PGM=&P,REGION=512K,COND=EVEN //INPUT DD UNIT=&UNT,VOL=(,RETAIN,SER=&V1),DISP=(OLD,PASS), // DCB=(RECFM=VB,LRECL=94,BLKSIZE=&BKI.), // DSN=&INDEX..&DS, // LABEL=(&LAB,&TY.,EXPDT=98000) //OUTPUT DD DSN=&&TEMP,DISP=(NEW,PASS), // UNIT=&WORK1., // DCB=(RECFM=&FM.,LRECL=&LR.,BLKSIZE=&BKO.), // SPACE=(&ALLOC.,(&PRI.,&SEC.),RLSE) VOL=SER=&VO //UPDATE2 EXEC PGM=&P1,PARM=NEW,REGION=256K,COND=EVEN //SYSPRINT DD DUMMY SUPPRESS PRINTOUT //SYSIN DD DSN=&&TEMP,DISP=(OLD,DELETE) //SYSUT2 DD DSN=&PFX..&DS,DISP=(NEW,&DSP.), // UNIT=&WORK2.,FREE=CLOSE, // DCB=(RECFM=&FM.,LRECL=&LR.,BLKSIZE=&BKO.), // SPACE=(&ALLOC.,(&PRI.,&SEC.,&DIR.),RLSE),VOL=SER=&VO // PEND //SYM01 EXEC UPDATEO,LAB=02,V1=NSY001,DS='SYM011.F01' //SYM02 EXEC UPDATEO,LAB=02,V1=NSY002,DS='SYM021.F01' //SYM03 EXEC UPDATEO,LAB=05,V1=NSY002,DS='SYM021.F04' //SYM04 EXEC UPDATEO,LAB=70,V1=NSY002,DS='SYM031.F02' //SYM05 EXEC UPDATEO,LAB=74,V1=NSY002,DS='SYM041.F02' //SYM06 EXEC UPDATEO,LAB=02,V1=NSY003,DS='SYM051.F01' //SYM07 EXEC UPDATEO,LAB=12,V1=NSY003,DS='SYM061.F01' //SYM08 EXEC UPDATEO,LAB=41,V1=NSY003,DS='SYM071.F01' * * * * * * * * * * * * * * * * * * * * * FIGURE FOUR. //TSTBLSG$ JOB (TS,2322),'TECH-S.GOLOB',CLASS=M,NOTIFY=TSTBSSG, // MSGLEVEL=(1,1),MSGCLASS=T TYPRUN=HOLD //********************************************************// //* ASSEMBLER H VERSION 2 - ASSEMBLE AND LINKEDIT *// //********************************************************// //ASMHCL PROC //C EXEC PGM=AEV90,REGION=5000K, <=== SLAC ASSEMBLER H // PARM='OBJECT,OPCXA,NRLIST,OPCNTS,ALIGN,XREF(FULL)' //*TEPLIB DD DSN=TSY2.LINKLIB,DISP=SHR //SYSLIB DD DSN=TSY2.MACLIB,DISP=SHR //SYSUT1 DD UNIT=(SYSDA,SEP=SYSLIB),SPACE=(CYL,(10,5)),DSN=&SYSUT1 //SYSPUNCH DD SYSOUT=B,DCB=(BLKSIZE=800),SPACE=(CYL,(5,5,0)) //SYSPRINT DD SYSOUT=*,DCB=(BLKSIZE=3509),UNIT=(,SEP=(SYSUT1,SYSPUNCH)) //SYSLIN DD DISP=(,PASS),UNIT=SYSDA,SPACE=(CYL,(5,5,0)), * // DCB=(BLKSIZE=400),DSN=&&LOADSET //L EXEC PGM=IEWL,PARM='MAP,LET,LIST,NCAL',REGION=1960K,COND=(8,LT,C) //SYSLIN DD DSN=&&LOADSET,DISP=(OLD,DELETE) // DD DDNAME=SYSIN //SYSLMOD DD DISP=(,PASS),UNIT=SYSDA,SPACE=(CYL,(2,1,2)),DSN=&GOSET(GO) //SYSUT1 DD UNIT=SYSDA,SPACE=(CYL,(3,2)),DSN=&SYSUT1 //SYSPRINT DD SYSOUT=*,DCB=(RECFM=FB,BLKSIZE=3509) // PEND //S02ASM EXEC ASMHCL, // PARM.L='LIST,LET,XREF,NCAL' //C.SYSLIB DD DISP=SHR,DSN=TSY2.MACLIB,DCB=BLKSIZE=32760 // DD DSN=TSY2.ATSOMAC,DISP=SHR // DD DSN=TSY2.AMODGEN,DISP=SHR // DD DISP=SHR,DSN=TSY2.PVTMAC1 // DD DISP=SHR,DSN=TSY2.PVTMAC2 // DD DISP=SHR,DSN=TSY2.PVTMAC3 // DD DISP=SHR,DSN=TSY2.PVTMAC4 //* DD DISP=SHR,DSN=TSTBSSG.VTAMR22.PVTMACS //C.SYSIN DD DSN=TSTBSSG.JB3513.F21(IEAVNP05),DISP=SHR //L.SYSLMOD DD DSN=TST.TSO.CMDLIB,DISP=SHR //L.SYSIN DD * SETCODE AC(1) SETSSI AA999999 NAME IEAVNP05(R) /*