mirror of
https://github.com/zoriya/ComSquare.git
synced 2026-06-09 20:59:06 +00:00
Creating the base of the Memory Bus
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user