summaryrefslogtreecommitdiff
path: root/Source
diff options
context:
space:
mode:
authorJordan Woyak <jordan.woyak@gmail.com>2013-02-01 20:53:05 -0600
committerJordan Woyak <jordan.woyak@gmail.com>2013-02-01 20:58:17 -0600
commit00a1f351e92ceceb153e072f548cfff6cea19dc8 (patch)
treed98ddfc6b983ba6303361390caacfd883be47ece /Source
parent039bf277672d5eae1c4256db0728b9fbdc02db95 (diff)
Delay IPC replies directly caused by requests by 150th of a second. Fixes everything.
Diffstat (limited to 'Source')
-rw-r--r--Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE.cpp17
-rw-r--r--Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE.h2
2 files changed, 15 insertions, 4 deletions
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 6aae2fe4e5..7dca728f0f 100644
--- a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE.cpp
+++ b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE.cpp
@@ -58,6 +58,8 @@ They will also generate a true or false return for UpdateInterrupts() in WII_IPC
#include "../HW/WII_IPC.h"
#include "../Debugger/Debugger_SymbolMap.h"
#include "../PowerPC/PowerPC.h"
+#include "../HW/SystemTimers.h"
+#include "CoreTiming.h"
namespace WII_IPC_HLE_Interface
@@ -80,8 +82,17 @@ typedef std::deque<u32> ipc_msg_queue;
static ipc_msg_queue request_queue; // ppc -> arm
static ipc_msg_queue reply_queue; // arm -> ppc
+static int enque_reply;
+
+void EnqueReplyCallback(u64 userdata, int)
+{
+ reply_queue.push_back(userdata);
+}
+
void Init()
{
+ enque_reply = CoreTiming::RegisterEvent("IPCReply", EnqueReplyCallback);
+
_dbg_assert_msg_(WII_IPC_HLE, g_DeviceMap.empty(), "DeviceMap isnt empty on init");
CWII_IPC_HLE_Device_es::m_ContentFile = "";
u32 i;
@@ -504,7 +515,7 @@ void ExecuteCommand(u32 _Address)
if (CmdSuccess)
{
// Generate a reply to the IPC command
- EnqReply(_Address);
+ EnqReply(_Address, SystemTimers::GetTicksPerSecond() / 150);
}
else
{
@@ -526,9 +537,9 @@ void EnqRequest(u32 _Address)
}
// Called when IOS module has some reply
-void EnqReply(u32 _Address)
+void EnqReply(u32 _Address, int cycles_in_future)
{
- reply_queue.push_back(_Address);
+ CoreTiming::ScheduleEvent(cycles_in_future, enque_reply, _Address);
}
// This is called every IPC_HLE_PERIOD from SystemTimers.cpp
diff --git a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE.h b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE.h
index 2e056b5bec..65244836cc 100644
--- a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE.h
+++ b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE.h
@@ -62,7 +62,7 @@ void UpdateDevices();
void ExecuteCommand(u32 _Address);
void EnqRequest(u32 _Address);
-void EnqReply(u32 _Address);
+void EnqReply(u32 _Address, int cycles_in_future = 0);
enum ECommandType
{