diff options
| -rw-r--r-- | src/runtime.c | 107 | ||||
| -rw-r--r-- | src/runtime.h | 10 | 
2 files changed, 116 insertions, 1 deletions
| diff --git a/src/runtime.c b/src/runtime.c index cb4ed99..b744530 100644 --- a/src/runtime.c +++ b/src/runtime.c @@ -10,6 +10,7 @@   * Description: Virtual machine implementation   */ +#include <stdio.h>  #include <stdlib.h>  #include <string.h> @@ -70,6 +71,112 @@ void vm_load_program(vm_t *vm, inst_t *instructions, size_t size)    vm->program.ptr          = 0;  } +void vm_print_registers(vm_t *vm, FILE *fp) +{ +  struct Registers reg = vm->registers; +  fprintf(fp, "Registers.ret = %lX\n", reg.ret); +  fprintf(fp, "Registers.b   = ["); +  for (size_t i = 0; i < VM_BYTE_REGISTERS; ++i) +  { +    fprintf(fp, "{%lu:%X}", i, reg.b[i]); +    if (i != VM_BYTE_REGISTERS - 1) +      fprintf(fp, ", "); +  } +  fprintf(fp, "]\n"); +  fprintf(fp, "Registers.w   = ["); +  for (size_t i = 0; i < VM_WORD_REGISTERS; ++i) +  { +    fprintf(fp, "{%lu:%lX}", i, reg.w[i]); +    if (i != VM_WORD_REGISTERS - 1) +      fprintf(fp, reg.w[i] == 0 ? ", " : ",\n"); +  } +  fprintf(fp, "]\n"); +  fprintf(fp, "Registers.f =   ["); +  for (size_t i = 0; i < VM_FLOAT_REGISTERS; ++i) +  { +    fprintf(fp, "{%lu:%f}", i, reg.f[i]); +    if (i != VM_FLOAT_REGISTERS - 1) +      fprintf(fp, reg.f[i] == 0 ? ", " : ",\n"); +  } +  fprintf(fp, "]\n"); +} + +void vm_print_stack(vm_t *vm, FILE *fp) +{ +  struct Stack stack = vm->stack; +  fprintf(fp, "Stack.max = %lu\nStack.ptr = %lu\nStack.data = [", stack.max, +          stack.ptr); +  if (stack.ptr == 0) +  { +    fprintf(fp, "]\n"); +    return; +  } +  for (size_t i = stack.ptr; i > 0; --i) +  { +    byte b = stack.data[i - 1]; +    fprintf(fp, "{%lu: %X}", stack.ptr - i, b); +    if (i != 1) +      fprintf(fp, ", "); + +    if (((stack.ptr - i + 1) % 4) == 0) +      fprintf(fp, "\n"); +  } +  fprintf(fp, "]\n"); +} + +void vm_print_program(vm_t *vm, FILE *fp) +{ +  struct Program program = vm->program; +  fprintf(fp, "Program.max = %lu\nProgram.ptr = %lu\nProgram.instructions = [", +          program.max, program.ptr); +  if (program.ptr == 0) +  { +    fprintf(fp, "]\n"); +    return; +  } + +  fprintf(fp, "\n"); +  size_t beg = 0; +  if (program.ptr >= VM_PRINT_PROGRAM_EXCERPT) +  { +    fprintf(fp, "\t...\n"); +    beg = program.ptr - VM_PRINT_PROGRAM_EXCERPT; +  } +  else +    beg = 0; +  size_t end = MIN(program.ptr + VM_PRINT_PROGRAM_EXCERPT, program.max); +  for (size_t i = beg; i < end; ++i) +  { +    fprintf(fp, "\t%lu: ", i); +    inst_print(program.instructions[i], stdout); +    if (i == program.ptr) +      fprintf(fp, " <---"); +    fprintf(fp, "\n"); +  } +  if (end != program.max) +    fprintf(fp, "\t...\n"); +  fprintf(fp, "]\n"); +} + +void vm_print_all(vm_t *vm, FILE *fp) +{ +  fputs("----------------------------------------------------------------------" +        "----------\n", +        fp); +  vm_print_registers(vm, fp); +  fputs("----------------------------------------------------------------------" +        "----------\n", +        fp); +  vm_print_stack(vm, fp); +  fputs("----------------------------------------------------------------------" +        "----------\n", +        fp); +  vm_print_program(vm, fp); +  fputs("----------------------------------------------------------------------" +        "----------\n", +        fp); +} +  void 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 5505fc0..f512992 100644 --- a/src/runtime.h +++ b/src/runtime.h @@ -13,6 +13,7 @@  #ifndef RUNTIME_H  #define RUNTIME_H +#include <stdio.h>  #include <stdlib.h>  #include "./base.h" @@ -42,10 +43,17 @@ typedef struct    } program;  } vm_t; +void vm_execute(vm_t *); +  void vm_load_stack(vm_t *, byte *, size_t);  void vm_load_program(vm_t *, inst_t *, size_t); -void vm_execute(vm_t *); +// Print routines +void vm_print_registers(vm_t *, FILE *); +void vm_print_stack(vm_t *, FILE *); +#define VM_PRINT_PROGRAM_EXCERPT 5 +void vm_print_program(vm_t *, FILE *); +void vm_print_all(vm_t *, FILE *);  void vm_push_byte(vm_t *, data_t);  void vm_push_word(vm_t *, data_t); | 
