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.
This commit is contained in:
2023-10-23 01:45:18 +01:00
parent 2ef104f235
commit b93a4af495
2 changed files with 13 additions and 6 deletions

View File

@@ -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)

View File

@@ -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 *);