ported over DSC compiler code to new DSCS compiler
This commit is contained in:
@@ -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.
@@ -0,0 +1,29 @@
|
||||
++++++++++++++++++++++++++++++++++++++++++++
|
||||
>++++++++++++++++++++++++++++++++
|
||||
>++++++++++++++++
|
||||
>
|
||||
>+
|
||||
<<
|
||||
[
|
||||
>>
|
||||
>
|
||||
>++++++++++
|
||||
<<
|
||||
[->+>-[>+>>]>[+[-<+>]>+>>]<<<<<<]
|
||||
>[<+>-]
|
||||
>[-]
|
||||
>>
|
||||
>++++++++++
|
||||
<
|
||||
[->-[>+>>]>[+[-<+>]>+>>]<<<<<]
|
||||
>[-]
|
||||
>>[++++++++++++++++++++++++++++++++++++++++++++++++.[-]]
|
||||
<[++++++++++++++++++++++++++++++++++++++++++++++++.[-]]
|
||||
<<<++++++++++++++++++++++++++++++++++++++++++++++++.[-]
|
||||
<<<<<<<.>.
|
||||
>>[>>+<<-]
|
||||
>[>+<<+>-]
|
||||
>[<+>-]
|
||||
<<<-
|
||||
]
|
||||
<<++...
|
||||
@@ -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.
@@ -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;
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
include print: "./lib/io/print.dsa";
|
||||
|
||||
fn main() {
|
||||
print::print("Hello, world!");
|
||||
}
|
||||
@@ -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
|
||||
@@ -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
@@ -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
|
||||
|
||||
@@ -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
@@ -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
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
@@ -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],
|
||||
}
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user