#include "InstructionModifierLookup.h" #include "CPUContext.h" #include "Instruction.h" #include "Bus.h" #include #include #include #include #include void Mod32_SIB(CPUContext &cc) { std::cout << "[Mod32_SIB] SIB byte encountered." << std::endl; } void Mod32_LR(CPUContext& cc) { std::cout << "[Mod32_LR] Executed." << std::endl; if (cc.m_Instruction.m_ModRM.m_SIB) { uint32_t src = cc.m_Bus->AccessX(cc.m_InstructionPointer + cc.m_Instruction.m_Length); std::memcpy(&cc.m_Instruction.m_Displacement, &src, 4); Mod32_SIB(cc); } } void Mod32_DISP32(CPUContext& cc) { uint32_t src = cc.m_Bus->AccessX(cc.m_InstructionPointer + cc.m_Instruction.m_Length); std::memcpy(&cc.m_Instruction.m_Displacement, &src, 4); cc.m_Instruction.m_Length += 4; if (cc.m_Instruction.m_ModRM.m_SIB) Mod32_SIB(cc); } template void Mod32_LRDISP32(CPUContext& cc) { uint32_t disp = cc.m_Registers[RM] + cc.m_Bus->AccessX(cc.m_Instruction.m_Length); std::memcpy(&cc.m_Instruction.m_Displacement, &disp, 4); cc.m_Instruction.m_Length += 4; if (cc.m_Instruction.m_ModRM.m_SIB) Mod32_SIB(cc); } template void Mod32_LRDISP8(CPUContext& cc) { uint32_t disp = cc.m_Registers[RM] + cc.m_Bus->AccessX(cc.m_Instruction.m_Length); cc.m_Instruction.m_Displacement[0] = disp; cc.m_Instruction.m_Length += 1; if (cc.m_Instruction.m_ModRM.m_SIB) Mod32_SIB(cc); } void Mod32_R(CPUContext& cc) { std::cout << "[Mod32_R] Executed." << std::endl; } template static constexpr std::array GenerateModRM32(std::integer_sequence) { return std::array{ ([]() { constexpr auto modrm = x86::ProcessMODRM(I); switch (modrm.m_State) { case x86::ModRMState::LR: return Mod32_LR; case x86::ModRMState::LR_DISP32: return Mod32_LRDISP32; case x86::ModRMState::LR_DISP8: return Mod32_LRDISP8; case x86::ModRMState::DISP32: return Mod32_DISP32; case x86::ModRMState::R: return Mod32_R; } }.template operator()())... // provide the lambda with a proper template argument }; } static constexpr std::array s_ModRM32 = GenerateModRM32(std::make_integer_sequence{}); std::array GetMod32Table() { return s_ModRM32; }