From 2ad30958d622bb304e2d6ef36e5fdc3d8d7c0f4c Mon Sep 17 00:00:00 2001 From: Jordan Woyak Date: Mon, 4 Feb 2013 16:00:11 -0600 Subject: [PATCH] Stuck an IPC HLE Update call in WII_IPCInterface::Write32. While hacky, this seems to fix various problems without increasing IPC HLE freq to infinity. Thanks to Aristar for helping test. Increase IPC command reply delay to 1/100th of a second. (fixes DKCR hanging) --- Source/Core/Core/Src/HW/SystemTimers.cpp | 5 +++-- Source/Core/Core/Src/HW/WII_IPC.cpp | 1 + Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE.cpp | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/Source/Core/Core/Src/HW/SystemTimers.cpp b/Source/Core/Core/Src/HW/SystemTimers.cpp index 318b1213af..a041a3b0ad 100644 --- a/Source/Core/Core/Src/HW/SystemTimers.cpp +++ b/Source/Core/Core/Src/HW/SystemTimers.cpp @@ -248,10 +248,11 @@ void Init() DSP_PERIOD = (int)(GetTicksPerSecond() * 0.003f); // AyuanX: TO BE TWEAKED - // Now the 1500 is (was) a pure assumption + // Now the 1500 is a pure assumption // We need to figure out the real frequency though - const int freq = 8000; + // FYI, WII_IPC_HLE_Interface::Update is also called in WII_IPCInterface::Write32 + const int freq = 1500; const int fields = SConfig::GetInstance().m_LocalCoreStartupParameter. bVBeam ? 2 : 1; IPC_HLE_PERIOD = GetTicksPerSecond() / (freq * fields); diff --git a/Source/Core/Core/Src/HW/WII_IPC.cpp b/Source/Core/Core/Src/HW/WII_IPC.cpp index 74af1ecdea..3651eef8ab 100644 --- a/Source/Core/Core/Src/HW/WII_IPC.cpp +++ b/Source/Core/Core/Src/HW/WII_IPC.cpp @@ -221,6 +221,7 @@ void Write32(const u32 _Value, const u32 _Address) break; } + WII_IPC_HLE_Interface::Update(); UpdateInterrupts(); } diff --git a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE.cpp b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE.cpp index 4aee5cb045..620d6c7052 100644 --- a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE.cpp +++ b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE.cpp @@ -515,7 +515,8 @@ void ExecuteCommand(u32 _Address) if (CmdSuccess) { // Generate a reply to the IPC command - EnqReply(_Address, SystemTimers::GetTicksPerSecond() / 150); + // TODO: should probably figure out which commands need delayed replies and which don't + EnqReply(_Address, SystemTimers::GetTicksPerSecond() / 100); } else {