From c318400b94731114d7d7dc49b5dd692b494c63bf Mon Sep 17 00:00:00 2001 From: uvok Date: Sun, 4 Jan 2026 17:29:31 +0100 Subject: finish disassembler --- nandgame/assembler/disas.py | 55 +++++++++++++++++++++++++++------------------ 1 file changed, 33 insertions(+), 22 deletions(-) (limited to 'nandgame/assembler') diff --git a/nandgame/assembler/disas.py b/nandgame/assembler/disas.py index 21cd081..65e4a2c 100755 --- a/nandgame/assembler/disas.py +++ b/nandgame/assembler/disas.py @@ -7,7 +7,7 @@ def decode_jump(ins: int) -> str: if (ins & 0x7) == 0: return "" if (ins & 0x7) == 0x7: - return "; j" + return "j" jl = (ins & (1 << 2)) != 0 je = (ins & (1 << 1)) != 0 @@ -15,23 +15,23 @@ def decode_jump(ins: int) -> str: # implied: and not jg if jl and je: - return "; jle" + return "jle" # implied: and not je if jl and jg: - return "; jne" + return "jne" # implied: and not je if je and jg: - return "; jge" + return "jge" # implied: only one flag is 1 if jl: - return "; jl" + return "jl" if je: - return "; je" + return "je" if jg: - return "; jg" + return "jg" - return "; " + return "" # return op, and whether it's a one-op or two-op @@ -90,30 +90,41 @@ def decode_dest(ins: int) -> str: dA = (ins & (1 << 5)) != 0 dD = (ins & (1 << 4)) != 0 dM = (ins & (1 << 3)) != 0 - dest_s = "" + dest = "" if dA: - dest_s += "A " + dest += "A " if dD: - dest_s += "D " + dest += "D " if dM: - dest_s += "M" - if dest_s: - dest_s += ", " - return dest_s + dest += "M" + return dest -def decode(ins: int) -> str: + +def decode_instruction_complete(ins: int) -> list[str]: + """ + Will return a 5 element list/tuple/whatever + mnemonic, destination, X, Y, jumpdest + """ if ins & 0x8000 == 0: # mov? ldr? ldi? aaaaaaaaaaa.... - return f"mov A, #{ins}" + return ["mov", "A", f"#{ins}", "", ""] else: - dest_s = decode_dest(ins) codename, two_op = decode_ins(ins) + dest = decode_dest(ins) op1 = decode_arg1(ins) - op2 = decode_arg2(ins) + op2 = decode_arg2(ins) if two_op else "" + jumpdest = decode_jump(ins) + return [codename, dest, op1, op2, jumpdest] + + +def print_decoded(ins: int) -> str: + (codename, dest, op1, op2, jumpdest) = decode_instruction_complete(ins) - op2_s = f", {op2}" if two_op else "" - return f"{codename:<5}{dest_s:<8}{op1:<3}{op2_s:<5}{decode_jump(ins)}" + dest_str = f"{dest:<5}, " if dest else 7 * " " + jumpdest_str = f"; {jumpdest}" if jumpdest else "" + op2_str = f", {op2}" if op2 else "" + return f"{codename:<5}{dest_str}{op1:<2}{op2_str:<5}{jumpdest_str}" def main(): @@ -129,7 +140,7 @@ def main(): if not insb: break ins = int.from_bytes(insb) - print(f"\t{insb[0]:02x} {insb[1]:02x}\t{decode(ins)}") + print(f"\t{insb[0]:02x} {insb[1]:02x}\t{print_decoded(ins)}") except FileNotFoundError: print(f"File {filename} not found.") -- cgit v1.2.3