From 2b0fcd0b773fc02cdd7727cb85b75ae5bf5a2c4c Mon Sep 17 00:00:00 2001 From: Mr-Wiseguy Date: Fri, 17 May 2024 02:03:36 -0400 Subject: [PATCH] Converted manual recompiler edits for overlay loading into patches --- include/recomp_overlays.h | 10 +++++ patches/misc_funcs.h | 1 + patches/patches.h | 1 + patches/required_patches.c | 75 ++++++++++++++++++++++++++++++++++++++ patches/syms.ld | 2 + src/game/recomp_api.cpp | 9 +++++ src/recomp/overlays.cpp | 1 + src/recomp/recomp.cpp | 4 +- us.rev1.toml | 18 --------- 9 files changed, 100 insertions(+), 21 deletions(-) create mode 100644 include/recomp_overlays.h create mode 100644 patches/required_patches.c diff --git a/include/recomp_overlays.h b/include/recomp_overlays.h new file mode 100644 index 0000000..cf1f8a1 --- /dev/null +++ b/include/recomp_overlays.h @@ -0,0 +1,10 @@ +#ifndef __RECOMP_OVERLAYS_H__ +#define __RECOMP_OVERLAYS_H__ + +#include + +extern "C" void load_overlays(uint32_t rom, int32_t ram_addr, uint32_t size); +extern "C" void unload_overlays(int32_t ram_addr, uint32_t size); +void init_overlays(); + +#endif \ No newline at end of file diff --git a/patches/misc_funcs.h b/patches/misc_funcs.h index 4c0a0c8..853877b 100644 --- a/patches/misc_funcs.h +++ b/patches/misc_funcs.h @@ -3,6 +3,7 @@ #include "patch_helpers.h" +DECLARE_FUNC(void, recomp_load_overlays, u32 rom, void* ram, u32 size); DECLARE_FUNC(void, recomp_puts, const char* data, u32 size); DECLARE_FUNC(void, recomp_exit); DECLARE_FUNC(void, recomp_handle_quicksave_actions, OSMesgQueue* enter_mq, OSMesgQueue* exit_mq); diff --git a/patches/patches.h b/patches/patches.h index 510f97f..9ad713b 100644 --- a/patches/patches.h +++ b/patches/patches.h @@ -9,6 +9,7 @@ #define osFlashWriteArray osFlashWriteArray_recomp #define osFlashWriteBuffer osFlashWriteBuffer_recomp #define osWritebackDCache osWritebackDCache_recomp +#define osInvalICache osInvalICache_recomp #define osGetTime osGetTime_recomp #define osContStartReadData osContStartReadData_recomp diff --git a/patches/required_patches.c b/patches/required_patches.c new file mode 100644 index 0000000..e491a61 --- /dev/null +++ b/patches/required_patches.c @@ -0,0 +1,75 @@ +#include "patches.h" +#include "misc_funcs.h" +#include "loadfragment.h" + +void Main_ClearMemory(void* begin, void* end); +void Main_InitMemory(void); +void Main_InitScreen(void); + + +// @recomp Patched to load the code segment in the recomp runtime. +void Main_Init(void) { + DmaRequest dmaReq; + OSMesgQueue mq; + OSMesg msg[1]; + size_t prevSize; + + osCreateMesgQueue(&mq, msg, ARRAY_COUNT(msg)); + + prevSize = gDmaMgrDmaBuffSize; + gDmaMgrDmaBuffSize = 0; + + // @recomp Load the code segment in the recomp runtime. + recomp_load_overlays(SEGMENT_ROM_START(code), SEGMENT_START(code), SEGMENT_ROM_END(code) - SEGMENT_ROM_START(code)); + + DmaMgr_SendRequestImpl(&dmaReq, SEGMENT_START(code), SEGMENT_ROM_START(code), + SEGMENT_ROM_END(code) - SEGMENT_ROM_START(code), 0, &mq, NULL); + Main_InitScreen(); + Main_InitMemory(); + osRecvMesg(&mq, NULL, OS_MESG_BLOCK); + + gDmaMgrDmaBuffSize = prevSize; + + Main_ClearMemory(SEGMENT_BSS_START(code), SEGMENT_BSS_END(code)); +} + +void Overlay_Relocate(void* allocatedRamAddr, OverlayRelocationSection* ovlRelocs, uintptr_t vramStart); + +// @recomp Patched to load the overlay in the recomp runtime. +size_t Overlay_Load(uintptr_t vromStart, uintptr_t vromEnd, void* ramStart, void* ramEnd, void* allocatedRamAddr) { + uintptr_t vramStart = (uintptr_t)ramStart; + uintptr_t vramEnd = (uintptr_t)ramEnd; + s32 size = vromEnd - vromStart; + uintptr_t end; + OverlayRelocationSection* ovlRelocs; + + // @recomp Load the overlay in the recomp runtime. + recomp_load_overlays(vromStart, allocatedRamAddr, vromEnd - vromStart); + + if (gOverlayLogSeverity >= 3) {} + if (gOverlayLogSeverity >= 3) {} + + end = (uintptr_t)allocatedRamAddr + size; + DmaMgr_SendRequest0(allocatedRamAddr, vromStart, size); + + ovlRelocs = (OverlayRelocationSection*)(end - ((s32*)end)[-1]); + + if (gOverlayLogSeverity >= 3) {} + if (gOverlayLogSeverity >= 3) {} + + Overlay_Relocate(allocatedRamAddr, ovlRelocs, vramStart); + + if (ovlRelocs->bssSize != 0) { + if (gOverlayLogSeverity >= 3) {} + bzero((void*)end, ovlRelocs->bssSize); + } + + size = vramEnd - vramStart; + + osWritebackDCache(allocatedRamAddr, size); + osInvalICache(allocatedRamAddr, size); + + if (gOverlayLogSeverity >= 3) {} + + return size; +} diff --git a/patches/syms.ld b/patches/syms.ld index 587f9bd..22e16ae 100644 --- a/patches/syms.ld +++ b/patches/syms.ld @@ -50,3 +50,5 @@ recomp_get_mouse_deltas = 0x8F000080; bcmp_recomp = 0x8F000084; osGetTime_recomp = 0x8F000088; recomp_autosave_enabled = 0x8F00008C; +recomp_load_overlays = 0x8F000090; +osInvalICache_recomp = 0x8F000094; diff --git a/src/game/recomp_api.cpp b/src/game/recomp_api.cpp index fa07464..84d7000 100644 --- a/src/game/recomp_api.cpp +++ b/src/game/recomp_api.cpp @@ -1,6 +1,7 @@ #include #include "recomp.h" +#include "recomp_overlays.h" #include "recomp_config.h" #include "recomp_input.h" #include "recomp_ui.h" @@ -93,3 +94,11 @@ extern "C" void recomp_time_us(uint8_t* rdram, recomp_context* ctx) { extern "C" void recomp_autosave_enabled(uint8_t* rdram, recomp_context* ctx) { _return(ctx, static_cast(recomp::get_autosave_mode() == recomp::AutosaveMode::On)); } + +extern "C" void recomp_load_overlays(uint8_t * rdram, recomp_context * ctx) { + u32 rom = _arg<0, u32>(rdram, ctx); + PTR(void) ram = _arg<1, PTR(void)>(rdram, ctx); + u32 size = _arg<2, u32>(rdram, ctx); + + load_overlays(rom, ram, size); +} diff --git a/src/recomp/overlays.cpp b/src/recomp/overlays.cpp index 7e343bb..3295552 100644 --- a/src/recomp/overlays.cpp +++ b/src/recomp/overlays.cpp @@ -2,6 +2,7 @@ #include #include #include "recomp.h" +#include "recomp_overlays.h" #include "../RecompiledFuncs/recomp_overlays.inl" constexpr size_t num_code_sections = ARRLEN(section_table); diff --git a/src/recomp/recomp.cpp b/src/recomp/recomp.cpp index 712ff5c..13661e3 100644 --- a/src/recomp/recomp.cpp +++ b/src/recomp/recomp.cpp @@ -11,6 +11,7 @@ #include #include #include "recomp.h" +#include "recomp_overlays.h" #include "recomp_game.h" #include "recomp_config.h" #include "xxHash/xxh3.h" @@ -301,9 +302,6 @@ void run_thread_function(uint8_t* rdram, uint64_t addr, uint64_t sp, uint64_t ar extern "C" void recomp_entrypoint(uint8_t * rdram, recomp_context * ctx); gpr get_entrypoint_address(); const char* get_rom_name(); -void init_overlays(); -extern "C" void load_overlays(uint32_t rom, int32_t ram_addr, uint32_t size); -extern "C" void unload_overlays(int32_t ram_addr, uint32_t size); void read_patch_data(uint8_t* rdram, gpr patch_data_address) { for (size_t i = 0; i < sizeof(mm_patches_bin); i++) { diff --git a/us.rev1.toml b/us.rev1.toml index 3410f50..2653749 100644 --- a/us.rev1.toml +++ b/us.rev1.toml @@ -22,24 +22,6 @@ ignored = [ "D_80186028" ] -# Hooks - -# Function definition for the overlay loading function. -[[patches.func]] -name = "load_overlays" -args = ["u32", "u32", "u32"] - -# Function hooks for overlay loading. -[[patches.hook]] -func = "Main_Init" -text = " load_overlays((uint32_t)ctx->r6, (uint32_t)ctx->r5, (uint32_t)ctx->r7);" -after_vram = 0x800802A4 - -[[patches.hook]] -func = "Overlay_Load" -text = " load_overlays((uint32_t)ctx->r4, MEM_W(0x10, ctx->r29), (uint32_t)(ctx->r5 - ctx->r4));" -# No after_vram means this will be placed at the start of the function - # Single-instruction patches # Write audio dlists to kseg0 (cached, 0x80...) addresses instead of kseg1 (uncached, 0xA0...) ones.