Propagated changes to prog_t into vm/runtime
This commit is contained in:
17
vm/runtime.c
17
vm/runtime.c
@@ -58,9 +58,10 @@ err_t vm_execute(vm_t *vm)
|
|||||||
{
|
{
|
||||||
static_assert(NUMBER_OF_OPCODES == 98, "vm_execute: Out of date");
|
static_assert(NUMBER_OF_OPCODES == 98, "vm_execute: Out of date");
|
||||||
struct Program *prog = &vm->program;
|
struct Program *prog = &vm->program;
|
||||||
if (prog->ptr >= prog->data->count)
|
prog_t *program_data = prog->data;
|
||||||
|
if (prog->ptr >= program_data->header.count)
|
||||||
return ERR_END_OF_PROGRAM;
|
return ERR_END_OF_PROGRAM;
|
||||||
inst_t instruction = prog->data->instructions[prog->ptr];
|
inst_t instruction = program_data->instructions[prog->ptr];
|
||||||
|
|
||||||
if (OPCODE_IS_TYPE(instruction.opcode, OP_PUSH))
|
if (OPCODE_IS_TYPE(instruction.opcode, OP_PUSH))
|
||||||
{
|
{
|
||||||
@@ -278,6 +279,7 @@ err_t vm_execute(vm_t *vm)
|
|||||||
err_t vm_execute_all(vm_t *vm)
|
err_t vm_execute_all(vm_t *vm)
|
||||||
{
|
{
|
||||||
struct Program *program = &vm->program;
|
struct Program *program = &vm->program;
|
||||||
|
const size_t count = program->data->header.count;
|
||||||
err_t err = ERR_OK;
|
err_t err = ERR_OK;
|
||||||
// Setup the initial address according to the program
|
// Setup the initial address according to the program
|
||||||
program->ptr = program->data->header.start_address;
|
program->ptr = program->data->header.start_address;
|
||||||
@@ -290,7 +292,7 @@ err_t vm_execute_all(vm_t *vm)
|
|||||||
size_t prev_pages = 0;
|
size_t prev_pages = 0;
|
||||||
size_t prev_cptr = 0;
|
size_t prev_cptr = 0;
|
||||||
#endif
|
#endif
|
||||||
while (program->ptr < program->data->count &&
|
while (program->ptr < count &&
|
||||||
program->data->instructions[program->ptr].opcode != OP_HALT)
|
program->data->instructions[program->ptr].opcode != OP_HALT)
|
||||||
{
|
{
|
||||||
#if VERBOSE >= 2
|
#if VERBOSE >= 2
|
||||||
@@ -493,10 +495,11 @@ void vm_print_stack(vm_t *vm, FILE *fp)
|
|||||||
void vm_print_program(vm_t *vm, FILE *fp)
|
void vm_print_program(vm_t *vm, FILE *fp)
|
||||||
{
|
{
|
||||||
struct Program program = vm->program;
|
struct Program program = vm->program;
|
||||||
|
const size_t count = program.data->header.count;
|
||||||
fprintf(fp,
|
fprintf(fp,
|
||||||
"Program.max = %lu\nProgram.ptr = "
|
"Program.max = %lu\nProgram.ptr = "
|
||||||
"%lu\nProgram.instructions = [\n",
|
"%lu\nProgram.instructions = [\n",
|
||||||
program.data->count, program.ptr);
|
count, program.ptr);
|
||||||
size_t beg = 0;
|
size_t beg = 0;
|
||||||
if (program.ptr >= VM_PRINT_PROGRAM_EXCERPT)
|
if (program.ptr >= VM_PRINT_PROGRAM_EXCERPT)
|
||||||
{
|
{
|
||||||
@@ -505,7 +508,7 @@ void vm_print_program(vm_t *vm, FILE *fp)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
beg = 0;
|
beg = 0;
|
||||||
size_t end = MIN(program.ptr + VM_PRINT_PROGRAM_EXCERPT, program.data->count);
|
size_t end = MIN(program.ptr + VM_PRINT_PROGRAM_EXCERPT, count);
|
||||||
for (size_t i = beg; i < end; ++i)
|
for (size_t i = beg; i < end; ++i)
|
||||||
{
|
{
|
||||||
fprintf(fp, "\t%lu: ", i);
|
fprintf(fp, "\t%lu: ", i);
|
||||||
@@ -514,7 +517,7 @@ void vm_print_program(vm_t *vm, FILE *fp)
|
|||||||
fprintf(fp, " <---");
|
fprintf(fp, " <---");
|
||||||
fprintf(fp, "\n");
|
fprintf(fp, "\n");
|
||||||
}
|
}
|
||||||
if (end != program.data->count)
|
if (end != count)
|
||||||
fprintf(fp, "\t...\n");
|
fprintf(fp, "\t...\n");
|
||||||
fprintf(fp, "]\n");
|
fprintf(fp, "]\n");
|
||||||
}
|
}
|
||||||
@@ -604,7 +607,7 @@ void vm_print_all(vm_t *vm, FILE *fp)
|
|||||||
|
|
||||||
err_t vm_jump(vm_t *vm, word w)
|
err_t vm_jump(vm_t *vm, word w)
|
||||||
{
|
{
|
||||||
if (w >= vm->program.data->count)
|
if (w >= vm->program.data->header.count)
|
||||||
return ERR_INVALID_PROGRAM_ADDRESS;
|
return ERR_INVALID_PROGRAM_ADDRESS;
|
||||||
vm->program.ptr = w;
|
vm->program.ptr = w;
|
||||||
return ERR_OK;
|
return ERR_OK;
|
||||||
|
|||||||
Reference in New Issue
Block a user