{   This procedure is called to read the next block from a tape.
{
{   The caller may, if desired, volunteer a buffer to be used to read the
{ block.  Block Management may or may not choose to use the volunteered
{ buffer.  The caller may determine whether or not the volunteered buffer was
{ used by comparing the returned block pointer with a pointer to the
{ volunteered area.
{
{   The intention of this mechanism is to allow User-blocked, Undefined record
{ type tape to be read directly into the user's buffer when blocks are large,
{ and to avoid locking down unnecessarily large amounts of memory when the
{ application knows how large a block to expect.  Accordingly, block
{ management will attempt to use the volunteered buffer whenever it does not
{ already have the block buffered and the volunteered buffer is properly word
{ aligned.  This will occur even if the volunteered buffer is smaller than the
{ actual block on tape.
{
{   If the actual block read is longer than the buffer area volunteered as
{ much as possible of the block will be placed in the volunteered area and
{ status of BAE$BLOCK_TRUNCATED will be returned.  If the caller desires to
{ receive the complete block BAP$TAPE_BM_SKIP should be called to reposition
{ the tape one block backwards and another call made to
{ BAP$TAPE_BM_READ_NEXT_BLOCK specifying either a larger volunteered buffer or
{ no volunteered buffer.
{
{   Tape read errors are indicated by both an abnormal status and a value in
{ the tape_failure_isolation.  The status condition will be
{ BAE$UNRECOVERABLE_READ_ERROR.  The data read, if any, is returned to the
{ caller even if a read error occurs.  The tape is left positioned after the
{ bad block.  If the caller was reading without system media error recovery
{ and wishes to have system error recovery attempted BAP$TAPE_BM_SKIP should
{ be called to reposition before the block and another call made to
{ BAP$TAPE_BM_READ_NEXT_BLOCK which specifies media_recovery as TRUE.
{
{   BAP$TAPE_BM_READ_NEXT_BLOCK(FILE_IDENTIFIER, VOLUNTEERED_BUFFER,
{ VOLUNTEERED_LENGTH, MEDIA_RECOVERY, BLOCK_PTR, BLOCK_TYPE, BLOCK_LENGTH,
{ FAILURE_MODES, STATUS)
{
{       FILE_IDENTIFIER (Input):  The file identifier for the file.
{
{  VOLUNTEERED_BUFFER:  (Input) A pointer to the volunteered buffer area, or
{        NIL if no buffer is volunteered.
{
{  VOLUNTEERED_LENGTH:  (Input) The length of the volunteered buffer.
{        (Ignored if no buffer is volunteered.)
{
{  MEDIA_RECOVERY:  (Input) TRUE to have the system attempt recovery from
{        media errors encountered while reading this block from tape.  FALSE
{        to suppress any attempt by the system to recover from media errors.
{
{  BLOCK_PTR:  (Output) A pointer to the block which was read.
{
{  BLOCK_TYPE:  (Output) The type of block read.  (Good data block, error data
{        block, or tapemark.)
{
{  BLOCK_LENGTH:  The length of the block read.
{
{  FAILURE_MODES:  (Output) Detailed information on any tape I/O error.
{
{  STATUS: (output) Request status.
