diff --git a/flagpole/src/main.c b/flagpole/src/main.c index 07d0599..e0ccc88 100644 --- a/flagpole/src/main.c +++ b/flagpole/src/main.c @@ -96,6 +96,8 @@ static inline bool isKW(Lz_SB *sb) { || SBeq(sb, "endwhile") || SBeq(sb, "==") || SBeq(sb, "not") + || SBeq(sb, "bor") + || SBeq(sb, "band") || SBeq(sb, "u+") || SBeq(sb, "u-") || SBeq(sb, "u*") @@ -327,6 +329,27 @@ codegen: printf(" pushstack 96\n"); break; } + if (SBeq(&tokenAccumulator, "band")) { + printf(" popstack 97\n"); + printf(" popstack 98\n"); + printf(" AndR64 98, 97\n"); + printf(" pushstack 98\n"); + break; + } + if (SBeq(&tokenAccumulator, "bor")) { + printf(" popstack 97\n"); + printf(" popstack 98\n"); + printf(" OrR64 98, 97\n"); + printf(" pushstack 98\n"); + break; + } + if (SBeq(&tokenAccumulator, "xor")) { + printf(" popstack 97\n"); + printf(" popstack 98\n"); + printf(" xorR64 98, 97\n"); + printf(" pushstack 98\n"); + break; + } if (SBeq(&tokenAccumulator, "u+")) { printf(" popstack 97\n"); printf(" popstack 98\n"); diff --git a/flagpole/tests/isprime.fp b/flagpole/tests/isprime.fp new file mode 100644 index 0000000..d372954 --- /dev/null +++ b/flagpole/tests/isprime.fp @@ -0,0 +1,13 @@ +$inc fvmstd.fp + +proc main + :getuint @x + 2 @checkFact + while &checkFact &checkFact u* 1 u- &x u< do + if &x &checkFact u% 0 == then + "Not Prime" :puts :newline return + endif + &checkFact 1 u+ @checkFact + endwhile + "Prime" :puts :newline +endproc diff --git a/flagpole/tests/tempconv.fp b/flagpole/tests/tempconv.fp new file mode 100644 index 0000000..32c74e7 --- /dev/null +++ b/flagpole/tests/tempconv.fp @@ -0,0 +1,39 @@ +$inc fvmstd.fp + +proc mainvar + "Source Fahrenheit or Celsius (F/C): " :puts + :getchar @srcUnit + :getchar drop # newline pmo + if &srcUnit 0x43 == &srcUnit 0x63 == bor then + "Source Temp: " :puts :getuint @srcTemp + &srcTemp 9 u* 5 u/ 32 u+ @dstTemp + &srcTemp :putuint "*C == " :puts &dstTemp :putuint "*F" :puts :newline + return + endif + if &srcUnit 0x46 == &srcUnit 0x66 == bor then + "Source Temp: " :puts :getuint @srcTemp + &srcTemp 32 u- 5 u* 9 u/ @dstTemp + &srcTemp :putuint "*F == " :puts &dstTemp :putuint "*C" :puts :newline + return + endif + "Invalid Unit" :puts :newline +endproc + +proc main + "Source Fahrenheit or Celsius (F/C): " :puts + :getchar + :getchar drop # newline pmo + if dup 0x43 == dup 0x63 == bor then + "Source Temp: " :puts :getuint + dup 9 u* 5 u/ 32 u+ + swap :putuint "*C == " :puts :putuint "*F" :puts :newline + return + endif + if dup 0x46 == dup 0x66 == bor then + "Source Temp: " :puts :getuint + dup 32 u- 5 u* 9 u/ + swap :putuint "*F == " :puts :putuint "*C" :puts :newline + return + endif + "Invalid Unit" :puts :newline +endproc diff --git a/flagpole/tests/underflow.fp b/flagpole/tests/underflow.fp new file mode 100644 index 0000000..be842a5 --- /dev/null +++ b/flagpole/tests/underflow.fp @@ -0,0 +1,5 @@ +$inc fvmstd.fp + +proc main + 1 u+ :putuint +endproc diff --git a/src/interp.c b/src/interp.c index 08e179c..a030efd 100644 --- a/src/interp.c +++ b/src/interp.c @@ -230,6 +230,24 @@ int main(int argc, char **argv) { registers[dst] = registers[src]; break; } + case 0x79: { // AndR64 + unsigned char dst = inputs[0]; + unsigned char src = inputs[1]; + registers[dst] &= registers[src]; + break; + } + case 0x7A: { // OrR64 + unsigned char dst = inputs[0]; + unsigned char src = inputs[1]; + registers[dst] |= registers[src]; + break; + } + case 0x7B: { // XorR64 + unsigned char dst = inputs[0]; + unsigned char src = inputs[1]; + registers[dst] ^= registers[src]; + break; + } case 0x6E: { // AddR64 unsigned char dst = inputs[0]; unsigned char src = inputs[1]; diff --git a/tests/fvm.inc b/tests/fvm.inc index 6ade17f..d433090 100644 --- a/tests/fvm.inc +++ b/tests/fvm.inc @@ -248,6 +248,24 @@ macro St64 dst, addr db addr end macro +macro AndR64 dst, src + db 0x79 + db dst + db src +end macro + +macro OrR64 dst, src + db 0x7A + db dst + db src +end macro + +macro XorR64 dst, src + db 0x7B + db dst + db src +end macro + macro AddR64 dst, src db 0x6E db dst