39 lines
664 B
C++
39 lines
664 B
C++
#pragma once
|
|
|
|
#include <cstdint>
|
|
#include <memory>
|
|
#include <array>
|
|
|
|
struct Instruction;
|
|
class Bus;
|
|
|
|
struct CPUContext {
|
|
Instruction& m_Instruction;
|
|
uint64_t& m_InstructionPointer;
|
|
uint64_t& m_Flags;
|
|
uint64_t* m_Registers;
|
|
std::shared_ptr<Bus> m_Bus;
|
|
|
|
CPUContext(Instruction& i, uint64_t& ip, uint64_t& flags, uint64_t* reg, std::shared_ptr<Bus>& bus);
|
|
~CPUContext();
|
|
};
|
|
|
|
enum class ModRMState : uint8_t
|
|
{
|
|
INVALID = 0,
|
|
LR = 1,
|
|
LR_DISP8 = 2,
|
|
LR_DISP32 = 3,
|
|
R = 4
|
|
};
|
|
|
|
struct ModRM{
|
|
ModRMState m_State;
|
|
uint8_t m_Reg;
|
|
uint8_t m_Rm;
|
|
};
|
|
|
|
typedef void (*ExecutorCase)(CPUContext&);
|
|
|
|
const std::array<ExecutorCase, 255>& GetExecutorTable();
|