diff --git a/DiscImageChef.DiscImages/DiskCopy42.cs b/DiscImageChef.DiscImages/DiskCopy42.cs index 61fd758a..e2692058 100644 --- a/DiscImageChef.DiscImages/DiskCopy42.cs +++ b/DiscImageChef.DiscImages/DiskCopy42.cs @@ -112,13 +112,15 @@ namespace DiscImageChef.ImagePlugins const byte kInvalidFmtByte = 0x96; /// Defined by LisaEm const byte kFmtNotStandard = 0x93; + /// Used incorrectly by Mac OS X with certaing disk images + const byte kMacOSXFmtByte = 0x00; - #endregion + #endregion - #region Internal variables + #region Internal variables - /// Start of data sectors in disk image, should be 0x58 - uint dataOffset; + /// Start of data sectors in disk image, should be 0x58 + uint dataOffset; /// Start of tags in disk image, after data sectors uint tagOffset; /// Bytes per tag, should be 12 @@ -202,8 +204,17 @@ namespace DiscImageChef.ImagePlugins if(tmp_header.valid != 1 || tmp_header.reserved != 0) return false; + // Some versions seem to incorrectly create little endian fields if(tmp_header.dataSize + tmp_header.tagSize + 0x54 != imageFilter.GetDataForkLength() && tmp_header.format != kSigmaFormatTwiggy) - return false; + { + tmp_header.dataSize = BitConverter.ToUInt32(buffer, 0x40); + tmp_header.tagSize = BitConverter.ToUInt32(buffer, 0x44); + tmp_header.dataChecksum = BitConverter.ToUInt32(buffer, 0x48); + tmp_header.tagChecksum = BitConverter.ToUInt32(buffer, 0x4C); + + if(tmp_header.dataSize + tmp_header.tagSize + 0x54 != imageFilter.GetDataForkLength() && tmp_header.format != kSigmaFormatTwiggy) + return false; + } if(tmp_header.format != kSonyFormat400K && tmp_header.format != kSonyFormat800K && tmp_header.format != kSonyFormat720K && tmp_header.format != kSonyFormat1440K && tmp_header.format != kSonyFormat1680K && tmp_header.format != kSigmaFormatTwiggy && @@ -216,7 +227,7 @@ namespace DiscImageChef.ImagePlugins if(tmp_header.fmtByte != kSonyFmtByte400K && tmp_header.fmtByte != kSonyFmtByte800K && tmp_header.fmtByte != kSonyFmtByte800KIncorrect && tmp_header.fmtByte != kSonyFmtByteProDos && tmp_header.fmtByte != kInvalidFmtByte && tmp_header.fmtByte != kSigmaFmtByteTwiggy && - tmp_header.fmtByte != kFmtNotStandard) + tmp_header.fmtByte != kFmtNotStandard && tmp_header.fmtByte != kMacOSXFmtByte) { DicConsole.DebugWriteLine("DC42 plugin", "Unknown tmp_header.fmtByte = 0x{0:X2} value", tmp_header.fmtByte); @@ -272,10 +283,19 @@ namespace DiscImageChef.ImagePlugins if(header.valid != 1 || header.reserved != 0) return false; - if(header.dataSize + header.tagSize + 0x54 != imageFilter.GetDataForkLength() && header.format != kSigmaFormatTwiggy) - return false; + // Some versions seem to incorrectly create little endian fields + if(header.dataSize + header.tagSize + 0x54 != imageFilter.GetDataForkLength() && header.format != kSigmaFormatTwiggy) + { + header.dataSize = BitConverter.ToUInt32(buffer, 0x40); + header.tagSize = BitConverter.ToUInt32(buffer, 0x44); + header.dataChecksum = BitConverter.ToUInt32(buffer, 0x48); + header.tagChecksum = BitConverter.ToUInt32(buffer, 0x4C); - if(header.format != kSonyFormat400K && header.format != kSonyFormat800K && header.format != kSonyFormat720K && + if(header.dataSize + header.tagSize + 0x54 != imageFilter.GetDataForkLength() && header.format != kSigmaFormatTwiggy) + return false; + } + + if(header.format != kSonyFormat400K && header.format != kSonyFormat800K && header.format != kSonyFormat720K && header.format != kSonyFormat1440K && header.format != kSonyFormat1680K && header.format != kSigmaFormatTwiggy && header.format != kNotStandardFormat) { DicConsole.DebugWriteLine("DC42 plugin", "Unknown header.format = 0x{0:X2} value", header.format); @@ -284,7 +304,7 @@ namespace DiscImageChef.ImagePlugins } if(header.fmtByte != kSonyFmtByte400K && header.fmtByte != kSonyFmtByte800K && header.fmtByte != kSonyFmtByte800KIncorrect && - header.fmtByte != kSonyFmtByteProDos && header.fmtByte != kInvalidFmtByte && header.fmtByte != kSigmaFmtByteTwiggy && header.fmtByte != kFmtNotStandard) + header.fmtByte != kSonyFmtByteProDos && header.fmtByte != kInvalidFmtByte && header.fmtByte != kSigmaFmtByteTwiggy && header.fmtByte != kFmtNotStandard && header.fmtByte != kMacOSXFmtByte) { DicConsole.DebugWriteLine("DC42 plugin", "Unknown tmp_header.fmtByte = 0x{0:X2} value", header.fmtByte); @@ -328,7 +348,10 @@ namespace DiscImageChef.ImagePlugins switch(header.format) { case kSonyFormat400K: - ImageInfo.mediaType = MediaType.AppleSonySS; + if(ImageInfo.sectors == 1600) + ImageInfo.mediaType = MediaType.AppleSonyDS; + else + ImageInfo.mediaType = MediaType.AppleSonySS; break; case kSonyFormat800K: ImageInfo.mediaType = MediaType.AppleSonyDS;