undar-lang/arch/linux/tui/main.c

111 lines
2.9 KiB
C

#include "../../../vm/vm.h"
#include <stdio.h>
#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;
}