mirror of
https://github.com/aaru-dps/Aaru.git
synced 2026-07-08 18:16:24 +00:00
Move detection of OmniDrive earlier.
This commit is contained in:
@@ -121,6 +121,7 @@ public partial class Dump
|
||||
IMediaGraph _mediaGraph;
|
||||
bool _missingTitleKeysDirty;
|
||||
HashSet<ulong> _missingTitleKeysLookup;
|
||||
bool _omnidrive;
|
||||
Resume _resume;
|
||||
Sidecar _sidecarClass;
|
||||
uint _skip;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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
|
||||
];
|
||||
|
||||
Reference in New Issue
Block a user