diff --git a/src/opcodes.h b/src/opcodes.h index e7e45e0..0e4ccaa 100644 --- a/src/opcodes.h +++ b/src/opcodes.h @@ -17,8 +17,9 @@ typedef enum { OP_MEM_SWAP, /* mswp : &dest = &src1, &src1 = &dest */ OP_MEM_MOV, /* mmov : &dest = &src1 */ OP_MEM_ALLOC, /* aloc : dest [next memory location as size] */ - OP_REF, /* ref : dest = &memory[src1] */ - OP_DEREF, /* dref : dest = memory[src1] */ + OP_GET, /* get : dest = ptr : dest = memory[ptr] */ + OP_PUT, /* put : ptr = src1 : memory[ptr] = src */ + OP_OFFSET, /* offs : dest = ptr + src1 : dest = p + o */ OP_SYSCALL, /* sysc : */ OP_ADD_INT, /* addi : dest = src1 + src2 */ OP_SUB_INT, /* subi : dest = src1 - src2 */ diff --git a/src/vm.c b/src/vm.c index 1df2387..f2cb1fe 100644 --- a/src/vm.c +++ b/src/vm.c @@ -108,6 +108,23 @@ bool step_vm(VM *vm) { vm->memory[ptr] = vm->frames[vm->fp].registers[src1]; return true; } + case OP_PUT: { + uint32_t addr = vm->frames[vm->fp].registers[dest].u; + vm->memory[addr] = vm->frames[vm->fp].registers[src1]; + return true; + } + case OP_GET: { + uint32_t addr = vm->frames[vm->fp].registers[src1].u; + vm->frames[vm->fp].registers[dest] = vm->memory[addr]; + return true; + } + case OP_OFFSET: { + uint32_t ptr = vm->frames[vm->fp].registers[src1].u; + uint32_t offset = vm->frames[vm->fp].registers[src2].u; + uint32_t result = ptr + offset; + vm->frames[vm->fp].registers[dest].u = result; + return true; + } case OP_PUSH: { vm->stack[++vm->sp] = vm->frames[vm->fp].registers[dest]; return true; @@ -116,6 +133,33 @@ bool step_vm(VM *vm) { vm->frames[vm->fp].registers[dest] = vm->stack[vm->sp--]; return true; } + case OP_MEM_ALLOC: { + uint32_t mem_dest = (uint32_t)vm->frames[vm->fp] + .allocated.end; /* get start of unallocated */ + vm->frames[vm->fp].registers[dest].u = + mem_dest; /* store ptr of array to dest register */ + uint32_t size = (uint32_t)vm->frames[vm->fp].registers[src1].u; + vm->memory[mem_dest].u = size; + vm->frames[vm->fp].allocated.end += + size; /* increment to end of allocated */ + return true; + } + case OP_MEM_MOV: { + uint32_t dest_addr = (uint32_t)vm->frames[vm->fp].registers[dest].u; + uint32_t src_addr = (uint32_t)vm->frames[vm->fp].registers[src1].u; + vm->memory[dest_addr] = vm->memory[src_addr]; + return true; + } + case OP_MEM_SWAP: { + uint32_t dest_addr = (uint32_t)vm->frames[vm->fp].registers[dest].u; + uint32_t src_addr = (uint32_t)vm->frames[vm->fp].registers[src1].u; + vm->memory[dest_addr].u ^= vm->memory[src_addr].u; + vm->memory[src_addr].u ^= vm->memory[dest_addr].u; + vm->memory[dest_addr].u ^= vm->memory[src_addr].u; + return true; + } + case OP_SYSCALL: { + } case OP_ADD_INT: MATH_OP(i, +); case OP_SUB_INT: @@ -316,31 +360,6 @@ bool step_vm(VM *vm) { vm->memory[dest].u = equal; return true; } - case OP_MEM_ALLOC: { - uint32_t mem_dest = (uint32_t)vm->frames[vm->fp] - .allocated.end; /* get start of unallocated */ - vm->frames[vm->fp].registers[dest].u = - mem_dest; /* store ptr of array to dest register */ - uint32_t size = (uint32_t)vm->frames[vm->fp].registers[src1].u; - vm->memory[mem_dest].u = size; - vm->frames[vm->fp].allocated.end += - size; /* increment to end of allocated */ - return true; - } - case OP_MEM_MOV: { - uint32_t dest_addr = (uint32_t)vm->frames[vm->fp].registers[dest].u; - uint32_t src_addr = (uint32_t)vm->frames[vm->fp].registers[src1].u; - vm->memory[dest_addr] = vm->memory[src_addr]; - return true; - } - case OP_MEM_SWAP: { - uint32_t dest_addr = (uint32_t)vm->frames[vm->fp].registers[dest].u; - uint32_t src_addr = (uint32_t)vm->frames[vm->fp].registers[src1].u; - vm->memory[dest_addr].u ^= vm->memory[src_addr].u; - vm->memory[src_addr].u ^= vm->memory[dest_addr].u; - vm->memory[dest_addr].u ^= vm->memory[src_addr].u; - return true; - } } return false; /* something bad happened */ } diff --git a/test/loop.zrl b/test/loop.zrl index 264690f..2db9714 100644 --- a/test/loop.zrl +++ b/test/loop.zrl @@ -3,8 +3,9 @@ do (int i = 50000, 0, -1) { a = a + 5.0; } int b = a as nat; -print("Enter a string:"); -str user_string = gets(); -print(a.toS()); -print(b.toS()); -print(user_string); +print "Enter a string:"); +str user_string = read(); +print a.str; +print b.str; +print user_string; +