|
|
|
@ -136,131 +136,131 @@ union VmInt {
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct StoreStaticOpcode {
|
|
|
|
|
u32 bit_width;
|
|
|
|
|
MemoryAccessType mem_type;
|
|
|
|
|
u32 offset_register;
|
|
|
|
|
u64 rel_address;
|
|
|
|
|
VmInt value;
|
|
|
|
|
u32 bit_width{};
|
|
|
|
|
MemoryAccessType mem_type{};
|
|
|
|
|
u32 offset_register{};
|
|
|
|
|
u64 rel_address{};
|
|
|
|
|
VmInt value{};
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct BeginConditionalOpcode {
|
|
|
|
|
u32 bit_width;
|
|
|
|
|
MemoryAccessType mem_type;
|
|
|
|
|
ConditionalComparisonType cond_type;
|
|
|
|
|
u64 rel_address;
|
|
|
|
|
VmInt value;
|
|
|
|
|
u32 bit_width{};
|
|
|
|
|
MemoryAccessType mem_type{};
|
|
|
|
|
ConditionalComparisonType cond_type{};
|
|
|
|
|
u64 rel_address{};
|
|
|
|
|
VmInt value{};
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct EndConditionalOpcode {};
|
|
|
|
|
|
|
|
|
|
struct ControlLoopOpcode {
|
|
|
|
|
bool start_loop;
|
|
|
|
|
u32 reg_index;
|
|
|
|
|
u32 num_iters;
|
|
|
|
|
bool start_loop{};
|
|
|
|
|
u32 reg_index{};
|
|
|
|
|
u32 num_iters{};
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct LoadRegisterStaticOpcode {
|
|
|
|
|
u32 reg_index;
|
|
|
|
|
u64 value;
|
|
|
|
|
u32 reg_index{};
|
|
|
|
|
u64 value{};
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct LoadRegisterMemoryOpcode {
|
|
|
|
|
u32 bit_width;
|
|
|
|
|
MemoryAccessType mem_type;
|
|
|
|
|
u32 reg_index;
|
|
|
|
|
bool load_from_reg;
|
|
|
|
|
u64 rel_address;
|
|
|
|
|
u32 bit_width{};
|
|
|
|
|
MemoryAccessType mem_type{};
|
|
|
|
|
u32 reg_index{};
|
|
|
|
|
bool load_from_reg{};
|
|
|
|
|
u64 rel_address{};
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct StoreStaticToAddressOpcode {
|
|
|
|
|
u32 bit_width;
|
|
|
|
|
u32 reg_index;
|
|
|
|
|
bool increment_reg;
|
|
|
|
|
bool add_offset_reg;
|
|
|
|
|
u32 offset_reg_index;
|
|
|
|
|
u64 value;
|
|
|
|
|
u32 bit_width{};
|
|
|
|
|
u32 reg_index{};
|
|
|
|
|
bool increment_reg{};
|
|
|
|
|
bool add_offset_reg{};
|
|
|
|
|
u32 offset_reg_index{};
|
|
|
|
|
u64 value{};
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct PerformArithmeticStaticOpcode {
|
|
|
|
|
u32 bit_width;
|
|
|
|
|
u32 reg_index;
|
|
|
|
|
RegisterArithmeticType math_type;
|
|
|
|
|
u32 value;
|
|
|
|
|
u32 bit_width{};
|
|
|
|
|
u32 reg_index{};
|
|
|
|
|
RegisterArithmeticType math_type{};
|
|
|
|
|
u32 value{};
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct BeginKeypressConditionalOpcode {
|
|
|
|
|
u32 key_mask;
|
|
|
|
|
u32 key_mask{};
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct PerformArithmeticRegisterOpcode {
|
|
|
|
|
u32 bit_width;
|
|
|
|
|
RegisterArithmeticType math_type;
|
|
|
|
|
u32 dst_reg_index;
|
|
|
|
|
u32 src_reg_1_index;
|
|
|
|
|
u32 src_reg_2_index;
|
|
|
|
|
bool has_immediate;
|
|
|
|
|
VmInt value;
|
|
|
|
|
u32 bit_width{};
|
|
|
|
|
RegisterArithmeticType math_type{};
|
|
|
|
|
u32 dst_reg_index{};
|
|
|
|
|
u32 src_reg_1_index{};
|
|
|
|
|
u32 src_reg_2_index{};
|
|
|
|
|
bool has_immediate{};
|
|
|
|
|
VmInt value{};
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct StoreRegisterToAddressOpcode {
|
|
|
|
|
u32 bit_width;
|
|
|
|
|
u32 str_reg_index;
|
|
|
|
|
u32 addr_reg_index;
|
|
|
|
|
bool increment_reg;
|
|
|
|
|
StoreRegisterOffsetType ofs_type;
|
|
|
|
|
MemoryAccessType mem_type;
|
|
|
|
|
u32 ofs_reg_index;
|
|
|
|
|
u64 rel_address;
|
|
|
|
|
u32 bit_width{};
|
|
|
|
|
u32 str_reg_index{};
|
|
|
|
|
u32 addr_reg_index{};
|
|
|
|
|
bool increment_reg{};
|
|
|
|
|
StoreRegisterOffsetType ofs_type{};
|
|
|
|
|
MemoryAccessType mem_type{};
|
|
|
|
|
u32 ofs_reg_index{};
|
|
|
|
|
u64 rel_address{};
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct BeginRegisterConditionalOpcode {
|
|
|
|
|
u32 bit_width;
|
|
|
|
|
ConditionalComparisonType cond_type;
|
|
|
|
|
u32 val_reg_index;
|
|
|
|
|
CompareRegisterValueType comp_type;
|
|
|
|
|
MemoryAccessType mem_type;
|
|
|
|
|
u32 addr_reg_index;
|
|
|
|
|
u32 other_reg_index;
|
|
|
|
|
u32 ofs_reg_index;
|
|
|
|
|
u64 rel_address;
|
|
|
|
|
VmInt value;
|
|
|
|
|
u32 bit_width{};
|
|
|
|
|
ConditionalComparisonType cond_type{};
|
|
|
|
|
u32 val_reg_index{};
|
|
|
|
|
CompareRegisterValueType comp_type{};
|
|
|
|
|
MemoryAccessType mem_type{};
|
|
|
|
|
u32 addr_reg_index{};
|
|
|
|
|
u32 other_reg_index{};
|
|
|
|
|
u32 ofs_reg_index{};
|
|
|
|
|
u64 rel_address{};
|
|
|
|
|
VmInt value{};
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct SaveRestoreRegisterOpcode {
|
|
|
|
|
u32 dst_index;
|
|
|
|
|
u32 src_index;
|
|
|
|
|
SaveRestoreRegisterOpType op_type;
|
|
|
|
|
u32 dst_index{};
|
|
|
|
|
u32 src_index{};
|
|
|
|
|
SaveRestoreRegisterOpType op_type{};
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct SaveRestoreRegisterMaskOpcode {
|
|
|
|
|
SaveRestoreRegisterOpType op_type;
|
|
|
|
|
std::array<bool, 0x10> should_operate;
|
|
|
|
|
SaveRestoreRegisterOpType op_type{};
|
|
|
|
|
std::array<bool, 0x10> should_operate{};
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct DebugLogOpcode {
|
|
|
|
|
u32 bit_width;
|
|
|
|
|
u32 log_id;
|
|
|
|
|
DebugLogValueType val_type;
|
|
|
|
|
MemoryAccessType mem_type;
|
|
|
|
|
u32 addr_reg_index;
|
|
|
|
|
u32 val_reg_index;
|
|
|
|
|
u32 ofs_reg_index;
|
|
|
|
|
u64 rel_address;
|
|
|
|
|
u32 bit_width{};
|
|
|
|
|
u32 log_id{};
|
|
|
|
|
DebugLogValueType val_type{};
|
|
|
|
|
MemoryAccessType mem_type{};
|
|
|
|
|
u32 addr_reg_index{};
|
|
|
|
|
u32 val_reg_index{};
|
|
|
|
|
u32 ofs_reg_index{};
|
|
|
|
|
u64 rel_address{};
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct UnrecognizedInstruction {
|
|
|
|
|
CheatVmOpcodeType opcode;
|
|
|
|
|
CheatVmOpcodeType opcode{};
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct CheatVmOpcode {
|
|
|
|
|
bool begin_conditional_block;
|
|
|
|
|
bool begin_conditional_block{};
|
|
|
|
|
std::variant<StoreStaticOpcode, BeginConditionalOpcode, EndConditionalOpcode, ControlLoopOpcode,
|
|
|
|
|
LoadRegisterStaticOpcode, LoadRegisterMemoryOpcode, StoreStaticToAddressOpcode,
|
|
|
|
|
PerformArithmeticStaticOpcode, BeginKeypressConditionalOpcode,
|
|
|
|
|
PerformArithmeticRegisterOpcode, StoreRegisterToAddressOpcode,
|
|
|
|
|
BeginRegisterConditionalOpcode, SaveRestoreRegisterOpcode,
|
|
|
|
|
SaveRestoreRegisterMaskOpcode, DebugLogOpcode, UnrecognizedInstruction>
|
|
|
|
|
opcode;
|
|
|
|
|
opcode{};
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
class DmntCheatVm {
|
|
|
|
|