58 lines
2.2 KiB
C++
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
|