MVS Frequently Asked QuestionsApplication / User TasksHow do I submit jobs to MVS?There are three ways to submit jobs to the reader for MVS. #1 - on the regular Hercules' console, type the command:
<device address> is the of the card reader; for example,
0012 in the starter system. #2 - on the semi-graphical Hercules' console, the command letter n displays the prompt:
after which you type the letter corresponding to the peripheral device of the emulated card reader (usually near the top of the display - a or b, for example, and depends upon your configuration file), which causes the prompt:
after which you type the <host OS filename> and <args>, as described above for #1, and press ENTER. #3 - beginning with Hercules version 2.15, Fish' socket device for the card reader allows you to designate a socket address for the <host OS filename>, so that card images may be "sent" to the emulated card reader from another program. Using either technique #1 or #2 above, you designate the socket address instead of a physical file name, for example:
where 127.0.0.1:3505 designate an address of 127.0.0.1, port 3505. You must also include sockdev as an argument, and when I use this I also include ascii and trunc. Don't forget the eof which is required for MVS. You will then need a Perl script, netcat, or Fish' HercRdr program to "send" card images to the socket. There has been quite a bit of discussion on the list for this, so search for "sockdev" or "hercrdr" in the archives for more information. On 30 March 2004 I added a description of the system I have devised and use that involves a custom JCL preprocessor and a shell script to submit jobstreams from inside of SPF/PC to the Hercules' socket reader. You can view that document at Submitting Jobstreams from PC Files via Socket Reader How can I easily delete (and uncatalog) a group of datasets at once?Well, this might not be something you would have to do often, but since I needed to and came up with a solution I thought I might as well share. In order to build a "restart" jobstream for the SMP process, I needed to be able to delete and uncatalog all of the SMP datasets on volume SMP001. Since I didn't want to type a bunch of control statements, I wrote a little awk script - scratch.awk - to generate the jobstream for me from a LISTCAT output. If you need to do this sort of thing, this ought to be a real time saver. If you are running under Windows/?? + Cygwin, you will need the gawk.exe from Cygwin. First, run a LISTCAT -
Using an editor on your host OS (Linux/Windows/etc), cut/paste output from this job into a another plain text file. Edit scratch.awk with a plain text editor to insert the volume serial number and unit type for the volumes in the array variables in the BEGIN pattern:
These are paired arrays; that is, volume[1] contains the serial number and unit[1] contains the unit type of a particular DASD volume. You can add as many volume[] and unit[] entries as you need. There are no modifications required elsewhere in order to expand/contract the arrays. Execute the script:
The generated job is a ready to run jobstream that uses IEHPROGM to uncatalog and scratch all datasets that were listed in the catalog as residing on one of the DASD volumes included in the paired arrays. How can I easily catalog all the datasets on a volume?Like the task above, not something you may need often, but if you do, here is a time saver. I needed to be able to make catalog entries for all datasets on a DASD volume, but didn't want to do a lot of typing. The awk script - catalog.awk - reads an IEHLIST output and generates an IDCAMS jobstream to do the task. First, run an IEHLIST -
Include as many volumes in the single job as you need. Cut/paste output from this job into a another plain text file. Edit catalog.awk with a plain text editor to insert the volume serial number and unit type for the volumes included in the output in the array variables in the BEGIN pattern:
This design exploits awk's ability to use anything as an "index" into an array. The "data" stored in the unittype array at the "index" value for the volume serial number is the unit type. You can add as many entries to this array as you need. There are no modifications required elsewhere in order to expand/contract the arrays. Execute the script:
The generated job is a ready to run jobstream that uses IDCAMS to create catalog entries for all datasets in the IEHLIST output existing on one of the volume serial numbers found in the unittype array. How do I initialize a tape?There is an MVS utility - IEHINITT - which may be used to initialize a tape prior to writing MVS datasets on it. But, there is a utility included with Hercules - hetinit - that is much easier to use. Hetinit will create a blank AWS tape image, either compressed or not, with a VOL1 label written on it ready to use for output by MVS. The command syntax for hetinit is:
If you omit the -d switch, hetinit will write a compressed image and the file name containing the tape should have the extension '.het'. If you include the -d switch, hetinit will write an uncompressed image and the file name containing the tape should have the extension '.aws'. The [host OS file name] is the name of the file that will contain the tape image. The [volume serial number] is the six character (letters and numbers) identification that will be written to the VOL1 label and is used by MVS to identify the tape. Is IND$FILE available for MVS 3.8?Mike Rayborn has written an IND$FILE for MVS 3.8 using the Dignus Systems/C and made it available in the files section of the MVS turnkey group (http://groups.yahoo.com/group/turnkey-mvs/files/ind$file.zip). From Mike's post announcing the program:
I have provided a copy of Mike Rayborn's archive for download from my site here - ind$file.zip [MD5: FB8299C89D533D32CAE983B7DBE13878]. The version in this archive is 1.0.6 dated 04/14/2003. How can I back up DASD datasets?If your intent is to back up an entire DASD volume, the simple answer is to shut down MVS and Hercules and use a host OS utility (xcopy, WinZip, tar, zip, etc) to make a backup copy of the file containing the DASD volume image. However, if you want to back up or copy specific datasets, perhaps to transport them to another system, you need to use MVS utilities appropriate to the dataset type. I am a purist and prefer to do even volume backups using MVS utilites ... it just seems like the thing to do since we have the capability. If you want to back up an entire DASD volume to tape, use a jobstream similar to this:
You can also use IEHDASDR to restore an entire volume backup either to the originating volume or to another volume. Note: IEHDASDR will not handle 3380 or 3390 DASD. If you want to back up a Partitioned Dataset to tape, use a jobstream similar to this:
If you want to back up a sequential dataset to tape, use a jobstream similar to this:
Why do I get the message "IKF0015I-C ... COMPILATION ABANDONED" from the MVT COBOL compiler?The message: IKF0015I-C BUF PARM TOO SMALL FOR DD-CARD BLKSIZES - COMPILATION ABANDONED. is issued because the MVT COBOL compiler is generated with BUF and SIZE parameters that are too small for blocked input. You are probably trying to read the COBOL source from a tape or disk dataset with block sizes larger than 80. You can also receive this message if you are trying to write the generated object records to a blocked dataset. A third reason can be that you have some COPY statements that are attempting to include COBOL source from a SYSLIB dataset. The solution is to increase the REGION for the COBOL compile step significantly, say to 4096K, and to include these two entries in the COBOL PARM:
The COBOL compiler can handle these values, it is just a limitation in the MVT System Generation that they cannot be specified there. In February, 2002 I modified the COBOL compile procedures on the compiler installation tape available for download from my site to include these parameters. Is there a way to make IFOX00 accept blank cards in a source program?There are a couple of ways to handle this. Greg Price has a modification to IFOX00 so that it "sees" a totally blank input record as a comment line. You can download this, as well as other MVS 3.8 modifications from his site at: http://www.prycroft6.com.au/vs2mods/. My solution was to just write an awk script - alcblank.awk - that creates a copy of the input file and changes the blank lines to comments. How can VSAM be used to sort data?In one of the discussions about the limitations of the MVT Sort/Merge (input, output, and sort/work datasets may only reside on 2311 or 2314 DASD), a question was raised about the feasibility of using VSAM to effectively "sort" data. It can be done, although not efficiently. Even so, it may be just as reasonable/efficient as copying your unsorted dataset onto 2311 or 2314 DASD, sorting it, and copying the sorted dataset back to your preferred DASD. A jobstream that I used is vssort.jcl. With minor modifications, it may be used to sort any sequential dataset on one or more ascending keys. In order to use descending keys, it would be necessary to programmatically construct key data based upon the actual key value that would result in the correct sequence; such a task would be way beyond simply using VSAM to re-order data. The first step is to define an Entry Sequenced cluster to hold the unsorted data:
The cluster and data names do not matter, as long as they do not duplicate the names of other VSAM object in your system. Obviously the VOLUMES parameter needs to match your system; MVS804 is a 3380 volume on my system. The RECORDSIZE should be the sum of the length of your data record plus the lengths of all key fields. There is no reason you could not process variable length datasets, but in the test of this process I used a fixed length record. Since the dataset will not be extended beyond the initial load, the space allocation need not have a secondary quantity specified. Because the key fields must be contiguous, if you have multiple keys located in different positions of the data record, you will need to construct a single key field by copying the values from the separate locations. Obviously, if your key fields do happen to be contiguous, or you simply want to sort on a single field, you can omit the IEBDG steps used to build, and later remove, the key field. Because IEBDG will not read or write VSAM data, the output of IEBDG must be a temporary sequential dataset.
I generated 100,000 test records externally to MVS and used MAKETAPE to load them onto an AWS tape. I then used IEBDG to extract two key fields - a telephone area code in positions 131-133 and a sort name in positions 46-60 - and append them to the data record. The input data record is 140 bytes long and the output record, with the keys appended, is 158 bytes. The third step from the jobstream - IDCAMS2 - which I do not show here, simply uses the IDCAMS REPRO command to copy the IEBDG output into the ESDS cluster. The next step from the jobstream - IDCAMS3 - does all of the work. An Alternate Index is defined over the ESDS cluster. The keys for the Alternate Index are defined as (18 0), because the key fields were appended to the beginning of the data record and are 18 bytes long. Although I didn't expect duplicate key values in my test data, I chose not to override the default of NONUNIQUEKEY and I computed the Alternate Index RECORDSIZE to allow for 20 instances of each key. The formula to use for this computation is:
Be generous with the number of non-unique keys expected, since the BLDINDEX will fail if the actual number of non-unique keys exceeds the space you have allowed for them. Since I don't expect this ESDS and AIX to be used for anything other than "sorting" the data, I have specified NOUPGRADE. After the Alternate Index is defined, the BLDINDEX command actually reads the ESDS data, extracts the keys, sorts them, and writes them to the Alternate Index. If there is enough virtual storage, the sort will be done without using external files. Otherwise, the two work datasets - IDCUT1 and IDCUT2 - will be used during the sort. The last command - DEFINE PATH - relates the Alternate Index to the underlying ESDS so that the base records may be accessed through the alternate keys.
At this point, the data is accessible in the sorted order, so if you are using a program that can access a VSAM cluster, you could just point a DD statement to VSSORT.PATH and, with consideration for the key fields that have been prepended to the data record, use the data. However, in my example jobstream, the next two steps reverse the process of placing the data records in the ESDS by first copying them to a sequential dataset and then stripping the key fields from them, yielding the original data records in the desired sorted order. I do not show the JCL for step 5 - IDCAMS4 - which simply uses the REPRO command to copy the records from the ESDS to a temporary sequential dataset. To reverse the work of IEBDG in step 2, another IEBDG step strips the prepended key fields. The records coming into this step are 158 bytes; the records written out are the original 140 byte records.
The final step of the jobstream - IDCAMS5 - deletes the ESDS cluster and all related objects. The execution times for the steps on my system using the 100,000 test records were:
It was expected that the largest amount of time would be random retrieval of the records from the ESDS under control of the Alternate Index. Even so, it may be equivalent to the time spent if you choose to copy data to be sorted to a 2314 DASD and use the MVT Sort/Merge. How do I code the SELECT/ASSIGN statements for the MVT COBOL compiler?See the section COBOL Identification/ Environment Divisions in my document Assembling, Compiling, Link-Editing, and Executing User-Written Programs. Why do I receive the message: IER042A - UNITS ASGN ERROR when I attempt to use the MVT Sort/Merge program under MVS 3.8?Either the sort work datasets (SORTWKnn), SORTIN, or SORTOUT have been assigned to a DASD device type other than 2314 or 2311. The MVT Sort/Merge predates MVS 3.8, which will be obvious to those familiar with the history and lineage of IBM's mainframe operating systems. So, the most advanced DASD devices that the MVT Sort/Merge is capable of accessing is the 2314 (it will also access the smaller capacity, and older, 2311 DASD). Although several people have at least done some preliminary investigation into upgrading Sort/Merge to use later DASD, at present it is still on a long "to do" list. (If you feel comfortable with Assembler and would like to take this on as a project, I will be glad to point you to the source code for Sort/Merge ... send me an email if you are interested.) So the work around for this is to use IEBGENER or IDCAMS to copy the dataset you want to sort either to an AWS tape image or to a temporary dataset on a 2311 or 2314 DASD. Since you will need to define at least one 2311 or 2314 DASD in your system on which to allocate the sort work datasets, it will certainly be easier to copy the data to be sorted there as well. After the sort step has completed (successfully), you may then use another IEBGENER or IDCAMS step to copy the sorted data back to the original dataset, replacing the unsorted data. How can I execute catalogued procedures from a library other than SYS1.PROCLIB?Recently someone asked a question about using JCLLIB to specify one or more alternate procedure libraries (other than SYS1.PROCLIB) and the catalog search order. MVS 3.8j is too primitive to support JCLLIB, but you can have alternate (private, if you prefer) procedure libraries. Here is the procedure to follow to implement and use them: First, use IEBGENER to allocate one or more Partitioned Datasets which will become your procedure libraries. On my system, I have used SYS2.PROCLIB as the dataset name, since SYS2 prefixed datasets are the common convention for creating user versions of IBM's installation datasets.
JES uses a DD statement to access the procedure library during JCL analysis, and if you look at the JES2 member of SYS1.PROCLIB, you will see a PROC00 DD that points to SYS1.PROCLIB. You will need to modify the JES2 PROC to add a DD statement for each private procedure library you have created. Be very careful when modifying system procedures, or you could render your system corrupt and unusable. I would suggest making a backup copy of the file containing the DASD image for your System Residence volume prior to modifying the JES2 PROC. If everything goes well, you can delete the backup. Otherwise, you can restore from the backup copy and recover from any problems.
After successfully completing these steps, you will need to "cycle" JES in order for the changes to take effect. An IPL is not required ... you may just stop JES2 with the $PJES2 command and the restart JES2 with the S JES2 command on the MVS console. In order to execute procedures from a procedure library other than SYS1.PROCLIB, you then include a JOBPARM JCL statement in your jobstream with the PROCLIB parameter:
where you substitute the two digit number for nn that corresponds to the DD statement in the JES2 PROC for your alternate procedure library. If you have a job stream in which you want to subsequently execute procedures from the system procedure library, simply include another JOBPARM statement with PROCLIB=PROC00. In March 2003, Brian Westerman announced that he had completed modifications to MVS 3.8j to provide Dynamic Proclib support. The announcement message, which contains instructions for application of the modifications, are available at: http://groups.yahoo.com/group/H390-MVS/message/2392. Why do I get 80A and 106 abends whenever I try to issue TSO commands or execute programs?These two abend codes most often mean that there is not enough virtual storage available to execute the requested program. When you receive these abend codes in a TSO session, it indicates that the region requested during LOGON, or specified as the default for the TSO User ID when it was created, is insufficient for the attempted command processor or programl. LOGOFF and LOGON again, specifying a larger region using the SIZE subcommand:
A value of 4096 (4,096 k) is usually sufficient to execute any user program, including those utilizing VSAM, which require a larger region in order to allocate buffer space. Note that the lack of sufficient region is frequently a result of using the TSO User ID IBMUSER, which is the default TSO User ID created during System Generation. IBMUSER has a default SIZE of 44k. This User ID is intended only to be used in the case of emergencies and for setting up new TSO User IDs. You should create one or more new TSO User IDs for routine use and refrain from using IBMUSER for anything other than emergencies. See the following for instructions on creating new TSO User IDs. How do I add new TSO User IDs?Additional TSO User IDs may be added in two ways, either interactively under TSO or by executing TSO in a batch job. If you intend to add several IDs, it will probably be easier to use a batch job, but understanding the interactive steps will help you to modify the JCL for the batch job. Interactively Under TSO Log on to TSO using the IBMUSER User ID. It is not necessary to increase the Region SIZE for this procedure. The default logon procedure (located in SYS1.PROCLIB and created during System Generation) does not include the DD for the dataset containing the TSO User IDs, so you must manually allocate it prior to using the ACCOUNT command. The command to allocate this dataset is:
Issue the ACCOUNT command to invoke the conversational program which performs the administrative functions concerned with maintaining TSO User IDs:
TSO will echo ACCOUNT to indicate the command processor has been executed. You can type HELP at any time to receive syntax and usage instructions if you need further clarification of any of the ACCOUNT subcommands. Prior to adding new User IDs, it is a good idea to issue the SYNC subcommand. This will ensure that the Broadcast dataset (SYS1.BRODCAST), which is used to store messages for TSO Users, is correctly formatted and that the User IDs in that dataset are synchronized with the User IDs contained in the TSO User ID dataset (SYS1.UADS). Issue the ADD subcommand for each TSO User ID you wish to add. There are a number of parameters to be supplied for each User ID. The format of the ADD subcommand is:
The parameters specified inside the parentheses following the ADD subcommand are the only strictly required ones, although you will probably wish to include at least a few of the optional ones, discussed further below. The value of 'userid' will become the new User ID. The value of 'password' will become the initial password, required to log on with this User ID. If an asterisk (*) is specified for the 'password' value, no password will be required from this User ID for the log on to be completed. The value of 'acctnmbr' will be the value recorded in SMF records for accounting information when this User ID is utilized. If an asterisk (*) is specified for the 'acctnmbr' value, no account number will be recorded. The 'procname' is the name of the logon procedure (in SYS1.PROCLIB) to be utilized for this User ID. If you have not created your own custom procedure, IKJACCNT should be specified as that is the default that is built during System Generation. If MAXSIZE is specified, with an integer value for 'integer', the value of 'integer' limits the amount of storage that may be requested by the User ID during logon (by utilizing the SIZE parameter). The default is NOLIM, which means there is no limit to the size region the User ID may request. If OPER is specified, the OPERator command may be used by this User ID to issue MVS commands. NOOPER is the default. If ACCT is specified, the ACCOUNT command may be used by this User ID to set up or modify TSO User IDs. NOACCT is the default. If JCL is specified, this User ID may utilize the SUBMIT command to submit batch jobs to JES2. The default is NOJCL. If MOUNT is specified, this User ID may issue ALLOC commands that request non-mounted volumes, DASD or TAPE, to be mounted. NOMOUNT is the default. If SIZE is specified, with an integer value for 'integer', the value of 'integer' specifies the Region SIZE that is allocated for this User ID. A reasonable value to specify for SIZE is 4096. The default is 0. If UNIT is specified, with a DASD unit name for 'name', the 'name' specified becomes the default unit type for dataset allocations for this User ID. It is appropriate to specify the name of a DASD type for which you will have a volume mounted with the storage class of PUBLIC. The default is blanks. The defaults for USERDATA, PERFORM, and DEST are (0000), NOPERFORM, and CENTRAL SITE DEFAULT, respectively, and are adequate for MVS running under Hercules. Here is a screen capture of the addition of a new User ID, followed by the listing of the ID with the LIST subcommand:
Batch Job The ACCOUNT command may be issued in a "TSO under Batch" job using the following jobstream:
The commands following the SYSTSIN DD are the same as would be issued interactively under TSO. The TSO responses from the commands will appear in the SYSOUT produced when the job is submitted and run:
Why does my TSO session abend with a SYSTEM=522 completion code and what can I do to fix it?A TSO User session is regarded by JES2 in a manner similar to a batch job step, so there is a time limit applied to the session and when that limit is exceeded, the session is automatically cancelled by JES2 with a System Completion Code 522. In a production environment the reason for this was to prevent users from coming into work, logging their terminal onto TSO, and then leaving the session sitting idle most of the work day. Even if a user is not executing any programs under their TSO session, the session is utilizing resources that could be reallocated to other users. There are several ways to increase the time limit and they are discussed here. Why would anyone want to code COND=(0,NE) on a JOB card?Asked on the turnkey-mvs list and answered by Greg Price:
I frequently code COND=(0,NE) on the EXEC statement in order to halt a job if any preceding steps have received a non-zero code. But by coding this condition on the JOB statement, it precludes having to code this on each EXEC statement in the job. You can also include this condition on the JOB card when you are developing a jobstream, and then "fine tune" the conditions to be checked at each step before you place the jobstream into production. How do I resolve a workspace truncated message in RPF when editing a large dataset?This message is issued by RPF when the current workspace size is too small for the dataset being edited. If you use FORCE to save the dataset, you will lose the records from the end of the dataset that could not be contained in the current workspace. To increase the size of the workspace, from the primary menu select Defaults (option 0), followed by Workspace (option 1) and increase the number of lines for the workspace (the WS-SIZE field) to a value large enough to contain the maximum number of records in any dataset you plan to edit. As installed, the value of this parameter is 1,000. The minimum value that may be specified is 50 and the maximum is 59,999. Where can I obtain missing extended mnemonic opcode definitions/macros?If you attempt to assemble a program that includes the more recent addressing mode switching instructions or extended mnemonics for branching, you will receive error messages and the object module will be useless. Jan Jaeger has written a set of macros that extend Assembler H (the assembler included with MVS) so that many programs that were written for later versions of MVS (or OS/390 and z/OS) may successfully assemble with Assembler H. You can install these macros in a user macro library using a jobstream from my site: mnemac. How do I resolve B37 abends while using IEHMOVE?If the reason for the B37 is that SYSUT1 is out of space, Wayne Mitchell suggested a solution (in September 2003 on the H390-MVS list)- add a POWER parameter to the EXEC statement: //IEHMOVE EXEC PGM=IEHMOVE,PARM='POWER=9' He said that a value of 9 will handle anything except SMP datasets, although he had used a value as high as 19. I can find no documentation of this parameter anywhere, at least in the manuals and books I have on hand. But the source code for IEHMOVE shows that the value can have a maximum of three digits, so you should be able to specify this and process some really large datasets with IEHMOVE. How can I delete all members of a PDS (reset it to empty)?There is a clever little assembler program on my miscellaneous programs page that will do this. It will reset (empty) partitioned or sequential datasets in preparation for a reload. Datasets processed by this program will appear as though they have been deleted and re-allocated, however, the overhead of scratch/allocate and uncatalog/catalog is avoided. Additionally, datasets will still reside in the original location on the volume, which cannot be assured with scratch/allocate. This allows for permanent placement of datasets even though they may require reloading. Download the installation and execution jobstreams from: Reset Dataset(s) to Empty. Is there a way to suppress the default PLI/F (E)STAE abend handler?This question was asked on the H390-MVS group by James Campbell (message #3543). He subsequently posted his solution, which I am reproducing here: What I came up with was a zap to one of the PLI/F CSECTS that gets (automatically) linked with your mainline; the zap replaces a SPIE SVC with a SLR 15,15. Here is the zap:NAME MYPLIF IHESAP VER 0272 0A0E REP 0272 1FFFNow, without any pgm changes, I get my SYSUDUMP from the OC4 that is occurring from my assembler subroutine plus (for the less sysprog types of folks) PLI/F still gets a chance to do his friendly thing and spit out the message:IHE012I MYPLIF ABENDED AT OFFSET 00010C FROM ENTRY POINT MYPLIF WITH CC 0C4 (SYSTEM)Thus letting the "non dump reader" types relate the "10C" offset to the PL/I line of source code that calls the assembler subroutine. Here is a jobstream to apply the ZAP: //ZAP JOB (SYS),'ZAP PLI/F',CLASS=A,MSGCLASS=A //ZAP EXEC PGM=AMASPZAP //SYSPRINT DD SYSOUT=* //SYSLIB DD DSN=SYS1.PL1LIB,DISP=SHR //SYSIN DD * NAME IHESAPA IHESAP VER 0272 0A0E REP 0272 1FFF // Note: Prior to applying modifications to system control programs/modules, it is always a good idea to back them up in case you want to undo your modifications. In this case, the modification is so minor it would be relatively easy to reverse the ZAP (simply exchange the last four characters in the VER/REP control cards). How are return codes passed/accessed in COBOL?The RETURN-CODE special register may be used as both a sending and receiving field in COBOL statements. The implicit definition of this special register is:
When a program written in COBOL begins execution, the RETURN-CODE special register is set to zero. When a program written in COBOL calls a sub-program written in COBOL:
When a program written in COBOL calls a subprogram written in a non-COBOL language:
When the highest level program terminates and is written in COBOL, if the value contained in the RETURN-CODE special register is not zero when the STOP RUN statement is executed, the step ABENDS with a U??? completion code and the value that was contained in RETURN-CODE becomes the value reported as the User Completion Code.
Is there a means to determine which assembler is being used to assemble source code?This message was posted on the main Hercules-390 discussion group, as was the answer, which was found on the Share website. The WHICHASM macro exploits differences in behavior of the Type attribute for symbolic variables to determine which version of the assembler is executing:
I have tested the macro and it works as advertised for Assembler XF (IFOX00) and Assembler H (IEV90). It does not work for Assembler F (IEUASM from MVT), which issues several instances of the message IEU045 ILLEGAL SYMBOLIC PARAMETER. I don't have access to the High Level Assembler to test the macro's behavior there. What built-in symbolic variables are available for Assembler F?This question accompanied the previous question. In fact, further discussion in the Hercules-390 clarified that the question was intended to reference Assembler XF (IFOX00) rather than Assembler F (IEUASM from MVT). As far as I can determine from examining the source for IEUASM, there are no built-in symbolic variables provided for Assembler F. (I would gladly accept correction if I am wrong in this.) Upon examination of the Assembler Language Reference manual and Assembler Programmer's Guide found at http://bitsavers.org/pdf/ibm/370/, I found the definition of these six built-in symbolic variables:
This is confirmed by examination of the source for Assembler XF included with MVS 3.8j. When attempting to log on to TSO, IST800I TERM CUU??? HAS BEEN RELEASED BY NETSOL DUE TO I/O ERROR appears on the console. Why?This error seems to occur most frequently with the free version of QWS3270. This client will work for the MVS console, but will cause this problem, and others, when used for a TSO session. You can probably get around this particular problem by setting the Yale Null Processing option (under the Options menu item) off. The default setting is on, which causes QWS3270 to translate all null characters (x'00') to space characters (x'40') before sending the terminal input data to the host. Setting the parameter off will cause QWS3270 to simulate a true 3270 terminal. There are several free tn3270 clients available. See the x3270 home page. Will code compiled (or assembled) under MVS 3.8 execute on newer versions of the operating system?One of the marketing points for the S/360 architecture was upward compatibility. Programs written and compiled for a particular model would probably still execute correctly if you upgraded to a later model. Even though there are exceptions, you will probably find that it is still true. Why do I receive the message: IER040A INSUFFICIENT WORK UNITS when I attempt to use the MVT Sort/Merge program under MVS 3.8?The MVT Sort/Merge utility requires at least three (and may use up to a maximum of 32) intermediate storage datasets. Unlike current Sort/Merge utilities (such as DFSORT or Syncsort), the MVT Sort/Merge is unable to dynamically allocate datasets for use as intermediate storage. You must supply DD statements for the DD Names SORTWK01, SORTWK02, SORTWK03 ... SORTWK32. Also, just as the input and output datasets accessed by the MVT Sort/Merge must reside on either 2311 or 2314 DASD, the SORTWK?? datasets must also reside on 2311/2314 DASD. Although some efforts have been reported of using tape datasets with the MVT Sort/Merge under Hercules, it is probably a better idea to utilize DASD for the SORTWK?? datasets. If the MVT Sort/Merge is called indirectly (as by a COBOL program that includes the SORT verb), you must also supply SORTWK?? DD cards to the EXEC step. How can I list all the datasets from a specified volume?There are several ways to obtain this type of list. From RPF, select 3.4 from the primary menu to display the VTOC and dataset utility panel: To restrict the list of datasets to those containing a specified high level qualifier, enter the value of the qualifier desired in the LEVEL= field (the default is the TSO User ID, so you must clear this field to obtain a listing of all datasets). Enter the volume serial number of the volume for which the datasets are to be listed in the Volume= field and press ENTER. The list of datasets will be displayed: If you have set up User Catalogs for individual DASD volumes (a recommended practice), you can list the datasets that reside on a particular volume using the LISTCAT command from a TSO prompt: There are two batch utilities that are specifically intended to list the datasets on a selected volume - IEHLIST (an IBM utility included with MVS) and VTOCLIST (from the CBT tape). A jobstream to execute IEHLIST is:
A jobstream to execute VTOCLIST is:
If you follow the link to VTOCLIST, there is an explanation for a procedure which will allow you to start a task from the console to list a specified volume without the necessity of editing/submitting a JCL member. How do I code an assembler program to access a VSAM cluster using Path/Alternate Index?The coding in the application program is identical regardless of whether you wish to access the VSAM base cluster directly or through an Alternate Index. The mechanics of utilizing the Path and Alternate Index to access the base cluster are managed entirely by the VSAM Access Method transparently for your program. The single factor controlling whether the access is through the base cluster directly or the Path/Alternate Index is the Dataset Name coded on the DD statement in the Job Control Language. An example from James Martin's VSAM: Access Method Services and Programming Techniques illustrating this:
How can I code a CLIST to test for a variable/literal that is identical to a reserved word?I received this question from an individual coding a validation routine for United States' state abbreviation codes. They were receiving an error from TSO when attempting to use a comparison operator on the state codes for Nevada (NE) and Oregon (OR) since these abbreviations are identical to the Not Equal and Or comparison operator. The solution is to enclose both the variable and the literal in the CLIST inside of the &STR() function. The following example CLIST illustrates the correct coding:
How can I retrieve the SYSOUT from my JOB to a dataset?Using the JOB name and system assigned JOB number, you can use the TSO OUTPUT command to retrieve the SYSOUT files from the JES2 Queue and place it into a dataset that can be viewed using RPF. First you should allocate a dataset with the attributes RECFM=VBA and LRECL=137. If you don't allocate the dataset prior to issuing the OUTPUT command, the dataset will be allocated by the OUTPUT command, but the default amount of space may be inadequate for your JOB's output. The dataset name should be in the form of: <userid>.<jobname>.OUTLIST, where <userid> is your TSO USER ID and <jobname> is the JOB name. Issue the TSO OUTPUT command to retrieve the SYSOUT files:
In the command format shown above -
A more detailed discussion of the OUTPUT command may be read at www.jaymoseley.com/hercules/tsotutor/tsotutor.htm#output. Can I access the data passed in a PARM operand on the EXEC JCL statement in MVT COBOL?Yes, here is an example program and the output (the output of the DISPLAY verb is written to the SYSOUT DD statement):
Remember, there is a limitation of 100 characters on the data that may be passed in the PARM operand. Can a COBOL program compiled with MVT COBOL create User Tape Labels?Yes, here is an example program followed by a dump of the tape contents:
Note that the DD Statement for the tape must specify SUL (Standard User
Labels) or the program will execute, but the User Labels will not be
written to the tape (thanks to Roger Bowler for supplying this
information). Does the MVT COBOL include the Report Writer Feature?Yes, although it may not include some extensions that are available with the latest versions of COBOL compilers. However, it is my understanding that some compiler manufacturers removed the Report Writer Feature, so in some comparisons the OS/360 MVT COBOL compiler may have more functionality than the latest and greatest version. I have written a tutorial covering the basics of using the Report Writer Feature, with examples at: COBOL Report Writer. I have heard about Concept 14 Macros, what are they and where can I get them?In 1970, M. M. Kessler wrote a report describing the implementation of a method of writing structured Assembler code by utilizing a set of macros. These macros are what became referred to as the Concept 14 Macros, and they developed some community of followers. There have been other sets of macros developed to provide a similar function, but these were the first. You can obtain an IEBUPDTE jobstream to install the macros, and also view a scanned copy of the original report at http://skycoast.us/pscott/software/mvs/concept14.html, a website maintained by Paul A. Scott. I hope that you have found my instructions useful. If you have questions that I can answer to help expand upon my explanations and examples shown here, please don't hesitate to send them to me:
This page was last updated on April 23, 2008 . |