From f4d8e527b5c81e4a181f41105a71aec932d3810a Mon Sep 17 00:00:00 2001 From: skidau Date: Mon, 2 Jan 2012 15:14:30 +1100 Subject: [PATCH] Updated the Gecko code handler to the latest version from Gecko OS 1.9.3.1. Added a check to ensure that the number of codes fits in memory (maximum 231 codes). Store a copy of codehandler.bin in the Sys directory. --- Data/Sys/codehandler.bin | Bin 0 -> 4288 bytes Source/Core/Common/Src/CommonPaths.h | 2 +- Source/Core/Core/Src/GeckoCode.cpp | 24 +++++++++++++++--------- 3 files changed, 16 insertions(+), 10 deletions(-) create mode 100644 Data/Sys/codehandler.bin diff --git a/Data/Sys/codehandler.bin b/Data/Sys/codehandler.bin new file mode 100644 index 0000000000000000000000000000000000000000..7a95e724b1e69655f521c67e22e2b8c0479007dd GIT binary patch literal 4288 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 literal 0 HcmV?d00001 diff --git a/Source/Core/Common/Src/CommonPaths.h b/Source/Core/Common/Src/CommonPaths.h index 150453928e..d319fb541e 100644 --- a/Source/Core/Common/Src/CommonPaths.h +++ b/Source/Core/Common/Src/CommonPaths.h @@ -126,7 +126,7 @@ #define WII_USA_SETTING "setting-usa.txt" #define WII_JAP_SETTING "setting-jpn.txt" -#define GECKO_CODE_HANDLER "kenobiwii.bin" +#define GECKO_CODE_HANDLER "codehandler.bin" // Subdirs in Sys #define GC_SYS_DIR "GC" diff --git a/Source/Core/Core/Src/GeckoCode.cpp b/Source/Core/Core/Src/GeckoCode.cpp index 2bbe101cee..c0b7af3779 100644 --- a/Source/Core/Core/Src/GeckoCode.cpp +++ b/Source/Core/Core/Src/GeckoCode.cpp @@ -118,6 +118,7 @@ void SetActiveCodes(const std::vector& gcodes) bool InstallCodeHandler() { + u32 codelist_location = 0x800028B8; // Debugger on location (0x800022A8 = Debugger off, using codehandleronly.bin) std::string data; std::string _rCodeHandlerFilename = File::GetSysDirectory() + GECKO_CODE_HANDLER; if (!File::ReadFileToString(false, _rCodeHandlerFilename.c_str(), data)) @@ -127,14 +128,14 @@ bool InstallCodeHandler() Memory::WriteBigEData((const u8*)data.data(), 0x80001800, data.length()); // Turn off Pause on start - Memory::Write_U32(0, 0x80001808); + Memory::Write_U32(0, 0x80002774); // Write the Game ID into the location expected by WiiRD Memory::WriteBigEData(Memory::GetPointer(0x80000000), 0x80001800, 6); // Create GCT in memory - Memory::Write_U32(0x00d0c0de, 0x800027d0); - Memory::Write_U32(0x00d0c0de, 0x800027d4); + Memory::Write_U32(0x00d0c0de, codelist_location); + Memory::Write_U32(0x00d0c0de, codelist_location + 4); std::lock_guard lk(active_codes_lock); @@ -151,15 +152,20 @@ bool InstallCodeHandler() for (; current_code < codes_end; ++current_code) { const GeckoCode::Code& code = *current_code; - Memory::Write_U32(code.address, 0x800027d8 + i); - Memory::Write_U32(code.data, 0x800027d8 + i + 4); - i += 8; + + // Make sure we have enough memory to hold the code list + if ((codelist_location + 24 + i) < 0x80003000) + { + Memory::Write_U32(code.address, codelist_location + 8 + i); + Memory::Write_U32(code.data, codelist_location + 12 + i); + i += 8; + } } } } - Memory::Write_U32(0xff000000, 0x800027d8 + i); - Memory::Write_U32(0x00000000, 0x800027d8 + i + 4); + Memory::Write_U32(0xff000000, codelist_location + 8 + i); + Memory::Write_U32(0x00000000, codelist_location + 12 + i); // Turn on codes Memory::Write_U8(1, 0x80001807); @@ -214,7 +220,7 @@ bool RunGeckoCode(GeckoCode& gecko_code) gecko_code.enabled = false; PanicAlertT("GeckoCode failed to run (CT%i CST%i) (%s)" - "\n(either a bad code or the code type is not yet supported. Try using the native code handler by placing the kenobiwii.bin file into the Sys directory and restarting Dolphin.)" + "\n(either a bad code or the code type is not yet supported. Try using the native code handler by placing the codehandler.bin file into the Sys directory and restarting Dolphin.)" , code.type, code.subtype, gecko_code.name.c_str()); return false; }