summaryrefslogtreecommitdiff
path: root/src/Userspace.cpp
diff options
context:
space:
mode:
author0x221E <0x221E@0xinfinity.dev>2026-04-12 16:59:40 +0200
committer0x221E <0x221E@0xinfinity.dev>2026-04-12 16:59:40 +0200
commita66c7433c2c11b8b6c99142277ed4e16b1a2a465 (patch)
treee54bcfb59c303acf6118fd11f06d5c0bd5f24e5d /src/Userspace.cpp
initial commitHEADmaster
Diffstat (limited to 'src/Userspace.cpp')
-rw-r--r--src/Userspace.cpp99
1 files changed, 99 insertions, 0 deletions
diff --git a/src/Userspace.cpp b/src/Userspace.cpp
new file mode 100644
index 0000000..0dc2425
--- /dev/null
+++ b/src/Userspace.cpp
@@ -0,0 +1,99 @@
+#include "Userspace.h"
+
+#include "Bus.h"
+#include "RAM.h"
+
+#include <thread>
+
+Userspace::Userspace() : m_RAM(std::make_shared<RAM>()), m_ProgramMemory(std::make_shared<RAM>()), m_Bus(std::make_shared<Bus>(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<std::string>& Userspace::GetException() {
+ return m_ExceptionMessages;
+}