view python/ide/disasm.py @ 295:917eab04b8b7

Added disasm
author Windel Bouwman
date Thu, 28 Nov 2013 21:10:32 +0100
parents python/disasm.py@b07d28a5ca56
children dcae6574c974
line wrap: on
line source

from PyQt4.QtCore import *
from PyQt4.QtGui import *
import binascii


class DisAsmModel(QAbstractTableModel):
    def __init__(self):
        super().__init__()
        self.outs = None
        self.instructions = []
        self.headers = ['Address', 'Bytes', 'Instruction']
        self.txts = []
        self.txts.append(lambda i: '0x{:08x}'.format(i.address))
        self.txts.append(lambda i: binascii.hexlify(i.encode()).decode('ascii'))
        self.txts.append(lambda i: str(i))

    def rowCount(self, parent):
        return len(self.instructions)
        
    def columnCount(self, parent):
        return len(self.headers)

    def data(self, index, role):
        if not index.isValid():
            return
        row, col = index.row(), index.column()
        if role == Qt.DisplayRole:
            i = self.instructions[row]
            return self.txts[col](i)

    def headerData(self, section, orientation, role):
        if orientation == Qt.Horizontal and role == Qt.DisplayRole:
            return self.headers[section]
            
    def setInstructions(self, ins):
        self.instructions = ins
        self.modelReset.emit()
    

class Disassembly(QTableView):
    def __init__(self):
        super().__init__()
        self.dm = DisAsmModel()
        self.setModel(self.dm)

    def showPos(self, p):
        for i in self.dm.instructions:
            if i.address == p:
                row = self.dm.instructions.index(i)
                self.selectRow(row)