summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkdx <kikoodx@paranoici.org>2023-06-10 18:27:52 +0200
committerkdx <kikoodx@paranoici.org>2023-06-10 18:27:52 +0200
commit905365181c7d61c5d79d065a8843e3d5358e0680 (patch)
treede9b4664800ac959439af540e3a33cbd77727543
parent5e9f115e2d938a47a3d3db42188b837d4b57891a (diff)
downloadgolem-905365181c7d61c5d79d065a8843e3d5358e0680.tar.gz
fix stack (i hate myself)
-rwxr-xr-xrun.sh2
-rw-r--r--src/main.c29
-rwxr-xr-xtesting.sh1
3 files changed, 21 insertions, 11 deletions
diff --git a/run.sh b/run.sh
index 614342f..fefffa3 100755
--- a/run.sh
+++ b/run.sh
@@ -1,6 +1,6 @@
#!/bin/sh
tup -q || exit 1
./build/golem "$1" >build/tmp.orgaasm || exit 1
-orgaasm build/tmp.orgaasm build/tmp.rom -v || exit 1
+orgaasm build/tmp.orgaasm build/tmp.rom || exit 1
orgaemu build/tmp.rom
#rm -f build/tmp.*
diff --git a/src/main.c b/src/main.c
index 3dff1fe..978dd31 100644
--- a/src/main.c
+++ b/src/main.c
@@ -819,7 +819,10 @@ gen_stmt(Node *node, Node *fname, int break_lbl)
break;
case NOD_RETURN_STMT:
gen_expr(node->lhs);
- printf("\tJMP ,__fnret_%.*s\n", fname->len, fname->loc);
+ if (locals_size)
+ printf("\tJMP ,__fnret_%.*s\n", fname->len, fname->loc);
+ else
+ printf("\tRET\n");
depth -= 1;
break;
case NOD_BREAK_STMT:
@@ -887,9 +890,11 @@ gen_function(Node *node)
locals_size = node_size(locals);
- printf("\tLIT ,__stack_ptr LDA\n");
- printf("\tLIT %04x ADD\n", locals_size);
- printf("\tLIT ,__stack_ptr STA\n");
+ if (locals_size) {
+ printf("\tLIT ,__stack_ptr LDA\n");
+ printf("\tLIT %04x ADD\n", locals_size);
+ printf("\tLIT ,__stack_ptr STA\n");
+ }
/* TODO: optimize this using DUP */
cur = locals;
@@ -907,11 +912,13 @@ gen_function(Node *node)
node = node->next;
}
- printf("\tLIT 0000 ( default return )\n");
- printf("@__fnret_%.*s\n", ognode->lhs->len, ognode->lhs->loc);
- printf("\tLIT ,__stack_ptr LDA\n");
- printf("\tLIT %04x SUB\n", locals_size);
- printf("\tLIT ,__stack_ptr STA\n");
+ printf("\tLIT 0000\n");
+ if (locals_size) {
+ printf("@__fnret_%.*s\n", ognode->lhs->len, ognode->lhs->loc);
+ printf("\tLIT ,__stack_ptr LDA\n");
+ printf("\tLIT %04x SUB\n", locals_size);
+ printf("\tLIT ,__stack_ptr STA\n");
+ }
printf("\tRET\n");
}
@@ -975,10 +982,12 @@ main(int argc, char **argv)
Node *node = parse(tok);
- printf("\tJRT ,__fn_main ( entry point )\n");
+ printf("\tJRT ,__fn_main\n");
printf("\tRET\n");
codegen(node);
printf("@__stack_ptr\n");
+ printf("\t,__stack\n");
+ printf("@__stack\n");
assert(depth == 0);
return 0;
diff --git a/testing.sh b/testing.sh
index b05785e..e1889da 100755
--- a/testing.sh
+++ b/testing.sh
@@ -22,6 +22,7 @@ test "$1" "global abc = 5; main(){ return abc; }"
test "$1" "main(){ return abc; } global abc = 5;"
test "$1" "global abc = 5; main(){ inc(); return abc; } inc() { abc = abc + 1; }"
test "$1" "main() { wrt('H'); wrt('e'); wrt('l'); wrt('l'); wrt('o'); wrt('!'); wrt('\n'); }"
+test "$1" "main() { a(a(0)); } a(x) { return x + 1; }"
test "$1" "main() { wrt(inc(inc('0'))); wrt('\n'); } inc(x) { return x + 1; }"
test "$1" "main() { wrt(up('u')); wrt('w'); wrt(up('u')); wrt('\n'); } up(c) { return c + 'A' - 'a'; }"
test "$1" "main() { wrt(add('A' - 'a', 'u')); wrt('\n'); } add(a, b) { return a + b; }"