diff --git a/DiscImageChef.CommonTypes/MediaType.cs b/DiscImageChef.CommonTypes/MediaType.cs index c83fd0407..a7dce359b 100644 --- a/DiscImageChef.CommonTypes/MediaType.cs +++ b/DiscImageChef.CommonTypes/MediaType.cs @@ -289,6 +289,7 @@ namespace DiscImageChef.CommonTypes #region IBM non standard floppy formats XDF_525, + /// 3.5", DS, HD, 80 tracks, 4 spt, 8192 + 2048 + 1024 + 512 bytes/sector, MFMm track 0 = 19 sectors, 512 bytes/sector, falsified to DOS as 23 spt, 512 bps XDF_35, #endregion IBM non standard floppy formats diff --git a/DiscImageChef.DiscImages/Anex86.cs b/DiscImageChef.DiscImages/Anex86.cs index b7468a87e..b0ed152b5 100644 --- a/DiscImageChef.DiscImages/Anex86.cs +++ b/DiscImageChef.DiscImages/Anex86.cs @@ -264,6 +264,9 @@ namespace DiscImageChef.ImagePlugins ImageInfo.sectors = (ulong)(fdihdr.cylinders * fdihdr.heads * fdihdr.spt); ImageInfo.xmlMediaType = XmlMediaType.BlockMedia; ImageInfo.sectorSize = (uint)fdihdr.bps; + ImageInfo.cylinders = (uint)fdihdr.cylinders; + ImageInfo.heads = (uint)fdihdr.heads; + ImageInfo.sectorsPerTrack = (uint)fdihdr.spt; anexImageFilter = imageFilter; diff --git a/DiscImageChef.DiscImages/Apple2MG.cs b/DiscImageChef.DiscImages/Apple2MG.cs index 4baed2482..ac2c4153e 100644 --- a/DiscImageChef.DiscImages/Apple2MG.cs +++ b/DiscImageChef.DiscImages/Apple2MG.cs @@ -368,7 +368,43 @@ namespace DiscImageChef.ImagePlugins if(!string.IsNullOrEmpty(ImageInfo.imageComments)) DicConsole.VerboseWriteLine("2MG comments: {0}", ImageInfo.imageComments); - return true; + switch(ImageInfo.mediaType) + { + case MediaType.Apple32SS: + ImageInfo.cylinders = 35; + ImageInfo.heads = 1; + ImageInfo.sectorsPerTrack = 13; + break; + case MediaType.Apple32DS: + ImageInfo.cylinders = 35; + ImageInfo.heads = 2; + ImageInfo.sectorsPerTrack = 13; + break; + case MediaType.Apple33SS: + ImageInfo.cylinders = 35; + ImageInfo.heads = 1; + ImageInfo.sectorsPerTrack = 16; + break; + case MediaType.Apple33DS: + ImageInfo.cylinders = 35; + ImageInfo.heads = 2; + ImageInfo.sectorsPerTrack = 16; + break; + case MediaType.AppleSonySS: + ImageInfo.cylinders = 80; + ImageInfo.heads = 1; + // Variable sectors per track, this suffices + ImageInfo.sectorsPerTrack = 10; + break; + case MediaType.AppleSonyDS: + ImageInfo.cylinders = 80; + ImageInfo.heads = 2; + // Variable sectors per track, this suffices + ImageInfo.sectorsPerTrack = 10; + break; + } + + return true; } public override bool ImageHasPartitions() diff --git a/DiscImageChef.DiscImages/AppleDOS.cs b/DiscImageChef.DiscImages/AppleDOS.cs index e4a7539be..99ec7e1c2 100644 --- a/DiscImageChef.DiscImages/AppleDOS.cs +++ b/DiscImageChef.DiscImages/AppleDOS.cs @@ -125,6 +125,9 @@ namespace DiscImageChef.ImagePlugins ImageInfo.sectors = 560; ImageInfo.mediaType = MediaType.Apple33SS; ImageInfo.xmlMediaType = XmlMediaType.BlockMedia; + ImageInfo.cylinders = 35; + ImageInfo.heads = 2; + ImageInfo.sectorsPerTrack = 16; return true; } diff --git a/DiscImageChef.DiscImages/AppleNIB.cs b/DiscImageChef.DiscImages/AppleNIB.cs index 4100acff2..ac7f0de19 100644 --- a/DiscImageChef.DiscImages/AppleNIB.cs +++ b/DiscImageChef.DiscImages/AppleNIB.cs @@ -243,6 +243,19 @@ namespace DiscImageChef.ImagePlugins ImageInfo.sectorSize = 256; ImageInfo.xmlMediaType = XmlMediaType.BlockMedia; ImageInfo.readableSectorTags.Add(SectorTagType.FloppyAddressMark); + switch(ImageInfo.mediaType) + { + case MediaType.Apple32SS: + ImageInfo.cylinders = 35; + ImageInfo.heads = 1; + ImageInfo.sectorsPerTrack = 13; + break; + case MediaType.Apple33SS: + ImageInfo.cylinders = 35; + ImageInfo.heads = 1; + ImageInfo.sectorsPerTrack = 16; + break; + } return true; } diff --git a/DiscImageChef.DiscImages/BLU.cs b/DiscImageChef.DiscImages/BLU.cs index 87f17bf49..2ffcc3b43 100644 --- a/DiscImageChef.DiscImages/BLU.cs +++ b/DiscImageChef.DiscImages/BLU.cs @@ -176,27 +176,43 @@ namespace DiscImageChef.ImagePlugins ImageInfo.mediaType = MediaType.AppleProfile; else ImageInfo.mediaType = MediaType.GENERIC_HDD; - break; + ImageInfo.cylinders = 152; + ImageInfo.heads = 4; + ImageInfo.sectorsPerTrack = 16; + break; case profile10Name: if(ImageInfo.sectors == 0x4C00) ImageInfo.mediaType = MediaType.AppleProfile; else ImageInfo.mediaType = MediaType.GENERIC_HDD; - break; + ImageInfo.cylinders = 304; + ImageInfo.heads = 4; + ImageInfo.sectorsPerTrack = 16; + break; case widgetName: if(ImageInfo.sectors == 0x4C00) ImageInfo.mediaType = MediaType.AppleWidget; else ImageInfo.mediaType = MediaType.GENERIC_HDD; - break; + ImageInfo.cylinders = 304; + ImageInfo.heads = 4; + ImageInfo.sectorsPerTrack = 16; + break; case priamName: if(ImageInfo.sectors == 0x022C7C) ImageInfo.mediaType = MediaType.PriamDataTower; else ImageInfo.mediaType = MediaType.GENERIC_HDD; - break; + // This values are invented... + ImageInfo.cylinders = 419; + ImageInfo.heads = 4; + ImageInfo.sectorsPerTrack = 85; + break; default: ImageInfo.mediaType = MediaType.GENERIC_HDD; + ImageInfo.cylinders = (uint)((ImageInfo.sectors / 16) / 63); + ImageInfo.heads = 16; + ImageInfo.sectorsPerTrack = 63; break; } diff --git a/DiscImageChef.DiscImages/CHD.cs b/DiscImageChef.DiscImages/CHD.cs index 08b3cd998..5601257a0 100644 --- a/DiscImageChef.DiscImages/CHD.cs +++ b/DiscImageChef.DiscImages/CHD.cs @@ -713,6 +713,10 @@ namespace DiscImageChef.ImagePlugins mapVersion = 1; isHdd = true; + ImageInfo.cylinders = hdrV1.cylinders; + ImageInfo.heads = hdrV1.heads; + ImageInfo.sectorsPerTrack = hdrV1.sectors; + break; } case 2: @@ -775,6 +779,10 @@ namespace DiscImageChef.ImagePlugins mapVersion = 1; isHdd = true; + ImageInfo.cylinders = hdrV2.cylinders; + ImageInfo.heads = hdrV2.heads; + ImageInfo.sectorsPerTrack = hdrV2.sectors; + break; } case 3: @@ -967,6 +975,9 @@ namespace DiscImageChef.ImagePlugins { isHdd = true; ImageInfo.sectorSize = uint.Parse(gdddMatch.Groups["bps"].Value); + ImageInfo.cylinders = uint.Parse(gdddMatch.Groups["cylinders"].Value); + ImageInfo.heads = uint.Parse(gdddMatch.Groups["heads"].Value); + ImageInfo.sectorsPerTrack = uint.Parse(gdddMatch.Groups["sectors"].Value); } break; // "CHCD" @@ -1417,6 +1428,18 @@ namespace DiscImageChef.ImagePlugins ImageInfo.driveModel = idnt.Value.Model; ImageInfo.driveSerialNumber = idnt.Value.SerialNumber; ImageInfo.driveFirmwareRevision = idnt.Value.FirmwareRevision; + if(idnt.Value.CurrentCylinders > 0 && idnt.Value.CurrentHeads > 0 && idnt.Value.CurrentSectorsPerTrack > 0) + { + ImageInfo.cylinders = idnt.Value.CurrentCylinders; + ImageInfo.heads = idnt.Value.CurrentHeads; + ImageInfo.sectorsPerTrack = idnt.Value.CurrentSectorsPerTrack; + } + else + { + ImageInfo.cylinders = idnt.Value.Cylinders; + ImageInfo.heads = idnt.Value.Heads; + ImageInfo.sectorsPerTrack = idnt.Value.SectorsPerTrack; + } } identify = meta; if(!ImageInfo.readableMediaTags.Contains(MediaTagType.ATA_IDENTIFY)) diff --git a/DiscImageChef.DiscImages/CPCDSK.cs b/DiscImageChef.DiscImages/CPCDSK.cs index 09e54c62d..e131febd1 100644 --- a/DiscImageChef.DiscImages/CPCDSK.cs +++ b/DiscImageChef.DiscImages/CPCDSK.cs @@ -429,8 +429,8 @@ namespace DiscImageChef.ImagePlugins ImageInfo.mediaType = MediaType.CompactFloppy; ImageInfo.readableSectorTags.Add(SectorTagType.FloppyAddressMark); - // Debug writing full disk as raw - /* + // Debug writing full disk as raw + /* FileStream foo = new FileStream(Path.GetFileNameWithoutExtension(imagePath) + ".bin", FileMode.Create); for(ulong i = 0; i < (ulong)sectors.Count; i++) { @@ -441,7 +441,11 @@ namespace DiscImageChef.ImagePlugins foo.Close(); */ - return true; + ImageInfo.cylinders = header.tracks; + ImageInfo.heads = header.sides; + ImageInfo.sectors = ImageInfo.sectors / (uint)(header.tracks * header.sides); + + return true; } static int SizeCodeToBytes(IBMSectorSizeCode code) diff --git a/DiscImageChef.DiscImages/CopyQM.cs b/DiscImageChef.DiscImages/CopyQM.cs index bab92af58..db9656524 100644 --- a/DiscImageChef.DiscImages/CopyQM.cs +++ b/DiscImageChef.DiscImages/CopyQM.cs @@ -410,6 +410,10 @@ namespace DiscImageChef.ImagePlugins if(!string.IsNullOrEmpty(ImageInfo.imageComments)) DicConsole.VerboseWriteLine("CopyQM comments: {0}", ImageInfo.imageComments); + ImageInfo.heads = header.heads; + ImageInfo.cylinders = header.imageCylinders; + ImageInfo.sectorsPerTrack = header.sectorsPerTrack; + return true; } diff --git a/DiscImageChef.DiscImages/D88.cs b/DiscImageChef.DiscImages/D88.cs index d92d9adff..1a28fd6da 100644 --- a/DiscImageChef.DiscImages/D88.cs +++ b/DiscImageChef.DiscImages/D88.cs @@ -490,6 +490,76 @@ namespace DiscImageChef.ImagePlugins ImageInfo.xmlMediaType = XmlMediaType.BlockMedia; ImageInfo.sectorSize = (uint)(128 << (int)bps); + switch(ImageInfo.mediaType) + { + case MediaType.NEC_525_SS: + ImageInfo.cylinders = 80; + ImageInfo.heads = 1; + ImageInfo.sectorsPerTrack = 16; + break; + case MediaType.NEC_8_SD: + case MediaType.NEC_8_DD: + ImageInfo.cylinders = 77; + ImageInfo.heads = 2; + ImageInfo.sectorsPerTrack = 26; + break; + case MediaType.NEC_525_DS: + ImageInfo.cylinders = 80; + ImageInfo.heads = 2; + ImageInfo.sectorsPerTrack = 16; + break; + case MediaType.NEC_525_HD: + ImageInfo.cylinders = 77; + ImageInfo.heads = 2; + ImageInfo.sectorsPerTrack = 8; + break; + case MediaType.DOS_525_SS_DD_8: + ImageInfo.cylinders = 40; + ImageInfo.heads = 1; + ImageInfo.sectorsPerTrack = 8; + break; + case MediaType.DOS_525_SS_DD_9: + ImageInfo.cylinders = 40; + ImageInfo.heads = 1; + ImageInfo.sectorsPerTrack = 9; + break; + case MediaType.DOS_525_DS_DD_8: + ImageInfo.cylinders = 40; + ImageInfo.heads = 2; + ImageInfo.sectorsPerTrack = 8; + break; + case MediaType.DOS_525_DS_DD_9: + ImageInfo.cylinders = 40; + ImageInfo.heads = 2; + ImageInfo.sectorsPerTrack = 9; + break; + case MediaType.NEC_35_HD_15: + ImageInfo.cylinders = 80; + ImageInfo.heads = 2; + ImageInfo.sectorsPerTrack = 15; + break; + case MediaType.DOS_35_DS_DD_9: + ImageInfo.cylinders = 80; + ImageInfo.heads = 2; + ImageInfo.sectorsPerTrack = 9; + break; + case MediaType.DOS_35_HD: + ImageInfo.cylinders = 80; + ImageInfo.heads = 2; + ImageInfo.sectorsPerTrack = 18; + break; + case MediaType.DOS_35_ED: + ImageInfo.cylinders = 80; + ImageInfo.heads = 2; + ImageInfo.sectorsPerTrack = 36; + break; + case MediaType.NEC_35_TD: + ImageInfo.cylinders = 240; + ImageInfo.heads = 2; + ImageInfo.sectorsPerTrack = 38; + break; + } + return true; } diff --git a/DiscImageChef.DiscImages/DART.cs b/DiscImageChef.DiscImages/DART.cs index 3fa52cdaf..5e47f1e43 100644 --- a/DiscImageChef.DiscImages/DART.cs +++ b/DiscImageChef.DiscImages/DART.cs @@ -157,7 +157,7 @@ namespace DiscImageChef.DiscImages return false; break; case kAppleIIDisk: - if(header.srcSize != kAppleIIDisk) + if(header.srcSize != kApple800KSize) return false; break; case kMacHiDDisk: @@ -395,13 +395,41 @@ namespace DiscImageChef.DiscImages ImageInfo.imageName = Path.GetFileNameWithoutExtension(imageFilter.GetFilename()); ImageInfo.sectorSize = sectorSize; ImageInfo.xmlMediaType = XmlMediaType.BlockMedia; - ImageInfo.mediaType = MediaType.GENERIC_HDD; ImageInfo.imageSize = ImageInfo.sectors * sectorSize; if(header.srcCmp == kNoCompress) ImageInfo.imageVersion = "1.4"; else ImageInfo.imageVersion = "1.5"; + switch(header.srcSize) + { + case kMac400KSize: + ImageInfo.cylinders = 80; + ImageInfo.heads = 1; + ImageInfo.sectorsPerTrack = 10; + ImageInfo.mediaType = MediaType.AppleSonySS; + break; + case kMac800KSize: + ImageInfo.cylinders = 80; + ImageInfo.heads = 2; + ImageInfo.sectorsPerTrack = 10; + ImageInfo.mediaType = MediaType.AppleSonyDS; + break; + case kMSDOS720KSize: + ImageInfo.cylinders = 80; + ImageInfo.heads = 2; + ImageInfo.sectorsPerTrack = 9; + ImageInfo.mediaType = MediaType.DOS_35_DS_DD_9; + break; + case kMac1440KSize: + ImageInfo.cylinders = 80; + ImageInfo.heads = 2; + ImageInfo.sectorsPerTrack = 18; + ImageInfo.mediaType = MediaType.DOS_35_HD; + break; + } + + return true; } diff --git a/DiscImageChef.DiscImages/DIM.cs b/DiscImageChef.DiscImages/DIM.cs index b11eadf6b..73d3b2d60 100644 --- a/DiscImageChef.DiscImages/DIM.cs +++ b/DiscImageChef.DiscImages/DIM.cs @@ -238,7 +238,42 @@ namespace DiscImageChef.ImagePlugins ImageInfo.imageComments = StringHandlers.CToString(comment, Encoding.GetEncoding(932)); ImageInfo.xmlMediaType = XmlMediaType.BlockMedia; - return true; + switch(ImageInfo.mediaType) + { + case MediaType.SHARP_525: + ImageInfo.cylinders = 77; + ImageInfo.heads = 2; + ImageInfo.sectorsPerTrack = 8; + break; + case MediaType.SHARP_525_9: + ImageInfo.cylinders = 80; + ImageInfo.heads = 2; + ImageInfo.sectorsPerTrack = 9; + break; + case MediaType.DOS_525_HD: + ImageInfo.cylinders = 80; + ImageInfo.heads = 2; + ImageInfo.sectorsPerTrack = 15; + break; + case MediaType.SHARP_35_9: + ImageInfo.cylinders = 80; + ImageInfo.heads = 2; + ImageInfo.sectorsPerTrack = 9; + break; + case MediaType.DOS_35_HD: + ImageInfo.cylinders = 80; + ImageInfo.heads = 2; + ImageInfo.sectorsPerTrack = 18; + break; + case MediaType.NEC_8_DD: + case MediaType.NEC_8_SD: + ImageInfo.cylinders = 77; + ImageInfo.heads = 2; + ImageInfo.sectorsPerTrack = 26; + break; + } + + return true; } public override bool ImageHasPartitions() diff --git a/DiscImageChef.DiscImages/DiskCopy42.cs b/DiscImageChef.DiscImages/DiskCopy42.cs index b35b7e50b..61fd758a5 100644 --- a/DiscImageChef.DiscImages/DiskCopy42.cs +++ b/DiscImageChef.DiscImages/DiskCopy42.cs @@ -516,7 +516,65 @@ namespace DiscImageChef.ImagePlugins ImageInfo.xmlMediaType = XmlMediaType.BlockMedia; DicConsole.VerboseWriteLine("DiskCopy 4.2 image contains a disk of type {0}", ImageInfo.mediaType); - return true; + switch(ImageInfo.mediaType) + { + case MediaType.AppleSonySS: + ImageInfo.cylinders = 80; + ImageInfo.heads = 1; + ImageInfo.sectorsPerTrack = 10; + break; + case MediaType.AppleSonyDS: + ImageInfo.cylinders = 80; + ImageInfo.heads = 2; + ImageInfo.sectorsPerTrack = 10; + break; + case MediaType.DOS_35_DS_DD_9: + ImageInfo.cylinders = 80; + ImageInfo.heads = 2; + ImageInfo.sectorsPerTrack = 9; + break; + case MediaType.DOS_35_HD: + ImageInfo.cylinders = 80; + ImageInfo.heads = 2; + ImageInfo.sectorsPerTrack = 18; + break; + case MediaType.DMF: + ImageInfo.cylinders = 80; + ImageInfo.heads = 2; + ImageInfo.sectorsPerTrack = 21; + break; + case MediaType.AppleProfile: + switch(ImageInfo.sectors) + { + case 9728: + ImageInfo.cylinders = 152; + break; + case 19456: + ImageInfo.cylinders = 304; + break; + } + ImageInfo.heads = 4; + ImageInfo.sectorsPerTrack = 16; + break; + case MediaType.AppleWidget: + ImageInfo.cylinders = 608; + ImageInfo.heads = 2; + ImageInfo.sectorsPerTrack = 16; + break; + case MediaType.AppleHD20: + ImageInfo.cylinders = 610; + ImageInfo.heads = 2; + ImageInfo.sectorsPerTrack = 16; + break; + default: + ImageInfo.cylinders = (uint)((ImageInfo.sectors / 16) / 63); + ImageInfo.heads = 16; + ImageInfo.sectorsPerTrack = 63; + break; + } + + + return true; } public override bool? VerifySector(ulong sectorAddress) diff --git a/DiscImageChef.DiscImages/ImageInfo.cs b/DiscImageChef.DiscImages/ImageInfo.cs index 45a167ab1..cff086f72 100644 --- a/DiscImageChef.DiscImages/ImageInfo.cs +++ b/DiscImageChef.DiscImages/ImageInfo.cs @@ -66,6 +66,10 @@ namespace DiscImageChef.ImagePlugins public string driveSerialNumber; public string driveFirmwareRevision; public XmlMediaType xmlMediaType; + // CHS geometry... + public uint cylinders; + public uint heads; + public uint sectorsPerTrack; } } diff --git a/DiscImageChef.DiscImages/NDIF.cs b/DiscImageChef.DiscImages/NDIF.cs index 8b14188d0..dbdd1693a 100644 --- a/DiscImageChef.DiscImages/NDIF.cs +++ b/DiscImageChef.DiscImages/NDIF.cs @@ -451,6 +451,36 @@ namespace DiscImageChef.DiscImages ImageInfo.imageApplicationVersion = "6"; ImageInfo.imageApplication = "Apple DiskCopy"; + switch(ImageInfo.mediaType) + { + case MediaType.AppleSonyDS: + ImageInfo.cylinders = 80; + ImageInfo.heads = 2; + ImageInfo.sectorsPerTrack = 10; + break; + case MediaType.DOS_35_DS_DD_9: + ImageInfo.cylinders = 80; + ImageInfo.heads = 2; + ImageInfo.sectorsPerTrack = 9; + break; + case MediaType.DOS_35_HD: + ImageInfo.cylinders = 80; + ImageInfo.heads = 2; + ImageInfo.sectorsPerTrack = 18; + break; + case MediaType.DMF: + ImageInfo.cylinders = 80; + ImageInfo.heads = 2; + ImageInfo.sectorsPerTrack = 21; + break; + default: + ImageInfo.mediaType = MediaType.GENERIC_HDD; + ImageInfo.cylinders = (uint)((ImageInfo.sectors / 16) / 63); + ImageInfo.heads = 16; + ImageInfo.sectorsPerTrack = 63; + break; + } + return true; } diff --git a/DiscImageChef.DiscImages/Parallels.cs b/DiscImageChef.DiscImages/Parallels.cs index 1f92abdd7..732afd698 100644 --- a/DiscImageChef.DiscImages/Parallels.cs +++ b/DiscImageChef.DiscImages/Parallels.cs @@ -269,7 +269,11 @@ namespace DiscImageChef.DiscImages sectorCache.Add(sectorAddress, sector); - return sector; + ImageInfo.cylinders = pHdr.cylinders; + ImageInfo.heads = pHdr.heads; + ImageInfo.sectorsPerTrack = (uint)((pHdr.sectors / pHdr.heads) / pHdr.cylinders); + + return sector; } public override byte[] ReadSectors(ulong sectorAddress, uint length) diff --git a/DiscImageChef.DiscImages/QCOW.cs b/DiscImageChef.DiscImages/QCOW.cs index 95bebbea2..e95724721 100644 --- a/DiscImageChef.DiscImages/QCOW.cs +++ b/DiscImageChef.DiscImages/QCOW.cs @@ -293,7 +293,11 @@ namespace DiscImageChef.ImagePlugins ImageInfo.mediaType = MediaType.GENERIC_HDD; ImageInfo.imageSize = qHdr.size; - return true; + ImageInfo.cylinders = (uint)((ImageInfo.sectors / 16) / 63); + ImageInfo.heads = 16; + ImageInfo.sectorsPerTrack = 63; + + return true; } public override byte[] ReadSector(ulong sectorAddress) diff --git a/DiscImageChef.DiscImages/QCOW2.cs b/DiscImageChef.DiscImages/QCOW2.cs index c93f0e0a8..f414f8101 100644 --- a/DiscImageChef.DiscImages/QCOW2.cs +++ b/DiscImageChef.DiscImages/QCOW2.cs @@ -336,7 +336,11 @@ namespace DiscImageChef.ImagePlugins ImageInfo.imageSize = qHdr.size; ImageInfo.imageVersion = string.Format("{0}", qHdr.version); - return true; + ImageInfo.cylinders = (uint)((ImageInfo.sectors / 16) / 63); + ImageInfo.heads = 16; + ImageInfo.sectorsPerTrack = 63; + + return true; } public override byte[] ReadSector(ulong sectorAddress) diff --git a/DiscImageChef.DiscImages/QED.cs b/DiscImageChef.DiscImages/QED.cs index 50a7e3772..028b22ca6 100644 --- a/DiscImageChef.DiscImages/QED.cs +++ b/DiscImageChef.DiscImages/QED.cs @@ -299,7 +299,11 @@ namespace DiscImageChef.ImagePlugins ImageInfo.mediaType = MediaType.GENERIC_HDD; ImageInfo.imageSize = qHdr.image_size; - return true; + ImageInfo.cylinders = (uint)((ImageInfo.sectors / 16) / 63); + ImageInfo.heads = 16; + ImageInfo.sectorsPerTrack = 63; + + return true; } public override byte[] ReadSector(ulong sectorAddress) diff --git a/DiscImageChef.DiscImages/SaveDskF.cs b/DiscImageChef.DiscImages/SaveDskF.cs index a9ef5f0c7..f6daa559e 100644 --- a/DiscImageChef.DiscImages/SaveDskF.cs +++ b/DiscImageChef.DiscImages/SaveDskF.cs @@ -311,6 +311,10 @@ namespace DiscImageChef.ImagePlugins decodedDisk = new byte[ImageInfo.sectors * ImageInfo.sectorSize]; stream.Read(decodedDisk, 0, (int)(stream.Length - header.dataOffset)); + ImageInfo.cylinders = header.cylinders; + ImageInfo.heads = header.heads; + ImageInfo.sectorsPerTrack = header.sectorsPerTrack; + return true; } diff --git a/DiscImageChef.DiscImages/TeleDisk.cs b/DiscImageChef.DiscImages/TeleDisk.cs index a86e42f0f..2f17599ae 100644 --- a/DiscImageChef.DiscImages/TeleDisk.cs +++ b/DiscImageChef.DiscImages/TeleDisk.cs @@ -579,6 +579,10 @@ namespace DiscImageChef.ImagePlugins if(!string.IsNullOrEmpty(ImageInfo.imageComments)) DicConsole.VerboseWriteLine("TeleDisk comments: {0}", ImageInfo.imageComments); + ImageInfo.heads = header.sides; + ImageInfo.sectorsPerTrack = spt; + ImageInfo.cylinders = (uint)((ImageInfo.sectors / header.sides) / spt); + return true; } diff --git a/DiscImageChef.DiscImages/UDIF.cs b/DiscImageChef.DiscImages/UDIF.cs index 8b40641e7..3016e9796 100644 --- a/DiscImageChef.DiscImages/UDIF.cs +++ b/DiscImageChef.DiscImages/UDIF.cs @@ -511,6 +511,10 @@ namespace DiscImageChef.DiscImages ImageInfo.imageSize = ImageInfo.sectors * sectorSize; ImageInfo.imageVersion = string.Format("{0}", footer.version); + ImageInfo.cylinders = (uint)((ImageInfo.sectors / 16) / 63); + ImageInfo.heads = 16; + ImageInfo.sectorsPerTrack = 63; + return true; } diff --git a/DiscImageChef.DiscImages/VDI.cs b/DiscImageChef.DiscImages/VDI.cs index 2f2e5ad4f..c41cd7166 100644 --- a/DiscImageChef.DiscImages/VDI.cs +++ b/DiscImageChef.DiscImages/VDI.cs @@ -235,7 +235,11 @@ namespace DiscImageChef.DiscImages } imageStream = stream; - return true; + ImageInfo.cylinders = vHdr.cylinders; + ImageInfo.heads = vHdr.heads; + ImageInfo.sectorsPerTrack = vHdr.spt; + + return true; } public override byte[] ReadSector(ulong sectorAddress) diff --git a/DiscImageChef.DiscImages/VHD.cs b/DiscImageChef.DiscImages/VHD.cs index 211c459c6..e1bb41c7e 100644 --- a/DiscImageChef.DiscImages/VHD.cs +++ b/DiscImageChef.DiscImages/VHD.cs @@ -632,7 +632,11 @@ namespace DiscImageChef.ImagePlugins ImageInfo.imageLastModificationTime = thisDateTime; ImageInfo.imageName = Path.GetFileNameWithoutExtension(imageFilter.GetFilename()); - if(thisFooter.diskType == typeDynamic || thisFooter.diskType == typeDifferencing) + ImageInfo.cylinders = (thisFooter.diskGeometry & 0xFFFF0000) >> 16; + ImageInfo.heads = (thisFooter.diskGeometry & 0xFF00) >> 8; + ImageInfo.sectorsPerTrack = (thisFooter.diskGeometry & 0xFF); + + if(thisFooter.diskType == typeDynamic || thisFooter.diskType == typeDifferencing) { imageStream.Seek((long)thisFooter.offset, SeekOrigin.Begin); byte[] dynamicBytes = new byte[1024]; diff --git a/DiscImageChef.DiscImages/VHDX.cs b/DiscImageChef.DiscImages/VHDX.cs index f86c23c6d..e5656fd20 100644 --- a/DiscImageChef.DiscImages/VHDX.cs +++ b/DiscImageChef.DiscImages/VHDX.cs @@ -757,9 +757,13 @@ namespace DiscImageChef.ImagePlugins ImageInfo.sectors = ImageInfo.imageSize / ImageInfo.sectorSize; ImageInfo.driveSerialNumber = Page83Data.ToString(); - // TODO: Separate image application from version, need several samples. + // TODO: Separate image application from version, need several samples. - return true; + ImageInfo.cylinders = (uint)((ImageInfo.sectors / 16) / 63); + ImageInfo.heads = 16; + ImageInfo.sectorsPerTrack = 63; + + return true; } bool CheckBitmap(ulong sectorAddress) diff --git a/DiscImageChef.DiscImages/VMware.cs b/DiscImageChef.DiscImages/VMware.cs index b5b6e94a2..8130d5729 100644 --- a/DiscImageChef.DiscImages/VMware.cs +++ b/DiscImageChef.DiscImages/VMware.cs @@ -329,7 +329,9 @@ namespace DiscImageChef.DiscImages FiltersList filtersList = new FiltersList(); - if(cowD) + bool matchedCyls = false, matchedHds = false, matchedSpt = false; + + if(cowD) { int cowCount = 1; string basePath = Path.GetFileNameWithoutExtension(imageFilter.GetBasePath()); @@ -374,7 +376,7 @@ namespace DiscImageChef.DiscImages extents.Add(currentSector, newExtent); currentSector += newExtent.sectors; - } + } else break; @@ -393,15 +395,21 @@ namespace DiscImageChef.DiscImages Regex RegexType = new Regex(TypeRegEx); Regex RegexExtent = new Regex(ExtentRegEx); Regex RegexParent = new Regex(ParentRegEx); + Regex RegexCylinders = new Regex(DDBCylindersRegEx); + Regex RegexHeads = new Regex(DDBHeadsRegex); + Regex RegexSectors = new Regex(DDBSectorsRegEx); - Match MatchVersion; + Match MatchVersion; Match MatchCid; Match MatchParentCid; Match MatchType; Match MatchExtent; Match MatchParent; + Match MatchCylinders; + Match MatchHeads; + Match MatchSectors; - StreamReader ddfStreamRdr = new StreamReader(ddfStream); + StreamReader ddfStreamRdr = new StreamReader(ddfStream); while(ddfStreamRdr.Peek() >= 0) { @@ -413,50 +421,68 @@ namespace DiscImageChef.DiscImages MatchType = RegexType.Match(_line); MatchExtent = RegexExtent.Match(_line); MatchParent = RegexParent.Match(_line); + MatchCylinders = RegexCylinders.Match(_line); + MatchHeads = RegexHeads.Match(_line); + MatchSectors = RegexSectors.Match(_line); - if(MatchVersion.Success) - { - uint.TryParse(MatchVersion.Groups["version"].Value, out version); - DicConsole.DebugWriteLine("VMware plugin", "version = {0}", version); - } - else if(MatchCid.Success) - { - cid = Convert.ToUInt32(MatchCid.Groups["cid"].Value, 16); - DicConsole.DebugWriteLine("VMware plugin", "cid = {0:x8}", cid); - } - else if(MatchParentCid.Success) - { - parentCid = Convert.ToUInt32(MatchParentCid.Groups["cid"].Value, 16); - DicConsole.DebugWriteLine("VMware plugin", "parentCID = {0:x8}", parentCid); - } - else if(MatchType.Success) - { - imageType = MatchType.Groups["type"].Value; - DicConsole.DebugWriteLine("VMware plugin", "createType = \"{0}\"", imageType); - } - else if(MatchExtent.Success) - { - VMwareExtent newExtent = new VMwareExtent(); - newExtent.access = MatchExtent.Groups["access"].Value; - if(!embedded) - newExtent.filter = filtersList.GetFilter(Path.Combine(Path.GetDirectoryName(imageFilter.GetBasePath()), MatchExtent.Groups["filename"].Value)); - else - newExtent.filter = imageFilter; - uint.TryParse(MatchExtent.Groups["offset"].Value, out newExtent.offset); - uint.TryParse(MatchExtent.Groups["sectors"].Value, out newExtent.sectors); - newExtent.type = MatchExtent.Groups["type"].Value; - DicConsole.DebugWriteLine("VMware plugin", "{0} {1} {2} \"{3}\" {4}", newExtent.access, newExtent.sectors, newExtent.type, newExtent.filter, newExtent.offset); + if(MatchVersion.Success) + { + uint.TryParse(MatchVersion.Groups["version"].Value, out version); + DicConsole.DebugWriteLine("VMware plugin", "version = {0}", version); + } + else if(MatchCid.Success) + { + cid = Convert.ToUInt32(MatchCid.Groups["cid"].Value, 16); + DicConsole.DebugWriteLine("VMware plugin", "cid = {0:x8}", cid); + } + else if(MatchParentCid.Success) + { + parentCid = Convert.ToUInt32(MatchParentCid.Groups["cid"].Value, 16); + DicConsole.DebugWriteLine("VMware plugin", "parentCID = {0:x8}", parentCid); + } + else if(MatchType.Success) + { + imageType = MatchType.Groups["type"].Value; + DicConsole.DebugWriteLine("VMware plugin", "createType = \"{0}\"", imageType); + } + else if(MatchExtent.Success) + { + VMwareExtent newExtent = new VMwareExtent(); + newExtent.access = MatchExtent.Groups["access"].Value; + if(!embedded) + newExtent.filter = filtersList.GetFilter(Path.Combine(Path.GetDirectoryName(imageFilter.GetBasePath()), MatchExtent.Groups["filename"].Value)); + else + newExtent.filter = imageFilter; + uint.TryParse(MatchExtent.Groups["offset"].Value, out newExtent.offset); + uint.TryParse(MatchExtent.Groups["sectors"].Value, out newExtent.sectors); + newExtent.type = MatchExtent.Groups["type"].Value; + DicConsole.DebugWriteLine("VMware plugin", "{0} {1} {2} \"{3}\" {4}", newExtent.access, newExtent.sectors, newExtent.type, newExtent.filter, newExtent.offset); - extents.Add(currentSector, newExtent); - currentSector += newExtent.sectors; - } - else if(MatchParent.Success) - { - parentName = MatchParent.Groups["filename"].Value; - DicConsole.DebugWriteLine("VMware plugin", "parentFileNameHint = \"{0}\"", parentName); - hasParent = true; - } - } + extents.Add(currentSector, newExtent); + currentSector += newExtent.sectors; + } + else if(MatchParent.Success) + { + parentName = MatchParent.Groups["filename"].Value; + DicConsole.DebugWriteLine("VMware plugin", "parentFileNameHint = \"{0}\"", parentName); + hasParent = true; + } + else if(MatchCylinders.Success) + { + uint.TryParse(MatchCylinders.Groups["cylinders"].Value, out ImageInfo.cylinders); + matchedCyls = true; + } + else if(MatchHeads.Success) + { + uint.TryParse(MatchHeads.Groups["heads"].Value, out ImageInfo.heads); + matchedHds = true; + } + else if(MatchSectors.Success) + { + uint.TryParse(MatchSectors.Groups["sectors"].Value, out ImageInfo.sectorsPerTrack); + matchedSpt = true; + } + } } if(extents.Count == 0) @@ -671,7 +697,20 @@ namespace DiscImageChef.DiscImages else ImageInfo.imageVersion = string.Format("{0}", version + 3); - return true; + if(cowD) + { + ImageInfo.cylinders = vmCHdr.cylinders; + ImageInfo.heads = vmCHdr.heads; + ImageInfo.sectorsPerTrack = vmCHdr.spt; + } + else if(!matchedCyls || !matchedHds || !matchedSpt) + { + ImageInfo.cylinders = (uint)((ImageInfo.sectors / 16) / 63); + ImageInfo.heads = 16; + ImageInfo.sectorsPerTrack = 63; + } + + return true; } public override byte[] ReadSector(ulong sectorAddress) diff --git a/DiscImageChef.DiscImages/ZZZRawImage.cs b/DiscImageChef.DiscImages/ZZZRawImage.cs index c795f7e10..537cf823a 100644 --- a/DiscImageChef.DiscImages/ZZZRawImage.cs +++ b/DiscImageChef.DiscImages/ZZZRawImage.cs @@ -325,6 +325,311 @@ namespace DiscImageChef.ImagePlugins DicConsole.VerboseWriteLine("Raw disk image contains a disk of type {0}", ImageInfo.mediaType); + switch(ImageInfo.mediaType) + { + case MediaType.ACORN_35_DS_DD: + ImageInfo.cylinders = 80; + ImageInfo.heads = 2; + ImageInfo.sectorsPerTrack = 5; + break; + case MediaType.ACORN_35_DS_HD: + ImageInfo.cylinders = 80; + ImageInfo.heads = 2; + ImageInfo.sectorsPerTrack = 10; + break; + case MediaType.ACORN_525_DS_DD: + ImageInfo.cylinders = 80; + ImageInfo.heads = 2; + ImageInfo.sectorsPerTrack = 16; + break; + case MediaType.ACORN_525_SS_DD_40: + ImageInfo.cylinders = 40; + ImageInfo.heads = 1; + ImageInfo.sectorsPerTrack = 16; + break; + case MediaType.ACORN_525_SS_DD_80: + ImageInfo.cylinders = 80; + ImageInfo.heads = 1; + ImageInfo.sectorsPerTrack = 16; + break; + case MediaType.ACORN_525_SS_SD_40: + ImageInfo.cylinders = 40; + ImageInfo.heads = 1; + ImageInfo.sectorsPerTrack = 10; + break; + case MediaType.ACORN_525_SS_SD_80: + ImageInfo.cylinders = 80; + ImageInfo.heads = 1; + ImageInfo.sectorsPerTrack = 10; + break; + case MediaType.Apple32DS: + ImageInfo.cylinders = 35; + ImageInfo.heads = 2; + ImageInfo.sectorsPerTrack = 13; + break; + case MediaType.Apple32SS: + ImageInfo.cylinders = 36; + ImageInfo.heads = 1; + ImageInfo.sectorsPerTrack = 13; + break; + case MediaType.Apple33DS: + ImageInfo.cylinders = 35; + ImageInfo.heads = 2; + ImageInfo.sectorsPerTrack = 16; + break; + case MediaType.Apple33SS: + ImageInfo.cylinders = 35; + ImageInfo.heads = 2; + ImageInfo.sectorsPerTrack = 16; + break; + case MediaType.AppleSonyDS: + ImageInfo.cylinders = 80; + ImageInfo.heads = 2; + ImageInfo.sectorsPerTrack = 10; + break; + case MediaType.AppleSonySS: + ImageInfo.cylinders = 80; + ImageInfo.heads = 1; + ImageInfo.sectorsPerTrack = 10; + break; + case MediaType.ATARI_35_DS_DD: + ImageInfo.cylinders = 80; + ImageInfo.heads = 2; + ImageInfo.sectorsPerTrack = 10; + break; + case MediaType.ATARI_35_DS_DD_11: + ImageInfo.cylinders = 80; + ImageInfo.heads = 2; + ImageInfo.sectorsPerTrack = 11; + break; + case MediaType.ATARI_35_SS_DD: + ImageInfo.cylinders = 80; + ImageInfo.heads = 1; + ImageInfo.sectorsPerTrack = 10; + break; + case MediaType.ATARI_35_SS_DD_11: + ImageInfo.cylinders = 80; + ImageInfo.heads = 1; + ImageInfo.sectorsPerTrack = 11; + break; + case MediaType.ATARI_525_ED: + ImageInfo.cylinders = 40; + ImageInfo.heads = 1; + ImageInfo.sectorsPerTrack = 26; + break; + case MediaType.ATARI_525_SD: + ImageInfo.cylinders = 40; + ImageInfo.heads = 1; + ImageInfo.sectorsPerTrack = 18; + break; + case MediaType.CBM_35_DD: + ImageInfo.cylinders = 80; + ImageInfo.heads = 2; + ImageInfo.sectorsPerTrack = 10; + break; + case MediaType.CBM_AMIGA_35_DD: + ImageInfo.cylinders = 80; + ImageInfo.heads = 2; + ImageInfo.sectorsPerTrack = 11; + break; + case MediaType.CBM_AMIGA_35_HD: + ImageInfo.cylinders = 80; + ImageInfo.heads = 2; + ImageInfo.sectorsPerTrack = 22; + break; + case MediaType.DMF: + ImageInfo.cylinders = 80; + ImageInfo.heads = 2; + ImageInfo.sectorsPerTrack = 21; + break; + case MediaType.DOS_35_DS_DD_9: + ImageInfo.cylinders = 80; + ImageInfo.heads = 2; + ImageInfo.sectorsPerTrack = 9; + break; + case MediaType.DOS_35_ED: + ImageInfo.cylinders = 80; + ImageInfo.heads = 2; + ImageInfo.sectorsPerTrack = 36; + break; + case MediaType.DOS_35_HD: + ImageInfo.cylinders = 80; + ImageInfo.heads = 2; + ImageInfo.sectorsPerTrack = 18; + break; + case MediaType.DOS_35_SS_DD_9: + ImageInfo.cylinders = 80; + ImageInfo.heads = 1; + ImageInfo.sectorsPerTrack = 9; + break; + case MediaType.DOS_525_DS_DD_8: + ImageInfo.cylinders = 40; + ImageInfo.heads = 2; + ImageInfo.sectorsPerTrack = 8; + break; + case MediaType.DOS_525_DS_DD_9: + ImageInfo.cylinders = 40; + ImageInfo.heads = 2; + ImageInfo.sectorsPerTrack = 9; + break; + case MediaType.DOS_525_HD: + ImageInfo.cylinders = 80; + ImageInfo.heads = 2; + ImageInfo.sectorsPerTrack = 15; + break; + case MediaType.DOS_525_SS_DD_8: + ImageInfo.cylinders = 40; + ImageInfo.heads = 1; + ImageInfo.sectorsPerTrack = 8; + break; + case MediaType.DOS_525_SS_DD_9: + ImageInfo.cylinders = 40; + ImageInfo.heads = 1; + ImageInfo.sectorsPerTrack = 9; + break; + case MediaType.ECMA_54: + ImageInfo.cylinders = 77; + ImageInfo.heads = 1; + ImageInfo.sectorsPerTrack = 26; + break; + case MediaType.ECMA_59: + ImageInfo.cylinders = 77; + ImageInfo.heads = 2; + ImageInfo.sectorsPerTrack = 26; + break; + case MediaType.ECMA_66: + ImageInfo.cylinders = 35; + ImageInfo.heads = 1; + ImageInfo.sectorsPerTrack = 9; + break; + case MediaType.ECMA_69_8: + ImageInfo.cylinders = 77; + ImageInfo.heads = 2; + ImageInfo.sectorsPerTrack = 8; + break; + case MediaType.ECMA_70: + ImageInfo.cylinders = 40; + ImageInfo.heads = 2; + ImageInfo.sectorsPerTrack = 16; + break; + case MediaType.ECMA_78: + ImageInfo.cylinders = 80; + ImageInfo.heads = 2; + ImageInfo.sectorsPerTrack = 16; + break; + case MediaType.ECMA_99_15: + ImageInfo.cylinders = 77; + ImageInfo.heads = 2; + ImageInfo.sectorsPerTrack = 15; + break; + case MediaType.ECMA_99_26: + ImageInfo.cylinders = 77; + ImageInfo.heads = 2; + ImageInfo.sectorsPerTrack = 26; + break; + case MediaType.ECMA_99_8: + ImageInfo.cylinders = 80; + ImageInfo.heads = 2; + ImageInfo.sectorsPerTrack = 8; + break; + case MediaType.FDFORMAT_35_DD: + ImageInfo.cylinders = 82; + ImageInfo.heads = 2; + ImageInfo.sectorsPerTrack = 10; + break; + case MediaType.FDFORMAT_35_HD: + ImageInfo.cylinders = 82; + ImageInfo.heads = 2; + ImageInfo.sectorsPerTrack = 21; + break; + case MediaType.FDFORMAT_525_HD: + ImageInfo.cylinders = 82; + ImageInfo.heads = 2; + ImageInfo.sectorsPerTrack = 17; + break; + case MediaType.IBM23FD: + ImageInfo.cylinders = 32; + ImageInfo.heads = 1; + ImageInfo.sectorsPerTrack = 8; + break; + case MediaType.IBM33FD_128: + ImageInfo.cylinders = 73; + ImageInfo.heads = 1; + ImageInfo.sectorsPerTrack = 26; + break; + case MediaType.IBM33FD_256: + ImageInfo.cylinders = 74; + ImageInfo.heads = 1; + ImageInfo.sectorsPerTrack = 15; + break; + case MediaType.IBM33FD_512: + ImageInfo.cylinders = 74; + ImageInfo.heads = 1; + ImageInfo.sectorsPerTrack = 8; + break; + case MediaType.IBM43FD_128: + ImageInfo.cylinders = 74; + ImageInfo.heads = 2; + ImageInfo.sectorsPerTrack = 26; + break; + case MediaType.IBM43FD_256: + ImageInfo.cylinders = 74; + ImageInfo.heads = 2; + ImageInfo.sectorsPerTrack = 15; + break; + case MediaType.IBM53FD_1024: + ImageInfo.cylinders = 74; + ImageInfo.heads = 2; + ImageInfo.sectorsPerTrack = 8; + break; + case MediaType.IBM53FD_256: + ImageInfo.cylinders = 74; + ImageInfo.heads = 2; + ImageInfo.sectorsPerTrack = 26; + break; + case MediaType.IBM53FD_512: + ImageInfo.cylinders = 74; + ImageInfo.heads = 2; + ImageInfo.sectorsPerTrack = 15; + break; + case MediaType.NEC_35_TD: + ImageInfo.cylinders = 240; + ImageInfo.heads = 2; + ImageInfo.sectorsPerTrack = 38; + break; + case MediaType.NEC_525_HD: + ImageInfo.cylinders = 77; + ImageInfo.heads = 2; + ImageInfo.sectorsPerTrack = 8; + break; + case MediaType.XDF_35: + ImageInfo.cylinders = 80; + ImageInfo.heads = 2; + ImageInfo.sectorsPerTrack = 23; + break; + // Following ones are what the device itself report, not the physical geometry + case MediaType.Jaz: + ImageInfo.cylinders = 1021; + ImageInfo.heads = 64; + ImageInfo.sectorsPerTrack = 32; + break; + case MediaType.PocketZip: + ImageInfo.cylinders = 154; + ImageInfo.heads = 16; + ImageInfo.sectorsPerTrack = 32; + break; + case MediaType.LS120: + ImageInfo.cylinders = 963; + ImageInfo.heads = 8; + ImageInfo.sectorsPerTrack = 32; + break; + default: + ImageInfo.cylinders = (uint)((ImageInfo.sectors / 16) / 63); + ImageInfo.heads = 16; + ImageInfo.sectorsPerTrack = 63; + break; + } + return true; } diff --git a/DiscImageChef.Helpers/CHS.cs b/DiscImageChef.Helpers/CHS.cs new file mode 100644 index 000000000..d2e8e7500 --- /dev/null +++ b/DiscImageChef.Helpers/CHS.cs @@ -0,0 +1,42 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : CHS.cs +// Author(s) : Natalia Portillo +// +// Component : Component +// +// --[ Description ] ---------------------------------------------------------- +// +// Description +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2017 Natalia Portillo +// ****************************************************************************/ +using System; +namespace DiscImageChef.Helpers +{ + public static class CHS + { + public static uint ToLBA(uint cyl, uint head, uint sector, uint maxHead, uint maxSector) + { + return maxHead == 0 || maxSector == 0 ? (cyl * 16 + head) * 63 + sector - 1 : (cyl * maxHead + head) * maxSector + sector - 1; + } + } +} diff --git a/DiscImageChef.Helpers/DiscImageChef.Helpers.csproj b/DiscImageChef.Helpers/DiscImageChef.Helpers.csproj index 78c4a7bb4..d509b8756 100644 --- a/DiscImageChef.Helpers/DiscImageChef.Helpers.csproj +++ b/DiscImageChef.Helpers/DiscImageChef.Helpers.csproj @@ -54,6 +54,7 @@ + @@ -82,7 +83,7 @@ - + diff --git a/DiscImageChef.Partitions/MBR.cs b/DiscImageChef.Partitions/MBR.cs index c97875fb0..1f50ef7bf 100644 --- a/DiscImageChef.Partitions/MBR.cs +++ b/DiscImageChef.Partitions/MBR.cs @@ -124,8 +124,8 @@ namespace DiscImageChef.PartPlugins valid &= entry.lba_start != 0 || entry.lba_sectors != 0 || entry.start_cylinder != 0 || entry.start_head != 0 || entry.start_sector != 0 || entry.end_cylinder != 0 || entry.end_head != 0 || entry.end_sector != 0; if(entry.lba_start == 0 && entry.lba_sectors == 0 && valid) { - lba_start = CHStoLBA(start_cylinder, entry.start_head, start_sector); - lba_sectors = CHStoLBA(end_cylinder, entry.end_head, entry.end_sector) - lba_start; + lba_start = Helpers.CHS.ToLBA(start_cylinder, entry.start_head, start_sector, imagePlugin.ImageInfo.heads, imagePlugin.ImageInfo.sectorsPerTrack); + lba_sectors = Helpers.CHS.ToLBA(end_cylinder, entry.end_head, entry.end_sector, imagePlugin.ImageInfo.heads, imagePlugin.ImageInfo.sectorsPerTrack) - lba_start; } // For optical media @@ -247,8 +247,8 @@ namespace DiscImageChef.PartPlugins ebr_entry.start_sector != 0 || ebr_entry.end_cylinder != 0 || ebr_entry.end_head != 0 || ebr_entry.end_sector != 0; if(ebr_entry.lba_start == 0 && ebr_entry.lba_sectors == 0 && ext_valid) { - ext_start = CHStoLBA(start_cylinder, ebr_entry.start_head, start_sector); - ext_sectors = CHStoLBA(end_cylinder, ebr_entry.end_head, ebr_entry.end_sector) - ext_start; + ext_start = Helpers.CHS.ToLBA(start_cylinder, ebr_entry.start_head, start_sector, imagePlugin.ImageInfo.heads, imagePlugin.ImageInfo.sectorsPerTrack); + ext_sectors = Helpers.CHS.ToLBA(end_cylinder, ebr_entry.end_head, ebr_entry.end_sector, imagePlugin.ImageInfo.heads, imagePlugin.ImageInfo.sectorsPerTrack) - ext_start; } ext_minix |= (ebr_entry.type == 0x81 || ebr_entry.type == 0x80); @@ -364,8 +364,8 @@ namespace DiscImageChef.PartPlugins mnx_entry.start_sector != 0 || mnx_entry.end_cylinder != 0 || mnx_entry.end_head != 0 || mnx_entry.end_sector != 0; if(mnx_entry.lba_start == 0 && mnx_entry.lba_sectors == 0 && mnx_valid) { - mnx_start = CHStoLBA(start_cylinder, mnx_entry.start_head, start_sector); - mnx_sectors = CHStoLBA(end_cylinder, mnx_entry.end_head, mnx_entry.end_sector) - mnx_start; + mnx_start = Helpers.CHS.ToLBA(start_cylinder, mnx_entry.start_head, start_sector, imagePlugin.ImageInfo.heads, imagePlugin.ImageInfo.sectorsPerTrack); + mnx_sectors = Helpers.CHS.ToLBA(end_cylinder, mnx_entry.end_head, mnx_entry.end_sector, imagePlugin.ImageInfo.heads, imagePlugin.ImageInfo.sectorsPerTrack) - mnx_start; } // For optical media @@ -404,14 +404,6 @@ namespace DiscImageChef.PartPlugins return any_mnx; } - - static uint CHStoLBA(ushort cyl, byte head, byte sector) - { -#pragma warning disable IDE0004 // Remove Unnecessary Cast - return (((uint)cyl * 16) + (uint)head) * 63 + (uint)sector - 1; -#pragma warning restore IDE0004 // Remove Unnecessary Cast - } - static string DecodeMBRType(byte type) { switch(type) diff --git a/DiscImageChef.Partitions/PC98.cs b/DiscImageChef.Partitions/PC98.cs index 2ebc7acf0..333be410d 100644 --- a/DiscImageChef.Partitions/PC98.cs +++ b/DiscImageChef.Partitions/PC98.cs @@ -92,14 +92,14 @@ namespace DiscImageChef.PartPlugins Partition part = new Partition { - Start = CHStoLBA(entry.dp_scyl, entry.dp_shd, entry.dp_ssect), + Start = Helpers.CHS.ToLBA(entry.dp_scyl, entry.dp_shd, entry.dp_ssect, imagePlugin.ImageInfo.heads, imagePlugin.ImageInfo.sectorsPerTrack), Type = string.Format("{0}", (entry.dp_sid << 8) | entry.dp_mid), Name = StringHandlers.CToString(entry.dp_name, Encoding.GetEncoding(932)), Sequence = counter, Scheme = Name }; part.Offset = part.Start * imagePlugin.GetSectorSize(); - part.Length = CHStoLBA(entry.dp_ecyl, entry.dp_ehd, entry.dp_esect) - part.Start; + part.Length = Helpers.CHS.ToLBA(entry.dp_ecyl, entry.dp_ehd, entry.dp_esect, imagePlugin.ImageInfo.heads, imagePlugin.ImageInfo.sectorsPerTrack) - part.Start; part.Size = part.Length * imagePlugin.GetSectorSize(); if((entry.dp_sid & 0x7F) == 0x44 && @@ -116,13 +116,6 @@ namespace DiscImageChef.PartPlugins return partitions.Count > 0; } - static uint CHStoLBA(ushort cyl, byte head, byte sector) - { -#pragma warning disable IDE0004 // Remove Unnecessary Cast - return (((uint)cyl * 16) + (uint)head) * 63 + (uint)sector - 1; -#pragma warning restore IDE0004 // Remove Unnecessary Cast - } - [StructLayout(LayoutKind.Sequential, Pack = 1)] struct PC98Table {