From e36e669daf65ca33222ef52e78bd113bf7a69d55 Mon Sep 17 00:00:00 2001 From: taxicat1 <32942550+taxicat1@users.noreply.github.com> Date: Wed, 10 Dec 2025 15:58:11 -0500 Subject: [PATCH 1/3] Initial DSProtect for ARM9 static --- arm9/source/Arm9Patcher.cpp | 18 ++++++++------ .../patches/arm9/DSProtectArm9Patch.cpp | 19 +++++++++++++++ arm9/source/patches/arm9/DSProtectArm9Patch.h | 19 +++++++++++++++ .../DSProtectOverlayPatch.cpp | 24 +++++++++++++------ .../DSProtectPatches/DSProtectOverlayPatch.h | 3 ++- .../DSProtectOverlayPatchAsm.h | 5 ++-- .../DSProtectOverlayPatchAsm.s | 12 ++++++++++ data/aplist.csv | 5 ++++ 8 files changed, 88 insertions(+), 17 deletions(-) create mode 100644 arm9/source/patches/arm9/DSProtectArm9Patch.cpp create mode 100644 arm9/source/patches/arm9/DSProtectArm9Patch.h diff --git a/arm9/source/Arm9Patcher.cpp b/arm9/source/Arm9Patcher.cpp index d0676ef..8c1d4f3 100644 --- a/arm9/source/Arm9Patcher.cpp +++ b/arm9/source/Arm9Patcher.cpp @@ -12,6 +12,7 @@ #include "patches/arm9/CardiReadRomIdCorePatch.h" #include "patches/arm9/OSResetSystemPatch.h" #include "patches/arm9/PokemonDownloaderArm9Patch.h" +#include "patches/arm9/DSProtectArm9Patch.h" #include "patches/arm9/OverlayPatches/FsStartOverlayHookPatch.h" #include "patches/arm9/OverlayPatches/DSProtectPatches/DSProtectOverlayPatch.h" #include "patches/arm9/OverlayPatches/DSProtectPatches/DSProtectPuyoPuyo7Patch.h" @@ -243,7 +244,9 @@ void Arm9Patcher::AddDSProtectPatches( { if (regularOverlayId == AP_LIST_OVERLAY_ID_STATIC_ARM9) { - LOG_WARNING("Patching DSProtect in main memory currently not supported\n"); + patchCollection.AddPatch(new DSProtectArm9Patch( + apListEntry->GetRegularOffset(), apListEntry->GetDSProtectVersion(), + apListEntry->GetDSProtectFunctionMask())); } else { @@ -255,17 +258,18 @@ void Arm9Patcher::AddDSProtectPatches( u32 sOverlayId = apListEntry->GetSOverlayId(); if (sOverlayId != AP_LIST_OVERLAY_ID_INVALID) { + auto version = apListEntry->GetDSProtectVersion(); + if (version < DSProtectVersion::v2_00s) + { + version = (DSProtectVersion)((u32)version - (u32)DSProtectVersion::v2_00 + (u32)DSProtectVersion::v2_00s); + } if (sOverlayId == AP_LIST_OVERLAY_ID_STATIC_ARM9) { - LOG_WARNING("Patching DSProtect in main memory currently not supported\n"); + patchCollection.AddPatch(new DSProtectArm9Patch( + apListEntry->GetSOffset(), version, ~0u)); } else { - auto version = apListEntry->GetDSProtectVersion(); - if (version < DSProtectVersion::v2_00s) - { - version = (DSProtectVersion)((u32)version - (u32)DSProtectVersion::v2_00 + (u32)DSProtectVersion::v2_00s); - } overlayHookPatch->AddOverlayPatch(new DSProtectOverlayPatch( sOverlayId, apListEntry->GetSOffset(), version, ~0u)); } diff --git a/arm9/source/patches/arm9/DSProtectArm9Patch.cpp b/arm9/source/patches/arm9/DSProtectArm9Patch.cpp new file mode 100644 index 0000000..4c10619 --- /dev/null +++ b/arm9/source/patches/arm9/DSProtectArm9Patch.cpp @@ -0,0 +1,19 @@ +#include "common.h" +#include "DSProtectArm9Patch.h" +#include "OverlayPatches/DSProtectPatches/DSProtectOverlayPatch.h" +#include "ApList.h" +#include "sharedMemory.h" +#include "ndsHeader.h" + +bool DSProtectArm9Patch::FindPatchTarget(PatchContext& patchContext) +{ + return true; // target already specified by _arm9Offset +} + +void DSProtectArm9Patch::ApplyPatch(PatchContext& patchContext) +{ + auto patch = new DSProtectOverlayPatch( + AP_LIST_OVERLAY_ID_STATIC_ARM9, _arm9Offset, _version, _functionMask); + auto romHeader = (const nds_header_ntr_t*)TWL_SHARED_MEMORY->ntrSharedMem.romHeader; + patch->ApplyPatchForStaticArm9(romHeader->arm9LoadAddress); +} diff --git a/arm9/source/patches/arm9/DSProtectArm9Patch.h b/arm9/source/patches/arm9/DSProtectArm9Patch.h new file mode 100644 index 0000000..13af3d3 --- /dev/null +++ b/arm9/source/patches/arm9/DSProtectArm9Patch.h @@ -0,0 +1,19 @@ +#pragma once +#include "../Patch.h" +#include "DSProtectVersion.h" + +/// @brief Arm9 static patch for DS Protect. +class DSProtectArm9Patch : public Patch +{ +public: + DSProtectArm9Patch(u32 arm9Offset, DSProtectVersion version, u32 functionMask) + : _arm9Offset(arm9Offset), _version(version), _functionMask(functionMask) { } + + bool FindPatchTarget(PatchContext& patchContext) override; + void ApplyPatch(PatchContext& patchContext) override; + +private: + u32 _arm9Offset; + DSProtectVersion _version; + u32 _functionMask; +}; diff --git a/arm9/source/patches/arm9/OverlayPatches/DSProtectPatches/DSProtectOverlayPatch.cpp b/arm9/source/patches/arm9/OverlayPatches/DSProtectPatches/DSProtectOverlayPatch.cpp index 97494ef..feb48ff 100644 --- a/arm9/source/patches/arm9/OverlayPatches/DSProtectPatches/DSProtectOverlayPatch.cpp +++ b/arm9/source/patches/arm9/OverlayPatches/DSProtectPatches/DSProtectOverlayPatch.cpp @@ -1,7 +1,5 @@ #include "common.h" #include "../../../PatchContext.h" -#include "thumbInstructions.h" -#include "gameCode.h" #include "DSProtectOverlayPatchAsm.h" #include "DSProtectOverlayPatch.h" @@ -23,7 +21,10 @@ const void* DSProtectOverlayPatch::InsertPatch(PatchContext& patchContext) { - ConfigurePatch(patchContext); + // Next patch and target overlay ID + dsprotectpatch_nextAddress = next ? (const void*)next->InsertPatch(patchContext) : nullptr; + dsprotectpatch_overlayId = _overlayId; + CalculateOffsets(); u32 patchSize = SECTION_SIZE(dsprotectpatch); void* patchAddress = patchContext.GetPatchHeap().Alloc(patchSize); @@ -33,12 +34,21 @@ const void* DSProtectOverlayPatch::InsertPatch(PatchContext& patchContext) return (const void*)entryAddress; } -void DSProtectOverlayPatch::ConfigurePatch(PatchContext& patchContext) const +void DSProtectOverlayPatch::ApplyPatchForStaticArm9(u32 arm9LoadAddress) const { - // Next patch and target overlay ID - dsprotectpatch_nextAddress = next ? (const void*)next->InsertPatch(patchContext) : nullptr; - dsprotectpatch_overlayId = _overlayId; + u32 fakeOverlayInfo[2]; + fakeOverlayInfo[0] = _overlayId; // ovy_id + fakeOverlayInfo[1] = arm9LoadAddress; // ram_start + dsprotectpatch_nextAddress = nullptr; + dsprotectpatch_overlayId = _overlayId; + CalculateOffsets(); + + dsprotectpatch_executeWithParam(fakeOverlayInfo); +} + +void DSProtectOverlayPatch::CalculateOffsets() const +{ u32 regionOffset = _overlayOffset; // Default invalid, enable below diff --git a/arm9/source/patches/arm9/OverlayPatches/DSProtectPatches/DSProtectOverlayPatch.h b/arm9/source/patches/arm9/OverlayPatches/DSProtectPatches/DSProtectOverlayPatch.h index 8c27437..e085c51 100644 --- a/arm9/source/patches/arm9/OverlayPatches/DSProtectPatches/DSProtectOverlayPatch.h +++ b/arm9/source/patches/arm9/OverlayPatches/DSProtectPatches/DSProtectOverlayPatch.h @@ -10,6 +10,7 @@ public: : _overlayId(overlayId), _overlayOffset(overlayOffset), _version(version), _functionMask(functionMask) { } const void* InsertPatch(PatchContext& patchContext) override; + void ApplyPatchForStaticArm9(u32 arm9LoadAddress) const; private: u32 _overlayId; @@ -17,5 +18,5 @@ private: DSProtectVersion _version; u32 _functionMask; - void ConfigurePatch(PatchContext& patchContext) const; + void CalculateOffsets() const; }; diff --git a/arm9/source/patches/arm9/OverlayPatches/DSProtectPatches/DSProtectOverlayPatchAsm.h b/arm9/source/patches/arm9/OverlayPatches/DSProtectPatches/DSProtectOverlayPatchAsm.h index 4bc749a..858492a 100644 --- a/arm9/source/patches/arm9/OverlayPatches/DSProtectPatches/DSProtectOverlayPatchAsm.h +++ b/arm9/source/patches/arm9/OverlayPatches/DSProtectPatches/DSProtectOverlayPatchAsm.h @@ -4,11 +4,12 @@ DEFINE_SECTION_SYMBOLS(dsprotectpatch); extern "C" void dsprotectpatch_entry(); +extern "C" void dsprotectpatch_executeWithParam(u32* overlayInfo); extern u32 dsprotectpatch_patchType; // 0=write dsprotectpatch_writeWord, 1=copy subsequent word extern u32 dsprotectpatch_writeWord; // Word to write if dsprotectpatch_patchType=0 -extern u32 dsprotectpatch_offsetA1; // Target offset for A1 (0xFFFFFFFF=invalid) -extern u32 dsprotectpatch_offsetNotA1; // Target offset for NotA1 (0xFFFFFFFF=invalid) +extern u32 dsprotectpatch_offsetA1; // Target offset for A1 (0x8xxxxxxx=invalid) +extern u32 dsprotectpatch_offsetNotA1; // Target offset for NotA1 (0x8xxxxxxx=invalid) extern u32 dsprotectpatch_overlayId; // Target overlay ID extern const void* dsprotectpatch_nextAddress; // Next patch address diff --git a/arm9/source/patches/arm9/OverlayPatches/DSProtectPatches/DSProtectOverlayPatchAsm.s b/arm9/source/patches/arm9/OverlayPatches/DSProtectPatches/DSProtectOverlayPatchAsm.s index d90231e..1c7f0ce 100644 --- a/arm9/source/patches/arm9/OverlayPatches/DSProtectPatches/DSProtectOverlayPatchAsm.s +++ b/arm9/source/patches/arm9/OverlayPatches/DSProtectPatches/DSProtectOverlayPatchAsm.s @@ -86,4 +86,16 @@ dsprotectpatch_nextAddress: .pool +.text + +.global dsprotectpatch_executeWithParam +.type dsprotectpatch_executeWithParam, %function +dsprotectpatch_executeWithParam: + push {r5, lr} + movs r5, r0 + bl dsprotectpatch_entry + pop {r5, pc} + +.pool + .end diff --git a/data/aplist.csv b/data/aplist.csv index 2f45985..83610fd 100644 --- a/data/aplist.csv +++ b/data/aplist.csv @@ -64,6 +64,7 @@ B7KJ;0;1.28;111111;41;0x0;-1;0x0 B7XJ;0;1.26;111111;0;0x0;-1;0x0 B86E;0;2.01;111111;0;0x0;-1;0x0 B86P;0;2.01;111111;0;0x0;-1;0x0 +B89J;0;1.08;111111;-2;0x1145AC;-1;0x0 B8RJ;0;1.27;111111;7;0x0;-1;0x0 BA5P;0;1.27;111111;0;0x0;-1;0x0 BA7J;2;2.00;111111;0;0x0;-1;0x0 @@ -309,6 +310,8 @@ C6OJ;0;1.26;111111;2;0x0;-1;0x0 CA5E;0;1.25;111111;0;0x0;-1;0x0 CBEJ;0;1.08;111111;-2;0x314dc;-1;0x0 CCTJ;0;1.05;10101;-2;0x3caa0;-1;0x0 +CCUJ;0;1.06;010101;-2;0xAF5BC;-1;0x0 +CCUJ;1;1.06;010101;-2;0xAF9F0;-1;0x0 CDOK;0;1.20;111111;0;0x0;-1;0x0 CFIE;0;1.06;10101;-2;0xcaa60;-1;0x0 CFIJ;0;1.06;10101;-2;0xca9a8;-1;0x0 @@ -319,6 +322,7 @@ CJRP;0;1.28;111111;2;0xd0;-1;0x0 CKDJ;0;1.20;111111;-2;0x6c360;-1;0x0 CL4K;0;1.28;111111;0;0x0;-1;0x0 CLJE;0;1.20;10110;138;0x0;-1;0x0 +CLJJ;0;1.06;111111;4;0x4A4FC;-1;0x0 CLJK;0;2.03;111111;138;0x0;-1;0x0 CLJP;0;1.20;10110;138;0x0;-1;0x0 CLPD;0;2.03;111111;1;0x0;-1;0x0 @@ -439,6 +443,7 @@ V2GE;1;1.28;111111;15;0x0;-1;0x0 V2GE;2;1.28;111111;15;0x0;-1;0x0 V2GJ;0;1.28;111111;15;0x0;-1;0x0 V2GV;0;1.28;111111;15;0x0;-1;0x0 +VAAE;0;1.26;111111;0;0x0;-1;0x0 VAAJ;0;1.26;111111;0;0x0;-1;0x0 VAAK;0;1.26;111111;0;0x0;-1;0x0 VAAV;0;1.26;111111;0;0x0;-1;0x0 From 48d49f5df823467741f47f04b991d9fbf1e81e76 Mon Sep 17 00:00:00 2001 From: taxicat1 <32942550+taxicat1@users.noreply.github.com> Date: Wed, 10 Dec 2025 16:02:00 -0500 Subject: [PATCH 2/3] Fix whitespace --- .../DSProtectPatches/DSProtectOverlayPatchAsm.s | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/arm9/source/patches/arm9/OverlayPatches/DSProtectPatches/DSProtectOverlayPatchAsm.s b/arm9/source/patches/arm9/OverlayPatches/DSProtectPatches/DSProtectOverlayPatchAsm.s index 1c7f0ce..12ddbf2 100644 --- a/arm9/source/patches/arm9/OverlayPatches/DSProtectPatches/DSProtectOverlayPatchAsm.s +++ b/arm9/source/patches/arm9/OverlayPatches/DSProtectPatches/DSProtectOverlayPatchAsm.s @@ -91,10 +91,10 @@ dsprotectpatch_nextAddress: .global dsprotectpatch_executeWithParam .type dsprotectpatch_executeWithParam, %function dsprotectpatch_executeWithParam: - push {r5, lr} - movs r5, r0 - bl dsprotectpatch_entry - pop {r5, pc} + push {r5, lr} + movs r5, r0 + bl dsprotectpatch_entry + pop {r5, pc} .pool From e8b2f51497955364b9ac26e7f7291344f9f4bc91 Mon Sep 17 00:00:00 2001 From: taxicat1 <32942550+taxicat1@users.noreply.github.com> Date: Wed, 10 Dec 2025 21:52:18 -0500 Subject: [PATCH 3/3] Add some missing Rev 1 games to aplist --- data/aplist.csv | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/data/aplist.csv b/data/aplist.csv index 83610fd..dd7221c 100644 --- a/data/aplist.csv +++ b/data/aplist.csv @@ -79,6 +79,7 @@ BCDK;0;2.01;111111;-1;0x0;0;0x0 BCJK;0;2.01;111111;28;0x0;29;0x0 BCKJ;0;1.25;111111;0;0x0;-1;0x0 BCXJ;0;1.25;111111;11;0x0;-1;0x0 +BCXJ;1;1.25;111111;11;0x0;-1;0x0 BD2E;0;1.23;111111;2;0x0;-1;0x0 BD2J;0;1.23;111111;2;0x0;-1;0x0 BD2P;0;1.23;111111;2;0x0;-1;0x0 @@ -139,13 +140,16 @@ BJCI;0;1.28;111111;4;0x0;-1;0x0 BJCP;0;1.28;111111;4;0x0;-1;0x0 BJKJ;0;1.26;111111;7;0x0;-1;0x0 BK3J;0;1.23;111111;18;0x4bf8;-1;0x0 +BK3J;1;1.23;111111;18;0x4c00;-1;0x0 BK9E;0;1.28;111111;104;0x0;-1;0x0 BK9J;0;1.28;111111;104;0x0;-1;0x0 BK9P;0;1.28;111111;104;0x0;-1;0x0 BKCE;0;1.22;10110;0;0x0;-1;0x0 BKIE;0;1.23Z;111111;1;0xa504;-1;0x0 +BKIE;1;1.23Z;111111;1;0xa504;-1;0x0 BKIJ;0;1.23Z;111111;1;0xa538;-1;0x0 BKIP;0;1.23Z;111111;1;0xa504;-1;0x0 +BKIP;1;1.23Z;111111;1;0xa504;-1;0x0 BKJJ;0;1.23;111111;7;0x0;-1;0x0 BKKJ;0;1.25;111111;-2;0x5a44c;-1;0x0 BKMJ;0;1.23;111111;3;0x0;-1;0x0 @@ -467,6 +471,7 @@ VCPJ;0;1.26;111111;0;0x0;-1;0x0 VCTJ;0;2.01;111111;0;0x0;-1;0x0 VDEE;0;2.03;111111;15;0x0;16;0x0 VDEJ;0;2.01;111111;15;0x0;16;0x0 +VDEJ;1;2.01;111111;15;0x0;16;0x0 VEBJ;0;2.03;111111;0;0x3b0;-1;0x0 VETP;0;1.27;111111;52;0x0;-1;0x0 VFBE;0;1.23;111111;12;0x0;-1;0x0 @@ -489,9 +494,11 @@ VPFE;0;1.26;111111;5;0x0;-1;0x0 VPFV;0;1.27;111111;5;0x0;-1;0x0 VPLJ;0;1.28;111111;32;0x0;-1;0x0 VPTJ;0;1.22;111111;30;0x0;-1;0x0 +VPTJ;1;1.22;111111;30;0x0;-1;0x0 VPYJ;0;2.03;111111;9;0x0;8;0x0 VPYP;0;2.05;111111;9;0x0;8;0x0 VPYT;0;2.05;111111;9;0x0;8;0x0 +VPYT;1;2.05;111111;9;0x0;8;0x0 VS3E;0;1.28;111111;2;0x0;-1;0x0 VS3V;0;1.28;111111;2;0x0;-1;0x0 VSNE;0;1.23;111111;1;0x0;-1;0x0 @@ -530,6 +537,7 @@ YFYK;0;1.00_2;110011;-2;0x69d40;-1;0x0 YG4K;0;1.08;10101;2;0x0;-1;0x0 YKGE;0;1.10;111111;28;0x0;-1;0x0 YKGJ;0;1.08;111111;28;0x0;-1;0x0 +YKGJ;1;1.10;111111;26;0x0;-1;0x0 YKGP;0;1.10;111111;28;0x0;-1;0x0 YLUJ;0;1.22;111111;-2;0x7a678;-1;0x0 YLUP;0;1.27;111111;-2;0x7d554;-1;0x0