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/bin/dskexplorer.rb CHANGED
@@ -37,7 +37,7 @@ opts.on("-p","--port PORT_NUMBER",Integer) {|val| @listening_port=val%0xFFFF}
37
37
  opts.on("-r","--root ROOT_DIR",String) {|val| @@root_directory=val}
38
38
 
39
39
  filename=opts.parse(ARGV)[0] rescue RDoc::usage_from_file(__FILE__,'Usage')
40
- @@root_directory=File.expand_path(@@root_directory)
40
+ @@root_directory=File.expand_path(@@root_directory) unless @@root_directory=~/^http[s]?:/
41
41
  require 'webrick'
42
42
  require 'DSK'
43
43
  include WEBrick
@@ -0,0 +1,365 @@
1
+ #!/usr/bin/ruby
2
+ # dskexplorer.rb
3
+ #
4
+ # == Synopsis
5
+ # A web-based DSK file explorer
6
+ #
7
+ # == Usage
8
+ # dskexplorer.rb [switches]
9
+ #
10
+ # -h | --help display this message
11
+ # -p | --port PORT_NUMBER port number to listen on (default is 6502)
12
+ # -r | --root ROOT_DIR root directory to explore from (default is current directory)
13
+ # -v | --version show version number
14
+ #
15
+ # Examples
16
+ # dskexplorer.rb -r http://www.apple2.org.za/mirrors/
17
+ # dskexplorer.rb -r c:\downloads\apple2\ -p 8080
18
+
19
+
20
+ #make sure the relevant folder with our libraries is in the require path
21
+ lib_path=File.expand_path(File.dirname(__FILE__)+"//..//lib")
22
+ $:.unshift(lib_path) unless $:.include?(lib_path)
23
+
24
+ require 'optparse'
25
+ require 'rdoc_patch' #RDoc::usage patched to work under gem executables
26
+ dskexplorer_VERSION="0.1.0"
27
+
28
+ @listening_port=6502
29
+ @@root_directory="."
30
+ opts=OptionParser.new
31
+ opts.on("-h","--help") {RDoc::usage_from_file(__FILE__)}
32
+ opts.on("-v","--version") do
33
+ puts File.basename($0)+" "+dskexplorer_VERSION
34
+ exit
35
+ end
36
+ opts.on("-p","--port PORT_NUMBER",Integer) {|val| @listening_port=val%0xFFFF}
37
+ opts.on("-r","--root ROOT_DIR",String) {|val| @@root_directory=val}
38
+
39
+ filename=opts.parse(ARGV)[0] rescue RDoc::usage_from_file(__FILE__,'Usage')
40
+
41
+ require 'webrick'
42
+ require 'DSK'
43
+ include WEBrick
44
+
45
+ @@uri_cache={}
46
+ @@dsk_cache={}
47
+ def get_uri_from_cache(uri)
48
+ if @@uri_cache[uri].nil? then
49
+ @@uri_cache[uri]=open(uri).read
50
+ end
51
+ @@uri_cache[uri]
52
+ end
53
+
54
+ def get_dsk_from_cache(uri)
55
+ if @@dsk_cache[uri].nil? then
56
+ @@dsk_cache[uri]=DSK.read(uri)
57
+ end
58
+ @@dsk_cache[uri]
59
+ end
60
+
61
+ def common_header
62
+ "
63
+ <html>
64
+ <body>
65
+ <B>DSK Explorer</b><br>
66
+ "
67
+ end
68
+ def common_footer
69
+ "
70
+ <p><i>this is alpha software - please send feedback using the <a href=http://rubyforge.org/tracker/?group_id=3844> dsktool.rb forum</a><p>
71
+ "
72
+ end
73
+
74
+ def root_dir_is_website?
75
+ require 'hpricot'
76
+ require 'open-uri'
77
+ @@root_directory=~/^http[s]?:/?true : false
78
+ end
79
+ def make_absolute_path(relative_path)
80
+ if root_dir_is_website? then
81
+ @@root_directory+uri_encode(relative_path)
82
+ else
83
+ @@root_directory+relative_path
84
+ end
85
+ end
86
+
87
+ def html_escape(s)
88
+ s.gsub("&","&amp;").gsub("<","&lt;")
89
+ end
90
+ def uri_encode(s)
91
+ #standard URI.escape appears to miss some important characters
92
+ require 'uri'
93
+ URI.escape(s).gsub("[","%5b").gsub("]","%5d")
94
+ end
95
+ def get_directories_and_files(relative_path)
96
+ directories=[]
97
+ dsk_files=[]
98
+ absolute_path=make_absolute_path(relative_path)
99
+ if root_dir_is_website? then
100
+ html=get_uri_from_cache(absolute_path)
101
+ doc=Hpricot(html)
102
+ doc.search("a[@href]").each do |a|
103
+ href=URI.unescape(a.attributes["href"])
104
+ if (href=~/\w\/$/)
105
+ if !(href=~/^\//) then #directories end with a /, but skip absolute paths
106
+ directories<<(href)
107
+ end
108
+ elsif DSK.is_dsk_file?(href) then
109
+ dsk_files<<(href)
110
+ end
111
+ end
112
+ else
113
+ if File.exist?(absolute_path) && (File.stat(absolute_path).directory?) then
114
+ dir=Dir.new(absolute_path)
115
+ dir.each do |f|
116
+ directories<<f if (f[0].chr!=".") && (File.stat(absolute_path+"/"+f).directory?)
117
+ dsk_files<<f if (DSK.is_dsk_file?(f))
118
+ end
119
+ end
120
+ end
121
+ [directories,dsk_files]
122
+ end
123
+
124
+ def make_navigation_path(relative_path,filename=nil,display_mode=nil)
125
+ path_parts=relative_path.split("/")
126
+ #make the cookie-crumb-trail
127
+ partial_path=""
128
+ s="<a href=/dir/>#{@@root_directory}</a>"
129
+ path_parts.each do |p|
130
+ if p.length>0 then
131
+ partial_path+="/#{p}"
132
+ if DSK.is_dsk_file?(partial_path) then
133
+ s<<"/<a href=/catalog#{uri_encode(partial_path)}>#{p}</a>"
134
+ else
135
+ s<<"/<a href=/dir#{uri_encode(partial_path)}>#{p}</a>"
136
+ end
137
+ end
138
+ end
139
+
140
+ mode_param=""
141
+ if !display_mode.nil? then
142
+ mode_param="&mode=#{display_mode}"
143
+ end
144
+ if !filename.nil? then
145
+ s<<"/<a href=/showfile/#{uri_encode(relative_path)+'?filename='+uri_encode(filename)}#{mode_param}>#{filename}</a>"
146
+ end
147
+
148
+
149
+ #show the contents of the current directory
150
+ directories,dsk_files=get_directories_and_files(relative_path)
151
+
152
+ #list out the directories
153
+
154
+ s<<"<ul>"
155
+ #s<<"<li>[dir] <a href=/#{uri_encode('/dir/'+File.dirname(relative_path))}>..</a>\n"
156
+ directories.sort.each do |d|
157
+ s<<"<li>[dir] <a href=/dir/#{uri_encode(relative_path)}/#{uri_encode(d)}>#{d}</a>\n"
158
+ end
159
+
160
+ #list out the DSK files
161
+ dsk_files.sort.each do |f|
162
+ s<<"<li>[dsk] <a href=/catalog/#{uri_encode(relative_path)}/#{uri_encode(f)}>#{f}</a> [ <a href=#{uri_encode(@@root_directory+relative_path+'/'+f)}>download</a> ]\n"
163
+ end
164
+ s<<"</ul>"
165
+
166
+ s
167
+ end
168
+ def make_catalog(relative_path)
169
+ s="<p>"
170
+ begin
171
+ absolute_path=make_absolute_path(relative_path)
172
+ dsk=get_dsk_from_cache(absolute_path)
173
+ s<<"<br>file system: #{dsk.file_system}<br>sector order: #{dsk.sector_order}<br>tracks: #{dsk.track_count}<br>"
174
+ if (dsk.respond_to?(:files)) then
175
+ s<<"<table>\n<th>TYPE</th><th>SIZE (BYTES)</th><th>NAME</th></tr>\n"
176
+ dsk.files.keys.sort.each do |full_path|
177
+ f=dsk.files[full_path]
178
+ display_url="/showfile/#{uri_encode(relative_path)+'?filename='+uri_encode(full_path)}"
179
+ if f.respond_to?(:file_type) then
180
+ s<<"<td>#{f.file_type}</td>"
181
+ else
182
+ s<<"<td></td>"
183
+ end
184
+ s<<"<td>#{sprintf('%03d',f.contents.length)}</td>"
185
+ s<<"<td>#{full_path}</td>"
186
+ s<<"<td><a href=#{display_url}&mode=hex>hex dump</a></td>"
187
+ if f.can_be_picture? then
188
+ s<<"<td><a href=#{display_url}&mode=png>picture</a></td>"
189
+ elsif f.respond_to?(:disassembly)
190
+ s<<"<td><a href=#{display_url}&mode=list>disassembly</a></td>"
191
+ else
192
+ s<<"<td><a href=#{display_url}&mode=text>text</a></td>"
193
+ end
194
+ s<<"</tr>\n"
195
+ end
196
+ s<<"</table>"
197
+ else
198
+ s<<"<i>not a recognised format</i>"
199
+ end
200
+ s<<"<p><a href=/showsector/#{uri_encode(relative_path)}>View Sectors</a>"
201
+ rescue Exception => exception
202
+ s<<"<i>ERROR:#{exception}</i>"
203
+ end
204
+ s
205
+ end
206
+ def show_sector(relative_path,track,sector)
207
+ track="0" if track.nil?
208
+ sector="0" if sector.nil?
209
+ track=("0"+track).to_i
210
+ sector=("0"+sector).to_i
211
+ absolute_path=make_absolute_path(relative_path)
212
+ dsk=get_dsk_from_cache(absolute_path)
213
+ uri="/showsector/#{uri_encode(relative_path)}"
214
+ s=""
215
+ s<<"<table><tr><th colspan=16>TRACK</th></tr>"
216
+ s<<"<tr>"
217
+ 0.upto(dsk.track_count-1) do |track_no|
218
+ if track_no==track then
219
+ s<<"<td><b>$#{sprintf('%02X',track)}</b></td>"
220
+ else
221
+ s<<"<td><a href=#{uri}?track=#{track_no}&sector=0>$#{sprintf('%02X',track_no)}</a></td>"
222
+ end
223
+ if track_no>0 && track_no%0x10==0 then
224
+ s<<"</tr></tr>"
225
+ end
226
+ end
227
+ s<<"</tr>"
228
+ s<<"</table>"
229
+
230
+ s<<"<table><tr><th colspan=16>SECTOR</th></tr>"
231
+ s<<"<tr>"
232
+ 0.upto(0x0F) do |sector_no|
233
+ if sector_no==sector then
234
+ s<<"<td><b>$#{sprintf('%02X',sector)}</b></td>"
235
+ else
236
+ s<<"<td><a href=#{uri}?track=#{track}&sector=#{sector_no}>$#{sprintf('%02X',sector_no)}</a></td>"
237
+ end
238
+ end
239
+ s<<"</tr>"
240
+ s<<"</table>"
241
+
242
+
243
+ s<<"<pre>\n"
244
+ s<<html_escape(dsk.dump_sector(track,sector))
245
+ s<<"</pre>\n"
246
+ s<<"<p>"
247
+ s<<"<pre>\n"
248
+ s<<html_escape(dsk.disassemble_sector(track,sector))
249
+ s<<"</pre>\n"
250
+
251
+ end
252
+
253
+ def show_file(relative_path,filename,display_mode)
254
+ absolute_path=make_absolute_path(relative_path)
255
+ dsk=get_dsk_from_cache(absolute_path)
256
+ file=dsk.files[filename]
257
+ if file.nil? then
258
+ s="<i>#{filename} not found</i>"
259
+ else
260
+ s="<hl><pre>"
261
+ if display_mode=="hex" then
262
+ s<<html_escape(file.hex_dump)
263
+ elsif display_mode=="list" && file.respond_to?(:disassembly) then
264
+ s<<html_escape(file.disassembly)
265
+ elsif display_mode=="png" && file.respond_to?(:to_png) then
266
+ png_url="/png/#{uri_encode(relative_path)}?filename=#{uri_encode(filename)}"
267
+ s<<"<IMG SRC=#{png_url} HEIGHT=384 WIDTH=560>"
268
+ else
269
+ s<< (file.to_s)
270
+ end
271
+ s<<"\n</pre><hl>"
272
+ end
273
+ s
274
+ end
275
+
276
+ class DirectoryServlet < HTTPServlet::AbstractServlet
277
+ def do_GET(req,res)
278
+ relative_path=URI.unescape(req.path).sub(/^\/dir/,"")
279
+ res['Content-Type']="text/html"
280
+ res.body=common_header+make_navigation_path(relative_path)+common_footer
281
+ end
282
+ end
283
+
284
+ class CatalogServlet < HTTPServlet::AbstractServlet
285
+ def do_GET(req,res)
286
+ relative_path=URI.unescape(req.path).sub(/^\/catalog/,"")
287
+ res['Content-Type']="text/html"
288
+ res.body=common_header+make_navigation_path(relative_path)+make_catalog(relative_path)+common_footer
289
+ end
290
+ end
291
+
292
+ class ShowFileServlet < HTTPServlet::AbstractServlet
293
+ def do_GET(req,res)
294
+ relative_path=URI.unescape(req.path).sub(/^\/showfile/,"")
295
+ filename=URI.unescape(req.query['filename'])
296
+ display_mode=req.query['mode']
297
+ res['Content-Type']="text/html"
298
+ res.body=common_header+make_navigation_path(relative_path,filename,display_mode)+show_file(relative_path,filename,display_mode)+common_footer
299
+ end
300
+ end
301
+
302
+ class ShowPNGServlet < HTTPServlet::AbstractServlet
303
+ def do_GET(req,res)
304
+ relative_path=URI.unescape(req.path).sub(/^\/png/,"")
305
+ filename=URI.unescape(req.query['filename'])
306
+ pallete_mode=req.query['pallete_mode']
307
+ pallete_mode=:"#{pallete_mode}" unless pallete_mode.nil? #convert string to symbol
308
+ absolute_path=make_absolute_path(relative_path)
309
+ dsk=get_dsk_from_cache(absolute_path)
310
+ file=dsk.files[filename]
311
+ res['Content-Type']="image/png"
312
+ res.body=file.to_png(pallete_mode)
313
+ end
314
+ end
315
+ class ShowSectorServlet < HTTPServlet::AbstractServlet
316
+ def do_GET(req,res)
317
+ relative_path=URI.unescape(req.path).sub(/^\/showsector/,"")
318
+ track=req.query['track']
319
+ sector=req.query['sector']
320
+ res['Content-Type']="text/html"
321
+ res.body=common_header+make_navigation_path(relative_path)+show_sector(relative_path,track,sector)+common_footer
322
+ end
323
+ end
324
+
325
+
326
+ s=HTTPServer.new(
327
+ :Port=>@listening_port
328
+ )
329
+ trap("INT") {s.shutdown}
330
+
331
+ s.mount("/dir",DirectoryServlet)
332
+ s.mount("/catalog",CatalogServlet)
333
+ s.mount("/showfile",ShowFileServlet)
334
+ s.mount("/showsector",ShowSectorServlet)
335
+ s.mount("/png",ShowPNGServlet)
336
+ #default page - for now, just redirect to the default dir page
337
+ s.mount("/",DirectoryServlet)
338
+
339
+ puts "point your browser at http://localhost:#{@listening_port}/"
340
+ s.start
341
+
342
+ # == Author
343
+ # Jonno Downes (jonno@jamtronix.com)
344
+ #
345
+ # == Copyright
346
+ # Copyright (c) 2007 Jonno Downes (jonno@jamtronix.com)
347
+ #
348
+ #Permission is hereby granted, free of charge, to any person obtaining
349
+ #a copy of this software and associated documentation files (the
350
+ #"Software"), to deal in the Software without restriction, including
351
+ #without limitation the rights to use, copy, modify, merge, publish,
352
+ #distribute, sublicense, and/or sell copies of the Software, and to
353
+ #permit persons to whom the Software is furnished to do so, subject to
354
+ #the following conditions:
355
+ #
356
+ # The above copyright notice and this permission notice shall be
357
+ # included in all copies or substantial portions of the Software.
358
+ #
359
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
360
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
361
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
362
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
363
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
364
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
365
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/bin/dsktool.rb CHANGED
@@ -10,6 +10,7 @@
10
10
  #
11
11
  # dsktool.rb [switches] <filename.dsk>
12
12
  # -a | --add FILENAME (*) add file
13
+ # -A | --ascii force output to be ASCII (even if binary)
13
14
  # -b | --base BASE use BASE as address to load Binary File
14
15
  # this will add 2 bytes to the start of file
15
16
  # BASE should be a hex number
@@ -26,7 +27,7 @@
26
27
  # -h | --help display this message
27
28
  # -I | --init FILESYSTEM initialise the disk with the specified filesytem
28
29
  # DSK will be created if it doesn't exist.
29
- # FILESYSTEM can be : prodos,dos33,nadol,pascal,none
30
+ # FILESYSTEM can be : cpm,dos33,nadol,pascal,none
30
31
  # -l | --list FILENAME monitor style listing (disassembles 65C02 opcodes)
31
32
  # -o | --output FILENAME specify name to save extracted file as
32
33
  # -r | --raw don't convert files to ASCII
@@ -43,6 +44,7 @@
43
44
  #
44
45
  # Currently supported filesystems:
45
46
  # Apple Pascal (read only)
47
+ # CP/M (READ/WRITE)
46
48
  # DOS 3.3 (READ/WRITE)
47
49
  # NADOL (READ/WRITE)
48
50
  # ProDOS 8 (read only)
@@ -60,10 +62,10 @@
60
62
  # dsktool.rb --add STARTUP -T nadol.po
61
63
  # dsktool.rb --add c:\src\dosdemo\a.out -t B -b $2000 dosdemo.dsk
62
64
  # dsktool.rb --init dos33 new_dos_disk.dsk.gz
63
- # dsktool.rb --I none -B /tmp/a.out demo1.dsk
65
+ # dsktool.rb -I none -B /tmp/a.out demo1.dsk
64
66
 
65
67
 
66
- DSKTOOL_VERSION="0.4.2"
68
+ DSKTOOL_VERSION="0.5.1"
67
69
 
68
70
  #make sure the relevant folder with our libraries is in the require path
69
71
  lib_path=File.expand_path(File.dirname(__FILE__)+"//..//lib")
@@ -93,6 +95,7 @@ opts.on("-v","--version") do
93
95
  exit
94
96
  end
95
97
  opts.on("-r","--raw") {extract_mode=:raw}
98
+ opts.on("-A","--ascii") {extract_mode=:ascii}
96
99
  opts.on("-c","--catalog") {catalog=true}
97
100
  opts.on("-D","--diskdump") {diskdump=true}
98
101
  opts.on("-x","--explode") {explode=true}
@@ -211,6 +214,7 @@ begin #to wrap a rescue clause
211
214
  output_file<< case extract_mode
212
215
  when :raw then file.contents
213
216
  when :hex then file.hex_dump
217
+ when :ascii then file.to_ascii
214
218
  when :list then
215
219
  if file.respond_to?(:disassembly)
216
220
  file.disassembly
data/bin/dsktool.rb~ ADDED
@@ -0,0 +1,173 @@
1
+ #!/usr/bin/env ruby
2
+ # dsktool.rb
3
+ #
4
+ # == Synopsis
5
+ #
6
+ # Manipulate DSK format files (as used by Apple 2 emulators)
7
+ #
8
+ # == Usage
9
+ #
10
+ # dsktool.rb [switches] <filename.dsk>
11
+ # -c | --catalog display catalog
12
+ # -e | --extract FILENAME extract file by name (either to stdout,
13
+ # or file specified by --output)
14
+ # -h | --help display this message
15
+ # -d | --dump FILENAME hex dump
16
+ # -D | --diskdump hex dump of entire disk
17
+ # -l | --list FILENAME monitor style listing (disassembles 65C02 opcodes)
18
+ # -o | --output FILENAME specify name to save extracted file as
19
+ # -r | --raw don't convert files to ASCII
20
+ # -v | --version show version number
21
+ # -x | --explode extract all files
22
+ #
23
+ # Currently supported filesystems:
24
+ # Apple Pascal
25
+ # DOS 3.3
26
+ # NADOL
27
+ # ProDOS 8
28
+ # Supports 16 sector DSK images
29
+ # Will uncompress gzipped files (with extension .gz)
30
+ # input files can be URLs
31
+ #
32
+ # examples:
33
+ # dsktool.rb -c DOS3MASTR.dsk.gz
34
+ # dsktool.rb -l FID DOS3MASTR.dsk
35
+ # dsktool.rb --list fid -o fid.lst DOS3MASTR.dsk
36
+ # dsktool.rb --extract "COLOR DEMOSOFT" DOS3MASTR.dsk
37
+ # dsktool.rb -e HELLO -o HELLO.bas DOS3MASTR.dsk
38
+ # dsktool.rb -x DOS3MASTR.dsk.gz
39
+ # dsktool.rb -x DOS3MASTR.dsk.gz -o /tmp/DOS3MASTR/
40
+ # dsktool.rb -c http://jamtronix.com/dsks/apshai.dsk.gz
41
+
42
+ DSKTOOL_VERSION="0.3.1"
43
+
44
+ #make sure the relevant folder with our libraries is in the require path
45
+ lib_path=File.expand_path(File.dirname(__FILE__)+"//..//lib")
46
+ $:.unshift(lib_path) unless $:.include?(lib_path)
47
+ require 'rubygems'
48
+ require 'optparse'
49
+ require 'rdoc_patch' #RDoc::usage patched to work under gem executables
50
+
51
+ catalog=false
52
+ explode=false
53
+ diskdump=false
54
+ output_filename=nil
55
+ extract_filename=nil
56
+ extract_mode=:default
57
+ explode_directory=nil
58
+ opts=OptionParser.new
59
+ opts.on("-h","--help") {RDoc::usage_from_file(__FILE__)}
60
+ opts.on("-v","--version") do
61
+ puts File.basename($0)+" "+DSKTOOL_VERSION
62
+ exit
63
+ end
64
+ opts.on("-r","--") {extract_mode=:raw}
65
+ opts.on("-c","--catalog") {catalog=true}
66
+ opts.on("-D","--diskdump") {diskdump=true}
67
+ opts.on("-x","--explode") {explode=true}
68
+ opts.on("-l","--list FILENAME",String) do |val|
69
+ extract_filename=val.upcase
70
+ extract_mode=:list
71
+ end
72
+ opts.on("-d","--dump FILENAME",String) do |val|
73
+ extract_filename=val.upcase
74
+ extract_mode=:hex
75
+ end
76
+ opts.on("-e","--extract FILENAME",String) {|val| extract_filename=val.upcase}
77
+ opts.on("-o","--output FILENAME",String) {|val| output_filename=val}
78
+ filename=opts.parse(ARGV)[0] rescue RDoc::usage_from_file(__FILE__,'Usage')
79
+ RDoc::usage_from_file(__FILE__,'Usage') if (filename.nil?)
80
+
81
+
82
+ require 'DSK'
83
+ begin
84
+ dsk=DSK.read(filename)
85
+ rescue Exception e
86
+ #if we run dsktool.rb in a batch or shell file iterating over a bunch of dsk files, we may not know what file
87
+ #has the error
88
+ STDERR << "error while parsing #{filename}\n"
89
+ raise
90
+ end
91
+ output_file= case
92
+ when (output_filename.nil?) || (explode) then STDOUT
93
+ else File.open(output_filename,"wb")
94
+ end
95
+
96
+ puts "#{filename}\nsector order:\t#{dsk.sector_order}\nfilesystem:\t#{dsk.file_system}"
97
+ if (dsk.respond_to?(:volume_name)) then
98
+ puts "volume name:\t#{dsk.volume_name}"
99
+ end
100
+ if (diskdump) then
101
+ puts dsk.hex_dump
102
+ end
103
+
104
+ if(catalog) then
105
+ if (dsk.respond_to?(:dump_catalog)) then
106
+ puts dsk.dump_catalog
107
+ else
108
+ puts "#{filename} does not have a recognised file system"
109
+ end
110
+ end
111
+
112
+ if(explode) then
113
+ output_dir=output_filename.nil??File.basename(filename,".*"):output_filename
114
+ if !(File.exists?(output_dir)) then
115
+ Dir.mkdir(output_dir)
116
+ end
117
+
118
+ dsk.files.each_value do |f|
119
+ if (extract_mode==:raw) then
120
+ output_filename=output_dir+"/"+f.filename+".raw"
121
+ File.open(output_filename,"wb") <<f.contents
122
+ else
123
+ output_filename=output_dir+"/"+f.filename+f.file_extension
124
+ File.open(output_filename,"wb") <<f
125
+ end
126
+ end
127
+ end
128
+
129
+
130
+ if (!extract_filename.nil?) then
131
+ file=dsk.files[extract_filename]
132
+ if file.nil? then
133
+ puts "'#{extract_filename}' not found in #{filename}"
134
+ else
135
+ output_file<< case extract_mode
136
+ when :raw then file.contents
137
+ when :hex then file.hex_dump
138
+ when :list then
139
+ if file.respond_to?(:disassembly)
140
+ file.disassembly
141
+ else
142
+ puts "'#{extract_filename}' is not a binary file"
143
+ exit
144
+ end
145
+ else file.to_s
146
+ end
147
+ end
148
+ end
149
+
150
+ # == Author
151
+ # Jonno Downes (jonno@jamtronix.com)
152
+ #
153
+ # == Copyright
154
+ # Copyright (c) 2007 Jonno Downes (jonno@jamtronix.com)
155
+ #
156
+ #Permission is hereby granted, free of charge, to any person obtaining
157
+ #a copy of this software and associated documentation files (the
158
+ #"Software"), to deal in the Software without restriction, including
159
+ #without limitation the rights to use, copy, modify, merge, publish,
160
+ #distribute, sublicense, and/or sell copies of the Software, and to
161
+ #permit persons to whom the Software is furnished to do so, subject to
162
+ #the following conditions:
163
+ #
164
+ # The above copyright notice and this permission notice shall be
165
+ # included in all copies or substantial portions of the Software.
166
+ #
167
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
168
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
169
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
170
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
171
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
172
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
173
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.