diff options
Diffstat (limited to 'src/Arithmetic.cpp')
| -rw-r--r-- | src/Arithmetic.cpp | 63 |
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); + } + } +} |
