ripxplore 0.0.1 → 0.0.2
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/ripxplore.rb +5 -25
- data/doc/classes/A2Dsk.html +9 -0
- data/doc/classes/A2DskDosOrder.html +9 -0
- data/doc/classes/A2DskPhysicalOrder.html +9 -0
- data/doc/classes/Apple2.html +171 -21
- data/doc/classes/Apple2.src/M000187.html +18 -0
- data/doc/classes/Apple2.src/M000188.html +18 -0
- data/doc/classes/Apple2.src/M000189.html +18 -0
- data/doc/classes/Apple2.src/M000190.html +19 -0
- data/doc/classes/Apple2.src/M000191.html +19 -0
- data/doc/classes/Apple2.src/M000192.html +18 -0
- data/doc/classes/Apple2.src/M000193.html +18 -0
- data/doc/classes/Apple2.src/M000194.html +18 -0
- data/doc/classes/Apple2.src/M000195.html +18 -0
- data/doc/classes/Apple2.src/M000196.html +18 -0
- data/doc/classes/Apple2.src/M000197.html +18 -0
- data/doc/classes/Apple2.src/M000198.html +18 -0
- data/doc/classes/Apple2.src/M000199.html +18 -0
- data/doc/classes/Apple2.src/M000200.html +18 -0
- data/doc/classes/AppleBinary.html +21 -21
- data/doc/classes/AppleBinary.src/M000153.html +20 -0
- data/doc/classes/AppleBinary.src/M000154.html +18 -0
- data/doc/classes/AppleBinary.src/M000155.html +18 -0
- data/doc/classes/AppleBinary.src/M000156.html +18 -0
- data/doc/classes/AppleCPM.html +7 -0
- data/doc/classes/AppleDos.html +7 -0
- data/doc/classes/AppleDosPic.html +186 -0
- data/doc/classes/AppleDosPic.src/M000291.html +20 -0
- data/doc/classes/AppleDosPic.src/M000292.html +18 -0
- data/doc/classes/AppleDosPic.src/M000293.html +18 -0
- data/doc/classes/AppleDosPic.src/M000294.html +18 -0
- data/doc/classes/AppleDosPrintShopMiniPix.html +120 -0
- data/doc/classes/AppleHiResPic.html +43 -43
- data/doc/classes/AppleHiResPic.src/M000147.html +18 -0
- data/doc/classes/AppleHiResPic.src/M000148.html +18 -0
- data/doc/classes/AppleHiResPic.src/M000149.html +53 -0
- data/doc/classes/AppleHiResPic.src/M000150.html +18 -0
- data/doc/classes/AppleHiResPic.src/M000151.html +18 -0
- data/doc/classes/AppleHiResPic.src/M000152.html +18 -0
- data/doc/classes/ApplePrintShopMiniPix.html +204 -0
- data/doc/classes/ApplePrintShopMiniPix.src/M000313.html +38 -0
- data/doc/classes/ApplePrintShopMiniPix.src/M000314.html +18 -0
- data/doc/classes/ApplePrintShopMiniPix.src/M000315.html +18 -0
- data/doc/classes/ApplePrintShopMiniPix.src/M000316.html +18 -0
- data/doc/classes/AppleText.html +32 -10
- data/doc/classes/AppleText.src/M000215.html +21 -0
- data/doc/classes/AppleText.src/M000216.html +20 -0
- data/doc/classes/AppleText.src/M000217.html +23 -0
- data/doc/classes/AppleWorksWP.html +7 -0
- data/doc/classes/Applesoft.html +7 -0
- data/doc/classes/Atari800.html +165 -15
- data/doc/classes/Atari800.src/M000250.html +18 -0
- data/doc/classes/Atari800.src/M000251.html +23 -0
- data/doc/classes/Atari800.src/M000252.html +18 -0
- data/doc/classes/Atari800.src/M000253.html +19 -0
- data/doc/classes/Atari800.src/M000254.html +18 -0
- data/doc/classes/Atari800.src/M000255.html +18 -0
- data/doc/classes/Atari800.src/M000256.html +18 -0
- data/doc/classes/Atari800.src/M000257.html +18 -0
- data/doc/classes/Atari800.src/M000258.html +18 -0
- data/doc/classes/Atari800.src/M000259.html +18 -0
- data/doc/classes/Atari800.src/M000260.html +18 -0
- data/doc/classes/Atari800.src/M000261.html +18 -0
- data/doc/classes/Atari800.src/M000262.html +18 -0
- data/doc/classes/AtariBasic.html +7 -0
- data/doc/classes/AtariBinary.html +9 -2
- data/doc/classes/AtariBinary.src/M000241.html +2 -2
- data/doc/classes/AtariDos.html +7 -0
- data/doc/classes/AtariText.html +17 -10
- data/doc/classes/AtariText.src/M000011.html +20 -0
- data/doc/classes/AtariText.src/M000012.html +18 -0
- data/doc/classes/Atr.html +7 -0
- data/doc/classes/C64.html +175 -25
- data/doc/classes/C64.src/M000043.html +18 -0
- data/doc/classes/C64.src/M000044.html +18 -0
- data/doc/classes/C64.src/M000045.html +31 -0
- data/doc/classes/C64.src/M000046.html +22 -0
- data/doc/classes/C64.src/M000047.html +19 -0
- data/doc/classes/C64.src/M000048.html +19 -0
- data/doc/classes/C64.src/M000049.html +18 -0
- data/doc/classes/C64.src/M000050.html +18 -0
- data/doc/classes/C64.src/M000051.html +18 -0
- data/doc/classes/C64.src/M000052.html +18 -0
- data/doc/classes/C64.src/M000053.html +18 -0
- data/doc/classes/C64.src/M000054.html +18 -0
- data/doc/classes/C64.src/M000055.html +18 -0
- data/doc/classes/C64.src/M000056.html +18 -0
- data/doc/classes/C64.src/M000057.html +18 -0
- data/doc/classes/C64BasicPrg.html +7 -0
- data/doc/classes/C64Prg.html +7 -0
- data/doc/classes/C64PrgText.html +7 -0
- data/doc/classes/C64Seq.html +7 -0
- data/doc/classes/CPMFile.html +7 -0
- data/doc/classes/CacheAndCollections.html +167 -0
- data/doc/classes/CacheAndCollections.src/M000005.html +21 -0
- data/doc/classes/CacheAndCollections.src/M000006.html +26 -0
- data/doc/classes/CacheAndCollections.src/M000007.html +22 -0
- data/doc/classes/CbmDos.html +7 -0
- data/doc/classes/CbmFile.html +7 -0
- data/doc/classes/Coco.html +337 -0
- data/doc/classes/Coco.src/M000095.html +18 -0
- data/doc/classes/Coco.src/M000096.html +18 -0
- data/doc/classes/Coco.src/M000097.html +18 -0
- data/doc/classes/Coco.src/M000098.html +18 -0
- data/doc/classes/Coco.src/M000099.html +18 -0
- data/doc/classes/Coco.src/M000100.html +18 -0
- data/doc/classes/Coco.src/M000101.html +18 -0
- data/doc/classes/Coco.src/M000102.html +18 -0
- data/doc/classes/Coco.src/M000103.html +18 -0
- data/doc/classes/Coco.src/M000104.html +18 -0
- data/doc/classes/Coco.src/M000105.html +18 -0
- data/doc/classes/Coco.src/M000106.html +18 -0
- data/doc/classes/Coco.src/M000107.html +55 -0
- data/doc/classes/CocoBasic.html +178 -0
- data/doc/classes/CocoBasic.src/M000126.html +20 -0
- data/doc/classes/CocoBasic.src/M000127.html +72 -0
- data/doc/classes/CocoMachineLanguage.html +171 -0
- data/doc/classes/CocoMachineLanguage.src/M000008.html +20 -0
- data/doc/classes/CocoMachineLanguage.src/M000009.html +18 -0
- data/doc/classes/CocoMachineLanguage.src/M000010.html +19 -0
- data/doc/classes/CocoScreen.html +191 -0
- data/doc/classes/CocoScreen.src/M000122.html +18 -0
- data/doc/classes/CocoScreen.src/M000123.html +18 -0
- data/doc/classes/CocoScreen.src/M000124.html +18 -0
- data/doc/classes/CocoScreen.src/M000125.html +18 -0
- data/doc/classes/CocoText.html +156 -0
- data/doc/classes/CocoText.src/M000145.html +20 -0
- data/doc/classes/CocoText.src/M000146.html +18 -0
- data/doc/classes/D64.html +7 -0
- data/doc/classes/D65.html +6 -0
- data/doc/classes/DumpUtilities.html +6 -0
- data/doc/classes/FileCache.html +140 -30
- data/doc/classes/FileCache.src/M000201.html +18 -0
- data/doc/classes/FileCache.src/M000202.html +20 -0
- data/doc/classes/FileCache.src/M000203.html +24 -0
- data/doc/classes/FileCache.src/M000204.html +22 -0
- data/doc/classes/FileCache.src/M000205.html +32 -0
- data/doc/classes/FileCache.src/M000206.html +21 -0
- data/doc/classes/FileCache.src/M000207.html +22 -0
- data/doc/classes/FileCache.src/M000208.html +23 -0
- data/doc/classes/FileCache.src/M000209.html +27 -0
- data/doc/classes/FileCache.src/M000210.html +24 -0
- data/doc/classes/FileCache.src/M000211.html +21 -0
- data/doc/classes/FileCacheItem.html +10 -10
- data/doc/classes/FileCacheItem.src/M000235.html +18 -0
- data/doc/classes/FileCacheItem.src/M000236.html +18 -0
- data/doc/classes/FileContainer.html +7 -0
- data/doc/classes/FileSystem.html +41 -41
- data/doc/classes/FileSystem.src/M000134.html +18 -0
- data/doc/classes/FileSystem.src/M000135.html +18 -0
- data/doc/classes/FileSystem.src/M000136.html +18 -0
- data/doc/classes/FileSystem.src/M000137.html +18 -0
- data/doc/classes/FileSystem.src/M000138.html +18 -0
- data/doc/classes/FileSystem.src/M000139.html +18 -0
- data/doc/classes/FileSystem.src/M000140.html +20 -0
- data/doc/classes/FileSystem.src/M000141.html +25 -0
- data/doc/classes/FileSystemImage.html +131 -86
- data/doc/classes/FileSystemImage.src/M000269.html +20 -0
- data/doc/classes/FileSystemImage.src/M000270.html +41 -0
- data/doc/classes/FileSystemImage.src/M000271.html +27 -0
- data/doc/classes/FileSystemImage.src/M000272.html +18 -0
- data/doc/classes/FileSystemImage.src/M000273.html +18 -0
- data/doc/classes/FileSystemImage.src/M000274.html +18 -0
- data/doc/classes/FileSystemImage.src/M000275.html +22 -0
- data/doc/classes/FileSystemImage.src/M000276.html +19 -0
- data/doc/classes/FileSystemImage.src/M000277.html +18 -0
- data/doc/classes/FileSystemImage.src/M000278.html +18 -0
- data/doc/classes/FileSystemImage.src/M000279.html +18 -0
- data/doc/classes/FileSystemImage.src/M000280.html +18 -0
- data/doc/classes/FileSystemImage.src/M000281.html +20 -0
- data/doc/classes/FileSystemImage.src/M000282.html +22 -0
- data/doc/classes/FileSystemImage.src/M000283.html +22 -0
- data/doc/classes/FileSystemImage.src/M000284.html +18 -0
- data/doc/classes/FileSystemImage.src/M000285.html +23 -0
- data/doc/classes/FileSystemImage.src/M000286.html +18 -0
- data/doc/classes/FileSystemImage.src/M000287.html +18 -0
- data/doc/classes/FileSystemImage.src/M000288.html +18 -0
- data/doc/classes/G64.html +7 -0
- data/doc/classes/GenericFile.html +7 -0
- data/doc/classes/GenericGIF.html +193 -0
- data/doc/classes/GenericGIF.src/M000308.html +18 -0
- data/doc/classes/GenericGIF.src/M000309.html +18 -0
- data/doc/classes/GenericGIF.src/M000310.html +18 -0
- data/doc/classes/GenericGIF.src/M000311.html +18 -0
- data/doc/classes/GenericGIF.src/M000312.html +18 -0
- data/doc/classes/HostSystem.html +249 -31
- data/doc/classes/HostSystem.src/M000058.html +18 -0
- data/doc/classes/HostSystem.src/M000059.html +22 -0
- data/doc/classes/HostSystem.src/M000060.html +18 -0
- data/doc/classes/HostSystem.src/M000061.html +18 -0
- data/doc/classes/HostSystem.src/M000062.html +22 -0
- data/doc/classes/HostSystem.src/M000063.html +33 -0
- data/doc/classes/HostSystem.src/M000064.html +18 -0
- data/doc/classes/HostSystem.src/M000065.html +19 -0
- data/doc/classes/HostSystem.src/M000066.html +18 -0
- data/doc/classes/HostSystem.src/M000067.html +18 -0
- data/doc/classes/HostSystem.src/M000068.html +18 -0
- data/doc/classes/HostSystem.src/M000069.html +18 -0
- data/doc/classes/HostSystem.src/M000070.html +18 -0
- data/doc/classes/HostSystem.src/M000071.html +18 -0
- data/doc/classes/HostSystem.src/M000072.html +18 -0
- data/doc/classes/HostSystem.src/M000073.html +18 -0
- data/doc/classes/HostSystem.src/M000074.html +29 -0
- data/doc/classes/HostSystem.src/M000075.html +18 -0
- data/doc/classes/ImageFormat.html +85 -85
- data/doc/classes/ImageFormat.src/M000218.html +18 -0
- data/doc/classes/ImageFormat.src/M000219.html +18 -0
- data/doc/classes/ImageFormat.src/M000220.html +18 -0
- data/doc/classes/ImageFormat.src/M000221.html +18 -0
- data/doc/classes/ImageFormat.src/M000222.html +18 -0
- data/doc/classes/ImageFormat.src/M000223.html +22 -0
- data/doc/classes/ImageFormat.src/M000224.html +19 -0
- data/doc/classes/ImageFormat.src/M000225.html +18 -0
- data/doc/classes/ImageFormat.src/M000226.html +18 -0
- data/doc/classes/ImageFormat.src/M000227.html +18 -0
- data/doc/classes/ImageFormat.src/M000228.html +18 -0
- data/doc/classes/ImageFormat.src/M000229.html +18 -0
- data/doc/classes/ImageFormat.src/M000230.html +18 -0
- data/doc/classes/ImageFormat.src/M000231.html +18 -0
- data/doc/classes/ImageFormat.src/M000232.html +20 -0
- data/doc/classes/ImageFormat.src/M000233.html +26 -0
- data/doc/classes/ImageFormat.src/M000234.html +18 -0
- data/doc/classes/ImageSniffing.html +94 -14
- data/doc/classes/ImageSniffing.src/M000052.html +2 -2
- data/doc/classes/ImageSniffing.src/M000109.html +102 -0
- data/doc/classes/ImageSniffing.src/M000110.html +36 -0
- data/doc/classes/ImageSniffing.src/M000111.html +43 -0
- data/doc/classes/ImageSniffing.src/M000112.html +46 -0
- data/doc/classes/ImageSniffing.src/M000113.html +59 -0
- data/doc/classes/ImageSniffing.src/M000114.html +74 -0
- data/doc/classes/IntegerBASIC.html +7 -0
- data/doc/classes/JvcDsk.html +231 -0
- data/doc/classes/JvcDsk.src/M000263.html +18 -0
- data/doc/classes/JvcDsk.src/M000264.html +39 -0
- data/doc/classes/JvcDsk.src/M000265.html +18 -0
- data/doc/classes/JvcDsk.src/M000266.html +18 -0
- data/doc/classes/JvcDsk.src/M000267.html +18 -0
- data/doc/classes/JvcDsk.src/M000268.html +22 -0
- data/doc/classes/MBasic.html +7 -0
- data/doc/classes/NADOLDos.html +7 -0
- data/doc/classes/NADOLFile.html +8 -0
- data/doc/classes/NADOLPic.html +156 -0
- data/doc/classes/NADOLPic.src/M000289.html +20 -0
- data/doc/classes/NADOLPic.src/M000290.html +18 -0
- data/doc/classes/NADOLTokens.html +8 -0
- data/doc/classes/NativeFileType.html +91 -91
- data/doc/classes/NativeFileType.src/M000169.html +22 -0
- data/doc/classes/NativeFileType.src/M000170.html +18 -0
- data/doc/classes/NativeFileType.src/M000171.html +18 -0
- data/doc/classes/NativeFileType.src/M000172.html +18 -0
- data/doc/classes/NativeFileType.src/M000173.html +18 -0
- data/doc/classes/NativeFileType.src/M000174.html +18 -0
- data/doc/classes/NativeFileType.src/M000175.html +18 -0
- data/doc/classes/NativeFileType.src/M000176.html +23 -0
- data/doc/classes/NativeFileType.src/M000177.html +18 -0
- data/doc/classes/NativeFileType.src/M000178.html +18 -0
- data/doc/classes/NativeFileType.src/M000179.html +24 -0
- data/doc/classes/NativeFileType.src/M000180.html +41 -0
- data/doc/classes/NativeFileType.src/M000181.html +24 -0
- data/doc/classes/NativeFileType.src/M000182.html +18 -0
- data/doc/classes/NativeFileType.src/M000183.html +18 -0
- data/doc/classes/NativeFileType.src/M000184.html +18 -0
- data/doc/classes/NativeFileType.src/M000185.html +20 -0
- data/doc/classes/NativeFileType.src/M000186.html +27 -0
- data/doc/classes/PNG/Canvas.html +7 -0
- data/doc/classes/PNG/Color.html +7 -0
- data/doc/classes/PNG.html +7 -0
- data/doc/classes/PackedAppleDosPic.html +145 -0
- data/doc/classes/PackedAppleDosPic.src/M000128.html +59 -0
- data/doc/classes/PascalDos.html +7 -0
- data/doc/classes/PascalFile.html +7 -0
- data/doc/classes/PascalPic.html +156 -0
- data/doc/classes/PascalPic.src/M000240.html +20 -0
- data/doc/classes/PascalPic.src/M000241.html +18 -0
- data/doc/classes/Pc99DD.html +250 -0
- data/doc/classes/Pc99DD.src/M000035.html +18 -0
- data/doc/classes/Pc99DD.src/M000036.html +18 -0
- data/doc/classes/Pc99DD.src/M000037.html +18 -0
- data/doc/classes/Pc99DD.src/M000038.html +18 -0
- data/doc/classes/Pc99DD.src/M000039.html +18 -0
- data/doc/classes/Pc99DD.src/M000040.html +18 -0
- data/doc/classes/Pc99DD.src/M000041.html +18 -0
- data/doc/classes/Pc99DD.src/M000042.html +18 -0
- data/doc/classes/Pc99Dsk.html +120 -0
- data/doc/classes/Pc99SD.html +250 -0
- data/doc/classes/Pc99SD.src/M000242.html +18 -0
- data/doc/classes/Pc99SD.src/M000243.html +18 -0
- data/doc/classes/Pc99SD.src/M000244.html +18 -0
- data/doc/classes/Pc99SD.src/M000245.html +18 -0
- data/doc/classes/Pc99SD.src/M000246.html +18 -0
- data/doc/classes/Pc99SD.src/M000247.html +18 -0
- data/doc/classes/Pc99SD.src/M000248.html +18 -0
- data/doc/classes/Pc99SD.src/M000249.html +18 -0
- data/doc/classes/ProDos.html +25 -12
- data/doc/classes/ProDos.src/M000161.html +18 -0
- data/doc/classes/ProDos.src/M000162.html +22 -0
- data/doc/classes/ProDosBinPic.html +171 -0
- data/doc/classes/ProDosBinPic.src/M000237.html +20 -0
- data/doc/classes/ProDosBinPic.src/M000238.html +18 -0
- data/doc/classes/ProDosBinPic.src/M000239.html +18 -0
- data/doc/classes/ProDosFile.html +16 -16
- data/doc/classes/ProDosFile.src/M000032.html +20 -0
- data/doc/classes/ProDosFile.src/M000033.html +18 -0
- data/doc/classes/ProDosFile.src/M000034.html +19 -0
- data/doc/classes/ProDosPrintShopMiniPix.html +149 -0
- data/doc/classes/ProDosPrintShopMiniPix.src/M000013.html +18 -0
- data/doc/classes/Proc.html +7 -0
- data/doc/classes/ProcSource.html +6 -0
- data/doc/classes/RDoc.html +6 -0
- data/doc/classes/RawDisk.html +11 -11
- data/doc/classes/RawDisk.src/M000159.html +18 -0
- data/doc/classes/RawDisk.src/M000160.html +23 -0
- data/doc/classes/RipXplore.html +1 -1
- data/doc/classes/RipXploreLog.html +6 -0
- data/doc/classes/RsDos.html +229 -0
- data/doc/classes/RsDos.src/M000023.html +18 -0
- data/doc/classes/RsDos.src/M000024.html +18 -0
- data/doc/classes/RsDos.src/M000025.html +18 -0
- data/doc/classes/RsDos.src/M000026.html +62 -0
- data/doc/classes/ScAsm.html +7 -0
- data/doc/classes/ScreenDump.html +131 -0
- data/doc/classes/ScreenDump.src/M000307.html +24 -0
- data/doc/classes/ScreenDumps.html +180 -0
- data/doc/classes/ScreenDumps.src/M000027.html +22 -0
- data/doc/classes/ScreenDumps.src/M000028.html +24 -0
- data/doc/classes/ScreenDumps.src/M000029.html +30 -0
- data/doc/classes/SubclassTracking.html +6 -0
- data/doc/classes/TestFileCache.html +7 -0
- data/doc/classes/Ti99.html +304 -0
- data/doc/classes/Ti99.src/M000295.html +18 -0
- data/doc/classes/Ti99.src/M000296.html +18 -0
- data/doc/classes/Ti99.src/M000297.html +18 -0
- data/doc/classes/Ti99.src/M000298.html +18 -0
- data/doc/classes/Ti99.src/M000299.html +18 -0
- data/doc/classes/Ti99.src/M000300.html +18 -0
- data/doc/classes/Ti99.src/M000301.html +18 -0
- data/doc/classes/Ti99.src/M000302.html +18 -0
- data/doc/classes/Ti99.src/M000303.html +18 -0
- data/doc/classes/Ti99.src/M000304.html +18 -0
- data/doc/classes/Ti99.src/M000305.html +18 -0
- data/doc/classes/Ti99.src/M000306.html +18 -0
- data/doc/classes/Ti99BasicFile.html +161 -0
- data/doc/classes/Ti99BasicFile.src/M000108.html +72 -0
- data/doc/classes/Ti99Dsk.html +276 -0
- data/doc/classes/Ti99Dsk.src/M000014.html +18 -0
- data/doc/classes/Ti99Dsk.src/M000015.html +18 -0
- data/doc/classes/Ti99Dsk.src/M000016.html +18 -0
- data/doc/classes/Ti99Dsk.src/M000017.html +18 -0
- data/doc/classes/Ti99Dsk.src/M000018.html +18 -0
- data/doc/classes/Ti99Dsk.src/M000019.html +22 -0
- data/doc/classes/Ti99Dsk.src/M000020.html +22 -0
- data/doc/classes/Ti99Dsk.src/M000021.html +22 -0
- data/doc/classes/Ti99Dsk.src/M000022.html +27 -0
- data/doc/classes/Ti99File.html +156 -0
- data/doc/classes/Ti99File.src/M000167.html +20 -0
- data/doc/classes/Ti99File.src/M000168.html +18 -0
- data/doc/classes/Ti99Fms.html +163 -0
- data/doc/classes/Ti99Fms.src/M000157.html +18 -0
- data/doc/classes/Ti99Fms.src/M000158.html +77 -0
- data/doc/classes/Ti99TextFile.html +154 -0
- data/doc/classes/Ti99TextFile.src/M000030.html +33 -0
- data/doc/classes/Ti99TextFile.src/M000031.html +18 -0
- data/doc/classes/TiArtistColours.html +113 -0
- data/doc/classes/TiArtistPattern.html +209 -0
- data/doc/classes/TiArtistPattern.src/M000080.html +50 -0
- data/doc/classes/TiArtistPattern.src/M000081.html +18 -0
- data/doc/classes/TiArtistPattern.src/M000082.html +18 -0
- data/doc/classes/TiArtistPattern.src/M000083.html +18 -0
- data/doc/classes/TiRLE.html +197 -0
- data/doc/classes/TiRLE.src/M000118.html +22 -0
- data/doc/classes/TiRLE.src/M000119.html +22 -0
- data/doc/classes/TiRLE.src/M000120.html +43 -0
- data/doc/classes/TiRLE.src/M000121.html +18 -0
- data/doc/classes/Trs80.html +145 -13
- data/doc/classes/Trs80.src/M000084.html +18 -0
- data/doc/classes/Trs80.src/M000085.html +18 -0
- data/doc/classes/Trs80.src/M000086.html +18 -0
- data/doc/classes/Trs80.src/M000087.html +18 -0
- data/doc/classes/Trs80.src/M000088.html +18 -0
- data/doc/classes/Trs80.src/M000089.html +18 -0
- data/doc/classes/Trs80.src/M000090.html +18 -0
- data/doc/classes/Trs80.src/M000091.html +18 -0
- data/doc/classes/Trs80.src/M000092.html +18 -0
- data/doc/classes/Trs80.src/M000093.html +18 -0
- data/doc/classes/Trs80.src/M000094.html +18 -0
- data/doc/classes/Trs80BasicListing.html +174 -0
- data/doc/classes/Trs80BasicListing.src/M000212.html +20 -0
- data/doc/classes/Trs80BasicListing.src/M000213.html +18 -0
- data/doc/classes/Trs80BasicListing.src/M000214.html +18 -0
- data/doc/classes/Trs80Cmd.html +20 -20
- data/doc/classes/Trs80Cmd.src/M000163.html +19 -0
- data/doc/classes/Trs80Cmd.src/M000164.html +24 -0
- data/doc/classes/Trs80Cmd.src/M000165.html +20 -0
- data/doc/classes/Trs80Cmd.src/M000166.html +35 -0
- data/doc/classes/Trs80Jcl.html +7 -0
- data/doc/classes/Trs80Jv1Dsk.html +25 -25
- data/doc/classes/Trs80Jv1Dsk.src/M000129.html +18 -0
- data/doc/classes/Trs80Jv1Dsk.src/M000130.html +18 -0
- data/doc/classes/Trs80Jv1Dsk.src/M000131.html +18 -0
- data/doc/classes/Trs80Jv1Dsk.src/M000132.html +18 -0
- data/doc/classes/Trs80Jv1Dsk.src/M000133.html +21 -0
- data/doc/classes/Trs80LevelIIBasic.html +28 -10
- data/doc/classes/Trs80LevelIIBasic.src/M000142.html +20 -0
- data/doc/classes/Trs80LevelIIBasic.src/M000143.html +18 -0
- data/doc/classes/Trs80LevelIIBasic.src/M000144.html +43 -0
- data/doc/classes/Trs80PascalSource.html +7 -0
- data/doc/classes/Trs80Text.html +181 -0
- data/doc/classes/Trs80Text.src/M000115.html +20 -0
- data/doc/classes/Trs80Text.src/M000116.html +18 -0
- data/doc/classes/Trs80Text.src/M000117.html +18 -0
- data/doc/classes/TrsDos.html +24 -22
- data/doc/classes/TrsDos.src/M000076.html +18 -0
- data/doc/classes/TrsDos.src/M000077.html +18 -0
- data/doc/classes/TrsDos.src/M000078.html +18 -0
- data/doc/classes/TrsDos.src/M000079.html +64 -0
- data/doc/classes/V9T9Dsk.html +120 -0
- data/doc/created.rid +1 -1
- data/doc/dot/f_0.dot +14 -0
- data/doc/dot/f_0.png +0 -0
- data/doc/dot/f_1.dot +23 -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 +32 -0
- data/doc/dot/f_11.png +0 -0
- data/doc/dot/f_12.dot +32 -0
- data/doc/dot/f_12.png +0 -0
- data/doc/dot/f_13.dot +32 -0
- data/doc/dot/f_13.png +0 -0
- data/doc/dot/f_14.dot +32 -0
- data/doc/dot/f_14.png +0 -0
- data/doc/dot/f_15.dot +32 -0
- data/doc/dot/f_15.png +0 -0
- data/doc/dot/f_16.dot +23 -0
- data/doc/dot/f_16.png +0 -0
- data/doc/dot/f_17.dot +32 -0
- data/doc/dot/f_17.png +0 -0
- data/doc/dot/f_18.dot +32 -0
- data/doc/dot/f_18.png +0 -0
- data/doc/dot/f_19.dot +32 -0
- data/doc/dot/f_19.png +0 -0
- data/doc/dot/f_2.dot +23 -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_21.dot +23 -0
- data/doc/dot/f_21.png +0 -0
- data/doc/dot/f_22.dot +58 -0
- data/doc/dot/f_22.png +0 -0
- data/doc/dot/f_23.dot +32 -0
- data/doc/dot/f_23.png +0 -0
- data/doc/dot/f_24.dot +32 -0
- data/doc/dot/f_24.png +0 -0
- data/doc/dot/f_25.dot +32 -0
- data/doc/dot/f_25.png +0 -0
- data/doc/dot/f_26.dot +32 -0
- data/doc/dot/f_26.png +0 -0
- data/doc/dot/f_27.dot +23 -0
- data/doc/dot/f_27.png +0 -0
- data/doc/dot/f_28.dot +32 -0
- data/doc/dot/f_28.png +0 -0
- data/doc/dot/f_29.dot +32 -0
- data/doc/dot/f_29.png +0 -0
- data/doc/dot/f_3.dot +41 -0
- data/doc/dot/f_3.png +0 -0
- data/doc/dot/f_30.dot +32 -0
- data/doc/dot/f_30.png +0 -0
- data/doc/dot/f_31.dot +32 -0
- data/doc/dot/f_31.png +0 -0
- data/doc/dot/f_32.dot +32 -0
- data/doc/dot/f_32.png +0 -0
- data/doc/dot/f_33.dot +32 -0
- data/doc/dot/f_33.png +0 -0
- data/doc/dot/f_34.dot +45 -0
- data/doc/dot/f_34.png +0 -0
- data/doc/dot/f_35.dot +32 -0
- data/doc/dot/f_35.png +0 -0
- data/doc/dot/f_36.dot +32 -0
- data/doc/dot/f_36.png +0 -0
- data/doc/dot/f_37.dot +32 -0
- data/doc/dot/f_37.png +0 -0
- data/doc/dot/f_38.dot +32 -0
- data/doc/dot/f_38.png +0 -0
- data/doc/dot/f_39.dot +32 -0
- data/doc/dot/f_39.png +0 -0
- data/doc/dot/f_4.dot +32 -0
- data/doc/dot/f_4.png +0 -0
- data/doc/dot/f_40.dot +32 -0
- data/doc/dot/f_40.png +0 -0
- data/doc/dot/f_41.dot +32 -0
- data/doc/dot/f_41.png +0 -0
- data/doc/dot/f_42.dot +32 -0
- data/doc/dot/f_42.png +0 -0
- data/doc/dot/f_43.dot +32 -0
- data/doc/dot/f_43.png +0 -0
- data/doc/dot/f_44.dot +32 -0
- data/doc/dot/f_44.png +0 -0
- data/doc/dot/f_45.dot +32 -0
- data/doc/dot/f_45.png +0 -0
- data/doc/dot/f_46.dot +32 -0
- data/doc/dot/f_46.png +0 -0
- data/doc/dot/f_47.dot +32 -0
- data/doc/dot/f_47.png +0 -0
- data/doc/dot/f_48.dot +32 -0
- data/doc/dot/f_48.png +0 -0
- data/doc/dot/f_49.dot +32 -0
- data/doc/dot/f_49.png +0 -0
- data/doc/dot/f_5.dot +23 -0
- data/doc/dot/f_5.png +0 -0
- data/doc/dot/f_50.dot +32 -0
- data/doc/dot/f_50.png +0 -0
- data/doc/dot/f_51.dot +32 -0
- data/doc/dot/f_51.png +0 -0
- data/doc/dot/f_52.dot +32 -0
- data/doc/dot/f_52.png +0 -0
- data/doc/dot/f_53.dot +32 -0
- data/doc/dot/f_53.png +0 -0
- data/doc/dot/f_54.dot +39 -0
- data/doc/dot/f_54.png +0 -0
- data/doc/dot/f_55.dot +30 -0
- data/doc/dot/f_55.png +0 -0
- data/doc/dot/f_56.dot +23 -0
- data/doc/dot/f_56.png +0 -0
- data/doc/dot/f_57.dot +23 -0
- data/doc/dot/f_57.png +0 -0
- data/doc/dot/f_58.dot +30 -0
- data/doc/dot/f_58.png +0 -0
- data/doc/dot/f_59.dot +32 -0
- data/doc/dot/f_59.png +0 -0
- data/doc/dot/f_6.dot +23 -0
- data/doc/dot/f_6.png +0 -0
- data/doc/dot/f_60.dot +32 -0
- data/doc/dot/f_60.png +0 -0
- data/doc/dot/f_7.dot +32 -0
- data/doc/dot/f_7.png +0 -0
- data/doc/dot/f_8.dot +32 -0
- data/doc/dot/f_8.png +0 -0
- data/doc/dot/f_9.dot +32 -0
- data/doc/dot/f_9.png +0 -0
- data/doc/dot/m_54_0.dot +30 -0
- data/doc/dot/m_54_0.png +0 -0
- data/doc/files/bin/ripxplore_rb.html +4 -4
- data/doc/files/lib/DumpUtilities_rb.html +6 -0
- data/doc/files/lib/FileCache_rb.html +3 -2
- data/doc/files/lib/FileContainer_rb.html +7 -0
- data/doc/files/lib/FileSystemImage_rb.html +2 -2
- data/doc/files/lib/FileSystem_rb.html +4 -4
- data/doc/files/lib/HostSystem_rb.html +4 -3
- data/doc/files/lib/ImageFormat_rb.html +3 -3
- data/doc/files/lib/NativeFileType_rb.html +3 -3
- data/doc/files/lib/PatchedPNG_rb.html +7 -0
- data/doc/files/lib/RipXploreLog_rb.html +6 -0
- data/doc/files/lib/RipXplore_rb.html +1 -1
- data/doc/files/lib/SubclassTracking_rb.html +6 -0
- data/doc/files/lib/disassemblers/D65_rb.html +6 -0
- data/doc/files/lib/file_systems/AppleCPM_rb.html +7 -0
- data/doc/files/lib/file_systems/AppleDos_rb.html +7 -0
- data/doc/files/lib/file_systems/AtariDos_rb.html +7 -0
- data/doc/files/lib/file_systems/CbmDos_rb.html +7 -0
- data/doc/files/lib/file_systems/NADOLDos_rb.html +7 -0
- data/doc/files/lib/file_systems/PascalDos_rb.html +7 -0
- data/doc/files/lib/file_systems/ProDos_rb.html +1 -1
- data/doc/files/lib/file_systems/RawDisk_rb.html +1 -1
- data/doc/files/lib/file_systems/RsDos_rb.html +108 -0
- data/doc/files/lib/file_systems/Ti99Fms_rb.html +108 -0
- data/doc/files/lib/file_systems/TrsDos_rb.html +1 -1
- data/doc/files/lib/host_systems/Apple2_rb.html +2 -2
- data/doc/files/lib/host_systems/Atari800_rb.html +2 -2
- data/doc/files/lib/host_systems/C64_rb.html +2 -2
- data/doc/files/lib/host_systems/Coco_rb.html +108 -0
- data/doc/files/lib/host_systems/Ti99_rb.html +108 -0
- data/doc/files/lib/host_systems/Trs80_rb.html +1 -1
- data/doc/files/lib/image_formats/A2Dsk_rb.html +9 -0
- data/doc/files/lib/image_formats/Atr_rb.html +7 -0
- data/doc/files/lib/image_formats/D64_rb.html +7 -0
- data/doc/files/lib/image_formats/G64_rb.html +7 -0
- data/doc/files/lib/image_formats/JvcDsk_rb.html +108 -0
- data/doc/files/lib/image_formats/Ti99Dsk_rb.html +134 -0
- data/doc/files/lib/image_formats/Ti99Dsk_rb.src/M000001.html +18 -0
- data/doc/files/lib/image_formats/Trs80Jv1Dsk_rb.html +1 -1
- data/doc/files/lib/native_file_types/apple2/AppleBinary_rb.html +1 -1
- data/doc/files/lib/native_file_types/apple2/AppleHiResPic_rb.html +1 -1
- data/doc/files/lib/native_file_types/apple2/ApplePrintShopMiniPix_rb.html +109 -0
- data/doc/files/lib/native_file_types/apple2/AppleText_rb.html +2 -1
- data/doc/files/lib/native_file_types/apple2/AppleWorksWP_rb.html +7 -0
- data/doc/files/lib/native_file_types/apple2/Applesoft_rb.html +7 -0
- data/doc/files/lib/native_file_types/apple2/IntegerBASIC_rb.html +7 -0
- data/doc/files/lib/native_file_types/apple2/NADOLFile_rb.html +8 -0
- data/doc/files/lib/native_file_types/apple2/PackedAppleDosPic_rb.html +101 -0
- data/doc/files/lib/native_file_types/apple2/PascalFile_rb.html +7 -0
- data/doc/files/lib/native_file_types/apple2/ProDosFile_rb.html +1 -1
- data/doc/files/lib/native_file_types/apple2/ScAsm_rb.html +7 -0
- data/doc/files/lib/native_file_types/atari800/AtariBasic_rb.html +7 -0
- data/doc/files/lib/native_file_types/atari800/AtariBinary_rb.html +8 -1
- data/doc/files/lib/native_file_types/atari800/AtariText_rb.html +2 -1
- data/doc/files/lib/native_file_types/c64/C64BasicPrg_rb.html +7 -0
- data/doc/files/lib/native_file_types/c64/C64PrgText_rb.html +7 -0
- data/doc/files/lib/native_file_types/c64/C64Prg_rb.html +7 -0
- data/doc/files/lib/native_file_types/c64/C64Seq_rb.html +7 -0
- data/doc/files/lib/native_file_types/c64/CbmFile_rb.html +7 -0
- data/doc/files/lib/native_file_types/coco/CocoBasic_rb.html +108 -0
- data/doc/files/lib/native_file_types/coco/CocoMachineLanguage_rb.html +108 -0
- data/doc/files/lib/native_file_types/coco/CocoScreen_rb.html +108 -0
- data/doc/files/lib/native_file_types/coco/CocoText_rb.html +108 -0
- data/doc/files/lib/native_file_types/cpm/CPMFile_rb.html +7 -0
- data/doc/files/lib/native_file_types/cpm/MBasic_rb.html +7 -0
- data/doc/files/lib/native_file_types/generic/GenericFile_rb.html +7 -0
- data/doc/files/lib/native_file_types/generic/GenericGIF_rb.html +101 -0
- data/doc/files/lib/native_file_types/generic/ScreenDump_rb.html +101 -0
- data/doc/files/lib/native_file_types/ti99/Ti99BasicFile_rb.html +108 -0
- data/doc/files/lib/native_file_types/ti99/Ti99File_rb.html +108 -0
- data/doc/files/lib/native_file_types/ti99/Ti99TextFile_rb.html +108 -0
- data/doc/files/lib/native_file_types/ti99/TiArtistColours_rb.html +108 -0
- data/doc/files/lib/native_file_types/ti99/TiArtistPattern_rb.html +109 -0
- data/doc/files/lib/native_file_types/ti99/TiRLE_rb.html +109 -0
- data/doc/files/lib/native_file_types/trs80/Trs80BasicListing_rb.html +108 -0
- data/doc/files/lib/native_file_types/trs80/Trs80Cmd_rb.html +1 -1
- data/doc/files/lib/native_file_types/trs80/Trs80Jcl_rb.html +7 -0
- data/doc/files/lib/native_file_types/trs80/Trs80LevelIIBasic_rb.html +1 -1
- data/doc/files/lib/native_file_types/trs80/Trs80PascalSource_rb.html +7 -0
- data/doc/files/lib/native_file_types/trs80/Trs80Text_rb.html +108 -0
- data/doc/files/lib/proc_source_rb.html +7 -0
- data/doc/files/lib/rdoc_patch_rb.html +6 -0
- data/doc/files/test/tc_apple_2_rb.html +108 -0
- data/doc/files/test/tc_atari_800_rb.html +108 -0
- data/doc/files/test/tc_c64_rb.html +108 -0
- data/doc/files/test/tc_cache_and_collections_rb.html +108 -0
- data/doc/files/test/tc_coco_rb.html +108 -0
- data/doc/files/test/tc_file_cache_rb.html +7 -0
- data/doc/files/test/tc_image_sniffing_rb.html +8 -1
- data/doc/files/test/tc_screen_dumps_rb.html +108 -0
- data/doc/files/test/tc_ti99_rb.html +108 -0
- data/doc/files/test/tc_trs80_rb.html +108 -0
- data/doc/files/test/testhelper_rb.html +57 -1
- data/doc/files/test/testhelper_rb.src/M000002.html +21 -0
- data/doc/files/test/testhelper_rb.src/M000003.html +18 -0
- data/doc/files/test/testhelper_rb.src/M000004.html +61 -0
- data/doc/files/test/ts_test_all_rb.html +5 -0
- data/doc/files/website/index_rb.html +107 -0
- data/lib/FileCache.rb +80 -13
- data/lib/FileSystem.rb +1 -1
- data/lib/FileSystemImage.rb +16 -2
- data/lib/HostSystem.rb +124 -1
- data/lib/NativeFileType.rb +11 -1
- data/lib/RipXplore.rb +2 -2
- data/lib/file_systems/ProDos.rb +1 -0
- data/lib/file_systems/RawDisk.rb +7 -2
- data/lib/file_systems/RsDos.rb +146 -0
- data/lib/file_systems/Ti99Fms.rb +123 -0
- data/lib/file_systems/TrsDos.rb +8 -5
- data/lib/host_systems/Apple2.rb +53 -9
- data/lib/host_systems/Atari800.rb +40 -1
- data/lib/host_systems/C64.rb +42 -1
- data/lib/host_systems/Coco.rb +145 -0
- data/lib/host_systems/TRS81-3.FNT +0 -0
- data/lib/host_systems/Ti99.rb +86 -0
- data/lib/host_systems/Trs80.rb +40 -5
- data/lib/host_systems/apple_2_font.bin +0 -0
- data/lib/host_systems/atari-800-font.bin +0 -0
- data/lib/host_systems/c64-font.bin +0 -0
- data/lib/host_systems/coco-font.bin +0 -0
- data/lib/host_systems/ti99-font.bin +0 -0
- data/lib/image_formats/JvcDsk.rb +101 -0
- data/lib/image_formats/Ti99Dsk.rb +213 -0
- data/lib/image_formats/Trs80Jv1Dsk.rb +5 -3
- data/lib/native_file_types/apple2/AppleBinary.rb +2 -2
- data/lib/native_file_types/apple2/AppleHiResPic.rb +101 -57
- data/lib/native_file_types/apple2/ApplePrintShopMiniPix.rb +99 -0
- data/lib/native_file_types/apple2/AppleText.rb +16 -0
- data/lib/native_file_types/apple2/PackedAppleDosPic.rb +85 -0
- data/lib/native_file_types/apple2/ProDosFile.rb +2 -3
- data/lib/native_file_types/atari800/AtariBinary.rb +1 -1
- data/lib/native_file_types/atari800/AtariText.rb +7 -1
- data/lib/native_file_types/coco/CocoBasic.rb +230 -0
- data/lib/native_file_types/coco/CocoMachineLanguage.rb +47 -0
- data/lib/native_file_types/coco/CocoScreen.rb +54 -0
- data/lib/native_file_types/coco/CocoText.rb +42 -0
- data/lib/native_file_types/generic/GenericGIF.rb +50 -0
- data/lib/native_file_types/generic/ScreenDump.rb +43 -0
- data/lib/native_file_types/ti99/Ti99BasicFile.rb +223 -0
- data/lib/native_file_types/ti99/Ti99File.rb +40 -0
- data/lib/native_file_types/ti99/Ti99TextFile.rb +62 -0
- data/lib/native_file_types/ti99/TiArtistColours.rb +40 -0
- data/lib/native_file_types/ti99/TiArtistPattern.rb +109 -0
- data/lib/native_file_types/ti99/TiRLE.rb +91 -0
- data/lib/native_file_types/trs80/Trs80BasicListing.rb +51 -0
- data/lib/native_file_types/trs80/Trs80Cmd.rb +3 -1
- data/lib/native_file_types/trs80/Trs80LevelIIBasic.rb +15 -3
- data/lib/native_file_types/trs80/Trs80Text.rb +49 -0
- data/test/native_files/42d0d52047a748022d2aacef60cc5271-0.png +0 -0
- data/test/native_files/6ac562d2d099dc31213e97b8fe08ffbf-1.png +0 -0
- data/test/screendumps/0.png +0 -0
- data/test/screendumps/1.png +0 -0
- data/test/screendumps/2.png +0 -0
- data/test/screendumps/3.png +0 -0
- data/test/screendumps/4.png +0 -0
- data/test/screendumps/5.png +0 -0
- data/test/screendumps/6.png +0 -0
- data/test/screendumps/7.png +0 -0
- data/test/tc_apple_2.rb +94 -0
- data/test/tc_atari_800.rb +28 -0
- data/test/tc_c64.rb +35 -0
- data/test/tc_cache_and_collections.rb +33 -0
- data/test/tc_coco.rb +38 -0
- data/test/tc_screen_dumps.rb +42 -0
- data/test/tc_ti99.rb +51 -0
- data/test/tc_trs80.rb +66 -0
- data/test/testhelper.rb +59 -1
- data/test/testlog.txt +123423 -30232
- metadata +595 -14
- data/test/tc_file_cache.rb +0 -11
- data/test/tc_image_sniffing.rb +0 -165
data/lib/FileCache.rb
CHANGED
|
@@ -3,7 +3,7 @@ $:.unshift(File.dirname(__FILE__)) unless
|
|
|
3
3
|
require 'open-uri'
|
|
4
4
|
require 'digest/md5'
|
|
5
5
|
require 'RipXploreLog'
|
|
6
|
-
|
|
6
|
+
require 'RipXplore'
|
|
7
7
|
|
|
8
8
|
class FileCacheItem < File
|
|
9
9
|
def set_path(path)
|
|
@@ -16,29 +16,39 @@ end
|
|
|
16
16
|
|
|
17
17
|
#creates and manages a local cache of files, so an URL can be requested, if it is in the cache, the local copy is used, otherwise the file is downloaded to the local cache
|
|
18
18
|
class FileCache
|
|
19
|
-
attr_accessor :
|
|
19
|
+
attr_accessor :url_cache_dir,:url_cache_list,:native_file_cache_dir
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def cache_name_for_url(url)
|
|
23
|
+
"#{url_cache_dir}/#{Digest::MD5.hexdigest(url)}.cached"
|
|
24
|
+
end
|
|
20
25
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
26
|
+
def cache_name_for_native_file(native_file,extension)
|
|
27
|
+
image=native_file.file_system_image
|
|
28
|
+
index=image.files.index(native_file)
|
|
29
|
+
"#{native_file_cache_dir}/#{Digest::MD5.hexdigest(image.filename)}-#{index}.#{extension}"
|
|
24
30
|
end
|
|
25
31
|
|
|
26
|
-
def initialize(
|
|
27
|
-
@
|
|
28
|
-
|
|
29
|
-
|
|
32
|
+
def initialize(url_cache_dir,native_file_cache_dir)
|
|
33
|
+
@url_cache_dir=url_cache_dir
|
|
34
|
+
@native_file_cache_dir=native_file_cache_dir
|
|
35
|
+
@url_cache_list="#{url_cache_dir}/cache.urls"
|
|
36
|
+
Dir.mkdir(url_cache_dir) unless File.exists?(url_cache_dir)
|
|
37
|
+
raise "cache directory #{url_cache_dir} invalid" unless File.directory?(url_cache_dir)
|
|
38
|
+
Dir.mkdir(native_file_cache_dir) unless File.exists?(native_file_cache_dir)
|
|
39
|
+
raise "cache directory #{native_file_cache_dir} invalid" unless File.directory?(native_file_cache_dir)
|
|
30
40
|
end
|
|
31
41
|
|
|
32
|
-
def
|
|
33
|
-
local_file_name=
|
|
42
|
+
def purge_url(url)
|
|
43
|
+
local_file_name=cache_name_for_url(url)
|
|
34
44
|
if File.exists?(local_file_name) then
|
|
35
45
|
RipXploreLog.log "purging local copy of #{url}"
|
|
36
46
|
File.delete(local_file_name)
|
|
37
47
|
end
|
|
38
48
|
end
|
|
39
49
|
|
|
40
|
-
def
|
|
41
|
-
local_file_name=
|
|
50
|
+
def get_url(url)
|
|
51
|
+
local_file_name=cache_name_for_url(url)
|
|
42
52
|
if !File.exists?(local_file_name) then
|
|
43
53
|
RipXploreLog.log "downloading #{url}"
|
|
44
54
|
remote_file=open(url,"rb")
|
|
@@ -54,6 +64,63 @@ class FileCache
|
|
|
54
64
|
file.set_path(url)
|
|
55
65
|
file
|
|
56
66
|
end
|
|
67
|
+
|
|
68
|
+
def get_file_system_image(url)
|
|
69
|
+
file=get_url(url)
|
|
70
|
+
image=RipXplore.best_fit_from_file(file)
|
|
71
|
+
@@file_system_image_urls<<url if (!@@file_system_image_urls.nil? && !@@file_system_image_urls.include?(url))
|
|
72
|
+
return image
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
@@file_system_image_urls=nil
|
|
76
|
+
def file_system_image_urls_in_cache
|
|
77
|
+
if @@file_system_image_urls.nil? then
|
|
78
|
+
make_file_system_image_list unless File.exists?(@url_cache_list)
|
|
79
|
+
@@file_system_image_urls=File.open(@url_cache_list,"r").readlines.collect{|url| url.chomp}
|
|
80
|
+
end
|
|
81
|
+
@@file_system_image_urls
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def make_file_system_image_list
|
|
85
|
+
urls=[]
|
|
86
|
+
Dir.glob("#{url_cache_dir}/*.cached.info").each do |info_file|
|
|
87
|
+
url=File.open(info_file,"r").read.chomp
|
|
88
|
+
urls<<url if (FileSystemImage.is_file_system_image_filename?(url))
|
|
89
|
+
end
|
|
90
|
+
File.open(@url_cache_list,"w") {|f| f<< urls.join("\n")}
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def random_file_system_image(collection_type=nil)
|
|
95
|
+
all_image_urls=file_system_image_urls_in_cache
|
|
96
|
+
all_image_urls.length.times do
|
|
97
|
+
begin
|
|
98
|
+
index=rand(all_image_urls.length)
|
|
99
|
+
image=get_file_system_image(all_image_urls[index%all_image_urls.length])
|
|
100
|
+
return image if ((collection_type==nil) || (image.send(collection_type).length>0))
|
|
101
|
+
rescue #silently swallow any exception
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
raise 'no suitable image found in cache'
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
def force_native_file_to_cache(native_file,method_to_cache_on_native_file,extension)
|
|
108
|
+
cache_filename=cache_name_for_native_file(native_file,extension)
|
|
109
|
+
if ! File.exists?(cache_filename) then
|
|
110
|
+
local_file=File.open(cache_filename,"wb")
|
|
111
|
+
local_file<<native_file.send(method_to_cache_on_native_file)
|
|
112
|
+
local_file.close
|
|
113
|
+
end
|
|
114
|
+
return cache_filename
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
def purge_native_file_from_cache(native_file)
|
|
118
|
+
Dir.glob(cache_name_for_native_file(native_file,'*')).each do |filename|
|
|
119
|
+
RipXploreLog.log "purging local #{filename}"
|
|
120
|
+
File.delete(filename)
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
|
|
57
124
|
end
|
|
58
125
|
|
|
59
126
|
|
data/lib/FileSystem.rb
CHANGED
|
@@ -47,7 +47,7 @@ def self.compatability_score(file_system_image)
|
|
|
47
47
|
final_score=1
|
|
48
48
|
code_for_tests.each do |code_for_test|
|
|
49
49
|
result = eval code_for_test,binding
|
|
50
|
-
|
|
50
|
+
RipXploreLog.debug "test for #{file_system_image.filename}#{self} : #{code_for_test} : #{result}"
|
|
51
51
|
final_score+=1
|
|
52
52
|
return 0 unless (result)
|
|
53
53
|
end
|
data/lib/FileSystemImage.rb
CHANGED
|
@@ -9,6 +9,7 @@ attr_reader :file_system, :image_format,:filename
|
|
|
9
9
|
attr_accessor :volume_name
|
|
10
10
|
|
|
11
11
|
def FileSystemImage.is_file_system_image_filename?(filename)
|
|
12
|
+
|
|
12
13
|
extension=File.extname(File.basename(filename,".gz")).downcase
|
|
13
14
|
ImageFormat.all_possible_extensions.include?(extension)
|
|
14
15
|
end
|
|
@@ -81,7 +82,7 @@ end
|
|
|
81
82
|
@files=file_system.files(self) if @files.nil?
|
|
82
83
|
@files
|
|
83
84
|
end
|
|
84
|
-
|
|
85
|
+
|
|
85
86
|
#return an array containing a list of numbers of valid tracks on this image
|
|
86
87
|
def track_list
|
|
87
88
|
image_format.track_list
|
|
@@ -119,7 +120,7 @@ def to_hex_dump
|
|
|
119
120
|
#return a formatted hex dump of all sectors in a track
|
|
120
121
|
def dump_track(track)
|
|
121
122
|
s=""
|
|
122
|
-
|
|
123
|
+
sectors_in_track(track).each do |sector|
|
|
123
124
|
s<<dump_sector(track,sector)
|
|
124
125
|
end
|
|
125
126
|
s
|
|
@@ -140,6 +141,19 @@ def catalog
|
|
|
140
141
|
end
|
|
141
142
|
|
|
142
143
|
|
|
144
|
+
def pictures
|
|
145
|
+
files.find_all{|f| f.respond_to?(:to_picture)}
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
def texts
|
|
149
|
+
files.find_all{|f| f.respond_to?(:to_text)}
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
def listings
|
|
153
|
+
files.find_all{|f| f.respond_to?(:to_listing)}
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
|
|
143
157
|
private
|
|
144
158
|
|
|
145
159
|
def hline
|
data/lib/HostSystem.rb
CHANGED
|
@@ -3,8 +3,17 @@ $:.unshift(File.dirname(__FILE__)) unless
|
|
|
3
3
|
require 'open-uri'
|
|
4
4
|
require 'RipXploreLog'
|
|
5
5
|
require 'SubclassTracking'
|
|
6
|
+
require 'PatchedPNG'
|
|
6
7
|
|
|
7
8
|
class HostSystem
|
|
9
|
+
|
|
10
|
+
MAX_SCREENDUMP_LINES=200
|
|
11
|
+
|
|
12
|
+
#each subclass should override this method with a 2-5 word description of this host system
|
|
13
|
+
def self.full_name
|
|
14
|
+
nil
|
|
15
|
+
end
|
|
16
|
+
|
|
8
17
|
def HostSystem.possible_file_systems
|
|
9
18
|
results=[]
|
|
10
19
|
FileSystem.all_file_systems.each do |candidate|
|
|
@@ -12,7 +21,8 @@ class HostSystem
|
|
|
12
21
|
end
|
|
13
22
|
results
|
|
14
23
|
end
|
|
15
|
-
|
|
24
|
+
|
|
25
|
+
|
|
16
26
|
def HostSystem.all_host_systems
|
|
17
27
|
HostSystem.subclasses
|
|
18
28
|
end
|
|
@@ -54,6 +64,119 @@ end
|
|
|
54
64
|
def HostSystem.start_track
|
|
55
65
|
0
|
|
56
66
|
end
|
|
67
|
+
|
|
68
|
+
@font_data=nil
|
|
69
|
+
def self.font_data
|
|
70
|
+
@font_data=File.new(font_data_filename,"rb").read if @font_data.nil?
|
|
71
|
+
@font_data
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
#default - should be overridden by each host system
|
|
75
|
+
def self.screen_rows
|
|
76
|
+
25
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
#default - should be overridden by each host system
|
|
80
|
+
def self.default_screen_width
|
|
81
|
+
40
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def self.max_screen_width
|
|
85
|
+
80
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
#default - should be overridden by each host system
|
|
89
|
+
def self.font_width
|
|
90
|
+
8
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
#default - should be overridden by each host system
|
|
94
|
+
def self.font_height
|
|
95
|
+
8
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
#default - should be overridden by each host system
|
|
99
|
+
def self.pixels_between_characters
|
|
100
|
+
0
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
#default - should be overridden by each host system
|
|
104
|
+
def self.default_foreground_colour
|
|
105
|
+
PNG::Color::White
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
#default - should be overridden by each host system
|
|
109
|
+
def self.default_background_colour
|
|
110
|
+
PNG::Color::Black
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
def self.to_screendump(text,screen_width)
|
|
114
|
+
lines=split_into_lines(text,screen_width)
|
|
115
|
+
canvas = PNG::Canvas.new font_width*screen_width, (pixels_between_characters+font_height)*[lines.length,screen_rows].max, default_background_colour
|
|
116
|
+
line_number=0
|
|
117
|
+
lines.each do |line|
|
|
118
|
+
col=0
|
|
119
|
+
line.each_byte do |char|
|
|
120
|
+
draw_char_at(canvas,char,line_number,col)
|
|
121
|
+
col+=1
|
|
122
|
+
end
|
|
123
|
+
line_number+=1
|
|
124
|
+
end
|
|
125
|
+
PNG.new(canvas).raw_bytes
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
def self.line_break_chars
|
|
130
|
+
[0x0D]
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
private
|
|
134
|
+
def self.draw_char_at(canvas,char,line_number,col,foreground_colour=default_foreground_colour,background_colour=default_background_colour)
|
|
135
|
+
start_x=col*font_width
|
|
136
|
+
start_y=line_number*(pixels_between_characters+font_height)
|
|
137
|
+
font_height.times do |y_offset|
|
|
138
|
+
font_byte=font_data[char*font_height+y_offset]
|
|
139
|
+
font_width.times do |x_offset|
|
|
140
|
+
bit_mask=1<<(font_width-(x_offset+1))
|
|
141
|
+
if ((font_byte & bit_mask)==bit_mask) then
|
|
142
|
+
canvas[start_x+x_offset, start_y+y_offset]=foreground_colour
|
|
143
|
+
else
|
|
144
|
+
canvas[start_x+x_offset, start_y+y_offset]=background_colour
|
|
145
|
+
end
|
|
146
|
+
end
|
|
147
|
+
end
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
def self.split_into_lines(text,screen_width)
|
|
151
|
+
line_number=0
|
|
152
|
+
col=0
|
|
153
|
+
lines=[]
|
|
154
|
+
s=""
|
|
155
|
+
p=0
|
|
156
|
+
done=false
|
|
157
|
+
until done do
|
|
158
|
+
b=text[p]
|
|
159
|
+
s<<b unless line_break_chars.include?(b)
|
|
160
|
+
col+=1
|
|
161
|
+
if (col==screen_width) || ( line_break_chars.include?(b)) then
|
|
162
|
+
# puts "#{line_number} -#{s}"
|
|
163
|
+
col=0
|
|
164
|
+
line_number+=1
|
|
165
|
+
lines<<s
|
|
166
|
+
s=""
|
|
167
|
+
end
|
|
168
|
+
p+=1
|
|
169
|
+
done=true if p==text.length
|
|
170
|
+
done=true if line_number==MAX_SCREENDUMP_LINES
|
|
171
|
+
#done=true if line_number==screen_rows
|
|
172
|
+
end
|
|
173
|
+
lines<<s if s.length>0 && lines.length<screen_rows
|
|
174
|
+
lines
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
|
|
57
180
|
end
|
|
58
181
|
|
|
59
182
|
HostSystem.extend SubclassTracking
|
data/lib/NativeFileType.rb
CHANGED
|
@@ -91,7 +91,13 @@ class NativeFileType
|
|
|
91
91
|
end
|
|
92
92
|
best_candidate=candidates.keys.sort{|a,b| candidates[b]<=>candidates[a]}[0]
|
|
93
93
|
RipXploreLog.debug("best candidate for #{filename} = #{best_candidate} score: #{candidates[best_candidate]}")
|
|
94
|
-
best_candidate.new(file_system_image,filename,contents,file_type,aux_code)
|
|
94
|
+
native_file=best_candidate.new(file_system_image,filename,contents,file_type,aux_code)
|
|
95
|
+
if GenericGIF.is_gif?(native_file) then
|
|
96
|
+
RipXploreLog.debug(" #{filename} is a GIF")
|
|
97
|
+
native_file.extend GenericGIF
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
native_file
|
|
95
101
|
end
|
|
96
102
|
|
|
97
103
|
|
|
@@ -138,8 +144,12 @@ def self.compatability_score(file_system_image,filename,contents,file_type,aux_c
|
|
|
138
144
|
return matching_score+passed_tests
|
|
139
145
|
end
|
|
140
146
|
|
|
147
|
+
private
|
|
148
|
+
def text_for_screendump
|
|
149
|
+
data_without_header.sub(/\000*$/,'') #trim of any trailing null bytes
|
|
141
150
|
end
|
|
142
151
|
|
|
152
|
+
end
|
|
143
153
|
NativeFileType.extend SubclassTracking
|
|
144
154
|
|
|
145
155
|
# == Author
|
data/lib/RipXplore.rb
CHANGED
|
@@ -4,7 +4,7 @@ $:.unshift(File.dirname(__FILE__)) unless
|
|
|
4
4
|
require 'open-uri'
|
|
5
5
|
class RipXplore
|
|
6
6
|
|
|
7
|
-
VERSION="0.0.
|
|
7
|
+
VERSION="0.0.2"
|
|
8
8
|
|
|
9
9
|
private
|
|
10
10
|
def RipXplore.require_files_in_subdir(dirname)
|
|
@@ -37,7 +37,7 @@ def RipXplore.best_fit_from_file(file,filename=nil)
|
|
|
37
37
|
if !(filename=~/(.*)\.gz$/i).nil? then
|
|
38
38
|
require 'zlib'
|
|
39
39
|
file_bytes=Zlib::GzipReader.new(file).read
|
|
40
|
-
filename=$1
|
|
40
|
+
# filename=$1
|
|
41
41
|
else
|
|
42
42
|
file_bytes=file.read
|
|
43
43
|
end
|
data/lib/file_systems/ProDos.rb
CHANGED
data/lib/file_systems/RawDisk.rb
CHANGED
|
@@ -13,8 +13,13 @@ class RawDisk<FileSystem
|
|
|
13
13
|
end
|
|
14
14
|
|
|
15
15
|
#this should be the file system of last resort
|
|
16
|
-
def self.compatability_score(
|
|
17
|
-
|
|
16
|
+
def self.compatability_score(file_system_image)
|
|
17
|
+
#if the filesystem on a DSK is RAW, don't worry about sector interleaves
|
|
18
|
+
if file_system_image.image_format.instance_of?(A2Dsk)
|
|
19
|
+
return 0
|
|
20
|
+
else
|
|
21
|
+
return 0.1
|
|
22
|
+
end
|
|
18
23
|
end
|
|
19
24
|
end
|
|
20
25
|
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
$:.unshift(File.dirname(__FILE__)) unless
|
|
2
|
+
$:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
|
|
3
|
+
|
|
4
|
+
$:.unshift(File.dirname(__FILE__+"\\..")) unless
|
|
5
|
+
$:.include?(File.dirname(__FILE__+"\\..")) || $:.include?(File.expand_path(File.dirname(__FILE__+"\\..")))
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
require 'FileSystem'
|
|
9
|
+
#RSDOS (Standard Color Computer Disk Operating system)
|
|
10
|
+
#Reference - Radio Shack TRS-80 Color Computer Disk System Owners Manual & Programming Guide, pages 58-59
|
|
11
|
+
#sectors 3-11 of the directory track (17) contain Directory Entries, which are 32 bytes made up of:
|
|
12
|
+
# byte $00-$07: Filename, left justified, blank-filled.
|
|
13
|
+
# If byte 0=0, then file has been deleted.
|
|
14
|
+
# If byte 0=$FF, then the entry (and all following entries) have not yet been used.
|
|
15
|
+
# byte $08-$0A: Filename extension, left justified, blank-filed
|
|
16
|
+
# byte $0b: File type
|
|
17
|
+
# 0 = BASIC program
|
|
18
|
+
# 1 = BASIC data file
|
|
19
|
+
# 2 = Machine-language program
|
|
20
|
+
# 3 = Text Editor Source file
|
|
21
|
+
# byte $0C: ASCII Flag
|
|
22
|
+
# 0 = the file is in binary format
|
|
23
|
+
# $FF = the file is in ASCII format
|
|
24
|
+
# byte $0D: The number of the first granule in the file (0-67)
|
|
25
|
+
# byte $0E-$0F: The number of bytes in use in the last sector of the file. Big endian.
|
|
26
|
+
# byte $16-$1F: Reserved for future use.
|
|
27
|
+
#sector 2 contains File Allocation Table.
|
|
28
|
+
class RsDos<FileSystem
|
|
29
|
+
|
|
30
|
+
def self.host_system
|
|
31
|
+
Coco
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
#standard RSDOS has directory on track 17
|
|
35
|
+
def self.directory_track
|
|
36
|
+
0x11
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def self.sectors_per_granule(file_system_image)
|
|
40
|
+
9
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
#check the directory track look reasonable
|
|
45
|
+
is_valid_file_system_if lambda {
|
|
46
|
+
result=true
|
|
47
|
+
found_one_directory_entry=false
|
|
48
|
+
(3..11).each do |sector_no|
|
|
49
|
+
|
|
50
|
+
sector=file_system_image.get_sector(directory_track,sector_no)
|
|
51
|
+
if sector[0]<0xFF then
|
|
52
|
+
found_one_directory_entry =true
|
|
53
|
+
file_type=sector[0x0B]
|
|
54
|
+
ascii_flag=sector[0x0C]
|
|
55
|
+
first_granule=sector[0x0D]
|
|
56
|
+
result=false if (file_type>4)
|
|
57
|
+
result=false unless (ascii_flag==0x00 || ascii_flag==0xFF)
|
|
58
|
+
result=false if (first_granule>67)
|
|
59
|
+
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
(found_one_directory_entry && result)
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
#we are getting false positives with TI-99/4A disks so we need to do some inverted TI FMS tests
|
|
67
|
+
is_valid_file_system_if lambda {
|
|
68
|
+
file_system_image.get_sector(0,1)[0X0d,3]!='DSK'
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
FDE_SIZE=0x20
|
|
72
|
+
|
|
73
|
+
def self.files(file_system_image)
|
|
74
|
+
files=FileContainer.new
|
|
75
|
+
granule_allocation_table=file_system_image.get_sector(directory_track,2)
|
|
76
|
+
return files if granule_allocation_table.nil?
|
|
77
|
+
# file_system_image.volume_name="RSDOS Disk"
|
|
78
|
+
(file_system_image.sectors_in_track(directory_track)-[1,2,12,13,14,15,16,17,18]).each do |sector_no|
|
|
79
|
+
fde_sector=file_system_image.get_sector(directory_track,sector_no)
|
|
80
|
+
(fde_sector.length/FDE_SIZE).times do |fde_number|
|
|
81
|
+
fde=fde_sector[fde_number*FDE_SIZE,FDE_SIZE]
|
|
82
|
+
next if fde[0]==0
|
|
83
|
+
break if fde[0]==0xff
|
|
84
|
+
|
|
85
|
+
filename_base=fde[0,8].unpack("A8")
|
|
86
|
+
filename_extension=fde[8,3].unpack("A8")
|
|
87
|
+
filename="#{filename_base}/#{filename_extension}"
|
|
88
|
+
file_type, ascii_flag, granule, last_sector_bytes = fde[11,5].unpack("CCCS")
|
|
89
|
+
contents=""
|
|
90
|
+
granules = []
|
|
91
|
+
|
|
92
|
+
# puts "#{filename}: first gran:#{granule} file type #{file_type} ascii flag #{ascii_flag}"
|
|
93
|
+
|
|
94
|
+
while granule < 67
|
|
95
|
+
break if granules.include?(granule)==true
|
|
96
|
+
granules << granule
|
|
97
|
+
track_no = Integer(granule/2)
|
|
98
|
+
(track_no += 1) if granule>33
|
|
99
|
+
start_sector = (granule % 2) == 0 ? 1 : 10
|
|
100
|
+
#puts "Start sector: #{start_sector}"
|
|
101
|
+
|
|
102
|
+
granule_value = granule_allocation_table[ granule ]
|
|
103
|
+
|
|
104
|
+
if granule_value < 68 then
|
|
105
|
+
9.times {|i| contents<<file_system_image.get_sector(track_no,start_sector+i)}
|
|
106
|
+
else
|
|
107
|
+
count = (granule_value & 0b00011111) - 1
|
|
108
|
+
count.times {|i| contents<<file_system_image.get_sector(track_no,start_sector+i)}
|
|
109
|
+
contents<<(file_system_image.get_sector(track_no,start_sector+count))[0,last_sector_bytes]
|
|
110
|
+
end
|
|
111
|
+
#puts "#{granule} = #{granule_value}"
|
|
112
|
+
granule = granule_value
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
files<<NativeFileType.best_fit(file_system_image,filename,contents,file_type,ascii_flag)
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
files
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
# == Author
|
|
124
|
+
# tim lindner (tlindner@macmess.org)
|
|
125
|
+
#
|
|
126
|
+
# == Copyright
|
|
127
|
+
# Copyright (c) 2008 tim lindner (tlindner@macmess.org)
|
|
128
|
+
#
|
|
129
|
+
#Permission is hereby granted, free of charge, to any person obtaining
|
|
130
|
+
#a copy of this software and associated documentation files (the
|
|
131
|
+
#"Software"), to deal in the Software without restriction, including
|
|
132
|
+
#without limitation the rights to use, copy, modify, merge, publish,
|
|
133
|
+
#distribute, sublicense, and/or sell copies of the Software, and to
|
|
134
|
+
#permit persons to whom the Software is furnished to do so, subject to
|
|
135
|
+
#the following conditions:
|
|
136
|
+
|
|
137
|
+
# The above copyright notice and this permission notice shall be
|
|
138
|
+
# included in all copies or substantial portions of the Software.
|
|
139
|
+
|
|
140
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
141
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
142
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
143
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
144
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
145
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
146
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
$:.unshift(File.dirname(__FILE__)) unless
|
|
2
|
+
$:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
|
|
3
|
+
|
|
4
|
+
$:.unshift(File.dirname(__FILE__+"\\..")) unless
|
|
5
|
+
$:.include?(File.dirname(__FILE__+"\\..")) || $:.include?(File.expand_path(File.dirname(__FILE__+"\\..")))
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
require 'FileSystem'
|
|
9
|
+
|
|
10
|
+
#File System used by Texas Instruments TI 99/4A
|
|
11
|
+
#http://groups.google.com.au/group/comp.sys.ti/browse_frm/thread/64cc9c35e36ebb28/6f3faa2ae6b0e4d2
|
|
12
|
+
#ftp://ftp.whtech.com/datasheets%20%26%20manuals/Specifications/File%20Management%20Specification%20for%20TI%2099_4%20Personal%20Computer%20V2.5%2002-25-1983.pdf
|
|
13
|
+
class Ti99Fms<FileSystem
|
|
14
|
+
|
|
15
|
+
def self.host_system
|
|
16
|
+
Ti99
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
is_valid_file_system_if lambda {
|
|
20
|
+
#we should be on a subclass of Ti99Dsk, but not the generic superclasses (Ti99Dsk and Pc99Dsk) class itself
|
|
21
|
+
#yes this is a nasty hack - it should be up to the ImageFormat code, not the FileSystem code, to not allow selection of bad ImageFormats :-(
|
|
22
|
+
file_system_image.image_format.kind_of?(Ti99Dsk) &&
|
|
23
|
+
(!(file_system_image.image_format.instance_of?(Ti99Dsk))) &&
|
|
24
|
+
(!(file_system_image.image_format.instance_of?(Pc99Dsk)))
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
#All TI/99 disks have the chars DSK in bytes 0x0c..0x0E of sector 0.
|
|
30
|
+
is_valid_file_system_if lambda {
|
|
31
|
+
file_system_image.get_sector(0,0)[0X0d,3]=='DSK'
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
def self.files(file_system_image)
|
|
35
|
+
sector_0=file_system_image.get_sector(0,0)
|
|
36
|
+
file_system_image.volume_name=sector_0[0,10].unpack("A*")[0]
|
|
37
|
+
files=FileContainer.new
|
|
38
|
+
file_descriptor_index_sector=file_system_image.get_sector(0,1)
|
|
39
|
+
127.times do |file_descriptor_index|
|
|
40
|
+
dir_sector_no=(file_descriptor_index_sector[file_descriptor_index*2]<<8)+(file_descriptor_index_sector[(file_descriptor_index*2)+1])
|
|
41
|
+
# puts "#{file_descriptor_index} %02X" % dir_sector_no
|
|
42
|
+
break if dir_sector_no==0
|
|
43
|
+
dir_sector=file_system_image.get_sector(0,dir_sector_no)
|
|
44
|
+
filename=dir_sector[0,10].unpack("A*")[0]
|
|
45
|
+
if dir_sector[0]>=0x20 && dir_sector[0x0a]==0 && dir_sector[0x0b]==0 then
|
|
46
|
+
file_status_flag=dir_sector[0x0c]
|
|
47
|
+
record_length=dir_sector[0x11]
|
|
48
|
+
records_per_sector=dir_sector[0x0d]
|
|
49
|
+
valid_bytes_in_sector=records_per_sector*record_length
|
|
50
|
+
valid_bytes_in_sector=0x100 if valid_bytes_in_sector==0
|
|
51
|
+
# puts "FILE #{filename} RECORD LENGTH %02X NUM RECORDS %02X TOTAL BYTES %02X" % [record_length,records_per_sector,valid_bytes_in_sector]
|
|
52
|
+
|
|
53
|
+
# puts "FILE STATUS: %02X" % file_status_flag
|
|
54
|
+
data_chain_pointer=0x1c
|
|
55
|
+
|
|
56
|
+
#DATA CHAIN POINTER BLOCKS - Each data chain pointer block is comprised of three bytes which comprise a cluster.
|
|
57
|
+
#The three bytes are broken down into 2 three nybble blocks. The first indicates the first actual sector in
|
|
58
|
+
#the cluster. THe second indicates the highest logical record offset in the cluster of contiguous sectors.
|
|
59
|
+
#The following diagram shows how each three byte cluster relates to the address of the first sector and the
|
|
60
|
+
#highest logical sector offset in the cluster.
|
|
61
|
+
#BYTE 1 N2:N1
|
|
62
|
+
#BYTE 2 M1:N3
|
|
63
|
+
#BYTE 3 M3:M2
|
|
64
|
+
#
|
|
65
|
+
#First Sector - N3:N2:N1
|
|
66
|
+
#Highest Sector Offset M2:M3:M1
|
|
67
|
+
last_sector_offset=-1
|
|
68
|
+
file_contents=""
|
|
69
|
+
|
|
70
|
+
while data_chain_pointer<0xFD do
|
|
71
|
+
byte_1=dir_sector[data_chain_pointer]
|
|
72
|
+
byte_2=dir_sector[data_chain_pointer+1]
|
|
73
|
+
byte_3=dir_sector[data_chain_pointer+2]
|
|
74
|
+
n3=byte_2%0x10
|
|
75
|
+
m1=byte_2>>4
|
|
76
|
+
first_sector=(n3<<8)+byte_1
|
|
77
|
+
highest_sector_offset=(byte_3<<4)+m1
|
|
78
|
+
sectors_in_this_block=highest_sector_offset-last_sector_offset
|
|
79
|
+
last_sector_offset=highest_sector_offset
|
|
80
|
+
|
|
81
|
+
# puts "%2x:%2x:%2x FIRST SECTOR %03X OFFSET %03X" % [byte_1,byte_2,byte_3,first_sector,highest_sector_offset]
|
|
82
|
+
# puts "#{filename} FS #{first_sector} COUNT #{sectors_in_this_block}"
|
|
83
|
+
break if first_sector==0 || first_sector>file_system_image.image_format.sectors_per_track*file_system_image.track_count
|
|
84
|
+
|
|
85
|
+
sectors_in_this_block.times {|i| file_contents<<file_system_image.get_sector(0,i+first_sector)}
|
|
86
|
+
data_chain_pointer+=3
|
|
87
|
+
|
|
88
|
+
end
|
|
89
|
+
file_type=file_status_flag
|
|
90
|
+
|
|
91
|
+
files<<NativeFileType.best_fit(file_system_image,filename,file_contents,file_type)
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
files
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
# == Author
|
|
100
|
+
# Jonno Downes (jonno@jamtronix.com)
|
|
101
|
+
#
|
|
102
|
+
# == Copyright
|
|
103
|
+
# Copyright (c) 2008 Jonno Downes (jonno@jamtronix.com)
|
|
104
|
+
#
|
|
105
|
+
#Permission is hereby granted, free of charge, to any person obtaining
|
|
106
|
+
#a copy of this software and associated documentation files (the
|
|
107
|
+
#"Software"), to deal in the Software without restriction, including
|
|
108
|
+
#without limitation the rights to use, copy, modify, merge, publish,
|
|
109
|
+
#distribute, sublicense, and/or sell copies of the Software, and to
|
|
110
|
+
#permit persons to whom the Software is furnished to do so, subject to
|
|
111
|
+
#the following conditions:
|
|
112
|
+
|
|
113
|
+
# The above copyright notice and this permission notice shall be
|
|
114
|
+
# included in all copies or substantial portions of the Software.
|
|
115
|
+
|
|
116
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
117
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
118
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
119
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
120
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
121
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
122
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
123
|
+
|