POINT—Position for access (BPAM and BSAM—tape and DASD only)

The POINT macro causes the next READ or WRITE operation to be for the specified data set block on the current volume for BSAM or on the current data set for BPAM. With BPAM concatenation, you may switch to a different data set with the FIND macro. Before you issue the POINT macro, test for completion of all input and output operations using the same data control block.If you are processing a data set opened for UPDAT, the next operation against the DCB after the POINT macro must be a READ macro. If you are processing an output data set, the next operation against the DCB after the POINT macro must be a WRITE macro before you close the data set, unless you have already issued the CLOSE macro (with TYPE=T specified) before the POINT macro.

The POINT macro with the REL parameter, which is the default, works with any magnetic tape drive. However, POINT with the ABS parameter works only on cartridge tapes, such as the 3480, 3490 and 3590.

The POINT macro may be issued in 24- or 31-bit addressing mode. When issued in 31-bit addressing mode, all addresses must be valid 31-bit addresses.

Spooled Data Sets: The (NOTE and) POINT macros cannot be used with spooled data sets.

Subsystem Data Sets: A subsystem data set is represented by a DD statement that has the SUBSYS keyword.

The NOTE and POINT macros with TYPE=REL specified or defaulted can be used for subsystem data sets if the subsystem supports it. Assume it does not work unless the subsystem documentation says it is supported. If the subsystem does not support it, the results are unpredictable.

UNIX Files: The POINT macro can be issued for UNIX files, except for FIFO or character special files or with PATHOPTS=OAPPEND.

Using POINT with PDSEs: The POINT macro establishes a connection to the PDSE member and the connection is maintained until the PDSE is closed. The POINT macro can start the next READ or WRITE operation at the beginning of a member or anywhere within a member. To position to a record within another member, issue a POINT or FIND macro to the beginning of that member, then issue another POINT to position to the record you want. You cannot position from one PDSE member to a record other than the first block in another member because either data from the first member record will be read, or an I/O error will occur.

If you issued a CLOSE TYPE=T and are not open for INPUT, UPDAT, or RDBACK and are positioned to other than the end of the data set but do not want to truncate it, you must reposition to the end of the data set before closing it.

When a PDSE is open for output, if you use the POINT macro to position to a member other than the member currently processing, it results in an I/O error on the next write.

POINT positions to the first segment of a spanned record even if the NOTE was done on another segment. If the current record spans blocks, set the z byte of the TTR field to one to access the next record (not segment).

If you set BLOCKTOKENSIZE=LARGE (DCBELARGE=1) and MACRF and DSORG in the DCB indicate BSAM and the NOTE and POINT macros then the OPEN macro will allow the opening of large format data sets. BLOCKTOKENSIZE=LARGE signifies that you aware of the changes in the DSCB, DEB, and TTR conversion routines and that the NOTE and POINT macros must use the TTTR interface in place of the TTR0 interface regardless of what kind of DASD the data set resides on.

When you code BLOCKTOKENSIZE=LARGE on the DCBE with BSAM or BPAM then:

The standard form of the POINT macro is:

dcb address—RX-Type Address, (2-12), or (1)
specifies the address of the data control block for the opened data set to be positioned.
block address—RX-Type Address, (2-12), or (0)
indicates which block in the data set is processed next.

If TYPE=ABS is Specified: For a magnetic tape drive, when TYPE=ABS is specified, the block address specifies the address of a fullword on a fullword boundary that contains the physical block identifier of the block in the data set that is to be processed next. If you code (0), it means register zero contains the block identifier and not the address. Do not code a reference to register 0 with a symbol; it will give unpredictable results. This physical block identifier is provided as output from a prior execution of the NOTE macro.

If TYPE=REL is Specified: When TYPE=REL is specified or defaults, the block address specifies the address of a fullword on a fullword boundary that contains the relative address of the block in the data set that is to be processed next.

The first block of a magnetic tape data set is always specified by the hexadecimal value 0000 0001. You can specify the first block of a direct access storage device data set with hexadecimal 0000 0001 (except for PDSEs or a UNIX member with BPAM). If you do not code BLOCKTOKENSIZE=LARGE on your DCBE macro, then you can specify the first block of a direct access storage device data set with 0000 0100 (except for a PDSE or a UNIX member with BPAM).

Specify the relative address as follows.

Magnetic Tape: The block number is in binary and right-adjusted in the fullword with the high-order bits set to 0; add 1 if reading tape backward.

Do not use the POINT macro for tapes without standard labels when either one of these situations exist:
  • The data set is opened for RDBACK, EXTEND or OUTINX
  • The data set is opened for OUTPUT or OUTIN and the DD statement for the data set specifies DISP=MOD

If OPTCD=H is indicated in the data control block, you can use the POINT macro to perform record positioning on Virtual Storage Extended (VSE) tapes (formerly called DOS tapes) that contain embedded checkpoint records. Any embedded checkpoint records found during the record positioning are bypassed and not counted as blocks spaced over. OPTCD=H must be specified in a job control language DD statement. Do not use the POINT macro to backspace VSE 7-track tapes written in data convert mode and that contain embedded checkpoint records.

Recommendation: When an end-of-data condition is reached on magnetic tape, you must first reposition the tape for processing your data set. Then, you can issue the POINT macro; otherwise, the POINT operation will fail. (Issuing CLOSE TYPE=T is an easy method to use to accomplish repositioning in your EODAD routine.)

Direct Access Storage Devices: The second parameter that your program supplies to the POINT macro is called a block token or block address. You can always supply to POINT a token that your program received from NOTE for the same DCB. The token's format depends on the type of data set and on whether you coded BLOCKTOKENSIZE=LARGE on the DCBE macro that the DCB points to. If your program turns on the DCBELARGE bit in the DCBE, it has the same effect as coding BLOCKTOKENSIZE=LARGE.

If you do not code BLOCKTOKENSIZE=LARGE, then the word that your program passes contains the block token in the three high order bytes and the low order byte contains X'00'. If you code BLOCKTOKENSIZE=LARGE, then your program passes a block token of four bytes.

BLOCKTOKENSIZE=LARGE has no effect on the FIND and BLDL macros or on the content of DCBRELAD and DCBERELA, which identify the location of the beginning of the member. They always use a three-byte member token.

If your program runs on a system before z/OS® 1.7, then the system ignores any setting of BLOCKTOKENSIZE=LARGE.

Positioning to the Next Block:

You can position to a block by supplying the token for the previous block. If you do not code BLOCKTOKENSIZE=LARGE, then you set the low order byte of the word to X'01' to position to the next block or you can use the TYPE=RELNEXT option. If you code BLOCKTOKENSIZE=LARGE, then code the TYPE=RELNEXT parameter on the POINT macro to position to the next block.

Using POINT with a basic format data set, large format data set or PDS:
TTRz
The form if you do not code BLOCKTOKENSIZE=LARGE.
TTTR
The form if you code BLOCKTOKENSIZE=LARGE. If the data set is large format, your program must use this form unless less then 65536 tracks are allocated to it on the volume and your program opened the data set with the INPUT option. If the data set is a PDS or a basic format data set, then the high order byte always will contain X'00' because those data sets cannot contain more than X'FFFF' tracks. If you pass to POINT a TTR returned from BLDL, you must right align the three byte field that you pass.
Note: The TT or TTT bytes contain the relative track address of the block, where the first track in the data set is 0. That means X'0000' orX'000000.'
R
Specifies the number of the block on the track, where the first block isX'01'.
Z
Set the z byte toX'00' (position to the specified block) orX'01' (position to the following block).

Using POINT with a PDSE or UNIX file with BPAM: The three or four byte token does not represent the physical location of the data set or member. Without BLOCKTOKENSIZE=LARGE, the maximum number of records in a member is 15,728,639. With BLOCKTOKENSIZE=LARGE, the maximum number of records in a member is 4,277,145,599. You cannot use POINT with a UNIX FIFO or character special file.

Unless preceded by another POINT, a POINT to an invalid value in a UNIX file gives an I/O error for the next READ or WRITE.

In a binary UNIX file with RECFM=V(B) or RECFM=U, a POINT to other than the first block results in an abend.

Using POINT with a UNIX file with BSAM: You can use the POINT macro for UNIX files, except for FIFO or character special files or with PATHOPTS=OAPPEND. The block token is the relative record number (RRN) from the beginning of the file. If you do not code BLOCKTOKENSIZE=LARGE, then (1) POINT does not support a UNIX file that contains more than 16 mega-records minus two (X'000000'-2 or 16,777,214) and (2) a POINT macro to after 16 mega-records minus two returns an invalid value (X'FFFFFF'). If you code BLOCKTOKENSIZE=LARGE, then you do not have this limit.

A POINT to a location past the end of the file or after a block that follows the most recent WRITE gives an I/O error for the next READ or WRITE.

Unless preceded by another POINT, a POINT to an invalid value gives an I/O error for the next READ or WRITE.

Using POINT with an extended format data set or compressed format data set: The three or four byte value is a block locator token that does not represent the physical location of the data set or member. It specifies the relative block number of a block within the data set. If you do not code BLOCKTOKENSIZE=LARGE, then your program can address up to 16,777,215 blocks. If you code BLOCKTOKENSIZE=LARGE, then your program can address up to 4,294,967,295 blocks.

If you issue a POINT to a location past the end of the data set or after the block that follows the most recent WRITE, the next READ or WRITE will result in an I/O error. A POINT issued immediately following an open for output (while positioned to the beginning of the data set) will cause the next WRITE to result in an I/O error. Also, whenever an I/O error is encountered, any further POINTs will cause the subsequent READ or WRITES to result in an I/O error.

When processing compressed format data sets, the token processed by NOTE and POINT refers to the user relative block number (user RBN) within the data set as opposed to the physical RBN within the data set.

The first block of a magnetic tape data set is always specified by the hexadecimal value 0000 0001. The first block of a direct access storage device data set can be specified by either hexadecimal 0000 0001 (except for PDSEs) or 0000 0100 (see the preceding description of TTRz).

Using POINT with Extended Format Data Sets: Input to POINT should be a BLTZ derived from NOTE. (A BLT is a block locator token which defines the relative block number (RBN) of a block within an extended format data set.) The 'BLT0' value from NOTE may be modified by setting the low order byte (the Z byte) to 1 in order to obtain the block following the block defined by the BLT0.

If you issue a POINT to a location past the end of the data set or after the block that follows the most recent WRITE, the next READ or WRITE will result in an I/O error. A POINT issued immediately following an open for output (while positioned to the beginning of the data set) will cause the next WRITE to result in an I/O error. Also, whenever an I/O error is encountered, any further POINTs will cause the subsequent READ or WRITES to result in an I/O error.

When processing compressed format data sets, the token processed by NOTE and POINT will refer to the user relative block number (user RBN) within the data set as opposed to the physical RBN within the data set.

Using POINT with UNIX files: POINT is supported for UNIX files, except for FIFO or character special files, or when PATHOPTS=OAPPEND.

The TTRz passed to POINT should be a token derived from NOTE. You can modify the token by setting the low order byte (the z byte) to 1 to get the block following the block defined by the token. The token is the relative record number (RRN) from the beginning of the file.

A POINT to a location past the end of the file or after a block that follows the most recent WRITE gives an I/O error for the next READ or WRITE.

Unless preceded by another POINT, a POINT to an invalid value gives an I/O error for the next READ or WRITE.

In a binary file with RECFM=V(B) or RECFM=U,a POINT to other than the first block results in an abend.

TYPE={ABS|REL|RELNEXT}
indicates whether the block address is a physical block identifier or a relative address.
ABS
indicates that the block address specifies an address of a fullword on a fullword boundary containing a physical block identifier of the block in the data set that is to be processed next. This option is only for a cartridge tape.
REL
indicates that the block address specifies an address of a fullword on a fullword boundary containing the relative address of the block in the data set that is to be processed next. This option is for DASD (including UNIX) or tape.
Note: This option should not be used for large format data sets, indicated by coding BLOCKTOKENSIZE=LARGE on the DCBE. You should use RELNEXT instead.
RELNEXT
indicates that the block address specifies the address of a word containing the block token of the block that precedes the block that is to be processed next. If your DCBE does not have BLOCKTOKENSIZE=LARGE, then RELNEXT has the same effect as setting the low order byte of the block token to X'01'.

If the volume cannot be positioned correctly or if the block identification is not of the correct format, the error analysis (SYNAD) routine is given control when the next CHECK macro is executed.