From 1ade055e099062c09920dbb550211be7d302050a Mon Sep 17 00:00:00 2001 From: cannoli-fruit Date: Fri, 24 Jul 2026 03:12:34 -0400 Subject: [PATCH] Implemented the rest of the unsigned integer operations --- .gitignore | 2 +- src/interp.c | 13 ++++++++++++- tests/fvm.inc | 15 +++++++++++++-- tests/mod.asm | 10 ++++++++++ tests/mul.asm | 10 ++++++++++ 5 files changed, 46 insertions(+), 4 deletions(-) create mode 100644 tests/mod.asm create mode 100644 tests/mul.asm diff --git a/.gitignore b/.gitignore index 9ef9604..f6b006f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,2 @@ build - +flagvm diff --git a/src/interp.c b/src/interp.c index f9b340b..6b58f1a 100644 --- a/src/interp.c +++ b/src/interp.c @@ -29,7 +29,6 @@ uint64_t registers[256]; bool isMMIO(uint64_t addr) { if (addr == UART_TX) return true; if (addr == UART_RX) return true; - return false; } @@ -168,12 +167,24 @@ int main(int argc, char **argv) { registers[dst] += registers[src]; break; } + case 0x70: { // MulR64 + unsigned char dst = inputs[0]; + unsigned char src = inputs[1]; + registers[dst] *= registers[src]; + break; + } case 0x72: { // DivR64 unsigned char dst = inputs[0]; unsigned char src = inputs[1]; registers[dst] /= registers[src]; break; } + case 0x74: { // ModR64 + unsigned char dst = inputs[0]; + unsigned char src = inputs[1]; + registers[dst] %= registers[src]; + break; + } case 0xC0: { // Jmp unsigned char addr = inputs[0]; xPc = registers[addr]; diff --git a/tests/fvm.inc b/tests/fvm.inc index 0b494bb..9ac7d46 100644 --- a/tests/fvm.inc +++ b/tests/fvm.inc @@ -13,8 +13,7 @@ define r9 9 define r10 10 define r11 11 define r12 12 -define r13 13 -define r14 14 +define r13 13 define r14 14 define r15 15 define r16 16 define r17 17 @@ -236,12 +235,24 @@ macro AddR64 dst, src db src end macro +macro MulR64 dst, src + db 0x70 + db dst + db src +end macro + macro DivR64 dst, src db 0x72 db dst db src end macro +macro ModR64 dst, src + db 0x74 + db dst + db src +end macro + macro RSetF reg db 0x42 db reg diff --git a/tests/mod.asm b/tests/mod.asm new file mode 100644 index 0000000..34de549 --- /dev/null +++ b/tests/mod.asm @@ -0,0 +1,10 @@ +include "fvm.inc" + +org 0x4000000000000000 + MovI64 r95, UART_TX + MovI64 r2, 16 + MovI64 r3, 3 + ModR64 r2, r3 + MovI64 r4, 48 ; ascii for 0 + AddR64 r2, r4 + St8 r2, r95 diff --git a/tests/mul.asm b/tests/mul.asm new file mode 100644 index 0000000..e118cbf --- /dev/null +++ b/tests/mul.asm @@ -0,0 +1,10 @@ +include "fvm.inc" + +org 0x4000000000000000 + MovI64 r95, UART_TX + MovI64 r2, 2 + MovI64 r3, 4 + MulR64 r2, r3 + MovI64 r4, 48 ; ascii for 0 + AddR64 r2, r4 + St8 r2, r95