3 #include "interpreter.h"
10 int32_t regs[16] = {0};
11 bool zero_flag = false;
12 bool negative_flag = false;
13 uint8_t *pc = nullptr;
14 uint32_t cycle_count = 0;
18 struct ReturnException
22 void op_return(CpuState *state)
24 state->cycle_count += 1;
25 throw ReturnException();
28 void op_add(CpuState *state)
30 uint8_t reg = *state->pc++;
31 uint8_t dest = reg>>4, src = reg & 0xf;
33 int32_t v = state->regs[dest];
34 v += state->regs[src];
36 state->zero_flag = (v == 0);
37 state->negative_flag = (v < 0);
38 state->regs[dest] = v;
39 state->cycle_count += 2;
43 void op_sub(CpuState *state)
45 uint8_t reg = *state->pc++;
46 uint8_t dest = reg>>4, src = reg & 0xf;
48 int32_t v = state->regs[dest];
49 v -= state->regs[src];
51 state->zero_flag = (v == 0);
52 state->negative_flag = (v < 0);
53 state->regs[dest] = v;
54 state->cycle_count += 2;
57 void op_mov(CpuState *state)
59 uint8_t reg = *state->pc++;
60 uint8_t dest = reg>>4, src = reg & 0xf;
62 state->regs[dest] = state->regs[src];
63 state->cycle_count += 2;
67 void op_movi(CpuState *state)
69 uint8_t reg = *state->pc++;
70 uint8_t dest = reg>>4;
72 int32_t imm = *(int32_t *)state->pc;
75 state->regs[dest] = imm;
76 state->cycle_count += 6;
80 void op_b(CpuState *state)
82 int8_t rel = *state->pc++;
84 state->cycle_count += 2;
87 void op_bnz(CpuState *state)
89 int8_t rel = *state->pc++;
94 state->cycle_count += 2;
97 void (*dispatch_table[])(CpuState *) =
108 std::pair<int32_t, uint32_t> interpreter_run(uint8_t *program, int32_t param)
110 CpuState local_state;
111 CpuState *state = &local_state;
113 state->regs[X0] = param;
114 state->cycle_count = 0;
119 uint8_t opcode = *state->pc++;
120 dispatch_table[opcode](state);
126 } catch(ReturnException ex)
128 return std::make_pair(state->regs[X0], state->cycle_count);