|
|
|
@ -56,6 +56,7 @@ enum class CheatVmOpcodeType : u32 {
|
|
|
|
|
BeginRegisterConditionalBlock = 0xC0,
|
|
|
|
|
SaveRestoreRegister = 0xC1,
|
|
|
|
|
SaveRestoreRegisterMask = 0xC2,
|
|
|
|
|
ReadWriteStaticRegister = 0xC3,
|
|
|
|
|
|
|
|
|
|
// This is a meta entry, and not a real opcode.
|
|
|
|
|
// This is to facilitate multi-nybble instruction decoding.
|
|
|
|
@ -237,6 +238,11 @@ struct SaveRestoreRegisterMaskOpcode {
|
|
|
|
|
std::array<bool, 0x10> should_operate{};
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct ReadWriteStaticRegisterOpcode {
|
|
|
|
|
u32 static_idx{};
|
|
|
|
|
u32 idx{};
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct DebugLogOpcode {
|
|
|
|
|
u32 bit_width{};
|
|
|
|
|
u32 log_id{};
|
|
|
|
@ -259,7 +265,8 @@ struct CheatVmOpcode {
|
|
|
|
|
PerformArithmeticStaticOpcode, BeginKeypressConditionalOpcode,
|
|
|
|
|
PerformArithmeticRegisterOpcode, StoreRegisterToAddressOpcode,
|
|
|
|
|
BeginRegisterConditionalOpcode, SaveRestoreRegisterOpcode,
|
|
|
|
|
SaveRestoreRegisterMaskOpcode, DebugLogOpcode, UnrecognizedInstruction>
|
|
|
|
|
SaveRestoreRegisterMaskOpcode, ReadWriteStaticRegisterOpcode, DebugLogOpcode,
|
|
|
|
|
UnrecognizedInstruction>
|
|
|
|
|
opcode{};
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
@ -281,6 +288,10 @@ public:
|
|
|
|
|
|
|
|
|
|
static constexpr std::size_t MaximumProgramOpcodeCount = 0x400;
|
|
|
|
|
static constexpr std::size_t NumRegisters = 0x10;
|
|
|
|
|
static constexpr std::size_t NumReadableStaticRegisters = 0x80;
|
|
|
|
|
static constexpr std::size_t NumWritableStaticRegisters = 0x80;
|
|
|
|
|
static constexpr std::size_t NumStaticRegisters =
|
|
|
|
|
NumReadableStaticRegisters + NumWritableStaticRegisters;
|
|
|
|
|
|
|
|
|
|
explicit DmntCheatVm(std::unique_ptr<Callbacks> callbacks);
|
|
|
|
|
~DmntCheatVm();
|
|
|
|
@ -302,6 +313,7 @@ private:
|
|
|
|
|
std::array<u32, MaximumProgramOpcodeCount> program{};
|
|
|
|
|
std::array<u64, NumRegisters> registers{};
|
|
|
|
|
std::array<u64, NumRegisters> saved_values{};
|
|
|
|
|
std::array<u64, NumStaticRegisters> static_registers{};
|
|
|
|
|
std::array<std::size_t, NumRegisters> loop_tops{};
|
|
|
|
|
|
|
|
|
|
bool DecodeNextOpcode(CheatVmOpcode& out);
|
|
|
|
|