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/CPMDisk.rb ADDED
@@ -0,0 +1,194 @@
1
+ $:.unshift(File.dirname(__FILE__)) unless
2
+ $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
3
+
4
+ # Disk image with CPM File System
5
+ #catalog will be on track 2
6
+ #CPM DIR looks like this:
7
+ #$00 User number, or E5h if it's a free entry
8
+ #$01..0B Filename + extension: 8+3 characters
9
+ #$0C..0D Extent number of this entry
10
+ #$0E..0F Number of 128-byte records used in last alloc. block
11
+ #$10..1F Allocation map for this directory entry
12
+
13
+ require 'CPMFile'
14
+ class CPMDisk < DSK
15
+ attr_accessor :free_blocks,:free_directory_entries
16
+ RECORD_SIZE=128
17
+ BLOCK_SIZE=1024
18
+ BLOCKS_PER_EXTENT=16
19
+ RECORDS_PER_BLOCK=BLOCK_SIZE/RECORD_SIZE
20
+ RECORDS_PER_EXTENT=RECORDS_PER_BLOCK*BLOCKS_PER_EXTENT
21
+
22
+ SECTORS_IN_BLOCK=[
23
+ [0x00,0x06,0x0C,0x03], #block 0
24
+ [0x09,0x0F,0x0E,0x05], #block 1
25
+ [0x0B,0x02,0x08,0x07], #block 2
26
+ [0x0D,0x04,0x0A,0x01] #block 3
27
+ ]
28
+
29
+ def get_block(block_no)
30
+ track_no= ((block_no/4)+3)%track_count
31
+ s=""
32
+ SECTORS_IN_BLOCK[block_no%4].each {|sector_no|s+=get_sector(track_no,sector_no)}
33
+ s
34
+ end
35
+
36
+ def set_block(block_no,contents)
37
+ raise "invalid block #{block_no} - length was #{contents.length}" unless contents.length==BLOCK_SIZE
38
+ track_no=(block_no/4)+3
39
+ 0.upto(3) do |i|
40
+ sector_no=SECTORS_IN_BLOCK[block_no%4][i]
41
+ set_sector(track_no,sector_no,contents[(i*256),256])
42
+ end
43
+ end
44
+
45
+ def dump_catalog
46
+ s=""
47
+ files.keys.sort.each { |file_name|
48
+ file=files[file_name]
49
+ s<< sprintf("% 12s % 6d \n",file.full_filename,file.contents.length)
50
+ }
51
+ s
52
+ end
53
+
54
+
55
+ def initialize(file_bytes,sector_order)
56
+ super(file_bytes,sector_order)
57
+ self.read_catalog
58
+ end
59
+
60
+ def file_system
61
+ :cpm
62
+ end
63
+
64
+ def make_file(filename,contents,file_options={})
65
+ return CPMFile.new(filename,contents)
66
+ end
67
+
68
+
69
+ def delete_file(full_filename)
70
+ catalog=get_block(0)+get_block(1)
71
+ (partial_filename,file_ext)=CPMFile.split_filename(full_filename)
72
+ 0.upto(63) do |dir_entry_no|
73
+ dir_entry_start=dir_entry_no*0x20
74
+ dir_entry=catalog[dir_entry_start..dir_entry_start+0x1F]
75
+ if (partial_filename==dir_entry[0x01..0x08].gsub(' ','')) && (file_ext==dir_entry[0x09..0x0B].gsub(' ',''))
76
+ #we found a matching filename, so set the 'user number' field to a 'blank' entry
77
+ catalog[dir_entry_start]=0xE5
78
+ end
79
+ end
80
+
81
+ set_block(0,catalog[0,BLOCK_SIZE])
82
+ set_block(1,catalog[BLOCK_SIZE,BLOCK_SIZE])
83
+ self.read_catalog
84
+ end
85
+
86
+ def add_file(file)
87
+ raise "only CPMFiles may be added to CPM format disks!" unless file.kind_of?(CPMFile)
88
+ delete_file(file.full_filename) #so we can overwrite the file if it already exists
89
+
90
+ total_record_count=(file.contents.length/RECORD_SIZE.to_f).ceil
91
+ total_blocks_needed=(total_record_count/RECORDS_PER_BLOCK.to_f).ceil
92
+ total_extents_needed=(total_blocks_needed/BLOCKS_PER_EXTENT.to_f).ceil
93
+
94
+ raise "#{total_blocks_needed} free blocks required, only #{free_blocks.length} available" unless total_blocks_needed<=free_blocks.length
95
+ raise "#{total_extents_needed} free directory entries required, only #{free_directory_entries.length} available" unless total_extents_needed<=free_directory_entries.length
96
+ catalog=get_block(0)+get_block(1)
97
+ padded_file_contents=file.contents+(0x1A.chr*BLOCK_SIZE)
98
+
99
+ 0.upto(total_extents_needed-1) do |extent_no|
100
+ records_this_extent=(extent_no==(total_extents_needed-1) ? (total_record_count % RECORDS_PER_EXTENT):RECORDS_PER_EXTENT)
101
+ blocks_this_extent=(records_this_extent/RECORDS_PER_BLOCK.to_f).ceil
102
+ blocks_used=[0]*BLOCKS_PER_EXTENT
103
+ first_record_this_extent=extent_no*RECORDS_PER_EXTENT
104
+ contents_this_extent=padded_file_contents[(first_record_this_extent*RECORD_SIZE),blocks_this_extent*BLOCK_SIZE]
105
+
106
+ 0.upto(blocks_this_extent-1) do |block_no|
107
+ this_block=free_blocks[block_no+(extent_no*BLOCKS_PER_EXTENT)]
108
+ set_block(this_block,contents_this_extent[block_no*BLOCK_SIZE,BLOCK_SIZE])
109
+ blocks_used[block_no]=this_block
110
+ end
111
+ dir_entry_no=free_directory_entries[extent_no]
112
+ dir_entry_start=dir_entry_no*0x20
113
+ dir_entry=[0,file.filename,file.file_type,extent_no,0,0,records_this_extent,blocks_used].flatten.pack("CA8A3C4C16")
114
+ catalog[dir_entry_start..dir_entry_start+0x1F]=dir_entry
115
+ end
116
+
117
+ set_block(0,catalog[0,BLOCK_SIZE])
118
+ set_block(1,catalog[BLOCK_SIZE,BLOCK_SIZE])
119
+ self.read_catalog
120
+
121
+ end
122
+
123
+
124
+ #reads the directory, and populate the "files" array with files
125
+ #CPM DIR looks like this:
126
+ #$00 User number, or E5h if it's a free entry
127
+ #$01..0B Filename + extension: 8+3 characters
128
+ #$0C..0D Extent number of this entry
129
+ #$0E ???
130
+ #$0F Number of 128-byte records allocated in this extant
131
+ #$10..1F Allocation map for this directory entry
132
+ def read_catalog
133
+ @free_blocks=[]
134
+ @free_directory_entries=[]
135
+ @files={}
136
+ #first two blocks are where the catalog lives
137
+ (2..((track_count-3)*4)-1).each {|block| @free_blocks<<block}
138
+ catalog=get_block(0)+get_block(1)
139
+ #require 'DumpUtilities'
140
+ #puts DumpUtilities.hex_dump(catalog)
141
+ 0.upto(63) do |dir_entry_no|
142
+ #puts dir_entry_no
143
+ dir_entry_start=dir_entry_no*0x20
144
+ dir_entry=catalog[dir_entry_start..dir_entry_start+0x1F]
145
+ if (dir_entry[0]<0x10) then
146
+ file_name=dir_entry[0x01..0x08].gsub(' ','')
147
+ file_ext=dir_entry[0x09..0x0B].gsub(' ','')
148
+
149
+ if (file_ext=="BAS") then
150
+ file=MBASICFile.new("#{file_name}.#{file_ext}",'')
151
+ else
152
+ file=CPMFile.new("#{file_name}.#{file_ext}",'')
153
+ end
154
+ if @files[file.full_filename].nil? then
155
+ @files[file.full_filename]=file
156
+ end
157
+ s=""
158
+ 0x10.upto(0x1f) do |i|
159
+ block=dir_entry[i]
160
+ @free_blocks.delete(block)
161
+ s+=get_block(block) unless block==0
162
+ end
163
+ records_allocated=dir_entry[0x0F]
164
+ @files[file.full_filename].contents+=s[0,(records_allocated*128)]
165
+ else
166
+ @free_directory_entries<<dir_entry_no
167
+ end
168
+ end
169
+ end
170
+ end
171
+ # == Author
172
+ # Jonno Downes (jonno@jamtronix.com)
173
+ #
174
+ # == Copyright
175
+ # Copyright (c) 2007 Jonno Downes (jonno@jamtronix.com)
176
+ #
177
+ #Permission is hereby granted, free of charge, to any person obtaining
178
+ #a copy of this software and associated documentation files (the
179
+ #"Software"), to deal in the Software without restriction, including
180
+ #without limitation the rights to use, copy, modify, merge, publish,
181
+ #distribute, sublicense, and/or sell copies of the Software, and to
182
+ #permit persons to whom the Software is furnished to do so, subject to
183
+ #the following conditions:
184
+
185
+ # The above copyright notice and this permission notice shall be
186
+ # included in all copies or substantial portions of the Software.
187
+
188
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
189
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
190
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
191
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
192
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
193
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
194
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/lib/CPMFile.rb ADDED
@@ -0,0 +1,344 @@
1
+ $:.unshift(File.dirname(__FILE__)) unless
2
+ $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
3
+
4
+ require 'DSKFile'
5
+ require 'HGR'
6
+
7
+ class CPMFile < DSKFile
8
+ attr_accessor :file_type
9
+ def CPMFile.split_filename(filename)
10
+ filename=~/^([^.]{0,8})(\.([^.]{0,3}))?$/ #filename should have 0-8 chars, then optionally a dot and up to 3 more chars.
11
+ partial_filename=$1
12
+ ext=$3
13
+ ext="" if ext.nil?
14
+ return [partial_filename,ext]
15
+ end
16
+ def initialize(filename,contents)
17
+ @filename,@file_type=CPMFile.split_filename(filename)
18
+ raise "invalid filename #{filename}" if @filename.nil?
19
+ @contents=contents
20
+ end
21
+
22
+ def full_filename
23
+ if @file_type=="" then
24
+ @filename
25
+ else
26
+ "#{@filename}.#{@file_type}"
27
+ end
28
+ end
29
+
30
+ def to_s
31
+ @contents.gsub(/\x1A*$/,'')
32
+ end
33
+
34
+ def file_extension
35
+ return "."+@file_type.downcase
36
+ end
37
+
38
+ def can_be_picture?
39
+ file_type==:foto && HGR.can_be_hgr_screen?(@contents)
40
+ end
41
+
42
+ def to_png(pallete_mode=:amber)
43
+ HGR.buffer_to_png(@contents,pallete_mode)
44
+ end
45
+ end
46
+
47
+ class MBASICFile<CPMFile
48
+
49
+ #the CP/M MBASIC file format is very similar to the MS-DOS BASICA/GWBASIC formats, described at
50
+ #http://www.chebucto.ns.ca/~af380/GW-BASIC-tokens.html
51
+
52
+ SINGLE_BYTE_TOKENS={
53
+ 0x81=>'END',
54
+ 0x82=>'FOR',
55
+ 0x83=>'NEXT',
56
+ 0x84=>'DATA',
57
+ 0x85=>'INPUT',
58
+ 0x86=>'DIM',
59
+ 0x87=>'READ',
60
+ 0x88=>'LET',
61
+ 0x89=>'GOTO',
62
+ 0x8A=>'RUN',
63
+ 0x8B=>'IF',
64
+ 0x8C=>'RESTORE',
65
+ 0x8D=>'GOSUB',
66
+ 0x8E=>'RETURN',
67
+ 0x8F=>'REM',
68
+ 0x90=>'STOP',
69
+ 0x91=>'PRINT',
70
+ 0x92=>'CLEAR',
71
+ 0x93=>'LIST',
72
+ 0x94=>'NEW',
73
+ 0x95=>'ON',
74
+ 0x96=>'DEF',
75
+ 0x97=>'POKE',
76
+ 0x98=>'CONT',
77
+ 0x9B=>'LPRINT',
78
+ 0x9C=>'LLIST',
79
+ 0x9D=>'WIDTH',
80
+ 0x9E=>'ELSE',
81
+ 0x9F=>'TRACE',
82
+ 0xA0=>'NOTRACE',
83
+ 0xA1=>'SWAP',
84
+ 0xA2=>'ERASE',
85
+ 0xA3=>'EDIT',
86
+ 0xA4=>'ERROR',
87
+ 0xA5=>'RESUME',
88
+ 0xA6=>'DEL',
89
+ 0xA7=>'AUTO',
90
+ 0xA8=>'RENUM',
91
+ 0xA9=>'DEFSTR',
92
+ 0xAA=>'DEFINT',
93
+ 0xAB=>'DEFSNG',
94
+ 0xAC=>'DEFDBL',
95
+ 0xAD=>'LINE',
96
+ 0xAE=>'POP',
97
+ 0xAF=>'WHILE',
98
+ 0xB0=>'WEND',
99
+ 0xB1=>'CALL',
100
+ 0xB2=>'WRITE',
101
+ 0xB3=>'COMMON',
102
+ 0xB4=>'CHAIN',
103
+ 0xB5=>'OPTION',
104
+ 0xB6=>'RANDOMIZE',
105
+ 0xB7=>'SYSTEM',
106
+ 0xB8=>'OPEN',
107
+ 0xB9=>'FIELD',
108
+ 0xBA=>'GET',
109
+ 0xBB=>'PUT',
110
+ 0xBC=>'CLOSE',
111
+ 0xBD=>'LOAD',
112
+ 0xBE=>'MERGE',
113
+ 0xBF=>'FILES',
114
+ 0xC0=>'NAME',
115
+ 0xC1=>'KILL',
116
+ 0xC2=>'LSET',
117
+ 0xC3=>'RSET',
118
+ 0xC4=>'SAVE',
119
+ 0xC5=>'RESET',
120
+ 0xC6=>'TEXT',
121
+ 0xC7=>'HOME',
122
+ 0xC8=>'VTAB',
123
+ 0xC9=>'HTAB',
124
+ 0xCA=>'INVERSE',
125
+ 0xCB=>'NORMAL',
126
+ 0xCC=>'GR',
127
+ 0xCD=>'COLOR',
128
+ 0xCE=>'HLIN',
129
+ 0xCF=>'VLIN',
130
+ 0xD0=>'PLOT',
131
+ 0xD1=>'HGR',
132
+ 0xD2=>'HPLOT',
133
+ 0xD3=>'HCOLOR',
134
+ 0xD4=>'BEEP',
135
+ 0xD5=>'WAIT',
136
+ 0xDD=>'TO',
137
+ 0xDE=>'THEN',
138
+ 0xDF=>'TAB(',
139
+ 0xE0=>'STEP',
140
+ 0xE1=>'USR',
141
+ 0xE2=>'FN',
142
+ 0xE3=>'SPC(',
143
+ 0xE4=>'NOT',
144
+ 0xE5=>'ERL',
145
+ 0xE6=>'ERR',
146
+ 0xE7=>'STRING$',
147
+ 0xE8=>'USING',
148
+ 0xE9=>'INSTR',
149
+ 0xEA=>"'",
150
+ 0xEB=>'VARPTR',
151
+ 0xEC=>'SCRN',
152
+ 0xED=>'HSCRN',
153
+ 0xEE=>'INKEY$',
154
+ 0xEF=>'>',
155
+ 0xF0=>'=',
156
+ 0xF1=>'<',
157
+ 0xF2=>'+',
158
+ 0xF3=>'-',
159
+ 0xF4=>'*',
160
+ 0xF5=>'/',
161
+ 0xF6=>'^',
162
+ 0xF7=>'AND',
163
+ 0xF8=>'OR',
164
+ 0xF9=>'XOR',
165
+ 0xFA=>'EQV',
166
+ 0xFB=>'IMP',
167
+ 0xFC=>'MOD',
168
+ 0xFD=>'\\',
169
+ }
170
+ DOUBLE_BYTE_TOKENS={
171
+ 0x81=>'LEFT$',
172
+ 0x82=>'RIGHT$',
173
+ 0x83=>'MID$',
174
+ 0x84=>'SGN',
175
+ 0x85=>'INT',
176
+ 0x87=>'SQR',
177
+ 0x88=>'RND',
178
+ 0x89=>'SIN',
179
+ 0x8A=>'LOG',
180
+ 0x8B=>'EXP',
181
+ 0x8C=>'COS',
182
+ 0x8D=>'TAN',
183
+ 0x8E=>'ATN',
184
+ 0x8F=>'FRE',
185
+ 0x90=>'POS',
186
+ 0x91=>'LEN',
187
+ 0x92=>'STR$',
188
+ 0x93=>'VAL',
189
+ 0x94=>'ASC',
190
+ 0x95=>'CHR$',
191
+ 0x96=>'PEEK',
192
+ 0x97=>'SPACE$',
193
+ 0x98=>'OCT$',
194
+ 0x99=>'HEX$',
195
+ 0x9A=>'LPOS',
196
+ 0x9B=>'CINT',
197
+ 0x9C=>'CSNG',
198
+ 0x9D=>'CDBL',
199
+ 0x9E=>'FIX',
200
+ 0xAA=>'CVI',
201
+ 0xAB=>'CVS',
202
+ 0xAC=>'CVD',
203
+ 0xAE=>'EOF',
204
+ 0xAF=>'LOC',
205
+ 0xB0=>'LOF',
206
+ 0xB1=>'MKI$',
207
+ 0xB2=>'MKS$',
208
+ 0xB3=>'MKD$',
209
+ 0xB4=>'VPOS',
210
+ 0xB5=>'PDL',
211
+ 0xB6=>'BUTTON',
212
+ }
213
+
214
+
215
+ def to_s
216
+ if @contents[0]==0xFF then
217
+ buffer_as_gbasic(@contents)
218
+ else
219
+ @contents
220
+ end
221
+ end
222
+
223
+ def parse_bytes_as_float(bytes)
224
+ return 0.0 if bytes[0]==0
225
+ exponent=2**(bytes[0]-0x80)
226
+ first_byte=bytes[1]
227
+ sign=-1.0 #assume it's negative
228
+ if first_byte<0x80 then
229
+ sign=1.0
230
+ first_byte+=0x80
231
+ end
232
+ mantissa=(first_byte/256.0)*sign
233
+ 2.upto(bytes.length-1) do |i|
234
+ mantissa+=(bytes[i]/(256.0**i))
235
+ end
236
+ return sprintf("%8f",exponent*mantissa).to_f
237
+ end
238
+
239
+
240
+ def buffer_as_gbasic(buffer)
241
+ s=""
242
+ p=1
243
+ while(p<buffer.length) && (buffer[p]!=0)
244
+ p+=2 #skip the 2 byte pointer to the start of next line
245
+ line_number=buffer[p]+(buffer[p+1]<<8)
246
+ p+=2
247
+ s+= "#{line_number} "
248
+ while(p<buffer.length) && (buffer[p]!=0)
249
+ c=buffer[p]
250
+ p+=1
251
+
252
+ if (c==0x3A) then #if its a ':'
253
+
254
+ if buffer[p]==0x9E then #ELSE is actually stored as :ELSE
255
+ c=buffer[p]
256
+ p+=1
257
+ end
258
+ if buffer[p]==0x8F then #' is actually stored as :REM'
259
+ c=buffer[p+1]
260
+ p+=2
261
+ end
262
+ end
263
+ if c<0x20 then
264
+ case (c)
265
+ when 0x0B #OCTAL CONSTANT
266
+ constant=buffer[p]+(buffer[p+1]<<8)
267
+ s+=sprintf("&O%o",constant)
268
+ p+=2
269
+
270
+ when 0x0C #HEX CONSTANT
271
+ constant=buffer[p]+(buffer[p+1]<<8)
272
+ s+=sprintf("&H%X",constant)
273
+ p+=2
274
+ when 0x0E #DECIMAL LINE NUMBER
275
+ constant=buffer[p]+(buffer[p+1]<<8)
276
+ s+=sprintf("%d",constant)
277
+ p+=2
278
+ when 0x0F #one byte constant
279
+ constant=buffer[p]
280
+ s+=sprintf("%d",constant)
281
+ p+=1
282
+ when 0x11..0x1B #packed constant 0..9
283
+ s+=sprintf("%d",c-0x11)
284
+ when 0x1C #DECIMAL LINE NUMBER
285
+ constant=buffer[p]+(buffer[p+1]<<8)
286
+ s+=sprintf("%d",constant)
287
+ p+=2
288
+ when 0x1D #4 byte floating point
289
+ constant=parse_bytes_as_float(buffer[p..p+3].reverse)
290
+ s+=constant.to_s
291
+ p+=4
292
+ when 0x1F #8 byte floating point
293
+ constant=parse_bytes_as_float(buffer[p..p+7].reverse)
294
+ s+=constant.to_s
295
+ p+=8
296
+ end
297
+
298
+ elsif c<0x80 then
299
+ s+=c.chr
300
+ else
301
+
302
+ if c==0xFF then
303
+
304
+ c=buffer[p]
305
+ p+=1
306
+ token=DOUBLE_BYTE_TOKENS[c]
307
+ else
308
+ token=SINGLE_BYTE_TOKENS[c]
309
+ end
310
+ s+=(token.nil?) ? sprintf("[%02X]",c):token
311
+
312
+ end
313
+ end
314
+ s+="\n"
315
+ p+=1
316
+ end
317
+ s
318
+ end
319
+
320
+ end
321
+ # == Author
322
+ # Jonno Downes (jonno@jamtronix.com)
323
+ #
324
+ # == Copyright
325
+ # Copyright (c) 2007 Jonno Downes (jonno@jamtronix.com)
326
+ #
327
+ #Permission is hereby granted, free of charge, to any person obtaining
328
+ #a copy of this software and associated documentation files (the
329
+ #"Software"), to deal in the Software without restriction, including
330
+ #without limitation the rights to use, copy, modify, merge, publish,
331
+ #distribute, sublicense, and/or sell copies of the Software, and to
332
+ #permit persons to whom the Software is furnished to do so, subject to
333
+ #the following conditions:
334
+
335
+ # The above copyright notice and this permission notice shall be
336
+ # included in all copies or substantial portions of the Software.
337
+
338
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
339
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
340
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
341
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
342
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
343
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
344
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.