dsktool 0.2.1 → 0.4.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 (663) hide show
  1. data/bin/dskexplorer.rb +79 -61
  2. data/bin/dsktool.rb +243 -142
  3. data/bin/romdump.rb +65 -0
  4. data/doc/classes/AppleSoftFile.html +97 -59
  5. data/doc/classes/AppleSoftFile.src/{M000005.html → M000113.html} +1 -1
  6. data/doc/classes/AppleSoftFile.src/M000114.html +18 -0
  7. data/doc/classes/AppleSoftFile.src/{M000013.html → M000115.html} +1 -1
  8. data/doc/classes/AppleSoftFile.src/{M000014.html → M000116.html} +1 -1
  9. data/doc/classes/AppleSoftFile.src/{M000010.html → M000117.html} +1 -1
  10. data/doc/classes/AppleSoftFile.src/M000118.html +18 -0
  11. data/doc/classes/AppleSoftFile.src/{M000006.html → M000119.html} +1 -1
  12. data/doc/classes/AppleSoftFile.src/{M000022.html → M000120.html} +1 -1
  13. data/doc/classes/BinaryFile.html +184 -26
  14. data/doc/classes/BinaryFile.src/{M000021.html → M000218.html} +1 -1
  15. data/doc/classes/{DOSFile.src/M000017.html → BinaryFile.src/M000219.html} +4 -3
  16. data/doc/classes/BinaryFile.src/{M000025.html → M000220.html} +1 -1
  17. data/doc/classes/BinaryFile.src/M000221.html +19 -0
  18. data/doc/classes/BinaryFile.src/M000222.html +19 -0
  19. data/doc/classes/BinaryFile.src/M000223.html +19 -0
  20. data/doc/classes/BinaryFile.src/M000224.html +18 -0
  21. data/doc/classes/BinaryFile.src/{M000015.html → M000225.html} +1 -1
  22. data/doc/classes/{AppleSoftFile.src/M000008.html → BinaryFile.src/M000226.html} +4 -4
  23. data/doc/classes/BinaryFile.src/{M000030.html → M000227.html} +1 -1
  24. data/doc/classes/BinaryFile.src/M000228.html +19 -0
  25. data/doc/classes/BinaryFile.src/M000229.html +19 -0
  26. data/doc/classes/BinaryFile.src/M000230.html +19 -0
  27. data/doc/classes/BinaryFile.src/M000231.html +18 -0
  28. data/doc/classes/CatalogServlet.html +5 -15
  29. data/doc/classes/CatalogServlet.src/{M000021.html → M000064.html} +1 -1
  30. data/doc/classes/D65.html +60 -18
  31. data/doc/classes/D65.src/{M000006.html → M000099.html} +0 -0
  32. data/doc/classes/D65.src/{M000032.html → M000100.html} +6 -6
  33. data/doc/classes/D65.src/{M000009.html → M000101.html} +1 -1
  34. data/doc/classes/D65.src/{M000011.html → M000102.html} +7 -7
  35. data/doc/classes/DOSDisk.html +291 -23
  36. data/doc/classes/DOSDisk.src/M000127.html +23 -0
  37. data/doc/classes/DOSDisk.src/M000128.html +18 -0
  38. data/doc/classes/DOSDisk.src/{M000012.html → M000129.html} +3 -3
  39. data/doc/classes/DOSDisk.src/M000130.html +37 -0
  40. data/doc/classes/DOSDisk.src/{M000043.html → M000131.html} +17 -8
  41. data/doc/classes/DOSDisk.src/M000132.html +37 -0
  42. data/doc/classes/DOSDisk.src/M000133.html +34 -0
  43. data/doc/classes/DOSDisk.src/M000134.html +27 -0
  44. data/doc/classes/DOSDisk.src/M000135.html +43 -0
  45. data/doc/classes/DOSDisk.src/M000136.html +31 -0
  46. data/doc/classes/DOSDisk.src/M000137.html +95 -0
  47. data/doc/classes/DOSDisk.src/M000138.html +23 -0
  48. data/doc/classes/{BinaryFile.src/M000023.html → DOSDisk.src/M000139.html} +4 -4
  49. data/doc/classes/DOSDisk.src/{M000016.html → M000140.html} +3 -3
  50. data/doc/classes/DOSDisk.src/M000141.html +22 -0
  51. data/doc/classes/DOSDisk.src/{M000017.html → M000142.html} +26 -17
  52. data/doc/classes/DOSDisk.src/M000143.html +37 -0
  53. data/doc/classes/DOSDisk.src/M000144.html +34 -0
  54. data/doc/classes/DOSDisk.src/M000145.html +92 -0
  55. data/doc/classes/DOSFile.html +135 -36
  56. data/doc/classes/DOSFile.src/{M000016.html → M000251.html} +5 -5
  57. data/doc/classes/DOSFile.src/{M000043.html → M000252.html} +1 -1
  58. data/doc/classes/DOSFile.src/M000253.html +18 -0
  59. data/doc/classes/DOSFile.src/M000254.html +28 -0
  60. data/doc/classes/DOSFile.src/M000255.html +18 -0
  61. data/doc/classes/DOSFile.src/{M000021.html → M000256.html} +4 -4
  62. data/doc/classes/DOSFile.src/{M000049.html → M000257.html} +1 -1
  63. data/doc/classes/DOSFile.src/M000258.html +18 -0
  64. data/doc/classes/DOSFile.src/M000259.html +28 -0
  65. data/doc/classes/DSK.html +735 -65
  66. data/doc/classes/DSK.src/{M000027.html → M000163.html} +3 -2
  67. data/doc/classes/{D65.src/M000003.html → DSK.src/M000164.html} +4 -4
  68. data/doc/classes/DSK.src/M000165.html +18 -0
  69. data/doc/classes/DSK.src/M000166.html +18 -0
  70. data/doc/classes/DSK.src/M000167.html +18 -0
  71. data/doc/classes/DSK.src/M000168.html +18 -0
  72. data/doc/classes/DSK.src/M000169.html +25 -0
  73. data/doc/classes/DSK.src/{M000043.html → M000170.html} +3 -2
  74. data/doc/classes/DSK.src/M000171.html +22 -0
  75. data/doc/classes/DSK.src/M000172.html +22 -0
  76. data/doc/classes/DSK.src/{M000035.html → M000173.html} +7 -3
  77. data/doc/classes/DSK.src/M000174.html +25 -0
  78. data/doc/classes/DSK.src/M000175.html +30 -0
  79. data/doc/classes/DSK.src/M000176.html +65 -0
  80. data/doc/classes/DSK.src/M000177.html +22 -0
  81. data/doc/classes/DSK.src/M000178.html +23 -0
  82. data/doc/classes/DSK.src/M000179.html +24 -0
  83. data/doc/classes/DSK.src/M000180.html +21 -0
  84. data/doc/classes/DSK.src/{M000012.html → M000181.html} +1 -1
  85. data/doc/classes/DSK.src/M000182.html +24 -0
  86. data/doc/classes/DSK.src/{M000053.html → M000183.html} +1 -1
  87. data/doc/classes/DSK.src/{M000054.html → M000184.html} +3 -3
  88. data/doc/classes/DSK.src/{M000033.html → M000185.html} +3 -2
  89. data/doc/classes/{DOSFile.src/M000018.html → DSK.src/M000186.html} +4 -4
  90. data/doc/classes/DSK.src/M000187.html +18 -0
  91. data/doc/classes/DSK.src/M000188.html +18 -0
  92. data/doc/classes/DSK.src/M000189.html +18 -0
  93. data/doc/classes/DSK.src/M000190.html +18 -0
  94. data/doc/classes/DSK.src/M000191.html +25 -0
  95. data/doc/classes/DSK.src/{M000047.html → M000192.html} +3 -2
  96. data/doc/classes/DSK.src/M000193.html +22 -0
  97. data/doc/classes/DSK.src/M000194.html +22 -0
  98. data/doc/classes/DSK.src/{M000015.html → M000195.html} +7 -3
  99. data/doc/classes/DSK.src/M000196.html +20 -0
  100. data/doc/classes/DSK.src/M000197.html +21 -0
  101. data/doc/classes/DSK.src/M000198.html +27 -0
  102. data/doc/classes/DSK.src/M000199.html +65 -0
  103. data/doc/classes/DSK.src/M000200.html +22 -0
  104. data/doc/classes/DSK.src/M000201.html +23 -0
  105. data/doc/classes/DSK.src/M000202.html +24 -0
  106. data/doc/classes/DSK.src/M000203.html +21 -0
  107. data/doc/classes/DSK.src/{M000022.html → M000204.html} +1 -1
  108. data/doc/classes/DSK.src/M000205.html +24 -0
  109. data/doc/classes/DSK.src/M000206.html +24 -0
  110. data/doc/classes/DSK.src/{M000024.html → M000207.html} +6 -5
  111. data/doc/classes/DSKFile.html +472 -0
  112. data/doc/classes/{NADOLFile.src/M000027.html → DSKFile.src/M000147.html} +2 -2
  113. data/doc/classes/{DOSFile.src/M000025.html → DSKFile.src/M000148.html} +2 -2
  114. data/doc/classes/DSKFile.src/M000149.html +25 -0
  115. data/doc/classes/{BinaryFile.src/M000040.html → DSKFile.src/M000150.html} +2 -2
  116. data/doc/classes/DSKFile.src/M000151.html +18 -0
  117. data/doc/classes/{BinaryFile.src/M000020.html → DSKFile.src/M000152.html} +4 -4
  118. data/doc/classes/DSKFile.src/M000153.html +18 -0
  119. data/doc/classes/DSKFile.src/M000154.html +50 -0
  120. data/doc/classes/{NADOLFile.src/M000031.html → DSKFile.src/M000155.html} +2 -2
  121. data/doc/classes/{DOSFile.src/M000029.html → DSKFile.src/M000156.html} +2 -2
  122. data/doc/classes/DSKFile.src/M000157.html +25 -0
  123. data/doc/classes/{BinaryFile.src/M000046.html → DSKFile.src/M000158.html} +2 -2
  124. data/doc/classes/DSKFile.src/M000159.html +18 -0
  125. data/doc/classes/DSKFile.src/M000160.html +18 -0
  126. data/doc/classes/DSKFile.src/M000161.html +18 -0
  127. data/doc/classes/DSKFile.src/M000162.html +50 -0
  128. data/doc/classes/DSKTrackSector.html +256 -0
  129. data/doc/classes/DSKTrackSector.src/M000093.html +20 -0
  130. data/doc/classes/DSKTrackSector.src/M000094.html +18 -0
  131. data/doc/classes/DSKTrackSector.src/M000095.html +21 -0
  132. data/doc/classes/DSKTrackSector.src/M000096.html +20 -0
  133. data/doc/classes/DSKTrackSector.src/M000097.html +18 -0
  134. data/doc/classes/DSKTrackSector.src/M000098.html +21 -0
  135. data/doc/classes/DirectoryServlet.html +5 -15
  136. data/doc/classes/DirectoryServlet.src/{M000023.html → M000086.html} +1 -1
  137. data/doc/classes/DumpUtilities.html +186 -0
  138. data/doc/classes/DumpUtilities.src/M000109.html +33 -0
  139. data/doc/classes/DumpUtilities.src/M000110.html +23 -0
  140. data/doc/classes/DumpUtilities.src/M000111.html +33 -0
  141. data/doc/classes/DumpUtilities.src/M000112.html +23 -0
  142. data/doc/classes/HGR.html +324 -0
  143. data/doc/classes/HGR.src/M000247.html +29 -0
  144. data/doc/classes/HGR.src/M000248.html +56 -0
  145. data/doc/classes/HGR.src/M000249.html +29 -0
  146. data/doc/classes/HGR.src/M000250.html +56 -0
  147. data/doc/classes/IntegerBasicFile.html +127 -26
  148. data/doc/classes/IntegerBasicFile.src/{M000001.html → M000056.html} +1 -1
  149. data/doc/classes/IntegerBasicFile.src/{M000007.html → M000057.html} +1 -1
  150. data/doc/classes/IntegerBasicFile.src/M000058.html +18 -0
  151. data/doc/classes/IntegerBasicFile.src/{M000008.html → M000059.html} +1 -1
  152. data/doc/classes/IntegerBasicFile.src/{M000004.html → M000060.html} +1 -1
  153. data/doc/classes/IntegerBasicFile.src/{M000013.html → M000061.html} +1 -1
  154. data/doc/classes/IntegerBasicFile.src/M000062.html +18 -0
  155. data/doc/classes/IntegerBasicFile.src/{M000014.html → M000063.html} +1 -1
  156. data/doc/classes/NADOLBinaryFile.html +84 -13
  157. data/doc/classes/NADOLBinaryFile.src/{M000033.html → M000103.html} +1 -1
  158. data/doc/classes/{NADOLFile.src/M000028.html → NADOLBinaryFile.src/M000104.html} +4 -4
  159. data/doc/classes/{NADOLFile.src/M000032.html → NADOLBinaryFile.src/M000105.html} +4 -4
  160. data/doc/classes/NADOLBinaryFile.src/{M000037.html → M000106.html} +1 -1
  161. data/doc/classes/{BinaryFile.src/M000055.html → NADOLBinaryFile.src/M000107.html} +4 -4
  162. data/doc/classes/NADOLBinaryFile.src/M000108.html +18 -0
  163. data/doc/classes/NADOLDisk.html +346 -23
  164. data/doc/classes/NADOLDisk.src/M000034.html +23 -0
  165. data/doc/classes/NADOLDisk.src/{M000019.html → M000035.html} +3 -3
  166. data/doc/classes/NADOLDisk.src/M000036.html +18 -0
  167. data/doc/classes/NADOLDisk.src/M000037.html +29 -0
  168. data/doc/classes/NADOLDisk.src/M000038.html +34 -0
  169. data/doc/classes/NADOLDisk.src/M000039.html +32 -0
  170. data/doc/classes/NADOLDisk.src/M000040.html +22 -0
  171. data/doc/classes/NADOLDisk.src/M000041.html +38 -0
  172. data/doc/classes/NADOLDisk.src/M000042.html +27 -0
  173. data/doc/classes/NADOLDisk.src/M000043.html +53 -0
  174. data/doc/classes/NADOLDisk.src/M000044.html +46 -0
  175. data/doc/classes/NADOLDisk.src/M000045.html +23 -0
  176. data/doc/classes/NADOLDisk.src/{M000022.html → M000046.html} +3 -3
  177. data/doc/classes/{AppleSoftFile.src/M000009.html → NADOLDisk.src/M000047.html} +4 -4
  178. data/doc/classes/NADOLDisk.src/M000048.html +29 -0
  179. data/doc/classes/NADOLDisk.src/M000049.html +34 -0
  180. data/doc/classes/NADOLDisk.src/M000050.html +32 -0
  181. data/doc/classes/NADOLDisk.src/M000051.html +22 -0
  182. data/doc/classes/NADOLDisk.src/M000052.html +38 -0
  183. data/doc/classes/NADOLDisk.src/M000053.html +27 -0
  184. data/doc/classes/NADOLDisk.src/M000054.html +53 -0
  185. data/doc/classes/NADOLDisk.src/M000055.html +46 -0
  186. data/doc/classes/NADOLFile.html +67 -51
  187. data/doc/classes/NADOLFile.src/{M000029.html → M000087.html} +1 -1
  188. data/doc/classes/NADOLFile.src/M000088.html +18 -0
  189. data/doc/classes/NADOLFile.src/M000089.html +28 -0
  190. data/doc/classes/NADOLFile.src/{M000033.html → M000090.html} +1 -1
  191. data/doc/classes/NADOLFile.src/M000091.html +18 -0
  192. data/doc/classes/NADOLFile.src/M000092.html +28 -0
  193. data/doc/classes/NADOLTokenisedFile.html +111 -32
  194. data/doc/classes/NADOLTokenisedFile.src/{M000068.html → M000276.html} +1 -1
  195. data/doc/classes/NADOLTokenisedFile.src/M000277.html +49 -0
  196. data/doc/classes/NADOLTokenisedFile.src/{M000064.html → M000278.html} +1 -1
  197. data/doc/classes/NADOLTokenisedFile.src/{M000065.html → M000279.html} +1 -1
  198. data/doc/classes/NADOLTokenisedFile.src/{M000061.html → M000280.html} +1 -1
  199. data/doc/classes/NADOLTokenisedFile.src/M000281.html +49 -0
  200. data/doc/classes/NADOLTokenisedFile.src/{M000069.html → M000282.html} +1 -1
  201. data/doc/classes/NADOLTokenisedFile.src/{M000070.html → M000283.html} +1 -1
  202. data/doc/classes/PNG.html +163 -0
  203. data/doc/classes/PNG.src/M000284.html +26 -0
  204. data/doc/classes/PNG.src/M000285.html +26 -0
  205. data/doc/classes/PascalDisk.html +274 -0
  206. data/doc/classes/PascalDisk.src/M000268.html +23 -0
  207. data/doc/classes/PascalDisk.src/M000269.html +19 -0
  208. data/doc/classes/PascalDisk.src/M000270.html +18 -0
  209. data/doc/classes/PascalDisk.src/M000271.html +60 -0
  210. data/doc/classes/PascalDisk.src/M000272.html +23 -0
  211. data/doc/classes/PascalDisk.src/M000273.html +19 -0
  212. data/doc/classes/PascalDisk.src/M000274.html +18 -0
  213. data/doc/classes/PascalDisk.src/M000275.html +60 -0
  214. data/doc/classes/PascalFile.html +322 -0
  215. data/doc/classes/{DOSFile.src/M000022.html → PascalFile.src/M000237.html} +5 -6
  216. data/doc/classes/{TextFile.src/M000027.html → PascalFile.src/M000238.html} +3 -3
  217. data/doc/classes/{AppleSoftFile.src/M000028.html → PascalFile.src/M000239.html} +3 -3
  218. data/doc/classes/PascalFile.src/M000240.html +19 -0
  219. data/doc/classes/PascalFile.src/M000241.html +18 -0
  220. data/doc/classes/{DOSFile.src/M000023.html → PascalFile.src/M000242.html} +5 -6
  221. data/doc/classes/{TextFile.src/M000032.html → PascalFile.src/M000243.html} +3 -3
  222. data/doc/classes/PascalFile.src/M000244.html +18 -0
  223. data/doc/classes/PascalFile.src/M000245.html +19 -0
  224. data/doc/classes/PascalFile.src/M000246.html +18 -0
  225. data/doc/classes/ProDOSDisk.html +414 -0
  226. data/doc/classes/ProDOSDisk.src/M000073.html +18 -0
  227. data/doc/classes/ProDOSDisk.src/M000074.html +23 -0
  228. data/doc/classes/{DOSDisk.src/M000030.html → ProDOSDisk.src/M000075.html} +5 -5
  229. data/doc/classes/ProDOSDisk.src/M000076.html +18 -0
  230. data/doc/classes/{DSK.src/M000052.html → ProDOSDisk.src/M000077.html} +8 -9
  231. data/doc/classes/ProDOSDisk.src/M000078.html +98 -0
  232. data/doc/classes/ProDOSDisk.src/M000079.html +18 -0
  233. data/doc/classes/ProDOSDisk.src/M000080.html +23 -0
  234. data/doc/classes/ProDOSDisk.src/M000081.html +19 -0
  235. data/doc/classes/ProDOSDisk.src/M000082.html +18 -0
  236. data/doc/classes/ProDOSDisk.src/M000083.html +36 -0
  237. data/doc/classes/ProDOSDisk.src/M000084.html +98 -0
  238. data/doc/classes/ProDOSFile.html +282 -0
  239. data/doc/classes/ProDOSFile.src/M000121.html +23 -0
  240. data/doc/classes/{AppleSoftFile.src/M000036.html → ProDOSFile.src/M000122.html} +3 -3
  241. data/doc/classes/ProDOSFile.src/M000123.html +30 -0
  242. data/doc/classes/ProDOSFile.src/M000124.html +23 -0
  243. data/doc/classes/ProDOSFile.src/M000125.html +18 -0
  244. data/doc/classes/ProDOSFile.src/M000126.html +30 -0
  245. data/doc/classes/RDoc.html +29 -12
  246. data/doc/classes/RDoc.src/{M000048.html → M000295.html} +0 -0
  247. data/doc/classes/RDoc.src/{M000032.html → M000296.html} +1 -1
  248. data/doc/classes/SCAsmFile.html +117 -31
  249. data/doc/classes/SCAsmFile.src/{M000048.html → M000208.html} +1 -1
  250. data/doc/classes/{DOSFile.src/M000024.html → SCAsmFile.src/M000209.html} +4 -3
  251. data/doc/classes/SCAsmFile.src/{M000026.html → M000210.html} +1 -1
  252. data/doc/classes/SCAsmFile.src/{M000027.html → M000211.html} +1 -1
  253. data/doc/classes/SCAsmFile.src/{M000058.html → M000212.html} +1 -1
  254. data/doc/classes/SCAsmFile.src/{M000025.html → M000213.html} +1 -1
  255. data/doc/classes/SCAsmFile.src/M000214.html +18 -0
  256. data/doc/classes/SCAsmFile.src/{M000036.html → M000215.html} +1 -1
  257. data/doc/classes/SCAsmFile.src/{M000037.html → M000216.html} +1 -1
  258. data/doc/classes/SCAsmFile.src/{M000053.html → M000217.html} +4 -1
  259. data/doc/classes/ShowFileServlet.html +5 -15
  260. data/doc/classes/ShowFileServlet.src/{M000040.html → M000146.html} +2 -2
  261. data/doc/classes/ShowPNGServlet.html +137 -0
  262. data/doc/classes/{ShowFileServlet.src/M000032.html → ShowPNGServlet.src/M000232.html} +10 -6
  263. data/doc/classes/ShowSectorServlet.html +5 -15
  264. data/doc/classes/ShowSectorServlet.src/{M000029.html → M000085.html} +1 -1
  265. data/doc/classes/TestDOSDisks.html +220 -28
  266. data/doc/classes/TestDOSDisks.src/M000014.html +1 -1
  267. data/doc/classes/TestDOSDisks.src/M000015.html +1 -1
  268. data/doc/classes/TestDOSDisks.src/M000016.html +32 -9
  269. data/doc/classes/TestDOSDisks.src/M000017.html +9 -6
  270. data/doc/classes/TestDOSDisks.src/M000018.html +5 -10
  271. data/doc/classes/TestDOSDisks.src/M000019.html +5 -27
  272. data/doc/classes/TestDOSDisks.src/M000020.html +8 -10
  273. data/doc/classes/TestDOSDisks.src/{M000010.html → M000021.html} +9 -3
  274. data/doc/classes/TestDOSDisks.src/{M000011.html → M000022.html} +5 -4
  275. data/doc/classes/TestDOSDisks.src/M000023.html +28 -0
  276. data/doc/classes/TestDOSDisks.src/{M000012.html → M000024.html} +2 -0
  277. data/doc/classes/TestDOSDisks.src/{M000001.html → M000025.html} +1 -1
  278. data/doc/classes/TestDOSDisks.src/M000026.html +62 -0
  279. data/doc/classes/TestDOSDisks.src/M000027.html +22 -0
  280. data/doc/classes/TestDOSDisks.src/M000028.html +20 -0
  281. data/doc/classes/TestDOSDisks.src/{M000008.html → M000029.html} +2 -2
  282. data/doc/classes/TestDOSDisks.src/{M000009.html → M000030.html} +2 -2
  283. data/doc/classes/TestDOSDisks.src/{M000004.html → M000031.html} +9 -3
  284. data/doc/classes/TestDOSDisks.src/{M000005.html → M000032.html} +5 -4
  285. data/doc/classes/TestDOSDisks.src/M000033.html +28 -0
  286. data/doc/classes/TestDisassembly.html +24 -12
  287. data/doc/classes/TestDisassembly.src/{M000008.html → M000071.html} +1 -1
  288. data/doc/classes/TestDisassembly.src/{M000007.html → M000072.html} +0 -0
  289. data/doc/classes/TestNADOLDisks.html +44 -17
  290. data/doc/classes/TestNADOLDisks.src/M000233.html +22 -0
  291. data/doc/classes/TestNADOLDisks.src/M000234.html +73 -0
  292. data/doc/classes/TestNADOLDisks.src/M000235.html +22 -0
  293. data/doc/classes/TestNADOLDisks.src/M000236.html +73 -0
  294. data/doc/classes/TestPascalDisks.html +216 -0
  295. data/doc/classes/TestPascalDisks.src/M000065.html +28 -0
  296. data/doc/classes/TestPascalDisks.src/M000066.html +24 -0
  297. data/doc/classes/TestPascalDisks.src/M000067.html +27 -0
  298. data/doc/classes/TestPascalDisks.src/M000068.html +28 -0
  299. data/doc/classes/TestPascalDisks.src/M000069.html +24 -0
  300. data/doc/classes/TestPascalDisks.src/M000070.html +27 -0
  301. data/doc/classes/TestProDOSDisks.html +246 -0
  302. data/doc/classes/TestProDOSDisks.src/M000260.html +28 -0
  303. data/doc/classes/TestProDOSDisks.src/M000261.html +28 -0
  304. data/doc/classes/TestProDOSDisks.src/M000262.html +41 -0
  305. data/doc/classes/TestProDOSDisks.src/M000263.html +28 -0
  306. data/doc/classes/TestProDOSDisks.src/M000264.html +28 -0
  307. data/doc/classes/TestProDOSDisks.src/M000265.html +28 -0
  308. data/doc/classes/TestProDOSDisks.src/M000266.html +41 -0
  309. data/doc/classes/TestProDOSDisks.src/M000267.html +28 -0
  310. data/doc/classes/TextFile.html +109 -26
  311. data/doc/classes/TextFile.src/{M000019.html → M000286.html} +1 -1
  312. data/doc/classes/{DOSFile.src/M000028.html → TextFile.src/M000287.html} +4 -3
  313. data/doc/classes/TextFile.src/{M000031.html → M000288.html} +1 -1
  314. data/doc/classes/TextFile.src/{M000020.html → M000289.html} +3 -3
  315. data/doc/classes/TextFile.src/{M000024.html → M000290.html} +1 -1
  316. data/doc/classes/TextFile.src/M000291.html +18 -0
  317. data/doc/classes/TextFile.src/{M000036.html → M000292.html} +1 -1
  318. data/doc/classes/TextFile.src/{M000037.html → M000293.html} +3 -3
  319. data/doc/classes/TextFile.src/M000294.html +18 -0
  320. data/doc/created.rid +1 -1
  321. data/doc/dot/f_0.dot +14 -1
  322. data/doc/files/bin/dskexplorer_rb.html +2 -12
  323. data/doc/files/bin/dskexplorer_rb.src/M000007.html +2 -4
  324. data/doc/files/bin/dskexplorer_rb.src/M000008.html +1 -1
  325. data/doc/files/bin/dskexplorer_rb.src/M000009.html +1 -1
  326. data/doc/files/bin/dskexplorer_rb.src/M000010.html +7 -3
  327. data/doc/files/bin/dskexplorer_rb.src/M000011.html +10 -6
  328. data/doc/files/bin/dskexplorer_rb.src/M000012.html +9 -12
  329. data/doc/files/bin/dskexplorer_rb.src/M000013.html +7 -4
  330. data/doc/files/bin/dsktool_rb.html +93 -41
  331. data/doc/files/bin/romdump_rb.html +184 -0
  332. data/doc/files/dsktool_web/dskexplorer_rb.html +107 -0
  333. data/doc/files/dsktool_web/index_rb.html +107 -0
  334. data/doc/files/lib/D65_rb.html +1 -7
  335. data/doc/files/lib/DOSDisk_rb.html +1 -8
  336. data/doc/files/lib/DOSFile_rb.html +3 -12
  337. data/doc/files/{test/test_dos_disks_rb.html → lib/DSKFile_rb.html} +5 -6
  338. data/doc/files/lib/DSK_rb.html +5 -7
  339. data/doc/files/lib/DumpUtilities_rb.html +101 -0
  340. data/doc/files/lib/HGR_rb.html +115 -0
  341. data/doc/files/lib/NADOLDisk_rb.html +1 -8
  342. data/doc/files/lib/NADOLFile_rb.html +3 -9
  343. data/doc/files/lib/PascalDisk_rb.html +108 -0
  344. data/doc/files/lib/PascalFile_rb.html +109 -0
  345. data/doc/files/lib/ProDOSDisk_rb.html +108 -0
  346. data/doc/files/lib/ProDOSFile_rb.html +108 -0
  347. data/doc/files/lib/rdoc_patch_rb.html +1 -7
  348. data/doc/files/test/backup/D65_rb.html +108 -0
  349. data/doc/files/test/backup/DOSDisk_rb.html +108 -0
  350. data/doc/files/test/backup/DOSFile_rb.html +110 -0
  351. data/doc/files/test/backup/DSKFile_rb.html +108 -0
  352. data/doc/files/test/backup/DSK_rb.html +116 -0
  353. data/doc/files/test/backup/DumpUtilities_rb.html +101 -0
  354. data/doc/files/test/backup/HGR_rb.html +115 -0
  355. data/doc/files/test/backup/NADOLDisk_rb.html +108 -0
  356. data/doc/files/test/backup/NADOLFile_rb.html +111 -0
  357. data/doc/files/test/backup/PascalDisk_rb.html +108 -0
  358. data/doc/files/test/backup/PascalFile_rb.html +109 -0
  359. data/doc/files/test/backup/ProDOSDisk_rb.html +108 -0
  360. data/doc/files/test/backup/ProDOSFile_rb.html +108 -0
  361. data/doc/files/test/backup/comp_rb.html +101 -0
  362. data/doc/files/test/backup/compress_dos_dsk_rb.html +114 -0
  363. data/doc/files/test/backup/extract_nadol_startup_rb.html +134 -0
  364. data/doc/files/test/backup/hgr_scanlines_rb.html +101 -0
  365. data/doc/files/test/backup/rdoc_patch_rb.html +108 -0
  366. data/doc/files/test/backup/tc_disassembly_rb.html +116 -0
  367. data/doc/files/test/backup/tc_dos_disks_rb.html +115 -0
  368. data/doc/files/test/backup/tc_nadol_disks_rb.html +115 -0
  369. data/doc/files/test/backup/tc_pascal_disks_rb.html +115 -0
  370. data/doc/files/test/backup/tc_prodos_disks_rb.html +115 -0
  371. data/doc/files/test/backup/ts_test_all_rb.html +112 -0
  372. data/doc/files/test/comp_rb.html +101 -0
  373. data/doc/files/test/compress_dos_dsk_rb.html +114 -0
  374. data/doc/files/test/extract_nadol_startup_rb.html +134 -0
  375. data/doc/files/test/hgr_scanlines_rb.html +101 -0
  376. data/doc/files/test/tc_disassembly_rb.html +1 -8
  377. data/doc/files/test/tc_dos_disks_rb.html +1 -8
  378. data/doc/files/test/tc_nadol_disks_rb.html +1 -8
  379. data/doc/files/test/tc_pascal_disks_rb.html +115 -0
  380. data/doc/files/test/tc_prodos_disks_rb.html +115 -0
  381. data/doc/files/test/ts_test_all_rb.html +3 -6
  382. data/doc/fr_class_index.html +12 -0
  383. data/doc/fr_file_index.html +40 -0
  384. data/doc/fr_method_index.html +281 -59
  385. data/lib/D65.rb +6 -6
  386. data/lib/DOSDisk.rb +248 -18
  387. data/lib/DOSFile.rb +75 -104
  388. data/lib/DSK.rb +198 -44
  389. data/lib/DSKFile.rb +141 -0
  390. data/lib/DumpUtilities.rb +30 -0
  391. data/lib/HGR.rb +136 -0
  392. data/lib/NADOLDisk.rb +199 -42
  393. data/lib/NADOLFile.rb +73 -35
  394. data/lib/PascalDisk.rb +121 -0
  395. data/lib/PascalFile.rb +62 -0
  396. data/lib/ProDOSDisk.rb +197 -0
  397. data/lib/ProDOSFile.rb +162 -0
  398. data/lib/a2_symbols.yaml +2 -2
  399. data/lib/dos33_blank.dsk.gz +0 -0
  400. data/lib/nadol_blank.po.gz +0 -0
  401. data/test/ADTPRO-1.0.1.DSK +0 -0
  402. data/test/ADTPRO-1.0.1.PO +0 -0
  403. data/test/Algebra Mentor (19xx)(John C. Miller)(Disk 1 of 7 Side A)(Student Disk 1).dsk.gz +0 -0
  404. data/test/Apple Works V5.0 (1993)(Beagle Bros)(Disks 5 of 6).dsk.gz +0 -0
  405. data/test/Geos (1988)(Berkeley Softworks)(Disk 1 of 4 Side A).dsk.gz +0 -0
  406. data/test/Zoom Grafix (1982)(Phoenix Software)[cr].dsk.gz +0 -0
  407. data/test/adventure_teacher_4.dsk.gz +0 -0
  408. data/test/camps.dsk.gz +0 -0
  409. data/test/dosmaster.po +0 -0
  410. data/test/hgr_scanlines.rb +194 -0
  411. data/test/nadol1.po +0 -0
  412. data/test/nadol_blank.po.gz +0 -0
  413. data/test/operation_frog1.dsk.gz +0 -0
  414. data/test/tc_dos_disks.rb +89 -14
  415. data/test/tc_nadol_disks.rb +47 -5
  416. data/test/tc_pascal_disks.rb +47 -0
  417. data/test/tc_prodos_disks.rb +78 -0
  418. data/test/test1.dsk +0 -0
  419. data/test/ts_test_all.rb +2 -0
  420. data/test/white_01b.dsk +0 -0
  421. data/test/white_03b.dsk +0 -0
  422. data/test/white_20a.dsk +0 -0
  423. metadata +400 -368
  424. data/doc/classes/AppleSoftFile.src/M000011.html +0 -18
  425. data/doc/classes/AppleSoftFile.src/M000012.html +0 -18
  426. data/doc/classes/AppleSoftFile.src/M000020.html +0 -18
  427. data/doc/classes/AppleSoftFile.src/M000021.html +0 -18
  428. data/doc/classes/AppleSoftFile.src/M000026.html +0 -18
  429. data/doc/classes/AppleSoftFile.src/M000027.html +0 -18
  430. data/doc/classes/AppleSoftFile.src/M000032.html +0 -18
  431. data/doc/classes/AppleSoftFile.src/M000033.html +0 -18
  432. data/doc/classes/AppleSoftFile.src/M000034.html +0 -18
  433. data/doc/classes/AppleSoftFile.src/M000035.html +0 -18
  434. data/doc/classes/AppleSoftFile.src/M000038.html +0 -18
  435. data/doc/classes/AppleSoftFile.src/M000039.html +0 -18
  436. data/doc/classes/AppleSoftFile.src/M000040.html +0 -18
  437. data/doc/classes/BinaryFile.src/M000022.html +0 -19
  438. data/doc/classes/BinaryFile.src/M000024.html +0 -18
  439. data/doc/classes/BinaryFile.src/M000026.html +0 -19
  440. data/doc/classes/BinaryFile.src/M000029.html +0 -18
  441. data/doc/classes/BinaryFile.src/M000031.html +0 -19
  442. data/doc/classes/BinaryFile.src/M000039.html +0 -18
  443. data/doc/classes/BinaryFile.src/M000041.html +0 -19
  444. data/doc/classes/BinaryFile.src/M000045.html +0 -18
  445. data/doc/classes/BinaryFile.src/M000047.html +0 -19
  446. data/doc/classes/BinaryFile.src/M000052.html +0 -18
  447. data/doc/classes/BinaryFile.src/M000053.html +0 -18
  448. data/doc/classes/BinaryFile.src/M000054.html +0 -18
  449. data/doc/classes/BinaryFile.src/M000056.html +0 -19
  450. data/doc/classes/BinaryFile.src/M000059.html +0 -18
  451. data/doc/classes/BinaryFile.src/M000060.html +0 -18
  452. data/doc/classes/BinaryFile.src/M000061.html +0 -19
  453. data/doc/classes/CatalogServlet.src/M000015.html +0 -20
  454. data/doc/classes/CatalogServlet.src/M000024.html +0 -20
  455. data/doc/classes/CatalogServlet.src/M000027.html +0 -20
  456. data/doc/classes/D65.src/M000002.html +0 -18
  457. data/doc/classes/D65.src/M000004.html +0 -64
  458. data/doc/classes/D65.src/M000005.html +0 -18
  459. data/doc/classes/D65.src/M000007.html +0 -18
  460. data/doc/classes/D65.src/M000008.html +0 -18
  461. data/doc/classes/D65.src/M000010.html +0 -18
  462. data/doc/classes/D65.src/M000018.html +0 -18
  463. data/doc/classes/D65.src/M000019.html +0 -64
  464. data/doc/classes/D65.src/M000024.html +0 -18
  465. data/doc/classes/D65.src/M000025.html +0 -64
  466. data/doc/classes/D65.src/M000030.html +0 -18
  467. data/doc/classes/D65.src/M000031.html +0 -18
  468. data/doc/classes/D65.src/M000035.html +0 -18
  469. data/doc/classes/D65.src/M000036.html +0 -64
  470. data/doc/classes/DOSDisk.src/M000007.html +0 -20
  471. data/doc/classes/DOSDisk.src/M000008.html +0 -77
  472. data/doc/classes/DOSDisk.src/M000010.html +0 -20
  473. data/doc/classes/DOSDisk.src/M000011.html +0 -20
  474. data/doc/classes/DOSDisk.src/M000013.html +0 -20
  475. data/doc/classes/DOSDisk.src/M000014.html +0 -20
  476. data/doc/classes/DOSDisk.src/M000015.html +0 -20
  477. data/doc/classes/DOSDisk.src/M000023.html +0 -20
  478. data/doc/classes/DOSDisk.src/M000024.html +0 -19
  479. data/doc/classes/DOSDisk.src/M000025.html +0 -76
  480. data/doc/classes/DOSDisk.src/M000029.html +0 -20
  481. data/doc/classes/DOSDisk.src/M000031.html +0 -76
  482. data/doc/classes/DOSDisk.src/M000035.html +0 -20
  483. data/doc/classes/DOSDisk.src/M000036.html +0 -20
  484. data/doc/classes/DOSDisk.src/M000037.html +0 -20
  485. data/doc/classes/DOSDisk.src/M000038.html +0 -19
  486. data/doc/classes/DOSDisk.src/M000039.html +0 -76
  487. data/doc/classes/DOSDisk.src/M000041.html +0 -20
  488. data/doc/classes/DOSDisk.src/M000042.html +0 -19
  489. data/doc/classes/DOSFile.src/M000026.html +0 -22
  490. data/doc/classes/DOSFile.src/M000027.html +0 -22
  491. data/doc/classes/DOSFile.src/M000032.html +0 -22
  492. data/doc/classes/DOSFile.src/M000033.html +0 -17
  493. data/doc/classes/DOSFile.src/M000034.html +0 -18
  494. data/doc/classes/DOSFile.src/M000042.html +0 -22
  495. data/doc/classes/DOSFile.src/M000044.html +0 -18
  496. data/doc/classes/DOSFile.src/M000048.html +0 -22
  497. data/doc/classes/DOSFile.src/M000050.html +0 -18
  498. data/doc/classes/DOSFile.src/M000051.html +0 -31
  499. data/doc/classes/DOSFile.src/M000057.html +0 -22
  500. data/doc/classes/DOSFile.src/M000058.html +0 -22
  501. data/doc/classes/DOSFile.src/M000059.html +0 -22
  502. data/doc/classes/DOSFile.src/M000060.html +0 -18
  503. data/doc/classes/DOSFile.src/M000061.html +0 -18
  504. data/doc/classes/DOSFile.src/M000062.html +0 -31
  505. data/doc/classes/DOSFile.src/M000064.html +0 -22
  506. data/doc/classes/DOSFile.src/M000065.html +0 -18
  507. data/doc/classes/DOSFile.src/M000066.html +0 -18
  508. data/doc/classes/DOSFile.src/M000067.html +0 -31
  509. data/doc/classes/DSK.src/M000009.html +0 -22
  510. data/doc/classes/DSK.src/M000010.html +0 -27
  511. data/doc/classes/DSK.src/M000011.html +0 -19
  512. data/doc/classes/DSK.src/M000013.html +0 -22
  513. data/doc/classes/DSK.src/M000014.html +0 -22
  514. data/doc/classes/DSK.src/M000016.html +0 -22
  515. data/doc/classes/DSK.src/M000017.html +0 -22
  516. data/doc/classes/DSK.src/M000018.html +0 -22
  517. data/doc/classes/DSK.src/M000019.html +0 -22
  518. data/doc/classes/DSK.src/M000020.html +0 -34
  519. data/doc/classes/DSK.src/M000021.html +0 -19
  520. data/doc/classes/DSK.src/M000023.html +0 -40
  521. data/doc/classes/DSK.src/M000028.html +0 -22
  522. data/doc/classes/DSK.src/M000029.html +0 -22
  523. data/doc/classes/DSK.src/M000030.html +0 -34
  524. data/doc/classes/DSK.src/M000031.html +0 -19
  525. data/doc/classes/DSK.src/M000032.html +0 -18
  526. data/doc/classes/DSK.src/M000034.html +0 -22
  527. data/doc/classes/DSK.src/M000036.html +0 -34
  528. data/doc/classes/DSK.src/M000037.html +0 -19
  529. data/doc/classes/DSK.src/M000038.html +0 -18
  530. data/doc/classes/DSK.src/M000039.html +0 -18
  531. data/doc/classes/DSK.src/M000040.html +0 -18
  532. data/doc/classes/DSK.src/M000041.html +0 -18
  533. data/doc/classes/DSK.src/M000042.html +0 -22
  534. data/doc/classes/DSK.src/M000044.html +0 -22
  535. data/doc/classes/DSK.src/M000045.html +0 -18
  536. data/doc/classes/DSK.src/M000046.html +0 -22
  537. data/doc/classes/DSK.src/M000048.html +0 -22
  538. data/doc/classes/DSK.src/M000049.html +0 -40
  539. data/doc/classes/DSK.src/M000050.html +0 -19
  540. data/doc/classes/DSK.src/M000051.html +0 -18
  541. data/doc/classes/DirectoryServlet.src/M000017.html +0 -20
  542. data/doc/classes/DirectoryServlet.src/M000026.html +0 -20
  543. data/doc/classes/DirectoryServlet.src/M000030.html +0 -20
  544. data/doc/classes/IntegerBasicFile.src/M000005.html +0 -18
  545. data/doc/classes/IntegerBasicFile.src/M000006.html +0 -18
  546. data/doc/classes/IntegerBasicFile.src/M000012.html +0 -18
  547. data/doc/classes/IntegerBasicFile.src/M000018.html +0 -18
  548. data/doc/classes/IntegerBasicFile.src/M000019.html +0 -18
  549. data/doc/classes/IntegerBasicFile.src/M000020.html +0 -18
  550. data/doc/classes/IntegerBasicFile.src/M000021.html +0 -18
  551. data/doc/classes/IntegerBasicFile.src/M000022.html +0 -18
  552. data/doc/classes/IntegerBasicFile.src/M000023.html +0 -18
  553. data/doc/classes/IntegerBasicFile.src/M000024.html +0 -18
  554. data/doc/classes/IntegerBasicFile.src/M000025.html +0 -18
  555. data/doc/classes/IntegerBasicFile.src/M000026.html +0 -18
  556. data/doc/classes/NADOLDisk.src/M000018.html +0 -20
  557. data/doc/classes/NADOLDisk.src/M000020.html +0 -50
  558. data/doc/classes/NADOLDisk.src/M000021.html +0 -20
  559. data/doc/classes/NADOLDisk.src/M000023.html +0 -50
  560. data/doc/classes/NADOLFile.src/M000030.html +0 -31
  561. data/doc/classes/NADOLFile.src/M000034.html +0 -31
  562. data/doc/classes/NADOLTokenisedFile.src/M000062.html +0 -28
  563. data/doc/classes/NADOLTokenisedFile.src/M000063.html +0 -28
  564. data/doc/classes/RDoc.src/M000033.html +0 -40
  565. data/doc/classes/RDoc.src/M000038.html +0 -40
  566. data/doc/classes/RDoc.src/M000055.html +0 -40
  567. data/doc/classes/RDoc.src/M000066.html +0 -40
  568. data/doc/classes/RDoc.src/M000068.html +0 -40
  569. data/doc/classes/RDoc.src/M000069.html +0 -40
  570. data/doc/classes/RDoc.src/M000074.html +0 -40
  571. data/doc/classes/SCAsmFile.src/M000028.html +0 -36
  572. data/doc/classes/SCAsmFile.src/M000035.html +0 -18
  573. data/doc/classes/SCAsmFile.src/M000038.html +0 -36
  574. data/doc/classes/SCAsmFile.src/M000041.html +0 -18
  575. data/doc/classes/SCAsmFile.src/M000042.html +0 -18
  576. data/doc/classes/SCAsmFile.src/M000043.html +0 -18
  577. data/doc/classes/SCAsmFile.src/M000044.html +0 -36
  578. data/doc/classes/SCAsmFile.src/M000049.html +0 -18
  579. data/doc/classes/SCAsmFile.src/M000050.html +0 -18
  580. data/doc/classes/SCAsmFile.src/M000051.html +0 -18
  581. data/doc/classes/SCAsmFile.src/M000052.html +0 -18
  582. data/doc/classes/SCAsmFile.src/M000055.html +0 -18
  583. data/doc/classes/SCAsmFile.src/M000056.html +0 -18
  584. data/doc/classes/SCAsmFile.src/M000057.html +0 -18
  585. data/doc/classes/ShowFileServlet.src/M000026.html +0 -21
  586. data/doc/classes/ShowFileServlet.src/M000038.html +0 -22
  587. data/doc/classes/ShowFileServlet.src/M000039.html +0 -22
  588. data/doc/classes/ShowFileServlet.src/M000044.html +0 -22
  589. data/doc/classes/TestDOSDisks.src/M000002.html +0 -19
  590. data/doc/classes/TestDOSDisks.src/M000003.html +0 -25
  591. data/doc/classes/TestDOSDisks.src/M000006.html +0 -24
  592. data/doc/classes/TestDOSDisks.src/M000007.html +0 -19
  593. data/doc/classes/TestDOSDisks.src/M000013.html +0 -19
  594. data/doc/classes/TestDisassembly.src/M000005.html +0 -19
  595. data/doc/classes/TestDisassembly.src/M000006.html +0 -19
  596. data/doc/classes/TestDisassembly.src/M000009.html +0 -19
  597. data/doc/classes/TestDisassembly.src/M000016.html +0 -19
  598. data/doc/classes/TestDisassembly.src/M000022.html +0 -19
  599. data/doc/classes/TestDisassembly.src/M000025.html +0 -19
  600. data/doc/classes/TestDisassembly.src/M000028.html +0 -19
  601. data/doc/classes/TestNADOLDisks.src/M000055.html +0 -19
  602. data/doc/classes/TestNADOLDisks.src/M000056.html +0 -19
  603. data/doc/classes/TestNADOLDisks.src/M000057.html +0 -19
  604. data/doc/classes/TestNADOLDisks.src/M000058.html +0 -34
  605. data/doc/classes/TestNADOLDisks.src/M000062.html +0 -19
  606. data/doc/classes/TestNADOLDisks.src/M000063.html +0 -34
  607. data/doc/classes/TextFile.src/M000025.html +0 -18
  608. data/doc/classes/TextFile.src/M000026.html +0 -18
  609. data/doc/classes/TextFile.src/M000029.html +0 -18
  610. data/doc/classes/TextFile.src/M000030.html +0 -18
  611. data/doc/classes/TextFile.src/M000035.html +0 -18
  612. data/doc/classes/TextFile.src/M000045.html +0 -18
  613. data/doc/classes/TextFile.src/M000046.html +0 -18
  614. data/doc/classes/TextFile.src/M000047.html +0 -20
  615. data/doc/classes/TextFile.src/M000052.html +0 -18
  616. data/doc/classes/TextFile.src/M000053.html +0 -18
  617. data/doc/classes/TextFile.src/M000054.html +0 -20
  618. data/doc/classes/TextFile.src/M000063.html +0 -18
  619. data/doc/classes/TextFile.src/M000064.html +0 -18
  620. data/doc/classes/TextFile.src/M000065.html +0 -18
  621. data/doc/classes/TextFile.src/M000066.html +0 -18
  622. data/doc/classes/TextFile.src/M000067.html +0 -18
  623. data/doc/classes/TextFile.src/M000068.html +0 -20
  624. data/doc/classes/TextFile.src/M000071.html +0 -18
  625. data/doc/classes/TextFile.src/M000072.html +0 -18
  626. data/doc/classes/TextFile.src/M000073.html +0 -20
  627. data/doc/dot/f_0.png +0 -0
  628. data/doc/dot/f_1.dot +0 -14
  629. data/doc/dot/f_1.png +0 -0
  630. data/doc/dot/f_10.dot +0 -32
  631. data/doc/dot/f_10.png +0 -0
  632. data/doc/dot/f_11.dot +0 -32
  633. data/doc/dot/f_11.png +0 -0
  634. data/doc/dot/f_12.dot +0 -14
  635. data/doc/dot/f_12.png +0 -0
  636. data/doc/dot/f_2.dot +0 -23
  637. data/doc/dot/f_2.png +0 -0
  638. data/doc/dot/f_3.dot +0 -32
  639. data/doc/dot/f_3.png +0 -0
  640. data/doc/dot/f_4.dot +0 -88
  641. data/doc/dot/f_4.png +0 -0
  642. data/doc/dot/f_5.dot +0 -23
  643. data/doc/dot/f_5.png +0 -0
  644. data/doc/dot/f_6.dot +0 -32
  645. data/doc/dot/f_6.png +0 -0
  646. data/doc/dot/f_7.dot +0 -49
  647. data/doc/dot/f_7.png +0 -0
  648. data/doc/dot/f_8.dot +0 -30
  649. data/doc/dot/f_8.png +0 -0
  650. data/doc/dot/f_9.dot +0 -32
  651. data/doc/dot/f_9.png +0 -0
  652. data/doc/dot/m_0_0.dot +0 -30
  653. data/doc/dot/m_0_0.png +0 -0
  654. data/doc/dot/m_6_0.dot +0 -30
  655. data/doc/dot/m_6_0.png +0 -0
  656. data/doc/dot/m_8_0.dot +0 -30
  657. data/doc/dot/m_8_0.png +0 -0
  658. data/doc/files/bin/dskserver_rb.html +0 -247
  659. data/doc/files/bin/dskserver_rb.src/M000001.html +0 -22
  660. data/doc/files/bin/dskserver_rb.src/M000002.html +0 -19
  661. data/doc/files/bin/dskserver_rb.src/M000003.html +0 -62
  662. data/doc/files/bin/dskserver_rb.src/M000004.html +0 -39
  663. data/doc/files/bin/dskserver_rb.src/M000005.html +0 -26
data/lib/DSK.rb CHANGED
@@ -2,42 +2,133 @@ $:.unshift(File.dirname(__FILE__)) unless
2
2
  $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
3
3
  require 'open-uri'
4
4
 
5
+
6
+
5
7
  #
6
8
  # For manipulating DSK files, as created by ADT (http://adt.berlios.de) and ADTPRo (http://adtpro.sourceforge.net)
7
9
  # used by many Apple 2 emulators.
8
10
  #
9
11
  class DSK
10
12
 
13
+ FILE_SYSTEMS=[:prodos,:dos33,:nadol,:pascal,:unknown,:none]
14
+ SECTOR_ORDERS=[:physical,:prodos_from_dos]
15
+ DSK_IMAGE_EXTENSIONS=[".dsk",".po",".do",".hdv"]
16
+ INTERLEAVES={
17
+ :physical=> [0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F],
18
+ :prodos_from_dos=>[0x00,0x0E,0x0D,0x0C,0x0B,0x0A,0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x01,0x0F]
19
+ }
20
+
11
21
  #does this filename have a suitable extension?
12
22
  def DSK.is_dsk_file?(filename)
13
- !(filename.upcase=~/\.DSK$|\.DSK\.GZ$|\.PO$|\.PO\.GZ$/).nil?
23
+ extension=File.extname(File.basename(filename,".gz")).downcase
24
+ DSK_IMAGE_EXTENSIONS.include?(extension)
14
25
  end
15
26
  DSK_FILE_LENGTH=143360
16
- attr_accessor (:file_bytes)
27
+ attr_accessor :file_bytes,:sector_order,:track_count
28
+
29
+ def file_system
30
+ :unknown
31
+ end
32
+
33
+
34
+ #add_file takes a *File object (of a type compatible with the underlying file system) and adds it to the in-memory image of this DSK
35
+ #this should be overridden in each *Disk type that has write support enabled
36
+ def add_file(new_file)
37
+ raise "add files to #{file_system} file system not yet supported"
38
+ end
39
+
40
+ #make_file creates a *File object (of a type compatible with the underlying file system) from filename, contents and options required
41
+ #for the underlying file system. The file is NOT added to the in-memory image of this DSK (call add_file to do that)
42
+ def make_file(filename,contents,file_options={})
43
+ raise "creating files for #{file_system} file system not yet supported"
44
+ end
45
+
46
+ def delete_file(filename)
47
+ raise "deleting from #{file_system} file system not yet supported"
48
+ end
49
+
50
+ def free_sector_list
51
+ raise "listing free sectors on #{file_system} file system not yet supported"
52
+ end
53
+
17
54
  # does this DSK have a standard Apple DOS 3.3 VTOC?
18
- def is_dos33?
55
+ def is_dos33?(sector_order)
56
+ #currently ignores sector order
19
57
  # VTOC is at offset 0x11000
20
- # bytes 1/2/3 are a track number, sector number and DOS version number
58
+ # bytes 1 & 2 are a track number, sector number and DOS version number
59
+ # byte 27 is maximum number of track/sector pairs which will fit in one file track/sector list sector (122 for 256 byte sectors)
60
+ # 35 number of sectors per track (16)
21
61
  # see if these are reasonable values
22
-
23
- (@file_bytes[0x11001]<=34) && (@file_bytes[0x11002]<=15) && (@file_bytes[0x11003]==3)
62
+ vtoc_sector=get_sector(0x11,0)
63
+ (vtoc_sector[01]<=34) && (vtoc_sector[02]<=15) && (vtoc_sector[0x27]==0x7A) && (vtoc_sector[0x35]==0x10)
24
64
  end
25
65
 
26
- def is_nadol?
66
+ def is_nadol?(sector_order)
67
+ #currently ignores sector order
27
68
  # track $00, sector $02 , bytes $11 - "NADOL"
28
69
  (@file_bytes[0x00211..0x00215]=="NADOL")
70
+ end
71
+
72
+ def is_prodos?(sector_order)
73
+ #block $02 - bytes $00/$01 are both $00, byte $04 is $F?,
74
+ #bytes $29-$2A = sectors ( 0x118 on a 35 track 5.25" disk)
75
+ first_sector_in_block_2=INTERLEAVES[sector_order][4]
76
+ first_sector_in_block_2=get_sector(0,4,sector_order)
77
+ (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)
29
78
  end
30
-
31
79
 
80
+ def is_pascal?(sector_order)
81
+ #block $02 - bytes $00..$01 are both $00, byte $06 is < 8 and
82
+ #bytes $0E-$0F = sectors ( 0x118 on a 35 track 5.25" disk)
83
+ first_sector_in_block_2=INTERLEAVES[sector_order][4]
84
+ first_sector_in_block_2=get_sector(0,4,sector_order)
85
+ (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)
86
+ end
87
+
32
88
  #create a new DSK structure (in memory, not on disk)
33
- def initialize(file_bytes="\0"*DSK_FILE_LENGTH)
34
- if (file_bytes.length!=DSK_FILE_LENGTH) then
89
+ def initialize(file_bytes="\0"*DSK_FILE_LENGTH,sector_order=:physical)
90
+ #file must be a multiple of (16 sectors * 256 bytes) = 4096
91
+ #some dsks on Asimov appear to have an extra byte at the end so allow for 1 extra byte
92
+ if (file_bytes.length%4096>1) then
35
93
  raise "DSK files must be #{DSK_FILE_LENGTH} bytes long (was #{file_bytes.length} bytes)"
36
94
  end
37
95
  @file_bytes=file_bytes
38
- @files={}
96
+ @files={}
97
+ @sector_order=sector_order
98
+ @track_count=file_bytes.length/4096
39
99
  end
40
100
 
101
+ #write out DSK to file
102
+ def save_as(filename)
103
+ if !(filename=~/\.gz$/).nil? then
104
+ require 'zlib'
105
+ f=Zlib::GzipWriter.new(open(filename,"wb"))
106
+ else
107
+ f=open(filename,"wb")
108
+ end
109
+ f<<@file_bytes
110
+ f.close
111
+ end
112
+
113
+
114
+ #create a new DSK initialised with specified filesystem
115
+ def DSK.create_new(filesystem)
116
+
117
+ filesystem=:dos33 if filesystem==:dos
118
+
119
+ case filesystem
120
+ when :none
121
+ return DSK.new()
122
+ when :nadol
123
+ return DSK.read(File.dirname(__FILE__)+"/nadol_blank.po.gz")
124
+ when :dos33
125
+ return DSK.read(File.dirname(__FILE__)+"/dos33_blank.dsk.gz")
126
+ else
127
+ raise "initialisation of #{filesystem} file system not currently supported"
128
+ end
129
+ end
130
+
131
+
41
132
  #read in an existing DSK file (must exist)
42
133
  def DSK.read(filename)
43
134
  #is the file extension .gz?
@@ -46,55 +137,98 @@ class DSK
46
137
  file_bytes=Zlib::GzipReader.new(open(filename,"rb")).read
47
138
  else
48
139
  file_bytes=open(filename,"rb").read
49
- end
50
- if (file_bytes.length!=DSK_FILE_LENGTH) then
51
- abort("#{filename} is not a valid DSK format file")
52
- end
53
-
140
+ end
141
+
142
+
54
143
  dsk=DSK.new(file_bytes)
55
- if (dsk.is_dos33?)
56
- require 'DOSDisk'
57
- dsk=DOSDisk.new(file_bytes)
58
- end
59
-
60
- if (dsk.is_nadol?)
61
- require 'NADOLDisk'
62
- dsk=NADOLDisk.new(file_bytes)
63
- end
144
+ SECTOR_ORDERS.each do |sector_order|
145
+ begin
146
+ candidate_filesystem="unknown"
147
+ if (dsk.is_dos33?(sector_order))
148
+ require 'DOSDisk'
149
+ candidate_filesystem="DOS 3.3"
150
+ dsk=DOSDisk.new(file_bytes,sector_order)
151
+ break
152
+ end
153
+
154
+ if (dsk.is_nadol?(sector_order))
155
+ require 'NADOLDisk'
156
+ candidate_filesystem="NADOL"
157
+ dsk=NADOLDisk.new(file_bytes,sector_order)
158
+ break
159
+ 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
166
+ end
167
+
168
+ if (dsk.is_pascal?(sector_order))
169
+ require 'PascalDisk'
170
+ candidate_filesystem="Pascal"
171
+ dsk=PascalDisk.new(file_bytes,sector_order)
172
+ break
173
+ end
64
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
180
+ end
65
181
  dsk
66
182
  end
67
183
 
68
- def get_sector(track,sector)
69
- start_byte=track*16*256+sector*256
184
+ def get_sector(track,requested_sector,sector_order=@sector_order)
185
+ raise "bad sector #{requested_sector}" unless requested_sector.between?(0,0x0F)
186
+ raise "bad sector_order #{sector_order}" if INTERLEAVES[sector_order].nil?
187
+ physical_sector=INTERLEAVES[sector_order][requested_sector]
188
+ start_byte=track*16*256+physical_sector*256
70
189
  @file_bytes[start_byte..start_byte+255]
71
190
  end
72
191
 
192
+ def set_sector(track,sector,contents)
193
+ physical_sector=INTERLEAVES[@sector_order][sector]
194
+ start_byte=track*16*256+physical_sector*256
195
+ (0..255).each do |byte|
196
+ c=(contents[byte] || 0)
197
+ @file_bytes[start_byte+byte]=c
198
+ end
199
+ end
200
+
201
+ #write supplied code to track 0 (from sector 0 to whatever is required)
202
+ #code should run from $0801 and can be up to 4KB (16 sectors) in length
203
+ def set_boot_track(contents)
204
+ sectors_needed=(contents.length / 256)+1
205
+ raise "boot code can't exceed 16 sectors" if sectors_needed>16
206
+ s=sectors_needed.chr+contents
207
+ for sector in 0..sectors_needed-1
208
+ sector_data=s[sector*256..255+sector*256]
209
+ set_sector(0,sector,sector_data)
210
+ end
211
+ end
212
+
213
+ def get_block(block_no)
214
+ track=(block_no / 8).to_i
215
+ first_sector=2*(block_no % 8)
216
+ raise "illegal block no #{block_no}" if track>=self.track_count
217
+ return self.get_sector(track,first_sector)+self.get_sector(track,first_sector+1)
218
+ end
219
+
73
220
  def files
74
221
  @files
75
222
  end
76
223
 
77
- #return a formatted hex dump of a single 256 byte sector
224
+ #return a formatted hex dump of a single 256 byte sector
78
225
  def dump_sector(track,sector)
226
+ require 'DumpUtilities'
79
227
  start_byte=track.to_i*16*256+sector.to_i*256
80
228
  s=hline
81
229
  s<<sprintf("TRACK: $%02X SECTOR $%02X\ OFFSET $%04X\n",track,sector,start_byte)
82
- s<< "\t"
83
230
  sector_data=get_sector(track,sector)
84
- (0..15).each {|x| s<<sprintf("%02X ",x) }
85
- s<<"\n"
86
- s<<hline
87
- (0..15).each {|line_number|
88
- lhs=""
89
- rhs=""
90
- start_byte=line_number*16
91
- line=sector_data[start_byte..start_byte+15]
92
- line.each_byte {|byte|
93
- lhs<< sprintf("%02X ", byte)
94
- rhs<< (byte%128).chr.sub(/[\x00-\x1f]/,'.')
95
- }
96
- s<<sprintf("%02X\t%s %s\n",start_byte,lhs,rhs)
97
- }
231
+ s<< DumpUtilities.hex_dump(sector_data)
98
232
  s
99
233
  end
100
234
 
@@ -110,7 +244,7 @@ class DSK
110
244
  end
111
245
 
112
246
  #return a formatted hex dump of all sectors on all tracks
113
- def dump_disk
247
+ def hex_dump
114
248
  s=""
115
249
  (0..34).each {|track|
116
250
  (0..15).each {|sector|
@@ -126,8 +260,28 @@ private
126
260
  "-"*79+"\n"
127
261
  end
128
262
 
263
+ end
264
+
129
265
 
266
+ class DSKTrackSector
267
+ attr_accessor :track_no,:sector_no,:offset
268
+ def initialize(track_no,sector_no,offset=0x00)
269
+ @track_no=track_no
270
+ @sector_no=sector_no
271
+ @offset=offset
272
+ end
273
+ def to_s
274
+ sprintf "TRACK $%02X SECTOR $%02X OFFSET $02X",track_no,sector_no,offset
275
+ end
276
+
277
+ def <=>(other)
278
+ return -1 unless other.kind_of?DSKTrackSector
279
+ return track_no<=>other.track_no unless track_no==other.track_no
280
+ return sector_no<=>other.sector_no unless sector_no==other.sector_no
281
+ return offset<=>other.offset
282
+ end
130
283
  end
284
+
131
285
  # == Author
132
286
  # Jonno Downes (jonno@jamtronix.com)
133
287
  #
data/lib/DSKFile.rb ADDED
@@ -0,0 +1,141 @@
1
+ $:.unshift(File.dirname(__FILE__)) unless
2
+ $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
3
+
4
+
5
+ require 'DumpUtilities'
6
+ #Generic Apple II file
7
+ class DSKFile
8
+ attr_accessor(:filename,:contents)
9
+ def initialize(filename,contents)
10
+ @filename=filename
11
+ @contents=contents
12
+ end
13
+
14
+ def to_s
15
+ @contents
16
+ end
17
+
18
+ def ==(other_object)
19
+ if !other_object.kind_of? DSKFile then
20
+ return false
21
+ end
22
+ if self.filename!=other_object.filename then
23
+ return false
24
+ end
25
+
26
+ return self.to_s==other_object.to_s
27
+ end
28
+
29
+ def file_extension
30
+ ".bin"
31
+ end
32
+
33
+ def hex_dump
34
+ DumpUtilities.hex_dump(@contents)
35
+ end
36
+
37
+ #default is files can NOT be displayed as a picture
38
+ def can_be_picture?
39
+ false
40
+ end
41
+
42
+ #how many 256 byte sectors does this file require?
43
+ #excludes any catalog entry or T/S list
44
+ def length_in_sectors
45
+ ((255+contents.length)/256)
46
+ end
47
+
48
+ # Adapted from FID.C -- a utility to browse Apple II .DSK image files by Paul Schlyter (pausch@saaf.se)
49
+ #
50
+ #Applesoft file format:
51
+ # <Length_of_file> (16-bit little endian)
52
+ # <Line>
53
+ # ......
54
+ # <Line>
55
+ # where <Line> is:
56
+ # <Next addr> (16-bit little endian)
57
+ # <Line no> (16-bit little endian: 0-65535)
58
+ # <Tokens and/or characters>
59
+ # <End-of-line marker: $00 >
60
+ #
61
+ APPLESOFT_TOKENS = [
62
+ "END","FOR","NEXT","DATA","INPUT","DEL","DIM","READ",
63
+ "GR","TEXT","PR#","IN#","CALL","PLOT","HLIN","VLIN",
64
+ "HGR2","HGR","HCOLOR=","HPLOT","DRAW","XDRAW","HTAB",
65
+ "HOME","ROT=","SCALE=","SHLOAD","TRACE","NOTRACE",
66
+ "NORMAL","INVERSE","FLASH","COLOR=","POP","VTAB",
67
+ "HIMEM=","LOMEM=","ONERR","RESUME","RECALL","STORE",
68
+ "SPEED=","LET","GOTO","RUN","IF","RESTORE","&","GOSUB",
69
+ "RETURN","REM","STOP","ON","WAIT","LOAD","SAVE","DEF",
70
+ "POKE","PRINT","CONT","LIST","CLEAR","GET","NEW",
71
+ "TAB(","TO","FN","SPC(","THEN","AT","NOT","STEP","+",
72
+ "-","*","/","^","AND","OR",">","=","<","SGN","INT",
73
+ "ABS","USR","FRE","SCRN(","PDL","POS","SQR","RND",
74
+ "LOG","EXP","COS","SIN","TAN","ATN","PEEK","LEN",
75
+ "STR$","VAL","ASC","CHR$", "LEFT$","RIGHT$","MID$","?",
76
+ "?","?","?","?","?","?","?","?","?","?","?","?","?","?","?","?","?","?","?","?"
77
+ ]
78
+
79
+ def buffer_as_applesoft_file(buffer)
80
+
81
+ length=buffer[0]+buffer[1]*256
82
+ index=2
83
+ s=""
84
+ while (index<length)
85
+ index+=2 #skip over the "next address" field
86
+ break if buffer[index].nil?
87
+ break if buffer[index+1].nil?
88
+ line_no=buffer[index]+buffer[index+1]*256
89
+ index+=2 #skip over the "line number" field
90
+ s+=sprintf("%u",line_no)
91
+ done_line=false
92
+ last_char_space=false
93
+ while (!done_line)
94
+ b=buffer[index]
95
+ break if b.nil?
96
+ if b>=0x80 then
97
+ if !last_char_space then
98
+ s+=" "
99
+ end
100
+ s+=APPLESOFT_TOKENS[b-0x80]+" "
101
+ last_char_space=true
102
+ else
103
+ s+=b.chr
104
+ last_char_space=false
105
+ end
106
+ index+=1
107
+ done_line=(index>=length)||(buffer[index]==0)
108
+ end
109
+ s+="\n"
110
+ index+=1 # skip over "end of line" marker
111
+ end
112
+ s
113
+ end
114
+ end
115
+
116
+
117
+
118
+ # == Author
119
+ # Jonno Downes (jonno@jamtronix.com)
120
+ #
121
+ # == Copyright
122
+ # Copyright (c) 2007 Jonno Downes (jonno@jamtronix.com)
123
+ #
124
+ #Permission is hereby granted, free of charge, to any person obtaining
125
+ #a copy of this software and associated documentation files (the
126
+ #"Software"), to deal in the Software without restriction, including
127
+ #without limitation the rights to use, copy, modify, merge, publish,
128
+ #distribute, sublicense, and/or sell copies of the Software, and to
129
+ #permit persons to whom the Software is furnished to do so, subject to
130
+ #the following conditions:
131
+
132
+ # The above copyright notice and this permission notice shall be
133
+ # included in all copies or substantial portions of the Software.
134
+
135
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
136
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
137
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
138
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
139
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
140
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
141
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,30 @@
1
+ class DumpUtilities
2
+
3
+ def DumpUtilities.hex_dump(buffer)
4
+ s=""
5
+ (0..(buffer.length/16)).each {|line_number|
6
+ lhs=""
7
+ rhs=""
8
+ start_byte=line_number*16
9
+ line=buffer[start_byte..start_byte+15]
10
+ if line.length>0 then
11
+ line.each_byte {|byte|
12
+ lhs+= sprintf("%02X ", byte)
13
+ rhs+= (byte%128).chr.sub(/[\x00-\x1f]/,'.')
14
+ }
15
+ lhs+=" "*(16-line.length)*3
16
+ s+=sprintf("%02X\t%s %s\n",start_byte,lhs,rhs)
17
+ end
18
+ }
19
+ s
20
+ end
21
+
22
+ def DumpUtilities.font_dump(buffer)
23
+ #treat buffer as a set 8 bit wide characters
24
+ s=""
25
+ buffer.each_byte do |byte|
26
+ s<<sprintf("%08b\n",byte).tr("1","#").tr("0"," ")
27
+ end
28
+ s
29
+ end
30
+ end
data/lib/HGR.rb ADDED
@@ -0,0 +1,136 @@
1
+ #Apple II Hi-Res Graphics routines
2
+ $:.unshift(File.dirname(__FILE__)) unless $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
3
+
4
+ require 'rubygems'
5
+ gem 'png', '= 1.0.0'
6
+ require 'png'
7
+ #need to add a new method to PNG to get at the raw bytes as the png library only writes to disk
8
+ class PNG
9
+ def raw_bytes
10
+ bytes=""
11
+ bytes<< [137, 80, 78, 71, 13, 10, 26, 10].pack("C*") # PNG signature
12
+ bytes<< PNG.chunk('IHDR',
13
+ [ @height, @width, @bits, 6, 0, 0, 0 ].pack("N2C5"))
14
+ # 0 == filter type code "none"
15
+ data = @data.map { |row| [0] + row.map { |p| p.values } }.flatten
16
+ bytes<< PNG.chunk('IDAT', Zlib::Deflate.deflate(data.pack("C*"), 9))
17
+ bytes<< PNG.chunk('IEND', '')
18
+ bytes
19
+ end
20
+ end
21
+ class HGR
22
+ PALLETE_MODES=[:white,:green,:amber,:colour]
23
+ PALLETE={
24
+ :white=>PNG::Color::White,
25
+ :green=>PNG::Color.new(0x00, 0x99, 0x00, 0xFF),
26
+ :amber=>PNG::Color::Orange
27
+ }
28
+
29
+ #colours cribbed from http://groups.google.com.au/group/comp.sys.apple2/browse_thread/thread/b9aa36ead6935c42/faa0f4df3e89060f
30
+ HGR_BLACK=PNG::Color::Black #color=0,4
31
+ HGR_GREEN=PNG::Color.new(0x2F,0xB8,0x1F,0xFF) #color=1
32
+ HGR_VIOLET=PNG::Color.new(0xC8,0x47,0xE4,0xFF) #color=2
33
+ HGR_WHITE=PNG::Color::White #color=3,7
34
+ HGR_ORANGE=PNG::Color.new(0xC7,0x70,0x28,0xFF) #color=5
35
+ HGR_BLUE=PNG::Color.new(0x30,0x8F,0xE3,0xFF) #color=6
36
+
37
+ HGR_COLS=40*7
38
+ HGR_ROWS=8*8*3
39
+ SCALE=2
40
+
41
+ #per Apple // Reference Manual for //e chapter 2, pages 22-35
42
+ #also TechNote - Apple IIe #3 Double High-Resolution Graphics - http://web.pdx.edu/~heiss/technotes/aiie/tn.aiie.03.html
43
+ #HGR screen consists of 3 bands of 8 rows of 8 scanlines
44
+ #for each absolute scanline, what is the offset into screen ram that the 40 bytes for this scanline is stored?
45
+
46
+ @@scanline_offsets=Array.new(HGR_ROWS)
47
+
48
+ 0.upto(2) do |band|
49
+ 0.upto(7) do |row|
50
+ 0.upto(7) do |relative_scanline|
51
+ band_ram_offset=band*40
52
+ band_scanline_offset=band*64
53
+ scanline_ram_offset=relative_scanline*1024
54
+ scanline_scanline_offset=relative_scanline
55
+ row_ram_offset=128*row
56
+ row_scanline_offset=8*row
57
+ scanline_offset=band_scanline_offset+scanline_scanline_offset+row_scanline_offset
58
+ ram_offset=band_ram_offset+scanline_ram_offset+row_ram_offset
59
+ @@scanline_offsets[scanline_offset]=ram_offset
60
+ end
61
+ end
62
+ end
63
+
64
+
65
+ 0.upto(HGR_ROWS-1) do |scanline|
66
+ puts "no offset defined for scanline #{scanline}" if @@scanline_offsets[scanline].nil?
67
+ end
68
+ #HGR screen is 8192 bytes stored at either $2000 (page 1) or $4000 (page 2)
69
+ def HGR.can_be_hgr_screen?(buffer,memory_location=nil)
70
+
71
+ #because only 120 out of every 128 bytes are shown, the last 8 bytes are not needed
72
+ #in order to save a sector under dos 3.3 it was common to only store 8192=8184 (0x1FF8) bytes
73
+ #sometimes an extra sector was included by mistake
74
+ if (buffer.length>=8184 && buffer.length<=8192) && ((memory_location.nil?) || (memory_location==0))
75
+ return true
76
+ end
77
+
78
+ if (buffer.length>=8184) && ((memory_location==0x2000) || (memory_location==0x4000))
79
+ return true
80
+ end
81
+ false
82
+ end
83
+
84
+ private
85
+ def HGR.set_pixel(canvas,x,y,colour)
86
+ 0.upto(SCALE-1) do |row|
87
+ 0.upto(SCALE-1) do |col|
88
+ canvas[x*SCALE+col, y*SCALE+row]= colour
89
+ end
90
+ end
91
+ end
92
+
93
+ public
94
+ def HGR.buffer_to_png(buffer,pallete_mode=:amber)
95
+ canvas = PNG::Canvas.new HGR_COLS*SCALE, HGR_ROWS*SCALE, PNG::Color::Black
96
+ 0.upto(HGR_ROWS-1) do |y|
97
+ last_bit_set=false
98
+ 0.upto(39) do |x_byte|
99
+ offset=@@scanline_offsets[y]+x_byte
100
+ current_byte=buffer[offset]
101
+ current_byte=0 if current_byte.nil? #if we overrun the buffer then assume it's black
102
+ 0.upto(6) do |x_bit|
103
+ x=x_byte*7+x_bit
104
+ bit_set=((current_byte & (2**x_bit))>0)
105
+ if (bit_set) then
106
+ if pallete_mode==:colour then
107
+ if (last_bit_set) then
108
+ #adjacent pixels should both be white
109
+ set_pixel(canvas,x-1,y,HGR_WHITE)
110
+ set_pixel(canvas,x,y,HGR_WHITE)
111
+ else
112
+ if current_byte>=0x80 then
113
+ pallete=[HGR_BLUE,HGR_ORANGE]
114
+ else
115
+ pallete=[HGR_VIOLET,HGR_GREEN]
116
+ end
117
+ this_pixel_colour=pallete[x%2]
118
+ set_pixel(canvas,x,y,this_pixel_colour)
119
+ set_pixel(canvas,x+1,y,this_pixel_colour)
120
+
121
+ end
122
+ else
123
+ this_pixel_colour=PALLETE[pallete_mode]
124
+ this_pixel_colour=PALLETE.values[0] if this_pixel_colour.nil?
125
+ set_pixel(canvas,x,y,this_pixel_colour)
126
+ end
127
+ end
128
+ last_bit_set=bit_set
129
+ end
130
+ end
131
+ end
132
+ png = PNG.new canvas
133
+ png.raw_bytes
134
+ end
135
+ end
136
+ # == Author# Jonno Downes (jonno@jamtronix.com)## == Copyright# Copyright (c) 2007 Jonno Downes (jonno@jamtronix.com)##Permission is hereby granted, free of charge, to any person obtaining#a copy of this software and associated documentation files (the#"Software"), to deal in the Software without restriction, including#without limitation the rights to use, copy, modify, merge, publish,#distribute, sublicense, and/or sell copies of the Software, and to#permit persons to whom the Software is furnished to do so, subject to#the following conditions:# The above copyright notice and this permission notice shall be# included in all copies or substantial portions of the Software.# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.