Refactor: Seperate executor cases to categories.
This commit is contained in:
@@ -1,5 +1,10 @@
|
||||
#include "ExecutorCases.h"
|
||||
|
||||
#include "DataTransfer.h"
|
||||
#include "ControlFlow.h"
|
||||
#include "Arithmetic.h"
|
||||
#include "Misc.h"
|
||||
|
||||
#include "Instruction.h"
|
||||
#include "Bus.h"
|
||||
|
||||
@@ -10,70 +15,11 @@ CPUContext::CPUContext(Instruction& i, uint32_t& ip, uint32_t& flags, uint32_t*
|
||||
|
||||
CPUContext::~CPUContext() = default;
|
||||
|
||||
// NO SIB SUPPORT YET
|
||||
namespace executor_cases {
|
||||
void Nop(CPUContext& cc){
|
||||
std::cout << "No op" << std::endl;
|
||||
}
|
||||
|
||||
void Hlt(CPUContext& cc){
|
||||
std::cout << "Program halted!" << std::endl;
|
||||
exit(0);
|
||||
}
|
||||
|
||||
void Mov_r32_imm32(CPUContext& cc){
|
||||
cc.m_Registers[cc.m_Instruction.m_Operand1] = cc.m_Instruction.m_Operand2;
|
||||
}
|
||||
|
||||
void Add_rm32_r32(CPUContext& cc){
|
||||
x86::ModRM modrm = cc.m_Instruction.optional.m_ModRM;
|
||||
|
||||
switch(modrm.m_State) {
|
||||
case x86::ModRMState::R:
|
||||
{
|
||||
cc.m_Registers[modrm.m_Rm] += cc.m_Registers[modrm.m_Reg];
|
||||
break;
|
||||
}
|
||||
case x86::ModRMState::LR:
|
||||
{
|
||||
uint32_t dstPrevValue = cc.m_Bus->AccessX<uint32_t>(cc.m_Registers[modrm.m_Rm]);
|
||||
uint32_t currRegValue = cc.m_Registers[modrm.m_Reg];
|
||||
uint32_t result = dstPrevValue + currRegValue;
|
||||
cc.m_Bus->WriteX<uint32_t>(cc.m_Registers[modrm.m_Rm], result);
|
||||
break;
|
||||
}
|
||||
case x86::ModRMState::LR_DISP8:
|
||||
case x86::ModRMState::LR_DISP32:
|
||||
{
|
||||
uint32_t dstAddress = cc.m_Registers[modrm.m_Rm] + cc.m_Instruction.m_Operand1;
|
||||
uint32_t dstPrevValue = cc.m_Bus->AccessX<uint32_t>(dstAddress);
|
||||
uint32_t currRegValue = cc.m_Registers[modrm.m_Reg];
|
||||
uint32_t result = dstPrevValue + currRegValue;
|
||||
cc.m_Bus->WriteX<uint32_t>(dstAddress, result);
|
||||
break;
|
||||
}
|
||||
case x86::ModRMState::DISP32:
|
||||
{
|
||||
uint32_t dstAddress = cc.m_Instruction.m_Operand1;
|
||||
uint32_t dstPrevValue = cc.m_Bus->AccessX<uint32_t>(dstAddress);
|
||||
uint32_t currRegValue = cc.m_Registers[modrm.m_Reg];
|
||||
uint32_t result = dstPrevValue + currRegValue;
|
||||
cc.m_Bus->WriteX<uint32_t>(dstAddress, result);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
throw std::runtime_error("Invalid ModRM State encountered during Add_rm32_r32");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
constexpr std::array<ExecutorCase, 255> GenerateExecutorTable(){
|
||||
std::array<ExecutorCase, 255> table{};
|
||||
table[Opcode::NOP] = executor_cases::Nop;
|
||||
table[Opcode::HLT] = executor_cases::Hlt;
|
||||
table[Opcode::MOV_R_IMM32] = executor_cases::Mov_r32_imm32;
|
||||
table[Opcode::MOV_R32_IMM32] = executor_cases::Mov_r32_imm32;
|
||||
table[Opcode::ADD_RM32_R32] = executor_cases::Add_rm32_r32;
|
||||
return table;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user