diff --git a/.gitignore b/.gitignore index 96ef6c0..9124233 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,4 @@ /target Cargo.lock +/doc/.obsidian +/.idea diff --git a/.idea/dsa2.iml b/.idea/dsa2.iml index 0a6f00f..ae5453d 100644 --- a/.idea/dsa2.iml +++ b/.idea/dsa2.iml @@ -14,6 +14,8 @@ + + diff --git a/doc/concept.png b/doc/concept.png new file mode 100644 index 0000000..7bbc31e Binary files /dev/null and b/doc/concept.png differ diff --git a/doc/dsc.md b/doc/dsc.md new file mode 100644 index 0000000..fd01129 --- /dev/null +++ b/doc/dsc.md @@ -0,0 +1,26 @@ +# High Level programming language + +```dsc +class User { + priv const MAX: u32 = u32::MAX; + priv static COUNT: Atomic = 0; + + priv field id: u32; + priv field name: String; + priv field age: u8; + + pub fn new(view: UserView) -> Self { + let id = COUNT.fetch_add(1); + Self { ... } + } + + pub view UserView { name, age }; +} + +fn main() { + let user1 = User::new("name1", 1) + + let user2view = User::UserView { "name2", 2 }; + let user2 = User::new(user2view) +} +``` diff --git a/doc/dsi.md b/doc/dsi.md new file mode 100644 index 0000000..093c291 --- /dev/null +++ b/doc/dsi.md @@ -0,0 +1 @@ +# Intermediate/Systems programming language diff --git a/doc/notes/Emulator Process Architecture.md b/doc/notes/Emulator Process Architecture.md new file mode 100644 index 0000000..1548825 --- /dev/null +++ b/doc/notes/Emulator Process Architecture.md @@ -0,0 +1,12 @@ +## What are processes in this context? + +- a trait that a type must implement in order to be coordinated by some "process manager" +## Required Capabilities? + - start + - pause + - resume + - terminate + - report progress & send back logs + - communicate when there's an error +## How to coordinate them +- run each process in parallel \ No newline at end of file diff --git a/dsa_resources/animation.dsb b/dsa_resources/animation.dsb new file mode 100644 index 0000000..b7aa975 Binary files /dev/null and b/dsa_resources/animation.dsb differ diff --git a/dsa_resources/bench.dsb b/dsa_resources/bench.dsb new file mode 100644 index 0000000..3ff502c Binary files /dev/null and b/dsa_resources/bench.dsb differ diff --git a/dsa_resources/bench_decomp.txt b/dsa_resources/bench_decomp.txt new file mode 100644 index 0000000..6db959f --- /dev/null +++ b/dsa_resources/bench_decomp.txt @@ -0,0 +1,161 @@ +; ==== symbols ==== +; clear 0x000001d0 TEXT global +; _loop 0x00000018 TEXT global +; print_whitespace 0x00000150 TEXT global +; _print_hex_nibble_number 0x00000140 TEXT global +; _init 0x00000000 TEXT global +; _print_loop 0x00000068 TEXT global +; print_hex_byte 0x000000e0 TEXT global +; _print_hex_byte 0x00000100 TEXT global +; _end 0x00000200 TEXT global +; print_byte 0x000000ac TEXT global +; _newline_mod 0x0000019c TEXT global +; reset 0x000001b8 TEXT global +; _newline_done 0x000001ac TEXT global +; msg 0x00000218 DATA global +; display 0x00000228 DATA global +; current 0x0000022c DATA global +; _clear_loop 0x000001e8 TEXT global +; _print_hex_nibble 0x00000124 TEXT global +; print 0x00000040 TEXT global +; stack 0x00000224 DATA global +; _print_end 0x00000084 TEXT global +; newline 0x00000174 TEXT global + +; ==== data ==== + db "hello world" + dw 0x00000000 + dw 0x00000010 + dw 0x00000000 + dw 0x00000002 + dw 0x00000002 + +; ==== text ==== +_init: + ldw stack, Bpr, 0x0000 + mov Bpr, Spr + lwi 0x000f4240, Rg5 +_loop: + call reset + lwi msg, Rg0 + push Rg0 + call print + pop Zero + subi Rg5, Rg5, 0x0001 + igt Rg5, Zero, Rg4 + jnz Rg4, _loop + hlt +print: + push Bpr + mov Spr, Bpr + push Rg0 + push Rg1 + push Rg2 + push Rg3 + ldw Bpr, Rg0, 0x0008 + ldw current, Rg1, 0x0000 +_print_loop: + ldb Rg0, Rg2, 0x0000 + ieq Rg2, Zero, Rg3 + jnz Rg3, _print_end + stb Rg2, Rg1, 0x0000 + addi Rg0, Rg0, 0x0001 + addi Rg1, Rg1, 0x0001 + jmp _print_loop +_print_end: + stw current, Rg1, 0x0000 + pop Rg3 + pop Rg2 + pop Rg1 + pop Rg0 + mov Bpr, Spr + pop Bpr + ret +print_byte: + push Bpr + mov Spr, Bpr + push Rg0 + push Rg1 + ldw Bpr, Rg0, 0x0008 + ldw current, Rg1, 0x0000 + stb Rg0, Rg1, 0x0000 + addi Rg1, Rg1, 0x0001 + pop Rg1 + pop Rg0 + jmp _end +print_hex_byte: + push Bpr + mov Spr, Bpr + ldw Bpr, Rg0, 0x0008 + ldw current, Rg1, 0x0000 + call _print_hex_byte + jmp _end +_print_hex_byte: + lli Rg2, 0x000f + push Rg0 + shr Rg0, Rg0, Zero, 4 + and Rg0, Rg2, Rg0 + call _print_hex_nibble + pop Rg0 + and Rg0, Rg2, Rg0 + call _print_hex_nibble + ret +_print_hex_nibble: + lli Rg3, 0x000a + ilt Rg0, Rg3, Rg4 + jnz Rg4, _print_hex_nibble_number + addi Rg0, Rg0, 0x0037 + stb Rg0, Rg1, 0x0000 + addi Rg1, Rg1, 0x0001 + ret +_print_hex_nibble_number: + addi Rg0, Rg0, 0x0030 + stb Rg0, Rg1, 0x0000 + addi Rg1, Rg1, 0x0001 + ret +print_whitespace: + push Bpr + mov Spr, Bpr + ldw current, Rg1, 0x0000 + lli Rg0, 0x0020 + stb Rg0, Rg1, 0x0000 + addi Rg1, Rg1, 0x0001 + jmp _end +newline: + push Bpr + mov Spr, Bpr + ldw display, Rg0, 0x0000 + ldw current, Rg1, 0x0000 + sub Rg1, Rg0, Rg2 + lli Rg3, 0x0050 +_newline_mod: + ilt Rg2, Rg3, Rg4 + jnz Rg4, _newline_done + sub Rg2, Rg3, Rg2 + jmp _newline_mod +_newline_done: + sub Rg1, Rg2, Rg1 + addi Rg1, Rg1, 0x0050 + jmp _end +reset: + push Bpr + mov Spr, Bpr + ldw display, Rg1, 0x0000 + jmp _end +clear: + push Bpr + mov Spr, Bpr + lli Rg0, 0x01f4 + ldw display, Rg1, 0x0000 +_clear_loop: + subi Rg0, Rg0, 0x0001 + stw Zero, Rg1, 0x0000 + addi Rg1, Rg1, 0x0004 + igt Rg0, Zero, Rg4 + jnz Rg4, _clear_loop + jmp _end +_end: + stw current, Rg1, 0x0000 + mov Bpr, Spr + pop Bpr + ret diff --git a/dsa_resources/bf.dsb b/dsa_resources/bf.dsb new file mode 100644 index 0000000..cad9f37 Binary files /dev/null and b/dsa_resources/bf.dsb differ diff --git a/dsa_resources/bfout.dsb b/dsa_resources/bfout.dsb new file mode 100644 index 0000000..c3da0cf Binary files /dev/null and b/dsa_resources/bfout.dsb differ diff --git a/dsa_resources/decomp.txt b/dsa_resources/decomp.txt new file mode 100644 index 0000000..6cdace1 --- /dev/null +++ b/dsa_resources/decomp.txt @@ -0,0 +1,592 @@ +; ==== symbols ==== +; _print_hex_nibble 0x00000328 TEXT global +; increment 0x000000ec TEXT global +; _clear_loop 0x000003ec TEXT global +; end 0x000000c0 TEXT global +; reset 0x000003bc TEXT global +; _print_end 0x00000288 TEXT global +; decrement 0x000000f4 TEXT global +; open_left 0x000001c8 TEXT global +; open_right 0x0000017c TEXT global +; expr_end 0x00000198 TEXT global +; newline 0x00000378 TEXT global +; input 0x0000013c TEXT global +; loop_start 0x00000050 TEXT global +; loop_end 0x000000e4 TEXT global +; _traverse_right 0x00000158 TEXT global +; dec_ptr 0x0000010c TEXT global +; expr_start 0x0000014c TEXT global +; print_hex_byte 0x000002e4 TEXT global +; print_byte 0x000002b0 TEXT global +; success 0x000009e8 DATA global +; data 0x000005e8 DATA global +; error 0x000005c4 DATA global +; clear 0x000003d4 TEXT global +; _print_hex_byte 0x00000304 TEXT global +; _bf_reset_clear_data 0x00000208 TEXT global +; bf_reset 0x000001e4 TEXT global +; _end 0x00000404 TEXT global +; _traverse_left_start 0x000001a0 TEXT global +; _init 0x00000000 TEXT global +; counter 0x000005dc DATA global +; _print_loop 0x0000026c TEXT global +; print_whitespace 0x00000354 TEXT global +; inc_ptr 0x000000fc TEXT global +; current 0x000009f8 DATA global +; _traverse_right_start 0x00000154 TEXT global +; print 0x00000244 TEXT global +; init 0x00000010 TEXT global +; stack 0x000005e0 DATA global +; _traverse_left 0x000001a4 TEXT global +; start 0x0000001c TEXT global +; close_left 0x000001dc TEXT global +; input_addr 0x000005e4 DATA global +; close_right 0x00000184 TEXT global +; display 0x000009f4 DATA global +; _newline_done 0x000003b0 TEXT global +; program 0x0000041c DATA global +; _newline_mod 0x000003a0 TEXT global +; _print_hex_nibble_number 0x00000344 TEXT global +; output 0x0000011c TEXT global + +; ==== data ==== + db "++++++++++++++++++++++++++++++++++++++++++++>++++++++++++++++++++++++++++++++>++++++++++++++++>>+<<[>>>>++++++++++<<[->+>-[>+>>]>[+[-<+>]>+>>]<<<<<<]>[<+>-]>[-]>>>++++++++++<[->-[>+>>]>[+[-<+>]>+>>]<<<<<]>[-]>>[++++++++++++++++++++++++++++++++++++++++++++++++.[-]]<[++++++++++++++++++++++++++++++++++++++++++++++++.[-]]<<<++++++++++++++++++++++++++++++++++++++++++++++++.[-]<<<<<<<.>.>>[>>+<<-]>[>+<<+>-]>[<+>-]<<<-]<<++..." + db "Invalid Instruction!" + dw 0x00000000 + dw 0x000000ff + dw 0x00000000 + dw 0x00000001 + dw 0x00000003 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + dw 0x00000000 + db "Success!" + dw 0x00000000 + dw 0x00000000 + dw 0x00000002 + dw 0x00000002 + +; ==== text ==== +_init: + ldw stack, Bpr, 0x0000 + mov Bpr, Spr +init: + ldw counter, Rg7, 0x0000 +start: + call bf_reset + lwi program, Rg0 + lwi data, Rg1 + lli Rg8, 0x002b + lli Rg9, 0x002d + lli Rga, 0x003e + lli Rgb, 0x003c + lli Rgc, 0x002e + lli Rgd, 0x002c + lli Rge, 0x005b + lli Rgf, 0x005d +loop_start: + ldb Rg0, Rg3, 0x0000 + ieq Rg3, Rg8, Rg4 + jnz Rg4, increment + ieq Rg3, Rg9, Rg4 + jnz Rg4, decrement + ieq Rg3, Rga, Rg4 + jnz Rg4, inc_ptr + ieq Rg3, Rgb, Rg4 + jnz Rg4, dec_ptr + ieq Rg3, Rgc, Rg4 + jnz Rg4, output + ieq Rg3, Rgd, Rg4 + jnz Rg4, input + ieq Rg3, Rge, Rg4 + jnz Rg4, expr_start + ieq Rg3, Rgf, Rg4 + jnz Rg4, expr_end + ieq Rg3, Zero, Rg4 + jnz Rg4, end + lwi error, Rg2 + push Rg0 + push Rg1 + push Rg2 + call print + pop Zero + pop Rg1 + pop Rg0 +end: + call newline + lwi success, Rg0 + push Rg0 + call print + pop Zero + subi Rg7, Rg7, 0x0001 + jnz Rg7, start + hlt +loop_end: + addi Rg0, Rg0, 0x0001 + jmp loop_start +increment: + addi Rg2, Rg2, 0x0001 + jmp loop_end +decrement: + subi Rg2, Rg2, 0x0001 + jmp loop_end +inc_ptr: + stw Rg2, Rg1, 0x0000 + addi Rg1, Rg1, 0x0004 + ldw Rg1, Rg2, 0x0000 + jmp loop_end +dec_ptr: + stw Rg2, Rg1, 0x0000 + subi Rg1, Rg1, 0x0004 + ldw Rg1, Rg2, 0x0000 + jmp loop_end +output: + push Rg0 + push Rg1 + push Rg2 + call print_byte + pop Zero + pop Rg1 + pop Rg0 + jmp loop_end +input: + ldw input_addr, Rg2, 0x0000 + jmp loop_end +expr_start: + ieq Rg2, Zero, Rg4 + jez Rg4, loop_end +_traverse_right_start: + push Rg8 +_traverse_right: + addi Rg0, Rg0, 0x0001 + ldb Rg0, Rg3, 0x0000 + ieq Rg3, Rge, Rg4 + jnz Rg4, open_right + ieq Rg3, Rgf, Rg4 + jnz Rg4, close_right + ieq Rg3, Zero, Rg4 + jnz Rg4, end + jmp _traverse_right +open_right: + push Zero + jmp _traverse_right +close_right: + pop Rg4 + ieq Rg4, Zero, Rg5 + jnz Rg5, _traverse_right + addi Rg0, Rg0, 0x0001 + jmp loop_start +expr_end: + ieq Rg2, Zero, Rg4 + jnz Rg4, loop_end +_traverse_left_start: + push Rg8 +_traverse_left: + subi Rg0, Rg0, 0x0001 + ldb Rg0, Rg3, 0x0000 + ieq Rg3, Rge, Rg4 + jnz Rg4, open_left + ieq Rg3, Rgf, Rg4 + jnz Rg4, close_left + ieq Rg3, Zero, Rg4 + jnz Rg4, end + jmp _traverse_left +open_left: + pop Rg4 + ieq Rg4, Zero, Rg5 + jnz Rg5, _traverse_left + addi Rg0, Rg0, 0x0001 + jmp loop_start +close_left: + push Zero + jmp _traverse_left +bf_reset: + push Bpr + mov Spr, Bpr + push Rg0 + push Rg1 + call clear + call reset + lli Rg0, 0x0100 + lwi data, Rg1 +_bf_reset_clear_data: + subi Rg0, Rg0, 0x0001 + stw Zero, Rg1, 0x0000 + addi Rg1, Rg1, 0x0004 + igt Rg0, Zero, Rg4 + jnz Rg4, _bf_reset_clear_data + pop Rg1 + pop Rg0 + lwi program, Rg0 + lwi data, Rg1 + lli Rg2, 0x0000 + mov Bpr, Spr + pop Bpr + ret +print: + push Bpr + mov Spr, Bpr + push Rg0 + push Rg1 + push Rg2 + push Rg3 + ldw Bpr, Rg0, 0x0008 + ldw current, Rg1, 0x0000 +_print_loop: + ldb Rg0, Rg2, 0x0000 + ieq Rg2, Zero, Rg3 + jnz Rg3, _print_end + stb Rg2, Rg1, 0x0000 + addi Rg0, Rg0, 0x0001 + addi Rg1, Rg1, 0x0001 + jmp _print_loop +_print_end: + stw current, Rg1, 0x0000 + pop Rg3 + pop Rg2 + pop Rg1 + pop Rg0 + mov Bpr, Spr + pop Bpr + ret +print_byte: + push Bpr + mov Spr, Bpr + push Rg0 + push Rg1 + ldw Bpr, Rg0, 0x0008 + ldw current, Rg1, 0x0000 + stb Rg0, Rg1, 0x0000 + addi Rg1, Rg1, 0x0001 + pop Rg1 + pop Rg0 + jmp _end +print_hex_byte: + push Bpr + mov Spr, Bpr + ldw Bpr, Rg0, 0x0008 + ldw current, Rg1, 0x0000 + call _print_hex_byte + jmp _end +_print_hex_byte: + lli Rg2, 0x000f + push Rg0 + shr Rg0, Rg0, Zero, 4 + and Rg0, Rg2, Rg0 + call _print_hex_nibble + pop Rg0 + and Rg0, Rg2, Rg0 + call _print_hex_nibble + ret +_print_hex_nibble: + lli Rg3, 0x000a + ilt Rg0, Rg3, Rg4 + jnz Rg4, _print_hex_nibble_number + addi Rg0, Rg0, 0x0037 + stb Rg0, Rg1, 0x0000 + addi Rg1, Rg1, 0x0001 + ret +_print_hex_nibble_number: + addi Rg0, Rg0, 0x0030 + stb Rg0, Rg1, 0x0000 + addi Rg1, Rg1, 0x0001 + ret +print_whitespace: + push Bpr + mov Spr, Bpr + ldw current, Rg1, 0x0000 + lli Rg0, 0x0020 + stb Rg0, Rg1, 0x0000 + addi Rg1, Rg1, 0x0001 + jmp _end +newline: + push Bpr + mov Spr, Bpr + ldw display, Rg0, 0x0000 + ldw current, Rg1, 0x0000 + sub Rg1, Rg0, Rg2 + lli Rg3, 0x0050 +_newline_mod: + ilt Rg2, Rg3, Rg4 + jnz Rg4, _newline_done + sub Rg2, Rg3, Rg2 + jmp _newline_mod +_newline_done: + sub Rg1, Rg2, Rg1 + addi Rg1, Rg1, 0x0050 + jmp _end +reset: + push Bpr + mov Spr, Bpr + ldw display, Rg1, 0x0000 + jmp _end +clear: + push Bpr + mov Spr, Bpr + lli Rg0, 0x01f4 + ldw display, Rg1, 0x0000 +_clear_loop: + subi Rg0, Rg0, 0x0001 + stw Zero, Rg1, 0x0000 + addi Rg1, Rg1, 0x0004 + igt Rg0, Zero, Rg4 + jnz Rg4, _clear_loop + jmp _end +_end: + stw current, Rg1, 0x0000 + mov Bpr, Spr + pop Bpr + ret diff --git a/dsa_resources/framebuffer.dsb b/dsa_resources/framebuffer.dsb new file mode 100644 index 0000000..214d849 Binary files /dev/null and b/dsa_resources/framebuffer.dsb differ diff --git a/dsa_resources/out3.dsb b/dsa_resources/out3.dsb new file mode 100644 index 0000000..46944dc Binary files /dev/null and b/dsa_resources/out3.dsb differ