CPU/Recompiler: Disable memory access exceptions by default
This means it'll no longer pass amidog's CPU test in the default config. But no games rely on this. You can enable it in advanced options if you want to pass the CPU test.
This commit is contained in:
@ -811,6 +811,9 @@ static ALWAYS_INLINE TickCount DoMemoryAccess(VirtualMemoryAddress address, u32&
|
||||
case 0x03: // KUSEG 1536M-2048M
|
||||
{
|
||||
// Above 512mb raises an exception.
|
||||
if constexpr (type == MemoryAccessType::Read)
|
||||
value = UINT32_C(0xFFFFFFFF);
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
@ -834,6 +837,9 @@ static ALWAYS_INLINE TickCount DoMemoryAccess(VirtualMemoryAddress address, u32&
|
||||
}
|
||||
else
|
||||
{
|
||||
if constexpr (type == MemoryAccessType::Read)
|
||||
value = UINT32_C(0xFFFFFFFF);
|
||||
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
@ -1106,7 +1112,7 @@ namespace Recompiler::Thunks {
|
||||
|
||||
u64 ReadMemoryByte(u32 address)
|
||||
{
|
||||
u32 temp = 0;
|
||||
u32 temp;
|
||||
const TickCount cycles = DoMemoryAccess<MemoryAccessType::Read, MemoryAccessSize::Byte>(address, temp);
|
||||
if (cycles < 0)
|
||||
return static_cast<u64>(-static_cast<s64>(Exception::DBE));
|
||||
@ -1123,7 +1129,7 @@ u64 ReadMemoryHalfWord(u32 address)
|
||||
return static_cast<u64>(-static_cast<s64>(Exception::AdEL));
|
||||
}
|
||||
|
||||
u32 temp = 0;
|
||||
u32 temp;
|
||||
const TickCount cycles = DoMemoryAccess<MemoryAccessType::Read, MemoryAccessSize::HalfWord>(address, temp);
|
||||
if (cycles < 0)
|
||||
return static_cast<u64>(-static_cast<s64>(Exception::DBE));
|
||||
@ -1140,7 +1146,7 @@ u64 ReadMemoryWord(u32 address)
|
||||
return static_cast<u64>(-static_cast<s64>(Exception::AdEL));
|
||||
}
|
||||
|
||||
u32 temp = 0;
|
||||
u32 temp;
|
||||
const TickCount cycles = DoMemoryAccess<MemoryAccessType::Read, MemoryAccessSize::Word>(address, temp);
|
||||
if (cycles < 0)
|
||||
return static_cast<u64>(-static_cast<s64>(Exception::DBE));
|
||||
@ -1193,6 +1199,44 @@ u32 WriteMemoryWord(u32 address, u32 value)
|
||||
return 0;
|
||||
}
|
||||
|
||||
u32 UncheckedReadMemoryByte(u32 address)
|
||||
{
|
||||
u32 temp;
|
||||
g_state.pending_ticks += DoMemoryAccess<MemoryAccessType::Read, MemoryAccessSize::Byte>(address, temp);
|
||||
return temp;
|
||||
}
|
||||
|
||||
u32 UncheckedReadMemoryHalfWord(u32 address)
|
||||
{
|
||||
u32 temp;
|
||||
g_state.pending_ticks += DoMemoryAccess<MemoryAccessType::Read, MemoryAccessSize::HalfWord>(address, temp);
|
||||
return temp;
|
||||
}
|
||||
|
||||
u32 UncheckedReadMemoryWord(u32 address)
|
||||
{
|
||||
u32 temp;
|
||||
g_state.pending_ticks += DoMemoryAccess<MemoryAccessType::Read, MemoryAccessSize::Word>(address, temp);
|
||||
return temp;
|
||||
}
|
||||
|
||||
void UncheckedWriteMemoryByte(u32 address, u8 value)
|
||||
{
|
||||
u32 temp = ZeroExtend32(value);
|
||||
g_state.pending_ticks += DoMemoryAccess<MemoryAccessType::Write, MemoryAccessSize::Byte>(address, temp);
|
||||
}
|
||||
|
||||
void UncheckedWriteMemoryHalfWord(u32 address, u16 value)
|
||||
{
|
||||
u32 temp = ZeroExtend32(value);
|
||||
g_state.pending_ticks += DoMemoryAccess<MemoryAccessType::Write, MemoryAccessSize::HalfWord>(address, temp);
|
||||
}
|
||||
|
||||
void UncheckedWriteMemoryWord(u32 address, u32 value)
|
||||
{
|
||||
g_state.pending_ticks += DoMemoryAccess<MemoryAccessType::Write, MemoryAccessSize::Word>(address, value);
|
||||
}
|
||||
|
||||
} // namespace Recompiler::Thunks
|
||||
|
||||
} // namespace CPU
|
||||
|
||||
Reference in New Issue
Block a user