Code cleanup.

This commit is contained in:
2018-06-22 08:08:38 +01:00
parent 3ec5977783
commit 2c409e1217
102 changed files with 3659 additions and 3377 deletions

View File

@@ -127,7 +127,8 @@ namespace DiscImageChef.Decoders.ATA
/// Words 10 to 19
/// Device serial number, right justified, padded with spaces
/// </summary>
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)] public string SerialNumber;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
public string SerialNumber;
/// <summary>
/// Word 20
/// Manufacturer defined
@@ -153,12 +154,14 @@ namespace DiscImageChef.Decoders.ATA
/// Words 23 to 26
/// Firmware revision, left justified, padded with spaces
/// </summary>
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 8)] public string FirmwareRevision;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 8)]
public string FirmwareRevision;
/// <summary>
/// Words 27 to 46
/// Model number, left justified, padded with spaces
/// </summary>
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 40)] public string Model;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 40)]
public string Model;
/// <summary>
/// Word 47 bits 7 to 0
/// Maximum number of sectors that can be transferred per
@@ -565,7 +568,8 @@ namespace DiscImageChef.Decoders.ATA
/// Words 121 to 125
/// Reserved
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)] public ushort[] ReservedWords121;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)]
public ushort[] ReservedWords121;
/// <summary>
/// Word 126
@@ -591,7 +595,8 @@ namespace DiscImageChef.Decoders.ATA
/// <summary>
/// Words 129 to 159
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 31)] public ushort[] ReservedWords129;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 31)]
public ushort[] ReservedWords129;
/// <summary>
/// Word 160
@@ -607,7 +612,8 @@ namespace DiscImageChef.Decoders.ATA
/// Words 161 to 167
/// Reserved for CFA
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 7)] public ushort[] ReservedCFA;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 7)]
public ushort[] ReservedCFA;
/// <summary>
/// Word 168
@@ -624,7 +630,8 @@ namespace DiscImageChef.Decoders.ATA
/// Words 170 to 173
/// Additional product identifier
/// </summary>
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 8)] public string AdditionalPID;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 8)]
public string AdditionalPID;
/// <summary>
/// Word 174
@@ -641,12 +648,14 @@ namespace DiscImageChef.Decoders.ATA
/// Words 176 to 195
/// Current media serial number
/// </summary>
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 40)] public string MediaSerial;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 40)]
public string MediaSerial;
/// <summary>
/// Words 196 to 205
/// Current media manufacturer
/// </summary>
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)] public string MediaManufacturer;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
public string MediaManufacturer;
/// <summary>
/// Word 206
@@ -759,7 +768,8 @@ namespace DiscImageChef.Decoders.ATA
/// Words 224 to 229
/// Reserved for CE-ATA
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)] public ushort[] ReservedCEATA224;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
public ushort[] ReservedCEATA224;
/// <summary>
/// Words 230 to 233
@@ -781,7 +791,8 @@ namespace DiscImageChef.Decoders.ATA
/// <summary>
/// Words 236 to 254
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 19)] public ushort[] ReservedWords;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 19)]
public ushort[] ReservedWords;
/// <summary>
/// Word 255 bits 7 to 0
@@ -1889,8 +1900,10 @@ namespace DiscImageChef.Decoders.ATA
IdentifyDevice ATAID = IdentifyDeviceResponse.Value;
if(ATAID.GeneralConfiguration.HasFlag(GeneralConfigurationBit.NonMagnetic))
if((ushort)ATAID.GeneralConfiguration != 0x848A) atapi = true;
else cfa = true;
if((ushort)ATAID.GeneralConfiguration != 0x848A)
atapi = true;
else
cfa = true;
if(atapi) sb.AppendLine("ATAPI device");
else if(cfa) sb.AppendLine("CompactFlash device");
@@ -1972,66 +1985,77 @@ namespace DiscImageChef.Decoders.ATA
maxatalevel = 1;
if(minatalevel > 1) minatalevel = 1;
}
if(ata2)
{
sb.Append("ATA-2 ");
maxatalevel = 2;
if(minatalevel > 2) minatalevel = 2;
}
if(ata3)
{
sb.Append("ATA-3 ");
maxatalevel = 3;
if(minatalevel > 3) minatalevel = 3;
}
if(ata4)
{
sb.Append("ATA/ATAPI-4 ");
maxatalevel = 4;
if(minatalevel > 4) minatalevel = 4;
}
if(ata5)
{
sb.Append("ATA/ATAPI-5 ");
maxatalevel = 5;
if(minatalevel > 5) minatalevel = 5;
}
if(ata6)
{
sb.Append("ATA/ATAPI-6 ");
maxatalevel = 6;
if(minatalevel > 6) minatalevel = 6;
}
if(ata7)
{
sb.Append("ATA/ATAPI-7 ");
maxatalevel = 7;
if(minatalevel > 7) minatalevel = 7;
}
if(acs)
{
sb.Append("ATA8-ACS ");
maxatalevel = 8;
if(minatalevel > 8) minatalevel = 8;
}
if(acs2)
{
sb.Append("ATA8-ACS2 ");
maxatalevel = 9;
if(minatalevel > 9) minatalevel = 9;
}
if(acs3)
{
sb.Append("ATA8-ACS3 ");
maxatalevel = 10;
if(minatalevel > 10) minatalevel = 10;
}
if(acs4)
{
sb.Append("ATA8-ACS4 ");
maxatalevel = 11;
if(minatalevel > 11) minatalevel = 11;
}
sb.AppendLine();
sb.Append("Maximum ATA revision supported: ");
@@ -2365,8 +2389,10 @@ namespace DiscImageChef.Decoders.ATA
}
if(ATAID.NominalRotationRate != 0x0000 && ATAID.NominalRotationRate != 0xFFFF)
if(ATAID.NominalRotationRate == 0x0001) sb.AppendLine("Device does not rotate.");
else sb.AppendFormat("Device rotate at {0} rpm", ATAID.NominalRotationRate).AppendLine();
if(ATAID.NominalRotationRate == 0x0001)
sb.AppendLine("Device does not rotate.");
else
sb.AppendFormat("Device rotate at {0} rpm", ATAID.NominalRotationRate).AppendLine();
uint logicalsectorsize = 0;
if(!atapi)
@@ -2376,8 +2402,10 @@ namespace DiscImageChef.Decoders.ATA
if((ATAID.PhysLogSectorSize & 0x8000) == 0x0000 && (ATAID.PhysLogSectorSize & 0x4000) == 0x4000)
{
if((ATAID.PhysLogSectorSize & 0x1000) == 0x1000)
if(ATAID.LogicalSectorWords <= 255 || ATAID.LogicalAlignment == 0xFFFF) logicalsectorsize = 512;
else logicalsectorsize = ATAID.LogicalSectorWords * 2;
if(ATAID.LogicalSectorWords <= 255 || ATAID.LogicalAlignment == 0xFFFF)
logicalsectorsize = 512;
else
logicalsectorsize = ATAID.LogicalSectorWords * 2;
else logicalsectorsize = 512;
if((ATAID.PhysLogSectorSize & 0x2000) == 0x2000)
@@ -2443,9 +2471,11 @@ namespace DiscImageChef.Decoders.ATA
if(ATAID.Capabilities.HasFlag(CapabilitiesBit.LBASupport))
if((ulong)ATAID.LBASectors * logicalsectorsize / 1024 / 1024 > 1000000)
sb.AppendFormat("Device size in 28-bit LBA mode: {0} bytes, {1} Tb, {2} TiB",
(ulong)ATAID.LBASectors * logicalsectorsize,
(ulong)ATAID.LBASectors *
logicalsectorsize,
(ulong)ATAID.LBASectors * logicalsectorsize / 1000 / 1000 / 1000 / 1000,
(ulong)ATAID.LBASectors * 512 / 1024 / 1024 / 1024 / 1024).AppendLine();
(ulong)ATAID.LBASectors * 512 / 1024 / 1024 / 1024 / 1024)
.AppendLine();
else if((ulong)ATAID.LBASectors * logicalsectorsize / 1024 / 1024 > 1000)
sb.AppendFormat("Device size in 28-bit LBA mode: {0} bytes, {1} Gb, {2} GiB",
(ulong)ATAID.LBASectors * logicalsectorsize,
@@ -2461,13 +2491,15 @@ namespace DiscImageChef.Decoders.ATA
if(ATAID.CommandSet5.HasFlag(CommandSetBit5.ExtSectors))
if(ATAID.ExtendedUserSectors * logicalsectorsize / 1024 / 1024 > 1000000)
sb.AppendFormat("Device size in 48-bit LBA mode: {0} bytes, {1} Tb, {2} TiB",
ATAID.ExtendedUserSectors * logicalsectorsize,
ATAID.ExtendedUserSectors *
logicalsectorsize,
ATAID.ExtendedUserSectors * logicalsectorsize / 1000 / 1000 / 1000 / 1000,
ATAID.ExtendedUserSectors * logicalsectorsize / 1024 / 1024 / 1024 / 1024)
.AppendLine();
else if(ATAID.ExtendedUserSectors * logicalsectorsize / 1024 / 1024 > 1000)
sb.AppendFormat("Device size in 48-bit LBA mode: {0} bytes, {1} Gb, {2} GiB",
ATAID.ExtendedUserSectors * logicalsectorsize,
ATAID.ExtendedUserSectors *
logicalsectorsize,
ATAID.ExtendedUserSectors * logicalsectorsize / 1000 / 1000 / 1000,
ATAID.ExtendedUserSectors * logicalsectorsize / 1024 / 1024 / 1024)
.AppendLine();
@@ -2480,7 +2512,8 @@ namespace DiscImageChef.Decoders.ATA
{
if(ATAID.LBA48Sectors * logicalsectorsize / 1024 / 1024 > 1000000)
sb.AppendFormat("Device size in 48-bit LBA mode: {0} bytes, {1} Tb, {2} TiB",
ATAID.LBA48Sectors * logicalsectorsize,
ATAID.LBA48Sectors *
logicalsectorsize,
ATAID.LBA48Sectors * logicalsectorsize / 1000 / 1000 / 1000 / 1000,
ATAID.LBA48Sectors * logicalsectorsize / 1024 / 1024 / 1024 / 1024)
.AppendLine();
@@ -2505,6 +2538,7 @@ namespace DiscImageChef.Decoders.ATA
sb.AppendFormat("{0} bytes per unformatted sector", ATAID.UnformattedBPS).AppendLine();
}
}
if((ushort)ATAID.SpecificConfiguration != 0x0000 && (ushort)ATAID.SpecificConfiguration != 0xFFFF)
switch(ATAID.SpecificConfiguration)
{
@@ -2562,6 +2596,7 @@ namespace DiscImageChef.Decoders.ATA
sb.AppendLine().Append("IORDY is supported");
if(ATAID.Capabilities.HasFlag(CapabilitiesBit.CanDisableIORDY)) sb.Append(" and can be disabled");
}
if(ATAID.Capabilities.HasFlag(CapabilitiesBit.DMASupport)) sb.AppendLine().Append("DMA is supported");
if(ATAID.Capabilities2.HasFlag(CapabilitiesBit2.MustBeSet) &&
@@ -2623,36 +2658,43 @@ namespace DiscImageChef.Decoders.ATA
sb.Append("DMA0 ");
if(ATAID.DMAActive.HasFlag(TransferMode.Mode0)) sb.Append("(active) ");
}
if(ATAID.DMASupported.HasFlag(TransferMode.Mode1))
{
sb.Append("DMA1 ");
if(ATAID.DMAActive.HasFlag(TransferMode.Mode1)) sb.Append("(active) ");
}
if(ATAID.DMASupported.HasFlag(TransferMode.Mode2))
{
sb.Append("DMA2 ");
if(ATAID.DMAActive.HasFlag(TransferMode.Mode2)) sb.Append("(active) ");
}
if(ATAID.DMASupported.HasFlag(TransferMode.Mode3))
{
sb.Append("DMA3 ");
if(ATAID.DMAActive.HasFlag(TransferMode.Mode3)) sb.Append("(active) ");
}
if(ATAID.DMASupported.HasFlag(TransferMode.Mode4))
{
sb.Append("DMA4 ");
if(ATAID.DMAActive.HasFlag(TransferMode.Mode4)) sb.Append("(active) ");
}
if(ATAID.DMASupported.HasFlag(TransferMode.Mode5))
{
sb.Append("DMA5 ");
if(ATAID.DMAActive.HasFlag(TransferMode.Mode5)) sb.Append("(active) ");
}
if(ATAID.DMASupported.HasFlag(TransferMode.Mode6))
{
sb.Append("DMA6 ");
if(ATAID.DMAActive.HasFlag(TransferMode.Mode6)) sb.Append("(active) ");
}
if(ATAID.DMASupported.HasFlag(TransferMode.Mode7))
{
sb.Append("DMA7 ");
@@ -2666,36 +2708,43 @@ namespace DiscImageChef.Decoders.ATA
sb.Append("MDMA0 ");
if(ATAID.MDMAActive.HasFlag(TransferMode.Mode0)) sb.Append("(active) ");
}
if(ATAID.MDMASupported.HasFlag(TransferMode.Mode1))
{
sb.Append("MDMA1 ");
if(ATAID.MDMAActive.HasFlag(TransferMode.Mode1)) sb.Append("(active) ");
}
if(ATAID.MDMASupported.HasFlag(TransferMode.Mode2))
{
sb.Append("MDMA2 ");
if(ATAID.MDMAActive.HasFlag(TransferMode.Mode2)) sb.Append("(active) ");
}
if(ATAID.MDMASupported.HasFlag(TransferMode.Mode3))
{
sb.Append("MDMA3 ");
if(ATAID.MDMAActive.HasFlag(TransferMode.Mode3)) sb.Append("(active) ");
}
if(ATAID.MDMASupported.HasFlag(TransferMode.Mode4))
{
sb.Append("MDMA4 ");
if(ATAID.MDMAActive.HasFlag(TransferMode.Mode4)) sb.Append("(active) ");
}
if(ATAID.MDMASupported.HasFlag(TransferMode.Mode5))
{
sb.Append("MDMA5 ");
if(ATAID.MDMAActive.HasFlag(TransferMode.Mode5)) sb.Append("(active) ");
}
if(ATAID.MDMASupported.HasFlag(TransferMode.Mode6))
{
sb.Append("MDMA6 ");
if(ATAID.MDMAActive.HasFlag(TransferMode.Mode6)) sb.Append("(active) ");
}
if(ATAID.MDMASupported.HasFlag(TransferMode.Mode7))
{
sb.Append("MDMA7 ");
@@ -2708,36 +2757,43 @@ namespace DiscImageChef.Decoders.ATA
sb.Append("UDMA0 ");
if(ATAID.UDMAActive.HasFlag(TransferMode.Mode0)) sb.Append("(active) ");
}
if(ATAID.UDMASupported.HasFlag(TransferMode.Mode1))
{
sb.Append("UDMA1 ");
if(ATAID.UDMAActive.HasFlag(TransferMode.Mode1)) sb.Append("(active) ");
}
if(ATAID.UDMASupported.HasFlag(TransferMode.Mode2))
{
sb.Append("UDMA2 ");
if(ATAID.UDMAActive.HasFlag(TransferMode.Mode2)) sb.Append("(active) ");
}
if(ATAID.UDMASupported.HasFlag(TransferMode.Mode3))
{
sb.Append("UDMA3 ");
if(ATAID.UDMAActive.HasFlag(TransferMode.Mode3)) sb.Append("(active) ");
}
if(ATAID.UDMASupported.HasFlag(TransferMode.Mode4))
{
sb.Append("UDMA4 ");
if(ATAID.UDMAActive.HasFlag(TransferMode.Mode4)) sb.Append("(active) ");
}
if(ATAID.UDMASupported.HasFlag(TransferMode.Mode5))
{
sb.Append("UDMA5 ");
if(ATAID.UDMAActive.HasFlag(TransferMode.Mode5)) sb.Append("(active) ");
}
if(ATAID.UDMASupported.HasFlag(TransferMode.Mode6))
{
sb.Append("UDMA6 ");
if(ATAID.UDMAActive.HasFlag(TransferMode.Mode6)) sb.Append("(active) ");
}
if(ATAID.UDMASupported.HasFlag(TransferMode.Mode7))
{
sb.Append("UDMA7 ");
@@ -2876,66 +2932,79 @@ namespace DiscImageChef.Decoders.ATA
sb.AppendLine().Append("NOP is supported");
if(ATAID.EnabledCommandSet.HasFlag(CommandSetBit.Nop)) sb.Append(" and enabled");
}
if(ATAID.CommandSet.HasFlag(CommandSetBit.ReadBuffer))
{
sb.AppendLine().Append("READ BUFFER is supported");
if(ATAID.EnabledCommandSet.HasFlag(CommandSetBit.ReadBuffer)) sb.Append(" and enabled");
}
if(ATAID.CommandSet.HasFlag(CommandSetBit.WriteBuffer))
{
sb.AppendLine().Append("WRITE BUFFER is supported");
if(ATAID.EnabledCommandSet.HasFlag(CommandSetBit.WriteBuffer)) sb.Append(" and enabled");
}
if(ATAID.CommandSet.HasFlag(CommandSetBit.HPA))
{
sb.AppendLine().Append("Host Protected Area is supported");
if(ATAID.EnabledCommandSet.HasFlag(CommandSetBit.HPA)) sb.Append(" and enabled");
}
if(ATAID.CommandSet.HasFlag(CommandSetBit.DeviceReset))
{
sb.AppendLine().Append("DEVICE RESET is supported");
if(ATAID.EnabledCommandSet.HasFlag(CommandSetBit.DeviceReset)) sb.Append(" and enabled");
}
if(ATAID.CommandSet.HasFlag(CommandSetBit.Service))
{
sb.AppendLine().Append("SERVICE interrupt is supported");
if(ATAID.EnabledCommandSet.HasFlag(CommandSetBit.Service)) sb.Append(" and enabled");
}
if(ATAID.CommandSet.HasFlag(CommandSetBit.Release))
{
sb.AppendLine().Append("Release is supported");
if(ATAID.EnabledCommandSet.HasFlag(CommandSetBit.Release)) sb.Append(" and enabled");
}
if(ATAID.CommandSet.HasFlag(CommandSetBit.LookAhead))
{
sb.AppendLine().Append("Look-ahead read is supported");
if(ATAID.EnabledCommandSet.HasFlag(CommandSetBit.LookAhead)) sb.Append(" and enabled");
}
if(ATAID.CommandSet.HasFlag(CommandSetBit.WriteCache))
{
sb.AppendLine().Append("Write cache is supported");
if(ATAID.EnabledCommandSet.HasFlag(CommandSetBit.WriteCache)) sb.Append(" and enabled");
}
if(ATAID.CommandSet.HasFlag(CommandSetBit.Packet))
{
sb.AppendLine().Append("PACKET is supported");
if(ATAID.EnabledCommandSet.HasFlag(CommandSetBit.Packet)) sb.Append(" and enabled");
}
if(ATAID.CommandSet.HasFlag(CommandSetBit.PowerManagement))
{
sb.AppendLine().Append("Power management is supported");
if(ATAID.EnabledCommandSet.HasFlag(CommandSetBit.PowerManagement)) sb.Append(" and enabled");
}
if(ATAID.CommandSet.HasFlag(CommandSetBit.RemovableMedia))
{
sb.AppendLine().Append("Removable media feature set is supported");
if(ATAID.EnabledCommandSet.HasFlag(CommandSetBit.RemovableMedia)) sb.Append(" and enabled");
}
if(ATAID.CommandSet.HasFlag(CommandSetBit.SecurityMode))
{
sb.AppendLine().Append("Security mode is supported");
if(ATAID.EnabledCommandSet.HasFlag(CommandSetBit.SecurityMode)) sb.Append(" and enabled");
}
if(ATAID.Capabilities.HasFlag(CapabilitiesBit.LBASupport))
sb.AppendLine().Append("28-bit LBA is supported");
@@ -2947,21 +3016,25 @@ namespace DiscImageChef.Decoders.ATA
sb.AppendLine().Append("48-bit LBA is supported");
if(ATAID.EnabledCommandSet2.HasFlag(CommandSetBit2.LBA48)) sb.Append(" and enabled");
}
if(ATAID.CommandSet2.HasFlag(CommandSetBit2.FlushCache))
{
sb.AppendLine().Append("FLUSH CACHE is supported");
if(ATAID.EnabledCommandSet2.HasFlag(CommandSetBit2.FlushCache)) sb.Append(" and enabled");
}
if(ATAID.CommandSet2.HasFlag(CommandSetBit2.FlushCacheExt))
{
sb.AppendLine().Append("FLUSH CACHE EXT is supported");
if(ATAID.EnabledCommandSet2.HasFlag(CommandSetBit2.FlushCacheExt)) sb.Append(" and enabled");
}
if(ATAID.CommandSet2.HasFlag(CommandSetBit2.DCO))
{
sb.AppendLine().Append("Device Configuration Overlay feature set is supported");
if(ATAID.EnabledCommandSet2.HasFlag(CommandSetBit2.DCO)) sb.Append(" and enabled");
}
if(ATAID.CommandSet2.HasFlag(CommandSetBit2.AAM))
{
sb.AppendLine().Append("Automatic Acoustic Management is supported");
@@ -2969,17 +3042,20 @@ namespace DiscImageChef.Decoders.ATA
sb.AppendFormat(" and enabled with value {0} (vendor recommends {1}", ATAID.CurrentAAM,
ATAID.RecommendedAAM);
}
if(ATAID.CommandSet2.HasFlag(CommandSetBit2.SetMax))
{
sb.AppendLine().Append("SET MAX security extension is supported");
if(ATAID.EnabledCommandSet2.HasFlag(CommandSetBit2.SetMax)) sb.Append(" and enabled");
}
if(ATAID.CommandSet2.HasFlag(CommandSetBit2.AddressOffsetReservedAreaBoot))
{
sb.AppendLine().Append("Address Offset Reserved Area Boot is supported");
if(ATAID.EnabledCommandSet2.HasFlag(CommandSetBit2.AddressOffsetReservedAreaBoot))
sb.Append(" and enabled");
}
if(ATAID.CommandSet2.HasFlag(CommandSetBit2.SetFeaturesRequired))
sb.AppendLine().Append("SET FEATURES is required before spin-up");
if(ATAID.CommandSet2.HasFlag(CommandSetBit2.PowerUpInStandby))
@@ -2987,28 +3063,33 @@ namespace DiscImageChef.Decoders.ATA
sb.AppendLine().Append("Power-up in standby is supported");
if(ATAID.EnabledCommandSet2.HasFlag(CommandSetBit2.PowerUpInStandby)) sb.Append(" and enabled");
}
if(ATAID.CommandSet2.HasFlag(CommandSetBit2.RemovableNotification))
{
sb.AppendLine().Append("Removable Media Status Notification is supported");
if(ATAID.EnabledCommandSet2.HasFlag(CommandSetBit2.RemovableNotification))
sb.Append(" and enabled");
}
if(ATAID.CommandSet2.HasFlag(CommandSetBit2.APM))
{
sb.AppendLine().Append("Advanced Power Management is supported");
if(ATAID.EnabledCommandSet2.HasFlag(CommandSetBit2.APM))
sb.AppendFormat(" and enabled with value {0}", ATAID.CurrentAPM);
}
if(ATAID.CommandSet2.HasFlag(CommandSetBit2.CompactFlash))
{
sb.AppendLine().Append("CompactFlash feature set is supported");
if(ATAID.EnabledCommandSet2.HasFlag(CommandSetBit2.CompactFlash)) sb.Append(" and enabled");
}
if(ATAID.CommandSet2.HasFlag(CommandSetBit2.RWQueuedDMA))
{
sb.AppendLine().Append("READ DMA QUEUED and WRITE DMA QUEUED are supported");
if(ATAID.EnabledCommandSet2.HasFlag(CommandSetBit2.RWQueuedDMA)) sb.Append(" and enabled");
}
if(ATAID.CommandSet2.HasFlag(CommandSetBit2.DownloadMicrocode))
{
sb.AppendLine().Append("DOWNLOAD MICROCODE is supported");
@@ -3033,16 +3114,19 @@ namespace DiscImageChef.Decoders.ATA
sb.AppendLine().Append("S.M.A.R.T. self-testing is supported");
if(ATAID.EnabledCommandSet3.HasFlag(CommandSetBit3.SMARTSelfTest)) sb.Append(" and enabled");
}
if(ATAID.CommandSet3.HasFlag(CommandSetBit3.SMARTLog))
{
sb.AppendLine().Append("S.M.A.R.T. error logging is supported");
if(ATAID.EnabledCommandSet3.HasFlag(CommandSetBit3.SMARTLog)) sb.Append(" and enabled");
}
if(ATAID.CommandSet3.HasFlag(CommandSetBit3.IdleImmediate))
{
sb.AppendLine().Append("IDLE IMMEDIATE with UNLOAD FEATURE is supported");
if(ATAID.EnabledCommandSet3.HasFlag(CommandSetBit3.IdleImmediate)) sb.Append(" and enabled");
}
if(ATAID.CommandSet3.HasFlag(CommandSetBit3.WriteURG))
sb.AppendLine().Append("URG bit is supported in WRITE STREAM DMA EXT and WRITE STREAM EXT");
if(ATAID.CommandSet3.HasFlag(CommandSetBit3.ReadURG))
@@ -3054,26 +3138,31 @@ namespace DiscImageChef.Decoders.ATA
sb.AppendLine().Append("WRITE DMA QUEUED FUA EXT is supported");
if(ATAID.EnabledCommandSet3.HasFlag(CommandSetBit3.FUAWriteQ)) sb.Append(" and enabled");
}
if(ATAID.CommandSet3.HasFlag(CommandSetBit3.FUAWrite))
{
sb.AppendLine().Append("WRITE DMA FUA EXT and WRITE MULTIPLE FUA EXT are supported");
if(ATAID.EnabledCommandSet3.HasFlag(CommandSetBit3.FUAWrite)) sb.Append(" and enabled");
}
if(ATAID.CommandSet3.HasFlag(CommandSetBit3.GPL))
{
sb.AppendLine().Append("General Purpose Logging is supported");
if(ATAID.EnabledCommandSet3.HasFlag(CommandSetBit3.GPL)) sb.Append(" and enabled");
}
if(ATAID.CommandSet3.HasFlag(CommandSetBit3.Streaming))
{
sb.AppendLine().Append("Streaming feature set is supported");
if(ATAID.EnabledCommandSet3.HasFlag(CommandSetBit3.Streaming)) sb.Append(" and enabled");
}
if(ATAID.CommandSet3.HasFlag(CommandSetBit3.MCPT))
{
sb.AppendLine().Append("Media Card Pass Through command set is supported");
if(ATAID.EnabledCommandSet3.HasFlag(CommandSetBit3.MCPT)) sb.Append(" and enabled");
}
if(ATAID.CommandSet3.HasFlag(CommandSetBit3.MediaSerial))
{
sb.AppendLine().Append("Media Serial is supported");
@@ -3089,42 +3178,50 @@ namespace DiscImageChef.Decoders.ATA
sb.AppendLine().Append("DSN feature set is supported");
if(ATAID.EnabledCommandSet4.HasFlag(CommandSetBit4.DSN)) sb.Append(" and enabled");
}
if(ATAID.CommandSet4.HasFlag(CommandSetBit4.AMAC))
{
sb.AppendLine().Append("Accessible Max Address Configuration is supported");
if(ATAID.EnabledCommandSet4.HasFlag(CommandSetBit4.AMAC)) sb.Append(" and enabled");
}
if(ATAID.CommandSet4.HasFlag(CommandSetBit4.ExtPowerCond))
{
sb.AppendLine().Append("Extended Power Conditions are supported");
if(ATAID.EnabledCommandSet4.HasFlag(CommandSetBit4.ExtPowerCond)) sb.Append(" and enabled");
}
if(ATAID.CommandSet4.HasFlag(CommandSetBit4.ExtStatusReport))
{
sb.AppendLine().Append("Extended Status Reporting is supported");
if(ATAID.EnabledCommandSet4.HasFlag(CommandSetBit4.ExtStatusReport)) sb.Append(" and enabled");
}
if(ATAID.CommandSet4.HasFlag(CommandSetBit4.FreeFallControl))
{
sb.AppendLine().Append("Free-fall control feature set is supported");
if(ATAID.EnabledCommandSet4.HasFlag(CommandSetBit4.FreeFallControl)) sb.Append(" and enabled");
}
if(ATAID.CommandSet4.HasFlag(CommandSetBit4.SegmentedDownloadMicrocode))
{
sb.AppendLine().Append("Segmented feature in DOWNLOAD MICROCODE is supported");
if(ATAID.EnabledCommandSet4.HasFlag(CommandSetBit4.SegmentedDownloadMicrocode))
sb.Append(" and enabled");
}
if(ATAID.CommandSet4.HasFlag(CommandSetBit4.RWDMAExtGpl))
{
sb.AppendLine().Append("READ/WRITE DMA EXT GPL are supported");
if(ATAID.EnabledCommandSet4.HasFlag(CommandSetBit4.RWDMAExtGpl)) sb.Append(" and enabled");
}
if(ATAID.CommandSet4.HasFlag(CommandSetBit4.WriteUnc))
{
sb.AppendLine().Append("WRITE UNCORRECTABLE is supported");
if(ATAID.EnabledCommandSet4.HasFlag(CommandSetBit4.WriteUnc)) sb.Append(" and enabled");
}
if(ATAID.CommandSet4.HasFlag(CommandSetBit4.WRV))
{
sb.AppendLine().Append("Write/Read/Verify is supported");
@@ -3134,12 +3231,14 @@ namespace DiscImageChef.Decoders.ATA
if(ATAID.EnabledCommandSet4.HasFlag(CommandSetBit4.WRV))
sb.AppendLine().AppendFormat("Current Write/Read/Verify mode: {0}", ATAID.WRVMode);
}
if(ATAID.CommandSet4.HasFlag(CommandSetBit4.DT1825))
{
sb.AppendLine().Append("DT1825 is supported");
if(ATAID.EnabledCommandSet4.HasFlag(CommandSetBit4.DT1825)) sb.Append(" and enabled");
}
}
if(ATAID.Capabilities3.HasFlag(CapabilitiesBit3.BlockErase))
sb.AppendLine().Append("BLOCK ERASE EXT is supported");
if(ATAID.Capabilities3.HasFlag(CapabilitiesBit3.Overwrite))
@@ -3171,6 +3270,7 @@ namespace DiscImageChef.Decoders.ATA
if(ATAID.CommandSet5.HasFlag(CommandSetBit5.ReadZeroTrim))
sb.AppendLine().Append("Read after TRIM returns empty data");
}
if(ATAID.CommandSet5.HasFlag(CommandSetBit5.LongPhysSectorAligError))
sb.AppendLine().Append("Device supports Long Physical Sector Alignment Error Reporting Control");
if(ATAID.CommandSet5.HasFlag(CommandSetBit5.Encrypted))
@@ -3216,21 +3316,25 @@ namespace DiscImageChef.Decoders.ATA
if(ATAID.EnabledSATAFeatures.HasFlag(SATAFeaturesBit.NonZeroBufferOffset))
sb.Append(" and enabled");
}
if(ATAID.SATAFeatures.HasFlag(SATAFeaturesBit.DMASetup))
{
sb.AppendLine().Append("DMA Setup auto-activation is supported");
if(ATAID.EnabledSATAFeatures.HasFlag(SATAFeaturesBit.DMASetup)) sb.Append(" and enabled");
}
if(ATAID.SATAFeatures.HasFlag(SATAFeaturesBit.InitPowerMgmt))
{
sb.AppendLine().Append("Device-initiated power management is supported");
if(ATAID.EnabledSATAFeatures.HasFlag(SATAFeaturesBit.InitPowerMgmt)) sb.Append(" and enabled");
}
if(ATAID.SATAFeatures.HasFlag(SATAFeaturesBit.InOrderData))
{
sb.AppendLine().Append("In-order data delivery is supported");
if(ATAID.EnabledSATAFeatures.HasFlag(SATAFeaturesBit.InOrderData)) sb.Append(" and enabled");
}
if(!atapi)
if(ATAID.SATAFeatures.HasFlag(SATAFeaturesBit.HardwareFeatureControl))
{
@@ -3238,6 +3342,7 @@ namespace DiscImageChef.Decoders.ATA
if(ATAID.EnabledSATAFeatures.HasFlag(SATAFeaturesBit.HardwareFeatureControl))
sb.Append(" and enabled");
}
if(atapi)
if(ATAID.SATAFeatures.HasFlag(SATAFeaturesBit.AsyncNotification))
{
@@ -3245,18 +3350,21 @@ namespace DiscImageChef.Decoders.ATA
if(ATAID.EnabledSATAFeatures.HasFlag(SATAFeaturesBit.AsyncNotification))
sb.Append(" and enabled");
}
if(ATAID.SATAFeatures.HasFlag(SATAFeaturesBit.SettingsPreserve))
{
sb.AppendLine().Append("Software Settings Preservation is supported");
if(ATAID.EnabledSATAFeatures.HasFlag(SATAFeaturesBit.SettingsPreserve))
sb.Append(" and enabled");
}
if(ATAID.SATAFeatures.HasFlag(SATAFeaturesBit.NCQAutoSense))
sb.AppendLine().Append("NCQ Autosense is supported");
if(ATAID.EnabledSATAFeatures.HasFlag(SATAFeaturesBit.EnabledSlumber))
sb.AppendLine().Append("Automatic Partial to Slumber transitions are enabled");
}
}
if((ATAID.RemovableStatusSet & 0x03) > 0)
sb.AppendLine().Append("Removable Media Status Notification feature set is supported");
@@ -3343,6 +3451,7 @@ namespace DiscImageChef.Decoders.ATA
sb.AppendLine().AppendFormat("Version {0}", (ATAID.NVCacheCaps & 0x0F00) >> 8).AppendLine();
}
sb.AppendLine().AppendFormat("Non-Volatile Cache is {0} bytes", ATAID.NVCacheSize * logicalsectorsize)
.AppendLine();
}

View File

@@ -124,6 +124,7 @@ namespace DiscImageChef.Decoders.Bluray
if(response.CWP) sb.AppendLine("Media has write protection bit marked, shouldn't");
#endif
}
return sb.ToString();
}

View File

@@ -356,6 +356,7 @@ namespace DiscImageChef.Decoders.CD
sb.AppendFormat("Unknown CD-RW disc subtype: {0}", response.DiscSubType).AppendLine();
break;
}
switch(response.ReferenceSpeed)
{
case 1:

View File

@@ -204,10 +204,8 @@ namespace DiscImageChef.Decoders.CD
sb.AppendFormat("First complete session number: {0}", response.FirstCompleteSession).AppendLine();
sb.AppendFormat("Last complete session number: {0}", response.LastCompleteSession).AppendLine();
foreach(TrackDataDescriptor descriptor in response.TrackDescriptors)
if((descriptor.CONTROL & 0x08) ==
0x08 ||
descriptor.ADR != 1 && descriptor.ADR != 5 && descriptor.ADR != 4 &&
descriptor.ADR != 6 ||
if((descriptor.CONTROL & 0x08) == 0x08 ||
descriptor.ADR != 1 && descriptor.ADR != 5 && descriptor.ADR != 4 && descriptor.ADR != 6 ||
descriptor.TNO != 0)
{
sb.AppendLine("Unknown TOC entry format, printing values as-is");

View File

@@ -216,8 +216,10 @@ namespace DiscImageChef.Decoders.DVD
dds.InProcess |= (response[7] & 0x80) == 0x80;
dds.UserCertification |= (response[7] & 0x02) == 0x02;
dds.ManufacturerCertification |= (response[7] & 0x01) == 0x01;
dds.UpdateCount = (uint)((response[8] << 24) + (response[9] << 16) + (response[10] << 8) + response[11]);
dds.Groups = (ushort)((response[12] << 8) + response[13]);
dds.UpdateCount =
(uint)((response[8] << 24) + (response[9] << 16) + (response[10] << 8) + response[11]);
dds.Groups =
(ushort)((response[12] << 8) + response[13]);
// ECMA-272
if(dds.Groups == 24)
@@ -290,6 +292,7 @@ namespace DiscImageChef.Decoders.DVD
if(decoded.GroupCertificationFlags[i].PartialCertification)
sb.AppendFormat("Group {0} is being certified partially", i).AppendLine();
}
if(decoded.GroupCertificationFlags[i].UserCertification)
sb.AppendFormat("Group {0} has been certified by an user", i).AppendLine();
}

View File

@@ -1095,7 +1095,8 @@ namespace DiscImageChef.Decoders.DVD
(uint)((response[8] << 24) + (response[9] << 16) + (response[10] << 8) + response[11]);
pfi.DataAreaEndPSN =
(uint)((response[12] << 24) + (response[13] << 16) + (response[14] << 8) + response[15]);
pfi.Layer0EndPSN = (uint)((response[16] << 24) + (response[17] << 16) + (response[18] << 8) + response[19]);
pfi.Layer0EndPSN =
(uint)((response[16] << 24) + (response[17] << 16) + (response[18] << 8) + response[19]);
pfi.BCA |= (response[20] & 0x80) == 0x80;
switch(pfi.DiskCategory)
@@ -1198,6 +1199,7 @@ namespace DiscImageChef.Decoders.DVD
pfi.PowerRatioLandThreshold6T = response[626];
pfi.PowerRatioGrooveThreshold6T = response[627];
}
break;
// DVD-R and DVD-RW
case DiskCategory.DVDR when pfi.PartVersion < 6:
@@ -1602,7 +1604,8 @@ namespace DiscImageChef.Decoders.DVD
if(decoded.Layers == 1 && !decoded.TrackPath)
sb.AppendFormat("Layer 0 ends at PSN {0:X}h", decoded.Layer0EndPSN).AppendLine();
}
else sb.AppendLine("Disc is empty");
else
sb.AppendLine("Disc is empty");
else sb.AppendLine("Disc is empty");
if(decoded.BCA) sb.AppendLine("Disc has a burst cutting area");
@@ -1632,6 +1635,7 @@ namespace DiscImageChef.Decoders.DVD
sb.AppendFormat("Disc manufacturer supplementary information is {0}",
decoded.DiskManufacturerSupplementary).AppendLine();
}
break;
case DiskCategory.DVDR when decoded.PartVersion < 6:
case DiskCategory.DVDRW when decoded.PartVersion < 3:

View File

@@ -48,11 +48,13 @@ namespace DiscImageChef.Decoders.Floppy
/// <summary>
/// Set to 0x00
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] public byte[] zero;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
public byte[] zero;
/// <summary>
/// Set to 0xA1
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] public byte[] sync;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
public byte[] sync;
/// <summary>
/// Set to 0xFF
/// </summary>
@@ -72,7 +74,8 @@ namespace DiscImageChef.Decoders.Floppy
/// <summary>
/// OS dependent tag
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] public byte[] label;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public byte[] label;
/// <summary>
/// Checksum from <see cref="amiga" /> to <see cref="label" />
/// </summary>
@@ -81,7 +84,8 @@ namespace DiscImageChef.Decoders.Floppy
/// Checksum from <see cref="data" />
/// </summary>
public uint dataChecksum;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 512)] public byte[] data;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 512)]
public byte[] data;
}
}
}

View File

@@ -93,33 +93,39 @@ namespace DiscImageChef.Decoders.Floppy
/// checksum[0] = (decodedChecksum >> 1) | 0xAA
/// checksum[1] = decodedChecksum | 0xAA
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] public byte[] checksum;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
public byte[] checksum;
/// <summary>
/// Always 0xDE, 0xAA, 0xEB
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public byte[] epilogue;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
public byte[] epilogue;
/// <summary>
/// Always 0xD5, 0xAA, 0x96
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public byte[] prologue;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
public byte[] prologue;
/// <summary>
/// Sector number encoded as:
/// sector[0] = (decodedSector >> 1) | 0xAA
/// sector[1] = decodedSector | 0xAA
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] public byte[] sector;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
public byte[] sector;
/// <summary>
/// Track number encoded as:
/// track[0] = (decodedTrack >> 1) | 0xAA
/// track[1] = decodedTrack | 0xAA
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] public byte[] track;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
public byte[] track;
/// <summary>
/// Volume number encoded as:
/// volume[0] = (decodedVolume >> 1) | 0xAA
/// volume[1] = decodedVolume | 0xAA
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] public byte[] volume;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
public byte[] volume;
}
/// <summary>
@@ -137,11 +143,13 @@ namespace DiscImageChef.Decoders.Floppy
/// <summary>
/// Always 0xDE, 0xAA, 0xEB
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public byte[] epilogue;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
public byte[] epilogue;
/// <summary>
/// Always 0xD5, 0xAA, 0xAD
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public byte[] prologue;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
public byte[] prologue;
}
static readonly byte[] ReadTable5and3 =
@@ -296,8 +304,10 @@ namespace DiscImageChef.Decoders.Floppy
public static byte[] DecodeSector(RawSector sector)
{
if(sector.addressField.prologue[0] != 0xD5 || sector.addressField.prologue[1] != 0xAA) return null;
// Pre DOS 3.3
if(sector.addressField.prologue[2] == 0xB5) return Decode5and3(sector.dataField.data);
// DOS 3.3
return sector.addressField.prologue[2] == 0x96 ? Decode6and2(sector.dataField.data) : null;
// Unknown
@@ -340,7 +350,8 @@ namespace DiscImageChef.Decoders.Floppy
track = new[] {data[position + 5], data[position + 6]},
sector = new[] {data[position + 7], data[position + 8]},
checksum = new[] {data[position + 9], data[position + 10]},
epilogue = new[] {data[position + 11], data[position + 12], data[position + 13]}
epilogue = new[]
{data[position + 11], data[position + 12], data[position + 13]}
}
};

View File

@@ -98,7 +98,8 @@ namespace DiscImageChef.Decoders.Floppy
/// <summary>
/// Always 0xDE, 0xAA
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] public byte[] epilogue;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
public byte[] epilogue;
/// <summary>
/// Disk format
/// </summary>
@@ -106,7 +107,8 @@ namespace DiscImageChef.Decoders.Floppy
/// <summary>
/// Always 0xD5, 0xAA, 0x96
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public byte[] prologue;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
public byte[] prologue;
/// <summary>
/// Encoded sector number
/// </summary>
@@ -129,19 +131,23 @@ namespace DiscImageChef.Decoders.Floppy
/// <summary>
/// Checksum
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] public byte[] checksum;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
public byte[] checksum;
/// <summary>
/// Encoded data bytes.
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 698)] public byte[] data;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 698)]
public byte[] data;
/// <summary>
/// Always 0xDE, 0xAA
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] public byte[] epilogue;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
public byte[] epilogue;
/// <summary>
/// Always 0xD5, 0xAA, 0xAD
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public byte[] prologue;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
public byte[] prologue;
/// <summary>
/// Spare, usually <see cref="RawAddressField.sector" />
/// </summary>
@@ -190,6 +196,7 @@ namespace DiscImageChef.Decoders.Floppy
ck3++;
ck1 &= 0xFF;
}
ms.WriteByte(carry);
carry = (byte)((bf2[j] ^ ck3) & 0xFF);
@@ -199,6 +206,7 @@ namespace DiscImageChef.Decoders.Floppy
ck2++;
ck3 &= 0xFF;
}
ms.WriteByte(carry);
if(ms.Length == 524) break;
@@ -210,6 +218,7 @@ namespace DiscImageChef.Decoders.Floppy
ck1++;
ck2 &= 0xFF;
}
ms.WriteByte(carry);
j++;
}

View File

@@ -86,7 +86,8 @@ namespace DiscImageChef.Decoders.Floppy
/// <summary>
/// User data
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)] public byte data;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)]
public byte data;
/// <summary>
/// XOR of <see cref="data" />
/// </summary>

View File

@@ -61,7 +61,8 @@ namespace DiscImageChef.Decoders.Floppy
/// <summary>
/// Start of track, 32 bytes set to 0x4E
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)] public byte[] innerGap;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
public byte[] innerGap;
/// <summary>
/// Track sectors
/// </summary>
@@ -84,7 +85,8 @@ namespace DiscImageChef.Decoders.Floppy
/// <summary>
/// 22 bytes set to 0x4E, set to 0x22 on Commodore 1581
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 22)] public byte[] innerGap;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 22)]
public byte[] innerGap;
/// <summary>
/// Sector data block
/// </summary>
@@ -103,11 +105,13 @@ namespace DiscImageChef.Decoders.Floppy
/// <summary>
/// 12 bytes set to 0
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)] public byte[] zero;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)]
public byte[] zero;
/// <summary>
/// 3 bytes set to 0xA1
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public byte[] aone;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
public byte[] aone;
/// <summary>
/// Set to <see cref="IBMIdType.AddressMark" />
/// </summary>
@@ -142,11 +146,13 @@ namespace DiscImageChef.Decoders.Floppy
/// <summary>
/// 12 bytes set to 0
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)] public byte[] zero;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)]
public byte[] zero;
/// <summary>
/// 3 bytes set to 0xA1
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public byte[] aone;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
public byte[] aone;
/// <summary>
/// Set to <see cref="IBMIdType.DataMark" /> or to <see cref="IBMIdType.DeletedDataMark" />
/// </summary>

View File

@@ -84,7 +84,8 @@ namespace DiscImageChef.Decoders.Floppy
/// <summary>
/// 41 bytes set to 0x4E
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 41)] public byte[] innerGap;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 41)]
public byte[] innerGap;
/// <summary>
/// Sector data block
/// </summary>
@@ -104,15 +105,18 @@ namespace DiscImageChef.Decoders.Floppy
/// <summary>
/// Gap from index pulse, 80 bytes set to 0x4E
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 80)] public byte[] gap;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 80)]
public byte[] gap;
/// <summary>
/// 12 bytes set to 0x00
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)] public byte[] zero;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)]
public byte[] zero;
/// <summary>
/// 3 bytes set to 0xC2
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public byte[] ctwo;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
public byte[] ctwo;
/// <summary>
/// Set to <see cref="IBMIdType.IndexMark" />
/// </summary>
@@ -120,7 +124,8 @@ namespace DiscImageChef.Decoders.Floppy
/// <summary>
/// Gap until first sector, 50 bytes to 0x4E
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 50)] public byte[] gap1;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 50)]
public byte[] gap1;
}
/// <summary>
@@ -131,11 +136,13 @@ namespace DiscImageChef.Decoders.Floppy
/// <summary>
/// 12 bytes set to 0
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)] public byte[] zero;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)]
public byte[] zero;
/// <summary>
/// 3 bytes set to 0xA1
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public byte[] aone;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
public byte[] aone;
/// <summary>
/// Set to <see cref="IBMIdType.AddressMark" />
/// </summary>
@@ -170,11 +177,13 @@ namespace DiscImageChef.Decoders.Floppy
/// <summary>
/// 12 bytes set to 0
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)] public byte[] zero;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)]
public byte[] zero;
/// <summary>
/// 3 bytes set to 0xA1
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public byte[] aone;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
public byte[] aone;
/// <summary>
/// Set to <see cref="IBMIdType.DataMark" /> or to <see cref="IBMIdType.DeletedDataMark" />
/// </summary>

View File

@@ -82,15 +82,18 @@ namespace DiscImageChef.Decoders.Floppy
/// <summary>
/// Gap from index pulse, 80 bytes set to 0x4E
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 80)] public byte[] gap;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 80)]
public byte[] gap;
/// <summary>
/// 12 bytes set to 0x00
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)] public byte[] zero;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)]
public byte[] zero;
/// <summary>
/// 3 bytes set to 0xC2
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public byte[] ctwo;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
public byte[] ctwo;
/// <summary>
/// Set to <see cref="IBMIdType.IndexMark" />
/// </summary>
@@ -98,7 +101,8 @@ namespace DiscImageChef.Decoders.Floppy
/// <summary>
/// Gap until first sector, 50 bytes to 0x4E
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 50)] public byte[] gap1;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 50)]
public byte[] gap1;
}
/// <summary>
@@ -113,7 +117,8 @@ namespace DiscImageChef.Decoders.Floppy
/// <summary>
/// 22 bytes set to 0x4E, set to 0x22 on Commodore 1581
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 22)] public byte[] innerGap;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 22)]
public byte[] innerGap;
/// <summary>
/// Sector data block
/// </summary>
@@ -132,11 +137,13 @@ namespace DiscImageChef.Decoders.Floppy
/// <summary>
/// 12 bytes set to 0
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)] public byte[] zero;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)]
public byte[] zero;
/// <summary>
/// 3 bytes set to 0xA1
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public byte[] aone;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
public byte[] aone;
/// <summary>
/// Set to <see cref="IBMIdType.AddressMark" />
/// </summary>
@@ -171,11 +178,13 @@ namespace DiscImageChef.Decoders.Floppy
/// <summary>
/// 12 bytes set to 0
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)] public byte[] zero;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)]
public byte[] zero;
/// <summary>
/// 3 bytes set to 0xA1
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public byte[] aone;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
public byte[] aone;
/// <summary>
/// Set to <see cref="IBMIdType.DataMark" /> or to <see cref="IBMIdType.DeletedDataMark" />
/// </summary>

View File

@@ -80,11 +80,13 @@ namespace DiscImageChef.Decoders.Floppy
/// <summary>
/// Gap from index pulse, 80 bytes set to 0xFF
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 40)] public byte[] gap;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 40)]
public byte[] gap;
/// <summary>
/// 6 bytes set to 0x00
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)] public byte[] zero;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
public byte[] zero;
/// <summary>
/// Set to <see cref="IBMIdType.IndexMark" />
/// </summary>
@@ -92,7 +94,8 @@ namespace DiscImageChef.Decoders.Floppy
/// <summary>
/// Gap until first sector, 26 bytes to 0xFF
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 26)] public byte[] gap1;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 26)]
public byte[] gap1;
}
/// <summary>
@@ -107,7 +110,8 @@ namespace DiscImageChef.Decoders.Floppy
/// <summary>
/// 11 bytes set to 0xFF
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 11)] public byte[] innerGap;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 11)]
public byte[] innerGap;
/// <summary>
/// Sector data block
/// </summary>
@@ -126,7 +130,8 @@ namespace DiscImageChef.Decoders.Floppy
/// <summary>
/// 6 bytes set to 0
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)] public byte[] zero;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
public byte[] zero;
/// <summary>
/// Set to <see cref="IBMIdType.AddressMark" />
/// </summary>
@@ -161,7 +166,8 @@ namespace DiscImageChef.Decoders.Floppy
/// <summary>
/// 12 bytes set to 0
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)] public byte[] zero;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)]
public byte[] zero;
/// <summary>
/// Set to <see cref="IBMIdType.DataMark" /> or to <see cref="IBMIdType.DeletedDataMark" />
/// </summary>

View File

@@ -117,7 +117,8 @@ namespace DiscImageChef.Decoders.MMC
WriteMisalignment = (response[6] & 0x40) == 0x40,
ReadMisalignment = (response[6] & 0x20) == 0x20,
DSRImplemented = (response[6] & 0x10) == 0x10,
Size = (ushort)(((response[6] & 0x03) << 10) + (response[7] << 2) + ((response[8] & 0xC0) >> 6)),
Size =
(ushort)(((response[6] & 0x03) << 10) + (response[7] << 2) + ((response[8] & 0xC0) >> 6)),
ReadCurrentAtVddMin = (byte)((response[8] & 0x38) >> 3),
ReadCurrentAtVddMax = (byte)(response[8] & 0x07),
WriteCurrentAtVddMin = (byte)((response[9] & 0xE0) >> 5),
@@ -338,7 +339,9 @@ namespace DiscImageChef.Decoders.MMC
sb.AppendFormat("\tDevice's clock frequency: {0}{1}", result, unit).AppendLine();
unit = "";
for(int cl = 0, mask = 1; cl <= 11; cl++, mask <<= 1) if((csd.Classes & mask) == mask) unit += $" {cl}";
for(int cl = 0, mask = 1; cl <= 11; cl++, mask <<= 1)
if((csd.Classes & mask) == mask)
unit += $" {cl}";
sb.AppendFormat("\tDevice support command classes {0}", unit).AppendLine();
if(csd.ReadBlockLength == 15) sb.AppendLine("\tRead block length size is defined in extended CSD");

View File

@@ -44,7 +44,8 @@ namespace DiscImageChef.Decoders.MMC
[StructLayout(LayoutKind.Sequential)]
public class ExtendedCSD
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)] public byte[] Reserved0;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
public byte[] Reserved0;
public byte ExtendedSecurityCommandsError;
public byte SupportedCommandSets;
public byte HPIFeatures;
@@ -62,11 +63,13 @@ namespace DiscImageChef.Decoders.MMC
public byte OperationCodesTimeout;
public uint FFUArgument;
public byte BarrierSupport;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 177)] public byte[] Reserved1;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 177)]
public byte[] Reserved1;
public byte CMDQueuingSupport;
public byte CMDQueuingDepth;
public uint NumberofFWSectorsCorrectlyProgrammed;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)] public byte[] VendorHealthReport;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
public byte[] VendorHealthReport;
public byte DeviceLifeEstimationTypeB;
public byte DeviceLifeEstimationTypeA;
public byte PreEOLInformation;
@@ -160,11 +163,14 @@ namespace DiscImageChef.Decoders.MMC
public byte HWResetFunction;
public byte HPIManagement;
public byte PartitioningSupport;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public byte[] MaxEnhancedAreaSize;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
public byte[] MaxEnhancedAreaSize;
public byte PartitionsAttribute;
public byte PartitioningSetting;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)] public byte[] GeneralPurposePartitionSize;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public byte[] EnhancedUserDataAreaSize;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)]
public byte[] GeneralPurposePartitionSize;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
public byte[] EnhancedUserDataAreaSize;
public uint EnhancedUserDataStartAddress;
public byte Reserved15;
public byte BadBlockManagementMode;
@@ -173,7 +179,8 @@ namespace DiscImageChef.Decoders.MMC
public byte PeriodicWakeUp;
public byte SupportsProgramCxDInDDR;
public ushort Reserved16;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)] public byte[] VendorSpecific;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
public byte[] VendorSpecific;
public byte NativeSectorSize;
public byte SectorSizeEmulation;
public byte SectorSize;
@@ -183,7 +190,8 @@ namespace DiscImageChef.Decoders.MMC
public ushort ExceptionEventsControl;
public ushort ExceptionEventsStatus;
public ushort ExtendedPartitionsAttribute;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 15)] public byte[] ContextConfiguration;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 15)]
public byte[] ContextConfiguration;
public byte PackedCommandStatus;
public byte PackedCommandFailureIndex;
public byte PowerOffNotification;
@@ -199,7 +207,8 @@ namespace DiscImageChef.Decoders.MMC
public byte ProductStateAwarenessEnablement;
public byte SecureRemovalType;
public byte CommandQueueModeEnable;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 15)] public byte[] Reserved18;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 15)]
public byte[] Reserved18;
}
[SuppressMessage("ReSharper", "InconsistentNaming")]

View File

@@ -1418,6 +1418,7 @@ namespace DiscImageChef.Decoders.SCSI
sb.AppendFormat("\tDevice responded to ATA command {0:X2}h", page.CommandCode).AppendLine();
break;
}
switch(page.Signature[0])
{
case 0x00:
@@ -2332,7 +2333,8 @@ namespace DiscImageChef.Decoders.SCSI
array = new List<byte>();
}
else array.Add(pageResponse[pos]);
else
array.Add(pageResponse[pos]);
return decoded;
}

View File

@@ -82,17 +82,20 @@ namespace DiscImageChef.Decoders.SCSI
decoded.PeripheralQualifier = (byte)((SCSIInquiryResponse[0] & 0xE0) >> 5);
decoded.PeripheralDeviceType = (byte)(SCSIInquiryResponse[0] & 0x1F);
}
if(SCSIInquiryResponse.Length >= 2)
{
decoded.RMB = Convert.ToBoolean(SCSIInquiryResponse[1] & 0x80);
decoded.DeviceTypeModifier = (byte)(SCSIInquiryResponse[1] & 0x7F);
}
if(SCSIInquiryResponse.Length >= 3)
{
decoded.ISOVersion = (byte)((SCSIInquiryResponse[2] & 0xC0) >> 6);
decoded.ECMAVersion = (byte)((SCSIInquiryResponse[2] & 0x38) >> 3);
decoded.ANSIVersion = (byte)(SCSIInquiryResponse[2] & 0x07);
}
if(SCSIInquiryResponse.Length >= 4)
{
decoded.AERC = Convert.ToBoolean(SCSIInquiryResponse[3] & 0x80);
@@ -101,6 +104,7 @@ namespace DiscImageChef.Decoders.SCSI
decoded.HiSup = Convert.ToBoolean(SCSIInquiryResponse[3] & 0x10);
decoded.ResponseDataFormat = (byte)(SCSIInquiryResponse[3] & 0x07);
}
if(SCSIInquiryResponse.Length >= 5) decoded.AdditionalLength = SCSIInquiryResponse[4];
if(SCSIInquiryResponse.Length >= 6)
{
@@ -111,6 +115,7 @@ namespace DiscImageChef.Decoders.SCSI
decoded.Reserved2 = (byte)((SCSIInquiryResponse[5] & 0x06) >> 1);
decoded.Protect = Convert.ToBoolean(SCSIInquiryResponse[5] & 0x01);
}
if(SCSIInquiryResponse.Length >= 7)
{
decoded.BQue = Convert.ToBoolean(SCSIInquiryResponse[6] & 0x80);
@@ -122,6 +127,7 @@ namespace DiscImageChef.Decoders.SCSI
decoded.Addr32 = Convert.ToBoolean(SCSIInquiryResponse[6] & 0x02);
decoded.Addr16 = Convert.ToBoolean(SCSIInquiryResponse[6] & 0x01);
}
if(SCSIInquiryResponse.Length >= 8)
{
decoded.RelAddr = Convert.ToBoolean(SCSIInquiryResponse[7] & 0x80);
@@ -133,21 +139,25 @@ namespace DiscImageChef.Decoders.SCSI
decoded.CmdQue = Convert.ToBoolean(SCSIInquiryResponse[7] & 0x02);
decoded.SftRe = Convert.ToBoolean(SCSIInquiryResponse[7] & 0x01);
}
if(SCSIInquiryResponse.Length >= 16)
{
decoded.VendorIdentification = new byte[8];
Array.Copy(SCSIInquiryResponse, 8, decoded.VendorIdentification, 0, 8);
}
if(SCSIInquiryResponse.Length >= 32)
{
decoded.ProductIdentification = new byte[16];
Array.Copy(SCSIInquiryResponse, 16, decoded.ProductIdentification, 0, 16);
}
if(SCSIInquiryResponse.Length >= 36)
{
decoded.ProductRevisionLevel = new byte[4];
Array.Copy(SCSIInquiryResponse, 32, decoded.ProductRevisionLevel, 0, 4);
}
if(SCSIInquiryResponse.Length >= 44)
{
// Seagate 1
@@ -155,6 +165,7 @@ namespace DiscImageChef.Decoders.SCSI
decoded.Seagate_DriveSerialNumber = new byte[8];
Array.Copy(SCSIInquiryResponse, 36, decoded.Seagate_DriveSerialNumber, 0, 8);
}
if(SCSIInquiryResponse.Length >= 46)
{
// Kreon
@@ -168,6 +179,7 @@ namespace DiscImageChef.Decoders.SCSI
decoded.KreonIdentifier.SequenceEqual(new byte[] {0x4B, 0x52, 0x45, 0x4F, 0x4E}))
decoded.KreonPresent = true;
}
if(SCSIInquiryResponse.Length >= 49)
{
// HP
@@ -177,6 +189,7 @@ namespace DiscImageChef.Decoders.SCSI
decoded.HP_OBDR = new byte[6];
Array.Copy(SCSIInquiryResponse, 43, decoded.HP_OBDR, 0, 6);
}
if(SCSIInquiryResponse.Length >= 56)
{
decoded.VendorSpecific = new byte[20];
@@ -218,6 +231,7 @@ namespace DiscImageChef.Decoders.SCSI
decoded.QAS = Convert.ToBoolean(SCSIInquiryResponse[56] & 0x02);
decoded.IUS = Convert.ToBoolean(SCSIInquiryResponse[56] & 0x01);
}
if(SCSIInquiryResponse.Length >= 58) decoded.Reserved4 = SCSIInquiryResponse[57];
if(SCSIInquiryResponse.Length >= 60)
{
@@ -236,16 +250,19 @@ namespace DiscImageChef.Decoders.SCSI
decoded.Reserved5 = new byte[SCSIInquiryResponse.Length - 74];
Array.Copy(SCSIInquiryResponse, 74, decoded.Reserved5, 0, SCSIInquiryResponse.Length - 74);
}
if(SCSIInquiryResponse.Length >= 96)
{
decoded.Reserved5 = new byte[22];
Array.Copy(SCSIInquiryResponse, 74, decoded.Reserved5, 0, 22);
}
if(SCSIInquiryResponse.Length > 96)
{
decoded.VendorSpecific2 = new byte[SCSIInquiryResponse.Length - 96];
Array.Copy(SCSIInquiryResponse, 96, decoded.VendorSpecific2, 0, SCSIInquiryResponse.Length - 96);
}
if(SCSIInquiryResponse.Length >= 144)
{
// Seagate 2
@@ -253,7 +270,9 @@ namespace DiscImageChef.Decoders.SCSI
decoded.Seagate_Copyright = new byte[48];
Array.Copy(SCSIInquiryResponse, 96, decoded.Seagate_Copyright, 0, 48);
}
if(SCSIInquiryResponse.Length < 148) return decoded;
// Seagate 2
decoded.Seagate3Present = true;
decoded.Seagate_ServoPROMPartNo = new byte[4];

View File

@@ -415,7 +415,8 @@ namespace DiscImageChef.Decoders.SCSI.MMC
sb.AppendFormat("Last track in last session is track {0}", decoded.LastTrackLastSession).AppendLine();
sb.AppendFormat("Last session Lead-In address is {0} (as LBA) or {1:X2}:{2:X2}:{3:X2}",
decoded.LastSessionLeadInStartLBA, (decoded.LastSessionLeadInStartLBA & 0xFF0000) >> 16,
(decoded.LastSessionLeadInStartLBA & 0xFF00) >> 8, decoded.LastSessionLeadInStartLBA & 0xFF)
(decoded.LastSessionLeadInStartLBA & 0xFF00) >> 8,
decoded.LastSessionLeadInStartLBA & 0xFF)
.AppendLine();
sb.AppendFormat("Last possible Lead-Out address is {0} (as LBA) or {1:X2}:{2:X2}:{3:X2}",
decoded.LastPossibleLeadOutStartLBA, (decoded.LastPossibleLeadOutStartLBA & 0xFF0000) >> 16,

View File

@@ -2506,8 +2506,10 @@ namespace DiscImageChef.Decoders.SCSI.MMC
decoded.Persistent |= (feature[2] & 0x02) == 0x02;
decoded.Version = (byte)((feature[2] & 0x3C) >> 2);
decoded.LogicalBlockSize = (uint)((feature[4] << 24) + (feature[5] << 16) + (feature[6] << 8) + feature[7]);
decoded.Blocking = (ushort)((feature[8] << 8) + feature[9]);
decoded.LogicalBlockSize =
(uint)((feature[4] << 24) + (feature[5] << 16) + (feature[6] << 8) + feature[7]);
decoded.Blocking =
(ushort)((feature[8] << 8) + feature[9]);
decoded.PP |= (feature[10] & 0x01) == 0x01;
return decoded;
@@ -2750,8 +2752,10 @@ namespace DiscImageChef.Decoders.SCSI.MMC
decoded.Persistent |= (feature[2] & 0x02) == 0x02;
decoded.Version = (byte)((feature[2] & 0x3C) >> 2);
decoded.LogicalBlockSize = (uint)((feature[4] << 24) + (feature[5] << 16) + (feature[6] << 8) + feature[7]);
decoded.Blocking = (ushort)((feature[8] << 8) + feature[9]);
decoded.LogicalBlockSize =
(uint)((feature[4] << 24) + (feature[5] << 16) + (feature[6] << 8) + feature[7]);
decoded.Blocking =
(ushort)((feature[8] << 8) + feature[9]);
decoded.PP |= (feature[10] & 0x01) == 0x01;
return decoded;
@@ -4983,6 +4987,7 @@ namespace DiscImageChef.Decoders.SCSI.MMC
sb.AppendFormat("\t{0} media blocks are required for the binding nonce", ftr.BindNonceBlocks)
.AppendLine();
}
if(ftr.AGIDs > 0) sb.AppendFormat("\tDrive supports {0} AGIDs concurrently", ftr.AGIDs).AppendLine();
return sb.ToString();

View File

@@ -123,7 +123,8 @@ namespace DiscImageChef.Decoders.SCSI
string UnrecCIRCAbort = "\tUnrecovered CIRC errors will return CHECK CONDITION.";
string UnrecECCNotAbort = "\tUnrecovered ECC errors will not abort the transfer.";
string UnrecCIRCNotAbort = "\tUnrecovered CIRC errors will not abort the transfer.";
string UnrecECCAbortData = "\tUnrecovered ECC errors will return CHECK CONDITION and the uncorrected data.";
string UnrecECCAbortData =
"\tUnrecovered ECC errors will return CHECK CONDITION and the uncorrected data.";
string UnrecCIRCAbortData =
"\tUnrecovered CIRC errors will return CHECK CONDITION and the uncorrected data.";

View File

@@ -106,8 +106,10 @@ namespace DiscImageChef.Decoders.SCSI
decoded.Cylinders = (uint)((pageResponse[2] << 16) + (pageResponse[3] << 8) + pageResponse[4]);
decoded.Heads = pageResponse[5];
decoded.WritePrecompCylinder = (uint)((pageResponse[6] << 16) + (pageResponse[7] << 8) + pageResponse[8]);
decoded.WriteReduceCylinder = (uint)((pageResponse[9] << 16) + (pageResponse[10] << 8) + pageResponse[11]);
decoded.DriveStepRate = (ushort)((pageResponse[12] << 8) + pageResponse[13]);
decoded.WriteReduceCylinder =
(uint)((pageResponse[9] << 16) + (pageResponse[10] << 8) + pageResponse[11]);
decoded.DriveStepRate =
(ushort)((pageResponse[12] << 8) + pageResponse[13]);
decoded.LandingCylinder = (pageResponse[14] << 16) + (pageResponse[15] << 8) + pageResponse[16];
decoded.RPL = (byte)(pageResponse[17] & 0x03);
decoded.RotationalOffset = pageResponse[18];

View File

@@ -109,7 +109,8 @@ namespace DiscImageChef.Decoders.SCSI
string UnrecCIRCAbort = "\tUnrecovered CIRC errors will return CHECK CONDITION.";
string UnrecECCNotAbort = "\tUnrecovered ECC errors will not abort the transfer.";
string UnrecCIRCNotAbort = "\tUnrecovered CIRC errors will not abort the transfer.";
string UnrecECCAbortData = "\tUnrecovered ECC errors will return CHECK CONDITION and the uncorrected data.";
string UnrecECCAbortData =
"\tUnrecovered ECC errors will return CHECK CONDITION and the uncorrected data.";
string UnrecCIRCAbortData =
"\tUnrecovered CIRC errors will return CHECK CONDITION and the uncorrected data.";

View File

@@ -245,6 +245,7 @@ namespace DiscImageChef.Decoders.SCSI
? "\tRecovered buffer data comes in LIFO order"
: "\tRecovered buffer data comes in FIFO order");
}
if(page.BIS) sb.AppendLine("\tMedium supports block IDs");
if(page.RSmk) sb.AppendLine("\tDrive reports setmarks");
switch(page.SOCF)

View File

@@ -251,7 +251,8 @@ namespace DiscImageChef.Decoders.SCSI
if(page.PartitionSizes[i] == 0)
if(page.PartitionSizes.Length == 1)
sb.AppendLine("\tDevice recognizes one single partition spanning whole medium");
else sb.AppendFormat("\tPartition {0} runs for rest of medium", i).AppendLine();
else
sb.AppendFormat("\tPartition {0} runs for rest of medium", i).AppendLine();
else
sb.AppendFormat("\tPartition {0} is {1} {2} long", i, page.PartitionSizes[i], measure).AppendLine();

View File

@@ -186,8 +186,10 @@ namespace DiscImageChef.Decoders.SCSI
if(page.LogErr) sb.AppendLine("\tDrive shall log informational exception conditions");
if(page.IntervalTimer > 0)
if(page.IntervalTimer == 0xFFFFFFFF) sb.AppendLine("\tTimer interval is vendor-specific");
else sb.AppendFormat("\tTimer interval is {0} ms", page.IntervalTimer * 100).AppendLine();
if(page.IntervalTimer == 0xFFFFFFFF)
sb.AppendLine("\tTimer interval is vendor-specific");
else
sb.AppendFormat("\tTimer interval is {0} ms", page.IntervalTimer * 100).AppendLine();
if(page.ReportCount > 0)
sb.AppendFormat("\tInformational exception conditions will be reported a maximum of {0} times",

View File

@@ -285,7 +285,8 @@ namespace DiscImageChef.Decoders.SCSI
for(int i = 0; i < descriptors; i++)
decoded.WriteSpeedPerformanceDescriptors[i] = new ModePage_2A_WriteDescriptor
{
RotationControl = (byte)(pageResponse[1 + 32 + i * 4] & 0x07),
RotationControl =
(byte)(pageResponse[1 + 32 + i * 4] & 0x07),
WriteSpeed = (ushort)((pageResponse[2 + 32 + i * 4] << 8) + pageResponse[3 + 32 + i * 4])
};
@@ -356,6 +357,7 @@ namespace DiscImageChef.Decoders.SCSI
sb.AppendLine(page.LockState
? "\tDrive is locked, media cannot be ejected, but if empty, can be inserted"
: "\tDrive is not locked, media can be ejected and inserted");
if(page.Eject) sb.AppendLine("\tDrive can eject media");
if(page.SeparateChannelMute) sb.AppendLine("\tEach channel can be muted independently");

View File

@@ -95,6 +95,7 @@ namespace DiscImageChef.Decoders.SCSI
header.BlockDescriptors[i].Density = DensityType.Default;
header.BlockDescriptors[i].Blocks += (ulong)(modeResponse[0 + i * 8 + 8] << 24);
}
header.BlockDescriptors[i].Blocks += (ulong)(modeResponse[1 + i * 8 + 8] << 16);
header.BlockDescriptors[i].Blocks += (ulong)(modeResponse[2 + i * 8 + 8] << 8);
header.BlockDescriptors[i].Blocks += modeResponse[3 + i * 8 + 8];

View File

@@ -115,11 +115,17 @@ namespace DiscImageChef.Decoders.SCSI.SSC
duplicate = (response[offset + 2] & 0x40) == 0x40,
defaultDensity = (response[offset + 2] & 0x20) == 0x20,
reserved = (byte)((response[offset + 2] & 0x1E) >> 1),
lenvalid = (response[offset + 2] & 0x01) == 0x01,
len = (ushort)((response[offset + 3] << 8) + response[offset + 4]),
bpmm = (uint)((response[offset + 5] << 16) + (response[offset + 6] << 8) + response[offset + 7]),
width = (ushort)((response[offset + 8] << 8) + response[offset + 9]),
tracks = (ushort)((response[offset + 10] << 8) + response[offset + 11]),
lenvalid =
(response[offset + 2] &
0x01) == 0x01,
len =
(ushort)((response[offset + 3] << 8) + response[offset + 4]),
bpmm =
(uint)((response[offset + 5] << 16) + (response[offset + 6] << 8) + response[offset + 7]),
width =
(ushort)((response[offset + 8] << 8) + response[offset + 9]),
tracks =
(ushort)((response[offset + 10] << 8) + response[offset + 11]),
capacity = (uint)((response[offset + 12] << 24) + (response[offset + 13] << 16) +
(response[offset + 14] << 8) + response[offset + 15])
};

View File

@@ -363,7 +363,8 @@ namespace DiscImageChef.Decoders.SCSI
offset += descLen;
}
else break;
else
break;
return decoded;
}

View File

@@ -109,7 +109,8 @@ namespace DiscImageChef.Decoders.SecureDigital
cid.ProductRevision & 0x0F).AppendLine();
sb.AppendFormat("\tProduct serial number: {0}", cid.ProductSerialNumber).AppendLine();
sb.AppendFormat("\tDevice manufactured month {0} of {1}", (cid.ManufacturingDate & 0xF00) >> 8,
(cid.ManufacturingDate & 0xFF) + 2000).AppendLine();
(cid.ManufacturingDate & 0xFF) + 2000)
.AppendLine();
sb.AppendFormat("\tCID CRC: 0x{0:X2}", cid.CRC).AppendLine();
return sb.ToString();

View File

@@ -127,7 +127,8 @@ namespace DiscImageChef.Decoders.SecureDigital
if(csd.Structure == 0)
{
csd.Size = (ushort)(((response[6] & 0x03) << 10) + (response[7] << 2) + ((response[8] & 0xC0) >> 6));
csd.Size =
(ushort)(((response[6] & 0x03) << 10) + (response[7] << 2) + ((response[8] & 0xC0) >> 6));
csd.ReadCurrentAtVddMin = (byte)((response[8] & 0x38) >> 3);
csd.ReadCurrentAtVddMax = (byte)(response[8] & 0x07);
csd.WriteCurrentAtVddMin = (byte)((response[9] & 0xE0) >> 5);
@@ -329,7 +330,9 @@ namespace DiscImageChef.Decoders.SecureDigital
sb.AppendFormat("\tDevice's transfer speed: {0}{1}", result, unit).AppendLine();
unit = "";
for(int cl = 0, mask = 1; cl <= 11; cl++, mask <<= 1) if((csd.Classes & mask) == mask) unit += $" {cl}";
for(int cl = 0, mask = 1; cl <= 11; cl++, mask <<= 1)
if((csd.Classes & mask) == mask)
unit += $" {cl}";
sb.AppendFormat("\tDevice support command classes {0}", unit).AppendLine();
sb.AppendFormat("\tRead block length is {0} bytes", Math.Pow(2, csd.ReadBlockLength)).AppendLine();
@@ -347,7 +350,8 @@ namespace DiscImageChef.Decoders.SecureDigital
sb.AppendFormat("\tDevice has {0} blocks", (int)result).AppendLine();
result = (csd.Size + 1) * Math.Pow(2, csd.SizeMultiplier + 2) * Math.Pow(2, csd.ReadBlockLength);
if(result > 1073741824) sb.AppendFormat("\tDevice has {0} GiB", result / 1073741824.0).AppendLine();
if(result > 1073741824)
sb.AppendFormat("\tDevice has {0} GiB", result / 1073741824.0).AppendLine();
else if(result > 1048576) sb.AppendFormat("\tDevice has {0} MiB", result / 1048576.0).AppendLine();
else if(result > 1024) sb.AppendFormat("\tDevice has {0} KiB", result / 1024.0).AppendLine();
else sb.AppendFormat("\tDevice has {0} bytes", result).AppendLine();

View File

@@ -49,9 +49,11 @@ namespace DiscImageChef.Decoders.Sega
public struct IPBin
{
/// <summary>Must be "SEGADISCSYSTEM " or "SEGADATADISC " or "SEGAOS "</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] public byte[] SegaHardwareID;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public byte[] SegaHardwareID;
/// <summary>0x010, Varies</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 11)] public byte[] volume_name;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 11)]
public byte[] volume_name;
/// <summary>0x01B, 0x00</summary>
public byte spare_space1;
/// <summary>0x01C, Volume version in BCD. &lt;100 = Prerelease.</summary>
@@ -59,7 +61,8 @@ namespace DiscImageChef.Decoders.Sega
/// <summary>0x01E, Bit 0 = 1 => CD-ROM. Rest should be 0.</summary>
public ushort volume_type;
/// <summary>0x020, Unknown, varies!</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 11)] public byte[] system_name;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 11)]
public byte[] system_name;
/// <summary>0x02B, 0x00</summary>
public byte spare_space2;
/// <summary>0x02C, Should be 1</summary>
@@ -83,33 +86,46 @@ namespace DiscImageChef.Decoders.Sega
/// <summary>0x04C, System program work RAM size in bytes</summary>
public uint sp_work_ram_size;
/// <summary>0x050, MMDDYYYY</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] public byte[] release_date;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
public byte[] release_date;
/// <summary>0x058, Seems to be all 0x20s</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 7)] public byte[] unknown1;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 7)]
public byte[] unknown1;
/// <summary>0x05F, 0x00 ?</summary>
public byte spare_space4;
/// <summary>0x060, System Reserved Area</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 160)] public byte[] system_reserved;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 160)]
public byte[] system_reserved;
/// <summary>0x100, Hardware ID</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] public byte[] hardware_id;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public byte[] hardware_id;
/// <summary>0x113 or 0x110, "SEGA" or "T-xx"</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)] public byte[] developer_code;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)]
public byte[] developer_code;
/// <summary>0x118, Another release date, this with month in letters?</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] public byte[] release_date2;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
public byte[] release_date2;
/// <summary>0x120, Domestic version of the game title</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 48)] public byte[] domestic_title;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 48)]
public byte[] domestic_title;
/// <summary>0x150, Overseas version of the game title</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 48)] public byte[] overseas_title;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 48)]
public byte[] overseas_title;
/// <summary>0x180, Official product code</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 13)] public byte[] product_code;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 13)]
public byte[] product_code;
/// <summary>0x190, Supported peripherals, see above</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] public byte[] peripherals;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public byte[] peripherals;
/// <summary>0x1A0, 0x20</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] public byte[] spare_space6;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public byte[] spare_space6;
/// <summary>0x1B0, Inside here should be modem information, but I need to get a modem-enabled game</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)] public byte[] spare_space7;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
public byte[] spare_space7;
/// <summary>0x1F0, Region codes, space-filled</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] public byte[] region_codes;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public byte[] region_codes;
}
public static IPBin? DecodeIPBin(byte[] ipbin_sector)

View File

@@ -48,15 +48,18 @@ namespace DiscImageChef.Decoders.Sega
public struct IPBin
{
/// <summary>Must be "SEGA SEGAKATANA "</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] public byte[] SegaHardwareID;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public byte[] SegaHardwareID;
/// <summary>0x010, "SEGA ENTERPRISES"</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] public byte[] maker_id;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public byte[] maker_id;
/// <summary>0x020, CRC of product_no and product_version</summary>
public uint dreamcast_crc;
/// <summary>0x024, " "</summary>
public byte spare_space1;
/// <summary>0x025, "GD-ROM"</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)] public byte[] dreamcast_media;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
public byte[] dreamcast_media;
/// <summary>0x02B, Disc number</summary>
public byte disc_no;
/// <summary>0x02C, '/'</summary>
@@ -64,29 +67,40 @@ namespace DiscImageChef.Decoders.Sega
/// <summary>0x02D, Total number of discs</summary>
public byte disc_total_nos;
/// <summary>0x02E, " "</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] public byte[] spare_space2;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
public byte[] spare_space2;
/// <summary>0x030, Region codes, space-filled</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] public byte[] region_codes;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
public byte[] region_codes;
/// <summary>0x038, Supported peripherals, bitwise</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 7)] public byte[] peripherals;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 7)]
public byte[] peripherals;
/// <summary>0x03F, ' '</summary>
public byte spare_space3;
/// <summary>0x040, Product number</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)] public byte[] product_no;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
public byte[] product_no;
/// <summary>0x04A, Product version</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)] public byte[] product_version;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
public byte[] product_version;
/// <summary>0x050, YYYYMMDD</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] public byte[] release_date;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
public byte[] release_date;
/// <summary>0x058, " "</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] public byte[] spare_space4;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
public byte[] spare_space4;
/// <summary>0x060, Usually "1ST_READ.BIN" or "0WINCE.BIN "</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)] public byte[] boot_filename;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)]
public byte[] boot_filename;
/// <summary>0x06C, " "</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] public byte[] spare_space5;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
public byte[] spare_space5;
/// <summary>0x070, Game producer, space-filled</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] public byte[] producer;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public byte[] producer;
/// <summary>0x080, Game name, space-filled</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)] public byte[] product_name;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)]
public byte[] product_name;
}
public static IPBin? DecodeIPBin(byte[] ipbin_sector)

View File

@@ -48,17 +48,23 @@ namespace DiscImageChef.Decoders.Sega
public struct IPBin
{
/// <summary>Must be "SEGA SEGASATURN "</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] public byte[] SegaHardwareID;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public byte[] SegaHardwareID;
/// <summary>0x010, "SEGA ENTERPRISES"</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] public byte[] maker_id;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public byte[] maker_id;
/// <summary>0x020, Product number</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)] public byte[] product_no;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
public byte[] product_no;
/// <summary>0x02A, Product version</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)] public byte[] product_version;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
public byte[] product_version;
/// <summary>0x030, YYYYMMDD</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] public byte[] release_date;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
public byte[] release_date;
/// <summary>0x038, "CD-"</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public byte[] saturn_media;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
public byte[] saturn_media;
/// <summary>0x03B, Disc number</summary>
public byte disc_no;
/// <summary>// 0x03C, '/'</summary>
@@ -66,13 +72,17 @@ namespace DiscImageChef.Decoders.Sega
/// <summary>// 0x03D, Total number of discs</summary>
public byte disc_total_nos;
/// <summary>0x03E, " "</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] public byte[] spare_space1;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
public byte[] spare_space1;
/// <summary>0x040, Region codes, space-filled</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] public byte[] region_codes;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public byte[] region_codes;
/// <summary>0x050, Supported peripherals, see above</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] public byte[] peripherals;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public byte[] peripherals;
/// <summary>0x060, Game name, space-filled</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 112)] public byte[] product_name;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 112)]
public byte[] product_name;
}
public static IPBin? DecodeIPBin(byte[] ipbin_sector)

View File

@@ -50,8 +50,13 @@ namespace DiscImageChef.Decoders.Xbox
if(BitConverter.ToUInt32(dmi, 4) != 1) return false;
// Catalogue number is two letters, five numbers, one letter
for(int i = 12; i < 14; i++) if(dmi[i] < 0x41 || dmi[i] > 0x5A) return false;
for(int i = 14; i < 19; i++) if(dmi[i] < 0x30 || dmi[i] > 0x39) return false;
for(int i = 12; i < 14; i++)
if(dmi[i] < 0x41 || dmi[i] > 0x5A)
return false;
for(int i = 14; i < 19; i++)
if(dmi[i] < 0x30 || dmi[i] > 0x39)
return false;
if(dmi[19] < 0x41 || dmi[19] > 0x5A) return false;

View File

@@ -238,9 +238,12 @@ namespace DiscImageChef.Decoders.Xbox
LayerType = (LayerTypeFieldMask)(response[2] & 0x07),
LinearDensity = (LinearDensityField)((response[3] & 0xF0) >> 4),
TrackDensity = (TrackDensityField)(response[3] & 0x0F),
DataAreaStartPSN = (uint)((response[4] << 24) + (response[5] << 16) + (response[6] << 8) + response[7]),
DataAreaEndPSN = (uint)((response[8] << 24) + (response[9] << 16) + (response[10] << 8) + response[11]),
Layer0EndPSN = (uint)((response[12] << 24) + (response[13] << 16) + (response[14] << 8) + response[15]),
DataAreaStartPSN =
(uint)((response[4] << 24) + (response[5] << 16) + (response[6] << 8) + response[7]),
DataAreaEndPSN =
(uint)((response[8] << 24) + (response[9] << 16) + (response[10] << 8) + response[11]),
Layer0EndPSN =
(uint)((response[12] << 24) + (response[13] << 16) + (response[14] << 8) + response[15]),
Unknown1 = response[27],
Unknown2 = new byte[28],
Unknown3 = new byte[436],
@@ -437,7 +440,8 @@ namespace DiscImageChef.Decoders.Xbox
if(decoded.Layers == 1 && !decoded.TrackPath)
sb.AppendFormat("Layer 0 ends at PSN {0:X}h", decoded.Layer0EndPSN).AppendLine();
}
else sb.AppendLine("Disc is empty");
else
sb.AppendLine("Disc is empty");
else sb.AppendLine("Disc is empty");
sb.AppendLine("Challenges:");