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/DSK.rb CHANGED
@@ -10,12 +10,12 @@ require 'open-uri'
10
10
  #
11
11
  class DSK
12
12
 
13
- FILE_SYSTEMS=[:prodos,:dos33,:nadol,:pascal,:unknown,:none]
13
+ FILE_SYSTEMS=[:prodos,:dos33,:nadol,:cpm,:pascal,:modified_dos,:unknown,:none]
14
14
  SECTOR_ORDERS=[:physical,:dos]
15
- DSK_IMAGE_EXTENSIONS=[".dsk",".po",".do",".hdv"]
15
+ DSK_IMAGE_EXTENSIONS=[".dsk",".po",".do",".hdv",".nib"]
16
16
  INTERLEAVES={
17
17
  :physical=> [0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F],
18
- :dos=>[0x00,0x0E,0x0D,0x0C,0x0B,0x0A,0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x01,0x0F]
18
+ :dos=>[0x00,0x0E,0x0D,0x0C,0x0B,0x0A,0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x01,0x0F],
19
19
  }
20
20
 
21
21
  #does this filename have a suitable extension?
@@ -24,7 +24,8 @@ class DSK
24
24
  DSK_IMAGE_EXTENSIONS.include?(extension)
25
25
  end
26
26
  DSK_FILE_LENGTH=143360
27
- attr_accessor :file_bytes,:sector_order,:track_count
27
+ NIB_FILE_LENGTH=232960
28
+ attr_accessor :file_bytes,:sector_order,:track_count,:source_filename
28
29
 
29
30
  def file_system
30
31
  :unknown
@@ -63,12 +64,38 @@ class DSK
63
64
  (vtoc_sector[01]<=34) && (vtoc_sector[02]<=15) && (vtoc_sector[0x27]==0x7A) && (vtoc_sector[0x35]==0x10)
64
65
  end
65
66
 
67
+ def is_modified_dos?(vtoc_track_no,vtoc_sector_no)
68
+ vtoc_sector=get_sector(vtoc_track_no,vtoc_sector_no)
69
+ (vtoc_sector[01]<=34) && (vtoc_sector[02]<=15) && (vtoc_sector[0x27]==0x7A) && (vtoc_sector[0x35]==0x10)
70
+ end
71
+
66
72
  def is_nadol?(sector_order)
67
73
  #currently ignores sector order
68
74
  # track $00, sector $02 , bytes $11 - "NADOL"
69
75
  (@file_bytes[0x00211..0x00215]=="NADOL")
70
76
  end
71
77
 
78
+ def is_cpm?(sector_order)
79
+ #currently ignores sector order
80
+ #look for a valid looking CPM directory on track 3.
81
+ #go through each sector in order, for each sector, look at every 32nd byte, and see if it is a valid 'user number' (i.e. a number from 00..0F). Stop looking when you see an 'E5'.
82
+ #if an invalid user number is found before an E5, then the disk is NOT a CPM disk
83
+ found_0xE5_byte=false
84
+ [0x0,0x6,0xC,0x3,0x9,0xF,0xE,0x5].each do |sector_no|
85
+ sector=get_sector(3,INTERLEAVES[sector_order][sector_no])
86
+ [0x00,0x20,0x40,0x60,0x80,0xA0,0xC0,0xE0].each do |byte_number|
87
+ if (sector[byte_number]>0x0F && sector[byte_number]!=0xe5 && sector[byte_number]!=0x1F) then
88
+ # puts "found #{sprintf '%02x',sector[byte_number]} at #{sprintf '%02x', byte_number} sector #{sprintf '%02x', sector_no}"
89
+ return false
90
+ end
91
+ if (sector[byte_number]==0xe5) then
92
+ found_0xE5_byte=true
93
+ end
94
+ end
95
+ end
96
+ return found_0xE5_byte #if we've only seen 00 bytes, then it's not really a CPM
97
+ end
98
+
72
99
  def is_prodos?(sector_order)
73
100
  #block $02 - bytes $00/$01 are both $00, byte $04 is $F?,
74
101
  #bytes $29-$2A = sectors ( 0x118 on a 35 track 5.25" disk)
@@ -95,9 +122,10 @@ class DSK
95
122
  @file_bytes=file_bytes
96
123
  @files={}
97
124
  @sector_order=sector_order
98
- @track_count=file_bytes.length/4096
125
+ @track_count=file_bytes.length/4096
126
+ @source_filename="(unknown)"
99
127
  end
100
-
128
+
101
129
  #write out DSK to file
102
130
  def save_as(filename)
103
131
  if !(filename=~/\.gz$/).nil? then
@@ -119,6 +147,9 @@ class DSK
119
147
  case filesystem
120
148
  when :none
121
149
  return DSK.new()
150
+ when :cpm
151
+ require 'CPMDisk'
152
+ return CPMDisk.new("\xe5"*DSK_FILE_LENGTH,:physical)
122
153
  when :nadol
123
154
  return DSK.read(File.dirname(__FILE__)+"/nadol_blank.po.gz")
124
155
  when :dos33
@@ -127,58 +158,77 @@ class DSK
127
158
  raise "initialisation of #{filesystem} file system not currently supported"
128
159
  end
129
160
  end
130
-
131
-
132
- #read in an existing DSK file (must exist)
133
- def DSK.read(filename)
134
- #is the file extension .gz?
135
- if !(filename=~/\.gz$/).nil? then
136
- require 'zlib'
137
- file_bytes=Zlib::GzipReader.new(open(filename,"rb")).read
138
- else
139
- file_bytes=open(filename,"rb").read
140
- end
141
-
142
-
143
- dsk=DSK.new(file_bytes)
144
- SECTOR_ORDERS.each do |sector_order|
145
- begin
161
+
162
+ #for a generic DSK,return an instance of subclass representing the the best match file system
163
+ def best_subclass
164
+ SECTOR_ORDERS.each do |sector_order|
165
+ begin
146
166
  candidate_filesystem="unknown"
147
- if (dsk.is_dos33?(sector_order))
148
- require 'DOSDisk'
167
+ if (self.is_dos33?(sector_order))
168
+ require 'DOSDisk'
149
169
  candidate_filesystem="DOS 3.3"
150
- dsk=DOSDisk.new(file_bytes,sector_order)
151
- break
170
+ return DOSDisk.new(self.file_bytes,sector_order)
152
171
  end
153
172
 
154
- if (dsk.is_nadol?(sector_order))
155
- require 'NADOLDisk'
173
+ if (self.is_nadol?(sector_order))
174
+ require 'NADOLDisk'
156
175
  candidate_filesystem="NADOL"
157
- dsk=NADOLDisk.new(file_bytes,sector_order)
158
- break
176
+ return NADOLDisk.new(self.file_bytes,sector_order)
159
177
  end
160
-
161
- if (dsk.is_prodos?(sector_order))
162
- require 'ProDOSDisk'
163
- candidate_filesystem="ProDOS"
164
- dsk=ProDOSDisk.new(file_bytes,sector_order)
165
- break
178
+
179
+ if (self.is_prodos?(sector_order))
180
+ require 'ProDOSDisk'
181
+ candidate_filesystem="ProDOS"
182
+ return ProDOSDisk.new(self.file_bytes,sector_order)
166
183
  end
167
184
 
168
- if (dsk.is_pascal?(sector_order))
169
- require 'PascalDisk'
185
+ if (self.is_pascal?(sector_order))
186
+ require 'PascalDisk'
170
187
  candidate_filesystem="Pascal"
171
- dsk=PascalDisk.new(file_bytes,sector_order)
172
- break
188
+ return PascalDisk.new(self.file_bytes,sector_order)
173
189
  end
174
-
175
- rescue Exception=>e
176
- STDERR<<"error while parsing #{filename} as #{candidate_filesystem} (sector order #{sector_order}\n"
177
- STDERR<<"#{e}\n"
178
- STDERR<<e.backtrace.join("\n")
179
- end
190
+
191
+ if (self.is_cpm?(sector_order))
192
+ require 'CPMDisk'
193
+ candidate_filesystem="CP/M"
194
+ return CPMDisk.new(self.file_bytes,sector_order)
195
+ end
196
+ rescue Exception=>e
197
+ STDERR<<"error while parsing #{self.source_filename} as #{candidate_filesystem} (sector order #{sector_order}\n"
198
+ STDERR<<"#{e}\n"
199
+ STDERR<<e.backtrace.join("\n")
200
+ end
180
201
  end
181
- dsk
202
+
203
+ #if none of the above matched, look for a DOS image with a VTOC in the wrong spot
204
+ 0.upto(0x22) do |track|
205
+ if (self.is_modified_dos?(track,0))
206
+ require 'DOSDisk'
207
+ candidate_filesystem="MODIFIED DOS"
208
+ return DOSDisk.new(self.file_bytes,:physical,track,0)
209
+ end
210
+ end
211
+ #if we didn't find a better match, return self
212
+ self
213
+ end
214
+ #read in an existing DSK file (must exist)
215
+ def DSK.read(filename)
216
+ #is the file extension .gz?
217
+ if !(filename=~/\.gz$/).nil? then
218
+ require 'zlib'
219
+ file_bytes=Zlib::GzipReader.new(open(filename,"rb")).read
220
+ else
221
+ file_bytes=open(filename,"rb").read
222
+ end
223
+
224
+ if (file_bytes.length-NIB_FILE_LENGTH).abs<=1 then
225
+ require 'Nibbles'
226
+ dsk=Nibbles.make_dsk_from_nibbles(file_bytes)
227
+ else
228
+ dsk=DSK.new(file_bytes)
229
+ end
230
+ dsk.source_filename=filename
231
+ dsk.best_subclass
182
232
  end
183
233
 
184
234
  def get_sector(track,requested_sector,sector_order=@sector_order)
@@ -186,7 +236,7 @@ class DSK
186
236
  raise "bad sector_order #{sector_order}" if INTERLEAVES[sector_order].nil?
187
237
  physical_sector=INTERLEAVES[sector_order][requested_sector]
188
238
  start_byte=track*16*256+physical_sector*256
189
- @file_bytes[start_byte..start_byte+255]
239
+ @file_bytes[start_byte,256]
190
240
  end
191
241
 
192
242
  def set_sector(track,sector,contents)
@@ -205,7 +255,7 @@ end
205
255
  raise "boot code can't exceed 16 sectors" if sectors_needed>16
206
256
  s=sectors_needed.chr+contents
207
257
  for sector in 0..sectors_needed-1
208
- sector_data=s[sector*256..255+sector*256]
258
+ sector_data=s[sector*256,256]
209
259
  set_sector(0,sector,sector_data)
210
260
  end
211
261
  end
data/lib/DSK.rb~ ADDED
@@ -0,0 +1,226 @@
1
+ $:.unshift(File.dirname(__FILE__)) unless
2
+ $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
3
+ require 'open-uri'
4
+
5
+ #
6
+ # For manipulating DSK files, as created by ADT (http://adt.berlios.de) and ADTPRo (http://adtpro.sourceforge.net)
7
+ # used by many Apple 2 emulators.
8
+ #
9
+ class DSK
10
+
11
+ FILE_SYSTEMS=[:prodos,:dos33,:nadol,:pascal,:unknown]
12
+ SECTOR_ORDERS=[:physical,:prodos_from_dos]
13
+ DSK_IMAGE_EXTENSIONS=[".dsk",".po",".do",".hdv"]
14
+ INTERLEAVES={
15
+ :physical=> [0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F],
16
+ :prodos_from_dos=>[0x00,0x0E,0x0D,0x0C,0x0B,0x0A,0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x01,0x0F]
17
+ }
18
+
19
+ #does this filename have a suitable extension?
20
+ def DSK.is_dsk_file?(filename)
21
+ extension=File.extname(File.basename(filename,".gz")).downcase
22
+ DSK_IMAGE_EXTENSIONS.include?(extension)
23
+ end
24
+ DSK_FILE_LENGTH=143360
25
+ attr_accessor :file_bytes,:sector_order,:track_count
26
+
27
+ def file_system
28
+ :unknown
29
+ end
30
+
31
+ # does this DSK have a standard Apple DOS 3.3 VTOC?
32
+ def is_dos33?(sector_order)
33
+ #currently ignores sector order
34
+ # VTOC is at offset 0x11000
35
+ # bytes 1 & 2 are a track number, sector number and DOS version number
36
+ # byte 27 is maximum number of track/sector pairs which will fit in one file track/sector list sector (122 for 256 byte sectors)
37
+ # 35 number of sectors per track (16)
38
+ # see if these are reasonable values
39
+ vtoc_sector=get_sector(0x11,0)
40
+ (vtoc_sector[01]<=34) && (vtoc_sector[02]<=15) && (vtoc_sector[0x27]==0x7A) && (vtoc_sector[0x35]==0x10)
41
+ end
42
+
43
+ def is_nadol?(sector_order)
44
+ #currently ignores sector order
45
+ # track $00, sector $02 , bytes $11 - "NADOL"
46
+ (@file_bytes[0x00211..0x00215]=="NADOL")
47
+ end
48
+
49
+ def is_prodos?(sector_order)
50
+ #block $02 - bytes $00/$01 are both $00, byte $04 is $F?,
51
+ #bytes $29-$2A = sectors ( 0x118 on a 35 track 5.25" disk)
52
+ first_sector_in_block_2=INTERLEAVES[sector_order][4]
53
+ first_sector_in_block_2=get_sector(0,4,sector_order)
54
+ (first_sector_in_block_2[0..1]=="\x00\x00") && (first_sector_in_block_2[4]>=0xF0) && (first_sector_in_block_2[0x29]+first_sector_in_block_2[0x2a]*0x100==track_count*8)
55
+ end
56
+
57
+ def is_pascal?(sector_order)
58
+ #block $02 - bytes $00..$01 are both $00, byte $06 is < 8 and
59
+ #bytes $0E-$0F = sectors ( 0x118 on a 35 track 5.25" disk)
60
+ first_sector_in_block_2=INTERLEAVES[sector_order][4]
61
+ first_sector_in_block_2=get_sector(0,4,sector_order)
62
+ (first_sector_in_block_2[0..1]=="\x00\x00") && (first_sector_in_block_2[6]<=7) && (first_sector_in_block_2[0x0E]+first_sector_in_block_2[0x0F]*0x100==track_count*8)
63
+ end
64
+
65
+ #create a new DSK structure (in memory, not on disk)
66
+ def initialize(file_bytes="\0"*DSK_FILE_LENGTH,sector_order=:physical)
67
+ #file must be a multiple of (16 sectors * 256 bytes) = 4096
68
+ #some dsks on Asimov appear to have an extra byte at the end so allow for 1 extra byte
69
+ if (file_bytes.length%4096>1) then
70
+ raise "DSK files must be #{DSK_FILE_LENGTH} bytes long (was #{file_bytes.length} bytes)"
71
+ end
72
+ @file_bytes=file_bytes
73
+ @files={}
74
+ @sector_order=sector_order
75
+ @track_count=file_bytes.length/4096
76
+ end
77
+
78
+ #read in an existing DSK file (must exist)
79
+ def DSK.read(filename)
80
+ #is the file extension .gz?
81
+ if !(filename=~/\.gz$/).nil? then
82
+ require 'zlib'
83
+ file_bytes=Zlib::GzipReader.new(open(filename,"rb")).read
84
+ else
85
+ file_bytes=open(filename,"rb").read
86
+ end
87
+
88
+
89
+ dsk=DSK.new(file_bytes)
90
+ SECTOR_ORDERS.each do |sector_order|
91
+ begin
92
+ candidate_filesystem="unknown"
93
+ if (dsk.is_dos33?(sector_order))
94
+ require 'DOSDisk'
95
+ candidate_filesystem="DOS 3.3"
96
+ dsk=DOSDisk.new(file_bytes,sector_order)
97
+ break
98
+ end
99
+
100
+ if (dsk.is_nadol?(sector_order))
101
+ require 'NADOLDisk'
102
+ candidate_filesystem="NADOL"
103
+ dsk=NADOLDisk.new(file_bytes,sector_order)
104
+ break
105
+ end
106
+
107
+ if (dsk.is_prodos?(sector_order))
108
+ require 'ProDOSDisk'
109
+ candidate_filesystem="ProDOS"
110
+ dsk=ProDOSDisk.new(file_bytes,sector_order)
111
+ break
112
+ end
113
+
114
+ if (dsk.is_pascal?(sector_order))
115
+ require 'PascalDisk'
116
+ candidate_filesystem="Pascal"
117
+ dsk=PascalDisk.new(file_bytes,sector_order)
118
+ break
119
+ end
120
+
121
+ rescue Exception=>e
122
+ STDERR<<"error while parsing #{filename} as #{candidate_filesystem} (sector order #{sector_order}\n"
123
+ STDERR<<"#{e}\n"
124
+ STDERR<<e.backtrace.join("\n")
125
+ end
126
+ end
127
+ dsk
128
+ end
129
+
130
+ def get_sector(track,requested_sector,sector_order=@sector_order)
131
+ raise "bad sector #{requested_sector}" unless requested_sector.between?(0,0x0F)
132
+ raise "bad sector_order #{sector_order}" if INTERLEAVES[sector_order].nil?
133
+ physical_sector=INTERLEAVES[sector_order][requested_sector]
134
+ start_byte=track*16*256+physical_sector*256
135
+ @file_bytes[start_byte..start_byte+255]
136
+ end
137
+
138
+ def get_block(block_no)
139
+ track=(block_no / 8).to_i
140
+ first_sector=2*(block_no % 8)
141
+ raise "illegal block no #{block_no}" if track>=self.track_count
142
+ return self.get_sector(track,first_sector)+self.get_sector(track,first_sector+1)
143
+ end
144
+
145
+ def files
146
+ @files
147
+ end
148
+
149
+ #return a formatted hex dump of a single 256 byte sector
150
+ def dump_sector(track,sector)
151
+ start_byte=track.to_i*16*256+sector.to_i*256
152
+ s=hline
153
+ s<<sprintf("TRACK: $%02X SECTOR $%02X\ OFFSET $%04X\n",track,sector,start_byte)
154
+ s<< "\t"
155
+ sector_data=get_sector(track,sector)
156
+ (0..15).each {|x| s<<sprintf("%02X ",x) }
157
+ s<<"\n"
158
+ s<<hline
159
+ (0..15).each {|line_number|
160
+ lhs=""
161
+ rhs=""
162
+ start_byte=line_number*16
163
+ line=sector_data[start_byte..start_byte+15]
164
+ line.each_byte {|byte|
165
+ lhs<< sprintf("%02X ", byte)
166
+ rhs<< (byte%128).chr.sub(/[\x00-\x1f]/,'.')
167
+ }
168
+ s<<sprintf("%02X\t%s %s\n",start_byte,lhs,rhs)
169
+ }
170
+ s
171
+ end
172
+
173
+ #return a formatted hex dump of a single 256 byte sector
174
+ def disassemble_sector(track,sector)
175
+ require 'D65'
176
+ sector_data=get_sector(track,sector)
177
+ if (track==0) && (sector==0) then
178
+ return D65.disassemble(sector_data[1..255],0x801)
179
+ else
180
+ return D65.disassemble(sector_data)
181
+ end
182
+ end
183
+
184
+ #return a formatted hex dump of all sectors on all tracks
185
+ def hex_dump
186
+ s=""
187
+ (0..34).each {|track|
188
+ (0..15).each {|sector|
189
+ s<<dump_sector(track,sector)
190
+ }
191
+ }
192
+ s
193
+ end
194
+
195
+ private
196
+
197
+ def hline
198
+ "-"*79+"\n"
199
+ end
200
+
201
+
202
+ end
203
+ # == Author
204
+ # Jonno Downes (jonno@jamtronix.com)
205
+ #
206
+ # == Copyright
207
+ # Copyright (c) 2007 Jonno Downes (jonno@jamtronix.com)
208
+ #
209
+ #Permission is hereby granted, free of charge, to any person obtaining
210
+ #a copy of this software and associated documentation files (the
211
+ #"Software"), to deal in the Software without restriction, including
212
+ #without limitation the rights to use, copy, modify, merge, publish,
213
+ #distribute, sublicense, and/or sell copies of the Software, and to
214
+ #permit persons to whom the Software is furnished to do so, subject to
215
+ #the following conditions:
216
+
217
+ # The above copyright notice and this permission notice shall be
218
+ # included in all copies or substantial portions of the Software.
219
+
220
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
221
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
222
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
223
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
224
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
225
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
226
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/lib/DSKFile.rb CHANGED
@@ -15,6 +15,15 @@ class DSKFile
15
15
  @contents
16
16
  end
17
17
 
18
+ def to_ascii
19
+ s=""
20
+ @contents.each_byte do |b|
21
+ s+=(b%0x80).chr.gsub(0x0D.chr,"\r\n")#.gsub(0x0A.chr,"\n")
22
+ end
23
+ return s.gsub(/\0/," ")
24
+ #return s.sub(/\0*$/,"")
25
+ end
26
+
18
27
  def ==(other_object)
19
28
  if !other_object.kind_of? DSKFile then
20
29
  return false