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
{