Mesen-X/Core/MemoryManager.cpp
2014-06-14 18:20:56 -04:00

85 lines
No EOL
1.8 KiB
C++

#include "stdafx.h"
#include "MemoryManager.h"
uint8_t MemoryManager::ReadRegister(uint16_t addr)
{
if(_registerHandlers[addr]) {
return _registerHandlers[addr]->MemoryRead(addr);
} else {
return 0;
}
}
void MemoryManager::WriteRegister(uint16_t addr, uint8_t value)
{
if(_registerHandlers[addr]) {
_registerHandlers[addr]->MemoryWrite(addr, value);
}
}
MemoryManager::MemoryManager()
{
_internalRAM = new uint8_t[InternalRAMSize];
_SRAM = new uint8_t[SRAMSize];
_expansionRAM = new uint8_t[0x2000];
ZeroMemory(_internalRAM, InternalRAMSize);
ZeroMemory(_SRAM, SRAMSize);
ZeroMemory(_expansionRAM, 0x2000);
for(int i = 0; i <= 0xFFFF; i++) {
_registerHandlers.push_back(nullptr);
}
}
MemoryManager::~MemoryManager()
{
delete[] _internalRAM;
delete[] _SRAM;
delete[] _expansionRAM;
}
void MemoryManager::RegisterIODevice(IMemoryHandler *handler)
{
std::array<int, 2> addresses = handler->GetIOAddresses();
for(int i = addresses[0]; i < addresses[1]; i++) {
_registerHandlers[i] = handler;
}
}
uint8_t MemoryManager::Read(uint16_t addr)
{
if(addr <= 0x1FFF) {
return _internalRAM[addr & 0x07FF];
} else if(addr <= 0x401F) {
return ReadRegister(addr);
} else if(addr <= 0x5FFF) {
return _expansionRAM[addr & 0x1FFF];
} else if(addr <= 0x7FFF) {
return _SRAM[addr & 0x1FFF];
} else {
return ReadRegister(addr);
}
}
void MemoryManager::Write(uint16_t addr, uint8_t value)
{
if(addr <= 0x1FFF) {
_internalRAM[addr & 0x07FF] = value;
} else if(addr <= 0x401F) {
WriteRegister(addr, value);
} else if(addr <= 0x5FFF) {
_expansionRAM[addr & 0x1FFF] = value;
} else if(addr <= 0x7FFF) {
_SRAM[addr & 0x1FFF] = value;
} else {
WriteRegister(addr, value);
}
}
uint16_t MemoryManager::ReadWord(uint16_t addr)
{
uint8_t lo = Read(addr);
uint8_t hi = Read(addr+1);
return lo | hi << 8;
}