cleanup
This commit is contained in:
		
							parent
							
								
									7bcaa080b9
								
							
						
					
					
						commit
						66adb19578
					
				| 
						 | 
				
			
			@ -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) */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										42
									
								
								src/vm.c
								
								
								
								
							
							
						
						
									
										42
									
								
								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 */
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue