Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/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
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement