diff options
author | 2010-01-26 01:27:35 +0000 | |
---|---|---|
committer | 2010-01-26 01:27:35 +0000 | |
commit | 8afbfd9dca8a4eb2e579537052bc6e7fd35f3dd1 (patch) | |
tree | 3ac633d07937f979e0c89bf2f5f80e92f185692e | |
parent | 50aaf76de197490f6bf2287135a6b5e067121709 (diff) |
GTK-Debugger
- Functionality now matches win32 debugger
- Further code review/rewrite/simplification
- Added more comment headings
-rw-r--r-- | src/osd/sdl/debug-cb.h | 8 | ||||
-rw-r--r-- | src/osd/sdl/debug-cb.ign | 208 | ||||
-rw-r--r-- | src/osd/sdl/debug-intf.c | 85 | ||||
-rw-r--r-- | src/osd/sdl/debug.glade | 62 | ||||
-rw-r--r-- | src/osd/sdl/debugwin.c | 677 | ||||
-rw-r--r-- | src/osd/sdl/dview.c | 4 | ||||
-rw-r--r-- | src/osd/sdl/dview.h | 5 |
7 files changed, 834 insertions, 215 deletions
diff --git a/src/osd/sdl/debug-cb.h b/src/osd/sdl/debug-cb.h index cfc7fc98079..cac0e5c5041 100644 --- a/src/osd/sdl/debug-cb.h +++ b/src/osd/sdl/debug-cb.h @@ -84,6 +84,8 @@ dview_new (const gchar *widget_name, const gchar *string1, const gchar *string2, void on_run_to_cursor_activate (GtkWidget *win); +void +on_set_breakpoint_at_cursor_activate (GtkWidget *win); gboolean on_disasm_button_press_event (GtkWidget *widget, @@ -100,3 +102,9 @@ on_memoryview_key_press_event (GtkWidget *widget, GdkEventKey *event, gpointer user_data); +void +on_logical_addresses_group_changed (GtkWidget *win); + +void +on_physical_addresses_group_changed (GtkWidget *win); + diff --git a/src/osd/sdl/debug-cb.ign b/src/osd/sdl/debug-cb.ign index 18226076b77..83f9b3e276d 100644 --- a/src/osd/sdl/debug-cb.ign +++ b/src/osd/sdl/debug-cb.ign @@ -844,3 +844,211 @@ dview_new (gchar *widget_name, gchar *string1, gchar *string2, } + +GtkWidget* +dview_new (gchar *widget_name, gchar *string1, gchar *string2, + gint int1, gint int2) +{ + +} + + +GtkWidget* +dview_new (gchar *widget_name, gchar *string1, gchar *string2, + gint int1, gint int2) +{ + +} + + +GtkWidget* +dview_new (gchar *widget_name, gchar *string1, gchar *string2, + gint int1, gint int2) +{ + +} + + +GtkWidget* +dview_new (gchar *widget_name, gchar *string1, gchar *string2, + gint int1, gint int2) +{ + +} + + +GtkWidget* +dview_new (gchar *widget_name, gchar *string1, gchar *string2, + gint int1, gint int2) +{ + +} + + +GtkWidget* +dview_new (gchar *widget_name, gchar *string1, gchar *string2, + gint int1, gint int2) +{ + +} + + +GtkWidget* +dview_new (gchar *widget_name, gchar *string1, gchar *string2, + gint int1, gint int2) +{ + +} + + +GtkWidget* +dview_new (gchar *widget_name, gchar *string1, gchar *string2, + gint int1, gint int2) +{ + +} + + +GtkWidget* +dview_new (gchar *widget_name, gchar *string1, gchar *string2, + gint int1, gint int2) +{ + +} + + +void +on_logical_addresses_group_changed (GtkRadioMenuItem *radiomenuitem, + gpointer user_data) +{ + +} + + +GtkWidget* +dview_new (gchar *widget_name, gchar *string1, gchar *string2, + gint int1, gint int2) +{ + +} + + +GtkWidget* +dview_new (gchar *widget_name, gchar *string1, gchar *string2, + gint int1, gint int2) +{ + +} + + +GtkWidget* +dview_new (gchar *widget_name, gchar *string1, gchar *string2, + gint int1, gint int2) +{ + +} + + +void +on_physical_addresses_group_changed (GtkRadioMenuItem *radiomenuitem, + gpointer user_data) +{ + +} + + +GtkWidget* +dview_new (gchar *widget_name, gchar *string1, gchar *string2, + gint int1, gint int2) +{ + +} + + +GtkWidget* +dview_new (gchar *widget_name, gchar *string1, gchar *string2, + gint int1, gint int2) +{ + +} + + +GtkWidget* +dview_new (gchar *widget_name, gchar *string1, gchar *string2, + gint int1, gint int2) +{ + +} + + +GtkWidget* +dview_new (gchar *widget_name, gchar *string1, gchar *string2, + gint int1, gint int2) +{ + +} + + +GtkWidget* +dview_new (gchar *widget_name, gchar *string1, gchar *string2, + gint int1, gint int2) +{ + +} + + +GtkWidget* +dview_new (gchar *widget_name, gchar *string1, gchar *string2, + gint int1, gint int2) +{ + +} + + +GtkWidget* +dview_new (gchar *widget_name, gchar *string1, gchar *string2, + gint int1, gint int2) +{ + +} + + +GtkWidget* +dview_new (gchar *widget_name, gchar *string1, gchar *string2, + gint int1, gint int2) +{ + +} + + +GtkWidget* +dview_new (gchar *widget_name, gchar *string1, gchar *string2, + gint int1, gint int2) +{ + +} + + +GtkWidget* +dview_new (gchar *widget_name, gchar *string1, gchar *string2, + gint int1, gint int2) +{ + +} + + +GtkWidget* +dview_new (gchar *widget_name, gchar *string1, gchar *string2, + gint int1, gint int2) +{ + +} + + +GtkWidget* +dview_new (gchar *widget_name, gchar *string1, gchar *string2, + gint int1, gint int2) +{ + +} + diff --git a/src/osd/sdl/debug-intf.c b/src/osd/sdl/debug-intf.c index 1c824a8108e..451472d4955 100644 --- a/src/osd/sdl/debug-intf.c +++ b/src/osd/sdl/debug-intf.c @@ -53,6 +53,7 @@ create_debugmain (void) GtkWidget *exit; GtkWidget *item1; GtkWidget *item1_menu; + GtkWidget *set_breakpoint_at_cursor; GtkWidget *run_to_cursor; GtkWidget *separator7; GSList *raw_opcodes_group = NULL; @@ -229,10 +230,18 @@ create_debugmain (void) gtk_widget_set_name (item1_menu, "item1_menu"); gtk_menu_item_set_submenu (GTK_MENU_ITEM (item1), item1_menu); + set_breakpoint_at_cursor = gtk_menu_item_new_with_mnemonic ("Set breakpoint at cursor"); + gtk_widget_set_name (set_breakpoint_at_cursor, "set_breakpoint_at_cursor"); + gtk_widget_show (set_breakpoint_at_cursor); + gtk_container_add (GTK_CONTAINER (item1_menu), set_breakpoint_at_cursor); + run_to_cursor = gtk_menu_item_new_with_mnemonic ("Run to cursor"); gtk_widget_set_name (run_to_cursor, "run_to_cursor"); gtk_widget_show (run_to_cursor); gtk_container_add (GTK_CONTAINER (item1_menu), run_to_cursor); + gtk_widget_add_accelerator (run_to_cursor, "activate", accel_group, + GDK_F4, (GdkModifierType) 0, + GTK_ACCEL_VISIBLE); separator7 = gtk_separator_menu_item_new (); gtk_widget_set_name (separator7, "separator7"); @@ -349,6 +358,9 @@ create_debugmain (void) g_signal_connect_swapped ((gpointer) exit, "activate", G_CALLBACK (on_exit_activate), GTK_OBJECT (debugmain)); + g_signal_connect_swapped ((gpointer) set_breakpoint_at_cursor, "activate", + G_CALLBACK (on_set_breakpoint_at_cursor_activate), + GTK_OBJECT (debugmain)); g_signal_connect_swapped ((gpointer) run_to_cursor, "activate", G_CALLBACK (on_run_to_cursor_activate), GTK_OBJECT (debugmain)); @@ -390,6 +402,7 @@ create_debugmain (void) GLADE_HOOKUP_OBJECT (debugmain, exit, "exit"); GLADE_HOOKUP_OBJECT (debugmain, item1, "item1"); GLADE_HOOKUP_OBJECT (debugmain, item1_menu, "item1_menu"); + GLADE_HOOKUP_OBJECT (debugmain, set_breakpoint_at_cursor, "set_breakpoint_at_cursor"); GLADE_HOOKUP_OBJECT (debugmain, run_to_cursor, "run_to_cursor"); GLADE_HOOKUP_OBJECT (debugmain, separator7, "separator7"); GLADE_HOOKUP_OBJECT (debugmain, raw_opcodes, "raw_opcodes"); @@ -440,6 +453,10 @@ create_memorywin (void) GtkWidget *chunks_2; GtkWidget *chunks_4; GtkWidget *separator5; + GSList *logical_addresses_group = NULL; + GtkWidget *logical_addresses; + GtkWidget *physical_addresses; + GtkWidget *separatormenuitem1; GtkWidget *reverse; GtkWidget *separator6; GtkWidget *ibpl; @@ -629,7 +646,6 @@ create_memorywin (void) gtk_widget_add_accelerator (chunks_2, "activate", accel_group, GDK_2, (GdkModifierType) GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE); - gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (chunks_2), TRUE); chunks_4 = gtk_radio_menu_item_new_with_mnemonic (chunks_1_group, "4-bytes chunks"); chunks_1_group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (chunks_4)); @@ -639,7 +655,6 @@ create_memorywin (void) gtk_widget_add_accelerator (chunks_4, "activate", accel_group, GDK_4, (GdkModifierType) GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE); - gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (chunks_4), TRUE); separator5 = gtk_separator_menu_item_new (); gtk_widget_set_name (separator5, "separator5"); @@ -647,6 +662,32 @@ create_memorywin (void) gtk_container_add (GTK_CONTAINER (options_menu), separator5); gtk_widget_set_sensitive (separator5, FALSE); + logical_addresses = gtk_radio_menu_item_new_with_mnemonic (logical_addresses_group, "Logical Addresses"); + logical_addresses_group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (logical_addresses)); + gtk_widget_set_name (logical_addresses, "logical_addresses"); + gtk_widget_show (logical_addresses); + gtk_container_add (GTK_CONTAINER (options_menu), logical_addresses); + gtk_widget_add_accelerator (logical_addresses, "activate", accel_group, + GDK_l, (GdkModifierType) GDK_CONTROL_MASK, + GTK_ACCEL_VISIBLE); + gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (logical_addresses), TRUE); + + physical_addresses = gtk_radio_menu_item_new_with_mnemonic (logical_addresses_group, "Physical Addresses"); + logical_addresses_group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (physical_addresses)); + gtk_widget_set_name (physical_addresses, "physical_addresses"); + gtk_widget_show (physical_addresses); + gtk_container_add (GTK_CONTAINER (options_menu), physical_addresses); + gtk_widget_add_accelerator (physical_addresses, "activate", accel_group, + GDK_y, (GdkModifierType) GDK_CONTROL_MASK, + GTK_ACCEL_VISIBLE); + gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (physical_addresses), TRUE); + + separatormenuitem1 = gtk_separator_menu_item_new (); + gtk_widget_set_name (separatormenuitem1, "separatormenuitem1"); + gtk_widget_show (separatormenuitem1); + gtk_container_add (GTK_CONTAINER (options_menu), separatormenuitem1); + gtk_widget_set_sensitive (separatormenuitem1, FALSE); + reverse = gtk_check_menu_item_new_with_mnemonic ("Reverse View"); gtk_widget_set_name (reverse, "reverse"); gtk_widget_show (reverse); @@ -751,6 +792,12 @@ create_memorywin (void) g_signal_connect_swapped ((gpointer) chunks_4, "activate", G_CALLBACK (on_chunks_4_activate), GTK_OBJECT (memorywin)); + g_signal_connect_swapped ((gpointer) logical_addresses, "group_changed", + G_CALLBACK (on_logical_addresses_group_changed), + GTK_OBJECT (memorywin)); + g_signal_connect_swapped ((gpointer) physical_addresses, "group_changed", + G_CALLBACK (on_physical_addresses_group_changed), + GTK_OBJECT (memorywin)); g_signal_connect_swapped ((gpointer) reverse, "activate", G_CALLBACK (on_reverse_activate), GTK_OBJECT (memorywin)); @@ -796,6 +843,9 @@ create_memorywin (void) GLADE_HOOKUP_OBJECT (memorywin, chunks_2, "chunks_2"); GLADE_HOOKUP_OBJECT (memorywin, chunks_4, "chunks_4"); GLADE_HOOKUP_OBJECT (memorywin, separator5, "separator5"); + GLADE_HOOKUP_OBJECT (memorywin, logical_addresses, "logical_addresses"); + GLADE_HOOKUP_OBJECT (memorywin, physical_addresses, "physical_addresses"); + GLADE_HOOKUP_OBJECT (memorywin, separatormenuitem1, "separatormenuitem1"); GLADE_HOOKUP_OBJECT (memorywin, reverse, "reverse"); GLADE_HOOKUP_OBJECT (memorywin, separator6, "separator6"); GLADE_HOOKUP_OBJECT (memorywin, ibpl, "ibpl"); @@ -837,6 +887,9 @@ create_disasmwin (void) GtkWidget *menuitem19; GtkWidget *menuitem20; GtkWidget *menuitem20_menu; + GtkWidget *set_breakpoint_at_cursor; + GtkWidget *run_to_cursor1; + GtkWidget *separatormenuitem4; GSList *raw_opcodes_group = NULL; GtkWidget *raw_opcodes; GtkWidget *enc_opcodes; @@ -1008,6 +1061,25 @@ create_disasmwin (void) gtk_widget_set_name (menuitem20_menu, "menuitem20_menu"); gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem20), menuitem20_menu); + set_breakpoint_at_cursor = gtk_menu_item_new_with_mnemonic ("Set breakpoint at cursor"); + gtk_widget_set_name (set_breakpoint_at_cursor, "set_breakpoint_at_cursor"); + gtk_widget_show (set_breakpoint_at_cursor); + gtk_container_add (GTK_CONTAINER (menuitem20_menu), set_breakpoint_at_cursor); + + run_to_cursor1 = gtk_menu_item_new_with_mnemonic ("Run to cursor"); + gtk_widget_set_name (run_to_cursor1, "run_to_cursor1"); + gtk_widget_show (run_to_cursor1); + gtk_container_add (GTK_CONTAINER (menuitem20_menu), run_to_cursor1); + gtk_widget_add_accelerator (run_to_cursor1, "activate", accel_group, + GDK_F4, (GdkModifierType) 0, + GTK_ACCEL_VISIBLE); + + separatormenuitem4 = gtk_separator_menu_item_new (); + gtk_widget_set_name (separatormenuitem4, "separatormenuitem4"); + gtk_widget_show (separatormenuitem4); + gtk_container_add (GTK_CONTAINER (menuitem20_menu), separatormenuitem4); + gtk_widget_set_sensitive (separatormenuitem4, FALSE); + raw_opcodes = gtk_radio_menu_item_new_with_mnemonic (raw_opcodes_group, "Raw Opcodes"); raw_opcodes_group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (raw_opcodes)); gtk_widget_set_name (raw_opcodes, "raw_opcodes"); @@ -1103,6 +1175,12 @@ create_disasmwin (void) g_signal_connect_swapped ((gpointer) menuitem19, "activate", G_CALLBACK (on_exit_activate), GTK_OBJECT (disasmwin)); + g_signal_connect_swapped ((gpointer) set_breakpoint_at_cursor, "activate", + G_CALLBACK (on_set_breakpoint_at_cursor_activate), + GTK_OBJECT (disasmwin)); + g_signal_connect_swapped ((gpointer) run_to_cursor1, "activate", + G_CALLBACK (on_run_to_cursor_activate), + GTK_OBJECT (disasmwin)); g_signal_connect_swapped ((gpointer) raw_opcodes, "activate", G_CALLBACK (on_raw_opcodes_activate), GTK_OBJECT (disasmwin)); @@ -1141,6 +1219,9 @@ create_disasmwin (void) GLADE_HOOKUP_OBJECT (disasmwin, menuitem19, "menuitem19"); GLADE_HOOKUP_OBJECT (disasmwin, menuitem20, "menuitem20"); GLADE_HOOKUP_OBJECT (disasmwin, menuitem20_menu, "menuitem20_menu"); + GLADE_HOOKUP_OBJECT (disasmwin, set_breakpoint_at_cursor, "set_breakpoint_at_cursor"); + GLADE_HOOKUP_OBJECT (disasmwin, run_to_cursor1, "run_to_cursor1"); + GLADE_HOOKUP_OBJECT (disasmwin, separatormenuitem4, "separatormenuitem4"); GLADE_HOOKUP_OBJECT (disasmwin, raw_opcodes, "raw_opcodes"); GLADE_HOOKUP_OBJECT (disasmwin, enc_opcodes, "enc_opcodes"); GLADE_HOOKUP_OBJECT (disasmwin, comments, "comments"); diff --git a/src/osd/sdl/debug.glade b/src/osd/sdl/debug.glade index a64603dcc1f..53a7ac0e4ec 100644 --- a/src/osd/sdl/debug.glade +++ b/src/osd/sdl/debug.glade @@ -172,11 +172,20 @@ <child> <widget class="GtkMenu" id="item1_menu"> <child> + <widget class="GtkMenuItem" id="set_breakpoint_at_cursor"> + <property name="visible">True</property> + <property name="label" translatable="yes">Set breakpoint at cursor</property> + <property name="use_underline">True</property> + <signal name="activate" handler="on_set_breakpoint_at_cursor_activate" object="debugmain"/> + </widget> + </child> + <child> <widget class="GtkMenuItem" id="run_to_cursor"> <property name="visible">True</property> <property name="label" translatable="yes">Run to cursor</property> <property name="use_underline">True</property> <signal name="activate" handler="on_run_to_cursor_activate" object="debugmain"/> + <accelerator key="F4" signal="activate"/> </widget> </child> <child> @@ -267,6 +276,7 @@ <property name="visible">True</property> <property name="can_focus">True</property> <property name="has_focus">True</property> + <property name="invisible_char">●</property> <property name="activates_default">True</property> </widget> <packing> @@ -471,7 +481,6 @@ <property name="visible">True</property> <property name="label" translatable="yes">2-bytes chunks</property> <property name="use_underline">True</property> - <property name="active">True</property> <property name="group">chunks_1</property> <signal name="activate" handler="on_chunks_2_activate" object="memorywin"/> <accelerator key="2" signal="activate" modifiers="GDK_CONTROL_MASK"/> @@ -482,7 +491,6 @@ <property name="visible">True</property> <property name="label" translatable="yes">4-bytes chunks</property> <property name="use_underline">True</property> - <property name="active">True</property> <property name="group">chunks_1</property> <signal name="activate" handler="on_chunks_4_activate" object="memorywin"/> <accelerator key="4" signal="activate" modifiers="GDK_CONTROL_MASK"/> @@ -494,6 +502,32 @@ </widget> </child> <child> + <widget class="GtkRadioMenuItem" id="logical_addresses"> + <property name="visible">True</property> + <property name="label" translatable="yes">Logical Addresses</property> + <property name="use_underline">True</property> + <property name="active">True</property> + <signal name="group_changed" handler="on_logical_addresses_group_changed" object="memorywin"/> + <accelerator key="l" signal="activate" modifiers="GDK_CONTROL_MASK"/> + </widget> + </child> + <child> + <widget class="GtkRadioMenuItem" id="physical_addresses"> + <property name="visible">True</property> + <property name="label" translatable="yes">Physical Addresses</property> + <property name="use_underline">True</property> + <property name="active">True</property> + <property name="group">logical_addresses</property> + <signal name="group_changed" handler="on_physical_addresses_group_changed" object="memorywin"/> + <accelerator key="y" signal="activate" modifiers="GDK_CONTROL_MASK"/> + </widget> + </child> + <child> + <widget class="GtkSeparatorMenuItem" id="separatormenuitem1"> + <property name="visible">True</property> + </widget> + </child> + <child> <widget class="GtkCheckMenuItem" id="reverse"> <property name="visible">True</property> <property name="label" translatable="yes">Reverse View</property> @@ -543,6 +577,7 @@ <widget class="GtkEntry" id="edit"> <property name="visible">True</property> <property name="can_focus">True</property> + <property name="invisible_char">●</property> </widget> <packing> <property name="position">0</property> @@ -744,6 +779,28 @@ <child> <widget class="GtkMenu" id="menuitem20_menu"> <child> + <widget class="GtkMenuItem" id="set_breakpoint_at_cursor"> + <property name="visible">True</property> + <property name="label" translatable="yes">Set breakpoint at cursor</property> + <property name="use_underline">True</property> + <signal name="activate" handler="on_set_breakpoint_at_cursor_activate" object="disasmwin"/> + </widget> + </child> + <child> + <widget class="GtkMenuItem" id="run_to_cursor1"> + <property name="visible">True</property> + <property name="label" translatable="yes">Run to cursor</property> + <property name="use_underline">True</property> + <signal name="activate" handler="on_run_to_cursor_activate" object="disasmwin"/> + <accelerator key="F4" signal="activate"/> + </widget> + </child> + <child> + <widget class="GtkSeparatorMenuItem" id="separatormenuitem4"> + <property name="visible">True</property> + </widget> + </child> + <child> <widget class="GtkRadioMenuItem" id="raw_opcodes"> <property name="visible">True</property> <property name="label" translatable="yes">Raw Opcodes</property> @@ -793,6 +850,7 @@ <widget class="GtkEntry" id="edit"> <property name="visible">True</property> <property name="can_focus">True</property> + <property name="invisible_char">●</property> </widget> <packing> <property name="position">0</property> diff --git a/src/osd/sdl/debugwin.c b/src/osd/sdl/debugwin.c index af90e5238ec..7dfcd72928f 100644 --- a/src/osd/sdl/debugwin.c +++ b/src/osd/sdl/debugwin.c @@ -19,19 +19,17 @@ #include "debug-sup.h" #include "debug-cb.h" -#if 0 +//============================================================ +// PARAMETERS +//============================================================ + +#if 1 #define LOG(x...) #else #define LOG(x) printf x #endif -typedef struct _debug_private_data debug_private_data; -struct _debug_private_data -{ - running_machine *machine; -}; - -#define GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), EGG_TYPE_CLOCK_FACE, EggClockFacePrivate)) +#define MAX_VIEWS (4) enum { WIN_TYPE_MAIN = 0x01, @@ -41,69 +39,56 @@ enum { WIN_TYPE_ALL = 0x0f }; +//============================================================ +// TYPES +//============================================================ + + typedef struct hentry { struct hentry *h; char *e; } hentry; -typedef struct { +typedef struct _win_i win_i; + +typedef struct _edit edit; +typedef struct _edit { GtkEntry *edit_w; struct hentry *h, *ch; char *hold; int keep_last; - void (*cb)(running_machine *,const char *, void *); - void *cbp; - running_machine *machine; -} edit; + void (*cb)(win_i *,const char *); + win_i *cbp; +}; -typedef struct _win_i win_i; struct _win_i { int type; win_i * next; GtkWidget * win; edit ed; - running_machine *machine; // machine - debug_view *disasm_dv; - struct { - DView *console_w, *disasm_w, *registers_w; - debug_view *console; - debug_view *registers; - running_device *cpu; // current CPU - } main; - struct { - DView *memory_w; - edit ed; - GtkComboBox *zone_w; - debug_view *memory; - } memory; - struct { - DView *disasm_w; - edit ed; - GtkComboBox *cpu_w; - } disasm; - struct { - DView *log_w; - debug_view *log; - } log; + running_machine * machine; // machine + DView * views[MAX_VIEWS]; + running_device * cpu; // current CPU }; -typedef struct memorycombo_item -{ - struct memorycombo_item *next; - char name[256]; - UINT8 prefsize; - running_machine *machine; // machine - const memory_subview_item *subview; // subview - running_device *device; // CPU device -} memorycombo_item; +//============================================================ +// LOCAL VARIABLES +//============================================================ static win_i *win_list; -static memorycombo_item *memorycombo; +//============================================================ +// PROTOTYPES +//============================================================ static void debugmain_init(running_machine *machine); + +//============================================================ +// run_func_on_win_list +//============================================================ + static void run_func_on_win_list(void (*f)(GtkWidget *widget), int win_type_mask) { win_i *p; @@ -112,6 +97,12 @@ static void run_func_on_win_list(void (*f)(GtkWidget *widget), int win_type_mask f(p->win); } + + +//============================================================ +// get_win_i +//============================================================ + static win_i *get_win_i(GtkWidget *win, int win_type_mask) { win_i *p; @@ -129,13 +120,40 @@ static win_i *get_win_i(GtkWidget *win, int win_type_mask) return NULL; } + +//============================================================ +// get_view +//============================================================ + +static DView *get_view(win_i *win, int type) +{ + int i; + for (i=0; i<MAX_VIEWS; i++) + if (win->views[i]->dv_type == type) + return win->views[i]; + return 0; + assert(0); +} + + + +//============================================================ +// get_running_machine +//============================================================ + static running_machine *get_running_machine(GtkWidget *win) { win_i *p = get_win_i(win, WIN_TYPE_ALL); return p->machine; /* fixme*/ } -static win_i *first_win_i(int win_type_mask) + + +//============================================================ +// get_first_win_i +//============================================================ + +static win_i *get_first_win_i(int win_type_mask) { win_i *p; @@ -147,13 +165,29 @@ static win_i *first_win_i(int win_type_mask) return NULL; } -static void add_win_i(win_i *win, int win_type) + + +//============================================================ +// add_win_i +//============================================================ + +static win_i *add_win_i(running_machine *machine, int win_type) { + win_i *win = (win_i *) osd_malloc(sizeof(*win)); + memset(win, 0, sizeof(*win)); + win->cpu = NULL; + win->machine = machine; + win->type = win_type; + win->next = win_list; win_list = win; - win->type = win_type; + return win; } +//============================================================ +// remove_win_i +//============================================================ + static void remove_win_i(win_i *win) { win_i **p = &win_list; @@ -165,6 +199,12 @@ static void remove_win_i(win_i *win) *p = NULL; } + + +//============================================================ +// debugwin_show +//============================================================ + static void debugwin_show(int show) { void (*f)(GtkWidget *widget) = show ? gtk_widget_show : gtk_widget_hide; @@ -172,6 +212,11 @@ static void debugwin_show(int show) run_func_on_win_list(f, WIN_TYPE_ALL); } + +//============================================================ +// edit_add_hist +//============================================================ + static void edit_add_hist(edit *e, const char *text) { if(e->ch) @@ -190,6 +235,12 @@ static void edit_add_hist(edit *e, const char *text) } } + + +//============================================================ +// edit_set_field +//============================================================ + static void edit_set_field(edit *e) { if(e->keep_last) { @@ -199,16 +250,28 @@ static void edit_set_field(edit *e) gtk_entry_set_text(e->edit_w, ""); } + + +//============================================================ +// edit_activate +//============================================================ + static void edit_activate(GtkEntry *item, gpointer user_data) { edit *e = (edit *) user_data; const char *text = gtk_entry_get_text(e->edit_w); edit_add_hist(e, text); - e->cb(e->machine, text, e->cbp); + e->cb(e->cbp, text); edit_set_field(e); } + + +//============================================================ +// edit_hist_back +//============================================================ + static void edit_hist_back(edit *e) { const char *text = gtk_entry_get_text(e->edit_w); @@ -233,6 +296,12 @@ static void edit_hist_back(edit *e) gtk_editable_select_region(GTK_EDITABLE(e->edit_w), 0, -1); } + + +//============================================================ +// dedit_hist_forward +//============================================================ + static void edit_hist_forward(edit *e) { hentry *h, *hp; @@ -260,6 +329,12 @@ static void edit_hist_forward(edit *e) gtk_editable_select_region(GTK_EDITABLE(e->edit_w), 0, -1); } + + +//============================================================ +// edit_key +//============================================================ + static gboolean edit_key(GtkWidget *item, GdkEventKey *k, gpointer user_data) { edit *e = (edit *)user_data; @@ -275,7 +350,13 @@ static gboolean edit_key(GtkWidget *item, GdkEventKey *k, gpointer user_data) return FALSE; } -static void edit_init(running_machine *machine, edit *e, GtkWidget *w, const char *ft, int kl, void (*cb)(running_machine *, const char *, void *), void *cbp) + + +//============================================================ +// edit_init +//============================================================ + +static void edit_init(edit *e, GtkWidget *w, const char *ft, int kl, void (*cb)(win_i *, const char *), win_i *cbp) { e->edit_w = GTK_ENTRY(w); e->h = 0; @@ -284,7 +365,6 @@ static void edit_init(running_machine *machine, edit *e, GtkWidget *w, const cha e->keep_last = kl; e->cb = cb; e->cbp = cbp; - e->machine = machine; if(ft) edit_add_hist(e, ft); edit_set_field(e); @@ -292,6 +372,12 @@ static void edit_init(running_machine *machine, edit *e, GtkWidget *w, const cha g_signal_connect(e->edit_w, "key-press-event", G_CALLBACK(edit_key), e); } + + +//============================================================ +// debugwin_show +//============================================================ + static void edit_del(edit *e) { hentry *h = e->h; @@ -303,86 +389,79 @@ static void edit_del(edit *e) } } -static void debugmain_update_checks(win_i *info) + + +//============================================================ +// disasmview_update_checks +//============================================================ + +static void disasmview_update_checks(win_i *info) { + DView *disasm; assert(info != NULL); assert(info->type == WIN_TYPE_MAIN); - int rc = disasm_view_get_right_column(info->disasm_dv); + disasm = get_view(info, DVT_DISASSEMBLY); + + int rc = disasm_view_get_right_column(disasm->view); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(lookup_widget(info->win, "raw_opcodes")), rc == DASM_RIGHTCOL_RAW); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(lookup_widget(info->win, "enc_opcodes")), rc == DASM_RIGHTCOL_ENCRYPTED); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(lookup_widget(info->win, "comments")), rc == DASM_RIGHTCOL_COMMENTS); } -void on_raw_opcodes_activate(GtkWidget *win) -{ - win_i *info = get_win_i(win, WIN_TYPE_MAIN | WIN_TYPE_DISASM); - if(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(lookup_widget(info->win, "raw_opcodes")))) { - debug_view_begin_update(info->disasm_dv); - disasm_view_set_right_column(info->disasm_dv, DASM_RIGHTCOL_RAW); - debug_view_end_update(info->disasm_dv); - } -} -void on_enc_opcodes_activate(GtkWidget *win) -{ - win_i *info = get_win_i(win, WIN_TYPE_MAIN | WIN_TYPE_DISASM); - if(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(lookup_widget(info->win, "enc_opcodes")))) { - debug_view_begin_update(info->disasm_dv); - disasm_view_set_right_column(info->disasm_dv, DASM_RIGHTCOL_ENCRYPTED); - debug_view_end_update(info->disasm_dv); - } -} -void on_comments_activate(GtkWidget *win) -{ - win_i *info = get_win_i(win, WIN_TYPE_MAIN | WIN_TYPE_DISASM); - if(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(lookup_widget(info->win, "comments")))) { - debug_view_begin_update(info->disasm_dv); - disasm_view_set_right_column(info->disasm_dv, DASM_RIGHTCOL_COMMENTS); - debug_view_end_update(info->disasm_dv); - } -} +//============================================================ +// debugmain_set_cpu +//============================================================ static void debugmain_set_cpu(running_device *cpu) { - win_i *dmain = first_win_i(WIN_TYPE_MAIN); + win_i *dmain = get_first_win_i(WIN_TYPE_MAIN); + DView *dv; - if (cpu != dmain->main.cpu) + if (cpu != dmain->cpu) { char title[256]; const registers_subview_item *regsubitem; const disasm_subview_item *dasmsubitem; - dmain->main.cpu = cpu; + dmain->cpu = cpu; // first set all the views to the new cpu - for (dasmsubitem = disasm_view_get_subview_list(dmain->disasm_dv); dasmsubitem != NULL; dasmsubitem = dasmsubitem->next) + // FIXME: Iterate over all views ! + dv = get_view(dmain, DVT_DISASSEMBLY); + for (dasmsubitem = disasm_view_get_subview_list(dv->view); dasmsubitem != NULL; dasmsubitem = dasmsubitem->next) if (dasmsubitem->space->cpu == cpu) { - disasm_view_set_subview(dmain->disasm_dv, dasmsubitem->index); + disasm_view_set_subview(dv->view, dasmsubitem->index); break; } - for (regsubitem = registers_view_get_subview_list(dmain->main.registers); regsubitem != NULL; regsubitem = regsubitem->next) + dv = get_view(dmain, DVT_REGISTERS); + for (regsubitem = registers_view_get_subview_list(dv->view); regsubitem != NULL; regsubitem = regsubitem->next) if (regsubitem->device == cpu) { - registers_view_set_subview(dmain->main.registers, regsubitem->index); + registers_view_set_subview(dv->view, regsubitem->index); break; } // then update the caption snprintf(title, ARRAY_LENGTH(title), "Debug: %s - %s", cpu->machine->gamedrv->name, regsubitem->name.cstr()); gtk_window_set_title(GTK_WINDOW(dmain->win), title); - debugmain_update_checks(dmain); + disasmview_update_checks(dmain); } } -// The entry point + + +//============================================================ +// osd_wait_for_debugger +//============================================================ void osd_wait_for_debugger(running_device *device, int firststop) { - win_i *dmain = first_win_i(WIN_TYPE_MAIN); + win_i *dmain = get_first_win_i(WIN_TYPE_MAIN); // create a console window if(!dmain) { @@ -398,100 +477,153 @@ void osd_wait_for_debugger(running_device *device, int firststop) gtk_main_iteration(); } + + +//============================================================ +// debugwin_update_during_game +//============================================================ + void debugwin_update_during_game(running_machine *machine) { - win_i *dmain = first_win_i(WIN_TYPE_MAIN); + win_i *dmain = get_first_win_i(WIN_TYPE_MAIN); if(dmain) { gtk_main_iteration_do(FALSE); } } -static void debugmain_process_string(running_machine *machine, const char *str, void *dmp) + + +//============================================================ +// debugmain_process_string +//============================================================ + +static void debugmain_process_string(win_i *win, const char *str) { if(!str[0]) - debug_cpu_single_step(machine, 1); + debug_cpu_single_step(win->machine, 1); else - debug_console_execute_command(machine, str, 1); + debug_console_execute_command(win->machine, str, 1); } + + +//============================================================ +// debugmain_destroy +//============================================================ + static void debugmain_destroy(GtkObject *obj, gpointer user_data) { - win_i *dmain = first_win_i(WIN_TYPE_MAIN); + win_i *dmain = get_first_win_i(WIN_TYPE_MAIN); mame_schedule_exit(dmain->machine); } + + +//============================================================ +// debugmain_init +//============================================================ + static void debugmain_init(running_machine *machine) { - win_i *dmain = (win_i *) osd_malloc(sizeof(*dmain)); - memset(dmain, 0, sizeof(*dmain)); + win_i *dmain; + + dmain = add_win_i(machine, WIN_TYPE_MAIN); dmain->win = create_debugmain(); - dmain->main.cpu = NULL; - dmain->machine = machine; - add_win_i(dmain, WIN_TYPE_MAIN); - dmain->main.console_w = DVIEW(lookup_widget(dmain->win, "console")); - dmain->main.disasm_w = DVIEW(lookup_widget(dmain->win, "disasm")); - dmain->main.registers_w = DVIEW(lookup_widget(dmain->win, "registers")); + dmain->views[0] = DVIEW(lookup_widget(dmain->win, "console")); + dmain->views[1] = DVIEW(lookup_widget(dmain->win, "disasm")); + dmain->views[2] = DVIEW(lookup_widget(dmain->win, "registers")); - dview_set_debug_view(dmain->main.console_w, machine, DVT_CONSOLE, &dmain->main.console); - dview_set_debug_view(dmain->main.disasm_w, machine, DVT_DISASSEMBLY, &dmain->disasm_dv); - dview_set_debug_view(dmain->main.registers_w, machine, DVT_REGISTERS, &dmain->main.registers); + dview_set_debug_view(dmain->views[0], machine, DVT_CONSOLE); + dview_set_debug_view(dmain->views[1], machine, DVT_DISASSEMBLY); + dview_set_debug_view(dmain->views[2], machine, DVT_REGISTERS); - edit_init(machine, &dmain->ed, lookup_widget(dmain->win, "edit"), 0, 0, debugmain_process_string, &dmain); + edit_init(&dmain->ed, lookup_widget(dmain->win, "edit"), 0, 0, debugmain_process_string, dmain); - debug_view_begin_update(dmain->disasm_dv); - disasm_view_set_expression(dmain->disasm_dv, "curpc"); + /* set up disasm view */ + debug_view_begin_update(dmain->views[1]->view); + disasm_view_set_expression(dmain->views[1]->view, "curpc"); // debug_view_set_property_UINT32(dmain->disasm, DVP_DASM_TRACK_LIVE, 1); - debug_view_end_update(dmain->disasm_dv); + debug_view_end_update(dmain->views[1]->view); g_signal_connect(dmain->win, "destroy", G_CALLBACK(debugmain_destroy), dmain); gtk_widget_show_all(dmain->win); } + + +//============================================================ +// memorywin_update_checks +//============================================================ + static void memorywin_update_checks(win_i *info) { - int bpc = memory_view_get_bytes_per_chunk(info->memory.memory); - int rev = memory_view_get_reverse(info->memory.memory); + DView *memory = get_view(info, DVT_MEMORY); + int bpc = memory_view_get_bytes_per_chunk(memory->view); + int rev = memory_view_get_reverse(memory->view); + int pa = memory_view_get_physical(memory->view); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(lookup_widget(info->win, "chunks_1")), bpc == 1); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(lookup_widget(info->win, "chunks_2")), bpc == 2); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(lookup_widget(info->win, "chunks_4")), bpc == 4); + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(lookup_widget(info->win, "physical_addresses")), pa); + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(lookup_widget(info->win, "locical_addresses")), !pa); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(lookup_widget(info->win, "reverse")), rev); } + + +//============================================================ +// memorywin_zone_changed +//============================================================ + static void memorywin_zone_changed(GtkComboBox *zone_w, win_i *mem) { - int sel = gtk_combo_box_get_active(mem->memory.zone_w); + int sel = gtk_combo_box_get_active(zone_w); char title[256]; const memory_subview_item *subview; + DView *memory = get_view(mem, DVT_MEMORY); assert(mem->type == WIN_TYPE_MEMORY); // update the subview - memory_view_set_subview(mem->memory.memory, sel); + memory_view_set_subview(memory->view, sel); // change the checkmarks in the menu memorywin_update_checks(mem); // update the window title - subview = memory_view_get_current_subview(mem->memory.memory); + subview = memory_view_get_current_subview(memory->view); sprintf(title, "Memory: %s", subview->name.cstr()); gtk_window_set_title(GTK_WINDOW(mem->win), title); } -static void memorywin_process_string(running_machine *machine, const char *str, void *memp) + + +//============================================================ +// memorywin_process_string +//============================================================ + +static void memorywin_process_string(win_i *win, const char *str) { - win_i *mem = (win_i *) memp; + win_i *mem = (win_i *) win; + DView *memory = get_view(mem, DVT_MEMORY); assert(mem->type == WIN_TYPE_MEMORY); - memory_view_set_expression(mem->memory.memory, str); + memory_view_set_expression(memory->view, str); } + + +//============================================================ +// memorywin_destroy +//============================================================ + static void memorywin_destroy(GtkObject *obj, gpointer user_data) { win_i *mem = (win_i *) user_data; @@ -501,87 +633,98 @@ static void memorywin_destroy(GtkObject *obj, gpointer user_data) osd_free(mem); } + + +//============================================================ +// memorywin_new +//============================================================ + static void memorywin_new(running_machine *machine) { win_i *mem; int item, cursel; running_device *curcpu = debug_cpu_get_visible_cpu(machine); const memory_subview_item *subview; + GtkComboBox * zone_w; - mem = (win_i *) osd_malloc(sizeof(*mem)); - memset(mem, 0, sizeof(*mem)); - add_win_i(mem, WIN_TYPE_MEMORY); - + mem = add_win_i(machine, WIN_TYPE_MEMORY); mem->win = create_memorywin(); - mem->machine = machine; - mem->memory.memory_w = DVIEW(lookup_widget(mem->win, "memoryview")); - dview_set_debug_view(mem->memory.memory_w, machine, DVT_MEMORY, &mem->memory.memory); + mem->views[0] = DVIEW(lookup_widget(mem->win, "memoryview")); + dview_set_debug_view(mem->views[0], machine, DVT_MEMORY); - mem->memory.zone_w = GTK_COMBO_BOX(lookup_widget(mem->win, "zone")); + zone_w = GTK_COMBO_BOX(lookup_widget(mem->win, "zone")); - edit_init(machine, &mem->ed, lookup_widget(mem->win, "edit"), "0", 1, memorywin_process_string, mem); + edit_init(&mem->ed, lookup_widget(mem->win, "edit"), "0", 1, memorywin_process_string, mem); - debug_view_begin_update(mem->memory.memory); - memory_view_set_expression(mem->memory.memory, "0"); - debug_view_end_update(mem->memory.memory); + debug_view_begin_update(mem->views[0]->view); + memory_view_set_expression(mem->views[0]->view, "0"); + debug_view_end_update(mem->views[0]->view); // populate the combobox - if (!memorycombo) - { - cursel = item = 0; - - for (subview = memory_view_get_subview_list(mem->memory.memory); subview != NULL; subview = subview->next) - { - gtk_combo_box_append_text(mem->memory.zone_w, subview->name); - if (cursel == 0 && subview->space != NULL && subview->space->cpu == curcpu) - cursel = item; + cursel = item = 0; - item++; - } + for (subview = memory_view_get_subview_list(mem->views[0]->view); subview != NULL; subview = subview->next) + { + gtk_combo_box_append_text(zone_w, subview->name); + if (cursel == 0 && subview->space != NULL && subview->space->cpu == curcpu) + cursel = item; - memory_view_set_subview(mem->memory.memory, cursel); - gtk_combo_box_set_active(mem->memory.zone_w, cursel); + item++; } - g_signal_connect(mem->memory.zone_w, "changed", G_CALLBACK(memorywin_zone_changed), mem); + memory_view_set_subview(mem->views[0]->view, cursel); + gtk_combo_box_set_active(zone_w, cursel); + + g_signal_connect(zone_w, "changed", G_CALLBACK(memorywin_zone_changed), mem); g_signal_connect(mem->win, "destroy", G_CALLBACK(memorywin_destroy), mem); gtk_widget_show_all(mem->win); } -static void disasmwin_update_checks(win_i *info) -{ - int rc = disasm_view_get_right_column(info->disasm_dv); - gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(lookup_widget(info->win, "raw_opcodes")), rc == DASM_RIGHTCOL_RAW); - gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(lookup_widget(info->win, "enc_opcodes")), rc == DASM_RIGHTCOL_ENCRYPTED); - gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(lookup_widget(info->win, "comments")), rc == DASM_RIGHTCOL_COMMENTS); -} + + +//============================================================ +// disasmwin_cpu_changed +//============================================================ static void disasmwin_cpu_changed(GtkComboBox *cpu_w, win_i *dis) { char title[256]; const disasm_subview_item *subview; + DView *disasm = get_view(dis, DVT_DISASSEMBLY); - disasm_view_set_subview(dis->disasm_dv, gtk_combo_box_get_active(dis->disasm.cpu_w)); + disasm_view_set_subview(disasm->view, gtk_combo_box_get_active(cpu_w)); - disasmwin_update_checks(dis); + disasmview_update_checks(dis); - subview = disasm_view_get_current_subview(dis->disasm_dv); + subview = disasm_view_get_current_subview(disasm->view); sprintf(title, "Disassembly: %s", subview->name.cstr()); gtk_window_set_title(GTK_WINDOW(dis->win), title); } -static void disasmwin_process_string(running_machine *machine, const char *str, void *disp) + +//============================================================ +// disasmwin_process_string +//============================================================ + +static void disasmwin_process_string(win_i *win, const char *str) { - win_i *dis = (win_i *) disp; + win_i *dis = (win_i *) win; + DView *disasm = get_view(dis, DVT_DISASSEMBLY); assert(dis->type == WIN_TYPE_DISASM); - disasm_view_set_expression(dis->disasm_dv, str); + disasm_view_set_expression(disasm->view, str); } + + +//============================================================ +// disasmwin_destroy +//============================================================ + static void disasmwin_destroy(GtkObject *obj, gpointer user_data) { win_i *dis = (win_i *) user_data; @@ -591,60 +734,68 @@ static void disasmwin_destroy(GtkObject *obj, gpointer user_data) osd_free(dis); } + + +//============================================================ +// disasmwin_new +//============================================================ + static void disasmwin_new(running_machine *machine) { win_i *dis; int item, cursel; running_device *curcpu = debug_cpu_get_visible_cpu(machine); const disasm_subview_item *subview; + GtkComboBox *cpu_w; char title[256]; - dis = (win_i *)osd_malloc(sizeof(*dis)); - memset(dis, 0, sizeof(*dis)); - - add_win_i(dis, WIN_TYPE_DISASM); - + dis = add_win_i(machine, WIN_TYPE_DISASM); dis->win = create_disasmwin(); - dis->machine = machine; - dis->disasm.disasm_w = DVIEW(lookup_widget(dis->win, "disasmview")); + dis->views[0] = DVIEW(lookup_widget(dis->win, "disasmview")); - dview_set_debug_view(dis->disasm.disasm_w, machine, DVT_DISASSEMBLY, &dis->disasm_dv); + dview_set_debug_view(dis->views[0], machine, DVT_DISASSEMBLY); - dis->disasm.cpu_w = GTK_COMBO_BOX(lookup_widget(dis->win, "cpu")); + cpu_w = GTK_COMBO_BOX(lookup_widget(dis->win, "cpu")); - edit_init(machine, &dis->ed, lookup_widget(dis->win, "edit"), "curpc", 1, disasmwin_process_string, dis); + edit_init(&dis->ed, lookup_widget(dis->win, "edit"), "curpc", 1, disasmwin_process_string, dis); - debug_view_begin_update(dis->disasm_dv); - disasm_view_set_expression(dis->disasm_dv, "curpc"); + debug_view_begin_update(dis->views[0]->view); + disasm_view_set_expression(dis->views[0]->view, "curpc"); // debug_view_set_property_UINT32(dis->disasm, DVP_DASM_TRACK_LIVE, 1); - debug_view_end_update(dis->disasm_dv); + debug_view_end_update(dis->views[0]->view); // populate the combobox cursel = item = 0; - for (subview = disasm_view_get_subview_list(dis->disasm_dv); subview != NULL; subview = subview->next) + for (subview = disasm_view_get_subview_list(dis->views[0]->view); subview != NULL; subview = subview->next) { - gtk_combo_box_append_text(dis->disasm.cpu_w, subview->name); + gtk_combo_box_append_text(cpu_w, subview->name); if (cursel == 0 && subview->space->cpu == curcpu) cursel = item; item++; } - gtk_combo_box_set_active(dis->disasm.cpu_w, cursel); - disasm_view_set_subview(dis->disasm_dv, cursel); + gtk_combo_box_set_active(cpu_w, cursel); + disasm_view_set_subview(dis->views[0]->view, cursel); - subview = disasm_view_get_current_subview(dis->disasm_dv); + subview = disasm_view_get_current_subview(dis->views[0]->view); sprintf(title, "Disassembly: %s", subview->name.cstr()); gtk_window_set_title(GTK_WINDOW(dis->win), title); - g_signal_connect(dis->disasm.cpu_w, "changed", G_CALLBACK(disasmwin_cpu_changed), dis); + g_signal_connect(cpu_w, "changed", G_CALLBACK(disasmwin_cpu_changed), dis); // g_signal_connect(dis->edit_w, "activate", G_CALLBACK(disasmwin_process_string), dis); g_signal_connect(dis->win, "destroy", G_CALLBACK(disasmwin_destroy), dis); gtk_widget_show_all(dis->win); } + + +//============================================================ +// logwin_destroy +//============================================================ + static void logwin_destroy(GtkObject *obj, gpointer user_data) { win_i *log = (win_i *) user_data; @@ -653,26 +804,68 @@ static void logwin_destroy(GtkObject *obj, gpointer user_data) osd_free(log); } + + +//============================================================ +// logwin_new +//============================================================ + static void logwin_new(running_machine *machine) { win_i *log; - log = (win_i *) osd_malloc(sizeof(*log)); - memset(log, 0, sizeof(*log)); - - add_win_i(log, WIN_TYPE_LOG); - + log = add_win_i(machine, WIN_TYPE_LOG); log->win = create_logwin(); - log->machine = machine; - log->log.log_w = DVIEW(lookup_widget(log->win, "logview")); - dview_set_debug_view(log->log.log_w, machine, DVT_LOG, &log->log.log); + log->views[0] = DVIEW(lookup_widget(log->win, "logview")); + dview_set_debug_view(log->views[0], machine, DVT_LOG); g_signal_connect(log->win, "destroy", G_CALLBACK(logwin_destroy), log); gtk_widget_show_all(log->win); } +//============================================================ +// Menu Callbacks +//============================================================ + +void on_raw_opcodes_activate(GtkWidget *win) +{ + win_i *info = get_win_i(win, WIN_TYPE_MAIN | WIN_TYPE_DISASM); + DView *disasm = get_view(info, DVT_DISASSEMBLY); + + if(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(lookup_widget(info->win, "raw_opcodes")))) { + debug_view_begin_update(disasm->view); + disasm_view_set_right_column(disasm->view, DASM_RIGHTCOL_RAW); + debug_view_end_update(disasm->view); + } +} + +void on_enc_opcodes_activate(GtkWidget *win) +{ + win_i *info = get_win_i(win, WIN_TYPE_MAIN | WIN_TYPE_DISASM); + DView *disasm = get_view(info, DVT_DISASSEMBLY); + + if(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(lookup_widget(info->win, "enc_opcodes")))) { + debug_view_begin_update(disasm->view); + disasm_view_set_right_column(disasm->view, DASM_RIGHTCOL_ENCRYPTED); + debug_view_end_update(disasm->view); + } +} + +void on_comments_activate(GtkWidget *win) +{ + win_i *info = get_win_i(win, WIN_TYPE_MAIN | WIN_TYPE_DISASM); + DView *disasm = get_view(info, DVT_DISASSEMBLY); + + if(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(lookup_widget(info->win, "comments")))) { + debug_view_begin_update(disasm->view); + disasm_view_set_right_column(disasm->view, DASM_RIGHTCOL_COMMENTS); + debug_view_end_update(disasm->view); + } +} + + void on_new_mem_activate(GtkWidget *win) { memorywin_new(get_running_machine(win)); @@ -748,74 +941,144 @@ void on_exit_activate(GtkWidget *win) void on_chunks_1_activate(GtkWidget *win) { win_i *info = get_win_i(win, WIN_TYPE_MEMORY); + DView *memory = get_view(info, DVT_MEMORY); + if(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(lookup_widget(info->win, "chunks_1")))) { - debug_view_begin_update(info->memory.memory); - memory_view_set_bytes_per_chunk(info->memory.memory, 1); - debug_view_end_update(info->memory.memory); + debug_view_begin_update(memory->view); + memory_view_set_bytes_per_chunk(memory->view, 1); + debug_view_end_update(memory->view); } } void on_chunks_2_activate(GtkWidget *win) { win_i *info = get_win_i(win, WIN_TYPE_MEMORY); + DView *memory = get_view(info, DVT_MEMORY); + if(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(lookup_widget(info->win, "chunks_2")))) { - debug_view_begin_update(info->memory.memory); - memory_view_set_bytes_per_chunk(info->memory.memory, 2); - debug_view_end_update(info->memory.memory); + debug_view_begin_update(memory->view); + memory_view_set_bytes_per_chunk(memory->view, 2); + debug_view_end_update(memory->view); } } void on_chunks_4_activate(GtkWidget *win) { win_i *info = get_win_i(win, WIN_TYPE_MEMORY); + DView *memory = get_view(info, DVT_MEMORY); + if(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(lookup_widget(info->win, "chunks_4")))) { - debug_view_begin_update(info->memory.memory); - memory_view_set_bytes_per_chunk(info->memory.memory, 4); - debug_view_end_update(info->memory.memory); + debug_view_begin_update(memory->view); + memory_view_set_bytes_per_chunk(memory->view, 4); + debug_view_end_update(memory->view); + } +} + +void on_logical_addresses_group_changed(GtkWidget *win) +{ + win_i *info = get_win_i(win, WIN_TYPE_MEMORY); + DView *memory = get_view(info, DVT_MEMORY); + + if(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(lookup_widget(info->win, "logical_addresses")))) { + debug_view_begin_update(memory->view); + memory_view_set_physical(memory->view, FALSE); + debug_view_end_update(memory->view); + } +} + +void on_physical_addresses_group_changed(GtkWidget *win) +{ + win_i *info = get_win_i(win, WIN_TYPE_MEMORY); + DView *memory = get_view(info, DVT_MEMORY); + + if(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(lookup_widget(info->win, "physical_addresses")))) { + debug_view_begin_update(memory->view); + memory_view_set_physical(memory->view, TRUE); + debug_view_end_update(memory->view); } } void on_reverse_activate(GtkWidget *win) { win_i *info = get_win_i(win, WIN_TYPE_MEMORY); - debug_view_begin_update(info->memory.memory); - memory_view_set_reverse(info->memory.memory, gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(lookup_widget(info->win, "reverse")))); + DView *memory = get_view(info, DVT_MEMORY); - debug_view_end_update(info->memory.memory); + debug_view_begin_update(memory->view); + memory_view_set_reverse(memory->view, gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(lookup_widget(info->win, "reverse")))); + debug_view_end_update(memory->view); } void on_ibpl_activate(GtkWidget *win) { win_i *info = get_win_i(win, WIN_TYPE_MEMORY); - debug_view_begin_update(info->memory.memory); - memory_view_set_chunks_per_row(info->memory.memory, memory_view_get_chunks_per_row(info->memory.memory) + 1); - debug_view_end_update(info->memory.memory); + DView *memory = get_view(info, DVT_MEMORY); + + debug_view_begin_update(memory->view); + memory_view_set_chunks_per_row(memory->view, memory_view_get_chunks_per_row(memory->view) + 1); + debug_view_end_update(memory->view); } void on_dbpl_activate(GtkWidget *win) { win_i *info = get_win_i(win, WIN_TYPE_MEMORY); - debug_view_begin_update(info->memory.memory); - memory_view_set_chunks_per_row(info->memory.memory, memory_view_get_chunks_per_row(info->memory.memory) - 1); - debug_view_end_update(info->memory.memory); + DView *memory = get_view(info, DVT_MEMORY); + + debug_view_begin_update(memory->view); + memory_view_set_chunks_per_row(memory->view, memory_view_get_chunks_per_row(memory->view) - 1); + debug_view_end_update(memory->view); } void on_run_to_cursor_activate(GtkWidget *win) { win_i *info = get_win_i(win, WIN_TYPE_ALL); + DView *disasm = get_view(info, DVT_DISASSEMBLY); char command[64]; - if (debug_view_get_cursor_visible(info->disasm_dv)) + if (debug_view_get_cursor_visible(disasm->view)) { - const address_space *space = disasm_view_get_current_subview(info->disasm_dv)->space; + const address_space *space = disasm_view_get_current_subview(disasm->view)->space; if (debug_cpu_get_visible_cpu(info->machine) == space->cpu) { - offs_t address = disasm_view_get_selected_address(info->disasm_dv); + offs_t address = disasm_view_get_selected_address(disasm->view); sprintf(command, "go %X", address); debug_console_execute_command(info->machine, command, 1); } } +} +void +on_set_breakpoint_at_cursor_activate(GtkWidget *win) +{ + win_i *info = get_win_i(win, WIN_TYPE_ALL); + DView *disasm = get_view(info, DVT_DISASSEMBLY); + char command[64]; + + if (debug_view_get_cursor_visible(disasm->view)) + { + const address_space *space = disasm_view_get_current_subview(disasm->view)->space; + if (debug_cpu_get_visible_cpu(info->machine) == space->cpu) + { + offs_t address = disasm_view_get_selected_address(disasm->view); + cpu_debug_data *cpuinfo = cpu_get_debug_data(space->cpu); + debug_cpu_breakpoint *bp; + INT32 bpindex = -1; + + /* first find an existing breakpoint at this address */ + for (bp = cpuinfo->bplist; bp != NULL; bp = bp->next) + if (address == bp->address) + { + bpindex = bp->index; + break; + } + + /* if it doesn't exist, add a new one */ + if (bpindex == -1) + sprintf(command, "bpset 0x%X", address); + else + sprintf(command, "bpclear 0x%X", bpindex); + debug_console_execute_command(info->machine, command, 1); + } + } } gboolean diff --git a/src/osd/sdl/dview.c b/src/osd/sdl/dview.c index 32cf28145cb..724093e1425 100644 --- a/src/osd/sdl/dview.c +++ b/src/osd/sdl/dview.c @@ -407,8 +407,8 @@ GtkWidget *dview_new(const gchar *widget_name, const gchar *string1, const gchar return wdv; } -void dview_set_debug_view(DView *dv, running_machine *machine, int type, debug_view **dwp) +void dview_set_debug_view(DView *dv, running_machine *machine, int type) { dv->view = debug_view_alloc(machine, type, dview_update, dv); - *dwp = dv->view; + dv->dv_type = type; } diff --git a/src/osd/sdl/dview.h b/src/osd/sdl/dview.h index fe9f4f16fff..488aaa1c618 100644 --- a/src/osd/sdl/dview.h +++ b/src/osd/sdl/dview.h @@ -39,14 +39,15 @@ struct _DView int hsz, vsz; int hs, vs; int tr, tc; - debug_view *view; gchar *name; PangoLayout *playout; GdkGC *gc; + debug_view *view; + int dv_type; }; GtkWidget *dview_new(const gchar *widget_name, const gchar *string1, const gchar *string2, gint int1, gint int2); -void dview_set_debug_view(DView *dv, running_machine *machine, int type, debug_view **dwp); +void dview_set_debug_view(DView *dv, running_machine *machine, int type); #endif |