aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAryadev Chavali <aryadev@aryadevchavali.com>2023-10-23 01:45:18 +0100
committerAryadev Chavali <aryadev@aryadevchavali.com>2023-10-23 01:45:18 +0100
commitb93a4af4952906e544f35805720c6b547f1f062e (patch)
tree7a2f3762c6b024b52a77c67404fc9ec5990e3093 /src
parent2ef104f2358af14339ff632f3457bbb9dbf56d92 (diff)
downloadovm-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.
Diffstat (limited to 'src')
-rw-r--r--src/runtime.c17
-rw-r--r--src/runtime.h2
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 *);