#include "Arithmetic.h" #include "ExecutorCases.h" #include "CPUContext.h" #include "Instruction.h" #include "Bus.h" #include #include 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(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(address); uint32_t currRegValue = cc.m_Registers[cc.m_Instruction.m_ModRM.m_Reg]; uint32_t result = dstPrevValue + currRegValue; cc.m_Bus->WriteX(address, result); } } }