RAM watch entry window bug fixes.

This commit is contained in:
Matthew Budd 2020-05-06 08:36:08 -04:00
parent ab5d3f5f14
commit 4490f650f1
1 changed files with 97 additions and 22 deletions

View File

@ -86,16 +86,35 @@ struct ramWatch_t
std::string name; std::string name;
int addr; int addr;
int type; int type;
int size;
union { union {
int8_t i; int8_t i8;
uint8_t u; uint8_t u8;
int16_t i16;
uint16_t u16;
} val; } val;
ramWatch_t(void) ramWatch_t(void)
{ {
addr = 0; type = 0; val.u = 0; addr = 0; type = 0; size = 0; val.u16 = 0;
}; };
void updateMem(void)
{
if ( size == 1)
{
val.u8 = GetMem( addr );
}
else if ( size == 2)
{
val.u16 = GetMem( addr ) | (GetMem( addr+1 ) << 8);
}
else
{
val.u8 = GetMem( addr );
}
}
}; };
struct ramWatchList_t struct ramWatchList_t
@ -124,23 +143,27 @@ struct ramWatchList_t
size_t size(void){ return ls.size(); }; size_t size(void){ return ls.size(); };
void add_entry( const char *name, int addr, int type ) void add_entry( const char *name, int addr, int type, int size )
{ {
ramWatch_t *rw = new ramWatch_t; ramWatch_t *rw = new ramWatch_t;
rw->name.assign(name); rw->name.assign(name);
rw->addr = addr; rw->addr = addr;
rw->type = type; rw->type = type;
rw->size = size;
ls.push_back(rw); ls.push_back(rw);
} }
void updateMemoryValues(void) void updateMemoryValues(void)
{ {
ramWatch_t *rw;
std::list <ramWatch_t*>::iterator it; std::list <ramWatch_t*>::iterator it;
for (it=ls.begin(); it!=ls.end(); it++) for (it=ls.begin(); it!=ls.end(); it++)
{ {
(*it)->val.u = GetMem( (*it)->addr ); rw = *it;
rw->updateMem();
} }
} }
}; };
@ -1474,6 +1497,9 @@ void toggleAutoResume (GtkToggleAction *action)
g_config->setOption("SDL.AutoResume", (int)autoResume); g_config->setOption("SDL.AutoResume", (int)autoResume);
AutoResumePlay = autoResume; AutoResumePlay = autoResume;
} }
//*******************************************************************************************************
// Cheat Window
//*******************************************************************************************************
static int ShowCheatSearchResultsCallB(uint32 a, uint8 last, uint8 current) static int ShowCheatSearchResultsCallB(uint32 a, uint8 last, uint8 current)
{ {
@ -2278,14 +2304,26 @@ static void showRamWatchResults(void)
rw = *it; rw = *it;
sprintf( addrStr, "0x%04x", rw->addr ); sprintf( addrStr, "0x%04x", rw->addr );
rw->val.u = GetMem(rw->addr); rw->updateMem();
if ( rw->size == 2 )
{
if ( rw->type ){ if ( rw->type ){
sprintf( valStr1, "%4u", rw->val.u); sprintf( valStr1, "%6u", rw->val.u16);
} else { } else {
sprintf( valStr1, "%4i", rw->val.i); sprintf( valStr1, "%6i", rw->val.i16);
}
sprintf( valStr2, "0x%04x", rw->val.u16);
}
else
{
if ( rw->type ){
sprintf( valStr1, "%6u", rw->val.u8);
} else {
sprintf( valStr1, "%6i", rw->val.i8);
}
sprintf( valStr2, "0x%02x", rw->val.u8);
} }
sprintf( valStr2, "0x%02x", rw->val.u);
gtk_tree_store_set(ram_watch_store, &iter, gtk_tree_store_set(ram_watch_store, &iter,
0, addrStr, 1, valStr1, 2, valStr2, 3, rw->name.c_str(), 0, addrStr, 1, valStr1, 2, valStr2, 3, rw->name.c_str(),
@ -2394,7 +2432,7 @@ static GtkWidget* CreateRamWatchMenubar( GtkWidget* window)
return gtk_ui_manager_get_widget (ui_manager, "/Menubar"); return gtk_ui_manager_get_widget (ui_manager, "/Menubar");
} }
static int openRamWatchEntryDialog( char *name, int *addr, int *type ) static int openRamWatchEntryDialog( char *name, int *addr, int *type, int *size )
{ {
int retval; int retval;
GtkWidget* win; GtkWidget* win;
@ -2402,6 +2440,7 @@ static int openRamWatchEntryDialog( char *name, int *addr, int *type )
GtkWidget* hbox; GtkWidget* hbox;
GtkWidget* label; GtkWidget* label;
GtkWidget* chkbox; GtkWidget* chkbox;
GtkWidget* button1, *button2, *button4;
GtkWidget* txt_entry_name; GtkWidget* txt_entry_name;
GtkWidget* txt_entry_addr; GtkWidget* txt_entry_addr;
char stmp[32]; char stmp[32];
@ -2413,7 +2452,7 @@ static int openRamWatchEntryDialog( char *name, int *addr, int *type )
NULL); NULL);
gtk_window_set_default_size(GTK_WINDOW(win), 400, 200); gtk_window_set_default_size(GTK_WINDOW(win), 400, 200);
vbox = gtk_vbox_new(FALSE, 4); vbox = gtk_vbox_new(FALSE, 6);
label = gtk_label_new("Name:"); label = gtk_label_new("Name:");
txt_entry_name = gtk_entry_new(); txt_entry_name = gtk_entry_new();
@ -2444,7 +2483,27 @@ static int openRamWatchEntryDialog( char *name, int *addr, int *type )
chkbox = gtk_check_button_new_with_label("Value is Unsigned"); chkbox = gtk_check_button_new_with_label("Value is Unsigned");
gtk_box_pack_start (GTK_BOX(vbox), chkbox, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX(vbox), chkbox, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(win))), vbox, TRUE, TRUE, 0); hbox = gtk_hbox_new(FALSE, 4);
label = gtk_label_new("Size in Bytes:");
button1 = gtk_radio_button_new_with_label (NULL, "1");
//gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
gtk_box_pack_start (GTK_BOX(hbox), label, FALSE, FALSE, 1);
gtk_box_pack_start (GTK_BOX(hbox), button1, TRUE, FALSE, 1);
button2 = gtk_radio_button_new_with_label_from_widget ( GTK_RADIO_BUTTON (button1), "2");
gtk_box_pack_start (GTK_BOX(hbox), button2, TRUE, FALSE, 1);
button4 = gtk_radio_button_new_with_label_from_widget ( GTK_RADIO_BUTTON (button1), "4");
gtk_box_pack_start (GTK_BOX(hbox), button4, TRUE, FALSE, 1);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button1), TRUE);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button2), FALSE);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button4), FALSE);
gtk_box_pack_start (GTK_BOX(vbox), hbox, FALSE, TRUE, 1);
gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(win))), vbox, TRUE, TRUE, 1);
gtk_widget_show_all(win); gtk_widget_show_all(win);
@ -2461,8 +2520,24 @@ static int openRamWatchEntryDialog( char *name, int *addr, int *type )
*type = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(chkbox) ); *type = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(chkbox) );
if ( gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(button4) ) )
{
*size = 4;
}
else if ( gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(button2) ) )
{
*size = 2;
}
else
{
*size = 1;
}
//printf("retval %i\n", retval ); //printf("retval %i\n", retval );
g_signal_connect(win, "delete-event", G_CALLBACK(closeDialog), NULL);
g_signal_connect(win, "response", G_CALLBACK(closeDialog), NULL);
gtk_widget_destroy(win); gtk_widget_destroy(win);
return 0; return 0;
@ -2472,10 +2547,10 @@ static void editRamWatch( GtkButton *button,
void *userData ) void *userData )
{ {
char name[256]; char name[256];
int addr = 0, type = 0; int addr = 0, type = 0, size = 0;
name[0] = 0; name[0] = 0;
openRamWatchEntryDialog( name, &addr, &type ); openRamWatchEntryDialog( name, &addr, &type, &size );
printf("Edit RamWatch '%s' 0x%04x %i\n", name, addr, type); printf("Edit RamWatch '%s' 0x%04x %i %i\n", name, addr, type, size);
} }
static void removeRamWatch( GtkButton *button, static void removeRamWatch( GtkButton *button,
@ -2488,19 +2563,19 @@ static void newRamWatch( GtkButton *button,
void *userData ) void *userData )
{ {
char name[256]; char name[256];
int addr = 0, type = 0; int addr = 0, type = 0, size = 0;
name[0] = 0; name[0] = 0;
openRamWatchEntryDialog( name, &addr, &type ); openRamWatchEntryDialog( name, &addr, &type, &size );
printf("New RamWatch '%s' 0x%04x %i\n", name, addr, type); printf("New RamWatch '%s' 0x%04x %i %i\n", name, addr, type, size);
ramWatchList.add_entry( name, addr, type ); ramWatchList.add_entry( name, addr, type, size );
showRamWatchResults(); showRamWatchResults();
} }
static gint updateRamWatchTree( void *userData ) static gint updateRamWatchTree( void *userData )
{ {
static uint32_t c = 0; //static uint32_t c = 0;
//printf("RamWatch: %u\n", c++ ); //printf("RamWatch: %u\n", c++ );
showRamWatchResults(); showRamWatchResults();
return 1; return 1;