Advertisement
Guest User

Untitled

a guest
Jun 27th, 2017
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.37 KB | None | 0 0
  1. #!/usr/bin/env ruby
  2.  
  3. NONE = 0 # N/A
  4. MODE1 = 1 # CD-ROM Mode 1
  5. MODE2 = 2 # CD-ROM Mode 2 (not XA)
  6. MODE2_FORM1 = 3 # CD-ROM XA Form 1
  7. MODE2_FORM2 = 4 # CD-ROM XA Form 2
  8. OTHER = 5 # Other (e.g. CD-DA)
  9.  
  10. # CD-ROM sync header
  11. CDROM_SYNC = [0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00]
  12.  
  13. def get_mode_string(mode)
  14. case mode
  15. when NONE
  16. 'None (maybe bug?)'
  17. when MODE1
  18. 'CD-ROM Mode 1'
  19. when MODE2
  20. 'CD-ROM Mode 2 (not CD-ROM XA)'
  21. when MODE2_FORM1
  22. 'CD-ROM XA Form 1'
  23. when MODE2_FORM2
  24. 'CD-ROM XA Form 2'
  25. when OTHER
  26. 'Other (e.g. CD-DA)'
  27. else
  28. '(maybe bug?)'
  29. end
  30. end
  31.  
  32. name = ARGV[0]
  33. size = File.size(name)
  34.  
  35. if size % 2352 != 0 then
  36. puts 'Error: Not a CD raw image file!'
  37. exit 1
  38. end
  39.  
  40. f = File.open(name, 'rb')
  41.  
  42. mode = NONE
  43. prev_mode = NONE
  44. sectors = size / 2352
  45.  
  46. sectors.times do |i|
  47. f.pos = i * 2352
  48.  
  49. header = f.read(24).bytes
  50.  
  51. if header.first(12) == CDROM_SYNC then
  52. case header[15]
  53. when 0x01
  54. mode = MODE1
  55. when 0x02
  56. if header[16..19] == header[20..23] then
  57. if header[18] & 0x04 != 0 then
  58. mode = MODE2_FORM2
  59. else
  60. mode = MODE2_FORM1
  61. end
  62. else
  63. mode = MODE2
  64. end
  65. else
  66. mode = OTHER
  67. end
  68. else
  69. mode = OTHER
  70. end
  71.  
  72. if prev_mode != mode then
  73. puts 'Sector 0x%X : %s' % [i, get_mode_string(mode)]
  74. end
  75.  
  76. prev_mode = mode
  77. end
  78.  
  79. f.close
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement