From dda94490bec2ee8369055b85a10a0c92820935f1 Mon Sep 17 00:00:00 2001 From: Mow <32942550+taxicat1@users.noreply.github.com> Date: Fri, 29 May 2026 03:54:03 -0400 Subject: [PATCH] Add CARDi_ReadCard signature support for "Minna no Mahjong DS" (#182) --- CHANGELOG.md | 1 + .../patches/arm9/sdk2to4/CardiReadCardPatch.cpp | 14 ++++++++++++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f645b82..225bcf1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ - AP patches for NRL Mascot Mania and AFL Mascot Manor - by @taxicat1 - Houkago Shounen race condition patch - by @taxicat1 - Race condition patch for Ultimate Mortal Kombat (USA) and (Europe) - by @taxicat1 +- Card read patch for Minna no Mahjong DS - by @taxicat1 ### Fixed - DMA card read offsets for Pokemon Ranger (EU) - by @taxicat1 diff --git a/arm9/source/patches/arm9/sdk2to4/CardiReadCardPatch.cpp b/arm9/source/patches/arm9/sdk2to4/CardiReadCardPatch.cpp index 1c6e169..d48e7b5 100644 --- a/arm9/source/patches/arm9/sdk2to4/CardiReadCardPatch.cpp +++ b/arm9/source/patches/arm9/sdk2to4/CardiReadCardPatch.cpp @@ -14,7 +14,7 @@ static const u32 sCARDiReadCardPatternUnknown[] = { 0xE92D4FF0u, 0xE24DD004u, 0x static const u32 sCARDiReadCardPatternSdk20029A7[] = { 0xE92D4FF0u, 0xE24DD004u, 0xE1A0A000u, 0xE59F90E0u }; static const u32 sCARDiReadCardPatternSdk2004E8BPingPals[] = { 0xE92D4FF0u, 0xE24DD004u, 0xE1A0A000u, 0xE59F90FCu }; static const u32 sCARDiReadCardPatternSdk2004F4CThumb[] = { 0xB083B5F0u, 0x4E279000u, 0x30209001u, 0x4F269001u }; -static const u32 sCARDiReadCardPatternSdk2004F4DDebug[] = { 0xE92D47F0u, 0xE1A05000u, 0xE59F40D4u, 0xE5941018u }; +static const u32 sCARDiReadCardPatternSdk2007530MinnaNoMahjong[] = { 0xE92D47F0u, 0xE1A05000u, 0xE59F40D4u, 0xE5941018u }; static const u32 sCARDiReadCardPatternSdk2027533ThumbChouSoujuu[] = { 0xB083B5F0u, 0x4E259000u, 0x30209001u, 0x4F249001u }; static const u32 sCARDiReadCardPatternSdk3027530Thumb[] = { 0xB082B5F8u, 0x90019000u, 0x90013020u, 0x69C24825u }; static const u32 sCARDiReadCardPatternSdk4002774[] = { 0xE92D4070u, 0xE59F40D0u, 0xE1A06000u, 0xE3A00C02u }; @@ -78,7 +78,7 @@ bool CardiReadCardPatch::FindPatchTarget(PatchContext& patchContext) if (patchContext.GetSdkVersion().GetMajor() <= SDK_VERSION_MAJOR_NITRO_2) { if (!_cardiReadCard) - TryPattern(patchContext, sCARDiReadCardPatternSdk2004F4DDebug, sizeof(sCARDiReadCardPatternSdk2004F4DDebug)); + TryPattern(patchContext, sCARDiReadCardPatternSdk2007530MinnaNoMahjong, sizeof(sCARDiReadCardPatternSdk2007530MinnaNoMahjong)); if (!_cardiReadCard) TryPattern(patchContext, sCARDiReadCardPatternSdk2004E8BPingPals, sizeof(sCARDiReadCardPatternSdk2004E8BPingPals)); } @@ -270,6 +270,16 @@ void CardiReadCardPatch::ApplyPatch(PatchContext& patchContext) patch_cardireadcard_adjust_cardicommon_offset = THUMB_SUBS_IMM(THUMB_R6, THUMB_R6, 4); patch_cardireadcard_mov_r3_to_dst = THUMB_MOV_HIREG(THUMB_HI_R8, THUMB_R3); } + else if (_foundPattern == sCARDiReadCardPatternSdk2007530MinnaNoMahjong) + { + patchOffset = 0x54; + patch_cardireadcard_return_offset = THUMB_MOVS_IMM(THUMB_R0, 0x50); + patch_cardireadcard_mov_src_to_r0 = THUMB_MOVS_REG(THUMB_R0, THUMB_R1); // src + patch_cardireadcard_mov_dst_to_r1 = THUMB_MOVS_REG(THUMB_R1, THUMB_R7); // dst + patch_cardireadcard_mov_cardicommon_to_r6 = THUMB_MOVS_REG(THUMB_R6, THUMB_R4); + patch_cardireadcard_adjust_cardicommon_offset = THUMB_SUBS_IMM(THUMB_R6, THUMB_R6, 4); + patch_cardireadcard_mov_r3_to_dst = THUMB_MOVS_REG(THUMB_R7, THUMB_R3); + } else { LOG_FATAL("Unsupported CARDi_ReadCard pattern\n");