This commit is contained in:
Timerix 2024-11-16 23:08:38 +05:00
parent 9d2a26fae3
commit bc54f34a4d

View File

@ -14,25 +14,50 @@ FILE* NULLABLE(fileFromN)(VM* vm, u32 file_n){
return f; 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 /// SYS
/// ax - func code /// before call: ax - func code
/// after call: ax - result code
i32 SYS_impl(VM* vm){ i32 SYS_impl(VM* vm){
u8 func_code = vm->ax.u8v0; u8 func_code = vm->ax.u8v0;
size_t result_code = 0; u32 result_code = 0;
switch(func_code){ switch(func_code){
// sys_read case 0:
// bx - file n result_code = SYS_read(vm);
// 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));
break; break;
// sys_write
// bx - file n
// cx - buffer ptr
// dx - buffer size
case 1:; 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; break;
default: default:
VM_setError(vm, "invalid system call (%x) ", func_code); VM_setError(vm, "invalid system call (%x) ", func_code);