diff --git a/arm9/source/Arm7Patcher.cpp b/arm9/source/Arm7Patcher.cpp index 9acfca1..43ba649 100644 --- a/arm9/source/Arm7Patcher.cpp +++ b/arm9/source/Arm7Patcher.cpp @@ -39,6 +39,7 @@ void* Arm7Patcher::ApplyPatches(const LoaderPlatform* loaderPlatform) const (romHeader->IsTwlRom()) ? twlRomHeader->arm7iSize : 0, sdkVersion, romHeader->gameCode, + romHeader->softwareVersion, loaderPlatform }; void* patchSpaceStart = nullptr; diff --git a/arm9/source/Arm9Patcher.cpp b/arm9/source/Arm9Patcher.cpp index 9c54189..3ff9dfc 100644 --- a/arm9/source/Arm9Patcher.cpp +++ b/arm9/source/Arm9Patcher.cpp @@ -116,6 +116,7 @@ void Arm9Patcher::ApplyPatches(const LoaderPlatform* loaderPlatform, const ApLis arm9iSize, sdkVersion, romHeader->gameCode, + romHeader->softwareVersion, loaderPlatform }; PatchCollection patchCollection; diff --git a/arm9/source/patches/PatchContext.h b/arm9/source/patches/PatchContext.h index 6e84766..2aad29c 100644 --- a/arm9/source/patches/PatchContext.h +++ b/arm9/source/patches/PatchContext.h @@ -11,9 +11,9 @@ class PatchContext { public: PatchContext(void* data, u32 dataSize, void* twlData, u32 twlDataSize, - SdkVersion sdkVersion, u32 gameCode, const LoaderPlatform* loaderPlatform) + SdkVersion sdkVersion, u32 gameCode, u8 gameRevision, const LoaderPlatform* loaderPlatform) : _data(data), _dataSize(dataSize), _twlData(twlData), _twlDataSize(twlDataSize) - , _sdkVersion(sdkVersion), _gameCode(gameCode), _loaderPlatform(loaderPlatform) { } + , _sdkVersion(sdkVersion), _gameCode(gameCode), _gameRevision(gameRevision), _loaderPlatform(loaderPlatform) { } /// @brief Tries to find the given \p pattern of the given \p byteLength in the ntr region. /// @param pattern The pattern to find. @@ -43,6 +43,10 @@ public: /// @return The game code of the rom that is being patched. constexpr u32 GetGameCode() const { return _gameCode; } + /// @brief Returns the game revision of the rom that is being patched. + /// @return The game revision of the rom that is being patched. + constexpr u8 GetGameRevision() const { return _gameRevision; } + /// @brief Returns the loader platform that should be used for the patches. /// @return The loader platform that should be used for the patches. constexpr const LoaderPlatform* GetLoaderPlatform() { return _loaderPlatform; } @@ -54,6 +58,7 @@ private: u32 _twlDataSize; SdkVersion _sdkVersion; u32 _gameCode; + u8 _gameRevision; PatchHeap _patchHeap; PatchCodeCollection _patchCodeCollection; diff --git a/arm9/source/patches/arm9/sdk2to4/CardiReadCardPatch.cpp b/arm9/source/patches/arm9/sdk2to4/CardiReadCardPatch.cpp index 1fb22b7..3f3c215 100644 --- a/arm9/source/patches/arm9/sdk2to4/CardiReadCardPatch.cpp +++ b/arm9/source/patches/arm9/sdk2to4/CardiReadCardPatch.cpp @@ -6,6 +6,7 @@ #include "patches/arm9/RomOffsetToSdSectorPatchCode.h" #include "patches/OffsetToSectorRemapPatchCode.h" #include "patches/arm9/FixCp15Asm.h" +#include "gameCode.h" #include "CardiReadCardPatchAsm.h" #include "CardiReadCardPatch.h" @@ -30,59 +31,69 @@ void CardiReadCardPatch::TryPattern(PatchContext& patchContext, const u32* patte bool CardiReadCardPatch::FindPatchTarget(PatchContext& patchContext) { - if (patchContext.GetSdkVersion() >= 0x4017530) - TryPattern(patchContext, sCARDiReadCardPatternSdk4017530, sizeof(sCARDiReadCardPatternSdk4017530)); - else if (patchContext.GetSdkVersion() >= 0x4002774) - TryPattern(patchContext, sCARDiReadCardPatternSdk4002774, sizeof(sCARDiReadCardPatternSdk4002774)); + if (patchContext.GetGameCode() == GAMECODE("A4VJ")) + { + // Shaberu! DS Oryouri Navi (Japan) has a spurious match + _foundPattern = sCARDiReadCardPatternUnknown; + _thumb = false; + _cardiReadCard = (u32*)(patchContext.GetGameRevision() == 0 ? 0x020DBD5C : 0x020DBD4C); + } else - TryPattern(patchContext, sCARDiReadCardPatternSdk20029A7, sizeof(sCARDiReadCardPatternSdk20029A7)); - - if (!_cardiReadCard) { if (patchContext.GetSdkVersion() >= 0x4017530) - TryPattern(patchContext, sCARDiReadCardPatternSdk4017530Thumb, sizeof(sCARDiReadCardPatternSdk4017530Thumb)); - else if (patchContext.GetSdkVersion() >= 0x3027530) - TryPattern(patchContext, sCARDiReadCardPatternSdk3027530Thumb, sizeof(sCARDiReadCardPatternSdk3027530Thumb)); - else if (patchContext.GetSdkVersion() >= 0x2004F4C) - TryPattern(patchContext, sCARDiReadCardPatternSdk2004F4CThumb, sizeof(sCARDiReadCardPatternSdk2004F4CThumb)); - - if (_cardiReadCard) - _thumb = true; - } - - if (!_cardiReadCard) - { - // if still nothing found try some of the patterns that appear all over the place - TryPattern(patchContext, sCARDiReadCardPatternUnknown, sizeof(sCARDiReadCardPatternUnknown)); - if (!_cardiReadCard) + TryPattern(patchContext, sCARDiReadCardPatternSdk4017530, sizeof(sCARDiReadCardPatternSdk4017530)); + else if (patchContext.GetSdkVersion() >= 0x4002774) TryPattern(patchContext, sCARDiReadCardPatternSdk4002774, sizeof(sCARDiReadCardPatternSdk4002774)); - if (!_cardiReadCard) + else TryPattern(patchContext, sCARDiReadCardPatternSdk20029A7, sizeof(sCARDiReadCardPatternSdk20029A7)); - if (patchContext.GetSdkVersion().GetMajor() >= SDK_VERSION_MAJOR_NITRO_4) + + if (!_cardiReadCard) { - if (!_cardiReadCard) - TryPattern(patchContext, sCARDiReadCardPatternSdk4027539SpiritTracks, sizeof(sCARDiReadCardPatternSdk4027539SpiritTracks)); + if (patchContext.GetSdkVersion() >= 0x4017530) + TryPattern(patchContext, sCARDiReadCardPatternSdk4017530Thumb, sizeof(sCARDiReadCardPatternSdk4017530Thumb)); + else if (patchContext.GetSdkVersion() >= 0x3027530) + TryPattern(patchContext, sCARDiReadCardPatternSdk3027530Thumb, sizeof(sCARDiReadCardPatternSdk3027530Thumb)); + else if (patchContext.GetSdkVersion() >= 0x2004F4C) + TryPattern(patchContext, sCARDiReadCardPatternSdk2004F4CThumb, sizeof(sCARDiReadCardPatternSdk2004F4CThumb)); + + if (_cardiReadCard) + _thumb = true; } - if (patchContext.GetSdkVersion().GetMajor() <= SDK_VERSION_MAJOR_NITRO_2) + if (!_cardiReadCard) { + // if still nothing found try some of the patterns that appear all over the place + TryPattern(patchContext, sCARDiReadCardPatternUnknown, sizeof(sCARDiReadCardPatternUnknown)); if (!_cardiReadCard) - TryPattern(patchContext, sCARDiReadCardPatternSdk2004F4DDebug, sizeof(sCARDiReadCardPatternSdk2004F4DDebug)); + TryPattern(patchContext, sCARDiReadCardPatternSdk4002774, sizeof(sCARDiReadCardPatternSdk4002774)); if (!_cardiReadCard) - TryPattern(patchContext, sCARDiReadCardPatternSdk2004E8BPingPals, sizeof(sCARDiReadCardPatternSdk2004E8BPingPals)); + TryPattern(patchContext, sCARDiReadCardPatternSdk20029A7, sizeof(sCARDiReadCardPatternSdk20029A7)); + if (patchContext.GetSdkVersion().GetMajor() >= SDK_VERSION_MAJOR_NITRO_4) + { + if (!_cardiReadCard) + TryPattern(patchContext, sCARDiReadCardPatternSdk4027539SpiritTracks, sizeof(sCARDiReadCardPatternSdk4027539SpiritTracks)); + } + + if (patchContext.GetSdkVersion().GetMajor() <= SDK_VERSION_MAJOR_NITRO_2) + { + if (!_cardiReadCard) + TryPattern(patchContext, sCARDiReadCardPatternSdk2004F4DDebug, sizeof(sCARDiReadCardPatternSdk2004F4DDebug)); + if (!_cardiReadCard) + TryPattern(patchContext, sCARDiReadCardPatternSdk2004E8BPingPals, sizeof(sCARDiReadCardPatternSdk2004E8BPingPals)); + } } - } - if (!_cardiReadCard) - { - TryPattern(patchContext, sCARDiReadCardPatternSdk2004F4CThumb, sizeof(sCARDiReadCardPatternSdk2004F4CThumb)); if (!_cardiReadCard) - TryPattern(patchContext, sCARDiReadCardPatternSdk3027530Thumb, sizeof(sCARDiReadCardPatternSdk3027530Thumb)); - if (!_cardiReadCard) - TryPattern(patchContext, sCARDiReadCardPatternSdk2027533ThumbChouSoujuu, sizeof(sCARDiReadCardPatternSdk2027533ThumbChouSoujuu)); + { + TryPattern(patchContext, sCARDiReadCardPatternSdk2004F4CThumb, sizeof(sCARDiReadCardPatternSdk2004F4CThumb)); + if (!_cardiReadCard) + TryPattern(patchContext, sCARDiReadCardPatternSdk3027530Thumb, sizeof(sCARDiReadCardPatternSdk3027530Thumb)); + if (!_cardiReadCard) + TryPattern(patchContext, sCARDiReadCardPatternSdk2027533ThumbChouSoujuu, sizeof(sCARDiReadCardPatternSdk2027533ThumbChouSoujuu)); - if (_cardiReadCard) - _thumb = true; + if (_cardiReadCard) + _thumb = true; + } } if (_cardiReadCard)