Skip to content

Instantly share code, notes, and snippets.

@nvsofts
Created June 27, 2017 16:15
Show Gist options
  • Select an option

  • Save nvsofts/5a774ee3c535f866f064bf0dddfb66b9 to your computer and use it in GitHub Desktop.

Select an option

Save nvsofts/5a774ee3c535f866f064bf0dddfb66b9 to your computer and use it in GitHub Desktop.
CD format visualizer
#!/usr/bin/env ruby
NONE = 0 # N/A
MODE1 = 1 # CD-ROM Mode 1
MODE2 = 2 # CD-ROM Mode 2 (not XA)
MODE2_FORM1 = 3 # CD-ROM XA Form 1
MODE2_FORM2 = 4 # CD-ROM XA Form 2
OTHER = 5 # Other (e.g. CD-DA)
# CD-ROM sync header
CDROM_SYNC = [0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00]
def get_mode_string(mode)
case mode
when NONE
'None (maybe bug?)'
when MODE1
'CD-ROM Mode 1'
when MODE2
'CD-ROM Mode 2 (not CD-ROM XA)'
when MODE2_FORM1
'CD-ROM XA Form 1'
when MODE2_FORM2
'CD-ROM XA Form 2'
when OTHER
'Other (e.g. CD-DA)'
else
'(maybe bug?)'
end
end
name = ARGV[0]
size = File.size(name)
if size % 2352 != 0 then
puts 'Error: Not a CD raw image file!'
exit 1
end
f = File.open(name, 'rb')
mode = NONE
prev_mode = NONE
sectors = size / 2352
sectors.times do |i|
f.pos = i * 2352
header = f.read(24).bytes
if header.first(12) == CDROM_SYNC then
case header[15]
when 0x01
mode = MODE1
when 0x02
if header[16..19] == header[20..23] then
if header[18] & 0x04 != 0 then
mode = MODE2_FORM2
else
mode = MODE2_FORM1
end
else
mode = MODE2
end
else
mode = OTHER
end
else
mode = OTHER
end
if prev_mode != mode then
puts 'Sector 0x%X : %s' % [i, get_mode_string(mode)]
end
prev_mode = mode
end
f.close
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment