1
2 import envi
3 import envi.bits as e_bits
4 import envi.bytesig as e_bsig
5
6 from envi.archs.z80.regs import *
7 from envi.archs.z80.const import *
8
9 import envi.archs.z80.z80opcode as z80_opcode
10
11 sigtree = e_bsig.SignatureTree()
12
13 for row in z80_opcode.z80table:
14 sighex, maskhex = row[0]
15
16 sig = sighex.decode('hex')
17 mask = maskhex.decode('hex')
18
19 sigtree.addSignature(sig, masks=mask, val=row)
20
21
25
29
31 return '%.4xH' % self.imm
32
35
38 self.reg = reg
39 self.disp = disp
40
42 rname = regctx.getRegisterName(self.reg)
43 if self.disp > 0:
44 return '(%s + %d)' % (rname, self.disp)
45 if self.disp < 0:
46 return '(%s - %d)' % (rname, abs(self.disp))
47 return '(%s)' % rname
48
51
53
57
58 - def disasm(self, bytes, offset, va):
59 row = sigtree.getSignature(bytes, offset)
60 if row == None:
61 raise envi.InvalidInstruction(bytes=bytes[offset:offset+8])
62 sigmask, mnem, o1type, o1info, o2type, o2info, oplen, immoff, iflags = row
63
64 opers = []
65 if o1type != None:
66 opers.append(self._buildOper(bytes, offset, immoff, o1type, o1info))
67 if o2type != None:
68 opers.append(self._buildOper(bytes, offset, immoff, o2type, o2info))
69 return z80Opcode(va, 0, mnem, 0, oplen, opers, iflags)
70
71 - def _buildOper(self, bytes, offset, immoff, otype, oinfo):
103
104 if __name__ == '__main__':
105 print sigtree.getSignature('\x00')
106 print sigtree.getSignature('fdcb0006'.decode('hex'))
107
108 d = z80Disasm()
109
110 print repr(d.disasm('\xfd\xcb\x30\x06', 0, 20))
111