- 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:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
// ------------------------------------------
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
Reference in New Issue
Block a user