mirror of
https://github.com/wheremyfoodat/Panda3DS.git
synced 2025-04-20 12:39:13 +12:00
Emulator cleanup, add AR conditionals
This commit is contained in:
parent
08596c1a24
commit
d007b2d780
5 changed files with 79 additions and 62 deletions
|
@ -15,6 +15,8 @@ void ActionReplay::runCheat(const Cheat& cheat) {
|
|||
// Set offset and data registers to 0 at the start of a cheat
|
||||
data1 = data2 = offset1 = offset2 = 0;
|
||||
pc = 0;
|
||||
ifStackIndex = 0;
|
||||
loopStackIndex = 0;
|
||||
running = true;
|
||||
|
||||
activeOffset = &offset1;
|
||||
|
@ -25,9 +27,16 @@ void ActionReplay::runCheat(const Cheat& cheat) {
|
|||
if (pc + 1 >= cheat.size()) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Fetch instruction
|
||||
const u32 instruction = cheat[pc++];
|
||||
|
||||
// Instructions D0000000 00000000 and D2000000 00000000 are unconditional
|
||||
bool isUnconditional = cheat[pc] == 0 && (instruction == 0xD0000000 || instruction == 0xD2000000);
|
||||
if (ifStackIndex > 0 && !isUnconditional && !ifStack[ifStackIndex - 1]) {
|
||||
pc++; // Eat up dummy word
|
||||
continue; // Skip conditional instructions where the condition is false
|
||||
}
|
||||
|
||||
runInstruction(cheat, instruction);
|
||||
}
|
||||
}
|
||||
|
@ -162,13 +171,27 @@ void ActionReplay::executeDType(const Cheat& cheat, u32 instruction) {
|
|||
case 0x00020000: storage1 = data1; break;
|
||||
case 0x00020001: storage2 = data2; break;
|
||||
default:
|
||||
Helpers::warn("Unknown ActionReplay data operation");
|
||||
Helpers::warn("Unknown ActionReplay data operation: %08X", subopcode);
|
||||
running = false;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
// Control flow block operations
|
||||
case 0xD2000000: {
|
||||
const u32 subopcode = cheat[pc++];
|
||||
switch (subopcode) {
|
||||
// Ends all loop/execute blocks
|
||||
case 0:
|
||||
loopStackIndex = 0;
|
||||
ifStackIndex = 0;
|
||||
break;
|
||||
default: Helpers::panic("Unknown ActionReplay control flow operation: %08X", subopcode); break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
default: Helpers::panic("ActionReplay: Unimplemented d-type opcode: %08X", instruction); break;
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue