2 // callstackbrowser.cpp - Call Stack
6 // JPM = Jean-Paul Mari <djipi.mari@gmail.com>
9 // --- ---------- -----------------------------------------------------------
10 // JPM 08/31/2018 Created this file
11 // JPM 09/12/2018 Added a status bar and better status report
12 // JPM 10/20/2018 Added the return address information in the call stack
15 // To set the information display at the right
16 // To use DWARF frame information
19 #include "debugger/callstackbrowser.h"
21 #include "debugger/DBGManager.h"
22 #include "m68000/m68kinterface.h"
26 CallStackBrowserWindow::CallStackBrowserWindow(QWidget
* parent
/*= 0*/) : QWidget(parent
, Qt::Dialog
),
28 text(new QTextBrowser
),
30 TableView(new QTableView
),
31 model(new QStandardItemModel
),
33 statusbar(new QStatusBar
),
34 layout(new QVBoxLayout
)
36 setWindowTitle(tr("Call Stack"));
39 QFont
fixedFont("Lucida Console", 8, QFont::Normal
);
40 fixedFont
.setStyleHint(QFont::TypeWriter
);
43 // Set original layout
44 text
->setFont(fixedFont
);
45 layout
->addWidget(text
);
47 // Set the new layout with proper identation and readibility
48 model
->setColumnCount(3);
49 model
->setHeaderData(0, Qt::Horizontal
, QObject::tr("Name"));
50 model
->setHeaderData(1, Qt::Horizontal
, QObject::tr("Line"));
51 model
->setHeaderData(2, Qt::Horizontal
, QObject::tr("Return address"));
53 TableView
->setModel(model
);
54 TableView
->setEditTriggers(QAbstractItemView::NoEditTriggers
);
55 TableView
->setShowGrid(0);
56 TableView
->setFont(fixedFont
);
57 TableView
->verticalHeader()->setDefaultSectionSize(TableView
->verticalHeader()->minimumSectionSize());
58 TableView
->verticalHeader()->setDefaultAlignment(Qt::AlignRight
);
59 layout
->addWidget(TableView
);
63 layout
->addWidget(statusbar
);
69 CallStackBrowserWindow::~CallStackBrowserWindow(void)
75 void CallStackBrowserWindow::RefreshContents(void)
78 size_t Error
= CS_NOERROR
;
79 unsigned int a6
, Sa6
, ret
;
91 #ifndef CS_LAYOUTTEXTS
92 model
->setRowCount(0);
94 if ((a6
= m68k_get_reg(NULL
, M68K_REG_A6
)) && DBGManager_GetType())
98 a6
= GET32(jaguarMainRAM
, Sa6
);
99 ret
= GET32(jaguarMainRAM
, Sa6
+ 4);
100 #ifdef CS_LAYOUTTEXTS
101 sprintf(string
, "0x%06X | Ret: 0x%06X | From: %s - 0x%06X | Line: %s", Sa6
, ret
, (FuncName
= DBGManager_GetFunctionName(ret
)), (unsigned int)DBGManager_GetAdrFromSymbolName(FuncName
), DBGManager_GetLineSrcFromAdr(ret
, DBG_NO_TAG
));
102 CallStack
+= QString(string
);
105 CallStack
+= QString("<br>");
108 model
->insertRow(NbRaw
);
109 model
->setItem(NbRaw
, 0, new QStandardItem(QString("%1").arg((FuncName
= DBGManager_GetFunctionName(ret
)) ? FuncName
: "(N/A)")));
110 FunctionName
= QString(FuncName
= DBGManager_GetLineSrcFromAdr(ret
, DBG_NO_TAG
));
111 FunctionName
.replace(" ", " ");
112 model
->setItem(NbRaw
, 1, new QStandardItem(QString("%1").arg(FuncName
? FunctionName
: "(N/A)")));
113 sprintf(msg
, "0x%06X", ret
);
114 model
->setItem(NbRaw
++, 2, new QStandardItem(QString("%1").arg(msg
)));
117 #ifdef CS_LAYOUTTEXTS
119 text
->setText(CallStack
);
121 sprintf(msg
, "Ready");
126 sprintf(msg
, "Call Stack not available");
127 Error
= CS_NOCALLSTACK
;
128 #ifdef CS_LAYOUTTEXTS
133 // Display status bar
136 if ((Error
& CS_WARNING
))
138 statusbar
->setStyleSheet("background-color: lightyellow; font: bold");
142 statusbar
->setStyleSheet("background-color: tomato; font: bold");
147 statusbar
->setStyleSheet("background-color: lightgreen; font: bold");
149 statusbar
->showMessage(QString(msg
));
155 void CallStackBrowserWindow::keyPressEvent(QKeyEvent
* e
)
157 if (e
->key() == Qt::Key_Escape
)