#pragma once #include // uint8_t, uint32_t #include #include #include "processing-unit.h" #include "ruc/singleton.h" #include "ruc/timer.h" class Emu final : public ruc::Singleton { public: Emu(s) {} void init(uint32_t frequency); void update(); void addProcessingUnit(const char* name, ProcessingUnit* processing_unit); void addMemorySpace(const char* name, uint32_t size); void writeMemory(const char* memory_space, uint32_t location, uint32_t value); uint8_t readMemory(const char* memory_space, uint32_t location); private: uint32_t m_frequency = 0; double m_timestep = 0; uint32_t m_cycle = 0; double m_cycle_time = 0; double m_previous_time = 0; ruc::Timer m_timer; std::unordered_map m_processing_units; std::unordered_map> m_memory_spaces; };