aboutsummaryrefslogtreecommitdiff
path: root/paradox.false
diff options
context:
space:
mode:
Diffstat (limited to 'paradox.false')
-rw-r--r--paradox.false66
1 files changed, 41 insertions, 25 deletions
diff --git a/paradox.false b/paradox.false
index 52cf9fe..8c705d1 100644
--- a/paradox.false
+++ b/paradox.false
@@ -12,6 +12,9 @@
l: line_number
p: line_position
+ t: stack_size
+ u: buffer_size
+
x: compile_fn
r: read_char
e: error
@@ -24,6 +27,9 @@
1 l: { line_number <- 1 }
0 p: { line_position <- 0 }
+8388608 t: { stack_size <- 8MiB }
+8192 u: { buffer_size <- 8KiB }
+
{ read_char() }
[
^ { input <- getchar() }
@@ -86,9 +92,22 @@
{ elseif current_int != -1 }
i;1_=~ $[%~1_\]?[
- { emit push int }
- "sub r12, 8" 10,
- "mov qword[r12], " i;. 10,
+ { if current_char = S }
+ c;'S= $[
+ i; t: { stack_size <- current_int }
+ 1_ c: { consume current_char }
+ ]?
+ { elseif current_char = U }
+ c;'U= $[%~1_\]?[
+ i; u: { buffer_size <- current_int }
+ 1_ c: { consume current_char }
+ ]?
+ { else }
+ ~[
+ { emit push int }
+ "sub r12, 8" 10,
+ "mov qword[r12], " i;. 10,
+ ]?
1_ i: { clear current_int }
]?
@@ -470,22 +489,25 @@ x;! { call compile_fn }
{ if state != ERROR }
q;2=~[
-{ buffered I/O }
-8192
+{ emit constants }
+"%define STKSIZ " t;. 10,
+"%define BUFSIZ " u;. 10,
+
+{ emit builtin functions }
"section .data
readbuf_len: dq 0
readbuf_cursor: dq 0
writebuf_len: dq 0
section .bss
-readbuf: resb "$."
-writebuf: resb "$."
+readbuf: resb BUFSIZ
+writebuf: resb BUFSIZ
section .text
read:
mov rax, [readbuf_cursor]
mov rbx, [readbuf_len]
cmp rax, rbx
jb .has
-cmp rbx, "$."
+cmp rbx, BUFSIZ
jb .fill
xor rbx, rbx
mov [readbuf_len], rbx
@@ -494,7 +516,7 @@ mov [readbuf_cursor], rbx
mov rax, 0
mov rdi, 0
lea rsi, [rbx+readbuf]
-mov rdx, "$."
+mov rdx, BUFSIZ
sub rdx, rbx
syscall
add [readbuf_len], rax
@@ -509,7 +531,7 @@ inc qword[readbuf_cursor]
ret
write:
mov rdi, [writebuf_len]
-mov rax, "$."
+mov rax, BUFSIZ
sub rax, rdi
add rdi, writebuf
mov rdx, rcx
@@ -519,11 +541,11 @@ mov rcx, rax
rep movsb
push rsi
push rdx
-mov qword[writebuf_len], "$."
+mov qword[writebuf_len], BUFSIZ
call flush
pop rdx
pop rsi
-cmp rdx, "$."
+cmp rdx, BUFSIZ
ja .direct
mov rcx, rdx
mov rdi, writebuf
@@ -547,10 +569,7 @@ syscall
mov qword[writebuf_len], 0
.return:
ret
-"%
-
-{ builtin functions }
-"conditional:
+conditional:
add r12, 16
mov eax, [r12-8]
cmp eax, 0
@@ -605,22 +624,19 @@ sub rcx, rsi
call write
add rsp, 16
ret
-"
-
-{ emit _start and stack }
-
-1000000
-"global _start
+global _start
_start:
-lea r12, [stack+8*"$."]
+lea r12, [data_stack+STKSIZ]
+lea rsp, [call_stack+STKSIZ]
call fun_0
call flush
mov rax, 60
mov rdi, 0
syscall
section .bss
-stack: resq "$."
-"%
+data_stack: resq STKSIZ
+call_stack: resq STKSIZ
+"
{ emit variables }