From b072a7e9fc969983bbada76b384b6976b60f597a Mon Sep 17 00:00:00 2001 From: Luminyx <27lumi@protonmail.com> Date: Sat, 7 Feb 2026 02:49:19 -0500 Subject: [PATCH] Callbacks --- src/Cafe/GraphicPack/GraphicPack2.h | 6 +++++- src/Cafe/GraphicPack/GraphicPack2Patches.h | 1 + .../GraphicPack/GraphicPack2PatchesApply.cpp | 15 +++++++++++++++ .../GraphicPack/GraphicPack2PatchesParser.cpp | 18 +++++++++++++++++- src/Cafe/OS/libs/coreinit/coreinit_Init.cpp | 9 +++++++++ 5 files changed, 47 insertions(+), 2 deletions(-) diff --git a/src/Cafe/GraphicPack/GraphicPack2.h b/src/Cafe/GraphicPack/GraphicPack2.h index 9421e4fa..062ecb75 100644 --- a/src/Cafe/GraphicPack/GraphicPack2.h +++ b/src/Cafe/GraphicPack/GraphicPack2.h @@ -123,6 +123,8 @@ public: const std::vector& GetTitleIds() const { return m_title_ids; } bool HasCustomVSyncFrequency() const { return m_vsync_frequency >= 1; } sint32 GetCustomVSyncFrequency() const { return m_vsync_frequency; } + + const std::vector& GetCallbacks() const { return m_callbacks; } // texture rules const std::vector& GetTextureRules() const { return m_texture_rules; } @@ -230,7 +232,7 @@ private: bool m_activated = false; // set if the graphic pack is currently used by the running game std::vector m_title_ids; bool m_patchedFilesLoaded = false; // set to true once patched files are loaded - bool m_universal = false; // set if this pack applies to every titl eid + bool m_universal = false; // set if this pack applies to every title id sint32 m_vsync_frequency = -1; sint32 m_fs_priority = 100; @@ -284,6 +286,8 @@ private: void LogPatchesSyntaxError(sint32 lineNumber, std::string_view errorMsg); std::vector list_patchGroups; + + std::vector m_callbacks; static std::recursive_mutex mtx_patches; static std::vector list_modules; diff --git a/src/Cafe/GraphicPack/GraphicPack2Patches.h b/src/Cafe/GraphicPack/GraphicPack2Patches.h index b33cabf9..c5916d36 100644 --- a/src/Cafe/GraphicPack/GraphicPack2Patches.h +++ b/src/Cafe/GraphicPack/GraphicPack2Patches.h @@ -256,6 +256,7 @@ private: std::string name; std::vector list_moduleMatches; std::vector list_patches; + std::vector list_callbacks; uint32 codeCaveSize; MEMPTR codeCaveMem; bool m_isApplied{}; diff --git a/src/Cafe/GraphicPack/GraphicPack2PatchesApply.cpp b/src/Cafe/GraphicPack/GraphicPack2PatchesApply.cpp index b6af542d..b6dfe6f1 100644 --- a/src/Cafe/GraphicPack/GraphicPack2PatchesApply.cpp +++ b/src/Cafe/GraphicPack/GraphicPack2PatchesApply.cpp @@ -710,6 +710,21 @@ void GraphicPack2::ApplyPatchGroups(std::vector& groups, const RPLM continue; patchInstruction->applyPatch(); } + + for (const auto& name : patchGroup->list_callbacks) + { + auto it = patchContext.map_values.find(name); + if (it != patchContext.map_values.end()) + { + m_callbacks.push_back(it->second); + } + else + { + patchContext.errorHandler.printError(patchGroup, -1, fmt::format("Failed to resolve .callback symbol: {}", name)); + patchContext.errorHandler.showStageErrorMessageBox(); + return; + } + } } // mark groups as applied for (auto patchGroup : groups) diff --git a/src/Cafe/GraphicPack/GraphicPack2PatchesParser.cpp b/src/Cafe/GraphicPack/GraphicPack2PatchesParser.cpp index fb300dbb..f47f7cc8 100644 --- a/src/Cafe/GraphicPack/GraphicPack2PatchesParser.cpp +++ b/src/Cafe/GraphicPack/GraphicPack2PatchesParser.cpp @@ -425,7 +425,23 @@ bool GraphicPack2::ParseCemuPatchesTxtInternal(MemStreamReader& patchesStream) } continue; } - + else if (parser.matchWordI(".callback")) + { + const char* symbolStr; + sint32 symbolLen; + if (parser.parseSymbolName(symbolStr, symbolLen)) + { + currentGroup->list_callbacks.push_back({symbolStr, static_cast(symbolLen)}); + continue; + } + else + { + LogPatchesSyntaxError(lineNumber, "'.callback' must be followed by a symbol"); + CancelParsingPatches(); + return false; + } + } + // next we attempt to parse symbol assignment // symbols can be labels or variables. The type is determined by what comes after the symbol name // = defines a variable diff --git a/src/Cafe/OS/libs/coreinit/coreinit_Init.cpp b/src/Cafe/OS/libs/coreinit/coreinit_Init.cpp index 72f6ac11..9072daef 100644 --- a/src/Cafe/OS/libs/coreinit/coreinit_Init.cpp +++ b/src/Cafe/OS/libs/coreinit/coreinit_Init.cpp @@ -11,6 +11,7 @@ #include "Cafe/OS/libs/coreinit/coreinit_MEM.h" #include "Cafe/OS/libs/coreinit/coreinit_FG.h" #include "Cafe/CafeSystem.h" +#include "Cafe/GraphicPack/GraphicPack2.h" extern MPTR _entryPoint; extern RPLModule* applicationRPX; @@ -211,6 +212,14 @@ void coreinit_start(PPCInterpreter_t* hCPU) padscore::start(); vpad::start(); + for (const auto gp : GraphicPack2::GetActiveGraphicPacks()) + { + for (MPTR callback : gp->GetCallbacks()) + { + PPCCoreCallback(callback); + } + } + // continue at main executable entrypoint hCPU->gpr[4] = memory_getVirtualOffsetFromPointer(_coreinitInfo->argv); hCPU->gpr[3] = _coreinitInfo->argc;