Added logic to capture asm list.
This commit is contained in:
parent
c50b5581d6
commit
db17dc06e6
|
@ -43,6 +43,26 @@ extern Config *g_config;
|
||||||
//*******************************************************************************************************
|
//*******************************************************************************************************
|
||||||
//
|
//
|
||||||
|
|
||||||
|
struct dbg_asm_entry_t
|
||||||
|
{
|
||||||
|
int addr;
|
||||||
|
int bank;
|
||||||
|
int rom;
|
||||||
|
int size;
|
||||||
|
uint8 opcode[3];
|
||||||
|
|
||||||
|
|
||||||
|
dbg_asm_entry_t(void)
|
||||||
|
{
|
||||||
|
addr = 0; bank = 0; rom = -1; size = 0;
|
||||||
|
|
||||||
|
for (int i=0; i<3; i++)
|
||||||
|
{
|
||||||
|
opcode[i] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
struct debuggerWin_t
|
struct debuggerWin_t
|
||||||
{
|
{
|
||||||
GtkWidget *win;
|
GtkWidget *win;
|
||||||
|
@ -92,6 +112,8 @@ struct debuggerWin_t
|
||||||
int bpEditIdx;
|
int bpEditIdx;
|
||||||
char displayROMoffsets;
|
char displayROMoffsets;
|
||||||
|
|
||||||
|
std::vector <dbg_asm_entry_t*> asmEntry;
|
||||||
|
|
||||||
debuggerWin_t(void)
|
debuggerWin_t(void)
|
||||||
{
|
{
|
||||||
win = NULL;
|
win = NULL;
|
||||||
|
@ -137,9 +159,10 @@ struct debuggerWin_t
|
||||||
|
|
||||||
~debuggerWin_t(void)
|
~debuggerWin_t(void)
|
||||||
{
|
{
|
||||||
|
asmClear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void asmClear(void);
|
||||||
void bpListUpdate(void);
|
void bpListUpdate(void);
|
||||||
void updateViewPort(void);
|
void updateViewPort(void);
|
||||||
void updateRegisterView(void);
|
void updateRegisterView(void);
|
||||||
|
@ -149,6 +172,15 @@ struct debuggerWin_t
|
||||||
|
|
||||||
static std::list <debuggerWin_t*> debuggerWinList;
|
static std::list <debuggerWin_t*> debuggerWinList;
|
||||||
|
|
||||||
|
void debuggerWin_t::asmClear(void)
|
||||||
|
{
|
||||||
|
for (size_t i=0; i<asmEntry.size(); i++)
|
||||||
|
{
|
||||||
|
delete asmEntry[i];
|
||||||
|
}
|
||||||
|
asmEntry.clear();
|
||||||
|
}
|
||||||
|
|
||||||
int debuggerWin_t::get_bpList_selrow(void)
|
int debuggerWin_t::get_bpList_selrow(void)
|
||||||
{
|
{
|
||||||
int retval = -1, numListRows;
|
int retval = -1, numListRows;
|
||||||
|
@ -396,6 +428,7 @@ void debuggerWin_t::updateAssemblyView(void)
|
||||||
char chr[64];
|
char chr[64];
|
||||||
uint8 opcode[3];
|
uint8 opcode[3];
|
||||||
const char *disassemblyText = NULL;
|
const char *disassemblyText = NULL;
|
||||||
|
dbg_asm_entry_t *a;
|
||||||
|
|
||||||
start_address_lp = starting_address = X.PC;
|
start_address_lp = starting_address = X.PC;
|
||||||
|
|
||||||
|
@ -412,6 +445,8 @@ void debuggerWin_t::updateAssemblyView(void)
|
||||||
start_address_lp = starting_address;
|
start_address_lp = starting_address;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
asmClear();
|
||||||
|
|
||||||
addr = starting_address;
|
addr = starting_address;
|
||||||
|
|
||||||
for (int i=0; i < 64; i++)
|
for (int i=0; i < 64; i++)
|
||||||
|
@ -421,6 +456,8 @@ void debuggerWin_t::updateAssemblyView(void)
|
||||||
// PC pointer
|
// PC pointer
|
||||||
if (addr > 0xFFFF) break;
|
if (addr > 0xFFFF) break;
|
||||||
|
|
||||||
|
a = new dbg_asm_entry_t;
|
||||||
|
|
||||||
instruction_addr = addr;
|
instruction_addr = addr;
|
||||||
|
|
||||||
if (addr == X.PC)
|
if (addr == X.PC)
|
||||||
|
@ -431,16 +468,20 @@ void debuggerWin_t::updateAssemblyView(void)
|
||||||
{
|
{
|
||||||
line.assign(" ");
|
line.assign(" ");
|
||||||
}
|
}
|
||||||
|
a->addr = addr;
|
||||||
|
|
||||||
if (addr >= 0x8000)
|
if (addr >= 0x8000)
|
||||||
{
|
{
|
||||||
if (displayROMoffsets && (GetNesFileAddress(addr) != -1) )
|
a->bank = getBank(addr);
|
||||||
|
a->rom = GetNesFileAddress(addr);
|
||||||
|
|
||||||
|
if (displayROMoffsets && (a->rom != -1) )
|
||||||
{
|
{
|
||||||
sprintf(chr, " %06X: ", GetNesFileAddress(addr));
|
sprintf(chr, " %06X: ", a->rom);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
sprintf(chr, "%02X:%04X: ", getBank(addr), addr);
|
sprintf(chr, "%02X:%04X: ", a->bank, addr);
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
{
|
{
|
||||||
|
@ -482,6 +523,11 @@ void debuggerWin_t::updateAssemblyView(void)
|
||||||
line.append( disassemblyText );
|
line.append( disassemblyText );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
for (int j=0; j<size; j++)
|
||||||
|
{
|
||||||
|
a->opcode[j] = opcode[j];
|
||||||
|
}
|
||||||
|
a->size = size;
|
||||||
|
|
||||||
// special case: an RTS opcode
|
// special case: an RTS opcode
|
||||||
if (GetMem(instruction_addr) == 0x60)
|
if (GetMem(instruction_addr) == 0x60)
|
||||||
|
@ -493,6 +539,8 @@ void debuggerWin_t::updateAssemblyView(void)
|
||||||
//printf("%s", line.c_str() );
|
//printf("%s", line.c_str() );
|
||||||
|
|
||||||
block.append( line );
|
block.append( line );
|
||||||
|
|
||||||
|
asmEntry.push_back(a);
|
||||||
}
|
}
|
||||||
|
|
||||||
gtk_text_buffer_set_text( textbuf, block.c_str(), -1 );
|
gtk_text_buffer_set_text( textbuf, block.c_str(), -1 );
|
||||||
|
@ -503,7 +551,7 @@ void debuggerWin_t::updateViewPort(void)
|
||||||
{
|
{
|
||||||
updateRegisterView();
|
updateRegisterView();
|
||||||
updateAssemblyView();
|
updateAssemblyView();
|
||||||
|
bpListUpdate();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void handleDialogResponse (GtkWidget * w, gint response_id, debuggerWin_t * dw)
|
static void handleDialogResponse (GtkWidget * w, gint response_id, debuggerWin_t * dw)
|
||||||
|
@ -1044,6 +1092,66 @@ static void debugRunLine128CB (GtkButton * button, debuggerWin_t * dw)
|
||||||
}
|
}
|
||||||
FCEUI_SetEmulationPaused(0);
|
FCEUI_SetEmulationPaused(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
populate_context_menu (GtkWidget *popup,
|
||||||
|
debuggerWin_t * dw )
|
||||||
|
{
|
||||||
|
GtkWidget *menu = NULL;
|
||||||
|
GtkWidget *item;
|
||||||
|
GtkTextIter iter;
|
||||||
|
char stmp[256];
|
||||||
|
gint cpos, lineNum;
|
||||||
|
int addr;
|
||||||
|
|
||||||
|
g_object_get( dw->textbuf, "cursor-position", &cpos, NULL );
|
||||||
|
|
||||||
|
gtk_text_buffer_get_iter_at_offset( dw->textbuf, &iter, cpos );
|
||||||
|
|
||||||
|
lineNum = gtk_text_iter_get_line( &iter );
|
||||||
|
|
||||||
|
if ( (lineNum < 0) || (lineNum >= (int)dw->asmEntry.size() ) )
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
addr = dw->asmEntry[lineNum]->addr;
|
||||||
|
|
||||||
|
//printf("Context Menu: CP:%i Line:%i Addr:0x%04X\n", cpos, lineNum, addr );
|
||||||
|
|
||||||
|
menu = gtk_menu_new ();
|
||||||
|
|
||||||
|
sprintf( stmp, "Add Breakpoint at 0x%04X", addr );
|
||||||
|
|
||||||
|
item = gtk_menu_item_new_with_label( stmp );
|
||||||
|
|
||||||
|
gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
|
||||||
|
|
||||||
|
//g_signal_connect (item, "activate",
|
||||||
|
// G_CALLBACK (setValueCB), mv);
|
||||||
|
|
||||||
|
gtk_menu_popup_at_pointer (GTK_MENU (menu), NULL );
|
||||||
|
//gtk_widget_show_all (popup);
|
||||||
|
gtk_widget_show_all (menu);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
textview_button_press_cb (GtkWidget *widget,
|
||||||
|
GdkEventButton *event,
|
||||||
|
debuggerWin_t * dw )
|
||||||
|
{
|
||||||
|
gboolean ret = FALSE;
|
||||||
|
//printf("Press Button %i %u\n", event->type, event->button );
|
||||||
|
|
||||||
|
if ( event->button == 3 )
|
||||||
|
{
|
||||||
|
ret = populate_context_menu( widget, dw );
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
static void romOffsetToggleCB( GtkToggleButton *togglebutton, debuggerWin_t * dw)
|
static void romOffsetToggleCB( GtkToggleButton *togglebutton, debuggerWin_t * dw)
|
||||||
{
|
{
|
||||||
dw->displayROMoffsets = gtk_toggle_button_get_active( togglebutton );
|
dw->displayROMoffsets = gtk_toggle_button_get_active( togglebutton );
|
||||||
|
@ -1146,6 +1254,9 @@ void openDebuggerWindow (void)
|
||||||
gtk_text_view_set_wrap_mode( dw->textview, GTK_WRAP_NONE );
|
gtk_text_view_set_wrap_mode( dw->textview, GTK_WRAP_NONE );
|
||||||
gtk_text_view_set_cursor_visible( dw->textview, TRUE );
|
gtk_text_view_set_cursor_visible( dw->textview, TRUE );
|
||||||
|
|
||||||
|
g_signal_connect (dw->textview, "button-press-event",
|
||||||
|
G_CALLBACK (textview_button_press_cb), dw);
|
||||||
|
|
||||||
dw->textbuf = gtk_text_view_get_buffer( dw->textview );
|
dw->textbuf = gtk_text_view_get_buffer( dw->textview );
|
||||||
|
|
||||||
scroll = gtk_scrolled_window_new (NULL, NULL);
|
scroll = gtk_scrolled_window_new (NULL, NULL);
|
||||||
|
|
Loading…
Reference in New Issue