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.
- data/bin/dskexplorer.rb +79 -61
- data/bin/dsktool.rb +243 -142
- data/bin/romdump.rb +65 -0
- data/doc/classes/AppleSoftFile.html +97 -59
- data/doc/classes/AppleSoftFile.src/{M000005.html → M000113.html} +1 -1
- data/doc/classes/AppleSoftFile.src/M000114.html +18 -0
- data/doc/classes/AppleSoftFile.src/{M000013.html → M000115.html} +1 -1
- data/doc/classes/AppleSoftFile.src/{M000014.html → M000116.html} +1 -1
- data/doc/classes/AppleSoftFile.src/{M000010.html → M000117.html} +1 -1
- data/doc/classes/AppleSoftFile.src/M000118.html +18 -0
- data/doc/classes/AppleSoftFile.src/{M000006.html → M000119.html} +1 -1
- data/doc/classes/AppleSoftFile.src/{M000022.html → M000120.html} +1 -1
- data/doc/classes/BinaryFile.html +184 -26
- data/doc/classes/BinaryFile.src/{M000021.html → M000218.html} +1 -1
- data/doc/classes/{DOSFile.src/M000017.html → BinaryFile.src/M000219.html} +4 -3
- data/doc/classes/BinaryFile.src/{M000025.html → M000220.html} +1 -1
- data/doc/classes/BinaryFile.src/M000221.html +19 -0
- data/doc/classes/BinaryFile.src/M000222.html +19 -0
- data/doc/classes/BinaryFile.src/M000223.html +19 -0
- data/doc/classes/BinaryFile.src/M000224.html +18 -0
- data/doc/classes/BinaryFile.src/{M000015.html → M000225.html} +1 -1
- data/doc/classes/{AppleSoftFile.src/M000008.html → BinaryFile.src/M000226.html} +4 -4
- data/doc/classes/BinaryFile.src/{M000030.html → M000227.html} +1 -1
- data/doc/classes/BinaryFile.src/M000228.html +19 -0
- data/doc/classes/BinaryFile.src/M000229.html +19 -0
- data/doc/classes/BinaryFile.src/M000230.html +19 -0
- data/doc/classes/BinaryFile.src/M000231.html +18 -0
- data/doc/classes/CatalogServlet.html +5 -15
- data/doc/classes/CatalogServlet.src/{M000021.html → M000064.html} +1 -1
- data/doc/classes/D65.html +60 -18
- data/doc/classes/D65.src/{M000006.html → M000099.html} +0 -0
- data/doc/classes/D65.src/{M000032.html → M000100.html} +6 -6
- data/doc/classes/D65.src/{M000009.html → M000101.html} +1 -1
- data/doc/classes/D65.src/{M000011.html → M000102.html} +7 -7
- data/doc/classes/DOSDisk.html +291 -23
- data/doc/classes/DOSDisk.src/M000127.html +23 -0
- data/doc/classes/DOSDisk.src/M000128.html +18 -0
- data/doc/classes/DOSDisk.src/{M000012.html → M000129.html} +3 -3
- data/doc/classes/DOSDisk.src/M000130.html +37 -0
- data/doc/classes/DOSDisk.src/{M000043.html → M000131.html} +17 -8
- data/doc/classes/DOSDisk.src/M000132.html +37 -0
- data/doc/classes/DOSDisk.src/M000133.html +34 -0
- data/doc/classes/DOSDisk.src/M000134.html +27 -0
- data/doc/classes/DOSDisk.src/M000135.html +43 -0
- data/doc/classes/DOSDisk.src/M000136.html +31 -0
- data/doc/classes/DOSDisk.src/M000137.html +95 -0
- data/doc/classes/DOSDisk.src/M000138.html +23 -0
- data/doc/classes/{BinaryFile.src/M000023.html → DOSDisk.src/M000139.html} +4 -4
- data/doc/classes/DOSDisk.src/{M000016.html → M000140.html} +3 -3
- data/doc/classes/DOSDisk.src/M000141.html +22 -0
- data/doc/classes/DOSDisk.src/{M000017.html → M000142.html} +26 -17
- data/doc/classes/DOSDisk.src/M000143.html +37 -0
- data/doc/classes/DOSDisk.src/M000144.html +34 -0
- data/doc/classes/DOSDisk.src/M000145.html +92 -0
- data/doc/classes/DOSFile.html +135 -36
- data/doc/classes/DOSFile.src/{M000016.html → M000251.html} +5 -5
- data/doc/classes/DOSFile.src/{M000043.html → M000252.html} +1 -1
- data/doc/classes/DOSFile.src/M000253.html +18 -0
- data/doc/classes/DOSFile.src/M000254.html +28 -0
- data/doc/classes/DOSFile.src/M000255.html +18 -0
- data/doc/classes/DOSFile.src/{M000021.html → M000256.html} +4 -4
- data/doc/classes/DOSFile.src/{M000049.html → M000257.html} +1 -1
- data/doc/classes/DOSFile.src/M000258.html +18 -0
- data/doc/classes/DOSFile.src/M000259.html +28 -0
- data/doc/classes/DSK.html +735 -65
- data/doc/classes/DSK.src/{M000027.html → M000163.html} +3 -2
- data/doc/classes/{D65.src/M000003.html → DSK.src/M000164.html} +4 -4
- data/doc/classes/DSK.src/M000165.html +18 -0
- data/doc/classes/DSK.src/M000166.html +18 -0
- data/doc/classes/DSK.src/M000167.html +18 -0
- data/doc/classes/DSK.src/M000168.html +18 -0
- data/doc/classes/DSK.src/M000169.html +25 -0
- data/doc/classes/DSK.src/{M000043.html → M000170.html} +3 -2
- data/doc/classes/DSK.src/M000171.html +22 -0
- data/doc/classes/DSK.src/M000172.html +22 -0
- data/doc/classes/DSK.src/{M000035.html → M000173.html} +7 -3
- data/doc/classes/DSK.src/M000174.html +25 -0
- data/doc/classes/DSK.src/M000175.html +30 -0
- data/doc/classes/DSK.src/M000176.html +65 -0
- data/doc/classes/DSK.src/M000177.html +22 -0
- data/doc/classes/DSK.src/M000178.html +23 -0
- data/doc/classes/DSK.src/M000179.html +24 -0
- data/doc/classes/DSK.src/M000180.html +21 -0
- data/doc/classes/DSK.src/{M000012.html → M000181.html} +1 -1
- data/doc/classes/DSK.src/M000182.html +24 -0
- data/doc/classes/DSK.src/{M000053.html → M000183.html} +1 -1
- data/doc/classes/DSK.src/{M000054.html → M000184.html} +3 -3
- data/doc/classes/DSK.src/{M000033.html → M000185.html} +3 -2
- data/doc/classes/{DOSFile.src/M000018.html → DSK.src/M000186.html} +4 -4
- data/doc/classes/DSK.src/M000187.html +18 -0
- data/doc/classes/DSK.src/M000188.html +18 -0
- data/doc/classes/DSK.src/M000189.html +18 -0
- data/doc/classes/DSK.src/M000190.html +18 -0
- data/doc/classes/DSK.src/M000191.html +25 -0
- data/doc/classes/DSK.src/{M000047.html → M000192.html} +3 -2
- data/doc/classes/DSK.src/M000193.html +22 -0
- data/doc/classes/DSK.src/M000194.html +22 -0
- data/doc/classes/DSK.src/{M000015.html → M000195.html} +7 -3
- data/doc/classes/DSK.src/M000196.html +20 -0
- data/doc/classes/DSK.src/M000197.html +21 -0
- data/doc/classes/DSK.src/M000198.html +27 -0
- data/doc/classes/DSK.src/M000199.html +65 -0
- data/doc/classes/DSK.src/M000200.html +22 -0
- data/doc/classes/DSK.src/M000201.html +23 -0
- data/doc/classes/DSK.src/M000202.html +24 -0
- data/doc/classes/DSK.src/M000203.html +21 -0
- data/doc/classes/DSK.src/{M000022.html → M000204.html} +1 -1
- data/doc/classes/DSK.src/M000205.html +24 -0
- data/doc/classes/DSK.src/M000206.html +24 -0
- data/doc/classes/DSK.src/{M000024.html → M000207.html} +6 -5
- data/doc/classes/DSKFile.html +472 -0
- data/doc/classes/{NADOLFile.src/M000027.html → DSKFile.src/M000147.html} +2 -2
- data/doc/classes/{DOSFile.src/M000025.html → DSKFile.src/M000148.html} +2 -2
- data/doc/classes/DSKFile.src/M000149.html +25 -0
- data/doc/classes/{BinaryFile.src/M000040.html → DSKFile.src/M000150.html} +2 -2
- data/doc/classes/DSKFile.src/M000151.html +18 -0
- data/doc/classes/{BinaryFile.src/M000020.html → DSKFile.src/M000152.html} +4 -4
- data/doc/classes/DSKFile.src/M000153.html +18 -0
- data/doc/classes/DSKFile.src/M000154.html +50 -0
- data/doc/classes/{NADOLFile.src/M000031.html → DSKFile.src/M000155.html} +2 -2
- data/doc/classes/{DOSFile.src/M000029.html → DSKFile.src/M000156.html} +2 -2
- data/doc/classes/DSKFile.src/M000157.html +25 -0
- data/doc/classes/{BinaryFile.src/M000046.html → DSKFile.src/M000158.html} +2 -2
- data/doc/classes/DSKFile.src/M000159.html +18 -0
- data/doc/classes/DSKFile.src/M000160.html +18 -0
- data/doc/classes/DSKFile.src/M000161.html +18 -0
- data/doc/classes/DSKFile.src/M000162.html +50 -0
- data/doc/classes/DSKTrackSector.html +256 -0
- data/doc/classes/DSKTrackSector.src/M000093.html +20 -0
- data/doc/classes/DSKTrackSector.src/M000094.html +18 -0
- data/doc/classes/DSKTrackSector.src/M000095.html +21 -0
- data/doc/classes/DSKTrackSector.src/M000096.html +20 -0
- data/doc/classes/DSKTrackSector.src/M000097.html +18 -0
- data/doc/classes/DSKTrackSector.src/M000098.html +21 -0
- data/doc/classes/DirectoryServlet.html +5 -15
- data/doc/classes/DirectoryServlet.src/{M000023.html → M000086.html} +1 -1
- data/doc/classes/DumpUtilities.html +186 -0
- data/doc/classes/DumpUtilities.src/M000109.html +33 -0
- data/doc/classes/DumpUtilities.src/M000110.html +23 -0
- data/doc/classes/DumpUtilities.src/M000111.html +33 -0
- data/doc/classes/DumpUtilities.src/M000112.html +23 -0
- data/doc/classes/HGR.html +324 -0
- data/doc/classes/HGR.src/M000247.html +29 -0
- data/doc/classes/HGR.src/M000248.html +56 -0
- data/doc/classes/HGR.src/M000249.html +29 -0
- data/doc/classes/HGR.src/M000250.html +56 -0
- data/doc/classes/IntegerBasicFile.html +127 -26
- data/doc/classes/IntegerBasicFile.src/{M000001.html → M000056.html} +1 -1
- data/doc/classes/IntegerBasicFile.src/{M000007.html → M000057.html} +1 -1
- data/doc/classes/IntegerBasicFile.src/M000058.html +18 -0
- data/doc/classes/IntegerBasicFile.src/{M000008.html → M000059.html} +1 -1
- data/doc/classes/IntegerBasicFile.src/{M000004.html → M000060.html} +1 -1
- data/doc/classes/IntegerBasicFile.src/{M000013.html → M000061.html} +1 -1
- data/doc/classes/IntegerBasicFile.src/M000062.html +18 -0
- data/doc/classes/IntegerBasicFile.src/{M000014.html → M000063.html} +1 -1
- data/doc/classes/NADOLBinaryFile.html +84 -13
- data/doc/classes/NADOLBinaryFile.src/{M000033.html → M000103.html} +1 -1
- data/doc/classes/{NADOLFile.src/M000028.html → NADOLBinaryFile.src/M000104.html} +4 -4
- data/doc/classes/{NADOLFile.src/M000032.html → NADOLBinaryFile.src/M000105.html} +4 -4
- data/doc/classes/NADOLBinaryFile.src/{M000037.html → M000106.html} +1 -1
- data/doc/classes/{BinaryFile.src/M000055.html → NADOLBinaryFile.src/M000107.html} +4 -4
- data/doc/classes/NADOLBinaryFile.src/M000108.html +18 -0
- data/doc/classes/NADOLDisk.html +346 -23
- data/doc/classes/NADOLDisk.src/M000034.html +23 -0
- data/doc/classes/NADOLDisk.src/{M000019.html → M000035.html} +3 -3
- data/doc/classes/NADOLDisk.src/M000036.html +18 -0
- data/doc/classes/NADOLDisk.src/M000037.html +29 -0
- data/doc/classes/NADOLDisk.src/M000038.html +34 -0
- data/doc/classes/NADOLDisk.src/M000039.html +32 -0
- data/doc/classes/NADOLDisk.src/M000040.html +22 -0
- data/doc/classes/NADOLDisk.src/M000041.html +38 -0
- data/doc/classes/NADOLDisk.src/M000042.html +27 -0
- data/doc/classes/NADOLDisk.src/M000043.html +53 -0
- data/doc/classes/NADOLDisk.src/M000044.html +46 -0
- data/doc/classes/NADOLDisk.src/M000045.html +23 -0
- data/doc/classes/NADOLDisk.src/{M000022.html → M000046.html} +3 -3
- data/doc/classes/{AppleSoftFile.src/M000009.html → NADOLDisk.src/M000047.html} +4 -4
- data/doc/classes/NADOLDisk.src/M000048.html +29 -0
- data/doc/classes/NADOLDisk.src/M000049.html +34 -0
- data/doc/classes/NADOLDisk.src/M000050.html +32 -0
- data/doc/classes/NADOLDisk.src/M000051.html +22 -0
- data/doc/classes/NADOLDisk.src/M000052.html +38 -0
- data/doc/classes/NADOLDisk.src/M000053.html +27 -0
- data/doc/classes/NADOLDisk.src/M000054.html +53 -0
- data/doc/classes/NADOLDisk.src/M000055.html +46 -0
- data/doc/classes/NADOLFile.html +67 -51
- data/doc/classes/NADOLFile.src/{M000029.html → M000087.html} +1 -1
- data/doc/classes/NADOLFile.src/M000088.html +18 -0
- data/doc/classes/NADOLFile.src/M000089.html +28 -0
- data/doc/classes/NADOLFile.src/{M000033.html → M000090.html} +1 -1
- data/doc/classes/NADOLFile.src/M000091.html +18 -0
- data/doc/classes/NADOLFile.src/M000092.html +28 -0
- data/doc/classes/NADOLTokenisedFile.html +111 -32
- data/doc/classes/NADOLTokenisedFile.src/{M000068.html → M000276.html} +1 -1
- data/doc/classes/NADOLTokenisedFile.src/M000277.html +49 -0
- data/doc/classes/NADOLTokenisedFile.src/{M000064.html → M000278.html} +1 -1
- data/doc/classes/NADOLTokenisedFile.src/{M000065.html → M000279.html} +1 -1
- data/doc/classes/NADOLTokenisedFile.src/{M000061.html → M000280.html} +1 -1
- data/doc/classes/NADOLTokenisedFile.src/M000281.html +49 -0
- data/doc/classes/NADOLTokenisedFile.src/{M000069.html → M000282.html} +1 -1
- data/doc/classes/NADOLTokenisedFile.src/{M000070.html → M000283.html} +1 -1
- data/doc/classes/PNG.html +163 -0
- data/doc/classes/PNG.src/M000284.html +26 -0
- data/doc/classes/PNG.src/M000285.html +26 -0
- data/doc/classes/PascalDisk.html +274 -0
- data/doc/classes/PascalDisk.src/M000268.html +23 -0
- data/doc/classes/PascalDisk.src/M000269.html +19 -0
- data/doc/classes/PascalDisk.src/M000270.html +18 -0
- data/doc/classes/PascalDisk.src/M000271.html +60 -0
- data/doc/classes/PascalDisk.src/M000272.html +23 -0
- data/doc/classes/PascalDisk.src/M000273.html +19 -0
- data/doc/classes/PascalDisk.src/M000274.html +18 -0
- data/doc/classes/PascalDisk.src/M000275.html +60 -0
- data/doc/classes/PascalFile.html +322 -0
- data/doc/classes/{DOSFile.src/M000022.html → PascalFile.src/M000237.html} +5 -6
- data/doc/classes/{TextFile.src/M000027.html → PascalFile.src/M000238.html} +3 -3
- data/doc/classes/{AppleSoftFile.src/M000028.html → PascalFile.src/M000239.html} +3 -3
- data/doc/classes/PascalFile.src/M000240.html +19 -0
- data/doc/classes/PascalFile.src/M000241.html +18 -0
- data/doc/classes/{DOSFile.src/M000023.html → PascalFile.src/M000242.html} +5 -6
- data/doc/classes/{TextFile.src/M000032.html → PascalFile.src/M000243.html} +3 -3
- data/doc/classes/PascalFile.src/M000244.html +18 -0
- data/doc/classes/PascalFile.src/M000245.html +19 -0
- data/doc/classes/PascalFile.src/M000246.html +18 -0
- data/doc/classes/ProDOSDisk.html +414 -0
- data/doc/classes/ProDOSDisk.src/M000073.html +18 -0
- data/doc/classes/ProDOSDisk.src/M000074.html +23 -0
- data/doc/classes/{DOSDisk.src/M000030.html → ProDOSDisk.src/M000075.html} +5 -5
- data/doc/classes/ProDOSDisk.src/M000076.html +18 -0
- data/doc/classes/{DSK.src/M000052.html → ProDOSDisk.src/M000077.html} +8 -9
- data/doc/classes/ProDOSDisk.src/M000078.html +98 -0
- data/doc/classes/ProDOSDisk.src/M000079.html +18 -0
- data/doc/classes/ProDOSDisk.src/M000080.html +23 -0
- data/doc/classes/ProDOSDisk.src/M000081.html +19 -0
- data/doc/classes/ProDOSDisk.src/M000082.html +18 -0
- data/doc/classes/ProDOSDisk.src/M000083.html +36 -0
- data/doc/classes/ProDOSDisk.src/M000084.html +98 -0
- data/doc/classes/ProDOSFile.html +282 -0
- data/doc/classes/ProDOSFile.src/M000121.html +23 -0
- data/doc/classes/{AppleSoftFile.src/M000036.html → ProDOSFile.src/M000122.html} +3 -3
- data/doc/classes/ProDOSFile.src/M000123.html +30 -0
- data/doc/classes/ProDOSFile.src/M000124.html +23 -0
- data/doc/classes/ProDOSFile.src/M000125.html +18 -0
- data/doc/classes/ProDOSFile.src/M000126.html +30 -0
- data/doc/classes/RDoc.html +29 -12
- data/doc/classes/RDoc.src/{M000048.html → M000295.html} +0 -0
- data/doc/classes/RDoc.src/{M000032.html → M000296.html} +1 -1
- data/doc/classes/SCAsmFile.html +117 -31
- data/doc/classes/SCAsmFile.src/{M000048.html → M000208.html} +1 -1
- data/doc/classes/{DOSFile.src/M000024.html → SCAsmFile.src/M000209.html} +4 -3
- data/doc/classes/SCAsmFile.src/{M000026.html → M000210.html} +1 -1
- data/doc/classes/SCAsmFile.src/{M000027.html → M000211.html} +1 -1
- data/doc/classes/SCAsmFile.src/{M000058.html → M000212.html} +1 -1
- data/doc/classes/SCAsmFile.src/{M000025.html → M000213.html} +1 -1
- data/doc/classes/SCAsmFile.src/M000214.html +18 -0
- data/doc/classes/SCAsmFile.src/{M000036.html → M000215.html} +1 -1
- data/doc/classes/SCAsmFile.src/{M000037.html → M000216.html} +1 -1
- data/doc/classes/SCAsmFile.src/{M000053.html → M000217.html} +4 -1
- data/doc/classes/ShowFileServlet.html +5 -15
- data/doc/classes/ShowFileServlet.src/{M000040.html → M000146.html} +2 -2
- data/doc/classes/ShowPNGServlet.html +137 -0
- data/doc/classes/{ShowFileServlet.src/M000032.html → ShowPNGServlet.src/M000232.html} +10 -6
- data/doc/classes/ShowSectorServlet.html +5 -15
- data/doc/classes/ShowSectorServlet.src/{M000029.html → M000085.html} +1 -1
- data/doc/classes/TestDOSDisks.html +220 -28
- data/doc/classes/TestDOSDisks.src/M000014.html +1 -1
- data/doc/classes/TestDOSDisks.src/M000015.html +1 -1
- data/doc/classes/TestDOSDisks.src/M000016.html +32 -9
- data/doc/classes/TestDOSDisks.src/M000017.html +9 -6
- data/doc/classes/TestDOSDisks.src/M000018.html +5 -10
- data/doc/classes/TestDOSDisks.src/M000019.html +5 -27
- data/doc/classes/TestDOSDisks.src/M000020.html +8 -10
- data/doc/classes/TestDOSDisks.src/{M000010.html → M000021.html} +9 -3
- data/doc/classes/TestDOSDisks.src/{M000011.html → M000022.html} +5 -4
- data/doc/classes/TestDOSDisks.src/M000023.html +28 -0
- data/doc/classes/TestDOSDisks.src/{M000012.html → M000024.html} +2 -0
- data/doc/classes/TestDOSDisks.src/{M000001.html → M000025.html} +1 -1
- data/doc/classes/TestDOSDisks.src/M000026.html +62 -0
- data/doc/classes/TestDOSDisks.src/M000027.html +22 -0
- data/doc/classes/TestDOSDisks.src/M000028.html +20 -0
- data/doc/classes/TestDOSDisks.src/{M000008.html → M000029.html} +2 -2
- data/doc/classes/TestDOSDisks.src/{M000009.html → M000030.html} +2 -2
- data/doc/classes/TestDOSDisks.src/{M000004.html → M000031.html} +9 -3
- data/doc/classes/TestDOSDisks.src/{M000005.html → M000032.html} +5 -4
- data/doc/classes/TestDOSDisks.src/M000033.html +28 -0
- data/doc/classes/TestDisassembly.html +24 -12
- data/doc/classes/TestDisassembly.src/{M000008.html → M000071.html} +1 -1
- data/doc/classes/TestDisassembly.src/{M000007.html → M000072.html} +0 -0
- data/doc/classes/TestNADOLDisks.html +44 -17
- data/doc/classes/TestNADOLDisks.src/M000233.html +22 -0
- data/doc/classes/TestNADOLDisks.src/M000234.html +73 -0
- data/doc/classes/TestNADOLDisks.src/M000235.html +22 -0
- data/doc/classes/TestNADOLDisks.src/M000236.html +73 -0
- data/doc/classes/TestPascalDisks.html +216 -0
- data/doc/classes/TestPascalDisks.src/M000065.html +28 -0
- data/doc/classes/TestPascalDisks.src/M000066.html +24 -0
- data/doc/classes/TestPascalDisks.src/M000067.html +27 -0
- data/doc/classes/TestPascalDisks.src/M000068.html +28 -0
- data/doc/classes/TestPascalDisks.src/M000069.html +24 -0
- data/doc/classes/TestPascalDisks.src/M000070.html +27 -0
- data/doc/classes/TestProDOSDisks.html +246 -0
- data/doc/classes/TestProDOSDisks.src/M000260.html +28 -0
- data/doc/classes/TestProDOSDisks.src/M000261.html +28 -0
- data/doc/classes/TestProDOSDisks.src/M000262.html +41 -0
- data/doc/classes/TestProDOSDisks.src/M000263.html +28 -0
- data/doc/classes/TestProDOSDisks.src/M000264.html +28 -0
- data/doc/classes/TestProDOSDisks.src/M000265.html +28 -0
- data/doc/classes/TestProDOSDisks.src/M000266.html +41 -0
- data/doc/classes/TestProDOSDisks.src/M000267.html +28 -0
- data/doc/classes/TextFile.html +109 -26
- data/doc/classes/TextFile.src/{M000019.html → M000286.html} +1 -1
- data/doc/classes/{DOSFile.src/M000028.html → TextFile.src/M000287.html} +4 -3
- data/doc/classes/TextFile.src/{M000031.html → M000288.html} +1 -1
- data/doc/classes/TextFile.src/{M000020.html → M000289.html} +3 -3
- data/doc/classes/TextFile.src/{M000024.html → M000290.html} +1 -1
- data/doc/classes/TextFile.src/M000291.html +18 -0
- data/doc/classes/TextFile.src/{M000036.html → M000292.html} +1 -1
- data/doc/classes/TextFile.src/{M000037.html → M000293.html} +3 -3
- data/doc/classes/TextFile.src/M000294.html +18 -0
- data/doc/created.rid +1 -1
- data/doc/dot/f_0.dot +14 -1
- data/doc/files/bin/dskexplorer_rb.html +2 -12
- data/doc/files/bin/dskexplorer_rb.src/M000007.html +2 -4
- data/doc/files/bin/dskexplorer_rb.src/M000008.html +1 -1
- data/doc/files/bin/dskexplorer_rb.src/M000009.html +1 -1
- data/doc/files/bin/dskexplorer_rb.src/M000010.html +7 -3
- data/doc/files/bin/dskexplorer_rb.src/M000011.html +10 -6
- data/doc/files/bin/dskexplorer_rb.src/M000012.html +9 -12
- data/doc/files/bin/dskexplorer_rb.src/M000013.html +7 -4
- data/doc/files/bin/dsktool_rb.html +93 -41
- data/doc/files/bin/romdump_rb.html +184 -0
- data/doc/files/dsktool_web/dskexplorer_rb.html +107 -0
- data/doc/files/dsktool_web/index_rb.html +107 -0
- data/doc/files/lib/D65_rb.html +1 -7
- data/doc/files/lib/DOSDisk_rb.html +1 -8
- data/doc/files/lib/DOSFile_rb.html +3 -12
- data/doc/files/{test/test_dos_disks_rb.html → lib/DSKFile_rb.html} +5 -6
- data/doc/files/lib/DSK_rb.html +5 -7
- data/doc/files/lib/DumpUtilities_rb.html +101 -0
- data/doc/files/lib/HGR_rb.html +115 -0
- data/doc/files/lib/NADOLDisk_rb.html +1 -8
- data/doc/files/lib/NADOLFile_rb.html +3 -9
- data/doc/files/lib/PascalDisk_rb.html +108 -0
- data/doc/files/lib/PascalFile_rb.html +109 -0
- data/doc/files/lib/ProDOSDisk_rb.html +108 -0
- data/doc/files/lib/ProDOSFile_rb.html +108 -0
- data/doc/files/lib/rdoc_patch_rb.html +1 -7
- data/doc/files/test/backup/D65_rb.html +108 -0
- data/doc/files/test/backup/DOSDisk_rb.html +108 -0
- data/doc/files/test/backup/DOSFile_rb.html +110 -0
- data/doc/files/test/backup/DSKFile_rb.html +108 -0
- data/doc/files/test/backup/DSK_rb.html +116 -0
- data/doc/files/test/backup/DumpUtilities_rb.html +101 -0
- data/doc/files/test/backup/HGR_rb.html +115 -0
- data/doc/files/test/backup/NADOLDisk_rb.html +108 -0
- data/doc/files/test/backup/NADOLFile_rb.html +111 -0
- data/doc/files/test/backup/PascalDisk_rb.html +108 -0
- data/doc/files/test/backup/PascalFile_rb.html +109 -0
- data/doc/files/test/backup/ProDOSDisk_rb.html +108 -0
- data/doc/files/test/backup/ProDOSFile_rb.html +108 -0
- data/doc/files/test/backup/comp_rb.html +101 -0
- data/doc/files/test/backup/compress_dos_dsk_rb.html +114 -0
- data/doc/files/test/backup/extract_nadol_startup_rb.html +134 -0
- data/doc/files/test/backup/hgr_scanlines_rb.html +101 -0
- data/doc/files/test/backup/rdoc_patch_rb.html +108 -0
- data/doc/files/test/backup/tc_disassembly_rb.html +116 -0
- data/doc/files/test/backup/tc_dos_disks_rb.html +115 -0
- data/doc/files/test/backup/tc_nadol_disks_rb.html +115 -0
- data/doc/files/test/backup/tc_pascal_disks_rb.html +115 -0
- data/doc/files/test/backup/tc_prodos_disks_rb.html +115 -0
- data/doc/files/test/backup/ts_test_all_rb.html +112 -0
- data/doc/files/test/comp_rb.html +101 -0
- data/doc/files/test/compress_dos_dsk_rb.html +114 -0
- data/doc/files/test/extract_nadol_startup_rb.html +134 -0
- data/doc/files/test/hgr_scanlines_rb.html +101 -0
- data/doc/files/test/tc_disassembly_rb.html +1 -8
- data/doc/files/test/tc_dos_disks_rb.html +1 -8
- data/doc/files/test/tc_nadol_disks_rb.html +1 -8
- data/doc/files/test/tc_pascal_disks_rb.html +115 -0
- data/doc/files/test/tc_prodos_disks_rb.html +115 -0
- data/doc/files/test/ts_test_all_rb.html +3 -6
- data/doc/fr_class_index.html +12 -0
- data/doc/fr_file_index.html +40 -0
- data/doc/fr_method_index.html +281 -59
- data/lib/D65.rb +6 -6
- data/lib/DOSDisk.rb +248 -18
- data/lib/DOSFile.rb +75 -104
- data/lib/DSK.rb +198 -44
- data/lib/DSKFile.rb +141 -0
- data/lib/DumpUtilities.rb +30 -0
- data/lib/HGR.rb +136 -0
- data/lib/NADOLDisk.rb +199 -42
- data/lib/NADOLFile.rb +73 -35
- data/lib/PascalDisk.rb +121 -0
- data/lib/PascalFile.rb +62 -0
- data/lib/ProDOSDisk.rb +197 -0
- data/lib/ProDOSFile.rb +162 -0
- data/lib/a2_symbols.yaml +2 -2
- data/lib/dos33_blank.dsk.gz +0 -0
- data/lib/nadol_blank.po.gz +0 -0
- data/test/ADTPRO-1.0.1.DSK +0 -0
- data/test/ADTPRO-1.0.1.PO +0 -0
- data/test/Algebra Mentor (19xx)(John C. Miller)(Disk 1 of 7 Side A)(Student Disk 1).dsk.gz +0 -0
- data/test/Apple Works V5.0 (1993)(Beagle Bros)(Disks 5 of 6).dsk.gz +0 -0
- data/test/Geos (1988)(Berkeley Softworks)(Disk 1 of 4 Side A).dsk.gz +0 -0
- data/test/Zoom Grafix (1982)(Phoenix Software)[cr].dsk.gz +0 -0
- data/test/adventure_teacher_4.dsk.gz +0 -0
- data/test/camps.dsk.gz +0 -0
- data/test/dosmaster.po +0 -0
- data/test/hgr_scanlines.rb +194 -0
- data/test/nadol1.po +0 -0
- data/test/nadol_blank.po.gz +0 -0
- data/test/operation_frog1.dsk.gz +0 -0
- data/test/tc_dos_disks.rb +89 -14
- data/test/tc_nadol_disks.rb +47 -5
- data/test/tc_pascal_disks.rb +47 -0
- data/test/tc_prodos_disks.rb +78 -0
- data/test/test1.dsk +0 -0
- data/test/ts_test_all.rb +2 -0
- data/test/white_01b.dsk +0 -0
- data/test/white_03b.dsk +0 -0
- data/test/white_20a.dsk +0 -0
- metadata +400 -368
- data/doc/classes/AppleSoftFile.src/M000011.html +0 -18
- data/doc/classes/AppleSoftFile.src/M000012.html +0 -18
- data/doc/classes/AppleSoftFile.src/M000020.html +0 -18
- data/doc/classes/AppleSoftFile.src/M000021.html +0 -18
- data/doc/classes/AppleSoftFile.src/M000026.html +0 -18
- data/doc/classes/AppleSoftFile.src/M000027.html +0 -18
- data/doc/classes/AppleSoftFile.src/M000032.html +0 -18
- data/doc/classes/AppleSoftFile.src/M000033.html +0 -18
- data/doc/classes/AppleSoftFile.src/M000034.html +0 -18
- data/doc/classes/AppleSoftFile.src/M000035.html +0 -18
- data/doc/classes/AppleSoftFile.src/M000038.html +0 -18
- data/doc/classes/AppleSoftFile.src/M000039.html +0 -18
- data/doc/classes/AppleSoftFile.src/M000040.html +0 -18
- data/doc/classes/BinaryFile.src/M000022.html +0 -19
- data/doc/classes/BinaryFile.src/M000024.html +0 -18
- data/doc/classes/BinaryFile.src/M000026.html +0 -19
- data/doc/classes/BinaryFile.src/M000029.html +0 -18
- data/doc/classes/BinaryFile.src/M000031.html +0 -19
- data/doc/classes/BinaryFile.src/M000039.html +0 -18
- data/doc/classes/BinaryFile.src/M000041.html +0 -19
- data/doc/classes/BinaryFile.src/M000045.html +0 -18
- data/doc/classes/BinaryFile.src/M000047.html +0 -19
- data/doc/classes/BinaryFile.src/M000052.html +0 -18
- data/doc/classes/BinaryFile.src/M000053.html +0 -18
- data/doc/classes/BinaryFile.src/M000054.html +0 -18
- data/doc/classes/BinaryFile.src/M000056.html +0 -19
- data/doc/classes/BinaryFile.src/M000059.html +0 -18
- data/doc/classes/BinaryFile.src/M000060.html +0 -18
- data/doc/classes/BinaryFile.src/M000061.html +0 -19
- data/doc/classes/CatalogServlet.src/M000015.html +0 -20
- data/doc/classes/CatalogServlet.src/M000024.html +0 -20
- data/doc/classes/CatalogServlet.src/M000027.html +0 -20
- data/doc/classes/D65.src/M000002.html +0 -18
- data/doc/classes/D65.src/M000004.html +0 -64
- data/doc/classes/D65.src/M000005.html +0 -18
- data/doc/classes/D65.src/M000007.html +0 -18
- data/doc/classes/D65.src/M000008.html +0 -18
- data/doc/classes/D65.src/M000010.html +0 -18
- data/doc/classes/D65.src/M000018.html +0 -18
- data/doc/classes/D65.src/M000019.html +0 -64
- data/doc/classes/D65.src/M000024.html +0 -18
- data/doc/classes/D65.src/M000025.html +0 -64
- data/doc/classes/D65.src/M000030.html +0 -18
- data/doc/classes/D65.src/M000031.html +0 -18
- data/doc/classes/D65.src/M000035.html +0 -18
- data/doc/classes/D65.src/M000036.html +0 -64
- data/doc/classes/DOSDisk.src/M000007.html +0 -20
- data/doc/classes/DOSDisk.src/M000008.html +0 -77
- data/doc/classes/DOSDisk.src/M000010.html +0 -20
- data/doc/classes/DOSDisk.src/M000011.html +0 -20
- data/doc/classes/DOSDisk.src/M000013.html +0 -20
- data/doc/classes/DOSDisk.src/M000014.html +0 -20
- data/doc/classes/DOSDisk.src/M000015.html +0 -20
- data/doc/classes/DOSDisk.src/M000023.html +0 -20
- data/doc/classes/DOSDisk.src/M000024.html +0 -19
- data/doc/classes/DOSDisk.src/M000025.html +0 -76
- data/doc/classes/DOSDisk.src/M000029.html +0 -20
- data/doc/classes/DOSDisk.src/M000031.html +0 -76
- data/doc/classes/DOSDisk.src/M000035.html +0 -20
- data/doc/classes/DOSDisk.src/M000036.html +0 -20
- data/doc/classes/DOSDisk.src/M000037.html +0 -20
- data/doc/classes/DOSDisk.src/M000038.html +0 -19
- data/doc/classes/DOSDisk.src/M000039.html +0 -76
- data/doc/classes/DOSDisk.src/M000041.html +0 -20
- data/doc/classes/DOSDisk.src/M000042.html +0 -19
- data/doc/classes/DOSFile.src/M000026.html +0 -22
- data/doc/classes/DOSFile.src/M000027.html +0 -22
- data/doc/classes/DOSFile.src/M000032.html +0 -22
- data/doc/classes/DOSFile.src/M000033.html +0 -17
- data/doc/classes/DOSFile.src/M000034.html +0 -18
- data/doc/classes/DOSFile.src/M000042.html +0 -22
- data/doc/classes/DOSFile.src/M000044.html +0 -18
- data/doc/classes/DOSFile.src/M000048.html +0 -22
- data/doc/classes/DOSFile.src/M000050.html +0 -18
- data/doc/classes/DOSFile.src/M000051.html +0 -31
- data/doc/classes/DOSFile.src/M000057.html +0 -22
- data/doc/classes/DOSFile.src/M000058.html +0 -22
- data/doc/classes/DOSFile.src/M000059.html +0 -22
- data/doc/classes/DOSFile.src/M000060.html +0 -18
- data/doc/classes/DOSFile.src/M000061.html +0 -18
- data/doc/classes/DOSFile.src/M000062.html +0 -31
- data/doc/classes/DOSFile.src/M000064.html +0 -22
- data/doc/classes/DOSFile.src/M000065.html +0 -18
- data/doc/classes/DOSFile.src/M000066.html +0 -18
- data/doc/classes/DOSFile.src/M000067.html +0 -31
- data/doc/classes/DSK.src/M000009.html +0 -22
- data/doc/classes/DSK.src/M000010.html +0 -27
- data/doc/classes/DSK.src/M000011.html +0 -19
- data/doc/classes/DSK.src/M000013.html +0 -22
- data/doc/classes/DSK.src/M000014.html +0 -22
- data/doc/classes/DSK.src/M000016.html +0 -22
- data/doc/classes/DSK.src/M000017.html +0 -22
- data/doc/classes/DSK.src/M000018.html +0 -22
- data/doc/classes/DSK.src/M000019.html +0 -22
- data/doc/classes/DSK.src/M000020.html +0 -34
- data/doc/classes/DSK.src/M000021.html +0 -19
- data/doc/classes/DSK.src/M000023.html +0 -40
- data/doc/classes/DSK.src/M000028.html +0 -22
- data/doc/classes/DSK.src/M000029.html +0 -22
- data/doc/classes/DSK.src/M000030.html +0 -34
- data/doc/classes/DSK.src/M000031.html +0 -19
- data/doc/classes/DSK.src/M000032.html +0 -18
- data/doc/classes/DSK.src/M000034.html +0 -22
- data/doc/classes/DSK.src/M000036.html +0 -34
- data/doc/classes/DSK.src/M000037.html +0 -19
- data/doc/classes/DSK.src/M000038.html +0 -18
- data/doc/classes/DSK.src/M000039.html +0 -18
- data/doc/classes/DSK.src/M000040.html +0 -18
- data/doc/classes/DSK.src/M000041.html +0 -18
- data/doc/classes/DSK.src/M000042.html +0 -22
- data/doc/classes/DSK.src/M000044.html +0 -22
- data/doc/classes/DSK.src/M000045.html +0 -18
- data/doc/classes/DSK.src/M000046.html +0 -22
- data/doc/classes/DSK.src/M000048.html +0 -22
- data/doc/classes/DSK.src/M000049.html +0 -40
- data/doc/classes/DSK.src/M000050.html +0 -19
- data/doc/classes/DSK.src/M000051.html +0 -18
- data/doc/classes/DirectoryServlet.src/M000017.html +0 -20
- data/doc/classes/DirectoryServlet.src/M000026.html +0 -20
- data/doc/classes/DirectoryServlet.src/M000030.html +0 -20
- data/doc/classes/IntegerBasicFile.src/M000005.html +0 -18
- data/doc/classes/IntegerBasicFile.src/M000006.html +0 -18
- data/doc/classes/IntegerBasicFile.src/M000012.html +0 -18
- data/doc/classes/IntegerBasicFile.src/M000018.html +0 -18
- data/doc/classes/IntegerBasicFile.src/M000019.html +0 -18
- data/doc/classes/IntegerBasicFile.src/M000020.html +0 -18
- data/doc/classes/IntegerBasicFile.src/M000021.html +0 -18
- data/doc/classes/IntegerBasicFile.src/M000022.html +0 -18
- data/doc/classes/IntegerBasicFile.src/M000023.html +0 -18
- data/doc/classes/IntegerBasicFile.src/M000024.html +0 -18
- data/doc/classes/IntegerBasicFile.src/M000025.html +0 -18
- data/doc/classes/IntegerBasicFile.src/M000026.html +0 -18
- data/doc/classes/NADOLDisk.src/M000018.html +0 -20
- data/doc/classes/NADOLDisk.src/M000020.html +0 -50
- data/doc/classes/NADOLDisk.src/M000021.html +0 -20
- data/doc/classes/NADOLDisk.src/M000023.html +0 -50
- data/doc/classes/NADOLFile.src/M000030.html +0 -31
- data/doc/classes/NADOLFile.src/M000034.html +0 -31
- data/doc/classes/NADOLTokenisedFile.src/M000062.html +0 -28
- data/doc/classes/NADOLTokenisedFile.src/M000063.html +0 -28
- data/doc/classes/RDoc.src/M000033.html +0 -40
- data/doc/classes/RDoc.src/M000038.html +0 -40
- data/doc/classes/RDoc.src/M000055.html +0 -40
- data/doc/classes/RDoc.src/M000066.html +0 -40
- data/doc/classes/RDoc.src/M000068.html +0 -40
- data/doc/classes/RDoc.src/M000069.html +0 -40
- data/doc/classes/RDoc.src/M000074.html +0 -40
- data/doc/classes/SCAsmFile.src/M000028.html +0 -36
- data/doc/classes/SCAsmFile.src/M000035.html +0 -18
- data/doc/classes/SCAsmFile.src/M000038.html +0 -36
- data/doc/classes/SCAsmFile.src/M000041.html +0 -18
- data/doc/classes/SCAsmFile.src/M000042.html +0 -18
- data/doc/classes/SCAsmFile.src/M000043.html +0 -18
- data/doc/classes/SCAsmFile.src/M000044.html +0 -36
- data/doc/classes/SCAsmFile.src/M000049.html +0 -18
- data/doc/classes/SCAsmFile.src/M000050.html +0 -18
- data/doc/classes/SCAsmFile.src/M000051.html +0 -18
- data/doc/classes/SCAsmFile.src/M000052.html +0 -18
- data/doc/classes/SCAsmFile.src/M000055.html +0 -18
- data/doc/classes/SCAsmFile.src/M000056.html +0 -18
- data/doc/classes/SCAsmFile.src/M000057.html +0 -18
- data/doc/classes/ShowFileServlet.src/M000026.html +0 -21
- data/doc/classes/ShowFileServlet.src/M000038.html +0 -22
- data/doc/classes/ShowFileServlet.src/M000039.html +0 -22
- data/doc/classes/ShowFileServlet.src/M000044.html +0 -22
- data/doc/classes/TestDOSDisks.src/M000002.html +0 -19
- data/doc/classes/TestDOSDisks.src/M000003.html +0 -25
- data/doc/classes/TestDOSDisks.src/M000006.html +0 -24
- data/doc/classes/TestDOSDisks.src/M000007.html +0 -19
- data/doc/classes/TestDOSDisks.src/M000013.html +0 -19
- data/doc/classes/TestDisassembly.src/M000005.html +0 -19
- data/doc/classes/TestDisassembly.src/M000006.html +0 -19
- data/doc/classes/TestDisassembly.src/M000009.html +0 -19
- data/doc/classes/TestDisassembly.src/M000016.html +0 -19
- data/doc/classes/TestDisassembly.src/M000022.html +0 -19
- data/doc/classes/TestDisassembly.src/M000025.html +0 -19
- data/doc/classes/TestDisassembly.src/M000028.html +0 -19
- data/doc/classes/TestNADOLDisks.src/M000055.html +0 -19
- data/doc/classes/TestNADOLDisks.src/M000056.html +0 -19
- data/doc/classes/TestNADOLDisks.src/M000057.html +0 -19
- data/doc/classes/TestNADOLDisks.src/M000058.html +0 -34
- data/doc/classes/TestNADOLDisks.src/M000062.html +0 -19
- data/doc/classes/TestNADOLDisks.src/M000063.html +0 -34
- data/doc/classes/TextFile.src/M000025.html +0 -18
- data/doc/classes/TextFile.src/M000026.html +0 -18
- data/doc/classes/TextFile.src/M000029.html +0 -18
- data/doc/classes/TextFile.src/M000030.html +0 -18
- data/doc/classes/TextFile.src/M000035.html +0 -18
- data/doc/classes/TextFile.src/M000045.html +0 -18
- data/doc/classes/TextFile.src/M000046.html +0 -18
- data/doc/classes/TextFile.src/M000047.html +0 -20
- data/doc/classes/TextFile.src/M000052.html +0 -18
- data/doc/classes/TextFile.src/M000053.html +0 -18
- data/doc/classes/TextFile.src/M000054.html +0 -20
- data/doc/classes/TextFile.src/M000063.html +0 -18
- data/doc/classes/TextFile.src/M000064.html +0 -18
- data/doc/classes/TextFile.src/M000065.html +0 -18
- data/doc/classes/TextFile.src/M000066.html +0 -18
- data/doc/classes/TextFile.src/M000067.html +0 -18
- data/doc/classes/TextFile.src/M000068.html +0 -20
- data/doc/classes/TextFile.src/M000071.html +0 -18
- data/doc/classes/TextFile.src/M000072.html +0 -18
- data/doc/classes/TextFile.src/M000073.html +0 -20
- data/doc/dot/f_0.png +0 -0
- data/doc/dot/f_1.dot +0 -14
- data/doc/dot/f_1.png +0 -0
- data/doc/dot/f_10.dot +0 -32
- data/doc/dot/f_10.png +0 -0
- data/doc/dot/f_11.dot +0 -32
- data/doc/dot/f_11.png +0 -0
- data/doc/dot/f_12.dot +0 -14
- data/doc/dot/f_12.png +0 -0
- data/doc/dot/f_2.dot +0 -23
- data/doc/dot/f_2.png +0 -0
- data/doc/dot/f_3.dot +0 -32
- data/doc/dot/f_3.png +0 -0
- data/doc/dot/f_4.dot +0 -88
- data/doc/dot/f_4.png +0 -0
- data/doc/dot/f_5.dot +0 -23
- data/doc/dot/f_5.png +0 -0
- data/doc/dot/f_6.dot +0 -32
- data/doc/dot/f_6.png +0 -0
- data/doc/dot/f_7.dot +0 -49
- data/doc/dot/f_7.png +0 -0
- data/doc/dot/f_8.dot +0 -30
- data/doc/dot/f_8.png +0 -0
- data/doc/dot/f_9.dot +0 -32
- data/doc/dot/f_9.png +0 -0
- data/doc/dot/m_0_0.dot +0 -30
- data/doc/dot/m_0_0.png +0 -0
- data/doc/dot/m_6_0.dot +0 -30
- data/doc/dot/m_6_0.png +0 -0
- data/doc/dot/m_8_0.dot +0 -30
- data/doc/dot/m_8_0.png +0 -0
- data/doc/files/bin/dskserver_rb.html +0 -247
- data/doc/files/bin/dskserver_rb.src/M000001.html +0 -22
- data/doc/files/bin/dskserver_rb.src/M000002.html +0 -19
- data/doc/files/bin/dskserver_rb.src/M000003.html +0 -62
- data/doc/files/bin/dskserver_rb.src/M000004.html +0 -39
- 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
|
-
|
|
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
|
|
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
|
|
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
|
-
(
|
|
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
|
-
|
|
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
|
-
|
|
51
|
-
|
|
52
|
-
end
|
|
53
|
-
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
|
|
54
143
|
dsk=DSK.new(file_bytes)
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
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,
|
|
69
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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.
|