fixed read syscall

This commit is contained in:
zongor 2025-09-25 15:27:59 -07:00
parent fe921a1050
commit 3733f432e7
2 changed files with 18 additions and 12 deletions

View File

@ -7,17 +7,17 @@
do { \ do { \
i32 cond; \ i32 cond; \
u32 mask, target; \ u32 mask, target; \
u8 src1, src2; \ u8 src1, src2; \
type value; \ type value; \
type value2; \ type value2; \
target = read_u32(vm, code, vm->pc); \ target = read_u32(vm, code, vm->pc); \
vm->pc+=4; \ vm->pc += 4; \
src1 = read_u8(vm, code, vm->pc); \ src1 = read_u8(vm, code, vm->pc); \
vm->pc++; \ vm->pc++; \
src2 = read_u8(vm, code, vm->pc); \ src2 = read_u8(vm, code, vm->pc); \
vm->pc++; \ vm->pc++; \
value = (type)frame->registers[src1]; \ value = (type)frame->registers[src1]; \
value2 = (type)frame->registers[src2]; \ value2 = (type)frame->registers[src2]; \
cond = !!(value op value2); \ cond = !!(value op value2); \
mask = -(u32)cond; \ mask = -(u32)cond; \
vm->pc = (target & mask) | (vm->pc & ~mask); \ vm->pc = (target & mask) | (vm->pc & ~mask); \
@ -33,7 +33,7 @@
src2 = read_u8(vm, code, vm->pc); \ src2 = read_u8(vm, code, vm->pc); \
vm->pc++; \ vm->pc++; \
frame->registers[dest] = \ frame->registers[dest] = \
(type)frame->registers[src1] op (type)frame->registers[src2]; \ (type)frame->registers[src1] op(type) frame->registers[src2]; \
return true; \ return true; \
} while (0) } while (0)
@ -188,14 +188,18 @@ bool step_vm(VM *vm) {
size_reg = read_u8(vm, code, vm->pc); size_reg = read_u8(vm, code, vm->pc);
vm->pc++; vm->pc++;
path_ptr = frame->registers[path_reg]; /* R0: path pointer */ path_ptr = frame->registers[path_reg]; /* path pointer */
buffer_ptr = frame->registers[buffer_reg]; /* R1: buffer pointer */ size = frame->registers[size_reg]; /* size */
size = frame->registers[size_reg]; /* R2: size */ buffer_ptr = vm->mp;
dev = find_device_by_path(vm, (const char *)&vm->memory[path_ptr + 4]); dev = find_device_by_path(vm, (const char *)&vm->memory[path_ptr + 4]);
if (dev && dev->ops->read) { if (dev && dev->ops->read) {
vm->flag = 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 { } else {
vm->flag = 0; vm->flag = 0;
} }

View File

@ -14,8 +14,10 @@
(load-immediate $7 &help) (load-immediate $7 &help)
(string-length $8 $7) (string-length $8 $7)
(syscall DEVICE-WRITE $10 $7 $8) (syscall DEVICE-WRITE $10 $7 $8)
;(load-immediate $8 32) (load-immediate $8 32)
;(syscall DEVICE-READ $10 $2 $8) ; FIXME (syscall DEVICE-READ $10 $2 $8)
(push $2)
(call &println)
(nat-to-string $4 $1) (nat-to-string $4 $1)
(push $4) (push $4)
(call &println) (call &println)
@ -34,5 +36,5 @@
(return))) (return)))
(data (data
(label terminal-namespace "/dev/term/0") (label terminal-namespace "/dev/term/0")
(label help "Enter a string:\n") (label help "Enter a string: ")
(label new-line "\n"))) (label new-line "\n")))