From 5b7dd220ae27e7d0199f98cb9bfc8599f16556ec Mon Sep 17 00:00:00 2001 From: cannoli-fruit Date: Sun, 26 Jul 2026 01:48:43 -0400 Subject: [PATCH] Added basic putuint to the standard library, i need to implement proper 0 handling but that probably needs and if statement --- flagpole/fvmstd.fp | 16 +++++++++++++ flagpole/src/main.c | 48 +++++++++++++++++++++++++++++++++++++-- flagpole/tests/div.fp | 6 +++++ flagpole/tests/gt.fp | 19 ++++++++++++++++ flagpole/tests/numbers.fp | 6 +++++ src/interp.c | 1 + 6 files changed, 94 insertions(+), 2 deletions(-) create mode 100644 flagpole/tests/div.fp create mode 100644 flagpole/tests/gt.fp create mode 100644 flagpole/tests/numbers.fp diff --git a/flagpole/fvmstd.fp b/flagpole/fvmstd.fp index ee479e2..375a695 100644 --- a/flagpole/fvmstd.fp +++ b/flagpole/fvmstd.fp @@ -6,6 +6,22 @@ proc getchar 0xCFFFFFFFFFFFFFFE ld8 endproc +proc putuint + @val + 1 @divisor + + while &val &divisor u/ 9 u> do + 10 &divisor u* @divisor + endwhile + + while &divisor 0 u> do + &val &divisor u/ 10 u% + 48 u+ :putchar + + &divisor 10 u/ @divisor + endwhile +endproc + proc puts while dup ld8 0 == not do dup ld8 :putchar diff --git a/flagpole/src/main.c b/flagpole/src/main.c index 4571b97..79b17b4 100644 --- a/flagpole/src/main.c +++ b/flagpole/src/main.c @@ -85,6 +85,9 @@ static inline bool isKW(Lz_SB *sb) { || SBeq(sb, "u-") || SBeq(sb, "u*") || SBeq(sb, "u/") + || SBeq(sb, "u%") + || SBeq(sb, "u>") + || SBeq(sb, "u<") || SBeq(sb, "pop") || SBeq(sb, "$inc") ; @@ -276,6 +279,47 @@ codegen: printf(" pushstack 98\n"); break; } + if (SBeq(&tokenAccumulator, "u-")) { + printf(" popstack 97\n"); + printf(" popstack 98\n"); + printf(" SubR64 98, 97\n"); + printf(" pushstack 98\n"); + break; + } + if (SBeq(&tokenAccumulator, "u*")) { + printf(" popstack 97\n"); + printf(" popstack 98\n"); + printf(" MulR64 98, 97\n"); + printf(" pushstack 98\n"); + break; + } + if (SBeq(&tokenAccumulator, "u/")) { + printf(" popstack 97\n"); + printf(" popstack 98\n"); + printf(" DivR64 98, 97\n"); + printf(" pushstack 98\n"); + break; + } + if (SBeq(&tokenAccumulator, "u%")) { + printf(" popstack 97\n"); + printf(" popstack 98\n"); + printf(" ModR64 98, 97\n"); + printf(" pushstack 98\n"); + break; + } + if (SBeq(&tokenAccumulator, "u>")) { + printf(" popstack 97\n"); + printf(" popstack 98\n"); + printf(" Cmp64 98, 97\n"); + printf(" JmpIP __Cmp%d\n", counter); + printf(" MovI64 112, 0\n"); + printf(" Jmp __DoneCmp%d\n", counter); + printf("__Cmp%d:\n", counter); + printf(" MovI64 112, 1\n"); + printf("__DoneCmp%d:\n", counter); + printf(" pushstack 112\n"); + break; + } if (SBeq(&tokenAccumulator, "pop")) { printf(" popstack 113\n"); break; @@ -354,7 +398,7 @@ codegen: if (tokenAccumulator.cnt < 128) { memcpy(varName, tokenAccumulator.data+1, tokenAccumulator.cnt-1); - varName[tokenAccumulator.cnt] = 0; + varName[tokenAccumulator.cnt-1] = 0; } else { memcpy(varName, tokenAccumulator.data+1, 127); varName[127] = 0; @@ -367,7 +411,7 @@ codegen: } } if (addr == 0) { - fprintf(stderr, "Undeclared variable %s in function %s", + fprintf(stderr, "Undeclared variable %s in function %s\n", varName, funcName); exit(1); } diff --git a/flagpole/tests/div.fp b/flagpole/tests/div.fp new file mode 100644 index 0000000..e566260 --- /dev/null +++ b/flagpole/tests/div.fp @@ -0,0 +1,6 @@ +$inc fvmstd.fp + +proc main + 8 2 u/ + 48 u+ :putchar :newline +endproc diff --git a/flagpole/tests/gt.fp b/flagpole/tests/gt.fp new file mode 100644 index 0000000..8516f91 --- /dev/null +++ b/flagpole/tests/gt.fp @@ -0,0 +1,19 @@ +$inc fvmstd.fp + +proc main + 5 3 u> + 48 u+ + "5 3 u>: " :puts + :putchar :newline + + + 3 3 u> + 48 u+ + "3 3 u>: " :puts + :putchar :newline + + 3 5 u> + 48 u+ + "3 5 u>: " :puts + :putchar :newline +endproc diff --git a/flagpole/tests/numbers.fp b/flagpole/tests/numbers.fp new file mode 100644 index 0000000..f95ee84 --- /dev/null +++ b/flagpole/tests/numbers.fp @@ -0,0 +1,6 @@ +$inc fvmstd.fp + +proc main + "Hello World!" :puts :newline + 23 :putuint +endproc diff --git a/src/interp.c b/src/interp.c index f7994cd..a331e1f 100644 --- a/src/interp.c +++ b/src/interp.c @@ -251,6 +251,7 @@ int main(int argc, char **argv) { case 0x72: { // DivR64 unsigned char dst = inputs[0]; unsigned char src = inputs[1]; + if (registers[src] == 0) break; // Div by 0 smh registers[dst] /= registers[src]; break; }