summaryrefslogtreecommitdiff
path: root/src/Arithmetic.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/Arithmetic.cpp
initial commitHEADmaster
Diffstat (limited to 'src/Arithmetic.cpp')
-rw-r--r--src/Arithmetic.cpp63
1 files changed, 63 insertions, 0 deletions
diff --git a/src/Arithmetic.cpp b/src/Arithmetic.cpp
new file mode 100644
index 0000000..dd2a1ef
--- /dev/null
+++ b/src/Arithmetic.cpp
@@ -0,0 +1,63 @@
+#include "Arithmetic.h"
+
+#include "ExecutorCases.h"
+#include "CPUContext.h"
+#include "Instruction.h"
+#include "Bus.h"
+
+#include <stdexcept>
+#include <iostream>
+
+namespace executor_cases {
+ void Add_rm32_r32(CPUContext& cc){
+ x86::ModRM modrm = cc.m_Instruction.m_ModRM;
+
+ std::cout << "[Instruction] ";
+
+ switch(modrm.m_State) {
+ case x86::ModRMState::R:
+ cc.m_Registers[modrm.m_Rm] += cc.m_Registers[modrm.m_Reg];
+ std::cout << "add " << x86::Register2Str((x86::Register)modrm.m_Rm) << ", " << x86::Register2Str((x86::Register)modrm.m_Rm);
+ break;
+ default:
+ helpers::Add_rm_dst(cc, helpers::ResolveModRMAddress(cc));
+ std::cout << "add DWORD PTR [0x" << helpers::ResolveModRMAddress(cc) << "], " << x86::Register2Str((x86::Register)modrm.m_Reg);
+ break;
+ }
+
+ std::cout << std::endl;
+ }
+
+ // TODO: Finish the function
+ void Add_r32_rm32(CPUContext& cc){
+ // x86::ModRM modrm = cc.m_Instruction.optional.m_ModRM;
+
+ // std::cout << "[Instruction] ";
+
+ // switch(modrm.m_State) {
+ // case x86::ModRMState::R:
+ // cc.m_Registers[modrm.m_Reg] += cc.m_Registers[modrm.m_Rm];
+ // std::cout << "add " << x86::Register2Str((x86::Register)modrm.m_Reg) << ", " << x86::Register2Str((x86::Register)modrm.m_Rm);
+ // break;
+ // default:
+ // uint32_t dstAddress = ;ResolveModRMAddress(cc);
+ // uint32_t dstPrevValue = cc.m_Bus->AccessX<uint32_t>(dstAddress);
+ // uint32_t currRegValue = cc.m_Registers[cc.m_Instruction.optional.m_ModRM.m_Reg];
+ // uint32_t result = dstPrevValue + currRegValue;
+ // std::cout << "add DWORD PTR [0x" << helpers::ResolveModRMAddress(cc) << "], " << x86::Register2Str((x86::Register)modrm.m_Reg);
+ // break;
+ // }
+
+ // std::cout << std::endl;
+ std::runtime_error("Not implemented!");
+ }
+
+ namespace helpers {
+ void Add_rm_dst(CPUContext& cc, uint32_t address) {
+ uint32_t dstPrevValue = cc.m_Bus->AccessX<uint32_t>(address);
+ uint32_t currRegValue = cc.m_Registers[cc.m_Instruction.m_ModRM.m_Reg];
+ uint32_t result = dstPrevValue + currRegValue;
+ cc.m_Bus->WriteX<uint32_t>(address, result);
+ }
+ }
+}