#include "Userspace.h" #include "Bus.h" #include "RAM.h" #include Userspace::Userspace() : m_RAM(std::make_shared()), m_ProgramMemory(std::make_shared()), m_Bus(std::make_shared(m_RAM)), m_CPU(m_Bus) { std::cout << "[Userspace] Emulation started." << std::endl; m_ApplicationRunning = true; m_Status = SystemStatus::STOPPED; } void Userspace::Upload2Memory(uint8_t bytes[], size_t len) { m_ProgramMemoryLen = len; std::memcpy(m_RAM->Data(), bytes, len); std::memcpy(m_ProgramMemory->Data(), bytes, len); } uint8_t* Userspace::RetrieveMemory() { return m_RAM->Data(); } void Userspace::Run() { while(m_ApplicationRunning) { EmulatorLoop(); } } void Userspace::StepCPU() { try { m_CPU.Step(); } catch (CPUException& c) { m_Status = SystemStatus::EXCEPTION; m_ExceptionMessages.push_back(c.GetMessage()); } } void Userspace::EmulatorLoop() { while(m_Status == SystemStatus::RUNNING) { if(!m_CPU.IsHalted()) { StepCPU(); } if (m_CPU.IsHalted()) { if(m_Status == SystemStatus::RUNNING) m_Status = SystemStatus::STOPPED; std::this_thread::sleep_for(std::chrono::milliseconds(10)); } } if(m_Status == SystemStatus::STOPPED) std::this_thread::sleep_for(std::chrono::milliseconds(10)); } void Userspace::Reset() { if(m_CPU.IsHalted()) m_Status = SystemStatus::STOPPED; m_CPU.Reset(); std::memcpy(m_RAM->Data(), m_ProgramMemory->Data(), m_ProgramMemoryLen); m_ExceptionMessages.clear(); } void Userspace::Start() { m_Status = SystemStatus::RUNNING; } void Userspace::Step() { if(!m_CPU.IsHalted()) { StepCPU(); std::cout << "[Userspace] CPU stepped!" << std::endl; } else { std::cout << "[Userspace] CPU is halted! Cannot step." << std::endl; } } void Userspace::Stop() { m_Status = SystemStatus::STOPPED; std::cout << "[Userspace] Emulation stopped." << std::endl; } void Userspace::Exit() { m_Status = SystemStatus::STOPPED; m_ApplicationRunning = false; std::cout << "[Userspace] Emulation exited." << std::endl; } SystemStatus Userspace::GetSystemStatus() { return m_Status; } CPUStatus Userspace::GetCPUStatus() { return m_CPU.GetStatus(); } std::vector& Userspace::GetException() { return m_ExceptionMessages; }