|
- 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)
|