summaryrefslogtreecommitdiff
path: root/nandgame/assembler/disas_main.py
blob: d9d314fa293c3de60aa29082bd2203c375936755 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
import argparse
import sys

import py_nand_ass.disas as dass  # pyright: ignore[reportImplicitRelativeImport]


def main():
    arg_parser = argparse.ArgumentParser(
        prog="disas_main.py", description="Nandgame disassembler"
    )

    g = arg_parser.add_mutually_exclusive_group()
    g.add_argument("--le", action="store_true")
    g.add_argument("--be", action="store_true")
    arg_parser.add_argument("filename")
    args = arg_parser.parse_args()
    endianness = "little"
    if args.be:
        endianness = "big"

    filename = args.filename
    try:
        with open(filename, "rb") as f:
            while True:
                insb = f.read(2)
                if not insb:
                    break
                ins = int.from_bytes(insb, byteorder=endianness)
                if endianness in ["big", "be"]:
                    raw_ins = f"{insb[0]:02x} {insb[1]:02x}"
                elif endianness in ["little", "le"]:
                    raw_ins = f"{insb[1]:02x} {insb[0]:02x}"
                else:
                    raw_ins = f"?? ??"
                decoded_ins = dass.print_decoded(ins, False)
                decoded_ins2 = dass.print_decoded(ins, True)
                if decoded_ins == decoded_ins2:
                    line = f"\t{raw_ins}\t{decoded_ins}"
                else:
                    line = f"\t{raw_ins}\t{decoded_ins2:<25}; {decoded_ins}"

                print(line)

    except FileNotFoundError:
        print(f"File {filename} not found.")
        sys.exit(1)
    # head, tail...
    except BrokenPipeError:
        sys.exit(0)


if __name__ == "__main__":
    main()