Files
Sagittarius/Headers/Sagittarius.h
T
2026-05-25 14:24:15 +10:00

62 lines
2.1 KiB
C

#ifndef __SAGITTARIUS_H_
#define __SAGITTARIUS_H_
#include "SagittariusInst.h"
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include "SagittariusBase.h"
typedef struct SagittariusRegister
{
// 256 Usable + Overflow preventing purpose 256 extra bytes.
uint8_t head[512];
} SagittariusRegister;
typedef struct SagittariusMemory
{
uint8_t *data;
uint64_t size;
} SagittariusMemory;
typedef struct SagittariusCore
{
SagittariusRegister reg;
SagittariusMemory *memory;
struct SagittariusVM *vm;
uint64_t pc;
} SagittariusCore;
typedef int32_t (*SagittariusSyscall)(SagittariusCore *core);
typedef int32_t (*SagittariusPanicHandler)(SagittariusCore *core, uint64_t panic_id, const char *msg);
typedef struct SagittariusSyscallEntry
{
uint64_t id;
SagittariusSyscall syscall;
} SagittariusSyscallEntry;
typedef struct SagittariusVM
{
SagittariusSyscallEntry *SagittariusSyscallEntries;
uint64_t SagittariusSyscallCount;
uint64_t SagittariusSyscallCapacity;
SagittariusCore core;
SagittariusMemory Memory;
SagittariusPanicHandler panic_handler;
} SagittariusVM;
/**
* The layout of program in byte form (without the head):
* |0..31|32..95|96..159|160..|...
* |format version|inst count|data size|instructions...|data...|
* |uint32|uint64|uint64|inst1|inst2|...|data...|
*/
typedef struct SagittariusProgram
{
SagittariusInst *instructions;
uint64_t instCount;
uint8_t *data;
uint64_t data_size;
} SagittariusProgram;
SAGITTARIUS_API SagittariusVM *sagittarius_vm_new(uint64_t memory_size);
SAGITTARIUS_API void sagittarius_register_syscall(SagittariusVM *vm, uint64_t id, SagittariusSyscall syscall);
SAGITTARIUS_API void sagittarius_vm_free(SagittariusVM *vm);
SAGITTARIUS_API void sagittarius_step(SagittariusVM *vm);
SAGITTARIUS_API void sagittarius_mem_resize(SagittariusVM *vm, uint64_t new_size);
SAGITTARIUS_API uint64_t sagittarius_mem_getsize(SagittariusVM *vm);
SAGITTARIUS_API void sagittarius_load_program_to_mem(SagittariusVM *vm, SagittariusProgram *program, uint64_t offset);
SAGITTARIUS_API SagittariusProgram *sagittarius_load_program_from_byte_array(uint8_t *data, uint64_t size);
#endif