From 889ee8ef713f305c3bdbae94a74cbbba9cd59715 Mon Sep 17 00:00:00 2001 From: zxq5 Date: Wed, 4 Feb 2026 01:58:03 +0000 Subject: [PATCH] wrote dsa/dsc code examples including an allocator --- resources/dsa/build/bf.dsb | Bin 0 -> 4 bytes resources/dsa/build/test.dsb | Bin 0 -> 4 bytes resources/dsa/example.dsa | 121 +++++++++++++++++++++++ resources/dsa/example.dsc | 32 ++++++ resources/dsa/lib/memory/arena_alloc.dsa | 100 +++++++++++++++++++ resources/dsa/lib/memory/arena_alloc.dsc | 77 +++++++++++++++ resources/dsa/main.dsc | 9 ++ 7 files changed, 339 insertions(+) create mode 100644 resources/dsa/build/bf.dsb create mode 100644 resources/dsa/build/test.dsb create mode 100644 resources/dsa/example.dsa create mode 100644 resources/dsa/example.dsc create mode 100644 resources/dsa/lib/memory/arena_alloc.dsa create mode 100644 resources/dsa/lib/memory/arena_alloc.dsc create mode 100644 resources/dsa/main.dsc diff --git a/resources/dsa/build/bf.dsb b/resources/dsa/build/bf.dsb new file mode 100644 index 0000000000000000000000000000000000000000..2b831a14e46872a7943b9adcac710ba835e160b8 GIT binary patch literal 4 LcmXpjXJ7#U0!09_ literal 0 HcmV?d00001 diff --git a/resources/dsa/build/test.dsb b/resources/dsa/build/test.dsb new file mode 100644 index 0000000000000000000000000000000000000000..2b831a14e46872a7943b9adcac710ba835e160b8 GIT binary patch literal 4 LcmXpjXJ7#U0!09_ literal 0 HcmV?d00001 diff --git a/resources/dsa/example.dsa b/resources/dsa/example.dsa new file mode 100644 index 0000000..07913c1 --- /dev/null +++ b/resources/dsa/example.dsa @@ -0,0 +1,121 @@ + +// GENERATED BY DSC COMPILER +// Generated at 2026-02-04 01:55:11 + +// Imports +include arena: "./lib/memory/arena_alloc.dsa" +include print: "./lib/io/print.dsa" + +// Globals & Reserved Memory + + +// Entry Point +dw stack: 0x10000 +db message: "Process Exited with code:" +_init: + ldw stack, bpr + mov bpr, spr + push zero + call main + call print::print_newline + lwi message, rg0 + push rg0 + call print::print + pop zero + call print::print_hex_word + pop zero + hlt + + +// Return +_ret: + mov bpr, spr + pop bpr + return + +// Compiled Code Starts... +main: + push bpr + mov spr, bpr + + lli 0, rg0 + push rg0 // bpr-4: x + subi bpr 4 rg1 + lli 512, rg0 + push rg1 // bpr-8: y + push rg0 // push arg 0 + call arena::new + pop rg2 + lli 32, rg0 + push rg2 // bpr-12: alloc + push rg0 // push arg 1 + push rg2 // push arg 0 + call arena::alloc + pop rg3 + pop zero + lli 32, rg0 + subi bpr 12 rg2 + ldw rg2, rg2 // bpr-20: alloc + push rg2 // bpr-16: alloc + push rg3 // bpr-20: ptr1 + push rg0 // push arg 1 + push rg2 // push arg 0 + call arena::alloc + pop rg4 + pop zero + subi bpr 16 rg0 + ldw rg0, rg0 // bpr-24: alloc + push rg0 // bpr-24: alloc + push rg4 // bpr-28: ptr2 + push rg0 // push arg 0 + call print::print_hex_word + pop zero + call print::print_newline + subi bpr 20 rg0 + ldw rg0, rg0 // bpr-28: ptr1 + push rg0 // bpr-32: ptr1 + push rg0 // push arg 0 + call print::print_hex_word + pop zero + call print::print_newline + subi bpr 28 rg0 + ldw rg0, rg0 // bpr-36: ptr2 + push rg0 // bpr-36: ptr2 + push rg0 // push arg 0 + call print::print_hex_word + pop zero + call print::print_newline + subi bpr 36 rg0 + ldw rg0, rg0 // bpr-44: ptr2 + ldw rg0, rg2 + push rg0 // bpr-40: ptr2 + push rg2 // push arg 0 + call print::print_num + pop zero + call print::print_newline + lli 42, rg2 + subi bpr 40 rg5 + ldw rg5, rg5 // bpr-48: ptr2 + stw rg2, rg5 + push rg5 // bpr-44: ptr2 + push rg5 // push arg 0 + call print::print_hex_word + pop zero + call print::print_newline + subi bpr 44 rg2 + ldw rg2, rg2 // bpr-52: ptr2 + ldw rg2, rg5 + push rg2 // bpr-48: ptr2 + push rg5 // push arg 0 + call print::print_num + pop zero + call print::print_newline + db str_12: "end" + lwi str_12, rg5 + push rg5 // push arg 0 + call print::println + pop zero + lli 0, rg5 + stw rg5, bpr, 8 + jmp _ret + diff --git a/resources/dsa/example.dsc b/resources/dsa/example.dsc new file mode 100644 index 0000000..0b49b0c --- /dev/null +++ b/resources/dsa/example.dsc @@ -0,0 +1,32 @@ +include print: "./lib/io/print.dsa"; +include arena: "./lib/memory/arena_alloc.dsa"; + +fn main() -> u32 { + + let x: u32 = 0; + let y: u32 = &x; + + let alloc: u32 = arena::new(512); + let ptr1: u32 = arena::alloc(alloc, 32); + let ptr2: u32 = arena::alloc(alloc, 32); + + print::print_hex_word(alloc); + print::print_newline(); + print::print_hex_word(ptr1); + print::print_newline(); + print::print_hex_word(ptr2); + print::print_newline(); + print::print_num(*ptr2); + print::print_newline(); + *ptr2 = 42; + + print::print_hex_word(ptr2); + print::print_newline(); + print::print_num(*ptr2); + print::print_newline(); + print::println("end"); + + return 0; +} + + diff --git a/resources/dsa/lib/memory/arena_alloc.dsa b/resources/dsa/lib/memory/arena_alloc.dsa new file mode 100644 index 0000000..31bd892 --- /dev/null +++ b/resources/dsa/lib/memory/arena_alloc.dsa @@ -0,0 +1,100 @@ +dw heap_start: 196608 +dw heap_end: 262144 +dw heap_current: 196608 + +new: + push bpr + mov spr, bpr + + ldw bpr, rg0, 8 + lli 12, rg1 + add rg0, rg1, rg2 + ldw heap_current, rg1 + add rg1, rg2, rg3 + ldw heap_end, rg4 + cmp rg3, rg4 + lli 0, rg5 + jle _cmp_end_2 + lli 1, rg5 +_cmp_end_2: + cmp rg5, zero + jeq _else_4 +_then_3: + lli 0, rg4 + stw rg4, bpr, 8 + jmp _ret + jmp _end_5 +_else_4: + nop +_end_5: + lli 12, rg4 + add rg1, rg4, rg5 + add rg1, rg2, rg4 + stw rg5, rg1 + lli 4, rg6 + add rg1, rg6, rg7 + stw rg5, rg7 + lli 8, rg6 + add rg1, rg6, rg7 + stw rg4, rg7 + stw rg3, heap_current + stw rg1, bpr, 8 + jmp _ret + +alloc: + push bpr + mov spr, bpr + + ldw bpr, rg0, 8 + ldw bpr, rg1, 12 + lli 4, rg2 + add rg0, rg2, rg3 + ldw rg3, rg2 + lli 8, rg3 + add rg0, rg3, rg4 + ldw rg4, rg3 + add rg2, rg1, rg4 + cmp rg4, rg3 + lli 0, rg5 + jle _cmp_end_6 + lli 1, rg5 +_cmp_end_6: + cmp rg5, zero + jeq _else_8 +_then_7: + lli 0, rg5 + stw rg5, bpr, 8 + jmp _ret + jmp _end_9 +_else_8: + nop +_end_9: + lli 4, rg5 + add rg0, rg5, rg6 + stw rg4, rg6 + stw rg2, bpr, 8 + jmp _ret + +destroy: + push bpr + mov spr, bpr + + ldw bpr, rg0, 8 + lli 0, rg1 + stw rg1, bpr, 8 + jmp _ret + +reset_all: + push bpr + mov spr, bpr + + ldw heap_start, rg0 + stw rg0, heap_current + lli 0, rg0 + stw rg0, bpr, 8 + jmp _ret + +_ret: + mov bpr, spr + pop bpr + return diff --git a/resources/dsa/lib/memory/arena_alloc.dsc b/resources/dsa/lib/memory/arena_alloc.dsc new file mode 100644 index 0000000..c84415f --- /dev/null +++ b/resources/dsa/lib/memory/arena_alloc.dsc @@ -0,0 +1,77 @@ +// Arena Allocator +// Supports multiple arenas that can be destroyed independently +// Much more practical than a simple bump allocator + +// Global heap management +static heap_start: u32 = 0x30000; +static heap_end: u32 = 0x40000; +static heap_current: u32 = 0x30000; + +// Arena structure (stored at the start of each arena): +// [0-3]: start_address (u32) +// [4-7]: current_position (u32) +// [8-11]: end_address (u32) +// Total header size: 12 bytes + +// Create a new arena with given size +// Returns pointer to arena handle (or 0 if failed) +fn arena_create(size: u32) -> u32 { + let total_size: u32 = size + 12; + let arena_ptr: u32 = heap_current; + let new_current: u32 = arena_ptr + total_size; + + // Check if we have space + if new_current > heap_end { + return 0; + } + + // Calculate arena data region + let data_start: u32 = arena_ptr + 12; + let data_end: u32 = arena_ptr + total_size; + + // Initialize arena header + // Note: In real implementation, you'd use pointer writes here + // For now, using placeholder comments: + *arena_ptr = data_start; // start_address + *(arena_ptr + 4) = data_start; // current_position + *(arena_ptr + 8) = data_end; // end_address + + heap_current = new_current; + + return arena_ptr; +} + +// Allocate from an arena +// Returns pointer to allocated memory (or 0 if failed) +fn arena_alloc(arena: u32, size: u32) -> u32 { + // Read current position from arena + let current: u32 = *(arena + 4); + let end: u32 = *(arena + 8); + + let new_current: u32 = current + size; + + // Check if arena has space + if new_current > end { + return 0; + } + + // Update current position in arena + *(arena + 4) = new_current; + + return current; +} + +// Destroy an arena (in bump allocator, this is a no-op) +// In a real allocator, you'd mark the memory as free +fn arena_destroy(arena: u32) { + // In a true allocator, mark memory as reusable + // For bump allocator, we can't reclaim memory + // unless we destroy ALL arenas and reset + return 0; +} + +// Reset entire heap (destroys ALL arenas) +fn reset_all() { + heap_current = heap_start; + return 0; +} diff --git a/resources/dsa/main.dsc b/resources/dsa/main.dsc new file mode 100644 index 0000000..0e0b119 --- /dev/null +++ b/resources/dsa/main.dsc @@ -0,0 +1,9 @@ +include print: "./lib/io/print.dsa"; +include fib: "./lib/maths/fib.dsa"; + +fn main() -> u32 { + let x: u32 = 6; + + let y: u32 = fib::fib_n(x); + print::print_num(y); +} \ No newline at end of file