dsktool 0.4.2 → 0.5.1
Sign up to get free protection for your applications and to get access to all the features.
- 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.
|