diff options
author | Aryadev Chavali <aryadev@aryadevchavali.com> | 2023-10-21 23:31:48 +0100 |
---|---|---|
committer | Aryadev Chavali <aryadev@aryadevchavali.com> | 2023-10-21 23:31:48 +0100 |
commit | d2cdb211b2d15c3a15b15737645f2a68641f34ee (patch) | |
tree | f85d83d700e7cdffd57219a345abc3a687419712 /src | |
parent | 1c2de9a926924a5eaf5000b695fdb33ad5664da1 (diff) | |
download | ovm-d2cdb211b2d15c3a15b15737645f2a68641f34ee.tar.gz ovm-d2cdb211b2d15c3a15b15737645f2a68641f34ee.tar.bz2 ovm-d2cdb211b2d15c3a15b15737645f2a68641f34ee.zip |
Added vm_execute_all which executes an entire program
Handles OP_HALT
Diffstat (limited to 'src')
-rw-r--r-- | src/main.c | 8 | ||||
-rw-r--r-- | src/runtime.c | 11 | ||||
-rw-r--r-- | src/runtime.h | 1 |
3 files changed, 13 insertions, 7 deletions
@@ -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); |