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

View file

@ -282,6 +282,14 @@ int main(int argc, char **argv) {
}
break;
}
case 0xC2: { // JmpIN
unsigned char addr = inputs[0];
if (negativeFlag) {
if (DEBUG) printf("Jump!\n");
xPc = registers[addr];
}
break;
}
case 0xC8: { // JmpIE
unsigned char addr = inputs[0];
if (!parityFlag) {

View file

@ -324,6 +324,16 @@ macro JmpIP addr
JmpRIP 127
end macro
macro JmpRIN addr
db 0xC2
db addr
end macro
macro JmpIN addr
MovI64 127, addr
JmpRIN 127
end macro
macro JmpRIE addr
db 0xC8
db addr