summaryrefslogtreecommitdiff
path: root/Source/Core
diff options
context:
space:
mode:
authorLéo Lam <leo@innovatetechnologi.es>2018-02-28 17:00:26 +0100
committerLéo Lam <leo@innovatetechnologi.es>2018-03-16 18:51:08 +0100
commitd029f2a7b6544933fcd35befceae456da29cf280 (patch)
tree04dfff38134f8d901fd6abdc8e28fd3eba1af27e /Source/Core
parent1a71076e50dbf4fd33fc5834cfc61367d5a19ea6 (diff)
IPC: Clear X1 when acknowledging a reply
Hardware tests indicate that IOS clears X1 when it acknowledges an IPC request.
Diffstat (limited to 'Source/Core')
-rw-r--r--Source/Core/Core/HW/WII_IPC.cpp5
-rw-r--r--Source/Core/Core/HW/WII_IPC.h1
-rw-r--r--Source/Core/Core/IOS/IOS.cpp1
3 files changed, 7 insertions, 0 deletions
diff --git a/Source/Core/Core/HW/WII_IPC.cpp b/Source/Core/Core/HW/WII_IPC.cpp
index 5a60b0f04f..d231adcfd2 100644
--- a/Source/Core/Core/HW/WII_IPC.cpp
+++ b/Source/Core/Core/HW/WII_IPC.cpp
@@ -211,6 +211,11 @@ static void UpdateInterrupts(u64 userdata, s64 cyclesLate)
!!(ppc_irq_flags & ppc_irq_masks));
}
+void ClearX1()
+{
+ ctrl.X1 = 0;
+}
+
void GenerateAck(u32 _Address)
{
ctrl.Y2 = 1;
diff --git a/Source/Core/Core/HW/WII_IPC.h b/Source/Core/Core/HW/WII_IPC.h
index d97e7eab0c..34419b8988 100644
--- a/Source/Core/Core/HW/WII_IPC.h
+++ b/Source/Core/Core/HW/WII_IPC.h
@@ -42,6 +42,7 @@ void DoState(PointerWrap& p);
void RegisterMMIO(MMIO::Mapping* mmio, u32 base);
+void ClearX1();
void GenerateAck(u32 _Address);
void GenerateReply(u32 _Address);
diff --git a/Source/Core/Core/IOS/IOS.cpp b/Source/Core/Core/IOS/IOS.cpp
index 90d63c0f4f..cd94693723 100644
--- a/Source/Core/Core/IOS/IOS.cpp
+++ b/Source/Core/Core/IOS/IOS.cpp
@@ -629,6 +629,7 @@ void Kernel::UpdateIPC()
if (m_request_queue.size())
{
+ ClearX1();
GenerateAck(m_request_queue.front());
u32 command = m_request_queue.front();
m_request_queue.pop_front();