summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore2
-rwxr-xr-xnandgame/assembler/createbin.py14
-rwxr-xr-xnandgame/assembler/disas.py29
3 files changed, 45 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
index 080796d..f8eff08 100644
--- a/.gitignore
+++ b/.gitignore
@@ -7,3 +7,5 @@
*.vvp
*.lxt2
verilator.*/
+*.bin
+
diff --git a/nandgame/assembler/createbin.py b/nandgame/assembler/createbin.py
new file mode 100755
index 0000000..d4a2e7a
--- /dev/null
+++ b/nandgame/assembler/createbin.py
@@ -0,0 +1,14 @@
+#!/usr/bin/env python3
+
+
+with open("allins.bin", "wb") as f:
+ ins=0x0000
+ # ldi A, 0
+ f.write(ins.to_bytes(2))
+
+ ins=0x00ff
+ # ldi A, 255
+ f.write(ins.to_bytes(2))
+
+ for ins in range(0x8000, 0xffff + 1):
+ f.write(ins.to_bytes(2))
diff --git a/nandgame/assembler/disas.py b/nandgame/assembler/disas.py
new file mode 100755
index 0000000..a68acf4
--- /dev/null
+++ b/nandgame/assembler/disas.py
@@ -0,0 +1,29 @@
+#!/usr/bin/env python3
+
+import sys
+
+if len(sys.argv) != 2:
+ print(f"Usage: {sys.argv[0]} [filename]")
+ sys.exit(1)
+
+def decode(ins: int) -> str:
+ if (ins & 0x8000 == 0):
+ # mov? ldr? ldi? aaaaaaaaaaa....
+ return f"mov A, #{ins}"
+ else:
+ return "<unknown>"
+
+try:
+ with open(sys.argv[1], "rb") as f:
+ while True:
+ insb = f.read(2)
+ if not insb: break
+ ins = int.from_bytes(insb)
+ print(f"\t{insb[0]:02x} {insb[1]:02x}\t{decode(ins)}")
+
+except FileNotFoundError:
+ print(f"File not found.")
+ sys.exit(1)
+# head, tail...
+except BrokenPipeError:
+ sys.exit(0)