Files
Lucina3DS/externals/teakra/src/memory_interface.cpp
2025-02-06 22:24:29 +08:00

58 lines
2.2 KiB
C++

#include "memory_interface.h"
#include "mmio.h"
#include "shared_memory.h"
namespace Teakra {
MemoryInterface::MemoryInterface(SharedMemory& shared_memory,
MemoryInterfaceUnit& memory_interface_unit)
: shared_memory(shared_memory), memory_interface_unit(memory_interface_unit) {}
void MemoryInterface::SetMMIO(MMIORegion& mmio) {
this->mmio = &mmio;
}
u16 MemoryInterface::ProgramRead(u32 address) const {
return shared_memory.ReadWord(address);
}
void MemoryInterface::ProgramWrite(u32 address, u16 value) {
shared_memory.WriteWord(address, value);
}
u16 MemoryInterface::DataRead(u16 address, bool bypass_mmio) {
if (memory_interface_unit.InMMIO(address) && !bypass_mmio) {
ASSERT(mmio != nullptr);
return mmio->Read(memory_interface_unit.ToMMIO(address));
}
u32 converted = memory_interface_unit.ConvertDataAddress(address);
u16 value = shared_memory.ReadWord(converted);
return value;
}
void MemoryInterface::DataWrite(u16 address, u16 value, bool bypass_mmio) {
if (memory_interface_unit.InMMIO(address) && !bypass_mmio) {
ASSERT(mmio != nullptr);
return mmio->Write(memory_interface_unit.ToMMIO(address), value);
}
u32 converted = memory_interface_unit.ConvertDataAddress(address);
shared_memory.WriteWord(converted, value);
}
u16 MemoryInterface::DataReadA32(u32 address) const {
u32 converted = (address & ((MemoryInterfaceUnit::DataMemoryBankSize*2)-1))
+ MemoryInterfaceUnit::DataMemoryOffset;
return shared_memory.ReadWord(converted);
}
void MemoryInterface::DataWriteA32(u32 address, u16 value) {
u32 converted = (address & ((MemoryInterfaceUnit::DataMemoryBankSize*2)-1))
+ MemoryInterfaceUnit::DataMemoryOffset;
shared_memory.WriteWord(converted, value);
}
u16 MemoryInterface::MMIORead(u16 address) {
ASSERT(mmio != nullptr);
// according to GBATek ("DSi Teak I/O Ports (on ARM9 Side)"), these are mirrored
return mmio->Read(address & (MemoryInterfaceUnit::MMIOSize - 1));
}
void MemoryInterface::MMIOWrite(u16 address, u16 value) {
ASSERT(mmio != nullptr);
mmio->Write(address & (MemoryInterfaceUnit::MMIOSize - 1), value);
}
} // namespace Teakra