#include "../../../vm/vm.h" #include #define CODE_SIZE 8192 #define MEMORY_SIZE 65536 u8 lmem[MEMORY_SIZE] = {0}; u8 lcode[CODE_SIZE] = {0}; bool init_vm() { mem = lmem; code = lcode; lc = 0; mp = 0; cp = 0; pc = 0; interrupt = 0; status = 0; return true; } u32 syscall(u32 id, u32 size, u32 mem_ptr) { USED(size); switch(id) { case SYSCALL_CONSOLE_WRITE: { u32 size = *(u32*)&mem[mem_ptr]; u8 *ptr = &mem[mem_ptr + 4]; for (u32 i = 0; i < size; i++) { putchar(*(ptr++)); } return 0; } case SYSCALL_CONSOLE_READ: { u8 *ptr = &mem[mp]; mcpy(ptr, &size, sizeof(u32)); ptr += 4; for (u32 i = 0; i < size; i++) { u8 ch = getchar(); if (ch == '\0') break; if (ch == '\n') break; *(ptr++) = ch; } ptr[size] = '\0'; mp += 4 + size + 1; } } return 1; // generic error } void test_add_two_num() { code[cp++] = OP_GET; code[cp++] = OP_GET; code[cp++] = OP_GET; code[cp++] = OP_CALL; code[cp++] = OP_INT_TO_STR; code[cp++] = OP_SYSCALL; code[cp++] = OP_HALT; /* add */ code[cp++] = OP_ADD_INT; code[cp++] = OP_RETURN; } i32 main() { init_vm(); test_add_two_num(); while(step_vm()) { // do stuff } return 0; }