Debugger sources code clean-up
[clinton/Virtual-Jaguar-Rx.git] / src / debugger / localbrowser.cpp
1 //
2 // localbrowser.cpp - Local variables
3 //
4 // by Jean-Paul Mari
5 //
6 // JPM = Jean-Paul Mari <djipi.mari@gmail.com>
7 //
8 // Who When What
9 // --- ---------- -----------------------------------------------------------
10 // JPM 11/03/2017 Created this file
11 //
12
13
14 #include "debugger/localbrowser.h"
15 #include "memory.h"
16 #include "debugger/DBGManager.h"
17 #include "settings.h"
18 #include "m68000/m68kinterface.h"
19
20
21 //
22 LocalBrowserWindow::LocalBrowserWindow(QWidget * parent/*= 0*/) : QWidget(parent, Qt::Dialog),
23 layout(new QVBoxLayout), text(new QTextBrowser),
24 NbLocal(0),
25 FuncName((char *)calloc(1, 1)),
26 LocalInfo(NULL)
27 {
28 setWindowTitle(tr("Local"));
29
30 QFont fixedFont("Lucida Console", 8, QFont::Normal);
31 fixedFont.setStyleHint(QFont::TypeWriter);
32 text->setFont(fixedFont);
33 setLayout(layout);
34
35 layout->addWidget(text);
36 }
37
38
39 //
40 LocalBrowserWindow::~LocalBrowserWindow(void)
41 {
42 free(LocalInfo);
43 free(FuncName);
44 }
45
46
47 //
48 bool LocalBrowserWindow::UpdateInfos(void)
49 {
50 size_t Adr;
51 char *Ptr;
52
53 if (NbLocal = DBGManager_GetNbLocalVariables(Adr = m68k_get_reg(NULL, M68K_REG_PC)))
54 {
55 if (Ptr = DBGManager_GetFunctionName(Adr))
56 {
57 if (strcmp(FuncName, Ptr))
58 {
59 if (FuncName = (char *)realloc(FuncName, strlen(Ptr) + 1))
60 {
61 strcpy(FuncName, Ptr);
62
63 if (LocalInfo = (WatchInfo *)realloc(LocalInfo, (sizeof(WatchInfo) * NbLocal)))
64 {
65 for (size_t i = 0; i < NbLocal; i++)
66 {
67 // Get local variable name and his information
68 if (LocalInfo[i].PtrVariableName = DBGManager_GetLocalVariableName(Adr, i + 1))
69 {
70 LocalInfo[i].Op = DBGManager_GetLocalVariableOp(Adr, i + 1);
71 LocalInfo[i].Adr = NULL;
72 LocalInfo[i].PtrCPURegisterName = NULL;
73 LocalInfo[i].TypeTag = DBGManager_GetLocalVariableTypeTag(Adr, i + 1);
74 LocalInfo[i].PtrVariableBaseTypeName = DBGManager_GetLocalVariableTypeName(Adr, i + 1);
75 LocalInfo[i].TypeEncoding = DBGManager_GetLocalVariableTypeEncoding(Adr, i + 1);
76 LocalInfo[i].TypeByteSize = DBGManager_GetLocalVariableTypeByteSize(Adr, i + 1);
77 LocalInfo[i].Offset = DBGManager_GetLocalVariableOffset(Adr, i + 1);
78 }
79 }
80 }
81 }
82 }
83
84 return true;
85 }
86 }
87
88 *FuncName = 0;
89
90 return false;
91 }
92
93
94 //
95 void LocalBrowserWindow::RefreshContents(void)
96 {
97 char string[1024];
98 QString Local;
99 char Value[100];
100 char *PtrValue;
101
102 const char *CPURegName[] = { "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7", "A0", "A1", "A2", "A3", "A4", "A5", "A6", "A7" };
103
104 if (isVisible())
105 {
106 if (UpdateInfos())
107 {
108 for (size_t i = 0; i < NbLocal; i++)
109 {
110 if (LocalInfo[i].PtrVariableName)
111 {
112 // Local or parameters variables
113 if (((LocalInfo[i].Op >= DBG_OP_breg0) && (LocalInfo[i].Op <= DBG_OP_breg31)) || (LocalInfo[i].Op == DBG_OP_fbreg))
114 {
115 LocalInfo[i].Adr = m68k_get_reg(NULL, M68K_REG_A6) + LocalInfo[i].Offset;
116
117 if ((LocalInfo[i].Op == DBG_OP_fbreg))
118 {
119 LocalInfo[i].Adr += 8;
120 }
121
122 if ((LocalInfo[i].Adr >= 0) && (LocalInfo[i].Adr < vjs.DRAM_size))
123 {
124 PtrValue = DBGManager_GetVariableValueFromAdr(LocalInfo[i].Adr, LocalInfo[i].TypeEncoding, LocalInfo[i].TypeByteSize);
125 }
126 else
127 {
128 PtrValue = NULL;
129 }
130 }
131 else
132 {
133 // Value from CPU register
134 if ((LocalInfo[i].Op >= DBG_OP_reg0) && (LocalInfo[i].Op <= DBG_OP_reg31))
135 {
136 LocalInfo[i].PtrCPURegisterName = (char *)CPURegName[(LocalInfo[i].Op - DBG_OP_reg0)];
137 PtrValue = itoa(m68k_get_reg(NULL, (m68k_register_t)((size_t)M68K_REG_D0 + (LocalInfo[i].Op - DBG_OP_reg0))), Value, 10);
138 }
139 else
140 {
141 PtrValue = NULL;
142 }
143 }
144
145 if (!LocalInfo[i].Op)
146 {
147 sprintf(string, "<font color='#A52A2A'>%i : %s | %s | [Not used]</font>", (i + 1), (LocalInfo[i].PtrVariableBaseTypeName ? LocalInfo[i].PtrVariableBaseTypeName : (char *)"<font color='#ff0000'>N/A</font>"), LocalInfo[i].PtrVariableName);
148 }
149 else
150 {
151 sprintf(string, "%i : %s | %s | ", (i + 1), (LocalInfo[i].PtrVariableBaseTypeName ? LocalInfo[i].PtrVariableBaseTypeName : (char *)"<font color='#ff0000'>N/A</font>"), LocalInfo[i].PtrVariableName);
152 Local += QString(string);
153 if ((unsigned int)LocalInfo[i].Adr)
154 {
155 sprintf(string, "0x%06X", (unsigned int)LocalInfo[i].Adr);
156 }
157 else
158 {
159 if (LocalInfo[i].PtrCPURegisterName)
160 {
161 sprintf(string, "<font color='#0000FF'>%s</font>", LocalInfo[i].PtrCPURegisterName);
162 }
163 else
164 {
165 sprintf(string, "%s", (char *)"<font color='#ff0000'>N/A</font>");
166 }
167 }
168 Local += QString(string);
169 sprintf(string, " | %s", (!PtrValue ? (char *)"<font color='#ff0000'>N/A</font>" : PtrValue));
170 }
171 Local += QString(string);
172 sprintf(string, "<br>");
173 Local += QString(string);
174 }
175 }
176
177 text->clear();
178 text->setText(Local);
179 }
180 else
181 {
182 text->clear();
183 }
184 }
185 }
186
187
188 //
189 void LocalBrowserWindow::keyPressEvent(QKeyEvent * e)
190 {
191 if (e->key() == Qt::Key_Escape)
192 {
193 hide();
194 }
195 }