ripxplore 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (712) hide show
  1. data/bin/ripxplore.rb +5 -25
  2. data/doc/classes/A2Dsk.html +9 -0
  3. data/doc/classes/A2DskDosOrder.html +9 -0
  4. data/doc/classes/A2DskPhysicalOrder.html +9 -0
  5. data/doc/classes/Apple2.html +171 -21
  6. data/doc/classes/Apple2.src/M000187.html +18 -0
  7. data/doc/classes/Apple2.src/M000188.html +18 -0
  8. data/doc/classes/Apple2.src/M000189.html +18 -0
  9. data/doc/classes/Apple2.src/M000190.html +19 -0
  10. data/doc/classes/Apple2.src/M000191.html +19 -0
  11. data/doc/classes/Apple2.src/M000192.html +18 -0
  12. data/doc/classes/Apple2.src/M000193.html +18 -0
  13. data/doc/classes/Apple2.src/M000194.html +18 -0
  14. data/doc/classes/Apple2.src/M000195.html +18 -0
  15. data/doc/classes/Apple2.src/M000196.html +18 -0
  16. data/doc/classes/Apple2.src/M000197.html +18 -0
  17. data/doc/classes/Apple2.src/M000198.html +18 -0
  18. data/doc/classes/Apple2.src/M000199.html +18 -0
  19. data/doc/classes/Apple2.src/M000200.html +18 -0
  20. data/doc/classes/AppleBinary.html +21 -21
  21. data/doc/classes/AppleBinary.src/M000153.html +20 -0
  22. data/doc/classes/AppleBinary.src/M000154.html +18 -0
  23. data/doc/classes/AppleBinary.src/M000155.html +18 -0
  24. data/doc/classes/AppleBinary.src/M000156.html +18 -0
  25. data/doc/classes/AppleCPM.html +7 -0
  26. data/doc/classes/AppleDos.html +7 -0
  27. data/doc/classes/AppleDosPic.html +186 -0
  28. data/doc/classes/AppleDosPic.src/M000291.html +20 -0
  29. data/doc/classes/AppleDosPic.src/M000292.html +18 -0
  30. data/doc/classes/AppleDosPic.src/M000293.html +18 -0
  31. data/doc/classes/AppleDosPic.src/M000294.html +18 -0
  32. data/doc/classes/AppleDosPrintShopMiniPix.html +120 -0
  33. data/doc/classes/AppleHiResPic.html +43 -43
  34. data/doc/classes/AppleHiResPic.src/M000147.html +18 -0
  35. data/doc/classes/AppleHiResPic.src/M000148.html +18 -0
  36. data/doc/classes/AppleHiResPic.src/M000149.html +53 -0
  37. data/doc/classes/AppleHiResPic.src/M000150.html +18 -0
  38. data/doc/classes/AppleHiResPic.src/M000151.html +18 -0
  39. data/doc/classes/AppleHiResPic.src/M000152.html +18 -0
  40. data/doc/classes/ApplePrintShopMiniPix.html +204 -0
  41. data/doc/classes/ApplePrintShopMiniPix.src/M000313.html +38 -0
  42. data/doc/classes/ApplePrintShopMiniPix.src/M000314.html +18 -0
  43. data/doc/classes/ApplePrintShopMiniPix.src/M000315.html +18 -0
  44. data/doc/classes/ApplePrintShopMiniPix.src/M000316.html +18 -0
  45. data/doc/classes/AppleText.html +32 -10
  46. data/doc/classes/AppleText.src/M000215.html +21 -0
  47. data/doc/classes/AppleText.src/M000216.html +20 -0
  48. data/doc/classes/AppleText.src/M000217.html +23 -0
  49. data/doc/classes/AppleWorksWP.html +7 -0
  50. data/doc/classes/Applesoft.html +7 -0
  51. data/doc/classes/Atari800.html +165 -15
  52. data/doc/classes/Atari800.src/M000250.html +18 -0
  53. data/doc/classes/Atari800.src/M000251.html +23 -0
  54. data/doc/classes/Atari800.src/M000252.html +18 -0
  55. data/doc/classes/Atari800.src/M000253.html +19 -0
  56. data/doc/classes/Atari800.src/M000254.html +18 -0
  57. data/doc/classes/Atari800.src/M000255.html +18 -0
  58. data/doc/classes/Atari800.src/M000256.html +18 -0
  59. data/doc/classes/Atari800.src/M000257.html +18 -0
  60. data/doc/classes/Atari800.src/M000258.html +18 -0
  61. data/doc/classes/Atari800.src/M000259.html +18 -0
  62. data/doc/classes/Atari800.src/M000260.html +18 -0
  63. data/doc/classes/Atari800.src/M000261.html +18 -0
  64. data/doc/classes/Atari800.src/M000262.html +18 -0
  65. data/doc/classes/AtariBasic.html +7 -0
  66. data/doc/classes/AtariBinary.html +9 -2
  67. data/doc/classes/AtariBinary.src/M000241.html +2 -2
  68. data/doc/classes/AtariDos.html +7 -0
  69. data/doc/classes/AtariText.html +17 -10
  70. data/doc/classes/AtariText.src/M000011.html +20 -0
  71. data/doc/classes/AtariText.src/M000012.html +18 -0
  72. data/doc/classes/Atr.html +7 -0
  73. data/doc/classes/C64.html +175 -25
  74. data/doc/classes/C64.src/M000043.html +18 -0
  75. data/doc/classes/C64.src/M000044.html +18 -0
  76. data/doc/classes/C64.src/M000045.html +31 -0
  77. data/doc/classes/C64.src/M000046.html +22 -0
  78. data/doc/classes/C64.src/M000047.html +19 -0
  79. data/doc/classes/C64.src/M000048.html +19 -0
  80. data/doc/classes/C64.src/M000049.html +18 -0
  81. data/doc/classes/C64.src/M000050.html +18 -0
  82. data/doc/classes/C64.src/M000051.html +18 -0
  83. data/doc/classes/C64.src/M000052.html +18 -0
  84. data/doc/classes/C64.src/M000053.html +18 -0
  85. data/doc/classes/C64.src/M000054.html +18 -0
  86. data/doc/classes/C64.src/M000055.html +18 -0
  87. data/doc/classes/C64.src/M000056.html +18 -0
  88. data/doc/classes/C64.src/M000057.html +18 -0
  89. data/doc/classes/C64BasicPrg.html +7 -0
  90. data/doc/classes/C64Prg.html +7 -0
  91. data/doc/classes/C64PrgText.html +7 -0
  92. data/doc/classes/C64Seq.html +7 -0
  93. data/doc/classes/CPMFile.html +7 -0
  94. data/doc/classes/CacheAndCollections.html +167 -0
  95. data/doc/classes/CacheAndCollections.src/M000005.html +21 -0
  96. data/doc/classes/CacheAndCollections.src/M000006.html +26 -0
  97. data/doc/classes/CacheAndCollections.src/M000007.html +22 -0
  98. data/doc/classes/CbmDos.html +7 -0
  99. data/doc/classes/CbmFile.html +7 -0
  100. data/doc/classes/Coco.html +337 -0
  101. data/doc/classes/Coco.src/M000095.html +18 -0
  102. data/doc/classes/Coco.src/M000096.html +18 -0
  103. data/doc/classes/Coco.src/M000097.html +18 -0
  104. data/doc/classes/Coco.src/M000098.html +18 -0
  105. data/doc/classes/Coco.src/M000099.html +18 -0
  106. data/doc/classes/Coco.src/M000100.html +18 -0
  107. data/doc/classes/Coco.src/M000101.html +18 -0
  108. data/doc/classes/Coco.src/M000102.html +18 -0
  109. data/doc/classes/Coco.src/M000103.html +18 -0
  110. data/doc/classes/Coco.src/M000104.html +18 -0
  111. data/doc/classes/Coco.src/M000105.html +18 -0
  112. data/doc/classes/Coco.src/M000106.html +18 -0
  113. data/doc/classes/Coco.src/M000107.html +55 -0
  114. data/doc/classes/CocoBasic.html +178 -0
  115. data/doc/classes/CocoBasic.src/M000126.html +20 -0
  116. data/doc/classes/CocoBasic.src/M000127.html +72 -0
  117. data/doc/classes/CocoMachineLanguage.html +171 -0
  118. data/doc/classes/CocoMachineLanguage.src/M000008.html +20 -0
  119. data/doc/classes/CocoMachineLanguage.src/M000009.html +18 -0
  120. data/doc/classes/CocoMachineLanguage.src/M000010.html +19 -0
  121. data/doc/classes/CocoScreen.html +191 -0
  122. data/doc/classes/CocoScreen.src/M000122.html +18 -0
  123. data/doc/classes/CocoScreen.src/M000123.html +18 -0
  124. data/doc/classes/CocoScreen.src/M000124.html +18 -0
  125. data/doc/classes/CocoScreen.src/M000125.html +18 -0
  126. data/doc/classes/CocoText.html +156 -0
  127. data/doc/classes/CocoText.src/M000145.html +20 -0
  128. data/doc/classes/CocoText.src/M000146.html +18 -0
  129. data/doc/classes/D64.html +7 -0
  130. data/doc/classes/D65.html +6 -0
  131. data/doc/classes/DumpUtilities.html +6 -0
  132. data/doc/classes/FileCache.html +140 -30
  133. data/doc/classes/FileCache.src/M000201.html +18 -0
  134. data/doc/classes/FileCache.src/M000202.html +20 -0
  135. data/doc/classes/FileCache.src/M000203.html +24 -0
  136. data/doc/classes/FileCache.src/M000204.html +22 -0
  137. data/doc/classes/FileCache.src/M000205.html +32 -0
  138. data/doc/classes/FileCache.src/M000206.html +21 -0
  139. data/doc/classes/FileCache.src/M000207.html +22 -0
  140. data/doc/classes/FileCache.src/M000208.html +23 -0
  141. data/doc/classes/FileCache.src/M000209.html +27 -0
  142. data/doc/classes/FileCache.src/M000210.html +24 -0
  143. data/doc/classes/FileCache.src/M000211.html +21 -0
  144. data/doc/classes/FileCacheItem.html +10 -10
  145. data/doc/classes/FileCacheItem.src/M000235.html +18 -0
  146. data/doc/classes/FileCacheItem.src/M000236.html +18 -0
  147. data/doc/classes/FileContainer.html +7 -0
  148. data/doc/classes/FileSystem.html +41 -41
  149. data/doc/classes/FileSystem.src/M000134.html +18 -0
  150. data/doc/classes/FileSystem.src/M000135.html +18 -0
  151. data/doc/classes/FileSystem.src/M000136.html +18 -0
  152. data/doc/classes/FileSystem.src/M000137.html +18 -0
  153. data/doc/classes/FileSystem.src/M000138.html +18 -0
  154. data/doc/classes/FileSystem.src/M000139.html +18 -0
  155. data/doc/classes/FileSystem.src/M000140.html +20 -0
  156. data/doc/classes/FileSystem.src/M000141.html +25 -0
  157. data/doc/classes/FileSystemImage.html +131 -86
  158. data/doc/classes/FileSystemImage.src/M000269.html +20 -0
  159. data/doc/classes/FileSystemImage.src/M000270.html +41 -0
  160. data/doc/classes/FileSystemImage.src/M000271.html +27 -0
  161. data/doc/classes/FileSystemImage.src/M000272.html +18 -0
  162. data/doc/classes/FileSystemImage.src/M000273.html +18 -0
  163. data/doc/classes/FileSystemImage.src/M000274.html +18 -0
  164. data/doc/classes/FileSystemImage.src/M000275.html +22 -0
  165. data/doc/classes/FileSystemImage.src/M000276.html +19 -0
  166. data/doc/classes/FileSystemImage.src/M000277.html +18 -0
  167. data/doc/classes/FileSystemImage.src/M000278.html +18 -0
  168. data/doc/classes/FileSystemImage.src/M000279.html +18 -0
  169. data/doc/classes/FileSystemImage.src/M000280.html +18 -0
  170. data/doc/classes/FileSystemImage.src/M000281.html +20 -0
  171. data/doc/classes/FileSystemImage.src/M000282.html +22 -0
  172. data/doc/classes/FileSystemImage.src/M000283.html +22 -0
  173. data/doc/classes/FileSystemImage.src/M000284.html +18 -0
  174. data/doc/classes/FileSystemImage.src/M000285.html +23 -0
  175. data/doc/classes/FileSystemImage.src/M000286.html +18 -0
  176. data/doc/classes/FileSystemImage.src/M000287.html +18 -0
  177. data/doc/classes/FileSystemImage.src/M000288.html +18 -0
  178. data/doc/classes/G64.html +7 -0
  179. data/doc/classes/GenericFile.html +7 -0
  180. data/doc/classes/GenericGIF.html +193 -0
  181. data/doc/classes/GenericGIF.src/M000308.html +18 -0
  182. data/doc/classes/GenericGIF.src/M000309.html +18 -0
  183. data/doc/classes/GenericGIF.src/M000310.html +18 -0
  184. data/doc/classes/GenericGIF.src/M000311.html +18 -0
  185. data/doc/classes/GenericGIF.src/M000312.html +18 -0
  186. data/doc/classes/HostSystem.html +249 -31
  187. data/doc/classes/HostSystem.src/M000058.html +18 -0
  188. data/doc/classes/HostSystem.src/M000059.html +22 -0
  189. data/doc/classes/HostSystem.src/M000060.html +18 -0
  190. data/doc/classes/HostSystem.src/M000061.html +18 -0
  191. data/doc/classes/HostSystem.src/M000062.html +22 -0
  192. data/doc/classes/HostSystem.src/M000063.html +33 -0
  193. data/doc/classes/HostSystem.src/M000064.html +18 -0
  194. data/doc/classes/HostSystem.src/M000065.html +19 -0
  195. data/doc/classes/HostSystem.src/M000066.html +18 -0
  196. data/doc/classes/HostSystem.src/M000067.html +18 -0
  197. data/doc/classes/HostSystem.src/M000068.html +18 -0
  198. data/doc/classes/HostSystem.src/M000069.html +18 -0
  199. data/doc/classes/HostSystem.src/M000070.html +18 -0
  200. data/doc/classes/HostSystem.src/M000071.html +18 -0
  201. data/doc/classes/HostSystem.src/M000072.html +18 -0
  202. data/doc/classes/HostSystem.src/M000073.html +18 -0
  203. data/doc/classes/HostSystem.src/M000074.html +29 -0
  204. data/doc/classes/HostSystem.src/M000075.html +18 -0
  205. data/doc/classes/ImageFormat.html +85 -85
  206. data/doc/classes/ImageFormat.src/M000218.html +18 -0
  207. data/doc/classes/ImageFormat.src/M000219.html +18 -0
  208. data/doc/classes/ImageFormat.src/M000220.html +18 -0
  209. data/doc/classes/ImageFormat.src/M000221.html +18 -0
  210. data/doc/classes/ImageFormat.src/M000222.html +18 -0
  211. data/doc/classes/ImageFormat.src/M000223.html +22 -0
  212. data/doc/classes/ImageFormat.src/M000224.html +19 -0
  213. data/doc/classes/ImageFormat.src/M000225.html +18 -0
  214. data/doc/classes/ImageFormat.src/M000226.html +18 -0
  215. data/doc/classes/ImageFormat.src/M000227.html +18 -0
  216. data/doc/classes/ImageFormat.src/M000228.html +18 -0
  217. data/doc/classes/ImageFormat.src/M000229.html +18 -0
  218. data/doc/classes/ImageFormat.src/M000230.html +18 -0
  219. data/doc/classes/ImageFormat.src/M000231.html +18 -0
  220. data/doc/classes/ImageFormat.src/M000232.html +20 -0
  221. data/doc/classes/ImageFormat.src/M000233.html +26 -0
  222. data/doc/classes/ImageFormat.src/M000234.html +18 -0
  223. data/doc/classes/ImageSniffing.html +94 -14
  224. data/doc/classes/ImageSniffing.src/M000052.html +2 -2
  225. data/doc/classes/ImageSniffing.src/M000109.html +102 -0
  226. data/doc/classes/ImageSniffing.src/M000110.html +36 -0
  227. data/doc/classes/ImageSniffing.src/M000111.html +43 -0
  228. data/doc/classes/ImageSniffing.src/M000112.html +46 -0
  229. data/doc/classes/ImageSniffing.src/M000113.html +59 -0
  230. data/doc/classes/ImageSniffing.src/M000114.html +74 -0
  231. data/doc/classes/IntegerBASIC.html +7 -0
  232. data/doc/classes/JvcDsk.html +231 -0
  233. data/doc/classes/JvcDsk.src/M000263.html +18 -0
  234. data/doc/classes/JvcDsk.src/M000264.html +39 -0
  235. data/doc/classes/JvcDsk.src/M000265.html +18 -0
  236. data/doc/classes/JvcDsk.src/M000266.html +18 -0
  237. data/doc/classes/JvcDsk.src/M000267.html +18 -0
  238. data/doc/classes/JvcDsk.src/M000268.html +22 -0
  239. data/doc/classes/MBasic.html +7 -0
  240. data/doc/classes/NADOLDos.html +7 -0
  241. data/doc/classes/NADOLFile.html +8 -0
  242. data/doc/classes/NADOLPic.html +156 -0
  243. data/doc/classes/NADOLPic.src/M000289.html +20 -0
  244. data/doc/classes/NADOLPic.src/M000290.html +18 -0
  245. data/doc/classes/NADOLTokens.html +8 -0
  246. data/doc/classes/NativeFileType.html +91 -91
  247. data/doc/classes/NativeFileType.src/M000169.html +22 -0
  248. data/doc/classes/NativeFileType.src/M000170.html +18 -0
  249. data/doc/classes/NativeFileType.src/M000171.html +18 -0
  250. data/doc/classes/NativeFileType.src/M000172.html +18 -0
  251. data/doc/classes/NativeFileType.src/M000173.html +18 -0
  252. data/doc/classes/NativeFileType.src/M000174.html +18 -0
  253. data/doc/classes/NativeFileType.src/M000175.html +18 -0
  254. data/doc/classes/NativeFileType.src/M000176.html +23 -0
  255. data/doc/classes/NativeFileType.src/M000177.html +18 -0
  256. data/doc/classes/NativeFileType.src/M000178.html +18 -0
  257. data/doc/classes/NativeFileType.src/M000179.html +24 -0
  258. data/doc/classes/NativeFileType.src/M000180.html +41 -0
  259. data/doc/classes/NativeFileType.src/M000181.html +24 -0
  260. data/doc/classes/NativeFileType.src/M000182.html +18 -0
  261. data/doc/classes/NativeFileType.src/M000183.html +18 -0
  262. data/doc/classes/NativeFileType.src/M000184.html +18 -0
  263. data/doc/classes/NativeFileType.src/M000185.html +20 -0
  264. data/doc/classes/NativeFileType.src/M000186.html +27 -0
  265. data/doc/classes/PNG/Canvas.html +7 -0
  266. data/doc/classes/PNG/Color.html +7 -0
  267. data/doc/classes/PNG.html +7 -0
  268. data/doc/classes/PackedAppleDosPic.html +145 -0
  269. data/doc/classes/PackedAppleDosPic.src/M000128.html +59 -0
  270. data/doc/classes/PascalDos.html +7 -0
  271. data/doc/classes/PascalFile.html +7 -0
  272. data/doc/classes/PascalPic.html +156 -0
  273. data/doc/classes/PascalPic.src/M000240.html +20 -0
  274. data/doc/classes/PascalPic.src/M000241.html +18 -0
  275. data/doc/classes/Pc99DD.html +250 -0
  276. data/doc/classes/Pc99DD.src/M000035.html +18 -0
  277. data/doc/classes/Pc99DD.src/M000036.html +18 -0
  278. data/doc/classes/Pc99DD.src/M000037.html +18 -0
  279. data/doc/classes/Pc99DD.src/M000038.html +18 -0
  280. data/doc/classes/Pc99DD.src/M000039.html +18 -0
  281. data/doc/classes/Pc99DD.src/M000040.html +18 -0
  282. data/doc/classes/Pc99DD.src/M000041.html +18 -0
  283. data/doc/classes/Pc99DD.src/M000042.html +18 -0
  284. data/doc/classes/Pc99Dsk.html +120 -0
  285. data/doc/classes/Pc99SD.html +250 -0
  286. data/doc/classes/Pc99SD.src/M000242.html +18 -0
  287. data/doc/classes/Pc99SD.src/M000243.html +18 -0
  288. data/doc/classes/Pc99SD.src/M000244.html +18 -0
  289. data/doc/classes/Pc99SD.src/M000245.html +18 -0
  290. data/doc/classes/Pc99SD.src/M000246.html +18 -0
  291. data/doc/classes/Pc99SD.src/M000247.html +18 -0
  292. data/doc/classes/Pc99SD.src/M000248.html +18 -0
  293. data/doc/classes/Pc99SD.src/M000249.html +18 -0
  294. data/doc/classes/ProDos.html +25 -12
  295. data/doc/classes/ProDos.src/M000161.html +18 -0
  296. data/doc/classes/ProDos.src/M000162.html +22 -0
  297. data/doc/classes/ProDosBinPic.html +171 -0
  298. data/doc/classes/ProDosBinPic.src/M000237.html +20 -0
  299. data/doc/classes/ProDosBinPic.src/M000238.html +18 -0
  300. data/doc/classes/ProDosBinPic.src/M000239.html +18 -0
  301. data/doc/classes/ProDosFile.html +16 -16
  302. data/doc/classes/ProDosFile.src/M000032.html +20 -0
  303. data/doc/classes/ProDosFile.src/M000033.html +18 -0
  304. data/doc/classes/ProDosFile.src/M000034.html +19 -0
  305. data/doc/classes/ProDosPrintShopMiniPix.html +149 -0
  306. data/doc/classes/ProDosPrintShopMiniPix.src/M000013.html +18 -0
  307. data/doc/classes/Proc.html +7 -0
  308. data/doc/classes/ProcSource.html +6 -0
  309. data/doc/classes/RDoc.html +6 -0
  310. data/doc/classes/RawDisk.html +11 -11
  311. data/doc/classes/RawDisk.src/M000159.html +18 -0
  312. data/doc/classes/RawDisk.src/M000160.html +23 -0
  313. data/doc/classes/RipXplore.html +1 -1
  314. data/doc/classes/RipXploreLog.html +6 -0
  315. data/doc/classes/RsDos.html +229 -0
  316. data/doc/classes/RsDos.src/M000023.html +18 -0
  317. data/doc/classes/RsDos.src/M000024.html +18 -0
  318. data/doc/classes/RsDos.src/M000025.html +18 -0
  319. data/doc/classes/RsDos.src/M000026.html +62 -0
  320. data/doc/classes/ScAsm.html +7 -0
  321. data/doc/classes/ScreenDump.html +131 -0
  322. data/doc/classes/ScreenDump.src/M000307.html +24 -0
  323. data/doc/classes/ScreenDumps.html +180 -0
  324. data/doc/classes/ScreenDumps.src/M000027.html +22 -0
  325. data/doc/classes/ScreenDumps.src/M000028.html +24 -0
  326. data/doc/classes/ScreenDumps.src/M000029.html +30 -0
  327. data/doc/classes/SubclassTracking.html +6 -0
  328. data/doc/classes/TestFileCache.html +7 -0
  329. data/doc/classes/Ti99.html +304 -0
  330. data/doc/classes/Ti99.src/M000295.html +18 -0
  331. data/doc/classes/Ti99.src/M000296.html +18 -0
  332. data/doc/classes/Ti99.src/M000297.html +18 -0
  333. data/doc/classes/Ti99.src/M000298.html +18 -0
  334. data/doc/classes/Ti99.src/M000299.html +18 -0
  335. data/doc/classes/Ti99.src/M000300.html +18 -0
  336. data/doc/classes/Ti99.src/M000301.html +18 -0
  337. data/doc/classes/Ti99.src/M000302.html +18 -0
  338. data/doc/classes/Ti99.src/M000303.html +18 -0
  339. data/doc/classes/Ti99.src/M000304.html +18 -0
  340. data/doc/classes/Ti99.src/M000305.html +18 -0
  341. data/doc/classes/Ti99.src/M000306.html +18 -0
  342. data/doc/classes/Ti99BasicFile.html +161 -0
  343. data/doc/classes/Ti99BasicFile.src/M000108.html +72 -0
  344. data/doc/classes/Ti99Dsk.html +276 -0
  345. data/doc/classes/Ti99Dsk.src/M000014.html +18 -0
  346. data/doc/classes/Ti99Dsk.src/M000015.html +18 -0
  347. data/doc/classes/Ti99Dsk.src/M000016.html +18 -0
  348. data/doc/classes/Ti99Dsk.src/M000017.html +18 -0
  349. data/doc/classes/Ti99Dsk.src/M000018.html +18 -0
  350. data/doc/classes/Ti99Dsk.src/M000019.html +22 -0
  351. data/doc/classes/Ti99Dsk.src/M000020.html +22 -0
  352. data/doc/classes/Ti99Dsk.src/M000021.html +22 -0
  353. data/doc/classes/Ti99Dsk.src/M000022.html +27 -0
  354. data/doc/classes/Ti99File.html +156 -0
  355. data/doc/classes/Ti99File.src/M000167.html +20 -0
  356. data/doc/classes/Ti99File.src/M000168.html +18 -0
  357. data/doc/classes/Ti99Fms.html +163 -0
  358. data/doc/classes/Ti99Fms.src/M000157.html +18 -0
  359. data/doc/classes/Ti99Fms.src/M000158.html +77 -0
  360. data/doc/classes/Ti99TextFile.html +154 -0
  361. data/doc/classes/Ti99TextFile.src/M000030.html +33 -0
  362. data/doc/classes/Ti99TextFile.src/M000031.html +18 -0
  363. data/doc/classes/TiArtistColours.html +113 -0
  364. data/doc/classes/TiArtistPattern.html +209 -0
  365. data/doc/classes/TiArtistPattern.src/M000080.html +50 -0
  366. data/doc/classes/TiArtistPattern.src/M000081.html +18 -0
  367. data/doc/classes/TiArtistPattern.src/M000082.html +18 -0
  368. data/doc/classes/TiArtistPattern.src/M000083.html +18 -0
  369. data/doc/classes/TiRLE.html +197 -0
  370. data/doc/classes/TiRLE.src/M000118.html +22 -0
  371. data/doc/classes/TiRLE.src/M000119.html +22 -0
  372. data/doc/classes/TiRLE.src/M000120.html +43 -0
  373. data/doc/classes/TiRLE.src/M000121.html +18 -0
  374. data/doc/classes/Trs80.html +145 -13
  375. data/doc/classes/Trs80.src/M000084.html +18 -0
  376. data/doc/classes/Trs80.src/M000085.html +18 -0
  377. data/doc/classes/Trs80.src/M000086.html +18 -0
  378. data/doc/classes/Trs80.src/M000087.html +18 -0
  379. data/doc/classes/Trs80.src/M000088.html +18 -0
  380. data/doc/classes/Trs80.src/M000089.html +18 -0
  381. data/doc/classes/Trs80.src/M000090.html +18 -0
  382. data/doc/classes/Trs80.src/M000091.html +18 -0
  383. data/doc/classes/Trs80.src/M000092.html +18 -0
  384. data/doc/classes/Trs80.src/M000093.html +18 -0
  385. data/doc/classes/Trs80.src/M000094.html +18 -0
  386. data/doc/classes/Trs80BasicListing.html +174 -0
  387. data/doc/classes/Trs80BasicListing.src/M000212.html +20 -0
  388. data/doc/classes/Trs80BasicListing.src/M000213.html +18 -0
  389. data/doc/classes/Trs80BasicListing.src/M000214.html +18 -0
  390. data/doc/classes/Trs80Cmd.html +20 -20
  391. data/doc/classes/Trs80Cmd.src/M000163.html +19 -0
  392. data/doc/classes/Trs80Cmd.src/M000164.html +24 -0
  393. data/doc/classes/Trs80Cmd.src/M000165.html +20 -0
  394. data/doc/classes/Trs80Cmd.src/M000166.html +35 -0
  395. data/doc/classes/Trs80Jcl.html +7 -0
  396. data/doc/classes/Trs80Jv1Dsk.html +25 -25
  397. data/doc/classes/Trs80Jv1Dsk.src/M000129.html +18 -0
  398. data/doc/classes/Trs80Jv1Dsk.src/M000130.html +18 -0
  399. data/doc/classes/Trs80Jv1Dsk.src/M000131.html +18 -0
  400. data/doc/classes/Trs80Jv1Dsk.src/M000132.html +18 -0
  401. data/doc/classes/Trs80Jv1Dsk.src/M000133.html +21 -0
  402. data/doc/classes/Trs80LevelIIBasic.html +28 -10
  403. data/doc/classes/Trs80LevelIIBasic.src/M000142.html +20 -0
  404. data/doc/classes/Trs80LevelIIBasic.src/M000143.html +18 -0
  405. data/doc/classes/Trs80LevelIIBasic.src/M000144.html +43 -0
  406. data/doc/classes/Trs80PascalSource.html +7 -0
  407. data/doc/classes/Trs80Text.html +181 -0
  408. data/doc/classes/Trs80Text.src/M000115.html +20 -0
  409. data/doc/classes/Trs80Text.src/M000116.html +18 -0
  410. data/doc/classes/Trs80Text.src/M000117.html +18 -0
  411. data/doc/classes/TrsDos.html +24 -22
  412. data/doc/classes/TrsDos.src/M000076.html +18 -0
  413. data/doc/classes/TrsDos.src/M000077.html +18 -0
  414. data/doc/classes/TrsDos.src/M000078.html +18 -0
  415. data/doc/classes/TrsDos.src/M000079.html +64 -0
  416. data/doc/classes/V9T9Dsk.html +120 -0
  417. data/doc/created.rid +1 -1
  418. data/doc/dot/f_0.dot +14 -0
  419. data/doc/dot/f_0.png +0 -0
  420. data/doc/dot/f_1.dot +23 -0
  421. data/doc/dot/f_1.png +0 -0
  422. data/doc/dot/f_10.dot +32 -0
  423. data/doc/dot/f_10.png +0 -0
  424. data/doc/dot/f_11.dot +32 -0
  425. data/doc/dot/f_11.png +0 -0
  426. data/doc/dot/f_12.dot +32 -0
  427. data/doc/dot/f_12.png +0 -0
  428. data/doc/dot/f_13.dot +32 -0
  429. data/doc/dot/f_13.png +0 -0
  430. data/doc/dot/f_14.dot +32 -0
  431. data/doc/dot/f_14.png +0 -0
  432. data/doc/dot/f_15.dot +32 -0
  433. data/doc/dot/f_15.png +0 -0
  434. data/doc/dot/f_16.dot +23 -0
  435. data/doc/dot/f_16.png +0 -0
  436. data/doc/dot/f_17.dot +32 -0
  437. data/doc/dot/f_17.png +0 -0
  438. data/doc/dot/f_18.dot +32 -0
  439. data/doc/dot/f_18.png +0 -0
  440. data/doc/dot/f_19.dot +32 -0
  441. data/doc/dot/f_19.png +0 -0
  442. data/doc/dot/f_2.dot +23 -0
  443. data/doc/dot/f_2.png +0 -0
  444. data/doc/dot/f_20.dot +32 -0
  445. data/doc/dot/f_20.png +0 -0
  446. data/doc/dot/f_21.dot +23 -0
  447. data/doc/dot/f_21.png +0 -0
  448. data/doc/dot/f_22.dot +58 -0
  449. data/doc/dot/f_22.png +0 -0
  450. data/doc/dot/f_23.dot +32 -0
  451. data/doc/dot/f_23.png +0 -0
  452. data/doc/dot/f_24.dot +32 -0
  453. data/doc/dot/f_24.png +0 -0
  454. data/doc/dot/f_25.dot +32 -0
  455. data/doc/dot/f_25.png +0 -0
  456. data/doc/dot/f_26.dot +32 -0
  457. data/doc/dot/f_26.png +0 -0
  458. data/doc/dot/f_27.dot +23 -0
  459. data/doc/dot/f_27.png +0 -0
  460. data/doc/dot/f_28.dot +32 -0
  461. data/doc/dot/f_28.png +0 -0
  462. data/doc/dot/f_29.dot +32 -0
  463. data/doc/dot/f_29.png +0 -0
  464. data/doc/dot/f_3.dot +41 -0
  465. data/doc/dot/f_3.png +0 -0
  466. data/doc/dot/f_30.dot +32 -0
  467. data/doc/dot/f_30.png +0 -0
  468. data/doc/dot/f_31.dot +32 -0
  469. data/doc/dot/f_31.png +0 -0
  470. data/doc/dot/f_32.dot +32 -0
  471. data/doc/dot/f_32.png +0 -0
  472. data/doc/dot/f_33.dot +32 -0
  473. data/doc/dot/f_33.png +0 -0
  474. data/doc/dot/f_34.dot +45 -0
  475. data/doc/dot/f_34.png +0 -0
  476. data/doc/dot/f_35.dot +32 -0
  477. data/doc/dot/f_35.png +0 -0
  478. data/doc/dot/f_36.dot +32 -0
  479. data/doc/dot/f_36.png +0 -0
  480. data/doc/dot/f_37.dot +32 -0
  481. data/doc/dot/f_37.png +0 -0
  482. data/doc/dot/f_38.dot +32 -0
  483. data/doc/dot/f_38.png +0 -0
  484. data/doc/dot/f_39.dot +32 -0
  485. data/doc/dot/f_39.png +0 -0
  486. data/doc/dot/f_4.dot +32 -0
  487. data/doc/dot/f_4.png +0 -0
  488. data/doc/dot/f_40.dot +32 -0
  489. data/doc/dot/f_40.png +0 -0
  490. data/doc/dot/f_41.dot +32 -0
  491. data/doc/dot/f_41.png +0 -0
  492. data/doc/dot/f_42.dot +32 -0
  493. data/doc/dot/f_42.png +0 -0
  494. data/doc/dot/f_43.dot +32 -0
  495. data/doc/dot/f_43.png +0 -0
  496. data/doc/dot/f_44.dot +32 -0
  497. data/doc/dot/f_44.png +0 -0
  498. data/doc/dot/f_45.dot +32 -0
  499. data/doc/dot/f_45.png +0 -0
  500. data/doc/dot/f_46.dot +32 -0
  501. data/doc/dot/f_46.png +0 -0
  502. data/doc/dot/f_47.dot +32 -0
  503. data/doc/dot/f_47.png +0 -0
  504. data/doc/dot/f_48.dot +32 -0
  505. data/doc/dot/f_48.png +0 -0
  506. data/doc/dot/f_49.dot +32 -0
  507. data/doc/dot/f_49.png +0 -0
  508. data/doc/dot/f_5.dot +23 -0
  509. data/doc/dot/f_5.png +0 -0
  510. data/doc/dot/f_50.dot +32 -0
  511. data/doc/dot/f_50.png +0 -0
  512. data/doc/dot/f_51.dot +32 -0
  513. data/doc/dot/f_51.png +0 -0
  514. data/doc/dot/f_52.dot +32 -0
  515. data/doc/dot/f_52.png +0 -0
  516. data/doc/dot/f_53.dot +32 -0
  517. data/doc/dot/f_53.png +0 -0
  518. data/doc/dot/f_54.dot +39 -0
  519. data/doc/dot/f_54.png +0 -0
  520. data/doc/dot/f_55.dot +30 -0
  521. data/doc/dot/f_55.png +0 -0
  522. data/doc/dot/f_56.dot +23 -0
  523. data/doc/dot/f_56.png +0 -0
  524. data/doc/dot/f_57.dot +23 -0
  525. data/doc/dot/f_57.png +0 -0
  526. data/doc/dot/f_58.dot +30 -0
  527. data/doc/dot/f_58.png +0 -0
  528. data/doc/dot/f_59.dot +32 -0
  529. data/doc/dot/f_59.png +0 -0
  530. data/doc/dot/f_6.dot +23 -0
  531. data/doc/dot/f_6.png +0 -0
  532. data/doc/dot/f_60.dot +32 -0
  533. data/doc/dot/f_60.png +0 -0
  534. data/doc/dot/f_7.dot +32 -0
  535. data/doc/dot/f_7.png +0 -0
  536. data/doc/dot/f_8.dot +32 -0
  537. data/doc/dot/f_8.png +0 -0
  538. data/doc/dot/f_9.dot +32 -0
  539. data/doc/dot/f_9.png +0 -0
  540. data/doc/dot/m_54_0.dot +30 -0
  541. data/doc/dot/m_54_0.png +0 -0
  542. data/doc/files/bin/ripxplore_rb.html +4 -4
  543. data/doc/files/lib/DumpUtilities_rb.html +6 -0
  544. data/doc/files/lib/FileCache_rb.html +3 -2
  545. data/doc/files/lib/FileContainer_rb.html +7 -0
  546. data/doc/files/lib/FileSystemImage_rb.html +2 -2
  547. data/doc/files/lib/FileSystem_rb.html +4 -4
  548. data/doc/files/lib/HostSystem_rb.html +4 -3
  549. data/doc/files/lib/ImageFormat_rb.html +3 -3
  550. data/doc/files/lib/NativeFileType_rb.html +3 -3
  551. data/doc/files/lib/PatchedPNG_rb.html +7 -0
  552. data/doc/files/lib/RipXploreLog_rb.html +6 -0
  553. data/doc/files/lib/RipXplore_rb.html +1 -1
  554. data/doc/files/lib/SubclassTracking_rb.html +6 -0
  555. data/doc/files/lib/disassemblers/D65_rb.html +6 -0
  556. data/doc/files/lib/file_systems/AppleCPM_rb.html +7 -0
  557. data/doc/files/lib/file_systems/AppleDos_rb.html +7 -0
  558. data/doc/files/lib/file_systems/AtariDos_rb.html +7 -0
  559. data/doc/files/lib/file_systems/CbmDos_rb.html +7 -0
  560. data/doc/files/lib/file_systems/NADOLDos_rb.html +7 -0
  561. data/doc/files/lib/file_systems/PascalDos_rb.html +7 -0
  562. data/doc/files/lib/file_systems/ProDos_rb.html +1 -1
  563. data/doc/files/lib/file_systems/RawDisk_rb.html +1 -1
  564. data/doc/files/lib/file_systems/RsDos_rb.html +108 -0
  565. data/doc/files/lib/file_systems/Ti99Fms_rb.html +108 -0
  566. data/doc/files/lib/file_systems/TrsDos_rb.html +1 -1
  567. data/doc/files/lib/host_systems/Apple2_rb.html +2 -2
  568. data/doc/files/lib/host_systems/Atari800_rb.html +2 -2
  569. data/doc/files/lib/host_systems/C64_rb.html +2 -2
  570. data/doc/files/lib/host_systems/Coco_rb.html +108 -0
  571. data/doc/files/lib/host_systems/Ti99_rb.html +108 -0
  572. data/doc/files/lib/host_systems/Trs80_rb.html +1 -1
  573. data/doc/files/lib/image_formats/A2Dsk_rb.html +9 -0
  574. data/doc/files/lib/image_formats/Atr_rb.html +7 -0
  575. data/doc/files/lib/image_formats/D64_rb.html +7 -0
  576. data/doc/files/lib/image_formats/G64_rb.html +7 -0
  577. data/doc/files/lib/image_formats/JvcDsk_rb.html +108 -0
  578. data/doc/files/lib/image_formats/Ti99Dsk_rb.html +134 -0
  579. data/doc/files/lib/image_formats/Ti99Dsk_rb.src/M000001.html +18 -0
  580. data/doc/files/lib/image_formats/Trs80Jv1Dsk_rb.html +1 -1
  581. data/doc/files/lib/native_file_types/apple2/AppleBinary_rb.html +1 -1
  582. data/doc/files/lib/native_file_types/apple2/AppleHiResPic_rb.html +1 -1
  583. data/doc/files/lib/native_file_types/apple2/ApplePrintShopMiniPix_rb.html +109 -0
  584. data/doc/files/lib/native_file_types/apple2/AppleText_rb.html +2 -1
  585. data/doc/files/lib/native_file_types/apple2/AppleWorksWP_rb.html +7 -0
  586. data/doc/files/lib/native_file_types/apple2/Applesoft_rb.html +7 -0
  587. data/doc/files/lib/native_file_types/apple2/IntegerBASIC_rb.html +7 -0
  588. data/doc/files/lib/native_file_types/apple2/NADOLFile_rb.html +8 -0
  589. data/doc/files/lib/native_file_types/apple2/PackedAppleDosPic_rb.html +101 -0
  590. data/doc/files/lib/native_file_types/apple2/PascalFile_rb.html +7 -0
  591. data/doc/files/lib/native_file_types/apple2/ProDosFile_rb.html +1 -1
  592. data/doc/files/lib/native_file_types/apple2/ScAsm_rb.html +7 -0
  593. data/doc/files/lib/native_file_types/atari800/AtariBasic_rb.html +7 -0
  594. data/doc/files/lib/native_file_types/atari800/AtariBinary_rb.html +8 -1
  595. data/doc/files/lib/native_file_types/atari800/AtariText_rb.html +2 -1
  596. data/doc/files/lib/native_file_types/c64/C64BasicPrg_rb.html +7 -0
  597. data/doc/files/lib/native_file_types/c64/C64PrgText_rb.html +7 -0
  598. data/doc/files/lib/native_file_types/c64/C64Prg_rb.html +7 -0
  599. data/doc/files/lib/native_file_types/c64/C64Seq_rb.html +7 -0
  600. data/doc/files/lib/native_file_types/c64/CbmFile_rb.html +7 -0
  601. data/doc/files/lib/native_file_types/coco/CocoBasic_rb.html +108 -0
  602. data/doc/files/lib/native_file_types/coco/CocoMachineLanguage_rb.html +108 -0
  603. data/doc/files/lib/native_file_types/coco/CocoScreen_rb.html +108 -0
  604. data/doc/files/lib/native_file_types/coco/CocoText_rb.html +108 -0
  605. data/doc/files/lib/native_file_types/cpm/CPMFile_rb.html +7 -0
  606. data/doc/files/lib/native_file_types/cpm/MBasic_rb.html +7 -0
  607. data/doc/files/lib/native_file_types/generic/GenericFile_rb.html +7 -0
  608. data/doc/files/lib/native_file_types/generic/GenericGIF_rb.html +101 -0
  609. data/doc/files/lib/native_file_types/generic/ScreenDump_rb.html +101 -0
  610. data/doc/files/lib/native_file_types/ti99/Ti99BasicFile_rb.html +108 -0
  611. data/doc/files/lib/native_file_types/ti99/Ti99File_rb.html +108 -0
  612. data/doc/files/lib/native_file_types/ti99/Ti99TextFile_rb.html +108 -0
  613. data/doc/files/lib/native_file_types/ti99/TiArtistColours_rb.html +108 -0
  614. data/doc/files/lib/native_file_types/ti99/TiArtistPattern_rb.html +109 -0
  615. data/doc/files/lib/native_file_types/ti99/TiRLE_rb.html +109 -0
  616. data/doc/files/lib/native_file_types/trs80/Trs80BasicListing_rb.html +108 -0
  617. data/doc/files/lib/native_file_types/trs80/Trs80Cmd_rb.html +1 -1
  618. data/doc/files/lib/native_file_types/trs80/Trs80Jcl_rb.html +7 -0
  619. data/doc/files/lib/native_file_types/trs80/Trs80LevelIIBasic_rb.html +1 -1
  620. data/doc/files/lib/native_file_types/trs80/Trs80PascalSource_rb.html +7 -0
  621. data/doc/files/lib/native_file_types/trs80/Trs80Text_rb.html +108 -0
  622. data/doc/files/lib/proc_source_rb.html +7 -0
  623. data/doc/files/lib/rdoc_patch_rb.html +6 -0
  624. data/doc/files/test/tc_apple_2_rb.html +108 -0
  625. data/doc/files/test/tc_atari_800_rb.html +108 -0
  626. data/doc/files/test/tc_c64_rb.html +108 -0
  627. data/doc/files/test/tc_cache_and_collections_rb.html +108 -0
  628. data/doc/files/test/tc_coco_rb.html +108 -0
  629. data/doc/files/test/tc_file_cache_rb.html +7 -0
  630. data/doc/files/test/tc_image_sniffing_rb.html +8 -1
  631. data/doc/files/test/tc_screen_dumps_rb.html +108 -0
  632. data/doc/files/test/tc_ti99_rb.html +108 -0
  633. data/doc/files/test/tc_trs80_rb.html +108 -0
  634. data/doc/files/test/testhelper_rb.html +57 -1
  635. data/doc/files/test/testhelper_rb.src/M000002.html +21 -0
  636. data/doc/files/test/testhelper_rb.src/M000003.html +18 -0
  637. data/doc/files/test/testhelper_rb.src/M000004.html +61 -0
  638. data/doc/files/test/ts_test_all_rb.html +5 -0
  639. data/doc/files/website/index_rb.html +107 -0
  640. data/lib/FileCache.rb +80 -13
  641. data/lib/FileSystem.rb +1 -1
  642. data/lib/FileSystemImage.rb +16 -2
  643. data/lib/HostSystem.rb +124 -1
  644. data/lib/NativeFileType.rb +11 -1
  645. data/lib/RipXplore.rb +2 -2
  646. data/lib/file_systems/ProDos.rb +1 -0
  647. data/lib/file_systems/RawDisk.rb +7 -2
  648. data/lib/file_systems/RsDos.rb +146 -0
  649. data/lib/file_systems/Ti99Fms.rb +123 -0
  650. data/lib/file_systems/TrsDos.rb +8 -5
  651. data/lib/host_systems/Apple2.rb +53 -9
  652. data/lib/host_systems/Atari800.rb +40 -1
  653. data/lib/host_systems/C64.rb +42 -1
  654. data/lib/host_systems/Coco.rb +145 -0
  655. data/lib/host_systems/TRS81-3.FNT +0 -0
  656. data/lib/host_systems/Ti99.rb +86 -0
  657. data/lib/host_systems/Trs80.rb +40 -5
  658. data/lib/host_systems/apple_2_font.bin +0 -0
  659. data/lib/host_systems/atari-800-font.bin +0 -0
  660. data/lib/host_systems/c64-font.bin +0 -0
  661. data/lib/host_systems/coco-font.bin +0 -0
  662. data/lib/host_systems/ti99-font.bin +0 -0
  663. data/lib/image_formats/JvcDsk.rb +101 -0
  664. data/lib/image_formats/Ti99Dsk.rb +213 -0
  665. data/lib/image_formats/Trs80Jv1Dsk.rb +5 -3
  666. data/lib/native_file_types/apple2/AppleBinary.rb +2 -2
  667. data/lib/native_file_types/apple2/AppleHiResPic.rb +101 -57
  668. data/lib/native_file_types/apple2/ApplePrintShopMiniPix.rb +99 -0
  669. data/lib/native_file_types/apple2/AppleText.rb +16 -0
  670. data/lib/native_file_types/apple2/PackedAppleDosPic.rb +85 -0
  671. data/lib/native_file_types/apple2/ProDosFile.rb +2 -3
  672. data/lib/native_file_types/atari800/AtariBinary.rb +1 -1
  673. data/lib/native_file_types/atari800/AtariText.rb +7 -1
  674. data/lib/native_file_types/coco/CocoBasic.rb +230 -0
  675. data/lib/native_file_types/coco/CocoMachineLanguage.rb +47 -0
  676. data/lib/native_file_types/coco/CocoScreen.rb +54 -0
  677. data/lib/native_file_types/coco/CocoText.rb +42 -0
  678. data/lib/native_file_types/generic/GenericGIF.rb +50 -0
  679. data/lib/native_file_types/generic/ScreenDump.rb +43 -0
  680. data/lib/native_file_types/ti99/Ti99BasicFile.rb +223 -0
  681. data/lib/native_file_types/ti99/Ti99File.rb +40 -0
  682. data/lib/native_file_types/ti99/Ti99TextFile.rb +62 -0
  683. data/lib/native_file_types/ti99/TiArtistColours.rb +40 -0
  684. data/lib/native_file_types/ti99/TiArtistPattern.rb +109 -0
  685. data/lib/native_file_types/ti99/TiRLE.rb +91 -0
  686. data/lib/native_file_types/trs80/Trs80BasicListing.rb +51 -0
  687. data/lib/native_file_types/trs80/Trs80Cmd.rb +3 -1
  688. data/lib/native_file_types/trs80/Trs80LevelIIBasic.rb +15 -3
  689. data/lib/native_file_types/trs80/Trs80Text.rb +49 -0
  690. data/test/native_files/42d0d52047a748022d2aacef60cc5271-0.png +0 -0
  691. data/test/native_files/6ac562d2d099dc31213e97b8fe08ffbf-1.png +0 -0
  692. data/test/screendumps/0.png +0 -0
  693. data/test/screendumps/1.png +0 -0
  694. data/test/screendumps/2.png +0 -0
  695. data/test/screendumps/3.png +0 -0
  696. data/test/screendumps/4.png +0 -0
  697. data/test/screendumps/5.png +0 -0
  698. data/test/screendumps/6.png +0 -0
  699. data/test/screendumps/7.png +0 -0
  700. data/test/tc_apple_2.rb +94 -0
  701. data/test/tc_atari_800.rb +28 -0
  702. data/test/tc_c64.rb +35 -0
  703. data/test/tc_cache_and_collections.rb +33 -0
  704. data/test/tc_coco.rb +38 -0
  705. data/test/tc_screen_dumps.rb +42 -0
  706. data/test/tc_ti99.rb +51 -0
  707. data/test/tc_trs80.rb +66 -0
  708. data/test/testhelper.rb +59 -1
  709. data/test/testlog.txt +123423 -30232
  710. metadata +595 -14
  711. data/test/tc_file_cache.rb +0 -11
  712. data/test/tc_image_sniffing.rb +0 -165
data/lib/FileCache.rb CHANGED
@@ -3,7 +3,7 @@ $:.unshift(File.dirname(__FILE__)) unless
3
3
  require 'open-uri'
4
4
  require 'digest/md5'
5
5
  require 'RipXploreLog'
6
-
6
+ require 'RipXplore'
7
7
 
8
8
  class FileCacheItem < File
9
9
  def set_path(path)
@@ -16,29 +16,39 @@ end
16
16
 
17
17
  #creates and manages a local cache of files, so an URL can be requested, if it is in the cache, the local copy is used, otherwise the file is downloaded to the local cache
18
18
  class FileCache
19
- attr_accessor :cache_dir
19
+ attr_accessor :url_cache_dir,:url_cache_list,:native_file_cache_dir
20
+
21
+
22
+ def cache_name_for_url(url)
23
+ "#{url_cache_dir}/#{Digest::MD5.hexdigest(url)}.cached"
24
+ end
20
25
 
21
- #create a local_name for a URL. format of local_name "#{cache_dir}/#{Digest::MD5.hexdigest(url)}"
22
- def local_name(url)
23
- "#{cache_dir}/#{Digest::MD5.hexdigest(url)}.cached"
26
+ def cache_name_for_native_file(native_file,extension)
27
+ image=native_file.file_system_image
28
+ index=image.files.index(native_file)
29
+ "#{native_file_cache_dir}/#{Digest::MD5.hexdigest(image.filename)}-#{index}.#{extension}"
24
30
  end
25
31
 
26
- def initialize(cache_dir)
27
- @cache_dir=cache_dir
28
- Dir.mkdir(cache_dir) unless File.exists?(cache_dir)
29
- raise "cache directory #{cache_dir} invalid" unless File.directory?(cache_dir)
32
+ def initialize(url_cache_dir,native_file_cache_dir)
33
+ @url_cache_dir=url_cache_dir
34
+ @native_file_cache_dir=native_file_cache_dir
35
+ @url_cache_list="#{url_cache_dir}/cache.urls"
36
+ Dir.mkdir(url_cache_dir) unless File.exists?(url_cache_dir)
37
+ raise "cache directory #{url_cache_dir} invalid" unless File.directory?(url_cache_dir)
38
+ Dir.mkdir(native_file_cache_dir) unless File.exists?(native_file_cache_dir)
39
+ raise "cache directory #{native_file_cache_dir} invalid" unless File.directory?(native_file_cache_dir)
30
40
  end
31
41
 
32
- def purge(url)
33
- local_file_name=local_name(url)
42
+ def purge_url(url)
43
+ local_file_name=cache_name_for_url(url)
34
44
  if File.exists?(local_file_name) then
35
45
  RipXploreLog.log "purging local copy of #{url}"
36
46
  File.delete(local_file_name)
37
47
  end
38
48
  end
39
49
 
40
- def get(url)
41
- local_file_name=local_name(url)
50
+ def get_url(url)
51
+ local_file_name=cache_name_for_url(url)
42
52
  if !File.exists?(local_file_name) then
43
53
  RipXploreLog.log "downloading #{url}"
44
54
  remote_file=open(url,"rb")
@@ -54,6 +64,63 @@ class FileCache
54
64
  file.set_path(url)
55
65
  file
56
66
  end
67
+
68
+ def get_file_system_image(url)
69
+ file=get_url(url)
70
+ image=RipXplore.best_fit_from_file(file)
71
+ @@file_system_image_urls<<url if (!@@file_system_image_urls.nil? && !@@file_system_image_urls.include?(url))
72
+ return image
73
+ end
74
+
75
+ @@file_system_image_urls=nil
76
+ def file_system_image_urls_in_cache
77
+ if @@file_system_image_urls.nil? then
78
+ make_file_system_image_list unless File.exists?(@url_cache_list)
79
+ @@file_system_image_urls=File.open(@url_cache_list,"r").readlines.collect{|url| url.chomp}
80
+ end
81
+ @@file_system_image_urls
82
+ end
83
+
84
+ def make_file_system_image_list
85
+ urls=[]
86
+ Dir.glob("#{url_cache_dir}/*.cached.info").each do |info_file|
87
+ url=File.open(info_file,"r").read.chomp
88
+ urls<<url if (FileSystemImage.is_file_system_image_filename?(url))
89
+ end
90
+ File.open(@url_cache_list,"w") {|f| f<< urls.join("\n")}
91
+ end
92
+
93
+
94
+ def random_file_system_image(collection_type=nil)
95
+ all_image_urls=file_system_image_urls_in_cache
96
+ all_image_urls.length.times do
97
+ begin
98
+ index=rand(all_image_urls.length)
99
+ image=get_file_system_image(all_image_urls[index%all_image_urls.length])
100
+ return image if ((collection_type==nil) || (image.send(collection_type).length>0))
101
+ rescue #silently swallow any exception
102
+ end
103
+ end
104
+ raise 'no suitable image found in cache'
105
+ end
106
+
107
+ def force_native_file_to_cache(native_file,method_to_cache_on_native_file,extension)
108
+ cache_filename=cache_name_for_native_file(native_file,extension)
109
+ if ! File.exists?(cache_filename) then
110
+ local_file=File.open(cache_filename,"wb")
111
+ local_file<<native_file.send(method_to_cache_on_native_file)
112
+ local_file.close
113
+ end
114
+ return cache_filename
115
+ end
116
+
117
+ def purge_native_file_from_cache(native_file)
118
+ Dir.glob(cache_name_for_native_file(native_file,'*')).each do |filename|
119
+ RipXploreLog.log "purging local #{filename}"
120
+ File.delete(filename)
121
+ end
122
+ end
123
+
57
124
  end
58
125
 
59
126
 
data/lib/FileSystem.rb CHANGED
@@ -47,7 +47,7 @@ def self.compatability_score(file_system_image)
47
47
  final_score=1
48
48
  code_for_tests.each do |code_for_test|
49
49
  result = eval code_for_test,binding
50
- # puts "test for #{file_system_image.filename}#{self} : #{code_for_test} : #{result}"
50
+ RipXploreLog.debug "test for #{file_system_image.filename}#{self} : #{code_for_test} : #{result}"
51
51
  final_score+=1
52
52
  return 0 unless (result)
53
53
  end
@@ -9,6 +9,7 @@ attr_reader :file_system, :image_format,:filename
9
9
  attr_accessor :volume_name
10
10
 
11
11
  def FileSystemImage.is_file_system_image_filename?(filename)
12
+
12
13
  extension=File.extname(File.basename(filename,".gz")).downcase
13
14
  ImageFormat.all_possible_extensions.include?(extension)
14
15
  end
@@ -81,7 +82,7 @@ end
81
82
  @files=file_system.files(self) if @files.nil?
82
83
  @files
83
84
  end
84
-
85
+
85
86
  #return an array containing a list of numbers of valid tracks on this image
86
87
  def track_list
87
88
  image_format.track_list
@@ -119,7 +120,7 @@ def to_hex_dump
119
120
  #return a formatted hex dump of all sectors in a track
120
121
  def dump_track(track)
121
122
  s=""
122
- sector_list_for_track(track).each do |sector|
123
+ sectors_in_track(track).each do |sector|
123
124
  s<<dump_sector(track,sector)
124
125
  end
125
126
  s
@@ -140,6 +141,19 @@ def catalog
140
141
  end
141
142
 
142
143
 
144
+ def pictures
145
+ files.find_all{|f| f.respond_to?(:to_picture)}
146
+ end
147
+
148
+ def texts
149
+ files.find_all{|f| f.respond_to?(:to_text)}
150
+ end
151
+
152
+ def listings
153
+ files.find_all{|f| f.respond_to?(:to_listing)}
154
+ end
155
+
156
+
143
157
  private
144
158
 
145
159
  def hline
data/lib/HostSystem.rb CHANGED
@@ -3,8 +3,17 @@ $:.unshift(File.dirname(__FILE__)) unless
3
3
  require 'open-uri'
4
4
  require 'RipXploreLog'
5
5
  require 'SubclassTracking'
6
+ require 'PatchedPNG'
6
7
 
7
8
  class HostSystem
9
+
10
+ MAX_SCREENDUMP_LINES=200
11
+
12
+ #each subclass should override this method with a 2-5 word description of this host system
13
+ def self.full_name
14
+ nil
15
+ end
16
+
8
17
  def HostSystem.possible_file_systems
9
18
  results=[]
10
19
  FileSystem.all_file_systems.each do |candidate|
@@ -12,7 +21,8 @@ class HostSystem
12
21
  end
13
22
  results
14
23
  end
15
-
24
+
25
+
16
26
  def HostSystem.all_host_systems
17
27
  HostSystem.subclasses
18
28
  end
@@ -54,6 +64,119 @@ end
54
64
  def HostSystem.start_track
55
65
  0
56
66
  end
67
+
68
+ @font_data=nil
69
+ def self.font_data
70
+ @font_data=File.new(font_data_filename,"rb").read if @font_data.nil?
71
+ @font_data
72
+ end
73
+
74
+ #default - should be overridden by each host system
75
+ def self.screen_rows
76
+ 25
77
+ end
78
+
79
+ #default - should be overridden by each host system
80
+ def self.default_screen_width
81
+ 40
82
+ end
83
+
84
+ def self.max_screen_width
85
+ 80
86
+ end
87
+
88
+ #default - should be overridden by each host system
89
+ def self.font_width
90
+ 8
91
+ end
92
+
93
+ #default - should be overridden by each host system
94
+ def self.font_height
95
+ 8
96
+ end
97
+
98
+ #default - should be overridden by each host system
99
+ def self.pixels_between_characters
100
+ 0
101
+ end
102
+
103
+ #default - should be overridden by each host system
104
+ def self.default_foreground_colour
105
+ PNG::Color::White
106
+ end
107
+
108
+ #default - should be overridden by each host system
109
+ def self.default_background_colour
110
+ PNG::Color::Black
111
+ end
112
+
113
+ def self.to_screendump(text,screen_width)
114
+ lines=split_into_lines(text,screen_width)
115
+ canvas = PNG::Canvas.new font_width*screen_width, (pixels_between_characters+font_height)*[lines.length,screen_rows].max, default_background_colour
116
+ line_number=0
117
+ lines.each do |line|
118
+ col=0
119
+ line.each_byte do |char|
120
+ draw_char_at(canvas,char,line_number,col)
121
+ col+=1
122
+ end
123
+ line_number+=1
124
+ end
125
+ PNG.new(canvas).raw_bytes
126
+ end
127
+
128
+
129
+ def self.line_break_chars
130
+ [0x0D]
131
+ end
132
+
133
+ private
134
+ def self.draw_char_at(canvas,char,line_number,col,foreground_colour=default_foreground_colour,background_colour=default_background_colour)
135
+ start_x=col*font_width
136
+ start_y=line_number*(pixels_between_characters+font_height)
137
+ font_height.times do |y_offset|
138
+ font_byte=font_data[char*font_height+y_offset]
139
+ font_width.times do |x_offset|
140
+ bit_mask=1<<(font_width-(x_offset+1))
141
+ if ((font_byte & bit_mask)==bit_mask) then
142
+ canvas[start_x+x_offset, start_y+y_offset]=foreground_colour
143
+ else
144
+ canvas[start_x+x_offset, start_y+y_offset]=background_colour
145
+ end
146
+ end
147
+ end
148
+ end
149
+
150
+ def self.split_into_lines(text,screen_width)
151
+ line_number=0
152
+ col=0
153
+ lines=[]
154
+ s=""
155
+ p=0
156
+ done=false
157
+ until done do
158
+ b=text[p]
159
+ s<<b unless line_break_chars.include?(b)
160
+ col+=1
161
+ if (col==screen_width) || ( line_break_chars.include?(b)) then
162
+ # puts "#{line_number} -#{s}"
163
+ col=0
164
+ line_number+=1
165
+ lines<<s
166
+ s=""
167
+ end
168
+ p+=1
169
+ done=true if p==text.length
170
+ done=true if line_number==MAX_SCREENDUMP_LINES
171
+ #done=true if line_number==screen_rows
172
+ end
173
+ lines<<s if s.length>0 && lines.length<screen_rows
174
+ lines
175
+
176
+
177
+ end
178
+
179
+
57
180
  end
58
181
 
59
182
  HostSystem.extend SubclassTracking
@@ -91,7 +91,13 @@ class NativeFileType
91
91
  end
92
92
  best_candidate=candidates.keys.sort{|a,b| candidates[b]<=>candidates[a]}[0]
93
93
  RipXploreLog.debug("best candidate for #{filename} = #{best_candidate} score: #{candidates[best_candidate]}")
94
- best_candidate.new(file_system_image,filename,contents,file_type,aux_code)
94
+ native_file=best_candidate.new(file_system_image,filename,contents,file_type,aux_code)
95
+ if GenericGIF.is_gif?(native_file) then
96
+ RipXploreLog.debug(" #{filename} is a GIF")
97
+ native_file.extend GenericGIF
98
+ end
99
+
100
+ native_file
95
101
  end
96
102
 
97
103
 
@@ -138,8 +144,12 @@ def self.compatability_score(file_system_image,filename,contents,file_type,aux_c
138
144
  return matching_score+passed_tests
139
145
  end
140
146
 
147
+ private
148
+ def text_for_screendump
149
+ data_without_header.sub(/\000*$/,'') #trim of any trailing null bytes
141
150
  end
142
151
 
152
+ end
143
153
  NativeFileType.extend SubclassTracking
144
154
 
145
155
  # == Author
data/lib/RipXplore.rb CHANGED
@@ -4,7 +4,7 @@ $:.unshift(File.dirname(__FILE__)) unless
4
4
  require 'open-uri'
5
5
  class RipXplore
6
6
 
7
- VERSION="0.0.1"
7
+ VERSION="0.0.2"
8
8
 
9
9
  private
10
10
  def RipXplore.require_files_in_subdir(dirname)
@@ -37,7 +37,7 @@ def RipXplore.best_fit_from_file(file,filename=nil)
37
37
  if !(filename=~/(.*)\.gz$/i).nil? then
38
38
  require 'zlib'
39
39
  file_bytes=Zlib::GzipReader.new(file).read
40
- filename=$1
40
+ # filename=$1
41
41
  else
42
42
  file_bytes=file.read
43
43
  end
@@ -9,6 +9,7 @@ require 'FileSystem'
9
9
  #Disk image in ProDOS format
10
10
  class ProDos<FileSystem
11
11
 
12
+ attr_reader :volume_name
12
13
  def self.host_system
13
14
  Apple2
14
15
  end
@@ -13,8 +13,13 @@ class RawDisk<FileSystem
13
13
  end
14
14
 
15
15
  #this should be the file system of last resort
16
- def self.compatability_score(filesystem_image)
17
- return 0.1
16
+ def self.compatability_score(file_system_image)
17
+ #if the filesystem on a DSK is RAW, don't worry about sector interleaves
18
+ if file_system_image.image_format.instance_of?(A2Dsk)
19
+ return 0
20
+ else
21
+ return 0.1
22
+ end
18
23
  end
19
24
  end
20
25
 
@@ -0,0 +1,146 @@
1
+ $:.unshift(File.dirname(__FILE__)) unless
2
+ $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
3
+
4
+ $:.unshift(File.dirname(__FILE__+"\\..")) unless
5
+ $:.include?(File.dirname(__FILE__+"\\..")) || $:.include?(File.expand_path(File.dirname(__FILE__+"\\..")))
6
+
7
+
8
+ require 'FileSystem'
9
+ #RSDOS (Standard Color Computer Disk Operating system)
10
+ #Reference - Radio Shack TRS-80 Color Computer Disk System Owners Manual & Programming Guide, pages 58-59
11
+ #sectors 3-11 of the directory track (17) contain Directory Entries, which are 32 bytes made up of:
12
+ # byte $00-$07: Filename, left justified, blank-filled.
13
+ # If byte 0=0, then file has been deleted.
14
+ # If byte 0=$FF, then the entry (and all following entries) have not yet been used.
15
+ # byte $08-$0A: Filename extension, left justified, blank-filed
16
+ # byte $0b: File type
17
+ # 0 = BASIC program
18
+ # 1 = BASIC data file
19
+ # 2 = Machine-language program
20
+ # 3 = Text Editor Source file
21
+ # byte $0C: ASCII Flag
22
+ # 0 = the file is in binary format
23
+ # $FF = the file is in ASCII format
24
+ # byte $0D: The number of the first granule in the file (0-67)
25
+ # byte $0E-$0F: The number of bytes in use in the last sector of the file. Big endian.
26
+ # byte $16-$1F: Reserved for future use.
27
+ #sector 2 contains File Allocation Table.
28
+ class RsDos<FileSystem
29
+
30
+ def self.host_system
31
+ Coco
32
+ end
33
+
34
+ #standard RSDOS has directory on track 17
35
+ def self.directory_track
36
+ 0x11
37
+ end
38
+
39
+ def self.sectors_per_granule(file_system_image)
40
+ 9
41
+ end
42
+
43
+
44
+ #check the directory track look reasonable
45
+ is_valid_file_system_if lambda {
46
+ result=true
47
+ found_one_directory_entry=false
48
+ (3..11).each do |sector_no|
49
+
50
+ sector=file_system_image.get_sector(directory_track,sector_no)
51
+ if sector[0]<0xFF then
52
+ found_one_directory_entry =true
53
+ file_type=sector[0x0B]
54
+ ascii_flag=sector[0x0C]
55
+ first_granule=sector[0x0D]
56
+ result=false if (file_type>4)
57
+ result=false unless (ascii_flag==0x00 || ascii_flag==0xFF)
58
+ result=false if (first_granule>67)
59
+
60
+ end
61
+ end
62
+ (found_one_directory_entry && result)
63
+ }
64
+
65
+
66
+ #we are getting false positives with TI-99/4A disks so we need to do some inverted TI FMS tests
67
+ is_valid_file_system_if lambda {
68
+ file_system_image.get_sector(0,1)[0X0d,3]!='DSK'
69
+ }
70
+
71
+ FDE_SIZE=0x20
72
+
73
+ def self.files(file_system_image)
74
+ files=FileContainer.new
75
+ granule_allocation_table=file_system_image.get_sector(directory_track,2)
76
+ return files if granule_allocation_table.nil?
77
+ # file_system_image.volume_name="RSDOS Disk"
78
+ (file_system_image.sectors_in_track(directory_track)-[1,2,12,13,14,15,16,17,18]).each do |sector_no|
79
+ fde_sector=file_system_image.get_sector(directory_track,sector_no)
80
+ (fde_sector.length/FDE_SIZE).times do |fde_number|
81
+ fde=fde_sector[fde_number*FDE_SIZE,FDE_SIZE]
82
+ next if fde[0]==0
83
+ break if fde[0]==0xff
84
+
85
+ filename_base=fde[0,8].unpack("A8")
86
+ filename_extension=fde[8,3].unpack("A8")
87
+ filename="#{filename_base}/#{filename_extension}"
88
+ file_type, ascii_flag, granule, last_sector_bytes = fde[11,5].unpack("CCCS")
89
+ contents=""
90
+ granules = []
91
+
92
+ # puts "#{filename}: first gran:#{granule} file type #{file_type} ascii flag #{ascii_flag}"
93
+
94
+ while granule < 67
95
+ break if granules.include?(granule)==true
96
+ granules << granule
97
+ track_no = Integer(granule/2)
98
+ (track_no += 1) if granule>33
99
+ start_sector = (granule % 2) == 0 ? 1 : 10
100
+ #puts "Start sector: #{start_sector}"
101
+
102
+ granule_value = granule_allocation_table[ granule ]
103
+
104
+ if granule_value < 68 then
105
+ 9.times {|i| contents<<file_system_image.get_sector(track_no,start_sector+i)}
106
+ else
107
+ count = (granule_value & 0b00011111) - 1
108
+ count.times {|i| contents<<file_system_image.get_sector(track_no,start_sector+i)}
109
+ contents<<(file_system_image.get_sector(track_no,start_sector+count))[0,last_sector_bytes]
110
+ end
111
+ #puts "#{granule} = #{granule_value}"
112
+ granule = granule_value
113
+ end
114
+
115
+ files<<NativeFileType.best_fit(file_system_image,filename,contents,file_type,ascii_flag)
116
+ end
117
+ end
118
+ files
119
+ end
120
+ end
121
+
122
+
123
+ # == Author
124
+ # tim lindner (tlindner@macmess.org)
125
+ #
126
+ # == Copyright
127
+ # Copyright (c) 2008 tim lindner (tlindner@macmess.org)
128
+ #
129
+ #Permission is hereby granted, free of charge, to any person obtaining
130
+ #a copy of this software and associated documentation files (the
131
+ #"Software"), to deal in the Software without restriction, including
132
+ #without limitation the rights to use, copy, modify, merge, publish,
133
+ #distribute, sublicense, and/or sell copies of the Software, and to
134
+ #permit persons to whom the Software is furnished to do so, subject to
135
+ #the following conditions:
136
+
137
+ # The above copyright notice and this permission notice shall be
138
+ # included in all copies or substantial portions of the Software.
139
+
140
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
141
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
142
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
143
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
144
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
145
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
146
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,123 @@
1
+ $:.unshift(File.dirname(__FILE__)) unless
2
+ $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
3
+
4
+ $:.unshift(File.dirname(__FILE__+"\\..")) unless
5
+ $:.include?(File.dirname(__FILE__+"\\..")) || $:.include?(File.expand_path(File.dirname(__FILE__+"\\..")))
6
+
7
+
8
+ require 'FileSystem'
9
+
10
+ #File System used by Texas Instruments TI 99/4A
11
+ #http://groups.google.com.au/group/comp.sys.ti/browse_frm/thread/64cc9c35e36ebb28/6f3faa2ae6b0e4d2
12
+ #ftp://ftp.whtech.com/datasheets%20%26%20manuals/Specifications/File%20Management%20Specification%20for%20TI%2099_4%20Personal%20Computer%20V2.5%2002-25-1983.pdf
13
+ class Ti99Fms<FileSystem
14
+
15
+ def self.host_system
16
+ Ti99
17
+ end
18
+
19
+ is_valid_file_system_if lambda {
20
+ #we should be on a subclass of Ti99Dsk, but not the generic superclasses (Ti99Dsk and Pc99Dsk) class itself
21
+ #yes this is a nasty hack - it should be up to the ImageFormat code, not the FileSystem code, to not allow selection of bad ImageFormats :-(
22
+ file_system_image.image_format.kind_of?(Ti99Dsk) &&
23
+ (!(file_system_image.image_format.instance_of?(Ti99Dsk))) &&
24
+ (!(file_system_image.image_format.instance_of?(Pc99Dsk)))
25
+ }
26
+
27
+
28
+
29
+ #All TI/99 disks have the chars DSK in bytes 0x0c..0x0E of sector 0.
30
+ is_valid_file_system_if lambda {
31
+ file_system_image.get_sector(0,0)[0X0d,3]=='DSK'
32
+ }
33
+
34
+ def self.files(file_system_image)
35
+ sector_0=file_system_image.get_sector(0,0)
36
+ file_system_image.volume_name=sector_0[0,10].unpack("A*")[0]
37
+ files=FileContainer.new
38
+ file_descriptor_index_sector=file_system_image.get_sector(0,1)
39
+ 127.times do |file_descriptor_index|
40
+ dir_sector_no=(file_descriptor_index_sector[file_descriptor_index*2]<<8)+(file_descriptor_index_sector[(file_descriptor_index*2)+1])
41
+ # puts "#{file_descriptor_index} %02X" % dir_sector_no
42
+ break if dir_sector_no==0
43
+ dir_sector=file_system_image.get_sector(0,dir_sector_no)
44
+ filename=dir_sector[0,10].unpack("A*")[0]
45
+ if dir_sector[0]>=0x20 && dir_sector[0x0a]==0 && dir_sector[0x0b]==0 then
46
+ file_status_flag=dir_sector[0x0c]
47
+ record_length=dir_sector[0x11]
48
+ records_per_sector=dir_sector[0x0d]
49
+ valid_bytes_in_sector=records_per_sector*record_length
50
+ valid_bytes_in_sector=0x100 if valid_bytes_in_sector==0
51
+ # puts "FILE #{filename} RECORD LENGTH %02X NUM RECORDS %02X TOTAL BYTES %02X" % [record_length,records_per_sector,valid_bytes_in_sector]
52
+
53
+ # puts "FILE STATUS: %02X" % file_status_flag
54
+ data_chain_pointer=0x1c
55
+
56
+ #DATA CHAIN POINTER BLOCKS - Each data chain pointer block is comprised of three bytes which comprise a cluster.
57
+ #The three bytes are broken down into 2 three nybble blocks. The first indicates the first actual sector in
58
+ #the cluster. THe second indicates the highest logical record offset in the cluster of contiguous sectors.
59
+ #The following diagram shows how each three byte cluster relates to the address of the first sector and the
60
+ #highest logical sector offset in the cluster.
61
+ #BYTE 1 N2:N1
62
+ #BYTE 2 M1:N3
63
+ #BYTE 3 M3:M2
64
+ #
65
+ #First Sector - N3:N2:N1
66
+ #Highest Sector Offset M2:M3:M1
67
+ last_sector_offset=-1
68
+ file_contents=""
69
+
70
+ while data_chain_pointer<0xFD do
71
+ byte_1=dir_sector[data_chain_pointer]
72
+ byte_2=dir_sector[data_chain_pointer+1]
73
+ byte_3=dir_sector[data_chain_pointer+2]
74
+ n3=byte_2%0x10
75
+ m1=byte_2>>4
76
+ first_sector=(n3<<8)+byte_1
77
+ highest_sector_offset=(byte_3<<4)+m1
78
+ sectors_in_this_block=highest_sector_offset-last_sector_offset
79
+ last_sector_offset=highest_sector_offset
80
+
81
+ # puts "%2x:%2x:%2x FIRST SECTOR %03X OFFSET %03X" % [byte_1,byte_2,byte_3,first_sector,highest_sector_offset]
82
+ # puts "#{filename} FS #{first_sector} COUNT #{sectors_in_this_block}"
83
+ break if first_sector==0 || first_sector>file_system_image.image_format.sectors_per_track*file_system_image.track_count
84
+
85
+ sectors_in_this_block.times {|i| file_contents<<file_system_image.get_sector(0,i+first_sector)}
86
+ data_chain_pointer+=3
87
+
88
+ end
89
+ file_type=file_status_flag
90
+
91
+ files<<NativeFileType.best_fit(file_system_image,filename,file_contents,file_type)
92
+ end
93
+ end
94
+ files
95
+ end
96
+
97
+ end
98
+
99
+ # == Author
100
+ # Jonno Downes (jonno@jamtronix.com)
101
+ #
102
+ # == Copyright
103
+ # Copyright (c) 2008 Jonno Downes (jonno@jamtronix.com)
104
+ #
105
+ #Permission is hereby granted, free of charge, to any person obtaining
106
+ #a copy of this software and associated documentation files (the
107
+ #"Software"), to deal in the Software without restriction, including
108
+ #without limitation the rights to use, copy, modify, merge, publish,
109
+ #distribute, sublicense, and/or sell copies of the Software, and to
110
+ #permit persons to whom the Software is furnished to do so, subject to
111
+ #the following conditions:
112
+
113
+ # The above copyright notice and this permission notice shall be
114
+ # included in all copies or substantial portions of the Software.
115
+
116
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
117
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
118
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
119
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
120
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
121
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
122
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
123
+