import struct, sys, collections, capstone names = {0x1c00:'DWGCTL',0x1c04:'MACCESS',0x1c08:'MCTLWTST',0x1c0c:'ZORG',0x1c10:'PAT0',0x1c14:'PAT1', 0x1c1c:'PLNWT',0x1c20:'BCOL',0x1c24:'FCOL',0x1c30:'SRC0',0x1c34:'SRC1',0x1c38:'SRC2',0x1c3c:'SRC3',0x1c40:'XYSTRT',0x1c44:'XYEND', 0x1c50:'SHIFT',0x1c54:'DMAPAD',0x1c58:'SGN',0x1c5c:'LEN',0x1c60:'AR0',0x1c64:'AR1',0x1c68:'AR2',0x1c6c:'AR3',0x1c70:'AR4', 0x1c74:'AR5',0x1c78:'AR6',0x1c80:'CXBNDRY',0x1c84:'FXBNDRY',0x1c88:'YDSTLEN',0x1c8c:'PITCH',0x1c90:'YDST', 0x1c94:'YDSTORG',0x1c98:'YTOP',0x1c9c:'YBOT',0x1ca0:'CXLEFT',0x1ca4:'CXRIGHT',0x1ca8:'FXLEFT',0x1cac:'FXRIGHT', 0x1cb0:'XDST',0x1cc0:'DR0',0x1cc4:'DR1',0x1cc8:'DR2',0x1ccc:'DR3',0x1cd0:'DR4',0x1cd8:'DR6',0x1cdc:'DR7', 0x1ce0:'DR8',0x1ce4:'DR9',0x1ce8:'DR10',0x1cec:'DR11',0x1cf0:'DR12',0x1cf8:'DR14',0x1cfc:'DR15', 0x1e10:'FIFOSTATUS',0x1e14:'STATUS',0x1e18:'ICLEAR',0x1e1c:'IEN',0x1e40:'RST',0x1e54:'OPMODE', 0x2c00:'TMR0',0x2c24:'TEXORG',0x2c28:'TEXWIDTH',0x2c2c:'TEXHEIGHT',0x2c30:'TEXCTL',0x2c34:'TEXTRANS',0x2c38:'TEXTRANSHIGH', 0x2c3c:'TEXFILTER',0x2c40:'ALPHASTART',0x2c48:'ALPHAXINC',0x2c4c:'ALPHAYINC',0x2c50:'FOGSTART',0x2c54:'ALPHACTRL',0x2c58:'FOGCOL'} d = open(sys.argv[1],'rb').read() nscns, = struct.unpack('>H', d[2:4]); opth, = struct.unpack('>H', d[16:18]) off = 20 + opth for i in range(nscns): s = d[off+40*i: off+40*i+40] nm = s[:8].rstrip(b'\0').decode(); size, ptr = struct.unpack('>II', s[16:24]) if nm == '.text': text = d[ptr:ptr+size] md = capstone.Cs(capstone.CS_ARCH_PPC, capstone.CS_MODE_32 | capstone.CS_MODE_BIG_ENDIAN) md.detail = False; md.skipdata = True hits = collections.Counter(); n = 0 for ins in md.disasm(text, 0): n += 1 if ins.mnemonic.startswith(('st','l')) and '(' in ins.op_str: disp = ins.op_str.split(',')[-1].strip().split('(')[0] try: v = int(disp, 0) except: continue for base in (0, 0x100): r = v - base if r in names and (0x1c00 <= v < 0x1f00 or 0x2c00 <= v < 0x2d00): hits[(ins.mnemonic[:2], names[r] + ('+GO' if base else ''), hex(v))] += 1; break print(n, 'instructions') for k, c in sorted(hits.items(), key=lambda x: x[0][2]): print(c, *k)