ported over DSC compiler code to new DSCS compiler

This commit is contained in:
2026-08-09 09:17:32 +01:00
parent e20bf7d08f
commit 5fd9c33bce
37 changed files with 7194 additions and 61 deletions
+704
View File
@@ -0,0 +1,704 @@
include print: "./print.dsa"
resb program: 0x1000
dw stack: 0x10000
dw input: 0x30000
_init:
ldw stack, bpr
mov bpr, spr
main:
lwi program, rga
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
stw acc, rga
addi rga, 4
ldw rga, acc
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
stw acc, rga
addi rga, 4
ldw rga, acc
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
stw acc, rga
addi rga, 4
ldw rga, acc
stw acc, rga
addi rga, 4
ldw rga, acc
addi acc, 1
stw acc, rga
subi rga, 4
ldw rga, acc
stw acc, rga
subi rga, 4
ldw rga, acc
jez acc, loop_end_99
loop_start_99:
nop
stw acc, rga
addi rga, 4
ldw rga, acc
stw acc, rga
addi rga, 4
ldw rga, acc
stw acc, rga
addi rga, 4
ldw rga, acc
stw acc, rga
addi rga, 4
ldw rga, acc
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
stw acc, rga
subi rga, 4
ldw rga, acc
stw acc, rga
subi rga, 4
ldw rga, acc
jez acc, loop_end_116
loop_start_116:
nop
subi acc, 1
stw acc, rga
addi rga, 4
ldw rga, acc
addi acc, 1
stw acc, rga
addi rga, 4
ldw rga, acc
subi acc, 1
jez acc, loop_end_122
loop_start_122:
nop
stw acc, rga
addi rga, 4
ldw rga, acc
addi acc, 1
stw acc, rga
addi rga, 4
ldw rga, acc
stw acc, rga
addi rga, 4
ldw rga, acc
jnz acc, loop_start_122
loop_end_122:
nop
stw acc, rga
addi rga, 4
ldw rga, acc
jez acc, loop_end_129
loop_start_129:
nop
addi acc, 1
jez acc, loop_end_131
loop_start_131:
nop
subi acc, 1
stw acc, rga
subi rga, 4
ldw rga, acc
addi acc, 1
stw acc, rga
addi rga, 4
ldw rga, acc
jnz acc, loop_start_131
loop_end_131:
nop
stw acc, rga
addi rga, 4
ldw rga, acc
addi acc, 1
stw acc, rga
addi rga, 4
ldw rga, acc
stw acc, rga
addi rga, 4
ldw rga, acc
jnz acc, loop_start_129
loop_end_129:
nop
stw acc, rga
subi rga, 4
ldw rga, acc
stw acc, rga
subi rga, 4
ldw rga, acc
stw acc, rga
subi rga, 4
ldw rga, acc
stw acc, rga
subi rga, 4
ldw rga, acc
stw acc, rga
subi rga, 4
ldw rga, acc
stw acc, rga
subi rga, 4
ldw rga, acc
jnz acc, loop_start_116
loop_end_116:
nop
stw acc, rga
addi rga, 4
ldw rga, acc
jez acc, loop_end_150
loop_start_150:
nop
stw acc, rga
subi rga, 4
ldw rga, acc
addi acc, 1
stw acc, rga
addi rga, 4
ldw rga, acc
subi acc, 1
jnz acc, loop_start_150
loop_end_150:
nop
stw acc, rga
addi rga, 4
ldw rga, acc
jez acc, loop_end_157
loop_start_157:
nop
subi acc, 1
jnz acc, loop_start_157
loop_end_157:
nop
stw acc, rga
addi rga, 4
ldw rga, acc
stw acc, rga
addi rga, 4
ldw rga, acc
stw acc, rga
addi rga, 4
ldw rga, acc
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
stw acc, rga
subi rga, 4
ldw rga, acc
jez acc, loop_end_174
loop_start_174:
nop
subi acc, 1
stw acc, rga
addi rga, 4
ldw rga, acc
subi acc, 1
jez acc, loop_end_178
loop_start_178:
nop
stw acc, rga
addi rga, 4
ldw rga, acc
addi acc, 1
stw acc, rga
addi rga, 4
ldw rga, acc
stw acc, rga
addi rga, 4
ldw rga, acc
jnz acc, loop_start_178
loop_end_178:
nop
stw acc, rga
addi rga, 4
ldw rga, acc
jez acc, loop_end_185
loop_start_185:
nop
addi acc, 1
jez acc, loop_end_187
loop_start_187:
nop
subi acc, 1
stw acc, rga
subi rga, 4
ldw rga, acc
addi acc, 1
stw acc, rga
addi rga, 4
ldw rga, acc
jnz acc, loop_start_187
loop_end_187:
nop
stw acc, rga
addi rga, 4
ldw rga, acc
addi acc, 1
stw acc, rga
addi rga, 4
ldw rga, acc
stw acc, rga
addi rga, 4
ldw rga, acc
jnz acc, loop_start_185
loop_end_185:
nop
stw acc, rga
subi rga, 4
ldw rga, acc
stw acc, rga
subi rga, 4
ldw rga, acc
stw acc, rga
subi rga, 4
ldw rga, acc
stw acc, rga
subi rga, 4
ldw rga, acc
stw acc, rga
subi rga, 4
ldw rga, acc
jnz acc, loop_start_174
loop_end_174:
nop
stw acc, rga
addi rga, 4
ldw rga, acc
jez acc, loop_end_205
loop_start_205:
nop
subi acc, 1
jnz acc, loop_start_205
loop_end_205:
nop
stw acc, rga
addi rga, 4
ldw rga, acc
stw acc, rga
addi rga, 4
ldw rga, acc
jez acc, loop_end_210
loop_start_210:
nop
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
push acc
call print::print_byte
pop zero
jez acc, loop_end_260
loop_start_260:
nop
subi acc, 1
jnz acc, loop_start_260
loop_end_260:
nop
jnz acc, loop_start_210
loop_end_210:
nop
stw acc, rga
subi rga, 4
ldw rga, acc
jez acc, loop_end_265
loop_start_265:
nop
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
push acc
call print::print_byte
pop zero
jez acc, loop_end_315
loop_start_315:
nop
subi acc, 1
jnz acc, loop_start_315
loop_end_315:
nop
jnz acc, loop_start_265
loop_end_265:
nop
stw acc, rga
subi rga, 4
ldw rga, acc
stw acc, rga
subi rga, 4
ldw rga, acc
stw acc, rga
subi rga, 4
ldw rga, acc
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
addi acc, 1
push acc
call print::print_byte
pop zero
jez acc, loop_end_371
loop_start_371:
nop
subi acc, 1
jnz acc, loop_start_371
loop_end_371:
nop
stw acc, rga
subi rga, 4
ldw rga, acc
stw acc, rga
subi rga, 4
ldw rga, acc
stw acc, rga
subi rga, 4
ldw rga, acc
stw acc, rga
subi rga, 4
ldw rga, acc
stw acc, rga
subi rga, 4
ldw rga, acc
stw acc, rga
subi rga, 4
ldw rga, acc
stw acc, rga
subi rga, 4
ldw rga, acc
push acc
call print::print_byte
pop zero
stw acc, rga
addi rga, 4
ldw rga, acc
push acc
call print::print_byte
pop zero
stw acc, rga
addi rga, 4
ldw rga, acc
stw acc, rga
addi rga, 4
ldw rga, acc
jez acc, loop_end_386
loop_start_386:
nop
stw acc, rga
addi rga, 4
ldw rga, acc
stw acc, rga
addi rga, 4
ldw rga, acc
addi acc, 1
stw acc, rga
subi rga, 4
ldw rga, acc
stw acc, rga
subi rga, 4
ldw rga, acc
subi acc, 1
jnz acc, loop_start_386
loop_end_386:
nop
stw acc, rga
addi rga, 4
ldw rga, acc
jez acc, loop_end_395
loop_start_395:
nop
stw acc, rga
addi rga, 4
ldw rga, acc
addi acc, 1
stw acc, rga
subi rga, 4
ldw rga, acc
stw acc, rga
subi rga, 4
ldw rga, acc
addi acc, 1
stw acc, rga
addi rga, 4
ldw rga, acc
subi acc, 1
jnz acc, loop_start_395
loop_end_395:
nop
stw acc, rga
addi rga, 4
ldw rga, acc
jez acc, loop_end_405
loop_start_405:
nop
stw acc, rga
subi rga, 4
ldw rga, acc
addi acc, 1
stw acc, rga
addi rga, 4
ldw rga, acc
subi acc, 1
jnz acc, loop_start_405
loop_end_405:
nop
stw acc, rga
subi rga, 4
ldw rga, acc
stw acc, rga
subi rga, 4
ldw rga, acc
stw acc, rga
subi rga, 4
ldw rga, acc
subi acc, 1
jnz acc, loop_start_99
loop_end_99:
nop
stw acc, rga
subi rga, 4
ldw rga, acc
stw acc, rga
subi rga, 4
ldw rga, acc
addi acc, 1
addi acc, 1
push acc
call print::print_byte
pop zero
push acc
call print::print_byte
pop zero
push acc
call print::print_byte
pop zero
hlt
Binary file not shown.
+29
View File
@@ -0,0 +1,29 @@
++++++++++++++++++++++++++++++++++++++++++++
>++++++++++++++++++++++++++++++++
>++++++++++++++++
>
>+
<<
[
>>
>
>++++++++++
<<
[->+>-[>+>>]>[+[-<+>]>+>>]<<<<<<]
>[<+>-]
>[-]
>>
>++++++++++
<
[->-[>+>>]>[+[-<+>]>+>>]<<<<<]
>[-]
>>[++++++++++++++++++++++++++++++++++++++++++++++++.[-]]
<[++++++++++++++++++++++++++++++++++++++++++++++++.[-]]
<<<++++++++++++++++++++++++++++++++++++++++++++++++.[-]
<<<<<<<.>.
>>[>>+<<-]
>[>+<<+>-]
>[<+>-]
<<<-
]
<<++...
+135
View File
@@ -0,0 +1,135 @@
// GENERATED BY DSC COMPILER
// Generated at 2026-08-09 01:17:46
// Imports
include alloc: "./lib/memory/block_alloc.dsa"
include print: "./print.dsa"
// Globals & Reserved Memory
// Entry Point
dw stack: 0x010000
db message: "Process Exited with code:"
_init:
ldw stack, bpr, 0
mov bpr, spr
push zero
call main
call 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
ret
db str_4: "successful free of ptr"
// fn main() -> u32
main:
push bpr
mov spr, bpr
lli 32, rg0
lli 64, rg1
// push arg 1
push rg0
// push arg 0
push rg1
call alloc::init
pop rg2
pop zero
push rg2
// push arg 0
push rg2
call print::print_hex_word
pop zero
call print::newline
ldw spr, rg0, 0
stw rg0, spr, 0
// push arg 0
push rg0
call alloc::alloc
pop rg1
push rg1
// push arg 0
push rg1
call print::print_hex_word
pop zero
lli 200, rg0
ldw spr, rg1, 0
stw rg0, rg1, 0
stw rg1, spr, 0
call print::newline
ldw spr, rg0, 4
stw rg0, spr, 4
// push arg 0
push rg0
call alloc::alloc
pop rg2
push rg2
// push arg 0
push rg2
call print::print_hex_word
pop zero
call print::newline
ldw spr, rg0, 4
ldw rg0, rg2, 0
stw rg0, spr, 4
// push arg 0
ldw spr, rg2, 4
stw rg2, spr, 4
addi spr, 4, rg3
ldw spr, rg2, 8
stw rg2, spr, 8
// push arg 1
push rg3
// push arg 0
push rg2
call alloc::free
pop zero
pop zero
ldw spr, rg2, 8
stw rg2, spr, 8
// push arg 0
push rg2
call alloc::alloc
pop rg3
push rg3
call print::newline
ldw spr, rg2, 0
stw rg2, spr, 0
// push arg 0
push rg2
call print::print_hex_word
pop zero
call print::newline
ldw spr, rg2, 8
stw rg2, spr, 8
// push arg 0
push rg2
call print::print_hex_word
pop zero
ldw spr, rg2, 8
lli 0, rg4
ieq rg2, rg4, rg5
jez rg5, _else_2
_then_1:
lwi str_4, rg4
stw rg2, spr, 8
// push arg 0
push rg4
call print::print
pop zero
jmp _end_3
_else_2:
nop
_end_3:
lli 0, rg4
stw rg4, bpr, 8
jmp _ret
Binary file not shown.
+30
View File
@@ -0,0 +1,30 @@
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;
}
+5
View File
@@ -0,0 +1,5 @@
include print: "./lib/io/print.dsa";
fn main() {
print::print("Hello, world!");
}
+212
View File
@@ -0,0 +1,212 @@
// block_alloc.dsa
// Fixed-size block allocator
//
// Memory layout:
// [base + 0]: free list head pointer (pointer to first free block, or 0 if none)
// [base + 4]: block size
// [base + 8]: total blocks
// [base + 12]: base address of block pool
// [base + 16+]: block pool (each block starts with a 4-byte next pointer)
//
// Usage:
// include block_alloc "./lib/memory/block_alloc.dsa"
//
// For init:
// push num_blocks (e.g., 32)
// push block_size (e.g., 64 bytes)
// call block_alloc::init
// pop block_size
// pop num_blocks
// ; result in spr+8 (allocator handle)
//
// For alloc:
// push allocator_handle
// call block_alloc::alloc
// pop allocator_handle
// ; result in spr+8 (pointer to block, or 0 if out of memory)
//
// For free:
// push block_pointer
// push allocator_handle
// call block_alloc::free
// pop allocator_handle
// pop block_pointer
dw heap_start: 0x30000 // Start of our heap area
// Initialize the allocator
// Args: block_size, num_blocks
// Returns: allocator handle (pointer to metadata)
init:
push bpr
mov spr, bpr
ldw bpr, rg0, 8 // block_size
ldw bpr, rg1, 12 // num_blocks
// Allocate metadata (16 bytes) + pool space
ldw heap_start, rg2 // base address for this allocator
mov rg2, rg3 // save base in rg3
// Calculate total size needed: 16 + (block_size * num_blocks)
// We'll use a simple multiplication by repeated addition
mov rg0, rg4 // block_size to rg4
mov rg1, rg5 // num_blocks to rg5
lli 0, acc // accumulator for multiplication
_multiply_loop:
jez rg5 _multiply_done
add acc, rg4, acc
subi rg5, 1
jmp _multiply_loop
_multiply_done:
// acc now contains block_size * num_blocks
addi acc, 16 // add metadata size
// Update heap_start for next allocation
add rg2, acc, acc
stw acc, heap_start
// Now set up metadata at rg3 (base)
// [base + 0]: free list head (will point to first block)
// [base + 4]: block_size
// [base + 8]: total blocks
// [base + 12]: pool base address
addi rg3, 16, rg6 // rg6 = pool base
stw rg6, rg3 // store pool base as free list head initially
stw rg0, rg3, 4 // store block_size
stw rg1, rg3, 8 // store total blocks
stw rg6, rg3, 12 // store pool base address
// Now initialize the free list
// Each block's first 4 bytes point to the next block
// rg6 = current block pointer
// rg0 = block_size
// rg1 = num_blocks (counter)
subi rg1 1 // we'll count down from num_blocks-1
_init_loop:
jez rg1, _init_loop_done
// Calculate next block address: current + block_size
add rg6, rg0, rg7 // rg7 = next block address
// Store next pointer at current block
stw rg7, rg6
// Move to next block
mov rg7, rg6
subi rg1, 1
jmp _init_loop
_init_loop_done:
// Last block points to null (0)
lli 0, acc
stw acc, rg6
// Return allocator handle (base address - 16 to get back to metadata start)
stw rg3, bpr, 8
mov bpr, spr
pop bpr
ret
// Allocate a block
// Args: allocator_handle
// Returns: pointer to block (or 0 if out of memory)
alloc:
push bpr
mov spr, bpr
ldw bpr, rg0, 8 // allocator handle (metadata base)
// Load free list head
ldw rg0, rg1 // rg1 = free list head
// Check if free list is empty
jez, rg1 _alloc_fail
// Free list is not empty, pop the first block
// Load the next pointer from the block we're allocating
ldw rg1, rg2 // rg2 = next free block
// Update free list head to point to next block
stw rg2, rg0
// Return the allocated block (rg1)
stw rg1, bpr, 8
jmp _alloc_done
_alloc_fail:
// No free blocks, return 0
lli 0, acc
stw acc, bpr, 8
_alloc_done:
mov bpr, spr
pop bpr
ret
// Free a block
// Args: allocator_handle, block_pointer
// Returns: nothing (but could return error code if block is invalid)
free:
push bpr
mov spr, bpr
ldw bpr, rg0, 8 // allocator handle
ldw bpr, rg6, 12 // pointer to the block pointer to free
ldw rg6, rg1 // rg1 = block pointer to free
// Load current free list head
ldw rg0, rg2 // rg2 = current head
// Set the freed block's next pointer to current head
stw rg2, rg1
// Update free list head to point to freed block
stw rg1, rg0
// Update the freed block's previous pointer to NULL
lli 0, rg1
stw rg1, rg6
mov bpr, spr
pop bpr
ret
// Debug function: get stats
// Args: allocator_handle
// Returns: nothing (but could populate a stats structure)
get_stats:
push bpr
mov spr, bpr
ldw bpr, rg0, 8 // allocator handle
// Count free blocks by traversing the free list
ldw rg0, rg1 // rg1 = free list head
lli 0, rg2 // rg2 = counter
count_loop:
jez, rg1 count_done
addi rg2, 1
ldw rg1, rg1 // move to next block
jmp count_loop
count_done:
// rg2 now contains number of free blocks
// Could store this somewhere or return it
stw rg2, bpr, 8
mov bpr, spr
pop bpr
ret
+37
View File
@@ -0,0 +1,37 @@
include print: "./lib/io/print.dsa";
include alloc: "./lib/memory/block_alloc.dsa";
fn main() -> u32 {
let allocator: u32 = alloc::init(64, 32);
print::print_hex_word(allocator);
print::print_newline();
let ptr: u32 = alloc::alloc(allocator);
print::print_hex_word(ptr);
*ptr = 200;
print::print_newline();
let p2: u32 = alloc::alloc(allocator);
print::print_hex_word(p2);
print::print_newline();
print::print_num(*ptr);
alloc::free(allocator, &ptr);
let ptr3: u32 = alloc::alloc(allocator);
print::print_newline();
print::print_hex_word(ptr3);
print::print_newline();
print::print_hex_word(ptr);
if ptr == 0 {
print::print("successful free of ptr");
}
return 0;
}
+62 -23
View File
@@ -129,42 +129,67 @@ print_byte: func
// ------------------------------------------
// prints the value of arg[0] to the screen in hex.
// print_hex_word:
// push bpr
// mov spr, bpr
print_hex_word: func
push rg0
push rg1
push rg2
push rg3
push rg4
// ldw current, rg1
ldw current, rg1
ldb bpr, rg0, 11
push rg0
call _print_hex_byte
addi spr, 4
// ldb bpr, rg0, 8
// push rg0
// call _print_hex_byte
// addi spr, 4
ldb bpr, rg0, 10
push rg0
call _print_hex_byte
addi spr, 4
// ldb bpr, rg0, 9
// push rg0
// call _print_hex_byte
// addi spr, 4
ldb bpr, rg0, 9
push rg0
call _print_hex_byte
addi spr, 4
// ldb bpr, rg0, 10
// push rg0
// call _print_hex_byte
// addi spr, 4
ldb bpr, rg0, 8
push rg0
call _print_hex_byte
addi spr, 4
// ldb bpr, rg0, 11
// push rg0
// call _print_hex_byte
// addi spr, 4
// save cursor
stw rg1, current
// jmp _end
pop rg4
pop rg3
pop rg2
pop rg1
pop rg0
return
// ------------------------------------------
// prints the last byte of arg[0] to the screen in hex.
print_hex_byte: func
push rg0
push rg1
push rg2
push rg3
push rg4
ldw bpr, rg0, 8
ldw current, rg1
call _print_hex_byte
jmp _end
// save cursor
stw rg1, current
pop rg4
pop rg3
pop rg2
pop rg1
pop rg0
return
// function body
_print_hex_byte:
@@ -183,14 +208,18 @@ _print_hex_byte:
// print a hex digit
_print_hex_nibble:
lli 10, rg3
ilt rg0, rg3, rg4
jnz rg4, _print_hex_nibble_number
// print a character 'A'..='F' by applying offset 0x37 ('A' - 10)
addi rg0, 0x37, rg0
stb rg0, rg1
addi rg1, 1
ret
// helper function.
// prints a decimal digit by adding 0x30 ('0')
_print_hex_nibble_number:
addi rg0, 0x30, rg0
stb rg0, rg1
@@ -200,11 +229,21 @@ _print_hex_nibble_number:
// ------------------------------------------
// print whitespace
print_whitespace: func
push rg0
push rg1
ldw current, rg1
lli 0x20, rg0
stb rg0, rg1
addi rg1, 1
jmp _end
// save cursor
stw rg1, current
pop rg1
pop rg0
return
// ------------------------------------------
// print newline
+76
View File
@@ -0,0 +1,76 @@
include print: "./print.dsa"
dw stack: 0x10000
_init:
ldw stack, bpr
mov bpr, spr
main:
push zero
call program
call print::print_hex_word
pop zero
hlt
program: func
push rg0
push rg1
lli 5, rg0
push rg0
lli 4, rg0
push rg0
pop rg1
pop rg0
sub rg0, rg1, rg0
push rg0
lli 4, rg0
push rg0
lli 3, rg0
push rg0
pop rg1
pop rg0
sub rg0, rg1, rg0
push rg0
lli 3, rg0
push rg0
lli 2, rg0
push rg0
pop rg1
pop rg0
sub rg0, rg1, rg0
push rg0
lli 2, rg0
push rg0
lli 1, rg0
push rg0
pop rg1
pop rg0
sub rg0, rg1, rg0
push rg0
lli 60, rg0
push rg0
pop rg1
pop rg0
add rg0, rg1, rg0
push rg0
pop rg1
pop rg0
add rg0, rg1, rg0
push rg0
pop rg1
pop rg0
add rg0, rg1, rg0
push rg0
pop rg1
pop rg0
add rg0, rg1, rg0
push rg0
// return value in bpr+8
pop rg0
stw rg0, bpr, 8
// epilogue
pop rg1
pop rg0
return
+13 -1
View File
@@ -1 +1,13 @@
(add 1 (or 1 (if true then 2 else 1)))
(add
(sub 5 4)
(add
(sub 4 3)
(add
(sub 3 2)
(add
(sub 2 1)
60
)
)
)
)
+20
View File
@@ -0,0 +1,20 @@
include print: "./lib/io/print.dsa";
fn main() -> u32 {
let x: u32 = 30;
print::print_num(x);
200 + 5;
let p: Point = Point {
x: 10,
y: 20,
test: [2, 3, 4]
};
}
struct Point {
x: u32,
y: u32,
test: [u32; 3],
}
+13
View File
@@ -0,0 +1,13 @@
include print: "./print.dsa"
dw stack: 0x10000
_init:
lwi stack, bpr
mov bpr, spr
lwi 0x100abcaa, rg0
push rg0
call print::print_hex_word
pop zero
hlt