Get our first AR code running

This commit is contained in:
wheremyfoodat 2023-07-20 13:50:32 +03:00
parent ae69c8f8c4
commit 97f8ea6cfd
6 changed files with 110 additions and 23 deletions

View file

@ -3,9 +3,10 @@
#include <vector>
#include "helpers.hpp"
#include "memory.hpp"
class ActionReplay {
using Cheat = std::vector<u32>; // A cheat is really just a bunch of u32 opcodes
using Cheat = std::vector<u32>; // A cheat is really just a bunch of 64-bit opcodes neatly encoded into 32-bit chunks
u32 offset1, offset2; // Memory offset registers. Non-persistent.
u32 data1, data2; // Data offset registers. Non-persistent.
@ -14,9 +15,29 @@ class ActionReplay {
// When an instruction does not specify which offset or data register to use, we use the "active" one
// Which is by default #1 and may be changed by certain AR operations
u32 *activeOffset, *activeData;
// Program counter
u32 pc = 0;
Memory& mem;
// Has the cheat ended?
bool running = false;
// Run 1 AR instruction
void runInstruction(const Cheat& cheat, u32 instruction);
// Action Replay has a billion D-type opcodes so this handles all of them
void executeDType(const Cheat& cheat, u32 instruction);
u8 read8(u32 addr);
u16 read16(u32 addr);
u32 read32(u32 addr);
void write8(u32 addr, u8 value);
void write16(u32 addr, u16 value);
void write32(u32 addr, u32 value);
public:
ActionReplay();
ActionReplay(Memory& mem);
void runCheat(const Cheat& cheat);
void reset();
};