Fix the syscalls, add strlen as an opcode

This commit is contained in:
zongor 2025-09-20 08:44:02 -07:00
parent 700b6fcb63
commit b8832a7116
3 changed files with 40 additions and 29 deletions

View File

@ -46,6 +46,7 @@ typedef enum {
OP_JGT_REAL, /* jltr : jump to address dest if src1 as real > src2 as real */
OP_JLT_REAL, /* jler : jump to address dest if src1 as real < src2 as real */
OP_JLE_REAL, /* jger : jump to address dest if src1 as real <= src2 as real */
OP_STRLEN, /* strl : dest = length of str at src1 ptr */
OP_INT_TO_STRING, /* itos : dest = src1 as str */
OP_UINT_TO_STRING, /* utos : dest = src1 as str */
OP_REAL_TO_STRING, /* rtos : dest = src1 as str */
@ -91,8 +92,8 @@ typedef struct device_s {
u32 flags; /* permissions, status, etc. */
} Device;
#define MEMORY_SIZE (640 * 480 + 65536)
#define CODE_SIZE 8192
#define MEMORY_SIZE 1024 /*(640 * 480 + 65536)*/
#define CODE_SIZE 128 /*8192*/
#define FRAMES_SIZE 128
#define STACK_SIZE 256
#define DEVICES_SIZE 8

View File

@ -2,6 +2,7 @@
#include "opcodes.h"
#include "str.h"
#include "vm.h"
#include <stdint.h>
u32 real_alloc(VM *vm, float v) {
i32 fixed = TO_FIXED(v);
@ -58,23 +59,27 @@ bool test_simple_compile(VM *vm) {
ptr = real_alloc(vm, 2.0f);
write_u32(vm, code, vm->cp, ptr); vm->cp+=4;
vm->code[vm->cp++] = OP_ADD_UINT;
vm->code[vm->cp++] = OP_ADD_REAL;
vm->code[vm->cp++] = 2;
vm->code[vm->cp++] = 1;
vm->code[vm->cp++] = 0; /* let sum = 1 + 2; */
vm->code[vm->cp++] = OP_REAL_TO_STRING;
vm->code[vm->cp++] = 4;
vm->code[vm->cp++] = 3;
vm->code[vm->cp++] = 2;
vm->code[vm->cp++] = OP_LOAD_IMM;
vm->code[vm->cp++] = 3;
vm->code[vm->cp++] = 2;
write_u32(vm, code, vm->cp, terminal_path_addr); vm->cp+=4;
vm->code[vm->cp++] = OP_STRLEN;
vm->code[vm->cp++] = 4;
vm->code[vm->cp++] = 3;
vm->code[vm->cp++] = OP_SYSCALL;
write_u32(vm, code, vm->cp, AS_UINT(SYSCALL_DEVICE_WRITE)); vm->cp+=4;
write_u32(vm, code, vm->cp, AS_UINT(2)); vm->cp+=4;
vm->code[vm->cp++] = 3;
vm->code[vm->cp++] = 3; /* arg_count */
vm->code[vm->cp++] = 2; /* first_reg */
/* syscall_id=WRITE, arg_count=2, start_reg=3 ; print(sum.toS()); */
vm->code[vm->cp++] = OP_HALT; /* explicit halt */
return true;

View File

@ -138,8 +138,8 @@ bool step_vm(VM *vm) {
syscall_id = read_u32(vm, code, vm->pc);
vm->pc += 4;
arg_count = read_u32(vm, code, vm->pc);
vm->pc += 4;
arg_count = read_u8(vm, code, vm->pc);
vm->pc++;
first_reg = read_u8(vm, code, vm->pc);
vm->pc++;
@ -147,13 +147,11 @@ bool step_vm(VM *vm) {
case SYSCALL_DEVICE_OPEN: {
if (arg_count >= 2) {
Device *dev;
u32 path_ptr, mode, str_src;
u32 path_ptr, mode;
path_ptr =
vm->frames[vm->fp].registers[first_reg]; /* R0: path pointer */
mode = vm->frames[vm->fp].registers[first_reg + 1]; /* R1: mode */
str_src = path_ptr + 1;
dev = find_device_by_path(vm, (const char *)&vm->memory[str_src]);
dev = find_device_by_path(vm, (const char *)&vm->memory[path_ptr + 4]);
if (dev) {
if (dev->ops->open) {
@ -173,17 +171,15 @@ bool step_vm(VM *vm) {
case SYSCALL_DEVICE_READ: {
if (arg_count >= 3) {
Device *dev;
u32 path_ptr, buffer_ptr, size, str_src;
u32 path_ptr, buffer_ptr, size;
path_ptr =
vm->frames[vm->fp].registers[first_reg]; /* R0: path pointer */
buffer_ptr = vm->frames[vm->fp]
.registers[first_reg + 1]; /* R1: buffer pointer */
size = vm->frames[vm->fp].registers[first_reg + 2]; /* R2: size */
str_src = path_ptr + 1;
dev = find_device_by_path(vm, (const char *)&vm->memory[str_src]);
dev = find_device_by_path(vm, (const char *)&vm->memory[path_ptr + 4]);
if (dev && dev->ops->read) {
vm->acc =
dev->ops->read(dev->data, (u8 *)&vm->memory[buffer_ptr], size);
@ -199,18 +195,17 @@ bool step_vm(VM *vm) {
case SYSCALL_DEVICE_WRITE: {
if (arg_count >= 2) {
Device *dev;
u32 path_ptr, buffer_ptr, size, str_src;
u32 path_ptr, buffer_ptr, size;
path_ptr =
vm->frames[vm->fp].registers[first_reg]; /* R0: path pointer */
buffer_ptr = vm->frames[vm->fp]
.registers[first_reg + 1]; /* R1: buffer pointer */
size = read_u32(vm, memory, buffer_ptr); /* R2: size */
str_src = path_ptr += 4;
size = vm->frames[vm->fp].registers[first_reg + 2]; /* R2: size */
dev = find_device_by_path(vm, (const char *)&vm->memory[str_src]);
dev = find_device_by_path(vm, (const char *)&vm->memory[path_ptr + 4]);
if (dev && dev->ops->write) {
vm->acc = dev->ops->write(dev->data,
(const u8 *)&vm->memory[buffer_ptr], size);
vm->acc = dev->ops->write(dev->data, (const u8 *)&vm->memory[buffer_ptr + 4],
size);
} else {
vm->acc = 0;
}
@ -223,12 +218,11 @@ bool step_vm(VM *vm) {
case SYSCALL_DEVICE_CLOSE: {
if (arg_count >= 1) {
Device *dev;
u32 path_ptr, str_src;
u32 path_ptr;
path_ptr =
vm->frames[vm->fp].registers[first_reg]; /* R0: path pointer */
str_src = path_ptr + 1;
dev = find_device_by_path(vm, (const char *)&vm->memory[str_src]);
dev = find_device_by_path(vm, (const char *)&vm->memory[path_ptr + 4]);
if (dev && dev->ops->close) {
i32 result = dev->ops->close(dev->data);
@ -245,16 +239,15 @@ bool step_vm(VM *vm) {
case SYSCALL_DEVICE_IOCTL: {
if (arg_count >= 3) {
Device *dev;
u32 path_ptr, args_ptr, cmd, str_src;
u32 path_ptr, args_ptr, cmd;
path_ptr =
vm->frames[vm->fp].registers[first_reg]; /* R0: device path */
cmd =
vm->frames[vm->fp].registers[first_reg + 1]; /* R1: ioctl command */
args_ptr =
vm->frames[vm->fp].registers[first_reg + 2]; /* R2: args pointer */
str_src = path_ptr + 1;
dev = find_device_by_path(vm, (const char *)&vm->memory[str_src]);
dev = find_device_by_path(vm, (const char *)&vm->memory[path_ptr + 4]);
if (dev && dev->ops && dev->ops->ioctl) {
i32 result = dev->ops->ioctl(dev->data, cmd, &vm->memory[args_ptr]);
@ -468,6 +461,18 @@ bool step_vm(VM *vm) {
vm->frames[vm->fp].registers[dest] = ptr;
return true;
}
case OP_STRLEN: {
u32 ptr, length;
dest = read_u8(vm, code, vm->pc);
vm->pc++;
src1 = read_u8(vm, code, vm->pc);
vm->pc++;
ptr = vm->frames[vm->fp].registers[src1];
length = read_u32(vm, memory, ptr);
vm->frames[vm->fp].registers[dest] = length;
return true;
}
case OP_STRING_TO_INT: {
/* not implemented yet */
return false;