2019-02-17 14:42:35 -05:00
|
|
|
#pragma once
|
|
|
|
#include "stdafx.h"
|
|
|
|
#include "IMemoryHandler.h"
|
2019-02-26 22:27:09 -05:00
|
|
|
#include "DebugTypes.h"
|
2019-02-17 14:42:35 -05:00
|
|
|
|
|
|
|
class RamHandler : public IMemoryHandler
|
|
|
|
{
|
|
|
|
private:
|
|
|
|
uint8_t * _ram;
|
2019-03-06 22:23:50 -05:00
|
|
|
uint32_t _mask;
|
2019-02-17 14:42:35 -05:00
|
|
|
|
2020-02-22 17:42:18 -05:00
|
|
|
protected:
|
|
|
|
uint32_t _offset;
|
|
|
|
|
2019-02-17 14:42:35 -05:00
|
|
|
public:
|
2020-03-01 18:24:33 -05:00
|
|
|
RamHandler(uint8_t *ram, uint32_t offset, uint32_t size, SnesMemoryType memoryType) : IMemoryHandler(memoryType)
|
2019-02-17 14:42:35 -05:00
|
|
|
{
|
2019-02-26 22:27:09 -05:00
|
|
|
_ram = ram + offset;
|
|
|
|
_offset = offset;
|
2019-03-22 21:11:42 -04:00
|
|
|
|
|
|
|
if(size - offset < 0x1000) {
|
2019-04-03 20:07:47 -04:00
|
|
|
_mask = size - offset - 1;
|
2019-03-22 21:11:42 -04:00
|
|
|
} else {
|
|
|
|
_mask = 0xFFF;
|
|
|
|
}
|
2019-02-26 22:27:09 -05:00
|
|
|
_memoryType = memoryType;
|
2019-02-17 14:42:35 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
uint8_t Read(uint32_t addr) override
|
|
|
|
{
|
2019-03-06 22:23:50 -05:00
|
|
|
return _ram[addr & _mask];
|
2019-02-17 14:42:35 -05:00
|
|
|
}
|
|
|
|
|
2019-02-26 22:27:09 -05:00
|
|
|
uint8_t Peek(uint32_t addr) override
|
|
|
|
{
|
2019-03-06 22:23:50 -05:00
|
|
|
return _ram[addr & _mask];
|
2019-02-26 22:27:09 -05:00
|
|
|
}
|
|
|
|
|
2019-12-08 11:54:19 -05:00
|
|
|
void PeekBlock(uint32_t addr, uint8_t *output) override
|
2019-03-26 22:34:48 -04:00
|
|
|
{
|
|
|
|
if(_mask != 0xFFF) {
|
|
|
|
for(int i = 0; i < 0x1000; i++) {
|
|
|
|
output[i] = _ram[i & _mask];
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
memcpy(output, _ram, 0x1000);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-02-17 14:42:35 -05:00
|
|
|
void Write(uint32_t addr, uint8_t value) override
|
|
|
|
{
|
2019-03-06 22:23:50 -05:00
|
|
|
_ram[addr & _mask] = value;
|
2019-02-17 14:42:35 -05:00
|
|
|
}
|
2019-02-26 22:27:09 -05:00
|
|
|
|
|
|
|
AddressInfo GetAbsoluteAddress(uint32_t address) override
|
|
|
|
{
|
|
|
|
AddressInfo info;
|
2019-03-06 22:23:50 -05:00
|
|
|
info.Address = _offset + (address & _mask);
|
2019-02-26 22:27:09 -05:00
|
|
|
info.Type = _memoryType;
|
|
|
|
return info;
|
|
|
|
}
|
2019-02-17 14:42:35 -05:00
|
|
|
};
|