Move detection of OmniDrive earlier.

This commit is contained in:
2026-07-04 17:18:26 +01:00
parent 94399836e2
commit 35444f5b2c
7 changed files with 74 additions and 69 deletions

View File

@@ -121,6 +121,7 @@ public partial class Dump
IMediaGraph _mediaGraph;
bool _missingTitleKeysDirty;
HashSet<ulong> _missingTitleKeysLookup;
bool _omnidrive;
Resume _resume;
Sidecar _sidecarClass;
uint _skip;

View File

@@ -298,6 +298,11 @@ partial class Dump
return;
}
_omnidrive = _dev.IsOmniDriveFirmware(out byte odMajor, out byte odMinor, out byte odRevision);
if(_omnidrive)
AaruLogging.WriteLine($"[slateblue1]Detected [/][#FFFFFF]O[/][#FFAFC8]m[/][#74D7EE]n[/][#E40303]i[/][#FF8C00]D[/][#FFED00]r[/][#008026]i[/][#004DFF]v[/][#750787]e[/][#613915]![/][000000]![/] [slateblue1]version[/] [purple]{odMajor}.{odMinor}.{odRevision}[/]");
if(compactDisc)
{
_speedMultiplier *= 177;
@@ -347,9 +352,7 @@ partial class Dump
PFI.PhysicalFormatInformation? nintendoPfi = PFI.Decode(cmdBuf, dskType);
if(nintendoPfi is { DiskCategory: DiskCategory.Nintendo, PartVersion: 15 })
{
dskType = nintendoPfi.Value.DiscSize == DVDSize.Eighty ? MediaType.GOD : MediaType.WOD;
}
}
break;

View File

@@ -99,7 +99,7 @@ partial class Dump
}
AaruLogging.WriteLine(Localization.Core.Initializing_reader);
var scsiReader = new Reader(_dev, _dev.Timeout, null, _errorLog, _dumpRaw);
var scsiReader = new Reader(_dev, _dev.Timeout, null, _errorLog, _dumpRaw, _omnidrive);
ulong blocks = scsiReader.GetDeviceBlocks();
uint blockSize = scsiReader.LogicalBlockSize;

View File

@@ -48,14 +48,17 @@ sealed partial class Reader
readonly Device _dev;
readonly ErrorLog _errorLog;
readonly uint _timeout;
readonly bool _omnidrive;
internal Reader(Device dev, uint timeout, byte[] identification, ErrorLog errorLog, bool raw = false)
internal Reader(Device dev, uint timeout, byte[] identification, ErrorLog errorLog, bool raw = false,
bool omnidrive = false)
{
_dev = dev;
_timeout = timeout;
BlocksToRead = 64;
CanReadRaw = raw;
_errorLog = errorLog;
_omnidrive = omnidrive;
switch(dev.Type)
{
@@ -85,8 +88,8 @@ sealed partial class Reader
/// OmniDrive Nintendo reads at LBAs ≥ 16; null until derived.
/// </summary>
internal byte? NintendoDerivedDiscKey { get; set; }
internal bool CanSeek => _ataSeek || _seek6 || _seek10;
internal bool CanSeekLba => _ataSeekLba || _seek6 || _seek10;
internal bool CanSeek => _ataSeek || _seek6 || _seek10;
internal bool CanSeekLba => _ataSeekLba || _seek6 || _seek10;
internal ulong GetDeviceBlocks()
{
@@ -167,7 +170,12 @@ sealed partial class Reader
return AtaReadBlocks(out buffer, block, count, out duration, out recoveredError);
case DeviceType.ATAPI:
case DeviceType.SCSI:
return ScsiReadBlocks(out buffer, block, count, out duration, out recoveredError, out blankCheck,
return ScsiReadBlocks(out buffer,
block,
count,
out duration,
out recoveredError,
out blankCheck,
negative);
default:
buffer = null;

View File

@@ -56,8 +56,8 @@ sealed partial class Reader
public bool HldtstReadRaw;
public uint layerbreak;
public bool OmniDriveReadRaw;
public bool ReadBuffer3CReadRaw;
public bool otp;
public bool ReadBuffer3CReadRaw;
ulong ScsiGetBlocks() => ScsiGetBlockSize() ? 0 : Blocks;
@@ -589,9 +589,9 @@ sealed partial class Reader
!_dev.ReadBuffer3CRawDvd(out _, out senseBuf, 0, 1, _timeout, out _, layerbreak, otp);
// Try OmniDrive on drives with OmniDrive firmware (standard descramble=1 and Nintendo descramble=0)
if(_dev.IsOmniDriveFirmware())
if(_omnidrive)
{
bool omniStandardOk = !_dev.OmniDriveReadRawDvd(out _, out senseBuf, 0, 1, _timeout, out _, true, true);
bool omniStandardOk = !_dev.OmniDriveReadRawDvd(out _, out senseBuf, 0, 1, _timeout, out _, true);
OmniDriveReadRaw = omniStandardOk
? true
@@ -601,11 +601,7 @@ sealed partial class Reader
1,
_timeout,
out _,
true,
true,
null,
false,
0);
true);
}
if(HldtstReadRaw || _plextorReadRaw || ReadBuffer3CReadRaw || OmniDriveReadRaw)
@@ -712,7 +708,8 @@ sealed partial class Reader
BlocksToRead = 1;
else if(OmniDriveReadRaw)
{
BlocksToRead = (uint)Math.Min(31, startWithBlocks);
BlocksToRead = Math.Min(31, startWithBlocks);
return false;
}
else if(_read6)
@@ -798,8 +795,8 @@ sealed partial class Reader
return true;
}
bool ScsiReadBlocks(out byte[] buffer, ulong block, uint count, out double duration, out bool recoveredError,
out bool blankCheck, bool negative = false)
bool ScsiReadBlocks(out byte[] buffer, ulong block, uint count, out double duration, out bool recoveredError,
out bool blankCheck, bool negative = false)
{
bool sense;
ReadOnlySpan<byte> senseBuf;
@@ -863,7 +860,7 @@ sealed partial class Reader
}
else if(OmniDriveReadRaw)
{
uint lba = negative ? (uint)(-(long)block) : (uint)block;
uint lba = negative ? (uint)-(long)block : (uint)block;
if(OmniDriveNintendoMode)
{
@@ -882,12 +879,7 @@ sealed partial class Reader
regularDataEndExclusive);
}
else
sense = _dev.OmniDriveReadRawDvd(out buffer,
out senseBuf,
lba,
count,
_timeout,
out duration);
sense = _dev.OmniDriveReadRawDvd(out buffer, out senseBuf, lba, count, _timeout, out duration);
}
else if(ReadBuffer3CReadRaw)
{

View File

@@ -89,8 +89,12 @@ public partial class Device
/// matching redumper's is_omnidrive_firmware behaviour.
/// </summary>
/// <returns><c>true</c> if Reserved5 starts with "OmniDrive" and has at least 11 bytes (8 + 3 for version).</returns>
public bool IsOmniDriveFirmware()
public bool IsOmniDriveFirmware(out byte major, out byte minor, out byte revision)
{
major = 0;
minor = 0;
revision = 0;
bool sense = ScsiInquiry(out byte[] buffer, out _, Timeout, out _);
if (sense || buffer == null) return false;
@@ -109,6 +113,10 @@ public partial class Device
if (reserved5[i] != omnidrive[i])
return false;
major = reserved5[9];
minor = reserved5[10];
revision = reserved5[11];
return true;
}
@@ -163,7 +171,7 @@ public partial class Device
/// </param>
/// <returns><c>true</c> if the command failed and <paramref name="senseBuffer" /> contains the sense buffer.</returns>
public bool OmniDriveReadNintendoDvd(out byte[] buffer, out ReadOnlySpan<byte> senseBuffer, uint lba, uint transferLength,
uint timeout, out double duration, bool fua = false, bool descramble = true,
uint timeout, out double duration, bool fua = false, bool descramble = true,
byte? derivedDiscKey = null, bool negativeAddressing = false,
ulong regularDataEndExclusive = 0)
{

View File

@@ -89,64 +89,57 @@ public sealed partial class SuperCardPro
public IEnumerable<MediaType> SupportedMediaTypes =>
[
// Apple formats
MediaType.Apple32SS, MediaType.Apple32DS, MediaType.Apple33SS, MediaType.Apple33DS,
MediaType.AppleSonySS, MediaType.AppleSonyDS, MediaType.AppleFileWare,
MediaType.Apple32SS, MediaType.Apple32DS, MediaType.Apple33SS, MediaType.Apple33DS, MediaType.AppleSonySS,
MediaType.AppleSonyDS, MediaType.AppleFileWare,
// IBM PC/DOS formats - 5.25"
MediaType.DOS_525_SS_DD_8, MediaType.DOS_525_SS_DD_9,
MediaType.DOS_525_DS_DD_8, MediaType.DOS_525_DS_DD_9, MediaType.DOS_525_HD,
MediaType.DOS_525_SS_DD_8, MediaType.DOS_525_SS_DD_9, MediaType.DOS_525_DS_DD_8, MediaType.DOS_525_DS_DD_9,
MediaType.DOS_525_HD,
// IBM PC/DOS formats - 3.5"
MediaType.DOS_35_SS_DD_8, MediaType.DOS_35_SS_DD_9,
MediaType.DOS_35_DS_DD_8, MediaType.DOS_35_DS_DD_9, MediaType.DOS_35_HD, MediaType.DOS_35_ED,
MediaType.DOS_35_SS_DD_8, MediaType.DOS_35_SS_DD_9, MediaType.DOS_35_DS_DD_8, MediaType.DOS_35_DS_DD_9,
MediaType.DOS_35_HD, MediaType.DOS_35_ED,
// Microsoft formats
MediaType.DMF, MediaType.DMF_82, MediaType.XDF_525, MediaType.XDF_35,
// Atari formats
MediaType.ATARI_525_SD, MediaType.ATARI_525_DD, MediaType.ATARI_525_ED,
MediaType.ATARI_35_SS_DD, MediaType.ATARI_35_DS_DD,
MediaType.ATARI_35_SS_DD_11, MediaType.ATARI_35_DS_DD_11,
MediaType.ATARI_525_SD, MediaType.ATARI_525_DD, MediaType.ATARI_525_ED, MediaType.ATARI_35_SS_DD,
MediaType.ATARI_35_DS_DD, MediaType.ATARI_35_SS_DD_11, MediaType.ATARI_35_DS_DD_11,
// Commodore/Amiga formats
MediaType.CBM_35_DD, MediaType.CBM_AMIGA_35_DD, MediaType.CBM_AMIGA_35_HD,
MediaType.CBM_1540, MediaType.CBM_1540_Ext, MediaType.CBM_1571,
MediaType.CBM_35_DD, MediaType.CBM_AMIGA_35_DD, MediaType.CBM_AMIGA_35_HD, MediaType.CBM_1540,
MediaType.CBM_1540_Ext, MediaType.CBM_1571,
// NEC/Sharp formats
MediaType.NEC_525_SS, MediaType.NEC_525_DS, MediaType.NEC_525_HD,
MediaType.NEC_35_HD_8, MediaType.NEC_35_HD_15, MediaType.NEC_35_TD,
MediaType.SHARP_525, MediaType.SHARP_525_9, MediaType.SHARP_35, MediaType.SHARP_35_9,
MediaType.NEC_525_SS, MediaType.NEC_525_DS, MediaType.NEC_525_HD, MediaType.NEC_35_HD_8, MediaType.NEC_35_HD_15,
MediaType.NEC_35_TD, MediaType.SHARP_525, MediaType.SHARP_525_9, MediaType.SHARP_35, MediaType.SHARP_35_9,
// 8" formats
MediaType.NEC_8_SD, MediaType.NEC_8_DD,
MediaType.ECMA_99_8, MediaType.ECMA_69_8,
MediaType.NEC_8_SD, MediaType.NEC_8_DD, MediaType.ECMA_99_8, MediaType.ECMA_69_8,
// IBM formats
MediaType.IBM23FD, MediaType.IBM33FD_128, MediaType.IBM33FD_256, MediaType.IBM33FD_512,
MediaType.IBM43FD_128, MediaType.IBM43FD_256,
MediaType.IBM53FD_256, MediaType.IBM53FD_512, MediaType.IBM53FD_1024,
MediaType.IBM23FD, MediaType.IBM33FD_128, MediaType.IBM33FD_256, MediaType.IBM33FD_512, MediaType.IBM43FD_128,
MediaType.IBM43FD_256, MediaType.IBM53FD_256, MediaType.IBM53FD_512, MediaType.IBM53FD_1024,
// DEC formats
MediaType.RX01, MediaType.RX02, MediaType.RX03, MediaType.RX50,
// Acorn formats
MediaType.ACORN_525_SS_SD_40, MediaType.ACORN_525_SS_SD_80,
MediaType.ACORN_525_SS_DD_40, MediaType.ACORN_525_SS_DD_80, MediaType.ACORN_525_DS_DD,
MediaType.ACORN_35_DS_DD, MediaType.ACORN_35_DS_HD,
MediaType.ACORN_525_SS_SD_40, MediaType.ACORN_525_SS_SD_80, MediaType.ACORN_525_SS_DD_40,
MediaType.ACORN_525_SS_DD_80, MediaType.ACORN_525_DS_DD, MediaType.ACORN_35_DS_DD, MediaType.ACORN_35_DS_HD,
// ECMA standard formats
MediaType.ECMA_54, MediaType.ECMA_59, MediaType.ECMA_66, MediaType.ECMA_69_8,
MediaType.ECMA_69_15, MediaType.ECMA_69_26, MediaType.ECMA_70, MediaType.ECMA_78,
MediaType.ECMA_78_2, MediaType.ECMA_99_15, MediaType.ECMA_99_26, MediaType.ECMA_100,
MediaType.ECMA_125, MediaType.ECMA_147,
MediaType.ECMA_54, MediaType.ECMA_59, MediaType.ECMA_66, MediaType.ECMA_69_8, MediaType.ECMA_69_15,
MediaType.ECMA_69_26, MediaType.ECMA_70, MediaType.ECMA_78, MediaType.ECMA_78_2, MediaType.ECMA_99_15,
MediaType.ECMA_99_26, MediaType.ECMA_100, MediaType.ECMA_125, MediaType.ECMA_147,
// FDFORMAT formats
MediaType.FDFORMAT_525_DD, MediaType.FDFORMAT_525_HD,
MediaType.FDFORMAT_35_DD, MediaType.FDFORMAT_35_HD,
MediaType.FDFORMAT_525_DD, MediaType.FDFORMAT_525_HD, MediaType.FDFORMAT_35_DD, MediaType.FDFORMAT_35_HD,
// Other formats
MediaType.Apricot_35, MediaType.MetaFloppy_Mod_I, MediaType.MetaFloppy_Mod_II,
// Unknown/fallback
MediaType.Unknown
];