SYS
This commit is contained in:
parent
9d2a26fae3
commit
bc54f34a4d
@ -14,25 +14,50 @@ FILE* NULLABLE(fileFromN)(VM* vm, u32 file_n){
|
|||||||
return f;
|
return f;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// SYS
|
|
||||||
/// ax - func code
|
|
||||||
i32 SYS_impl(VM* vm){
|
|
||||||
u8 func_code = vm->ax.u8v0;
|
|
||||||
size_t result_code = 0;
|
|
||||||
switch(func_code){
|
|
||||||
// sys_read
|
// sys_read
|
||||||
// bx - file n
|
// bx - file n
|
||||||
// cx - buffer ptr
|
// cx - buffer ptr
|
||||||
// dx - buffer size
|
// dx - buffer size
|
||||||
case 0:;
|
i32 SYS_read(VM* vm){
|
||||||
result_code = fread(vm->data + vm->cx.u32v, 1, vm->dx.u32v, fileFromN(vm, vm->bx.u32v));
|
const u32 file_n = vm->bx.u32v;
|
||||||
break;
|
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
|
// sys_write
|
||||||
// bx - file n
|
// bx - file n
|
||||||
// cx - buffer ptr
|
// cx - buffer ptr
|
||||||
// dx - buffer size
|
// 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
|
||||||
|
/// before call: ax - func code
|
||||||
|
/// after call: ax - result code
|
||||||
|
i32 SYS_impl(VM* vm){
|
||||||
|
u8 func_code = vm->ax.u8v0;
|
||||||
|
u32 result_code = 0;
|
||||||
|
switch(func_code){
|
||||||
|
case 0:
|
||||||
|
result_code = SYS_read(vm);
|
||||||
|
break;
|
||||||
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);
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user