#include "../../../vm/vm.h" #include #define FRAMES_SIZE 128 #define CODE_SIZE 8192 #define MEMORY_SIZE 65536 u8 lmem[MEMORY_SIZE] = {0}; u32 lcode[CODE_SIZE] = {0}; Frame lframes[FRAMES_SIZE] = {0}; u32 syscall(u32 id, u32 size, u32 mem_ptr) { USED(size); switch(id) { case SYSCALL_CONSOLE_WRITE: { u32 size = *(u32 *)(mem + mem_ptr); u32 ptr = mem_ptr + 4; for (u32 i = 0; i < size; i++) { putchar(mem[ptr + i]); } putchar('\n'); return 0; } case SYSCALL_CONSOLE_READ: { for (u32 i = 0; i < size; i++) { u8 ch = getchar(); if (ch == '\0') break; if (ch == '\n') break; mem[mem_ptr + i] = ch; } } return 0; } return 1; // generic error } void test_add_two_num() { i32 main_local_count = 4; mp += (4 * main_local_count); code[cp++] = ENCODE_B(OP_LOAD_IMM, 0, 1); code[cp++] = ENCODE_B(OP_PUSH, 0, 0); code[cp++] = ENCODE_B(OP_LOAD_IMM, 1, 1); code[cp++] = ENCODE_B(OP_PUSH, 1, 0); i32 add = cp + 5; code[cp++] = ENCODE_B(OP_LOAD_IMM, 2, add); code[cp++] = ENCODE_A(OP_CALL, 2, 3, 0); code[cp++] = ENCODE_A(OP_INT_TO_STR, 4, 3, 0); code[cp++] = ENCODE_A(OP_SYSCALL, SYSCALL_CONSOLE_WRITE, 1, 4); code[cp++] = ENCODE_A(OP_HALT, 0, 0, 0); /* add */ code[cp++] = ENCODE_A(OP_ADD_INT, 2, 1, 0); code[cp++] = ENCODE_B(OP_RETURN, 2, 0); } void test_fibonacci() { /* function main() */ i32 fib = 7; i32 base_case = 21; /* fib(35) */ /*0*/ code[cp++] = ENCODE_B(OP_LOAD_IMM, 0, 35); /*1*/ code[cp++] = ENCODE_B(OP_PUSH, 0, 0); /*2*/ code[cp++] = ENCODE_B(OP_LOAD_IMM, 1, fib); /*3*/ code[cp++] = ENCODE_A(OP_CALL, 1, 2, 0); /**/ /* print */ /*4*/ code[cp++] = ENCODE_A(OP_INT_TO_STR, 3, 2, 0); /*5*/ code[cp++] = ENCODE_A(OP_SYSCALL, SYSCALL_CONSOLE_WRITE, 1, 3); /*6*/ code[cp++] = ENCODE_A(OP_HALT, 0, 0, 0); /**/ /* function fib (int n) int */ /*9*/ code[cp++] = ENCODE_B(OP_LOAD_IMM, 8, fib); /*10*/ code[cp++] = ENCODE_B(OP_LOAD_IMM, 1, 2); /*11*/ code[cp++] = ENCODE_B(OP_LOAD_IMM, 2, base_case); /*12*/ code[cp++] = ENCODE_A(OP_JLT_INT, 2, 0, 1); /*13*/ code[cp++] = ENCODE_B(OP_LOAD_IMM, 3, 1); /*14*/ code[cp++] = ENCODE_A(OP_SUB_INT, 4, 0, 3); /*15*/ code[cp++] = ENCODE_B(OP_PUSH, 4, 0); /*16*/ code[cp++] = ENCODE_A(OP_CALL, 8, 5, 0); /*17*/ code[cp++] = ENCODE_B(OP_LOAD_IMM, 3, 2); /*18*/ code[cp++] = ENCODE_A(OP_SUB_INT, 4, 0, 3); /*19*/ code[cp++] = ENCODE_B(OP_PUSH, 4, 0); /*20*/ code[cp++] = ENCODE_A(OP_CALL, 8, 6, 0); /*21*/ code[cp++] = ENCODE_A(OP_ADD_INT, 7, 6, 5); /*22*/ code[cp++] = ENCODE_B(OP_RETURN, 7, 0); /*23*/ code[cp++] = ENCODE_B(OP_RETURN, 0, 0); } i32 main() { mem = lmem; code = lcode; frames = lframes; lc = 0; mp = 0; cp = 0; pc = 0; fp = 0; interrupt = 0; status = 0; /* test_add_two_num(); */ test_fibonacci(); while(step_vm()) { // do stuff } return 0; }