/
cvm.c
50 lines (47 loc) · 1.89 KB
/
cvm.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <cvm.h>
static int32_t decode_instruction(instruction_t ins, memory_t memory) {
printf("[%d] in1=%d in2=%d out=%d\n", ins.opcode, ins.in1, ins.in2, ins.out);
printf(" in1=%d in2=%d out=%d memory[0]=%d\n", memory.data[ins.in1], memory.data[ins.in2], memory.data[ins.out], memory.data[0]);
switch(ins.opcode) {
case ADD:
memory.data[ins.out & memory.mask] = memory.data[ins.in1 & memory.mask] + memory.data[ins.in2 & memory.mask];
return 0;
case SUB:
memory.data[ins.out & memory.mask] = memory.data[ins.in1 & memory.mask] - memory.data[ins.in2 & memory.mask];
return 0;
case MUL:
memory.data[ins.out & memory.mask] = memory.data[ins.in1 & memory.mask] * memory.data[ins.in2 & memory.mask];
return 0;
case DIV:
memory.data[ins.out & memory.mask] = memory.data[ins.in1 & memory.mask] / memory.data[ins.in2 & memory.mask];
return 0;
case MOD:
memory.data[ins.out & memory.mask] = memory.data[ins.in1 & memory.mask] % memory.data[ins.in2 & memory.mask];
return 0;
case SET:
if(memory.data[ins.in1 & memory.mask] != 0) {
memory.data[ins.out & memory.mask] = memory.data[ins.in2 & memory.mask];
}
return 0;
case SETN:
if(memory.data[ins.in1 & memory.mask] == 0) {
memory.data[ins.out & memory.mask] = memory.data[ins.in2 & memory.mask];
}
return 0;
case LOAD:
memory.data[ins.out & memory.mask] = memory.data[ins.in1 & memory.mask];
return 0;
case CNT:
memory.data[ins.out & memory.mask] = ins.in1;
return 0;
default:
return -1;
}
}
int32_t decode_program(program_t program) {
for(int32_t pc = 0; pc < program.instructions.size; pc++) {
if(decode_instruction(program.instructions.instructions[pc], program.memory) != 0)
return -1;
}
return 0;
}