dsktool 0.4.2 → 0.5.1

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 (417) hide show
  1. data/bin/dskexplorer.rb +1 -1
  2. data/bin/dskexplorer.rb~ +365 -0
  3. data/bin/dsktool.rb +7 -3
  4. data/bin/dsktool.rb~ +173 -0
  5. data/doc/classes/AppleSoftFile.html +199 -0
  6. data/doc/classes/AppleSoftFile.src/M000005.html +18 -0
  7. data/doc/classes/AppleSoftFile.src/M000006.html +18 -0
  8. data/doc/classes/AppleSoftFile.src/M000008.html +18 -0
  9. data/doc/classes/AppleSoftFile.src/M000009.html +18 -0
  10. data/doc/classes/AppleSoftFile.src/M000010.html +18 -0
  11. data/doc/classes/AppleSoftFile.src/M000055.html +18 -0
  12. data/doc/classes/AppleSoftFile.src/M000056.html +18 -0
  13. data/doc/classes/AppleSoftFile.src/M000057.html +18 -0
  14. data/doc/classes/AppleSoftFile.src/M000058.html +18 -0
  15. data/doc/classes/BinaryFile.html +241 -0
  16. data/doc/classes/BinaryFile.src/M000015.html +18 -0
  17. data/doc/classes/BinaryFile.src/M000020.html +18 -0
  18. data/doc/classes/BinaryFile.src/M000021.html +18 -0
  19. data/doc/classes/BinaryFile.src/M000022.html +19 -0
  20. data/doc/classes/BinaryFile.src/M000107.html +18 -0
  21. data/doc/classes/BinaryFile.src/M000108.html +18 -0
  22. data/doc/classes/BinaryFile.src/M000109.html +18 -0
  23. data/doc/classes/BinaryFile.src/M000110.html +19 -0
  24. data/doc/classes/BinaryFile.src/M000111.html +19 -0
  25. data/doc/classes/BinaryFile.src/M000112.html +19 -0
  26. data/doc/classes/BinaryFile.src/M000113.html +18 -0
  27. data/doc/classes/CPMDisk.html +331 -0
  28. data/doc/classes/CPMDisk.src/M000024.html +21 -0
  29. data/doc/classes/CPMDisk.src/M000025.html +23 -0
  30. data/doc/classes/CPMDisk.src/M000026.html +23 -0
  31. data/doc/classes/CPMDisk.src/M000027.html +19 -0
  32. data/doc/classes/CPMDisk.src/M000028.html +18 -0
  33. data/doc/classes/CPMDisk.src/M000029.html +18 -0
  34. data/doc/classes/CPMDisk.src/M000030.html +31 -0
  35. data/doc/classes/CPMDisk.src/M000031.html +51 -0
  36. data/doc/classes/CPMDisk.src/M000032.html +53 -0
  37. data/doc/classes/CPMFile.html +252 -0
  38. data/doc/classes/CPMFile.src/M000064.html +22 -0
  39. data/doc/classes/CPMFile.src/M000065.html +20 -0
  40. data/doc/classes/CPMFile.src/M000066.html +22 -0
  41. data/doc/classes/CPMFile.src/M000067.html +18 -0
  42. data/doc/classes/CPMFile.src/M000068.html +18 -0
  43. data/doc/classes/CPMFile.src/M000069.html +18 -0
  44. data/doc/classes/CPMFile.src/M000070.html +18 -0
  45. data/doc/classes/CatalogServlet.html +148 -0
  46. data/doc/classes/CatalogServlet.src/M000035.html +20 -0
  47. data/doc/classes/CatalogServlet.src/M000036.html +20 -0
  48. data/doc/classes/D65.html +180 -0
  49. data/doc/classes/D65.src/M000002.html +18 -0
  50. data/doc/classes/D65.src/M000003.html +18 -0
  51. data/doc/classes/D65.src/M000004.html +64 -0
  52. data/doc/classes/D65.src/M000005.html +18 -0
  53. data/doc/classes/D65.src/M000006.html +18 -0
  54. data/doc/classes/D65.src/M000007.html +18 -0
  55. data/doc/classes/D65.src/M000008.html +18 -0
  56. data/doc/classes/D65.src/M000048.html +18 -0
  57. data/doc/classes/D65.src/M000049.html +64 -0
  58. data/doc/classes/DOSDisk.html +425 -0
  59. data/doc/classes/DOSDisk.src/M000007.html +20 -0
  60. data/doc/classes/DOSDisk.src/M000008.html +77 -0
  61. data/doc/classes/DOSDisk.src/M000010.html +20 -0
  62. data/doc/classes/DOSDisk.src/M000011.html +20 -0
  63. data/doc/classes/DOSDisk.src/M000012.html +19 -0
  64. data/doc/classes/DOSDisk.src/M000013.html +20 -0
  65. data/doc/classes/DOSDisk.src/M000053.html +23 -0
  66. data/doc/classes/DOSDisk.src/M000054.html +19 -0
  67. data/doc/classes/DOSDisk.src/M000055.html +21 -0
  68. data/doc/classes/DOSDisk.src/M000056.html +37 -0
  69. data/doc/classes/DOSDisk.src/M000057.html +85 -0
  70. data/doc/classes/DOSDisk.src/M000058.html +37 -0
  71. data/doc/classes/DOSDisk.src/M000059.html +34 -0
  72. data/doc/classes/DOSDisk.src/M000060.html +27 -0
  73. data/doc/classes/DOSDisk.src/M000061.html +43 -0
  74. data/doc/classes/DOSDisk.src/M000062.html +31 -0
  75. data/doc/classes/DOSDisk.src/M000063.html +95 -0
  76. data/doc/classes/DOSDisk.src/M000064.html +85 -0
  77. data/doc/classes/DOSDisk.src/M000065.html +37 -0
  78. data/doc/classes/DOSDisk.src/M000066.html +34 -0
  79. data/doc/classes/DOSDisk.src/M000067.html +27 -0
  80. data/doc/classes/DOSDisk.src/M000068.html +43 -0
  81. data/doc/classes/DOSDisk.src/M000069.html +31 -0
  82. data/doc/classes/DOSDisk.src/M000070.html +95 -0
  83. data/doc/classes/DOSFile.html +253 -0
  84. data/doc/classes/DOSFile.src/M000016.html +22 -0
  85. data/doc/classes/DOSFile.src/M000017.html +17 -0
  86. data/doc/classes/DOSFile.src/M000018.html +18 -0
  87. data/doc/classes/DOSFile.src/M000021.html +22 -0
  88. data/doc/classes/DOSFile.src/M000022.html +22 -0
  89. data/doc/classes/DOSFile.src/M000023.html +22 -0
  90. data/doc/classes/DOSFile.src/M000024.html +17 -0
  91. data/doc/classes/DOSFile.src/M000025.html +18 -0
  92. data/doc/classes/DOSFile.src/M000116.html +22 -0
  93. data/doc/classes/DOSFile.src/M000117.html +18 -0
  94. data/doc/classes/DOSFile.src/M000118.html +18 -0
  95. data/doc/classes/DOSFile.src/M000119.html +28 -0
  96. data/doc/classes/DOSFile.src/M000120.html +18 -0
  97. data/doc/classes/DSK.html +633 -0
  98. data/doc/classes/DSK.src/M000009.html +22 -0
  99. data/doc/classes/DSK.src/M000010.html +27 -0
  100. data/doc/classes/DSK.src/M000011.html +19 -0
  101. data/doc/classes/DSK.src/M000012.html +18 -0
  102. data/doc/classes/DSK.src/M000013.html +22 -0
  103. data/doc/classes/DSK.src/M000014.html +22 -0
  104. data/doc/classes/DSK.src/M000015.html +22 -0
  105. data/doc/classes/DSK.src/M000016.html +22 -0
  106. data/doc/classes/DSK.src/M000017.html +22 -0
  107. data/doc/classes/DSK.src/M000018.html +22 -0
  108. data/doc/classes/DSK.src/M000019.html +22 -0
  109. data/doc/classes/DSK.src/M000020.html +34 -0
  110. data/doc/classes/DSK.src/M000079.html +19 -0
  111. data/doc/classes/DSK.src/M000080.html +19 -0
  112. data/doc/classes/DSK.src/M000081.html +18 -0
  113. data/doc/classes/DSK.src/M000082.html +18 -0
  114. data/doc/classes/DSK.src/M000083.html +18 -0
  115. data/doc/classes/DSK.src/M000084.html +18 -0
  116. data/doc/classes/DSK.src/M000085.html +18 -0
  117. data/doc/classes/DSK.src/M000086.html +25 -0
  118. data/doc/classes/DSK.src/M000087.html +19 -0
  119. data/doc/classes/DSK.src/M000088.html +20 -0
  120. data/doc/classes/DSK.src/M000089.html +35 -0
  121. data/doc/classes/DSK.src/M000090.html +22 -0
  122. data/doc/classes/DSK.src/M000091.html +22 -0
  123. data/doc/classes/DSK.src/M000092.html +27 -0
  124. data/doc/classes/DSK.src/M000093.html +25 -0
  125. data/doc/classes/DSK.src/M000094.html +33 -0
  126. data/doc/classes/DSK.src/M000095.html +66 -0
  127. data/doc/classes/DSK.src/M000096.html +33 -0
  128. data/doc/classes/DSK.src/M000097.html +22 -0
  129. data/doc/classes/DSK.src/M000098.html +23 -0
  130. data/doc/classes/DSK.src/M000099.html +24 -0
  131. data/doc/classes/DSK.src/M000100.html +21 -0
  132. data/doc/classes/DSK.src/M000101.html +18 -0
  133. data/doc/classes/DSK.src/M000102.html +24 -0
  134. data/doc/classes/DSK.src/M000103.html +24 -0
  135. data/doc/classes/DSK.src/M000104.html +24 -0
  136. data/doc/classes/DSKFile.html +328 -0
  137. data/doc/classes/DSKFile.src/M000071.html +19 -0
  138. data/doc/classes/DSKFile.src/M000072.html +18 -0
  139. data/doc/classes/DSKFile.src/M000073.html +23 -0
  140. data/doc/classes/DSKFile.src/M000074.html +25 -0
  141. data/doc/classes/DSKFile.src/M000075.html +18 -0
  142. data/doc/classes/DSKFile.src/M000076.html +18 -0
  143. data/doc/classes/DSKFile.src/M000077.html +18 -0
  144. data/doc/classes/DSKFile.src/M000078.html +18 -0
  145. data/doc/classes/DSKFile.src/M000079.html +50 -0
  146. data/doc/classes/DSKTrackSector.html +199 -0
  147. data/doc/classes/DSKTrackSector.src/M000045.html +20 -0
  148. data/doc/classes/DSKTrackSector.src/M000046.html +18 -0
  149. data/doc/classes/DSKTrackSector.src/M000047.html +21 -0
  150. data/doc/classes/DSKTrackSector.src/M000049.html +20 -0
  151. data/doc/classes/DSKTrackSector.src/M000050.html +18 -0
  152. data/doc/classes/DSKTrackSector.src/M000051.html +21 -0
  153. data/doc/classes/DirectoryServlet.html +148 -0
  154. data/doc/classes/DirectoryServlet.src/M000041.html +20 -0
  155. data/doc/classes/DirectoryServlet.src/M000044.html +20 -0
  156. data/doc/classes/DumpUtilities.html +158 -0
  157. data/doc/classes/DumpUtilities.src/M000050.html +33 -0
  158. data/doc/classes/DumpUtilities.src/M000051.html +23 -0
  159. data/doc/classes/HGR.html +232 -0
  160. data/doc/classes/HGR.src/M000114.html +29 -0
  161. data/doc/classes/HGR.src/M000115.html +56 -0
  162. data/doc/classes/IntegerBasicFile.html +293 -0
  163. data/doc/classes/IntegerBasicFile.src/M000001.html +18 -0
  164. data/doc/classes/IntegerBasicFile.src/M000004.html +18 -0
  165. data/doc/classes/IntegerBasicFile.src/M000005.html +18 -0
  166. data/doc/classes/IntegerBasicFile.src/M000036.html +18 -0
  167. data/doc/classes/IntegerBasicFile.src/M000037.html +18 -0
  168. data/doc/classes/IntegerBasicFile.src/M000038.html +18 -0
  169. data/doc/classes/IntegerBasicFile.src/M000039.html +18 -0
  170. data/doc/classes/MBASICFile.html +202 -0
  171. data/doc/classes/MBASICFile.src/M000033.html +22 -0
  172. data/doc/classes/MBASICFile.src/M000034.html +30 -0
  173. data/doc/classes/MBASICFile.src/M000035.html +94 -0
  174. data/doc/classes/NADOLBinaryFile.html +184 -0
  175. data/doc/classes/NADOLBinaryFile.src/M000052.html +19 -0
  176. data/doc/classes/NADOLBinaryFile.src/M000053.html +18 -0
  177. data/doc/classes/NADOLBinaryFile.src/M000054.html +18 -0
  178. data/doc/classes/NADOLDisk.html +324 -0
  179. data/doc/classes/NADOLDisk.src/M000014.html +23 -0
  180. data/doc/classes/NADOLDisk.src/M000015.html +19 -0
  181. data/doc/classes/NADOLDisk.src/M000016.html +18 -0
  182. data/doc/classes/NADOLDisk.src/M000017.html +29 -0
  183. data/doc/classes/NADOLDisk.src/M000018.html +34 -0
  184. data/doc/classes/NADOLDisk.src/M000019.html +32 -0
  185. data/doc/classes/NADOLDisk.src/M000020.html +22 -0
  186. data/doc/classes/NADOLDisk.src/M000021.html +38 -0
  187. data/doc/classes/NADOLDisk.src/M000022.html +27 -0
  188. data/doc/classes/NADOLDisk.src/M000023.html +53 -0
  189. data/doc/classes/NADOLDisk.src/M000024.html +46 -0
  190. data/doc/classes/NADOLFile.html +189 -0
  191. data/doc/classes/NADOLFile.src/M000042.html +18 -0
  192. data/doc/classes/NADOLFile.src/M000043.html +18 -0
  193. data/doc/classes/NADOLFile.src/M000044.html +28 -0
  194. data/doc/classes/NADOLTokenisedFile.html +231 -0
  195. data/doc/classes/NADOLTokenisedFile.src/M000124.html +28 -0
  196. data/doc/classes/NADOLTokenisedFile.src/M000125.html +49 -0
  197. data/doc/classes/NADOLTokenisedFile.src/M000126.html +18 -0
  198. data/doc/classes/NADOLTokenisedFile.src/M000127.html +18 -0
  199. data/doc/classes/Nibbles.html +231 -0
  200. data/doc/classes/Nibbles.src/M000110.html +18 -0
  201. data/doc/classes/Nibbles.src/M000111.html +20 -0
  202. data/doc/classes/Nibbles.src/M000112.html +18 -0
  203. data/doc/classes/Nibbles.src/M000113.html +101 -0
  204. data/doc/classes/PNG.html +151 -0
  205. data/doc/classes/PNG.src/M000123.html +26 -0
  206. data/doc/classes/SCAsmFile.html +242 -0
  207. data/doc/classes/SCAsmFile.src/M000102.html +18 -0
  208. data/doc/classes/SCAsmFile.src/M000103.html +18 -0
  209. data/doc/classes/SCAsmFile.src/M000104.html +18 -0
  210. data/doc/classes/SCAsmFile.src/M000105.html +18 -0
  211. data/doc/classes/SCAsmFile.src/M000106.html +39 -0
  212. data/doc/classes/ShowFileServlet.html +148 -0
  213. data/doc/classes/ShowFileServlet.src/M000052.html +22 -0
  214. data/doc/classes/ShowFileServlet.src/M000059.html +22 -0
  215. data/doc/classes/ShowPNGServlet.html +148 -0
  216. data/doc/classes/ShowPNGServlet.src/M000101.html +26 -0
  217. data/doc/classes/ShowPNGServlet.src/M000105.html +26 -0
  218. data/doc/classes/ShowSectorServlet.html +148 -0
  219. data/doc/classes/ShowSectorServlet.src/M000040.html +22 -0
  220. data/doc/classes/ShowSectorServlet.src/M000043.html +22 -0
  221. data/doc/classes/TestCPMDisks.html +159 -0
  222. data/doc/classes/TestCPMDisks.src/M000037.html +19 -0
  223. data/doc/classes/TestCPMDisks.src/M000038.html +57 -0
  224. data/doc/classes/TestDOSDisks.html +279 -0
  225. data/doc/classes/TestDOSDisks.src/M000001.html +19 -0
  226. data/doc/classes/TestDOSDisks.src/M000002.html +19 -0
  227. data/doc/classes/TestDOSDisks.src/M000003.html +25 -0
  228. data/doc/classes/TestDOSDisks.src/M000014.html +26 -0
  229. data/doc/classes/TestDOSDisks.src/M000015.html +19 -0
  230. data/doc/classes/TestDOSDisks.src/M000016.html +62 -0
  231. data/doc/classes/TestDOSDisks.src/M000017.html +22 -0
  232. data/doc/classes/TestDOSDisks.src/M000018.html +20 -0
  233. data/doc/classes/TestDOSDisks.src/M000019.html +19 -0
  234. data/doc/classes/TestDOSDisks.src/M000020.html +25 -0
  235. data/doc/classes/TestDOSDisks.src/M000021.html +47 -0
  236. data/doc/classes/TestDOSDisks.src/M000022.html +28 -0
  237. data/doc/classes/TestDOSDisks.src/M000023.html +28 -0
  238. data/doc/classes/TestDOSDisks.src/M000025.html +26 -0
  239. data/doc/classes/TestDOSDisks.src/M000026.html +19 -0
  240. data/doc/classes/TestDOSDisks.src/M000027.html +62 -0
  241. data/doc/classes/TestDOSDisks.src/M000028.html +22 -0
  242. data/doc/classes/TestDOSDisks.src/M000029.html +20 -0
  243. data/doc/classes/TestDOSDisks.src/M000030.html +19 -0
  244. data/doc/classes/TestDOSDisks.src/M000031.html +25 -0
  245. data/doc/classes/TestDOSDisks.src/M000032.html +47 -0
  246. data/doc/classes/TestDOSDisks.src/M000033.html +28 -0
  247. data/doc/classes/TestDOSDisks.src/M000034.html +28 -0
  248. data/doc/classes/TestDisassembly.html +144 -0
  249. data/doc/classes/TestDisassembly.src/M000005.html +19 -0
  250. data/doc/classes/TestDisassembly.src/M000006.html +19 -0
  251. data/doc/classes/TestDisassembly.src/M000039.html +19 -0
  252. data/doc/classes/TestModifiedDOSDisks.html +193 -0
  253. data/doc/classes/TestModifiedDOSDisks.src/M000045.html +24 -0
  254. data/doc/classes/TestModifiedDOSDisks.src/M000046.html +27 -0
  255. data/doc/classes/TestModifiedDOSDisks.src/M000047.html +24 -0
  256. data/doc/classes/TestModifiedDOSDisks.src/M000048.html +27 -0
  257. data/doc/classes/TestNADOLDisks.html +193 -0
  258. data/doc/classes/TestNADOLDisks.src/M000106.html +22 -0
  259. data/doc/classes/TestNADOLDisks.src/M000107.html +72 -0
  260. data/doc/classes/TestNADOLDisks.src/M000108.html +22 -0
  261. data/doc/classes/TestNADOLDisks.src/M000109.html +72 -0
  262. data/doc/classes/TestNADOLDisks.src/M000121.html +22 -0
  263. data/doc/classes/TestNADOLDisks.src/M000122.html +73 -0
  264. data/doc/classes/TestPascalDisks.html +174 -0
  265. data/doc/classes/TestPascalDisks.src/M000040.html +28 -0
  266. data/doc/classes/TestPascalDisks.src/M000041.html +24 -0
  267. data/doc/classes/TestPascalDisks.src/M000042.html +27 -0
  268. data/doc/classes/TestProDOSDisks.html +253 -0
  269. data/doc/classes/TestProDOSDisks.src/M000114.html +28 -0
  270. data/doc/classes/TestProDOSDisks.src/M000115.html +28 -0
  271. data/doc/classes/TestProDOSDisks.src/M000116.html +41 -0
  272. data/doc/classes/TestProDOSDisks.src/M000117.html +28 -0
  273. data/doc/classes/TestProDOSDisks.src/M000118.html +28 -0
  274. data/doc/classes/TestProDOSDisks.src/M000119.html +28 -0
  275. data/doc/classes/TestProDOSDisks.src/M000120.html +41 -0
  276. data/doc/classes/TestProDOSDisks.src/M000121.html +28 -0
  277. data/doc/classes/TextFile.html +196 -0
  278. data/doc/classes/TextFile.src/M000019.html +18 -0
  279. data/doc/classes/TextFile.src/M000020.html +20 -0
  280. data/doc/classes/TextFile.src/M000024.html +18 -0
  281. data/doc/classes/TextFile.src/M000025.html +18 -0
  282. data/doc/classes/TextFile.src/M000026.html +18 -0
  283. data/doc/classes/TextFile.src/M000027.html +20 -0
  284. data/doc/classes/TextFile.src/M000128.html +18 -0
  285. data/doc/classes/TextFile.src/M000129.html +18 -0
  286. data/doc/classes/TextFile.src/M000130.html +18 -0
  287. data/doc/classes/TextFile.src/M000131.html +20 -0
  288. data/doc/created.rid +1 -0
  289. data/doc/dot/f_0.dot +14 -84
  290. data/doc/dot/f_0.png +0 -0
  291. data/doc/dot/f_1.dot +32 -0
  292. data/doc/dot/f_1.png +0 -0
  293. data/doc/dot/f_10.dot +32 -0
  294. data/doc/dot/f_10.png +0 -0
  295. data/doc/dot/f_11.dot +14 -0
  296. data/doc/dot/f_11.png +0 -0
  297. data/doc/dot/f_12.dot +84 -0
  298. data/doc/dot/f_12.png +0 -0
  299. data/doc/dot/f_15.dot +32 -0
  300. data/doc/dot/f_15.png +0 -0
  301. data/doc/dot/f_18.dot +32 -0
  302. data/doc/dot/f_18.png +0 -0
  303. data/doc/dot/f_2.dot +32 -0
  304. data/doc/dot/f_2.png +0 -0
  305. data/doc/dot/f_20.dot +32 -0
  306. data/doc/dot/f_20.png +0 -0
  307. data/doc/dot/f_3.dot +32 -0
  308. data/doc/dot/f_3.png +0 -0
  309. data/doc/dot/f_4.dot +32 -0
  310. data/doc/dot/f_4.png +0 -0
  311. data/doc/dot/f_5.dot +32 -0
  312. data/doc/dot/f_5.png +0 -0
  313. data/doc/dot/f_6.dot +32 -0
  314. data/doc/dot/f_6.png +0 -0
  315. data/doc/dot/f_7.dot +23 -0
  316. data/doc/dot/f_7.png +0 -0
  317. data/doc/dot/f_8.dot +23 -0
  318. data/doc/dot/f_8.png +0 -0
  319. data/doc/dot/f_9.dot +45 -0
  320. data/doc/dot/f_9.png +0 -0
  321. data/doc/files/bin/dskexplorer_rb.html +365 -0
  322. data/doc/files/bin/dskexplorer_rb.src/M000001.html +21 -0
  323. data/doc/files/bin/dskexplorer_rb.src/M000002.html +21 -0
  324. data/doc/files/bin/dskexplorer_rb.src/M000003.html +22 -0
  325. data/doc/files/bin/dskexplorer_rb.src/M000004.html +20 -0
  326. data/doc/files/bin/dskexplorer_rb.src/M000005.html +20 -0
  327. data/doc/files/bin/dskexplorer_rb.src/M000006.html +22 -0
  328. data/doc/files/bin/dskexplorer_rb.src/M000007.html +16 -0
  329. data/doc/files/bin/dskexplorer_rb.src/M000008.html +20 -0
  330. data/doc/files/bin/dskexplorer_rb.src/M000009.html +43 -0
  331. data/doc/files/bin/dskexplorer_rb.src/M000010.html +59 -0
  332. data/doc/files/bin/dskexplorer_rb.src/M000011.html +53 -0
  333. data/doc/files/bin/dskexplorer_rb.src/M000012.html +58 -0
  334. data/doc/files/bin/dskexplorer_rb.src/M000013.html +37 -0
  335. data/doc/files/bin/dsktool_rb.html +276 -0
  336. data/doc/files/bin/romdump_rb.html +189 -0
  337. data/doc/files/dsktool_web/dskexplorer_rb.html +112 -0
  338. data/doc/files/dsktool_web/dskexplorer_web_rb.html +112 -0
  339. data/doc/files/dsktool_web/index_rb.html +112 -0
  340. data/doc/files/lib/CPMDisk_rb.html +115 -0
  341. data/doc/files/lib/CPMFile_rb.html +117 -0
  342. data/doc/files/lib/D65_rb.html +114 -0
  343. data/doc/files/lib/DOSDisk_rb.html +115 -0
  344. data/doc/files/lib/DOSFile_rb.html +122 -0
  345. data/doc/files/lib/DSKFile_rb.html +114 -0
  346. data/doc/files/lib/DSK_rb.html +127 -0
  347. data/doc/files/lib/DumpUtilities_rb.html +107 -0
  348. data/doc/files/lib/HGR_rb.html +122 -0
  349. data/doc/files/lib/NADOLDisk_rb.html +115 -0
  350. data/doc/files/lib/NADOLFile_rb.html +120 -0
  351. data/doc/files/lib/Nibbles_rb.html +114 -0
  352. data/doc/files/test/tc_cpm_disks_rb.html +122 -0
  353. data/doc/files/test/tc_disassembly_rb.html +116 -0
  354. data/doc/files/test/tc_dos_disks_rb.html +122 -0
  355. data/doc/files/test/tc_modified_dos_disks_rb.html +122 -0
  356. data/doc/files/test/tc_nadol_disks_rb.html +122 -0
  357. data/doc/files/test/tc_prodos_disks_rb.html +122 -0
  358. data/doc/files/test/test_dos_disks_rb.html +109 -0
  359. data/doc/files/test/ts_test_all_rb.html +119 -0
  360. data/doc/files/test_bak/hgr_scanlines_rb.html +106 -0
  361. data/doc/files/test_bak/tc_disassembly_rb.html +123 -0
  362. data/doc/files/test_bak/tc_dos_disks_rb.html +122 -0
  363. data/doc/files/test_bak/tc_modified_dos_disks_rb.html +122 -0
  364. data/doc/files/test_bak/tc_nadol_disks_rb.html +122 -0
  365. data/doc/files/test_bak/tc_pascal_disks_rb.html +122 -0
  366. data/doc/files/test_bak/tc_prodos_disks_rb.html +122 -0
  367. data/doc/files/test_bak/ts_test_all_rb.html +118 -0
  368. data/doc/fr_class_index.html +46 -0
  369. data/doc/fr_file_index.html +47 -0
  370. data/doc/fr_method_index.html +147 -0
  371. data/doc/index.html +24 -0
  372. data/doc/rdoc-style.css +208 -0
  373. data/lib/CPMDisk.rb +194 -0
  374. data/lib/CPMFile.rb +344 -0
  375. data/lib/DOSDisk.rb +16 -12
  376. data/lib/DOSDisk.rb~ +201 -0
  377. data/lib/DOSFile.rb~ +402 -0
  378. data/lib/DSK.rb +99 -49
  379. data/lib/DSK.rb~ +226 -0
  380. data/lib/DSKFile.rb +9 -0
  381. data/lib/DSKFile.rb~ +137 -0
  382. data/lib/HGR.rb~ +157 -0
  383. data/lib/NADOLDisk.rb~ +104 -0
  384. data/lib/NADOLFile.rb~ +225 -0
  385. data/lib/Nibbles.rb +210 -0
  386. data/lib/PascalDisk.rb~ +120 -0
  387. data/lib/PascalFile.rb~ +62 -0
  388. data/lib/ProDOSDisk.rb~ +197 -0
  389. data/lib/ProDOSFile.rb~ +160 -0
  390. data/test/1.txt +267 -0
  391. data/test/CPM1.DSK +0 -0
  392. data/test/CPM1.PO +0 -0
  393. data/test/PIC.ZO +0 -0
  394. data/test/STARCPM.DSK +0 -0
  395. data/test/SWRDTH1.NIB +1 -0
  396. data/test/blah.png +0 -0
  397. data/test/blah2.png +0 -0
  398. data/test/blank.nib +1 -0
  399. data/test/build_hgr_table.rb +28 -0
  400. data/test/build_hgr_table.rb~ +28 -0
  401. data/test/cpm_write_test.dsk +0 -0
  402. data/test/ed.txt +0 -0
  403. data/test/p.html +15030 -0
  404. data/test/pic.rb +19 -0
  405. data/test/pic.rb~ +18 -0
  406. data/test/sword.dsk +0 -0
  407. data/test/tc_cpm_disks.rb +59 -0
  408. data/test/tc_dos_disks.rb~ +107 -0
  409. data/test/tc_modified_dos_disks.rb +33 -0
  410. data/test/tc_nadol_disks.rb +0 -1
  411. data/test/tc_nadol_disks.rb~ +42 -0
  412. data/test/tc_pascal_disks.rb~ +48 -0
  413. data/test/tc_prodos_disks.rb~ +78 -0
  414. data/test/ts_test_all.rb +6 -4
  415. data/test/ts_test_all.rb~ +7 -0
  416. data/test/x.txt +16 -0
  417. metadata +485 -35
data/lib/Nibbles.rb ADDED
@@ -0,0 +1,210 @@
1
+ $:.unshift(File.dirname(__FILE__)) unless
2
+ $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
3
+
4
+ require 'DSK'
5
+
6
+ class Nibbles
7
+ # DEBUG=true
8
+ DEBUG=false
9
+
10
+ #dos interleave table (from Beneath Apple DOS p 3-23)
11
+ INTERLEAVES=[0x00,0x07,0x0E,0x06,0x0D,0x05,0x0C,0x04,0x0B,0x03,0x0A,0x02,0x09,0x01,0x08,0x0F]
12
+
13
+ #6-2 translate table (from Beneath Apple DOS p 3-17)
14
+ DATA_TRANSLATE_TABLE=[
15
+ 0x96,#00
16
+ 0x97,#01
17
+ 0x9A,#02
18
+ 0x9B,#03
19
+ 0x9D,#04
20
+ 0x9E,#05
21
+ 0x9F,#06
22
+ 0xA6,#07
23
+ 0xA7,#08
24
+ 0xAB,#09
25
+ 0xAC,#0A
26
+ 0xAD,#0B
27
+ 0xAE,#0C
28
+ 0xAF,#0D
29
+ 0xB2,#0E
30
+ 0xB3,#0F
31
+ 0xB4,#10
32
+ 0xB5,#11
33
+ 0xB6,#12
34
+ 0xB7,#13
35
+ 0xB9,#14
36
+ 0xBA,#15
37
+ 0xBB,#16
38
+ 0xBC,#17
39
+ 0xBD,#18
40
+ 0xBE,#19
41
+ 0xBF,#1A
42
+ 0xCB,#1B
43
+ 0xCD,#1C
44
+ 0xCE,#1D
45
+ 0xCF,#1E
46
+ 0xD3,#1F
47
+ 0xD6,#20
48
+ 0xD7,#21
49
+ 0xD9,#22
50
+ 0xDA,#23
51
+ 0xDB,#24
52
+ 0xDC,#25
53
+ 0xDD,#26
54
+ 0xDE,#27
55
+ 0xDF,#28
56
+ 0xE5,#29
57
+ 0xE6,#2A
58
+ 0xE7,#2B
59
+ 0xE9,#2C
60
+ 0xEA,#2D
61
+ 0xEB,#2E
62
+ 0xEC,#2F
63
+ 0xED,#30
64
+ 0xEE,#31
65
+ 0xEF,#32
66
+ 0xF2,#33
67
+ 0xF3,#34
68
+ 0xF4,#35
69
+ 0xF5,#36
70
+ 0xF6,#37
71
+ 0xF7,#38
72
+ 0xF9,#39
73
+ 0xFA,#3A
74
+ 0xFB,#3B
75
+ 0xFC,#3C
76
+ 0xFD,#3D
77
+ 0xFE,#3E
78
+ 0xFF,#3F
79
+ ]
80
+
81
+ TRACK_LENGTH=6656
82
+
83
+ def Nibbles.decode_4_4(bytes)
84
+ return((bytes[0] << 1) | 1) & bytes[1]
85
+ end
86
+
87
+ def Nibbles.make_dsk_from_nibbles(nibbles)
88
+ dsk=DSK.new()
89
+ 0.upto(0x22) {|track_no| set_dsk_sectors_for_nibbles_track(nibbles,dsk,track_no)}
90
+ dsk
91
+ end
92
+
93
+ def Nibbles.get_track(nibbles,track_no)
94
+ nibbles[track_no*TRACK_LENGTH..((track_no+1)*TRACK_LENGTH)-1]
95
+ end
96
+
97
+ def Nibbles.set_dsk_sectors_for_nibbles_track(nibbles,dsk,track_no)
98
+
99
+ sector_regex=/(\xD5.{8}[^D5]{1,20}\xFF+\xD5[^xD5]{348})/
100
+ track_nibbles=get_track(nibbles,track_no)
101
+ track_nibbles<<=track_nibbles[0..400]#wrap around one full sector
102
+ if DEBUG then
103
+ puts "#start track data"
104
+ track_nibbles.each_byte{|b| printf "%02X",b}
105
+ puts "# end track data"
106
+ end
107
+
108
+ sectors=track_nibbles.split(sector_regex)
109
+ sector_count=0
110
+ sector_has_been_read=[false]*16
111
+ sectors.each do |sector_nibbles|
112
+
113
+ if DEBUG then
114
+ puts "#start sector data"
115
+ sector_nibbles.each_byte{|b| printf "%02X",b}
116
+ puts "# end sector data"
117
+ end
118
+ next unless sector_nibbles=~/^\xFF*\xD5.*\xD5/
119
+
120
+ address_field,data_field=/\xFF*(\xD5.*)(\xD5.*)/.match(sector_nibbles).captures
121
+ address_field.each_byte{|b| printf "%02X",b} if DEBUG
122
+ vol_no=decode_4_4(address_field[3..4])
123
+ track_no=decode_4_4(address_field[5..6])
124
+ sector_no=decode_4_4(address_field[7..8])
125
+ next unless sector_no<16
126
+ next if sector_has_been_read[sector_no]
127
+ sector_has_been_read[sector_no]=true
128
+ sector_count+=1
129
+ if DEBUG then
130
+ puts "VOL #{vol_no} TRACK #{track_no} SECTOR #{sector_no}"
131
+ puts "#start data"
132
+ data_field.each_byte{|b| printf "%02X",b}
133
+ puts "# end data"
134
+ end
135
+ undecoded_data=data_field[3..345]
136
+ decoded_data='\0'*343
137
+ #algorithm taken from http://www.umich.edu/~archive/apple2/misc/hardware/disk.encoding.txt
138
+ checksum=0
139
+ 0.upto(341) do |i|
140
+ undecoded_byte=undecoded_data[i]
141
+ decoded_byte=DATA_TRANSLATE_TABLE.index(undecoded_byte)
142
+ decoded_byte=0 if decoded_byte.nil?
143
+ #raise "invalid nibble #{sprintf '%02X',undecoded_byte} at nibble #{i}, track #{track_no}, sector #{sector_no}" if decoded_byte.nil?
144
+ decoded_byte^=checksum
145
+ if i<86 then
146
+ destination_offset=341-i
147
+ else
148
+ destination_offset=i-86
149
+ end
150
+ decoded_data[destination_offset]=decoded_byte
151
+ checksum=decoded_byte
152
+ # puts "-- #{i} - #{checksum} #{sprintf '%-3x',destination_offset}"
153
+ end
154
+
155
+ #raise "invalid checksum #{checksum}" unless checksum==0
156
+
157
+ 0.upto(255) do |i|
158
+ decoded_data[i]<<=2
159
+
160
+ lower_2_bits=decoded_data[341-i%0x56]
161
+ case i/86
162
+ when 0 then
163
+ bit1=lower_2_bits&0x01
164
+ bit0=(lower_2_bits&0x02)>>1
165
+ when 1 then
166
+ bit1=(lower_2_bits&0x04)>>2
167
+ bit0=(lower_2_bits&0x08)>>3
168
+ when 2 then
169
+ bit1=(lower_2_bits&0x010)>>4
170
+ bit0=(lower_2_bits&0x20)>>5
171
+ end
172
+ printf "#{i} #{i/86} %08b #{bit0} #{bit1}\n",lower_2_bits if DEBUG
173
+ decoded_data[i]|=bit0
174
+ decoded_data[i]|=bit1<<1
175
+ end
176
+ logical_sector_no=INTERLEAVES[sector_no]
177
+ puts "mapping physical #{sprintf '%02X',sector_no} to logical #{sprintf '%02X',logical_sector_no}" if DEBUG
178
+ dsk.set_sector(track_no,logical_sector_no,decoded_data[0..255])
179
+ puts dsk.dump_sector(track_no,logical_sector_no) if DEBUG
180
+ end
181
+ # raise "expected 16 sectors but found #{sector_count} in track #{track_no}" unless sector_count==16
182
+ end
183
+ end
184
+
185
+
186
+ # == Author
187
+ # Jonno Downes (jonno@jamtronix.com)
188
+ #
189
+ # == Copyright
190
+ # Copyright (c) 2007 Jonno Downes (jonno@jamtronix.com)
191
+ #
192
+ #Permission is hereby granted, free of charge, to any person obtaining
193
+ #a copy of this software and associated documentation files (the
194
+ #"Software"), to deal in the Software without restriction, including
195
+ #without limitation the rights to use, copy, modify, merge, publish,
196
+ #distribute, sublicense, and/or sell copies of the Software, and to
197
+ #permit persons to whom the Software is furnished to do so, subject to
198
+ #the following conditions:
199
+
200
+ # The above copyright notice and this permission notice shall be
201
+ # included in all copies or substantial portions of the Software.
202
+
203
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
204
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
205
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
206
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
207
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
208
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
209
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
210
+
@@ -0,0 +1,120 @@
1
+ $:.unshift(File.dirname(__FILE__)) unless
2
+ $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
3
+
4
+ # Disk image with Pascal File System
5
+ #catalog will be at block 2.
6
+ #each entry consists of $1A bytes, which are:
7
+ #VOLUME HEADER
8
+ # 00..01 FIRST BLOCK (word)
9
+ # 02..03 LAST BLOCK+1 (word)
10
+ # 04 FILE TYPE (byte) = untypedfile,xdskfile,codefile,textfile,infofile,datafile,graffile,fotofile,securdir
11
+ # 05 FILLER
12
+ # 06 VOLUME NAME LENGTH (1 byte)
13
+ # 07..0D VOLUME NAME (17 bytes)
14
+ # 0E..0F VOLUME SIZE (WORD)
15
+ # 10 NUMBER OF FILES (BYTE)
16
+ # 11..1A FILLER
17
+ #
18
+ #FILES
19
+ # 00..01 FIRST BLOCK (word)
20
+ # 02..03 LAST BLOCK+1 (word)
21
+ # 04 FILE TYPE (byte) = untypedfile,xdskfile,codefile,textfile,infofile,datafile,graffile,fotofile,securdir
22
+ # 05 STATUS (byte)
23
+ # 06 FILENAME LENGTH (1 byte)
24
+ # 07..16 FILENAME (15 bytes)
25
+ # 17..18 BYTES IN LAST BLOCK (word)
26
+ # 19..1A FILE ACCESS DATE
27
+
28
+ require 'PascalFile'
29
+ class PascalDisk < DSK
30
+ attr_accessor :volume_name
31
+
32
+ def dump_catalog
33
+ s=""
34
+ files.each_value { |file|
35
+ s<< "#{sprintf('% 6d',file.contents.length)}\t #{file.file_type}\t#{file.filename}\n"
36
+ }
37
+ s
38
+ end
39
+
40
+
41
+ def initialize(file_bytes,sector_order)
42
+ super(file_bytes,sector_order)
43
+ self.read_catalog
44
+ end
45
+
46
+ def file_system
47
+ :pascal
48
+ end
49
+
50
+ #reads the catalog, and populate the "files" array with files
51
+ def read_catalog
52
+ catalog=get_block(2)
53
+ #we've read the first block in the catalog, now read the rest
54
+ catalog_size=catalog[2]
55
+ 3.upto(catalog_size-1) do |i|
56
+ catalog<<get_block(i)
57
+ end
58
+ # 06 VOLUME NAME LENGTH (1 byte)
59
+ # 07..0D VOLUME NAME (17 bytes)
60
+ # 0E..0F VOLUME SIZE (WORD)
61
+ # 10 NUMBER OF FILES (BYTE)
62
+ volume_name_length=catalog[6]
63
+ self.volume_name=catalog[7..6+volume_name_length]
64
+ files_in_volume=catalog[0x10]
65
+ #read in all the files
66
+
67
+ # 00..01 FIRST BLOCK (word)
68
+ # 02..03 LAST BLOCK+1 (word)
69
+ # 04 FILE TYPE (byte) = untypedfile,xdskfile,codefile,textfile,infofile,datafile,graffile,fotofile,securdir
70
+ # 05 STATUS (byte)
71
+ # 06 FILENAME LENGTH (1 byte)
72
+ # 07..15 FILENAME (15 bytes)
73
+ # 16..17 BYTES IN LAST BLOCK (word)
74
+ # 18.1A FILE ACCESS DATE
75
+ 1.upto(files_in_volume) do |file_no|
76
+ file_record=catalog[file_no*0x1a..(file_no*0x1a+0x19)]
77
+ first_block=file_record[0]+file_record[1]*0x100
78
+ first_block_in_next_file=file_record[2]+file_record[3]*0x100
79
+ last_block=first_block_in_next_file-1
80
+ file_type=file_record[4]
81
+ file_name_length=file_record[6]
82
+ file_name=file_record[7..6+file_name_length]
83
+ bytes_in_last_block=file_record[0x16]+file_record[0x17]*0x100
84
+ file_contents=""
85
+ first_block.upto(last_block) do |block_no|
86
+ this_block=get_block(block_no)
87
+ if block_no==last_block then
88
+ file_contents<<this_block[0..bytes_in_last_block-1]
89
+ else
90
+ file_contents<<this_block
91
+ end
92
+ files[file_name]=PascalFile.new(file_name,file_contents,file_type)
93
+ end
94
+ end
95
+ end
96
+ end
97
+ # == Author
98
+ # Jonno Downes (jonno@jamtronix.com)
99
+ #
100
+ # == Copyright
101
+ # Copyright (c) 2007 Jonno Downes (jonno@jamtronix.com)
102
+ #
103
+ #Permission is hereby granted, free of charge, to any person obtaining
104
+ #a copy of this software and associated documentation files (the
105
+ #"Software"), to deal in the Software without restriction, including
106
+ #without limitation the rights to use, copy, modify, merge, publish,
107
+ #distribute, sublicense, and/or sell copies of the Software, and to
108
+ #permit persons to whom the Software is furnished to do so, subject to
109
+ #the following conditions:
110
+
111
+ # The above copyright notice and this permission notice shall be
112
+ # included in all copies or substantial portions of the Software.
113
+
114
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
115
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
116
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
117
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
118
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
119
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
120
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,62 @@
1
+ $:.unshift(File.dirname(__FILE__)) unless
2
+ $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
3
+
4
+ require 'DSKFile'
5
+
6
+ #Pascal file
7
+ class PascalFile < DSKFile
8
+ attr_accessor :file_type
9
+
10
+ PASCAL_FILE_TYPES=[:untyped,:xdsk,:code,:text,:info,:data,:graf,:foto,:securedir]
11
+
12
+ def initialize(filename,contents,file_type)
13
+ raise "filename too long - #{filename}" unless filename.length<=15
14
+ @filename=filename
15
+ @contents=contents
16
+ @file_type=PASCAL_FILE_TYPES[file_type]
17
+ end
18
+
19
+ def to_s
20
+ s=""
21
+ @contents.each_byte{|b| s<<(b%0x80).chr.tr(0x0D.chr,"\n")}
22
+ s
23
+ end
24
+
25
+ def file_extension
26
+ return "."+@file_type.downcase
27
+ end
28
+
29
+ def can_be_picture?
30
+
31
+ file_type==:foto && HGR.can_be_hgr_screen?(@contents)
32
+ end
33
+
34
+ def to_png(pallete_mode=:amber)
35
+ HGR.buffer_to_png(@contents,pallete_mode)
36
+ end
37
+ end
38
+
39
+ # == Author
40
+ # Jonno Downes (jonno@jamtronix.com)
41
+ #
42
+ # == Copyright
43
+ # Copyright (c) 2007 Jonno Downes (jonno@jamtronix.com)
44
+ #
45
+ #Permission is hereby granted, free of charge, to any person obtaining
46
+ #a copy of this software and associated documentation files (the
47
+ #"Software"), to deal in the Software without restriction, including
48
+ #without limitation the rights to use, copy, modify, merge, publish,
49
+ #distribute, sublicense, and/or sell copies of the Software, and to
50
+ #permit persons to whom the Software is furnished to do so, subject to
51
+ #the following conditions:
52
+
53
+ # The above copyright notice and this permission notice shall be
54
+ # included in all copies or substantial portions of the Software.
55
+
56
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
57
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
58
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
59
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
60
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
61
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
62
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,197 @@
1
+ $:.unshift(File.dirname(__FILE__)) unless
2
+ $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
3
+
4
+ require 'ProDOSFile'
5
+ # Disk image in ProDOS format
6
+ # for now, assumes 'ProDOS order'
7
+ class ProDOSDisk < DSK
8
+ attr_accessor :volume_name
9
+
10
+ #what is the last block on this disk?
11
+ def last_block
12
+ (self.track_count*8)-1
13
+ end
14
+ def dump_catalog
15
+ s=""
16
+ files.keys.sort.each { |file_name|
17
+ file=files[file_name]
18
+ s<< "#{sprintf('% 6d',file.contents.length)}\t #{file.file_type} : $#{sprintf '%X',file.aux_type}\t#{file_name}\n"
19
+ }
20
+ s
21
+ end
22
+
23
+ def initialize(file_bytes,sector_order)
24
+ super(file_bytes,sector_order)
25
+ self.read_catalog
26
+ end
27
+
28
+ def file_system
29
+ :prodos
30
+ end
31
+
32
+
33
+ #concatenate all the blocks in the volume directory
34
+ #Volume Directory format is: (from "Beneath Apple ProDOS pp 4-10 - 4-12)
35
+ # FOR VOLUMES
36
+ # $00 STORAGE_TYPE/NAME_LENGTH
37
+ # $01-$0F FILE_NAME
38
+ # $10 RESERVED
39
+ # $11-$12 RESERVED
40
+ # $13-$14 RESERVED
41
+ # $15-$17 RESERVED
42
+ # $18-$1B CREATION
43
+ # $1C VERSION
44
+ # $1D MIN_VERSION
45
+ # $1E ACCESS
46
+ # $1F ENTRY_LENGTH
47
+ # $20 ENTRIES_PER_BLOCK
48
+ # $21-$22 FILE_COUNT
49
+ # $23-$24 BIT_MAP_POINTER
50
+ # $25-$26 TOTAL_BLOCKS
51
+ #
52
+ # FOR FILES
53
+ # $00 STORAGE_TYPE/NAME_LENGTH
54
+ # $01-$0F FILE_NAME
55
+ # $10 FILE_TYPE
56
+ # $11-$12 KEY_POINTER
57
+ # $13-$14 BLOCKS_USED
58
+ # $15-$17 EOF
59
+ # $18-$1B CREATION
60
+ # $1C VERSION
61
+ # $1D MIN_VERSION
62
+ # $1E ACCESS
63
+ # $1F-$20 AUX_TYPE
64
+ # $21-$24 LAST_MOD
65
+ # $25-$26 HEADER_POINTER
66
+
67
+ def dump_block(block_no)
68
+ s=hline
69
+ s<<sprintf("BLOCK %03d\n",block_no)
70
+ s<< "\t"
71
+ block_data=get_block(block_no)
72
+ (0..15).each {|x| s<<sprintf("%02X ",x) }
73
+ s<<"\n"
74
+ s<<hline
75
+ (0..31).each {|line_number|
76
+ lhs=""
77
+ rhs=""
78
+ start_byte=line_number*16
79
+ line=block_data[start_byte..start_byte+15]
80
+ line.each_byte {|byte|
81
+ lhs<< sprintf("%02X ", byte)
82
+ rhs<< (byte%128).chr.sub(/[\x00-\x1f]/,'.')
83
+ }
84
+ s<<sprintf("%03X\t%s %s\n",start_byte,lhs,rhs)
85
+ }
86
+ s
87
+ end
88
+
89
+ def read_catalog(starting_block=2,dir_path="")
90
+ next_block_no=starting_block
91
+ while (next_block_no!=0)
92
+ block=get_block(next_block_no)
93
+ offset=4
94
+ while (offset<(0x200-0x27))
95
+ directory_entry=block[offset..offset+0x27]
96
+ storage_type=directory_entry[0]>>4
97
+ name_length=directory_entry[0]%0x10
98
+ name=directory_entry[1..name_length]
99
+ file_type=directory_entry[0x10]
100
+ key_pointer=directory_entry[0x11]+directory_entry[0x12]*0x100
101
+ blocks_used=directory_entry[0x13]+directory_entry[0x14]*0x100
102
+ file_length=directory_entry[0x15]+directory_entry[0x16]*0x100+directory_entry[0x17]*0x10000
103
+ aux_type=directory_entry[0x1f]+directory_entry[0x20]*0x100
104
+ case storage_type
105
+ when 0x00 then
106
+ #nop
107
+ when 0x01 then #it's a seedling
108
+ file_contents=get_block(key_pointer)
109
+ files[name]=ProDOSFile.new(name,file_contents,file_type,aux_type)
110
+ when 0x02 then #it's a sapling
111
+ block_list=[]
112
+ index_block=get_block(key_pointer)
113
+ 0.upto((file_length/0x200)) do |i|
114
+ block_list<<index_block[i]+(index_block[i+0x100]*0x100)
115
+ end
116
+ file_contents=""
117
+ block_list.each do |next_block_no|
118
+ if next_block_no==0 then
119
+ file_contents+="\x00"*0x200
120
+ elsif next_block_no>=self.last_block then
121
+ STDERR<<"file #{name} attempted to read bad block # #{next_block_no}\n"
122
+ file_contents+="\x00"*0x200
123
+ else
124
+ file_contents+=get_block(next_block_no)
125
+ end
126
+ end
127
+ file_contents=file_contents[0..file_length-1]
128
+ files["#{dir_path}#{name}"]=ProDOSFile.new(name,file_contents,file_type,aux_type)
129
+ when 0x03 then #it's a tree
130
+ master_index_block=get_block(key_pointer)
131
+ block_list=[]
132
+ number_of_index_entries=1+(file_length/0x200)
133
+ number_of_index_blocks=1+(number_of_index_entries/0x100)
134
+ number_of_index_entries_in_last_block=number_of_index_entries-(number_of_index_blocks-1)*0x100
135
+ 0.upto(number_of_index_blocks-1) do |i|
136
+ index_block_no=master_index_block[i]+master_index_block[i+0x100]*0x100
137
+ index_block=get_block(index_block_no)
138
+ if i==number_of_index_blocks-1 then
139
+ entries_in_this_index_block=number_of_index_entries_in_last_block
140
+ else
141
+ entries_in_this_index_block=256
142
+ end
143
+ 0.upto(entries_in_this_index_block-1) do |j|
144
+ block_list<<index_block[j]+(index_block[j+0x100]*0x100)
145
+ end
146
+ end
147
+ file_contents=""
148
+ block_list.each do |next_block_no|
149
+ if next_block_no==0 then
150
+ file_contents+="\x00"*0x200
151
+ else
152
+ file_contents+=get_block(next_block_no)
153
+ end
154
+ end
155
+ file_contents=file_contents[0..file_length-1]
156
+ files["#{dir_path}#{name}"]=ProDOSFile.new(name,file_contents,file_type,aux_type)
157
+ when 0x0D then #it's a subdirectory pointer
158
+ read_catalog(key_pointer,"#{dir_path}#{name}/")
159
+ when 0x0E then #it's a subdirectory header
160
+ #do nothing
161
+ when 0x0F then #it's a volume
162
+ @volume_name=name
163
+ else
164
+ # raise "unknown storage_type #{sprintf '%02X',storage_type}"
165
+ puts "skipping unknown storage_type #{sprintf '%02X',storage_type} for #{dir_path}#{name}"
166
+ end
167
+ offset+=0x27
168
+ end
169
+ next_block_no=block[2]+block[3]*256
170
+ end
171
+ end
172
+
173
+ end
174
+ # == Author
175
+ # Jonno Downes (jonno@jamtronix.com)
176
+ #
177
+ # == Copyright
178
+ # Copyright (c) 2007 Jonno Downes (jonno@jamtronix.com)
179
+ #
180
+ #Permission is hereby granted, free of charge, to any person obtaining
181
+ #a copy of this software and associated documentation files (the
182
+ #"Software"), to deal in the Software without restriction, including
183
+ #without limitation the rights to use, copy, modify, merge, publish,
184
+ #distribute, sublicense, and/or sell copies of the Software, and to
185
+ #permit persons to whom the Software is furnished to do so, subject to
186
+ #the following conditions:
187
+
188
+ # The above copyright notice and this permission notice shall be
189
+ # included in all copies or substantial portions of the Software.
190
+
191
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
192
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
193
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
194
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
195
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
196
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
197
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.