1 #ifndef QDISASMVIEW_H 2 #define QDISASMVIEW_H 3 4 #include <QVector> 5 #include <QTextStream> 6 #include <QWidget> 7 8 class QPainter; 9 class CProcessor; 10 class CMemoryController; 11 12 13 enum DisasmSubtitleType 14 { 15 SUBTYPE_NONE = 0, 16 SUBTYPE_COMMENT = 1, 17 SUBTYPE_BLOCKCOMMENT = 2, 18 SUBTYPE_DATA = 4 19 }; 20 21 struct DisasmSubtitleItem 22 { 23 quint16 address; 24 DisasmSubtitleType type; 25 QString comment; 26 }; 27 28 enum DisasmLineType 29 { 30 LINETYPE_NONE = 0, // Empty line 31 LINETYPE_DATA = 1, // Line contains a data (non-instruction) 32 LINETYPE_INSTR = 2, // Line contains a disassembled instruction 33 LINETYPE_JUMP = 4, // Line has jump 34 LINETYPE_SUBTITLE = 8, // Line has subtitle comment 35 }; 36 37 struct DisasmLineItem 38 { 39 int type; // Combination of DisasmLineType values 40 quint16 address; // Line address for LINETYPE_DATA 41 int addrtype; // Address type for LINETYPE_DATA, see ADDRTYPE_XXX constants 42 quint16 value; // Data on the address for LINETYPE_DATA 43 char strInstr[8]; // Disassembled instruction for LINETYPE_DISASM 44 char strArg[32]; // Disassembled instruction arguments for LINETYPE_DISASM 45 int jumpdelta; // Jump delta for LINETYPE_JUMP 46 const DisasmSubtitleItem * pSubItem; // Link to subtitles item for LINETYPE_SUBTITLE 47 }; 48 49 class QDisasmView : public QWidget 50 { 51 Q_OBJECT 52 public: 53 QDisasmView(); 54 55 void setCurrentProc(bool okProc); 56 void updateData(); 57 void updateWindowText(); 58 59 public slots: 60 void switchCpuPpu(); 61 void showHideSubtitles(); 62 63 protected: 64 void paintEvent(QPaintEvent *event) override; 65 void contextMenuEvent(QContextMenuEvent *event) override; 66 void focusInEvent(QFocusEvent *) override; 67 void focusOutEvent(QFocusEvent *) override; 68 void mousePressEvent(QMouseEvent *) override; 69 70 void parseSubtitles(QTextStream& stream); 71 void addSubtitle(quint16 addr, DisasmSubtitleType type, const QString& comment); 72 73 private: 74 bool m_okDisasmProcessor; // true - CPU, false - PPU 75 quint16 m_wDisasmBaseAddr; 76 quint16 m_wDisasmNextBaseAddr; 77 QVector<DisasmSubtitleItem> m_SubtitleItems; 78 bool m_okDisasmJumpPredict; 79 QString m_strDisasmHint; 80 QString m_strDisasmHint2; 81 QVector<DisasmLineItem> m_DisasmLineItems; 82 int m_cxDisasmBreakpointZone; 83 int m_cyDisasmLine; 84 85 const DisasmSubtitleItem * findSubtitle(quint16 address, quint16 typemask); 86 87 bool checkForJump(const quint16* memory, int* pDelta); 88 bool getJumpConditionHint(const quint16* memory, const CProcessor * pProc, const CMemoryController * pMemCtl, QString &buffer); 89 void registerHint(const CProcessor *pProc, const CMemoryController *pMemCtl, 90 QString &hint1, QString& hint2, 91 int regnum, int regmod, bool byteword, quint16 indexval); 92 void registerHintPC(const CProcessor *pProc, const CMemoryController *pMemCtl, 93 QString &hint1, QString& hint2, 94 int regmod, bool byteword, quint16 curaddr, quint16 value); 95 void instructionHint(const quint16 *memory, const CProcessor *pProc, const CMemoryController *pMemCtl, 96 QString& buffer, QString& buffer2, 97 int srcreg, int srcmod, int dstreg, int dstmod); 98 int getInstructionHint(const quint16* memory, const CProcessor * pProc, const CMemoryController * pMemCtl, 99 QString &buffer, QString &buffer2); 100 101 void drawJump(QPainter& painter, int yFrom, int delta, int x, int cyLine, QColor color); 102 void drawBreakpoint(QPainter& painter, int x, int y, int cyLine); 103 int drawDisassemble(QPainter& painter, CProcessor* pProc, quint16 current, quint16 previous); 104 }; 105 106 #endif // QDISASMVIEW_H 107