From a325119362d6db9303306e166deb54981d8414ce Mon Sep 17 00:00:00 2001 From: CasualPokePlayer <50538166+CasualPokePlayer@users.noreply.github.com> Date: Wed, 16 Oct 2024 12:59:55 -0700 Subject: [PATCH] Add a new DiscSectorReader policy: inspect the sector, but assume mode 2 form is 1 This behavior "needed" for rcheevo hashing to work, since a few games (e.g. `Chinmoku no Kantai - The Silent Service (Japan)`, maybe others) have mode 2 form 2 sectors for the exe (for some reason) --- .../RetroAchievements/RCheevos.Debug.cs | 10 ++++++- .../RetroAchievements.GameVerification.cs | 6 +++- .../DiscSectorReader.cs | 29 ++++++++++++------- 3 files changed, 33 insertions(+), 12 deletions(-) diff --git a/src/BizHawk.Client.EmuHawk/RetroAchievements/RCheevos.Debug.cs b/src/BizHawk.Client.EmuHawk/RetroAchievements/RCheevos.Debug.cs index a59293fc3f..b047be02a0 100644 --- a/src/BizHawk.Client.EmuHawk/RetroAchievements/RCheevos.Debug.cs +++ b/src/BizHawk.Client.EmuHawk/RetroAchievements/RCheevos.Debug.cs @@ -194,7 +194,15 @@ namespace BizHawk.Client.EmuHawk return; } - _dsr = new(_disc) { Policy = { ThrowExceptions2048 = false } }; + _dsr = new(_disc) + { + Policy = + { + UserData2048Mode = DiscSectorReaderPolicy.EUserData2048Mode.InspectSector_AssumeForm1, + ThrowExceptions2048 = false + } + }; + _buf2352 = new byte[2352]; } diff --git a/src/BizHawk.Client.EmuHawk/RetroAchievements/RetroAchievements.GameVerification.cs b/src/BizHawk.Client.EmuHawk/RetroAchievements/RetroAchievements.GameVerification.cs index fe28fb9da9..6590b5fea6 100644 --- a/src/BizHawk.Client.EmuHawk/RetroAchievements/RetroAchievements.GameVerification.cs +++ b/src/BizHawk.Client.EmuHawk/RetroAchievements/RetroAchievements.GameVerification.cs @@ -29,7 +29,11 @@ namespace BizHawk.Client.EmuHawk using var disc = DiscExtensions.CreateAnyType(path, e => throw new(e)); var dsr = new DiscSectorReader(disc) { - Policy = { DeterministicClearBuffer = false } // let's make this a little faster + Policy = + { + UserData2048Mode = DiscSectorReaderPolicy.EUserData2048Mode.InspectSector_AssumeForm1, + DeterministicClearBuffer = false // let's make this a little faster + } }; var buf2048 = new byte[2048]; diff --git a/src/BizHawk.Emulation.DiscSystem/DiscSectorReader.cs b/src/BizHawk.Emulation.DiscSystem/DiscSectorReader.cs index e0735dd289..6c06d21bba 100644 --- a/src/BizHawk.Emulation.DiscSystem/DiscSectorReader.cs +++ b/src/BizHawk.Emulation.DiscSystem/DiscSectorReader.cs @@ -21,6 +21,12 @@ namespace BizHawk.Emulation.DiscSystem /// Read it as mode 2 (form 1) /// AssumeMode2_Form1, + + /// + /// The contents of the sector should be inspected (mode) and 2048 bytes returned accordingly + /// Mode 2 form is assumed to be 1 + /// + InspectSector_AssumeForm1, } /// @@ -223,19 +229,22 @@ namespace BizHawk.Emulation.DiscSystem } else if (mode == 2) { - //greenbook pg II-22 - //we're going to do a sanity check here.. we're not sure what happens if we try to read 2048 bytes from a form-2 2324 byte sector - //we could handle it by policy but for now the policy is exception - byte submodeByte = buf2448[18]; - int form = ((submodeByte >> 5) & 1) + 1; - if (form == 2) + // greenbook pg II-22 + // we're going to do a sanity check here.. we're not sure what happens if we try to read 2048 bytes from a form-2 2324 byte sector + // default policy is exception, although some cases might prefer assuming form 1 + if (Policy.UserData2048Mode != DiscSectorReaderPolicy.EUserData2048Mode.InspectSector_AssumeForm1) { - if (Policy.ThrowExceptions2048) - throw new InvalidOperationException("Unsupported scenario: reading 2048 bytes from a Mode2 Form 2 sector"); - else return 0; + byte submodeByte = buf2448[18]; + int form = ((submodeByte >> 5) & 1) + 1; + if (form == 2) + { + if (Policy.ThrowExceptions2048) + throw new InvalidOperationException("Unsupported scenario: reading 2048 bytes from a Mode2 Form 2 sector"); + else return 0; + } } - //otherwise it's OK + // otherwise it's OK Buffer.BlockCopy(buf2448, 24, buffer, offset, 2048); return 2048; }