Added disk geometry.

This commit is contained in:
2017-08-02 23:01:11 +01:00
parent 959d979230
commit 08425e9ccc
31 changed files with 831 additions and 91 deletions

View File

@@ -289,6 +289,7 @@ namespace DiscImageChef.CommonTypes
#region IBM non standard floppy formats
XDF_525,
/// <summary>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</summary>
XDF_35,
#endregion IBM non standard floppy formats

View File

@@ -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;

View File

@@ -368,6 +368,42 @@ namespace DiscImageChef.ImagePlugins
if(!string.IsNullOrEmpty(ImageInfo.imageComments))
DicConsole.VerboseWriteLine("2MG comments: {0}", ImageInfo.imageComments);
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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -176,27 +176,43 @@ namespace DiscImageChef.ImagePlugins
ImageInfo.mediaType = MediaType.AppleProfile;
else
ImageInfo.mediaType = MediaType.GENERIC_HDD;
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;
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;
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;
// 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;
}

View File

@@ -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))

View File

@@ -441,6 +441,10 @@ namespace DiscImageChef.ImagePlugins
foo.Close();
*/
ImageInfo.cylinders = header.tracks;
ImageInfo.heads = header.sides;
ImageInfo.sectors = ImageInfo.sectors / (uint)(header.tracks * header.sides);
return true;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -238,6 +238,41 @@ namespace DiscImageChef.ImagePlugins
ImageInfo.imageComments = StringHandlers.CToString(comment, Encoding.GetEncoding(932));
ImageInfo.xmlMediaType = XmlMediaType.BlockMedia;
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;
}

View File

@@ -516,6 +516,64 @@ namespace DiscImageChef.ImagePlugins
ImageInfo.xmlMediaType = XmlMediaType.BlockMedia;
DicConsole.VerboseWriteLine("DiskCopy 4.2 image contains a disk of type {0}", ImageInfo.mediaType);
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;
}

View File

@@ -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;
}
}

View File

@@ -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;
}

View File

@@ -269,6 +269,10 @@ namespace DiscImageChef.DiscImages
sectorCache.Add(sectorAddress, sector);
ImageInfo.cylinders = pHdr.cylinders;
ImageInfo.heads = pHdr.heads;
ImageInfo.sectorsPerTrack = (uint)((pHdr.sectors / pHdr.heads) / pHdr.cylinders);
return sector;
}

View File

@@ -293,6 +293,10 @@ namespace DiscImageChef.ImagePlugins
ImageInfo.mediaType = MediaType.GENERIC_HDD;
ImageInfo.imageSize = qHdr.size;
ImageInfo.cylinders = (uint)((ImageInfo.sectors / 16) / 63);
ImageInfo.heads = 16;
ImageInfo.sectorsPerTrack = 63;
return true;
}

View File

@@ -336,6 +336,10 @@ namespace DiscImageChef.ImagePlugins
ImageInfo.imageSize = qHdr.size;
ImageInfo.imageVersion = string.Format("{0}", qHdr.version);
ImageInfo.cylinders = (uint)((ImageInfo.sectors / 16) / 63);
ImageInfo.heads = 16;
ImageInfo.sectorsPerTrack = 63;
return true;
}

View File

@@ -299,6 +299,10 @@ namespace DiscImageChef.ImagePlugins
ImageInfo.mediaType = MediaType.GENERIC_HDD;
ImageInfo.imageSize = qHdr.image_size;
ImageInfo.cylinders = (uint)((ImageInfo.sectors / 16) / 63);
ImageInfo.heads = 16;
ImageInfo.sectorsPerTrack = 63;
return true;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -235,6 +235,10 @@ namespace DiscImageChef.DiscImages
}
imageStream = stream;
ImageInfo.cylinders = vHdr.cylinders;
ImageInfo.heads = vHdr.heads;
ImageInfo.sectorsPerTrack = vHdr.spt;
return true;
}

View File

@@ -632,6 +632,10 @@ namespace DiscImageChef.ImagePlugins
ImageInfo.imageLastModificationTime = thisDateTime;
ImageInfo.imageName = Path.GetFileNameWithoutExtension(imageFilter.GetFilename());
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);

View File

@@ -759,6 +759,10 @@ namespace DiscImageChef.ImagePlugins
// TODO: Separate image application from version, need several samples.
ImageInfo.cylinders = (uint)((ImageInfo.sectors / 16) / 63);
ImageInfo.heads = 16;
ImageInfo.sectorsPerTrack = 63;
return true;
}

View File

@@ -329,6 +329,8 @@ namespace DiscImageChef.DiscImages
FiltersList filtersList = new FiltersList();
bool matchedCyls = false, matchedHds = false, matchedSpt = false;
if(cowD)
{
int cowCount = 1;
@@ -393,6 +395,9 @@ 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 MatchCid;
@@ -400,6 +405,9 @@ namespace DiscImageChef.DiscImages
Match MatchType;
Match MatchExtent;
Match MatchParent;
Match MatchCylinders;
Match MatchHeads;
Match MatchSectors;
StreamReader ddfStreamRdr = new StreamReader(ddfStream);
@@ -413,6 +421,9 @@ 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)
{
@@ -456,6 +467,21 @@ namespace DiscImageChef.DiscImages
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;
}
}
}
@@ -671,6 +697,19 @@ namespace DiscImageChef.DiscImages
else
ImageInfo.imageVersion = string.Format("{0}", version + 3);
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;
}

View File

@@ -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;
}

View File

@@ -0,0 +1,42 @@
// /***************************************************************************
// The Disc Image Chef
// ----------------------------------------------------------------------------
//
// Filename : CHS.cs
// Author(s) : Natalia Portillo <claunia@claunia.com>
//
// 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 <http://www.gnu.org/licenses/>.
//
// ----------------------------------------------------------------------------
// 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;
}
}
}

View File

@@ -54,6 +54,7 @@
<Compile Include="Extents\ExtentsByte.cs" />
<Compile Include="Extents\ExtentsSByte.cs" />
<Compile Include="CountBits.cs" />
<Compile Include="CHS.cs" />
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<ItemGroup>
@@ -82,7 +83,7 @@
<inheritsSet />
<inheritsScope />
</TextStylePolicy>
<CSharpFormattingPolicy IndentBlock="True" IndentBraces="False" IndentSwitchSection="True" IndentSwitchCaseSection="True" LabelPositioning="OneLess" NewLinesForBracesInTypes="True" NewLinesForBracesInMethods="True" NewLinesForBracesInProperties="True" NewLinesForBracesInAccessors="True" NewLinesForBracesInAnonymousMethods="True" NewLinesForBracesInControlBlocks="True" NewLinesForBracesInAnonymousTypes="True" NewLinesForBracesInObjectCollectionArrayInitializers="True" NewLinesForBracesInLambdaExpressionBody="True" NewLineForElse="True" NewLineForCatch="True" NewLineForFinally="True" NewLineForMembersInObjectInit="True" NewLineForMembersInAnonymousTypes="True" NewLineForClausesInQuery="True" SpacingAfterMethodDeclarationName="False" SpaceWithinMethodDeclarationParenthesis="False" SpaceBetweenEmptyMethodDeclarationParentheses="False" SpaceAfterMethodCallName="False" SpaceWithinMethodCallParentheses="False" SpaceBetweenEmptyMethodCallParentheses="False" SpaceWithinExpressionParentheses="False" SpaceWithinCastParentheses="False" SpaceWithinOtherParentheses="False" SpaceAfterCast="False" SpacesIgnoreAroundVariableDeclaration="False" SpaceBeforeOpenSquareBracket="False" SpaceBetweenEmptySquareBrackets="False" SpaceWithinSquareBrackets="False" SpaceAfterColonInBaseTypeDeclaration="True" SpaceAfterComma="True" SpaceAfterDot="False" SpaceAfterSemicolonsInForStatement="True" SpaceBeforeColonInBaseTypeDeclaration="True" SpaceBeforeComma="False" SpaceBeforeDot="False" SpaceBeforeSemicolonsInForStatement="False" SpacingAroundBinaryOperator="Single" WrappingPreserveSingleLine="True" WrappingKeepStatementsOnSingleLine="True" PlaceSystemDirectiveFirst="True" SpaceAfterControlFlowStatementKeyword="False" scope="text/x-csharp">
<CSharpFormattingPolicy IndentBlock="True" IndentBraces="False" IndentSwitchSection="True" IndentSwitchCaseSection="True" LabelPositioning="OneLess" NewLinesForBracesInTypes="True" NewLinesForBracesInMethods="True" NewLinesForBracesInProperties="True" NewLinesForBracesInAccessors="True" NewLinesForBracesInAnonymousMethods="True" NewLinesForBracesInControlBlocks="True" NewLinesForBracesInAnonymousTypes="True" NewLinesForBracesInObjectCollectionArrayInitializers="True" NewLinesForBracesInLambdaExpressionBody="True" NewLineForElse="True" NewLineForCatch="True" NewLineForFinally="True" SpacingAfterMethodDeclarationName="False" SpaceWithinMethodDeclarationParenthesis="False" SpaceBetweenEmptyMethodDeclarationParentheses="False" SpaceAfterMethodCallName="False" SpaceWithinMethodCallParentheses="False" SpaceBetweenEmptyMethodCallParentheses="False" SpaceAfterControlFlowStatementKeyword="False" SpaceWithinExpressionParentheses="False" SpaceWithinCastParentheses="False" SpaceWithinOtherParentheses="False" SpaceAfterCast="False" SpacesIgnoreAroundVariableDeclaration="False" SpaceBeforeOpenSquareBracket="False" SpaceBetweenEmptySquareBrackets="False" SpaceWithinSquareBrackets="False" SpaceAfterColonInBaseTypeDeclaration="True" SpaceAfterComma="True" SpaceAfterDot="False" SpaceAfterSemicolonsInForStatement="True" SpaceBeforeColonInBaseTypeDeclaration="True" SpaceBeforeComma="False" SpaceBeforeDot="False" SpaceBeforeSemicolonsInForStatement="False" SpacingAroundBinaryOperator="Single" WrappingPreserveSingleLine="True" WrappingKeepStatementsOnSingleLine="True" PlaceSystemDirectiveFirst="True" NewLineForMembersInObjectInit="True" NewLineForMembersInAnonymousTypes="True" NewLineForClausesInQuery="True" scope="text/x-csharp">
<inheritsSet />
<inheritsScope />
</CSharpFormattingPolicy>

View File

@@ -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)

View File

@@ -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
{