diff options
author | Aryadev Chavali <aryadev@aryadevchavali.com> | 2023-10-23 01:45:18 +0100 |
---|---|---|
committer | Aryadev Chavali <aryadev@aryadevchavali.com> | 2023-10-23 01:45:18 +0100 |
commit | b93a4af4952906e544f35805720c6b547f1f062e (patch) | |
tree | 7a2f3762c6b024b52a77c67404fc9ec5990e3093 | |
parent | 2ef104f2358af14339ff632f3457bbb9dbf56d92 (diff) | |
download | ovm-b93a4af4952906e544f35805720c6b547f1f062e.tar.gz ovm-b93a4af4952906e544f35805720c6b547f1f062e.tar.bz2 ovm-b93a4af4952906e544f35805720c6b547f1f062e.zip |
Extracted code that performs a jump into its own routine
Checks if the operand given is a well defined program address, then
performs the jump.
-rw-r--r-- | src/runtime.c | 17 | ||||
-rw-r--r-- | src/runtime.h | 2 |
2 files changed, 13 insertions, 6 deletions
diff --git a/src/runtime.c b/src/runtime.c index 1108b25..cf66480 100644 --- a/src/runtime.c +++ b/src/runtime.c @@ -123,18 +123,14 @@ err_t vm_execute(vm_t *vm) err_t err = vm_pop_word(vm, &ret); if (err) return err; - else if (ret.as_word >= vm->program.max) - return ERR_INVALID_PROGRAM_ADDRESS; - prog->ptr = ret.as_word; + return vm_jump(vm, ret.as_word); } else if (instruction.opcode == OP_JUMP_REGISTER) { if (instruction.operand.as_byte >= 8) return ERR_INVALID_REGISTER_WORD; word addr = vm->registers.reg[instruction.operand.as_byte]; - if (addr >= vm->program.max) - return ERR_INVALID_PROGRAM_ADDRESS; - prog->ptr = addr; + return vm_jump(vm, addr); } else if (instruction.opcode >= OP_PRINT_CHAR && instruction.opcode <= OP_PRINT_WORD) @@ -367,6 +363,15 @@ void vm_print_all(vm_t *vm, FILE *fp) fp); } +err_t vm_jump(vm_t *vm, word w) +{ + printf("vm_jump: w=%lu\n", w); + if (w >= vm->program.max) + return ERR_INVALID_PROGRAM_ADDRESS; + vm->program.ptr = w; + return ERR_OK; +} + err_t vm_push_byte(vm_t *vm, data_t b) { if (vm->stack.ptr >= vm->stack.max) diff --git a/src/runtime.h b/src/runtime.h index ab5abd7..83ffa17 100644 --- a/src/runtime.h +++ b/src/runtime.h @@ -71,6 +71,8 @@ void vm_print_program(vm_t *, FILE *); void vm_print_all(vm_t *, FILE *); // Execution routines +err_t vm_jump(vm_t *, word); + err_t vm_pop_byte(vm_t *, data_t *); err_t vm_pop_hword(vm_t *, data_t *); err_t vm_pop_word(vm_t *, data_t *); |