import sys, os sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) from objfmt import * from pcopt import DEC, SIZE def dis(o, a=0, b=None): c = o.code; b = len(c) if b is None else b refs = {off: (pn(n), k) for n, k, off in o.refs} names = {off: pn(n) for n, k, off in o.defs} p = a while p < b: if p in names: print('%s:' % names[p]) op = c[p] if op not in DEC: print('%04x %02x .byte' % (p, op)); p += 1; continue mn, md = DEC[op]; n = SIZE[md]; bs = c[p:p+n] v = bs[1] if n == 2 else (bs[1] | bs[2] << 8 if n == 3 else 0) if md == 'rel': v = p + 2 + (v - 256 if v > 127 else v) opnd = {'imp': '', 'acc': 'a', 'imm': '#$%02x' % v, 'zp': '$%02x' % v, 'zpx': '$%02x,x' % v, 'zpy': '$%02x,y' % v, 'abs': '$%04x' % v, 'abx': '$%04x,x' % v, 'aby': '$%04x,y' % v, 'izx': '($%02x,x)' % v, 'izy': '($%02x),y' % v, 'rel': 'L%04x' % v, 'ind': '($%04x)' % v}[md] tag = '' if p in refs: tag += ' ; ref %s' % (refs[p],) if p in o.reloc: tag += ' ; reloc' print('%04x %-9s %s %s%s' % (p, bs.hex(' '), mn, opnd, tag)) p += n if __name__ == '__main__': o = Obj.parse(open(sys.argv[1], 'rb').read()) dis(o)