summaryrefslogtreecommitdiff
path: root/nandgame/assembler
diff options
context:
space:
mode:
authoruvok2026-01-05 13:49:13 +0100
committeruvok2026-01-05 13:49:13 +0100
commitf0ea83ca7a5342d7cb1bdebeda7b80c1e4392543 (patch)
treea1c15c035caa56eb74258ad445d02147e6a4089d /nandgame/assembler
parent4aebb30c43906697f60b437abe049f1cb8153f16 (diff)
Nicer disas output
- move jump in instruction - have better zero args - canocicalize some instructions
Diffstat (limited to 'nandgame/assembler')
-rwxr-xr-xnandgame/assembler/disas.py17
1 files changed, 13 insertions, 4 deletions
diff --git a/nandgame/assembler/disas.py b/nandgame/assembler/disas.py
index f7669c0..cabdcdd 100755
--- a/nandgame/assembler/disas.py
+++ b/nandgame/assembler/disas.py
@@ -9,6 +9,9 @@ I don't like the "C-style" one nandgame introduces.
import sys
+ZERO = "#0"
+DEST_NONE = "_"
+
def decode_jump(ins: int) -> str:
if (ins & 0x7) == 0:
@@ -74,7 +77,7 @@ def decode_arg1(ins: int) -> str:
sw = (ins & (1 << 6)) != 0
if zx:
- return "#0"
+ return ZERO
if not sw:
return "D"
return "M" if use_mem else "A"
@@ -105,7 +108,7 @@ def decode_dest(ins: int) -> str:
if dM:
dest += "M"
- return dest if dest else "_"
+ return dest if dest else DEST_NONE
def decode_instruction_complete(ins: int) -> list[str]:
@@ -122,16 +125,22 @@ def decode_instruction_complete(ins: int) -> list[str]:
op1 = decode_arg1(ins)
op2 = decode_arg2(ins) if two_op else ""
jumpdest = decode_jump(ins)
+
+ # fixups
+ if op1 == ZERO and codename == "sub":
+ return ["neg", dest, op2, "", jumpdest]
+
return [codename, dest, op1, op2, jumpdest]
def print_decoded(ins: int) -> str:
(codename, dest, op1, op2, jumpdest) = decode_instruction_complete(ins)
+ jumpdest_str = f".{jumpdest}" if jumpdest else ""
+ opcode_str = f"{codename}{jumpdest_str}"
dest_str = f"{dest}, " if dest else 7 * " "
op1_str = f"{op1}{", " if op2 else ""}"
- jumpdest_str = f"; {jumpdest}" if jumpdest else ""
- return f"{codename:<5}{dest_str:<6}{op1_str:<4}{op2:<5}{jumpdest_str}"
+ return f"{opcode_str:<9}{dest_str:<6}{op1_str:<4}{op2:<5}"
def main():