3 #include "interpreter.h"
11 unsigned int negative:16;
16 int32_t regs[16] = {0};
17 uint32_t final_cycle_count = 0;
30 #define PARAMS CpuState *state, uint8_t *pc, Flags flags, uint32_t cycle_count
31 #define ARGS state, pc, flags, cycle_count
32 #define RETURN_VAL {pc, flags, cycle_count}
34 ReturnVal op_return(PARAMS)
37 state->final_cycle_count = cycle_count;
42 ReturnVal op_add(PARAMS)
45 uint8_t dest = reg>>4, src = reg & 0xf;
47 int32_t v = state->regs[dest];
48 v += state->regs[src];
50 flags.zero = (v == 0);
51 flags.negative = (v < 0);
52 state->regs[dest] = v;
57 ReturnVal op_sub(PARAMS)
60 uint8_t dest = reg>>4, src = reg & 0xf;
62 int32_t v = state->regs[dest];
63 v -= state->regs[src];
65 flags.zero = (v == 0);
66 flags.negative = (v < 0);
67 state->regs[dest] = v;
72 ReturnVal op_mov(PARAMS)
75 uint8_t dest = reg>>4, src = reg & 0xf;
77 state->regs[dest] = state->regs[src];
83 ReturnVal op_movi(PARAMS)
86 uint8_t dest = reg>>4;
88 int32_t imm = *(int32_t *)pc;
91 state->regs[dest] = imm;
97 ReturnVal op_b(PARAMS)
105 ReturnVal op_bnz(PARAMS)
116 ReturnVal (*dispatch_table[])(PARAMS) =
127 std::pair<int32_t, uint32_t> interpreter_run(uint8_t *program, int32_t param)
129 CpuState local_state;
130 CpuState *state = &local_state;
131 uint8_t *pc = program;
132 state->regs[X0] = param;
134 uint32_t cycle_count = 0;
135 Flags flags = {0, 0};
138 uint8_t opcode = *pc++;
139 ReturnVal ret = dispatch_table[opcode](ARGS);
142 cycle_count = ret.cycle_count;
145 return std::make_pair(state->regs[X0], state->final_cycle_count);