X-Git-Url: http://gitweb.hugovil.com/?a=blobdiff_plain;f=src%2Fgtk%2Femugtk.c;h=3374d62b9ccdcddfa4303514ea965a4c7b436f15;hb=d755f9638255472107ae445f4f82d8fcd3446b20;hp=308bdeb0c642d38c4621bcf47e223483b7ed5be1;hpb=702da8f53198200be75f7b78011c3ffb1f4936a8;p=emu8051.git diff --git a/src/gtk/emugtk.c b/src/gtk/emugtk.c index 308bdeb..3374d62 100644 --- a/src/gtk/emugtk.c +++ b/src/gtk/emugtk.c @@ -41,17 +41,23 @@ #include "filemenu.h" #include "viewmenu.h" #include "helpmenu.h" +#include "messagebox.h" #include "regwin.h" #include "pgmwin.h" #include "memwin.h" #include "pswwin.h" +#include "timerwin.h" #include "app-config.h" #define BUTTONS_BORDER 2 static int running; static int running_function_tag; -static int restart_gui = true; + +static int emugtk_window_init_complete; +static GtkWidget *vpaned1; +static GtkWidget *scrollwin_int; +static GtkWidget *scrollwin_ext; GtkWidget *mainwin; @@ -65,11 +71,12 @@ emugtk_UpdateDisplay(void) regwin_refresh(); pgmwin_refresh(); pswwin_refresh(); + timerwin_update(); - if (cfg->view_int_memory) + if (cfg->view_int_memory && scrollwin_int) memwin_refresh(INT_MEM_ID); - if (cfg->view_ext_memory) + if (cfg->view_ext_memory && scrollwin_ext) memwin_refresh(EXT_MEM_ID); } @@ -89,13 +96,14 @@ emugtk_stop_running() static gboolean emugtk_running(gpointer data) { + int breakpoint_hit; + (void) data; /* Remove compiler warning about unused variable. */ - cpu8051_Exec(); - if (IsBreakpoint(cpu8051.pc)) { - log_info("Breakpoint Hit"); + breakpoint_hit = cpu8051_run(1, NULL); + + if (breakpoint_hit) emugtk_stop_running(); - } return TRUE; } @@ -315,53 +323,93 @@ main_paned_notify_event(GtkWindow *window, GdkEvent *event, gpointer data) } void -emugtk_restart_gui(void) +emugtk_quit_gui(void) { - emugtk_stop_running(); + gtk_main_quit(); +} - gtk_widget_destroy(mainwin); +static void +emugtk_show_memory_paned(void) +{ + gtk_widget_show_all(mainwin); + emugtk_UpdateDisplay(); +} - restart_gui = true; +void +emugtk_create_int_memory_paned(void) +{ + scrollwin_int = memwin_init("Internal memory (IRAM)", + INT_MEM_ID); + gtk_paned_pack1(GTK_PANED(vpaned1), scrollwin_int, + FALSE, FALSE); + if (emugtk_window_init_complete == true) + emugtk_show_memory_paned(); } void -emugtk_quit_gui(void) +emugtk_destroy_int_memory_paned(void) { - gtk_main_quit(); + if (scrollwin_int == NULL) + return; + + gtk_widget_destroy(scrollwin_int); + scrollwin_int = NULL; +} + +void +emugtk_create_ext_memory_paned(void) +{ + scrollwin_ext = memwin_init("External memory (XRAM)", + EXT_MEM_ID); + + gtk_paned_pack2(GTK_PANED(vpaned1), scrollwin_ext, + TRUE, FALSE); + + if (emugtk_window_init_complete == true) + emugtk_show_memory_paned(); +} + +void +emugtk_destroy_ext_memory_paned(void) +{ + if (scrollwin_ext == NULL) + return; - restart_gui = false; + gtk_widget_destroy(scrollwin_ext); + scrollwin_ext = NULL; +} + +void +emugtk_recreate_memory_paned(void) +{ + if (cfg->view_int_memory) { + emugtk_destroy_int_memory_paned(); + emugtk_create_int_memory_paned(); + } + + if (cfg->view_ext_memory) { + emugtk_destroy_ext_memory_paned(); + emugtk_create_ext_memory_paned(); + } + + if (emugtk_window_init_complete == true) + emugtk_show_memory_paned(); } static GtkWidget * emugtk_create_memory_paned(void) { - GtkWidget *vpaned; - GtkWidget *scrollwin; - /* Create vpaned (memory windows) only if necessary. */ if (cfg->view_int_memory || cfg->view_ext_memory) { - vpaned = gtk_vpaned_new(); - gtk_paned_set_position(GTK_PANED(vpaned), cfg->vpane_pos); - g_signal_connect(G_OBJECT(vpaned), "notify::position", - G_CALLBACK(vpaned_notify_event), vpaned); - - /* Internal memory dump frame. */ - if (cfg->view_int_memory) { - scrollwin = memwin_init("Internal memory (IRAM)", - INT_MEM_ID); - gtk_paned_pack1(GTK_PANED(vpaned), scrollwin, - FALSE, FALSE); - } - - /* External memory dump frame. */ - if (cfg->view_ext_memory) { - scrollwin = memwin_init("External memory (XRAM)", - EXT_MEM_ID); - gtk_paned_pack2(GTK_PANED(vpaned), scrollwin, - TRUE, FALSE); - } - - return vpaned; + vpaned1 = gtk_vpaned_new(); + + gtk_paned_set_position(GTK_PANED(vpaned1), cfg->vpane_pos); + g_signal_connect(G_OBJECT(vpaned1), "notify::position", + G_CALLBACK(vpaned_notify_event), vpaned1); + + emugtk_recreate_memory_paned(); + + return vpaned1; } else return NULL; } @@ -438,6 +486,8 @@ emugtk_window_init(void) GtkWidget *vpaned; GtkWidget *main_paned; + emugtk_window_init_complete = false; + mainwin = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(mainwin), PACKAGE); gtk_window_set_default_size(GTK_WINDOW(mainwin), @@ -460,6 +510,9 @@ emugtk_window_init(void) scrollwin = pswwin_init(); gtk_box_pack_start(GTK_BOX(buttons_bar), scrollwin, FALSE, FALSE, 100); + scrollwin = timerwin_init(); + gtk_box_pack_start(GTK_BOX(buttons_bar), scrollwin, FALSE, FALSE, 100); + /* hpaned will contain registers and disassembly windows. */ hpaned = gtk_hpaned_new(); gtk_paned_set_position(GTK_PANED(hpaned), cfg->hpane_pos); @@ -509,6 +562,8 @@ emugtk_window_init(void) g_signal_connect(mainwin, "destroy", G_CALLBACK(emugtk_quit_gui), NULL); gtk_widget_show_all(mainwin); + + emugtk_window_init_complete = true; } void @@ -523,19 +578,26 @@ AddMenuSeparator(GtkWidget *menu) void emugtk_new_file(char *file) { - emugtk_stop_running(); + int rc; - LoadHexFile(file); + emugtk_stop_running(); - if (cfg->clear_ram_on_file_load) - emugtk_Reset(); + rc = LoadHexFile(file); + if (rc == false) { + message_show_error("Error parsing hex file"); + } else { + if (cfg->clear_ram_on_file_load) + emugtk_Reset(); - emugtk_UpdateDisplay(); + emugtk_UpdateDisplay(); + } } int main(int argc, char **argv) { + int rc_load_hexfile = true; + parse_command_line_options(argc, argv); app_config_load(); @@ -546,17 +608,18 @@ main(int argc, char **argv) gtk_init(&argc, &argv); if (options.filename != NULL) - LoadHexFile(options.filename); + rc_load_hexfile = LoadHexFile(options.filename); cpu8051_Reset(); - while (restart_gui == true) { - log_info("Init GUI"); + log_info("Init GUI"); + emugtk_window_init(); + emugtk_UpdateDisplay(); - emugtk_window_init(); - emugtk_UpdateDisplay(); - gtk_main(); - } + if (rc_load_hexfile == false) + message_show_error("Error parsing hex file"); + + gtk_main(); log_info("Terminate");