Installing the IFOX00 Assembler (from MVS) Under MVT

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:

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:

  1. 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/??). 

  2. Point a tape device to the asmxf.het file

  3. 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.)

  4. Submit the test job - ASMXTEST.JCL - to verify that the assembler is functioning. 


January 10, 2007 Update

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.


Revised Assemble/Link Procedures

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=B

Function: 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=&GSOT

Function: 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=&LSOT

Function: 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,NODECK
MAC1 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
null
GSOT 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.


Option Differences  

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.


Alternate IFOX00 Installation Verification Program

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:


Return to Site Home Page


This page was last modified on January 30, 2015.