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/Nibbles.rb
ADDED
@@ -0,0 +1,210 @@
|
|
1
|
+
$:.unshift(File.dirname(__FILE__)) unless
|
2
|
+
$:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
|
3
|
+
|
4
|
+
require 'DSK'
|
5
|
+
|
6
|
+
class Nibbles
|
7
|
+
# DEBUG=true
|
8
|
+
DEBUG=false
|
9
|
+
|
10
|
+
#dos interleave table (from Beneath Apple DOS p 3-23)
|
11
|
+
INTERLEAVES=[0x00,0x07,0x0E,0x06,0x0D,0x05,0x0C,0x04,0x0B,0x03,0x0A,0x02,0x09,0x01,0x08,0x0F]
|
12
|
+
|
13
|
+
#6-2 translate table (from Beneath Apple DOS p 3-17)
|
14
|
+
DATA_TRANSLATE_TABLE=[
|
15
|
+
0x96,#00
|
16
|
+
0x97,#01
|
17
|
+
0x9A,#02
|
18
|
+
0x9B,#03
|
19
|
+
0x9D,#04
|
20
|
+
0x9E,#05
|
21
|
+
0x9F,#06
|
22
|
+
0xA6,#07
|
23
|
+
0xA7,#08
|
24
|
+
0xAB,#09
|
25
|
+
0xAC,#0A
|
26
|
+
0xAD,#0B
|
27
|
+
0xAE,#0C
|
28
|
+
0xAF,#0D
|
29
|
+
0xB2,#0E
|
30
|
+
0xB3,#0F
|
31
|
+
0xB4,#10
|
32
|
+
0xB5,#11
|
33
|
+
0xB6,#12
|
34
|
+
0xB7,#13
|
35
|
+
0xB9,#14
|
36
|
+
0xBA,#15
|
37
|
+
0xBB,#16
|
38
|
+
0xBC,#17
|
39
|
+
0xBD,#18
|
40
|
+
0xBE,#19
|
41
|
+
0xBF,#1A
|
42
|
+
0xCB,#1B
|
43
|
+
0xCD,#1C
|
44
|
+
0xCE,#1D
|
45
|
+
0xCF,#1E
|
46
|
+
0xD3,#1F
|
47
|
+
0xD6,#20
|
48
|
+
0xD7,#21
|
49
|
+
0xD9,#22
|
50
|
+
0xDA,#23
|
51
|
+
0xDB,#24
|
52
|
+
0xDC,#25
|
53
|
+
0xDD,#26
|
54
|
+
0xDE,#27
|
55
|
+
0xDF,#28
|
56
|
+
0xE5,#29
|
57
|
+
0xE6,#2A
|
58
|
+
0xE7,#2B
|
59
|
+
0xE9,#2C
|
60
|
+
0xEA,#2D
|
61
|
+
0xEB,#2E
|
62
|
+
0xEC,#2F
|
63
|
+
0xED,#30
|
64
|
+
0xEE,#31
|
65
|
+
0xEF,#32
|
66
|
+
0xF2,#33
|
67
|
+
0xF3,#34
|
68
|
+
0xF4,#35
|
69
|
+
0xF5,#36
|
70
|
+
0xF6,#37
|
71
|
+
0xF7,#38
|
72
|
+
0xF9,#39
|
73
|
+
0xFA,#3A
|
74
|
+
0xFB,#3B
|
75
|
+
0xFC,#3C
|
76
|
+
0xFD,#3D
|
77
|
+
0xFE,#3E
|
78
|
+
0xFF,#3F
|
79
|
+
]
|
80
|
+
|
81
|
+
TRACK_LENGTH=6656
|
82
|
+
|
83
|
+
def Nibbles.decode_4_4(bytes)
|
84
|
+
return((bytes[0] << 1) | 1) & bytes[1]
|
85
|
+
end
|
86
|
+
|
87
|
+
def Nibbles.make_dsk_from_nibbles(nibbles)
|
88
|
+
dsk=DSK.new()
|
89
|
+
0.upto(0x22) {|track_no| set_dsk_sectors_for_nibbles_track(nibbles,dsk,track_no)}
|
90
|
+
dsk
|
91
|
+
end
|
92
|
+
|
93
|
+
def Nibbles.get_track(nibbles,track_no)
|
94
|
+
nibbles[track_no*TRACK_LENGTH..((track_no+1)*TRACK_LENGTH)-1]
|
95
|
+
end
|
96
|
+
|
97
|
+
def Nibbles.set_dsk_sectors_for_nibbles_track(nibbles,dsk,track_no)
|
98
|
+
|
99
|
+
sector_regex=/(\xD5.{8}[^D5]{1,20}\xFF+\xD5[^xD5]{348})/
|
100
|
+
track_nibbles=get_track(nibbles,track_no)
|
101
|
+
track_nibbles<<=track_nibbles[0..400]#wrap around one full sector
|
102
|
+
if DEBUG then
|
103
|
+
puts "#start track data"
|
104
|
+
track_nibbles.each_byte{|b| printf "%02X",b}
|
105
|
+
puts "# end track data"
|
106
|
+
end
|
107
|
+
|
108
|
+
sectors=track_nibbles.split(sector_regex)
|
109
|
+
sector_count=0
|
110
|
+
sector_has_been_read=[false]*16
|
111
|
+
sectors.each do |sector_nibbles|
|
112
|
+
|
113
|
+
if DEBUG then
|
114
|
+
puts "#start sector data"
|
115
|
+
sector_nibbles.each_byte{|b| printf "%02X",b}
|
116
|
+
puts "# end sector data"
|
117
|
+
end
|
118
|
+
next unless sector_nibbles=~/^\xFF*\xD5.*\xD5/
|
119
|
+
|
120
|
+
address_field,data_field=/\xFF*(\xD5.*)(\xD5.*)/.match(sector_nibbles).captures
|
121
|
+
address_field.each_byte{|b| printf "%02X",b} if DEBUG
|
122
|
+
vol_no=decode_4_4(address_field[3..4])
|
123
|
+
track_no=decode_4_4(address_field[5..6])
|
124
|
+
sector_no=decode_4_4(address_field[7..8])
|
125
|
+
next unless sector_no<16
|
126
|
+
next if sector_has_been_read[sector_no]
|
127
|
+
sector_has_been_read[sector_no]=true
|
128
|
+
sector_count+=1
|
129
|
+
if DEBUG then
|
130
|
+
puts "VOL #{vol_no} TRACK #{track_no} SECTOR #{sector_no}"
|
131
|
+
puts "#start data"
|
132
|
+
data_field.each_byte{|b| printf "%02X",b}
|
133
|
+
puts "# end data"
|
134
|
+
end
|
135
|
+
undecoded_data=data_field[3..345]
|
136
|
+
decoded_data='\0'*343
|
137
|
+
#algorithm taken from http://www.umich.edu/~archive/apple2/misc/hardware/disk.encoding.txt
|
138
|
+
checksum=0
|
139
|
+
0.upto(341) do |i|
|
140
|
+
undecoded_byte=undecoded_data[i]
|
141
|
+
decoded_byte=DATA_TRANSLATE_TABLE.index(undecoded_byte)
|
142
|
+
decoded_byte=0 if decoded_byte.nil?
|
143
|
+
#raise "invalid nibble #{sprintf '%02X',undecoded_byte} at nibble #{i}, track #{track_no}, sector #{sector_no}" if decoded_byte.nil?
|
144
|
+
decoded_byte^=checksum
|
145
|
+
if i<86 then
|
146
|
+
destination_offset=341-i
|
147
|
+
else
|
148
|
+
destination_offset=i-86
|
149
|
+
end
|
150
|
+
decoded_data[destination_offset]=decoded_byte
|
151
|
+
checksum=decoded_byte
|
152
|
+
# puts "-- #{i} - #{checksum} #{sprintf '%-3x',destination_offset}"
|
153
|
+
end
|
154
|
+
|
155
|
+
#raise "invalid checksum #{checksum}" unless checksum==0
|
156
|
+
|
157
|
+
0.upto(255) do |i|
|
158
|
+
decoded_data[i]<<=2
|
159
|
+
|
160
|
+
lower_2_bits=decoded_data[341-i%0x56]
|
161
|
+
case i/86
|
162
|
+
when 0 then
|
163
|
+
bit1=lower_2_bits&0x01
|
164
|
+
bit0=(lower_2_bits&0x02)>>1
|
165
|
+
when 1 then
|
166
|
+
bit1=(lower_2_bits&0x04)>>2
|
167
|
+
bit0=(lower_2_bits&0x08)>>3
|
168
|
+
when 2 then
|
169
|
+
bit1=(lower_2_bits&0x010)>>4
|
170
|
+
bit0=(lower_2_bits&0x20)>>5
|
171
|
+
end
|
172
|
+
printf "#{i} #{i/86} %08b #{bit0} #{bit1}\n",lower_2_bits if DEBUG
|
173
|
+
decoded_data[i]|=bit0
|
174
|
+
decoded_data[i]|=bit1<<1
|
175
|
+
end
|
176
|
+
logical_sector_no=INTERLEAVES[sector_no]
|
177
|
+
puts "mapping physical #{sprintf '%02X',sector_no} to logical #{sprintf '%02X',logical_sector_no}" if DEBUG
|
178
|
+
dsk.set_sector(track_no,logical_sector_no,decoded_data[0..255])
|
179
|
+
puts dsk.dump_sector(track_no,logical_sector_no) if DEBUG
|
180
|
+
end
|
181
|
+
# raise "expected 16 sectors but found #{sector_count} in track #{track_no}" unless sector_count==16
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
|
186
|
+
# == Author
|
187
|
+
# Jonno Downes (jonno@jamtronix.com)
|
188
|
+
#
|
189
|
+
# == Copyright
|
190
|
+
# Copyright (c) 2007 Jonno Downes (jonno@jamtronix.com)
|
191
|
+
#
|
192
|
+
#Permission is hereby granted, free of charge, to any person obtaining
|
193
|
+
#a copy of this software and associated documentation files (the
|
194
|
+
#"Software"), to deal in the Software without restriction, including
|
195
|
+
#without limitation the rights to use, copy, modify, merge, publish,
|
196
|
+
#distribute, sublicense, and/or sell copies of the Software, and to
|
197
|
+
#permit persons to whom the Software is furnished to do so, subject to
|
198
|
+
#the following conditions:
|
199
|
+
|
200
|
+
# The above copyright notice and this permission notice shall be
|
201
|
+
# included in all copies or substantial portions of the Software.
|
202
|
+
|
203
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
204
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
205
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
206
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
207
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
208
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
209
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
210
|
+
|
data/lib/PascalDisk.rb~
ADDED
@@ -0,0 +1,120 @@
|
|
1
|
+
$:.unshift(File.dirname(__FILE__)) unless
|
2
|
+
$:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
|
3
|
+
|
4
|
+
# Disk image with Pascal File System
|
5
|
+
#catalog will be at block 2.
|
6
|
+
#each entry consists of $1A bytes, which are:
|
7
|
+
#VOLUME HEADER
|
8
|
+
# 00..01 FIRST BLOCK (word)
|
9
|
+
# 02..03 LAST BLOCK+1 (word)
|
10
|
+
# 04 FILE TYPE (byte) = untypedfile,xdskfile,codefile,textfile,infofile,datafile,graffile,fotofile,securdir
|
11
|
+
# 05 FILLER
|
12
|
+
# 06 VOLUME NAME LENGTH (1 byte)
|
13
|
+
# 07..0D VOLUME NAME (17 bytes)
|
14
|
+
# 0E..0F VOLUME SIZE (WORD)
|
15
|
+
# 10 NUMBER OF FILES (BYTE)
|
16
|
+
# 11..1A FILLER
|
17
|
+
#
|
18
|
+
#FILES
|
19
|
+
# 00..01 FIRST BLOCK (word)
|
20
|
+
# 02..03 LAST BLOCK+1 (word)
|
21
|
+
# 04 FILE TYPE (byte) = untypedfile,xdskfile,codefile,textfile,infofile,datafile,graffile,fotofile,securdir
|
22
|
+
# 05 STATUS (byte)
|
23
|
+
# 06 FILENAME LENGTH (1 byte)
|
24
|
+
# 07..16 FILENAME (15 bytes)
|
25
|
+
# 17..18 BYTES IN LAST BLOCK (word)
|
26
|
+
# 19..1A FILE ACCESS DATE
|
27
|
+
|
28
|
+
require 'PascalFile'
|
29
|
+
class PascalDisk < DSK
|
30
|
+
attr_accessor :volume_name
|
31
|
+
|
32
|
+
def dump_catalog
|
33
|
+
s=""
|
34
|
+
files.each_value { |file|
|
35
|
+
s<< "#{sprintf('% 6d',file.contents.length)}\t #{file.file_type}\t#{file.filename}\n"
|
36
|
+
}
|
37
|
+
s
|
38
|
+
end
|
39
|
+
|
40
|
+
|
41
|
+
def initialize(file_bytes,sector_order)
|
42
|
+
super(file_bytes,sector_order)
|
43
|
+
self.read_catalog
|
44
|
+
end
|
45
|
+
|
46
|
+
def file_system
|
47
|
+
:pascal
|
48
|
+
end
|
49
|
+
|
50
|
+
#reads the catalog, and populate the "files" array with files
|
51
|
+
def read_catalog
|
52
|
+
catalog=get_block(2)
|
53
|
+
#we've read the first block in the catalog, now read the rest
|
54
|
+
catalog_size=catalog[2]
|
55
|
+
3.upto(catalog_size-1) do |i|
|
56
|
+
catalog<<get_block(i)
|
57
|
+
end
|
58
|
+
# 06 VOLUME NAME LENGTH (1 byte)
|
59
|
+
# 07..0D VOLUME NAME (17 bytes)
|
60
|
+
# 0E..0F VOLUME SIZE (WORD)
|
61
|
+
# 10 NUMBER OF FILES (BYTE)
|
62
|
+
volume_name_length=catalog[6]
|
63
|
+
self.volume_name=catalog[7..6+volume_name_length]
|
64
|
+
files_in_volume=catalog[0x10]
|
65
|
+
#read in all the files
|
66
|
+
|
67
|
+
# 00..01 FIRST BLOCK (word)
|
68
|
+
# 02..03 LAST BLOCK+1 (word)
|
69
|
+
# 04 FILE TYPE (byte) = untypedfile,xdskfile,codefile,textfile,infofile,datafile,graffile,fotofile,securdir
|
70
|
+
# 05 STATUS (byte)
|
71
|
+
# 06 FILENAME LENGTH (1 byte)
|
72
|
+
# 07..15 FILENAME (15 bytes)
|
73
|
+
# 16..17 BYTES IN LAST BLOCK (word)
|
74
|
+
# 18.1A FILE ACCESS DATE
|
75
|
+
1.upto(files_in_volume) do |file_no|
|
76
|
+
file_record=catalog[file_no*0x1a..(file_no*0x1a+0x19)]
|
77
|
+
first_block=file_record[0]+file_record[1]*0x100
|
78
|
+
first_block_in_next_file=file_record[2]+file_record[3]*0x100
|
79
|
+
last_block=first_block_in_next_file-1
|
80
|
+
file_type=file_record[4]
|
81
|
+
file_name_length=file_record[6]
|
82
|
+
file_name=file_record[7..6+file_name_length]
|
83
|
+
bytes_in_last_block=file_record[0x16]+file_record[0x17]*0x100
|
84
|
+
file_contents=""
|
85
|
+
first_block.upto(last_block) do |block_no|
|
86
|
+
this_block=get_block(block_no)
|
87
|
+
if block_no==last_block then
|
88
|
+
file_contents<<this_block[0..bytes_in_last_block-1]
|
89
|
+
else
|
90
|
+
file_contents<<this_block
|
91
|
+
end
|
92
|
+
files[file_name]=PascalFile.new(file_name,file_contents,file_type)
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
# == Author
|
98
|
+
# Jonno Downes (jonno@jamtronix.com)
|
99
|
+
#
|
100
|
+
# == Copyright
|
101
|
+
# Copyright (c) 2007 Jonno Downes (jonno@jamtronix.com)
|
102
|
+
#
|
103
|
+
#Permission is hereby granted, free of charge, to any person obtaining
|
104
|
+
#a copy of this software and associated documentation files (the
|
105
|
+
#"Software"), to deal in the Software without restriction, including
|
106
|
+
#without limitation the rights to use, copy, modify, merge, publish,
|
107
|
+
#distribute, sublicense, and/or sell copies of the Software, and to
|
108
|
+
#permit persons to whom the Software is furnished to do so, subject to
|
109
|
+
#the following conditions:
|
110
|
+
|
111
|
+
# The above copyright notice and this permission notice shall be
|
112
|
+
# included in all copies or substantial portions of the Software.
|
113
|
+
|
114
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
115
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
116
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
117
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
118
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
119
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
120
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/lib/PascalFile.rb~
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
$:.unshift(File.dirname(__FILE__)) unless
|
2
|
+
$:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
|
3
|
+
|
4
|
+
require 'DSKFile'
|
5
|
+
|
6
|
+
#Pascal file
|
7
|
+
class PascalFile < DSKFile
|
8
|
+
attr_accessor :file_type
|
9
|
+
|
10
|
+
PASCAL_FILE_TYPES=[:untyped,:xdsk,:code,:text,:info,:data,:graf,:foto,:securedir]
|
11
|
+
|
12
|
+
def initialize(filename,contents,file_type)
|
13
|
+
raise "filename too long - #{filename}" unless filename.length<=15
|
14
|
+
@filename=filename
|
15
|
+
@contents=contents
|
16
|
+
@file_type=PASCAL_FILE_TYPES[file_type]
|
17
|
+
end
|
18
|
+
|
19
|
+
def to_s
|
20
|
+
s=""
|
21
|
+
@contents.each_byte{|b| s<<(b%0x80).chr.tr(0x0D.chr,"\n")}
|
22
|
+
s
|
23
|
+
end
|
24
|
+
|
25
|
+
def file_extension
|
26
|
+
return "."+@file_type.downcase
|
27
|
+
end
|
28
|
+
|
29
|
+
def can_be_picture?
|
30
|
+
|
31
|
+
file_type==:foto && HGR.can_be_hgr_screen?(@contents)
|
32
|
+
end
|
33
|
+
|
34
|
+
def to_png(pallete_mode=:amber)
|
35
|
+
HGR.buffer_to_png(@contents,pallete_mode)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
# == Author
|
40
|
+
# Jonno Downes (jonno@jamtronix.com)
|
41
|
+
#
|
42
|
+
# == Copyright
|
43
|
+
# Copyright (c) 2007 Jonno Downes (jonno@jamtronix.com)
|
44
|
+
#
|
45
|
+
#Permission is hereby granted, free of charge, to any person obtaining
|
46
|
+
#a copy of this software and associated documentation files (the
|
47
|
+
#"Software"), to deal in the Software without restriction, including
|
48
|
+
#without limitation the rights to use, copy, modify, merge, publish,
|
49
|
+
#distribute, sublicense, and/or sell copies of the Software, and to
|
50
|
+
#permit persons to whom the Software is furnished to do so, subject to
|
51
|
+
#the following conditions:
|
52
|
+
|
53
|
+
# The above copyright notice and this permission notice shall be
|
54
|
+
# included in all copies or substantial portions of the Software.
|
55
|
+
|
56
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
57
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
58
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
59
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
60
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
61
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
62
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/lib/ProDOSDisk.rb~
ADDED
@@ -0,0 +1,197 @@
|
|
1
|
+
$:.unshift(File.dirname(__FILE__)) unless
|
2
|
+
$:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
|
3
|
+
|
4
|
+
require 'ProDOSFile'
|
5
|
+
# Disk image in ProDOS format
|
6
|
+
# for now, assumes 'ProDOS order'
|
7
|
+
class ProDOSDisk < DSK
|
8
|
+
attr_accessor :volume_name
|
9
|
+
|
10
|
+
#what is the last block on this disk?
|
11
|
+
def last_block
|
12
|
+
(self.track_count*8)-1
|
13
|
+
end
|
14
|
+
def dump_catalog
|
15
|
+
s=""
|
16
|
+
files.keys.sort.each { |file_name|
|
17
|
+
file=files[file_name]
|
18
|
+
s<< "#{sprintf('% 6d',file.contents.length)}\t #{file.file_type} : $#{sprintf '%X',file.aux_type}\t#{file_name}\n"
|
19
|
+
}
|
20
|
+
s
|
21
|
+
end
|
22
|
+
|
23
|
+
def initialize(file_bytes,sector_order)
|
24
|
+
super(file_bytes,sector_order)
|
25
|
+
self.read_catalog
|
26
|
+
end
|
27
|
+
|
28
|
+
def file_system
|
29
|
+
:prodos
|
30
|
+
end
|
31
|
+
|
32
|
+
|
33
|
+
#concatenate all the blocks in the volume directory
|
34
|
+
#Volume Directory format is: (from "Beneath Apple ProDOS pp 4-10 - 4-12)
|
35
|
+
# FOR VOLUMES
|
36
|
+
# $00 STORAGE_TYPE/NAME_LENGTH
|
37
|
+
# $01-$0F FILE_NAME
|
38
|
+
# $10 RESERVED
|
39
|
+
# $11-$12 RESERVED
|
40
|
+
# $13-$14 RESERVED
|
41
|
+
# $15-$17 RESERVED
|
42
|
+
# $18-$1B CREATION
|
43
|
+
# $1C VERSION
|
44
|
+
# $1D MIN_VERSION
|
45
|
+
# $1E ACCESS
|
46
|
+
# $1F ENTRY_LENGTH
|
47
|
+
# $20 ENTRIES_PER_BLOCK
|
48
|
+
# $21-$22 FILE_COUNT
|
49
|
+
# $23-$24 BIT_MAP_POINTER
|
50
|
+
# $25-$26 TOTAL_BLOCKS
|
51
|
+
#
|
52
|
+
# FOR FILES
|
53
|
+
# $00 STORAGE_TYPE/NAME_LENGTH
|
54
|
+
# $01-$0F FILE_NAME
|
55
|
+
# $10 FILE_TYPE
|
56
|
+
# $11-$12 KEY_POINTER
|
57
|
+
# $13-$14 BLOCKS_USED
|
58
|
+
# $15-$17 EOF
|
59
|
+
# $18-$1B CREATION
|
60
|
+
# $1C VERSION
|
61
|
+
# $1D MIN_VERSION
|
62
|
+
# $1E ACCESS
|
63
|
+
# $1F-$20 AUX_TYPE
|
64
|
+
# $21-$24 LAST_MOD
|
65
|
+
# $25-$26 HEADER_POINTER
|
66
|
+
|
67
|
+
def dump_block(block_no)
|
68
|
+
s=hline
|
69
|
+
s<<sprintf("BLOCK %03d\n",block_no)
|
70
|
+
s<< "\t"
|
71
|
+
block_data=get_block(block_no)
|
72
|
+
(0..15).each {|x| s<<sprintf("%02X ",x) }
|
73
|
+
s<<"\n"
|
74
|
+
s<<hline
|
75
|
+
(0..31).each {|line_number|
|
76
|
+
lhs=""
|
77
|
+
rhs=""
|
78
|
+
start_byte=line_number*16
|
79
|
+
line=block_data[start_byte..start_byte+15]
|
80
|
+
line.each_byte {|byte|
|
81
|
+
lhs<< sprintf("%02X ", byte)
|
82
|
+
rhs<< (byte%128).chr.sub(/[\x00-\x1f]/,'.')
|
83
|
+
}
|
84
|
+
s<<sprintf("%03X\t%s %s\n",start_byte,lhs,rhs)
|
85
|
+
}
|
86
|
+
s
|
87
|
+
end
|
88
|
+
|
89
|
+
def read_catalog(starting_block=2,dir_path="")
|
90
|
+
next_block_no=starting_block
|
91
|
+
while (next_block_no!=0)
|
92
|
+
block=get_block(next_block_no)
|
93
|
+
offset=4
|
94
|
+
while (offset<(0x200-0x27))
|
95
|
+
directory_entry=block[offset..offset+0x27]
|
96
|
+
storage_type=directory_entry[0]>>4
|
97
|
+
name_length=directory_entry[0]%0x10
|
98
|
+
name=directory_entry[1..name_length]
|
99
|
+
file_type=directory_entry[0x10]
|
100
|
+
key_pointer=directory_entry[0x11]+directory_entry[0x12]*0x100
|
101
|
+
blocks_used=directory_entry[0x13]+directory_entry[0x14]*0x100
|
102
|
+
file_length=directory_entry[0x15]+directory_entry[0x16]*0x100+directory_entry[0x17]*0x10000
|
103
|
+
aux_type=directory_entry[0x1f]+directory_entry[0x20]*0x100
|
104
|
+
case storage_type
|
105
|
+
when 0x00 then
|
106
|
+
#nop
|
107
|
+
when 0x01 then #it's a seedling
|
108
|
+
file_contents=get_block(key_pointer)
|
109
|
+
files[name]=ProDOSFile.new(name,file_contents,file_type,aux_type)
|
110
|
+
when 0x02 then #it's a sapling
|
111
|
+
block_list=[]
|
112
|
+
index_block=get_block(key_pointer)
|
113
|
+
0.upto((file_length/0x200)) do |i|
|
114
|
+
block_list<<index_block[i]+(index_block[i+0x100]*0x100)
|
115
|
+
end
|
116
|
+
file_contents=""
|
117
|
+
block_list.each do |next_block_no|
|
118
|
+
if next_block_no==0 then
|
119
|
+
file_contents+="\x00"*0x200
|
120
|
+
elsif next_block_no>=self.last_block then
|
121
|
+
STDERR<<"file #{name} attempted to read bad block # #{next_block_no}\n"
|
122
|
+
file_contents+="\x00"*0x200
|
123
|
+
else
|
124
|
+
file_contents+=get_block(next_block_no)
|
125
|
+
end
|
126
|
+
end
|
127
|
+
file_contents=file_contents[0..file_length-1]
|
128
|
+
files["#{dir_path}#{name}"]=ProDOSFile.new(name,file_contents,file_type,aux_type)
|
129
|
+
when 0x03 then #it's a tree
|
130
|
+
master_index_block=get_block(key_pointer)
|
131
|
+
block_list=[]
|
132
|
+
number_of_index_entries=1+(file_length/0x200)
|
133
|
+
number_of_index_blocks=1+(number_of_index_entries/0x100)
|
134
|
+
number_of_index_entries_in_last_block=number_of_index_entries-(number_of_index_blocks-1)*0x100
|
135
|
+
0.upto(number_of_index_blocks-1) do |i|
|
136
|
+
index_block_no=master_index_block[i]+master_index_block[i+0x100]*0x100
|
137
|
+
index_block=get_block(index_block_no)
|
138
|
+
if i==number_of_index_blocks-1 then
|
139
|
+
entries_in_this_index_block=number_of_index_entries_in_last_block
|
140
|
+
else
|
141
|
+
entries_in_this_index_block=256
|
142
|
+
end
|
143
|
+
0.upto(entries_in_this_index_block-1) do |j|
|
144
|
+
block_list<<index_block[j]+(index_block[j+0x100]*0x100)
|
145
|
+
end
|
146
|
+
end
|
147
|
+
file_contents=""
|
148
|
+
block_list.each do |next_block_no|
|
149
|
+
if next_block_no==0 then
|
150
|
+
file_contents+="\x00"*0x200
|
151
|
+
else
|
152
|
+
file_contents+=get_block(next_block_no)
|
153
|
+
end
|
154
|
+
end
|
155
|
+
file_contents=file_contents[0..file_length-1]
|
156
|
+
files["#{dir_path}#{name}"]=ProDOSFile.new(name,file_contents,file_type,aux_type)
|
157
|
+
when 0x0D then #it's a subdirectory pointer
|
158
|
+
read_catalog(key_pointer,"#{dir_path}#{name}/")
|
159
|
+
when 0x0E then #it's a subdirectory header
|
160
|
+
#do nothing
|
161
|
+
when 0x0F then #it's a volume
|
162
|
+
@volume_name=name
|
163
|
+
else
|
164
|
+
# raise "unknown storage_type #{sprintf '%02X',storage_type}"
|
165
|
+
puts "skipping unknown storage_type #{sprintf '%02X',storage_type} for #{dir_path}#{name}"
|
166
|
+
end
|
167
|
+
offset+=0x27
|
168
|
+
end
|
169
|
+
next_block_no=block[2]+block[3]*256
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
end
|
174
|
+
# == Author
|
175
|
+
# Jonno Downes (jonno@jamtronix.com)
|
176
|
+
#
|
177
|
+
# == Copyright
|
178
|
+
# Copyright (c) 2007 Jonno Downes (jonno@jamtronix.com)
|
179
|
+
#
|
180
|
+
#Permission is hereby granted, free of charge, to any person obtaining
|
181
|
+
#a copy of this software and associated documentation files (the
|
182
|
+
#"Software"), to deal in the Software without restriction, including
|
183
|
+
#without limitation the rights to use, copy, modify, merge, publish,
|
184
|
+
#distribute, sublicense, and/or sell copies of the Software, and to
|
185
|
+
#permit persons to whom the Software is furnished to do so, subject to
|
186
|
+
#the following conditions:
|
187
|
+
|
188
|
+
# The above copyright notice and this permission notice shall be
|
189
|
+
# included in all copies or substantial portions of the Software.
|
190
|
+
|
191
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
192
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
193
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
194
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
195
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
196
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
197
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|