11 #define VM_FLAGS 0x900
16 #define VM_VAR_OFFSET 0x4000
17 #define VM_TEMP_OFFSET 0x8000
19 #define VM_LASTRESULT 0x800D
21 #define VM_IS_FLAG(x) ((x) < VM_FLAGS)
22 #define VM_IS_BANK(x) ((x) < VM_BANKS)
23 #define VM_IS_VAR(x) ((x) >= VM_VAR_OFFSET && (x) < VM_VAR_OFFSET + VM_VARS)
24 #define VM_IS_TEMP(x) ((x) >= VM_TEMP_OFFSET && (x) < VM_TEMP_OFFSET + VM_TEMP)
26 #define VM_BOUNDS_ERR(x) ("Warning: " x " 0x%x out of bounds\n")
42 Context(
const Context &ctx);
43 Context &operator=(
const Context &ctx);
47 bool getFlag(uint16_t flag)
const;
48 uint16_t
getVar(uint16_t var)
const;
49 uint32_t
getBank(uint8_t bank)
const;
50 void setFlag(uint16_t flag,
bool val);
51 void setVar(uint16_t var, uint16_t val);
52 void setBank(uint8_t bank, uint32_t val);
53 void compare(uint32_t a, uint32_t b) { cmp1 = a; cmp2 = b; }
54 void pushStack(uint32_t addr) { stack.push(addr); }
55 uint32_t popStack() { uint32_t addr = stack.top(); stack.pop();
return (addr); }
56 void clearStack() {
while (stack.size()) stack.pop(); }
65 std::stack<uint32_t> stack;
84 bool getFlag(uint16_t flag)
const {
return (_ctx.getFlag(flag)); }
85 uint16_t
getVar(uint16_t var)
const {
return (_ctx.getVar(var)); }
86 uint32_t
getBank(uint8_t bank)
const {
return (_ctx.getBank(bank)); }
87 void setFlag(uint16_t flag,
bool val) { _ctx.setFlag(flag, val); }
88 void setVar(uint16_t var, uint16_t val) { _ctx.setVar(var, val); }
89 void setBank(uint8_t bank, uint32_t val) { _ctx.setBank(bank, val); }
92 void _compare(uint32_t a, uint32_t b) { _ctx.compare(a, b); }
93 void _compare8(uint8_t a, uint8_t b) { _ctx.compare(a, b); }
94 Context *_saveContext() { _states.push(
new Context(_ctx));
return (_states.back()); }
95 bool _restoreContext();
132 { _compare8((*(uint8_t *)
gbaMem(instr->
args[0])), getBank(instr->
args[1])); }
134 { _compare8((*(uint8_t *)
gbaMem(instr->
args[0])), instr->
args[1]); }
148 {
for (
int i = 0x8000; i <= 0x8002; i++)
setVar(i, 0); }
152 std::queue<Context *> _states;
155 static std::function<bool(uint32_t, uint32_t)> _cmpOp[6];
uint16_t getVar(uint16_t var) const
Definition: VM.hh:85
bool getFlag(uint16_t flag) const
Definition: VM.hh:84
Args args
Definition: Script.hh:45
#define VM_TEMP
Definition: VM.hh:13
void setBank(uint8_t bank, uint32_t val)
Definition: VM.hh:89
#define VM_VARS
Definition: VM.hh:12
~VM()
Definition: VM.cpp:8
#define VM_IS_VAR(x)
Definition: VM.hh:23
std::vector< ChoicePts > * execCountNewVisits(Script &script)
Definition: VM.cpp:37
void(VM::* Executer)(Script::Instruction *)
Definition: VM.hh:73
uint32_t getBank(uint8_t bank) const
Definition: VM.hh:86
uint8_t pts
Definition: VM.hh:34
std::vector< uint8_t > choices
Definition: VM.hh:33
#define VM_FLAGS
Definition: VM.hh:11
void * gbaMem(uint32_t ptr)
Definition: PokemonUtils.cpp:57
void exec(Script &script)
Definition: VM.cpp:73
void setVar(uint16_t var, uint16_t val)
Definition: VM.hh:88
#define VM_BANKS
Definition: VM.hh:14
void setFlag(uint16_t flag, bool val)
Definition: VM.hh:87