dsktool 0.4.2 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/bin/dskexplorer.rb +1 -1
- data/bin/dskexplorer.rb~ +365 -0
- data/bin/dsktool.rb +7 -3
- data/bin/dsktool.rb~ +173 -0
- data/doc/classes/AppleSoftFile.html +199 -0
- data/doc/classes/AppleSoftFile.src/M000005.html +18 -0
- data/doc/classes/AppleSoftFile.src/M000006.html +18 -0
- data/doc/classes/AppleSoftFile.src/M000008.html +18 -0
- data/doc/classes/AppleSoftFile.src/M000009.html +18 -0
- data/doc/classes/AppleSoftFile.src/M000010.html +18 -0
- data/doc/classes/AppleSoftFile.src/M000055.html +18 -0
- data/doc/classes/AppleSoftFile.src/M000056.html +18 -0
- data/doc/classes/AppleSoftFile.src/M000057.html +18 -0
- data/doc/classes/AppleSoftFile.src/M000058.html +18 -0
- data/doc/classes/BinaryFile.html +241 -0
- data/doc/classes/BinaryFile.src/M000015.html +18 -0
- data/doc/classes/BinaryFile.src/M000020.html +18 -0
- data/doc/classes/BinaryFile.src/M000021.html +18 -0
- data/doc/classes/BinaryFile.src/M000022.html +19 -0
- data/doc/classes/BinaryFile.src/M000107.html +18 -0
- data/doc/classes/BinaryFile.src/M000108.html +18 -0
- data/doc/classes/BinaryFile.src/M000109.html +18 -0
- data/doc/classes/BinaryFile.src/M000110.html +19 -0
- data/doc/classes/BinaryFile.src/M000111.html +19 -0
- data/doc/classes/BinaryFile.src/M000112.html +19 -0
- data/doc/classes/BinaryFile.src/M000113.html +18 -0
- data/doc/classes/CPMDisk.html +331 -0
- data/doc/classes/CPMDisk.src/M000024.html +21 -0
- data/doc/classes/CPMDisk.src/M000025.html +23 -0
- data/doc/classes/CPMDisk.src/M000026.html +23 -0
- data/doc/classes/CPMDisk.src/M000027.html +19 -0
- data/doc/classes/CPMDisk.src/M000028.html +18 -0
- data/doc/classes/CPMDisk.src/M000029.html +18 -0
- data/doc/classes/CPMDisk.src/M000030.html +31 -0
- data/doc/classes/CPMDisk.src/M000031.html +51 -0
- data/doc/classes/CPMDisk.src/M000032.html +53 -0
- data/doc/classes/CPMFile.html +252 -0
- data/doc/classes/CPMFile.src/M000064.html +22 -0
- data/doc/classes/CPMFile.src/M000065.html +20 -0
- data/doc/classes/CPMFile.src/M000066.html +22 -0
- data/doc/classes/CPMFile.src/M000067.html +18 -0
- data/doc/classes/CPMFile.src/M000068.html +18 -0
- data/doc/classes/CPMFile.src/M000069.html +18 -0
- data/doc/classes/CPMFile.src/M000070.html +18 -0
- data/doc/classes/CatalogServlet.html +148 -0
- data/doc/classes/CatalogServlet.src/M000035.html +20 -0
- data/doc/classes/CatalogServlet.src/M000036.html +20 -0
- data/doc/classes/D65.html +180 -0
- data/doc/classes/D65.src/M000002.html +18 -0
- data/doc/classes/D65.src/M000003.html +18 -0
- data/doc/classes/D65.src/M000004.html +64 -0
- data/doc/classes/D65.src/M000005.html +18 -0
- data/doc/classes/D65.src/M000006.html +18 -0
- data/doc/classes/D65.src/M000007.html +18 -0
- data/doc/classes/D65.src/M000008.html +18 -0
- data/doc/classes/D65.src/M000048.html +18 -0
- data/doc/classes/D65.src/M000049.html +64 -0
- data/doc/classes/DOSDisk.html +425 -0
- data/doc/classes/DOSDisk.src/M000007.html +20 -0
- data/doc/classes/DOSDisk.src/M000008.html +77 -0
- data/doc/classes/DOSDisk.src/M000010.html +20 -0
- data/doc/classes/DOSDisk.src/M000011.html +20 -0
- data/doc/classes/DOSDisk.src/M000012.html +19 -0
- data/doc/classes/DOSDisk.src/M000013.html +20 -0
- data/doc/classes/DOSDisk.src/M000053.html +23 -0
- data/doc/classes/DOSDisk.src/M000054.html +19 -0
- data/doc/classes/DOSDisk.src/M000055.html +21 -0
- data/doc/classes/DOSDisk.src/M000056.html +37 -0
- data/doc/classes/DOSDisk.src/M000057.html +85 -0
- data/doc/classes/DOSDisk.src/M000058.html +37 -0
- data/doc/classes/DOSDisk.src/M000059.html +34 -0
- data/doc/classes/DOSDisk.src/M000060.html +27 -0
- data/doc/classes/DOSDisk.src/M000061.html +43 -0
- data/doc/classes/DOSDisk.src/M000062.html +31 -0
- data/doc/classes/DOSDisk.src/M000063.html +95 -0
- data/doc/classes/DOSDisk.src/M000064.html +85 -0
- data/doc/classes/DOSDisk.src/M000065.html +37 -0
- data/doc/classes/DOSDisk.src/M000066.html +34 -0
- data/doc/classes/DOSDisk.src/M000067.html +27 -0
- data/doc/classes/DOSDisk.src/M000068.html +43 -0
- data/doc/classes/DOSDisk.src/M000069.html +31 -0
- data/doc/classes/DOSDisk.src/M000070.html +95 -0
- data/doc/classes/DOSFile.html +253 -0
- data/doc/classes/DOSFile.src/M000016.html +22 -0
- data/doc/classes/DOSFile.src/M000017.html +17 -0
- data/doc/classes/DOSFile.src/M000018.html +18 -0
- data/doc/classes/DOSFile.src/M000021.html +22 -0
- data/doc/classes/DOSFile.src/M000022.html +22 -0
- data/doc/classes/DOSFile.src/M000023.html +22 -0
- data/doc/classes/DOSFile.src/M000024.html +17 -0
- data/doc/classes/DOSFile.src/M000025.html +18 -0
- data/doc/classes/DOSFile.src/M000116.html +22 -0
- data/doc/classes/DOSFile.src/M000117.html +18 -0
- data/doc/classes/DOSFile.src/M000118.html +18 -0
- data/doc/classes/DOSFile.src/M000119.html +28 -0
- data/doc/classes/DOSFile.src/M000120.html +18 -0
- data/doc/classes/DSK.html +633 -0
- data/doc/classes/DSK.src/M000009.html +22 -0
- data/doc/classes/DSK.src/M000010.html +27 -0
- data/doc/classes/DSK.src/M000011.html +19 -0
- data/doc/classes/DSK.src/M000012.html +18 -0
- data/doc/classes/DSK.src/M000013.html +22 -0
- data/doc/classes/DSK.src/M000014.html +22 -0
- data/doc/classes/DSK.src/M000015.html +22 -0
- data/doc/classes/DSK.src/M000016.html +22 -0
- data/doc/classes/DSK.src/M000017.html +22 -0
- data/doc/classes/DSK.src/M000018.html +22 -0
- data/doc/classes/DSK.src/M000019.html +22 -0
- data/doc/classes/DSK.src/M000020.html +34 -0
- data/doc/classes/DSK.src/M000079.html +19 -0
- data/doc/classes/DSK.src/M000080.html +19 -0
- data/doc/classes/DSK.src/M000081.html +18 -0
- data/doc/classes/DSK.src/M000082.html +18 -0
- data/doc/classes/DSK.src/M000083.html +18 -0
- data/doc/classes/DSK.src/M000084.html +18 -0
- data/doc/classes/DSK.src/M000085.html +18 -0
- data/doc/classes/DSK.src/M000086.html +25 -0
- data/doc/classes/DSK.src/M000087.html +19 -0
- data/doc/classes/DSK.src/M000088.html +20 -0
- data/doc/classes/DSK.src/M000089.html +35 -0
- data/doc/classes/DSK.src/M000090.html +22 -0
- data/doc/classes/DSK.src/M000091.html +22 -0
- data/doc/classes/DSK.src/M000092.html +27 -0
- data/doc/classes/DSK.src/M000093.html +25 -0
- data/doc/classes/DSK.src/M000094.html +33 -0
- data/doc/classes/DSK.src/M000095.html +66 -0
- data/doc/classes/DSK.src/M000096.html +33 -0
- data/doc/classes/DSK.src/M000097.html +22 -0
- data/doc/classes/DSK.src/M000098.html +23 -0
- data/doc/classes/DSK.src/M000099.html +24 -0
- data/doc/classes/DSK.src/M000100.html +21 -0
- data/doc/classes/DSK.src/M000101.html +18 -0
- data/doc/classes/DSK.src/M000102.html +24 -0
- data/doc/classes/DSK.src/M000103.html +24 -0
- data/doc/classes/DSK.src/M000104.html +24 -0
- data/doc/classes/DSKFile.html +328 -0
- data/doc/classes/DSKFile.src/M000071.html +19 -0
- data/doc/classes/DSKFile.src/M000072.html +18 -0
- data/doc/classes/DSKFile.src/M000073.html +23 -0
- data/doc/classes/DSKFile.src/M000074.html +25 -0
- data/doc/classes/DSKFile.src/M000075.html +18 -0
- data/doc/classes/DSKFile.src/M000076.html +18 -0
- data/doc/classes/DSKFile.src/M000077.html +18 -0
- data/doc/classes/DSKFile.src/M000078.html +18 -0
- data/doc/classes/DSKFile.src/M000079.html +50 -0
- data/doc/classes/DSKTrackSector.html +199 -0
- data/doc/classes/DSKTrackSector.src/M000045.html +20 -0
- data/doc/classes/DSKTrackSector.src/M000046.html +18 -0
- data/doc/classes/DSKTrackSector.src/M000047.html +21 -0
- data/doc/classes/DSKTrackSector.src/M000049.html +20 -0
- data/doc/classes/DSKTrackSector.src/M000050.html +18 -0
- data/doc/classes/DSKTrackSector.src/M000051.html +21 -0
- data/doc/classes/DirectoryServlet.html +148 -0
- data/doc/classes/DirectoryServlet.src/M000041.html +20 -0
- data/doc/classes/DirectoryServlet.src/M000044.html +20 -0
- data/doc/classes/DumpUtilities.html +158 -0
- data/doc/classes/DumpUtilities.src/M000050.html +33 -0
- data/doc/classes/DumpUtilities.src/M000051.html +23 -0
- data/doc/classes/HGR.html +232 -0
- data/doc/classes/HGR.src/M000114.html +29 -0
- data/doc/classes/HGR.src/M000115.html +56 -0
- data/doc/classes/IntegerBasicFile.html +293 -0
- data/doc/classes/IntegerBasicFile.src/M000001.html +18 -0
- data/doc/classes/IntegerBasicFile.src/M000004.html +18 -0
- data/doc/classes/IntegerBasicFile.src/M000005.html +18 -0
- data/doc/classes/IntegerBasicFile.src/M000036.html +18 -0
- data/doc/classes/IntegerBasicFile.src/M000037.html +18 -0
- data/doc/classes/IntegerBasicFile.src/M000038.html +18 -0
- data/doc/classes/IntegerBasicFile.src/M000039.html +18 -0
- data/doc/classes/MBASICFile.html +202 -0
- data/doc/classes/MBASICFile.src/M000033.html +22 -0
- data/doc/classes/MBASICFile.src/M000034.html +30 -0
- data/doc/classes/MBASICFile.src/M000035.html +94 -0
- data/doc/classes/NADOLBinaryFile.html +184 -0
- data/doc/classes/NADOLBinaryFile.src/M000052.html +19 -0
- data/doc/classes/NADOLBinaryFile.src/M000053.html +18 -0
- data/doc/classes/NADOLBinaryFile.src/M000054.html +18 -0
- data/doc/classes/NADOLDisk.html +324 -0
- data/doc/classes/NADOLDisk.src/M000014.html +23 -0
- data/doc/classes/NADOLDisk.src/M000015.html +19 -0
- data/doc/classes/NADOLDisk.src/M000016.html +18 -0
- data/doc/classes/NADOLDisk.src/M000017.html +29 -0
- data/doc/classes/NADOLDisk.src/M000018.html +34 -0
- data/doc/classes/NADOLDisk.src/M000019.html +32 -0
- data/doc/classes/NADOLDisk.src/M000020.html +22 -0
- data/doc/classes/NADOLDisk.src/M000021.html +38 -0
- data/doc/classes/NADOLDisk.src/M000022.html +27 -0
- data/doc/classes/NADOLDisk.src/M000023.html +53 -0
- data/doc/classes/NADOLDisk.src/M000024.html +46 -0
- data/doc/classes/NADOLFile.html +189 -0
- data/doc/classes/NADOLFile.src/M000042.html +18 -0
- data/doc/classes/NADOLFile.src/M000043.html +18 -0
- data/doc/classes/NADOLFile.src/M000044.html +28 -0
- data/doc/classes/NADOLTokenisedFile.html +231 -0
- data/doc/classes/NADOLTokenisedFile.src/M000124.html +28 -0
- data/doc/classes/NADOLTokenisedFile.src/M000125.html +49 -0
- data/doc/classes/NADOLTokenisedFile.src/M000126.html +18 -0
- data/doc/classes/NADOLTokenisedFile.src/M000127.html +18 -0
- data/doc/classes/Nibbles.html +231 -0
- data/doc/classes/Nibbles.src/M000110.html +18 -0
- data/doc/classes/Nibbles.src/M000111.html +20 -0
- data/doc/classes/Nibbles.src/M000112.html +18 -0
- data/doc/classes/Nibbles.src/M000113.html +101 -0
- data/doc/classes/PNG.html +151 -0
- data/doc/classes/PNG.src/M000123.html +26 -0
- data/doc/classes/SCAsmFile.html +242 -0
- data/doc/classes/SCAsmFile.src/M000102.html +18 -0
- data/doc/classes/SCAsmFile.src/M000103.html +18 -0
- data/doc/classes/SCAsmFile.src/M000104.html +18 -0
- data/doc/classes/SCAsmFile.src/M000105.html +18 -0
- data/doc/classes/SCAsmFile.src/M000106.html +39 -0
- data/doc/classes/ShowFileServlet.html +148 -0
- data/doc/classes/ShowFileServlet.src/M000052.html +22 -0
- data/doc/classes/ShowFileServlet.src/M000059.html +22 -0
- data/doc/classes/ShowPNGServlet.html +148 -0
- data/doc/classes/ShowPNGServlet.src/M000101.html +26 -0
- data/doc/classes/ShowPNGServlet.src/M000105.html +26 -0
- data/doc/classes/ShowSectorServlet.html +148 -0
- data/doc/classes/ShowSectorServlet.src/M000040.html +22 -0
- data/doc/classes/ShowSectorServlet.src/M000043.html +22 -0
- data/doc/classes/TestCPMDisks.html +159 -0
- data/doc/classes/TestCPMDisks.src/M000037.html +19 -0
- data/doc/classes/TestCPMDisks.src/M000038.html +57 -0
- data/doc/classes/TestDOSDisks.html +279 -0
- data/doc/classes/TestDOSDisks.src/M000001.html +19 -0
- data/doc/classes/TestDOSDisks.src/M000002.html +19 -0
- data/doc/classes/TestDOSDisks.src/M000003.html +25 -0
- data/doc/classes/TestDOSDisks.src/M000014.html +26 -0
- data/doc/classes/TestDOSDisks.src/M000015.html +19 -0
- data/doc/classes/TestDOSDisks.src/M000016.html +62 -0
- data/doc/classes/TestDOSDisks.src/M000017.html +22 -0
- data/doc/classes/TestDOSDisks.src/M000018.html +20 -0
- data/doc/classes/TestDOSDisks.src/M000019.html +19 -0
- data/doc/classes/TestDOSDisks.src/M000020.html +25 -0
- data/doc/classes/TestDOSDisks.src/M000021.html +47 -0
- data/doc/classes/TestDOSDisks.src/M000022.html +28 -0
- data/doc/classes/TestDOSDisks.src/M000023.html +28 -0
- data/doc/classes/TestDOSDisks.src/M000025.html +26 -0
- data/doc/classes/TestDOSDisks.src/M000026.html +19 -0
- data/doc/classes/TestDOSDisks.src/M000027.html +62 -0
- data/doc/classes/TestDOSDisks.src/M000028.html +22 -0
- data/doc/classes/TestDOSDisks.src/M000029.html +20 -0
- data/doc/classes/TestDOSDisks.src/M000030.html +19 -0
- data/doc/classes/TestDOSDisks.src/M000031.html +25 -0
- data/doc/classes/TestDOSDisks.src/M000032.html +47 -0
- data/doc/classes/TestDOSDisks.src/M000033.html +28 -0
- data/doc/classes/TestDOSDisks.src/M000034.html +28 -0
- data/doc/classes/TestDisassembly.html +144 -0
- data/doc/classes/TestDisassembly.src/M000005.html +19 -0
- data/doc/classes/TestDisassembly.src/M000006.html +19 -0
- data/doc/classes/TestDisassembly.src/M000039.html +19 -0
- data/doc/classes/TestModifiedDOSDisks.html +193 -0
- data/doc/classes/TestModifiedDOSDisks.src/M000045.html +24 -0
- data/doc/classes/TestModifiedDOSDisks.src/M000046.html +27 -0
- data/doc/classes/TestModifiedDOSDisks.src/M000047.html +24 -0
- data/doc/classes/TestModifiedDOSDisks.src/M000048.html +27 -0
- data/doc/classes/TestNADOLDisks.html +193 -0
- data/doc/classes/TestNADOLDisks.src/M000106.html +22 -0
- data/doc/classes/TestNADOLDisks.src/M000107.html +72 -0
- data/doc/classes/TestNADOLDisks.src/M000108.html +22 -0
- data/doc/classes/TestNADOLDisks.src/M000109.html +72 -0
- data/doc/classes/TestNADOLDisks.src/M000121.html +22 -0
- data/doc/classes/TestNADOLDisks.src/M000122.html +73 -0
- data/doc/classes/TestPascalDisks.html +174 -0
- data/doc/classes/TestPascalDisks.src/M000040.html +28 -0
- data/doc/classes/TestPascalDisks.src/M000041.html +24 -0
- data/doc/classes/TestPascalDisks.src/M000042.html +27 -0
- data/doc/classes/TestProDOSDisks.html +253 -0
- data/doc/classes/TestProDOSDisks.src/M000114.html +28 -0
- data/doc/classes/TestProDOSDisks.src/M000115.html +28 -0
- data/doc/classes/TestProDOSDisks.src/M000116.html +41 -0
- data/doc/classes/TestProDOSDisks.src/M000117.html +28 -0
- data/doc/classes/TestProDOSDisks.src/M000118.html +28 -0
- data/doc/classes/TestProDOSDisks.src/M000119.html +28 -0
- data/doc/classes/TestProDOSDisks.src/M000120.html +41 -0
- data/doc/classes/TestProDOSDisks.src/M000121.html +28 -0
- data/doc/classes/TextFile.html +196 -0
- data/doc/classes/TextFile.src/M000019.html +18 -0
- data/doc/classes/TextFile.src/M000020.html +20 -0
- data/doc/classes/TextFile.src/M000024.html +18 -0
- data/doc/classes/TextFile.src/M000025.html +18 -0
- data/doc/classes/TextFile.src/M000026.html +18 -0
- data/doc/classes/TextFile.src/M000027.html +20 -0
- data/doc/classes/TextFile.src/M000128.html +18 -0
- data/doc/classes/TextFile.src/M000129.html +18 -0
- data/doc/classes/TextFile.src/M000130.html +18 -0
- data/doc/classes/TextFile.src/M000131.html +20 -0
- data/doc/created.rid +1 -0
- data/doc/dot/f_0.dot +14 -84
- data/doc/dot/f_0.png +0 -0
- data/doc/dot/f_1.dot +32 -0
- data/doc/dot/f_1.png +0 -0
- data/doc/dot/f_10.dot +32 -0
- data/doc/dot/f_10.png +0 -0
- data/doc/dot/f_11.dot +14 -0
- data/doc/dot/f_11.png +0 -0
- data/doc/dot/f_12.dot +84 -0
- data/doc/dot/f_12.png +0 -0
- data/doc/dot/f_15.dot +32 -0
- data/doc/dot/f_15.png +0 -0
- data/doc/dot/f_18.dot +32 -0
- data/doc/dot/f_18.png +0 -0
- data/doc/dot/f_2.dot +32 -0
- data/doc/dot/f_2.png +0 -0
- data/doc/dot/f_20.dot +32 -0
- data/doc/dot/f_20.png +0 -0
- data/doc/dot/f_3.dot +32 -0
- data/doc/dot/f_3.png +0 -0
- data/doc/dot/f_4.dot +32 -0
- data/doc/dot/f_4.png +0 -0
- data/doc/dot/f_5.dot +32 -0
- data/doc/dot/f_5.png +0 -0
- data/doc/dot/f_6.dot +32 -0
- data/doc/dot/f_6.png +0 -0
- data/doc/dot/f_7.dot +23 -0
- data/doc/dot/f_7.png +0 -0
- data/doc/dot/f_8.dot +23 -0
- data/doc/dot/f_8.png +0 -0
- data/doc/dot/f_9.dot +45 -0
- data/doc/dot/f_9.png +0 -0
- data/doc/files/bin/dskexplorer_rb.html +365 -0
- data/doc/files/bin/dskexplorer_rb.src/M000001.html +21 -0
- data/doc/files/bin/dskexplorer_rb.src/M000002.html +21 -0
- data/doc/files/bin/dskexplorer_rb.src/M000003.html +22 -0
- data/doc/files/bin/dskexplorer_rb.src/M000004.html +20 -0
- data/doc/files/bin/dskexplorer_rb.src/M000005.html +20 -0
- data/doc/files/bin/dskexplorer_rb.src/M000006.html +22 -0
- data/doc/files/bin/dskexplorer_rb.src/M000007.html +16 -0
- data/doc/files/bin/dskexplorer_rb.src/M000008.html +20 -0
- data/doc/files/bin/dskexplorer_rb.src/M000009.html +43 -0
- data/doc/files/bin/dskexplorer_rb.src/M000010.html +59 -0
- data/doc/files/bin/dskexplorer_rb.src/M000011.html +53 -0
- data/doc/files/bin/dskexplorer_rb.src/M000012.html +58 -0
- data/doc/files/bin/dskexplorer_rb.src/M000013.html +37 -0
- data/doc/files/bin/dsktool_rb.html +276 -0
- data/doc/files/bin/romdump_rb.html +189 -0
- data/doc/files/dsktool_web/dskexplorer_rb.html +112 -0
- data/doc/files/dsktool_web/dskexplorer_web_rb.html +112 -0
- data/doc/files/dsktool_web/index_rb.html +112 -0
- data/doc/files/lib/CPMDisk_rb.html +115 -0
- data/doc/files/lib/CPMFile_rb.html +117 -0
- data/doc/files/lib/D65_rb.html +114 -0
- data/doc/files/lib/DOSDisk_rb.html +115 -0
- data/doc/files/lib/DOSFile_rb.html +122 -0
- data/doc/files/lib/DSKFile_rb.html +114 -0
- data/doc/files/lib/DSK_rb.html +127 -0
- data/doc/files/lib/DumpUtilities_rb.html +107 -0
- data/doc/files/lib/HGR_rb.html +122 -0
- data/doc/files/lib/NADOLDisk_rb.html +115 -0
- data/doc/files/lib/NADOLFile_rb.html +120 -0
- data/doc/files/lib/Nibbles_rb.html +114 -0
- data/doc/files/test/tc_cpm_disks_rb.html +122 -0
- data/doc/files/test/tc_disassembly_rb.html +116 -0
- data/doc/files/test/tc_dos_disks_rb.html +122 -0
- data/doc/files/test/tc_modified_dos_disks_rb.html +122 -0
- data/doc/files/test/tc_nadol_disks_rb.html +122 -0
- data/doc/files/test/tc_prodos_disks_rb.html +122 -0
- data/doc/files/test/test_dos_disks_rb.html +109 -0
- data/doc/files/test/ts_test_all_rb.html +119 -0
- data/doc/files/test_bak/hgr_scanlines_rb.html +106 -0
- data/doc/files/test_bak/tc_disassembly_rb.html +123 -0
- data/doc/files/test_bak/tc_dos_disks_rb.html +122 -0
- data/doc/files/test_bak/tc_modified_dos_disks_rb.html +122 -0
- data/doc/files/test_bak/tc_nadol_disks_rb.html +122 -0
- data/doc/files/test_bak/tc_pascal_disks_rb.html +122 -0
- data/doc/files/test_bak/tc_prodos_disks_rb.html +122 -0
- data/doc/files/test_bak/ts_test_all_rb.html +118 -0
- data/doc/fr_class_index.html +46 -0
- data/doc/fr_file_index.html +47 -0
- data/doc/fr_method_index.html +147 -0
- data/doc/index.html +24 -0
- data/doc/rdoc-style.css +208 -0
- data/lib/CPMDisk.rb +194 -0
- data/lib/CPMFile.rb +344 -0
- data/lib/DOSDisk.rb +16 -12
- data/lib/DOSDisk.rb~ +201 -0
- data/lib/DOSFile.rb~ +402 -0
- data/lib/DSK.rb +99 -49
- data/lib/DSK.rb~ +226 -0
- data/lib/DSKFile.rb +9 -0
- data/lib/DSKFile.rb~ +137 -0
- data/lib/HGR.rb~ +157 -0
- data/lib/NADOLDisk.rb~ +104 -0
- data/lib/NADOLFile.rb~ +225 -0
- data/lib/Nibbles.rb +210 -0
- data/lib/PascalDisk.rb~ +120 -0
- data/lib/PascalFile.rb~ +62 -0
- data/lib/ProDOSDisk.rb~ +197 -0
- data/lib/ProDOSFile.rb~ +160 -0
- data/test/1.txt +267 -0
- data/test/CPM1.DSK +0 -0
- data/test/CPM1.PO +0 -0
- data/test/PIC.ZO +0 -0
- data/test/STARCPM.DSK +0 -0
- data/test/SWRDTH1.NIB +1 -0
- data/test/blah.png +0 -0
- data/test/blah2.png +0 -0
- data/test/blank.nib +1 -0
- data/test/build_hgr_table.rb +28 -0
- data/test/build_hgr_table.rb~ +28 -0
- data/test/cpm_write_test.dsk +0 -0
- data/test/ed.txt +0 -0
- data/test/p.html +15030 -0
- data/test/pic.rb +19 -0
- data/test/pic.rb~ +18 -0
- data/test/sword.dsk +0 -0
- data/test/tc_cpm_disks.rb +59 -0
- data/test/tc_dos_disks.rb~ +107 -0
- data/test/tc_modified_dos_disks.rb +33 -0
- data/test/tc_nadol_disks.rb +0 -1
- data/test/tc_nadol_disks.rb~ +42 -0
- data/test/tc_pascal_disks.rb~ +48 -0
- data/test/tc_prodos_disks.rb~ +78 -0
- data/test/ts_test_all.rb +6 -4
- data/test/ts_test_all.rb~ +7 -0
- data/test/x.txt +16 -0
- metadata +485 -35
data/lib/CPMDisk.rb
ADDED
@@ -0,0 +1,194 @@
|
|
1
|
+
$:.unshift(File.dirname(__FILE__)) unless
|
2
|
+
$:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
|
3
|
+
|
4
|
+
# Disk image with CPM File System
|
5
|
+
#catalog will be on track 2
|
6
|
+
#CPM DIR looks like this:
|
7
|
+
#$00 User number, or E5h if it's a free entry
|
8
|
+
#$01..0B Filename + extension: 8+3 characters
|
9
|
+
#$0C..0D Extent number of this entry
|
10
|
+
#$0E..0F Number of 128-byte records used in last alloc. block
|
11
|
+
#$10..1F Allocation map for this directory entry
|
12
|
+
|
13
|
+
require 'CPMFile'
|
14
|
+
class CPMDisk < DSK
|
15
|
+
attr_accessor :free_blocks,:free_directory_entries
|
16
|
+
RECORD_SIZE=128
|
17
|
+
BLOCK_SIZE=1024
|
18
|
+
BLOCKS_PER_EXTENT=16
|
19
|
+
RECORDS_PER_BLOCK=BLOCK_SIZE/RECORD_SIZE
|
20
|
+
RECORDS_PER_EXTENT=RECORDS_PER_BLOCK*BLOCKS_PER_EXTENT
|
21
|
+
|
22
|
+
SECTORS_IN_BLOCK=[
|
23
|
+
[0x00,0x06,0x0C,0x03], #block 0
|
24
|
+
[0x09,0x0F,0x0E,0x05], #block 1
|
25
|
+
[0x0B,0x02,0x08,0x07], #block 2
|
26
|
+
[0x0D,0x04,0x0A,0x01] #block 3
|
27
|
+
]
|
28
|
+
|
29
|
+
def get_block(block_no)
|
30
|
+
track_no= ((block_no/4)+3)%track_count
|
31
|
+
s=""
|
32
|
+
SECTORS_IN_BLOCK[block_no%4].each {|sector_no|s+=get_sector(track_no,sector_no)}
|
33
|
+
s
|
34
|
+
end
|
35
|
+
|
36
|
+
def set_block(block_no,contents)
|
37
|
+
raise "invalid block #{block_no} - length was #{contents.length}" unless contents.length==BLOCK_SIZE
|
38
|
+
track_no=(block_no/4)+3
|
39
|
+
0.upto(3) do |i|
|
40
|
+
sector_no=SECTORS_IN_BLOCK[block_no%4][i]
|
41
|
+
set_sector(track_no,sector_no,contents[(i*256),256])
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def dump_catalog
|
46
|
+
s=""
|
47
|
+
files.keys.sort.each { |file_name|
|
48
|
+
file=files[file_name]
|
49
|
+
s<< sprintf("% 12s % 6d \n",file.full_filename,file.contents.length)
|
50
|
+
}
|
51
|
+
s
|
52
|
+
end
|
53
|
+
|
54
|
+
|
55
|
+
def initialize(file_bytes,sector_order)
|
56
|
+
super(file_bytes,sector_order)
|
57
|
+
self.read_catalog
|
58
|
+
end
|
59
|
+
|
60
|
+
def file_system
|
61
|
+
:cpm
|
62
|
+
end
|
63
|
+
|
64
|
+
def make_file(filename,contents,file_options={})
|
65
|
+
return CPMFile.new(filename,contents)
|
66
|
+
end
|
67
|
+
|
68
|
+
|
69
|
+
def delete_file(full_filename)
|
70
|
+
catalog=get_block(0)+get_block(1)
|
71
|
+
(partial_filename,file_ext)=CPMFile.split_filename(full_filename)
|
72
|
+
0.upto(63) do |dir_entry_no|
|
73
|
+
dir_entry_start=dir_entry_no*0x20
|
74
|
+
dir_entry=catalog[dir_entry_start..dir_entry_start+0x1F]
|
75
|
+
if (partial_filename==dir_entry[0x01..0x08].gsub(' ','')) && (file_ext==dir_entry[0x09..0x0B].gsub(' ',''))
|
76
|
+
#we found a matching filename, so set the 'user number' field to a 'blank' entry
|
77
|
+
catalog[dir_entry_start]=0xE5
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
set_block(0,catalog[0,BLOCK_SIZE])
|
82
|
+
set_block(1,catalog[BLOCK_SIZE,BLOCK_SIZE])
|
83
|
+
self.read_catalog
|
84
|
+
end
|
85
|
+
|
86
|
+
def add_file(file)
|
87
|
+
raise "only CPMFiles may be added to CPM format disks!" unless file.kind_of?(CPMFile)
|
88
|
+
delete_file(file.full_filename) #so we can overwrite the file if it already exists
|
89
|
+
|
90
|
+
total_record_count=(file.contents.length/RECORD_SIZE.to_f).ceil
|
91
|
+
total_blocks_needed=(total_record_count/RECORDS_PER_BLOCK.to_f).ceil
|
92
|
+
total_extents_needed=(total_blocks_needed/BLOCKS_PER_EXTENT.to_f).ceil
|
93
|
+
|
94
|
+
raise "#{total_blocks_needed} free blocks required, only #{free_blocks.length} available" unless total_blocks_needed<=free_blocks.length
|
95
|
+
raise "#{total_extents_needed} free directory entries required, only #{free_directory_entries.length} available" unless total_extents_needed<=free_directory_entries.length
|
96
|
+
catalog=get_block(0)+get_block(1)
|
97
|
+
padded_file_contents=file.contents+(0x1A.chr*BLOCK_SIZE)
|
98
|
+
|
99
|
+
0.upto(total_extents_needed-1) do |extent_no|
|
100
|
+
records_this_extent=(extent_no==(total_extents_needed-1) ? (total_record_count % RECORDS_PER_EXTENT):RECORDS_PER_EXTENT)
|
101
|
+
blocks_this_extent=(records_this_extent/RECORDS_PER_BLOCK.to_f).ceil
|
102
|
+
blocks_used=[0]*BLOCKS_PER_EXTENT
|
103
|
+
first_record_this_extent=extent_no*RECORDS_PER_EXTENT
|
104
|
+
contents_this_extent=padded_file_contents[(first_record_this_extent*RECORD_SIZE),blocks_this_extent*BLOCK_SIZE]
|
105
|
+
|
106
|
+
0.upto(blocks_this_extent-1) do |block_no|
|
107
|
+
this_block=free_blocks[block_no+(extent_no*BLOCKS_PER_EXTENT)]
|
108
|
+
set_block(this_block,contents_this_extent[block_no*BLOCK_SIZE,BLOCK_SIZE])
|
109
|
+
blocks_used[block_no]=this_block
|
110
|
+
end
|
111
|
+
dir_entry_no=free_directory_entries[extent_no]
|
112
|
+
dir_entry_start=dir_entry_no*0x20
|
113
|
+
dir_entry=[0,file.filename,file.file_type,extent_no,0,0,records_this_extent,blocks_used].flatten.pack("CA8A3C4C16")
|
114
|
+
catalog[dir_entry_start..dir_entry_start+0x1F]=dir_entry
|
115
|
+
end
|
116
|
+
|
117
|
+
set_block(0,catalog[0,BLOCK_SIZE])
|
118
|
+
set_block(1,catalog[BLOCK_SIZE,BLOCK_SIZE])
|
119
|
+
self.read_catalog
|
120
|
+
|
121
|
+
end
|
122
|
+
|
123
|
+
|
124
|
+
#reads the directory, and populate the "files" array with files
|
125
|
+
#CPM DIR looks like this:
|
126
|
+
#$00 User number, or E5h if it's a free entry
|
127
|
+
#$01..0B Filename + extension: 8+3 characters
|
128
|
+
#$0C..0D Extent number of this entry
|
129
|
+
#$0E ???
|
130
|
+
#$0F Number of 128-byte records allocated in this extant
|
131
|
+
#$10..1F Allocation map for this directory entry
|
132
|
+
def read_catalog
|
133
|
+
@free_blocks=[]
|
134
|
+
@free_directory_entries=[]
|
135
|
+
@files={}
|
136
|
+
#first two blocks are where the catalog lives
|
137
|
+
(2..((track_count-3)*4)-1).each {|block| @free_blocks<<block}
|
138
|
+
catalog=get_block(0)+get_block(1)
|
139
|
+
#require 'DumpUtilities'
|
140
|
+
#puts DumpUtilities.hex_dump(catalog)
|
141
|
+
0.upto(63) do |dir_entry_no|
|
142
|
+
#puts dir_entry_no
|
143
|
+
dir_entry_start=dir_entry_no*0x20
|
144
|
+
dir_entry=catalog[dir_entry_start..dir_entry_start+0x1F]
|
145
|
+
if (dir_entry[0]<0x10) then
|
146
|
+
file_name=dir_entry[0x01..0x08].gsub(' ','')
|
147
|
+
file_ext=dir_entry[0x09..0x0B].gsub(' ','')
|
148
|
+
|
149
|
+
if (file_ext=="BAS") then
|
150
|
+
file=MBASICFile.new("#{file_name}.#{file_ext}",'')
|
151
|
+
else
|
152
|
+
file=CPMFile.new("#{file_name}.#{file_ext}",'')
|
153
|
+
end
|
154
|
+
if @files[file.full_filename].nil? then
|
155
|
+
@files[file.full_filename]=file
|
156
|
+
end
|
157
|
+
s=""
|
158
|
+
0x10.upto(0x1f) do |i|
|
159
|
+
block=dir_entry[i]
|
160
|
+
@free_blocks.delete(block)
|
161
|
+
s+=get_block(block) unless block==0
|
162
|
+
end
|
163
|
+
records_allocated=dir_entry[0x0F]
|
164
|
+
@files[file.full_filename].contents+=s[0,(records_allocated*128)]
|
165
|
+
else
|
166
|
+
@free_directory_entries<<dir_entry_no
|
167
|
+
end
|
168
|
+
end
|
169
|
+
end
|
170
|
+
end
|
171
|
+
# == Author
|
172
|
+
# Jonno Downes (jonno@jamtronix.com)
|
173
|
+
#
|
174
|
+
# == Copyright
|
175
|
+
# Copyright (c) 2007 Jonno Downes (jonno@jamtronix.com)
|
176
|
+
#
|
177
|
+
#Permission is hereby granted, free of charge, to any person obtaining
|
178
|
+
#a copy of this software and associated documentation files (the
|
179
|
+
#"Software"), to deal in the Software without restriction, including
|
180
|
+
#without limitation the rights to use, copy, modify, merge, publish,
|
181
|
+
#distribute, sublicense, and/or sell copies of the Software, and to
|
182
|
+
#permit persons to whom the Software is furnished to do so, subject to
|
183
|
+
#the following conditions:
|
184
|
+
|
185
|
+
# The above copyright notice and this permission notice shall be
|
186
|
+
# included in all copies or substantial portions of the Software.
|
187
|
+
|
188
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
189
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
190
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
191
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
192
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
193
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
194
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/lib/CPMFile.rb
ADDED
@@ -0,0 +1,344 @@
|
|
1
|
+
$:.unshift(File.dirname(__FILE__)) unless
|
2
|
+
$:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
|
3
|
+
|
4
|
+
require 'DSKFile'
|
5
|
+
require 'HGR'
|
6
|
+
|
7
|
+
class CPMFile < DSKFile
|
8
|
+
attr_accessor :file_type
|
9
|
+
def CPMFile.split_filename(filename)
|
10
|
+
filename=~/^([^.]{0,8})(\.([^.]{0,3}))?$/ #filename should have 0-8 chars, then optionally a dot and up to 3 more chars.
|
11
|
+
partial_filename=$1
|
12
|
+
ext=$3
|
13
|
+
ext="" if ext.nil?
|
14
|
+
return [partial_filename,ext]
|
15
|
+
end
|
16
|
+
def initialize(filename,contents)
|
17
|
+
@filename,@file_type=CPMFile.split_filename(filename)
|
18
|
+
raise "invalid filename #{filename}" if @filename.nil?
|
19
|
+
@contents=contents
|
20
|
+
end
|
21
|
+
|
22
|
+
def full_filename
|
23
|
+
if @file_type=="" then
|
24
|
+
@filename
|
25
|
+
else
|
26
|
+
"#{@filename}.#{@file_type}"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def to_s
|
31
|
+
@contents.gsub(/\x1A*$/,'')
|
32
|
+
end
|
33
|
+
|
34
|
+
def file_extension
|
35
|
+
return "."+@file_type.downcase
|
36
|
+
end
|
37
|
+
|
38
|
+
def can_be_picture?
|
39
|
+
file_type==:foto && HGR.can_be_hgr_screen?(@contents)
|
40
|
+
end
|
41
|
+
|
42
|
+
def to_png(pallete_mode=:amber)
|
43
|
+
HGR.buffer_to_png(@contents,pallete_mode)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
class MBASICFile<CPMFile
|
48
|
+
|
49
|
+
#the CP/M MBASIC file format is very similar to the MS-DOS BASICA/GWBASIC formats, described at
|
50
|
+
#http://www.chebucto.ns.ca/~af380/GW-BASIC-tokens.html
|
51
|
+
|
52
|
+
SINGLE_BYTE_TOKENS={
|
53
|
+
0x81=>'END',
|
54
|
+
0x82=>'FOR',
|
55
|
+
0x83=>'NEXT',
|
56
|
+
0x84=>'DATA',
|
57
|
+
0x85=>'INPUT',
|
58
|
+
0x86=>'DIM',
|
59
|
+
0x87=>'READ',
|
60
|
+
0x88=>'LET',
|
61
|
+
0x89=>'GOTO',
|
62
|
+
0x8A=>'RUN',
|
63
|
+
0x8B=>'IF',
|
64
|
+
0x8C=>'RESTORE',
|
65
|
+
0x8D=>'GOSUB',
|
66
|
+
0x8E=>'RETURN',
|
67
|
+
0x8F=>'REM',
|
68
|
+
0x90=>'STOP',
|
69
|
+
0x91=>'PRINT',
|
70
|
+
0x92=>'CLEAR',
|
71
|
+
0x93=>'LIST',
|
72
|
+
0x94=>'NEW',
|
73
|
+
0x95=>'ON',
|
74
|
+
0x96=>'DEF',
|
75
|
+
0x97=>'POKE',
|
76
|
+
0x98=>'CONT',
|
77
|
+
0x9B=>'LPRINT',
|
78
|
+
0x9C=>'LLIST',
|
79
|
+
0x9D=>'WIDTH',
|
80
|
+
0x9E=>'ELSE',
|
81
|
+
0x9F=>'TRACE',
|
82
|
+
0xA0=>'NOTRACE',
|
83
|
+
0xA1=>'SWAP',
|
84
|
+
0xA2=>'ERASE',
|
85
|
+
0xA3=>'EDIT',
|
86
|
+
0xA4=>'ERROR',
|
87
|
+
0xA5=>'RESUME',
|
88
|
+
0xA6=>'DEL',
|
89
|
+
0xA7=>'AUTO',
|
90
|
+
0xA8=>'RENUM',
|
91
|
+
0xA9=>'DEFSTR',
|
92
|
+
0xAA=>'DEFINT',
|
93
|
+
0xAB=>'DEFSNG',
|
94
|
+
0xAC=>'DEFDBL',
|
95
|
+
0xAD=>'LINE',
|
96
|
+
0xAE=>'POP',
|
97
|
+
0xAF=>'WHILE',
|
98
|
+
0xB0=>'WEND',
|
99
|
+
0xB1=>'CALL',
|
100
|
+
0xB2=>'WRITE',
|
101
|
+
0xB3=>'COMMON',
|
102
|
+
0xB4=>'CHAIN',
|
103
|
+
0xB5=>'OPTION',
|
104
|
+
0xB6=>'RANDOMIZE',
|
105
|
+
0xB7=>'SYSTEM',
|
106
|
+
0xB8=>'OPEN',
|
107
|
+
0xB9=>'FIELD',
|
108
|
+
0xBA=>'GET',
|
109
|
+
0xBB=>'PUT',
|
110
|
+
0xBC=>'CLOSE',
|
111
|
+
0xBD=>'LOAD',
|
112
|
+
0xBE=>'MERGE',
|
113
|
+
0xBF=>'FILES',
|
114
|
+
0xC0=>'NAME',
|
115
|
+
0xC1=>'KILL',
|
116
|
+
0xC2=>'LSET',
|
117
|
+
0xC3=>'RSET',
|
118
|
+
0xC4=>'SAVE',
|
119
|
+
0xC5=>'RESET',
|
120
|
+
0xC6=>'TEXT',
|
121
|
+
0xC7=>'HOME',
|
122
|
+
0xC8=>'VTAB',
|
123
|
+
0xC9=>'HTAB',
|
124
|
+
0xCA=>'INVERSE',
|
125
|
+
0xCB=>'NORMAL',
|
126
|
+
0xCC=>'GR',
|
127
|
+
0xCD=>'COLOR',
|
128
|
+
0xCE=>'HLIN',
|
129
|
+
0xCF=>'VLIN',
|
130
|
+
0xD0=>'PLOT',
|
131
|
+
0xD1=>'HGR',
|
132
|
+
0xD2=>'HPLOT',
|
133
|
+
0xD3=>'HCOLOR',
|
134
|
+
0xD4=>'BEEP',
|
135
|
+
0xD5=>'WAIT',
|
136
|
+
0xDD=>'TO',
|
137
|
+
0xDE=>'THEN',
|
138
|
+
0xDF=>'TAB(',
|
139
|
+
0xE0=>'STEP',
|
140
|
+
0xE1=>'USR',
|
141
|
+
0xE2=>'FN',
|
142
|
+
0xE3=>'SPC(',
|
143
|
+
0xE4=>'NOT',
|
144
|
+
0xE5=>'ERL',
|
145
|
+
0xE6=>'ERR',
|
146
|
+
0xE7=>'STRING$',
|
147
|
+
0xE8=>'USING',
|
148
|
+
0xE9=>'INSTR',
|
149
|
+
0xEA=>"'",
|
150
|
+
0xEB=>'VARPTR',
|
151
|
+
0xEC=>'SCRN',
|
152
|
+
0xED=>'HSCRN',
|
153
|
+
0xEE=>'INKEY$',
|
154
|
+
0xEF=>'>',
|
155
|
+
0xF0=>'=',
|
156
|
+
0xF1=>'<',
|
157
|
+
0xF2=>'+',
|
158
|
+
0xF3=>'-',
|
159
|
+
0xF4=>'*',
|
160
|
+
0xF5=>'/',
|
161
|
+
0xF6=>'^',
|
162
|
+
0xF7=>'AND',
|
163
|
+
0xF8=>'OR',
|
164
|
+
0xF9=>'XOR',
|
165
|
+
0xFA=>'EQV',
|
166
|
+
0xFB=>'IMP',
|
167
|
+
0xFC=>'MOD',
|
168
|
+
0xFD=>'\\',
|
169
|
+
}
|
170
|
+
DOUBLE_BYTE_TOKENS={
|
171
|
+
0x81=>'LEFT$',
|
172
|
+
0x82=>'RIGHT$',
|
173
|
+
0x83=>'MID$',
|
174
|
+
0x84=>'SGN',
|
175
|
+
0x85=>'INT',
|
176
|
+
0x87=>'SQR',
|
177
|
+
0x88=>'RND',
|
178
|
+
0x89=>'SIN',
|
179
|
+
0x8A=>'LOG',
|
180
|
+
0x8B=>'EXP',
|
181
|
+
0x8C=>'COS',
|
182
|
+
0x8D=>'TAN',
|
183
|
+
0x8E=>'ATN',
|
184
|
+
0x8F=>'FRE',
|
185
|
+
0x90=>'POS',
|
186
|
+
0x91=>'LEN',
|
187
|
+
0x92=>'STR$',
|
188
|
+
0x93=>'VAL',
|
189
|
+
0x94=>'ASC',
|
190
|
+
0x95=>'CHR$',
|
191
|
+
0x96=>'PEEK',
|
192
|
+
0x97=>'SPACE$',
|
193
|
+
0x98=>'OCT$',
|
194
|
+
0x99=>'HEX$',
|
195
|
+
0x9A=>'LPOS',
|
196
|
+
0x9B=>'CINT',
|
197
|
+
0x9C=>'CSNG',
|
198
|
+
0x9D=>'CDBL',
|
199
|
+
0x9E=>'FIX',
|
200
|
+
0xAA=>'CVI',
|
201
|
+
0xAB=>'CVS',
|
202
|
+
0xAC=>'CVD',
|
203
|
+
0xAE=>'EOF',
|
204
|
+
0xAF=>'LOC',
|
205
|
+
0xB0=>'LOF',
|
206
|
+
0xB1=>'MKI$',
|
207
|
+
0xB2=>'MKS$',
|
208
|
+
0xB3=>'MKD$',
|
209
|
+
0xB4=>'VPOS',
|
210
|
+
0xB5=>'PDL',
|
211
|
+
0xB6=>'BUTTON',
|
212
|
+
}
|
213
|
+
|
214
|
+
|
215
|
+
def to_s
|
216
|
+
if @contents[0]==0xFF then
|
217
|
+
buffer_as_gbasic(@contents)
|
218
|
+
else
|
219
|
+
@contents
|
220
|
+
end
|
221
|
+
end
|
222
|
+
|
223
|
+
def parse_bytes_as_float(bytes)
|
224
|
+
return 0.0 if bytes[0]==0
|
225
|
+
exponent=2**(bytes[0]-0x80)
|
226
|
+
first_byte=bytes[1]
|
227
|
+
sign=-1.0 #assume it's negative
|
228
|
+
if first_byte<0x80 then
|
229
|
+
sign=1.0
|
230
|
+
first_byte+=0x80
|
231
|
+
end
|
232
|
+
mantissa=(first_byte/256.0)*sign
|
233
|
+
2.upto(bytes.length-1) do |i|
|
234
|
+
mantissa+=(bytes[i]/(256.0**i))
|
235
|
+
end
|
236
|
+
return sprintf("%8f",exponent*mantissa).to_f
|
237
|
+
end
|
238
|
+
|
239
|
+
|
240
|
+
def buffer_as_gbasic(buffer)
|
241
|
+
s=""
|
242
|
+
p=1
|
243
|
+
while(p<buffer.length) && (buffer[p]!=0)
|
244
|
+
p+=2 #skip the 2 byte pointer to the start of next line
|
245
|
+
line_number=buffer[p]+(buffer[p+1]<<8)
|
246
|
+
p+=2
|
247
|
+
s+= "#{line_number} "
|
248
|
+
while(p<buffer.length) && (buffer[p]!=0)
|
249
|
+
c=buffer[p]
|
250
|
+
p+=1
|
251
|
+
|
252
|
+
if (c==0x3A) then #if its a ':'
|
253
|
+
|
254
|
+
if buffer[p]==0x9E then #ELSE is actually stored as :ELSE
|
255
|
+
c=buffer[p]
|
256
|
+
p+=1
|
257
|
+
end
|
258
|
+
if buffer[p]==0x8F then #' is actually stored as :REM'
|
259
|
+
c=buffer[p+1]
|
260
|
+
p+=2
|
261
|
+
end
|
262
|
+
end
|
263
|
+
if c<0x20 then
|
264
|
+
case (c)
|
265
|
+
when 0x0B #OCTAL CONSTANT
|
266
|
+
constant=buffer[p]+(buffer[p+1]<<8)
|
267
|
+
s+=sprintf("&O%o",constant)
|
268
|
+
p+=2
|
269
|
+
|
270
|
+
when 0x0C #HEX CONSTANT
|
271
|
+
constant=buffer[p]+(buffer[p+1]<<8)
|
272
|
+
s+=sprintf("&H%X",constant)
|
273
|
+
p+=2
|
274
|
+
when 0x0E #DECIMAL LINE NUMBER
|
275
|
+
constant=buffer[p]+(buffer[p+1]<<8)
|
276
|
+
s+=sprintf("%d",constant)
|
277
|
+
p+=2
|
278
|
+
when 0x0F #one byte constant
|
279
|
+
constant=buffer[p]
|
280
|
+
s+=sprintf("%d",constant)
|
281
|
+
p+=1
|
282
|
+
when 0x11..0x1B #packed constant 0..9
|
283
|
+
s+=sprintf("%d",c-0x11)
|
284
|
+
when 0x1C #DECIMAL LINE NUMBER
|
285
|
+
constant=buffer[p]+(buffer[p+1]<<8)
|
286
|
+
s+=sprintf("%d",constant)
|
287
|
+
p+=2
|
288
|
+
when 0x1D #4 byte floating point
|
289
|
+
constant=parse_bytes_as_float(buffer[p..p+3].reverse)
|
290
|
+
s+=constant.to_s
|
291
|
+
p+=4
|
292
|
+
when 0x1F #8 byte floating point
|
293
|
+
constant=parse_bytes_as_float(buffer[p..p+7].reverse)
|
294
|
+
s+=constant.to_s
|
295
|
+
p+=8
|
296
|
+
end
|
297
|
+
|
298
|
+
elsif c<0x80 then
|
299
|
+
s+=c.chr
|
300
|
+
else
|
301
|
+
|
302
|
+
if c==0xFF then
|
303
|
+
|
304
|
+
c=buffer[p]
|
305
|
+
p+=1
|
306
|
+
token=DOUBLE_BYTE_TOKENS[c]
|
307
|
+
else
|
308
|
+
token=SINGLE_BYTE_TOKENS[c]
|
309
|
+
end
|
310
|
+
s+=(token.nil?) ? sprintf("[%02X]",c):token
|
311
|
+
|
312
|
+
end
|
313
|
+
end
|
314
|
+
s+="\n"
|
315
|
+
p+=1
|
316
|
+
end
|
317
|
+
s
|
318
|
+
end
|
319
|
+
|
320
|
+
end
|
321
|
+
# == Author
|
322
|
+
# Jonno Downes (jonno@jamtronix.com)
|
323
|
+
#
|
324
|
+
# == Copyright
|
325
|
+
# Copyright (c) 2007 Jonno Downes (jonno@jamtronix.com)
|
326
|
+
#
|
327
|
+
#Permission is hereby granted, free of charge, to any person obtaining
|
328
|
+
#a copy of this software and associated documentation files (the
|
329
|
+
#"Software"), to deal in the Software without restriction, including
|
330
|
+
#without limitation the rights to use, copy, modify, merge, publish,
|
331
|
+
#distribute, sublicense, and/or sell copies of the Software, and to
|
332
|
+
#permit persons to whom the Software is furnished to do so, subject to
|
333
|
+
#the following conditions:
|
334
|
+
|
335
|
+
# The above copyright notice and this permission notice shall be
|
336
|
+
# included in all copies or substantial portions of the Software.
|
337
|
+
|
338
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
339
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
340
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
341
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
342
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
343
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
344
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|