Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
alexbevi
GitHub Repository: alexbevi/BizHawk
Path: blob/master/yabause/src/gtk/yuish.c
2 views
1
/* Copyright 2005-2006 Fabien Coulon
2
Copyright 2008 Guillaume Duhamel
3
4
This file is part of Yabause.
5
6
Yabause is free software; you can redistribute it and/or modify
7
it under the terms of the GNU General Public License as published by
8
the Free Software Foundation; either version 2 of the License, or
9
(at your option) any later version.
10
11
Yabause is distributed in the hope that it will be useful,
12
but WITHOUT ANY WARRANTY; without even the implied warranty of
13
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
GNU General Public License for more details.
15
16
You should have received a copy of the GNU General Public License
17
along with Yabause; if not, write to the Free Software
18
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19
*/
20
21
#include <gtk/gtk.h>
22
#include <gdk/gdkkeysyms.h>
23
24
#include "yuish.h"
25
#include "../sh2core.h"
26
#include "../sh2d.h"
27
#include "../yabause.h"
28
#include "settings.h"
29
30
static void yui_sh_class_init (YuiShClass * klass);
31
static void yui_sh_init (YuiSh * yfe);
32
static void yui_sh_clear(YuiSh * sh);
33
static void yui_sh_editedReg( GtkCellRendererText *cellrenderertext,
34
gchar *arg1,
35
gchar *arg2,
36
YuiSh *sh2);
37
static void yui_sh_editedBp( GtkCellRendererText *cellrenderertext,
38
gchar *arg1,
39
gchar *arg2,
40
YuiSh *sh2);
41
static void yui_sh_editedMbp( GtkCellRendererText *cellrenderertext,
42
gchar *arg1,
43
gchar *arg2,
44
YuiSh *sh2);
45
static void yui_sh_editedMbpFlags( GtkCellRendererText *cellrenderertext,
46
gchar *arg1,
47
gchar *arg2,
48
YuiSh *sh2);
49
static void yui_sh_step( GtkWidget* widget, YuiSh * sh2 );
50
static void SH2BreakpointHandler (SH2_struct *context, u32 addr);
51
static gint yui_sh_popup(GtkWidget * widget, GdkEvent * event, gpointer data);
52
static gint yui_sh_bp_popup(GtkWidget * widget, GdkEventButton * event, gpointer data);
53
static gint yui_sh_mbp_popup(GtkWidget * widget, GdkEventButton * event, gpointer data);
54
static void yui_sh_popup_add_bp(GtkMenuItem * menuitem, gpointer user_data);
55
static void yui_sh_popup_del_bp(GtkMenuItem * menuitem, gpointer user_data);
56
static void SH2UpdateBreakpointList(YuiSh * sh2);
57
static void SH2UpdateMemoryBreakpointList(YuiSh * sh2);
58
static void yui_sh_bp_add(GtkEntry * entry, gpointer user_data);
59
static void yui_sh_button_bp_add(GtkWidget * widget, gpointer user_data);
60
static void yui_sh_mbp_add(GtkEntry * entry, gpointer user_data);
61
static void yui_sh_mbp_toggle_flag(GtkWidget * menuitem, gpointer user_data);
62
static void yui_sh_mbp_remove(GtkWidget * menuitem, gpointer user_data);
63
static void yui_sh_mbp_clear(GtkWidget * menuitem, gpointer user_data);
64
static void yui_sh_bp_remove(GtkWidget * menuitem, gpointer user_data);
65
static void yui_sh_bp_clear(GtkWidget * menuitem, gpointer user_data);
66
67
static YuiSh *yui_msh, *yui_ssh;
68
static YuiWindow * yui;
69
70
GType yui_sh_get_type (void) {
71
static GType yfe_type = 0;
72
73
if (!yfe_type)
74
{
75
static const GTypeInfo yfe_info =
76
{
77
sizeof (YuiShClass),
78
NULL, /* base_init */
79
NULL, /* base_finalize */
80
(GClassInitFunc) yui_sh_class_init,
81
NULL, /* class_finalize */
82
NULL, /* class_data */
83
sizeof (YuiSh),
84
0,
85
(GInstanceInitFunc) yui_sh_init,
86
NULL,
87
};
88
89
yfe_type = g_type_register_static(GTK_TYPE_WINDOW, "YuiSh", &yfe_info, 0);
90
}
91
92
return yfe_type;
93
}
94
95
static void yui_sh_class_init (UNUSED YuiShClass * klass) {
96
}
97
98
static void yui_sh_init (YuiSh * sh2) {
99
//GtkWidget *vboxBp;
100
101
sh2->breakpointEnabled = MSH2->breakpointEnabled;
102
103
gtk_window_set_title(GTK_WINDOW(sh2), "SH");
104
105
sh2->vbox = gtk_vbox_new(FALSE, 0);
106
gtk_container_set_border_width( GTK_CONTAINER( sh2->vbox ), 0);
107
gtk_container_add (GTK_CONTAINER (sh2), sh2->vbox);
108
109
sh2->toolbar = gtk_toolbar_new();
110
gtk_toolbar_set_style(GTK_TOOLBAR(sh2->toolbar), GTK_TOOLBAR_ICONS);
111
gtk_box_pack_start(GTK_BOX(sh2->vbox), sh2->toolbar, FALSE, FALSE, 0);
112
113
sh2->hboxmain = gtk_hbox_new(FALSE, 4);
114
gtk_box_pack_start( GTK_BOX( sh2->vbox ), sh2->hboxmain, FALSE, FALSE, 0);
115
116
/* Register list */
117
118
sh2->regListStore = gtk_list_store_new(2,G_TYPE_STRING,G_TYPE_STRING);
119
sh2->regList = gtk_tree_view_new_with_model( GTK_TREE_MODEL(sh2->regListStore) );
120
sh2->regListRenderer1 = gtk_cell_renderer_text_new();
121
sh2->regListRenderer2 = gtk_cell_renderer_text_new();
122
g_object_set(G_OBJECT(sh2->regListRenderer2), "editable", TRUE, "mode", GTK_CELL_RENDERER_MODE_EDITABLE, NULL );
123
sh2->regListColumn1 = gtk_tree_view_column_new_with_attributes(_("Register"), sh2->regListRenderer1, "text", 0, NULL);
124
gtk_tree_view_append_column(GTK_TREE_VIEW(sh2->regList), sh2->regListColumn1);
125
sh2->regListColumn2 = gtk_tree_view_column_new_with_attributes(_("Value"), sh2->regListRenderer2, "text", 1, NULL);
126
gtk_tree_view_append_column(GTK_TREE_VIEW(sh2->regList), sh2->regListColumn2);
127
gtk_box_pack_start( GTK_BOX( sh2->hboxmain ), sh2->regList, FALSE, FALSE, 0);
128
g_signal_connect(G_OBJECT(sh2->regListRenderer2), "edited", GTK_SIGNAL_FUNC(yui_sh_editedReg), sh2 );
129
130
sh2->store = gtk_list_store_new(3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
131
sh2->view = gtk_tree_view_new_with_model(GTK_TREE_MODEL (sh2->store));
132
gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(sh2->view), FALSE);
133
{
134
GtkWidget * scroll;
135
GtkCellRenderer *renderer;
136
GtkCellRenderer *icon;
137
GtkTreeViewColumn *column;
138
139
scroll = gtk_scrolled_window_new(NULL, NULL);
140
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
141
142
icon = gtk_cell_renderer_pixbuf_new();
143
g_object_set(icon, "xalign", 0, NULL);
144
column = gtk_tree_view_column_new_with_attributes("Icon", icon, "stock-id", 0, NULL);
145
gtk_tree_view_append_column(GTK_TREE_VIEW (sh2->view), column);
146
147
renderer = gtk_cell_renderer_text_new();
148
column = gtk_tree_view_column_new_with_attributes("Address", renderer, "text", 1, NULL);
149
gtk_tree_view_append_column(GTK_TREE_VIEW (sh2->view), column);
150
151
column = gtk_tree_view_column_new_with_attributes("Command", renderer, "text", 2, NULL);
152
gtk_tree_view_append_column(GTK_TREE_VIEW (sh2->view), column);
153
154
gtk_container_add(GTK_CONTAINER(scroll), sh2->view);
155
gtk_box_pack_start(GTK_BOX(sh2->hboxmain), scroll, TRUE, TRUE, 0);
156
}
157
158
if (sh2->breakpointEnabled) {
159
GtkWidget * menu = gtk_menu_new();
160
GtkWidget * item;
161
162
item = gtk_image_menu_item_new_from_stock(GTK_STOCK_ADD, NULL);
163
gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
164
g_signal_connect(item, "activate", G_CALLBACK(yui_sh_popup_add_bp), sh2);
165
166
item = gtk_image_menu_item_new_from_stock(GTK_STOCK_REMOVE, NULL);
167
gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
168
g_signal_connect(item, "activate", G_CALLBACK(yui_sh_popup_del_bp), sh2);
169
170
gtk_widget_show_all(menu);
171
172
g_signal_connect(sh2->view, "button-press-event", G_CALLBACK(yui_sh_popup), menu);
173
}
174
175
/* breakpoint list */
176
177
sh2->vboxBp = gtk_vbox_new(FALSE, 0);
178
gtk_box_pack_start( GTK_BOX( sh2->hboxmain ), sh2->vboxBp, FALSE, FALSE, 0 );
179
180
sh2->bpListStore = gtk_list_store_new(1,G_TYPE_STRING);
181
sh2->bpList = gtk_tree_view_new_with_model( GTK_TREE_MODEL(sh2->bpListStore) );
182
sh2->bpListRenderer = gtk_cell_renderer_text_new();
183
g_object_set(G_OBJECT(sh2->bpListRenderer), "editable", TRUE, "mode", GTK_CELL_RENDERER_MODE_EDITABLE, NULL );
184
sh2->bpListColumn = gtk_tree_view_column_new_with_attributes("Code breaks", sh2->bpListRenderer, "text", 0, NULL);
185
gtk_tree_view_append_column(GTK_TREE_VIEW(sh2->bpList), sh2->bpListColumn);
186
gtk_box_pack_start( GTK_BOX( sh2->vboxBp ), sh2->bpList, TRUE, TRUE, 0 );
187
g_signal_connect(G_OBJECT(sh2->bpListRenderer), "edited", GTK_SIGNAL_FUNC(yui_sh_editedBp), sh2 );
188
189
{
190
GtkWidget * bp_form_box;
191
GtkWidget * bp_input;
192
GtkWidget * bp_add;
193
194
bp_form_box = gtk_hbox_new(FALSE, 0);
195
gtk_box_pack_start(GTK_BOX(sh2->vboxBp), bp_form_box, FALSE, FALSE, 0);
196
197
bp_input = gtk_entry_new();
198
gtk_entry_set_width_chars(GTK_ENTRY(bp_input), 8);
199
g_signal_connect(bp_input, "activate", G_CALLBACK(yui_sh_bp_add), sh2);
200
gtk_box_pack_start(GTK_BOX(bp_form_box), bp_input, TRUE, TRUE, 0);
201
202
bp_add = gtk_button_new();
203
gtk_container_add(GTK_CONTAINER(bp_add), gtk_image_new_from_stock(GTK_STOCK_ADD, GTK_ICON_SIZE_BUTTON));
204
gtk_button_set_relief(GTK_BUTTON(bp_add), GTK_RELIEF_NONE);
205
g_signal_connect(bp_add, "clicked", G_CALLBACK(yui_sh_button_bp_add), bp_input);
206
gtk_box_pack_start(GTK_BOX(bp_form_box), bp_add, FALSE, FALSE, 0);
207
}
208
209
{
210
GtkWidget * bp_item;
211
sh2->bp_menu = gtk_menu_new();
212
213
bp_item = gtk_image_menu_item_new_from_stock(GTK_STOCK_REMOVE, NULL);
214
gtk_menu_shell_append(GTK_MENU_SHELL(sh2->bp_menu), bp_item);
215
g_signal_connect(bp_item, "activate", G_CALLBACK(yui_sh_bp_remove), sh2);
216
217
bp_item = gtk_image_menu_item_new_from_stock(GTK_STOCK_CLEAR, NULL);
218
gtk_menu_shell_append(GTK_MENU_SHELL(sh2->bp_menu), bp_item);
219
g_signal_connect(bp_item, "activate", G_CALLBACK(yui_sh_bp_clear), sh2);
220
221
gtk_widget_show_all(sh2->bp_menu);
222
223
g_signal_connect(sh2->bpList, "button-press-event", G_CALLBACK(yui_sh_bp_popup), sh2);
224
}
225
226
/* memory breakpoint list */
227
228
sh2->mbpListStore = gtk_list_store_new(2,G_TYPE_STRING,G_TYPE_STRING);
229
sh2->mbpList = gtk_tree_view_new_with_model( GTK_TREE_MODEL(sh2->mbpListStore) );
230
sh2->mbpListRenderer = gtk_cell_renderer_text_new();
231
g_object_set(G_OBJECT(sh2->mbpListRenderer), "editable", TRUE, "mode", GTK_CELL_RENDERER_MODE_EDITABLE, NULL );
232
sh2->mbpListColumn = gtk_tree_view_column_new_with_attributes("Memory breaks", sh2->mbpListRenderer, "text", 0, NULL);
233
gtk_tree_view_append_column(GTK_TREE_VIEW(sh2->mbpList), sh2->mbpListColumn);
234
235
{
236
GtkCellRenderer * flags_renderer;
237
GtkTreeViewColumn * flags_column;
238
239
flags_renderer = gtk_cell_renderer_text_new();
240
g_object_set(G_OBJECT(flags_renderer), "editable", TRUE, "mode", GTK_CELL_RENDERER_MODE_EDITABLE, NULL);
241
g_signal_connect(G_OBJECT(flags_renderer), "edited", GTK_SIGNAL_FUNC(yui_sh_editedMbpFlags), sh2 );
242
243
flags_column = gtk_tree_view_column_new_with_attributes("Flags", flags_renderer, "text", 1, NULL);
244
gtk_tree_view_append_column(GTK_TREE_VIEW(sh2->mbpList), flags_column);
245
}
246
247
gtk_box_pack_start( GTK_BOX( sh2->vboxBp ), sh2->mbpList, TRUE, TRUE, 0 );
248
g_signal_connect(G_OBJECT(sh2->mbpListRenderer), "edited", GTK_SIGNAL_FUNC(yui_sh_editedMbp), sh2 );
249
250
{
251
GtkWidget * mbp_item;
252
253
sh2->mbp_menu = gtk_menu_new();
254
255
sh2->mbp_menu_item[0] = gtk_check_menu_item_new_with_label("Byte read");
256
gtk_menu_shell_append(GTK_MENU_SHELL(sh2->mbp_menu), sh2->mbp_menu_item[0]);
257
g_signal_connect(sh2->mbp_menu_item[0], "activate", G_CALLBACK(yui_sh_mbp_toggle_flag), sh2);
258
259
sh2->mbp_menu_item[1] = gtk_check_menu_item_new_with_label("Word read");
260
gtk_menu_shell_append(GTK_MENU_SHELL(sh2->mbp_menu), sh2->mbp_menu_item[1]);
261
g_signal_connect(sh2->mbp_menu_item[1], "activate", G_CALLBACK(yui_sh_mbp_toggle_flag), sh2);
262
263
sh2->mbp_menu_item[2] = gtk_check_menu_item_new_with_label("Long read");
264
gtk_menu_shell_append(GTK_MENU_SHELL(sh2->mbp_menu), sh2->mbp_menu_item[2]);
265
g_signal_connect(sh2->mbp_menu_item[2], "activate", G_CALLBACK(yui_sh_mbp_toggle_flag), sh2);
266
267
sh2->mbp_menu_item[3] = gtk_check_menu_item_new_with_label("Byte write");
268
gtk_menu_shell_append(GTK_MENU_SHELL(sh2->mbp_menu), sh2->mbp_menu_item[3]);
269
g_signal_connect(sh2->mbp_menu_item[3], "activate", G_CALLBACK(yui_sh_mbp_toggle_flag), sh2);
270
271
sh2->mbp_menu_item[4] = gtk_check_menu_item_new_with_label("Word write");
272
gtk_menu_shell_append(GTK_MENU_SHELL(sh2->mbp_menu), sh2->mbp_menu_item[4]);
273
g_signal_connect(sh2->mbp_menu_item[4], "activate", G_CALLBACK(yui_sh_mbp_toggle_flag), sh2);
274
275
sh2->mbp_menu_item[5] = gtk_check_menu_item_new_with_label("Long write");
276
gtk_menu_shell_append(GTK_MENU_SHELL(sh2->mbp_menu), sh2->mbp_menu_item[5]);
277
g_signal_connect(sh2->mbp_menu_item[5], "activate", G_CALLBACK(yui_sh_mbp_toggle_flag), sh2);
278
279
gtk_menu_shell_append(GTK_MENU_SHELL(sh2->mbp_menu), gtk_separator_menu_item_new());
280
281
mbp_item = gtk_image_menu_item_new_from_stock(GTK_STOCK_REMOVE, NULL);
282
gtk_menu_shell_append(GTK_MENU_SHELL(sh2->mbp_menu), mbp_item);
283
g_signal_connect(mbp_item, "activate", G_CALLBACK(yui_sh_mbp_remove), sh2);
284
285
mbp_item = gtk_image_menu_item_new_from_stock(GTK_STOCK_CLEAR, NULL);
286
gtk_menu_shell_append(GTK_MENU_SHELL(sh2->mbp_menu), mbp_item);
287
g_signal_connect(mbp_item, "activate", G_CALLBACK(yui_sh_mbp_clear), sh2);
288
289
gtk_widget_show_all(sh2->mbp_menu);
290
291
g_signal_connect(sh2->mbpList, "button-press-event", G_CALLBACK(yui_sh_mbp_popup), sh2);
292
}
293
294
{
295
GtkWidget * bp_form_box;
296
GtkWidget * bp_input;
297
GtkWidget * bp_add;
298
299
bp_form_box = gtk_hbox_new(FALSE, 0);
300
gtk_box_pack_start(GTK_BOX(sh2->vboxBp), bp_form_box, FALSE, FALSE, 0);
301
302
bp_input = gtk_entry_new();
303
gtk_entry_set_width_chars(GTK_ENTRY(bp_input), 8);
304
g_signal_connect(bp_input, "activate", G_CALLBACK(yui_sh_mbp_add), sh2);
305
gtk_box_pack_start(GTK_BOX(bp_form_box), bp_input, TRUE, TRUE, 0);
306
307
bp_add = gtk_button_new();
308
gtk_container_add(GTK_CONTAINER(bp_add), gtk_image_new_from_stock(GTK_STOCK_ADD, GTK_ICON_SIZE_BUTTON));
309
gtk_button_set_relief(GTK_BUTTON(bp_add), GTK_RELIEF_NONE);
310
g_signal_connect(bp_add, "clicked", G_CALLBACK(yui_sh_button_bp_add), bp_input);
311
gtk_box_pack_start(GTK_BOX(bp_form_box), bp_add, FALSE, FALSE, 0);
312
}
313
314
g_signal_connect(G_OBJECT(sh2), "delete-event", GTK_SIGNAL_FUNC(yui_sh_destroy), NULL);
315
316
gtk_window_set_default_size(GTK_WINDOW(sh2), 650, -1);
317
}
318
319
320
static GtkWidget * yui_sh_new(YuiWindow * y, gboolean bMaster) {
321
GtkWidget * dialog;
322
GClosure *closureF7; //, *closureF8;
323
GtkAccelGroup *accelGroup;
324
YuiSh * sh2;
325
gint i;
326
yui = y;
327
328
if (!( yui->state & YUI_IS_INIT )) {
329
yui_window_run(yui);
330
yui_window_pause(yui);
331
}
332
333
if ( bMaster && yui_msh ) return GTK_WIDGET(yui_msh);
334
if ( !bMaster && yui_ssh ) return GTK_WIDGET(yui_ssh);
335
336
dialog = GTK_WIDGET(g_object_new(yui_sh_get_type(), NULL));
337
sh2 = YUI_SH(dialog);
338
339
//sh2->breakpointEnabled = MSH2->breakpointEnabled;
340
/*
341
if ( !sh2->breakpointEnabled )
342
gtk_box_pack_start( GTK_BOX( sh2->vboxmain ),
343
gtk_label_new("Breakpoints are disabled (fast interpreter)"), FALSE, FALSE, 4 );
344
*/
345
346
sh2->bMaster = bMaster;
347
sh2->debugsh = bMaster ? MSH2 : SSH2;
348
349
SH2SetBreakpointCallBack(sh2->debugsh, (void (*)(void *, u32))SH2BreakpointHandler);
350
351
gtk_window_set_title(GTK_WINDOW(sh2), bMaster?"Master SH2":"Slave SH2");
352
353
for (i = 0; i < 23 ; i++) {
354
355
GtkTreeIter iter;
356
gtk_list_store_append( GTK_LIST_STORE( sh2->regListStore ), &iter );
357
}
358
359
SH2UpdateBreakpointList(sh2);
360
361
SH2UpdateMemoryBreakpointList(sh2);
362
363
{
364
GtkToolItem * play_button, * pause_button;
365
366
play_button = gtk_tool_button_new_from_stock("run");
367
gtk_action_connect_proxy(gtk_action_group_get_action(yui->action_group, "run"), GTK_WIDGET(play_button));
368
gtk_toolbar_insert(GTK_TOOLBAR(sh2->toolbar), GTK_TOOL_ITEM(play_button), 0);
369
370
pause_button = gtk_tool_button_new_from_stock("pause");
371
gtk_action_connect_proxy(gtk_action_group_get_action(yui->action_group, "pause"), GTK_WIDGET(pause_button));
372
gtk_toolbar_insert(GTK_TOOLBAR(sh2->toolbar), GTK_TOOL_ITEM(pause_button), 1);
373
374
sh2->buttonStep = gtk_tool_button_new_from_stock(GTK_STOCK_GO_DOWN);
375
g_signal_connect(sh2->buttonStep, "clicked", G_CALLBACK(yui_sh_step), sh2);
376
gtk_toolbar_insert(GTK_TOOLBAR(sh2->toolbar), GTK_TOOL_ITEM(sh2->buttonStep), 2);
377
#if GTK_CHECK_VERSION(2,12,0)
378
gtk_widget_set_tooltip_text(GTK_WIDGET(sh2->buttonStep), "step");
379
#endif
380
}
381
382
sh2->paused_handler = g_signal_connect_swapped(yui, "paused", G_CALLBACK(yui_sh_update), sh2);
383
sh2->running_handler = g_signal_connect_swapped(yui, "running", G_CALLBACK(yui_sh_clear), sh2);
384
accelGroup = gtk_accel_group_new ();
385
closureF7 = g_cclosure_new (G_CALLBACK (yui_sh_step), sh2, NULL);
386
gtk_accel_group_connect( accelGroup, GDK_F7, 0, 0, closureF7 );
387
gtk_window_add_accel_group( GTK_WINDOW( dialog ), accelGroup );
388
389
yui_sh_update(sh2);
390
if ( yui->state & YUI_IS_RUNNING ) yui_sh_clear(sh2);
391
392
gtk_widget_show_all(GTK_WIDGET(sh2));
393
if ( !sh2->breakpointEnabled ) {
394
/*
395
gtk_widget_hide( sh2->bpList );
396
gtk_widget_hide( sh2->mbpList );
397
*/
398
gtk_widget_hide(sh2->vboxBp);
399
}
400
401
return dialog;
402
}
403
404
GtkWidget * yui_msh_new(YuiWindow * y) {
405
return GTK_WIDGET( yui_msh = YUI_SH(yui_sh_new( y, TRUE )) );
406
}
407
408
GtkWidget * yui_ssh_new(YuiWindow * y) {
409
return GTK_WIDGET( yui_ssh = YUI_SH(yui_sh_new( y, FALSE )) );
410
}
411
412
static void SH2UpdateRegList( YuiSh *sh2, sh2regs_struct *regs) {
413
/* refresh the registery list */
414
415
GtkTreeIter iter;
416
char regstr[32];
417
char valuestr[32];
418
int i;
419
420
for (i = 0; i < 16; i++) {
421
sprintf(regstr, "R%02d", i);
422
sprintf(valuestr, "%08X", (int)regs->R[i] );
423
if ( !i ) gtk_tree_model_get_iter_first( GTK_TREE_MODEL( sh2->regListStore ), &iter );
424
else gtk_tree_model_iter_next( GTK_TREE_MODEL( sh2->regListStore ), &iter );
425
gtk_list_store_set( GTK_LIST_STORE( sh2->regListStore ), &iter, 0, regstr, 1, valuestr, -1 );
426
}
427
428
#define SH2UPDATEREGLIST(rreg) \
429
gtk_tree_model_iter_next( GTK_TREE_MODEL( sh2->regListStore ), &iter ); \
430
sprintf(valuestr, "%08X", (int)regs->rreg); \
431
gtk_list_store_set( GTK_LIST_STORE( sh2->regListStore ), &iter, 0, #rreg, 1, valuestr, -1 );
432
433
SH2UPDATEREGLIST(SR.all);
434
SH2UPDATEREGLIST(GBR);
435
SH2UPDATEREGLIST(VBR);
436
SH2UPDATEREGLIST(MACH);
437
SH2UPDATEREGLIST(MACL);
438
SH2UPDATEREGLIST(PR);
439
SH2UPDATEREGLIST(PC);
440
}
441
442
static void sh2setRegister( YuiSh *sh2, int nReg, u32 value ) {
443
/* set register number <nReg> to value <value> in proc <sh2> */
444
445
sh2regs_struct sh2regs;
446
SH2GetRegisters(sh2->debugsh, &sh2regs);
447
448
if ( nReg < 16 ) sh2regs.R[nReg] = value;
449
switch ( nReg ) {
450
case 16: sh2regs.SR.all = value; break;
451
case 17: sh2regs.GBR = value; break;
452
case 18: sh2regs.VBR = value; break;
453
case 19: sh2regs.MACH = value; break;
454
case 20: sh2regs.MACL = value; break;
455
case 21: sh2regs.PR = value; break;
456
case 22: sh2regs.PC = value; break;
457
}
458
459
SH2SetRegisters(sh2->debugsh, &sh2regs);
460
}
461
462
void SH2UpdateBreakpointList(YuiSh * sh2) {
463
const codebreakpoint_struct *cbp;
464
int i;
465
466
gtk_list_store_clear(GTK_LIST_STORE( sh2->bpListStore ));
467
468
cbp = SH2GetBreakpointList(sh2->debugsh);
469
470
for (i = 0; i < MAX_BREAKPOINTS-1; i++) {
471
472
if (cbp[i].addr != 0xFFFFFFFF) {
473
gchar tempstr[20];
474
GtkTreeIter iter;
475
gtk_list_store_append( GTK_LIST_STORE( sh2->bpListStore ), &iter );
476
477
sprintf(tempstr, "%08X", (int)cbp[i].addr);
478
gtk_list_store_set( GTK_LIST_STORE( sh2->bpListStore ), &iter, 0, tempstr, -1 );
479
}
480
}
481
}
482
483
void SH2UpdateMemoryBreakpointList(YuiSh * sh2) {
484
const memorybreakpoint_struct *cmbp;
485
int i;
486
487
gtk_list_store_clear( sh2->mbpListStore );
488
489
cmbp = SH2GetMemoryBreakpointList(sh2->debugsh);
490
491
for (i = 0; i < MAX_BREAKPOINTS; i++) {
492
493
if (cmbp[i].addr != 0xFFFFFFFF) {
494
gchar tempstr[30];
495
gchar flagstr[30];
496
gchar *curs = flagstr;
497
u32 flags = cmbp[i].flags;
498
499
GtkTreeIter iter;
500
gtk_list_store_append( GTK_LIST_STORE( sh2->mbpListStore ), &iter );
501
502
sprintf(tempstr, "%08X", (int)cmbp[i].addr);
503
if ( flags & BREAK_BYTEREAD ) *(curs++) = 'b';
504
if ( flags & BREAK_WORDREAD ) *(curs++) = 'w';
505
if ( flags & BREAK_LONGREAD ) *(curs++) = 'l';
506
if ( flags & BREAK_BYTEWRITE ) *(curs++) = 'B';
507
if ( flags & BREAK_WORDWRITE ) *(curs++) = 'W';
508
if ( flags & BREAK_LONGWRITE ) *(curs++) = 'L';
509
*curs = 0;
510
511
gtk_list_store_set( GTK_LIST_STORE( sh2->mbpListStore ), &iter, 0, tempstr, -1 );
512
gtk_list_store_set( GTK_LIST_STORE( sh2->mbpListStore ), &iter, 1, flagstr, -1 );
513
}
514
}
515
}
516
517
static void SH2UpdateCodeList( YuiSh *sh2, u32 addr) {
518
/* refresh the assembler view. <addr> points the line to be highlighted. */
519
520
int i, j;
521
char lineBuf[64];
522
u32 offset;
523
GtkTreeIter iter;
524
unsigned int address;
525
char address_s[20];
526
char command_s[64];
527
codebreakpoint_struct *cbp;
528
529
gtk_list_store_clear(sh2->store);
530
531
if ( addr - sh2->lastCode >= 20*2 ) offset = addr - (8*2);
532
else offset = sh2->lastCode;
533
sh2->lastCode = offset;
534
535
cbp = SH2GetBreakpointList(sh2->debugsh);
536
537
for (i = 0; i < 24; i++) {
538
SH2Disasm(offset+2*i, MappedMemoryReadWord(offset+2*i), 0, lineBuf);
539
540
sscanf(lineBuf, "0x%8X: %[^\n]", &address, command_s);
541
sprintf(address_s, "0x%08X", address);
542
543
gtk_list_store_append(sh2->store, &iter);
544
if ( offset + 2*i == addr ) {
545
gtk_list_store_set(sh2->store, &iter, 0, GTK_STOCK_GO_FORWARD, -1);
546
} else {
547
for (j = 0;j < MAX_BREAKPOINTS - 1;j++) {
548
if (cbp[j].addr == address) {
549
gtk_list_store_set(sh2->store, &iter, 0, GTK_STOCK_STOP, -1);
550
}
551
}
552
}
553
554
gtk_list_store_set(sh2->store, &iter, 1, address_s, -1);
555
556
gtk_list_store_set(sh2->store, &iter, 2, command_s, -1);
557
}
558
}
559
560
static void yui_sh_step( GtkWidget* widget, YuiSh * sh2 ) {
561
562
SH2Step(sh2->debugsh);
563
yui_window_invalidate( yui ); /* update all dialogs, including us */
564
}
565
566
static void yui_sh_editedReg( GtkCellRendererText *cellrenderertext,
567
gchar *arg1,
568
gchar *arg2,
569
YuiSh *sh2) {
570
/* registry number <arg1> value has been set to <arg2> */
571
572
GtkTreeIter iter;
573
char bptext[10];
574
char *endptr;
575
int i = atoi(arg1);
576
u32 addr;
577
578
gtk_tree_model_get_iter_from_string( GTK_TREE_MODEL( sh2->regListStore ), &iter, arg1 );
579
addr = strtoul(arg2, &endptr, 16 );
580
if ( endptr - arg2 == strlen(arg2) ) {
581
582
sprintf(bptext, "%08X", (int)addr);
583
sh2setRegister( sh2, i, addr );
584
gtk_list_store_set( GTK_LIST_STORE( sh2->regListStore ), &iter, 1, bptext, -1 );
585
}
586
yui_window_invalidate( yui );
587
}
588
589
static void yui_sh_editedBp( GtkCellRendererText *cellrenderertext,
590
gchar *arg1,
591
gchar *arg2,
592
YuiSh *sh2) {
593
/* breakpoint <arg1> has been set to address <arg2> */
594
595
GtkTreeIter iter;
596
char *endptr;
597
unsigned int addr;
598
gchar * oldaddr_s;
599
unsigned int oldaddr;
600
601
gtk_tree_model_get_iter_from_string( GTK_TREE_MODEL( sh2->bpListStore ), &iter, arg1 );
602
603
gtk_tree_model_get(GTK_TREE_MODEL( sh2->bpListStore ), &iter, 0, &oldaddr_s, -1);
604
sscanf(oldaddr_s, "%8X", &oldaddr);
605
g_free(oldaddr_s);
606
607
SH2DelCodeBreakpoint(sh2->debugsh, oldaddr);
608
609
addr = strtoul(arg2, &endptr, 16 );
610
if ((endptr - arg2 < strlen(arg2)) || (!addr)) addr = 0xFFFFFFFF;
611
612
if (addr != 0xFFFFFFFF) {
613
SH2AddCodeBreakpoint(sh2->debugsh, addr);
614
}
615
616
{
617
sh2regs_struct sh2regs;
618
SH2GetRegisters(sh2->debugsh, &sh2regs);
619
SH2UpdateCodeList(sh2,sh2regs.PC);
620
SH2UpdateBreakpointList(sh2);
621
}
622
}
623
624
static void yui_sh_editedMbp( GtkCellRendererText *cellrenderertext,
625
gchar *arg1,
626
gchar *arg2,
627
YuiSh *sh2) {
628
/* breakpoint <arg1> has been set to address <arg2> */
629
630
GtkTreeIter iter;
631
gchar *endptr;
632
unsigned int addr;
633
gchar * oldaddr_s, * flags_s;
634
unsigned int oldaddr;
635
u32 flags;
636
637
gtk_tree_model_get_iter_from_string( GTK_TREE_MODEL( sh2->mbpListStore ), &iter, arg1 );
638
639
gtk_tree_model_get(GTK_TREE_MODEL( sh2->mbpListStore ), &iter, 0, &oldaddr_s, -1);
640
sscanf(oldaddr_s, "%8X", &oldaddr);
641
g_free(oldaddr_s);
642
643
gtk_tree_model_get(GTK_TREE_MODEL( sh2->mbpListStore ), &iter, 1, &flags_s, -1);
644
645
SH2DelMemoryBreakpoint(sh2->debugsh, oldaddr);
646
647
addr = strtoul(arg2, &endptr, 16 );
648
if (!addr) addr = 0xFFFFFFFF;
649
650
if (addr!=0xFFFFFFFF) {
651
652
flags = 0;
653
endptr = flags_s;
654
while ( *endptr ) {
655
656
switch (*endptr) {
657
658
case 'b': flags |= BREAK_BYTEREAD; break;
659
case 'w': flags |= BREAK_WORDREAD; break;
660
case 'l': flags |= BREAK_LONGREAD; break;
661
case 'B': flags |= BREAK_BYTEWRITE; break;
662
case 'W': flags |= BREAK_WORDWRITE; break;
663
case 'L': flags |= BREAK_LONGWRITE; break;
664
}
665
endptr++;
666
}
667
668
if ( !flags ) flags = BREAK_BYTEREAD|BREAK_WORDREAD|BREAK_LONGREAD|BREAK_BYTEWRITE|BREAK_WORDWRITE|BREAK_LONGWRITE;
669
SH2AddMemoryBreakpoint(sh2->debugsh, addr, flags);
670
}
671
672
SH2UpdateMemoryBreakpointList(sh2);
673
}
674
675
static void yui_sh_editedMbpFlags( GtkCellRendererText *cellrenderertext,
676
gchar *arg1,
677
gchar *arg2,
678
YuiSh *sh2) {
679
/* breakpoint <arg1> has been set to address <arg2> */
680
681
GtkTreeIter iter;
682
gchar *endptr;
683
unsigned int addr;
684
gchar * addr_s;
685
u32 flags = 0;
686
687
gtk_tree_model_get_iter_from_string( GTK_TREE_MODEL( sh2->mbpListStore ), &iter, arg1 );
688
689
gtk_tree_model_get(GTK_TREE_MODEL( sh2->mbpListStore ), &iter, 0, &addr_s, -1);
690
sscanf(addr_s, "%8X", &addr);
691
g_free(addr_s);
692
693
SH2DelMemoryBreakpoint(sh2->debugsh, addr);
694
695
endptr = arg2;
696
697
while ( *endptr ) {
698
699
switch (*endptr) {
700
701
case 'b': flags |= BREAK_BYTEREAD; break;
702
case 'w': flags |= BREAK_WORDREAD; break;
703
case 'l': flags |= BREAK_LONGREAD; break;
704
case 'B': flags |= BREAK_BYTEWRITE; break;
705
case 'W': flags |= BREAK_WORDWRITE; break;
706
case 'L': flags |= BREAK_LONGWRITE; break;
707
}
708
endptr++;
709
}
710
711
SH2AddMemoryBreakpoint(sh2->debugsh, addr, flags);
712
713
SH2UpdateMemoryBreakpointList(sh2);
714
}
715
716
static void debugPauseLoop(void) { /* secondary gtk event loop for the "breakpoint pause" state */
717
718
while ( !(yui->state & YUI_IS_RUNNING) )
719
if ( gtk_main_iteration() ) return;
720
}
721
722
static void SH2BreakpointHandler (SH2_struct *context, u32 addr) {
723
724
yui_window_pause(yui);
725
{
726
sh2regs_struct sh2regs;
727
YuiSh* sh2 = YUI_SH(yui_sh_new( yui, context == MSH2 ));
728
729
SH2GetRegisters(sh2->debugsh, &sh2regs);
730
SH2UpdateRegList(sh2, &sh2regs);
731
SH2UpdateCodeList(sh2, sh2regs.PC);
732
}
733
debugPauseLoop(); /* execution is suspended inside a normal cycle - enter secondary gtk loop */
734
}
735
736
737
void yui_sh_update(YuiSh * sh) {
738
sh2regs_struct sh2regs;
739
SH2GetRegisters(sh->debugsh, &sh2regs);
740
SH2UpdateCodeList(sh,sh2regs.PC);
741
SH2UpdateRegList(sh, &sh2regs);
742
gtk_widget_set_sensitive(sh->bpList, TRUE);
743
gtk_widget_set_sensitive(sh->mbpList, TRUE);
744
gtk_widget_set_sensitive(sh->regList, TRUE);
745
gtk_widget_set_sensitive(GTK_WIDGET(sh->buttonStep),
746
!sh->debugsh->isIdle && !(( sh->debugsh == SSH2 )&&( !yabsys.IsSSH2Running )));
747
}
748
749
void yui_sh_destroy(YuiSh * sh) {
750
g_signal_handler_disconnect(yui, sh->running_handler);
751
g_signal_handler_disconnect(yui, sh->paused_handler);
752
753
if ( sh->bMaster ) yui_msh = NULL;
754
else yui_ssh = NULL;
755
756
gtk_widget_destroy(GTK_WIDGET(sh));
757
}
758
759
static void yui_sh_clear(YuiSh * sh) {
760
761
gtk_widget_set_sensitive(sh->bpList, FALSE);
762
gtk_widget_set_sensitive(sh->mbpList, FALSE);
763
gtk_widget_set_sensitive(sh->regList, FALSE);
764
gtk_widget_set_sensitive(GTK_WIDGET(sh->buttonStep), FALSE);
765
766
gtk_list_store_clear(sh->store);
767
}
768
769
gint yui_sh_popup(GtkWidget * widget, GdkEvent * event, gpointer data)
770
{
771
GtkMenu *menu;
772
GdkEventButton *event_button;
773
774
g_return_val_if_fail (data != NULL, FALSE);
775
g_return_val_if_fail (GTK_IS_MENU (data), FALSE);
776
g_return_val_if_fail (event != NULL, FALSE);
777
778
menu = GTK_MENU(data);
779
780
if (event->type == GDK_BUTTON_PRESS) {
781
event_button = (GdkEventButton *) event;
782
if (event_button->button == 3) {
783
gtk_menu_popup (menu, NULL, NULL, NULL, NULL, event_button->button, event_button->time);
784
}
785
}
786
787
return FALSE;
788
}
789
790
void yui_sh_popup_add_bp(GtkMenuItem * menuitem, gpointer user_data) {
791
YuiSh * sh2 = user_data;
792
GtkTreeView * view = GTK_TREE_VIEW(sh2->view);
793
GtkTreeSelection * selection;
794
GtkTreeModel * model;
795
GtkTreeIter iter;
796
gchar * address_s;
797
unsigned int address;
798
799
selection = gtk_tree_view_get_selection(view);
800
801
gtk_tree_selection_get_selected(selection, &model, &iter);
802
803
gtk_tree_model_get(model, &iter, 1, &address_s, -1);
804
805
sscanf(address_s, "0x%08X", &address);
806
807
SH2AddCodeBreakpoint(sh2->debugsh, address);
808
809
g_free(address_s);
810
811
{
812
sh2regs_struct sh2regs;
813
SH2GetRegisters(sh2->debugsh, &sh2regs);
814
SH2UpdateCodeList(sh2,sh2regs.PC);
815
SH2UpdateBreakpointList(sh2);
816
}
817
}
818
819
void yui_sh_popup_del_bp(GtkMenuItem * menuitem, gpointer user_data) {
820
YuiSh * sh2 = user_data;
821
GtkTreeView * view = GTK_TREE_VIEW(sh2->view);
822
GtkTreeSelection * selection;
823
GtkTreeModel * model;
824
GtkTreeIter iter;
825
gchar * address_s;
826
unsigned int address;
827
828
selection = gtk_tree_view_get_selection(view);
829
830
gtk_tree_selection_get_selected(selection, &model, &iter);
831
832
gtk_tree_model_get(model, &iter, 1, &address_s, -1);
833
834
sscanf(address_s, "0x%08X", &address);
835
836
SH2DelCodeBreakpoint(sh2->debugsh, address);
837
838
g_free(address_s);
839
840
{
841
sh2regs_struct sh2regs;
842
SH2GetRegisters(sh2->debugsh, &sh2regs);
843
SH2UpdateCodeList(sh2,sh2regs.PC);
844
SH2UpdateBreakpointList(sh2);
845
}
846
}
847
848
static void yui_sh_bp_add(GtkEntry * entry, gpointer user_data) {
849
YuiSh * sh2 = user_data;
850
const gchar * address_s;
851
unsigned int address;
852
853
address_s = gtk_entry_get_text(entry);
854
855
if (*address_s == 0) return;
856
857
sscanf(address_s, "%8X", &address);
858
859
SH2AddCodeBreakpoint(sh2->debugsh, address);
860
861
gtk_entry_set_text(entry, "");
862
863
{
864
sh2regs_struct sh2regs;
865
SH2GetRegisters(sh2->debugsh, &sh2regs);
866
SH2UpdateCodeList(sh2,sh2regs.PC);
867
SH2UpdateBreakpointList(sh2);
868
}
869
}
870
871
static void yui_sh_button_bp_add(GtkWidget * widget, gpointer user_data) {
872
g_signal_emit_by_name(user_data, "activate");
873
}
874
875
static void yui_sh_mbp_add(GtkEntry * entry, gpointer user_data) {
876
YuiSh * sh2 = user_data;
877
const gchar * address_s;
878
unsigned int address;
879
880
address_s = gtk_entry_get_text(entry);
881
882
if (*address_s == 0) return;
883
884
sscanf(address_s, "%8X", &address);
885
886
SH2AddMemoryBreakpoint(sh2->debugsh, address, BREAK_BYTEREAD|BREAK_WORDREAD|BREAK_LONGREAD|BREAK_BYTEWRITE|BREAK_WORDWRITE|BREAK_LONGWRITE);
887
888
gtk_entry_set_text(entry, "");
889
890
SH2UpdateMemoryBreakpointList(sh2);
891
}
892
893
gint yui_sh_mbp_popup(GtkWidget * widget, GdkEventButton * event, gpointer data)
894
{
895
GtkMenu *menu;
896
GdkEventButton *event_button;
897
YuiSh * sh2 = data;
898
GtkTreeView * view;
899
GtkTreeSelection * selection;
900
GtkTreeIter iter;
901
GtkTreeModel * model;
902
gchar * flags_s;
903
char *endptr;
904
int i;
905
guint signal_id;
906
907
g_return_val_if_fail (data != NULL, FALSE);
908
g_return_val_if_fail (event != NULL, FALSE);
909
910
view = GTK_TREE_VIEW(sh2->mbpList);
911
menu = GTK_MENU(sh2->mbp_menu);
912
913
if (event->type == GDK_BUTTON_PRESS) {
914
event_button = (GdkEventButton *) event;
915
if (event_button->button == 3) {
916
917
GtkTreePath *path;
918
919
selection = gtk_tree_view_get_selection(view);
920
921
if (gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(view), event->x, event->y, &path, NULL, NULL, NULL)) {
922
gtk_tree_selection_unselect_all(selection);
923
gtk_tree_selection_select_path(selection, path);
924
gtk_tree_path_free(path);
925
}
926
927
gtk_tree_selection_get_selected(selection, &model, &iter);
928
929
if (gtk_tree_selection_count_selected_rows(selection) == 0) return FALSE;
930
931
gtk_tree_model_get(model, &iter, 1, &flags_s, -1);
932
933
signal_id = g_signal_lookup("activate", GTK_TYPE_CHECK_MENU_ITEM);
934
935
for(i = 0;i < 6;i++) g_signal_handlers_block_matched(sh2->mbp_menu_item[i], G_SIGNAL_MATCH_DATA, signal_id, 0, NULL, NULL, sh2);
936
937
for(i = 0;i < 6;i++) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(sh2->mbp_menu_item[i]), FALSE);
938
939
endptr = flags_s;
940
while ( *endptr ) {
941
switch (*endptr) {
942
943
case 'b': gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(sh2->mbp_menu_item[0]), TRUE); break;
944
case 'w': gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(sh2->mbp_menu_item[1]), TRUE); break;
945
case 'l': gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(sh2->mbp_menu_item[2]), TRUE); break;
946
case 'B': gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(sh2->mbp_menu_item[3]), TRUE); break;
947
case 'W': gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(sh2->mbp_menu_item[4]), TRUE); break;
948
case 'L': gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(sh2->mbp_menu_item[5]), TRUE); break;
949
}
950
endptr++;
951
}
952
953
for(i = 0;i < 6;i++) g_signal_handlers_unblock_matched(sh2->mbp_menu_item[i], G_SIGNAL_MATCH_DATA, signal_id, 0, NULL, NULL, sh2);
954
955
gtk_menu_popup (menu, NULL, NULL, NULL, NULL, event_button->button, event_button->time);
956
}
957
}
958
959
return FALSE;
960
}
961
962
void yui_sh_mbp_toggle_flag(GtkWidget * menuitem, gpointer user_data) {
963
GtkTreeSelection * selection;
964
YuiSh * sh2 = user_data;
965
GtkTreeIter iter;
966
GtkTreeModel * model;
967
gchar * address_s, * flags_s;
968
unsigned int address;
969
u32 flags;
970
GtkTreeView * view;
971
char *endptr;
972
973
view = GTK_TREE_VIEW(sh2->mbpList);
974
975
selection = gtk_tree_view_get_selection(view);
976
977
gtk_tree_selection_get_selected(selection, &model, &iter);
978
979
gtk_tree_model_get(model, &iter, 0, &address_s, -1);
980
gtk_tree_model_get(model, &iter, 1, &flags_s, -1);
981
sscanf(address_s, "%8X", &address);
982
983
SH2DelMemoryBreakpoint(sh2->debugsh, address);
984
985
flags = 0;
986
endptr = flags_s;
987
while ( *endptr ) {
988
switch (*endptr) {
989
case 'b': flags |= BREAK_BYTEREAD; break;
990
case 'w': flags |= BREAK_WORDREAD; break;
991
case 'l': flags |= BREAK_LONGREAD; break;
992
case 'B': flags |= BREAK_BYTEWRITE; break;
993
case 'W': flags |= BREAK_WORDWRITE; break;
994
case 'L': flags |= BREAK_LONGWRITE; break;
995
}
996
endptr++;
997
}
998
999
if (menuitem == sh2->mbp_menu_item[0]) flags = (flags & ~BREAK_BYTEREAD) | (~flags & BREAK_BYTEREAD);
1000
if (menuitem == sh2->mbp_menu_item[1]) flags = (flags & ~BREAK_WORDREAD) | (~flags & BREAK_WORDREAD);
1001
if (menuitem == sh2->mbp_menu_item[2]) flags = (flags & ~BREAK_LONGREAD) | (~flags & BREAK_LONGREAD);
1002
if (menuitem == sh2->mbp_menu_item[3]) flags = (flags & ~BREAK_BYTEWRITE) | (~flags & BREAK_BYTEWRITE);
1003
if (menuitem == sh2->mbp_menu_item[4]) flags = (flags & ~BREAK_WORDWRITE) | (~flags & BREAK_WORDWRITE);
1004
if (menuitem == sh2->mbp_menu_item[5]) flags = (flags & ~BREAK_LONGWRITE) | (~flags & BREAK_LONGWRITE);
1005
1006
SH2AddMemoryBreakpoint(sh2->debugsh, address, flags);
1007
1008
SH2UpdateMemoryBreakpointList(sh2);
1009
}
1010
1011
void yui_sh_mbp_remove(GtkWidget * menuitem, gpointer user_data) {
1012
GtkTreeSelection * selection;
1013
YuiSh * sh2 = user_data;
1014
GtkTreeIter iter;
1015
GtkTreeModel * model;
1016
gchar * address_s;
1017
unsigned int address;
1018
GtkTreeView * view;
1019
1020
view = GTK_TREE_VIEW(sh2->mbpList);
1021
1022
selection = gtk_tree_view_get_selection(view);
1023
1024
gtk_tree_selection_get_selected(selection, &model, &iter);
1025
1026
gtk_tree_model_get(model, &iter, 0, &address_s, -1);
1027
sscanf(address_s, "%8X", &address);
1028
1029
SH2DelMemoryBreakpoint(sh2->debugsh, address);
1030
1031
SH2UpdateMemoryBreakpointList(sh2);
1032
}
1033
1034
void yui_sh_mbp_clear(GtkWidget * menuitem, gpointer user_data) {
1035
YuiSh * sh2 = user_data;
1036
1037
SH2ClearMemoryBreakpoints(sh2->debugsh);
1038
1039
SH2UpdateMemoryBreakpointList(sh2);
1040
}
1041
1042
gint yui_sh_bp_popup(GtkWidget * widget, GdkEventButton * event, gpointer data)
1043
{
1044
GtkMenu *menu;
1045
GdkEventButton *event_button;
1046
YuiSh * sh2 = data;
1047
1048
g_return_val_if_fail (data != NULL, FALSE);
1049
g_return_val_if_fail (event != NULL, FALSE);
1050
1051
menu = GTK_MENU(sh2->bp_menu);
1052
1053
if (event->type == GDK_BUTTON_PRESS) {
1054
event_button = (GdkEventButton *) event;
1055
if (event_button->button == 3) {
1056
gtk_menu_popup (menu, NULL, NULL, NULL, NULL, event_button->button, event_button->time);
1057
}
1058
}
1059
1060
return FALSE;
1061
}
1062
1063
void yui_sh_bp_remove(GtkWidget * menuitem, gpointer user_data) {
1064
GtkTreeSelection * selection;
1065
YuiSh * sh2 = user_data;
1066
GtkTreeIter iter;
1067
GtkTreeModel * model;
1068
gchar * address_s;
1069
unsigned int address;
1070
GtkTreeView * view;
1071
1072
view = GTK_TREE_VIEW(sh2->bpList);
1073
1074
selection = gtk_tree_view_get_selection(view);
1075
1076
gtk_tree_selection_get_selected(selection, &model, &iter);
1077
1078
gtk_tree_model_get(model, &iter, 0, &address_s, -1);
1079
sscanf(address_s, "%8X", &address);
1080
1081
SH2DelCodeBreakpoint(sh2->debugsh, address);
1082
1083
{
1084
sh2regs_struct sh2regs;
1085
SH2GetRegisters(sh2->debugsh, &sh2regs);
1086
SH2UpdateCodeList(sh2,sh2regs.PC);
1087
SH2UpdateBreakpointList(sh2);
1088
}
1089
}
1090
1091
void yui_sh_bp_clear(GtkWidget * menuitem, gpointer user_data) {
1092
YuiSh * sh2 = user_data;
1093
1094
SH2ClearCodeBreakpoints(sh2->debugsh);
1095
1096
{
1097
sh2regs_struct sh2regs;
1098
SH2GetRegisters(sh2->debugsh, &sh2regs);
1099
SH2UpdateCodeList(sh2,sh2regs.PC);
1100
SH2UpdateBreakpointList(sh2);
1101
}
1102
}
1103
1104