diff --git a/src/opcodes.h b/src/opcodes.h index 7d3ca6d..c2d7a6b 100644 --- a/src/opcodes.h +++ b/src/opcodes.h @@ -27,7 +27,7 @@ typedef struct { #define STACK_SIZE 256 typedef struct { uint32_t pc; /* Program counter */ - uint32_t fp; /* Frame pointer plast allocated value) */ + uint32_t fp; /* Frame pointer (last allocated value) */ uint32_t sp; /* stack pointer (top of stack) */ uint32_t rp; /* return stack pointer (top of stack) */ uint32_t mp; /* Memory pointer (last allocated value) */ diff --git a/src/vm.c b/src/vm.c index da3da81..7543ec5 100644 --- a/src/vm.c +++ b/src/vm.c @@ -39,44 +39,22 @@ void mem_strcpy(Value *memory, const char *str, uint32_t length, * Step to the next opcode in the vm. */ bool step_vm(VM *vm) { - uint32_t instruction = vm->memory[vm->pc].u; + /* Get current instruction & Advance to next instruction */ + uint32_t instruction = vm->memory[vm->pc++].u; - /* Extract 8-bit register indices from 32-bit instruction */ uint8_t opcode = (instruction >> 24) & 0xFF; uint8_t dest = (instruction >> 16) & 0xFF; uint8_t src1 = (instruction >> 8) & 0xFF; uint8_t src2 = instruction & 0xFF; - /* Advance to next instruction */ - vm->pc++; - - #ifdef DEBUG - printOp(opcode, dest, src1, src2); - printf("dest=%d, src1=%d, src2=%d\n", vm->frames[vm->fp].registers[dest].u, - vm->frames[vm->fp].registers[src1].i, - vm->frames[vm->fp].registers[src2].i); - - uint32_t i; - printf("return_stack["); - for (i = 0; i < vm->rp; i++) - printf("%d,", vm->return_stack[i].u); - printf("]\n"); - - printf("stack["); - for (i = 0; i < vm->sp; i++) - printf("%d,", vm->stack[i].i); - printf("]\n"); - #endif switch (opcode) { case OP_HALT: return false; - case OP_CALL:; - uint32_t jmp = - vm->memory[vm->pc++].u; /* set pc to location of function in memory */ + case OP_CALL:; /* whats up with this semicolon? ANSI C does not allow you to create a variabel after a case, so this noop is here */ + uint32_t jmp = vm->memory[vm->pc++].u; /* location of function in memory */ vm->return_stack[vm->rp++].u = vm->pc; /* set return address */ vm->fp++; /* increment to the next free frame */ - vm->frames[vm->fp].allocated.start = - vm->mp; /* set start of new memory block */ + vm->frames[vm->fp].allocated.start = vm->mp; /* set start of new memory block */ vm->pc = jmp; return true; case OP_RETURN: @@ -289,7 +267,7 @@ bool step_vm(VM *vm) { uint32_t addr2 = (uint32_t)vm->frames[vm->fp].registers[src2].u; uint32_t length1 = vm->memory[addr1 - 1].u; uint32_t length2 = vm->memory[addr2 - 1].u; - uint32_t equal = 1; + uint32_t equal = 1; /* we dont have a native boolean type so we use uint32_t */ if (length1 != length2) { equal = 0; @@ -302,13 +280,15 @@ bool step_vm(VM *vm) { equal = 0; break; } - if ((char1 & 0xFF) == '\0' && (char2 & 0xFF) == '\0') - return true; + if ((char1 & 0xFF) == '\0' && (char2 & 0xFF) == '\0') { + equal = 1; + break; + } } } vm->memory[dest].u = equal; return true; } } - return false; + return false; /* something bad happened */ }