- compiler works for basic maths expressions and functions

- basic pointers and reading values from pointers works
- writing to pointers not yet implemented (looks painful so a problem
  for tomorrow)
- updated print library. the compiler has this hardcoded in all programs
  for now
This commit is contained in:
2026-02-03 02:11:30 +00:00
parent 5573c5a609
commit 3afeafc9d4
17 changed files with 2009 additions and 807 deletions
-139
View File
@@ -1,139 +0,0 @@
// GENERATED BY DSA-C COMPILER
// Generated at 2026-01-31 01:39:55
// Imports
include maths: "./lib/maths/core.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
// Function return boilerplate
_ret:
mov bpr, spr
pop bpr
return
factorial:
push bpr
mov spr, bpr
ldw bpr, rg0, 8
lli 1, rg1
cmp rg0, rg1
lli 0, rg2
jgt _cmp_end_1
lli 1, rg2
_cmp_end_1:
cmp rg2, zero
jeq _else_3
_then_2:
lli 1, rg1
stw rg1, bpr, 8
jmp _ret
jmp _end_4
_else_3:
nop
_end_4:
push rg0
lli 1, rg1
sub rg0, rg1, rg2
push rg2
call factorial
pop rg1
pop rg0
push rg1
push rg0
call maths::multiply
pop rg2
pop zero
stw rg2, bpr, 8
jmp _ret
add_:
push bpr
mov spr, bpr
ldw bpr, rg0, 8
ldw bpr, rg1, 12
add rg0, rg1, rg2
stw rg2, bpr, 8
jmp _ret
greater:
push bpr
mov spr, bpr
ldw bpr, rg0, 8
ldw bpr, rg1, 12
add rg0, rg0, rg2
add rg1, rg1, rg3
cmp rg2, rg3
lli 0, rg4
jle _cmp_end_5
lli 1, rg4
_cmp_end_5:
cmp rg4, zero
jeq _else_7
_then_6:
stw rg0, bpr, 8
jmp _ret
jmp _end_8
_else_7:
add rg1, rg0, rg2
stw rg2, bpr, 8
jmp _ret
_end_8:
jmp _ret
main:
push bpr
mov spr, bpr
lli 5, rg0
push rg0
lli 5, rg1
push rg1
call add_
pop rg2
pop zero
push rg2
lli 5, rg0
push rg0
call greater
pop rg1
pop zero
push rg1
call print::print_num
pop rg0
lli 5, rg0
push rg0
call factorial
pop rg1
push rg1
call print::print_num
pop rg0
lli 0, rg0
stw rg0, bpr, 8
jmp _ret
+26 -3
View File
@@ -40,7 +40,7 @@ dw display: 0x20000
dw current: 0x20000
// ------------------------------------------
// prints the string at addr(arg[0]) to the screen.
// prints the string at addr(arg[0]) to the screen. (no trailing whitespace unless explicitly provided)
print:
push bpr
mov spr, bpr
@@ -50,13 +50,36 @@ print:
_print_loop:
ldb rg0, acc
cmp acc, zero
jeq _end
stb acc, rg1
addi rg0, 1
addi rg1, 1
cmp acc, zero
jne _print_loop
jmp _print_loop
// ------------------------------------------
println:
push bpr
mov spr, bpr
ldw bpr, rg0, 8
ldw current, rg1
_println_loop:
ldb rg0, acc
cmp acc, zero
jeq _println_end
stb acc, rg1
addi rg0, 1
addi rg1, 1
jmp _println_loop
_println_end:
call print_newline
jmp _end
// ------------------------------------------
+43
View File
@@ -59,3 +59,46 @@ _divmod_end:
mov bpr, spr
pop bpr
return
// multiply.dsa - improved version
// Multiplies two 32-bit numbers using shift-and-add
//
// Usage:
// push operand2 (multiplier)
// push operand1 (multiplicand)
// call multiply::multiply
// pop result
// pop zero (discard second argument)
new_multiply:
push bpr
mov spr, bpr
ldw bpr, rg0, 8 // rg0 = multiplicand
ldw bpr, rg1, 12 // rg1 = multiplier
lli 0, rg2 // rg2 = result (accumulator)
lli 32, rg3 // rg3 = bit counter
mult_loop:
// Check if lowest bit of multiplier is 1
lli 1, acc
and rg1, acc, acc // acc = rg1 & 1
cmp acc, zero
jeq skip_add // if (rg1 & 1) == 0, skip addition
// Add multiplicand to result
add rg2, rg0, rg2
skip_add:
shl rg0, 1 // shift multiplicand left
shr rg1, 1 // shift multiplier right
dec rg3
cmp rg3, zero
jgt mult_loop
stw rg2, bpr, 8 // store result
mov bpr, spr
pop bpr
return
+37
View File
@@ -0,0 +1,37 @@
dw global_arena_start: 0x30000
dw global_arena_current: 0x30000
dw global_arena_end: 0x40000
arena_alloc:
// Just like bump allocator
push bpr
mov spr, bpr
ldw bpr, rg0, 8 // size argument
ldw global_arena_current, rg1
add rg1, rg0, rg2 // new_current = current + size
ldw global_arena_end, rg3
cmp rg2, rg3
jgt out_of_memory
stw rg2, global_arena_current
mov rg1, acc // return old current
stw acc, bpr, 8
mov bpr, spr
pop bpr
return
arena_reset:
// Reset to start
push bpr
mov spr, bpr
ldw global_arena_start, rg0
stw rg0, global_arena_current
mov bpr, spr
pop bpr
return
+8 -5
View File
@@ -15,13 +15,16 @@ init:
dw string: "hello world"
start:
lwi 100, rg0
lwi 10, rg1
lwi 1, rg0
lwi 2, rg1
push rg0
push rg1
call maths::multiply
push rg0
call maths::new_divide
pop rg0
pop rg1
hlt
pop rg0
pop zero
push rg0
+67
View File
@@ -0,0 +1,67 @@
// GENERATED BY DSC COMPILER
// Generated at 2026-02-03 02:08:02
// Imports
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 5, rg0
db str_1: "Hello world"
lwi str_1, rg1
db str_2: "test"
lwi str_2, rg2
push rg0
push rg1
push rg2
db str_3: "hello world 2 electric boogaloo"
lwi str_3, rg3
push rg3
call print::println
pop zero
pop rg2
pop rg1
pop rg0
push rg0
push rg1
push rg2
lli 213, rg3
push rg3
call print::print_num
pop zero
pop rg2
pop rg1
pop rg0
jmp _ret
+8 -2
View File
@@ -1,2 +1,8 @@
fn factorial(n: u32) -> u32 {}
fn main(x: u32, y: u32) -> u32 {}
fn main() -> u32 {
let x: u32 = 5;
let stringgg: str = "Hello world";
let test: str = "test";
println("hello world 2 electric boogaloo");
printnum(213);
}
Binary file not shown.