mirror of
https://github.com/aaru-dps/Aaru.Server.git
synced 2025-12-16 19:24:27 +00:00
🎨Remove chains of if-else to get media type from it's geometry, plus add
a geometry class with a list of known geometries and ❤️LINQ❤️ queries.
This commit is contained in:
@@ -42,33 +42,33 @@ namespace DiscImageChef.DiscImages
|
||||
{
|
||||
public class Anex86 : IMediaImage
|
||||
{
|
||||
IFilter anexImageFilter;
|
||||
IFilter anexImageFilter;
|
||||
Anex86Header fdihdr;
|
||||
ImageInfo imageInfo;
|
||||
ImageInfo imageInfo;
|
||||
|
||||
public Anex86()
|
||||
{
|
||||
imageInfo = new ImageInfo
|
||||
{
|
||||
ReadableSectorTags = new List<SectorTagType>(),
|
||||
ReadableMediaTags = new List<MediaTagType>(),
|
||||
HasPartitions = false,
|
||||
HasSessions = false,
|
||||
Version = null,
|
||||
Application = null,
|
||||
ApplicationVersion = null,
|
||||
Creator = null,
|
||||
Comments = null,
|
||||
MediaManufacturer = null,
|
||||
MediaModel = null,
|
||||
MediaSerialNumber = null,
|
||||
MediaBarcode = null,
|
||||
MediaPartNumber = null,
|
||||
MediaSequence = 0,
|
||||
LastMediaSequence = 0,
|
||||
DriveManufacturer = null,
|
||||
DriveModel = null,
|
||||
DriveSerialNumber = null,
|
||||
ReadableSectorTags = new List<SectorTagType>(),
|
||||
ReadableMediaTags = new List<MediaTagType>(),
|
||||
HasPartitions = false,
|
||||
HasSessions = false,
|
||||
Version = null,
|
||||
Application = null,
|
||||
ApplicationVersion = null,
|
||||
Creator = null,
|
||||
Comments = null,
|
||||
MediaManufacturer = null,
|
||||
MediaModel = null,
|
||||
MediaSerialNumber = null,
|
||||
MediaBarcode = null,
|
||||
MediaPartNumber = null,
|
||||
MediaSequence = 0,
|
||||
LastMediaSequence = 0,
|
||||
DriveManufacturer = null,
|
||||
DriveModel = null,
|
||||
DriveSerialNumber = null,
|
||||
DriveFirmwareRevision = null
|
||||
};
|
||||
}
|
||||
@@ -76,7 +76,7 @@ namespace DiscImageChef.DiscImages
|
||||
public ImageInfo Info => imageInfo;
|
||||
|
||||
public string Name => "Anex86 Disk Image";
|
||||
public Guid Id => new Guid("0410003E-6E7B-40E6-9328-BA5651ADF6B7");
|
||||
public Guid Id => new Guid("0410003E-6E7B-40E6-9328-BA5651ADF6B7");
|
||||
|
||||
public string ImageFormat => "Anex86 disk image";
|
||||
|
||||
@@ -102,19 +102,19 @@ namespace DiscImageChef.DiscImages
|
||||
stream.Read(hdrB, 0, hdrB.Length);
|
||||
|
||||
GCHandle handle = GCHandle.Alloc(hdrB, GCHandleType.Pinned);
|
||||
fdihdr = (Anex86Header)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(Anex86Header));
|
||||
fdihdr = (Anex86Header)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(Anex86Header));
|
||||
handle.Free();
|
||||
|
||||
DicConsole.DebugWriteLine("Anex86 plugin", "fdihdr.unknown = {0}", fdihdr.unknown);
|
||||
DicConsole.DebugWriteLine("Anex86 plugin", "fdihdr.hddtype = {0}", fdihdr.hddtype);
|
||||
DicConsole.DebugWriteLine("Anex86 plugin", "fdihdr.hdrSize = {0}", fdihdr.hdrSize);
|
||||
DicConsole.DebugWriteLine("Anex86 plugin", "fdihdr.dskSize = {0}", fdihdr.dskSize);
|
||||
DicConsole.DebugWriteLine("Anex86 plugin", "fdihdr.bps = {0}", fdihdr.bps);
|
||||
DicConsole.DebugWriteLine("Anex86 plugin", "fdihdr.spt = {0}", fdihdr.spt);
|
||||
DicConsole.DebugWriteLine("Anex86 plugin", "fdihdr.heads = {0}", fdihdr.heads);
|
||||
DicConsole.DebugWriteLine("Anex86 plugin", "fdihdr.unknown = {0}", fdihdr.unknown);
|
||||
DicConsole.DebugWriteLine("Anex86 plugin", "fdihdr.hddtype = {0}", fdihdr.hddtype);
|
||||
DicConsole.DebugWriteLine("Anex86 plugin", "fdihdr.hdrSize = {0}", fdihdr.hdrSize);
|
||||
DicConsole.DebugWriteLine("Anex86 plugin", "fdihdr.dskSize = {0}", fdihdr.dskSize);
|
||||
DicConsole.DebugWriteLine("Anex86 plugin", "fdihdr.bps = {0}", fdihdr.bps);
|
||||
DicConsole.DebugWriteLine("Anex86 plugin", "fdihdr.spt = {0}", fdihdr.spt);
|
||||
DicConsole.DebugWriteLine("Anex86 plugin", "fdihdr.heads = {0}", fdihdr.heads);
|
||||
DicConsole.DebugWriteLine("Anex86 plugin", "fdihdr.cylinders = {0}", fdihdr.cylinders);
|
||||
|
||||
return stream.Length == fdihdr.hdrSize + fdihdr.dskSize &&
|
||||
return stream.Length == fdihdr.hdrSize + fdihdr.dskSize &&
|
||||
fdihdr.dskSize == fdihdr.bps * fdihdr.spt * fdihdr.heads * fdihdr.cylinders;
|
||||
}
|
||||
|
||||
@@ -131,198 +131,26 @@ namespace DiscImageChef.DiscImages
|
||||
stream.Read(hdrB, 0, hdrB.Length);
|
||||
|
||||
GCHandle handle = GCHandle.Alloc(hdrB, GCHandleType.Pinned);
|
||||
fdihdr = (Anex86Header)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(Anex86Header));
|
||||
fdihdr = (Anex86Header)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(Anex86Header));
|
||||
handle.Free();
|
||||
|
||||
imageInfo.MediaType = MediaType.GENERIC_HDD;
|
||||
|
||||
switch(fdihdr.cylinders)
|
||||
{
|
||||
case 40:
|
||||
switch(fdihdr.bps)
|
||||
{
|
||||
case 512:
|
||||
switch(fdihdr.spt)
|
||||
{
|
||||
case 8:
|
||||
switch(fdihdr.heads)
|
||||
{
|
||||
case 1:
|
||||
imageInfo.MediaType = MediaType.DOS_525_SS_DD_8;
|
||||
break;
|
||||
case 2:
|
||||
imageInfo.MediaType = MediaType.DOS_525_DS_DD_8;
|
||||
break;
|
||||
}
|
||||
|
||||
break;
|
||||
case 9:
|
||||
switch(fdihdr.heads)
|
||||
{
|
||||
case 1:
|
||||
imageInfo.MediaType = MediaType.DOS_525_SS_DD_9;
|
||||
break;
|
||||
case 2:
|
||||
imageInfo.MediaType = MediaType.DOS_525_DS_DD_9;
|
||||
break;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
break;
|
||||
case 70:
|
||||
switch(fdihdr.bps)
|
||||
{
|
||||
case 512:
|
||||
switch(fdihdr.spt)
|
||||
{
|
||||
case 9:
|
||||
if(fdihdr.heads == 1) imageInfo.MediaType = MediaType.Apricot_35;
|
||||
break;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
break;
|
||||
case 77:
|
||||
switch(fdihdr.bps)
|
||||
{
|
||||
case 128:
|
||||
switch(fdihdr.spt)
|
||||
{
|
||||
case 26:
|
||||
if(fdihdr.heads == 2) imageInfo.MediaType = MediaType.NEC_8_SD;
|
||||
break;
|
||||
}
|
||||
|
||||
break;
|
||||
case 256:
|
||||
switch(fdihdr.spt)
|
||||
{
|
||||
case 26:
|
||||
if(fdihdr.heads == 2) imageInfo.MediaType = MediaType.NEC_8_DD;
|
||||
break;
|
||||
}
|
||||
|
||||
break;
|
||||
case 512:
|
||||
switch(fdihdr.spt)
|
||||
{
|
||||
case 8:
|
||||
if(fdihdr.heads == 1) imageInfo.MediaType = MediaType.Apricot_35;
|
||||
break;
|
||||
}
|
||||
|
||||
break;
|
||||
case 1024:
|
||||
switch(fdihdr.spt)
|
||||
{
|
||||
case 8:
|
||||
if(fdihdr.heads == 2) imageInfo.MediaType = MediaType.NEC_525_HD;
|
||||
break;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
break;
|
||||
case 80:
|
||||
switch(fdihdr.bps)
|
||||
{
|
||||
case 256:
|
||||
switch(fdihdr.spt)
|
||||
{
|
||||
case 16:
|
||||
switch(fdihdr.heads)
|
||||
{
|
||||
case 1:
|
||||
imageInfo.MediaType = MediaType.NEC_525_SS;
|
||||
break;
|
||||
case 2:
|
||||
imageInfo.MediaType = MediaType.NEC_525_DS;
|
||||
break;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
break;
|
||||
case 512:
|
||||
switch(fdihdr.spt)
|
||||
{
|
||||
case 8:
|
||||
switch(fdihdr.heads)
|
||||
{
|
||||
case 1:
|
||||
imageInfo.MediaType = MediaType.DOS_35_SS_DD_8;
|
||||
break;
|
||||
case 2:
|
||||
imageInfo.MediaType = MediaType.DOS_35_DS_DD_8;
|
||||
break;
|
||||
}
|
||||
|
||||
break;
|
||||
case 9:
|
||||
switch(fdihdr.heads)
|
||||
{
|
||||
case 1:
|
||||
imageInfo.MediaType = MediaType.DOS_35_SS_DD_9;
|
||||
break;
|
||||
case 2:
|
||||
imageInfo.MediaType = MediaType.DOS_35_DS_DD_9;
|
||||
break;
|
||||
}
|
||||
|
||||
break;
|
||||
case 15:
|
||||
if(fdihdr.heads == 2) imageInfo.MediaType = MediaType.NEC_35_HD_15;
|
||||
break;
|
||||
case 18:
|
||||
if(fdihdr.heads == 2) imageInfo.MediaType = MediaType.DOS_35_HD;
|
||||
break;
|
||||
case 36:
|
||||
if(fdihdr.heads == 2) imageInfo.MediaType = MediaType.DOS_35_ED;
|
||||
break;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
break;
|
||||
case 240:
|
||||
switch(fdihdr.bps)
|
||||
{
|
||||
case 512:
|
||||
switch(fdihdr.spt)
|
||||
{
|
||||
case 38:
|
||||
if(fdihdr.heads == 2) imageInfo.MediaType = MediaType.NEC_35_TD;
|
||||
break;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
imageInfo.MediaType =
|
||||
Geometry.GetMediaType(((ushort)fdihdr.cylinders, (byte)fdihdr.heads, (ushort)fdihdr.spt,
|
||||
(uint)fdihdr.bps, MediaEncoding.MFM, false));
|
||||
if(imageInfo.MediaType == MediaType.Unknown) imageInfo.MediaType = MediaType.GENERIC_HDD;
|
||||
|
||||
DicConsole.DebugWriteLine("Anex86 plugin", "MediaType: {0}", imageInfo.MediaType);
|
||||
|
||||
imageInfo.ImageSize = (ulong)fdihdr.dskSize;
|
||||
imageInfo.CreationTime = imageFilter.GetCreationTime();
|
||||
imageInfo.ImageSize = (ulong)fdihdr.dskSize;
|
||||
imageInfo.CreationTime = imageFilter.GetCreationTime();
|
||||
imageInfo.LastModificationTime = imageFilter.GetLastWriteTime();
|
||||
imageInfo.MediaTitle = Path.GetFileNameWithoutExtension(imageFilter.GetFilename());
|
||||
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;
|
||||
imageInfo.MediaTitle = Path.GetFileNameWithoutExtension(imageFilter.GetFilename());
|
||||
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;
|
||||
|
||||
@@ -429,7 +257,7 @@ namespace DiscImageChef.DiscImages
|
||||
}
|
||||
|
||||
public bool? VerifySectors(ulong sectorAddress, uint length, out List<ulong> failingLbas,
|
||||
out List<ulong> unknownLbas)
|
||||
out List<ulong> unknownLbas)
|
||||
{
|
||||
failingLbas = new List<ulong>();
|
||||
unknownLbas = new List<ulong>();
|
||||
@@ -439,7 +267,7 @@ namespace DiscImageChef.DiscImages
|
||||
}
|
||||
|
||||
public bool? VerifySectors(ulong sectorAddress, uint length, uint track, out List<ulong> failingLbas,
|
||||
out List<ulong> unknownLbas)
|
||||
out List<ulong> unknownLbas)
|
||||
{
|
||||
throw new FeatureUnsupportedImageException("Feature not supported by image format");
|
||||
}
|
||||
|
||||
@@ -63,25 +63,25 @@ namespace DiscImageChef.DiscImages
|
||||
{
|
||||
imageInfo = new ImageInfo
|
||||
{
|
||||
ReadableSectorTags = new List<SectorTagType>(),
|
||||
ReadableMediaTags = new List<MediaTagType>(),
|
||||
HasPartitions = false,
|
||||
HasSessions = false,
|
||||
Version = null,
|
||||
Application = null,
|
||||
ApplicationVersion = null,
|
||||
Creator = null,
|
||||
Comments = null,
|
||||
MediaManufacturer = null,
|
||||
MediaModel = null,
|
||||
MediaSerialNumber = null,
|
||||
MediaBarcode = null,
|
||||
MediaPartNumber = null,
|
||||
MediaSequence = 0,
|
||||
LastMediaSequence = 0,
|
||||
DriveManufacturer = null,
|
||||
DriveModel = null,
|
||||
DriveSerialNumber = null,
|
||||
ReadableSectorTags = new List<SectorTagType>(),
|
||||
ReadableMediaTags = new List<MediaTagType>(),
|
||||
HasPartitions = false,
|
||||
HasSessions = false,
|
||||
Version = null,
|
||||
Application = null,
|
||||
ApplicationVersion = null,
|
||||
Creator = null,
|
||||
Comments = null,
|
||||
MediaManufacturer = null,
|
||||
MediaModel = null,
|
||||
MediaSerialNumber = null,
|
||||
MediaBarcode = null,
|
||||
MediaPartNumber = null,
|
||||
MediaSequence = 0,
|
||||
LastMediaSequence = 0,
|
||||
DriveManufacturer = null,
|
||||
DriveModel = null,
|
||||
DriveSerialNumber = null,
|
||||
DriveFirmwareRevision = null
|
||||
};
|
||||
}
|
||||
@@ -89,7 +89,7 @@ namespace DiscImageChef.DiscImages
|
||||
public ImageInfo Info => imageInfo;
|
||||
|
||||
public string Name => "ACT Apricot Disk Image";
|
||||
public Guid Id => new Guid("43408CF3-6DB3-449F-A779-2B0E497C5B14");
|
||||
public Guid Id => new Guid("43408CF3-6DB3-449F-A779-2B0E497C5B14");
|
||||
|
||||
public string ImageFormat => "ACT Apricot disk image";
|
||||
|
||||
@@ -124,9 +124,9 @@ namespace DiscImageChef.DiscImages
|
||||
stream.Seek(signature.Length, SeekOrigin.Begin);
|
||||
|
||||
int totalCylinders = -1;
|
||||
int totalHeads = -1;
|
||||
int maxSector = -1;
|
||||
int recordSize = Marshal.SizeOf(typeof(ApridiskRecord));
|
||||
int totalHeads = -1;
|
||||
int maxSector = -1;
|
||||
int recordSize = Marshal.SizeOf(typeof(ApridiskRecord));
|
||||
|
||||
// Count cylinders
|
||||
while(stream.Position < stream.Length)
|
||||
@@ -134,7 +134,7 @@ namespace DiscImageChef.DiscImages
|
||||
byte[] recB = new byte[recordSize];
|
||||
stream.Read(recB, 0, recordSize);
|
||||
|
||||
GCHandle handle = GCHandle.Alloc(recB, GCHandleType.Pinned);
|
||||
GCHandle handle = GCHandle.Alloc(recB, GCHandleType.Pinned);
|
||||
ApridiskRecord record =
|
||||
(ApridiskRecord)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(ApridiskRecord));
|
||||
handle.Free();
|
||||
@@ -176,8 +176,8 @@ namespace DiscImageChef.DiscImages
|
||||
: "uncompressed");
|
||||
|
||||
if(record.cylinder > totalCylinders) totalCylinders = record.cylinder;
|
||||
if(record.head > totalHeads) totalHeads = record.head;
|
||||
if(record.sector > maxSector) maxSector = record.sector;
|
||||
if(record.head > totalHeads) totalHeads = record.head;
|
||||
if(record.sector > maxSector) maxSector = record.sector;
|
||||
|
||||
stream.Seek(record.headerSize - recordSize + record.dataSize, SeekOrigin.Current);
|
||||
break;
|
||||
@@ -198,7 +198,7 @@ namespace DiscImageChef.DiscImages
|
||||
uint[][] spts = new uint[totalCylinders][];
|
||||
|
||||
imageInfo.Cylinders = (ushort)totalCylinders;
|
||||
imageInfo.Heads = (byte)totalHeads;
|
||||
imageInfo.Heads = (byte)totalHeads;
|
||||
|
||||
DicConsole.DebugWriteLine("Apridisk plugin",
|
||||
"Found {0} cylinders and {1} heads with a maximum sector number of {2}",
|
||||
@@ -208,7 +208,7 @@ namespace DiscImageChef.DiscImages
|
||||
for(int i = 0; i < totalCylinders; i++)
|
||||
{
|
||||
sectorsData[i] = new byte[totalHeads][][];
|
||||
spts[i] = new uint[totalHeads];
|
||||
spts[i] = new uint[totalHeads];
|
||||
|
||||
for(int j = 0; j < totalHeads; j++) sectorsData[i][j] = new byte[maxSector + 1][];
|
||||
}
|
||||
@@ -224,7 +224,7 @@ namespace DiscImageChef.DiscImages
|
||||
byte[] recB = new byte[recordSize];
|
||||
stream.Read(recB, 0, recordSize);
|
||||
|
||||
GCHandle handle = GCHandle.Alloc(recB, GCHandleType.Pinned);
|
||||
GCHandle handle = GCHandle.Alloc(recB, GCHandleType.Pinned);
|
||||
ApridiskRecord record =
|
||||
(ApridiskRecord)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(ApridiskRecord));
|
||||
handle.Free();
|
||||
@@ -235,7 +235,7 @@ namespace DiscImageChef.DiscImages
|
||||
case RecordType.Deleted:
|
||||
case RecordType.Comment:
|
||||
case RecordType.Creator:
|
||||
stream.Seek(record.headerSize - recordSize + record.dataSize, SeekOrigin.Current);
|
||||
stream.Seek(record.headerSize - recordSize + record.dataSize, SeekOrigin.Current);
|
||||
headersizes += record.headerSize + record.dataSize;
|
||||
break;
|
||||
case RecordType.Sector:
|
||||
@@ -248,7 +248,8 @@ namespace DiscImageChef.DiscImages
|
||||
uint realLength = record.dataSize;
|
||||
|
||||
if(record.compression == CompressType.Compressed)
|
||||
realLength = Decompress(data, out sectorsData[record.cylinder][record.head][record.sector]);
|
||||
realLength =
|
||||
Decompress(data, out sectorsData[record.cylinder][record.head][record.sector]);
|
||||
else sectorsData[record.cylinder][record.head][record.sector] = data;
|
||||
|
||||
if(realLength < imageInfo.SectorSize) imageInfo.SectorSize = realLength;
|
||||
@@ -266,7 +267,9 @@ namespace DiscImageChef.DiscImages
|
||||
uint spt = uint.MaxValue;
|
||||
for(ushort cyl = 0; cyl < imageInfo.Cylinders; cyl++)
|
||||
{
|
||||
for(ushort head = 0; head < imageInfo.Heads; head++) if(spts[cyl][head] < spt) spt = spts[cyl][head];
|
||||
for(ushort head = 0; head < imageInfo.Heads; head++)
|
||||
if(spts[cyl][head] < spt)
|
||||
spt = spts[cyl][head];
|
||||
}
|
||||
|
||||
imageInfo.SectorsPerTrack = spt;
|
||||
@@ -274,19 +277,16 @@ namespace DiscImageChef.DiscImages
|
||||
DicConsole.DebugWriteLine("Apridisk plugin", "Found a minimum of {0} sectors per track",
|
||||
imageInfo.SectorsPerTrack);
|
||||
|
||||
if(imageInfo.Cylinders == 70 && imageInfo.Heads == 1 && imageInfo.SectorsPerTrack == 9)
|
||||
imageInfo.MediaType = MediaType.Apricot_35;
|
||||
else if(imageInfo.Cylinders == 80 && imageInfo.Heads == 1 && imageInfo.SectorsPerTrack == 9)
|
||||
imageInfo.MediaType = MediaType.DOS_35_SS_DD_9;
|
||||
else if(imageInfo.Cylinders == 80 && imageInfo.Heads == 2 && imageInfo.SectorsPerTrack == 9)
|
||||
imageInfo.MediaType = MediaType.DOS_35_DS_DD_9;
|
||||
imageInfo.MediaType =
|
||||
Geometry.GetMediaType(((ushort)imageInfo.Cylinders, (byte)imageInfo.Heads,
|
||||
(ushort)imageInfo.SectorsPerTrack, 512, MediaEncoding.MFM, false));
|
||||
|
||||
imageInfo.ImageSize = (ulong)stream.Length - headersizes;
|
||||
imageInfo.CreationTime = imageFilter.GetCreationTime();
|
||||
imageInfo.ImageSize = (ulong)stream.Length - headersizes;
|
||||
imageInfo.CreationTime = imageFilter.GetCreationTime();
|
||||
imageInfo.LastModificationTime = imageFilter.GetLastWriteTime();
|
||||
imageInfo.MediaTitle = Path.GetFileNameWithoutExtension(imageFilter.GetFilename());
|
||||
imageInfo.Sectors = imageInfo.Cylinders * imageInfo.Heads * imageInfo.SectorsPerTrack;
|
||||
imageInfo.XmlMediaType = XmlMediaType.BlockMedia;
|
||||
imageInfo.MediaTitle = Path.GetFileNameWithoutExtension(imageFilter.GetFilename());
|
||||
imageInfo.Sectors = imageInfo.Cylinders * imageInfo.Heads * imageInfo.SectorsPerTrack;
|
||||
imageInfo.XmlMediaType = XmlMediaType.BlockMedia;
|
||||
|
||||
/*
|
||||
FileStream debugFs = new FileStream("debug.img", FileMode.CreateNew, FileAccess.Write);
|
||||
@@ -298,30 +298,6 @@ namespace DiscImageChef.DiscImages
|
||||
return true;
|
||||
}
|
||||
|
||||
static uint Decompress(byte[] compressed, out byte[] decompressed)
|
||||
{
|
||||
int readp = 0;
|
||||
int cLen = compressed.Length;
|
||||
MemoryStream buffer = new MemoryStream();
|
||||
|
||||
uint uLen = 0;
|
||||
|
||||
while(cLen >= 3)
|
||||
{
|
||||
ushort blklen = BitConverter.ToUInt16(compressed, readp);
|
||||
readp += 2;
|
||||
|
||||
for(int i = 0; i < blklen; i++) buffer.WriteByte(compressed[readp]);
|
||||
|
||||
uLen += blklen;
|
||||
readp++;
|
||||
cLen -= 3;
|
||||
}
|
||||
|
||||
decompressed = buffer.ToArray();
|
||||
return uLen;
|
||||
}
|
||||
|
||||
public byte[] ReadSector(ulong sectorAddress)
|
||||
{
|
||||
(ushort cylinder, byte head, byte sector) = LbaToChs(sectorAddress);
|
||||
@@ -356,15 +332,6 @@ namespace DiscImageChef.DiscImages
|
||||
return buffer.ToArray();
|
||||
}
|
||||
|
||||
(ushort cylinder, byte head, byte sector) LbaToChs(ulong lba)
|
||||
{
|
||||
ushort cylinder = (ushort)(lba / (imageInfo.Heads * imageInfo.SectorsPerTrack));
|
||||
byte head = (byte)(lba / imageInfo.SectorsPerTrack % imageInfo.Heads);
|
||||
byte sector = (byte)(lba % imageInfo.SectorsPerTrack + 1);
|
||||
|
||||
return (cylinder, head, sector);
|
||||
}
|
||||
|
||||
public byte[] ReadDiskTag(MediaTagType tag)
|
||||
{
|
||||
throw new FeatureUnsupportedImageException("Feature not supported by image format");
|
||||
@@ -441,7 +408,7 @@ namespace DiscImageChef.DiscImages
|
||||
}
|
||||
|
||||
public bool? VerifySectors(ulong sectorAddress, uint length, out List<ulong> failingLbas,
|
||||
out List<ulong> unknownLbas)
|
||||
out List<ulong> unknownLbas)
|
||||
{
|
||||
failingLbas = new List<ulong>();
|
||||
unknownLbas = new List<ulong>();
|
||||
@@ -451,7 +418,7 @@ namespace DiscImageChef.DiscImages
|
||||
}
|
||||
|
||||
public bool? VerifySectors(ulong sectorAddress, uint length, uint track, out List<ulong> failingLbas,
|
||||
out List<ulong> unknownLbas)
|
||||
out List<ulong> unknownLbas)
|
||||
{
|
||||
throw new FeatureUnsupportedImageException("Feature not supported by image format");
|
||||
}
|
||||
@@ -461,10 +428,43 @@ namespace DiscImageChef.DiscImages
|
||||
return null;
|
||||
}
|
||||
|
||||
static uint Decompress(byte[] compressed, out byte[] decompressed)
|
||||
{
|
||||
int readp = 0;
|
||||
int cLen = compressed.Length;
|
||||
MemoryStream buffer = new MemoryStream();
|
||||
|
||||
uint uLen = 0;
|
||||
|
||||
while(cLen >= 3)
|
||||
{
|
||||
ushort blklen = BitConverter.ToUInt16(compressed, readp);
|
||||
readp += 2;
|
||||
|
||||
for(int i = 0; i < blklen; i++) buffer.WriteByte(compressed[readp]);
|
||||
|
||||
uLen += blklen;
|
||||
readp++;
|
||||
cLen -= 3;
|
||||
}
|
||||
|
||||
decompressed = buffer.ToArray();
|
||||
return uLen;
|
||||
}
|
||||
|
||||
(ushort cylinder, byte head, byte sector) LbaToChs(ulong lba)
|
||||
{
|
||||
ushort cylinder = (ushort)(lba / (imageInfo.Heads * imageInfo.SectorsPerTrack));
|
||||
byte head = (byte)(lba / imageInfo.SectorsPerTrack % imageInfo.Heads);
|
||||
byte sector = (byte)(lba % imageInfo.SectorsPerTrack + 1);
|
||||
|
||||
return (cylinder, head, sector);
|
||||
}
|
||||
|
||||
enum RecordType : uint
|
||||
{
|
||||
Deleted = 0xE31D0000,
|
||||
Sector = 0xE31D0001,
|
||||
Sector = 0xE31D0001,
|
||||
Comment = 0xE31D0002,
|
||||
Creator = 0xE31D0003
|
||||
}
|
||||
@@ -472,19 +472,19 @@ namespace DiscImageChef.DiscImages
|
||||
enum CompressType : ushort
|
||||
{
|
||||
Uncompresed = 0x9E90,
|
||||
Compressed = 0x3E5A
|
||||
Compressed = 0x3E5A
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
struct ApridiskRecord
|
||||
{
|
||||
public RecordType type;
|
||||
public RecordType type;
|
||||
public CompressType compression;
|
||||
public ushort headerSize;
|
||||
public uint dataSize;
|
||||
public byte head;
|
||||
public byte sector;
|
||||
public ushort cylinder;
|
||||
public ushort headerSize;
|
||||
public uint dataSize;
|
||||
public byte head;
|
||||
public byte sector;
|
||||
public ushort cylinder;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -43,17 +43,17 @@ namespace DiscImageChef.DiscImages
|
||||
public class CopyQm : IMediaImage
|
||||
{
|
||||
const ushort COPYQM_MAGIC = 0x5143;
|
||||
const byte COPYQM_MARK = 0x14;
|
||||
const byte COPYQM_MARK = 0x14;
|
||||
|
||||
const byte COPYQM_FAT = 0;
|
||||
const byte COPYQM_FAT = 0;
|
||||
const byte COPYQM_BLIND = 1;
|
||||
const byte COPYQM_HFS = 2;
|
||||
const byte COPYQM_HFS = 2;
|
||||
|
||||
const byte COPYQM_525_DD = 1;
|
||||
const byte COPYQM_525_HD = 2;
|
||||
const byte COPYQM_35_DD = 3;
|
||||
const byte COPYQM_35_HD = 4;
|
||||
const byte COPYQM_35_ED = 6;
|
||||
const byte COPYQM_35_DD = 3;
|
||||
const byte COPYQM_35_HD = 4;
|
||||
const byte COPYQM_35_ED = 6;
|
||||
|
||||
readonly uint[] copyQmCrcTable =
|
||||
{
|
||||
@@ -87,38 +87,38 @@ namespace DiscImageChef.DiscImages
|
||||
0x24B4A3A6, 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF, 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94,
|
||||
0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D
|
||||
};
|
||||
uint calculatedDataCrc;
|
||||
byte[] decodedDisk;
|
||||
uint calculatedDataCrc;
|
||||
byte[] decodedDisk;
|
||||
MemoryStream decodedImage;
|
||||
|
||||
CopyQmHeader header;
|
||||
|
||||
bool headerChecksumOk;
|
||||
bool headerChecksumOk;
|
||||
ImageInfo imageInfo;
|
||||
|
||||
public CopyQm()
|
||||
{
|
||||
imageInfo = new ImageInfo
|
||||
{
|
||||
ReadableSectorTags = new List<SectorTagType>(),
|
||||
ReadableMediaTags = new List<MediaTagType>(),
|
||||
HasPartitions = false,
|
||||
HasSessions = false,
|
||||
Version = null,
|
||||
Application = null,
|
||||
ApplicationVersion = null,
|
||||
Creator = null,
|
||||
Comments = null,
|
||||
MediaManufacturer = null,
|
||||
MediaModel = null,
|
||||
MediaSerialNumber = null,
|
||||
MediaBarcode = null,
|
||||
MediaPartNumber = null,
|
||||
MediaSequence = 0,
|
||||
LastMediaSequence = 0,
|
||||
DriveManufacturer = null,
|
||||
DriveModel = null,
|
||||
DriveSerialNumber = null,
|
||||
ReadableSectorTags = new List<SectorTagType>(),
|
||||
ReadableMediaTags = new List<MediaTagType>(),
|
||||
HasPartitions = false,
|
||||
HasSessions = false,
|
||||
Version = null,
|
||||
Application = null,
|
||||
ApplicationVersion = null,
|
||||
Creator = null,
|
||||
Comments = null,
|
||||
MediaManufacturer = null,
|
||||
MediaModel = null,
|
||||
MediaSerialNumber = null,
|
||||
MediaBarcode = null,
|
||||
MediaPartNumber = null,
|
||||
MediaSequence = 0,
|
||||
LastMediaSequence = 0,
|
||||
DriveManufacturer = null,
|
||||
DriveModel = null,
|
||||
DriveSerialNumber = null,
|
||||
DriveFirmwareRevision = null
|
||||
};
|
||||
}
|
||||
@@ -126,7 +126,7 @@ namespace DiscImageChef.DiscImages
|
||||
public ImageInfo Info => imageInfo;
|
||||
|
||||
public string Name => "Sydex CopyQM";
|
||||
public Guid Id => new Guid("147E927D-3A92-4E0C-82CD-142F5A4FA76D");
|
||||
public Guid Id => new Guid("147E927D-3A92-4E0C-82CD-142F5A4FA76D");
|
||||
|
||||
public string ImageFormat => "Sydex CopyQM";
|
||||
|
||||
@@ -161,46 +161,46 @@ namespace DiscImageChef.DiscImages
|
||||
byte[] hdr = new byte[133];
|
||||
|
||||
stream.Read(hdr, 0, 133);
|
||||
header = new CopyQmHeader();
|
||||
header = new CopyQmHeader();
|
||||
IntPtr hdrPtr = Marshal.AllocHGlobal(133);
|
||||
Marshal.Copy(hdr, 0, hdrPtr, 133);
|
||||
header = (CopyQmHeader)Marshal.PtrToStructure(hdrPtr, typeof(CopyQmHeader));
|
||||
Marshal.FreeHGlobal(hdrPtr);
|
||||
|
||||
DicConsole.DebugWriteLine("CopyQM plugin", "header.magic = 0x{0:X4}", header.magic);
|
||||
DicConsole.DebugWriteLine("CopyQM plugin", "header.mark = 0x{0:X2}", header.mark);
|
||||
DicConsole.DebugWriteLine("CopyQM plugin", "header.sectorSize = {0}", header.sectorSize);
|
||||
DicConsole.DebugWriteLine("CopyQM plugin", "header.magic = 0x{0:X4}", header.magic);
|
||||
DicConsole.DebugWriteLine("CopyQM plugin", "header.mark = 0x{0:X2}", header.mark);
|
||||
DicConsole.DebugWriteLine("CopyQM plugin", "header.sectorSize = {0}", header.sectorSize);
|
||||
DicConsole.DebugWriteLine("CopyQM plugin", "header.sectorPerCluster = {0}", header.sectorPerCluster);
|
||||
DicConsole.DebugWriteLine("CopyQM plugin", "header.reservedSectors = {0}", header.reservedSectors);
|
||||
DicConsole.DebugWriteLine("CopyQM plugin", "header.fatCopy = {0}", header.fatCopy);
|
||||
DicConsole.DebugWriteLine("CopyQM plugin", "header.rootEntries = {0}", header.rootEntries);
|
||||
DicConsole.DebugWriteLine("CopyQM plugin", "header.sectors = {0}", header.sectors);
|
||||
DicConsole.DebugWriteLine("CopyQM plugin", "header.mediaType = 0x{0:X2}", header.mediaType);
|
||||
DicConsole.DebugWriteLine("CopyQM plugin", "header.sectorsPerFat = {0}", header.sectorsPerFat);
|
||||
DicConsole.DebugWriteLine("CopyQM plugin", "header.sectorsPerTrack = {0}", header.sectorsPerTrack);
|
||||
DicConsole.DebugWriteLine("CopyQM plugin", "header.heads = {0}", header.heads);
|
||||
DicConsole.DebugWriteLine("CopyQM plugin", "header.hidden = {0}", header.hidden);
|
||||
DicConsole.DebugWriteLine("CopyQM plugin", "header.sectorsBig = {0}", header.sectorsBig);
|
||||
DicConsole.DebugWriteLine("CopyQM plugin", "header.description = {0}", header.description);
|
||||
DicConsole.DebugWriteLine("CopyQM plugin", "header.blind = {0}", header.blind);
|
||||
DicConsole.DebugWriteLine("CopyQM plugin", "header.density = {0}", header.density);
|
||||
DicConsole.DebugWriteLine("CopyQM plugin", "header.imageCylinders = {0}", header.imageCylinders);
|
||||
DicConsole.DebugWriteLine("CopyQM plugin", "header.totalCylinders = {0}", header.totalCylinders);
|
||||
DicConsole.DebugWriteLine("CopyQM plugin", "header.crc = 0x{0:X8}", header.crc);
|
||||
DicConsole.DebugWriteLine("CopyQM plugin", "header.volumeLabel = {0}", header.volumeLabel);
|
||||
DicConsole.DebugWriteLine("CopyQM plugin", "header.time = 0x{0:X4}", header.time);
|
||||
DicConsole.DebugWriteLine("CopyQM plugin", "header.date = 0x{0:X4}", header.date);
|
||||
DicConsole.DebugWriteLine("CopyQM plugin", "header.commentLength = {0}", header.commentLength);
|
||||
DicConsole.DebugWriteLine("CopyQM plugin", "header.secbs = {0}", header.secbs);
|
||||
DicConsole.DebugWriteLine("CopyQM plugin", "header.unknown = 0x{0:X4}", header.unknown);
|
||||
DicConsole.DebugWriteLine("CopyQM plugin", "header.interleave = {0}", header.interleave);
|
||||
DicConsole.DebugWriteLine("CopyQM plugin", "header.skew = {0}", header.skew);
|
||||
DicConsole.DebugWriteLine("CopyQM plugin", "header.drive = {0}", header.drive);
|
||||
DicConsole.DebugWriteLine("CopyQM plugin", "header.reservedSectors = {0}", header.reservedSectors);
|
||||
DicConsole.DebugWriteLine("CopyQM plugin", "header.fatCopy = {0}", header.fatCopy);
|
||||
DicConsole.DebugWriteLine("CopyQM plugin", "header.rootEntries = {0}", header.rootEntries);
|
||||
DicConsole.DebugWriteLine("CopyQM plugin", "header.sectors = {0}", header.sectors);
|
||||
DicConsole.DebugWriteLine("CopyQM plugin", "header.mediaType = 0x{0:X2}", header.mediaType);
|
||||
DicConsole.DebugWriteLine("CopyQM plugin", "header.sectorsPerFat = {0}", header.sectorsPerFat);
|
||||
DicConsole.DebugWriteLine("CopyQM plugin", "header.sectorsPerTrack = {0}", header.sectorsPerTrack);
|
||||
DicConsole.DebugWriteLine("CopyQM plugin", "header.heads = {0}", header.heads);
|
||||
DicConsole.DebugWriteLine("CopyQM plugin", "header.hidden = {0}", header.hidden);
|
||||
DicConsole.DebugWriteLine("CopyQM plugin", "header.sectorsBig = {0}", header.sectorsBig);
|
||||
DicConsole.DebugWriteLine("CopyQM plugin", "header.description = {0}", header.description);
|
||||
DicConsole.DebugWriteLine("CopyQM plugin", "header.blind = {0}", header.blind);
|
||||
DicConsole.DebugWriteLine("CopyQM plugin", "header.density = {0}", header.density);
|
||||
DicConsole.DebugWriteLine("CopyQM plugin", "header.imageCylinders = {0}", header.imageCylinders);
|
||||
DicConsole.DebugWriteLine("CopyQM plugin", "header.totalCylinders = {0}", header.totalCylinders);
|
||||
DicConsole.DebugWriteLine("CopyQM plugin", "header.crc = 0x{0:X8}", header.crc);
|
||||
DicConsole.DebugWriteLine("CopyQM plugin", "header.volumeLabel = {0}", header.volumeLabel);
|
||||
DicConsole.DebugWriteLine("CopyQM plugin", "header.time = 0x{0:X4}", header.time);
|
||||
DicConsole.DebugWriteLine("CopyQM plugin", "header.date = 0x{0:X4}", header.date);
|
||||
DicConsole.DebugWriteLine("CopyQM plugin", "header.commentLength = {0}", header.commentLength);
|
||||
DicConsole.DebugWriteLine("CopyQM plugin", "header.secbs = {0}", header.secbs);
|
||||
DicConsole.DebugWriteLine("CopyQM plugin", "header.unknown = 0x{0:X4}", header.unknown);
|
||||
DicConsole.DebugWriteLine("CopyQM plugin", "header.interleave = {0}", header.interleave);
|
||||
DicConsole.DebugWriteLine("CopyQM plugin", "header.skew = {0}", header.skew);
|
||||
DicConsole.DebugWriteLine("CopyQM plugin", "header.drive = {0}", header.drive);
|
||||
|
||||
byte[] cmt = new byte[header.commentLength];
|
||||
stream.Read(cmt, 0, header.commentLength);
|
||||
imageInfo.Comments = StringHandlers.CToString(cmt);
|
||||
decodedImage = new MemoryStream();
|
||||
decodedImage = new MemoryStream();
|
||||
|
||||
calculatedDataCrc = 0;
|
||||
|
||||
@@ -213,7 +213,7 @@ namespace DiscImageChef.DiscImages
|
||||
|
||||
if(runLength < 0)
|
||||
{
|
||||
byte repeatedByte = (byte)stream.ReadByte();
|
||||
byte repeatedByte = (byte)stream.ReadByte();
|
||||
byte[] repeatedArray = new byte[runLength * -1];
|
||||
ArrayHelpers.ArrayFill(repeatedArray, repeatedByte);
|
||||
|
||||
@@ -253,7 +253,7 @@ namespace DiscImageChef.DiscImages
|
||||
debugStream.Close();
|
||||
*/
|
||||
|
||||
int sum = 0;
|
||||
int sum = 0;
|
||||
for(int i = 0; i < hdr.Length - 1; i++) sum += hdr[i];
|
||||
|
||||
headerChecksumOk = ((-1 * sum) & 0xFF) == header.headerChecksum;
|
||||
@@ -263,90 +263,33 @@ namespace DiscImageChef.DiscImages
|
||||
DicConsole.DebugWriteLine("CopyQM plugin", "Calculated data CRC = 0x{0:X8}, {1}", calculatedDataCrc,
|
||||
calculatedDataCrc == header.crc);
|
||||
|
||||
imageInfo.Application = "CopyQM";
|
||||
imageInfo.CreationTime = DateHandlers.DosToDateTime(header.date, header.time);
|
||||
imageInfo.Application = "CopyQM";
|
||||
imageInfo.CreationTime = DateHandlers.DosToDateTime(header.date, header.time);
|
||||
imageInfo.LastModificationTime = imageInfo.CreationTime;
|
||||
imageInfo.MediaTitle = header.volumeLabel;
|
||||
imageInfo.ImageSize = (ulong)(stream.Length - 133 - header.commentLength);
|
||||
imageInfo.Sectors = (ulong)sectors;
|
||||
imageInfo.SectorSize = header.sectorSize;
|
||||
imageInfo.MediaTitle = header.volumeLabel;
|
||||
imageInfo.ImageSize = (ulong)(stream.Length - 133 - header.commentLength);
|
||||
imageInfo.Sectors = (ulong)sectors;
|
||||
imageInfo.SectorSize = header.sectorSize;
|
||||
|
||||
switch(header.drive)
|
||||
imageInfo.MediaType =
|
||||
Geometry.GetMediaType(((ushort)header.totalCylinders, (byte)header.heads, header.sectorsPerTrack,
|
||||
(uint)header.sectorSize, MediaEncoding.MFM, false));
|
||||
|
||||
switch(imageInfo.MediaType)
|
||||
{
|
||||
case COPYQM_525_HD:
|
||||
if(header.heads == 2 && header.totalCylinders == 80 && header.sectorsPerTrack == 15 &&
|
||||
header.sectorSize == 512) imageInfo.MediaType = MediaType.DOS_525_HD;
|
||||
else if(header.heads == 2 && header.totalCylinders == 80 && header.sectorsPerTrack == 16 &&
|
||||
header.sectorSize == 256) imageInfo.MediaType = MediaType.ACORN_525_DS_DD;
|
||||
else if(header.heads == 1 && header.totalCylinders == 80 && header.sectorsPerTrack == 16 &&
|
||||
header.sectorSize == 256) imageInfo.MediaType = MediaType.ACORN_525_SS_DD_80;
|
||||
else if(header.heads == 1 && header.totalCylinders == 80 && header.sectorsPerTrack == 10 &&
|
||||
header.sectorSize == 256) imageInfo.MediaType = MediaType.ACORN_525_SS_SD_80;
|
||||
else if(header.heads == 2 && header.totalCylinders == 80 && header.sectorsPerTrack == 8 &&
|
||||
header.sectorSize == 1024) imageInfo.MediaType = MediaType.NEC_525_HD;
|
||||
else if(header.heads == 2 && header.totalCylinders == 77 && header.sectorsPerTrack == 8 &&
|
||||
header.sectorSize == 1024) imageInfo.MediaType = MediaType.SHARP_525;
|
||||
else goto case COPYQM_525_DD;
|
||||
case MediaType.NEC_525_HD when header.drive == COPYQM_35_HD ||header.drive == COPYQM_35_ED:
|
||||
imageInfo.MediaType = MediaType.NEC_35_HD_8;
|
||||
break;
|
||||
case COPYQM_525_DD:
|
||||
if(header.heads == 1 && header.totalCylinders == 40 && header.sectorsPerTrack == 8 &&
|
||||
header.sectorSize == 512) imageInfo.MediaType = MediaType.DOS_525_SS_DD_8;
|
||||
else if(header.heads == 1 && header.totalCylinders == 40 && header.sectorsPerTrack == 9 &&
|
||||
header.sectorSize == 512) imageInfo.MediaType = MediaType.DOS_525_SS_DD_9;
|
||||
else if(header.heads == 2 && header.totalCylinders == 40 && header.sectorsPerTrack == 8 &&
|
||||
header.sectorSize == 512) imageInfo.MediaType = MediaType.DOS_525_DS_DD_8;
|
||||
else if(header.heads == 2 && header.totalCylinders == 40 && header.sectorsPerTrack == 9 &&
|
||||
header.sectorSize == 512) imageInfo.MediaType = MediaType.DOS_525_DS_DD_9;
|
||||
else if(header.heads == 1 && header.totalCylinders == 40 && header.sectorsPerTrack == 18 &&
|
||||
header.sectorSize == 128) imageInfo.MediaType = MediaType.ATARI_525_SD;
|
||||
else if(header.heads == 1 && header.totalCylinders == 40 && header.sectorsPerTrack == 26 &&
|
||||
header.sectorSize == 128) imageInfo.MediaType = MediaType.ATARI_525_ED;
|
||||
else if(header.heads == 1 && header.totalCylinders == 40 && header.sectorsPerTrack == 18 &&
|
||||
header.sectorSize == 256) imageInfo.MediaType = MediaType.ATARI_525_DD;
|
||||
else imageInfo.MediaType = MediaType.Unknown;
|
||||
case MediaType.DOS_525_HD when header.drive == COPYQM_35_HD ||header.drive == COPYQM_35_ED:
|
||||
imageInfo.MediaType = MediaType.NEC_35_HD_15;
|
||||
break;
|
||||
case COPYQM_35_ED:
|
||||
if(header.heads == 2 && header.totalCylinders == 80 && header.sectorsPerTrack == 36 &&
|
||||
header.sectorSize == 512) imageInfo.MediaType = MediaType.DOS_35_ED;
|
||||
else goto case COPYQM_35_HD;
|
||||
break;
|
||||
case COPYQM_35_HD:
|
||||
if(header.heads == 2 && header.totalCylinders == 80 && header.sectorsPerTrack == 18 &&
|
||||
header.sectorSize == 512) imageInfo.MediaType = MediaType.DOS_35_HD;
|
||||
else if(header.heads == 2 && header.totalCylinders == 80 && header.sectorsPerTrack == 21 &&
|
||||
header.sectorSize == 512) imageInfo.MediaType = MediaType.DMF;
|
||||
else if(header.heads == 2 && header.totalCylinders == 82 && header.sectorsPerTrack == 21 &&
|
||||
header.sectorSize == 512) imageInfo.MediaType = MediaType.DMF_82;
|
||||
else if(header.heads == 2 && header.totalCylinders == 80 && header.sectorsPerTrack == 8 &&
|
||||
header.sectorSize == 1024) imageInfo.MediaType = MediaType.NEC_35_HD_8;
|
||||
else if(header.heads == 2 && header.totalCylinders == 80 && header.sectorsPerTrack == 15 &&
|
||||
header.sectorSize == 512) imageInfo.MediaType = MediaType.NEC_35_HD_15;
|
||||
else goto case COPYQM_35_DD;
|
||||
break;
|
||||
case COPYQM_35_DD:
|
||||
if(header.heads == 2 && header.totalCylinders == 80 && header.sectorsPerTrack == 9 &&
|
||||
header.sectorSize == 512) imageInfo.MediaType = MediaType.DOS_35_DS_DD_9;
|
||||
else if(header.heads == 2 && header.totalCylinders == 80 && header.sectorsPerTrack == 8 &&
|
||||
header.sectorSize == 512) imageInfo.MediaType = MediaType.DOS_35_DS_DD_8;
|
||||
else if(header.heads == 1 && header.totalCylinders == 80 && header.sectorsPerTrack == 9 &&
|
||||
header.sectorSize == 512) imageInfo.MediaType = MediaType.DOS_35_SS_DD_9;
|
||||
else if(header.heads == 1 && header.totalCylinders == 80 && header.sectorsPerTrack == 8 &&
|
||||
header.sectorSize == 512) imageInfo.MediaType = MediaType.DOS_35_SS_DD_8;
|
||||
else if(header.heads == 2 && header.totalCylinders == 80 && header.sectorsPerTrack == 5 &&
|
||||
header.sectorSize == 1024) imageInfo.MediaType = MediaType.ACORN_35_DS_DD;
|
||||
else if(header.heads == 2 && header.totalCylinders == 77 && header.sectorsPerTrack == 8 &&
|
||||
header.sectorSize == 1024) imageInfo.MediaType = MediaType.SHARP_35;
|
||||
else if(header.heads == 1 && header.totalCylinders == 70 && header.sectorsPerTrack == 9 &&
|
||||
header.sectorSize == 512) imageInfo.MediaType = MediaType.Apricot_35;
|
||||
else imageInfo.MediaType = MediaType.Unknown;
|
||||
break;
|
||||
default:
|
||||
imageInfo.MediaType = MediaType.Unknown;
|
||||
case MediaType.RX50 when header.drive == COPYQM_525_DD || header.drive == COPYQM_525_HD:
|
||||
imageInfo.MediaType = MediaType.ATARI_35_SS_DD;
|
||||
break;
|
||||
}
|
||||
|
||||
imageInfo.XmlMediaType = XmlMediaType.BlockMedia;
|
||||
decodedDisk = decodedImage.ToArray();
|
||||
decodedDisk = decodedImage.ToArray();
|
||||
|
||||
decodedImage.Close();
|
||||
|
||||
@@ -354,8 +297,8 @@ namespace DiscImageChef.DiscImages
|
||||
if(!string.IsNullOrEmpty(imageInfo.Comments))
|
||||
DicConsole.VerboseWriteLine("CopyQM comments: {0}", imageInfo.Comments);
|
||||
|
||||
imageInfo.Heads = header.heads;
|
||||
imageInfo.Cylinders = header.imageCylinders;
|
||||
imageInfo.Heads = header.heads;
|
||||
imageInfo.Cylinders = header.totalCylinders;
|
||||
imageInfo.SectorsPerTrack = header.sectorsPerTrack;
|
||||
|
||||
return true;
|
||||
@@ -372,7 +315,7 @@ namespace DiscImageChef.DiscImages
|
||||
}
|
||||
|
||||
public bool? VerifySectors(ulong sectorAddress, uint length, out List<ulong> failingLbas,
|
||||
out List<ulong> unknownLbas)
|
||||
out List<ulong> unknownLbas)
|
||||
{
|
||||
failingLbas = new List<ulong>();
|
||||
unknownLbas = new List<ulong>();
|
||||
@@ -383,7 +326,7 @@ namespace DiscImageChef.DiscImages
|
||||
}
|
||||
|
||||
public bool? VerifySectors(ulong sectorAddress, uint length, uint track, out List<ulong> failingLbas,
|
||||
out List<ulong> unknownLbas)
|
||||
out List<ulong> unknownLbas)
|
||||
{
|
||||
failingLbas = new List<ulong>();
|
||||
unknownLbas = new List<ulong>();
|
||||
@@ -414,7 +357,7 @@ namespace DiscImageChef.DiscImages
|
||||
byte[] buffer = new byte[length * imageInfo.SectorSize];
|
||||
|
||||
Array.Copy(decodedDisk, (int)sectorAddress * imageInfo.SectorSize, buffer, 0,
|
||||
length * imageInfo.SectorSize);
|
||||
length * imageInfo.SectorSize);
|
||||
|
||||
return buffer;
|
||||
}
|
||||
@@ -516,7 +459,8 @@ namespace DiscImageChef.DiscImages
|
||||
/// <summary>0x18 Sectors on disk (part of FAT's BPB)</summary>
|
||||
public uint sectorsBig;
|
||||
/// <summary>0x1C Description</summary>
|
||||
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 60)] public string description;
|
||||
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 60)]
|
||||
public string description;
|
||||
/// <summary>0x58 Blind mode. 0 = DOS, 1 = blind, 2 = HFS</summary>
|
||||
public byte blind;
|
||||
/// <summary>0x59 Density. 0 = Double, 1 = High, 2 = Quad/Extra</summary>
|
||||
@@ -528,7 +472,8 @@ namespace DiscImageChef.DiscImages
|
||||
/// <summary>0x5C CRC32 of data</summary>
|
||||
public uint crc;
|
||||
/// <summary>0x60 DOS volume label</summary>
|
||||
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 11)] public string volumeLabel;
|
||||
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 11)]
|
||||
public string volumeLabel;
|
||||
/// <summary>0x6B Modification time</summary>
|
||||
public ushort time;
|
||||
/// <summary>0x6D Modification date</summary>
|
||||
@@ -546,7 +491,8 @@ namespace DiscImageChef.DiscImages
|
||||
/// <summary>0x76 Source drive type. 1 = 5.25" DD, 2 = 5.25" HD, 3 = 3.5" DD, 4 = 3.5" HD, 6 = 3.5" ED</summary>
|
||||
public byte drive;
|
||||
/// <summary>0x77 Filling bytes</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 13)] public byte[] fill;
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 13)]
|
||||
public byte[] fill;
|
||||
/// <summary>0x84 Header checksum</summary>
|
||||
public byte headerChecksum;
|
||||
}
|
||||
|
||||
@@ -45,12 +45,13 @@ namespace DiscImageChef.DiscImages
|
||||
{
|
||||
// Information from Quasi88's FORMAT.TXT file
|
||||
// Japanese comments copied from there
|
||||
// TODO: Solve media types
|
||||
public class D88 : IMediaImage
|
||||
{
|
||||
const byte READ_ONLY = 0x10;
|
||||
|
||||
readonly byte[] reservedEmpty = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
|
||||
ImageInfo imageInfo;
|
||||
ImageInfo imageInfo;
|
||||
|
||||
List<byte[]> sectorsData;
|
||||
|
||||
@@ -58,31 +59,31 @@ namespace DiscImageChef.DiscImages
|
||||
{
|
||||
imageInfo = new ImageInfo
|
||||
{
|
||||
ReadableSectorTags = new List<SectorTagType>(),
|
||||
ReadableMediaTags = new List<MediaTagType>(),
|
||||
HasPartitions = false,
|
||||
HasSessions = false,
|
||||
Version = null,
|
||||
Application = null,
|
||||
ApplicationVersion = null,
|
||||
Creator = null,
|
||||
Comments = null,
|
||||
MediaManufacturer = null,
|
||||
MediaModel = null,
|
||||
MediaSerialNumber = null,
|
||||
MediaBarcode = null,
|
||||
MediaPartNumber = null,
|
||||
MediaSequence = 0,
|
||||
LastMediaSequence = 0,
|
||||
DriveManufacturer = null,
|
||||
DriveModel = null,
|
||||
DriveSerialNumber = null,
|
||||
ReadableSectorTags = new List<SectorTagType>(),
|
||||
ReadableMediaTags = new List<MediaTagType>(),
|
||||
HasPartitions = false,
|
||||
HasSessions = false,
|
||||
Version = null,
|
||||
Application = null,
|
||||
ApplicationVersion = null,
|
||||
Creator = null,
|
||||
Comments = null,
|
||||
MediaManufacturer = null,
|
||||
MediaModel = null,
|
||||
MediaSerialNumber = null,
|
||||
MediaBarcode = null,
|
||||
MediaPartNumber = null,
|
||||
MediaSequence = 0,
|
||||
LastMediaSequence = 0,
|
||||
DriveManufacturer = null,
|
||||
DriveModel = null,
|
||||
DriveSerialNumber = null,
|
||||
DriveFirmwareRevision = null
|
||||
};
|
||||
}
|
||||
|
||||
public string Name => "D88 Disk Image";
|
||||
public Guid Id => new Guid("669EDC77-EC41-4720-A88C-49C38CFFBAA0");
|
||||
public string Name => "D88 Disk Image";
|
||||
public Guid Id => new Guid("669EDC77-EC41-4720-A88C-49C38CFFBAA0");
|
||||
public ImageInfo Info => imageInfo;
|
||||
|
||||
public string ImageFormat => "D88 disk image";
|
||||
@@ -111,7 +112,7 @@ namespace DiscImageChef.DiscImages
|
||||
stream.Read(hdrB, 0, hdrB.Length);
|
||||
|
||||
GCHandle handle = GCHandle.Alloc(hdrB, GCHandleType.Pinned);
|
||||
d88Hdr = (D88Header)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(D88Header));
|
||||
d88Hdr = (D88Header)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(D88Header));
|
||||
handle.Free();
|
||||
|
||||
DicConsole.DebugWriteLine("D88 plugin", "d88hdr.name = \"{0}\"",
|
||||
@@ -158,7 +159,7 @@ namespace DiscImageChef.DiscImages
|
||||
stream.Read(hdrB, 0, hdrB.Length);
|
||||
|
||||
GCHandle handle = GCHandle.Alloc(hdrB, GCHandleType.Pinned);
|
||||
d88Hdr = (D88Header)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(D88Header));
|
||||
d88Hdr = (D88Header)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(D88Header));
|
||||
handle.Free();
|
||||
|
||||
DicConsole.DebugWriteLine("D88 plugin", "d88hdr.name = \"{0}\"",
|
||||
@@ -190,7 +191,7 @@ namespace DiscImageChef.DiscImages
|
||||
if(trkCounter == 0) return false;
|
||||
|
||||
SectorHeader sechdr = new SectorHeader();
|
||||
hdrB = new byte[Marshal.SizeOf(sechdr)];
|
||||
hdrB = new byte[Marshal.SizeOf(sechdr)];
|
||||
stream.Seek(d88Hdr.track_table[0], SeekOrigin.Begin);
|
||||
stream.Read(hdrB, 0, hdrB.Length);
|
||||
|
||||
@@ -198,20 +199,20 @@ namespace DiscImageChef.DiscImages
|
||||
sechdr = (SectorHeader)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(SectorHeader));
|
||||
handle.Free();
|
||||
|
||||
DicConsole.DebugWriteLine("D88 plugin", "sechdr.c = {0}", sechdr.c);
|
||||
DicConsole.DebugWriteLine("D88 plugin", "sechdr.h = {0}", sechdr.h);
|
||||
DicConsole.DebugWriteLine("D88 plugin", "sechdr.r = {0}", sechdr.r);
|
||||
DicConsole.DebugWriteLine("D88 plugin", "sechdr.n = {0}", sechdr.n);
|
||||
DicConsole.DebugWriteLine("D88 plugin", "sechdr.spt = {0}", sechdr.spt);
|
||||
DicConsole.DebugWriteLine("D88 plugin", "sechdr.density = {0}", sechdr.density);
|
||||
DicConsole.DebugWriteLine("D88 plugin", "sechdr.c = {0}", sechdr.c);
|
||||
DicConsole.DebugWriteLine("D88 plugin", "sechdr.h = {0}", sechdr.h);
|
||||
DicConsole.DebugWriteLine("D88 plugin", "sechdr.r = {0}", sechdr.r);
|
||||
DicConsole.DebugWriteLine("D88 plugin", "sechdr.n = {0}", sechdr.n);
|
||||
DicConsole.DebugWriteLine("D88 plugin", "sechdr.spt = {0}", sechdr.spt);
|
||||
DicConsole.DebugWriteLine("D88 plugin", "sechdr.density = {0}", sechdr.density);
|
||||
DicConsole.DebugWriteLine("D88 plugin", "sechdr.deleted_mark = {0}", sechdr.deleted_mark);
|
||||
DicConsole.DebugWriteLine("D88 plugin", "sechdr.status = {0}", sechdr.status);
|
||||
DicConsole.DebugWriteLine("D88 plugin", "sechdr.status = {0}", sechdr.status);
|
||||
DicConsole.DebugWriteLine("D88 plugin", "sechdr.size_of_data = {0}", sechdr.size_of_data);
|
||||
|
||||
short spt = sechdr.spt;
|
||||
IBMSectorSizeCode bps = sechdr.n;
|
||||
bool allEqual = true;
|
||||
sectorsData = new List<byte[]>();
|
||||
short spt = sechdr.spt;
|
||||
IBMSectorSizeCode bps = sechdr.n;
|
||||
bool allEqual = true;
|
||||
sectorsData = new List<byte[]>();
|
||||
|
||||
for(int i = 0; i < trkCounter; i++)
|
||||
{
|
||||
@@ -231,7 +232,7 @@ namespace DiscImageChef.DiscImages
|
||||
allEqual = false;
|
||||
}
|
||||
|
||||
short maxJ = sechdr.spt;
|
||||
short maxJ = sechdr.spt;
|
||||
byte[] secB;
|
||||
for(short j = 1; j < maxJ; j++)
|
||||
{
|
||||
@@ -345,81 +346,81 @@ namespace DiscImageChef.DiscImages
|
||||
|
||||
DicConsole.DebugWriteLine("D88 plugin", "MediaType: {0}", imageInfo.MediaType);
|
||||
|
||||
imageInfo.ImageSize = (ulong)d88Hdr.disk_size;
|
||||
imageInfo.CreationTime = imageFilter.GetCreationTime();
|
||||
imageInfo.ImageSize = (ulong)d88Hdr.disk_size;
|
||||
imageInfo.CreationTime = imageFilter.GetCreationTime();
|
||||
imageInfo.LastModificationTime = imageFilter.GetLastWriteTime();
|
||||
imageInfo.MediaTitle = Path.GetFileNameWithoutExtension(imageFilter.GetFilename());
|
||||
imageInfo.Sectors = (ulong)sectorsData.Count;
|
||||
imageInfo.Comments = StringHandlers.CToString(d88Hdr.name, shiftjis);
|
||||
imageInfo.XmlMediaType = XmlMediaType.BlockMedia;
|
||||
imageInfo.SectorSize = (uint)(128 << (int)bps);
|
||||
imageInfo.MediaTitle = Path.GetFileNameWithoutExtension(imageFilter.GetFilename());
|
||||
imageInfo.Sectors = (ulong)sectorsData.Count;
|
||||
imageInfo.Comments = StringHandlers.CToString(d88Hdr.name, shiftjis);
|
||||
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.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.Cylinders = 77;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.SectorsPerTrack = 26;
|
||||
break;
|
||||
case MediaType.NEC_525_DS:
|
||||
imageInfo.Cylinders = 80;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.Cylinders = 80;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.SectorsPerTrack = 16;
|
||||
break;
|
||||
case MediaType.NEC_525_HD:
|
||||
imageInfo.Cylinders = 77;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.Cylinders = 77;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.SectorsPerTrack = 8;
|
||||
break;
|
||||
case MediaType.DOS_525_SS_DD_8:
|
||||
imageInfo.Cylinders = 40;
|
||||
imageInfo.Heads = 1;
|
||||
imageInfo.Cylinders = 40;
|
||||
imageInfo.Heads = 1;
|
||||
imageInfo.SectorsPerTrack = 8;
|
||||
break;
|
||||
case MediaType.DOS_525_SS_DD_9:
|
||||
imageInfo.Cylinders = 40;
|
||||
imageInfo.Heads = 1;
|
||||
imageInfo.Cylinders = 40;
|
||||
imageInfo.Heads = 1;
|
||||
imageInfo.SectorsPerTrack = 9;
|
||||
break;
|
||||
case MediaType.DOS_525_DS_DD_8:
|
||||
imageInfo.Cylinders = 40;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.Cylinders = 40;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.SectorsPerTrack = 8;
|
||||
break;
|
||||
case MediaType.DOS_525_DS_DD_9:
|
||||
imageInfo.Cylinders = 40;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.Cylinders = 40;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.SectorsPerTrack = 9;
|
||||
break;
|
||||
case MediaType.NEC_35_HD_15:
|
||||
imageInfo.Cylinders = 80;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.Cylinders = 80;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.SectorsPerTrack = 15;
|
||||
break;
|
||||
case MediaType.DOS_35_DS_DD_9:
|
||||
imageInfo.Cylinders = 80;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.Cylinders = 80;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.SectorsPerTrack = 9;
|
||||
break;
|
||||
case MediaType.DOS_35_HD:
|
||||
imageInfo.Cylinders = 80;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.Cylinders = 80;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.SectorsPerTrack = 18;
|
||||
break;
|
||||
case MediaType.DOS_35_ED:
|
||||
imageInfo.Cylinders = 80;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.Cylinders = 80;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.SectorsPerTrack = 36;
|
||||
break;
|
||||
case MediaType.NEC_35_TD:
|
||||
imageInfo.Cylinders = 240;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.Cylinders = 240;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.SectorsPerTrack = 38;
|
||||
break;
|
||||
}
|
||||
@@ -523,7 +524,7 @@ namespace DiscImageChef.DiscImages
|
||||
}
|
||||
|
||||
public bool? VerifySectors(ulong sectorAddress, uint length, out List<ulong> failingLbas,
|
||||
out List<ulong> unknownLbas)
|
||||
out List<ulong> unknownLbas)
|
||||
{
|
||||
failingLbas = new List<ulong>();
|
||||
unknownLbas = new List<ulong>();
|
||||
@@ -533,7 +534,7 @@ namespace DiscImageChef.DiscImages
|
||||
}
|
||||
|
||||
public bool? VerifySectors(ulong sectorAddress, uint length, uint track, out List<ulong> failingLbas,
|
||||
out List<ulong> unknownLbas)
|
||||
out List<ulong> unknownLbas)
|
||||
{
|
||||
throw new FeatureUnsupportedImageException("Feature not supported by image format");
|
||||
}
|
||||
@@ -545,7 +546,7 @@ namespace DiscImageChef.DiscImages
|
||||
|
||||
enum DiskType : byte
|
||||
{
|
||||
D2 = 0x00,
|
||||
D2 = 0x00,
|
||||
Dd2 = 0x10,
|
||||
Hd2 = 0x20
|
||||
}
|
||||
@@ -553,7 +554,7 @@ namespace DiscImageChef.DiscImages
|
||||
enum DensityType : byte
|
||||
{
|
||||
Mfm = 0x00,
|
||||
Fm = 0x40
|
||||
Fm = 0x40
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -601,12 +602,14 @@ namespace DiscImageChef.DiscImages
|
||||
/// Disk name, nul-terminated ASCII
|
||||
/// ディスクの名前(ASCII + '\0')
|
||||
/// </summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 17)] public byte[] name;
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 17)]
|
||||
public byte[] name;
|
||||
/// <summary>
|
||||
/// Reserved
|
||||
/// ディスクの名前(ASCII + '\0')
|
||||
/// </summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 9)] public byte[] reserved;
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 9)]
|
||||
public byte[] reserved;
|
||||
/// <summary>
|
||||
/// Write protect status
|
||||
/// ライトプロテクト: 0x00 なし、0x10 あり
|
||||
@@ -626,7 +629,8 @@ namespace DiscImageChef.DiscImages
|
||||
/// Track pointers
|
||||
/// トラック部のオフセットテーブル 0 Track ~ 163 Track
|
||||
/// </summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 164)] public int[] track_table;
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 164)]
|
||||
public int[] track_table;
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
@@ -676,7 +680,8 @@ namespace DiscImageChef.DiscImages
|
||||
/// Reserved
|
||||
/// リザーブ
|
||||
/// </summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)] public byte[] reserved;
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)]
|
||||
public byte[] reserved;
|
||||
/// <summary>
|
||||
/// Size of data following this field
|
||||
/// このセクタ部のデータサイズ
|
||||
|
||||
@@ -57,23 +57,23 @@ namespace DiscImageChef.DiscImages
|
||||
{
|
||||
imageInfo = new ImageInfo
|
||||
{
|
||||
ReadableSectorTags = new List<SectorTagType>(),
|
||||
ReadableMediaTags = new List<MediaTagType>(),
|
||||
HasPartitions = false,
|
||||
HasSessions = false,
|
||||
Application = "DiskCopy",
|
||||
Creator = null,
|
||||
Comments = null,
|
||||
MediaManufacturer = null,
|
||||
MediaModel = null,
|
||||
MediaSerialNumber = null,
|
||||
MediaBarcode = null,
|
||||
MediaPartNumber = null,
|
||||
MediaSequence = 0,
|
||||
LastMediaSequence = 0,
|
||||
DriveManufacturer = null,
|
||||
DriveModel = null,
|
||||
DriveSerialNumber = null,
|
||||
ReadableSectorTags = new List<SectorTagType>(),
|
||||
ReadableMediaTags = new List<MediaTagType>(),
|
||||
HasPartitions = false,
|
||||
HasSessions = false,
|
||||
Application = "DiskCopy",
|
||||
Creator = null,
|
||||
Comments = null,
|
||||
MediaManufacturer = null,
|
||||
MediaModel = null,
|
||||
MediaSerialNumber = null,
|
||||
MediaBarcode = null,
|
||||
MediaPartNumber = null,
|
||||
MediaSequence = 0,
|
||||
LastMediaSequence = 0,
|
||||
DriveManufacturer = null,
|
||||
DriveModel = null,
|
||||
DriveSerialNumber = null,
|
||||
DriveFirmwareRevision = null
|
||||
};
|
||||
}
|
||||
@@ -81,7 +81,7 @@ namespace DiscImageChef.DiscImages
|
||||
public ImageInfo Info => imageInfo;
|
||||
|
||||
public string Name => "Digital Research DiskCopy";
|
||||
public Guid Id => new Guid("9F0BE551-8BAB-4038-8B5A-691F1BF5FFF3");
|
||||
public Guid Id => new Guid("9F0BE551-8BAB-4038-8B5A-691F1BF5FFF3");
|
||||
|
||||
public string ImageFormat => "Digital Research DiskCopy";
|
||||
|
||||
@@ -112,21 +112,21 @@ namespace DiscImageChef.DiscImages
|
||||
string sig = StringHandlers.CToString(tmpFooter.signature);
|
||||
|
||||
DicConsole.DebugWriteLine("DRI DiskCopy plugin", "tmp_footer.signature = \"{0}\"", sig);
|
||||
DicConsole.DebugWriteLine("DRI DiskCopy plugin", "tmp_footer.bpb.five = {0}", tmpFooter.bpb.five);
|
||||
DicConsole.DebugWriteLine("DRI DiskCopy plugin", "tmp_footer.bpb.five = {0}", tmpFooter.bpb.five);
|
||||
DicConsole.DebugWriteLine("DRI DiskCopy plugin", "tmp_footer.bpb.driveCode = {0}", tmpFooter.bpb.driveCode);
|
||||
DicConsole.DebugWriteLine("DRI DiskCopy plugin", "tmp_footer.bpb.unknown = {0}", tmpFooter.bpb.unknown);
|
||||
DicConsole.DebugWriteLine("DRI DiskCopy plugin", "tmp_footer.bpb.unknown = {0}", tmpFooter.bpb.unknown);
|
||||
DicConsole.DebugWriteLine("DRI DiskCopy plugin", "tmp_footer.bpb.cylinders = {0}", tmpFooter.bpb.cylinders);
|
||||
DicConsole.DebugWriteLine("DRI DiskCopy plugin", "tmp_footer.bpb.unknown2 = {0}", tmpFooter.bpb.unknown2);
|
||||
DicConsole.DebugWriteLine("DRI DiskCopy plugin", "tmp_footer.bpb.bps = {0}", tmpFooter.bpb.bps);
|
||||
DicConsole.DebugWriteLine("DRI DiskCopy plugin", "tmp_footer.bpb.spc = {0}", tmpFooter.bpb.spc);
|
||||
DicConsole.DebugWriteLine("DRI DiskCopy plugin", "tmp_footer.bpb.rsectors = {0}", tmpFooter.bpb.rsectors);
|
||||
DicConsole.DebugWriteLine("DRI DiskCopy plugin", "tmp_footer.bpb.fats_no = {0}", tmpFooter.bpb.fats_no);
|
||||
DicConsole.DebugWriteLine("DRI DiskCopy plugin", "tmp_footer.bpb.sectors = {0}", tmpFooter.bpb.sectors);
|
||||
DicConsole.DebugWriteLine("DRI DiskCopy plugin", "tmp_footer.bpb.unknown2 = {0}", tmpFooter.bpb.unknown2);
|
||||
DicConsole.DebugWriteLine("DRI DiskCopy plugin", "tmp_footer.bpb.bps = {0}", tmpFooter.bpb.bps);
|
||||
DicConsole.DebugWriteLine("DRI DiskCopy plugin", "tmp_footer.bpb.spc = {0}", tmpFooter.bpb.spc);
|
||||
DicConsole.DebugWriteLine("DRI DiskCopy plugin", "tmp_footer.bpb.rsectors = {0}", tmpFooter.bpb.rsectors);
|
||||
DicConsole.DebugWriteLine("DRI DiskCopy plugin", "tmp_footer.bpb.fats_no = {0}", tmpFooter.bpb.fats_no);
|
||||
DicConsole.DebugWriteLine("DRI DiskCopy plugin", "tmp_footer.bpb.sectors = {0}", tmpFooter.bpb.sectors);
|
||||
DicConsole.DebugWriteLine("DRI DiskCopy plugin", "tmp_footer.bpb.media_descriptor = {0}",
|
||||
tmpFooter.bpb.media_descriptor);
|
||||
DicConsole.DebugWriteLine("DRI DiskCopy plugin", "tmp_footer.bpb.spfat = {0}", tmpFooter.bpb.spfat);
|
||||
DicConsole.DebugWriteLine("DRI DiskCopy plugin", "tmp_footer.bpb.sptrack = {0}", tmpFooter.bpb.sptrack);
|
||||
DicConsole.DebugWriteLine("DRI DiskCopy plugin", "tmp_footer.bpb.heads = {0}", tmpFooter.bpb.heads);
|
||||
DicConsole.DebugWriteLine("DRI DiskCopy plugin", "tmp_footer.bpb.spfat = {0}", tmpFooter.bpb.spfat);
|
||||
DicConsole.DebugWriteLine("DRI DiskCopy plugin", "tmp_footer.bpb.sptrack = {0}", tmpFooter.bpb.sptrack);
|
||||
DicConsole.DebugWriteLine("DRI DiskCopy plugin", "tmp_footer.bpb.heads = {0}", tmpFooter.bpb.heads);
|
||||
DicConsole.DebugWriteLine("DRI DiskCopy plugin", "tmp_footer.bpb.hsectors = {0}", tmpFooter.bpb.hsectors);
|
||||
DicConsole.DebugWriteLine("DRI DiskCopy plugin", "tmp_footer.bpb.drive_no = {0}", tmpFooter.bpb.drive_no);
|
||||
DicConsole.DebugWriteLine("DRI DiskCopy plugin", "tmp_footer.bpb.unknown3 = {0}", tmpFooter.bpb.unknown3);
|
||||
@@ -159,7 +159,7 @@ namespace DiscImageChef.DiscImages
|
||||
stream.Seek(-buffer.Length, SeekOrigin.End);
|
||||
stream.Read(buffer, 0, buffer.Length);
|
||||
|
||||
footer = new DriFooter();
|
||||
footer = new DriFooter();
|
||||
IntPtr ftrPtr = Marshal.AllocHGlobal(buffer.Length);
|
||||
Marshal.Copy(buffer, 0, ftrPtr, buffer.Length);
|
||||
footer = (DriFooter)Marshal.PtrToStructure(ftrPtr, typeof(DriFooter));
|
||||
@@ -176,98 +176,51 @@ namespace DiscImageChef.DiscImages
|
||||
|
||||
if(footer.bpb.sectors * footer.bpb.bps + Marshal.SizeOf(footer) != stream.Length) return false;
|
||||
|
||||
imageInfo.Cylinders = footer.bpb.cylinders;
|
||||
imageInfo.Heads = footer.bpb.heads;
|
||||
imageInfo.SectorsPerTrack = footer.bpb.sptrack;
|
||||
imageInfo.Sectors = footer.bpb.sectors;
|
||||
imageInfo.SectorSize = footer.bpb.bps;
|
||||
imageInfo.Cylinders = footer.bpb.cylinders;
|
||||
imageInfo.Heads = footer.bpb.heads;
|
||||
imageInfo.SectorsPerTrack = footer.bpb.sptrack;
|
||||
imageInfo.Sectors = footer.bpb.sectors;
|
||||
imageInfo.SectorSize = footer.bpb.bps;
|
||||
imageInfo.ApplicationVersion = matchSignature.Groups["version"].Value;
|
||||
|
||||
driImageFilter = imageFilter;
|
||||
|
||||
imageInfo.ImageSize = (ulong)(stream.Length - Marshal.SizeOf(footer));
|
||||
imageInfo.CreationTime = imageFilter.GetCreationTime();
|
||||
imageInfo.ImageSize = (ulong)(stream.Length - Marshal.SizeOf(footer));
|
||||
imageInfo.CreationTime = imageFilter.GetCreationTime();
|
||||
imageInfo.LastModificationTime = imageFilter.GetLastWriteTime();
|
||||
|
||||
DicConsole.DebugWriteLine("DRI DiskCopy plugin", "Image application = {0} version {1}",
|
||||
imageInfo.Application, imageInfo.ApplicationVersion);
|
||||
|
||||
// Correct some incorrect data in images of NEC 2HD disks
|
||||
if(imageInfo.Cylinders == 77 && imageInfo.Heads == 2 && imageInfo.SectorsPerTrack == 16 &&
|
||||
imageInfo.SectorSize == 512 &&
|
||||
(footer.bpb.driveCode == DriDriveCodes.md2hd || footer.bpb.driveCode == DriDriveCodes.mf2hd))
|
||||
if(imageInfo.Cylinders == 77 && imageInfo.Heads == 2 &&
|
||||
imageInfo.SectorsPerTrack == 16 &&
|
||||
imageInfo.SectorSize == 512 &&
|
||||
(footer.bpb.driveCode == DriDriveCodes.md2hd ||
|
||||
footer.bpb.driveCode == DriDriveCodes.mf2hd))
|
||||
{
|
||||
imageInfo.SectorsPerTrack = 8;
|
||||
imageInfo.SectorSize = 1024;
|
||||
imageInfo.SectorSize = 1024;
|
||||
}
|
||||
|
||||
switch(footer.bpb.driveCode)
|
||||
imageInfo.MediaType =
|
||||
Geometry.GetMediaType(((ushort)imageInfo.Cylinders, (byte)imageInfo.Heads,
|
||||
(ushort)imageInfo.SectorsPerTrack, imageInfo.SectorSize, MediaEncoding.MFM, false
|
||||
));
|
||||
|
||||
switch(imageInfo.MediaType)
|
||||
{
|
||||
case DriDriveCodes.md2hd:
|
||||
if(imageInfo.Heads == 2 && imageInfo.Cylinders == 80 && imageInfo.SectorsPerTrack == 15 &&
|
||||
imageInfo.SectorSize == 512) imageInfo.MediaType = MediaType.DOS_525_HD;
|
||||
else if(imageInfo.Heads == 2 && imageInfo.Cylinders == 80 && imageInfo.SectorsPerTrack == 16 &&
|
||||
imageInfo.SectorSize == 256) imageInfo.MediaType = MediaType.ACORN_525_DS_DD;
|
||||
else if(imageInfo.Heads == 1 && imageInfo.Cylinders == 80 && imageInfo.SectorsPerTrack == 16 &&
|
||||
imageInfo.SectorSize == 256) imageInfo.MediaType = MediaType.ACORN_525_SS_DD_80;
|
||||
else if(imageInfo.Heads == 1 && imageInfo.Cylinders == 80 && imageInfo.SectorsPerTrack == 10 &&
|
||||
imageInfo.SectorSize == 256) imageInfo.MediaType = MediaType.ACORN_525_SS_SD_80;
|
||||
else if(imageInfo.Heads == 2 && imageInfo.Cylinders == 77 && imageInfo.SectorsPerTrack == 8 &&
|
||||
imageInfo.SectorSize == 1024) imageInfo.MediaType = MediaType.NEC_525_HD;
|
||||
else goto case DriDriveCodes.md2dd;
|
||||
case MediaType.NEC_525_HD when footer.bpb.driveCode == DriDriveCodes.mf2hd ||
|
||||
footer.bpb.driveCode == DriDriveCodes.mf2ed:
|
||||
imageInfo.MediaType = MediaType.NEC_35_HD_8;
|
||||
break;
|
||||
case DriDriveCodes.md2dd:
|
||||
if(imageInfo.Heads == 1 && imageInfo.Cylinders == 40 && imageInfo.SectorsPerTrack == 8 &&
|
||||
imageInfo.SectorSize == 512) imageInfo.MediaType = MediaType.DOS_525_SS_DD_8;
|
||||
else if(imageInfo.Heads == 1 && imageInfo.Cylinders == 40 && imageInfo.SectorsPerTrack == 9 &&
|
||||
imageInfo.SectorSize == 512) imageInfo.MediaType = MediaType.DOS_525_SS_DD_9;
|
||||
else if(imageInfo.Heads == 2 && imageInfo.Cylinders == 40 && imageInfo.SectorsPerTrack == 8 &&
|
||||
imageInfo.SectorSize == 512) imageInfo.MediaType = MediaType.DOS_525_DS_DD_8;
|
||||
else if(imageInfo.Heads == 2 && imageInfo.Cylinders == 40 && imageInfo.SectorsPerTrack == 9 &&
|
||||
imageInfo.SectorSize == 512) imageInfo.MediaType = MediaType.DOS_525_DS_DD_9;
|
||||
else if(imageInfo.Heads == 1 && imageInfo.Cylinders == 40 && imageInfo.SectorsPerTrack == 18 &&
|
||||
imageInfo.SectorSize == 128) imageInfo.MediaType = MediaType.ATARI_525_SD;
|
||||
else if(imageInfo.Heads == 1 && imageInfo.Cylinders == 40 && imageInfo.SectorsPerTrack == 26 &&
|
||||
imageInfo.SectorSize == 128) imageInfo.MediaType = MediaType.ATARI_525_ED;
|
||||
else if(imageInfo.Heads == 1 && imageInfo.Cylinders == 40 && imageInfo.SectorsPerTrack == 18 &&
|
||||
imageInfo.SectorSize == 256) imageInfo.MediaType = MediaType.ATARI_525_DD;
|
||||
else imageInfo.MediaType = MediaType.Unknown;
|
||||
case MediaType.DOS_525_HD when footer.bpb.driveCode == DriDriveCodes.mf2hd ||
|
||||
footer.bpb.driveCode == DriDriveCodes.mf2ed:
|
||||
imageInfo.MediaType = MediaType.NEC_35_HD_15;
|
||||
break;
|
||||
case DriDriveCodes.mf2ed:
|
||||
if(imageInfo.Heads == 2 && imageInfo.Cylinders == 80 && imageInfo.SectorsPerTrack == 36 &&
|
||||
imageInfo.SectorSize == 512) imageInfo.MediaType = MediaType.DOS_35_ED;
|
||||
else goto case DriDriveCodes.mf2hd;
|
||||
break;
|
||||
case DriDriveCodes.mf2hd:
|
||||
if(imageInfo.Heads == 2 && imageInfo.Cylinders == 80 && imageInfo.SectorsPerTrack == 18 &&
|
||||
imageInfo.SectorSize == 512) imageInfo.MediaType = MediaType.DOS_35_HD;
|
||||
else if(imageInfo.Heads == 2 && imageInfo.Cylinders == 80 && imageInfo.SectorsPerTrack == 21 &&
|
||||
imageInfo.SectorSize == 512) imageInfo.MediaType = MediaType.DMF;
|
||||
else if(imageInfo.Heads == 2 && imageInfo.Cylinders == 82 && imageInfo.SectorsPerTrack == 21 &&
|
||||
imageInfo.SectorSize == 512) imageInfo.MediaType = MediaType.DMF_82;
|
||||
else if(imageInfo.Heads == 2 && imageInfo.Cylinders == 77 && imageInfo.SectorsPerTrack == 8 &&
|
||||
imageInfo.SectorSize == 1024) imageInfo.MediaType = MediaType.NEC_35_HD_8;
|
||||
else if(imageInfo.Heads == 2 && imageInfo.Cylinders == 80 && imageInfo.SectorsPerTrack == 15 &&
|
||||
imageInfo.SectorSize == 512) imageInfo.MediaType = MediaType.NEC_35_HD_15;
|
||||
else goto case DriDriveCodes.mf2dd;
|
||||
break;
|
||||
case DriDriveCodes.mf2dd:
|
||||
if(imageInfo.Heads == 2 && imageInfo.Cylinders == 80 && imageInfo.SectorsPerTrack == 9 &&
|
||||
imageInfo.SectorSize == 512) imageInfo.MediaType = MediaType.DOS_35_DS_DD_9;
|
||||
else if(imageInfo.Heads == 2 && imageInfo.Cylinders == 80 && imageInfo.SectorsPerTrack == 8 &&
|
||||
imageInfo.SectorSize == 512) imageInfo.MediaType = MediaType.DOS_35_DS_DD_8;
|
||||
else if(imageInfo.Heads == 1 && imageInfo.Cylinders == 80 && imageInfo.SectorsPerTrack == 9 &&
|
||||
imageInfo.SectorSize == 512) imageInfo.MediaType = MediaType.DOS_35_SS_DD_9;
|
||||
else if(imageInfo.Heads == 1 && imageInfo.Cylinders == 80 && imageInfo.SectorsPerTrack == 8 &&
|
||||
imageInfo.SectorSize == 512) imageInfo.MediaType = MediaType.DOS_35_SS_DD_8;
|
||||
else if(imageInfo.Heads == 2 && imageInfo.Cylinders == 80 && imageInfo.SectorsPerTrack == 5 &&
|
||||
imageInfo.SectorSize == 1024) imageInfo.MediaType = MediaType.ACORN_35_DS_DD;
|
||||
else if(imageInfo.Heads == 1 && imageInfo.Cylinders == 70 && imageInfo.SectorsPerTrack == 9 &&
|
||||
imageInfo.SectorSize == 512) imageInfo.MediaType = MediaType.Apricot_35;
|
||||
else imageInfo.MediaType = MediaType.Unknown;
|
||||
break;
|
||||
default:
|
||||
imageInfo.MediaType = MediaType.Unknown;
|
||||
case MediaType.RX50 when footer.bpb.driveCode == DriDriveCodes.md2dd ||
|
||||
footer.bpb.driveCode == DriDriveCodes.md2hd:
|
||||
imageInfo.MediaType = MediaType.ATARI_35_SS_DD;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -289,7 +242,7 @@ namespace DiscImageChef.DiscImages
|
||||
}
|
||||
|
||||
public bool? VerifySectors(ulong sectorAddress, uint length, out List<ulong> failingLbas,
|
||||
out List<ulong> unknownLbas)
|
||||
out List<ulong> unknownLbas)
|
||||
{
|
||||
failingLbas = new List<ulong>();
|
||||
unknownLbas = new List<ulong>();
|
||||
@@ -300,7 +253,7 @@ namespace DiscImageChef.DiscImages
|
||||
}
|
||||
|
||||
public bool? VerifySectors(ulong sectorAddress, uint length, uint track, out List<ulong> failingLbas,
|
||||
out List<ulong> unknownLbas)
|
||||
out List<ulong> unknownLbas)
|
||||
{
|
||||
failingLbas = new List<ulong>();
|
||||
unknownLbas = new List<ulong>();
|
||||
@@ -336,7 +289,7 @@ namespace DiscImageChef.DiscImages
|
||||
byte[] buffer = new byte[length * imageInfo.SectorSize];
|
||||
|
||||
Stream stream = driImageFilter.GetDataForkStream();
|
||||
stream.Seek((long)(sectorAddress * imageInfo.SectorSize), SeekOrigin.Begin);
|
||||
stream.Seek((long)(sectorAddress * imageInfo.SectorSize), SeekOrigin.Begin);
|
||||
stream.Read(buffer, 0, (int)(length * imageInfo.SectorSize));
|
||||
|
||||
return buffer;
|
||||
@@ -406,7 +359,8 @@ namespace DiscImageChef.DiscImages
|
||||
struct DriFooter
|
||||
{
|
||||
/// <summary>Signature: "DiskImage 2.01 (C) 1990,1991 Digital Research Inc\0"</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 51)] public byte[] signature;
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 51)]
|
||||
public byte[] signature;
|
||||
/// <summary>Information about the disk image, mostly imitates FAT BPB</summary>
|
||||
public DriBpb bpb;
|
||||
/// <summary>Information about the disk image, mostly imitates FAT BPB, copy</summary>
|
||||
@@ -457,7 +411,8 @@ namespace DiscImageChef.DiscImages
|
||||
/// <summary>Sectors per track (again?)</summary>
|
||||
public ushort sptrack2;
|
||||
/// <summary>Seems to be 0</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 144)] public byte[] unknown5;
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 144)]
|
||||
public byte[] unknown5;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -66,7 +66,6 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Runtime.InteropServices;
|
||||
using DiscImageChef.CommonTypes;
|
||||
using DiscImageChef.Console;
|
||||
@@ -76,17 +75,6 @@ namespace DiscImageChef.DiscImages
|
||||
{
|
||||
public class HdCopy : IMediaImage
|
||||
{
|
||||
readonly MediaTypeTableEntry[] mediaTypes =
|
||||
{
|
||||
new MediaTypeTableEntry {Tracks = 80, SectorsPerTrack = 8, MediaType = MediaType.DOS_35_DS_DD_8},
|
||||
new MediaTypeTableEntry {Tracks = 80, SectorsPerTrack = 9, MediaType = MediaType.DOS_35_DS_DD_9},
|
||||
new MediaTypeTableEntry {Tracks = 80, SectorsPerTrack = 18, MediaType = MediaType.DOS_35_HD},
|
||||
new MediaTypeTableEntry {Tracks = 80, SectorsPerTrack = 36, MediaType = MediaType.DOS_35_ED},
|
||||
new MediaTypeTableEntry {Tracks = 40, SectorsPerTrack = 8, MediaType = MediaType.DOS_525_DS_DD_8},
|
||||
new MediaTypeTableEntry {Tracks = 40, SectorsPerTrack = 9, MediaType = MediaType.DOS_525_DS_DD_9},
|
||||
new MediaTypeTableEntry {Tracks = 80, SectorsPerTrack = 15, MediaType = MediaType.DOS_525_HD}
|
||||
};
|
||||
|
||||
/// <summary>
|
||||
/// The HDCP file header after the image has been opened
|
||||
/// </summary>
|
||||
@@ -95,7 +83,7 @@ namespace DiscImageChef.DiscImages
|
||||
/// <summary>
|
||||
/// The ImageFilter we're reading from, after the file has been opened
|
||||
/// </summary>
|
||||
IFilter hdcpImageFilter;
|
||||
IFilter hdcpImageFilter;
|
||||
ImageInfo imageInfo;
|
||||
|
||||
/// <summary>
|
||||
@@ -112,25 +100,25 @@ namespace DiscImageChef.DiscImages
|
||||
{
|
||||
imageInfo = new ImageInfo
|
||||
{
|
||||
ReadableSectorTags = new List<SectorTagType>(),
|
||||
ReadableMediaTags = new List<MediaTagType>(),
|
||||
HasPartitions = false,
|
||||
HasSessions = false,
|
||||
Version = null,
|
||||
Application = null,
|
||||
ApplicationVersion = null,
|
||||
Creator = null,
|
||||
Comments = null,
|
||||
MediaManufacturer = null,
|
||||
MediaModel = null,
|
||||
MediaSerialNumber = null,
|
||||
MediaBarcode = null,
|
||||
MediaPartNumber = null,
|
||||
MediaSequence = 0,
|
||||
LastMediaSequence = 0,
|
||||
DriveManufacturer = null,
|
||||
DriveModel = null,
|
||||
DriveSerialNumber = null,
|
||||
ReadableSectorTags = new List<SectorTagType>(),
|
||||
ReadableMediaTags = new List<MediaTagType>(),
|
||||
HasPartitions = false,
|
||||
HasSessions = false,
|
||||
Version = null,
|
||||
Application = null,
|
||||
ApplicationVersion = null,
|
||||
Creator = null,
|
||||
Comments = null,
|
||||
MediaManufacturer = null,
|
||||
MediaModel = null,
|
||||
MediaSerialNumber = null,
|
||||
MediaBarcode = null,
|
||||
MediaPartNumber = null,
|
||||
MediaSequence = 0,
|
||||
LastMediaSequence = 0,
|
||||
DriveManufacturer = null,
|
||||
DriveModel = null,
|
||||
DriveSerialNumber = null,
|
||||
DriveFirmwareRevision = null
|
||||
};
|
||||
}
|
||||
@@ -138,10 +126,10 @@ namespace DiscImageChef.DiscImages
|
||||
public ImageInfo Info => imageInfo;
|
||||
|
||||
public string Name => "HD-Copy disk image";
|
||||
public Guid Id => new Guid("8D57483F-71A5-42EC-9B87-66AEC439C792");
|
||||
public Guid Id => new Guid("8D57483F-71A5-42EC-9B87-66AEC439C792");
|
||||
|
||||
public string ImageFormat => "HD-Copy image";
|
||||
public List<Partition> Partitions =>
|
||||
public string ImageFormat => "HD-Copy image";
|
||||
public List<Partition> Partitions =>
|
||||
throw new FeatureUnsupportedImageException("Feature not supported by image format");
|
||||
|
||||
public List<Track> Tracks =>
|
||||
@@ -158,10 +146,10 @@ namespace DiscImageChef.DiscImages
|
||||
if(stream.Length < 2 + 2 * 82) return false;
|
||||
|
||||
byte[] header = new byte[2 + 2 * 82];
|
||||
stream.Read(header, 0, 2 + 2 * 82);
|
||||
stream.Read(header, 0, 2 + 2 * 82);
|
||||
|
||||
IntPtr hdrPtr = Marshal.AllocHGlobal(2 + 2 * 82);
|
||||
Marshal.Copy(header, 0, hdrPtr, 2 + 2 * 82);
|
||||
Marshal.Copy(header, 0, hdrPtr, 2 + 2 * 82);
|
||||
HdcpFileHeader fheader = (HdcpFileHeader)Marshal.PtrToStructure(hdrPtr, typeof(HdcpFileHeader));
|
||||
Marshal.FreeHGlobal(hdrPtr);
|
||||
|
||||
@@ -177,7 +165,9 @@ namespace DiscImageChef.DiscImages
|
||||
if(fheader.trackMap[0] != 1 || fheader.trackMap[1] != 1) return false;
|
||||
|
||||
// all other tracks must be either present (=1) or absent (=0)
|
||||
for(int i = 0; i < 2 * 82; i++) if(fheader.trackMap[i] > 1) return false;
|
||||
for(int i = 0; i < 2 * 82; i++)
|
||||
if(fheader.trackMap[i] > 1)
|
||||
return false;
|
||||
|
||||
// TODO: validate the tracks
|
||||
// For now, having a valid header should be sufficient.
|
||||
@@ -186,54 +176,51 @@ namespace DiscImageChef.DiscImages
|
||||
|
||||
public bool OpenImage(IFilter imageFilter)
|
||||
{
|
||||
long currentOffset;
|
||||
|
||||
Stream stream = imageFilter.GetDataForkStream();
|
||||
stream.Seek(0, SeekOrigin.Begin);
|
||||
|
||||
byte[] header = new byte[2 + 2 * 82];
|
||||
stream.Read(header, 0, 2 + 2 * 82);
|
||||
stream.Read(header, 0, 2 + 2 * 82);
|
||||
|
||||
IntPtr hdrPtr = Marshal.AllocHGlobal(2 + 2 * 82);
|
||||
Marshal.Copy(header, 0, hdrPtr, 2 + 2 * 82);
|
||||
Marshal.Copy(header, 0, hdrPtr, 2 + 2 * 82);
|
||||
HdcpFileHeader fheader = (HdcpFileHeader)Marshal.PtrToStructure(hdrPtr, typeof(HdcpFileHeader));
|
||||
Marshal.FreeHGlobal(hdrPtr);
|
||||
DicConsole.DebugWriteLine("HDCP plugin",
|
||||
"Detected HD-Copy image with {0} tracks and {1} sectors per track.",
|
||||
fheader.lastCylinder + 1, fheader.sectorsPerTrack);
|
||||
|
||||
imageInfo.Cylinders = (uint)fheader.lastCylinder + 1;
|
||||
imageInfo.Cylinders = (uint)fheader.lastCylinder + 1;
|
||||
imageInfo.SectorsPerTrack = fheader.sectorsPerTrack;
|
||||
imageInfo.SectorSize = 512; // only 512 bytes per sector supported
|
||||
imageInfo.Heads = 2; // only 2-sided floppies are supported
|
||||
imageInfo.Sectors = 2 * imageInfo.Cylinders * imageInfo.SectorsPerTrack;
|
||||
imageInfo.ImageSize = imageInfo.Sectors * imageInfo.SectorSize;
|
||||
imageInfo.SectorSize = 512; // only 512 bytes per sector supported
|
||||
imageInfo.Heads = 2; // only 2-sided floppies are supported
|
||||
imageInfo.Sectors = 2 * imageInfo.Cylinders * imageInfo.SectorsPerTrack;
|
||||
imageInfo.ImageSize = imageInfo.Sectors * imageInfo.SectorSize;
|
||||
|
||||
imageInfo.XmlMediaType = XmlMediaType.BlockMedia;
|
||||
|
||||
imageInfo.CreationTime = imageFilter.GetCreationTime();
|
||||
imageInfo.CreationTime = imageFilter.GetCreationTime();
|
||||
imageInfo.LastModificationTime = imageFilter.GetLastWriteTime();
|
||||
imageInfo.MediaTitle = Path.GetFileNameWithoutExtension(imageFilter.GetFilename());
|
||||
imageInfo.MediaType =
|
||||
(from ent in mediaTypes
|
||||
where ent.Tracks == imageInfo.Cylinders && ent.SectorsPerTrack == imageInfo.SectorsPerTrack
|
||||
select ent.MediaType).FirstOrDefault();
|
||||
imageInfo.MediaTitle = Path.GetFileNameWithoutExtension(imageFilter.GetFilename());
|
||||
imageInfo.MediaType =
|
||||
Geometry.GetMediaType(((ushort)imageInfo.Cylinders, 2, (ushort)imageInfo.SectorsPerTrack, 512,
|
||||
MediaEncoding.MFM, false));
|
||||
|
||||
// the start offset of the track data
|
||||
currentOffset = 2 + 2 * 82;
|
||||
long currentOffset = 2 + 2 * 82;
|
||||
|
||||
// build table of track offsets
|
||||
for(int i = 0; i < imageInfo.Cylinders * 2; i++)
|
||||
if(fheader.trackMap[i] == 0) trackOffset[i] = -1;
|
||||
for(int i = 0; i < imageInfo.Cylinders * 2; i++)
|
||||
if(fheader.trackMap[i] == 0)
|
||||
trackOffset[i] = -1;
|
||||
else
|
||||
{
|
||||
// track is present, read the block header
|
||||
if(currentOffset + 3 >= stream.Length) return false;
|
||||
|
||||
byte[] blkHeader = new byte[2];
|
||||
short blkLength;
|
||||
stream.Read(blkHeader, 0, 2);
|
||||
blkLength = BitConverter.ToInt16(blkHeader, 0);
|
||||
short blkLength = BitConverter.ToInt16(blkHeader, 0);
|
||||
|
||||
// assume block sizes are positive
|
||||
if(blkLength < 0) return false;
|
||||
@@ -251,57 +238,14 @@ namespace DiscImageChef.DiscImages
|
||||
if(currentOffset > stream.Length) return false;
|
||||
|
||||
// save some variables for later use
|
||||
fileHeader = fheader;
|
||||
fileHeader = fheader;
|
||||
hdcpImageFilter = imageFilter;
|
||||
return true;
|
||||
}
|
||||
|
||||
void ReadTrackIntoCache(Stream stream, int tracknum)
|
||||
{
|
||||
byte[] trackData = new byte[imageInfo.SectorSize * imageInfo.SectorsPerTrack];
|
||||
byte[] blkHeader = new byte[3];
|
||||
byte escapeByte;
|
||||
short compressedLength;
|
||||
|
||||
// check that track is present
|
||||
if(trackOffset[tracknum] == -1)
|
||||
throw new InvalidDataException("Tried reading a track that is not present in image");
|
||||
|
||||
stream.Seek(trackOffset[tracknum], SeekOrigin.Begin);
|
||||
|
||||
// read the compressed track data
|
||||
stream.Read(blkHeader, 0, 3);
|
||||
compressedLength = (short)(BitConverter.ToInt16(blkHeader, 0) - 1);
|
||||
escapeByte = blkHeader[2];
|
||||
|
||||
byte[] cBuffer = new byte[compressedLength];
|
||||
stream.Read(cBuffer, 0, compressedLength);
|
||||
|
||||
// decompress the data
|
||||
int sIndex = 0; // source buffer position
|
||||
int dIndex = 0; // destination buffer position
|
||||
while(sIndex < compressedLength)
|
||||
if(cBuffer[sIndex] == escapeByte)
|
||||
{
|
||||
sIndex++; // skip over escape byte
|
||||
byte fillByte = cBuffer[sIndex++];
|
||||
byte fillCount = cBuffer[sIndex++];
|
||||
// fill destination buffer
|
||||
for(int i = 0; i < fillCount; i++) trackData[dIndex++] = fillByte;
|
||||
}
|
||||
else trackData[dIndex++] = cBuffer[sIndex++];
|
||||
|
||||
// check that the number of bytes decompressed matches a whole track
|
||||
if(dIndex != imageInfo.SectorSize * imageInfo.SectorsPerTrack)
|
||||
throw new InvalidDataException("Track decompression yielded incomplete data");
|
||||
|
||||
// store track in cache
|
||||
trackCache[tracknum] = trackData;
|
||||
}
|
||||
|
||||
public byte[] ReadSector(ulong sectorAddress)
|
||||
{
|
||||
int trackNum = (int)(sectorAddress / imageInfo.SectorsPerTrack);
|
||||
int trackNum = (int)(sectorAddress / imageInfo.SectorsPerTrack);
|
||||
int sectorOffset = (int)(sectorAddress % (imageInfo.SectorsPerTrack * imageInfo.SectorSize));
|
||||
|
||||
if(sectorAddress > imageInfo.Sectors - 1)
|
||||
@@ -412,7 +356,7 @@ namespace DiscImageChef.DiscImages
|
||||
}
|
||||
|
||||
public bool? VerifySectors(ulong sectorAddress, uint length, out List<ulong> failingLbas,
|
||||
out List<ulong> unknownLbas)
|
||||
out List<ulong> unknownLbas)
|
||||
{
|
||||
failingLbas = new List<ulong>();
|
||||
unknownLbas = new List<ulong>();
|
||||
@@ -422,7 +366,7 @@ namespace DiscImageChef.DiscImages
|
||||
}
|
||||
|
||||
public bool? VerifySectors(ulong sectorAddress, uint length, uint track, out List<ulong> failingLbas,
|
||||
out List<ulong> unknownLbas)
|
||||
out List<ulong> unknownLbas)
|
||||
{
|
||||
throw new FeatureUnsupportedImageException("Feature not supported by image format");
|
||||
}
|
||||
@@ -432,6 +376,48 @@ namespace DiscImageChef.DiscImages
|
||||
return null;
|
||||
}
|
||||
|
||||
void ReadTrackIntoCache(Stream stream, int tracknum)
|
||||
{
|
||||
byte[] trackData = new byte[imageInfo.SectorSize * imageInfo.SectorsPerTrack];
|
||||
byte[] blkHeader = new byte[3];
|
||||
|
||||
// check that track is present
|
||||
if(trackOffset[tracknum] == -1)
|
||||
throw new InvalidDataException("Tried reading a track that is not present in image");
|
||||
|
||||
stream.Seek(trackOffset[tracknum], SeekOrigin.Begin);
|
||||
|
||||
// read the compressed track data
|
||||
stream.Read(blkHeader, 0, 3);
|
||||
short compressedLength = (short)(BitConverter.ToInt16(blkHeader, 0) - 1);
|
||||
byte escapeByte = blkHeader[2];
|
||||
|
||||
byte[] cBuffer = new byte[compressedLength];
|
||||
stream.Read(cBuffer, 0, compressedLength);
|
||||
|
||||
// decompress the data
|
||||
int sIndex = 0; // source buffer position
|
||||
int dIndex = 0; // destination buffer position
|
||||
while(sIndex < compressedLength)
|
||||
if(cBuffer[sIndex] == escapeByte)
|
||||
{
|
||||
sIndex++; // skip over escape byte
|
||||
byte fillByte = cBuffer[sIndex++];
|
||||
byte fillCount = cBuffer[sIndex++];
|
||||
// fill destination buffer
|
||||
for(int i = 0; i < fillCount; i++) trackData[dIndex++] = fillByte;
|
||||
}
|
||||
else
|
||||
trackData[dIndex++] = cBuffer[sIndex++];
|
||||
|
||||
// check that the number of bytes decompressed matches a whole track
|
||||
if(dIndex != imageInfo.SectorSize * imageInfo.SectorsPerTrack)
|
||||
throw new InvalidDataException("Track decompression yielded incomplete data");
|
||||
|
||||
// store track in cache
|
||||
trackCache[tracknum] = trackData;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The global header of a HDCP image file
|
||||
/// </summary>
|
||||
@@ -454,7 +440,8 @@ namespace DiscImageChef.DiscImages
|
||||
/// 0 means track is not present, 1 means it is present.
|
||||
/// The first 2 tracks are always present.
|
||||
/// </summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2 * 82)] public byte[] trackMap;
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2 * 82)]
|
||||
public byte[] trackMap;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -473,12 +460,5 @@ namespace DiscImageChef.DiscImages
|
||||
/// </summary>
|
||||
public byte escape;
|
||||
}
|
||||
|
||||
struct MediaTypeTableEntry
|
||||
{
|
||||
public byte Tracks;
|
||||
public byte SectorsPerTrack;
|
||||
public MediaType MediaType;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -43,12 +43,11 @@ namespace DiscImageChef.DiscImages
|
||||
{
|
||||
public class Imd : IMediaImage
|
||||
{
|
||||
const byte SECTOR_CYLINDER_MAP_MASK = 0x80;
|
||||
const byte SECTOR_HEAD_MAP_MASK = 0x40;
|
||||
const byte COMMENT_END = 0x1A;
|
||||
const string REGEX_HEADER =
|
||||
@"IMD (?<version>\d.\d+):\s+(?<day>\d+)\/\s*(?<month>\d+)\/(?<year>\d+)\s+(?<hour>\d+):(?<minute>\d+):(?<second>\d+)\r\n"
|
||||
;
|
||||
const byte SECTOR_CYLINDER_MAP_MASK = 0x80;
|
||||
const byte SECTOR_HEAD_MAP_MASK = 0x40;
|
||||
const byte COMMENT_END = 0x1A;
|
||||
const string REGEX_HEADER =
|
||||
@"IMD (?<version>\d.\d+):\s+(?<day>\d+)\/\s*(?<month>\d+)\/(?<year>\d+)\s+(?<hour>\d+):(?<minute>\d+):(?<second>\d+)\r\n";
|
||||
ImageInfo imageInfo;
|
||||
|
||||
List<byte[]> sectorsData;
|
||||
@@ -57,31 +56,31 @@ namespace DiscImageChef.DiscImages
|
||||
{
|
||||
imageInfo = new ImageInfo
|
||||
{
|
||||
ReadableSectorTags = new List<SectorTagType>(),
|
||||
ReadableMediaTags = new List<MediaTagType>(),
|
||||
HasPartitions = false,
|
||||
HasSessions = false,
|
||||
Version = null,
|
||||
Application = null,
|
||||
ApplicationVersion = null,
|
||||
Creator = null,
|
||||
Comments = null,
|
||||
MediaManufacturer = null,
|
||||
MediaModel = null,
|
||||
MediaSerialNumber = null,
|
||||
MediaBarcode = null,
|
||||
MediaPartNumber = null,
|
||||
MediaSequence = 0,
|
||||
LastMediaSequence = 0,
|
||||
DriveManufacturer = null,
|
||||
DriveModel = null,
|
||||
DriveSerialNumber = null,
|
||||
ReadableSectorTags = new List<SectorTagType>(),
|
||||
ReadableMediaTags = new List<MediaTagType>(),
|
||||
HasPartitions = false,
|
||||
HasSessions = false,
|
||||
Version = null,
|
||||
Application = null,
|
||||
ApplicationVersion = null,
|
||||
Creator = null,
|
||||
Comments = null,
|
||||
MediaManufacturer = null,
|
||||
MediaModel = null,
|
||||
MediaSerialNumber = null,
|
||||
MediaBarcode = null,
|
||||
MediaPartNumber = null,
|
||||
MediaSequence = 0,
|
||||
LastMediaSequence = 0,
|
||||
DriveManufacturer = null,
|
||||
DriveModel = null,
|
||||
DriveSerialNumber = null,
|
||||
DriveFirmwareRevision = null
|
||||
};
|
||||
}
|
||||
|
||||
public string Name => "Dunfield's IMD";
|
||||
public Guid Id => new Guid("0D67162E-38A3-407D-9B1A-CF40080A48CB");
|
||||
public string Name => "Dunfield's IMD";
|
||||
public Guid Id => new Guid("0D67162E-38A3-407D-9B1A-CF40080A48CB");
|
||||
public ImageInfo Info => imageInfo;
|
||||
|
||||
public string ImageFormat => "IMageDisk";
|
||||
@@ -126,26 +125,26 @@ namespace DiscImageChef.DiscImages
|
||||
}
|
||||
|
||||
imageInfo.Comments = StringHandlers.CToString(cmt.ToArray());
|
||||
sectorsData = new List<byte[]>();
|
||||
sectorsData = new List<byte[]>();
|
||||
|
||||
byte currentCylinder = 0;
|
||||
imageInfo.Cylinders = 1;
|
||||
imageInfo.Heads = 1;
|
||||
ulong currentLba = 0;
|
||||
imageInfo.Cylinders = 1;
|
||||
imageInfo.Heads = 1;
|
||||
ulong currentLba = 0;
|
||||
|
||||
TransferRate mode = TransferRate.TwoHundred;
|
||||
|
||||
while(stream.Position + 5 < stream.Length)
|
||||
{
|
||||
mode = (TransferRate)stream.ReadByte();
|
||||
byte cylinder = (byte)stream.ReadByte();
|
||||
byte head = (byte)stream.ReadByte();
|
||||
byte spt = (byte)stream.ReadByte();
|
||||
byte n = (byte)stream.ReadByte();
|
||||
byte[] idmap = new byte[spt];
|
||||
byte[] cylmap = new byte[spt];
|
||||
byte[] headmap = new byte[spt];
|
||||
ushort[] bps = new ushort[spt];
|
||||
mode = (TransferRate)stream.ReadByte();
|
||||
byte cylinder = (byte)stream.ReadByte();
|
||||
byte head = (byte)stream.ReadByte();
|
||||
byte spt = (byte)stream.ReadByte();
|
||||
byte n = (byte)stream.ReadByte();
|
||||
byte[] idmap = new byte[spt];
|
||||
byte[] cylmap = new byte[spt];
|
||||
byte[] headmap = new byte[spt];
|
||||
ushort[] bps = new ushort[spt];
|
||||
|
||||
if(cylinder != currentCylinder)
|
||||
{
|
||||
@@ -155,16 +154,19 @@ namespace DiscImageChef.DiscImages
|
||||
|
||||
if((head & 1) == 1) imageInfo.Heads = 2;
|
||||
|
||||
stream.Read(idmap, 0, idmap.Length);
|
||||
stream.Read(idmap, 0, idmap.Length);
|
||||
if((head & SECTOR_CYLINDER_MAP_MASK) == SECTOR_CYLINDER_MAP_MASK) stream.Read(cylmap, 0, cylmap.Length);
|
||||
if((head & SECTOR_HEAD_MAP_MASK) == SECTOR_HEAD_MAP_MASK) stream.Read(headmap, 0, headmap.Length);
|
||||
if((head & SECTOR_HEAD_MAP_MASK) == SECTOR_HEAD_MAP_MASK)
|
||||
stream.Read(headmap, 0, headmap.Length);
|
||||
if(n == 0xFF)
|
||||
{
|
||||
byte[] bpsbytes = new byte[spt * 2];
|
||||
stream.Read(bpsbytes, 0, bpsbytes.Length);
|
||||
for(int i = 0; i < spt; i++) bps[i] = BitConverter.ToUInt16(bpsbytes, i * 2);
|
||||
}
|
||||
else for(int i = 0; i < spt; i++) bps[i] = (ushort)(128 << n);
|
||||
else
|
||||
for(int i = 0; i < spt; i++)
|
||||
bps[i] = (ushort)(128 << n);
|
||||
|
||||
if(spt > imageInfo.SectorsPerTrack) imageInfo.SectorsPerTrack = spt;
|
||||
|
||||
@@ -173,7 +175,7 @@ namespace DiscImageChef.DiscImages
|
||||
for(int i = 0; i < spt; i++)
|
||||
{
|
||||
SectorType type = (SectorType)stream.ReadByte();
|
||||
byte[] data = new byte[bps[i]];
|
||||
byte[] data = new byte[bps[i]];
|
||||
|
||||
// TODO; Handle disks with different bps in track 0
|
||||
if(bps[i] > imageInfo.SectorSize) imageInfo.SectorSize = bps[i];
|
||||
@@ -212,99 +214,31 @@ namespace DiscImageChef.DiscImages
|
||||
|
||||
imageInfo.Application = "IMD";
|
||||
// TODO: The header is the date of dump or the date of the application compilation?
|
||||
imageInfo.CreationTime = imageFilter.GetCreationTime();
|
||||
imageInfo.CreationTime = imageFilter.GetCreationTime();
|
||||
imageInfo.LastModificationTime = imageFilter.GetLastWriteTime();
|
||||
imageInfo.MediaTitle = Path.GetFileNameWithoutExtension(imageFilter.GetFilename());
|
||||
imageInfo.Comments = StringHandlers.CToString(cmt.ToArray());
|
||||
imageInfo.Sectors = currentLba;
|
||||
imageInfo.MediaType = MediaType.Unknown;
|
||||
imageInfo.MediaTitle = Path.GetFileNameWithoutExtension(imageFilter.GetFilename());
|
||||
imageInfo.Comments = StringHandlers.CToString(cmt.ToArray());
|
||||
imageInfo.Sectors = currentLba;
|
||||
imageInfo.MediaType = MediaType.Unknown;
|
||||
|
||||
switch(mode)
|
||||
MediaEncoding mediaEncoding = MediaEncoding.MFM;
|
||||
if(mode == TransferRate.TwoHundred || mode == TransferRate.ThreeHundred || mode == TransferRate.FiveHundred)
|
||||
mediaEncoding = MediaEncoding.FM;
|
||||
|
||||
imageInfo.MediaType =
|
||||
Geometry.GetMediaType(((ushort)imageInfo.Cylinders, (byte)imageInfo.Heads,
|
||||
(ushort)imageInfo.SectorsPerTrack, imageInfo.SectorSize, mediaEncoding, false));
|
||||
|
||||
switch(imageInfo.MediaType)
|
||||
{
|
||||
case TransferRate.TwoHundred:
|
||||
case TransferRate.ThreeHundred:
|
||||
if(imageInfo.Heads == 1 && imageInfo.Cylinders == 40 && imageInfo.SectorsPerTrack == 10 &&
|
||||
imageInfo.SectorSize == 256) imageInfo.MediaType = MediaType.ACORN_525_SS_SD_40;
|
||||
else if(imageInfo.Heads == 1 && imageInfo.Cylinders == 80 && imageInfo.SectorsPerTrack == 10 &&
|
||||
imageInfo.SectorSize == 256) imageInfo.MediaType = MediaType.ACORN_525_SS_SD_80;
|
||||
else if(imageInfo.Heads == 1 && imageInfo.Cylinders == 40 && imageInfo.SectorsPerTrack == 18 &&
|
||||
imageInfo.SectorSize == 128) imageInfo.MediaType = MediaType.ATARI_525_SD;
|
||||
case MediaType.NEC_525_HD when mode == TransferRate.FiveHundredMfm:
|
||||
imageInfo.MediaType = MediaType.NEC_35_HD_8;
|
||||
break;
|
||||
case TransferRate.FiveHundred:
|
||||
if(imageInfo.Heads == 1 && imageInfo.Cylinders == 32 && imageInfo.SectorsPerTrack == 8 &&
|
||||
imageInfo.SectorSize == 319) imageInfo.MediaType = MediaType.IBM23FD;
|
||||
else if(imageInfo.Heads == 1 && imageInfo.Cylinders == 73 && imageInfo.SectorsPerTrack == 26 &&
|
||||
imageInfo.SectorSize == 128) imageInfo.MediaType = MediaType.IBM23FD;
|
||||
else if(imageInfo.Heads == 2 && imageInfo.Cylinders == 77 && imageInfo.SectorsPerTrack == 26 &&
|
||||
imageInfo.SectorSize == 128) imageInfo.MediaType = MediaType.NEC_8_SD;
|
||||
case MediaType.DOS_525_HD when mode == TransferRate.FiveHundredMfm:
|
||||
imageInfo.MediaType = MediaType.NEC_35_HD_15;
|
||||
break;
|
||||
case TransferRate.TwoHundredMfm:
|
||||
case TransferRate.ThreeHundredMfm:
|
||||
if(imageInfo.Heads == 1 && imageInfo.Cylinders == 40 && imageInfo.SectorsPerTrack == 8 &&
|
||||
imageInfo.SectorSize == 512) imageInfo.MediaType = MediaType.DOS_525_SS_DD_8;
|
||||
else if(imageInfo.Heads == 1 && imageInfo.Cylinders == 40 && imageInfo.SectorsPerTrack == 9 &&
|
||||
imageInfo.SectorSize == 512) imageInfo.MediaType = MediaType.DOS_525_SS_DD_9;
|
||||
else if(imageInfo.Heads == 2 && imageInfo.Cylinders == 40 && imageInfo.SectorsPerTrack == 8 &&
|
||||
imageInfo.SectorSize == 512) imageInfo.MediaType = MediaType.DOS_525_DS_DD_8;
|
||||
else if(imageInfo.Heads == 2 && imageInfo.Cylinders == 40 && imageInfo.SectorsPerTrack == 9 &&
|
||||
imageInfo.SectorSize == 512) imageInfo.MediaType = MediaType.DOS_525_DS_DD_9;
|
||||
else if(imageInfo.Heads == 1 && imageInfo.Cylinders == 40 && imageInfo.SectorsPerTrack == 18 &&
|
||||
imageInfo.SectorSize == 128) imageInfo.MediaType = MediaType.ATARI_525_SD;
|
||||
else if(imageInfo.Heads == 1 && imageInfo.Cylinders == 40 && imageInfo.SectorsPerTrack == 26 &&
|
||||
imageInfo.SectorSize == 128) imageInfo.MediaType = MediaType.ATARI_525_ED;
|
||||
else if(imageInfo.Heads == 1 && imageInfo.Cylinders == 40 && imageInfo.SectorsPerTrack == 18 &&
|
||||
imageInfo.SectorSize == 256) imageInfo.MediaType = MediaType.ATARI_525_DD;
|
||||
else if(imageInfo.Heads == 1 && imageInfo.Cylinders == 40 && imageInfo.SectorsPerTrack == 16 &&
|
||||
imageInfo.SectorSize == 256) imageInfo.MediaType = MediaType.ACORN_525_SS_DD_40;
|
||||
else if(imageInfo.Heads == 1 && imageInfo.Cylinders == 80 && imageInfo.SectorsPerTrack == 16 &&
|
||||
imageInfo.SectorSize == 256) imageInfo.MediaType = MediaType.ACORN_525_SS_DD_80;
|
||||
else if(imageInfo.Heads == 1 && imageInfo.Cylinders == 40 && imageInfo.SectorsPerTrack == 18 &&
|
||||
imageInfo.SectorSize == 256) imageInfo.MediaType = MediaType.ATARI_525_DD;
|
||||
else if(imageInfo.Heads == 1 && imageInfo.Cylinders == 80 && imageInfo.SectorsPerTrack == 10 &&
|
||||
imageInfo.SectorSize == 512) imageInfo.MediaType = MediaType.RX50;
|
||||
else if(imageInfo.Heads == 2 && imageInfo.Cylinders == 80 && imageInfo.SectorsPerTrack == 9 &&
|
||||
imageInfo.SectorSize == 512) imageInfo.MediaType = MediaType.DOS_35_DS_DD_9;
|
||||
else if(imageInfo.Heads == 2 && imageInfo.Cylinders == 80 && imageInfo.SectorsPerTrack == 8 &&
|
||||
imageInfo.SectorSize == 512) imageInfo.MediaType = MediaType.DOS_35_DS_DD_8;
|
||||
if(imageInfo.Heads == 1 && imageInfo.Cylinders == 80 && imageInfo.SectorsPerTrack == 9 &&
|
||||
imageInfo.SectorSize == 512) imageInfo.MediaType = MediaType.DOS_35_SS_DD_9;
|
||||
else if(imageInfo.Heads == 1 && imageInfo.Cylinders == 80 && imageInfo.SectorsPerTrack == 8 &&
|
||||
imageInfo.SectorSize == 512) imageInfo.MediaType = MediaType.DOS_35_SS_DD_8;
|
||||
else if(imageInfo.Heads == 2 && imageInfo.Cylinders == 80 && imageInfo.SectorsPerTrack == 5 &&
|
||||
imageInfo.SectorSize == 1024) imageInfo.MediaType = MediaType.ACORN_35_DS_DD;
|
||||
else if(imageInfo.Heads == 2 && imageInfo.Cylinders == 82 && imageInfo.SectorsPerTrack == 10 &&
|
||||
imageInfo.SectorSize == 512) imageInfo.MediaType = MediaType.FDFORMAT_35_DD;
|
||||
else if(imageInfo.Heads == 1 && imageInfo.Cylinders == 70 && imageInfo.SectorsPerTrack == 9 &&
|
||||
imageInfo.SectorSize == 512) imageInfo.MediaType = MediaType.Apricot_35;
|
||||
break;
|
||||
case TransferRate.FiveHundredMfm:
|
||||
if(imageInfo.Heads == 2 && imageInfo.Cylinders == 80 && imageInfo.SectorsPerTrack == 18 &&
|
||||
imageInfo.SectorSize == 512) imageInfo.MediaType = MediaType.DOS_35_HD;
|
||||
else if(imageInfo.Heads == 2 && imageInfo.Cylinders == 80 && imageInfo.SectorsPerTrack == 21 &&
|
||||
imageInfo.SectorSize == 512) imageInfo.MediaType = MediaType.DMF;
|
||||
else if(imageInfo.Heads == 2 && imageInfo.Cylinders == 82 && imageInfo.SectorsPerTrack == 21 &&
|
||||
imageInfo.SectorSize == 512) imageInfo.MediaType = MediaType.DMF_82;
|
||||
else if(imageInfo.Heads == 2 && imageInfo.Cylinders == 80 && imageInfo.SectorsPerTrack == 23 &&
|
||||
imageInfo.SectorSize == 512) imageInfo.MediaType = MediaType.XDF_35;
|
||||
else if(imageInfo.Heads == 2 && imageInfo.Cylinders == 80 && imageInfo.SectorsPerTrack == 15 &&
|
||||
imageInfo.SectorSize == 512) imageInfo.MediaType = MediaType.DOS_525_HD;
|
||||
else if(imageInfo.Heads == 2 && imageInfo.Cylinders == 80 && imageInfo.SectorsPerTrack == 10 &&
|
||||
imageInfo.SectorSize == 1024) imageInfo.MediaType = MediaType.ACORN_35_DS_HD;
|
||||
else if(imageInfo.Heads == 2 && imageInfo.Cylinders == 77 && imageInfo.SectorsPerTrack == 8 &&
|
||||
imageInfo.SectorSize == 1024) imageInfo.MediaType = MediaType.NEC_525_HD;
|
||||
else if(imageInfo.Heads == 2 && imageInfo.Cylinders == 80 && imageInfo.SectorsPerTrack == 9 &&
|
||||
imageInfo.SectorSize == 1024) imageInfo.MediaType = MediaType.SHARP_525_9;
|
||||
else if(imageInfo.Heads == 1 && imageInfo.Cylinders == 80 && imageInfo.SectorsPerTrack == 10 &&
|
||||
imageInfo.SectorSize == 512) imageInfo.MediaType = MediaType.ATARI_35_SS_DD;
|
||||
else if(imageInfo.Heads == 2 && imageInfo.Cylinders == 80 && imageInfo.SectorsPerTrack == 10 &&
|
||||
imageInfo.SectorSize == 512) imageInfo.MediaType = MediaType.ATARI_35_DS_DD;
|
||||
else if(imageInfo.Heads == 1 && imageInfo.Cylinders == 80 && imageInfo.SectorsPerTrack == 11 &&
|
||||
imageInfo.SectorSize == 512) imageInfo.MediaType = MediaType.ATARI_35_SS_DD_11;
|
||||
else if(imageInfo.Heads == 2 && imageInfo.Cylinders == 80 && imageInfo.SectorsPerTrack == 11 &&
|
||||
imageInfo.SectorSize == 512) imageInfo.MediaType = MediaType.ATARI_35_DS_DD_11;
|
||||
break;
|
||||
default:
|
||||
imageInfo.MediaType = MediaType.Unknown;
|
||||
case MediaType.RX50 when mode == TransferRate.FiveHundredMfm:
|
||||
imageInfo.MediaType = MediaType.ATARI_35_SS_DD;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -335,7 +269,7 @@ namespace DiscImageChef.DiscImages
|
||||
}
|
||||
|
||||
public bool? VerifySectors(ulong sectorAddress, uint length, out List<ulong> failingLbas,
|
||||
out List<ulong> unknownLbas)
|
||||
out List<ulong> unknownLbas)
|
||||
{
|
||||
failingLbas = new List<ulong>();
|
||||
unknownLbas = new List<ulong>();
|
||||
@@ -346,7 +280,7 @@ namespace DiscImageChef.DiscImages
|
||||
}
|
||||
|
||||
public bool? VerifySectors(ulong sectorAddress, uint length, uint track, out List<ulong> failingLbas,
|
||||
out List<ulong> unknownLbas)
|
||||
out List<ulong> unknownLbas)
|
||||
{
|
||||
failingLbas = new List<ulong>();
|
||||
unknownLbas = new List<ulong>();
|
||||
@@ -464,14 +398,14 @@ namespace DiscImageChef.DiscImages
|
||||
|
||||
enum SectorType : byte
|
||||
{
|
||||
Unavailable = 0,
|
||||
Normal = 1,
|
||||
Compressed = 2,
|
||||
Deleted = 3,
|
||||
CompressedDeleted = 4,
|
||||
Error = 5,
|
||||
CompressedError = 6,
|
||||
DeletedError = 7,
|
||||
Unavailable = 0,
|
||||
Normal = 1,
|
||||
Compressed = 2,
|
||||
Deleted = 3,
|
||||
CompressedDeleted = 4,
|
||||
Error = 5,
|
||||
CompressedError = 6,
|
||||
DeletedError = 7,
|
||||
CompressedDeletedError = 8
|
||||
}
|
||||
}
|
||||
|
||||
@@ -43,30 +43,30 @@ namespace DiscImageChef.DiscImages
|
||||
public class MaxiDisk : IMediaImage
|
||||
{
|
||||
/// <summary>Disk image file</summary>
|
||||
IFilter hdkImageFilter;
|
||||
IFilter hdkImageFilter;
|
||||
ImageInfo imageInfo;
|
||||
|
||||
public MaxiDisk()
|
||||
{
|
||||
imageInfo = new ImageInfo
|
||||
{
|
||||
ReadableSectorTags = new List<SectorTagType>(),
|
||||
ReadableMediaTags = new List<MediaTagType>(),
|
||||
HasPartitions = false,
|
||||
HasSessions = false,
|
||||
Application = "MAXI Disk",
|
||||
Creator = null,
|
||||
Comments = null,
|
||||
MediaManufacturer = null,
|
||||
MediaModel = null,
|
||||
MediaSerialNumber = null,
|
||||
MediaBarcode = null,
|
||||
MediaPartNumber = null,
|
||||
MediaSequence = 0,
|
||||
LastMediaSequence = 0,
|
||||
DriveManufacturer = null,
|
||||
DriveModel = null,
|
||||
DriveSerialNumber = null,
|
||||
ReadableSectorTags = new List<SectorTagType>(),
|
||||
ReadableMediaTags = new List<MediaTagType>(),
|
||||
HasPartitions = false,
|
||||
HasSessions = false,
|
||||
Application = "MAXI Disk",
|
||||
Creator = null,
|
||||
Comments = null,
|
||||
MediaManufacturer = null,
|
||||
MediaModel = null,
|
||||
MediaSerialNumber = null,
|
||||
MediaBarcode = null,
|
||||
MediaPartNumber = null,
|
||||
MediaSequence = 0,
|
||||
LastMediaSequence = 0,
|
||||
DriveManufacturer = null,
|
||||
DriveModel = null,
|
||||
DriveSerialNumber = null,
|
||||
DriveFirmwareRevision = null
|
||||
};
|
||||
}
|
||||
@@ -74,7 +74,7 @@ namespace DiscImageChef.DiscImages
|
||||
public ImageInfo Info => imageInfo;
|
||||
|
||||
public string Name => "MAXI Disk image";
|
||||
public Guid Id => new Guid("D27D924A-7034-466E-ADE1-B81EF37E469E");
|
||||
public Guid Id => new Guid("D27D924A-7034-466E-ADE1-B81EF37E469E");
|
||||
|
||||
public string ImageFormat => "MAXI Disk";
|
||||
|
||||
@@ -102,10 +102,10 @@ namespace DiscImageChef.DiscImages
|
||||
HdkHeader tmpHeader = (HdkHeader)Marshal.PtrToStructure(ftrPtr, typeof(HdkHeader));
|
||||
Marshal.FreeHGlobal(ftrPtr);
|
||||
|
||||
DicConsole.DebugWriteLine("MAXI Disk plugin", "tmp_header.unknown = {0}", tmpHeader.unknown);
|
||||
DicConsole.DebugWriteLine("MAXI Disk plugin", "tmp_header.diskType = {0}", tmpHeader.diskType);
|
||||
DicConsole.DebugWriteLine("MAXI Disk plugin", "tmp_header.heads = {0}", tmpHeader.heads);
|
||||
DicConsole.DebugWriteLine("MAXI Disk plugin", "tmp_header.cylinders = {0}", tmpHeader.cylinders);
|
||||
DicConsole.DebugWriteLine("MAXI Disk plugin", "tmp_header.unknown = {0}", tmpHeader.unknown);
|
||||
DicConsole.DebugWriteLine("MAXI Disk plugin", "tmp_header.diskType = {0}", tmpHeader.diskType);
|
||||
DicConsole.DebugWriteLine("MAXI Disk plugin", "tmp_header.heads = {0}", tmpHeader.heads);
|
||||
DicConsole.DebugWriteLine("MAXI Disk plugin", "tmp_header.cylinders = {0}", tmpHeader.cylinders);
|
||||
DicConsole.DebugWriteLine("MAXI Disk plugin", "tmp_header.bytesPerSector = {0}", tmpHeader.bytesPerSector);
|
||||
DicConsole.DebugWriteLine("MAXI Disk plugin", "tmp_header.sectorsPerTrack = {0}",
|
||||
tmpHeader.sectorsPerTrack);
|
||||
@@ -166,67 +166,22 @@ namespace DiscImageChef.DiscImages
|
||||
|
||||
if(expectedFileSize != stream.Length) return false;
|
||||
|
||||
imageInfo.Cylinders = tmpHeader.cylinders;
|
||||
imageInfo.Heads = tmpHeader.heads;
|
||||
imageInfo.Cylinders = tmpHeader.cylinders;
|
||||
imageInfo.Heads = tmpHeader.heads;
|
||||
imageInfo.SectorsPerTrack = tmpHeader.sectorsPerTrack;
|
||||
imageInfo.Sectors = (ulong)(tmpHeader.heads * tmpHeader.cylinders * tmpHeader.sectorsPerTrack);
|
||||
imageInfo.SectorSize = (uint)(128 << tmpHeader.bytesPerSector);
|
||||
imageInfo.Sectors = (ulong)(tmpHeader.heads * tmpHeader.cylinders * tmpHeader.sectorsPerTrack);
|
||||
imageInfo.SectorSize = (uint)(128 << tmpHeader.bytesPerSector);
|
||||
|
||||
hdkImageFilter = imageFilter;
|
||||
|
||||
imageInfo.ImageSize = (ulong)(stream.Length - 8);
|
||||
imageInfo.CreationTime = imageFilter.GetCreationTime();
|
||||
imageInfo.ImageSize = (ulong)(stream.Length - 8);
|
||||
imageInfo.CreationTime = imageFilter.GetCreationTime();
|
||||
imageInfo.LastModificationTime = imageFilter.GetLastWriteTime();
|
||||
|
||||
if(imageInfo.Heads == 2 && imageInfo.Cylinders == 80 && imageInfo.SectorsPerTrack == 15 &&
|
||||
imageInfo.SectorSize == 512) imageInfo.MediaType = MediaType.DOS_525_HD;
|
||||
else if(imageInfo.Heads == 2 && imageInfo.Cylinders == 80 && imageInfo.SectorsPerTrack == 16 &&
|
||||
imageInfo.SectorSize == 256) imageInfo.MediaType = MediaType.ACORN_525_DS_DD;
|
||||
else if(imageInfo.Heads == 1 && imageInfo.Cylinders == 80 && imageInfo.SectorsPerTrack == 16 &&
|
||||
imageInfo.SectorSize == 256) imageInfo.MediaType = MediaType.ACORN_525_SS_DD_80;
|
||||
else if(imageInfo.Heads == 1 && imageInfo.Cylinders == 80 && imageInfo.SectorsPerTrack == 10 &&
|
||||
imageInfo.SectorSize == 256) imageInfo.MediaType = MediaType.ACORN_525_SS_SD_80;
|
||||
else if(imageInfo.Heads == 2 && imageInfo.Cylinders == 77 && imageInfo.SectorsPerTrack == 8 &&
|
||||
imageInfo.SectorSize == 1024) imageInfo.MediaType = MediaType.NEC_525_HD;
|
||||
else if(imageInfo.Heads == 1 && imageInfo.Cylinders == 40 && imageInfo.SectorsPerTrack == 8 &&
|
||||
imageInfo.SectorSize == 512) imageInfo.MediaType = MediaType.DOS_525_SS_DD_8;
|
||||
else if(imageInfo.Heads == 1 && imageInfo.Cylinders == 40 && imageInfo.SectorsPerTrack == 9 &&
|
||||
imageInfo.SectorSize == 512) imageInfo.MediaType = MediaType.DOS_525_SS_DD_9;
|
||||
else if(imageInfo.Heads == 2 && imageInfo.Cylinders == 40 && imageInfo.SectorsPerTrack == 8 &&
|
||||
imageInfo.SectorSize == 512) imageInfo.MediaType = MediaType.DOS_525_DS_DD_8;
|
||||
else if(imageInfo.Heads == 2 && imageInfo.Cylinders == 40 && imageInfo.SectorsPerTrack == 9 &&
|
||||
imageInfo.SectorSize == 512) imageInfo.MediaType = MediaType.DOS_525_DS_DD_9;
|
||||
else if(imageInfo.Heads == 1 && imageInfo.Cylinders == 40 && imageInfo.SectorsPerTrack == 18 &&
|
||||
imageInfo.SectorSize == 128) imageInfo.MediaType = MediaType.ATARI_525_SD;
|
||||
else if(imageInfo.Heads == 1 && imageInfo.Cylinders == 40 && imageInfo.SectorsPerTrack == 26 &&
|
||||
imageInfo.SectorSize == 128) imageInfo.MediaType = MediaType.ATARI_525_ED;
|
||||
else if(imageInfo.Heads == 1 && imageInfo.Cylinders == 40 && imageInfo.SectorsPerTrack == 18 &&
|
||||
imageInfo.SectorSize == 256) imageInfo.MediaType = MediaType.ATARI_525_DD;
|
||||
else if(imageInfo.Heads == 2 && imageInfo.Cylinders == 80 && imageInfo.SectorsPerTrack == 36 &&
|
||||
imageInfo.SectorSize == 512) imageInfo.MediaType = MediaType.DOS_35_ED;
|
||||
else if(imageInfo.Heads == 2 && imageInfo.Cylinders == 80 && imageInfo.SectorsPerTrack == 18 &&
|
||||
imageInfo.SectorSize == 512) imageInfo.MediaType = MediaType.DOS_35_HD;
|
||||
else if(imageInfo.Heads == 2 && imageInfo.Cylinders == 80 && imageInfo.SectorsPerTrack == 21 &&
|
||||
imageInfo.SectorSize == 512) imageInfo.MediaType = MediaType.DMF;
|
||||
else if(imageInfo.Heads == 2 && imageInfo.Cylinders == 82 && imageInfo.SectorsPerTrack == 21 &&
|
||||
imageInfo.SectorSize == 512) imageInfo.MediaType = MediaType.DMF_82;
|
||||
else if(imageInfo.Heads == 2 && imageInfo.Cylinders == 77 && imageInfo.SectorsPerTrack == 8 &&
|
||||
imageInfo.SectorSize == 1024) imageInfo.MediaType = MediaType.NEC_35_HD_8;
|
||||
else if(imageInfo.Heads == 2 && imageInfo.Cylinders == 80 && imageInfo.SectorsPerTrack == 15 &&
|
||||
imageInfo.SectorSize == 512) imageInfo.MediaType = MediaType.NEC_35_HD_15;
|
||||
else if(imageInfo.Heads == 2 && imageInfo.Cylinders == 80 && imageInfo.SectorsPerTrack == 9 &&
|
||||
imageInfo.SectorSize == 512) imageInfo.MediaType = MediaType.DOS_35_DS_DD_9;
|
||||
else if(imageInfo.Heads == 2 && imageInfo.Cylinders == 80 && imageInfo.SectorsPerTrack == 8 &&
|
||||
imageInfo.SectorSize == 512) imageInfo.MediaType = MediaType.DOS_35_DS_DD_8;
|
||||
else if(imageInfo.Heads == 1 && imageInfo.Cylinders == 80 && imageInfo.SectorsPerTrack == 9 &&
|
||||
imageInfo.SectorSize == 512) imageInfo.MediaType = MediaType.DOS_35_SS_DD_9;
|
||||
else if(imageInfo.Heads == 1 && imageInfo.Cylinders == 80 && imageInfo.SectorsPerTrack == 8 &&
|
||||
imageInfo.SectorSize == 512) imageInfo.MediaType = MediaType.DOS_35_SS_DD_8;
|
||||
else if(imageInfo.Heads == 2 && imageInfo.Cylinders == 80 && imageInfo.SectorsPerTrack == 5 &&
|
||||
imageInfo.SectorSize == 1024) imageInfo.MediaType = MediaType.ACORN_35_DS_DD;
|
||||
else if(imageInfo.Heads == 1 && imageInfo.Cylinders == 70 && imageInfo.SectorsPerTrack == 9 &&
|
||||
imageInfo.SectorSize == 512) imageInfo.MediaType = MediaType.Apricot_35;
|
||||
else imageInfo.MediaType = MediaType.Unknown;
|
||||
imageInfo.MediaType =
|
||||
Geometry.GetMediaType(((ushort)imageInfo.Cylinders, (byte)imageInfo.Heads,
|
||||
(ushort)imageInfo.SectorsPerTrack, imageInfo.SectorSize, MediaEncoding.MFM, false
|
||||
));
|
||||
|
||||
imageInfo.XmlMediaType = XmlMediaType.BlockMedia;
|
||||
|
||||
@@ -244,7 +199,7 @@ namespace DiscImageChef.DiscImages
|
||||
}
|
||||
|
||||
public bool? VerifySectors(ulong sectorAddress, uint length, out List<ulong> failingLbas,
|
||||
out List<ulong> unknownLbas)
|
||||
out List<ulong> unknownLbas)
|
||||
{
|
||||
failingLbas = new List<ulong>();
|
||||
unknownLbas = new List<ulong>();
|
||||
@@ -255,7 +210,7 @@ namespace DiscImageChef.DiscImages
|
||||
}
|
||||
|
||||
public bool? VerifySectors(ulong sectorAddress, uint length, uint track, out List<ulong> failingLbas,
|
||||
out List<ulong> unknownLbas)
|
||||
out List<ulong> unknownLbas)
|
||||
{
|
||||
failingLbas = new List<ulong>();
|
||||
unknownLbas = new List<ulong>();
|
||||
@@ -292,7 +247,7 @@ namespace DiscImageChef.DiscImages
|
||||
|
||||
Stream stream = hdkImageFilter.GetDataForkStream();
|
||||
stream.Seek((long)(8 + sectorAddress * imageInfo.SectorSize), SeekOrigin.Begin);
|
||||
stream.Read(buffer, 0, (int)(length * imageInfo.SectorSize));
|
||||
stream.Read(buffer, 0, (int)(length * imageInfo.SectorSize));
|
||||
|
||||
return buffer;
|
||||
}
|
||||
@@ -372,17 +327,17 @@ namespace DiscImageChef.DiscImages
|
||||
|
||||
enum HdkDiskTypes : byte
|
||||
{
|
||||
Dos360 = 0,
|
||||
Maxi420 = 1,
|
||||
Dos720 = 2,
|
||||
Maxi800 = 3,
|
||||
Dos1200 = 4,
|
||||
Dos360 = 0,
|
||||
Maxi420 = 1,
|
||||
Dos720 = 2,
|
||||
Maxi800 = 3,
|
||||
Dos1200 = 4,
|
||||
Maxi1400 = 5,
|
||||
Dos1440 = 6,
|
||||
Mac1440 = 7,
|
||||
Dos1440 = 6,
|
||||
Mac1440 = 7,
|
||||
Maxi1600 = 8,
|
||||
Dmf = 9,
|
||||
Dos2880 = 10,
|
||||
Dmf = 9,
|
||||
Dos2880 = 10,
|
||||
Maxi3200 = 11
|
||||
}
|
||||
}
|
||||
|
||||
@@ -45,39 +45,38 @@ namespace DiscImageChef.DiscImages
|
||||
public class RayDim : IMediaImage
|
||||
{
|
||||
const string REGEX_SIGNATURE =
|
||||
@"Disk IMage VER (?<major>\d).(?<minor>\d) Copyright \(C\) (?<year>\d{4}) Ray Arachelian, All Rights Reserved\."
|
||||
;
|
||||
@"Disk IMage VER (?<major>\d).(?<minor>\d) Copyright \(C\) (?<year>\d{4}) Ray Arachelian, All Rights Reserved\.";
|
||||
|
||||
MemoryStream disk;
|
||||
ImageInfo imageInfo;
|
||||
ImageInfo imageInfo;
|
||||
|
||||
public RayDim()
|
||||
{
|
||||
imageInfo = new ImageInfo
|
||||
{
|
||||
ReadableSectorTags = new List<SectorTagType>(),
|
||||
ReadableMediaTags = new List<MediaTagType>(),
|
||||
HasPartitions = false,
|
||||
HasSessions = false,
|
||||
Application = "Ray Arachelian's Disk IMage",
|
||||
Creator = null,
|
||||
Comments = null,
|
||||
MediaManufacturer = null,
|
||||
MediaModel = null,
|
||||
MediaSerialNumber = null,
|
||||
MediaBarcode = null,
|
||||
MediaPartNumber = null,
|
||||
MediaSequence = 0,
|
||||
LastMediaSequence = 0,
|
||||
DriveManufacturer = null,
|
||||
DriveModel = null,
|
||||
DriveSerialNumber = null,
|
||||
ReadableSectorTags = new List<SectorTagType>(),
|
||||
ReadableMediaTags = new List<MediaTagType>(),
|
||||
HasPartitions = false,
|
||||
HasSessions = false,
|
||||
Application = "Ray Arachelian's Disk IMage",
|
||||
Creator = null,
|
||||
Comments = null,
|
||||
MediaManufacturer = null,
|
||||
MediaModel = null,
|
||||
MediaSerialNumber = null,
|
||||
MediaBarcode = null,
|
||||
MediaPartNumber = null,
|
||||
MediaSequence = 0,
|
||||
LastMediaSequence = 0,
|
||||
DriveManufacturer = null,
|
||||
DriveModel = null,
|
||||
DriveSerialNumber = null,
|
||||
DriveFirmwareRevision = null
|
||||
};
|
||||
}
|
||||
|
||||
public string Name => "Ray Arachelian's Disk IMage";
|
||||
public Guid Id => new Guid("F541F4E7-C1E3-4A2D-B07F-D863E87AB961");
|
||||
public string Name => "Ray Arachelian's Disk IMage";
|
||||
public Guid Id => new Guid("F541F4E7-C1E3-4A2D-B07F-D863E87AB961");
|
||||
public ImageInfo Info => imageInfo;
|
||||
|
||||
public string ImageFormat => "Ray Arachelian's Disk IMage";
|
||||
@@ -109,8 +108,8 @@ namespace DiscImageChef.DiscImages
|
||||
string signature = StringHandlers.CToString(header.signature);
|
||||
|
||||
DicConsole.DebugWriteLine("Ray Arachelian's Disk IMage plugin", "header.signature = {0}", signature);
|
||||
DicConsole.DebugWriteLine("Ray Arachelian's Disk IMage plugin", "header.diskType = {0}", header.diskType);
|
||||
DicConsole.DebugWriteLine("Ray Arachelian's Disk IMage plugin", "header.heads = {0}", header.heads);
|
||||
DicConsole.DebugWriteLine("Ray Arachelian's Disk IMage plugin", "header.diskType = {0}", header.diskType);
|
||||
DicConsole.DebugWriteLine("Ray Arachelian's Disk IMage plugin", "header.heads = {0}", header.heads);
|
||||
DicConsole.DebugWriteLine("Ray Arachelian's Disk IMage plugin", "header.cylinders = {0}", header.cylinders);
|
||||
DicConsole.DebugWriteLine("Ray Arachelian's Disk IMage plugin", "header.sectorsPerTrack = {0}",
|
||||
header.sectorsPerTrack);
|
||||
@@ -148,14 +147,14 @@ namespace DiscImageChef.DiscImages
|
||||
|
||||
imageInfo.ApplicationVersion = $"{sm.Groups["major"].Value}.{sm.Groups["minor"].Value}";
|
||||
|
||||
imageInfo.Cylinders = (uint)(header.cylinders + 1);
|
||||
imageInfo.Heads = (uint)(header.heads + 1);
|
||||
imageInfo.Cylinders = (uint)(header.cylinders + 1);
|
||||
imageInfo.Heads = (uint)(header.heads + 1);
|
||||
imageInfo.SectorsPerTrack = header.sectorsPerTrack;
|
||||
imageInfo.Sectors = imageInfo.Cylinders * imageInfo.Heads * imageInfo.SectorsPerTrack;
|
||||
imageInfo.SectorSize = 512;
|
||||
imageInfo.Sectors = imageInfo.Cylinders * imageInfo.Heads * imageInfo.SectorsPerTrack;
|
||||
imageInfo.SectorSize = 512;
|
||||
|
||||
byte[] sectors = new byte[imageInfo.SectorsPerTrack * imageInfo.SectorSize];
|
||||
disk = new MemoryStream();
|
||||
disk = new MemoryStream();
|
||||
|
||||
for(int i = 0; i < imageInfo.SectorsPerTrack * imageInfo.SectorSize; i++)
|
||||
{
|
||||
@@ -164,55 +163,22 @@ namespace DiscImageChef.DiscImages
|
||||
disk.Write(sectors, 0, sectors.Length);
|
||||
}
|
||||
|
||||
switch(header.diskType)
|
||||
imageInfo.MediaType =
|
||||
Geometry.GetMediaType(((ushort)imageInfo.Cylinders, (byte)imageInfo.Heads,
|
||||
(ushort)imageInfo.SectorsPerTrack, 512, MediaEncoding.MFM, false));
|
||||
|
||||
switch(imageInfo.MediaType)
|
||||
{
|
||||
case RayDiskTypes.Md2hd:
|
||||
if(imageInfo.Heads == 2 && imageInfo.Cylinders == 80 && imageInfo.SectorsPerTrack == 15)
|
||||
imageInfo.MediaType = MediaType.DOS_525_HD;
|
||||
else goto case RayDiskTypes.Md2dd;
|
||||
case MediaType.NEC_525_HD when header.diskType == RayDiskTypes.Mf2hd ||
|
||||
header.diskType == RayDiskTypes.Mf2ed:
|
||||
imageInfo.MediaType = MediaType.NEC_35_HD_8;
|
||||
break;
|
||||
case RayDiskTypes.Md2dd:
|
||||
if(imageInfo.Heads == 1 && imageInfo.Cylinders == 40 && imageInfo.SectorsPerTrack == 8)
|
||||
imageInfo.MediaType = MediaType.DOS_525_SS_DD_8;
|
||||
else if(imageInfo.Heads == 1 && imageInfo.Cylinders == 40 && imageInfo.SectorsPerTrack == 9)
|
||||
imageInfo.MediaType = MediaType.DOS_525_SS_DD_9;
|
||||
else if(imageInfo.Heads == 2 && imageInfo.Cylinders == 40 && imageInfo.SectorsPerTrack == 8)
|
||||
imageInfo.MediaType = MediaType.DOS_525_DS_DD_8;
|
||||
else if(imageInfo.Heads == 2 && imageInfo.Cylinders == 40 && imageInfo.SectorsPerTrack == 9)
|
||||
imageInfo.MediaType = MediaType.DOS_525_DS_DD_9;
|
||||
else imageInfo.MediaType = MediaType.Unknown;
|
||||
case MediaType.DOS_525_HD when header.diskType == RayDiskTypes.Mf2hd ||
|
||||
header.diskType == RayDiskTypes.Mf2ed:
|
||||
imageInfo.MediaType = MediaType.NEC_35_HD_15;
|
||||
break;
|
||||
case RayDiskTypes.Mf2ed:
|
||||
if(imageInfo.Heads == 2 && imageInfo.Cylinders == 80 && imageInfo.SectorsPerTrack == 36)
|
||||
imageInfo.MediaType = MediaType.DOS_35_ED;
|
||||
else goto case RayDiskTypes.Mf2hd;
|
||||
break;
|
||||
case RayDiskTypes.Mf2hd:
|
||||
if(imageInfo.Heads == 2 && imageInfo.Cylinders == 80 && imageInfo.SectorsPerTrack == 18)
|
||||
imageInfo.MediaType = MediaType.DOS_35_HD;
|
||||
else if(imageInfo.Heads == 2 && imageInfo.Cylinders == 80 && imageInfo.SectorsPerTrack == 21)
|
||||
imageInfo.MediaType = MediaType.DMF;
|
||||
else if(imageInfo.Heads == 2 && imageInfo.Cylinders == 82 && imageInfo.SectorsPerTrack == 21)
|
||||
imageInfo.MediaType = MediaType.DMF_82;
|
||||
else if(imageInfo.Heads == 2 && imageInfo.Cylinders == 80 && imageInfo.SectorsPerTrack == 15)
|
||||
imageInfo.MediaType = MediaType.NEC_35_HD_15;
|
||||
else goto case RayDiskTypes.Mf2dd;
|
||||
break;
|
||||
case RayDiskTypes.Mf2dd:
|
||||
if(imageInfo.Heads == 2 && imageInfo.Cylinders == 80 && imageInfo.SectorsPerTrack == 9)
|
||||
imageInfo.MediaType = MediaType.DOS_35_DS_DD_9;
|
||||
else if(imageInfo.Heads == 2 && imageInfo.Cylinders == 80 && imageInfo.SectorsPerTrack == 8)
|
||||
imageInfo.MediaType = MediaType.DOS_35_DS_DD_8;
|
||||
else if(imageInfo.Heads == 1 && imageInfo.Cylinders == 80 && imageInfo.SectorsPerTrack == 9)
|
||||
imageInfo.MediaType = MediaType.DOS_35_SS_DD_9;
|
||||
else if(imageInfo.Heads == 1 && imageInfo.Cylinders == 80 && imageInfo.SectorsPerTrack == 8)
|
||||
imageInfo.MediaType = MediaType.DOS_35_SS_DD_8;
|
||||
else if(imageInfo.Heads == 1 && imageInfo.Cylinders == 70 && imageInfo.SectorsPerTrack == 9)
|
||||
imageInfo.MediaType = MediaType.Apricot_35;
|
||||
else imageInfo.MediaType = MediaType.Unknown;
|
||||
break;
|
||||
default:
|
||||
imageInfo.MediaType = MediaType.Unknown;
|
||||
case MediaType.RX50 when header.diskType == RayDiskTypes.Md2dd || header.diskType == RayDiskTypes.Md2hd:
|
||||
imageInfo.MediaType = MediaType.ATARI_35_SS_DD;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -232,7 +198,7 @@ namespace DiscImageChef.DiscImages
|
||||
}
|
||||
|
||||
public bool? VerifySectors(ulong sectorAddress, uint length, out List<ulong> failingLbas,
|
||||
out List<ulong> unknownLbas)
|
||||
out List<ulong> unknownLbas)
|
||||
{
|
||||
failingLbas = new List<ulong>();
|
||||
unknownLbas = new List<ulong>();
|
||||
@@ -243,7 +209,7 @@ namespace DiscImageChef.DiscImages
|
||||
}
|
||||
|
||||
public bool? VerifySectors(ulong sectorAddress, uint length, uint track, out List<ulong> failingLbas,
|
||||
out List<ulong> unknownLbas)
|
||||
out List<ulong> unknownLbas)
|
||||
{
|
||||
failingLbas = new List<ulong>();
|
||||
unknownLbas = new List<ulong>();
|
||||
@@ -278,7 +244,7 @@ namespace DiscImageChef.DiscImages
|
||||
|
||||
byte[] buffer = new byte[length * imageInfo.SectorSize];
|
||||
|
||||
disk.Seek((long)(sectorAddress * imageInfo.SectorSize), SeekOrigin.Begin);
|
||||
disk.Seek((long)(sectorAddress * imageInfo.SectorSize), SeekOrigin.Begin);
|
||||
disk.Read(buffer, 0, (int)(length * imageInfo.SectorSize));
|
||||
|
||||
return buffer;
|
||||
@@ -347,11 +313,12 @@ namespace DiscImageChef.DiscImages
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
struct RayHdr
|
||||
{
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 80)] public byte[] signature;
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 80)]
|
||||
public byte[] signature;
|
||||
public RayDiskTypes diskType;
|
||||
public byte cylinders;
|
||||
public byte sectorsPerTrack;
|
||||
public byte heads;
|
||||
public byte cylinders;
|
||||
public byte sectorsPerTrack;
|
||||
public byte heads;
|
||||
}
|
||||
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
||||
|
||||
@@ -43,44 +43,44 @@ namespace DiscImageChef.DiscImages
|
||||
{
|
||||
public class SaveDskF : IMediaImage
|
||||
{
|
||||
const ushort SDF_MAGIC_OLD = 0x58AA;
|
||||
const ushort SDF_MAGIC = 0x59AA;
|
||||
const ushort SDF_MAGIC_OLD = 0x58AA;
|
||||
const ushort SDF_MAGIC = 0x59AA;
|
||||
const ushort SDF_MAGIC_COMPRESSED = 0x5AAA;
|
||||
uint calculatedChk;
|
||||
byte[] decodedDisk;
|
||||
uint calculatedChk;
|
||||
byte[] decodedDisk;
|
||||
|
||||
SaveDskFHeader header;
|
||||
ImageInfo imageInfo;
|
||||
ImageInfo imageInfo;
|
||||
|
||||
public SaveDskF()
|
||||
{
|
||||
imageInfo = new ImageInfo
|
||||
{
|
||||
ReadableSectorTags = new List<SectorTagType>(),
|
||||
ReadableMediaTags = new List<MediaTagType>(),
|
||||
HasPartitions = false,
|
||||
HasSessions = false,
|
||||
Version = null,
|
||||
Application = null,
|
||||
ApplicationVersion = null,
|
||||
Creator = null,
|
||||
Comments = null,
|
||||
MediaManufacturer = null,
|
||||
MediaModel = null,
|
||||
MediaSerialNumber = null,
|
||||
MediaBarcode = null,
|
||||
MediaPartNumber = null,
|
||||
MediaSequence = 0,
|
||||
LastMediaSequence = 0,
|
||||
DriveManufacturer = null,
|
||||
DriveModel = null,
|
||||
DriveSerialNumber = null,
|
||||
ReadableSectorTags = new List<SectorTagType>(),
|
||||
ReadableMediaTags = new List<MediaTagType>(),
|
||||
HasPartitions = false,
|
||||
HasSessions = false,
|
||||
Version = null,
|
||||
Application = null,
|
||||
ApplicationVersion = null,
|
||||
Creator = null,
|
||||
Comments = null,
|
||||
MediaManufacturer = null,
|
||||
MediaModel = null,
|
||||
MediaSerialNumber = null,
|
||||
MediaBarcode = null,
|
||||
MediaPartNumber = null,
|
||||
MediaSequence = 0,
|
||||
LastMediaSequence = 0,
|
||||
DriveManufacturer = null,
|
||||
DriveModel = null,
|
||||
DriveSerialNumber = null,
|
||||
DriveFirmwareRevision = null
|
||||
};
|
||||
}
|
||||
|
||||
public string Name => "IBM SaveDskF";
|
||||
public Guid Id => new Guid("288CE058-1A51-4034-8C45-5A256CAE1461");
|
||||
public string Name => "IBM SaveDskF";
|
||||
public Guid Id => new Guid("288CE058-1A51-4034-8C45-5A256CAE1461");
|
||||
public ImageInfo Info => imageInfo;
|
||||
|
||||
public string ImageFormat => "IBM SaveDskF";
|
||||
@@ -103,15 +103,15 @@ namespace DiscImageChef.DiscImages
|
||||
byte[] hdr = new byte[40];
|
||||
stream.Read(hdr, 0, 40);
|
||||
|
||||
header = new SaveDskFHeader();
|
||||
header = new SaveDskFHeader();
|
||||
IntPtr hdrPtr = Marshal.AllocHGlobal(40);
|
||||
Marshal.Copy(hdr, 0, hdrPtr, 40);
|
||||
header = (SaveDskFHeader)Marshal.PtrToStructure(hdrPtr, typeof(SaveDskFHeader));
|
||||
Marshal.FreeHGlobal(hdrPtr);
|
||||
|
||||
return (header.magic == SDF_MAGIC || header.magic == SDF_MAGIC_COMPRESSED ||
|
||||
header.magic == SDF_MAGIC_OLD) && header.fatCopies <= 2 && header.padding == 0 &&
|
||||
header.commentOffset < stream.Length && header.dataOffset < stream.Length;
|
||||
return (header.magic == SDF_MAGIC || header.magic == SDF_MAGIC_COMPRESSED ||
|
||||
header.magic == SDF_MAGIC_OLD) && header.fatCopies <= 2 && header.padding == 0 &&
|
||||
header.commentOffset < stream.Length && header.dataOffset < stream.Length;
|
||||
}
|
||||
|
||||
public bool OpenImage(IFilter imageFilter)
|
||||
@@ -122,31 +122,31 @@ namespace DiscImageChef.DiscImages
|
||||
byte[] hdr = new byte[40];
|
||||
|
||||
stream.Read(hdr, 0, 40);
|
||||
header = new SaveDskFHeader();
|
||||
header = new SaveDskFHeader();
|
||||
IntPtr hdrPtr = Marshal.AllocHGlobal(40);
|
||||
Marshal.Copy(hdr, 0, hdrPtr, 40);
|
||||
header = (SaveDskFHeader)Marshal.PtrToStructure(hdrPtr, typeof(SaveDskFHeader));
|
||||
Marshal.FreeHGlobal(hdrPtr);
|
||||
|
||||
DicConsole.DebugWriteLine("SaveDskF plugin", "header.magic = 0x{0:X4}", header.magic);
|
||||
DicConsole.DebugWriteLine("SaveDskF plugin", "header.mediaType = 0x{0:X2}", header.mediaType);
|
||||
DicConsole.DebugWriteLine("SaveDskF plugin", "header.sectorSize = {0}", header.sectorSize);
|
||||
DicConsole.DebugWriteLine("SaveDskF plugin", "header.clusterMask = {0}", header.clusterMask);
|
||||
DicConsole.DebugWriteLine("SaveDskF plugin", "header.clusterShift = {0}", header.clusterShift);
|
||||
DicConsole.DebugWriteLine("SaveDskF plugin", "header.magic = 0x{0:X4}", header.magic);
|
||||
DicConsole.DebugWriteLine("SaveDskF plugin", "header.mediaType = 0x{0:X2}", header.mediaType);
|
||||
DicConsole.DebugWriteLine("SaveDskF plugin", "header.sectorSize = {0}", header.sectorSize);
|
||||
DicConsole.DebugWriteLine("SaveDskF plugin", "header.clusterMask = {0}", header.clusterMask);
|
||||
DicConsole.DebugWriteLine("SaveDskF plugin", "header.clusterShift = {0}", header.clusterShift);
|
||||
DicConsole.DebugWriteLine("SaveDskF plugin", "header.reservedSectors = {0}", header.reservedSectors);
|
||||
DicConsole.DebugWriteLine("SaveDskF plugin", "header.fatCopies = {0}", header.fatCopies);
|
||||
DicConsole.DebugWriteLine("SaveDskF plugin", "header.rootEntries = {0}", header.rootEntries);
|
||||
DicConsole.DebugWriteLine("SaveDskF plugin", "header.firstCluster = {0}", header.firstCluster);
|
||||
DicConsole.DebugWriteLine("SaveDskF plugin", "header.clustersCopied = {0}", header.clustersCopied);
|
||||
DicConsole.DebugWriteLine("SaveDskF plugin", "header.sectorsPerFat = {0}", header.sectorsPerFat);
|
||||
DicConsole.DebugWriteLine("SaveDskF plugin", "header.checksum = 0x{0:X8}", header.checksum);
|
||||
DicConsole.DebugWriteLine("SaveDskF plugin", "header.cylinders = {0}", header.cylinders);
|
||||
DicConsole.DebugWriteLine("SaveDskF plugin", "header.heads = {0}", header.heads);
|
||||
DicConsole.DebugWriteLine("SaveDskF plugin", "header.fatCopies = {0}", header.fatCopies);
|
||||
DicConsole.DebugWriteLine("SaveDskF plugin", "header.rootEntries = {0}", header.rootEntries);
|
||||
DicConsole.DebugWriteLine("SaveDskF plugin", "header.firstCluster = {0}", header.firstCluster);
|
||||
DicConsole.DebugWriteLine("SaveDskF plugin", "header.clustersCopied = {0}", header.clustersCopied);
|
||||
DicConsole.DebugWriteLine("SaveDskF plugin", "header.sectorsPerFat = {0}", header.sectorsPerFat);
|
||||
DicConsole.DebugWriteLine("SaveDskF plugin", "header.checksum = 0x{0:X8}", header.checksum);
|
||||
DicConsole.DebugWriteLine("SaveDskF plugin", "header.cylinders = {0}", header.cylinders);
|
||||
DicConsole.DebugWriteLine("SaveDskF plugin", "header.heads = {0}", header.heads);
|
||||
DicConsole.DebugWriteLine("SaveDskF plugin", "header.sectorsPerTrack = {0}", header.sectorsPerTrack);
|
||||
DicConsole.DebugWriteLine("SaveDskF plugin", "header.padding = {0}", header.padding);
|
||||
DicConsole.DebugWriteLine("SaveDskF plugin", "header.sectorsCopied = {0}", header.sectorsCopied);
|
||||
DicConsole.DebugWriteLine("SaveDskF plugin", "header.commentOffset = {0}", header.commentOffset);
|
||||
DicConsole.DebugWriteLine("SaveDskF plugin", "header.dataOffset = {0}", header.dataOffset);
|
||||
DicConsole.DebugWriteLine("SaveDskF plugin", "header.padding = {0}", header.padding);
|
||||
DicConsole.DebugWriteLine("SaveDskF plugin", "header.sectorsCopied = {0}", header.sectorsCopied);
|
||||
DicConsole.DebugWriteLine("SaveDskF plugin", "header.commentOffset = {0}", header.commentOffset);
|
||||
DicConsole.DebugWriteLine("SaveDskF plugin", "header.dataOffset = {0}", header.dataOffset);
|
||||
|
||||
if(header.dataOffset == 0 && header.magic == SDF_MAGIC_OLD) header.dataOffset = 512;
|
||||
|
||||
@@ -161,7 +161,7 @@ namespace DiscImageChef.DiscImages
|
||||
int b;
|
||||
do
|
||||
{
|
||||
b = stream.ReadByte();
|
||||
b = stream.ReadByte();
|
||||
if(b >= 0) calculatedChk += (uint)b;
|
||||
}
|
||||
while(b >= 0);
|
||||
@@ -169,108 +169,17 @@ namespace DiscImageChef.DiscImages
|
||||
DicConsole.DebugWriteLine("SaveDskF plugin", "Calculated checksum = 0x{0:X8}, {1}", calculatedChk,
|
||||
calculatedChk == header.checksum);
|
||||
|
||||
imageInfo.Application = "SaveDskF";
|
||||
imageInfo.CreationTime = imageFilter.GetCreationTime();
|
||||
imageInfo.Application = "SaveDskF";
|
||||
imageInfo.CreationTime = imageFilter.GetCreationTime();
|
||||
imageInfo.LastModificationTime = imageFilter.GetLastWriteTime();
|
||||
imageInfo.MediaTitle = imageFilter.GetFilename();
|
||||
imageInfo.ImageSize = (ulong)(stream.Length - header.dataOffset);
|
||||
imageInfo.Sectors = (ulong)(header.sectorsPerTrack * header.heads * header.cylinders);
|
||||
imageInfo.SectorSize = header.sectorSize;
|
||||
imageInfo.MediaTitle = imageFilter.GetFilename();
|
||||
imageInfo.ImageSize = (ulong)(stream.Length - header.dataOffset);
|
||||
imageInfo.Sectors = (ulong)(header.sectorsPerTrack * header.heads * header.cylinders);
|
||||
imageInfo.SectorSize = header.sectorSize;
|
||||
|
||||
imageInfo.MediaType = MediaType.Unknown;
|
||||
switch(header.cylinders)
|
||||
{
|
||||
case 40:
|
||||
switch(header.heads)
|
||||
{
|
||||
case 1:
|
||||
switch(header.sectorsPerTrack)
|
||||
{
|
||||
case 8:
|
||||
imageInfo.MediaType = MediaType.DOS_525_SS_DD_8;
|
||||
break;
|
||||
case 9:
|
||||
imageInfo.MediaType = MediaType.DOS_525_SS_DD_9;
|
||||
break;
|
||||
}
|
||||
|
||||
break;
|
||||
case 2:
|
||||
switch(header.sectorsPerTrack)
|
||||
{
|
||||
case 8:
|
||||
imageInfo.MediaType = MediaType.DOS_525_DS_DD_8;
|
||||
break;
|
||||
case 9:
|
||||
imageInfo.MediaType = MediaType.DOS_525_DS_DD_9;
|
||||
break;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
break;
|
||||
case 70:
|
||||
switch(header.heads)
|
||||
{
|
||||
case 1:
|
||||
switch(header.sectorsPerTrack)
|
||||
{
|
||||
case 9:
|
||||
imageInfo.MediaType = MediaType.Apricot_35;
|
||||
break;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
break;
|
||||
case 80:
|
||||
switch(header.heads)
|
||||
{
|
||||
case 1:
|
||||
switch(header.sectorsPerTrack)
|
||||
{
|
||||
case 8:
|
||||
imageInfo.MediaType = MediaType.DOS_35_SS_DD_8;
|
||||
break;
|
||||
case 9:
|
||||
imageInfo.MediaType = MediaType.DOS_35_SS_DD_9;
|
||||
break;
|
||||
}
|
||||
|
||||
break;
|
||||
case 2:
|
||||
switch(header.sectorsPerTrack)
|
||||
{
|
||||
case 8:
|
||||
imageInfo.MediaType = MediaType.DOS_35_DS_DD_8;
|
||||
break;
|
||||
case 9:
|
||||
imageInfo.MediaType = MediaType.DOS_35_DS_DD_9;
|
||||
break;
|
||||
case 15:
|
||||
imageInfo.MediaType = MediaType.DOS_525_HD;
|
||||
break;
|
||||
case 18:
|
||||
imageInfo.MediaType = MediaType.DOS_35_HD;
|
||||
break;
|
||||
case 23:
|
||||
imageInfo.MediaType = MediaType.XDF_35;
|
||||
break;
|
||||
case 36:
|
||||
imageInfo.MediaType = MediaType.DOS_35_ED;
|
||||
break;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
break;
|
||||
default:
|
||||
imageInfo.MediaType = MediaType.Unknown;
|
||||
break;
|
||||
}
|
||||
imageInfo.MediaType =
|
||||
Geometry.GetMediaType((header.cylinders, (byte)header.heads, header.sectorsPerTrack, header.sectorSize,
|
||||
MediaEncoding.MFM, false));
|
||||
|
||||
imageInfo.XmlMediaType = XmlMediaType.BlockMedia;
|
||||
|
||||
@@ -288,8 +197,8 @@ namespace DiscImageChef.DiscImages
|
||||
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.Cylinders = header.cylinders;
|
||||
imageInfo.Heads = header.heads;
|
||||
imageInfo.SectorsPerTrack = header.sectorsPerTrack;
|
||||
|
||||
return true;
|
||||
@@ -306,7 +215,7 @@ namespace DiscImageChef.DiscImages
|
||||
}
|
||||
|
||||
public bool? VerifySectors(ulong sectorAddress, uint length, out List<ulong> failingLbas,
|
||||
out List<ulong> unknownLbas)
|
||||
out List<ulong> unknownLbas)
|
||||
{
|
||||
failingLbas = new List<ulong>();
|
||||
unknownLbas = new List<ulong>();
|
||||
@@ -317,7 +226,7 @@ namespace DiscImageChef.DiscImages
|
||||
}
|
||||
|
||||
public bool? VerifySectors(ulong sectorAddress, uint length, uint track, out List<ulong> failingLbas,
|
||||
out List<ulong> unknownLbas)
|
||||
out List<ulong> unknownLbas)
|
||||
{
|
||||
failingLbas = new List<ulong>();
|
||||
unknownLbas = new List<ulong>();
|
||||
@@ -348,7 +257,7 @@ namespace DiscImageChef.DiscImages
|
||||
byte[] buffer = new byte[length * imageInfo.SectorSize];
|
||||
|
||||
Array.Copy(decodedDisk, (int)sectorAddress * imageInfo.SectorSize, buffer, 0,
|
||||
length * imageInfo.SectorSize);
|
||||
length * imageInfo.SectorSize);
|
||||
|
||||
return buffer;
|
||||
}
|
||||
|
||||
@@ -41,41 +41,41 @@ namespace DiscImageChef.DiscImages
|
||||
{
|
||||
public class ZZZRawImage : IMediaImage
|
||||
{
|
||||
bool differentTrackZeroSize;
|
||||
string extension;
|
||||
bool differentTrackZeroSize;
|
||||
string extension;
|
||||
ImageInfo imageInfo;
|
||||
IFilter rawImageFilter;
|
||||
IFilter rawImageFilter;
|
||||
|
||||
public ZZZRawImage()
|
||||
{
|
||||
imageInfo = new ImageInfo
|
||||
{
|
||||
ReadableSectorTags = new List<SectorTagType>(),
|
||||
ReadableMediaTags = new List<MediaTagType>(),
|
||||
HasPartitions = false,
|
||||
HasSessions = false,
|
||||
Version = null,
|
||||
Application = null,
|
||||
ApplicationVersion = null,
|
||||
Creator = null,
|
||||
Comments = null,
|
||||
MediaManufacturer = null,
|
||||
MediaModel = null,
|
||||
MediaSerialNumber = null,
|
||||
MediaBarcode = null,
|
||||
MediaPartNumber = null,
|
||||
MediaSequence = 0,
|
||||
LastMediaSequence = 0,
|
||||
DriveManufacturer = null,
|
||||
DriveModel = null,
|
||||
DriveSerialNumber = null,
|
||||
ReadableSectorTags = new List<SectorTagType>(),
|
||||
ReadableMediaTags = new List<MediaTagType>(),
|
||||
HasPartitions = false,
|
||||
HasSessions = false,
|
||||
Version = null,
|
||||
Application = null,
|
||||
ApplicationVersion = null,
|
||||
Creator = null,
|
||||
Comments = null,
|
||||
MediaManufacturer = null,
|
||||
MediaModel = null,
|
||||
MediaSerialNumber = null,
|
||||
MediaBarcode = null,
|
||||
MediaPartNumber = null,
|
||||
MediaSequence = 0,
|
||||
LastMediaSequence = 0,
|
||||
DriveManufacturer = null,
|
||||
DriveModel = null,
|
||||
DriveSerialNumber = null,
|
||||
DriveFirmwareRevision = null
|
||||
};
|
||||
}
|
||||
|
||||
public string Name => "Raw Disk Image";
|
||||
// Non-random UUID to recognize this specific plugin
|
||||
public Guid Id => new Guid("12345678-AAAA-BBBB-CCCC-123456789000");
|
||||
public Guid Id => new Guid("12345678-AAAA-BBBB-CCCC-123456789000");
|
||||
public ImageInfo Info => imageInfo;
|
||||
|
||||
public string ImageFormat => "Raw disk image (sector by sector copy)";
|
||||
@@ -89,17 +89,17 @@ namespace DiscImageChef.DiscImages
|
||||
|
||||
Track trk = new Track
|
||||
{
|
||||
TrackBytesPerSector = (int)imageInfo.SectorSize,
|
||||
TrackEndSector = imageInfo.Sectors - 1,
|
||||
TrackFile = rawImageFilter.GetFilename(),
|
||||
TrackFileOffset = 0,
|
||||
TrackFileType = "BINARY",
|
||||
TrackBytesPerSector = (int)imageInfo.SectorSize,
|
||||
TrackEndSector = imageInfo.Sectors - 1,
|
||||
TrackFile = rawImageFilter.GetFilename(),
|
||||
TrackFileOffset = 0,
|
||||
TrackFileType = "BINARY",
|
||||
TrackRawBytesPerSector = (int)imageInfo.SectorSize,
|
||||
TrackSequence = 1,
|
||||
TrackStartSector = 0,
|
||||
TrackSubchannelType = TrackSubchannelType.None,
|
||||
TrackType = TrackType.Data,
|
||||
TrackSession = 1
|
||||
TrackSequence = 1,
|
||||
TrackStartSector = 0,
|
||||
TrackSubchannelType = TrackSubchannelType.None,
|
||||
TrackType = TrackType.Data,
|
||||
TrackSession = 1
|
||||
};
|
||||
List<Track> lst = new List<Track> {trk};
|
||||
return lst;
|
||||
@@ -115,11 +115,11 @@ namespace DiscImageChef.DiscImages
|
||||
|
||||
Session sess = new Session
|
||||
{
|
||||
EndSector = imageInfo.Sectors - 1,
|
||||
EndTrack = 1,
|
||||
EndSector = imageInfo.Sectors - 1,
|
||||
EndTrack = 1,
|
||||
SessionSequence = 1,
|
||||
StartSector = 0,
|
||||
StartTrack = 1
|
||||
StartSector = 0,
|
||||
StartTrack = 1
|
||||
};
|
||||
List<Session> lst = new List<Session> {sess};
|
||||
return lst;
|
||||
@@ -134,14 +134,14 @@ namespace DiscImageChef.DiscImages
|
||||
throw new FeatureUnsupportedImageException("Feature not supported by image format");
|
||||
|
||||
List<Partition> parts = new List<Partition>();
|
||||
Partition part = new Partition
|
||||
Partition part = new Partition
|
||||
{
|
||||
Start = 0,
|
||||
Length = imageInfo.Sectors,
|
||||
Offset = 0,
|
||||
Start = 0,
|
||||
Length = imageInfo.Sectors,
|
||||
Offset = 0,
|
||||
Sequence = 0,
|
||||
Type = "MODE1/2048",
|
||||
Size = imageInfo.Sectors * imageInfo.SectorSize
|
||||
Type = "MODE1/2048",
|
||||
Size = imageInfo.Sectors * imageInfo.SectorSize
|
||||
};
|
||||
parts.Add(part);
|
||||
return parts;
|
||||
@@ -183,7 +183,7 @@ namespace DiscImageChef.DiscImages
|
||||
case 1222400:
|
||||
case 1304320:
|
||||
case 1255168: return true;
|
||||
default: return false;
|
||||
default: return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -202,10 +202,12 @@ namespace DiscImageChef.DiscImages
|
||||
imageInfo.SectorSize = 256;
|
||||
break;
|
||||
default:
|
||||
if((extension == ".adf" || extension == ".adl" || extension == ".ssd" || extension == ".dsd") &&
|
||||
(imageFilter.GetDataForkLength() == 163840 || imageFilter.GetDataForkLength() == 327680 ||
|
||||
imageFilter.GetDataForkLength() == 655360)) imageInfo.SectorSize = 256;
|
||||
else if((extension == ".adf" || extension == ".adl") && imageFilter.GetDataForkLength() == 819200)
|
||||
if((extension == ".adf" || extension == ".adl" ||
|
||||
extension == ".ssd" || extension == ".dsd") &&
|
||||
(imageFilter.GetDataForkLength() == 163840 || imageFilter.GetDataForkLength() == 327680 ||
|
||||
imageFilter.GetDataForkLength() == 655360)) imageInfo.SectorSize = 256;
|
||||
else if((extension == ".adf" || extension == ".adl") &&
|
||||
imageFilter.GetDataForkLength() == 819200)
|
||||
imageInfo.SectorSize = 1024;
|
||||
else
|
||||
switch(imageFilter.GetDataForkLength())
|
||||
@@ -218,9 +220,9 @@ namespace DiscImageChef.DiscImages
|
||||
imageInfo.SectorSize = 128;
|
||||
break;
|
||||
case 116480:
|
||||
case 287488: // T0S0 = 128bps
|
||||
case 988416: // T0S0 = 128bps
|
||||
case 995072: // T0S0 = 128bps, T0S1 = 256bps
|
||||
case 287488: // T0S0 = 128bps
|
||||
case 988416: // T0S0 = 128bps
|
||||
case 995072: // T0S0 = 128bps, T0S1 = 256bps
|
||||
case 1021696: // T0S0 = 128bps, T0S1 = 256bps
|
||||
case 232960:
|
||||
case 143360:
|
||||
@@ -229,7 +231,7 @@ namespace DiscImageChef.DiscImages
|
||||
case 102400:
|
||||
case 204800:
|
||||
case 655360:
|
||||
case 80384: // T0S0 = 128bps
|
||||
case 80384: // T0S0 = 128bps
|
||||
case 325632: // T0S0 = 128bps, T0S1 = 256bps
|
||||
case 653312: // T0S0 = 128bps, T0S1 = 256bps
|
||||
|
||||
@@ -248,7 +250,7 @@ namespace DiscImageChef.DiscImages
|
||||
case 81664:
|
||||
imageInfo.SectorSize = 319;
|
||||
break;
|
||||
case 306432: // T0S0 = 128bps
|
||||
case 306432: // T0S0 = 128bps
|
||||
case 1146624: // T0S0 = 128bps, T0S1 = 256bps
|
||||
case 1177344: // T0S0 = 128bps, T0S1 = 256bps
|
||||
imageInfo.SectorSize = 512;
|
||||
@@ -268,12 +270,12 @@ namespace DiscImageChef.DiscImages
|
||||
break;
|
||||
}
|
||||
|
||||
imageInfo.ImageSize = (ulong)imageFilter.GetDataForkLength();
|
||||
imageInfo.CreationTime = imageFilter.GetCreationTime();
|
||||
imageInfo.ImageSize = (ulong)imageFilter.GetDataForkLength();
|
||||
imageInfo.CreationTime = imageFilter.GetCreationTime();
|
||||
imageInfo.LastModificationTime = imageFilter.GetLastWriteTime();
|
||||
imageInfo.MediaTitle = Path.GetFileNameWithoutExtension(imageFilter.GetFilename());
|
||||
differentTrackZeroSize = false;
|
||||
rawImageFilter = imageFilter;
|
||||
imageInfo.MediaTitle = Path.GetFileNameWithoutExtension(imageFilter.GetFilename());
|
||||
differentTrackZeroSize = false;
|
||||
rawImageFilter = imageFilter;
|
||||
|
||||
switch(imageFilter.GetDataForkLength())
|
||||
{
|
||||
@@ -290,63 +292,63 @@ namespace DiscImageChef.DiscImages
|
||||
imageInfo.Sectors = 455;
|
||||
break;
|
||||
case 287488: // T0S0 = 128bps
|
||||
imageInfo.Sectors = 1136;
|
||||
imageInfo.Sectors = 1136;
|
||||
differentTrackZeroSize = true;
|
||||
break;
|
||||
case 988416: // T0S0 = 128bps
|
||||
imageInfo.Sectors = 3874;
|
||||
imageInfo.Sectors = 3874;
|
||||
differentTrackZeroSize = true;
|
||||
break;
|
||||
case 995072: // T0S0 = 128bps, T0S1 = 256bps
|
||||
imageInfo.Sectors = 3900;
|
||||
imageInfo.Sectors = 3900;
|
||||
differentTrackZeroSize = true;
|
||||
break;
|
||||
case 1021696: // T0S0 = 128bps, T0S1 = 256bps
|
||||
imageInfo.Sectors = 4004;
|
||||
imageInfo.Sectors = 4004;
|
||||
differentTrackZeroSize = true;
|
||||
break;
|
||||
case 81664:
|
||||
imageInfo.Sectors = 256;
|
||||
break;
|
||||
case 306432: // T0S0 = 128bps
|
||||
imageInfo.Sectors = 618;
|
||||
imageInfo.Sectors = 618;
|
||||
differentTrackZeroSize = true;
|
||||
break;
|
||||
case 1146624: // T0S0 = 128bps, T0S1 = 256bps
|
||||
imageInfo.Sectors = 2272;
|
||||
imageInfo.Sectors = 2272;
|
||||
differentTrackZeroSize = true;
|
||||
break;
|
||||
case 1177344: // T0S0 = 128bps, T0S1 = 256bps
|
||||
imageInfo.Sectors = 2332;
|
||||
imageInfo.Sectors = 2332;
|
||||
differentTrackZeroSize = true;
|
||||
break;
|
||||
case 1222400: // T0S0 = 128bps, T0S1 = 256bps
|
||||
imageInfo.Sectors = 1236;
|
||||
imageInfo.Sectors = 1236;
|
||||
differentTrackZeroSize = true;
|
||||
break;
|
||||
case 1304320: // T0S0 = 128bps, T0S1 = 256bps
|
||||
imageInfo.Sectors = 1316;
|
||||
imageInfo.Sectors = 1316;
|
||||
differentTrackZeroSize = true;
|
||||
break;
|
||||
case 1255168: // T0S0 = 128bps, T0S1 = 256bps
|
||||
imageInfo.Sectors = 1268;
|
||||
imageInfo.Sectors = 1268;
|
||||
differentTrackZeroSize = true;
|
||||
break;
|
||||
case 80384: // T0S0 = 128bps
|
||||
imageInfo.Sectors = 322;
|
||||
imageInfo.Sectors = 322;
|
||||
differentTrackZeroSize = true;
|
||||
break;
|
||||
case 325632: // T0S0 = 128bps, T0S1 = 256bps
|
||||
imageInfo.Sectors = 1280;
|
||||
imageInfo.Sectors = 1280;
|
||||
differentTrackZeroSize = true;
|
||||
break;
|
||||
case 653312: // T0S0 = 128bps, T0S1 = 256bps
|
||||
imageInfo.Sectors = 2560;
|
||||
imageInfo.Sectors = 2560;
|
||||
differentTrackZeroSize = true;
|
||||
break;
|
||||
case 1880064: // IBM XDF, 3,5", real number of sectors
|
||||
imageInfo.Sectors = 670;
|
||||
imageInfo.SectorSize = 8192; // Biggest sector size
|
||||
imageInfo.Sectors = 670;
|
||||
imageInfo.SectorSize = 8192; // Biggest sector size
|
||||
differentTrackZeroSize = true;
|
||||
break;
|
||||
case 175531:
|
||||
@@ -385,17 +387,17 @@ namespace DiscImageChef.DiscImages
|
||||
}
|
||||
|
||||
// Sharp X68000 SASI hard disks
|
||||
if(extension == ".hdf")
|
||||
if(extension == ".hdf")
|
||||
if(imageInfo.ImageSize % 256 == 0)
|
||||
{
|
||||
imageInfo.SectorSize = 256;
|
||||
imageInfo.Sectors = imageInfo.ImageSize / imageInfo.SectorSize;
|
||||
imageInfo.MediaType = MediaType.GENERIC_HDD;
|
||||
imageInfo.Sectors = imageInfo.ImageSize / imageInfo.SectorSize;
|
||||
imageInfo.MediaType = MediaType.GENERIC_HDD;
|
||||
}
|
||||
|
||||
if(imageInfo.XmlMediaType == XmlMediaType.OpticalDisc)
|
||||
{
|
||||
imageInfo.HasSessions = true;
|
||||
imageInfo.HasSessions = true;
|
||||
imageInfo.HasPartitions = true;
|
||||
}
|
||||
|
||||
@@ -404,319 +406,319 @@ namespace DiscImageChef.DiscImages
|
||||
switch(imageInfo.MediaType)
|
||||
{
|
||||
case MediaType.ACORN_35_DS_DD:
|
||||
imageInfo.Cylinders = 80;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.Cylinders = 80;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.SectorsPerTrack = 5;
|
||||
break;
|
||||
case MediaType.ACORN_35_DS_HD:
|
||||
imageInfo.Cylinders = 80;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.Cylinders = 80;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.SectorsPerTrack = 10;
|
||||
break;
|
||||
case MediaType.ACORN_525_DS_DD:
|
||||
imageInfo.Cylinders = 80;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.Cylinders = 80;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.SectorsPerTrack = 16;
|
||||
break;
|
||||
case MediaType.ACORN_525_SS_DD_40:
|
||||
imageInfo.Cylinders = 40;
|
||||
imageInfo.Heads = 1;
|
||||
imageInfo.Cylinders = 40;
|
||||
imageInfo.Heads = 1;
|
||||
imageInfo.SectorsPerTrack = 16;
|
||||
break;
|
||||
case MediaType.ACORN_525_SS_DD_80:
|
||||
imageInfo.Cylinders = 80;
|
||||
imageInfo.Heads = 1;
|
||||
imageInfo.Cylinders = 80;
|
||||
imageInfo.Heads = 1;
|
||||
imageInfo.SectorsPerTrack = 16;
|
||||
break;
|
||||
case MediaType.ACORN_525_SS_SD_40:
|
||||
imageInfo.Cylinders = 40;
|
||||
imageInfo.Heads = 1;
|
||||
imageInfo.Cylinders = 40;
|
||||
imageInfo.Heads = 1;
|
||||
imageInfo.SectorsPerTrack = 10;
|
||||
break;
|
||||
case MediaType.ACORN_525_SS_SD_80:
|
||||
imageInfo.Cylinders = 80;
|
||||
imageInfo.Heads = 1;
|
||||
imageInfo.Cylinders = 80;
|
||||
imageInfo.Heads = 1;
|
||||
imageInfo.SectorsPerTrack = 10;
|
||||
break;
|
||||
case MediaType.Apple32DS:
|
||||
imageInfo.Cylinders = 35;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.Cylinders = 35;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.SectorsPerTrack = 13;
|
||||
break;
|
||||
case MediaType.Apple32SS:
|
||||
imageInfo.Cylinders = 36;
|
||||
imageInfo.Heads = 1;
|
||||
imageInfo.Cylinders = 36;
|
||||
imageInfo.Heads = 1;
|
||||
imageInfo.SectorsPerTrack = 13;
|
||||
break;
|
||||
case MediaType.Apple33DS:
|
||||
imageInfo.Cylinders = 35;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.Cylinders = 35;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.SectorsPerTrack = 16;
|
||||
break;
|
||||
case MediaType.Apple33SS:
|
||||
imageInfo.Cylinders = 35;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.Cylinders = 35;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.SectorsPerTrack = 16;
|
||||
break;
|
||||
case MediaType.AppleSonyDS:
|
||||
imageInfo.Cylinders = 80;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.Cylinders = 80;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.SectorsPerTrack = 10;
|
||||
break;
|
||||
case MediaType.AppleSonySS:
|
||||
imageInfo.Cylinders = 80;
|
||||
imageInfo.Heads = 1;
|
||||
imageInfo.Cylinders = 80;
|
||||
imageInfo.Heads = 1;
|
||||
imageInfo.SectorsPerTrack = 10;
|
||||
break;
|
||||
case MediaType.ATARI_35_DS_DD:
|
||||
imageInfo.Cylinders = 80;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.Cylinders = 80;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.SectorsPerTrack = 10;
|
||||
break;
|
||||
case MediaType.ATARI_35_DS_DD_11:
|
||||
imageInfo.Cylinders = 80;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.Cylinders = 80;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.SectorsPerTrack = 11;
|
||||
break;
|
||||
case MediaType.ATARI_35_SS_DD:
|
||||
imageInfo.Cylinders = 80;
|
||||
imageInfo.Heads = 1;
|
||||
imageInfo.Cylinders = 80;
|
||||
imageInfo.Heads = 1;
|
||||
imageInfo.SectorsPerTrack = 10;
|
||||
break;
|
||||
case MediaType.ATARI_35_SS_DD_11:
|
||||
imageInfo.Cylinders = 80;
|
||||
imageInfo.Heads = 1;
|
||||
imageInfo.Cylinders = 80;
|
||||
imageInfo.Heads = 1;
|
||||
imageInfo.SectorsPerTrack = 11;
|
||||
break;
|
||||
case MediaType.ATARI_525_ED:
|
||||
imageInfo.Cylinders = 40;
|
||||
imageInfo.Heads = 1;
|
||||
imageInfo.Cylinders = 40;
|
||||
imageInfo.Heads = 1;
|
||||
imageInfo.SectorsPerTrack = 26;
|
||||
break;
|
||||
case MediaType.ATARI_525_SD:
|
||||
imageInfo.Cylinders = 40;
|
||||
imageInfo.Heads = 1;
|
||||
imageInfo.Cylinders = 40;
|
||||
imageInfo.Heads = 1;
|
||||
imageInfo.SectorsPerTrack = 18;
|
||||
break;
|
||||
case MediaType.CBM_35_DD:
|
||||
imageInfo.Cylinders = 80;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.Cylinders = 80;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.SectorsPerTrack = 10;
|
||||
break;
|
||||
case MediaType.CBM_AMIGA_35_DD:
|
||||
imageInfo.Cylinders = 80;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.Cylinders = 80;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.SectorsPerTrack = 11;
|
||||
break;
|
||||
case MediaType.CBM_AMIGA_35_HD:
|
||||
imageInfo.Cylinders = 80;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.Cylinders = 80;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.SectorsPerTrack = 22;
|
||||
break;
|
||||
case MediaType.DMF:
|
||||
imageInfo.Cylinders = 80;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.Cylinders = 80;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.SectorsPerTrack = 21;
|
||||
break;
|
||||
case MediaType.DOS_35_DS_DD_9:
|
||||
imageInfo.Cylinders = 80;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.Cylinders = 80;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.SectorsPerTrack = 9;
|
||||
break;
|
||||
case MediaType.Apricot_35:
|
||||
imageInfo.Cylinders = 70;
|
||||
imageInfo.Heads = 1;
|
||||
imageInfo.Cylinders = 70;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.SectorsPerTrack = 9;
|
||||
break;
|
||||
case MediaType.DOS_35_ED:
|
||||
imageInfo.Cylinders = 80;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.Cylinders = 80;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.SectorsPerTrack = 36;
|
||||
break;
|
||||
case MediaType.DOS_35_HD:
|
||||
imageInfo.Cylinders = 80;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.Cylinders = 80;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.SectorsPerTrack = 18;
|
||||
break;
|
||||
case MediaType.DOS_35_SS_DD_9:
|
||||
imageInfo.Cylinders = 80;
|
||||
imageInfo.Heads = 1;
|
||||
imageInfo.Cylinders = 80;
|
||||
imageInfo.Heads = 1;
|
||||
imageInfo.SectorsPerTrack = 9;
|
||||
break;
|
||||
case MediaType.DOS_525_DS_DD_8:
|
||||
imageInfo.Cylinders = 40;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.Cylinders = 40;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.SectorsPerTrack = 8;
|
||||
break;
|
||||
case MediaType.DOS_525_DS_DD_9:
|
||||
imageInfo.Cylinders = 40;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.Cylinders = 40;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.SectorsPerTrack = 9;
|
||||
break;
|
||||
case MediaType.DOS_525_HD:
|
||||
imageInfo.Cylinders = 80;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.Cylinders = 80;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.SectorsPerTrack = 15;
|
||||
break;
|
||||
case MediaType.DOS_525_SS_DD_8:
|
||||
imageInfo.Cylinders = 40;
|
||||
imageInfo.Heads = 1;
|
||||
imageInfo.Cylinders = 40;
|
||||
imageInfo.Heads = 1;
|
||||
imageInfo.SectorsPerTrack = 8;
|
||||
break;
|
||||
case MediaType.DOS_525_SS_DD_9:
|
||||
imageInfo.Cylinders = 40;
|
||||
imageInfo.Heads = 1;
|
||||
imageInfo.Cylinders = 40;
|
||||
imageInfo.Heads = 1;
|
||||
imageInfo.SectorsPerTrack = 9;
|
||||
break;
|
||||
case MediaType.ECMA_54:
|
||||
imageInfo.Cylinders = 77;
|
||||
imageInfo.Heads = 1;
|
||||
imageInfo.Cylinders = 77;
|
||||
imageInfo.Heads = 1;
|
||||
imageInfo.SectorsPerTrack = 26;
|
||||
break;
|
||||
case MediaType.ECMA_59:
|
||||
imageInfo.Cylinders = 77;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.Cylinders = 77;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.SectorsPerTrack = 26;
|
||||
break;
|
||||
case MediaType.ECMA_66:
|
||||
imageInfo.Cylinders = 35;
|
||||
imageInfo.Heads = 1;
|
||||
imageInfo.Cylinders = 35;
|
||||
imageInfo.Heads = 1;
|
||||
imageInfo.SectorsPerTrack = 9;
|
||||
break;
|
||||
case MediaType.ECMA_69_8:
|
||||
imageInfo.Cylinders = 77;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.Cylinders = 77;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.SectorsPerTrack = 8;
|
||||
break;
|
||||
case MediaType.ECMA_70:
|
||||
imageInfo.Cylinders = 40;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.Cylinders = 40;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.SectorsPerTrack = 16;
|
||||
break;
|
||||
case MediaType.ECMA_78:
|
||||
imageInfo.Cylinders = 80;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.Cylinders = 80;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.SectorsPerTrack = 16;
|
||||
break;
|
||||
case MediaType.ECMA_99_15:
|
||||
imageInfo.Cylinders = 77;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.Cylinders = 77;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.SectorsPerTrack = 15;
|
||||
break;
|
||||
case MediaType.ECMA_99_26:
|
||||
imageInfo.Cylinders = 77;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.Cylinders = 77;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.SectorsPerTrack = 26;
|
||||
break;
|
||||
case MediaType.ECMA_99_8:
|
||||
imageInfo.Cylinders = 80;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.Cylinders = 80;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.SectorsPerTrack = 8;
|
||||
break;
|
||||
case MediaType.FDFORMAT_35_DD:
|
||||
imageInfo.Cylinders = 82;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.Cylinders = 82;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.SectorsPerTrack = 10;
|
||||
break;
|
||||
case MediaType.FDFORMAT_35_HD:
|
||||
imageInfo.Cylinders = 82;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.Cylinders = 82;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.SectorsPerTrack = 21;
|
||||
break;
|
||||
case MediaType.FDFORMAT_525_HD:
|
||||
imageInfo.Cylinders = 82;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.Cylinders = 82;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.SectorsPerTrack = 17;
|
||||
break;
|
||||
case MediaType.IBM23FD:
|
||||
imageInfo.Cylinders = 32;
|
||||
imageInfo.Heads = 1;
|
||||
imageInfo.Cylinders = 32;
|
||||
imageInfo.Heads = 1;
|
||||
imageInfo.SectorsPerTrack = 8;
|
||||
break;
|
||||
case MediaType.IBM33FD_128:
|
||||
imageInfo.Cylinders = 73;
|
||||
imageInfo.Heads = 1;
|
||||
imageInfo.Cylinders = 73;
|
||||
imageInfo.Heads = 1;
|
||||
imageInfo.SectorsPerTrack = 26;
|
||||
break;
|
||||
case MediaType.IBM33FD_256:
|
||||
imageInfo.Cylinders = 74;
|
||||
imageInfo.Heads = 1;
|
||||
imageInfo.Cylinders = 74;
|
||||
imageInfo.Heads = 1;
|
||||
imageInfo.SectorsPerTrack = 15;
|
||||
break;
|
||||
case MediaType.IBM33FD_512:
|
||||
imageInfo.Cylinders = 74;
|
||||
imageInfo.Heads = 1;
|
||||
imageInfo.Cylinders = 74;
|
||||
imageInfo.Heads = 1;
|
||||
imageInfo.SectorsPerTrack = 8;
|
||||
break;
|
||||
case MediaType.IBM43FD_128:
|
||||
imageInfo.Cylinders = 74;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.Cylinders = 74;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.SectorsPerTrack = 26;
|
||||
break;
|
||||
case MediaType.IBM43FD_256:
|
||||
imageInfo.Cylinders = 74;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.Cylinders = 74;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.SectorsPerTrack = 15;
|
||||
break;
|
||||
case MediaType.IBM53FD_1024:
|
||||
imageInfo.Cylinders = 74;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.Cylinders = 74;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.SectorsPerTrack = 8;
|
||||
break;
|
||||
case MediaType.IBM53FD_256:
|
||||
imageInfo.Cylinders = 74;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.Cylinders = 74;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.SectorsPerTrack = 26;
|
||||
break;
|
||||
case MediaType.IBM53FD_512:
|
||||
imageInfo.Cylinders = 74;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.Cylinders = 74;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.SectorsPerTrack = 15;
|
||||
break;
|
||||
case MediaType.NEC_35_TD:
|
||||
imageInfo.Cylinders = 240;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.Cylinders = 240;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.SectorsPerTrack = 38;
|
||||
break;
|
||||
case MediaType.NEC_525_HD:
|
||||
imageInfo.Cylinders = 77;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.Cylinders = 77;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.SectorsPerTrack = 8;
|
||||
break;
|
||||
case MediaType.XDF_35:
|
||||
imageInfo.Cylinders = 80;
|
||||
imageInfo.Heads = 2;
|
||||
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.Cylinders = 1021;
|
||||
imageInfo.Heads = 64;
|
||||
imageInfo.SectorsPerTrack = 32;
|
||||
break;
|
||||
case MediaType.PocketZip:
|
||||
imageInfo.Cylinders = 154;
|
||||
imageInfo.Heads = 16;
|
||||
imageInfo.Cylinders = 154;
|
||||
imageInfo.Heads = 16;
|
||||
imageInfo.SectorsPerTrack = 32;
|
||||
break;
|
||||
case MediaType.LS120:
|
||||
imageInfo.Cylinders = 963;
|
||||
imageInfo.Heads = 8;
|
||||
imageInfo.Cylinders = 963;
|
||||
imageInfo.Heads = 8;
|
||||
imageInfo.SectorsPerTrack = 32;
|
||||
break;
|
||||
case MediaType.LS240:
|
||||
imageInfo.Cylinders = 262;
|
||||
imageInfo.Heads = 32;
|
||||
imageInfo.Cylinders = 262;
|
||||
imageInfo.Heads = 32;
|
||||
imageInfo.SectorsPerTrack = 56;
|
||||
break;
|
||||
case MediaType.FD32MB:
|
||||
imageInfo.Cylinders = 1024;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.Cylinders = 1024;
|
||||
imageInfo.Heads = 2;
|
||||
imageInfo.SectorsPerTrack = 32;
|
||||
break;
|
||||
default:
|
||||
imageInfo.Cylinders = (uint)(imageInfo.Sectors / 16 / 63);
|
||||
imageInfo.Heads = 16;
|
||||
imageInfo.Cylinders = (uint)(imageInfo.Sectors / 16 / 63);
|
||||
imageInfo.Heads = 16;
|
||||
imageInfo.SectorsPerTrack = 63;
|
||||
break;
|
||||
}
|
||||
@@ -761,7 +763,7 @@ namespace DiscImageChef.DiscImages
|
||||
}
|
||||
|
||||
public bool? VerifySectors(ulong sectorAddress, uint length, out List<ulong> failingLbas,
|
||||
out List<ulong> unknownLbas)
|
||||
out List<ulong> unknownLbas)
|
||||
{
|
||||
failingLbas = new List<ulong>();
|
||||
unknownLbas = new List<ulong>();
|
||||
@@ -772,7 +774,7 @@ namespace DiscImageChef.DiscImages
|
||||
}
|
||||
|
||||
public bool? VerifySectors(ulong sectorAddress, uint length, uint track, out List<ulong> failingLbas,
|
||||
out List<ulong> unknownLbas)
|
||||
out List<ulong> unknownLbas)
|
||||
{
|
||||
failingLbas = new List<ulong>();
|
||||
unknownLbas = new List<ulong>();
|
||||
@@ -797,18 +799,18 @@ namespace DiscImageChef.DiscImages
|
||||
|
||||
Track trk = new Track
|
||||
{
|
||||
TrackBytesPerSector = (int)imageInfo.SectorSize,
|
||||
TrackEndSector = imageInfo.Sectors - 1,
|
||||
TrackFilter = rawImageFilter,
|
||||
TrackFile = rawImageFilter.GetFilename(),
|
||||
TrackFileOffset = 0,
|
||||
TrackFileType = "BINARY",
|
||||
TrackBytesPerSector = (int)imageInfo.SectorSize,
|
||||
TrackEndSector = imageInfo.Sectors - 1,
|
||||
TrackFilter = rawImageFilter,
|
||||
TrackFile = rawImageFilter.GetFilename(),
|
||||
TrackFileOffset = 0,
|
||||
TrackFileType = "BINARY",
|
||||
TrackRawBytesPerSector = (int)imageInfo.SectorSize,
|
||||
TrackSequence = 1,
|
||||
TrackStartSector = 0,
|
||||
TrackSubchannelType = TrackSubchannelType.None,
|
||||
TrackType = TrackType.Data,
|
||||
TrackSession = 1
|
||||
TrackSequence = 1,
|
||||
TrackStartSector = 0,
|
||||
TrackSubchannelType = TrackSubchannelType.None,
|
||||
TrackType = TrackType.Data,
|
||||
TrackSession = 1
|
||||
};
|
||||
List<Track> lst = new List<Track> {trk};
|
||||
return lst;
|
||||
@@ -824,18 +826,18 @@ namespace DiscImageChef.DiscImages
|
||||
|
||||
Track trk = new Track
|
||||
{
|
||||
TrackBytesPerSector = (int)imageInfo.SectorSize,
|
||||
TrackEndSector = imageInfo.Sectors - 1,
|
||||
TrackFilter = rawImageFilter,
|
||||
TrackFile = rawImageFilter.GetFilename(),
|
||||
TrackFileOffset = 0,
|
||||
TrackFileType = "BINARY",
|
||||
TrackBytesPerSector = (int)imageInfo.SectorSize,
|
||||
TrackEndSector = imageInfo.Sectors - 1,
|
||||
TrackFilter = rawImageFilter,
|
||||
TrackFile = rawImageFilter.GetFilename(),
|
||||
TrackFileOffset = 0,
|
||||
TrackFileType = "BINARY",
|
||||
TrackRawBytesPerSector = (int)imageInfo.SectorSize,
|
||||
TrackSequence = 1,
|
||||
TrackStartSector = 0,
|
||||
TrackSubchannelType = TrackSubchannelType.None,
|
||||
TrackType = TrackType.Data,
|
||||
TrackSession = 1
|
||||
TrackSequence = 1,
|
||||
TrackStartSector = 0,
|
||||
TrackSubchannelType = TrackSubchannelType.None,
|
||||
TrackType = TrackType.Data,
|
||||
TrackSession = 1
|
||||
};
|
||||
List<Track> lst = new List<Track> {trk};
|
||||
return lst;
|
||||
@@ -881,6 +883,41 @@ namespace DiscImageChef.DiscImages
|
||||
return ReadSectors(sectorAddress, length);
|
||||
}
|
||||
|
||||
public byte[] ReadSectorTag(ulong sectorAddress, SectorTagType tag)
|
||||
{
|
||||
throw new FeatureUnsupportedImageException("Feature not supported by image format");
|
||||
}
|
||||
|
||||
public byte[] ReadSectorsTag(ulong sectorAddress, uint length, SectorTagType tag)
|
||||
{
|
||||
throw new FeatureUnsupportedImageException("Feature not supported by image format");
|
||||
}
|
||||
|
||||
public byte[] ReadSectorLong(ulong sectorAddress)
|
||||
{
|
||||
throw new FeatureUnsupportedImageException("Feature not supported by image format");
|
||||
}
|
||||
|
||||
public byte[] ReadSectorsLong(ulong sectorAddress, uint length)
|
||||
{
|
||||
throw new FeatureUnsupportedImageException("Feature not supported by image format");
|
||||
}
|
||||
|
||||
public byte[] ReadDiskTag(MediaTagType tag)
|
||||
{
|
||||
throw new FeatureUnsupportedImageException("Feature not supported by image format");
|
||||
}
|
||||
|
||||
public byte[] ReadSectorTag(ulong sectorAddress, uint track, SectorTagType tag)
|
||||
{
|
||||
throw new FeatureUnsupportedImageException("Feature not supported by image format");
|
||||
}
|
||||
|
||||
public byte[] ReadSectorsTag(ulong sectorAddress, uint length, uint track, SectorTagType tag)
|
||||
{
|
||||
throw new FeatureUnsupportedImageException("Feature not supported by image format");
|
||||
}
|
||||
|
||||
MediaType CalculateDiskType()
|
||||
{
|
||||
if(imageInfo.SectorSize == 2048)
|
||||
@@ -897,9 +934,9 @@ namespace DiscImageChef.DiscImages
|
||||
|
||||
switch(imageInfo.ImageSize)
|
||||
{
|
||||
case 80384: return MediaType.ECMA_66;
|
||||
case 81664: return MediaType.IBM23FD;
|
||||
case 92160: return MediaType.ATARI_525_SD;
|
||||
case 80384: return MediaType.ECMA_66;
|
||||
case 81664: return MediaType.IBM23FD;
|
||||
case 92160: return MediaType.ATARI_525_SD;
|
||||
case 102400: return MediaType.ACORN_525_SS_SD_40;
|
||||
case 116480: return MediaType.Apple32SS;
|
||||
case 133120: return MediaType.ATARI_525_ED;
|
||||
@@ -938,7 +975,7 @@ namespace DiscImageChef.DiscImages
|
||||
case 737280: return MediaType.DOS_35_DS_DD_9;
|
||||
case 819200:
|
||||
if(imageInfo.SectorSize == 256) return MediaType.CBM_35_DD;
|
||||
if((extension == ".adf" || extension == ".adl") && imageInfo.SectorSize == 1024)
|
||||
if((extension == ".adf" || extension == ".adl") && imageInfo.SectorSize == 1024)
|
||||
return MediaType.ACORN_35_DS_DD;
|
||||
if(extension == ".st") return MediaType.ATARI_35_DS_DD;
|
||||
|
||||
@@ -948,37 +985,37 @@ namespace DiscImageChef.DiscImages
|
||||
if(extension == ".st") return MediaType.ATARI_35_DS_DD_11;
|
||||
|
||||
return MediaType.CBM_AMIGA_35_DD;
|
||||
case 988416: return MediaType.IBM43FD_256;
|
||||
case 995072: return MediaType.IBM53FD_256;
|
||||
case 1021696: return MediaType.ECMA_99_26;
|
||||
case 1146624: return MediaType.IBM53FD_512;
|
||||
case 1177344: return MediaType.ECMA_99_15;
|
||||
case 1222400: return MediaType.IBM53FD_1024;
|
||||
case 1228800: return MediaType.DOS_525_HD;
|
||||
case 1255168: return MediaType.ECMA_69_8;
|
||||
case 1261568: return MediaType.NEC_525_HD;
|
||||
case 1304320: return MediaType.ECMA_99_8;
|
||||
case 1427456: return MediaType.FDFORMAT_525_HD;
|
||||
case 1474560: return MediaType.DOS_35_HD;
|
||||
case 1638400: return MediaType.ACORN_35_DS_HD;
|
||||
case 1720320: return MediaType.DMF;
|
||||
case 1763328: return MediaType.FDFORMAT_35_HD;
|
||||
case 1802240: return MediaType.CBM_AMIGA_35_HD;
|
||||
case 1880064: return MediaType.XDF_35;
|
||||
case 1884160: return MediaType.XDF_35;
|
||||
case 2949120: return MediaType.DOS_35_ED;
|
||||
case 9338880: return MediaType.NEC_35_TD;
|
||||
case 33554432: return MediaType.FD32MB;
|
||||
case 40387584: return MediaType.PocketZip;
|
||||
case 126222336: return MediaType.LS120;
|
||||
case 127923200: return MediaType.ECMA_154;
|
||||
case 201410560: return MediaType.HiFD;
|
||||
case 229632000: return MediaType.ECMA_201;
|
||||
case 240386048: return MediaType.LS240;
|
||||
case 481520640: return MediaType.ECMA_183_512;
|
||||
case 533403648: return MediaType.ECMA_183;
|
||||
case 596787200: return MediaType.ECMA_184_512;
|
||||
case 654540800: return MediaType.ECMA_184;
|
||||
case 988416: return MediaType.IBM43FD_256;
|
||||
case 995072: return MediaType.IBM53FD_256;
|
||||
case 1021696: return MediaType.ECMA_99_26;
|
||||
case 1146624: return MediaType.IBM53FD_512;
|
||||
case 1177344: return MediaType.ECMA_99_15;
|
||||
case 1222400: return MediaType.IBM53FD_1024;
|
||||
case 1228800: return MediaType.DOS_525_HD;
|
||||
case 1255168: return MediaType.ECMA_69_8;
|
||||
case 1261568: return MediaType.NEC_525_HD;
|
||||
case 1304320: return MediaType.ECMA_99_8;
|
||||
case 1427456: return MediaType.FDFORMAT_525_HD;
|
||||
case 1474560: return MediaType.DOS_35_HD;
|
||||
case 1638400: return MediaType.ACORN_35_DS_HD;
|
||||
case 1720320: return MediaType.DMF;
|
||||
case 1763328: return MediaType.FDFORMAT_35_HD;
|
||||
case 1802240: return MediaType.CBM_AMIGA_35_HD;
|
||||
case 1880064: return MediaType.XDF_35;
|
||||
case 1884160: return MediaType.XDF_35;
|
||||
case 2949120: return MediaType.DOS_35_ED;
|
||||
case 9338880: return MediaType.NEC_35_TD;
|
||||
case 33554432: return MediaType.FD32MB;
|
||||
case 40387584: return MediaType.PocketZip;
|
||||
case 126222336: return MediaType.LS120;
|
||||
case 127923200: return MediaType.ECMA_154;
|
||||
case 201410560: return MediaType.HiFD;
|
||||
case 229632000: return MediaType.ECMA_201;
|
||||
case 240386048: return MediaType.LS240;
|
||||
case 481520640: return MediaType.ECMA_183_512;
|
||||
case 533403648: return MediaType.ECMA_183;
|
||||
case 596787200: return MediaType.ECMA_184_512;
|
||||
case 654540800: return MediaType.ECMA_184;
|
||||
case 1070617600: return MediaType.Jaz;
|
||||
|
||||
#region Commodore
|
||||
@@ -993,40 +1030,5 @@ namespace DiscImageChef.DiscImages
|
||||
default: return MediaType.GENERIC_HDD;
|
||||
}
|
||||
}
|
||||
|
||||
public byte[] ReadSectorTag(ulong sectorAddress, SectorTagType tag)
|
||||
{
|
||||
throw new FeatureUnsupportedImageException("Feature not supported by image format");
|
||||
}
|
||||
|
||||
public byte[] ReadSectorsTag(ulong sectorAddress, uint length, SectorTagType tag)
|
||||
{
|
||||
throw new FeatureUnsupportedImageException("Feature not supported by image format");
|
||||
}
|
||||
|
||||
public byte[] ReadSectorLong(ulong sectorAddress)
|
||||
{
|
||||
throw new FeatureUnsupportedImageException("Feature not supported by image format");
|
||||
}
|
||||
|
||||
public byte[] ReadSectorsLong(ulong sectorAddress, uint length)
|
||||
{
|
||||
throw new FeatureUnsupportedImageException("Feature not supported by image format");
|
||||
}
|
||||
|
||||
public byte[] ReadDiskTag(MediaTagType tag)
|
||||
{
|
||||
throw new FeatureUnsupportedImageException("Feature not supported by image format");
|
||||
}
|
||||
|
||||
public byte[] ReadSectorTag(ulong sectorAddress, uint track, SectorTagType tag)
|
||||
{
|
||||
throw new FeatureUnsupportedImageException("Feature not supported by image format");
|
||||
}
|
||||
|
||||
public byte[] ReadSectorsTag(ulong sectorAddress, uint length, uint track, SectorTagType tag)
|
||||
{
|
||||
throw new FeatureUnsupportedImageException("Feature not supported by image format");
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user