Creating the base of the Memory Bus

This commit is contained in:
AnonymusRaccoon
2020-01-23 19:28:40 +01:00
parent 644e334789
commit 01ad5b6f30
5 changed files with 122 additions and 1 deletions
+25
View File
@@ -0,0 +1,25 @@
//
// Created by anonymus-raccoon on 1/23/20.
//
#include "IMemory.hpp"
#include <algorithm>
namespace ComSquare
{
void IMemory::setMemoryRegion(uint32_t start, uint32_t end)
{
this->_start = start;
this->_end = end;
}
bool IMemory::hasMemorydAt(uint32_t addr)
{
return this->_start <= addr && addr <= this->_end;
}
uint32_t IMemory::getStart()
{
return this->_start;
}
}
+28
View File
@@ -0,0 +1,28 @@
//
// Created by anonymus-raccoon on 1/23/20.
//
#ifndef COMSQUARE_IMEMORY_HPP
#define COMSQUARE_IMEMORY_HPP
#include <cstdint>
#include <vector>
namespace ComSquare
{
class IMemory {
private:
uint32_t _start;
uint32_t _end;
public:
virtual uint8_t read(uint32_t addr) = 0;
virtual void write(uint32_t addr, uint8_t data) = 0;
void setMemoryRegion(uint32_t start, uint32_t end);
bool hasMemorydAt(uint32_t addr);
uint32_t getStart();
};
};
#endif //COMSQUARE_IMEMORY_HPP
+42
View File
@@ -0,0 +1,42 @@
//
// Created by anonymus-raccoon on 1/23/20.
//
#include <ios>
#include <iostream>
#include "MemoryBus.hpp"
namespace ComSquare
{
IMemory *MemoryBus::getAccessor(uint32_t addr)
{
return std::find_if(this->_memoryAccessors.begin(), this->_memoryAccessors.end(), [addr](IMemory *accessor)
{
return accessor->hasMemorydAt(addr);
}).base();
}
uint8_t MemoryBus::read(uint32_t addr)
{
IMemory *handler = this->getAccessor(addr);
if (!handler) {
std::cout << "Unknown memory accessor for address " << std::hex << addr << ". Using open bus." << std::endl;
return this->_openbus;
}
uint8_t data = handler->read(addr - handler->getStart());
this->_openbus = data;
return data;
}
void MemoryBus::write(uint32_t addr, uint8_t data)
{
IMemory *handler = this->getAccessor(addr);
if (!handler) {
std::cout << "Unknown memory accessor for address " << std::hex << addr << ". Warning, it was a write." << std::endl;
return;
}
handler->write(addr - handler->getStart(), data);
}
}
+26
View File
@@ -0,0 +1,26 @@
//
// Created by anonymus-raccoon on 1/23/20.
//
#ifndef COMSQUARE_MEMORYBUS_HPP
#define COMSQUARE_MEMORYBUS_HPP
#include <cstdint>
#include <vector>
#include "IMemory.hpp"
namespace ComSquare
{
class MemoryBus {
private:
std::vector<IMemory> _memoryAccessors;
IMemory * getAccessor(uint32_t addr);
uint8_t _openbus;
public:
uint8_t read(uint32_t addr);
void write(uint32_t addr, uint8_t data);
};
}
#endif //COMSQUARE_MEMORYBUS_HPP