Use program structure for runtime

Very barebones, essentially a simple refactor.

I need to introduce a feature to append to a program as well, but as
it's a flexible structure it will likely have to be functional.
This commit is contained in:
2023-11-03 19:09:13 +00:00
parent fe7f26256b
commit a7588ccc61
2 changed files with 16 additions and 17 deletions

View File

@@ -58,9 +58,9 @@ 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->max) if (prog->ptr >= prog->data->count)
return ERR_END_OF_PROGRAM; return ERR_END_OF_PROGRAM;
inst_t instruction = prog->instructions[prog->ptr]; inst_t instruction = prog->data->instructions[prog->ptr];
if (OPCODE_IS_TYPE(instruction.opcode, OP_PUSH)) if (OPCODE_IS_TYPE(instruction.opcode, OP_PUSH))
{ {
@@ -281,8 +281,8 @@ 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->instructions[program->ptr].opcode != OP_HALT && while (program->data->instructions[program->ptr].opcode != OP_HALT &&
program->ptr < program->max) program->ptr < program->data->count)
{ {
#if VERBOSE >= 2 #if VERBOSE >= 2
fprintf(stdout, "[vm_execute_all]: Trace(Cycle %lu)\n", cycles); fprintf(stdout, "[vm_execute_all]: Trace(Cycle %lu)\n", cycles);
@@ -355,11 +355,10 @@ void vm_load_stack(vm_t *vm, byte *bytes, size_t size)
vm->stack.ptr = 0; vm->stack.ptr = 0;
} }
void vm_load_program(vm_t *vm, inst_t *instructions, size_t size) void vm_load_program(vm_t *vm, prog_t *program)
{ {
vm->program.instructions = instructions; vm->program.ptr = 0;
vm->program.max = size; vm->program.data = program;
vm->program.ptr = 0;
} }
void vm_load_registers(vm_t *vm, registers_t registers) void vm_load_registers(vm_t *vm, registers_t registers)
@@ -430,7 +429,7 @@ void vm_stop(vm_t *vm)
#endif #endif
free(vm->registers.data); free(vm->registers.data);
free(vm->program.instructions); free(vm->program.data);
free(vm->stack.data); free(vm->stack.data);
heap_stop(&vm->heap); heap_stop(&vm->heap);
free(vm->call_stack.address_pointers); free(vm->call_stack.address_pointers);
@@ -489,7 +488,7 @@ void vm_print_program(vm_t *vm, FILE *fp)
fprintf(fp, fprintf(fp,
"Program.max = %lu\nProgram.ptr = " "Program.max = %lu\nProgram.ptr = "
"%lu\nProgram.instructions = [\n", "%lu\nProgram.instructions = [\n",
program.max, program.ptr); program.data->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)
{ {
@@ -498,16 +497,16 @@ 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.max); size_t end = MIN(program.ptr + VM_PRINT_PROGRAM_EXCERPT, program.data->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);
inst_print(program.instructions[i], fp); inst_print(program.data->instructions[i], fp);
if (i == program.ptr) if (i == program.ptr)
fprintf(fp, " <---"); fprintf(fp, " <---");
fprintf(fp, "\n"); fprintf(fp, "\n");
} }
if (end != program.max) if (end != program.data->count)
fprintf(fp, "\t...\n"); fprintf(fp, "\t...\n");
fprintf(fp, "]\n"); fprintf(fp, "]\n");
} }
@@ -597,7 +596,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.max) if (w >= vm->program.data->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;

View File

@@ -53,8 +53,8 @@ typedef struct
heap_t heap; heap_t heap;
struct Program struct Program
{ {
inst_t *instructions; prog_t *data;
size_t ptr, max; word ptr;
} program; } program;
struct CallStack struct CallStack
{ {
@@ -69,7 +69,7 @@ err_t vm_execute_all(vm_t *);
void vm_load_stack(vm_t *, byte *, size_t); void vm_load_stack(vm_t *, byte *, size_t);
void vm_load_registers(vm_t *, registers_t); void vm_load_registers(vm_t *, registers_t);
void vm_load_heap(vm_t *, heap_t); void vm_load_heap(vm_t *, heap_t);
void vm_load_program(vm_t *, inst_t *, size_t); void vm_load_program(vm_t *, prog_t *);
void vm_load_call_stack(vm_t *, word *, size_t); void vm_load_call_stack(vm_t *, word *, size_t);
void vm_stop(vm_t *); void vm_stop(vm_t *);