diff --git a/PowerRecomp/recompiler.cpp b/PowerRecomp/recompiler.cpp index 78443e8..b42c6ce 100644 --- a/PowerRecomp/recompiler.cpp +++ b/PowerRecomp/recompiler.cpp @@ -2390,6 +2390,30 @@ void Recompiler::Recompile(const std::filesystem::path& headerFilePath) println(""); + println("#define PPC_IMAGE_BASE 0x{:X}ull", image.base); + println("#define PPC_IMAGE_SIZE 0x{:X}ull", image.size); + + // Extract the address of the minimum code segment to store the function table at. + size_t codeMin = ~0; + size_t codeMax = 0; + + for (auto& section : image.sections) + { + if ((section.flags & SectionFlags_Code) != 0) + { + if (section.base < codeMin) + codeMin = section.base; + + if ((section.base + section.size) > codeMax) + codeMax = (section.base + section.size); + } + } + + println("#define PPC_CODE_BASE 0x{:X}ull", codeMin); + println("#define PPC_CODE_SIZE 0x{:X}ull", codeMax - codeMin); + + println(""); + println("#ifdef PPC_INCLUDE_DETAIL"); println("#include \"ppc_detail.h\""); println("#endif"); diff --git a/PowerUtils/ppc_context.h b/PowerUtils/ppc_context.h index 2c6dd5c..bc427c9 100644 --- a/PowerUtils/ppc_context.h +++ b/PowerUtils/ppc_context.h @@ -105,12 +105,12 @@ #define PPC_CALL_FUNC(x) x(ctx, base) #endif -#define PPC_MEMORY_SIZE 0x100000000ull -#define PPC_FUNC_TABLE_OFFSET PPC_MEMORY_SIZE -#define PPC_FUNC_TABLE_SIZE 0x200000000ull +#define PPC_MEMORY_SIZE 0x100000000ull + +#define PPC_LOOKUP_FUNC(x, y) *(PPCFunc**)(x + PPC_IMAGE_BASE + PPC_IMAGE_SIZE + (uint64_t(uint32_t(y) - PPC_CODE_BASE) * 2)) #ifndef PPC_CALL_INDIRECT_FUNC -#define PPC_CALL_INDIRECT_FUNC(x) (*(PPCFunc**)(base + PPC_FUNC_TABLE_OFFSET + (uint64_t(x) * 2)))(ctx, base) +#define PPC_CALL_INDIRECT_FUNC(x) (PPC_LOOKUP_FUNC(base, x))(ctx, base) #endif typedef void PPCFunc(struct PPCContext& __restrict__ ctx, uint8_t* base);