From 230bbad1c6585cf06000f339966a0b58982cbd7d Mon Sep 17 00:00:00 2001 From: Andrew Church Date: Thu, 4 Sep 2014 23:44:32 +0900 Subject: [PATCH] Read the offset for the framebuffer index from the instruction stream instead of using a literal constant, so the hook works for other games using the same function but a different offset (e.g. Zero no Kiseki). Also remove the memcpy() since the original function will do it anyway (and may do it differently if other games call the function with different arguments). --- Core/HLE/ReplaceTables.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/Core/HLE/ReplaceTables.cpp b/Core/HLE/ReplaceTables.cpp index e813165cec..739bfbce86 100644 --- a/Core/HLE/ReplaceTables.cpp +++ b/Core/HLE/ReplaceTables.cpp @@ -579,15 +579,17 @@ static int Hook_brandish_download_frame() { return 0; } const u32 fb_info = Memory::Read_U32(fb_infoaddr); - const u32 fb_index = (Memory::Read_U32(fb_info + 0x2ec8) + 1) & 1; + const MIPSOpcode fb_index_load = Memory::Read_Instruction(currentMIPS->pc + 0x38, true); + if (fb_index_load != MIPS_MAKE_LW(MIPS_GET_RT(fb_index_load), MIPS_GET_RS(fb_index_load), fb_index_load & 0xffff)) { + return 0; + } + const u32 fb_index_offset = fb_index_load & 0xffff; + const u32 fb_index = (Memory::Read_U32(fb_info + fb_index_offset) + 1) & 1; const u32 fb_address = 0x4000000 + (0x44000 * fb_index); const u32 dest_address = currentMIPS->r[MIPS_REG_A1]; if (Memory::IsRAMAddress(dest_address)) { gpu->PerformMemoryDownload(fb_address, 0x00044000); - memcpy(Memory::GetPointer(dest_address), - Memory::GetPointer(fb_address), 0x00044000); CBreakPoints::ExecMemCheck(fb_address, true, 0x00044000, currentMIPS->pc); - CBreakPoints::ExecMemCheck(dest_address, true, 0x00044000, currentMIPS->pc); } return 0; }