diff --git a/flagpole/fvmstd.fp b/flagpole/fvmstd.fp index 950aba4..778561c 100644 --- a/flagpole/fvmstd.fp +++ b/flagpole/fvmstd.fp @@ -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 diff --git a/flagpole/src/main.c b/flagpole/src/main.c index 845df36..7941235 100644 --- a/flagpole/src/main.c +++ b/flagpole/src/main.c @@ -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; diff --git a/flagpole/tests/ascii.fp b/flagpole/tests/ascii.fp new file mode 100644 index 0000000..d649a96 --- /dev/null +++ b/flagpole/tests/ascii.fp @@ -0,0 +1,7 @@ +$inc fvmstd.fp + +proc main + :getchar + :putuint + :newline +endproc diff --git a/flagpole/tests/cat.fp b/flagpole/tests/cat.fp new file mode 100644 index 0000000..f8abc85 --- /dev/null +++ b/flagpole/tests/cat.fp @@ -0,0 +1,7 @@ +$inc fvmstd.fp + +proc main + while 1 do + :getchar :putchar + endwhile +endproc diff --git a/flagpole/tests/numinp.fp b/flagpole/tests/numinp.fp new file mode 100644 index 0000000..d30d1f8 --- /dev/null +++ b/flagpole/tests/numinp.fp @@ -0,0 +1,8 @@ +$inc fvmstd.fp + +proc main + "Sum Program" :puts :newline + :getuint + :getuint u+ + :putuint :newline +endproc diff --git a/src/interp.c b/src/interp.c index a331e1f..08e179c 100644 --- a/src/interp.c +++ b/src/interp.c @@ -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) { diff --git a/tests/fvm.inc b/tests/fvm.inc index 0d5af39..6ade17f 100644 --- a/tests/fvm.inc +++ b/tests/fvm.inc @@ -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