DCB—Construct a data control block (BSAM)

The data control block for a basic sequential access method (BSAM) data set is constructed during assembly of the problem program. You must code DSORG and MACRF in the DCB macro, but the other DCB parameters can be supplied to the data control block from other sources. Each DCB parameter description contains a heading, "Source". The information under this heading describes the sources that can supply the parameters. Each reference to a DCB OPEN exit routine also applies to a JFCBE exit routine.

You can assemble the DCB macro into a program that resides above the 16 MB line, but the program must move it below the line before using it. Except for the DCBE, all areas that the DCB refers to, such as EXLST and EODAD, must be below the 16 MB line.

The format of the DCB macro for BSAM is:

Note:
  1. This parameter must be supplied before an OPEN macro is issued for this DCB; it cannot be supplied in the open exit routine.

Recommendation: When creating a DCB to open a data set allocated to an SMS-managed volume, do not specify values that would change the data set to a type which cannot be SMS-managed, such as DSORG=PSU.

BSAM supports the following DCB parameters:
BFALN={F|D}
specifies the boundary alignment for each buffer in the buffer pool when the buffer pool is constructed automatically or by a GETPOOL macro. If BFALN is omitted, the system provides doubleword alignment for each buffer.

If the data set being allocated or processed contains ASCII tape records with a block prefix, the block prefix is entered at the beginning of the buffer. Also, data alignment depends on the length of the block prefix. For a description of how to specify the block prefix length, see the description of the DCB BUFOFF that is not L.

You can specify:
F
specifies that each buffer is on a fullword boundary that is not also a doubleword boundary.
D
specifies that each buffer is on a doubleword boundary.

If the BUILD macro is used to construct the buffer pool or if the problem program controls all buffering, the problem program must provide an area for the buffers and control buffer alignment.

Source: BFALN can be supplied in the DCB macro, in the DCB subparameter of a DD statement, or by the problem program before completion of the data control block exit routine. If both BFALN and BFTEK are specified, they must be supplied from the same source.

BFTEK=R
specifies that BSAM is used to read unblocked variable-length spanned records with keys from a direct data set. Each read operation reads one segment of the record and places it in the area designated in the READ macro. The first segment enters at the beginning of the area, but all subsequent segments are offset by the length of the key (only the first segment has a key). The problem program must provide an area in which it can assemble a record, identify each segment, and assemble the segments into a complete record.

Source: BFTEK can be supplied in the DCB macro, in the DCB subparameter of a DD statement, or by the problem program before completion of the data control block exit routine. If both BFTEK and BFALN are specified, they must be supplied from the same source.

BLKSIZE=absexp (maximum value KEYLEN + BLKSIZE is 32760)
specifies the maximum block length in bytes. For fixed-length, unblocked records, a non-zero value for this parameter specifies the record length. BLKSIZE includes only the data block length. If keys are used, the length of the key is not included in the value specified for BLKSIZE. If a physical sequential data set that contains fixed-length records (blocked or unblocked) is accessed with a DCB that has specified a DSORG of undefined, then the BLKSIZE value specified must be a value that is less than or equal to the data sets physical block size in the DSCB.

If you wish to process blocks longer than 32760 for BSAM, then use the BLKSIZE keyword on a DCBE macro and use the DCBE keyword on the DCB macro. That requests the large block interface. If the system allows the large block interface, the system modifies the BLKSIZE field in the DCB and your program should not use that field.

The actual value you can specify in BLKSIZE depends on the device type and the record format being used. Device capacity for direct access storage devices is described in Selecting logical record lengths and block sizes for specific devices. For additional information about device capacity, see the relevant device publication.

When PDSEs, compressed format data sets, or z/OS UNIX files are being processed, the value specified in BLKSIZE can be up to the maximum value. For other data sets on direct access storage devices, the value specified for BLKSIZE cannot exceed the capacity of a single track.

If fixed-length records are used, the value specified in BLKSIZE should be an integral multiple of the value specified for the logical record length (LRECL).

For fixed-length unblocked records, LRECL must equal BLKSIZE (if LRECL is specified).

If variable-length records are used, the value specified in BLKSIZE must include the maximum logical record length (up to 32756 bytes) plus the 4 bytes required for the block descriptor word (BDW). For format-D variable-length records (ASCII data sets), the minimum BLKSIZE value is 18 bytes.

The maximum block size is 32,760 except for Version 3 ISO/ANSI tapes (ISO 1001-1979 and ANSI X3.27-1978), where the maximum block size is 2048. As required by the standard, an attempt to exceed 2048 bytes for a Version 3 tape results in a label validation installation exit being called. The exit may allow violation of the standard by writing larger blocks. This restriction does not apply to Version 4 labels. For more information about the BLKSIZE restrictions, see z/OS DFSMS Using Data Sets.

If ASCII tape records with a block prefix are processed, the value specified in BLKSIZE must also include the length of the block prefix.

If BSAM is used to read variable-length spanned records the value specified for BLKSIZE must be as large as the longest possible record segment in the data set, including 4 bytes for the segment descriptor word (SDW) and 4 bytes for the block descriptor word (BDW). The BLKSIZE must equal at least 8 bytes.

If undefined-length records are used, the value specified for BLKSIZE can be altered by the problem program when the actual length becomes known to the problem program. The value can be inserted directly into the DCBBLKSI field of the data control block or specified in the length parameter of a READ or WRITE macro.

Processing PDSEs: The system reblocks PDSE records into its own internal format when the data set is written, and reconstructs the blocks using the block size from the DCB when the data set is read. For fixed-length blocked records, the value specified in BLKSIZE must be a multiple of the value in LRECL (if LRECL is specified). The LRECL value must be available to OPEN when the PDSE is open for output.

When reading a PDSE directory using fixed-length blocked records, you can specify a BLKSIZE of 256 or greater (the LRECL is ignored). specified in BLKSIZE is the user-perceived block size of the data set. The actual physical (or internal) block size of the data set is calculated by the system when the data set is written. This internal block size is transparent to the user. The system, however, maintains the user's block boundaries when the data is written. Therefore, it is able to reconstruct the exact user blocks when the data set is read. When writing in a compressed format data set, the access method generally compresses the data. This compression and decompression when reading are transparent to the user.

Processing z/OS UNIX files: Block boundaries are not maintained within a z/OS UNIX file. This means that when you read, records may be distributed among blocks differently than they were written. When BLKSIZE is not specified (by any source), it is defaulted to 80 on input.

System-Determined Block Size: IBM® recommends that you not specify block size except in these cases:
  • Record format is U.
  • Medium is tape without standard labels.
  • A z/OS UNIX file is being processed.
This makes your program less dependent on the physical characteristics of the device.

System-Determined Block Size for DASD Data Sets: For DASD data sets, if the block size is not specified at the time that the data set is created, and LRECL and RECFM are known, and the record format is not U, the system derives an optimum block size for the data set. This system-determined block size is retained in the data set label. When the data set is opened for output, OPEN checks the block size in the data set label. If it is a system-determined block size, and LRECL or RECFM have changed from those specified in the data set label, OPEN will re-derive an optimum block size for the data set.

System-Determined Block Size for Tape Data Sets: If you do not specify a block size for a tape data set and the RECFM value is not U, the system determines the optimum block size when the data set is opened for OUTPUT or OUTIN. The system-determined block size depends on the record format and the device type of the tape. See z/OS DFSMS Using Data Sets for the table showing the block sizes that are set for tape data sets.

Source: BLKSIZE can be supplied in the DCB or DCBE macro, in the DCB subparameter of a DD statement, by the problem program before completion of the data control block exit routine, by the data set label of an existing data set, or by the system determining a value for a new data set. The system does not copy BLKSIZE when you code the JCL keyword LIKE. It derives the BLKSIZE from RECFM and LRECL which can be copied. For more information on LIKE, see z/OS MVS JCL Reference and z/OS MVS JCL User's Guide.

BUFCB=relexp
specifies the address of the buffer pool control block that you have constructed by issuing a BUILD macro. The buffer pool must reside below the 16MB line.

If the buffer pool is to be constructed automatically or by a GETPOOL macro, omit BUFCB. This is because the system places the address of the buffer pool control block into the data control block. Also, if the problem program is to control all buffering, omit BUFCB. A buffer pool control block resides below the 16MB line.

Source: BUFCB can be supplied in the DCB macro or by the problem program before issuing a GETBUF macro.

BUFL=absexp (maximum value is 32760)
specifies the length, in bytes, for each buffer in the buffer pool when the buffer pool is acquired automatically. If BUFL parameter is omitted and you request OPEN to build a buffer pool, the system builds buffers with a length equal to the sum of the values specified in KEYLEN and BLKSIZE. If the problem program requires larger buffers (up to 32760 bytes), BUFL is required. If BUFL is specified, it must be at least as large as the value specified in BLKSIZE in the DCB (without LBI) or in the DCBE (with LBI). If the data set is for card image mode, BUFL should be specified as 160. The description of DEVD contains a description of card image mode.

If the data set contains ASCII tape records with a block prefix, the value specified in BUFL must include the block length plus the length of the block prefix.

If the problem program is to control all buffering or if the buffer pool is to be constructed by a GETPOOL or BUILD macro, BUFL is not required.

Source: BUFL can be supplied in the DCB macro, in the DCB subparameter on a DD statement, or by the problem program before completion of the data control block exit routine.

BUFNO=absexp (maximum value is 255)
specifies the number of buffers acquired automatically by the system during OPEN.

If the problem program controls all buffering or if the buffer pool is constructed by a GETPOOL macro, omit BUFNO. The default is 0, meaning the system does not acquire buffers automatically. If the system acquires buffers for BSAM, they reside below the 16MB line. You may obtain each buffer by issuing a GETBUF macro.

Source: BUFNO can be supplied in the DCB macro, in the DCB subparameter of a DD statement, or by the problem program before completion of the data control block exit routine.

BUFOFF={absexp|L}
specifies the length, in bytes, of the block prefix used with an ASCII tape data set or a tape data set with CCSID. When BSAM is used to read this kind of tape data set, the problem program must use the block prefix length to determine the location of the data in the buffer. When BSAM is used to write an output ASCII tape data set, the problem program must insert the block prefix into the buffer, followed by the data (BSAM considers the block prefix as data). The block prefix without BUFOFF=L and data can consist of any characters that can be converted into 7-bit ASCII code or the CCSID code. With BUFOFF=L the block prefix is 7-bit ASCII. Any character that cannot be converted is replaced with a substitute character. (For a more detailed description of ASCII conversion characteristics, see z/OS DFSMS Using Magnetic Tapes.) For format-D records, the RDW must be binary; if RECFM=D and BUFOFF=L, the RDW and BDW must both be binary. On output, the control program converts the BDW and RDW to ASCII characters and, on input, the control program converts ASCII data to BDW and RDW. This is true even when you use the CCSID parameter to specify a character code other than ASCII. You can specify the following characters in BUFOFF:
absexp
specifies the length, in bytes, of the block prefix. This value can be from 0 to 99 for an input data set. The value must be 0 for writing an output data set with fixed-length or undefined-length records (BSAM considers the block prefix part of the data record).
L
specifies that the block prefix is 4 bytes long and contains the block length. BUFOFF=L is used when format-D records (ASCII) are processed. When BUFOFF=L is specified, the BSAM problem program can process the data records (using READ and WRITE macros) in the same manner as if the data were in format-V variable-length records. For further information on format-D records, see z/OS DFSMS Using Data Sets.

If BUFOFF is omitted for an input data set with format-D records, the system inserts the record length into the DCBLRECL field of the data control block. The problem program must obtain the length from this field to process the record.

If BUFOFF is omitted from an output data set with format-D records, the problem program must insert the actual record length into the DCBBLKSI field of the data control block or specify the record length in the length parameter of a WRITE macro.

Source: BUFOFF can be supplied in the DCB macro, in the DCB subparameter of a DD statement, or by the problem program before an OPEN macro is issued to open the data set. BUFOFF=absexp can also be supplied by the label of an existing data set. BUFOFF=L cannot be supplied by the label of an existing data set.

DCBE=relexp
specifies the address of a DCB Extension (DCBE). The DCBE may reside above the 16MB line. You may assemble a DCB and DCBE in a program that resides above the line if the DCB is copied below the line before opening the copy.

If the DCBE is specified, it must be specified before issuing the OPEN macro. Like the DCB, the DCBE must exist until the data set is closed. Otherwise, there may be unpredictable results.

Only one open DCB at a time can refer to a particular DCBE. After a DCB is successfully closed, you can open a different DCB referring to the DCBE.

The DCBE is not required with BSAM unless the data set requires a DCBE option or if you choose to use DCBE options.

If a DCBE exists, the flags DCBH0 and DCBH1 are both set on. The pointer to the DCBE is stored at offset +0 in the DCB (and replaces the field DCBRELAD). If a DCBE exists, data that would be stored at DCBRELAD is stored in the DCBE (DCBERELA). If a DCBE does not exist, DCBRELAD continues to be located at offset +0 in the DCB.

Source: You can supply the DCBE address in the DCB macro or before issuing an OPEN macro to open the data set.

DDNAME=symbol
specifies the name that is to be used to identify the job control language data definition (DD) statement that defines the data set being allocated or processed.

Source: DDNAME can be supplied in the DCB macro or by the problem program before an OPEN macro is issued to open the data set.

DEVD={DA|TA|PR|PC|RD}
specifies the device type where the data set can or does reside. The device types above are shown with the optional parameters that can be coded when a particular device is used. The devices are listed in order of device independence. For example, if you code DEVD=DA in a DCB macro (or omit DEVD parameter, which causes a default to DA), you can later use the data control block constructed during assembly for any of the other devices, but, if you code DEVD=RD, you can use the data control block only with a card reader or card reader punch. Unless you are certain that device interchangeability is not required, you should either code DEVD=DA or omit the parameter and allow it to default to DA.

Restriction: If the data set can or does reside on DASD, do not code a value other than DEVD=DA. For spooled data sets, dummy data sets, and TSO terminals any DEVD value is acceptable.

DEVD is discussed below according to individual device type:
DEVD=DA
[,KEYLEN=absexp]
specifies that the data control block can be used for a direct access storage device (or any of the other device types described following DA).
KEYLEN=absexp
can be specified only for data sets that reside on direct access storage devices. Because the KEYLEN is usually coded without the DEVD parameter (default taken), the description of KEYLEN is in alphabetic sequence with the other parameters.
DEVD=TA
    [,DEN={1|2|3|4}]
    [,TRTCH={C|E|ET|T}|{COMP|NOCOMP}]
specifies that the data control block can be used for a magnetic tape data set (or any of the other device types described following TA). If TA is coded, you can code the following optional parameters:
DEN={1|2|3|4}
specifies the recording density in the number of bits-per-inch per track as follows:
DEN 7-Track 9-Track 18-Track 36-Track
1 556 N/A N/A N/A
2 800 800 (NRZI)1 N/A N/A
3 N/A 1600 (PE)2 N/A N/A
4 N/A 6250 (GCR)3 N/A N/A
Notes:
  1. NRZI is for nonreturn-to-zero inverted mode.
  2. PE is for phase encoded mode.
  3. GCR is for group coded recording mode.

If DEN is not supplied by any source, the highest applicable density is assumed.

For magnetic tape drives that use cartridges, such as the 3480, only a single density is available and is used by the system for reading and writing; any density with the DEN parameter is ignored.

TRTCH={C|E|ET|T}|{COMP|NOCOMP}
The TRTCH parameter has two different sets of values. One of the sets, {C|E|ET|T}, is used to specify the recording technique for 7-track tape. The other set, {COMP|NOCOMP}, is used to specify the recording technique for magnetic tape drives with Improved Data Recording Capability and override the system default.
{C|E|ET|T}
These values specify the recording technique for 7-track tape. One of the above four values can be coded. If TRTCH is omitted, odd parity with no translation or conversion is assumed. You can specify:
C
specifies that the data-conversion feature is used with odd parity and no translation.
E
specifies even parity with no translation or conversion.
ET
specifies that even parity with BCDIC to EBCDIC translation is required and no data-conversion feature.
T
specifies that BCDIC to EBCDIC translation is required with odd parity and no data-conversion feature.
{COMP|NOCOMP}
These values specify the recording technique for magnetic tape drives with Improved Data Recording Capability. Either of the two values can be coded. If TRTCH is omitted, the system default specified in the active DEVSUPyy member of SYS1.PARMLIB (initially set to NOCOMP) is assumed. You can specify:
COMP
record data in compacted format. COMP is not supported with ISO/ANSI tape labels.
NOCOMP
record data in standard format.

Source: TRTCH can be supplied in the DCB macro, in the DCB subparameter on a DD statement, in the IBM standard tape label or by the problem program before completion of the data control block exit routine.

DEVD=PR
    [,PRTSP={0|1|2|3}]
specifies that the data control block is used for a directly allocated printer (or any of the other device types following PR). This has no effect for a spooled (SYSOUT) or subsystem data set. If PR is coded, you can specify:
PRTSP={0|1|2|3}
specifies the line spacing on the printer. This parameter is not valid if the RECFM parameter specifies either machine (RECFM=M) or ISO/ANSI (RECFM=A) control characters. If PRTSP is not specified from any source, 1 is assumed. You can specify:
0
specifies that spacing is suppressed (no space).
1
specifies single spacing.
2
specifies double spacing (one blank line between printed lines).
3
specifies triple spacing (two blank lines between printed lines).
DEVD=PC
    [,MODE=[C|E][R]]
    [,STACK={1|2}]
    [,FUNC={I|P|PW[XT]|R|RP[D]|RW[T] |RWP[XT][D]| W[T]}]
specifies that the data control block is used for a card punch (or any of the other device types following PC). If PC is coded, you can specify the following optional parameters:
MODE=[C|E][R]
specifies the mode of operation for the card punch. You can specify the following characters (if MODE is omitted, E is assumed):
C
specifies that the cards are punched in column binary (card image) mode. In column binary mode, the 12 rows in each card column are punched from 2 consecutive bytes in virtual storage. Rows 12 through 3 are punched from the low-order 6 bits of one byte and rows 4 through 9 are punched from the low-order 6 bits of the following byte.
E
specifies that the cards are punched in EBCDIC code.
R
specifies that the program runs in read-column-eliminate mode (3525 Card Punch, read feature).

If you code R for the MODE subparameter of the DCB parameter of the DD statement, you must also code either C or E.

STACK={1|2}
specifies that the stacker bin where the card is placed after punching is completed. If this parameter is omitted, stacker number 1 is used. You can specify:
1
specifies stacker number 1.
2
specifies stacker number 2.
FUNC={I|P|PW[XT]|R|RP[D]| RW[T]|RWP[XT][D]|W[T]}
defines the type of 3525 card punch data sets used. If the FUNC parameter is omitted from all sources, a data set opened for input defaults to read only, and a data set opened for output defaults to punch only. You can specify:
D
specifies that the data protection option is used. The data protection option prevents punching information into card columns that already contain data. When the data protection option is used, an 80-byte data protection image (DPI) must have been previously stored in SYS1.IMAGELIB. Specify its name in the FCB parameter of the DD statement. Data protection applies only to the output/punch portion of a read and punch or read, punch, and print operation.
I
specifies that the data in the data set is punched into and printed on the cards. The first 64 characters are printed on line 1 of the card and the remaining 16 characters are printed on line 3.
P
specifies that the data set is for punching cards. See the description of the character X for associated punch and print data sets.
R
specifies that the data set is for reading cards.
T
specifies that the two-line print option is used. The two-line print option allows two lines of data to be printed on the card (lines 1 and 3). If T is not specified, the multiline print option is used; this allows printing on all 25 possible print lines. In either case, the data printed can be the same as the data punched in the card, or it can be entirely different data.
W
specifies that the data set is for printing. See the description of the character X for associated punch and print data sets.
X
specifies that an associated data set is opened for output for both punching and printing. Coding the character X is used to distinguish the 3525 printer output data set from the 3525 punch output data set.
DEVD=RD
    [,MODE=[C|E][O |R]]
    [,STACK={1|2}]
    [,FUNC={I|P|PW[XT]|R|RP[D]| RW[T]|RWP[XT][D]| W[T]}]
specifies that the data control block is used with a card reader or card read punch. If RD is specified, the data control block cannot be used with any other device type. When RD is coded, you can specify the following optional parameters:
MODE=[C|E][O|R]
specifies the mode of operation for the card reader. You can specify:
C
specifies that the cards to read are in column binary (card image) mode. In column binary mode, the 12 rows in each card column are read into 2 consecutive bytes of virtual storage. Rows 12 through 3 are read into one byte and rows 4 through 9 are read into the following byte.
E
specifies that the cards to read contain data in EBCDIC code.
O
specifies that the program runs in optical-mark-read mode (3505 Card Reader).
R
specifies the program runs in read-column-eliminate mode (3505 Card Reader or 3525 Card Punch, read feature).

If you code R or O for the MODE subparameter of the DCB parameter of the DCB parameter of the DD statement, you must also code either C or E.

STACK={1|2}
specifies the stacker bin where the card is placed after reading is completed. If this parameter is omitted, stacker number 1 is used. You can specify:
1
specifies stacker number 1.
2
specifies stacker number 2.
FUNC={I|P|PW[XT]|R|RP[D]| RW[T]|RWP[XT][D]|W[T]}
defines the type of 3525 card punch data sets used. If the FUNC parameter is omitted from all sources, a data set opened for input defaults to read only, and a data set opened for output defaults to punch only. You can specify:
D
specifies that the data protection option is used. The data protection option prevents punching information into card columns that already contain data. When the data protection option is used, an 80-byte data protection image (DPI) must have been previously stored in SYS1.IMAGELIB. Specify its name in the FCB parameter of the DD statement. Data protection applies only to the output/punch portion of a read and punch or read, punch, and print operation.
I
specifies that the data in the data set is punched into and printed on the cards. The first 64 characters are printed on line 1 of the card and the remaining 16 characters are printed on line 3.
P
specifies the data set is for punching cards. See the description of the character X for associated punch and print data sets.
R
specifies that the data set is for reading cards.
T
specifies that the two-line print option is used. The two-line print option allows two lines of data to be printed on the card (lines 1 and 3). If T is not specified, the multiline print option is used; this allows printing on all 25 possible print lines. In either case, the data printed can be the same as the data punched in the card, or it can be entirely different data.
W
specifies that the data set is for printing. See the description of the character X for associated punch and print data sets.
X
specifies that an associated data set is opened for output for both punching and printing. Coding the character X is used to distinguish the 3525 printer output data set from the 3525 punch output data set.

Source: DEVD can be supplied only in the DCB macro. However, the optional parameters can be supplied in the DCB macro, the DCB subparameter of a DD statement, or by the problem program before completion of the data control block exit routine.

DSORG={PS|PSU}
specifies the data set organization and whether the data set contains any location-dependent information that would make it unmovable. You can specify:
PS
specifies a physical sequential data set.
PSU
specifies a physical sequential data set containing location-dependent information that makes it unmovable. See NOTE—Provide relative position (BPAM and BSAM—tape and DASD only) for more information about unmovable data sets.

Restriction: Unmovable data sets cannot be system-managed. There are exceptions, however, in cases where the checkpoint/restart function has set the unmovable attribute for data sets that are already system-managed. This setting prevents data sets opened previously by a checkpointed application from being moved until you no longer want to perform a restart on that application. PDSEs and extended format data sets must be system-managed, and, thus, cannot be unmovable.

Source: You must code DSORG in the DCB macro.

EODAD=relexp
specifies the address of the routine given control when the end of an input data set is reached. If the record format is RECFM=FS or FBS, the end-of-data condition is sensed when a file mark is read or when more data is requested after reading a truncated block. The end-of-data routine is entered when the CHECK macro determines that the READ macro reached the end of the data. If the end of the data set is reached but no EODAD address was supplied to the data control block (DCB) or DCBE, the task is abnormally terminated. For additional information on the EODAD user exit routine, see z/OS DFSMS Using Data Sets.

When the data set has been opened for other than UPDAT, the system automatically switches volumes when the end of data on each volume is reached.

When the data set has been opened for UPDAT and volumes are to be switched, the problem program should issue a FEOV macro after the EODAD routine has been entered.

This end-of-data routine entry point specified in the DCB must reside below the line. If you wish the entry point to reside above the line, use the EODAD parameter of the DCBE macro. See the EODAD parameter description for the DCBE macro, DCBE—(BDAM, BSAM, QSAM, BPAM, and EXCP). The EODAD routine (whether it is specified in the DCBE or DCB) receives control in the addressing mode in which the CHECK macro was issued.

Source: EODAD can be supplied in the DCB macro or by the problem program before the end of the data set is reached.

EXLST=relexp
specifies the address of the DCB exit list. EXLST is required if the problem program requires additional processing for user labels, user totaling, data control block OPEN exit routines, end-of-volume, block count exits, defining a forms control buffer (FCB) image, using the JFCBE exit (for the IBM 3800 Printing Subsystem), or using the DCB ABEND exit for abend condition analysis.

The exit list must reside below the line. For the function, format, and requirements of exit list processing, see z/OS DFSMS Using Data Sets. Exit routines can reside above the 16 MB line if you use the technique described in Figure 1.

Source: EXLST can be supplied in the DCB macro or by the problem program any time before the relevant function is needed.

KEYLEN=absexp (maximum value is 255)
specifies the length, in bytes, for the key associated with each data block in a direct access storage device data set. If the key length is not supplied from any source before completion of the data control block exit routine, a key length of zero (no keys) is assumed.

A nonzero key length is allowed for input from a PDSE, but is not allowed for output to a PDSE. You can use keys for reading PDSE members, but not for writing PDSE members.

You cannot specify a nonzero key length on output for an extended format data set. KEYLEN is ignored for z/OS UNIX files.

Source: KEYLEN can be supplied in the DCB macro, in the DCB subparameter of a DD statement, by the problem program before the completion of the data control block exit routine, or by the data set label of an existing data set. If KEYLEN=0 is specified in the DCB macro, a special indicator is set in RECFM so that KEYLEN cannot be supplied from the DCB subparameter of a DD statement or data set label of an existing data set. KEYLEN=0 can be coded only in the DCB macro and is ignored if specified in the DD statement.

Key length can be derived from the data class associated with the data set. Key length can also be derived from the JCL keyword LIKE. However, if KEYLEN is specified in the DCB macro, it overrides the value derived from data class or LIKE. For more information, see z/OS MVS JCL Reference.

LRECL={absexp|X}
specifies the length, in bytes, for fixed-length records, or it specifies the maximum length, in bytes, for variable-length records. LRECL=X is used for variable-length spanned records that exceed 32756 bytes. Except when variable-length spanned records are used, the value specified in LRECL cannot exceed the value specified in BLKSIZE.

LRECL is required when using variable-length spanned records. LRECL is also required for PDSEs and compressed format data sets containing fixed-length block records when opened for output.

For other types of data sets. LRECL can be omitted for BSAM; the system uses the value specified in BLKSIZE. If you want the system to determine the optimum block size for the data set, you must code LRECL. If an LRECL value is coded, it is coded as follows:

Unblocked fixed-length records: the value specified in LRECL must be equal to the value specified in BLKSIZE.

Blocked fixed-length records: the value specified in the LRECL parameter must be evenly divisible into the value specified in the BLKSIZE parameter. However, except for PDSEs and compressed format data sets, LRECL is not checked for validity.

Variable-length records: the value specified in LRECL must include the maximum data length (up to 32752 bytes) plus 4 bytes for the record-descriptor word (RDW).

Undefined-length records: omit LRECL; the actual length is supplied dynamically in a READ/WRITE macro. When an undefined-length record is read, the actual length of the record is returned by the system in the DCBLRECL field of the data control block if your program is not using the large block interface (LBI).

z/OS UNIX files: record boundaries are not maintained within a binary z/OS UNIX file. When LRECL is not specified (by any source), it is defaulted to 80 on input.
X
When using BSAM to create a direct data set with variable-length spanned records, the LRECL value should be the maximum data length (up to 32752) plus 4 bytes for the record descriptor word (RDW). Specify LRECL=X if the logical record length is greater than 32756 bytes.

Source: LRECL can be supplied in the DCB macro, in the DCB subparameter of a DD statement, by the problem program before completion of the data control block exit routine, or by the data set label of an existing data set.

Record length can be derived from the data class associated with the data set. Record length can also be derived from the JCL keyword LIKE. However, if LRECL is specified in the DCB macro, it overrides the value derived from data class or LIKE. For more information, see z/OS MVS JCL Reference.

MACRF={{(R[C|P])}
      {(W[C|P|L])}
      {(R[C|P],W[C|P])}}
specifies the type of macros (READ, WRITE, CNTRL, and NOTE/POINT) that are used with the data set being created or processed. The BSAM MACRF parameter also provides the special form (MACRF=WL) for creating a direct data set. MACRF can be coded in any of the combinations shown above. The following characters can be coded for BSAM:
C
specifies that the CNTRL macro is used with the data set. If you specify C, the device must be one of these described in CNTRL—Control directly allocated input/output device (BSAM and QSAM). If C is specified for use with a card reader, a CNTRL macro must follow each input request.
L
specifies that BSAM is used to create a direct data set. This character can be specified only in the combination MACRF=WL. This does not support 31-bit addressing.
P
specifies that POINT macros are used with the data set being created or processed. Specifying P in MACRF also automatically allows you to use NOTE macros with the data set.

Do not code P for FIFO or character special z/OS UNIX files or with PATHOPTS=OAPPEND (see NOTE and POINT macros for more information).

The NOTE and POINT macros cannot be used with spooled data sets. Some subsystems (SUBSYS on the DD statement) may support the NOTE and POINT macros with TYPE=REL specified or defaulted. Assume it does not work unless the subsystem documentation says it is supported.

R
specifies that READ macros are used. R is required if the OPEN option is INPUT, UPDAT, or RDBACK. It has no effect if the OPEN option is OUTPUT or EXTEND. R may be specified if the OPEN option is INOUT or OUTIN.
W
specifies that WRITE macros are used. W is required if the OPEN option is OUTPUT or EXTEND. It has no effect if the OPEN option is INPUT or RDBACK. W may be specified if the OPEN option is UPDAT, INOUT, or OUTIN.

Rule: You must use the CHECK macro to check each READ and WRITE macro issued in the problem program for completion.

Source: MACRF must be specified in the DCB macro.

NCP=absexp (maximum value is 255)
specifies the maximum number of READ and WRITE macros that are issued before the first CHECK macro is issued to test for completion of the I/O operation. In an address space that is constrained for storage below the line, requesting too large a number may result in abnormal termination of the program. If NCP is omitted, 1 is assumed unless you coded the MULTSDN parameter on the DCBE macro.

To request the system to default a value for NCP other than 1, you must supply a DCBE and set MULTSDN to nonzero. The system will update DCBNCP with the system-defaulted NCP (SDN) before the DCB OPEN exit is given control. This allows you to give the system indicators without being dependent on device information such as blocks per track or number of stripes. If you change parameters in the OPEN exit which would cause recalculation of system-determined block size, or you change block size, the SDN will be re-derived after the OPEN exit and stored in the DCBNCP.

If NCP is zero and MULTSDN is non-zero and the block size is greater than or equal to 32768, then NCP will be set to the MULTSDN value with a minimum of 2 and a maximum of 16.

Extended format data sets: Some programs calculate NCP in the DCB OPEN exit by using TRKCALC to get the number of blocks per track. Since a suffix is included with each block on DASD for an extended format data set, the number of blocks per track returned by TRKCALC might not be accurate because it does not take into account the block suffix. This may result in allocating more buffers than is necessary for an extended format data set which consists of only one stripe. Also, for extended format data sets which consist of more than one stripe, using an NCP of this number of blocks per track will result in inadequate performance unless NCP is made larger based on the number of stripes.

Recommendation: For compressed format data sets, do not specify NCP (thus, allowing the system to default it to 1) or specify NCP=1. This is the optimal value for NCP for a compressed format data set since the system handles all buffering internally for these data sets. Therefore, the following technique for choosing a value for NCP does not pertain to compressed format data sets. In fact, since the physical blocks have no relationship to the user-specified block size, IBM recommends that TRKCALC not be used to return number of blocks per track of a compressed format data set, since the value returned will not be accurate.

If you choose to calculate NCP in the DCB OPEN exit, then you may want to choose to use the following technique to calculate a value for extended format data sets. However, you can gain the same effect by coding the MULTSDN parameter on the DCBE macro.
  • Code a DCBE.
  • In the OPEN exit, determine if the data set is extended format (the value in DCBENSTR will be nonzero if the data set is extended format). If the data set is not extended format, then OPEN will set DCBENSTR to 0.
  • Issue a DEVTYPE macro with the INFO=SUFFIX parameter to obtain the length of the suffix.
  • Add DCBBLKSI and the length of the suffix and pass this number in to TRKCALC to get the correct number of blocks per track.
  • Multiply the number of blocks per track from TRKCALC by the number of stripes of an extended format data set (DCBENSTR). Assuming this number of buffers is used, this would give one track's worth of buffers per stripe.

    In addition, you may choose to multiply this value by n to get an NCP value which is n tracks worth of buffers per stripe. A value of n greater than 1 is likely to improve performance.

  • If the calculated value exceeds 255, decrease it appropriately. Store the calculated NCP value in DCBNCP.

Source: NCP can be supplied in the DCB macro, in the DCB subparameter of a DD statement, or by the problem program before completion of the data control block open exit routine.

OPTCD={{B}
    {T}
    {U[C]}
    {C[T][B][U]}
    {H[Z][B]}
    {J[C][U]}
    {W[C][T][B][U]}
    {Z[C][T][B][U]}
    {Q[C][B][T}
specifies the optional services that are used with the sequential data set. Two of the optional services, OPTCD=B and OPTCD=H, cannot be specified in the DCB macro. They are requested in the DCB subparameter of a DD statement. Because all optional services requests must be supplied by the same source, you must omit OPTCD from the DCB macro if either of these options is requested in a DD statement.
Note: If you specify OPTCD=B on the DD statement for a multivolume tape data set, the system will generate the equivalent of individual concatenated DD statements for each volume serial number. This means that the system allocates one tape drive for each volume.
You can code the following characters in any order, in any combination, and without commas between characters.
C
specifies that chained scheduling is used. OPTCD=C cannot be specified if BFTEK=R is specified for the same data control block. Also, chained scheduling cannot be specified for associated data sets or printing on a 3525 and is ignored for direct access storage devices.
Note: Except where it is not allowed, chained scheduling is used whether requested or not. For conditions under which chained scheduling is not allowed, see z/OS DFSMS Using Data Sets.
J
specifies that the first data byte in the output data line is a 3800 table reference character. This table reference character selects a particular character arrangement table for the printing of the data line and can be used singly or with ISO/ANSI or machine control characters. This option has effect for DASD data sets, SYSOUT data sets, and a directly allocated IBM 3800 Printing Subsystem or IBM 3900 Printing Subsystem. On DASD, this indication is saved in the data set label and can be available to programs that read the data. For a partitioned data set, the OPTCD value applies to all members. If the SYSOUT data set is printed on a device that does not support table reference character, the system discards that byte.
Q
requests conversion of the tape records between what is stored on tape and what is supplied from/to the problem program. For input requests, conversion is done at CHECK time. For output requests, conversion is done just before the record is written to tape. For further information on this conversion, see z/OS DFSMS Using Data Sets.
The Q option implies that the character representation of the data on tape differs from that seen by the problem program. Data management converts records according to one of the following techniques:
  • CCSID Conversion

    If CCSIDs are supplied from any source for ISO/ANSI V4 tapes, records are converted between the CCSID which represents the data on tape and the CCSID as seen by the problem program. You can also prevent conversion by supplying a special CCSID.

  • Default Character Conversion

    If you are using non-ISO/ANSI V4 tapes or if CCSIDs are not supplied by any source, data management converts the records between ASCII code (which represents the data on tape) to EBCDIC code (which is seen by the problem program) using specific tables defined for this default character conversion.

Refer to z/OS DFSMS Using Data Sets, for a complete description of CCSID conversion and default character conversion.

See z/OS DFSMS Using Magnetic Tapes for more information about ISO/ANSI labels.

Q is supported only for a magnetic tape that does not have IBM standard labels. If the tape has ISO/ANSI labels (LABEL=(,AL)), the system assumes OPTCD=Q.

T
specifies the user totaling function. If this function is requested, EXLST should specify the address of an exit list that includes a user totaling entry. T cannot be specified for SYSIN and SYSOUT data sets.

Restriction: User totaling is supported only for sequential data sets that are not extended format data sets. If you specify user totaling for a partitioned data set, a PDSE, an extended format data set, or a z/OS UNIX file, it is ignored.

U
is specified only for a printer with the universal character set (UCS) feature or the 3800 Printing Subsystem. This option unblocks data checks (permits them to be recognized as errors) and allows analysis by the appropriate error analysis routine (SYNAD exit routine). If the U option is omitted, data checks are not recognized as errors.
W
specifies, for DASD, that the system is to perform a validity check on each block written on a direct access storage device.

OPTCD=W is ignored for PDSEs, extended format data sets, and z/OS UNIX files.

The system reads each block back. The intent is to ensure that the data would survive a subsequent power failure. Because of the performance degradation and the reliability of modern IBM devices and recovery techniques, IBM recommends not coding OPTCD=W.

For buffered tape devices, specifies that device end interrupt is given only when a block is physically on the device. By specifying OPTCD=W with buffered devices, you do not benefit from the performance advantage of buffering.

Z
for magnetic tape (input only). Requests the system to shorten its normal error recovery procedure to consider a data check as a permanent I/O error after five unsuccessful attempts to read a record. OPTCD=Z is intended for use when a tape is known to contain errors and there is no need to process every record. The error analysis routine (SYNAD) should keep a count of permanent errors and terminate processing if the number becomes excessive.
Note: The following optional services can be requested in the DCB subparameter of a DD statement. If either of these options is requested, the complete OPTCD parameter must be supplied in the DD statement.
B
forces the end-of-volume (EOV) routine to disregard the end-of-file recognition for magnetic tape. When this occurs, the EOV routine uses the number of volume serial numbers to determine end of file. For an input data set on a standard labeled (SL or AL) tape, the EOV routine treats EOF labels as EOV labels until the volume serial list is exhausted. After all the volumes have been read, control is passed to your end-of-data routine. This option allows SL or AL tapes to be read out of volume sequence or to be concatenated to another tape using one DD statement.
H
specifies that the VSE/MVS interchange feature is being used with the data set. It is on magnetic tape and may contain VSE embedded checkpoint records. You cannot use this option with LBI.

Source: OPTCD can be supplied in the DCB macro, in the DCB subparameter of a DD statement, in the data set label for direct access storage devices, or by the problem program before completion of the DCB open exit routine or JFCBE exit routine. However, all optional services must be requested from the same source.

RECFM={{U[T][A|M]}
  {V[B][S][T][A|M]}
  {D[B][S][A]}
  {F[B|S|T|BS|BT][A|M]}}
specifies the record format and characteristics of the data set being allocated or processed. All the record formats shown above can be specified. BSAM recognizes only data blocks. Therefore, for record formats that specify blocked records, the problem program must block and deblock logical records. You can specify:
A
specifies that the records in the data set contain International Organization for Standardization (ISO) or American National Standards Institute (ANSI) control characters. For a description of control characters, see Control characters.
B
specifies that the data set contains blocked records.
D
specifies that the data set contains variable-length ASCII tape records.
F
specifies that the data set contains fixed-length records.
M
specifies that the records in the data set contain machine code control characters. For a description of control characters, see Control characters. RECFM=M cannot be used with ASCII data sets.
S
specifies, for fixed-length records, that the records are written as standard blocks. Except for the last block or track in the data set, the data set contains no truncated blocks or unfilled tracks. Do not code S to retrieve fixed-length records from a data set allocated using a RECFM other than standard.

For variable-length records, including variable-length ASCII, S specifies that a record can span more than one block.

T
specifies that track overflow is used with the data set. Track overflow allows a record to be written partially on one track of a direct access storage device and the remainder of the record to be written on the following tracks (if required).
Note: This is an obsolete option. The system ignores it.
U
specifies that the data set contains undefined-length records.

Restriction: Format-U records are not supported for Version 3 or Version 4 ISO/ANSI tapes. An attempt to process a format-U record for a Version 3 or Version 4 tape results in a label validation installation exit being called.

On ISO/ANSI Version 1 (ISO 1001-1969 or ANSI X3.27-1969) tapes, format-U records can be used for input only. These records are the same as in other types of data sets except that any control characters must be ISO/ANSI control characters and block prefixes can be used.

V
specifies that the data set contains variable-length records.
Restrictions are as follows:
  • Do not specify RECFM=FS or RECFM-FBS for a partitioned data set or PDSE because it will cause an abend.
  • RECFM=V cannot be specified for a card reader data set or an ISO/ANSI tape data set.
  • RECFM=VS, VBS, DS, or DBS do not provide the spanned record function. If this format is used, the problem program must block and segment the records.
  • RECFM=VS, VBS, DS, or DBS cannot be specified for a SYSIN data set.
  • RECFM=VS or VBS cannot be specified for a z/OS UNIX file.
  • RECFM=V cannot be used for a 7-track tape unless the data conversion feature (TRTCH=C) is used.

Source: RECFM can be supplied in the DCB macro, in the DCB subparameter of a DD statement, by the problem program before completion of the data control block exit routine, or by the data set label of an existing data set.

Record format can be derived from the data class associated with the data set. Record format can also be derived from the JCL keyword LIKE. However, if RECFM is specified in the DCB macro, it overrides the value derived from data class or LIKE. For more information, see z/OS MVS JCL Reference.

SYNAD=relexp
specifies the address of the error analysis (SYNAD) routine to be given control when an uncorrectable input/output error occurs. The entry point of this SYNAD routine must reside below the line. If you wish the entry point to reside above the line, use the SYNAD parameter of the DCBE macro. You can also use the technique shown in Figure 1. The contents of the registers when the error analysis routine is given control are described in z/OS DFSMS Using Data Sets. Additional status information available to the SYNAD routine is described in Status information following an input/output operation.

The system detects I/O errors asynchronously. It calls your SYNAD routine synchronously (hence the name SYNAD) when you issue a CHECK macro for the failed block. If SYNAD is omitted in the DCB and DCBE, the task is abnormally terminated when you issue a CHECK and an uncorrectable input/output error occurred.

The error analysis routine must not use the save area pointed to by register 13. The system does not restore registers when it regains control from the error analysis routine. The error analysis routine can issue a RETURN macro that uses the address in register 14 to return control to the system. If control is returned in this manner, the system returns control to the problem program and proceeds as though no error had been found.

The SYNAD routine (whether it is specified in the DCBE or DCB) receives control in the addressing mode in which the CHECK macro was issued. On return from a SYNADAF or SYNADRLS macro issued in the SYNAD routine, the high order byte of register 15 will be unpredictable. Therefore, callers of SYNADAF or SYNADRLS in 31-bit addressing mode must either not use register 15 as a base register or restore the high order bytes on return from SYNADAF or SYNADRLS.

When operating a directly allocated IBM 3800 Model 3, 6, or 8 using all-points addressability, the SYNAD exit routine is entered if Print Services Facility™ (PSF) detects an unrecoverable error. However, no error information is available to the SYNAD routine. If you want to continue processing, you must close and reopen the data set to restart PSF.

Source: SYNAD can be supplied in the DCB macro or by the problem program. The problem program can also change the error routine address at any time.