Change comparison operators to produce -1 as truth value instead of 1 master
authorNick Downing <nick@ndcode.org>
Wed, 10 Jan 2024 09:14:42 +0000 (20:14 +1100)
committerNick Downing <nick@ndcode.org>
Wed, 10 Jan 2024 09:14:42 +0000 (20:14 +1100)
o.sh
ocode_vm.py

diff --git a/o.sh b/o.sh
index 32177f2..20dda3c 100755 (executable)
--- a/o.sh
+++ b/o.sh
@@ -1,5 +1,7 @@
 #!/bin/sh
 
+. ./env.sh
+
 cintsys64 -c c bctss cae0
 mv OCODE cae0.ocode
 
index 72f6f1f..fe859b0 100755 (executable)
@@ -1186,9 +1186,9 @@ def op_end():
 def op_eq():
   global sp
   sp = (sp - 2) & WORD_MASK
-  mem[sp & MEM_MASK] = int(
+  mem[sp & MEM_MASK] = -int(
     mem[sp & MEM_MASK] == mem[(sp + 1) & MEM_MASK]
-  )
+  ) & WORD_MASK
   sp = (sp + 1) & WORD_MASK
 def op_eqv():
   # xnor
@@ -1227,10 +1227,10 @@ def op_fnrn():
 def op_ge():
   global sp
   sp = (sp - 2) & WORD_MASK
-  mem[sp & MEM_MASK] = int(
+  mem[sp & MEM_MASK] = -int(
     (mem[sp & MEM_MASK] ^ 0x400000000000) >=
     (mem[(sp + 1) & MEM_MASK] ^ 0x400000000000)
-  )
+  ) & WORD_MASK
   sp = (sp + 1) & WORD_MASK
 def op_global():
   global pc
@@ -1248,10 +1248,10 @@ def op_goto():
 def op_gr():
   global sp
   sp = (sp - 2) & WORD_MASK
-  mem[sp & MEM_MASK] = int(
+  mem[sp & MEM_MASK] = -int(
     (mem[sp & MEM_MASK] ^ 0x400000000000) >
     (mem[(sp + 1) & MEM_MASK] ^ 0x400000000000)
-  )
+  ) & WORD_MASK
   sp = (sp + 1) & WORD_MASK
 def op_iteml():
   assert False
@@ -1280,10 +1280,10 @@ def op_lab():
 def op_le():
   global sp
   sp = (sp - 2) & WORD_MASK
-  mem[sp & MEM_MASK] = int(
+  mem[sp & MEM_MASK] = -int(
     (mem[sp & MEM_MASK] ^ 0x400000000000) <=
     (mem[(sp + 1) & MEM_MASK] ^ 0x400000000000)
-  )
+  ) & WORD_MASK
   sp = (sp + 1) & WORD_MASK
 def op_lg():
   global pc, sp
@@ -1343,10 +1343,10 @@ def op_lp():
 def op_ls():
   global sp
   sp = (sp - 2) & WORD_MASK
-  mem[sp & MEM_MASK] = int(
+  mem[sp & MEM_MASK] = -int(
     (mem[sp & MEM_MASK] ^ 0x400000000000) <
     (mem[(sp + 1) & MEM_MASK] ^ 0x400000000000)
-  )
+  ) & WORD_MASK
   sp = (sp + 1) & WORD_MASK
 def op_lshift():
   # unsigned shift by positive or negative count (too large => return 0)
@@ -1386,9 +1386,9 @@ def op_mult():
 def op_ne():
   global sp
   sp = (sp - 2) & WORD_MASK
-  mem[sp & MEM_MASK] = int(
+  mem[sp & MEM_MASK] = -int(
     mem[sp & MEM_MASK] != mem[(sp + 1) & MEM_MASK]
-  )
+  ) & WORD_MASK
   sp = (sp + 1) & WORD_MASK
 def op_neg():
   global sp