Mercurial > vba-linux
comparison src/win32/Disassemble.cpp @ 1:f9f4f1b99eed
importing src directory
author | Robert McIntyre <rlm@mit.edu> |
---|---|
date | Sat, 03 Mar 2012 10:31:27 -0600 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
0:8ced16adf2e1 | 1:f9f4f1b99eed |
---|---|
1 // Disassemble.cpp : implementation file | |
2 // | |
3 | |
4 #include "stdafx.h" | |
5 #include "resource.h" | |
6 #include "Disassemble.h" | |
7 #include "VBA.h" | |
8 | |
9 #include "../gba/armdis.h" | |
10 #include "../gba/GBA.h" | |
11 #include "../gba/GBAGlobals.h" | |
12 | |
13 extern void CPUUpdateCPSR(); | |
14 | |
15 ///////////////////////////////////////////////////////////////////////////// | |
16 // Disassemble dialog | |
17 | |
18 Disassemble::Disassemble(CWnd*pParent /*=NULL*/) | |
19 : ResizeDlg(Disassemble::IDD, pParent) | |
20 { | |
21 //{{AFX_DATA_INIT(Disassemble) | |
22 m_c = FALSE; | |
23 m_f = FALSE; | |
24 m_i = FALSE; | |
25 m_n = FALSE; | |
26 m_t = FALSE; | |
27 m_v = FALSE; | |
28 m_z = FALSE; | |
29 //}}AFX_DATA_INIT | |
30 autoUpdate = false; | |
31 address = 0; | |
32 count = 1; | |
33 mode = 0; | |
34 } | |
35 | |
36 void Disassemble::DoDataExchange(CDataExchange*pDX) | |
37 { | |
38 CDialog::DoDataExchange(pDX); | |
39 //{{AFX_DATA_MAP(Disassemble) | |
40 DDX_Control(pDX, IDC_ADDRESS, m_address); | |
41 DDX_Control(pDX, IDC_DISASSEMBLE, m_list); | |
42 DDX_Check(pDX, IDC_C, m_c); | |
43 DDX_Check(pDX, IDC_F, m_f); | |
44 DDX_Check(pDX, IDC_I, m_i); | |
45 DDX_Check(pDX, IDC_N, m_n); | |
46 DDX_Check(pDX, IDC_T, m_t); | |
47 DDX_Check(pDX, IDC_V, m_v); | |
48 DDX_Check(pDX, IDC_Z, m_z); | |
49 DDX_Radio(pDX, IDC_AUTOMATIC, mode); | |
50 //}}AFX_DATA_MAP | |
51 } | |
52 | |
53 BEGIN_MESSAGE_MAP(Disassemble, CDialog) | |
54 //{{AFX_MSG_MAP(Disassemble) | |
55 ON_BN_CLICKED(IDC_AUTO_UPDATE, OnAutoUpdate) | |
56 ON_BN_CLICKED(IDC_AUTOMATIC, OnAutomatic) | |
57 ON_BN_CLICKED(IDC_ARM, OnArm) | |
58 ON_BN_CLICKED(IDC_CLOSE, OnClose) | |
59 ON_BN_CLICKED(IDC_GO, OnGo) | |
60 ON_BN_CLICKED(IDC_GOPC, OnGopc) | |
61 ON_BN_CLICKED(IDC_NEXT, OnNext) | |
62 ON_BN_CLICKED(IDC_REFRESH, OnRefresh) | |
63 ON_BN_CLICKED(IDC_THUMB, OnThumb) | |
64 ON_WM_VSCROLL() | |
65 //}}AFX_MSG_MAP | |
66 END_MESSAGE_MAP() | |
67 | |
68 ///////////////////////////////////////////////////////////////////////////// | |
69 // Disassemble message handlers | |
70 | |
71 void Disassemble::OnAutoUpdate() | |
72 { | |
73 autoUpdate = !autoUpdate; | |
74 if (autoUpdate) | |
75 { | |
76 theApp.winAddUpdateListener(this); | |
77 } | |
78 else | |
79 { | |
80 theApp.winRemoveUpdateListener(this); | |
81 } | |
82 } | |
83 | |
84 void Disassemble::OnAutomatic() | |
85 { | |
86 mode = 0; | |
87 refresh(); | |
88 } | |
89 | |
90 void Disassemble::OnArm() | |
91 { | |
92 mode = 1; | |
93 refresh(); | |
94 } | |
95 | |
96 void Disassemble::OnClose() | |
97 { | |
98 theApp.winRemoveUpdateListener(this); | |
99 | |
100 DestroyWindow(); | |
101 } | |
102 | |
103 void Disassemble::OnGo() | |
104 { | |
105 CString buffer; | |
106 m_address.GetWindowText(buffer); | |
107 sscanf(buffer, "%x", &address); | |
108 refresh(); | |
109 } | |
110 | |
111 void Disassemble::OnGopc() | |
112 { | |
113 if (armState) | |
114 address = armNextPC - 16; | |
115 else | |
116 address = armNextPC - 8; | |
117 | |
118 refresh(); | |
119 } | |
120 | |
121 void Disassemble::OnNext() | |
122 { | |
123 CPULoop(1); | |
124 if (armState) | |
125 { | |
126 u32 total = address+count*4; | |
127 if (armNextPC >= address && armNextPC < total) | |
128 {} | |
129 else | |
130 { | |
131 OnGopc(); | |
132 } | |
133 } | |
134 else | |
135 { | |
136 u32 total = address+count*2; | |
137 if (armNextPC >= address && armNextPC < total) | |
138 {} | |
139 else | |
140 { | |
141 OnGopc(); | |
142 } | |
143 } | |
144 refresh(); | |
145 } | |
146 | |
147 void Disassemble::OnRefresh() | |
148 { | |
149 refresh(); | |
150 } | |
151 | |
152 void Disassemble::OnThumb() | |
153 { | |
154 mode = 2; | |
155 refresh(); | |
156 } | |
157 | |
158 BOOL Disassemble::OnInitDialog() | |
159 { | |
160 CDialog::OnInitDialog(); | |
161 | |
162 DIALOG_SIZER_START(sz) | |
163 DIALOG_SIZER_ENTRY(IDC_DISASSEMBLE, DS_SizeY) | |
164 DIALOG_SIZER_ENTRY(IDC_REFRESH, DS_MoveY) | |
165 DIALOG_SIZER_ENTRY(IDC_CLOSE, DS_MoveY) | |
166 DIALOG_SIZER_ENTRY(IDC_NEXT, DS_MoveY) | |
167 DIALOG_SIZER_ENTRY(IDC_AUTO_UPDATE, DS_MoveY) | |
168 DIALOG_SIZER_ENTRY(IDC_GOPC, DS_MoveY) | |
169 DIALOG_SIZER_ENTRY(IDC_VSCROLL, DS_SizeY) | |
170 DIALOG_SIZER_END() | |
171 SetData(sz, | |
172 TRUE, | |
173 HKEY_CURRENT_USER, | |
174 "Software\\Emulators\\VisualBoyAdvance\\Viewer\\DisassembleView", | |
175 NULL); | |
176 | |
177 SCROLLINFO si; | |
178 ZeroMemory(&si, sizeof(si)); | |
179 si.cbSize = sizeof(si); | |
180 si.fMask = SIF_PAGE | SIF_RANGE | SIF_POS; | |
181 si.nMin = 0; | |
182 si.nMax = 100; | |
183 si.nPos = 50; | |
184 si.nPage = 0; | |
185 GetDlgItem(IDC_VSCROLL)->SetScrollInfo(SB_CTL, &si, TRUE); | |
186 | |
187 CFont *font = CFont::FromHandle((HFONT)GetStockObject(SYSTEM_FIXED_FONT)); | |
188 m_list.SetFont(font, FALSE); | |
189 for (int i = 0; i < 17; i++) | |
190 GetDlgItem(IDC_R0+i)->SetFont(font, FALSE); | |
191 | |
192 GetDlgItem(IDC_MODE)->SetFont(font, FALSE); | |
193 | |
194 m_address.LimitText(8); | |
195 refresh(); | |
196 | |
197 return TRUE; // return TRUE unless you set the focus to a control | |
198 // EXCEPTION: OCX Property Pages should return FALSE | |
199 } | |
200 | |
201 void Disassemble::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar*pScrollBar) | |
202 { | |
203 switch (nSBCode) | |
204 { | |
205 case SB_LINEDOWN: | |
206 if (mode == 0) | |
207 { | |
208 if (armState) | |
209 address += 4; | |
210 else | |
211 address += 2; | |
212 } | |
213 else if (mode == 1) | |
214 address += 4; | |
215 else | |
216 address += 2; | |
217 break; | |
218 case SB_LINEUP: | |
219 if (mode == 0) | |
220 { | |
221 if (armState) | |
222 address -= 4; | |
223 else | |
224 address -= 2; | |
225 } | |
226 else if (mode == 1) | |
227 address -= 4; | |
228 else | |
229 address -= 2; | |
230 break; | |
231 case SB_PAGEDOWN: | |
232 if (mode == 0) | |
233 { | |
234 if (armState) | |
235 address += count*4; | |
236 else | |
237 address += count*2; | |
238 } | |
239 else if (mode == 1) | |
240 address += count*4; | |
241 else | |
242 address += count*2; | |
243 break; | |
244 case SB_PAGEUP: | |
245 if (mode == 0) | |
246 { | |
247 if (armState) | |
248 address -= count*4; | |
249 else | |
250 address -= count*2; | |
251 } | |
252 else if (mode == 1) | |
253 address -= count*4; | |
254 else | |
255 address -= count*2; | |
256 break; | |
257 } | |
258 refresh(); | |
259 | |
260 CDialog::OnVScroll(nSBCode, nPos, pScrollBar); | |
261 } | |
262 | |
263 void Disassemble::refresh() | |
264 { | |
265 if (rom == NULL) | |
266 return; | |
267 | |
268 bool8 arm = armState; | |
269 | |
270 if (mode != 0) | |
271 { | |
272 if (mode == 1) | |
273 arm = true; | |
274 else | |
275 arm = false; | |
276 } | |
277 | |
278 int h = m_list.GetItemHeight(0); | |
279 RECT r; | |
280 m_list.GetClientRect(&r); | |
281 count = (r.bottom - r.top+1)/h; | |
282 | |
283 m_list.ResetContent(); | |
284 if (!systemIsEmulating() && systemCartridgeType == 0) | |
285 return; | |
286 | |
287 char buffer[80]; | |
288 u32 addr = address; | |
289 int i; | |
290 int sel = -1; | |
291 for (i = 0; i < count; i++) | |
292 { | |
293 if (addr == armNextPC) | |
294 sel = i; | |
295 if (arm) | |
296 { | |
297 addr += disArm(addr, buffer, 3); | |
298 } | |
299 else | |
300 { | |
301 addr += disThumb(addr, buffer, 3); | |
302 } | |
303 m_list.InsertString(-1, buffer); | |
304 } | |
305 | |
306 if (sel != -1) | |
307 m_list.SetCurSel(sel); | |
308 | |
309 CPUUpdateCPSR(); | |
310 | |
311 for (i = 0; i < 17; i++) | |
312 { | |
313 sprintf(buffer, "%08x", reg[i].I); | |
314 GetDlgItem(IDC_R0+i)->SetWindowText(buffer); | |
315 } | |
316 | |
317 m_n = (reg[16].I & 0x80000000) != 0; | |
318 m_z = (reg[16].I & 0x40000000) != 0; | |
319 m_c = (reg[16].I & 0x20000000) != 0; | |
320 m_v = (reg[16].I & 0x10000000) != 0; | |
321 m_i = (reg[16].I & 0x80) != 0; | |
322 m_f = (reg[16].I & 0x40) != 0; | |
323 m_t = (reg[16].I & 0x20) != 0; | |
324 | |
325 UpdateData(FALSE); | |
326 | |
327 int v = reg[16].I & 0x1f; | |
328 sprintf(buffer, "%02x", v); | |
329 GetDlgItem(IDC_MODE)->SetWindowText(buffer); | |
330 } | |
331 | |
332 void Disassemble::update() | |
333 { | |
334 OnGopc(); | |
335 refresh(); | |
336 } | |
337 | |
338 void Disassemble::PostNcDestroy() | |
339 { | |
340 delete this; | |
341 } | |
342 |