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 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 {