From 3733f432e7684248654164ee21a10d435b0f4479 Mon Sep 17 00:00:00 2001 From: zongor Date: Thu, 25 Sep 2025 15:27:59 -0700 Subject: [PATCH] fixed read syscall --- src/vm/vm.c | 22 +++++++++++++--------- test/loop.asm.lisp | 8 +++++--- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/src/vm/vm.c b/src/vm/vm.c index 2d60e21..efde85f 100644 --- a/src/vm/vm.c +++ b/src/vm/vm.c @@ -7,17 +7,17 @@ do { \ i32 cond; \ u32 mask, target; \ - u8 src1, src2; \ + u8 src1, src2; \ type value; \ type value2; \ target = read_u32(vm, code, vm->pc); \ - vm->pc+=4; \ + vm->pc += 4; \ src1 = read_u8(vm, code, vm->pc); \ vm->pc++; \ src2 = read_u8(vm, code, vm->pc); \ vm->pc++; \ - value = (type)frame->registers[src1]; \ - value2 = (type)frame->registers[src2]; \ + value = (type)frame->registers[src1]; \ + value2 = (type)frame->registers[src2]; \ cond = !!(value op value2); \ mask = -(u32)cond; \ vm->pc = (target & mask) | (vm->pc & ~mask); \ @@ -33,7 +33,7 @@ src2 = read_u8(vm, code, vm->pc); \ vm->pc++; \ frame->registers[dest] = \ - (type)frame->registers[src1] op (type)frame->registers[src2]; \ + (type)frame->registers[src1] op(type) frame->registers[src2]; \ return true; \ } while (0) @@ -188,14 +188,18 @@ bool step_vm(VM *vm) { size_reg = read_u8(vm, code, vm->pc); vm->pc++; - path_ptr = frame->registers[path_reg]; /* R0: path pointer */ - buffer_ptr = frame->registers[buffer_reg]; /* R1: buffer pointer */ - size = frame->registers[size_reg]; /* R2: size */ + path_ptr = frame->registers[path_reg]; /* path pointer */ + size = frame->registers[size_reg]; /* size */ + buffer_ptr = vm->mp; dev = find_device_by_path(vm, (const char *)&vm->memory[path_ptr + 4]); if (dev && dev->ops->read) { vm->flag = - dev->ops->read(dev->data, (u8 *)&vm->memory[buffer_ptr], size); + dev->ops->read(dev->data, (u8 *)&vm->memory[buffer_ptr + 4], size); + vm->mp += size + 4; + write_u32(vm, memory, buffer_ptr, size); + frame->end = vm->mp; + frame->registers[buffer_reg] = buffer_ptr; } else { vm->flag = 0; } diff --git a/test/loop.asm.lisp b/test/loop.asm.lisp index fed89b0..6ad068e 100644 --- a/test/loop.asm.lisp +++ b/test/loop.asm.lisp @@ -14,8 +14,10 @@ (load-immediate $7 &help) (string-length $8 $7) (syscall DEVICE-WRITE $10 $7 $8) - ;(load-immediate $8 32) - ;(syscall DEVICE-READ $10 $2 $8) ; FIXME + (load-immediate $8 32) + (syscall DEVICE-READ $10 $2 $8) + (push $2) + (call &println) (nat-to-string $4 $1) (push $4) (call &println) @@ -34,5 +36,5 @@ (return))) (data (label terminal-namespace "/dev/term/0") - (label help "Enter a string:\n") + (label help "Enter a string: ") (label new-line "\n")))