#pragma once class Bus; #include #include #include #include #include "CPU.h" enum class SystemStatus { STOPPED, RUNNING, EXCEPTION }; class Userspace { public: Userspace(); ~Userspace() = default; void Upload2Memory(uint8_t bytes[], size_t len); uint8_t* RetrieveMemory(); void Run(); void Start(); void Stop(); void Step(); void Reset(); void Exit(); SystemStatus GetSystemStatus(); CPUStatus GetCPUStatus(); std::vector& GetException(); private: std::shared_ptr m_RAM; std::shared_ptr m_Bus; CPU m_CPU; std::atomic m_Status = SystemStatus::STOPPED; std::atomic m_ApplicationRunning = false; std::vector m_ExceptionMessages; std::shared_ptr m_ProgramMemory; size_t m_ProgramMemoryLen; private: void StepCPU(); void EmulatorLoop(); };