aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main.c8
-rw-r--r--src/runtime.c11
-rw-r--r--src/runtime.h1
3 files changed, 13 insertions, 7 deletions
diff --git a/src/main.c b/src/main.c
index 5298876..c99ffb8 100644
--- a/src/main.c
+++ b/src/main.c
@@ -28,13 +28,7 @@ int interpret_bytecode(const char *filepath)
vm_t vm = {0};
vm_load_stack(&vm, stack, ARR_SIZE(stack));
vm_load_program(&vm, instructions, number);
- for (size_t i = 0; i < number; ++i)
- {
- vm_execute(&vm);
- printf("Cycle %lu\n", i);
- vm_print_all(&vm, stdout);
- printf("\n");
- }
+ vm_execute_all(&vm);
free(instructions);
return 0;
}
diff --git a/src/runtime.c b/src/runtime.c
index 218bba7..57101e0 100644
--- a/src/runtime.c
+++ b/src/runtime.c
@@ -50,6 +50,10 @@ void vm_execute(vm_t *vm)
vm->registers.ret = d.as_word; // will do type punning for me
prog->ptr++;
}
+ else if (instruction.opcode == OP_HALT)
+ {
+ // Do nothing here. Should be caught by callers of vm_execute
+ }
else
{
// TODO: Error (Unknown opcode)
@@ -57,6 +61,13 @@ void vm_execute(vm_t *vm)
}
}
+void vm_execute_all(vm_t *vm)
+{
+ struct Program *program = &vm->program;
+ while (program->instructions[program->ptr].opcode != OP_HALT)
+ vm_execute(vm);
+}
+
void vm_load_stack(vm_t *vm, byte *bytes, size_t size)
{
vm->stack.data = bytes;
diff --git a/src/runtime.h b/src/runtime.h
index e588541..8ff0142 100644
--- a/src/runtime.h
+++ b/src/runtime.h
@@ -44,6 +44,7 @@ typedef struct
#define VM_REG_WORD(REG) ((REG))
void vm_execute(vm_t *);
+void vm_execute_all(vm_t *);
void vm_load_stack(vm_t *, byte *, size_t);
void vm_load_program(vm_t *, inst_t *, size_t);