Skip to content

Commit

Permalink
Cheevos: Use safe memory access routines
Browse files Browse the repository at this point in the history
  • Loading branch information
stenzek committed Sep 15, 2021
1 parent f7f121f commit bacd834
Showing 1 changed file with 18 additions and 34 deletions.
52 changes: 18 additions & 34 deletions src/frontend-common/cheevos.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1399,47 +1399,31 @@ void CheevosEventHandler(const rc_runtime_event_t* runtime_event)
SubmitLeaderboard(runtime_event->id, runtime_event->value);
}

// from cheats.cpp - do we want to move this somewhere else?
template<typename T>
static T DoMemoryRead(PhysicalMemoryAddress address)
{
T result;

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));
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));
return result;
}

if (address >= Bus::BIOS_BASE && address < (Bus::BIOS_BASE + Bus::BIOS_SIZE))
{
std::memcpy(&result, &Bus::g_bios[address & Bus::BIOS_MASK], sizeof(result));
return result;
}

result = static_cast<T>(0);
return result;
}

unsigned CheevosPeek(unsigned address, unsigned num_bytes, void* ud)
{
switch (num_bytes)
{
case 1:
return ZeroExtend32(DoMemoryRead<u8>(address));
{
u8 value = 0;
CPU::SafeReadMemoryByte(address, &value);
return value;
}

case 2:
return ZeroExtend32(DoMemoryRead<u16>(address));
{
u16 value;
CPU::SafeReadMemoryHalfWord(address, &value);
return value;
}

case 4:
return ZeroExtend32(DoMemoryRead<u32>(address));
{
u32 value;
CPU::SafeReadMemoryWord(address, &value);
return value;
}

default:
return 0;
}
Expand Down

0 comments on commit bacd834

Please sign in to comment.