Added basic putuint to the standard library, i need to implement proper 0 handling but that probably needs and if statement
This commit is contained in:
parent
bf4f1c19af
commit
5b7dd220ae
6 changed files with 94 additions and 2 deletions
|
|
@ -6,6 +6,22 @@ proc getchar
|
||||||
0xCFFFFFFFFFFFFFFE ld8
|
0xCFFFFFFFFFFFFFFE ld8
|
||||||
endproc
|
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
|
proc puts
|
||||||
while dup ld8 0 == not do
|
while dup ld8 0 == not do
|
||||||
dup ld8 :putchar
|
dup ld8 :putchar
|
||||||
|
|
|
||||||
|
|
@ -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, "u%")
|
||||||
|
|| SBeq(sb, "u>")
|
||||||
|
|| SBeq(sb, "u<")
|
||||||
|| SBeq(sb, "pop")
|
|| SBeq(sb, "pop")
|
||||||
|| SBeq(sb, "$inc")
|
|| SBeq(sb, "$inc")
|
||||||
;
|
;
|
||||||
|
|
@ -276,6 +279,47 @@ codegen:
|
||||||
printf(" pushstack 98\n");
|
printf(" pushstack 98\n");
|
||||||
break;
|
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")) {
|
if (SBeq(&tokenAccumulator, "pop")) {
|
||||||
printf(" popstack 113\n");
|
printf(" popstack 113\n");
|
||||||
break;
|
break;
|
||||||
|
|
@ -354,7 +398,7 @@ codegen:
|
||||||
if (tokenAccumulator.cnt < 128) {
|
if (tokenAccumulator.cnt < 128) {
|
||||||
memcpy(varName, tokenAccumulator.data+1,
|
memcpy(varName, tokenAccumulator.data+1,
|
||||||
tokenAccumulator.cnt-1);
|
tokenAccumulator.cnt-1);
|
||||||
varName[tokenAccumulator.cnt] = 0;
|
varName[tokenAccumulator.cnt-1] = 0;
|
||||||
} else {
|
} else {
|
||||||
memcpy(varName, tokenAccumulator.data+1, 127);
|
memcpy(varName, tokenAccumulator.data+1, 127);
|
||||||
varName[127] = 0;
|
varName[127] = 0;
|
||||||
|
|
@ -367,7 +411,7 @@ codegen:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (addr == 0) {
|
if (addr == 0) {
|
||||||
fprintf(stderr, "Undeclared variable %s in function %s",
|
fprintf(stderr, "Undeclared variable %s in function %s\n",
|
||||||
varName, funcName);
|
varName, funcName);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
6
flagpole/tests/div.fp
Normal file
6
flagpole/tests/div.fp
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
$inc fvmstd.fp
|
||||||
|
|
||||||
|
proc main
|
||||||
|
8 2 u/
|
||||||
|
48 u+ :putchar :newline
|
||||||
|
endproc
|
||||||
19
flagpole/tests/gt.fp
Normal file
19
flagpole/tests/gt.fp
Normal file
|
|
@ -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
|
||||||
6
flagpole/tests/numbers.fp
Normal file
6
flagpole/tests/numbers.fp
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
$inc fvmstd.fp
|
||||||
|
|
||||||
|
proc main
|
||||||
|
"Hello World!" :puts :newline
|
||||||
|
23 :putuint
|
||||||
|
endproc
|
||||||
|
|
@ -251,6 +251,7 @@ int main(int argc, char **argv) {
|
||||||
case 0x72: { // DivR64
|
case 0x72: { // DivR64
|
||||||
unsigned char dst = inputs[0];
|
unsigned char dst = inputs[0];
|
||||||
unsigned char src = inputs[1];
|
unsigned char src = inputs[1];
|
||||||
|
if (registers[src] == 0) break; // Div by 0 smh
|
||||||
registers[dst] /= registers[src];
|
registers[dst] /= registers[src];
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue