Emulator: Add support for memory banks to memory spaces
This commit is contained in:
+27
-7
@@ -41,18 +41,38 @@ void Emu::addProcessingUnit(std::string_view name, ProcessingUnit* processing_un
|
|||||||
m_processing_units.emplace(name, processing_unit);
|
m_processing_units.emplace(name, processing_unit);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Emu::addMemorySpace(std::string_view name, uint32_t size)
|
void Emu::addMemorySpace(std::string_view name, uint32_t start_address, uint32_t end_adress, uint32_t amount_of_banks)
|
||||||
{
|
{
|
||||||
std::vector<uint32_t> memory(size);
|
uint32_t bank_length = 1 + end_adress - start_address;
|
||||||
m_memory_spaces.emplace(name, memory);
|
MemorySpace memory_space {
|
||||||
|
.memory = BankedMemory(amount_of_banks, std::vector<uint32_t>(bank_length)),
|
||||||
|
.active_bank = 0,
|
||||||
|
.start_address = start_address,
|
||||||
|
.end_address = end_adress,
|
||||||
|
};
|
||||||
|
|
||||||
|
m_memory_spaces.emplace(name, memory_space);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Emu::writeMemory(std::string_view memory_space, uint32_t location, uint32_t value)
|
void Emu::writeMemory(uint32_t address, uint32_t value)
|
||||||
{
|
{
|
||||||
m_memory_spaces[memory_space][location] = value;
|
for (auto& memory_space : m_memory_spaces) {
|
||||||
|
auto memory = memory_space.second;
|
||||||
|
if (address >= memory.start_address && address <= memory.end_address) {
|
||||||
|
memory.memory[memory.active_bank][address] = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t Emu::readMemory(std::string_view memory_space, uint32_t location)
|
uint32_t Emu::readMemory(uint32_t address)
|
||||||
{
|
{
|
||||||
return m_memory_spaces[memory_space][location];
|
for (auto& memory_space : m_memory_spaces) {
|
||||||
|
auto memory = memory_space.second;
|
||||||
|
if (address >= memory.start_address && address <= memory.end_address) {
|
||||||
|
return memory.memory[memory.active_bank][address];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,6 +17,15 @@
|
|||||||
#include "ruc/singleton.h"
|
#include "ruc/singleton.h"
|
||||||
#include "ruc/timer.h"
|
#include "ruc/timer.h"
|
||||||
|
|
||||||
|
using BankedMemory = std::vector<std::vector<uint32_t>>;
|
||||||
|
|
||||||
|
struct MemorySpace {
|
||||||
|
BankedMemory memory;
|
||||||
|
uint32_t active_bank { 0 };
|
||||||
|
uint32_t start_address { 0 };
|
||||||
|
uint32_t end_address { 0 };
|
||||||
|
};
|
||||||
|
|
||||||
class Emu final : public ruc::Singleton<Emu> {
|
class Emu final : public ruc::Singleton<Emu> {
|
||||||
public:
|
public:
|
||||||
Emu(s) {}
|
Emu(s) {}
|
||||||
@@ -26,10 +35,10 @@ public:
|
|||||||
void update();
|
void update();
|
||||||
|
|
||||||
void addProcessingUnit(std::string_view name, ProcessingUnit* processing_unit);
|
void addProcessingUnit(std::string_view name, ProcessingUnit* processing_unit);
|
||||||
void addMemorySpace(std::string_view name, uint32_t size);
|
void addMemorySpace(std::string_view name, uint32_t start_address, uint32_t end_address, uint32_t amount_of_banks = 1);
|
||||||
|
|
||||||
void writeMemory(std::string_view memory_space, uint32_t location, uint32_t value);
|
void writeMemory(uint32_t address, uint32_t value);
|
||||||
uint32_t readMemory(std::string_view memory_space, uint32_t location);
|
uint32_t readMemory(uint32_t address);
|
||||||
|
|
||||||
// -------------------------------------
|
// -------------------------------------
|
||||||
|
|
||||||
@@ -47,7 +56,7 @@ private:
|
|||||||
ruc::Timer m_timer;
|
ruc::Timer m_timer;
|
||||||
|
|
||||||
std::unordered_map<std::string_view, ProcessingUnit*> m_processing_units;
|
std::unordered_map<std::string_view, ProcessingUnit*> m_processing_units;
|
||||||
std::unordered_map<std::string_view, std::vector<uint32_t>> m_memory_spaces;
|
std::unordered_map<std::string_view, MemorySpace> m_memory_spaces;
|
||||||
|
|
||||||
std::string m_bootrom;
|
std::string m_bootrom;
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user