diff --git a/arch/linux/tui/main.c b/arch/linux/tui/main.c index 0e103fb..f0d85fb 100644 --- a/arch/linux/tui/main.c +++ b/arch/linux/tui/main.c @@ -50,33 +50,42 @@ void test_add_two_num() { } void test_fibonacci() { - /* fn main() */ + i32 fib = 6; + i32 base_case = 20; + /* function main() */ i32 main_local_count = 3; mp += (4 * main_local_count); + /* fib(35) */ code[cp++] = ENCODE_B(OP_LOAD_IMM, 0, 35); code[cp++] = ENCODE_B(OP_PUSH, 0, 0); - i32 fib = cp + 4; code[cp++] = ENCODE_B(OP_LOAD_IMM, 1, fib); - code[cp++] = ENCODE_A(OP_CALL, 1, 3, 2); + code[cp++] = ENCODE_A(OP_CALL, 1, 9, 2); + /* print */ code[cp++] = ENCODE_A(OP_SYSCALL, SYSCALL_DBG_PRINT, 1, 2); code[cp++] = ENCODE_A(OP_HALT, 0, 0, 0); - - /* fn fib */ + /* function fib (int n) int */ + code[cp++] = ENCODE_B(OP_LOAD_IMM, 8, fib); code[cp++] = ENCODE_B(OP_LOAD_IMM, 1, 2); - code[cp++] = ENCODE_B(OP_LOAD_IMM, 2, fib); + code[cp++] = ENCODE_B(OP_LOAD_IMM, 2, base_case); code[cp++] = ENCODE_A(OP_JLT_INT, 2, 0, 1); code[cp++] = ENCODE_B(OP_LOAD_IMM, 3, 2); code[cp++] = ENCODE_A(OP_SUB_INT, 4, 0, 3); code[cp++] = ENCODE_B(OP_PUSH, 4, 0); - code[cp++] = ENCODE_A(OP_CALL, 2, 3, 2); - + code[cp++] = ENCODE_A(OP_CALL, 8, 9, 5); + code[cp++] = ENCODE_B(OP_LOAD_IMM, 3, 1); + code[cp++] = ENCODE_A(OP_SUB_INT, 4, 0, 3); + code[cp++] = ENCODE_B(OP_PUSH, 4, 0); + code[cp++] = ENCODE_A(OP_CALL, 8, 9, 6); + code[cp++] = ENCODE_A(OP_ADD_INT, 7, 6, 5); + code[cp++] = ENCODE_B(OP_RETURN, 7, 0); code[cp++] = ENCODE_B(OP_RETURN, 0, 0); } i32 main() { init_vm(); - test_add_two_num(); + /* test_add_two_num(); */ + test_fibonacci(); while(step_vm()) { // do stuff