Initial framework for debugger window in work.

This commit is contained in:
Matthew Budd 2020-05-23 22:37:31 -04:00
parent 40379a32dc
commit 69790db498
4 changed files with 444 additions and 0 deletions

View File

@ -12,6 +12,7 @@ source_list = Split(
config.cpp
memview.cpp
ramwatch.cpp
debugger.cpp
sdl.cpp
sdl-joystick.cpp
sdl-sound.cpp

View File

@ -0,0 +1,428 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <string>
#include <list>
#include <gtk/gtk.h>
#include <gdk/gdkkeysyms.h>
#ifdef GDK_WINDOWING_X11
#include <gdk/gdkx.h>
#endif
#ifdef _GTK3
#include <gdk/gdkkeysyms-compat.h>
#endif
#include "../../types.h"
#include "../../fceu.h"
#include "../../cheat.h"
#include "../../debug.h"
#include "../../driver.h"
#include "../../version.h"
#include "../../movie.h"
#include "../../palette.h"
#include "../../fds.h"
#include "../../cart.h"
#include "../../ines.h"
#include "../common/configSys.h"
#include "sdl.h"
#include "gui.h"
#include "dface.h"
#include "input.h"
#include "config.h"
#include "debugger.h"
extern Config *g_config;
//*******************************************************************************************************
// Debugger Window
//*******************************************************************************************************
//
struct debuggerWin_t
{
GtkWidget *win;
GtkTextView *textview;
GtkTextBuffer *textbuf;
GtkTextView *stackview;
GtkTextBuffer *stackTextBuf;
GtkTreeStore *bp_store;
GtkWidget *bp_tree;
GtkWidget *pc_entry;
GtkWidget *A_entry;
GtkWidget *X_entry;
GtkWidget *Y_entry;
debuggerWin_t(void)
{
win = NULL;
textview = NULL;
textbuf = NULL;
bp_store = NULL;
bp_tree = NULL;
stackview = NULL;
stackTextBuf = NULL;
}
~debuggerWin_t(void)
{
}
};
static std::list <debuggerWin_t*> debuggerWinList;
static void closeDebuggerWindow (GtkWidget * w, GdkEvent * e, debuggerWin_t * dw)
{
std::list < debuggerWin_t * >::iterator it;
for (it = debuggerWinList.begin (); it != debuggerWinList.end (); it++)
{
if (dw == *it)
{
//printf("Removing MemView Window %p from List\n", cw);
debuggerWinList.erase (it);
break;
}
}
delete dw;
gtk_widget_destroy (w);
}
void openDebuggerWindow (void)
{
GtkWidget *main_hbox;
GtkWidget *vbox1, *vbox2, *vbox3;
GtkWidget *hbox1;
GtkWidget *vbox;
GtkWidget *hbox;
GtkWidget *label;
GtkWidget *button;
GtkWidget *scroll;
GtkWidget *frame;
GtkWidget *entry;
GtkWidget *grid;
GtkCellRenderer *renderer;
GtkTreeViewColumn *column;
debuggerWin_t *dw;
dw = new debuggerWin_t;
debuggerWinList.push_back (dw);
dw->win = gtk_dialog_new_with_buttons ("6502 Debugger",
GTK_WINDOW (MainWindow),
(GtkDialogFlags)
(GTK_DIALOG_DESTROY_WITH_PARENT),
"_Close", GTK_RESPONSE_OK,
NULL);
gtk_window_set_default_size (GTK_WINDOW (dw->win), 800, 600);
main_hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 2);
dw->textview = (GtkTextView*) gtk_text_view_new();
gtk_text_view_set_monospace( dw->textview, TRUE );
gtk_text_view_set_overwrite( dw->textview, TRUE );
gtk_text_view_set_editable( dw->textview, FALSE );
gtk_text_view_set_wrap_mode( dw->textview, GTK_WRAP_NONE );
gtk_text_view_set_cursor_visible( dw->textview, TRUE );
dw->textbuf = gtk_text_view_get_buffer( dw->textview );
scroll = gtk_scrolled_window_new (NULL, NULL);
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll),
GTK_POLICY_ALWAYS, GTK_POLICY_ALWAYS);
gtk_container_add (GTK_CONTAINER (scroll), GTK_WIDGET(dw->textview) );
vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 1);
gtk_box_pack_start (GTK_BOX (vbox), scroll, TRUE, TRUE, 2);
gtk_box_pack_start (GTK_BOX (main_hbox), vbox, TRUE, TRUE, 2);
vbox1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 3);
hbox1 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 2);
gtk_box_pack_start (GTK_BOX (vbox1), hbox1, TRUE, TRUE, 2);
/*
* Vertical box 2 contains:
* 1. "Run" and "Step Into" Buttons
* 2. "Step Out" and "Step Over" Buttons
* 3. "Run Line" and "128 Lines" Buttons
* 4. "Seek To:" button and Address Entry Field
* 5. PC Entry Field and "Seek PC" Button
* 6. A, X, Y Register Entry Fields
*/
vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 2);
hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 1);
gtk_box_pack_start (GTK_BOX (hbox1), vbox2, TRUE, TRUE, 2);
grid = gtk_grid_new();
gtk_grid_set_row_homogeneous( GTK_GRID(grid), TRUE );
gtk_grid_set_column_homogeneous( GTK_GRID(grid), TRUE );
gtk_grid_set_row_spacing( GTK_GRID(grid), 5 );
gtk_grid_set_column_spacing( GTK_GRID(grid), 10 );
gtk_grid_insert_column( GTK_GRID(grid), 0 );
gtk_grid_insert_column( GTK_GRID(grid), 0 );
for (int i=0; i<5;i++)
{
gtk_grid_insert_row( GTK_GRID(grid), 0 );
}
gtk_box_pack_start (GTK_BOX (hbox ), grid, TRUE, TRUE, 2);
gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, FALSE, 2);
// Row 1
button = gtk_button_new_with_label ("Run");
gtk_grid_attach( GTK_GRID(grid), button, 0, 0, 1, 1 );
button = gtk_button_new_with_label ("Step Into");
gtk_grid_attach( GTK_GRID(grid), button, 1, 0, 1, 1 );
// Row 2
button = gtk_button_new_with_label ("Step Out");
gtk_grid_attach( GTK_GRID(grid), button, 0, 1, 1, 1 );
button = gtk_button_new_with_label ("Step Over");
gtk_grid_attach( GTK_GRID(grid), button, 1, 1, 1, 1 );
// Row 3
button = gtk_button_new_with_label ("Run Line");
gtk_grid_attach( GTK_GRID(grid), button, 0, 2, 1, 1 );
button = gtk_button_new_with_label ("128 Lines");
gtk_grid_attach( GTK_GRID(grid), button, 1, 2, 1, 1 );
// Row 4
button = gtk_button_new_with_label ("Seek To:");
gtk_grid_attach( GTK_GRID(grid), button, 0, 3, 1, 1 );
entry = gtk_entry_new ();
gtk_entry_set_max_length (GTK_ENTRY (entry), 4);
gtk_entry_set_width_chars (GTK_ENTRY (entry), 4);
gtk_grid_attach( GTK_GRID(grid), entry, 1, 3, 1, 1 );
// Row 5
hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 2);
label = gtk_label_new("PC:");
gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 2);
dw->pc_entry = gtk_entry_new ();
gtk_entry_set_max_length (GTK_ENTRY (dw->pc_entry), 4);
gtk_entry_set_width_chars (GTK_ENTRY (dw->pc_entry), 4);
gtk_box_pack_start (GTK_BOX (hbox), dw->pc_entry, FALSE, FALSE, 2);
gtk_grid_attach( GTK_GRID(grid), hbox, 0, 4, 1, 1 );
button = gtk_button_new_with_label ("Seek PC");
gtk_grid_attach( GTK_GRID(grid), button, 1, 4, 1, 1 );
// Row 6
grid = gtk_grid_new();
gtk_grid_set_row_homogeneous( GTK_GRID(grid), TRUE );
gtk_grid_set_column_homogeneous( GTK_GRID(grid), TRUE );
gtk_grid_set_row_spacing( GTK_GRID(grid), 5 );
gtk_grid_set_column_spacing( GTK_GRID(grid), 10 );
hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 2);
label = gtk_label_new("A:");
gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 2);
dw->A_entry = gtk_entry_new ();
gtk_entry_set_max_length (GTK_ENTRY (dw->A_entry), 2);
gtk_entry_set_width_chars (GTK_ENTRY (dw->A_entry), 2);
gtk_box_pack_start (GTK_BOX (hbox), dw->A_entry, FALSE, FALSE, 2);
gtk_grid_attach( GTK_GRID(grid), hbox, 0, 0, 1, 1 );
hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 2);
label = gtk_label_new("X:");
gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 2);
dw->X_entry = gtk_entry_new ();
gtk_entry_set_max_length (GTK_ENTRY (dw->X_entry), 2);
gtk_entry_set_width_chars (GTK_ENTRY (dw->X_entry), 2);
gtk_box_pack_start (GTK_BOX (hbox), dw->X_entry, FALSE, FALSE, 2);
gtk_grid_attach( GTK_GRID(grid), hbox, 1, 0, 1, 1 );
hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 2);
label = gtk_label_new("Y:");
gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 2);
dw->Y_entry = gtk_entry_new ();
gtk_entry_set_max_length (GTK_ENTRY (dw->Y_entry), 2);
gtk_entry_set_width_chars (GTK_ENTRY (dw->Y_entry), 2);
gtk_box_pack_start (GTK_BOX (hbox), dw->Y_entry, FALSE, FALSE, 2);
gtk_grid_attach( GTK_GRID(grid), hbox, 2, 0, 1, 1 );
gtk_box_pack_start (GTK_BOX (vbox2), grid, FALSE, FALSE, 2);
// Stack Frame
frame = gtk_frame_new ("Stack");
dw->stackview = (GtkTextView*) gtk_text_view_new();
gtk_text_view_set_monospace( dw->stackview, TRUE );
gtk_text_view_set_overwrite( dw->stackview, TRUE );
gtk_text_view_set_editable( dw->stackview, FALSE );
gtk_text_view_set_wrap_mode( dw->stackview, GTK_WRAP_NONE );
gtk_text_view_set_cursor_visible( dw->stackview, TRUE );
dw->stackTextBuf = gtk_text_view_get_buffer( dw->stackview );
scroll = gtk_scrolled_window_new (NULL, NULL);
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll),
GTK_POLICY_ALWAYS, GTK_POLICY_ALWAYS);
gtk_container_add (GTK_CONTAINER (scroll), GTK_WIDGET(dw->stackview) );
gtk_container_add (GTK_CONTAINER (frame), scroll);
gtk_box_pack_start (GTK_BOX (vbox2), frame, TRUE, TRUE, 2);
/*
* Vertical box 3 contains:
* 1. Breakpoints Frame
* 2. Status Flags Frame
*/
vbox3 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 2);
gtk_box_pack_start (GTK_BOX (hbox1), vbox3, TRUE, TRUE, 2);
/*
* Breakpoints Frame contains:
* 1. Breakpoints tree view
* 2. Add, delete, edit breakpoint button row.
* 3. Break on bad opcodes checkbox/label
*/
frame = gtk_frame_new ("Breakpoints");
vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 3);
gtk_container_add (GTK_CONTAINER (frame), vbox);
gtk_box_pack_start (GTK_BOX (vbox3), frame, TRUE, TRUE, 2);
dw->bp_store =
gtk_tree_store_new (1, G_TYPE_STRING );
dw->bp_tree =
gtk_tree_view_new_with_model (GTK_TREE_MODEL
(dw->bp_store));
renderer = gtk_cell_renderer_text_new ();
g_object_set (renderer, "family", "MonoSpace", NULL);
column = gtk_tree_view_column_new_with_attributes ("Breakpoint", renderer,
"text", 0, NULL);
gtk_tree_view_append_column (GTK_TREE_VIEW (dw->bp_tree), column);
scroll = gtk_scrolled_window_new (NULL, NULL);
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll),
GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
gtk_container_add (GTK_CONTAINER (scroll), dw->bp_tree);
gtk_box_pack_start (GTK_BOX (vbox), scroll, TRUE, TRUE, 1);
hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 3);
gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 1);
button = gtk_button_new_with_label ("Add");
gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 2);
button = gtk_button_new_with_label ("Delete");
gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 2);
button = gtk_button_new_with_label ("Edit");
gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 2);
button = gtk_check_button_new_with_label("Break on Bad Opcodes");
gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 1);
// Status Flags Frame
frame = gtk_frame_new ("Status Flags");
grid = gtk_grid_new();
gtk_grid_set_row_homogeneous( GTK_GRID(grid), TRUE );
gtk_grid_set_column_homogeneous( GTK_GRID(grid), TRUE );
gtk_grid_set_row_spacing( GTK_GRID(grid), 5 );
gtk_grid_set_column_spacing( GTK_GRID(grid), 10 );
button = gtk_check_button_new_with_label("N");
gtk_grid_attach( GTK_GRID(grid), button, 0, 0, 1, 1 );
button = gtk_check_button_new_with_label("V");
gtk_grid_attach( GTK_GRID(grid), button, 1, 0, 1, 1 );
button = gtk_check_button_new_with_label("U");
gtk_grid_attach( GTK_GRID(grid), button, 2, 0, 1, 1 );
button = gtk_check_button_new_with_label("B");
gtk_grid_attach( GTK_GRID(grid), button, 3, 0, 1, 1 );
button = gtk_check_button_new_with_label("D");
gtk_grid_attach( GTK_GRID(grid), button, 0, 1, 1, 1 );
button = gtk_check_button_new_with_label("I");
gtk_grid_attach( GTK_GRID(grid), button, 1, 1, 1, 1 );
button = gtk_check_button_new_with_label("Z");
gtk_grid_attach( GTK_GRID(grid), button, 2, 1, 1, 1 );
button = gtk_check_button_new_with_label("C");
gtk_grid_attach( GTK_GRID(grid), button, 3, 1, 1, 1 );
gtk_container_add (GTK_CONTAINER (frame), grid);
gtk_box_pack_start (GTK_BOX (vbox3), frame, FALSE, FALSE, 2);
/*
* End Vertical Box 3
*/
gtk_box_pack_start (GTK_BOX (main_hbox), vbox1, TRUE, TRUE, 2);
gtk_box_pack_start (GTK_BOX
(gtk_dialog_get_content_area
(GTK_DIALOG (dw->win))), main_hbox, TRUE, TRUE,
0);
g_signal_connect (dw->win, "delete-event",
G_CALLBACK (closeDebuggerWindow), dw);
g_signal_connect (dw->win, "response",
G_CALLBACK (closeDebuggerWindow), dw);
gtk_widget_show_all (dw->win);
return;
}

View File

@ -0,0 +1,3 @@
// debugger.h
//
void openDebuggerWindow (void);

View File

@ -18,6 +18,7 @@
#include "icon.xpm"
#include "memview.h"
#include "ramwatch.h"
#include "debugger.h"
#ifdef _S9XLUA_H
#include "../../fceulua.h"
@ -2881,6 +2882,17 @@ static GtkWidget *CreateMenubar (GtkWidget * window)
gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
//-Tools --> Debugger ---------------------
item = gtk_menu_item_new_with_label ("Debugger");
g_signal_connect (item, "activate", G_CALLBACK (openDebuggerWindow),
NULL);
//gtk_widget_add_accelerator( item, "activate", accel_group,
// GDK_KEY_o, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);
gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
//---------------------------------------
// Create Movie Menu
item = gtk_menu_item_new_with_label ("Movie");