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