summaryrefslogtreecommitdiff
path: root/src/vm.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/vm.h')
-rw-r--r--src/vm.h64
1 files changed, 64 insertions, 0 deletions
diff --git a/src/vm.h b/src/vm.h
new file mode 100644
index 0000000..2e9e487
--- /dev/null
+++ b/src/vm.h
@@ -0,0 +1,64 @@
+#ifndef VM_H
+#define VM_H
+#include "stack.h"
+
+#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof(program[0]))
+#define STACK_CAPACITY 1024
+#define HEAP_CAPACITY 1024
+
+typedef enum inst_type {
+ // stack
+ INST_PUSH,
+ INST_DUP,
+ INST_COPY,
+ INST_SWAP,
+ INST_DROP,
+ INST_SLIDE,
+ // arithmetics
+ INST_ADD,
+ INST_SUB,
+ INST_MUL,
+ INST_DIV,
+ INST_MOD,
+ // heap access
+ INST_STORE,
+ INST_LOAD,
+ // Flow control
+ INST_CALL,
+ INST_RET,
+ INST_LABEL,
+ INST_JMP,
+ INST_JMPZ,
+ INST_JMPN,
+ // I/O
+ INST_PRINTI,
+ INST_PRINTC,
+ INST_READI,
+ INST_READC,
+ INST_END,
+} inst_type_t;
+
+typedef struct instr {
+ inst_type_t type;
+ int operand;
+} inst_t;
+
+typedef struct label {
+ int name;
+ int index;
+} label_t;
+
+typedef struct vm {
+ stack_t stack;
+ stack_t call_stack;
+ int *heap;
+ label_t *labels;
+} vm_t;
+
+void
+vm_init(vm_t *vm);
+
+void
+vm_run(vm_t *vm, inst_t *insts);
+
+#endif /* VM_H */