summaryrefslogtreecommitdiff
path: root/Source/Core
diff options
context:
space:
mode:
authorJordan Woyak <jordan.woyak@gmail.com>2026-04-10 14:43:23 -0500
committerJordan Woyak <jordan.woyak@gmail.com>2026-04-10 14:57:52 -0500
commit23e8a3c569a4db3b48b93dd36ef37eef3030c76c (patch)
treeb872e345112ea8d7432d7f638c75673ccb33b523 /Source/Core
parentc0e0b685f372e49f628cbab43e6bbd687fcbd636 (diff)
Core/PowerPC: Minor code cleanup to CheckExternalExceptions function.
Diffstat (limited to 'Source/Core')
-rw-r--r--Source/Core/Core/PowerPC/PowerPC.cpp84
1 files changed, 41 insertions, 43 deletions
diff --git a/Source/Core/Core/PowerPC/PowerPC.cpp b/Source/Core/Core/PowerPC/PowerPC.cpp
index 7939b6d4bc..564d74d1f6 100644
--- a/Source/Core/Core/PowerPC/PowerPC.cpp
+++ b/Source/Core/Core/PowerPC/PowerPC.cpp
@@ -583,56 +583,54 @@ void PowerPCManager::CheckExceptions()
void PowerPCManager::CheckExternalExceptions()
{
- u32 exceptions = m_ppc_state.Exceptions;
+ const u32 exceptions = m_ppc_state.Exceptions;
// EXTERNAL INTERRUPT
// Handling is delayed until MSR.EE=1.
- if (exceptions && m_ppc_state.msr.EE)
+ if (exceptions == 0 || !m_ppc_state.msr.EE)
+ return;
+
+ u32 exception_vector = 0;
+
+ if (exceptions & EXCEPTION_EXTERNAL_INT)
{
- if (exceptions & EXCEPTION_EXTERNAL_INT)
- {
- // Pokemon gets this "too early", it hasn't a handler yet
- SRR0(m_ppc_state) = m_ppc_state.npc;
- SRR1(m_ppc_state) = m_ppc_state.msr.Hex & 0x87C0FFFF;
- m_ppc_state.msr.LE = m_ppc_state.msr.ILE;
- m_ppc_state.msr.Hex &= ~0x04EF36;
- m_ppc_state.pc = m_ppc_state.npc = 0x00000500;
+ // Pokemon gets this "too early", it hasn't a handler yet
- DEBUG_LOG_FMT(POWERPC, "EXCEPTION_EXTERNAL_INT");
- m_ppc_state.Exceptions &= ~EXCEPTION_EXTERNAL_INT;
+ DEBUG_LOG_FMT(POWERPC, "EXCEPTION_EXTERNAL_INT");
+ DEBUG_ASSERT_MSG(POWERPC, m_ppc_state.msr.RI, "EXTERNAL_INT unrecoverable???");
- DEBUG_ASSERT_MSG(POWERPC, (SRR1(m_ppc_state) & 0x02) != 0, "EXTERNAL_INT unrecoverable???");
- }
- else if (exceptions & EXCEPTION_PERFORMANCE_MONITOR)
- {
- SRR0(m_ppc_state) = m_ppc_state.npc;
- SRR1(m_ppc_state) = m_ppc_state.msr.Hex & 0x87C0FFFF;
- m_ppc_state.msr.LE = m_ppc_state.msr.ILE;
- m_ppc_state.msr.Hex &= ~0x04EF36;
- m_ppc_state.pc = m_ppc_state.npc = 0x00000F00;
-
- DEBUG_LOG_FMT(POWERPC, "EXCEPTION_PERFORMANCE_MONITOR");
- m_ppc_state.Exceptions &= ~EXCEPTION_PERFORMANCE_MONITOR;
- }
- else if (exceptions & EXCEPTION_DECREMENTER)
- {
- SRR0(m_ppc_state) = m_ppc_state.npc;
- SRR1(m_ppc_state) = m_ppc_state.msr.Hex & 0x87C0FFFF;
- m_ppc_state.msr.LE = m_ppc_state.msr.ILE;
- m_ppc_state.msr.Hex &= ~0x04EF36;
- m_ppc_state.pc = m_ppc_state.npc = 0x00000900;
-
- DEBUG_LOG_FMT(POWERPC, "EXCEPTION_DECREMENTER");
- m_ppc_state.Exceptions &= ~EXCEPTION_DECREMENTER;
- }
- else
- {
- DEBUG_ASSERT_MSG(POWERPC, 0, "Unknown EXT interrupt: Exceptions == {:08x}", exceptions);
- ERROR_LOG_FMT(POWERPC, "Unknown EXTERNAL INTERRUPT exception: Exceptions == {:08x}",
- exceptions);
- }
- MSRUpdated();
+ exception_vector = 0x00000500;
+ m_ppc_state.Exceptions &= ~EXCEPTION_EXTERNAL_INT;
}
+ else if (exceptions & EXCEPTION_PERFORMANCE_MONITOR)
+ {
+ DEBUG_LOG_FMT(POWERPC, "EXCEPTION_PERFORMANCE_MONITOR");
+
+ exception_vector = 0x00000F00;
+ m_ppc_state.Exceptions &= ~EXCEPTION_PERFORMANCE_MONITOR;
+ }
+ else if (exceptions & EXCEPTION_DECREMENTER)
+ {
+ DEBUG_LOG_FMT(POWERPC, "EXCEPTION_DECREMENTER");
+
+ exception_vector = 0x00000900;
+ m_ppc_state.Exceptions &= ~EXCEPTION_DECREMENTER;
+ }
+ else
+ {
+ DEBUG_ASSERT_MSG(POWERPC, 0, "Unknown EXT interrupt: Exceptions == {:08x}", exceptions);
+ ERROR_LOG_FMT(POWERPC, "Unknown EXTERNAL INTERRUPT exception: Exceptions == {:08x}",
+ exceptions);
+ return;
+ }
+
+ SRR0(m_ppc_state) = m_ppc_state.npc;
+ SRR1(m_ppc_state) = m_ppc_state.msr.Hex & 0x87C0FFFF;
+ m_ppc_state.msr.LE = m_ppc_state.msr.ILE;
+ m_ppc_state.msr.Hex &= ~0x04EF36;
+ m_ppc_state.pc = m_ppc_state.npc = exception_vector;
+
+ MSRUpdated();
}
bool PowerPCManager::CheckBreakPoints()