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;
19 void op_return(CpuState *state)
24 void op_add(CpuState *state)
26 uint8_t reg = *state->pc++;
27 uint8_t dest = reg>>4, src = reg & 0xf;
29 int32_t v = state->regs[dest];
30 v += state->regs[src];
32 state->zero_flag = (v == 0);
33 state->negative_flag = (v < 0);
34 state->regs[dest] = v;
38 void op_sub(CpuState *state)
40 uint8_t reg = *state->pc++;
41 uint8_t dest = reg>>4, src = reg & 0xf;
43 int32_t v = state->regs[dest];
44 v -= state->regs[src];
46 state->zero_flag = (v == 0);
47 state->negative_flag = (v < 0);
48 state->regs[dest] = v;
51 void op_mov(CpuState *state)
53 uint8_t reg = *state->pc++;
54 uint8_t dest = reg>>4, src = reg & 0xf;
56 state->regs[dest] = state->regs[src];
60 void op_movi(CpuState *state)
62 uint8_t reg = *state->pc++;
63 uint8_t dest = reg>>4;
65 int32_t imm = *(int32_t *)state->pc;
68 state->regs[dest] = imm;
72 void op_b(CpuState *state)
74 int8_t rel = *state->pc++;
78 void op_bnz(CpuState *state)
80 int8_t rel = *state->pc++;
87 void (*dispatch_table[])(CpuState *) =
98 std::pair<int32_t, uint32_t> interpreter_run(uint8_t *program, int32_t param)
100 CpuState local_state;
101 CpuState *state = &local_state;
103 state->regs[X0] = param;
104 state->cycle_count = 0;
108 uint8_t opcode = *state->pc++;
109 state->cycle_count += cycle_table[opcode];
110 dispatch_table[opcode](state);
114 return std::make_pair(state->regs[X0], state->cycle_count);