diff options
| author | Alejandro Soto <alejandro@34project.org> | 2022-11-14 21:10:40 -0600 |
|---|---|---|
| committer | Alejandro Soto <alejandro@34project.org> | 2022-11-14 21:10:40 -0600 |
| commit | 6fb3849e73b797d4610a2b782127f927dec0c9c9 (patch) | |
| tree | 9d17de8907d860b795761e0644f17d0fd33106de /tb/mem.hpp | |
| parent | cad870295dfb741d5c24c25016c5bba878bc37e5 (diff) | |
Implement VGA simulation
Diffstat (limited to 'tb/mem.hpp')
| -rw-r--r-- | tb/mem.hpp | 42 |
1 files changed, 9 insertions, 33 deletions
@@ -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 |
