This commit is contained in:
wheremyfoodat 2023-07-21 15:12:40 +03:00
parent 0588b99674
commit 5d8f75a385

View file

@ -29,14 +29,14 @@ void ActionReplay::runCheat(const Cheat& cheat) {
} }
// Fetch instruction // Fetch instruction
const u32 instruction = cheat[pc++]; const u32 instruction = cheat[pc++];
// Instructions D0000000 00000000 and D2000000 00000000 are unconditional // Instructions D0000000 00000000 and D2000000 00000000 are unconditional
bool isUnconditional = cheat[pc] == 0 && (instruction == 0xD0000000 || instruction == 0xD2000000); bool isUnconditional = cheat[pc] == 0 && (instruction == 0xD0000000 || instruction == 0xD2000000);
if (ifStackIndex > 0 && !isUnconditional && !ifStack[ifStackIndex - 1]) { if (ifStackIndex > 0 && !isUnconditional && !ifStack[ifStackIndex - 1]) {
pc++; // Eat up dummy word pc++; // Eat up dummy word
continue; // Skip conditional instructions where the condition is false continue; // Skip conditional instructions where the condition is false
} }
runInstruction(cheat, instruction); runInstruction(cheat, instruction);
} }
} }
@ -96,15 +96,16 @@ void ActionReplay::runInstruction(const Cheat& cheat, u32 instruction) {
break; break;
} }
#define MAKE_IF_INSTRUCTION(opcode, comparator) \ // clang-format off
case opcode: { \ #define MAKE_IF_INSTRUCTION(opcode, comparator) \
const u32 baseAddr = Helpers::getBits<0, 28>(instruction); \ case opcode: { \
const u32 imm = cheat[pc++]; \ const u32 baseAddr = Helpers::getBits<0, 28>(instruction); \
const u32 value = read32(baseAddr + *activeOffset); \ const u32 imm = cheat[pc++]; \
\ const u32 value = read32(baseAddr + *activeOffset); \
pushConditionBlock(imm comparator value); \ \
break; \ pushConditionBlock(imm comparator value); \
} break; \
}
// Greater Than (YYYYYYYY > [XXXXXXX + offset]) (Unsigned) // Greater Than (YYYYYYYY > [XXXXXXX + offset]) (Unsigned)
MAKE_IF_INSTRUCTION(3, >) MAKE_IF_INSTRUCTION(3, >)
@ -112,12 +113,22 @@ void ActionReplay::runInstruction(const Cheat& cheat, u32 instruction) {
// Less Than (YYYYYYYY < [XXXXXXX + offset]) (Unsigned) // Less Than (YYYYYYYY < [XXXXXXX + offset]) (Unsigned)
MAKE_IF_INSTRUCTION(4, <) MAKE_IF_INSTRUCTION(4, <)
// Equal to (YYYYYYYY == [XXXXXXX + offset]) (Unsigned) // Equal to (YYYYYYYY == [XXXXXXX + offset])
MAKE_IF_INSTRUCTION(5, ==) MAKE_IF_INSTRUCTION(5, ==)
// Not Equal (YYYYYYYY != [XXXXXXX + offset]) (Unsigned) // Not Equal (YYYYYYYY != [XXXXXXX + offset])
MAKE_IF_INSTRUCTION(6, !=) MAKE_IF_INSTRUCTION(6, !=)
#undef MAKE_IF_INSTRUCTION #undef MAKE_IF_INSTRUCTION
// clang-format on
// BXXXXXXX 00000000 - offset = *(XXXXXXX + offset)
case 0xB: {
const u32 baseAddr = Helpers::getBits<0, 28>(instruction);
*activeOffset = read32(baseAddr + *activeOffset);
pc++; // Eat up dummy word
break;
}
case 0xD: executeDType(cheat, instruction); break; case 0xD: executeDType(cheat, instruction); break;
default: Helpers::panic("Unimplemented ActionReplay instruction type %X", type); break; default: Helpers::panic("Unimplemented ActionReplay instruction type %X", type); break;
@ -199,7 +210,7 @@ void ActionReplay::executeDType(const Cheat& cheat, u32 instruction) {
case 0xD2000000: { case 0xD2000000: {
const u32 subopcode = cheat[pc++]; const u32 subopcode = cheat[pc++];
switch (subopcode) { switch (subopcode) {
// Ends all loop/execute blocks // Ends all loop/execute blocks
case 0: case 0:
loopStackIndex = 0; loopStackIndex = 0;
ifStackIndex = 0; ifStackIndex = 0;