Implemented getuint and fixed a bug with variables

This commit is contained in:
cannoli-fruit 2026-07-26 17:49:29 -04:00
commit 022e812c1d
7 changed files with 75 additions and 1 deletions

View file

@ -6,6 +6,26 @@ proc getchar
0xCFFFFFFFFFFFFFFE ld8
endproc
proc getuint
0 @val
0 @char
while 1 do
:getchar @char
if &char 0x30 u< then
&val return
endif
if &char 0x39 u> then
&val return
endif
&val
10 u*
&char 0x30 u- u+
@val
endwhile
&val
endproc
proc putuint
@val
if &val 0 == then

View file

@ -366,6 +366,19 @@ codegen:
printf(" pushstack 112\n");
break;
}
if (SBeq(&tokenAccumulator, "u<")) {
printf(" popstack 97\n");
printf(" popstack 98\n");
printf(" Cmp64 98, 97\n");
printf(" JmpIN __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;
@ -416,7 +429,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;
@ -439,6 +452,7 @@ codegen:
allocHead += 8;
}
printf(" popstack 120\n");
printf(" ; %s:%s\n", funcName, varName);
printf(" MovI64 121, 0x%16lX\n", addr);
printf(" St64 120, 121\n");
break;

7
flagpole/tests/ascii.fp Normal file
View file

@ -0,0 +1,7 @@
$inc fvmstd.fp
proc main
:getchar
:putuint
:newline
endproc

7
flagpole/tests/cat.fp Normal file
View file

@ -0,0 +1,7 @@
$inc fvmstd.fp
proc main
while 1 do
:getchar :putchar
endwhile
endproc

8
flagpole/tests/numinp.fp Normal file
View file

@ -0,0 +1,8 @@
$inc fvmstd.fp
proc main
"Sum Program" :puts :newline
:getuint
:getuint u+
:putuint :newline
endproc