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/bin/dskexplorer.rb
CHANGED
@@ -37,7 +37,7 @@ opts.on("-p","--port PORT_NUMBER",Integer) {|val| @listening_port=val%0xFFFF}
|
|
37
37
|
opts.on("-r","--root ROOT_DIR",String) {|val| @@root_directory=val}
|
38
38
|
|
39
39
|
filename=opts.parse(ARGV)[0] rescue RDoc::usage_from_file(__FILE__,'Usage')
|
40
|
-
@@root_directory=File.expand_path(@@root_directory)
|
40
|
+
@@root_directory=File.expand_path(@@root_directory) unless @@root_directory=~/^http[s]?:/
|
41
41
|
require 'webrick'
|
42
42
|
require 'DSK'
|
43
43
|
include WEBrick
|
data/bin/dskexplorer.rb~
ADDED
@@ -0,0 +1,365 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
# dskexplorer.rb
|
3
|
+
#
|
4
|
+
# == Synopsis
|
5
|
+
# A web-based DSK file explorer
|
6
|
+
#
|
7
|
+
# == Usage
|
8
|
+
# dskexplorer.rb [switches]
|
9
|
+
#
|
10
|
+
# -h | --help display this message
|
11
|
+
# -p | --port PORT_NUMBER port number to listen on (default is 6502)
|
12
|
+
# -r | --root ROOT_DIR root directory to explore from (default is current directory)
|
13
|
+
# -v | --version show version number
|
14
|
+
#
|
15
|
+
# Examples
|
16
|
+
# dskexplorer.rb -r http://www.apple2.org.za/mirrors/
|
17
|
+
# dskexplorer.rb -r c:\downloads\apple2\ -p 8080
|
18
|
+
|
19
|
+
|
20
|
+
#make sure the relevant folder with our libraries is in the require path
|
21
|
+
lib_path=File.expand_path(File.dirname(__FILE__)+"//..//lib")
|
22
|
+
$:.unshift(lib_path) unless $:.include?(lib_path)
|
23
|
+
|
24
|
+
require 'optparse'
|
25
|
+
require 'rdoc_patch' #RDoc::usage patched to work under gem executables
|
26
|
+
dskexplorer_VERSION="0.1.0"
|
27
|
+
|
28
|
+
@listening_port=6502
|
29
|
+
@@root_directory="."
|
30
|
+
opts=OptionParser.new
|
31
|
+
opts.on("-h","--help") {RDoc::usage_from_file(__FILE__)}
|
32
|
+
opts.on("-v","--version") do
|
33
|
+
puts File.basename($0)+" "+dskexplorer_VERSION
|
34
|
+
exit
|
35
|
+
end
|
36
|
+
opts.on("-p","--port PORT_NUMBER",Integer) {|val| @listening_port=val%0xFFFF}
|
37
|
+
opts.on("-r","--root ROOT_DIR",String) {|val| @@root_directory=val}
|
38
|
+
|
39
|
+
filename=opts.parse(ARGV)[0] rescue RDoc::usage_from_file(__FILE__,'Usage')
|
40
|
+
|
41
|
+
require 'webrick'
|
42
|
+
require 'DSK'
|
43
|
+
include WEBrick
|
44
|
+
|
45
|
+
@@uri_cache={}
|
46
|
+
@@dsk_cache={}
|
47
|
+
def get_uri_from_cache(uri)
|
48
|
+
if @@uri_cache[uri].nil? then
|
49
|
+
@@uri_cache[uri]=open(uri).read
|
50
|
+
end
|
51
|
+
@@uri_cache[uri]
|
52
|
+
end
|
53
|
+
|
54
|
+
def get_dsk_from_cache(uri)
|
55
|
+
if @@dsk_cache[uri].nil? then
|
56
|
+
@@dsk_cache[uri]=DSK.read(uri)
|
57
|
+
end
|
58
|
+
@@dsk_cache[uri]
|
59
|
+
end
|
60
|
+
|
61
|
+
def common_header
|
62
|
+
"
|
63
|
+
<html>
|
64
|
+
<body>
|
65
|
+
<B>DSK Explorer</b><br>
|
66
|
+
"
|
67
|
+
end
|
68
|
+
def common_footer
|
69
|
+
"
|
70
|
+
<p><i>this is alpha software - please send feedback using the <a href=http://rubyforge.org/tracker/?group_id=3844> dsktool.rb forum</a><p>
|
71
|
+
"
|
72
|
+
end
|
73
|
+
|
74
|
+
def root_dir_is_website?
|
75
|
+
require 'hpricot'
|
76
|
+
require 'open-uri'
|
77
|
+
@@root_directory=~/^http[s]?:/?true : false
|
78
|
+
end
|
79
|
+
def make_absolute_path(relative_path)
|
80
|
+
if root_dir_is_website? then
|
81
|
+
@@root_directory+uri_encode(relative_path)
|
82
|
+
else
|
83
|
+
@@root_directory+relative_path
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
def html_escape(s)
|
88
|
+
s.gsub("&","&").gsub("<","<")
|
89
|
+
end
|
90
|
+
def uri_encode(s)
|
91
|
+
#standard URI.escape appears to miss some important characters
|
92
|
+
require 'uri'
|
93
|
+
URI.escape(s).gsub("[","%5b").gsub("]","%5d")
|
94
|
+
end
|
95
|
+
def get_directories_and_files(relative_path)
|
96
|
+
directories=[]
|
97
|
+
dsk_files=[]
|
98
|
+
absolute_path=make_absolute_path(relative_path)
|
99
|
+
if root_dir_is_website? then
|
100
|
+
html=get_uri_from_cache(absolute_path)
|
101
|
+
doc=Hpricot(html)
|
102
|
+
doc.search("a[@href]").each do |a|
|
103
|
+
href=URI.unescape(a.attributes["href"])
|
104
|
+
if (href=~/\w\/$/)
|
105
|
+
if !(href=~/^\//) then #directories end with a /, but skip absolute paths
|
106
|
+
directories<<(href)
|
107
|
+
end
|
108
|
+
elsif DSK.is_dsk_file?(href) then
|
109
|
+
dsk_files<<(href)
|
110
|
+
end
|
111
|
+
end
|
112
|
+
else
|
113
|
+
if File.exist?(absolute_path) && (File.stat(absolute_path).directory?) then
|
114
|
+
dir=Dir.new(absolute_path)
|
115
|
+
dir.each do |f|
|
116
|
+
directories<<f if (f[0].chr!=".") && (File.stat(absolute_path+"/"+f).directory?)
|
117
|
+
dsk_files<<f if (DSK.is_dsk_file?(f))
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
121
|
+
[directories,dsk_files]
|
122
|
+
end
|
123
|
+
|
124
|
+
def make_navigation_path(relative_path,filename=nil,display_mode=nil)
|
125
|
+
path_parts=relative_path.split("/")
|
126
|
+
#make the cookie-crumb-trail
|
127
|
+
partial_path=""
|
128
|
+
s="<a href=/dir/>#{@@root_directory}</a>"
|
129
|
+
path_parts.each do |p|
|
130
|
+
if p.length>0 then
|
131
|
+
partial_path+="/#{p}"
|
132
|
+
if DSK.is_dsk_file?(partial_path) then
|
133
|
+
s<<"/<a href=/catalog#{uri_encode(partial_path)}>#{p}</a>"
|
134
|
+
else
|
135
|
+
s<<"/<a href=/dir#{uri_encode(partial_path)}>#{p}</a>"
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
mode_param=""
|
141
|
+
if !display_mode.nil? then
|
142
|
+
mode_param="&mode=#{display_mode}"
|
143
|
+
end
|
144
|
+
if !filename.nil? then
|
145
|
+
s<<"/<a href=/showfile/#{uri_encode(relative_path)+'?filename='+uri_encode(filename)}#{mode_param}>#{filename}</a>"
|
146
|
+
end
|
147
|
+
|
148
|
+
|
149
|
+
#show the contents of the current directory
|
150
|
+
directories,dsk_files=get_directories_and_files(relative_path)
|
151
|
+
|
152
|
+
#list out the directories
|
153
|
+
|
154
|
+
s<<"<ul>"
|
155
|
+
#s<<"<li>[dir] <a href=/#{uri_encode('/dir/'+File.dirname(relative_path))}>..</a>\n"
|
156
|
+
directories.sort.each do |d|
|
157
|
+
s<<"<li>[dir] <a href=/dir/#{uri_encode(relative_path)}/#{uri_encode(d)}>#{d}</a>\n"
|
158
|
+
end
|
159
|
+
|
160
|
+
#list out the DSK files
|
161
|
+
dsk_files.sort.each do |f|
|
162
|
+
s<<"<li>[dsk] <a href=/catalog/#{uri_encode(relative_path)}/#{uri_encode(f)}>#{f}</a> [ <a href=#{uri_encode(@@root_directory+relative_path+'/'+f)}>download</a> ]\n"
|
163
|
+
end
|
164
|
+
s<<"</ul>"
|
165
|
+
|
166
|
+
s
|
167
|
+
end
|
168
|
+
def make_catalog(relative_path)
|
169
|
+
s="<p>"
|
170
|
+
begin
|
171
|
+
absolute_path=make_absolute_path(relative_path)
|
172
|
+
dsk=get_dsk_from_cache(absolute_path)
|
173
|
+
s<<"<br>file system: #{dsk.file_system}<br>sector order: #{dsk.sector_order}<br>tracks: #{dsk.track_count}<br>"
|
174
|
+
if (dsk.respond_to?(:files)) then
|
175
|
+
s<<"<table>\n<th>TYPE</th><th>SIZE (BYTES)</th><th>NAME</th></tr>\n"
|
176
|
+
dsk.files.keys.sort.each do |full_path|
|
177
|
+
f=dsk.files[full_path]
|
178
|
+
display_url="/showfile/#{uri_encode(relative_path)+'?filename='+uri_encode(full_path)}"
|
179
|
+
if f.respond_to?(:file_type) then
|
180
|
+
s<<"<td>#{f.file_type}</td>"
|
181
|
+
else
|
182
|
+
s<<"<td></td>"
|
183
|
+
end
|
184
|
+
s<<"<td>#{sprintf('%03d',f.contents.length)}</td>"
|
185
|
+
s<<"<td>#{full_path}</td>"
|
186
|
+
s<<"<td><a href=#{display_url}&mode=hex>hex dump</a></td>"
|
187
|
+
if f.can_be_picture? then
|
188
|
+
s<<"<td><a href=#{display_url}&mode=png>picture</a></td>"
|
189
|
+
elsif f.respond_to?(:disassembly)
|
190
|
+
s<<"<td><a href=#{display_url}&mode=list>disassembly</a></td>"
|
191
|
+
else
|
192
|
+
s<<"<td><a href=#{display_url}&mode=text>text</a></td>"
|
193
|
+
end
|
194
|
+
s<<"</tr>\n"
|
195
|
+
end
|
196
|
+
s<<"</table>"
|
197
|
+
else
|
198
|
+
s<<"<i>not a recognised format</i>"
|
199
|
+
end
|
200
|
+
s<<"<p><a href=/showsector/#{uri_encode(relative_path)}>View Sectors</a>"
|
201
|
+
rescue Exception => exception
|
202
|
+
s<<"<i>ERROR:#{exception}</i>"
|
203
|
+
end
|
204
|
+
s
|
205
|
+
end
|
206
|
+
def show_sector(relative_path,track,sector)
|
207
|
+
track="0" if track.nil?
|
208
|
+
sector="0" if sector.nil?
|
209
|
+
track=("0"+track).to_i
|
210
|
+
sector=("0"+sector).to_i
|
211
|
+
absolute_path=make_absolute_path(relative_path)
|
212
|
+
dsk=get_dsk_from_cache(absolute_path)
|
213
|
+
uri="/showsector/#{uri_encode(relative_path)}"
|
214
|
+
s=""
|
215
|
+
s<<"<table><tr><th colspan=16>TRACK</th></tr>"
|
216
|
+
s<<"<tr>"
|
217
|
+
0.upto(dsk.track_count-1) do |track_no|
|
218
|
+
if track_no==track then
|
219
|
+
s<<"<td><b>$#{sprintf('%02X',track)}</b></td>"
|
220
|
+
else
|
221
|
+
s<<"<td><a href=#{uri}?track=#{track_no}§or=0>$#{sprintf('%02X',track_no)}</a></td>"
|
222
|
+
end
|
223
|
+
if track_no>0 && track_no%0x10==0 then
|
224
|
+
s<<"</tr></tr>"
|
225
|
+
end
|
226
|
+
end
|
227
|
+
s<<"</tr>"
|
228
|
+
s<<"</table>"
|
229
|
+
|
230
|
+
s<<"<table><tr><th colspan=16>SECTOR</th></tr>"
|
231
|
+
s<<"<tr>"
|
232
|
+
0.upto(0x0F) do |sector_no|
|
233
|
+
if sector_no==sector then
|
234
|
+
s<<"<td><b>$#{sprintf('%02X',sector)}</b></td>"
|
235
|
+
else
|
236
|
+
s<<"<td><a href=#{uri}?track=#{track}§or=#{sector_no}>$#{sprintf('%02X',sector_no)}</a></td>"
|
237
|
+
end
|
238
|
+
end
|
239
|
+
s<<"</tr>"
|
240
|
+
s<<"</table>"
|
241
|
+
|
242
|
+
|
243
|
+
s<<"<pre>\n"
|
244
|
+
s<<html_escape(dsk.dump_sector(track,sector))
|
245
|
+
s<<"</pre>\n"
|
246
|
+
s<<"<p>"
|
247
|
+
s<<"<pre>\n"
|
248
|
+
s<<html_escape(dsk.disassemble_sector(track,sector))
|
249
|
+
s<<"</pre>\n"
|
250
|
+
|
251
|
+
end
|
252
|
+
|
253
|
+
def show_file(relative_path,filename,display_mode)
|
254
|
+
absolute_path=make_absolute_path(relative_path)
|
255
|
+
dsk=get_dsk_from_cache(absolute_path)
|
256
|
+
file=dsk.files[filename]
|
257
|
+
if file.nil? then
|
258
|
+
s="<i>#{filename} not found</i>"
|
259
|
+
else
|
260
|
+
s="<hl><pre>"
|
261
|
+
if display_mode=="hex" then
|
262
|
+
s<<html_escape(file.hex_dump)
|
263
|
+
elsif display_mode=="list" && file.respond_to?(:disassembly) then
|
264
|
+
s<<html_escape(file.disassembly)
|
265
|
+
elsif display_mode=="png" && file.respond_to?(:to_png) then
|
266
|
+
png_url="/png/#{uri_encode(relative_path)}?filename=#{uri_encode(filename)}"
|
267
|
+
s<<"<IMG SRC=#{png_url} HEIGHT=384 WIDTH=560>"
|
268
|
+
else
|
269
|
+
s<< (file.to_s)
|
270
|
+
end
|
271
|
+
s<<"\n</pre><hl>"
|
272
|
+
end
|
273
|
+
s
|
274
|
+
end
|
275
|
+
|
276
|
+
class DirectoryServlet < HTTPServlet::AbstractServlet
|
277
|
+
def do_GET(req,res)
|
278
|
+
relative_path=URI.unescape(req.path).sub(/^\/dir/,"")
|
279
|
+
res['Content-Type']="text/html"
|
280
|
+
res.body=common_header+make_navigation_path(relative_path)+common_footer
|
281
|
+
end
|
282
|
+
end
|
283
|
+
|
284
|
+
class CatalogServlet < HTTPServlet::AbstractServlet
|
285
|
+
def do_GET(req,res)
|
286
|
+
relative_path=URI.unescape(req.path).sub(/^\/catalog/,"")
|
287
|
+
res['Content-Type']="text/html"
|
288
|
+
res.body=common_header+make_navigation_path(relative_path)+make_catalog(relative_path)+common_footer
|
289
|
+
end
|
290
|
+
end
|
291
|
+
|
292
|
+
class ShowFileServlet < HTTPServlet::AbstractServlet
|
293
|
+
def do_GET(req,res)
|
294
|
+
relative_path=URI.unescape(req.path).sub(/^\/showfile/,"")
|
295
|
+
filename=URI.unescape(req.query['filename'])
|
296
|
+
display_mode=req.query['mode']
|
297
|
+
res['Content-Type']="text/html"
|
298
|
+
res.body=common_header+make_navigation_path(relative_path,filename,display_mode)+show_file(relative_path,filename,display_mode)+common_footer
|
299
|
+
end
|
300
|
+
end
|
301
|
+
|
302
|
+
class ShowPNGServlet < HTTPServlet::AbstractServlet
|
303
|
+
def do_GET(req,res)
|
304
|
+
relative_path=URI.unescape(req.path).sub(/^\/png/,"")
|
305
|
+
filename=URI.unescape(req.query['filename'])
|
306
|
+
pallete_mode=req.query['pallete_mode']
|
307
|
+
pallete_mode=:"#{pallete_mode}" unless pallete_mode.nil? #convert string to symbol
|
308
|
+
absolute_path=make_absolute_path(relative_path)
|
309
|
+
dsk=get_dsk_from_cache(absolute_path)
|
310
|
+
file=dsk.files[filename]
|
311
|
+
res['Content-Type']="image/png"
|
312
|
+
res.body=file.to_png(pallete_mode)
|
313
|
+
end
|
314
|
+
end
|
315
|
+
class ShowSectorServlet < HTTPServlet::AbstractServlet
|
316
|
+
def do_GET(req,res)
|
317
|
+
relative_path=URI.unescape(req.path).sub(/^\/showsector/,"")
|
318
|
+
track=req.query['track']
|
319
|
+
sector=req.query['sector']
|
320
|
+
res['Content-Type']="text/html"
|
321
|
+
res.body=common_header+make_navigation_path(relative_path)+show_sector(relative_path,track,sector)+common_footer
|
322
|
+
end
|
323
|
+
end
|
324
|
+
|
325
|
+
|
326
|
+
s=HTTPServer.new(
|
327
|
+
:Port=>@listening_port
|
328
|
+
)
|
329
|
+
trap("INT") {s.shutdown}
|
330
|
+
|
331
|
+
s.mount("/dir",DirectoryServlet)
|
332
|
+
s.mount("/catalog",CatalogServlet)
|
333
|
+
s.mount("/showfile",ShowFileServlet)
|
334
|
+
s.mount("/showsector",ShowSectorServlet)
|
335
|
+
s.mount("/png",ShowPNGServlet)
|
336
|
+
#default page - for now, just redirect to the default dir page
|
337
|
+
s.mount("/",DirectoryServlet)
|
338
|
+
|
339
|
+
puts "point your browser at http://localhost:#{@listening_port}/"
|
340
|
+
s.start
|
341
|
+
|
342
|
+
# == Author
|
343
|
+
# Jonno Downes (jonno@jamtronix.com)
|
344
|
+
#
|
345
|
+
# == Copyright
|
346
|
+
# Copyright (c) 2007 Jonno Downes (jonno@jamtronix.com)
|
347
|
+
#
|
348
|
+
#Permission is hereby granted, free of charge, to any person obtaining
|
349
|
+
#a copy of this software and associated documentation files (the
|
350
|
+
#"Software"), to deal in the Software without restriction, including
|
351
|
+
#without limitation the rights to use, copy, modify, merge, publish,
|
352
|
+
#distribute, sublicense, and/or sell copies of the Software, and to
|
353
|
+
#permit persons to whom the Software is furnished to do so, subject to
|
354
|
+
#the following conditions:
|
355
|
+
#
|
356
|
+
# The above copyright notice and this permission notice shall be
|
357
|
+
# included in all copies or substantial portions of the Software.
|
358
|
+
#
|
359
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
360
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
361
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
362
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
363
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
364
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
365
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/bin/dsktool.rb
CHANGED
@@ -10,6 +10,7 @@
|
|
10
10
|
#
|
11
11
|
# dsktool.rb [switches] <filename.dsk>
|
12
12
|
# -a | --add FILENAME (*) add file
|
13
|
+
# -A | --ascii force output to be ASCII (even if binary)
|
13
14
|
# -b | --base BASE use BASE as address to load Binary File
|
14
15
|
# this will add 2 bytes to the start of file
|
15
16
|
# BASE should be a hex number
|
@@ -26,7 +27,7 @@
|
|
26
27
|
# -h | --help display this message
|
27
28
|
# -I | --init FILESYSTEM initialise the disk with the specified filesytem
|
28
29
|
# DSK will be created if it doesn't exist.
|
29
|
-
# FILESYSTEM can be :
|
30
|
+
# FILESYSTEM can be : cpm,dos33,nadol,pascal,none
|
30
31
|
# -l | --list FILENAME monitor style listing (disassembles 65C02 opcodes)
|
31
32
|
# -o | --output FILENAME specify name to save extracted file as
|
32
33
|
# -r | --raw don't convert files to ASCII
|
@@ -43,6 +44,7 @@
|
|
43
44
|
#
|
44
45
|
# Currently supported filesystems:
|
45
46
|
# Apple Pascal (read only)
|
47
|
+
# CP/M (READ/WRITE)
|
46
48
|
# DOS 3.3 (READ/WRITE)
|
47
49
|
# NADOL (READ/WRITE)
|
48
50
|
# ProDOS 8 (read only)
|
@@ -60,10 +62,10 @@
|
|
60
62
|
# dsktool.rb --add STARTUP -T nadol.po
|
61
63
|
# dsktool.rb --add c:\src\dosdemo\a.out -t B -b $2000 dosdemo.dsk
|
62
64
|
# dsktool.rb --init dos33 new_dos_disk.dsk.gz
|
63
|
-
# dsktool.rb
|
65
|
+
# dsktool.rb -I none -B /tmp/a.out demo1.dsk
|
64
66
|
|
65
67
|
|
66
|
-
DSKTOOL_VERSION="0.
|
68
|
+
DSKTOOL_VERSION="0.5.1"
|
67
69
|
|
68
70
|
#make sure the relevant folder with our libraries is in the require path
|
69
71
|
lib_path=File.expand_path(File.dirname(__FILE__)+"//..//lib")
|
@@ -93,6 +95,7 @@ opts.on("-v","--version") do
|
|
93
95
|
exit
|
94
96
|
end
|
95
97
|
opts.on("-r","--raw") {extract_mode=:raw}
|
98
|
+
opts.on("-A","--ascii") {extract_mode=:ascii}
|
96
99
|
opts.on("-c","--catalog") {catalog=true}
|
97
100
|
opts.on("-D","--diskdump") {diskdump=true}
|
98
101
|
opts.on("-x","--explode") {explode=true}
|
@@ -211,6 +214,7 @@ begin #to wrap a rescue clause
|
|
211
214
|
output_file<< case extract_mode
|
212
215
|
when :raw then file.contents
|
213
216
|
when :hex then file.hex_dump
|
217
|
+
when :ascii then file.to_ascii
|
214
218
|
when :list then
|
215
219
|
if file.respond_to?(:disassembly)
|
216
220
|
file.disassembly
|
data/bin/dsktool.rb~
ADDED
@@ -0,0 +1,173 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# dsktool.rb
|
3
|
+
#
|
4
|
+
# == Synopsis
|
5
|
+
#
|
6
|
+
# Manipulate DSK format files (as used by Apple 2 emulators)
|
7
|
+
#
|
8
|
+
# == Usage
|
9
|
+
#
|
10
|
+
# dsktool.rb [switches] <filename.dsk>
|
11
|
+
# -c | --catalog display catalog
|
12
|
+
# -e | --extract FILENAME extract file by name (either to stdout,
|
13
|
+
# or file specified by --output)
|
14
|
+
# -h | --help display this message
|
15
|
+
# -d | --dump FILENAME hex dump
|
16
|
+
# -D | --diskdump hex dump of entire disk
|
17
|
+
# -l | --list FILENAME monitor style listing (disassembles 65C02 opcodes)
|
18
|
+
# -o | --output FILENAME specify name to save extracted file as
|
19
|
+
# -r | --raw don't convert files to ASCII
|
20
|
+
# -v | --version show version number
|
21
|
+
# -x | --explode extract all files
|
22
|
+
#
|
23
|
+
# Currently supported filesystems:
|
24
|
+
# Apple Pascal
|
25
|
+
# DOS 3.3
|
26
|
+
# NADOL
|
27
|
+
# ProDOS 8
|
28
|
+
# Supports 16 sector DSK images
|
29
|
+
# Will uncompress gzipped files (with extension .gz)
|
30
|
+
# input files can be URLs
|
31
|
+
#
|
32
|
+
# examples:
|
33
|
+
# dsktool.rb -c DOS3MASTR.dsk.gz
|
34
|
+
# dsktool.rb -l FID DOS3MASTR.dsk
|
35
|
+
# dsktool.rb --list fid -o fid.lst DOS3MASTR.dsk
|
36
|
+
# dsktool.rb --extract "COLOR DEMOSOFT" DOS3MASTR.dsk
|
37
|
+
# dsktool.rb -e HELLO -o HELLO.bas DOS3MASTR.dsk
|
38
|
+
# dsktool.rb -x DOS3MASTR.dsk.gz
|
39
|
+
# dsktool.rb -x DOS3MASTR.dsk.gz -o /tmp/DOS3MASTR/
|
40
|
+
# dsktool.rb -c http://jamtronix.com/dsks/apshai.dsk.gz
|
41
|
+
|
42
|
+
DSKTOOL_VERSION="0.3.1"
|
43
|
+
|
44
|
+
#make sure the relevant folder with our libraries is in the require path
|
45
|
+
lib_path=File.expand_path(File.dirname(__FILE__)+"//..//lib")
|
46
|
+
$:.unshift(lib_path) unless $:.include?(lib_path)
|
47
|
+
require 'rubygems'
|
48
|
+
require 'optparse'
|
49
|
+
require 'rdoc_patch' #RDoc::usage patched to work under gem executables
|
50
|
+
|
51
|
+
catalog=false
|
52
|
+
explode=false
|
53
|
+
diskdump=false
|
54
|
+
output_filename=nil
|
55
|
+
extract_filename=nil
|
56
|
+
extract_mode=:default
|
57
|
+
explode_directory=nil
|
58
|
+
opts=OptionParser.new
|
59
|
+
opts.on("-h","--help") {RDoc::usage_from_file(__FILE__)}
|
60
|
+
opts.on("-v","--version") do
|
61
|
+
puts File.basename($0)+" "+DSKTOOL_VERSION
|
62
|
+
exit
|
63
|
+
end
|
64
|
+
opts.on("-r","--") {extract_mode=:raw}
|
65
|
+
opts.on("-c","--catalog") {catalog=true}
|
66
|
+
opts.on("-D","--diskdump") {diskdump=true}
|
67
|
+
opts.on("-x","--explode") {explode=true}
|
68
|
+
opts.on("-l","--list FILENAME",String) do |val|
|
69
|
+
extract_filename=val.upcase
|
70
|
+
extract_mode=:list
|
71
|
+
end
|
72
|
+
opts.on("-d","--dump FILENAME",String) do |val|
|
73
|
+
extract_filename=val.upcase
|
74
|
+
extract_mode=:hex
|
75
|
+
end
|
76
|
+
opts.on("-e","--extract FILENAME",String) {|val| extract_filename=val.upcase}
|
77
|
+
opts.on("-o","--output FILENAME",String) {|val| output_filename=val}
|
78
|
+
filename=opts.parse(ARGV)[0] rescue RDoc::usage_from_file(__FILE__,'Usage')
|
79
|
+
RDoc::usage_from_file(__FILE__,'Usage') if (filename.nil?)
|
80
|
+
|
81
|
+
|
82
|
+
require 'DSK'
|
83
|
+
begin
|
84
|
+
dsk=DSK.read(filename)
|
85
|
+
rescue Exception e
|
86
|
+
#if we run dsktool.rb in a batch or shell file iterating over a bunch of dsk files, we may not know what file
|
87
|
+
#has the error
|
88
|
+
STDERR << "error while parsing #{filename}\n"
|
89
|
+
raise
|
90
|
+
end
|
91
|
+
output_file= case
|
92
|
+
when (output_filename.nil?) || (explode) then STDOUT
|
93
|
+
else File.open(output_filename,"wb")
|
94
|
+
end
|
95
|
+
|
96
|
+
puts "#{filename}\nsector order:\t#{dsk.sector_order}\nfilesystem:\t#{dsk.file_system}"
|
97
|
+
if (dsk.respond_to?(:volume_name)) then
|
98
|
+
puts "volume name:\t#{dsk.volume_name}"
|
99
|
+
end
|
100
|
+
if (diskdump) then
|
101
|
+
puts dsk.hex_dump
|
102
|
+
end
|
103
|
+
|
104
|
+
if(catalog) then
|
105
|
+
if (dsk.respond_to?(:dump_catalog)) then
|
106
|
+
puts dsk.dump_catalog
|
107
|
+
else
|
108
|
+
puts "#{filename} does not have a recognised file system"
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
if(explode) then
|
113
|
+
output_dir=output_filename.nil??File.basename(filename,".*"):output_filename
|
114
|
+
if !(File.exists?(output_dir)) then
|
115
|
+
Dir.mkdir(output_dir)
|
116
|
+
end
|
117
|
+
|
118
|
+
dsk.files.each_value do |f|
|
119
|
+
if (extract_mode==:raw) then
|
120
|
+
output_filename=output_dir+"/"+f.filename+".raw"
|
121
|
+
File.open(output_filename,"wb") <<f.contents
|
122
|
+
else
|
123
|
+
output_filename=output_dir+"/"+f.filename+f.file_extension
|
124
|
+
File.open(output_filename,"wb") <<f
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
|
130
|
+
if (!extract_filename.nil?) then
|
131
|
+
file=dsk.files[extract_filename]
|
132
|
+
if file.nil? then
|
133
|
+
puts "'#{extract_filename}' not found in #{filename}"
|
134
|
+
else
|
135
|
+
output_file<< case extract_mode
|
136
|
+
when :raw then file.contents
|
137
|
+
when :hex then file.hex_dump
|
138
|
+
when :list then
|
139
|
+
if file.respond_to?(:disassembly)
|
140
|
+
file.disassembly
|
141
|
+
else
|
142
|
+
puts "'#{extract_filename}' is not a binary file"
|
143
|
+
exit
|
144
|
+
end
|
145
|
+
else file.to_s
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
# == Author
|
151
|
+
# Jonno Downes (jonno@jamtronix.com)
|
152
|
+
#
|
153
|
+
# == Copyright
|
154
|
+
# Copyright (c) 2007 Jonno Downes (jonno@jamtronix.com)
|
155
|
+
#
|
156
|
+
#Permission is hereby granted, free of charge, to any person obtaining
|
157
|
+
#a copy of this software and associated documentation files (the
|
158
|
+
#"Software"), to deal in the Software without restriction, including
|
159
|
+
#without limitation the rights to use, copy, modify, merge, publish,
|
160
|
+
#distribute, sublicense, and/or sell copies of the Software, and to
|
161
|
+
#permit persons to whom the Software is furnished to do so, subject to
|
162
|
+
#the following conditions:
|
163
|
+
#
|
164
|
+
# The above copyright notice and this permission notice shall be
|
165
|
+
# included in all copies or substantial portions of the Software.
|
166
|
+
#
|
167
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
168
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
169
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
170
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
171
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
172
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
173
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|