From a75d9c67819e3a26269ce489c83f1978b1297a5e Mon Sep 17 00:00:00 2001 From: Maurizio Porrato Date: Sat, 25 Jan 2020 10:31:08 +0000 Subject: [PATCH] Added simple disassembler --- disasm.py | 72 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100755 disasm.py diff --git a/disasm.py b/disasm.py new file mode 100755 index 0000000..a2adb3f --- /dev/null +++ b/disasm.py @@ -0,0 +1,72 @@ +#!/usr/bin/env python3 + +import struct + + +OPCODES = ( + None , 'SET', 'ADD', 'SUB', 'MUL', 'MLI', 'DIV', 'DVI', + 'MOD', 'MDI', 'AND', 'BOR', 'XOR', 'SHR', 'ASR', 'SHL', + 'IFB', 'IFC', 'IFE', 'IFN', 'IFG', 'IFA', 'IFL', 'IFU', + None , None , 'ADX', 'SBX', None , None , 'STI', 'STD' +) + +OPCODES_X = ( + None , 'JSR', None , None , None , None , None , None , + 'INT', 'IAG', 'IAS', 'RFI', 'IAQ', None , None , None , + 'HWN', 'HWQ', 'HWI', None , None , None , None , None , + None , None , None , None , None , None , None , None +) + +ADDRESSING = ( + 'A', 'B', 'C', 'X', 'Y', 'Z', 'I', 'J', + '[A]', '[B]', '[C]', '[X]', '[Y]', '[Z]', '[I]', '[J]', + '[A+n]', '[B+n]', '[C+n]', '[X+n]', '[Y+n]', '[Z+n]', '[I+n]', '[J+n]', + 'POP/PUSH', 'PEEK', 'PEEK n', 'SP', 'PC', 'EX', '[n]', 'n' +) + +def read_word(f): + b = f.read(2) + if len(b) < 2: + raise EOFError() + return struct.unpack("> 5) & 0x1f + a = (w >> 10) & 0x3f + if a < 0x20: + a_str = ADDRESSING[a] + if 'n' in a_str: + w = read_word(f) + ins.append(w) + a_str = a_str.replace('n', str(w)) + else: + a_str = str(int(a) - 0x21) + a_str = a_str.split('/')[0] + if op == 0: + mnemonic = "%s %s" % (OPCODES_X[b], a_str) + else: + b_str = ADDRESSING[b] + if 'n' in b_str: + w = read_word(f) + ins.append(w) + b_str = b_str.replace('n', str(w)) + b_str = b_str.split('/')[-1] + mnemonic = "%s %s, %s" % (OPCODES[op], b_str, a_str) + print("%5d:\t%-20s; %s" % (pc, mnemonic, ' '.join(["%04x" % x for x in ins]))) + pc += len(ins) + + +if __name__ == '__main__': + import sys + + if len(sys.argv) > 1: + disassemble(sys.argv[1])