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 #region IBM non standard floppy formats
XDF_525, 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, XDF_35,
#endregion IBM non standard floppy formats #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.sectors = (ulong)(fdihdr.cylinders * fdihdr.heads * fdihdr.spt);
ImageInfo.xmlMediaType = XmlMediaType.BlockMedia; ImageInfo.xmlMediaType = XmlMediaType.BlockMedia;
ImageInfo.sectorSize = (uint)fdihdr.bps; ImageInfo.sectorSize = (uint)fdihdr.bps;
ImageInfo.cylinders = (uint)fdihdr.cylinders;
ImageInfo.heads = (uint)fdihdr.heads;
ImageInfo.sectorsPerTrack = (uint)fdihdr.spt;
anexImageFilter = imageFilter; anexImageFilter = imageFilter;

View File

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

View File

@@ -125,6 +125,9 @@ namespace DiscImageChef.ImagePlugins
ImageInfo.sectors = 560; ImageInfo.sectors = 560;
ImageInfo.mediaType = MediaType.Apple33SS; ImageInfo.mediaType = MediaType.Apple33SS;
ImageInfo.xmlMediaType = XmlMediaType.BlockMedia; ImageInfo.xmlMediaType = XmlMediaType.BlockMedia;
ImageInfo.cylinders = 35;
ImageInfo.heads = 2;
ImageInfo.sectorsPerTrack = 16;
return true; return true;
} }

View File

@@ -243,6 +243,19 @@ namespace DiscImageChef.ImagePlugins
ImageInfo.sectorSize = 256; ImageInfo.sectorSize = 256;
ImageInfo.xmlMediaType = XmlMediaType.BlockMedia; ImageInfo.xmlMediaType = XmlMediaType.BlockMedia;
ImageInfo.readableSectorTags.Add(SectorTagType.FloppyAddressMark); 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; return true;
} }

View File

@@ -176,27 +176,43 @@ namespace DiscImageChef.ImagePlugins
ImageInfo.mediaType = MediaType.AppleProfile; ImageInfo.mediaType = MediaType.AppleProfile;
else else
ImageInfo.mediaType = MediaType.GENERIC_HDD; ImageInfo.mediaType = MediaType.GENERIC_HDD;
break; ImageInfo.cylinders = 152;
ImageInfo.heads = 4;
ImageInfo.sectorsPerTrack = 16;
break;
case profile10Name: case profile10Name:
if(ImageInfo.sectors == 0x4C00) if(ImageInfo.sectors == 0x4C00)
ImageInfo.mediaType = MediaType.AppleProfile; ImageInfo.mediaType = MediaType.AppleProfile;
else else
ImageInfo.mediaType = MediaType.GENERIC_HDD; ImageInfo.mediaType = MediaType.GENERIC_HDD;
break; ImageInfo.cylinders = 304;
ImageInfo.heads = 4;
ImageInfo.sectorsPerTrack = 16;
break;
case widgetName: case widgetName:
if(ImageInfo.sectors == 0x4C00) if(ImageInfo.sectors == 0x4C00)
ImageInfo.mediaType = MediaType.AppleWidget; ImageInfo.mediaType = MediaType.AppleWidget;
else else
ImageInfo.mediaType = MediaType.GENERIC_HDD; ImageInfo.mediaType = MediaType.GENERIC_HDD;
break; ImageInfo.cylinders = 304;
ImageInfo.heads = 4;
ImageInfo.sectorsPerTrack = 16;
break;
case priamName: case priamName:
if(ImageInfo.sectors == 0x022C7C) if(ImageInfo.sectors == 0x022C7C)
ImageInfo.mediaType = MediaType.PriamDataTower; ImageInfo.mediaType = MediaType.PriamDataTower;
else else
ImageInfo.mediaType = MediaType.GENERIC_HDD; ImageInfo.mediaType = MediaType.GENERIC_HDD;
break; // This values are invented...
ImageInfo.cylinders = 419;
ImageInfo.heads = 4;
ImageInfo.sectorsPerTrack = 85;
break;
default: default:
ImageInfo.mediaType = MediaType.GENERIC_HDD; ImageInfo.mediaType = MediaType.GENERIC_HDD;
ImageInfo.cylinders = (uint)((ImageInfo.sectors / 16) / 63);
ImageInfo.heads = 16;
ImageInfo.sectorsPerTrack = 63;
break; break;
} }

View File

@@ -713,6 +713,10 @@ namespace DiscImageChef.ImagePlugins
mapVersion = 1; mapVersion = 1;
isHdd = true; isHdd = true;
ImageInfo.cylinders = hdrV1.cylinders;
ImageInfo.heads = hdrV1.heads;
ImageInfo.sectorsPerTrack = hdrV1.sectors;
break; break;
} }
case 2: case 2:
@@ -775,6 +779,10 @@ namespace DiscImageChef.ImagePlugins
mapVersion = 1; mapVersion = 1;
isHdd = true; isHdd = true;
ImageInfo.cylinders = hdrV2.cylinders;
ImageInfo.heads = hdrV2.heads;
ImageInfo.sectorsPerTrack = hdrV2.sectors;
break; break;
} }
case 3: case 3:
@@ -967,6 +975,9 @@ namespace DiscImageChef.ImagePlugins
{ {
isHdd = true; isHdd = true;
ImageInfo.sectorSize = uint.Parse(gdddMatch.Groups["bps"].Value); 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; break;
// "CHCD" // "CHCD"
@@ -1417,6 +1428,18 @@ namespace DiscImageChef.ImagePlugins
ImageInfo.driveModel = idnt.Value.Model; ImageInfo.driveModel = idnt.Value.Model;
ImageInfo.driveSerialNumber = idnt.Value.SerialNumber; ImageInfo.driveSerialNumber = idnt.Value.SerialNumber;
ImageInfo.driveFirmwareRevision = idnt.Value.FirmwareRevision; 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; identify = meta;
if(!ImageInfo.readableMediaTags.Contains(MediaTagType.ATA_IDENTIFY)) if(!ImageInfo.readableMediaTags.Contains(MediaTagType.ATA_IDENTIFY))

View File

@@ -429,8 +429,8 @@ namespace DiscImageChef.ImagePlugins
ImageInfo.mediaType = MediaType.CompactFloppy; ImageInfo.mediaType = MediaType.CompactFloppy;
ImageInfo.readableSectorTags.Add(SectorTagType.FloppyAddressMark); 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); FileStream foo = new FileStream(Path.GetFileNameWithoutExtension(imagePath) + ".bin", FileMode.Create);
for(ulong i = 0; i < (ulong)sectors.Count; i++) for(ulong i = 0; i < (ulong)sectors.Count; i++)
{ {
@@ -441,7 +441,11 @@ namespace DiscImageChef.ImagePlugins
foo.Close(); 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) static int SizeCodeToBytes(IBMSectorSizeCode code)

View File

@@ -410,6 +410,10 @@ namespace DiscImageChef.ImagePlugins
if(!string.IsNullOrEmpty(ImageInfo.imageComments)) if(!string.IsNullOrEmpty(ImageInfo.imageComments))
DicConsole.VerboseWriteLine("CopyQM comments: {0}", ImageInfo.imageComments); DicConsole.VerboseWriteLine("CopyQM comments: {0}", ImageInfo.imageComments);
ImageInfo.heads = header.heads;
ImageInfo.cylinders = header.imageCylinders;
ImageInfo.sectorsPerTrack = header.sectorsPerTrack;
return true; return true;
} }

View File

@@ -490,6 +490,76 @@ namespace DiscImageChef.ImagePlugins
ImageInfo.xmlMediaType = XmlMediaType.BlockMedia; ImageInfo.xmlMediaType = XmlMediaType.BlockMedia;
ImageInfo.sectorSize = (uint)(128 << (int)bps); 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; return true;
} }

View File

@@ -157,7 +157,7 @@ namespace DiscImageChef.DiscImages
return false; return false;
break; break;
case kAppleIIDisk: case kAppleIIDisk:
if(header.srcSize != kAppleIIDisk) if(header.srcSize != kApple800KSize)
return false; return false;
break; break;
case kMacHiDDisk: case kMacHiDDisk:
@@ -395,13 +395,41 @@ namespace DiscImageChef.DiscImages
ImageInfo.imageName = Path.GetFileNameWithoutExtension(imageFilter.GetFilename()); ImageInfo.imageName = Path.GetFileNameWithoutExtension(imageFilter.GetFilename());
ImageInfo.sectorSize = sectorSize; ImageInfo.sectorSize = sectorSize;
ImageInfo.xmlMediaType = XmlMediaType.BlockMedia; ImageInfo.xmlMediaType = XmlMediaType.BlockMedia;
ImageInfo.mediaType = MediaType.GENERIC_HDD;
ImageInfo.imageSize = ImageInfo.sectors * sectorSize; ImageInfo.imageSize = ImageInfo.sectors * sectorSize;
if(header.srcCmp == kNoCompress) if(header.srcCmp == kNoCompress)
ImageInfo.imageVersion = "1.4"; ImageInfo.imageVersion = "1.4";
else else
ImageInfo.imageVersion = "1.5"; 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; return true;
} }

View File

@@ -238,7 +238,42 @@ namespace DiscImageChef.ImagePlugins
ImageInfo.imageComments = StringHandlers.CToString(comment, Encoding.GetEncoding(932)); ImageInfo.imageComments = StringHandlers.CToString(comment, Encoding.GetEncoding(932));
ImageInfo.xmlMediaType = XmlMediaType.BlockMedia; 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() public override bool ImageHasPartitions()

View File

@@ -516,7 +516,65 @@ namespace DiscImageChef.ImagePlugins
ImageInfo.xmlMediaType = XmlMediaType.BlockMedia; ImageInfo.xmlMediaType = XmlMediaType.BlockMedia;
DicConsole.VerboseWriteLine("DiskCopy 4.2 image contains a disk of type {0}", ImageInfo.mediaType); 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) public override bool? VerifySector(ulong sectorAddress)

View File

@@ -66,6 +66,10 @@ namespace DiscImageChef.ImagePlugins
public string driveSerialNumber; public string driveSerialNumber;
public string driveFirmwareRevision; public string driveFirmwareRevision;
public XmlMediaType xmlMediaType; 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.imageApplicationVersion = "6";
ImageInfo.imageApplication = "Apple DiskCopy"; 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; return true;
} }

View File

@@ -269,7 +269,11 @@ namespace DiscImageChef.DiscImages
sectorCache.Add(sectorAddress, sector); 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) public override byte[] ReadSectors(ulong sectorAddress, uint length)

View File

@@ -293,7 +293,11 @@ namespace DiscImageChef.ImagePlugins
ImageInfo.mediaType = MediaType.GENERIC_HDD; ImageInfo.mediaType = MediaType.GENERIC_HDD;
ImageInfo.imageSize = qHdr.size; 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) public override byte[] ReadSector(ulong sectorAddress)

View File

@@ -336,7 +336,11 @@ namespace DiscImageChef.ImagePlugins
ImageInfo.imageSize = qHdr.size; ImageInfo.imageSize = qHdr.size;
ImageInfo.imageVersion = string.Format("{0}", qHdr.version); 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) public override byte[] ReadSector(ulong sectorAddress)

View File

@@ -299,7 +299,11 @@ namespace DiscImageChef.ImagePlugins
ImageInfo.mediaType = MediaType.GENERIC_HDD; ImageInfo.mediaType = MediaType.GENERIC_HDD;
ImageInfo.imageSize = qHdr.image_size; 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) public override byte[] ReadSector(ulong sectorAddress)

View File

@@ -311,6 +311,10 @@ namespace DiscImageChef.ImagePlugins
decodedDisk = new byte[ImageInfo.sectors * ImageInfo.sectorSize]; decodedDisk = new byte[ImageInfo.sectors * ImageInfo.sectorSize];
stream.Read(decodedDisk, 0, (int)(stream.Length - header.dataOffset)); stream.Read(decodedDisk, 0, (int)(stream.Length - header.dataOffset));
ImageInfo.cylinders = header.cylinders;
ImageInfo.heads = header.heads;
ImageInfo.sectorsPerTrack = header.sectorsPerTrack;
return true; return true;
} }

View File

@@ -579,6 +579,10 @@ namespace DiscImageChef.ImagePlugins
if(!string.IsNullOrEmpty(ImageInfo.imageComments)) if(!string.IsNullOrEmpty(ImageInfo.imageComments))
DicConsole.VerboseWriteLine("TeleDisk comments: {0}", 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; return true;
} }

View File

@@ -511,6 +511,10 @@ namespace DiscImageChef.DiscImages
ImageInfo.imageSize = ImageInfo.sectors * sectorSize; ImageInfo.imageSize = ImageInfo.sectors * sectorSize;
ImageInfo.imageVersion = string.Format("{0}", footer.version); ImageInfo.imageVersion = string.Format("{0}", footer.version);
ImageInfo.cylinders = (uint)((ImageInfo.sectors / 16) / 63);
ImageInfo.heads = 16;
ImageInfo.sectorsPerTrack = 63;
return true; return true;
} }

View File

@@ -235,7 +235,11 @@ namespace DiscImageChef.DiscImages
} }
imageStream = stream; imageStream = stream;
return true; ImageInfo.cylinders = vHdr.cylinders;
ImageInfo.heads = vHdr.heads;
ImageInfo.sectorsPerTrack = vHdr.spt;
return true;
} }
public override byte[] ReadSector(ulong sectorAddress) public override byte[] ReadSector(ulong sectorAddress)

View File

@@ -632,7 +632,11 @@ namespace DiscImageChef.ImagePlugins
ImageInfo.imageLastModificationTime = thisDateTime; ImageInfo.imageLastModificationTime = thisDateTime;
ImageInfo.imageName = Path.GetFileNameWithoutExtension(imageFilter.GetFilename()); 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); imageStream.Seek((long)thisFooter.offset, SeekOrigin.Begin);
byte[] dynamicBytes = new byte[1024]; byte[] dynamicBytes = new byte[1024];

View File

@@ -757,9 +757,13 @@ namespace DiscImageChef.ImagePlugins
ImageInfo.sectors = ImageInfo.imageSize / ImageInfo.sectorSize; ImageInfo.sectors = ImageInfo.imageSize / ImageInfo.sectorSize;
ImageInfo.driveSerialNumber = Page83Data.ToString(); 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) bool CheckBitmap(ulong sectorAddress)

View File

@@ -329,7 +329,9 @@ namespace DiscImageChef.DiscImages
FiltersList filtersList = new FiltersList(); FiltersList filtersList = new FiltersList();
if(cowD) bool matchedCyls = false, matchedHds = false, matchedSpt = false;
if(cowD)
{ {
int cowCount = 1; int cowCount = 1;
string basePath = Path.GetFileNameWithoutExtension(imageFilter.GetBasePath()); string basePath = Path.GetFileNameWithoutExtension(imageFilter.GetBasePath());
@@ -374,7 +376,7 @@ namespace DiscImageChef.DiscImages
extents.Add(currentSector, newExtent); extents.Add(currentSector, newExtent);
currentSector += newExtent.sectors; currentSector += newExtent.sectors;
} }
else else
break; break;
@@ -393,15 +395,21 @@ namespace DiscImageChef.DiscImages
Regex RegexType = new Regex(TypeRegEx); Regex RegexType = new Regex(TypeRegEx);
Regex RegexExtent = new Regex(ExtentRegEx); Regex RegexExtent = new Regex(ExtentRegEx);
Regex RegexParent = new Regex(ParentRegEx); 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 MatchCid;
Match MatchParentCid; Match MatchParentCid;
Match MatchType; Match MatchType;
Match MatchExtent; Match MatchExtent;
Match MatchParent; Match MatchParent;
Match MatchCylinders;
Match MatchHeads;
Match MatchSectors;
StreamReader ddfStreamRdr = new StreamReader(ddfStream); StreamReader ddfStreamRdr = new StreamReader(ddfStream);
while(ddfStreamRdr.Peek() >= 0) while(ddfStreamRdr.Peek() >= 0)
{ {
@@ -413,50 +421,68 @@ namespace DiscImageChef.DiscImages
MatchType = RegexType.Match(_line); MatchType = RegexType.Match(_line);
MatchExtent = RegexExtent.Match(_line); MatchExtent = RegexExtent.Match(_line);
MatchParent = RegexParent.Match(_line); MatchParent = RegexParent.Match(_line);
MatchCylinders = RegexCylinders.Match(_line);
MatchHeads = RegexHeads.Match(_line);
MatchSectors = RegexSectors.Match(_line);
if(MatchVersion.Success) if(MatchVersion.Success)
{ {
uint.TryParse(MatchVersion.Groups["version"].Value, out version); uint.TryParse(MatchVersion.Groups["version"].Value, out version);
DicConsole.DebugWriteLine("VMware plugin", "version = {0}", version); DicConsole.DebugWriteLine("VMware plugin", "version = {0}", version);
} }
else if(MatchCid.Success) else if(MatchCid.Success)
{ {
cid = Convert.ToUInt32(MatchCid.Groups["cid"].Value, 16); cid = Convert.ToUInt32(MatchCid.Groups["cid"].Value, 16);
DicConsole.DebugWriteLine("VMware plugin", "cid = {0:x8}", cid); DicConsole.DebugWriteLine("VMware plugin", "cid = {0:x8}", cid);
} }
else if(MatchParentCid.Success) else if(MatchParentCid.Success)
{ {
parentCid = Convert.ToUInt32(MatchParentCid.Groups["cid"].Value, 16); parentCid = Convert.ToUInt32(MatchParentCid.Groups["cid"].Value, 16);
DicConsole.DebugWriteLine("VMware plugin", "parentCID = {0:x8}", parentCid); DicConsole.DebugWriteLine("VMware plugin", "parentCID = {0:x8}", parentCid);
} }
else if(MatchType.Success) else if(MatchType.Success)
{ {
imageType = MatchType.Groups["type"].Value; imageType = MatchType.Groups["type"].Value;
DicConsole.DebugWriteLine("VMware plugin", "createType = \"{0}\"", imageType); DicConsole.DebugWriteLine("VMware plugin", "createType = \"{0}\"", imageType);
} }
else if(MatchExtent.Success) else if(MatchExtent.Success)
{ {
VMwareExtent newExtent = new VMwareExtent(); VMwareExtent newExtent = new VMwareExtent();
newExtent.access = MatchExtent.Groups["access"].Value; newExtent.access = MatchExtent.Groups["access"].Value;
if(!embedded) if(!embedded)
newExtent.filter = filtersList.GetFilter(Path.Combine(Path.GetDirectoryName(imageFilter.GetBasePath()), MatchExtent.Groups["filename"].Value)); newExtent.filter = filtersList.GetFilter(Path.Combine(Path.GetDirectoryName(imageFilter.GetBasePath()), MatchExtent.Groups["filename"].Value));
else else
newExtent.filter = imageFilter; newExtent.filter = imageFilter;
uint.TryParse(MatchExtent.Groups["offset"].Value, out newExtent.offset); uint.TryParse(MatchExtent.Groups["offset"].Value, out newExtent.offset);
uint.TryParse(MatchExtent.Groups["sectors"].Value, out newExtent.sectors); uint.TryParse(MatchExtent.Groups["sectors"].Value, out newExtent.sectors);
newExtent.type = MatchExtent.Groups["type"].Value; 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); DicConsole.DebugWriteLine("VMware plugin", "{0} {1} {2} \"{3}\" {4}", newExtent.access, newExtent.sectors, newExtent.type, newExtent.filter, newExtent.offset);
extents.Add(currentSector, newExtent); extents.Add(currentSector, newExtent);
currentSector += newExtent.sectors; currentSector += newExtent.sectors;
} }
else if(MatchParent.Success) else if(MatchParent.Success)
{ {
parentName = MatchParent.Groups["filename"].Value; parentName = MatchParent.Groups["filename"].Value;
DicConsole.DebugWriteLine("VMware plugin", "parentFileNameHint = \"{0}\"", parentName); DicConsole.DebugWriteLine("VMware plugin", "parentFileNameHint = \"{0}\"", parentName);
hasParent = true; 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) if(extents.Count == 0)
@@ -671,7 +697,20 @@ namespace DiscImageChef.DiscImages
else else
ImageInfo.imageVersion = string.Format("{0}", version + 3); 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) public override byte[] ReadSector(ulong sectorAddress)

View File

@@ -325,6 +325,311 @@ namespace DiscImageChef.ImagePlugins
DicConsole.VerboseWriteLine("Raw disk image contains a disk of type {0}", ImageInfo.mediaType); 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; 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\ExtentsByte.cs" />
<Compile Include="Extents\ExtentsSByte.cs" /> <Compile Include="Extents\ExtentsSByte.cs" />
<Compile Include="CountBits.cs" /> <Compile Include="CountBits.cs" />
<Compile Include="CHS.cs" />
</ItemGroup> </ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<ItemGroup> <ItemGroup>
@@ -82,7 +83,7 @@
<inheritsSet /> <inheritsSet />
<inheritsScope /> <inheritsScope />
</TextStylePolicy> </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 /> <inheritsSet />
<inheritsScope /> <inheritsScope />
</CSharpFormattingPolicy> </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; 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) if(entry.lba_start == 0 && entry.lba_sectors == 0 && valid)
{ {
lba_start = CHStoLBA(start_cylinder, entry.start_head, start_sector); lba_start = Helpers.CHS.ToLBA(start_cylinder, entry.start_head, start_sector, imagePlugin.ImageInfo.heads, imagePlugin.ImageInfo.sectorsPerTrack);
lba_sectors = CHStoLBA(end_cylinder, entry.end_head, entry.end_sector) - lba_start; lba_sectors = Helpers.CHS.ToLBA(end_cylinder, entry.end_head, entry.end_sector, imagePlugin.ImageInfo.heads, imagePlugin.ImageInfo.sectorsPerTrack) - lba_start;
} }
// For optical media // 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; 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) 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_start = Helpers.CHS.ToLBA(start_cylinder, ebr_entry.start_head, start_sector, imagePlugin.ImageInfo.heads, imagePlugin.ImageInfo.sectorsPerTrack);
ext_sectors = CHStoLBA(end_cylinder, ebr_entry.end_head, ebr_entry.end_sector) - ext_start; 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); 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; 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) 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_start = Helpers.CHS.ToLBA(start_cylinder, mnx_entry.start_head, start_sector, imagePlugin.ImageInfo.heads, imagePlugin.ImageInfo.sectorsPerTrack);
mnx_sectors = CHStoLBA(end_cylinder, mnx_entry.end_head, mnx_entry.end_sector) - mnx_start; 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 // For optical media
@@ -404,14 +404,6 @@ namespace DiscImageChef.PartPlugins
return any_mnx; 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) static string DecodeMBRType(byte type)
{ {
switch(type) switch(type)

View File

@@ -92,14 +92,14 @@ namespace DiscImageChef.PartPlugins
Partition part = new Partition 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), Type = string.Format("{0}", (entry.dp_sid << 8) | entry.dp_mid),
Name = StringHandlers.CToString(entry.dp_name, Encoding.GetEncoding(932)), Name = StringHandlers.CToString(entry.dp_name, Encoding.GetEncoding(932)),
Sequence = counter, Sequence = counter,
Scheme = Name Scheme = Name
}; };
part.Offset = part.Start * imagePlugin.GetSectorSize(); 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(); part.Size = part.Length * imagePlugin.GetSectorSize();
if((entry.dp_sid & 0x7F) == 0x44 && if((entry.dp_sid & 0x7F) == 0x44 &&
@@ -116,13 +116,6 @@ namespace DiscImageChef.PartPlugins
return partitions.Count > 0; 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)] [StructLayout(LayoutKind.Sequential, Pack = 1)]
struct PC98Table struct PC98Table
{ {