3 #include "interpreter.h"
11 unsigned int negative:16;
16 int32_t regs[16] = {0};
17 uint32_t final_cycle_count = 0;
21 struct ReturnException
34 #define PARAMS CpuState *state, uint8_t *pc, Flags flags, uint32_t cycle_count
35 #define ARGS state, pc, flags, cycle_count
36 #define RETURN_VAL {pc, flags, cycle_count}
38 ReturnVal op_return(PARAMS)
41 state->final_cycle_count = cycle_count;
42 throw ReturnException();
45 ReturnVal op_add(PARAMS)
48 uint8_t dest = reg>>4, src = reg & 0xf;
50 int32_t v = state->regs[dest];
51 v += state->regs[src];
53 flags.zero = (v == 0);
54 flags.negative = (v < 0);
55 state->regs[dest] = v;
60 ReturnVal op_sub(PARAMS)
63 uint8_t dest = reg>>4, src = reg & 0xf;
65 int32_t v = state->regs[dest];
66 v -= state->regs[src];
68 flags.zero = (v == 0);
69 flags.negative = (v < 0);
70 state->regs[dest] = v;
75 ReturnVal op_mov(PARAMS)
78 uint8_t dest = reg>>4, src = reg & 0xf;
80 state->regs[dest] = state->regs[src];
86 ReturnVal op_movi(PARAMS)
89 uint8_t dest = reg>>4;
91 int32_t imm = *(int32_t *)pc;
94 state->regs[dest] = imm;
100 ReturnVal op_b(PARAMS)
108 ReturnVal op_bnz(PARAMS)
119 ReturnVal (*dispatch_table[])(PARAMS) =
130 std::pair<int32_t, uint32_t> interpreter_run(uint8_t *program, int32_t param)
132 CpuState local_state;
133 CpuState *state = &local_state;
134 uint8_t *pc = program;
135 state->regs[X0] = param;
136 uint32_t cycle_count = 0;
137 Flags flags = {0, 0};
142 uint8_t opcode = *pc++;
143 ReturnVal ret = dispatch_table[opcode](ARGS);
146 cycle_count = ret.cycle_count;
150 } catch(ReturnException ex)
152 return std::make_pair(state->regs[X0], state->final_cycle_count);