PROCEDURE dum$convert_dau_to_cts, convert_dau_to_cts, condau (
  dau, d: integer 0..134880 = 7393(16)
  device_type, dt: integer 834..9853 = 895
  output, o: file = $output
  status)

" This procedure converts a dau address into a cylinder/track/sector.

  IF $value(device_type) = 834 THEN
    daus_per_cylinder = 10
    "  daus_per_track =         1
    sectors_per_track = 32
    tracks_per_cylinder = 10
    cylinders_per_device = 817
    sectors_per_dau = 32

  ELSEIF $value(device_type) = 836 THEN
    daus_per_cylinder = 35
    "  daus_per_track =         1.46
    sectors_per_track = 47
    tracks_per_cylinder = 24
    cylinders_per_device = 701
    sectors_per_dau = 32

  ELSEIF $value(device_type) = 844 THEN
    daus_per_cylinder = 44
    "  daus_per_track =         2.4
    sectors_per_track = 24
    tracks_per_cylinder = 19
    cylinders_per_device = 823
    sectors_per_dau = 10

  ELSEIF $value(device_type) = 885 THEN
    daus_per_cylinder = 160
    "  daus_per_track =         4
    sectors_per_track = 32
    tracks_per_cylinder = 40
    cylinders_per_device = 843
    sectors_per_dau = 8

  ELSEIF $value(device_type) = 887 THEN
    daus_per_cylinder = 38
    "  daus_per_track =         9.5
    sectors_per_track = 38
    tracks_per_cylinder = 4
    cylinders_per_device = 884
    sectors_per_dau = 4

  ELSEIF $value(device_type) = 895 THEN
    daus_per_cylinder = 37
    "  daus_per_track =         2.5
    sectors_per_track = 10
    tracks_per_cylinder = 15
    cylinders_per_device = 886
    sectors_per_dau = 4

  ELSEIF $value(device_type) = 9836 THEN
    daus_per_cylinder = 36
    "  daus_per_track =         1.5
    sectors_per_track = 12
    tracks_per_cylinder = 24
    cylinders_per_device = 703
    sectors_per_dau = 8

  ELSEIF $value(device_type) = 9853 THEN
    daus_per_cylinder = 49
    "  daus_per_track =         2.63
    sectors_per_track = 21
    tracks_per_cylinder = 19
    cylinders_per_device = 1412
    sectors_per_dau = 8

  ELSE
    EXIT_PROC WITH $status(false, 'xx', 0, ' unsupported device type: '//$strrep($value(device_type)))
  IFEND

  dau = $value(dau)
  cylinder = dau/daus_per_cylinder

  IF cylinder > cylinders_per_device + 1 THEN
    EXIT_PROC WITH $status(false, 'xx', 0, ' dau address too large for device type')
  IFEND

  start_line = ' dau address '//$strrep(dau)//' on an '//$strrep($value(device_type))//' maps to'

  dau_remainder = $mod(dau daus_per_cylinder)
  sectors_left = dau_remainder * sectors_per_dau
  track = sectors_left / sectors_per_track
  sectors_left = $mod(sectors_left sectors_per_track)

  putl (start_line//' C'//$strrep(cylinder)//' T'//$strrep(track)//' S'//$strrep(sectors_left)) ..
        o=$fname($strrep($value(output))//'.$eoi')

"  now calculate it another way to see that we get the same numbers

  sectors_per_cylinder = daus_per_cylinder * sectors_per_dau
  sector = dau * sectors_per_dau
  cylinder2 = sector / sectors_per_cylinder
  remaining_sectors = $mod(sector sectors_per_cylinder)
  track2 = remaining_sectors / sectors_per_track
  remaining_sectors = $mod(remaining_sectors sectors_per_track)
" display the second opinion if it does not agree with the 1st calculation
  IF (cylinder2 <> cylinder) OR (track2 <> track) OR (remaining_sectors <> sectors_left) THEN
    putl ('    or maybe ') o=$fname($strrep($value(output))//'.$eoi')
    putl (' cylinder = '//..
$strrep(cylinder2)//' track = '//$strrep(track2)//' sector = '//$strrep(remaining_sectors)) ..
          o=$fname($strrep($value(output))//'.$eoi')
  IFEND

PROCEND dum$convert_dau_to_cts
