X-Git-Url: http://gitweb.hugovil.com/?a=blobdiff_plain;f=src%2Femugtk.c;h=45448a2f13db05a2ccb31f264b2a01ef556dc454;hb=fb3b3529579773b8a14959cc6bc5bb2096fd0fe8;hp=3e8d6fbc849ce6e144657ceb69035d9aae91735a;hpb=4c305c73f8110d03b99cec045b3c5741867fd46b;p=emu8051.git diff --git a/src/emugtk.c b/src/emugtk.c index 3e8d6fb..45448a2 100644 --- a/src/emugtk.c +++ b/src/emugtk.c @@ -1,494 +1,307 @@ -/* emugtk.c */ - +/* + * emugtk.c + * + * Copyright (C) 1999 Jonathan St-André + * Copyright (C) 1999 Hugo Villeneuve + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. + */ #include #include "config.h" #include + +#include "common.h" +#include "cpu8051.h" +#include "options.h" +#include "hexfile.h" + #include "emugtk.h" #include "reset.xpm" #include "run.xpm" #include "stop.xpm" #include "step.xpm" - -#include "cpu8051.h" -#include "options.h" -#include "file.h" +#include "filemenu.h" +#include "viewmenu.h" +#include "helpmenu.h" #include "regwin.h" #include "pgmwin.h" #include "memwin.h" +static int RunningState; +static int RunFuncTag; +static GtkWidget *mainwin; -int NbSignals = 0; -int SignalsData[ 32 ]; - -enum { - DestroySignal=0, - DeleteSignal, - OpenISignal, - QuitISignal, - AboutISignal, - ResetBSignal, - RunBSignal, - StopBSignal, - StepBSignal -}; +/* Signal DestroyEvent */ +static void +WindowDestroyEvent( GtkWidget *widget, gpointer data ) +{ +#ifdef EMU8051_DEBUG + g_print( "emugtk_DestroyEvent(...)\n" ); +#endif + gtk_main_quit(); +} -/* private */ -int EmuGtkID; -int RunningState; -int RunFuncTag; -GtkWidget *emuwin, *emufixed, *emumainfixed; -GtkWidget *regfrm, *pgmfrm, *memfrm; -GtkWidget *ButtonTable; +/* Taken from the Gxine source code. */ +static GtkWidget * +AddPixButton( GtkWidget *box, gchar **pixmap_array ) +{ + GtkWidget *button, *icon; + GdkPixmap *image; + GdkBitmap *transparent; -GtkWidget *FileMenu, *OpenItem, *QuitItem, *FileItem; -GtkWidget *ViewMenu, *ExtMemItem, *IntMemItem, *ViewItem; + button = gtk_button_new(); + gtk_button_set_relief (GTK_BUTTON(button), GTK_RELIEF_NORMAL ); + image = gdk_pixmap_colormap_create_from_xpm_d(NULL, gdk_colormap_get_system(), + &transparent, NULL, pixmap_array); + icon = gtk_pixmap_new( image, transparent ); + gtk_container_add( GTK_CONTAINER(button), icon ); -GtkWidget *HelpMenu, *AboutItem, *LicenseItem, *HelpItem; -GtkWidget *MenuBar; + gtk_box_pack_start( GTK_BOX(box), button, FALSE, FALSE, 0 ); -// RESET button -GdkBitmap *RESET_mask; -GdkPixmap *RESET_pixmap; -GtkWidget *RESET_widget; -GtkWidget *ButtonReset; + return button; +} -// RUN button -GdkBitmap *RUN_mask; -GdkPixmap *RUN_pixmap; -GtkWidget *RUN_widget; -GtkWidget *ButtonRun; -// STOP button -GdkBitmap *STOP_mask; -GdkPixmap *STOP_pixmap; -GtkWidget *STOP_widget; -GtkWidget *ButtonStop; +/* Creates the Reset, Run, Stop and Step buttons. */ +static GtkWidget * +AddButtons( void ) +{ + GtkWidget *button_hbox; + GtkWidget *button; + + /* The buttons of the hbox are NOT given equal space in the box. */ + button_hbox = gtk_hbox_new( FALSE, 0 ); + + /* Creating the RESET button. */ + button = AddPixButton( button_hbox, reset_xpm ); + gtk_signal_connect( GTK_OBJECT(button), "clicked", + GTK_SIGNAL_FUNC(emugtk_ResetEvent), + NULL ); + + /* Creating the RUN button. */ + button = AddPixButton( button_hbox, run_xpm ); + gtk_signal_connect( GTK_OBJECT(button), "clicked", + GTK_SIGNAL_FUNC(emugtk_RunEvent), + NULL ); + + /* Creating STOP button. */ + button = AddPixButton( button_hbox, stop_xpm ); + gtk_signal_connect( GTK_OBJECT(button), "clicked", + GTK_SIGNAL_FUNC(emugtk_StopEvent), + NULL ); + + /* Creating STEP button. */ + button = AddPixButton( button_hbox, step_xpm ); + gtk_signal_connect( GTK_OBJECT(button), "clicked", + GTK_SIGNAL_FUNC(emugtk_StepEvent), + NULL ); + + return button_hbox; +} -// STEP button -GdkBitmap *STEP_mask; -GdkPixmap *STEP_pixmap; -GtkWidget *STEP_widget; -GtkWidget *ButtonStep; +GtkWidget * +AddMenu( void ) +{ + GtkWidget *menu_bar; + /* Creating menu item. */ + menu_bar = gtk_menu_bar_new(); -#define EXIT_SUCCESS 0 + /* Adding the 'File' submenu */ + FileAddMenu( menu_bar ); + /* Adding the 'View' submenu */ + ViewAddMenu( menu_bar ); + + /* Adding the 'Help' submenu */ + HelpAddMenu( menu_bar ); -/* in cpu8051.c */ -extern unsigned int PC; + gtk_widget_show_all( GTK_WIDGET( menu_bar ) ); + + return menu_bar; +} -////////////////////////////////////////////////////////////////////////////// -// EmuGtk constructor -////////////////////////////////////////////////////////////////////////////// -void -emugtk_init( int argc, char **argv ) +static void +emugtk_window_init( void ) { - RunningState = 0; - - g_print( "\n" ); - - gtk_init( &argc, &argv ); + GtkWidget *main_vbox; + GtkWidget *menu_bar; + GtkWidget *buttons_bar; + GtkWidget *emufixed; + GtkWidget *fixed_frame; + + mainwin = gtk_window_new( GTK_WINDOW_TOPLEVEL ); + gtk_window_set_title( GTK_WINDOW(mainwin), PACKAGE ); + gtk_widget_set_usize( GTK_WIDGET(mainwin), MAIN_WIN_WIDTH, MAIN_WIN_HEIGHT ); + gtk_container_set_border_width( GTK_CONTAINER(mainwin), 0 ); + + /* Window DESTROY event. */ + gtk_signal_connect( GTK_OBJECT(mainwin), "destroy", GTK_SIGNAL_FUNC(WindowDestroyEvent), + NULL ); + + /* Setting main window geometry based on command line options (if specified). */ + /*MainWindowSetGeometry();*/ + + /* main_vbox contains the menu bar and body_vbox (for all remaining items). */ + main_vbox = gtk_vbox_new( FALSE, 1 ); + + /* Creating the menu bar. */ + menu_bar = AddMenu(); + /* Adding menu bar to main_vbox */ + gtk_box_pack_start( GTK_BOX(main_vbox), menu_bar, FALSE, FALSE, 1 ); - emuwin = gtk_window_new( GTK_WINDOW_TOPLEVEL ); - gtk_window_set_title( GTK_WINDOW( emuwin ), "emu8051" ); - gtk_container_set_border_width( GTK_CONTAINER( emuwin ), 0 ); - gtk_widget_show( emuwin ); + /* Creating the buttons bar. */ + buttons_bar = AddButtons(); + /* Adding buttons bar to main_vbox */ + gtk_box_pack_start( GTK_BOX(main_vbox), buttons_bar, FALSE, FALSE, 1 ); + /* Emulator fixed window. */ emufixed = gtk_fixed_new(); - gtk_widget_set_usize( GTK_WIDGET( emufixed ), MAIN_WIN_WIDTH, MAIN_WIN_HEIGHT ); - gtk_container_add( GTK_CONTAINER( emuwin ), emufixed ); - gtk_widget_show( emufixed ); + gtk_widget_set_usize( GTK_WIDGET( emufixed ), MAIN_WIN_WIDTH, + REG_WIN_HEIGHT + MEM_WIN_HEIGHT + 10 ); - // EmuMenuBar( ); + /* 8051 registers frame. */ + fixed_frame = regwin_init( REG_WIN_WIDTH, REG_WIN_HEIGHT ); + gtk_fixed_put( GTK_FIXED( emufixed ), fixed_frame, 0, 0 ); - // Main window - emumainfixed = gtk_fixed_new(); - gtk_widget_set_usize( GTK_WIDGET( emumainfixed ), MAIN_WIN_WIDTH, REG_WIN_HEIGHT + MEM_WIN_HEIGHT + BUTTONS_BAR_HEIGHT + 10 ); - gtk_fixed_put( GTK_FIXED( emufixed ), emumainfixed, 0, 25 ); - gtk_widget_show( emumainfixed ); + /* Program disassembly frame. */ + fixed_frame = pgmwin_init( PGM_WIN_WIDTH, PGM_WIN_HEIGHT ); + gtk_fixed_put( GTK_FIXED( emufixed ), fixed_frame, REG_WIN_WIDTH + 10, 0 ); - emugtk_ShowMenu(); + /* Memory dump frame. */ + fixed_frame = memwin_init( MEM_WIN_WIDTH, MEM_WIN_HEIGHT ); + gtk_fixed_put( GTK_FIXED( emufixed ), fixed_frame, 0, REG_WIN_HEIGHT ); - emugtk_AddButtons(); - - // Registers frame - regfrm = gtk_frame_new( 0 ); - gtk_frame_set_shadow_type( GTK_FRAME( regfrm ), GTK_SHADOW_ETCHED_OUT ); - gtk_widget_set_usize( GTK_WIDGET( regfrm ), REG_WIN_WIDTH, REG_WIN_HEIGHT ); - gtk_fixed_put( GTK_FIXED( emumainfixed ), regfrm, 0, BUTTONS_BAR_HEIGHT ); - regwin_init( regfrm ); - gtk_widget_show( regfrm ); - - // Program disassembly frame - pgmfrm = gtk_frame_new( 0 ); - gtk_frame_set_shadow_type( GTK_FRAME( pgmfrm ), GTK_SHADOW_ETCHED_OUT ); - gtk_widget_set_usize( GTK_WIDGET( pgmfrm ), PGM_WIN_WIDTH, PGM_WIN_HEIGHT ); - gtk_fixed_put( GTK_FIXED( emumainfixed ), pgmfrm, REG_WIN_WIDTH + 10, BUTTONS_BAR_HEIGHT ); - - pgmwin_init( pgmfrm ); - - gtk_widget_show( pgmfrm ); - - // Memory dump frame - memfrm = gtk_frame_new( 0 ); - gtk_frame_set_shadow_type( GTK_FRAME( memfrm ), GTK_SHADOW_ETCHED_OUT ); - gtk_widget_set_usize( GTK_WIDGET( memfrm ), MEM_WIN_WIDTH, MEM_WIN_HEIGHT ); - gtk_fixed_put( GTK_FIXED( emumainfixed ), memfrm, 0, REG_WIN_HEIGHT + BUTTONS_BAR_HEIGHT ); - memwin_init( memfrm ); - gtk_widget_show( memfrm ); + /* Adding fixed window to main_vbox */ + gtk_box_pack_start( GTK_BOX(main_vbox), emufixed, FALSE, FALSE, 1 ); - - NbSignals = 0; - - // Window DESTROY signal - SignalsData[ NbSignals ] = DestroySignal; - gtk_signal_connect( GTK_OBJECT( emuwin ), "destroy", GTK_SIGNAL_FUNC( EmuGtkSignalStub2 ), &SignalsData[ NbSignals ] ); - NbSignals++; - - // Window DELETE event - SignalsData[ NbSignals ] = DeleteSignal; - gtk_signal_connect( GTK_OBJECT( emuwin ), "delete_event", GTK_SIGNAL_FUNC( EmuGtkSignalStub3 ), &SignalsData[ NbSignals ] ); - NbSignals++; - - // File->Open - SignalsData[ NbSignals ] = OpenISignal; - gtk_signal_connect( GTK_OBJECT( OpenItem ), "activate", GTK_SIGNAL_FUNC( EmuGtkSignalStub2 ), &SignalsData[ NbSignals ] ); - NbSignals++; - - // File->Quit - SignalsData[ NbSignals ] = QuitISignal; - gtk_signal_connect( GTK_OBJECT( QuitItem ), "activate", GTK_SIGNAL_FUNC( EmuGtkSignalStub2 ), &SignalsData[ NbSignals ] ); - NbSignals++; - - // Help->About - SignalsData[ NbSignals ] = AboutISignal; - gtk_signal_connect( GTK_OBJECT( AboutItem ), "activate", GTK_SIGNAL_FUNC( EmuGtkSignalStub2 ), &SignalsData[ NbSignals ] ); - NbSignals++; - - // RESET button - SignalsData[ NbSignals ] = ResetBSignal; - gtk_signal_connect( GTK_OBJECT( ButtonReset ), "button-press-event", GTK_SIGNAL_FUNC( EmuGtkSignalStub3 ), &SignalsData[ NbSignals ] ); - NbSignals++; - - // RUN button - SignalsData[ NbSignals ] = RunBSignal; - gtk_signal_connect( GTK_OBJECT( ButtonRun ), "button-press-event", GTK_SIGNAL_FUNC( EmuGtkSignalStub3 ), &SignalsData[ NbSignals ] ); - NbSignals++; - - // STOP button - SignalsData[ NbSignals ] = StopBSignal; - gtk_signal_connect( GTK_OBJECT( ButtonStop ), "button-press-event", GTK_SIGNAL_FUNC( EmuGtkSignalStub3 ), &SignalsData[ NbSignals ] ); - NbSignals++; - - // STEP button - SignalsData[ NbSignals ] = StepBSignal; - gtk_signal_connect( GTK_OBJECT( ButtonStep ), "button-press-event", GTK_SIGNAL_FUNC( EmuGtkSignalStub3 ), &SignalsData[ NbSignals ] ); - NbSignals++; - - - if( GetHexFileName() != NULL ) { - LoadHexFile( GetHexFileName() ); - } + /* Adding the main_vbox to the main window. */ + gtk_container_add( GTK_CONTAINER(mainwin), main_vbox ); + + gtk_widget_show_all( mainwin ); } int main( int argc, char **argv ) { - ParseCommandLineOptions( argc, argv ); + char *hex_file; - emugtk_init( argc, argv ); + ParseCommandLineOptions( argc, argv ); - emugtk_Reset( ); - gtk_main(); + cpu8051_init(); - printf( "End of program.\n" ); + RunningState = 0; - return EXIT_SUCCESS; -} + gtk_init( &argc, &argv ); + emugtk_window_init(); -////////////////////////////////////////////////////////////////////////////// -// Create and show the Reset, Run, Stop, Trace and Step buttons -////////////////////////////////////////////////////////////////////////////// -void -emugtk_AddButtons( void ) -{ - RESET_pixmap = gdk_pixmap_colormap_create_from_xpm_d( NULL, - gtk_widget_get_default_colormap(), - &RESET_mask, - NULL, - ( gchar ** ) reset_xpm ); - RESET_widget = gtk_pixmap_new( RESET_pixmap, RESET_mask ); - - RUN_pixmap = gdk_pixmap_colormap_create_from_xpm_d( NULL, - gtk_widget_get_default_colormap(), - &RUN_mask, - NULL, - ( gchar ** ) run_xpm ); - RUN_widget = gtk_pixmap_new( RUN_pixmap, RUN_mask ); - - STOP_pixmap = gdk_pixmap_colormap_create_from_xpm_d( NULL, - gtk_widget_get_default_colormap(), - &STOP_mask, - NULL, - ( gchar ** ) stop_xpm ); - STOP_widget = gtk_pixmap_new( STOP_pixmap, STOP_mask ); - - STEP_pixmap = gdk_pixmap_colormap_create_from_xpm_d( NULL, - gtk_widget_get_default_colormap(), - &STEP_mask, - NULL, - ( gchar ** ) step_xpm ); - STEP_widget = gtk_pixmap_new( STEP_pixmap, STEP_mask ); - - ButtonTable = gtk_table_new( 1, 4, TRUE ); - gtk_widget_set_usize( GTK_WIDGET( ButtonTable ), BUTTONS_BAR_WIDTH, BUTTONS_BAR_HEIGHT ); - gtk_fixed_put( GTK_FIXED( emumainfixed ), ButtonTable, 0, 0 ); - - ButtonReset = gtk_button_new(); - ButtonRun = gtk_button_new(); - ButtonStop = gtk_button_new(); - ButtonStep = gtk_button_new(); - - gtk_container_add( GTK_CONTAINER( ButtonReset ), RESET_widget ); - gtk_container_add( GTK_CONTAINER( ButtonRun ), RUN_widget ); - gtk_container_add( GTK_CONTAINER( ButtonStop ), STOP_widget ); - gtk_container_add( GTK_CONTAINER( ButtonStep ), STEP_widget ); - - gtk_widget_set_usize( GTK_WIDGET( ButtonReset ), BUTTON_WIDTH, BUTTON_HEIGHT ); - gtk_widget_set_usize( GTK_WIDGET( ButtonRun ), BUTTON_WIDTH, BUTTON_HEIGHT ); - gtk_widget_set_usize( GTK_WIDGET( ButtonStop ), BUTTON_WIDTH, BUTTON_HEIGHT ); - gtk_widget_set_usize( GTK_WIDGET( ButtonStep ), BUTTON_WIDTH, BUTTON_HEIGHT ); - - gtk_table_attach_defaults( GTK_TABLE( ButtonTable ), ButtonReset, 0, 1, 0, 1); - gtk_table_attach_defaults( GTK_TABLE( ButtonTable ), ButtonRun, 1, 2, 0, 1); - gtk_table_attach_defaults( GTK_TABLE( ButtonTable ), ButtonStop, 2, 3, 0, 1); - gtk_table_attach_defaults( GTK_TABLE( ButtonTable ), ButtonStep, 3, 4, 0, 1); - - gtk_widget_show( GTK_WIDGET( ButtonReset ) ); - gtk_widget_show( GTK_WIDGET( ButtonRun ) ); - gtk_widget_show( GTK_WIDGET( ButtonStop ) ); - gtk_widget_show( GTK_WIDGET( ButtonStep ) ); - - gtk_widget_show_all( GTK_WIDGET( ButtonTable ) ); -} + hex_file = get_hex_filename(); + if( hex_file != NULL ) { + emugtk_new_file( hex_file ); + } -////////////////////////////////////////////////////////////////////////////// -// CPU reset and Gtk UI update -////////////////////////////////////////////////////////////////////////////// -void -emugtk_Reset( void ) -{ - cpu8051_Reset( ); - regwin_Show(); - pgmwin_Disasm(); - memwin_DumpD( 0 ); -} + /*emugtk_Reset();*/ + gtk_main(); -////////////////////////////////////////////////////////////////////////////// -// CPU Step and Gtk UI update -////////////////////////////////////////////////////////////////////////////// -void -emugtk_Step( void ) -{ - cpu8051_Exec(); - regwin_Show(); - pgmwin_Disasm(); - memwin_DumpD( 0 ); + printf( "End of program.\n" ); + + return EXIT_SUCCESS; } - -////////////////////////////////////////////////////////////////////////////// -// Show the menu -////////////////////////////////////////////////////////////////////////////// void -emugtk_ShowMenu( void ) +emugtk_new_file( char *file ) { - FileMenu = gtk_menu_new( ); - OpenItem = gtk_menu_item_new_with_label( "Open" ); - QuitItem = gtk_menu_item_new_with_label( "Quit" ); - gtk_menu_append( GTK_MENU( FileMenu ), GTK_WIDGET( OpenItem ) ); - gtk_menu_append( GTK_MENU( FileMenu ), GTK_WIDGET( QuitItem ) ); - gtk_widget_show( GTK_WIDGET( OpenItem ) ); - gtk_widget_show( GTK_WIDGET( QuitItem ) ); - - ViewMenu = gtk_menu_new( ); - ExtMemItem = gtk_menu_item_new_with_label( "External Memory Dump" ); - IntMemItem = gtk_menu_item_new_with_label( "Internal Memory Dump" ); - //PgmMemItem = gtk_menu_item_new_with_label( "Program Memory Dump" ); - gtk_menu_append( GTK_MENU( ViewMenu ), GTK_WIDGET( ExtMemItem ) ); - gtk_menu_append( GTK_MENU( ViewMenu ), GTK_WIDGET( IntMemItem ) ); - //gtk_menu_append( GTK_MENU( ViewMenu ), GTK_WIDGET( PgmMemItem ) ); - gtk_widget_show( GTK_WIDGET( ExtMemItem ) ); - gtk_widget_show( GTK_WIDGET( IntMemItem ) ); - //gtk_widget_show( GTK_WIDGET( PgmMemItem ) ); - - HelpMenu = gtk_menu_new( ); - AboutItem = gtk_menu_item_new_with_label( "About" ); - gtk_menu_append( GTK_MENU( HelpMenu ), GTK_WIDGET( AboutItem ) ); - gtk_widget_show( GTK_WIDGET( AboutItem ) ); + emugtk_StopRunning(); - MenuBar = gtk_menu_bar_new( ); - gtk_fixed_put( GTK_FIXED( emufixed ), MenuBar, 0, 0 ); - gtk_widget_show( GTK_WIDGET( MenuBar ) ); + LoadHexFile( file ); - FileItem = gtk_menu_item_new_with_label( "File" ); - ViewItem = gtk_menu_item_new_with_label( "View" ); - HelpItem = gtk_menu_item_new_with_label( "Help" ); - gtk_widget_show( GTK_WIDGET( FileItem ) ); - gtk_widget_show( GTK_WIDGET( ViewItem ) ); - gtk_widget_show( GTK_WIDGET( HelpItem ) ); - gtk_menu_item_set_submenu( GTK_MENU_ITEM( FileItem ), FileMenu ); - gtk_menu_item_set_submenu( GTK_MENU_ITEM( ViewItem ), ViewMenu ); - gtk_menu_item_set_submenu( GTK_MENU_ITEM( HelpItem ), HelpMenu ); - gtk_menu_bar_append( GTK_MENU_BAR( MenuBar ), FileItem ); - gtk_menu_bar_append( GTK_MENU_BAR( MenuBar ), ViewItem ); - gtk_menu_bar_append( GTK_MENU_BAR( MenuBar ), HelpItem ); -} - - -////////////////////////////////////////////////////////////////////////////// -// Signal DeleteEvent -////////////////////////////////////////////////////////////////////////////// -gboolean -emugtk_DeleteEvent( GtkWidget *widget, GdkEvent *event, gpointer data ) -{ - g_print( "emugtk_DeleteEvent(...)\n" ); - emugtk_StopRunning( ); - return FALSE; + emugtk_Reset(); + emugtk_UpdateDisplay(); } -////////////////////////////////////////////////////////////////////////////// -// Signal DestroyEvent -////////////////////////////////////////////////////////////////////////////// -void -emugtk_DestroyEvent( GtkWidget *widget, gpointer data ) -{ - g_print( "emugtk_DestroyEvent(...)\n" ); - gtk_main_quit(); -} -////////////////////////////////////////////////////////////////////////////// -// gint emugtk_AboutEvent( GtkWidget *widget, gpointer data ) -// Signal AboutEvent ( Help->About in menu ) -////////////////////////////////////////////////////////////////////////////// void -emugtk_AboutEvent( GtkWidget *widget, gpointer data ) +AddMenuSeparator( GtkWidget *menu ) { - char about_string[256]; - GtkWidget *about_window; - GtkWidget *text_window; - - sprintf( about_string, - "%s\n\nversion %s\n\n\nAuthors:\nHugo Villeneuve\nJonathan St-André\n", - PACKAGE, VERSION ); - - about_window = gtk_window_new( GTK_WINDOW_TOPLEVEL ); - gtk_window_set_title( GTK_WINDOW( about_window ), "About" ); - gtk_container_set_border_width( GTK_CONTAINER( about_window ), 20 ); - - text_window = gtk_label_new( about_string ); - gtk_container_add( GTK_CONTAINER( about_window ), text_window ); + GtkWidget *item; - gtk_widget_show_all( GTK_WIDGET( about_window ) ); + item = gtk_menu_item_new(); + gtk_menu_append( GTK_MENU(menu), item ); } -////////////////////////////////////////////////////////////////////////////// -// Signal OpenEvent ( File->Open in menu ) -////////////////////////////////////////////////////////////////////////////// void -emugtk_OpenEvent( GtkWidget *widget, gpointer data ) +emugtk_UpdateDisplay( void ) { - GtkWidget *FileOpendialog; +#ifdef EMU8051_DEBUG + g_print( "emugtk_UpdateDisplay()\n" ); +#endif - // g_print( "emugtk_OpenEvent(...)\n" ); + regwin_Show(); + pgmwin_Disasm(); + memwin_DumpD("0x00"); +} - FileOpendialog = gtk_file_selection_new( "Open Intel Hex file" ); - // Connect the file dialog's OK button up to a handler. - gtk_signal_connect( GTK_OBJECT( GTK_FILE_SELECTION ( FileOpendialog ) -> ok_button ), - "clicked", - GTK_SIGNAL_FUNC( FileOpenDialog_OK ), - FileOpendialog ); - // Connect the file dialog's CANCEL button up to a handler. - gtk_signal_connect( GTK_OBJECT( GTK_FILE_SELECTION ( FileOpendialog ) -> cancel_button ), - "clicked", - GTK_SIGNAL_FUNC( FileOpenDialog_CANCEL ), - FileOpendialog ); - // Set the 'File Open dialog' to show only Intel HEX files (.hex). - // gtk_file_selection_complete( GTK_FILE_SELECTION( FileOpendialog ), "*.hex" ); - - // Show the dialog - gtk_widget_show( GTK_WIDGET( FileOpendialog ) ); -} -void -FileOpenDialog_OK( GtkButton *button, gpointer data ) -{ - g_print( "emugtk_FileOpenDialog_OK Event(...)\n" ); - const gchar *SelectedFile; - SelectedFile = (const gchar *) gtk_file_selection_get_filename( GTK_FILE_SELECTION( data ) ); - - g_print( "emugtk_File = %s\n", SelectedFile ); - - emugtk_StopRunning(); - LoadHexFile( SelectedFile ); - gtk_widget_destroy( GTK_WIDGET( data ) ); - emugtk_Reset(); - emugtk_UpdateDisplay(); -} +////////////////////////////////////////////////////////////////////////////// +// CPU reset and Gtk UI update +////////////////////////////////////////////////////////////////////////////// void -emugtk_UpdateDisplay( void ) +emugtk_Reset( void ) { - g_print( "emugtk_UpdateDisplay()\n" ); - + cpu8051_Reset( ); regwin_Show(); pgmwin_Disasm(); - memwin_DumpD( 0 ); -} - - -void -FileOpenDialog_CANCEL( GtkButton *button, gpointer data ) -{ - g_print( "emugtk_FileOpenDialog_CANCEL Event(...)\n" ); - - gtk_widget_destroy( GTK_WIDGET( data ) ); + memwin_DumpD("0x00"); } ////////////////////////////////////////////////////////////////////////////// -// Signal QuitEvent ( File->Quit in menu ) +// CPU Step and Gtk UI update ////////////////////////////////////////////////////////////////////////////// void -emugtk_QuitEvent( GtkWidget *widget, gpointer data ) +emugtk_Step( void ) { - g_print( "emugtk_QuitEvent(...)\n" ); - emugtk_StopRunning( ); - gtk_main_quit( ); + cpu8051_Exec(); + regwin_Show(); + pgmwin_Disasm(); + memwin_DumpD("0x00"); } @@ -498,7 +311,9 @@ emugtk_QuitEvent( GtkWidget *widget, gpointer data ) void emugtk_ResetEvent( GtkWidget *widget, GdkEvent *event, gpointer data ) { +#ifdef EMU8051_DEBUG g_print( "emugtk_ResetEvent(...)\n" ); +#endif emugtk_StopRunning( ); emugtk_Reset( ); } @@ -510,7 +325,9 @@ emugtk_ResetEvent( GtkWidget *widget, GdkEvent *event, gpointer data ) void emugtk_RunEvent( GtkWidget *widget, GdkEvent *event, gpointer data ) { +#ifdef EMU8051_DEBUG g_print( "emugtk_RunEvent(...)\n" ); +#endif if ( RunningState ) { // g_print( "Getting out of RunningState! \n" ); emugtk_StopRunning( ); @@ -528,7 +345,9 @@ emugtk_RunEvent( GtkWidget *widget, GdkEvent *event, gpointer data ) void emugtk_StopEvent( GtkWidget *widget, GdkEvent *event, gpointer data ) { +#ifdef EMU8051_DEBUG g_print( "emugtk_StopEvent(...)\n" ); +#endif emugtk_StopRunning( ); } @@ -539,74 +358,14 @@ emugtk_StopEvent( GtkWidget *widget, GdkEvent *event, gpointer data ) void emugtk_StepEvent( GtkWidget *widget, GdkEvent *event, gpointer data ) { +#ifdef EMU8051_DEBUG g_print( "emugtk_StepEvent(...)\n" ); +#endif emugtk_StopRunning( ); emugtk_Step(); } -////////////////////////////////////////////////////////////////////////////// -// Signal Stub with 2 parameters -////////////////////////////////////////////////////////////////////////////// -void -EmuGtkSignalStub2( GtkWidget *widget, gpointer data ) -{ - g_print( "EmuGtkSignalStub2(...)\n"); - - int SigNumber = *( (int *) data ); - - switch( SigNumber ) { - case DestroySignal: - emugtk_DestroyEvent( widget, 0 ); - break; - case AboutISignal: - emugtk_AboutEvent( widget, 0 ); - break; - case OpenISignal: - emugtk_OpenEvent( widget, 0 ); - break; - case QuitISignal: - emugtk_QuitEvent( widget, 0 ); - break; - default: - g_print( "*** error: EmuGtkSignalStub2: default case reached\n" ); - break; - }; -} - - -////////////////////////////////////////////////////////////////////////////// -// Signal Stub with 3 parameters -////////////////////////////////////////////////////////////////////////////// -void EmuGtkSignalStub3( GtkWidget *widget, GdkEvent *event, gpointer data ) -{ - g_print( "EmuGtkSignalStub3(...)\n"); - - int SigNumber = *( (int *) data ); - - switch( SigNumber ) { - case DeleteSignal: - emugtk_DeleteEvent( widget, event, 0 ); - break; - case ResetBSignal: - emugtk_ResetEvent( widget, event, 0 ); - break; - case RunBSignal: - emugtk_RunEvent( widget, event, 0 ); - break; - case StopBSignal: - emugtk_StopEvent( widget, event, 0 ); - break; - case StepBSignal: - emugtk_StepEvent( widget, event, 0 ); - break; - default: - g_print( "*** error: EmuGtkSignalStub3: default case reached\n" ); - break; - }; -} - - ////////////////////////////////////////////////////////////////////////////// // Running called by RunningFunction( ) ////////////////////////////////////////////////////////////////////////////// @@ -614,8 +373,10 @@ void emugtk_Running( ) { cpu8051_Exec( ); - if( pgmwin_IsBreakpoint( PC ) ) { + if( pgmwin_IsBreakpoint( cpu8051.pc ) ) { +#ifdef EMU8051_DEBUG g_print( "Breakpoint Hit, stopping!\n" ); +#endif emugtk_StopRunning( ); } } @@ -639,17 +400,12 @@ void emugtk_StartRunning( void ) { if ( !RunningState ) { - +#ifdef EMU8051_DEBUG printf( "emugtk_StartRunning( )\n" ); - - /*RunFuncTag = gtk_idle_add( GtkFunction( RunningFunction ), 0 );*/ +#endif RunFuncTag = gtk_idle_add( RunningFunction, 0 ); RunningState = 1; - - // gtk_widget_hide( GTK_WIDGET( ButtonRun ) ); - // gtk_widget_show_now( GTK_WIDGET( ButtonStop ) ); - // gtk_table_attach_defaults( GTK_TABLE( ButtonTable ), ButtonStop, 3, 4, 0, 1); } } @@ -661,14 +417,13 @@ void emugtk_StopRunning( ) { if (RunningState) { +#ifdef EMU8051_DEBUG printf( "emugtk_StopRunning( )\n" ); +#endif gtk_idle_remove( RunFuncTag ); RunningState = 0; - //gtk_widget_hide( GTK_WIDGET( ButtonStop ) ); - //gtk_widget_show( GTK_WIDGET( ButtonRun ) ); - // gtk_table_attach_defaults( GTK_TABLE( ButtonTable ), ButtonRun, 3, 4, 0, 1); regwin_Show(); pgmwin_Disasm(); - memwin_DumpD( 0 ); + memwin_DumpD("0x00"); } }