3 #include "interpreter.h"
10 int32_t regs[16] = {0};
11 bool zero_flag = false;
12 bool negative_flag = false;
13 uint32_t cycle_count = 0;
17 struct ReturnException
21 uint8_t *op_return(CpuState *state, uint8_t *pc)
23 state->cycle_count += 1;
24 throw ReturnException();
27 uint8_t *op_add(CpuState *state, uint8_t *pc)
30 uint8_t dest = reg>>4, src = reg & 0xf;
32 int32_t v = state->regs[dest];
33 v += state->regs[src];
35 state->zero_flag = (v == 0);
36 state->negative_flag = (v < 0);
37 state->regs[dest] = v;
38 state->cycle_count += 2;
42 uint8_t *op_sub(CpuState *state, uint8_t *pc)
45 uint8_t dest = reg>>4, src = reg & 0xf;
47 int32_t v = state->regs[dest];
48 v -= state->regs[src];
50 state->zero_flag = (v == 0);
51 state->negative_flag = (v < 0);
52 state->regs[dest] = v;
53 state->cycle_count += 2;
57 uint8_t *op_mov(CpuState *state, uint8_t *pc)
60 uint8_t dest = reg>>4, src = reg & 0xf;
62 state->regs[dest] = state->regs[src];
63 state->cycle_count += 2;
68 uint8_t *op_movi(CpuState *state, uint8_t *pc)
71 uint8_t dest = reg>>4;
73 int32_t imm = *(int32_t *)pc;
76 state->regs[dest] = imm;
77 state->cycle_count += 6;
82 uint8_t *op_b(CpuState *state, uint8_t *pc)
86 state->cycle_count += 2;
90 uint8_t *op_bnz(CpuState *state, uint8_t *pc)
97 state->cycle_count += 2;
101 uint8_t *(*dispatch_table[])(CpuState *state, uint8_t *pc) =
112 std::pair<int32_t, uint32_t> interpreter_run(uint8_t *program, int32_t param)
114 CpuState local_state;
115 CpuState *state = &local_state;
116 uint8_t *pc = program;
117 state->regs[X0] = param;
118 state->cycle_count = 0;
123 uint8_t opcode = *pc++;
124 pc = dispatch_table[opcode](state, pc);
130 } catch(ReturnException ex)
132 return std::make_pair(state->regs[X0], state->cycle_count);