mirror of
https://github.com/LNH-team/pico-loader.git
synced 2026-06-02 09:16:49 +02:00
Refactored some code in Arm9Patcher
This commit is contained in:
@@ -32,9 +32,9 @@
|
|||||||
|
|
||||||
typedef void (*uncompress_func_t)(void* compressedEnd);
|
typedef void (*uncompress_func_t)(void* compressedEnd);
|
||||||
|
|
||||||
static const u32 sMiiUncompressBackwardPatternOld[] = { 0xE3500000, 0x0A000025, 0xE92D00F0, 0xE9100006 }; // mkds beta; version 0x2012774
|
static const u32 sMiiUncompressBackwardPatternOld[] = { 0xE3500000, 0x0A000025, 0xE92D00F0, 0xE9100006 };
|
||||||
static const u32 sMiiUncompressBackwardPatternOld2[] = { 0xE3500000, 0x0A00002B, 0xE92D00F0, 0xE9100006 }; // asterix & obelix xxl 2; version 0x3017531
|
static const u32 sMiiUncompressBackwardPatternOld2[] = { 0xE3500000, 0x0A00002B, 0xE92D00F0, 0xE9100006 };
|
||||||
static const u32 sMiiUncompressBackwardPattern[] = { 0xE3500000, 0x0A000027, 0xE92D00F0, 0xE9100006 }; // mkds
|
static const u32 sMiiUncompressBackwardPattern[] = { 0xE3500000, 0x0A000027, 0xE92D00F0, 0xE9100006 };
|
||||||
static const u32 sMiiUncompressBackwardPatternHybrid[] = { 0xE3500000, 0x0A000029, 0xE92D01F0, 0xE9100006 };
|
static const u32 sMiiUncompressBackwardPatternHybrid[] = { 0xE3500000, 0x0A000029, 0xE92D01F0, 0xE9100006 };
|
||||||
|
|
||||||
void Arm9Patcher::ApplyPatches(const LoaderPlatform* loaderPlatform, const ApListEntry* apListEntry,
|
void Arm9Patcher::ApplyPatches(const LoaderPlatform* loaderPlatform, const ApListEntry* apListEntry,
|
||||||
@@ -42,13 +42,11 @@ void Arm9Patcher::ApplyPatches(const LoaderPlatform* loaderPlatform, const ApLis
|
|||||||
{
|
{
|
||||||
auto romHeader = (const nds_header_ntr_t*)TWL_SHARED_MEMORY->ntrSharedMem.romHeader;
|
auto romHeader = (const nds_header_ntr_t*)TWL_SHARED_MEMORY->ntrSharedMem.romHeader;
|
||||||
auto twlRomHeader = (const nds_header_twl_t*)TWL_SHARED_MEMORY->twlRomHeader;
|
auto twlRomHeader = (const nds_header_twl_t*)TWL_SHARED_MEMORY->twlRomHeader;
|
||||||
ModuleParamsLocator moduleParamsLocator;
|
|
||||||
auto moduleParams = moduleParamsLocator.FindModuleParams(romHeader);
|
|
||||||
u32 arm9Size = romHeader->arm9Size;
|
u32 arm9Size = romHeader->arm9Size;
|
||||||
u32 arm9iSize = romHeader->IsTwlRom() ? twlRomHeader->arm9iSize : 0;
|
u32 arm9iSize = romHeader->IsTwlRom() ? twlRomHeader->arm9iSize : 0;
|
||||||
SdkVersion sdkVersion = moduleParams ? moduleParams->sdkVersion : 0u;
|
|
||||||
u32 compressedEnd = 0;
|
u32 compressedEnd = 0;
|
||||||
PatchCollection patchCollection;
|
auto moduleParams = ModuleParamsLocator().FindModuleParams(romHeader);
|
||||||
|
SdkVersion sdkVersion = moduleParams ? moduleParams->sdkVersion : 0u;
|
||||||
if (moduleParams)
|
if (moduleParams)
|
||||||
{
|
{
|
||||||
LOG_DEBUG("Module params found at 0x%p\n", moduleParams);
|
LOG_DEBUG("Module params found at 0x%p\n", moduleParams);
|
||||||
@@ -56,18 +54,7 @@ void Arm9Patcher::ApplyPatches(const LoaderPlatform* loaderPlatform, const ApLis
|
|||||||
const u32* miiUncompressBackward = nullptr;
|
const u32* miiUncompressBackward = nullptr;
|
||||||
if (moduleParams->compressedEnd)
|
if (moduleParams->compressedEnd)
|
||||||
{
|
{
|
||||||
const u32* miiUncompressBackwardPattern;
|
miiUncompressBackward = FindMIiUncompressBackward(romHeader->arm9LoadAddress, sdkVersion);
|
||||||
if (sdkVersion <= 0x2017532)
|
|
||||||
miiUncompressBackwardPattern = sMiiUncompressBackwardPatternOld;
|
|
||||||
else
|
|
||||||
miiUncompressBackwardPattern = sMiiUncompressBackwardPattern;
|
|
||||||
|
|
||||||
miiUncompressBackward = fastSearch16((const u32*)romHeader->arm9LoadAddress, 0x1000, miiUncompressBackwardPattern);
|
|
||||||
if (!sdkVersion.IsTwlSdk() && !miiUncompressBackward)
|
|
||||||
miiUncompressBackward = fastSearch16((const u32*)romHeader->arm9LoadAddress, 0x1000, sMiiUncompressBackwardPatternOld2);
|
|
||||||
if (sdkVersion.IsTwlSdk() && !miiUncompressBackward)
|
|
||||||
miiUncompressBackward = fastSearch16((const u32*)romHeader->arm9LoadAddress, 0x1000, sMiiUncompressBackwardPatternHybrid);
|
|
||||||
|
|
||||||
if (miiUncompressBackward)
|
if (miiUncompressBackward)
|
||||||
{
|
{
|
||||||
arm9Size = moduleParams->compressedEnd + *(u32*)(moduleParams->compressedEnd - 4) - romHeader->arm9LoadAddress;
|
arm9Size = moduleParams->compressedEnd + *(u32*)(moduleParams->compressedEnd - 4) - romHeader->arm9LoadAddress;
|
||||||
@@ -85,9 +72,8 @@ void Arm9Patcher::ApplyPatches(const LoaderPlatform* loaderPlatform, const ApLis
|
|||||||
{
|
{
|
||||||
auto arm9iModuleParams = (module_params_twl_t*)(romHeader->arm9LoadAddress + twlRomHeader->arm9iModuleParamsAddress);
|
auto arm9iModuleParams = (module_params_twl_t*)(romHeader->arm9LoadAddress + twlRomHeader->arm9iModuleParamsAddress);
|
||||||
if (arm9iModuleParams->magicBigEndian == MODULE_PARAMS_TWL_MAGIC_BE &&
|
if (arm9iModuleParams->magicBigEndian == MODULE_PARAMS_TWL_MAGIC_BE &&
|
||||||
arm9iModuleParams->magicLittleEndian == MODULE_PARAMS_TWL_MAGIC_LE)
|
arm9iModuleParams->magicLittleEndian == MODULE_PARAMS_TWL_MAGIC_LE &&
|
||||||
{
|
arm9iModuleParams->compressedEnd != 0)
|
||||||
if (arm9iModuleParams->compressedEnd)
|
|
||||||
{
|
{
|
||||||
LOG_DEBUG("Compressed arm9i found\n");
|
LOG_DEBUG("Compressed arm9i found\n");
|
||||||
if (miiUncompressBackward)
|
if (miiUncompressBackward)
|
||||||
@@ -104,7 +90,6 @@ void Arm9Patcher::ApplyPatches(const LoaderPlatform* loaderPlatform, const ApLis
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
LOG_DEBUG("Module params not found!\n");
|
LOG_DEBUG("Module params not found!\n");
|
||||||
@@ -125,6 +110,7 @@ void Arm9Patcher::ApplyPatches(const LoaderPlatform* loaderPlatform, const ApLis
|
|||||||
romHeader->gameCode,
|
romHeader->gameCode,
|
||||||
loaderPlatform
|
loaderPlatform
|
||||||
};
|
};
|
||||||
|
PatchCollection patchCollection;
|
||||||
if (sdkVersion != 0)
|
if (sdkVersion != 0)
|
||||||
{
|
{
|
||||||
if (*(vu32*)0x02FFF00C == GAMECODE("ADAJ") &&
|
if (*(vu32*)0x02FFF00C == GAMECODE("ADAJ") &&
|
||||||
@@ -180,13 +166,56 @@ void Arm9Patcher::ApplyPatches(const LoaderPlatform* loaderPlatform, const ApLis
|
|||||||
}
|
}
|
||||||
|
|
||||||
patchCollection.AddPatch(new CardiReadRomIdCorePatch());
|
patchCollection.AddPatch(new CardiReadRomIdCorePatch());
|
||||||
|
|
||||||
patchCollection.AddPatch(new OSResetSystemPatch(loaderInfo));
|
patchCollection.AddPatch(new OSResetSystemPatch(loaderInfo));
|
||||||
|
AddGamePatches(patchCollection, romHeader->gameCode, apListEntry);
|
||||||
|
|
||||||
|
if (moduleParams && compressedEnd != 0)
|
||||||
|
{
|
||||||
|
AddRestoreCompressedEndPatch(
|
||||||
|
patchContext,
|
||||||
|
romHeader->arm9AutoLoadDoneHookAddress,
|
||||||
|
&moduleParams->compressedEnd,
|
||||||
|
compressedEnd);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!patchCollection.TryPerformPatches(patchContext))
|
||||||
|
{
|
||||||
|
ErrorDisplay().PrintError("Failed to apply arm9 patches.");
|
||||||
|
}
|
||||||
|
dc_flushAll();
|
||||||
|
dc_drainWriteBuffer();
|
||||||
|
ic_invalidateAll();
|
||||||
|
}
|
||||||
|
|
||||||
|
const u32* Arm9Patcher::FindMIiUncompressBackward(u32 arm9LoadAddress, SdkVersion sdkVersion) const
|
||||||
|
{
|
||||||
|
const u32* miiUncompressBackwardPattern;
|
||||||
|
if (sdkVersion <= 0x2017532)
|
||||||
|
{
|
||||||
|
miiUncompressBackwardPattern = sMiiUncompressBackwardPatternOld;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
miiUncompressBackwardPattern = sMiiUncompressBackwardPattern;
|
||||||
|
}
|
||||||
|
|
||||||
|
const u32* miiUncompressBackward = fastSearch16((const u32*)arm9LoadAddress, 0x1000, miiUncompressBackwardPattern);
|
||||||
|
if (!sdkVersion.IsTwlSdk() && !miiUncompressBackward)
|
||||||
|
{
|
||||||
|
miiUncompressBackward = fastSearch16((const u32*)arm9LoadAddress, 0x1000, sMiiUncompressBackwardPatternOld2);
|
||||||
|
}
|
||||||
|
if (sdkVersion.IsTwlSdk() && !miiUncompressBackward)
|
||||||
|
{
|
||||||
|
miiUncompressBackward = fastSearch16((const u32*)arm9LoadAddress, 0x1000, sMiiUncompressBackwardPatternHybrid);
|
||||||
|
}
|
||||||
|
|
||||||
|
return miiUncompressBackward;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Arm9Patcher::AddGamePatches(PatchCollection& patchCollection, u32 gameCode, const ApListEntry* apListEntry) const
|
||||||
|
{
|
||||||
OverlayHookPatch* overlayHookPatch;
|
OverlayHookPatch* overlayHookPatch;
|
||||||
if (romHeader->gameCode == GAMECODE("BO5P") ||
|
if (gameCode == GAMECODE("BO5P") || gameCode == GAMECODE("BO5E") || gameCode == GAMECODE("BO5J"))
|
||||||
romHeader->gameCode == GAMECODE("BO5E") ||
|
|
||||||
romHeader->gameCode == GAMECODE("BO5J"))
|
|
||||||
{
|
{
|
||||||
overlayHookPatch = new GoldenSunDarkDawnOverlayHookPatch();
|
overlayHookPatch = new GoldenSunDarkDawnOverlayHookPatch();
|
||||||
overlayHookPatch->AddOverlayPatch(new DSProtectOverlayPatch(334, 0, DSProtectVersion::v2_01, ~0u));
|
overlayHookPatch->AddOverlayPatch(new DSProtectOverlayPatch(334, 0, DSProtectVersion::v2_01, ~0u));
|
||||||
@@ -197,6 +226,17 @@ void Arm9Patcher::ApplyPatches(const LoaderPlatform* loaderPlatform, const ApLis
|
|||||||
overlayHookPatch = new FsStartOverlayHookPatch();
|
overlayHookPatch = new FsStartOverlayHookPatch();
|
||||||
if (apListEntry)
|
if (apListEntry)
|
||||||
{
|
{
|
||||||
|
AddDSProtectPatches(patchCollection, overlayHookPatch, apListEntry);
|
||||||
|
}
|
||||||
|
AddGameSpecificPatches(patchCollection, overlayHookPatch, gameCode);
|
||||||
|
}
|
||||||
|
|
||||||
|
patchCollection.AddPatch(overlayHookPatch);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Arm9Patcher::AddDSProtectPatches(
|
||||||
|
PatchCollection& patchCollection, OverlayHookPatch* overlayHookPatch, const ApListEntry* apListEntry) const
|
||||||
|
{
|
||||||
u32 regularOverlayId = apListEntry->GetRegularOverlayId();
|
u32 regularOverlayId = apListEntry->GetRegularOverlayId();
|
||||||
if (regularOverlayId != AP_LIST_OVERLAY_ID_INVALID)
|
if (regularOverlayId != AP_LIST_OVERLAY_ID_INVALID)
|
||||||
{
|
{
|
||||||
@@ -229,8 +269,12 @@ void Arm9Patcher::ApplyPatches(const LoaderPlatform* loaderPlatform, const ApLis
|
|||||||
sOverlayId, apListEntry->GetSOffset(), version, ~0u));
|
sOverlayId, apListEntry->GetSOffset(), version, ~0u));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
switch (romHeader->gameCode)
|
|
||||||
|
void Arm9Patcher::AddGameSpecificPatches(
|
||||||
|
PatchCollection& patchCollection, OverlayHookPatch* overlayHookPatch, u32 gameCode) const
|
||||||
|
{
|
||||||
|
switch (gameCode)
|
||||||
{
|
{
|
||||||
// Pokemon HeartGold & SoulSilver
|
// Pokemon HeartGold & SoulSilver
|
||||||
case GAMECODE("IPGD"):
|
case GAMECODE("IPGD"):
|
||||||
@@ -290,25 +334,6 @@ void Arm9Patcher::ApplyPatches(const LoaderPlatform* loaderPlatform, const ApLis
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
patchCollection.AddPatch(overlayHookPatch);
|
|
||||||
|
|
||||||
if (moduleParams && compressedEnd != 0)
|
|
||||||
{
|
|
||||||
AddRestoreCompressedEndPatch(
|
|
||||||
patchContext,
|
|
||||||
romHeader->arm9AutoLoadDoneHookAddress,
|
|
||||||
&moduleParams->compressedEnd,
|
|
||||||
compressedEnd);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!patchCollection.TryPerformPatches(patchContext))
|
|
||||||
{
|
|
||||||
ErrorDisplay().PrintError("Failed to apply arm9 patches.");
|
|
||||||
}
|
|
||||||
dc_flushAll();
|
|
||||||
dc_drainWriteBuffer();
|
|
||||||
ic_invalidateAll();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Arm9Patcher::AddRestoreCompressedEndPatch(PatchContext& patchContext,
|
void Arm9Patcher::AddRestoreCompressedEndPatch(PatchContext& patchContext,
|
||||||
|
|||||||
@@ -1,9 +1,12 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include "LoaderInfo.h"
|
#include "LoaderInfo.h"
|
||||||
|
#include "SdkVersion.h"
|
||||||
|
|
||||||
class ApListEntry;
|
class ApListEntry;
|
||||||
class LoaderPlatform;
|
class LoaderPlatform;
|
||||||
class PatchContext;
|
class PatchContext;
|
||||||
|
class PatchCollection;
|
||||||
|
class OverlayHookPatch;
|
||||||
|
|
||||||
/// @brief Class for patching the arm9 of retail roms.
|
/// @brief Class for patching the arm9 of retail roms.
|
||||||
class Arm9Patcher
|
class Arm9Patcher
|
||||||
@@ -18,6 +21,12 @@ public:
|
|||||||
bool isCloneBootRom, const loader_info_t* loaderInfo) const;
|
bool isCloneBootRom, const loader_info_t* loaderInfo) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
const u32* FindMIiUncompressBackward(u32 arm9LoadAddress, SdkVersion sdkVersion) const;
|
||||||
|
void AddGamePatches(PatchCollection& patchCollection, u32 gameCode, const ApListEntry* apListEntry) const;
|
||||||
|
void AddDSProtectPatches(PatchCollection& patchCollection,
|
||||||
|
OverlayHookPatch* overlayHookPatch, const ApListEntry* apListEntry) const;
|
||||||
|
void AddGameSpecificPatches(PatchCollection& patchCollection,
|
||||||
|
OverlayHookPatch* overlayHookPatch, u32 gameCode) const;
|
||||||
void AddRestoreCompressedEndPatch(PatchContext& patchContext,
|
void AddRestoreCompressedEndPatch(PatchContext& patchContext,
|
||||||
u32 arm9AutoLoadDoneHookAddress, u32* moduleParamsCompressedEnd, u32 originalCompressedEndValue) const;
|
u32 arm9AutoLoadDoneHookAddress, u32* moduleParamsCompressedEnd, u32 originalCompressedEndValue) const;
|
||||||
u32 GetAvailableParentSectionSpace() const;
|
u32 GetAvailableParentSectionSpace() const;
|
||||||
|
|||||||
Reference in New Issue
Block a user