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