PROCEDURE (ram$dupuv) duplicate_unlabeled_volume, dupuv (
  input_volume, iv: any of
      string 1..6
      name 1..6
    anyend = $required
  output_volume, ov: any of
      string 1..6
      name 1..6
    anyend = $required
  input_density, id: (BY_NAME) key
      mt9$800, mt9$1600, mt9$6250, mt18$38000
    keyend = osd$reqmt_default_density, mt9$1600
  output_density, od: (BY_NAME) key
      mt9$800, mt9$1600, mt9$6250, mt18$38000
    keyend = $optional
  status)

  VAR
    consecutive_tapemarks_read: integer 0..3
    ignore_status: status
    input: file = $unique($local)
    local_status: status
    output: file = $unique($local)
    parameter_names: list of key mt9$800, mt9$1600, mt9$6250, mt18$38000 keyend=
    (mt9$800, mt9$1600, mt9$6250, mt18$38000)
    parameter_values: list of integer 0..2147483647 = (0 0 0 0)
  VAREND

  WHEN any_fault exit terminate DO
    delete_file input status= ignore_status
    delete_file output status= ignore_status
    release_resource mt9$800=all mt9$1600=all mt9$6250=all mt18$38000=all ..
          status=ignore_status
    EXIT duplicate_unlabeled_volume WITH osv$status
  WHENEND

  request_magnetic_tape input density=input_density ..
        external_vsn=input_volume ring=no
  set_file_attributes input block_type=user_specified ..
        file_label_type=unlabeled record_type=undefined

  IF $specified(output_density) THEN
    request_magnetic_tape output density=output_density ..
          external_vsn=output_volume ring=yes
    local_output_density = output_density
  ELSE
    request_magnetic_tape output density=input_density ..
          external_vsn=output_volume ring=yes
    local_output_density = input_density
  IFEND

  set_file_attributes output block_type=user_specified ..
        file_label_type=unlabeled record_type=undefined

  FOR i = 1 TO $size(parameter_names) DO
    IF input_density = parameter_names(i) THEN
      parameter_values(i) = parameter_values(i) + 1
    IFEND
    IF local_output_density = parameter_names(i) THEN
      parameter_values(i) = parameter_values(i) + 1
    IFEND
  FOREND

  reserve_resource mt9$800=parameter_values(1) mt9$1600=parameter_values(2) ..
        mt9$6250=parameter_values(3) mt18$38000=parameter_values(4)

  consecutive_tapemarks_read = 0
  i = 0

  REPEAT
    IF i = 0 THEN
      copy_file input.$asis output.$boi status=local_status
    ELSE
      copy_file input.$asis output.$asis status=local_status
    IFEND
    IF local_status.normal THEN
      i = i+1
      consecutive_tapemarks_read = 1
      write_tape_mark output.$asis
    ELSEIF local_status.condition = ame$input_after_eoi THEN
      consecutive_tapemarks_read = consecutive_tapemarks_read + 1
      IF consecutive_tapemarks_read < 3 THEN
        write_tape_mark output.$asis status=local_status
      IFEND
    IFEND
  UNTIL NOT local_status.normal

  IF i > 1 THEN
    EXIT_PROC
  ELSE
    EXIT_PROC WITH local_status
  IFEND

PROCEND duplicate_unlabeled_volume
