mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2026-08-17 07:47:23 -05:00
Core: Raise PI interrupt when accessing unmapped memory
Unmapped on the physical level, not the MMU level. Fixes booting Game Boy Interface. Previously, Game Boy Interface thought it was running on a Wii because accessing MEM2 didn't raise a PI interrupt, and as a result tried to exit to the Homebrew Channel in a way Dolphin's HLE doesn't recognize. (Dolphin's HLE catches jumps to 0x80001800, but GBI is running without address translation at this point and therefore jumps to 0x00001800 instead.)
This commit is contained in:
@@ -302,12 +302,21 @@ T MMU::ReadFromHardware(u32 em_address)
|
||||
return bswap(value);
|
||||
}
|
||||
|
||||
PanicAlertFmt("Unable to resolve read address {:x} PC {:x}", em_address, m_ppc_state.pc);
|
||||
if (m_system.IsPauseOnPanicMode())
|
||||
// Memory access error. Game Boy Interface relies on this to confirm that MEM2 isn't present.
|
||||
// TODO: This interrupt is supposed to have associated cause and address registers.
|
||||
m_system.GetProcessorInterface().SetInterrupt(ProcessorInterface::INT_CAUSE_PI);
|
||||
|
||||
// Don't show a panic alert for the specific access Game Boy Interface does.
|
||||
if (em_address != 0x10000000 || (m_ppc_state.pc >> 28) != 0)
|
||||
{
|
||||
m_system.GetCPU().Break();
|
||||
m_ppc_state.Exceptions |= EXCEPTION_DSI | EXCEPTION_FAKE_MEMCHECK_HIT;
|
||||
PanicAlertFmt("Unable to resolve read address {:x} PC {:x}", em_address, m_ppc_state.pc);
|
||||
if (m_system.IsPauseOnPanicMode())
|
||||
{
|
||||
m_system.GetCPU().Break();
|
||||
m_ppc_state.Exceptions |= EXCEPTION_DSI | EXCEPTION_FAKE_MEMCHECK_HIT;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -492,6 +501,10 @@ void MMU::WriteToHardware(u32 em_address, const u32 data, const u32 size)
|
||||
return;
|
||||
}
|
||||
|
||||
// Memory access error.
|
||||
// TODO: This interrupt is supposed to have associated cause and address registers.
|
||||
m_system.GetProcessorInterface().SetInterrupt(ProcessorInterface::INT_CAUSE_PI);
|
||||
|
||||
PanicAlertFmt("Unable to resolve write address {:x} PC {:x}", em_address, m_ppc_state.pc);
|
||||
if (m_system.IsPauseOnPanicMode())
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user