From bc54f34a4d115572beb9a96a64bf7e5841a28e98 Mon Sep 17 00:00:00 2001 From: Timerix Date: Sat, 16 Nov 2024 23:08:38 +0500 Subject: [PATCH] SYS --- src/instructions/impl/SYS.c | 51 +++++++++++++++++++++++++++---------- 1 file changed, 38 insertions(+), 13 deletions(-) diff --git a/src/instructions/impl/SYS.c b/src/instructions/impl/SYS.c index 3394ad9..08fce28 100644 --- a/src/instructions/impl/SYS.c +++ b/src/instructions/impl/SYS.c @@ -14,25 +14,50 @@ FILE* NULLABLE(fileFromN)(VM* vm, u32 file_n){ return f; } +// sys_read +// bx - file n +// cx - buffer ptr +// dx - buffer size +i32 SYS_read(VM* vm){ + const u32 file_n = vm->bx.u32v; + u8* const buf = vm->data + vm->cx.u32v; + const u32 size = vm->dx.u32v; + + if(buf + size > vm->data + vm->data_size) + return 40; + + FILE* f = fileFromN(vm, file_n); + return fread(buf, 1, size, f); +} + +// sys_write +// bx - file n +// cx - buffer ptr +// dx - buffer size +i32 SYS_write(VM* vm){ + const u32 file_n = vm->bx.u32v; + u8* const buf = vm->data + vm->cx.u32v; + const u32 size = vm->dx.u32v; + + if(buf + size > vm->data + vm->data_size) + return 41; + + FILE* f = fileFromN(vm, file_n); + return fwrite(buf, 1, size, f); +} + /// SYS -/// ax - func code +/// before call: ax - func code +/// after call: ax - result code i32 SYS_impl(VM* vm){ u8 func_code = vm->ax.u8v0; - size_t result_code = 0; + u32 result_code = 0; switch(func_code){ - // sys_read - // bx - file n - // cx - buffer ptr - // dx - buffer size - case 0:; - result_code = fread(vm->data + vm->cx.u32v, 1, vm->dx.u32v, fileFromN(vm, vm->bx.u32v)); + case 0: + result_code = SYS_read(vm); break; - // sys_write - // bx - file n - // cx - buffer ptr - // dx - buffer size case 1:; - result_code = fwrite(vm->data + vm->cx.u32v, 1, vm->dx.u32v, fileFromN(vm, vm->bx.u32v)); + result_code = SYS_write(vm); break; default: VM_setError(vm, "invalid system call (%x) ", func_code);