revision 18:9a1b5d75703f
summary |
tree |
shortlog |
changelog |
graph |
changeset |
raw | bz2 | zip | gz changeset | 18:9a1b5d75703f |
parent | 17:944f75eea496 |
child | 19:9da7a8e38f9d |
author | nkeynes |
date | Thu Dec 15 13:33:14 2005 +0000 (18 years ago) |
Implement save states
dream.glade | view | annotate | diff | log | ||
src/dreamcast.c | view | annotate | diff | log | ||
src/dreamcast.h | view | annotate | diff | log | ||
src/gui/callbacks.c | view | annotate | diff | log | ||
src/gui/callbacks.h | view | annotate | diff | log | ||
src/gui/gui.c | view | annotate | diff | log | ||
src/gui/gui.h | view | annotate | diff | log | ||
src/gui/interface.c | view | annotate | diff | log | ||
src/loader.c | view | annotate | diff | log | ||
src/mem.c | view | annotate | diff | log | ||
src/mem.h | view | annotate | diff | log | ||
src/sh4/sh4core.c | view | annotate | diff | log |
1.1 --- a/dream.glade Tue Dec 13 14:47:59 2005 +00001.2 +++ b/dream.glade Thu Dec 15 13:33:14 2005 +00001.3 @@ -202,10 +202,10 @@1.4 <child>1.5 <widget class="GtkToolButton" id="load_btn">1.6 <property name="visible">True</property>1.7 - <property name="tooltip" translatable="yes">New File</property>1.8 - <property name="label" translatable="yes">Load</property>1.9 + <property name="tooltip" translatable="yes">Mount CD-Rom</property>1.10 + <property name="label" translatable="yes">Mount</property>1.11 <property name="use_underline">True</property>1.12 - <property name="stock_id">gtk-open</property>1.13 + <property name="stock_id">gtk-cdrom</property>1.14 <property name="visible_horizontal">True</property>1.15 <property name="visible_vertical">True</property>1.16 <property name="is_important">False</property>1.17 @@ -220,7 +220,7 @@1.18 <child>1.19 <widget class="GtkToolButton" id="reset_btn">1.20 <property name="visible">True</property>1.21 - <property name="tooltip" translatable="yes">Open File</property>1.22 + <property name="tooltip" translatable="yes">Reset emulator</property>1.23 <property name="label" translatable="yes">Reset</property>1.24 <property name="use_underline">True</property>1.25 <property name="stock_id">gtk-refresh</property>1.26 @@ -238,7 +238,7 @@1.27 <child>1.28 <widget class="GtkToolButton" id="stop_btn">1.29 <property name="visible">True</property>1.30 - <property name="tooltip" translatable="yes">Save File</property>1.31 + <property name="tooltip" translatable="yes">Stop</property>1.32 <property name="label" translatable="yes">Stop</property>1.33 <property name="use_underline">True</property>1.34 <property name="stock_id">gtk-stop</property>1.35 @@ -256,6 +256,7 @@1.36 <child>1.37 <widget class="GtkToolButton" id="step_btn">1.38 <property name="visible">True</property>1.39 + <property name="tooltip" translatable="yes">Single step</property>1.40 <property name="label" translatable="yes">Step</property>1.41 <property name="use_underline">True</property>1.42 <property name="stock_id">gtk-redo</property>1.43 @@ -273,6 +274,7 @@1.44 <child>1.45 <widget class="GtkToolButton" id="run_btn">1.46 <property name="visible">True</property>1.47 + <property name="tooltip" translatable="yes">Run</property>1.48 <property name="label" translatable="yes">Run</property>1.49 <property name="use_underline">True</property>1.50 <property name="stock_id">gtk-go-forward</property>1.51 @@ -290,6 +292,7 @@1.52 <child>1.53 <widget class="GtkToolButton" id="runto_btn">1.54 <property name="visible">True</property>1.55 + <property name="tooltip" translatable="yes">Run to current selection</property>1.56 <property name="label" translatable="yes">Run to</property>1.57 <property name="use_underline">True</property>1.58 <property name="stock_id">gtk-goto-last</property>1.59 @@ -307,6 +310,7 @@1.60 <child>1.61 <widget class="GtkToolButton" id="break_btn">1.62 <property name="visible">True</property>1.63 + <property name="tooltip" translatable="yes">Set breakpoint</property>1.64 <property name="label" translatable="yes">Break</property>1.65 <property name="use_underline">True</property>1.66 <property name="stock_id">gtk-close</property>1.67 @@ -320,6 +324,42 @@1.68 <property name="homogeneous">True</property>1.69 </packing>1.70 </child>1.71 +1.72 + <child>1.73 + <widget class="GtkToolButton" id="loadstate_button">1.74 + <property name="visible">True</property>1.75 + <property name="tooltip" translatable="yes">Load save-state file</property>1.76 + <property name="label" translatable="yes">Load</property>1.77 + <property name="use_underline">True</property>1.78 + <property name="stock_id">gtk-open</property>1.79 + <property name="visible_horizontal">True</property>1.80 + <property name="visible_vertical">True</property>1.81 + <property name="is_important">False</property>1.82 + <signal name="clicked" handler="on_loadstate_button_clicked" last_modification_time="Thu, 15 Dec 2005 09:36:10 GMT"/>1.83 + </widget>1.84 + <packing>1.85 + <property name="expand">False</property>1.86 + <property name="homogeneous">True</property>1.87 + </packing>1.88 + </child>1.89 +1.90 + <child>1.91 + <widget class="GtkToolButton" id="savestate_button">1.92 + <property name="visible">True</property>1.93 + <property name="tooltip" translatable="yes">Save save-state file</property>1.94 + <property name="label" translatable="yes">Save</property>1.95 + <property name="use_underline">True</property>1.96 + <property name="stock_id">gtk-save</property>1.97 + <property name="visible_horizontal">True</property>1.98 + <property name="visible_vertical">True</property>1.99 + <property name="is_important">False</property>1.100 + <signal name="clicked" handler="on_savestate_button_clicked" last_modification_time="Thu, 15 Dec 2005 09:36:23 GMT"/>1.101 + </widget>1.102 + <packing>1.103 + <property name="expand">False</property>1.104 + <property name="homogeneous">True</property>1.105 + </packing>1.106 + </child>1.107 </widget>1.108 </child>1.109 </widget>1.110 @@ -479,7 +519,7 @@1.111 <property name="editable">False</property>1.112 <property name="visibility">True</property>1.113 <property name="max_length">0</property>1.114 - <property name="text" translatable="yes">SH4</property>1.115 + <property name="text" translatable="yes"></property>1.116 <property name="has_frame">True</property>1.117 <property name="invisible_char">*</property>1.118 <property name="activates_default">False</property>
2.1 --- a/src/dreamcast.c Tue Dec 13 14:47:59 2005 +00002.2 +++ b/src/dreamcast.c Thu Dec 15 13:33:14 2005 +00002.3 @@ -1,3 +1,4 @@2.4 +#include <errno.h>2.5 #include "dream.h"2.6 #include "mem.h"2.7 #include "aica/aica.h"2.8 @@ -98,13 +99,17 @@2.9 };2.12 -int dreamcast_load_state( FILE *f )2.13 +int dreamcast_load_state( const gchar *filename )2.14 {2.15 int i,j;2.16 uint32_t count, len;2.17 int have_read[MAX_MODULES];2.18 char tmp[64];2.19 struct save_state_header header;2.20 + FILE *f;2.21 +2.22 + f = fopen( filename, "r" );2.23 + if( f == NULL ) return errno;2.25 fread( &header, sizeof(header), 1, f );2.26 if( strncmp( header.magic, DREAMCAST_SAVE_MAGIC, 16 ) != 0 ) {2.27 @@ -115,24 +120,23 @@2.28 ERROR( "DreamOn save state version not supported" );2.29 return 1;2.30 }2.31 - fread( &count, sizeof(count), 1, f );2.32 - if( count > MAX_MODULES ) {2.33 - ERROR( "DreamOn save state is corrupted" );2.34 + if( header.module_count > MAX_MODULES ) {2.35 + ERROR( "DreamOn save state is corrupted (bad module count)" );2.36 return 1;2.37 }2.38 for( i=0; i<MAX_MODULES; i++ ) {2.39 have_read[i] = 0;2.40 }2.42 - for( i=0; i<count; i++ ) {2.43 + for( i=0; i<header.module_count; i++ ) {2.44 fread(tmp, 4, 1, f );2.45 - if( strcmp(tmp, "BLCK") != 0 ) {2.46 - ERROR( "DreamOn save state is corrupted" );2.47 + if( strncmp(tmp, "BLCK", 4) != 0 ) {2.48 + ERROR( "DreamOn save state is corrupted (missing block header %d)", i );2.49 return 2;2.50 }2.51 len = fread_string(tmp, sizeof(tmp), f );2.52 if( len > 64 || len < 1 ) {2.53 - ERROR( "DreamOn save state is corrupted" );2.54 + ERROR( "DreamOn save state is corrupted (bad string)" );2.55 return 2;2.56 }2.58 @@ -141,10 +145,10 @@2.59 if( strcmp(modules[j]->name,tmp) == 0 ) {2.60 have_read[j] = 1;2.61 if( modules[j]->load == NULL ) {2.62 - ERROR( "DreamOn save state is corrupted" );2.63 + ERROR( "DreamOn save state is corrupted (no loader for %s)", modules[j]->name );2.64 return 2;2.65 } else if( modules[j]->load(f) != 0 ) {2.66 - ERROR( "DreamOn save state is corrupted" );2.67 + ERROR( "DreamOn save state is corrupted (%s failed)", modules[j]->name );2.68 return 2;2.69 }2.70 break;2.71 @@ -165,18 +169,28 @@2.72 modules[j]->reset();2.73 }2.74 }2.75 + fclose(f);2.76 + INFO( "Save state read from %s", filename );2.77 }2.79 -void dreamcast_save_state( FILE *f )2.80 +int dreamcast_save_state( const gchar *filename )2.81 {2.82 int i;2.83 + FILE *f;2.84 struct save_state_header header;2.86 + f = fopen( filename, "w" );2.87 + if( f == NULL )2.88 + return errno;2.89 strcpy( header.magic, DREAMCAST_SAVE_MAGIC );2.90 header.version = DREAMCAST_SAVE_VERSION;2.91 - header.module_count = num_modules;2.92 + header.module_count = 0;2.93 +2.94 + for( i=0; i<num_modules; i++ ) {2.95 + if( modules[i]->save != NULL )2.96 + header.module_count++;2.97 + }2.98 fwrite( &header, sizeof(header), 1, f );2.99 - fwrite_string( dreamcast_config, f );2.100 for( i=0; i<num_modules; i++ ) {2.101 if( modules[i]->save != NULL ) {2.102 fwrite( "BLCK", 4, 1, f );2.103 @@ -184,5 +198,7 @@2.104 modules[i]->save(f);2.105 }2.106 }2.107 + fclose( f );2.108 + INFO( "Save state written to %s", filename );2.109 }
3.1 --- a/src/dreamcast.h Tue Dec 13 14:47:59 2005 +00003.2 +++ b/src/dreamcast.h Thu Dec 15 13:33:14 2005 +00003.3 @@ -4,6 +4,7 @@3.5 #include <stdlib.h>3.6 #include <stdio.h>3.7 +#include <glib/gtypes.h>3.9 #ifdef __cplusplus3.10 extern "C" {3.11 @@ -16,8 +17,11 @@3.12 #define DREAMCAST_SAVE_MAGIC "%!-DreamOn!Save\0"3.13 #define DREAMCAST_SAVE_VERSION 0x000100003.15 -void dreamcast_save_state( FILE *f );3.16 -int dreamcast_load_state( FILE *f );3.17 +int dreamcast_save_state( const gchar *filename );3.18 +int dreamcast_load_state( const gchar *filename );3.19 +3.20 +int open_file( gchar *filename );3.21 +3.23 #ifdef __cplusplus3.24 }
4.1 --- a/src/gui/callbacks.c Tue Dec 13 14:47:59 2005 +00004.2 +++ b/src/gui/callbacks.c Thu Dec 15 13:33:14 2005 +00004.3 @@ -9,6 +9,7 @@4.4 #include "gui.h"4.5 #include "sh4core.h"4.6 #include "asic.h"4.7 +#include "dreamcast.h"4.9 int selected_pc = -1;4.11 @@ -24,7 +25,7 @@4.12 on_open1_activate (GtkMenuItem *menuitem,4.13 gpointer user_data)4.14 {4.15 - open_file_dialog();4.16 + open_file_dialog( "Open...", open_file, NULL, NULL );4.17 }4.20 @@ -73,7 +74,7 @@4.21 on_load_btn_clicked (GtkButton *button,4.22 gpointer user_data)4.23 {4.24 - open_file_dialog();4.25 + open_file_dialog( "Open...", open_file, NULL, NULL );4.26 }4.29 @@ -218,7 +219,7 @@4.30 on_mode_field_changed (GtkEditable *editable,4.31 gpointer user_data)4.32 {4.33 - gchar *text = gtk_entry_get_text( GTK_ENTRY(editable) );4.34 + const gchar *text = gtk_entry_get_text( GTK_ENTRY(editable) );4.35 debug_info_t data = get_debug_info( GTK_WIDGET(editable) );4.36 set_disassembly_cpu( data, text );4.37 }4.38 @@ -239,7 +240,7 @@4.39 {4.40 if( event->keyval == GDK_Return || event->keyval == GDK_Linefeed ) {4.41 debug_info_t data = get_debug_info(widget);4.42 - gchar *text = gtk_entry_get_text( GTK_ENTRY(widget) );4.43 + const gchar *text = gtk_entry_get_text( GTK_ENTRY(widget) );4.44 gchar *endptr;4.45 unsigned int val = strtoul( text, &endptr, 16 );4.46 if( text == endptr ) { /* invalid input */4.47 @@ -313,3 +314,19 @@4.48 dump_window_new();4.49 }4.51 +4.52 +void4.53 +on_loadstate_button_clicked (GtkToolButton *toolbutton,4.54 + gpointer user_data)4.55 +{4.56 + open_file_dialog( "Load state...", dreamcast_load_state, "*.dst", "DreamOn Save State (*.dst)" );4.57 +}4.58 +4.59 +4.60 +void4.61 +on_savestate_button_clicked (GtkToolButton *toolbutton,4.62 + gpointer user_data)4.63 +{4.64 + save_file_dialog( "Save state...", dreamcast_save_state, "*.dst", "DreamOn Save State (*.dst)" );4.65 +}4.66 +
5.1 --- a/src/gui/callbacks.h Tue Dec 13 14:47:59 2005 +00005.2 +++ b/src/gui/callbacks.h Thu Dec 15 13:33:14 2005 +00005.3 @@ -175,3 +175,11 @@5.4 void5.5 on_view_memory_activate (GtkMenuItem *menuitem,5.6 gpointer user_data);5.7 +5.8 +void5.9 +on_loadstate_button_clicked (GtkToolButton *toolbutton,5.10 + gpointer user_data);5.11 +5.12 +void5.13 +on_savestate_button_clicked (GtkToolButton *toolbutton,5.14 + gpointer user_data);
6.1 --- a/src/gui/gui.c Tue Dec 13 14:47:59 2005 +00006.2 +++ b/src/gui/gui.c Thu Dec 15 13:33:14 2005 +00006.3 @@ -2,6 +2,7 @@6.4 #include <stdarg.h>6.5 #include <gnome.h>6.6 #include <math.h>6.7 +#include "dreamcast.h"6.8 #include "gui.h"6.9 #include "mem.h"6.10 #include "sh4dasm.h"6.11 @@ -12,9 +13,7 @@6.12 GdkColor clrNormal, clrChanged, clrError, clrWarn, clrPC, clrDebug, clrTrace;6.13 PangoFontDescription *fixed_list_font;6.15 -void open_file_callback(GtkWidget *btn, gpointer user_data);6.16 -void open_file_canceled(GtkWidget *btn, gpointer user_data);6.17 -void open_file( char *filename );6.18 +void open_file_callback(GtkWidget *btn, gint result, gpointer user_data);6.20 void init_gui() {6.21 GdkColormap *map;6.22 @@ -51,29 +50,63 @@6.23 dump_win_update_all();6.24 }6.26 -6.27 -void open_file_callback(GtkWidget *btn, gpointer user_data) {6.28 - GtkFileSelection *file = GTK_FILE_SELECTION(user_data);6.29 - gchar *filename = strdup( gtk_file_selection_get_filename(6.30 - GTK_FILE_SELECTION(file) ) );6.31 - gtk_widget_destroy(GTK_WIDGET(file));6.32 - open_file( filename );6.33 - free(filename);6.34 +void open_file_callback(GtkWidget *btn, gint result, gpointer user_data) {6.35 + GtkFileChooser *file = GTK_FILE_CHOOSER(user_data);6.36 + if( result == GTK_RESPONSE_ACCEPT ) {6.37 + gchar *filename =gtk_file_chooser_get_filename(6.38 + GTK_FILE_CHOOSER(file) );6.39 + file_callback_t action = (file_callback_t)gtk_object_get_data( GTK_OBJECT(file), "file_action" );6.40 + gtk_widget_destroy(GTK_WIDGET(file));6.41 + action( filename );6.42 + g_free(filename);6.43 + } else {6.44 + gtk_widget_destroy(GTK_WIDGET(file));6.45 + }6.46 }6.48 -void open_file_canceled(GtkWidget *btn, gpointer user_data) {6.49 - gtk_widget_destroy(GTK_WIDGET(user_data));6.50 +static void add_file_pattern( GtkFileChooser *chooser, char *pattern, char *patname )6.51 +{6.52 + if( pattern != NULL ) {6.53 + GtkFileFilter *filter = gtk_file_filter_new();6.54 + gtk_file_filter_add_pattern( filter, pattern );6.55 + gtk_file_filter_set_name( filter, patname );6.56 + gtk_file_chooser_add_filter( chooser, filter );6.57 + filter = gtk_file_filter_new();6.58 + gtk_file_filter_set_name( filter, "All files" );6.59 + gtk_file_filter_add_pattern( filter, "*" );6.60 + gtk_file_chooser_add_filter( chooser, filter );6.61 + }6.62 }6.64 -void open_file_dialog( void )6.65 +void open_file_dialog( char *title, file_callback_t action, char *pattern, char *patname )6.66 {6.67 GtkWidget *file;6.69 - file = gtk_file_selection_new( "Open..." );6.70 - gtk_signal_connect( GTK_OBJECT(GTK_FILE_SELECTION(file)->ok_button),6.71 - "clicked", GTK_SIGNAL_FUNC(open_file_callback), file );6.72 - gtk_signal_connect( GTK_OBJECT(GTK_FILE_SELECTION(file)->cancel_button),6.73 - "clicked", GTK_SIGNAL_FUNC(open_file_canceled), file );6.74 + file = gtk_file_chooser_dialog_new( title, NULL,6.75 + GTK_FILE_CHOOSER_ACTION_OPEN,6.76 + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,6.77 + GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,6.78 + NULL );6.79 + add_file_pattern( GTK_FILE_CHOOSER(file), pattern, patname );6.80 + g_signal_connect( GTK_OBJECT(file), "response",6.81 + GTK_SIGNAL_FUNC(open_file_callback), file );6.82 + gtk_object_set_data( GTK_OBJECT(file), "file_action", action );6.83 + gtk_widget_show( file );6.84 +}6.85 +6.86 +void save_file_dialog( char *title, file_callback_t action, char *pattern, char *patname )6.87 +{6.88 + GtkWidget *file;6.89 +6.90 + file = gtk_file_chooser_dialog_new( title, NULL,6.91 + GTK_FILE_CHOOSER_ACTION_SAVE,6.92 + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,6.93 + GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT,6.94 + NULL );6.95 + add_file_pattern( GTK_FILE_CHOOSER(file), pattern, patname );6.96 + g_signal_connect( GTK_OBJECT(file), "response",6.97 + GTK_SIGNAL_FUNC(open_file_callback), file );6.98 + gtk_object_set_data( GTK_OBJECT(file), "file_action", action );6.99 gtk_widget_show( file );6.100 }
7.1 --- a/src/gui/gui.h Tue Dec 13 14:47:59 2005 +00007.2 +++ b/src/gui/gui.h Thu Dec 15 13:33:14 2005 +00007.3 @@ -21,9 +21,12 @@7.4 typedef struct debug_info_struct *debug_info_t;7.5 extern debug_info_t main_debug;7.7 +typedef int (*file_callback_t)( const gchar *filename );7.8 +void open_file_dialog( char *title, file_callback_t file_handler, char *pattern, char *patname );7.9 +void save_file_dialog( char *title, file_callback_t file_handler, char *pattern, char *patname );7.10 +7.11 debug_info_t init_debug_win(GtkWidget *, cpu_desc_t *cpu );7.12 debug_info_t get_debug_info(GtkWidget *widget);7.13 -void open_file_dialog( void );7.14 void update_mmr_win( void );7.15 void init_mmr_win( void );7.16 void update_registers( debug_info_t debug );
8.1 --- a/src/gui/interface.c Tue Dec 13 14:47:59 2005 +00008.2 +++ b/src/gui/interface.c Thu Dec 15 13:33:14 2005 +00008.3 @@ -116,6 +116,8 @@8.4 GtkWidget *run_btn;8.5 GtkWidget *runto_btn;8.6 GtkWidget *break_btn;8.7 + GtkWidget *loadstate_button;8.8 + GtkWidget *savestate_button;8.9 GtkWidget *vpaned1;8.10 GtkWidget *hpaned1;8.11 GtkWidget *vbox2;8.12 @@ -166,50 +168,68 @@8.13 gtk_toolbar_set_style (GTK_TOOLBAR (toolbar1), GTK_TOOLBAR_BOTH);8.14 tmp_toolbar_icon_size = gtk_toolbar_get_icon_size (GTK_TOOLBAR (toolbar1));8.16 - tmp_image = gtk_image_new_from_stock ("gtk-open", tmp_toolbar_icon_size);8.17 + tmp_image = gtk_image_new_from_stock ("gtk-cdrom", tmp_toolbar_icon_size);8.18 gtk_widget_show (tmp_image);8.19 - load_btn = (GtkWidget*) gtk_tool_button_new (tmp_image, _("Load"));8.20 + load_btn = (GtkWidget*) gtk_tool_button_new (tmp_image, _("Mount"));8.21 gtk_widget_show (load_btn);8.22 gtk_container_add (GTK_CONTAINER (toolbar1), load_btn);8.23 - gtk_tool_item_set_tooltip (GTK_TOOL_ITEM (load_btn), tooltips, _("New File"), NULL);8.24 + gtk_tool_item_set_tooltip (GTK_TOOL_ITEM (load_btn), tooltips, _("Mount CD-Rom"), NULL);8.26 tmp_image = gtk_image_new_from_stock ("gtk-refresh", tmp_toolbar_icon_size);8.27 gtk_widget_show (tmp_image);8.28 reset_btn = (GtkWidget*) gtk_tool_button_new (tmp_image, _("Reset"));8.29 gtk_widget_show (reset_btn);8.30 gtk_container_add (GTK_CONTAINER (toolbar1), reset_btn);8.31 - gtk_tool_item_set_tooltip (GTK_TOOL_ITEM (reset_btn), tooltips, _("Open File"), NULL);8.32 + gtk_tool_item_set_tooltip (GTK_TOOL_ITEM (reset_btn), tooltips, _("Reset emulator"), NULL);8.34 tmp_image = gtk_image_new_from_stock ("gtk-stop", tmp_toolbar_icon_size);8.35 gtk_widget_show (tmp_image);8.36 stop_btn = (GtkWidget*) gtk_tool_button_new (tmp_image, _("Stop"));8.37 gtk_widget_show (stop_btn);8.38 gtk_container_add (GTK_CONTAINER (toolbar1), stop_btn);8.39 - gtk_tool_item_set_tooltip (GTK_TOOL_ITEM (stop_btn), tooltips, _("Save File"), NULL);8.40 + gtk_tool_item_set_tooltip (GTK_TOOL_ITEM (stop_btn), tooltips, _("Stop"), NULL);8.42 tmp_image = gtk_image_new_from_stock ("gtk-redo", tmp_toolbar_icon_size);8.43 gtk_widget_show (tmp_image);8.44 step_btn = (GtkWidget*) gtk_tool_button_new (tmp_image, _("Step"));8.45 gtk_widget_show (step_btn);8.46 gtk_container_add (GTK_CONTAINER (toolbar1), step_btn);8.47 + gtk_tool_item_set_tooltip (GTK_TOOL_ITEM (step_btn), tooltips, _("Single step"), NULL);8.49 tmp_image = gtk_image_new_from_stock ("gtk-go-forward", tmp_toolbar_icon_size);8.50 gtk_widget_show (tmp_image);8.51 run_btn = (GtkWidget*) gtk_tool_button_new (tmp_image, _("Run"));8.52 gtk_widget_show (run_btn);8.53 gtk_container_add (GTK_CONTAINER (toolbar1), run_btn);8.54 + gtk_tool_item_set_tooltip (GTK_TOOL_ITEM (run_btn), tooltips, _("Run"), NULL);8.56 tmp_image = gtk_image_new_from_stock ("gtk-goto-last", tmp_toolbar_icon_size);8.57 gtk_widget_show (tmp_image);8.58 runto_btn = (GtkWidget*) gtk_tool_button_new (tmp_image, _("Run to"));8.59 gtk_widget_show (runto_btn);8.60 gtk_container_add (GTK_CONTAINER (toolbar1), runto_btn);8.61 + gtk_tool_item_set_tooltip (GTK_TOOL_ITEM (runto_btn), tooltips, _("Run to current selection"), NULL);8.63 tmp_image = gtk_image_new_from_stock ("gtk-close", tmp_toolbar_icon_size);8.64 gtk_widget_show (tmp_image);8.65 break_btn = (GtkWidget*) gtk_tool_button_new (tmp_image, _("Break"));8.66 gtk_widget_show (break_btn);8.67 gtk_container_add (GTK_CONTAINER (toolbar1), break_btn);8.68 + gtk_tool_item_set_tooltip (GTK_TOOL_ITEM (break_btn), tooltips, _("Set breakpoint"), NULL);8.69 +8.70 + tmp_image = gtk_image_new_from_stock ("gtk-open", tmp_toolbar_icon_size);8.71 + gtk_widget_show (tmp_image);8.72 + loadstate_button = (GtkWidget*) gtk_tool_button_new (tmp_image, _("Load"));8.73 + gtk_widget_show (loadstate_button);8.74 + gtk_container_add (GTK_CONTAINER (toolbar1), loadstate_button);8.75 + gtk_tool_item_set_tooltip (GTK_TOOL_ITEM (loadstate_button), tooltips, _("Load save-state file"), NULL);8.76 +8.77 + tmp_image = gtk_image_new_from_stock ("gtk-save", tmp_toolbar_icon_size);8.78 + gtk_widget_show (tmp_image);8.79 + savestate_button = (GtkWidget*) gtk_tool_button_new (tmp_image, _("Save"));8.80 + gtk_widget_show (savestate_button);8.81 + gtk_container_add (GTK_CONTAINER (toolbar1), savestate_button);8.82 + gtk_tool_item_set_tooltip (GTK_TOOL_ITEM (savestate_button), tooltips, _("Save save-state file"), NULL);8.84 vpaned1 = gtk_vpaned_new ();8.85 gtk_widget_show (vpaned1);8.86 @@ -266,7 +286,6 @@8.87 mode_field = GTK_COMBO (mode_box)->entry;8.88 gtk_widget_show (mode_field);8.89 gtk_editable_set_editable (GTK_EDITABLE (mode_field), FALSE);8.90 - gtk_entry_set_text (GTK_ENTRY (mode_field), _("SH4"));8.92 label23 = gtk_label_new ("");8.93 gtk_widget_show (label23);8.94 @@ -382,6 +401,12 @@8.95 g_signal_connect ((gpointer) break_btn, "clicked",8.96 G_CALLBACK (on_break_btn_clicked),8.97 NULL);8.98 + g_signal_connect ((gpointer) loadstate_button, "clicked",8.99 + G_CALLBACK (on_loadstate_button_clicked),8.100 + NULL);8.101 + g_signal_connect ((gpointer) savestate_button, "clicked",8.102 + G_CALLBACK (on_savestate_button_clicked),8.103 + NULL);8.104 g_signal_connect ((gpointer) page_field, "key_press_event",8.105 G_CALLBACK (on_page_field_key_press_event),8.106 NULL);8.107 @@ -429,6 +454,8 @@8.108 GLADE_HOOKUP_OBJECT (debug_win, run_btn, "run_btn");8.109 GLADE_HOOKUP_OBJECT (debug_win, runto_btn, "runto_btn");8.110 GLADE_HOOKUP_OBJECT (debug_win, break_btn, "break_btn");8.111 + GLADE_HOOKUP_OBJECT (debug_win, loadstate_button, "loadstate_button");8.112 + GLADE_HOOKUP_OBJECT (debug_win, savestate_button, "savestate_button");8.113 GLADE_HOOKUP_OBJECT (debug_win, vpaned1, "vpaned1");8.114 GLADE_HOOKUP_OBJECT (debug_win, hpaned1, "hpaned1");8.115 GLADE_HOOKUP_OBJECT (debug_win, vbox2, "vbox2");
9.1 --- a/src/loader.c Tue Dec 13 14:47:59 2005 +00009.2 +++ b/src/loader.c Thu Dec 15 13:33:14 2005 +00009.3 @@ -19,7 +19,7 @@9.4 #define CDI_V2 0x800000049.5 #define CDI_V3 0x800000059.7 -void open_file( char *filename )9.8 +int open_file( const gchar *filename )9.9 {9.10 char buf[32];9.11 uint32_t tmpa[2];9.12 @@ -82,4 +82,5 @@9.13 }9.14 }9.15 close(fd);9.16 + return 0;9.17 }
10.1 --- a/src/mem.c Tue Dec 13 14:47:59 2005 +000010.2 +++ b/src/mem.c Thu Dec 15 13:33:14 2005 +000010.3 @@ -1,5 +1,5 @@10.4 /**10.5 - * $Id: mem.c,v 1.4 2005-12-13 14:47:59 nkeynes Exp $10.6 + * $Id: mem.c,v 1.5 2005-12-15 13:33:14 nkeynes Exp $10.7 * mem.c is responsible for creating and maintaining the overall system memory10.8 * map, as visible from the SH4 processor.10.9 *10.10 @@ -43,7 +43,7 @@10.11 struct mmio_region *io_rgn[MAX_IO_REGIONS];10.12 struct mmio_region *P4_io[4096];10.14 -int num_io_rgns = 1, num_mem_rgns = 0;10.15 +int num_io_rgns = 0, num_mem_rgns = 0;10.17 void *mem_alloc_pages( int n )10.18 {10.19 @@ -97,7 +97,8 @@10.20 fwrite( &mem_rgn[i].base, sizeof(uint32_t), 1, f );10.21 fwrite( &mem_rgn[i].flags, sizeof(int), 1, f );10.22 fwrite( &mem_rgn[i].size, sizeof(uint32_t), 1, f );10.23 - fwrite( mem_rgn[i].mem, mem_rgn[i].size, 1, f );10.24 + if( mem_rgn[i].flags != MEM_FLAG_ROM )10.25 + fwrite( mem_rgn[i].mem, mem_rgn[i].size, 1, f );10.26 }10.28 /* All MMIO regions */10.29 @@ -105,7 +106,9 @@10.30 for( i=0; i<num_io_rgns; i++ ) {10.31 fwrite_string( io_rgn[i]->id, f );10.32 fwrite( &io_rgn[i]->base, sizeof( uint32_t ), 1, f );10.33 - fwrite( io_rgn[i]->mem, 4096, 1, f );10.34 + len = 4096;10.35 + fwrite( &len, sizeof(len), 1, f );10.36 + fwrite( io_rgn[i]->mem, len, 1, f );10.37 }10.38 }10.40 @@ -113,10 +116,47 @@10.41 {10.42 char tmp[64];10.43 uint32_t len;10.44 + uint32_t base, size;10.45 + int flags;10.46 int i;10.48 /* All memory regions */10.49 -10.50 + fread( &len, sizeof(len), 1, f );10.51 + if( len != num_mem_rgns )10.52 + return -1;10.53 + for( i=0; i<len; i++ ) {10.54 + fread_string( tmp, sizeof(tmp), f );10.55 + fread( &base, sizeof(base), 1, f );10.56 + fread( &flags, sizeof(flags), 1, f );10.57 + fread( &size, sizeof(size), 1, f );10.58 + if( strcmp( mem_rgn[i].name, tmp ) != 0 ||10.59 + base != mem_rgn[i].base ||10.60 + flags != mem_rgn[i].flags ||10.61 + size != mem_rgn[i].size ) {10.62 + ERROR( "Bad memory region %d %s", i, tmp );10.63 + return -1;10.64 + }10.65 + if( flags != MEM_FLAG_ROM )10.66 + fread( mem_rgn[i].mem, size, 1, f );10.67 + }10.68 +10.69 + /* All MMIO regions */10.70 + fread( &len, sizeof(len), 1, f );10.71 + if( len != num_io_rgns )10.72 + return -1;10.73 + for( i=0; i<len; i++ ) {10.74 + fread_string( tmp, sizeof(tmp), f );10.75 + fread( &base, sizeof(base), 1, f );10.76 + fread( &size, sizeof(size), 1, f );10.77 + if( strcmp( io_rgn[i]->id, tmp ) != 0 ||10.78 + base != io_rgn[i]->base ||10.79 + size != 4096 ) {10.80 + ERROR( "Bad MMIO region %d %s", i, tmp );10.81 + return -1;10.82 + }10.83 + fread( io_rgn[i]->mem, size, 1, f );10.84 + }10.85 + return 0;10.86 }10.88 struct mem_region *mem_map_region( void *mem, uint32_t base, uint32_t size,10.89 @@ -147,7 +187,7 @@10.91 mem = mem_alloc_pages( size>>PAGE_BITS );10.93 - mem_map_region( mem, base, size, name, 6 );10.94 + mem_map_region( mem, base, size, name, MEM_FLAG_RAM );10.95 return mem;10.96 }10.98 @@ -168,7 +208,7 @@10.99 close(fd);10.100 return NULL;10.101 }10.102 - mem_map_region( mem, base, size, file, 4 );10.103 + mem_map_region( mem, base, size, file, MEM_FLAG_ROM );10.105 /* CRC check */10.106 calc_crc = crc32(0L, mem, size);10.107 @@ -176,6 +216,7 @@10.108 WARN( "Bios CRC Mismatch in %s: %08X (expected %08X)",10.109 file, calc_crc, crc);10.110 }10.111 +10.112 return mem;10.113 }
11.1 --- a/src/mem.h Tue Dec 13 14:47:59 2005 +000011.2 +++ b/src/mem.h Thu Dec 15 13:33:14 2005 +000011.3 @@ -42,6 +42,9 @@11.4 #define WATCH_READ 211.5 #define WATCH_EXEC 3 /* AKA Breakpoint :) */11.7 +#define MEM_FLAG_ROM 4 /* Mem region is ROM-based */11.8 +#define MEM_FLAG_RAM 611.9 +11.10 typedef struct watch_point *watch_point_t;11.12 watch_point_t mem_new_watch( uint32_t start, uint32_t end, int flags );
12.1 --- a/src/sh4/sh4core.c Tue Dec 13 14:47:59 2005 +000012.2 +++ b/src/sh4/sh4core.c Thu Dec 15 13:33:14 2005 +000012.3 @@ -7,7 +7,7 @@12.4 #include "intc.h"12.6 void sh4_save( FILE *f );12.7 -void sh4_load( FILE *f );12.8 +int sh4_load( FILE *f );12.10 struct dreamcast_module sh4_module = { "SH4", sh4_init, sh4_reset,12.11 NULL, sh4_stop,12.12 @@ -51,9 +51,10 @@12.13 /* Save all additional on-board MMIO state */12.14 }12.16 -void sh4_load( FILE * f )12.17 +int sh4_load( FILE * f )12.18 {12.19 -12.20 + fread( &sh4r, sizeof(sh4r), 1, f );12.21 + return 0;12.22 }12.24 void sh4_run(void)
.