summaryrefslogtreecommitdiff
path: root/tb/mem.hpp
diff options
context:
space:
mode:
authorAlejandro Soto <alejandro@34project.org>2022-11-14 21:10:40 -0600
committerAlejandro Soto <alejandro@34project.org>2022-11-14 21:10:40 -0600
commit6fb3849e73b797d4610a2b782127f927dec0c9c9 (patch)
tree9d17de8907d860b795761e0644f17d0fd33106de /tb/mem.hpp
parentcad870295dfb741d5c24c25016c5bba878bc37e5 (diff)
Implement VGA simulation
Diffstat (limited to '')
-rw-r--r--tb/mem.hpp42
1 files changed, 9 insertions, 33 deletions
diff --git a/tb/mem.hpp b/tb/mem.hpp
index a76780d..0943530 100644
--- a/tb/mem.hpp
+++ b/tb/mem.hpp
@@ -1,5 +1,5 @@
-#ifndef MEM_HPP
-#define MEM_HPP
+#ifndef TALLER_MEM_HPP
+#define TALLER_MEM_HPP
#include <cstdint>
#include <memory>
@@ -8,54 +8,30 @@
namespace taller::avalon
{
+ template<typename Cell>
class mem : public slave
{
public:
mem(std::uint32_t base, std::uint32_t size);
- virtual inline std::uint32_t base_address() noexcept final override
- {
- return base;
- }
-
- virtual inline std::uint32_t address_mask() noexcept final override
- {
- return mask;
- }
-
virtual bool read(std::uint32_t addr, std::uint32_t &data) final override;
+
virtual bool write
(
std::uint32_t addr, std::uint32_t data, unsigned byte_enable = 0b1111
) final override;
template<typename F>
- void load(F loader, std::size_t addr = 0);
+ void load(F loader, std::size_t offset = 0);
private:
- std::unique_ptr<std::uint32_t[]> block;
- std::uint32_t base;
- std::uint32_t mask;
- unsigned count = 0;
+ std::unique_ptr<Cell[]> block;
+ unsigned count = 0;
bool ready() noexcept;
};
-
- template<typename F>
- void mem::load(F loader, std::size_t addr)
- {
- std::size_t size = mask + 1;
- while(addr < size)
- {
- std::size_t read = loader(&block[base + addr], size - addr);
- if(read == 0)
- {
- break;
- }
-
- addr += read;
- }
- }
}
+#include "mem.impl.hpp"
+
#endif