Add general-purpose timer to GUI
[emu8051.git] / src / gtk / emugtk.c
index 308bdeb..72b7ea5 100644 (file)
 #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 +70,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 +95,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 +322,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();
+}
+
+static void
+emugtk_show_memory_paned(void)
+{
+       gtk_widget_show_all(mainwin);
+       emugtk_UpdateDisplay();
+}
 
-       gtk_widget_destroy(mainwin);
+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();
+}
 
-       restart_gui = true;
+void
+emugtk_destroy_int_memory_paned(void)
+{
+       if (scrollwin_int == NULL)
+               return;
+
+       gtk_widget_destroy(scrollwin_int);
+       scrollwin_int = NULL;
 }
 
 void
-emugtk_quit_gui(void)
+emugtk_create_ext_memory_paned(void)
 {
-       gtk_main_quit();
+       scrollwin_ext = memwin_init("External memory (XRAM)",
+                                   EXT_MEM_ID);
 
-       restart_gui = false;
+       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;
+
+       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 +485,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 +509,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 +561,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
@@ -550,13 +604,10 @@ main(int argc, char **argv)
 
        cpu8051_Reset();
 
-       while (restart_gui == true) {
-               log_info("Init GUI");
-
-               emugtk_window_init();
-               emugtk_UpdateDisplay();
-               gtk_main();
-       }
+       log_info("Init GUI");
+       emugtk_window_init();
+       emugtk_UpdateDisplay();
+       gtk_main();
 
        log_info("Terminate");