#pragma once #include "PPUOpcodes.h" #include "rx/cpu/cell/ppu/Instruction.hpp" #include "rx/cpu/cell/ppu/Opcode.hpp" #include "rx/cpu/cell/ppu/PPUContext.hpp" #include "rx/refl.hpp" #include class ppu_thread; using ppu_intrp_func_t = void (*)(ppu_thread& ppu_, ppu_opcode_t op, be_t* this_op, struct ppu_intrp_func* next_fn); struct ppu_intrp_func { ppu_intrp_func_t fn; }; template struct ppu_interpreter_t; namespace asmjit { struct ppu_builder; } struct ppu_interpreter_rt_base { protected: std::unique_ptr> ptrs; ppu_interpreter_rt_base() noexcept; ppu_interpreter_rt_base(const ppu_interpreter_rt_base&) = delete; ppu_interpreter_rt_base& operator=(const ppu_interpreter_rt_base&) = delete; virtual ~ppu_interpreter_rt_base(); }; struct ppu_interpreter_rt : ppu_interpreter_rt_base { ppu_interpreter_rt() noexcept; ppu_intrp_func_t decode(u32 op) const noexcept; private: ppu_decoder, ppu_intrp_func_t> table; }; struct PPUContext; struct PPUInterpreter { std::array> impl; PPUInterpreter(); void interpret(PPUContext& context, std::uint32_t inst); };