Implemented getuint and fixed a bug with variables
This commit is contained in:
parent
441d737cf1
commit
022e812c1d
7 changed files with 75 additions and 1 deletions
|
|
@ -6,6 +6,26 @@ proc getchar
|
||||||
0xCFFFFFFFFFFFFFFE ld8
|
0xCFFFFFFFFFFFFFFE ld8
|
||||||
endproc
|
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
|
proc putuint
|
||||||
@val
|
@val
|
||||||
if &val 0 == then
|
if &val 0 == then
|
||||||
|
|
|
||||||
|
|
@ -366,6 +366,19 @@ codegen:
|
||||||
printf(" pushstack 112\n");
|
printf(" pushstack 112\n");
|
||||||
break;
|
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")) {
|
if (SBeq(&tokenAccumulator, "pop")) {
|
||||||
printf(" popstack 113\n");
|
printf(" popstack 113\n");
|
||||||
break;
|
break;
|
||||||
|
|
@ -416,7 +429,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;
|
||||||
|
|
@ -439,6 +452,7 @@ codegen:
|
||||||
allocHead += 8;
|
allocHead += 8;
|
||||||
}
|
}
|
||||||
printf(" popstack 120\n");
|
printf(" popstack 120\n");
|
||||||
|
printf(" ; %s:%s\n", funcName, varName);
|
||||||
printf(" MovI64 121, 0x%16lX\n", addr);
|
printf(" MovI64 121, 0x%16lX\n", addr);
|
||||||
printf(" St64 120, 121\n");
|
printf(" St64 120, 121\n");
|
||||||
break;
|
break;
|
||||||
|
|
|
||||||
7
flagpole/tests/ascii.fp
Normal file
7
flagpole/tests/ascii.fp
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
$inc fvmstd.fp
|
||||||
|
|
||||||
|
proc main
|
||||||
|
:getchar
|
||||||
|
:putuint
|
||||||
|
:newline
|
||||||
|
endproc
|
||||||
7
flagpole/tests/cat.fp
Normal file
7
flagpole/tests/cat.fp
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
$inc fvmstd.fp
|
||||||
|
|
||||||
|
proc main
|
||||||
|
while 1 do
|
||||||
|
:getchar :putchar
|
||||||
|
endwhile
|
||||||
|
endproc
|
||||||
8
flagpole/tests/numinp.fp
Normal file
8
flagpole/tests/numinp.fp
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
$inc fvmstd.fp
|
||||||
|
|
||||||
|
proc main
|
||||||
|
"Sum Program" :puts :newline
|
||||||
|
:getuint
|
||||||
|
:getuint u+
|
||||||
|
:putuint :newline
|
||||||
|
endproc
|
||||||
|
|
@ -282,6 +282,14 @@ int main(int argc, char **argv) {
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case 0xC2: { // JmpIN
|
||||||
|
unsigned char addr = inputs[0];
|
||||||
|
if (negativeFlag) {
|
||||||
|
if (DEBUG) printf("Jump!\n");
|
||||||
|
xPc = registers[addr];
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
case 0xC8: { // JmpIE
|
case 0xC8: { // JmpIE
|
||||||
unsigned char addr = inputs[0];
|
unsigned char addr = inputs[0];
|
||||||
if (!parityFlag) {
|
if (!parityFlag) {
|
||||||
|
|
|
||||||
|
|
@ -324,6 +324,16 @@ macro JmpIP addr
|
||||||
JmpRIP 127
|
JmpRIP 127
|
||||||
end macro
|
end macro
|
||||||
|
|
||||||
|
macro JmpRIN addr
|
||||||
|
db 0xC2
|
||||||
|
db addr
|
||||||
|
end macro
|
||||||
|
|
||||||
|
macro JmpIN addr
|
||||||
|
MovI64 127, addr
|
||||||
|
JmpRIN 127
|
||||||
|
end macro
|
||||||
|
|
||||||
macro JmpRIE addr
|
macro JmpRIE addr
|
||||||
db 0xC8
|
db 0xC8
|
||||||
db addr
|
db addr
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue