summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkdx <kdx@42l.fr>2023-03-19 03:47:59 +0100
committerkdx <kdx@42l.fr>2023-03-19 03:47:59 +0100
commit8721f551a0c796960b941e3abc4f1cc2c35eaac4 (patch)
tree42c673f896793af712b904664832f39b227e35ef
parent47c8fc6e1e179427b468bf38eaac9395d74cfcaf (diff)
downloadgolem-8721f551a0c796960b941e3abc4f1cc2c35eaac4.tar.gz
i'm insane
-rw-r--r--main.c13
-rwxr-xr-xtest.sh3
-rw-r--r--vm.md32
3 files changed, 44 insertions, 4 deletions
diff --git a/main.c b/main.c
index 8fa5546..41ae0db 100644
--- a/main.c
+++ b/main.c
@@ -21,8 +21,15 @@ destroy_duplicates(Token **list, unsigned int type)
int
main(int argc, char **argv)
{
- if (argc != 2) {
- fprintf(stderr, "usage: %s <source.golem>\n", argv[0]);
+ if (argc < 2 || argc > 3) {
+ fprintf(stderr, "usage: %s <source.golem> [gyte size]\n",
+ argv[0]);
+ return 1;
+ }
+
+ const int gyte_size = (argc > 2) ? atoi(argv[2]) : 1;
+ if (gyte_size < 1 || gyte_size > 256) {
+ fprintf(stderr, "gyte size range is 1 to 256");
return 1;
}
@@ -72,7 +79,7 @@ main(int argc, char **argv)
fprintf(stderr, "memory_create failed\n");
break;
}
- token_print(tokens, 1, 0);
+ //token_print(tokens, 1, 0);
} while(0);
memory_destroy(&memory);
token_destroy(tokens);
diff --git a/test.sh b/test.sh
index 0ded8c7..4c2b89a 100755
--- a/test.sh
+++ b/test.sh
@@ -1,5 +1,6 @@
#!/bin/sh
./build.sh || exit 1
-./golem /dev/null || exit 1
+./golem /dev/null 1 || exit 1
./golem onlymain.golem || exit 1
+./golem onlymain.golem 16 || exit 1
valgrind ./golem mvp.golem >/dev/null || exit 1
diff --git a/vm.md b/vm.md
index 8cde69d..ba705a5 100644
--- a/vm.md
+++ b/vm.md
@@ -38,3 +38,35 @@ GOLEM will have two stacks (to not counfound with memory stack):
* the instruction stack to be used by instructions and immediate operations
* the return stack used to store the program counter on function call and
restore it on return
+
+## manually translated onlymain.golem
+
+```
+gyte size: 1
+; store stack offset and program counter
+call main
+; quit
+stop
+main:
+ ; stack offset
+ push s0
+ push 2
+ add
+ save s0
+ ; argv
+ push (s0-1)
+ ; (sub argc 1)
+ push (s0-2)
+ push 1
+ sub
+ ; [argv (sub argc 1)]
+ deref
+ ; (print [argv (sub argc 1)]
+ print
+ ; return (less argc 2)
+ push (s0-2)
+ push 2
+ sub
+ ; restore stack offset and program counter
+ ret
+```