#pragma once #include #include #include "Instruction.h" #include "Bus.h" #include "ExecutorCases.h" #include "CPUContext.h" enum class CPUExecutionMode { BIT_32, }; struct CPUStatus { uint32_t* m_Registers; uint32_t& m_IP; Instruction& m_Instruction; }; class CPU { public: CPU(std::shared_ptr& bus); ~CPU() = default; public: void Step(); void Dump(); void Reset(); bool IsHalted() { return m_IsHalted; } CPUStatus GetStatus(); private: void FetchDecode(); void Execute(); private: CPUExecutionMode m_Mode; uint32_t m_Registers[8]; uint16_t m_SegmentRegisters[8]; uint32_t m_InstructionPointer; uint32_t m_Flags; bool m_IsHalted; std::shared_ptr m_Bus; Instruction m_Instruction; CPUContext m_Context; private: // FetchDecode() must set m_Length before calling FetchModRMFields() void FetchModRMFields(uint8_t modrm); void FetchSIB(); };