?? LEFT := 1, RIGHT := 110 ??
*copy osd$default_pragmats
MODULE bam$tape_block_manager_ring2;
























  {  This module provides access  to the ring 2, system_file_id  oriented interfaces for the }
  {  ring 3 tape_block_manager.   Interfaces are provided to physical I/O and device management. }

?? PUSH (LISTEXT := ON) ??
*copyc iop$tape_request_status
*copyc iop$backspace_tape
*copyc iop$erase_tape
*copyc iop$forspace_tape
*copyc iop$fetch_tape_capabilities
*copyc iop$read_tape
*copyc iop$rewind_tape
*copyc iop$write_tape
*copyc iop$write_tapemark
*copyc dmp$advance_tape_volume
*copyc dmp$reset_tape_volume
*copyc oss$job_pageable
{*copyc bat$tape_block_mgmt_descriptor
?? POP ??
?? EJECT ??
?? TITLE := '  PROCEDURE [XDCL, #GATE] bap$await_tape_io_completion' ??

  PROCEDURE [XDCL, #GATE] bap$await_tape_io_completion (sfid: gft$system_file_identifier;
        io_id: iot$io_id;
    VAR tape_status: iot$tape_io_status;
    VAR status: ost$status);

    status.normal := TRUE;

    iop$tape_request_status (sfid, io_id, {wait=} TRUE, tape_status, status);

  PROCEND bap$await_tape_io_completion;

?? EJECT ??
?? TITLE := '  PROCEDURE [XDCL, #GATE] bap$backspace_tape' ??

  PROCEDURE [XDCL, #GATE] bap$backspace_tape (
        sfid: gft$system_file_identifier;
        count: iot$tape_block_count;
        use_locate_block: boolean;
    VAR tape_status: iot$tape_io_status;
    VAR status: ost$status);

    status.normal := TRUE;

    iop$backspace_tape (sfid, count, use_locate_block, tape_status, status);

  PROCEND bap$backspace_tape;

?? EJECT ??
?? TITLE := '  PROCEDURE [XDCL, #GATE] bap$forspace_tape' ??

  PROCEDURE [XDCL, #GATE] bap$forspace_tape (sfid: gft$system_file_identifier;
        count: iot$tape_block_count;
    VAR tape_status: iot$tape_io_status;
    VAR status: ost$status);

    VAR
      io_id: iot$io_id;

    status.normal := TRUE;

    iop$forspace_tape (sfid, count, io_id, status);
    IF NOT status.normal THEN
      RETURN;
    IFEND;

    bap$await_tape_io_completion (sfid, io_id, tape_status, status);

  PROCEND bap$forspace_tape;
?? EJECT ??
?? TITLE := '  PROCEDURE [XDCL, #GATE] bap$rewind_tape' ??

  PROCEDURE [XDCL, #GATE] bap$rewind_tape (sfid: gft$system_file_identifier;
    VAR tape_status: iot$tape_io_status;
    VAR status: ost$status);

    VAR
      io_id: iot$io_id;

    status.normal := TRUE;

    iop$rewind_tape (sfid, io_id, status);
    IF NOT status.normal THEN
      RETURN;
    IFEND;

    bap$await_tape_io_completion (sfid, io_id, tape_status, status);

  PROCEND bap$rewind_tape;

?? EJECT ??
?? TITLE := '  PROCEDURE [XDCL, #GATE] bap$write_tapemark' ??

  PROCEDURE [XDCL, #GATE] bap$write_tapemark (sfid: gft$system_file_identifier;
    VAR tape_status: iot$tape_io_status;
    VAR status: ost$status);

    VAR
      io_id: iot$io_id;

    status.normal := TRUE;

    iop$write_tapemark (sfid, io_id, status);
    IF NOT status.normal THEN
      RETURN;
    IFEND;

    bap$await_tape_io_completion (sfid, io_id, tape_status, status);

  PROCEND bap$write_tapemark;

?? EJECT ??
?? TITLE := '  PROCEDURE [XDCL, #GATE] bap$erase_tape' ??

  PROCEDURE [XDCL, #GATE] bap$erase_tape (sfid: gft$system_file_identifier;
        block_length: amt$max_block_length;
        number_of_erases: integer;
    VAR io_status: iot$tape_io_status;
    VAR status: ost$status);

    status.normal := TRUE;

    iop$erase_tape (sfid, block_length, number_of_erases, io_status, status);

  PROCEND bap$erase_tape;

?? EJECT ??
?? TITLE := '  PROCEDURE [XDCL, #GATE] bap$fetch_tape_capabilities' ??

  PROCEDURE [XDCL, #GATE] bap$fetch_tape_capabilities (sfid: gft$system_file_identifier;
    VAR maximum_block_length: amt$max_block_length;
    VAR max_blocks_per_physical_call: iot$tape_block_count;
    VAR status: ost$status);

    status.normal := TRUE;

    iop$fetch_tape_capabilities (sfid, maximum_block_length, max_blocks_per_physical_call, status);

  PROCEND bap$fetch_tape_capabilities;

?? EJECT ??
?? TITLE := '  PROCEDURE [XDCL, #GATE] bap$read_tape' ??

  PROCEDURE [XDCL, #GATE] bap$read_tape (sfid: gft$system_file_identifier;
        max_block_size: iot$tape_block_length;
        block_description: ^iot$read_tape_description;
        block_count: iot$tape_block_count;
        perform_media_error_recovery: boolean;
    VAR io_id: iot$io_id;
    VAR status: ost$status);

    VAR
      inhibit_media_error_recovery: boolean;

    status.normal := TRUE;

    inhibit_media_error_recovery := NOT perform_media_error_recovery;
    iop$read_tape (sfid, inhibit_media_error_recovery, max_block_size, block_description, block_count, io_id,
          status);

  PROCEND bap$read_tape;

?? EJECT ??
?? TITLE := '  PROCEDURE [XDCL, #GATE] bap$write_tape' ??

  PROCEDURE [XDCL, #GATE] bap$write_tape (sfid: gft$system_file_identifier;
        block_description: ^iot$write_tape_description;
        block_count: iot$tape_block_count;
        perform_media_error_recovery: boolean;
    VAR io_id: iot$io_id;
    VAR status: ost$status);

    VAR
      inhibit_media_error_recovery: boolean;

    status.normal := TRUE;

    inhibit_media_error_recovery := NOT perform_media_error_recovery;
    iop$write_tape (sfid, inhibit_media_error_recovery, block_description, block_count, io_id, status);

  PROCEND bap$write_tape;

MODEND bam$tape_block_manager_ring2;
