summaryrefslogtreecommitdiff
path: root/nandgame
diff options
context:
space:
mode:
Diffstat (limited to 'nandgame')
-rwxr-xr-xnandgame/assembler/disas.py55
1 files changed, 33 insertions, 22 deletions
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 "; <unknown>"
+ return "<unknown>"
# 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.")