Responding to some prompting from Chris Cheney (who has been extremely diligent in pointing out my grammatical errors and has made some very helpful suggestions for new material -- Thanks, Chris!), I recently performed a complete re-edit of my pages relating to the language compilers. As a result of that communication with Chris, I decided it would be useful to provide a means to install the assembler that installs with MVS 3.8j for use under MVT -- this because he quoted a paragraph from Jay Maynard's site indicating that the assembler installed with MVT is not sufficient to assemble HASP. Now, the strange thing is that once I started thinking about this task, it began to seem awfully familiar. After digging through some archives from the back of my storage closet on ZIP cartridges, I found what I was remembering. On a very early version of my Hercules site, back when MVS 3.8j was only beginning to look like it might become a reality for us, I had an IFOX00 installation page for the MVT users in the Hercules' community. So, here is a revamped version of that page, in the same format as the other compiler installation archives on my site.
The benefits of using the assembler distributed with MVS 3.8j (IFOX00) over the one distributed with MVT (IEUASM) include faster assembly, additional symbolic variables, and more efficient coding. I have had some assembler source programs that simply wouldn't assemble under IEUASM that comes through with zero statements flagged under IFOX00, and judging from the Jay Maynard's comments regarding HASP installation, I am not alone in this.
Technically, both of these assemblers are considered to be Assembler F, but there needs to be some method of distinguishing between them. So, I am going to use the designations others have already used and call the MVT assembler (IEUASM) Assembler F and the MVS assembler (IFOX00) Assembler XF.
The archive asmxf.tgz [MD5: F4C0AADD038D6057189B669D9F5FC4ED] contains:
an IEBCOPY unload dataset on a compressed AWS tape image,
an IEBUPDTE input stream containing the PROCedures to invoke the assembler,
a TAPEMAP report for the compressed AWS tape,
a jobstream to restore (install) the unloaded datasets, and
a test jobstream to verify that the assembler works.
The first dataset on the tape was created with IEBCOPY on an MVS 3.8j system. You will need to have already installed VSCOPY on your MVT system to reload this dataset. If you haven't already installed VSCOPY, you can download it from my site and install it using the instructions found here: vscopy.
The link edit steps use SYS2.LINKLIB as the target for the sixteen assembler load modules, so if you have not defined a SYS2.LINKLIB, you will need to modify the jobstream to match your system. Since the names of the load modules comprising IFOX00 do not conflict with those of IEUASM, SYS1.LINKLIB could be used as a target for the installation. Under MVS 3.8j, there are two aliases for IFOX00 - IEUASM and ASMBLR - but I have removed those from the link edit control statements so that both IEUASM and IFOX00 can co-exist under MVT without conflict.
The last dataset on the tape contains an IEBUPDTE input stream to add the procedure library members used to invoke the compiler, and they will be restored into SYS2.PROCLIB. As with the load module aliases, I have modified the names of the procedures to allow them to co-exist with the Assembler F procedures installed along with MVT. I have substituted ASMX for the ASMF prefix in each of the procedure names.
Note: the procedures as installed in MVS use the device esoteric name SYSSQ for temporary datasets. I have left these esoteric names as they were, even though most users will prefer, or require, them to be SYSDA. You may override them when you execute the procedure (see Compile/Assemble and Execute) or modify the procedures prior to cataloging them, as you prefer.
If you wish to change the target dataset for the load modules or PROCedure members, search the installation jobstream for the keyword TARGET.
To complete the installation:
Click on the archive name asmxf.tgz [MD5: F4C0AADD038D6057189B669D9F5FC4ED] to download the archive. Uncompress its contents (use the tar xvzf <archive> command on Linux and WinZip or ZipNAll on Windows/??).
Point a tape device to the asmxf.het file
Submit the reload jobstream - MVSIFOX.JCL - to restore the unloaded components (The return codes for all three steps of the reload job should be 0000.)
Submit the test job - ASMXTEST.JCL - to verify that the assembler is functioning.
Paul Gorlinsky has utilized PTF object decks and disassembled load modules for the MVS 3.8j version of Assembler XF to update the source distributed with MVS 3.8j so that there is a complete set of matching source from which the assembler may be built. Although there is nothing wrong with installing the load modules in the archive described above, this provides the means of installing from source code. You can read Paul's release notes in ifox00.memo.pdf.
To install from the source, download the archive: ifox.tgz (note: this is an 11.4 megabyte file) [MD5: DDD13C5FEAA83FE951F989D8EB35CB39]. The archive contains a copy of Paul's tape (iifoxdist.het) and a jobstream (ifox$.jcl). The only modification from Paul's original tape is that I converted it to a compressed HET image from the original AWS image; even though only two datasets are required from the tape, the additional datasets might be of interest for some. The jobstream loads the assembler source and macro datasets (files #6 and #7 on the tape) to temporary PDS datasets, assembles all of the source members to a temporary PDS dataset, and link-edits the assembler load modules to SYS1.LINKLIB. If you want to change the target library, modify the target library DD statement in the final step of the jobstream.
Because of a report I received from someone who had difficulty in loading the source/macro libraries from the tape image in the above archive, I have created an alternate jobstream with the IEBUPDTE input for the two libraries included instream. The jobstream - ifox$.jcl - has the same name and functions identically to the jobstream in the archive above, except that it does not require the tape image. This alternate jobstream is available in the archive: ifoxjcl.tgz [MD5: FE4320E6DE3250D30878D08627E8C680]. An added benefit is that this archive is much smaller than the one above.
It was suggested to me that a means of making a system on which both assemblers has been installed more user friendly would be a modified set of procedures that could be used with either assembler simply by including a parameter to designate which assembler should be executed. To that end, utilizing the standard procedures installed under MVT and MVS, I have created the following set of procedures:
Function: Assemble only
//ASMC PROC APGM='IEUASM', assembler program // ARGN=128K, assembler region // APRM='LIST,NOLOAD,NODECK', assembler options // MAC1='SYS1.MACLIB', 2nd macro library // MAC2='SYS1.MACLIB', 3rd macro library // ASOT='*' assembler sysout //ASM EXEC PGM=&APGM,REGION=&ARGN, // PARM=(&APRM) //SYSLIB DD DSN=SYS1.MACLIB,DISP=SHR // DD DSN=&MAC1,DISP=SHR // DD DSN=&MAC2,DISP=SHR //SYSUT1 DD DSN=&&SYSUT1,UNIT=SYSDA,SPACE=(1700,(600,100)) //SYSUT2 DD DSN=&&SYSUT2,UNIT=SYSDA,SPACE=(1700,(300,50)) //SYSUT3 DD DSN=&&SYSUT3,UNIT=SYSDA,SPACE=(1700,(300,50)) //SYSPRINT DD SYSOUT=&ASOT //SYSPUNCH DD SYSOUT=BFunction: Assemble and Execute
//ASMCG PROC APGM='IEUASM', assembler program // ARGN=128K, assembler region // APRM='LIST,LOAD,NODECK', assembler options // MAC1='SYS1.MACLIB', 2nd macro library // MAC2='SYS1.MACLIB', 3rd macro library // ASOT='*', assembler sysout // GRGN=128K, execute region // GCND='(8,LT,ASM)', execute cond test // GPRM='MAP,PRINT,NOCALL,LET', loader options // GSOT='*' loader sysout //ASM EXEC PGM=&APGM,REGION=&ARGN, // PARM=(&APRM) //SYSLIB DD DSN=SYS1.MACLIB,DISP=SHR // DD DSN=&MAC1,DISP=SHR // DD DSN=&MAC2,DISP=SHR //SYSUT1 DD DSN=&&SYSUT1,UNIT=SYSDA,SPACE=(1700,(600,100)) //SYSUT2 DD DSN=&&SYSUT2,UNIT=SYSDA,SPACE=(1700,(300,50)) //SYSUT3 DD DSN=&&SYSUT3,UNIT=SYSDA,SPACE=(1700,(300,50)) //SYSPRINT DD SYSOUT=&ASOT //SYSPUNCH DD SYSOUT=B //SYSGO DD DSN=&&OBJSET,UNIT=SYSDA,SPACE=(80,(200,50)), // DISP=(MOD,PASS) //GO EXEC PGM=LOADER,REGION=&GRGN,COND=&GCND, // PARM=(&GPRM) //SYSLIN DD DSN=&&OBJSET,DISP=(OLD,DELETE) //SYSLOUT DD SYSOUT=&GSOTFunction: Assemble and Link
//ASMCL PROC APGM='IEUASM', assembler program // ARGN=128K, assembler region // APRM='LIST,LOAD,NODECK', assembler options // MAC1='SYS1.MACLIB', 2nd macro library // MAC2='SYS1.MACLIB', 3rd macro library // ASOT='*', assembler sysout // LRGN=128K, link region // LCND='(8,LT,ASM)', link cond test // LPRM='XREF,LET,LIST,NCAL', link options // LLIB='&&GOSET', link library // LMEM='TEMPNAME', link member // LSOT='*' link sysout //ASM EXEC PGM=&APGM,REGION=&ARGN, // PARM=(&APRM) //SYSLIB DD DSN=SYS1.MACLIB,DISP=SHR // DD DSN=&MAC1,DISP=SHR // DD DSN=&MAC2,DISP=SHR //SYSUT1 DD DSN=&&SYSUT1,UNIT=SYSDA,SPACE=(1700,(600,100)) //SYSUT2 DD DSN=&&SYSUT2,UNIT=SYSDA,SPACE=(1700,(300,50)) //SYSUT3 DD DSN=&&SYSUT3,UNIT=SYSDA,SPACE=(1700,(300,50)) //SYSPRINT DD SYSOUT=&ASOT //SYSPUNCH DD SYSOUT=B //SYSGO DD DSN=&&OBJSET,UNIT=SYSDA,SPACE=(80,(200,50)), // DISP=(MOD,PASS) //LKED EXEC PGM=IEWL,REGION=&LRGN,COND=&LCND, // PARM=(&LPRM) //SYSLIN DD DSN=&&OBJSET,DISP=(OLD,DELETE) // DD DDNAME=SYSIN //SYSLMOD DD DSN=&LLIB(&LMEM), // UNIT=SYSDA,SPACE=(1024,(50,20,1)),DISP=(MOD,PASS) //SYSUT1 DD DSN=&&SYSUT1,UNIT=SYSDA,SPACE=(1024,(50,20)) //SYSPRINT DD SYSOUT=&LSOTFunction: Assemble, Link, and Execute
//ASMCLG PROC APGM='IEUASM', assembler program // ARGN=128K, assembler region // APRM='LIST,LOAD,NODECK', assembler options // MAC1='SYS1.MACLIB', 2nd macro library // MAC2='SYS1.MACLIB', 3rd macro library // ASOT='*', assembler sysout // LRGN=128K, link region // LCND='(8,LT,ASM)', link cond test // LPRM='XREF,LET,LIST,NCAL', link options // LLIB='&&GOSET', link library // LMEM='TEMPNAME', link member // LSOT='*', link sysout // GRGN=128K, execute region // GCND='((8,LT,ASM),(4,LT,LKED))', exec cond test // GPRM='' execute parm //ASM EXEC PGM=&APGM,REGION=&ARGN, // PARM=(&APRM) //SYSLIB DD DSN=SYS1.MACLIB,DISP=SHR // DD DSN=&MAC1,DISP=SHR // DD DSN=&MAC2,DISP=SHR //SYSUT1 DD DSN=&&SYSUT1,UNIT=SYSDA,SPACE=(1700,(600,100)) //SYSUT2 DD DSN=&&SYSUT2,UNIT=SYSDA,SPACE=(1700,(300,50)) //SYSUT3 DD DSN=&&SYSUT3,UNIT=SYSDA,SPACE=(1700,(300,50)) //SYSPRINT DD SYSOUT=&ASOT //SYSPUNCH DD SYSOUT=B //SYSGO DD DSN=&&OBJSET,UNIT=SYSDA,SPACE=(80,(200,50)), // DISP=(MOD,PASS) //LKED EXEC PGM=IEWL,REGION=&LRGN,COND=&LCND, // PARM=(&LPRM) //SYSLIN DD DSN=&&OBJSET,DISP=(OLD,DELETE) // DD DDNAME=SYSIN //SYSLMOD DD DSN=&LLIB(&LMEM), // UNIT=SYSDA,SPACE=(1024,(50,20,1)),DISP=(MOD,PASS) //SYSUT1 DD DSN=&&SYSUT1,UNIT=SYSDA,SPACE=(1024,(50,20)) //SYSPRINT DD SYSOUT=&LSOT //GO EXEC PGM=*.LKED.SYSLMOD,REGION=&GRGN,COND=&GCND, // PARM=(&GPRM)
Parameter variables which have the same function across procedures are named identically. The first character of each variable alludes to the step in which it is used: A - assemble, L - link, G - execute. The parameter variables, with their default values, are:
Variable Name
Substitutes For
Default Value
APGM assembler name IEUASM ARGN assembler region size 128K APRM* assembler parameter (options) LIST,NOLOAD,NODECK
LIST,LOAD,NODECKMAC1 first supplemental macro library DSN SYS1.MACLIB MAC2 second supplemental macro library DSN SYS1.MACLIB ASOT assembler listing SYSOUT class * LRGN link editor region size 128K LCND link edit step condition test 8,LT,ASM LPRM link editor parameter (options) XREF,LET,LIST,NCAL LLIB target library DSN &&GOSET LMEM target load module member name TEMPNAME LSOT link editor listing SYSOUT class * GRGN** execute region size 128K GCND*** execute step condition test 8,LT,ASM
(8,LT,ASM),(4,LT,LKED)GPRM**** execute parameter (options) MAP,PRINT,NOCALL,LET
nullGSOT loader listing SYSOUT class * * The default assembler parameter (options) are different for the assemble only procedure and the other three procedures.
** The execute region size is shared by the loader and the user program in the assemble and execute procedure.
*** The condition test for the execute step of the assemble, link, and execute procedure tests the result of both the assemble and link editor steps; the condition test for the execute step of the assemble and execute procedure and the link step of the assemble and link procedure only test the result of the assemble step.
**** The execute parameter (options) for the loader are specified in GPRM in the assemble and execute procedure; for the assemble, link, and execute procedure GPRM specifies the execute parameter (options) for the user program.
A jobstream to place these procedures in your Procedure Library may be downloaded from my site at asmprocs.tgz [MD5: 01EF37B245FB8D7D74E5DD58D70A57A2]. The single jobstream contained in the archive - IEBUPDTE.JCL - will install the four procedures (ASMC, ASMCG, ASMCL, ASMCLG) into SYS2.PROCLIB. If you do not use a SYS2.PROCLIB in your system, the JCL may be modified to use SYS1.PROCLIB as the target library as the procedure names shouldn't conflict with any existing system procedures.
Prior to submitting the jobstream that installs the procedures, customize the default values of the variables to provide the values you will most often prefer. For example, if you will most frequently want to execute Assembler XF, change the value of APGM from IEUASM to IFOX00. Other variables you might want to modify are those providing options to the assembler and linkage editor.
The two assemblers have some differences when recognizing options. The following table, provided by Chris Cheney, summarizes them:
IEUASM
IFOX00
ALGN/NOALGN ALIGN/NOALIGN no equivalent ALOGIC/NOALOGIC no equivalent BUFSIZE(STD/ ... ) DECK/NODECK DECK/NODECK DOS/OS no equivalent no equivalent ESD/NOESD no equivalent FLAG(n) no equivalent LIBMAC/NOLIBMAC LINECNT=n LINECOUNT(n) LIST/NOLIST LIST/NOLIST no equivalent MCALL/NOMCALL no equivalent MLOGIC/NOMLOGIC LOAD/NOLOAD LOAD/NOLOAD or OBJECT/NOOBJECT NUM/NONUM NUMBER/NONUMBER RENT/NORENT RENT/NORENT no equivalent RLD/NORLD STMT/NOSTMT STMT/NOSTMT no equivalent SYSPARM( ... ) TERM/NOTERM TERMINAL/NOTERMINAL TEST/NOTEST TEST/NOTEST XREF/NOXREF XREF(FULL/SHORT)/
NOXREF(FULL/SHORT)no equivalent WORKSIZE(n) no equivalent YFLAG
All of the IEUASM options, with the exception of DOS/OS, are accepted by IFOX00. For example: IFOX00 will accept ALGN or ALIGN.
The installation archive for Assembler XF (above) includes a "Hello World" program as a test program for the assembler. The MVS 3.8j distribution includes an installation verification program for Assembler XF. A jobstream that utilizes the revised procedures (above) to assemble and execute this program is available in the archive asmxfivp.tgz [MD5: 864DE1D82C6F0E365C800938107AECF3].
If I can answer any questions about this or any other page on my site or if you find errors in these instructions, please don't hesitate to send them to me:
This page was last modified on January 30, 2015.