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/DOSDisk.rb CHANGED
@@ -84,6 +84,7 @@ require 'DOSFile'
84
84
 
85
85
  class DOSDisk < DSK
86
86
 
87
+ attr_accessor :vtoc_track_no,:vtoc_sector_no
87
88
  def dump_catalog
88
89
  s=""
89
90
  files.keys.sort.each { |file_name|
@@ -94,12 +95,15 @@ class DOSDisk < DSK
94
95
  end
95
96
 
96
97
  def file_system
97
- :dos
98
+ return :dos if (vtoc_track_no==0x11) && (vtoc_sector_no==0)
99
+ :modified_dos
98
100
  end
99
101
 
100
102
 
101
- def initialize(file_bytes,sector_order)
103
+ def initialize(file_bytes,sector_order,vtoc_track_no=0x11,vtoc_sector_no=0)
102
104
  super(file_bytes,sector_order)
105
+ @vtoc_track_no=vtoc_track_no
106
+ @vtoc_sector_no=vtoc_sector_no
103
107
  self.read_vtoc
104
108
  end
105
109
 
@@ -132,7 +136,7 @@ end
132
136
  #reads the VTOC, and populate the "files" array with files
133
137
  def read_vtoc
134
138
  @files={}
135
- vtoc_sector=get_sector(17,0)
139
+ vtoc_sector=get_sector(vtoc_track_no,vtoc_sector_no)
136
140
  catalog_sector=get_sector(vtoc_sector[01],vtoc_sector[02])
137
141
  done=false
138
142
  visited_sectors={}
@@ -140,7 +144,7 @@ end
140
144
  break if catalog_sector.nil?
141
145
  (0..6).each {|file_number|
142
146
  file_descriptive_entry_start=11+file_number*35
143
- file_descriptive_entry=catalog_sector[file_descriptive_entry_start..file_descriptive_entry_start+35]
147
+ file_descriptive_entry=catalog_sector[file_descriptive_entry_start,36]
144
148
  break if (file_descriptive_entry[0]==0xFF) # skip deleted files
145
149
  filename=""
146
150
  file_descriptive_entry[3..32].to_s.each_byte{|b| filename+=(b.%128).chr}
@@ -202,7 +206,7 @@ end
202
206
  end
203
207
  #iterate through the CATALOG to find either the named file or (if nil is passed in) an empty slot
204
208
  def find_catalog_slot(filename)
205
- vtoc_sector=get_sector(17,0)
209
+ vtoc_sector=get_sector(vtoc_track_no,vtoc_sector_no)
206
210
  catalog_filename=DOSFile.catalog_filename(filename.upcase) unless filename.nil?
207
211
  catalog_track_no=vtoc_sector[01]
208
212
  catalog_sector_no=vtoc_sector[02]
@@ -228,7 +232,7 @@ end
228
232
  #iterate through the sector usage bitmap, return a list of [track,sector] for sectors marked available
229
233
  def free_sector_list
230
234
  end_of_sector_usage_bitmap=(track_count*4+0x38)-1
231
- sector_usage_bitmap=get_sector(0x11,0)[0x38..end_of_sector_usage_bitmap]
235
+ sector_usage_bitmap=get_sector(vtoc_track_no,vtoc_sector_no)[0x38..end_of_sector_usage_bitmap]
232
236
  free_sectors=[]
233
237
  #skip track 0 - even if sectors there are unused, we can't include them in a catalog or track/sector list
234
238
  (1..track_count-1).each do |track|
@@ -268,7 +272,7 @@ end
268
272
  file_descriptive_entry=get_sector(this_files_catalog_slot.track_no,this_files_catalog_slot.sector_no)[this_files_catalog_slot.offset..this_files_catalog_slot.offset+0x22]
269
273
 
270
274
  #mark sector as free in sector usage list
271
- sector_usage_bitmap_sector=get_sector(0x11,0)
275
+ sector_usage_bitmap_sector=get_sector(vtoc_track_no,vtoc_sector_no)
272
276
  sectors_to_mark_available=get_track_sector_list(file_descriptive_entry[0x00],file_descriptive_entry[0x01])
273
277
  sectors_to_mark_available<<DSKTrackSector.new(file_descriptive_entry[0x01],file_descriptive_entry[0x00])
274
278
 
@@ -281,7 +285,7 @@ end
281
285
  byte_containing_this_sector=byte_containing_this_sector|(2**(ts.sector_no%8))
282
286
  sector_usage_bitmap_sector[offset_of_byte_containing_this_sector]=byte_containing_this_sector
283
287
  end
284
- set_sector(0x11,0,sector_usage_bitmap_sector)
288
+ set_sector(vtoc_track_no,vtoc_sector_no,sector_usage_bitmap_sector)
285
289
 
286
290
  #mark slot as available in catalog
287
291
  catalog_sector=get_sector(this_files_catalog_slot.track_no,this_files_catalog_slot.sector_no)
@@ -295,8 +299,8 @@ end
295
299
  super(track,sector,contents)
296
300
 
297
301
  #now mark sector as used in sector usage list
298
- if ((track!=0x11) || (sector!=00)) then #don't bother marking the VTOC sectors used
299
- sector_usage_bitmap_sector=get_sector(0x11,0)
302
+ if ((track!=vtoc_track_no) || (sector!=vtoc_sector_no)) then #don't bother marking the VTOC sectors used
303
+ sector_usage_bitmap_sector=get_sector(vtoc_track_no,vtoc_sector_no)
300
304
  offset_of_byte_containing_this_sector=0x38+(track*4)
301
305
  if sector<8 then
302
306
  offset_of_byte_containing_this_sector+=1
@@ -304,7 +308,7 @@ end
304
308
  byte_containing_this_sector=sector_usage_bitmap_sector[offset_of_byte_containing_this_sector]
305
309
  byte_containing_this_sector=byte_containing_this_sector&(0xff-(2**(sector%8)))
306
310
  sector_usage_bitmap_sector[offset_of_byte_containing_this_sector]=byte_containing_this_sector
307
- set_sector(0x11,0,sector_usage_bitmap_sector)
311
+ set_sector(vtoc_track_no,vtoc_sector_no,sector_usage_bitmap_sector)
308
312
  end
309
313
  end
310
314
 
@@ -340,7 +344,7 @@ def add_file(file)
340
344
  sector_to_use=free_sectors[sector_in_file+1]
341
345
  track_sector_list[(sector_in_file*2)+0x0C]=sector_to_use.track_no
342
346
  track_sector_list[(sector_in_file*2)+0X0D]=sector_to_use.sector_no
343
- sector_contents=file.contents[(sector_in_file*256)..(sector_in_file*256)+255] || ""
347
+ sector_contents=file.contents[(sector_in_file*256),256] || ""
344
348
  set_sector(sector_to_use.track_no,sector_to_use.sector_no,sector_contents)
345
349
  end
346
350
  #write the track/sector list
data/lib/DOSDisk.rb~ ADDED
@@ -0,0 +1,201 @@
1
+ $:.unshift(File.dirname(__FILE__)) unless
2
+ $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
3
+
4
+ require 'DOSFile'
5
+
6
+ #
7
+ # Disk image with a standard Apple DOS 3.3 VTOC at track $11, sector $00
8
+ #
9
+ #
10
+ #VTOC : Volume Table of Contents (from Beneath Apple DOS pp 4-2 & 4-3)
11
+ # 00 not used
12
+ # 01 track number of first catalog sector
13
+ # 02 sector number of first catalog sector
14
+ # 03 release number of DOS used to INIT this disk
15
+ # 04-05 not used
16
+ # 06 Diskette volume number (1-254)
17
+ # 07-26 not used
18
+ # 27 maximum number of track/sector pairs which will fit in one file track/sector
19
+ # list sector (122 for 256 byte sectors)
20
+ # 28-2F not used
21
+ # 30 last track where sectors were allocated
22
+ # 31 direction of track allocation (+1 or -1)
23
+ # 32-33 not used
24
+ # 34 number of tracks per diskette (normally 35)
25
+ # 35 number of sectors per track (13 or 16)
26
+ # 36-37 number of bytes per sector (LO/HI format)
27
+ # 38-3B bit map of free sectors in track 0
28
+ # 3C-3F bit map of free sectors in track 1
29
+ # 40-43 bit map of free sectors in track 2
30
+ # ...
31
+ # BC-BF bit map of free sectors in track 33
32
+ # CO-C3 bit map of free sectors in track 34
33
+ # C4-FF bit maps for additional tracks if there are more than 35 tracks per diskette
34
+ #
35
+ #CATALOG (from Beneath Apple DOS p 4-6)
36
+ # 00 Not Used
37
+ # 01 track number of next catalog sector
38
+ # 02 sector number of next catalog sector
39
+ # 03-0A not used
40
+ # 0B-2D First file descriptive entry
41
+ # 2E-50 Second file descriptive entry
42
+ # 51-73 Third file descriptive entry
43
+ # 74-96 Fourth file descriptive entry
44
+ # 97-B9 Fifth file descriptive entry
45
+ # BA-DC Sixth file descriptive entry
46
+ # DD-FF Seventh file descriptive entry
47
+ #
48
+ #FILE DESCRIPTIVE ENTRY (from Beneath Apple DOS p 4-6)
49
+ # 00 Track of first track/sector list sector, if this is a deleted file this contains FF
50
+ # and the original track number is copied to the last byte of the file name (BYTE 20)
51
+ # If this byte contains a 00, the entry is assumed to never have been used and is
52
+ # available for use. (This means track 0 can never be used for data even if the DOS image
53
+ # is 'wiped' from the disk)
54
+ #
55
+ # 01 Sector of first track/sector list sector
56
+ # 02 File type and flags:
57
+ # 80+file type - file is locked
58
+ # 00+file type - file is not locked
59
+ #
60
+ # 00 - TEXT file
61
+ # 01 - INTEGER BASIC file
62
+ # 02 - APPLESOFT BASIC file
63
+ # 04 - BINARY file
64
+ # 08 - S type file
65
+ # 10 - RELOCATABLE object module file
66
+ # 20 - a type file
67
+ # 40 - b type file
68
+ #
69
+ # 03-20 File Name (30 characters)
70
+ # 21-22 Length of file in sectors (LO/HI format)
71
+ #
72
+ #
73
+ #TRACK/SECTOR LIST FORMAT (from Beneath Apple DOS p 4-6)
74
+ # 00 Not used
75
+ # 01 Track number of next T/S list of one is needed or zero if no more t/s list
76
+ # 02 Sector number of next T/S list (if one is present)
77
+ # 03-04 Not used
78
+ # 05-06 Sector offset in file of the first sector described by this list
79
+ # 07-oB Not used
80
+ # 0C-0D Track and sector of first data sector or zeros
81
+ # 0E-0F Track and sector of second data sector or zeros
82
+ # 10-FF Up to 120 more track and sector pairs
83
+
84
+
85
+ class DOSDisk < DSK
86
+
87
+ def dump_catalog
88
+ s=""
89
+ files.keys.sort.each { |file_name|
90
+ file=files[file_name]
91
+ s<< "#{file.locked ? '*':' '}#{file.file_type} #{sprintf('%04d',file.contents.length)} #{file.filename}\n"
92
+ }
93
+ s
94
+ end
95
+
96
+ def file_system
97
+ :dos
98
+ end
99
+
100
+
101
+ def initialize(file_bytes,sector_order)
102
+ super(file_bytes,sector_order)
103
+ self.read_vtoc
104
+ end
105
+ #reads the VTOC, and populate the "files" array with files
106
+
107
+ def read_vtoc
108
+ vtoc_sector=get_sector(17,0)
109
+ catalog_sector=get_sector(vtoc_sector[01],vtoc_sector[02])
110
+ done=false
111
+ visited_sectors={}
112
+ while !done
113
+ break if catalog_sector.nil?
114
+ (0..6).each {|file_number|
115
+ file_descriptive_entry_start=11+file_number*35
116
+ file_descriptive_entry=catalog_sector[file_descriptive_entry_start..file_descriptive_entry_start+35]
117
+ break if (file_descriptive_entry[0]==0xFF) # skip deleted files
118
+ filename=""
119
+ file_descriptive_entry[3..32].to_s.each_byte{|b| filename+=(b.%128).chr}
120
+ filename.gsub!(/ *$/,"") #strip off trailing spaces
121
+ filename.tr!("\x00-\x1f","\x40-\x1F") #convert non-printable chars to corresponding uppercase letter
122
+ locked=(file_descriptive_entry[2]>=0x80)
123
+ sector_count=file_descriptive_entry[0x21]+file_descriptive_entry[0x22]*256
124
+
125
+ file_type_code=file_descriptive_entry[2]%0x80
126
+
127
+
128
+ if (sector_count>0) then
129
+ contents=""
130
+ ts_list_track_no=file_descriptive_entry[0]
131
+ ts_list_sector_no=file_descriptive_entry[1]
132
+ while (ts_list_track_no>0) && (ts_list_track_no<=0X22) && (ts_list_sector_no<=0x0f)
133
+ ts_list_sector=get_sector(ts_list_track_no,ts_list_sector_no)
134
+ ts_list_track_no=ts_list_sector[1]
135
+ ts_list_sector_no=ts_list_sector[2]
136
+
137
+ 0x0C.step(0xff,2) {|i|
138
+ data_track_no=ts_list_sector[i]
139
+ data_sector_no=ts_list_sector[i+1]
140
+ if (data_track_no>0) && (data_track_no<=0X22) && (data_sector_no<=0x0f) then
141
+ contents+=get_sector(data_track_no,data_sector_no)
142
+ end
143
+ }
144
+ end
145
+ if contents.length>0 then
146
+ @files[filename]= case file_type_code
147
+ when 0x00 then TextFile.new(filename,locked,sector_count,contents)
148
+ when 0x01 then SCAsmFile.can_be_scasm_file?(contents)? SCAsmFile.new(filename,locked,sector_count,contents): IntegerBasicFile.new(filename,locked,sector_count,contents)
149
+ when 0x02 then AppleSoftFile.new(filename,locked,sector_count,contents)
150
+ when 0x04 then BinaryFile.new(filename,locked,sector_count,contents)
151
+ # when 0x08 then "S" #S type file
152
+ # when 0x10 then "R" #RELOCATABLE object module file
153
+ # when 0x20 then "a" #??
154
+ # when 0x40 then "b" #??
155
+ else DOSFile.new(filename,locked,sector_count,contents,sprintf("$%02X",file_type_code))
156
+ end
157
+ end
158
+ end
159
+ }
160
+ next_track=catalog_sector[1]
161
+ next_sector=catalog_sector[2]%0x10
162
+ if (next_track==0) &&( next_sector==0) then
163
+ done=true
164
+ else
165
+ #check we haven't got into an endless loop
166
+ s="#{next_track}/#{next_sector}"
167
+ if (!visited_sectors[s].nil?) then
168
+ done=true
169
+ end
170
+ visited_sectors[s]=true
171
+ catalog_sector=get_sector(next_track,next_sector)
172
+ end
173
+ end
174
+
175
+ end
176
+
177
+ end
178
+ # == Author
179
+ # Jonno Downes (jonno@jamtronix.com)
180
+ #
181
+ # == Copyright
182
+ # Copyright (c) 2007 Jonno Downes (jonno@jamtronix.com)
183
+ #
184
+ #Permission is hereby granted, free of charge, to any person obtaining
185
+ #a copy of this software and associated documentation files (the
186
+ #"Software"), to deal in the Software without restriction, including
187
+ #without limitation the rights to use, copy, modify, merge, publish,
188
+ #distribute, sublicense, and/or sell copies of the Software, and to
189
+ #permit persons to whom the Software is furnished to do so, subject to
190
+ #the following conditions:
191
+
192
+ # The above copyright notice and this permission notice shall be
193
+ # included in all copies or substantial portions of the Software.
194
+
195
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
196
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
197
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
198
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
199
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
200
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
201
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/lib/DOSFile.rb~ ADDED
@@ -0,0 +1,402 @@
1
+ $:.unshift(File.dirname(__FILE__)) unless
2
+ $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
3
+
4
+ require 'D65'
5
+ require 'DSKFile'
6
+ require 'HGR'
7
+
8
+ #Apple DOS 3.3 file
9
+ class DOSFile < DSKFile
10
+
11
+ attr_accessor(:filename,:locked,:file_type,:sector_count,:contents)
12
+ def initialize(filename,locked,sector_count,contents,file_type=nil)
13
+ @filename=filename
14
+ @locked=locked
15
+ @sector_count=sector_count
16
+ @file_type= file_type
17
+ @contents=contents
18
+ end
19
+
20
+
21
+ #File type as displayed in Apple DOS 3.3 Catalog
22
+ def file_type
23
+ @file_type
24
+ end
25
+ end
26
+
27
+ class TextFile < DOSFile
28
+ def file_type
29
+ "T"
30
+ end
31
+
32
+ def file_extension
33
+ ".txt"
34
+ end
35
+
36
+ def to_s
37
+ s=""
38
+ @contents.each_byte{|b| s+=(b%0x80).chr.tr(0x0D.chr,"\n")}
39
+ s
40
+ end
41
+ end
42
+
43
+ class BinaryFile < DOSFile
44
+ def file_type
45
+ "B"
46
+ end
47
+
48
+ def file_extension
49
+ ".bin"
50
+ end
51
+
52
+ def contents_without_header
53
+ file_length=contents[2]+contents[3]*256
54
+ @contents[4..file_length+3]
55
+ end
56
+ def disassembly
57
+ start_address=(@contents[0]+@contents[1]*256)
58
+ D65.disassemble(contents_without_header,start_address)
59
+ end
60
+
61
+ def can_be_picture?
62
+ start_address=(@contents[0]+@contents[1]*256)
63
+ HGR.can_be_hgr_screen?(contents_without_header,start_address)
64
+ end
65
+
66
+ def to_png(pallete_mode=:amber)
67
+ HGR.buffer_to_png(contents_without_header,pallete_mode)
68
+ end
69
+ end
70
+
71
+ # Adapted from FID.C -- a utility to browse Apple II .DSK image files by Paul Schlyter (pausch@saaf.se)
72
+ #Integer Basic file format:
73
+ # <Length_of_file> (16-bit little endian)
74
+ # <Line>
75
+ # ......
76
+ # <Line>
77
+ #
78
+ # where <Line> is:
79
+ # 1 byte: Line length
80
+ # 2 bytes: Line number, binary little endian
81
+ # <token>
82
+ # <token>
83
+ # <token>
84
+ # ......
85
+ # <end-of-line token>
86
+ #
87
+ # <token> is one of:
88
+ # $12 - $7F: Tokens as listed below: 1 byte/token
89
+ # $80 - $FF: ASCII characters with high bit set
90
+ # $B0 - $B9: Integer constant, 3 bytes: $B0-$B9,
91
+ # followed by the integer value in
92
+ # 2-byte binary little-endian format
93
+ # (Note: a $B0-$B9 byte preceded by an
94
+ # alphanumeric ASCII(hi_bit_set) byte
95
+ # is not the start of an integer
96
+ # constant, but instead part of a
97
+ # variable name)
98
+ #
99
+ # <end-of-line token> is:
100
+ # $01: One byte having the value $01
101
+ # (Note: a $01 byte may also appear
102
+ # inside an integer constant)
103
+ #
104
+ # Note that the tokens $02 to $11 represent commands which
105
+ # can be executed as direct commands only -- any attempt to
106
+ # enter then into an Integer Basic program will be rejected
107
+ # as a syntax error. Therefore, no Integer Basic program
108
+ # which was entered through the Integer Basic interpreter
109
+ # will contain any of the tokens $02 to $11. The token $00
110
+ # appears to be unused and won't appear in Integer Basic
111
+ # programs either. However, $00 is used as an end-of-line
112
+ # marker in S-C Assembler source files, which also are of
113
+ # DOS file type "I".
114
+ #
115
+ # (note here a difference from Applesoft Basic, where there
116
+ # are no "direct mode only" commands - any Applesoft commands
117
+ # can be entered into an Applesoft program as well).
118
+ class IntegerBasicFile < DOSFile
119
+ def file_type
120
+ "I"
121
+ end
122
+
123
+ def file_extension
124
+ ".bas"
125
+ end
126
+
127
+ #display file with all INTEGER BASIC tokens expanded to ASCII
128
+ def to_s
129
+ buffer_as_integer_basic_file(@contents)
130
+ end
131
+
132
+ private
133
+
134
+ IB_REM_TOKEN =0x5D
135
+ IB_UNARY_PLUS = 0x35
136
+ IB_UNARY_MINUS = 0x36
137
+ IB_QUOTE_START = 0x28
138
+ IB_QUOTE_END = 0x29
139
+ INTEGER_BASIC_TOKENS= [
140
+ # $00-$0F
141
+ "HIMEM:","<$01>", "_", " : ",
142
+ "LOAD", "SAVE", "CON", "RUN", # Direct commands
143
+ "RUN", "DEL", ",", "NEW",
144
+ "CLR", "AUTO", ",", "MAN",
145
+
146
+ # $10-$1F
147
+ "HIMEM:","LOMEM:","+", "-", # Binary ops
148
+ "*", "/", "=", "#",
149
+ ">=", ">", "<=", "<>",
150
+ "<", "AND", "OR", "MOD",
151
+
152
+ # $20-$2F
153
+ "^", "+", "(", ",",
154
+ "THEN", "THEN", ",", ",",
155
+ "\"", "\"", "(", "!",
156
+ "!", "(", "PEEK", "RND",
157
+
158
+ # $30-$3F
159
+ "SGN", "ABS", "PDL", "RNDX",
160
+ "(", "+", "-", "NOT", # Unary ops
161
+ "(", "=", "#", "LEN(",
162
+ "ASC(", "SCRN(", ",", "(",
163
+
164
+ # $40-$4F
165
+ "$", "$", "(", ",",
166
+ ",", ";", ";", ";",
167
+ ",", ",", ",", "TEXT", # Statements
168
+ "GR", "CALL", "DIM", "DIM",
169
+
170
+ # $50-$5F
171
+ "TAB", "END", "INPUT", "INPUT",
172
+ "INPUT", "FOR", "=", "TO",
173
+ "STEP", "NEXT", ",", "RETURN",
174
+ "GOSUB", "REM", "LET", "GOTO",
175
+
176
+ # $60-$6F
177
+ "IF", "PRINT", "PRINT", "PRINT",
178
+ "POKE", ",", "COLOR=","PLOT",
179
+ ",", "HLIN", ",", "AT",
180
+ "VLIN", ",", "AT", "VTAB",
181
+
182
+ # $70-$7F
183
+ "=", "=", ")", ")",
184
+ "LIST", ",", "LIST", "POP",
185
+ "NODSP", "DSP", "NOTRACE","DSP",
186
+ "DSP", "TRACE", "PR#", "IN#",
187
+ ]
188
+
189
+
190
+ def is_alnum(c)
191
+ !((c.chr=~/[A-Za-z0-9]/).nil?)
192
+ end
193
+ def buffer_as_integer_basic_file(buffer)
194
+
195
+ length=buffer[0]+buffer[1]*256
196
+ index=2
197
+ s=""
198
+
199
+ while (index<length)
200
+ in_REM = false
201
+ in_QUOTE = false
202
+ lead_SP = false
203
+ last_AN = false
204
+ last_TOK = false
205
+
206
+ line_length=buffer[index]
207
+ index+=1 #skip over the "line length" field
208
+ line_no=buffer[index]+buffer[index+1]*256
209
+ index+=2 #skip over the "line number" field
210
+ s+=sprintf("%u ",line_no)
211
+ done_line=false
212
+ while (!done_line)
213
+ lead_SP = lead_SP || last_AN
214
+ b=buffer[index]
215
+ if (b >= 0x80 ) then
216
+ if ( !in_REM && !in_QUOTE && !last_AN && (b>= 0xB0 && b <= 0xB9) ) then
217
+ integer = buffer[index+1]+buffer[index+2]*256
218
+ index+=2
219
+ s+=sprintf( (last_TOK && lead_SP ) ? " %d" : "%d", integer )
220
+ lead_SP = true
221
+ else
222
+
223
+ c = b & 0x7F
224
+ if (!in_REM && !in_QUOTE && last_TOK && lead_SP && is_alnum(c)) then
225
+ s+=" "
226
+ end
227
+ if ( c >= 0x20 ) then
228
+ s+=c.chr
229
+ else
230
+ s+="^"+(c+0x40).chr
231
+ end
232
+ last_AN = is_alnum(c)
233
+ end
234
+ last_TOK =false
235
+ else
236
+
237
+ token = INTEGER_BASIC_TOKENS[b]
238
+ lastchar = token[token.length-1]
239
+ case b
240
+ when IB_REM_TOKEN then in_REM = true
241
+ when IB_QUOTE_START then in_QUOTE = true
242
+ when IB_QUOTE_END then in_QUOTE = false
243
+ end
244
+
245
+ if lead_SP && ( is_alnum(token[0]) ||
246
+ b == IB_UNARY_PLUS ||
247
+ b == IB_UNARY_MINUS ||
248
+ b == IB_QUOTE_START ) then
249
+ s+=" "
250
+ end
251
+ s+=token
252
+ last_AN = false
253
+ lead_SP = is_alnum(lastchar) || lastchar == ')' || lastchar == '\"'
254
+ last_TOK = true
255
+ end
256
+ index+=1
257
+ done_line=(index>length)||(buffer[index]==0x01)
258
+ end
259
+ s+="\n"
260
+ index+=1 # skip over "end of line" marker
261
+ end
262
+ s
263
+ end
264
+
265
+ end
266
+
267
+
268
+ class AppleSoftFile < DOSFile
269
+
270
+
271
+ def file_type
272
+ "A"
273
+ end
274
+ #display file with all AppleSoft BASIC tokens expanded to ASCII
275
+ def to_s
276
+ buffer_as_applesoft_file(@contents)
277
+ end
278
+
279
+ def file_extension
280
+ ".bas"
281
+ end
282
+
283
+
284
+
285
+ # Adapted from FID.C -- a utility to browse Apple II .DSK image files by Paul Schlyter (pausch@saaf.se)
286
+ #
287
+ # S-C Assembler file format:
288
+ #
289
+ # <Length_of_file> (16-bit little endian)
290
+ # <Line>
291
+ # ......
292
+ # <Line>
293
+ #
294
+ # where <Line> is:
295
+ # <Length> (8-bit: including length byte, line no, contents, zero>
296
+ # <Line no> (16-bit little endian: 0-65535)
297
+ # <Characters>
298
+ # <Zero byte> ($00, to mark the end of the S-C Asm source line)
299
+ #
300
+ # where <Characters> are an arbitrary sequence of:
301
+ # <Literal character>: $20 to $7E - literal characters
302
+ # <Compressed spaces>: $80 to $BF - represents 1 to 63 spaces
303
+ # <Compressed repetition>: $C0 <n> <ch> - represents <ch> n times
304
+ #
305
+
306
+ class SCAsmFile < DOSFile
307
+ def file_type
308
+ "I"
309
+ end
310
+ #display file with all tokens expanded
311
+ def to_s
312
+ SCAsmFile.buffer_as_scasm_file(@contents)
313
+ end
314
+
315
+ def file_extension
316
+ ".asm"
317
+ end
318
+
319
+ def SCAsmFile.can_be_scasm_file?(buffer)
320
+ if buffer.length<2 then
321
+ return false
322
+ end
323
+ length=buffer[0]+buffer[1]*256
324
+ index=2
325
+ s=""
326
+ while (index<length)
327
+ line_length=buffer[index]
328
+ line_no=buffer[index+1]+buffer[index+2]*256
329
+ index+=3 #skip over the "line number" field
330
+ #S-C Assembler lines always ends with a 0x00
331
+ if ( buffer[index+line_length-4] != 0x00 )
332
+ return false
333
+ end
334
+ buffer[index..index+line_length-3].each_byte do |b|
335
+ if b>0xc0 then
336
+ return false
337
+ end
338
+ end
339
+ index+= (line_length-3).abs
340
+ end
341
+ return true
342
+ end
343
+
344
+ private
345
+ def SCAsmFile.buffer_as_scasm_file(buffer)
346
+ length=buffer[0]+buffer[1]*256
347
+ index=2
348
+ s=""
349
+ while (index<length)
350
+ line_length=buffer[index]
351
+ line_no=buffer[index+1]+buffer[index+2]*256
352
+ s+=sprintf("%d ",line_no)
353
+ index+=3 #skip over the "line number" field
354
+ end_of_line=index+line_length-4
355
+ while(index<end_of_line)
356
+ b=buffer[index]
357
+ if (b==0xC0) then
358
+ repeat_count=buffer[index+1]
359
+ repeat_char=(buffer[index+2]).chr
360
+ s+=repeat_char*repeat_count
361
+ index+=3
362
+ elsif(b>=0x80) then
363
+ s+=" "*(b-0x80)
364
+ index+=1
365
+ else
366
+ s+=b.chr
367
+ index+=1
368
+ end
369
+ end
370
+ index+=1 #skip over end-of-line marker
371
+ s+="\n"
372
+ end
373
+ s
374
+ end
375
+
376
+ end
377
+
378
+
379
+ # == Author
380
+ # Jonno Downes (jonno@jamtronix.com)
381
+ #
382
+ # == Copyright
383
+ # Copyright (c) 2007 Jonno Downes (jonno@jamtronix.com)
384
+ #
385
+ #Permission is hereby granted, free of charge, to any person obtaining
386
+ #a copy of this software and associated documentation files (the
387
+ #"Software"), to deal in the Software without restriction, including
388
+ #without limitation the rights to use, copy, modify, merge, publish,
389
+ #distribute, sublicense, and/or sell copies of the Software, and to
390
+ #permit persons to whom the Software is furnished to do so, subject to
391
+ #the following conditions:
392
+
393
+ # The above copyright notice and this permission notice shall be
394
+ # included in all copies or substantial portions of the Software.
395
+
396
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
397
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
398
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
399
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
400
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
401
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
402
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.