Cheevos: Use safe memory access routines

pull/2617/head
Connor McLaughlin 4 years ago
parent f7f121f036
commit bacd834840

@ -1399,47 +1399,31 @@ void CheevosEventHandler(const rc_runtime_event_t* runtime_event)
SubmitLeaderboard(runtime_event->id, runtime_event->value); SubmitLeaderboard(runtime_event->id, runtime_event->value);
} }
// from cheats.cpp - do we want to move this somewhere else? unsigned CheevosPeek(unsigned address, unsigned num_bytes, void* ud)
template<typename T>
static T DoMemoryRead(PhysicalMemoryAddress address)
{ {
T result; switch (num_bytes)
if ((address & CPU::DCACHE_LOCATION_MASK) == CPU::DCACHE_LOCATION &&
(address & CPU::DCACHE_OFFSET_MASK) < CPU::DCACHE_SIZE)
{ {
std::memcpy(&result, &CPU::g_state.dcache[address & CPU::DCACHE_OFFSET_MASK], sizeof(result)); case 1:
return result;
}
address &= CPU::PHYSICAL_MEMORY_ADDRESS_MASK;
if (address < Bus::RAM_MIRROR_END)
{ {
std::memcpy(&result, &Bus::g_ram[address & Bus::g_ram_mask], sizeof(result)); u8 value = 0;
return result; CPU::SafeReadMemoryByte(address, &value);
return value;
} }
if (address >= Bus::BIOS_BASE && address < (Bus::BIOS_BASE + Bus::BIOS_SIZE)) case 2:
{ {
std::memcpy(&result, &Bus::g_bios[address & Bus::BIOS_MASK], sizeof(result)); u16 value;
return result; CPU::SafeReadMemoryHalfWord(address, &value);
return value;
} }
result = static_cast<T>(0); case 4:
return result; {
u32 value;
CPU::SafeReadMemoryWord(address, &value);
return value;
} }
unsigned CheevosPeek(unsigned address, unsigned num_bytes, void* ud)
{
switch (num_bytes)
{
case 1:
return ZeroExtend32(DoMemoryRead<u8>(address));
case 2:
return ZeroExtend32(DoMemoryRead<u16>(address));
case 4:
return ZeroExtend32(DoMemoryRead<u32>(address));
default: default:
return 0; return 0;
} }

Loading…
Cancel
Save