1.1 --- a/src/dreamcast.c Tue Dec 13 14:47:59 2005 +0000
1.2 +++ b/src/dreamcast.c Thu Dec 15 13:33:14 2005 +0000
1.7 #include "aica/aica.h"
1.12 -int dreamcast_load_state( FILE *f )
1.13 +int dreamcast_load_state( const gchar *filename )
1.16 uint32_t count, len;
1.17 int have_read[MAX_MODULES];
1.19 struct save_state_header header;
1.22 + f = fopen( filename, "r" );
1.23 + if( f == NULL ) return errno;
1.25 fread( &header, sizeof(header), 1, f );
1.26 if( strncmp( header.magic, DREAMCAST_SAVE_MAGIC, 16 ) != 0 ) {
1.27 @@ -115,24 +120,23 @@
1.28 ERROR( "DreamOn save state version not supported" );
1.31 - fread( &count, sizeof(count), 1, f );
1.32 - if( count > MAX_MODULES ) {
1.33 - ERROR( "DreamOn save state is corrupted" );
1.34 + if( header.module_count > MAX_MODULES ) {
1.35 + ERROR( "DreamOn save state is corrupted (bad module count)" );
1.38 for( i=0; i<MAX_MODULES; i++ ) {
1.42 - for( i=0; i<count; i++ ) {
1.43 + for( i=0; i<header.module_count; i++ ) {
1.44 fread(tmp, 4, 1, f );
1.45 - if( strcmp(tmp, "BLCK") != 0 ) {
1.46 - ERROR( "DreamOn save state is corrupted" );
1.47 + if( strncmp(tmp, "BLCK", 4) != 0 ) {
1.48 + ERROR( "DreamOn save state is corrupted (missing block header %d)", i );
1.51 len = fread_string(tmp, sizeof(tmp), f );
1.52 if( len > 64 || len < 1 ) {
1.53 - ERROR( "DreamOn save state is corrupted" );
1.54 + ERROR( "DreamOn save state is corrupted (bad string)" );
1.58 @@ -141,10 +145,10 @@
1.59 if( strcmp(modules[j]->name,tmp) == 0 ) {
1.61 if( modules[j]->load == NULL ) {
1.62 - ERROR( "DreamOn save state is corrupted" );
1.63 + ERROR( "DreamOn save state is corrupted (no loader for %s)", modules[j]->name );
1.65 } else if( modules[j]->load(f) != 0 ) {
1.66 - ERROR( "DreamOn save state is corrupted" );
1.67 + ERROR( "DreamOn save state is corrupted (%s failed)", modules[j]->name );
1.71 @@ -165,18 +169,28 @@
1.72 modules[j]->reset();
1.76 + INFO( "Save state read from %s", filename );
1.79 -void dreamcast_save_state( FILE *f )
1.80 +int dreamcast_save_state( const gchar *filename )
1.84 struct save_state_header header;
1.86 + f = fopen( filename, "w" );
1.89 strcpy( header.magic, DREAMCAST_SAVE_MAGIC );
1.90 header.version = DREAMCAST_SAVE_VERSION;
1.91 - header.module_count = num_modules;
1.92 + header.module_count = 0;
1.94 + for( i=0; i<num_modules; i++ ) {
1.95 + if( modules[i]->save != NULL )
1.96 + header.module_count++;
1.98 fwrite( &header, sizeof(header), 1, f );
1.99 - fwrite_string( dreamcast_config, f );
1.100 for( i=0; i<num_modules; i++ ) {
1.101 if( modules[i]->save != NULL ) {
1.102 fwrite( "BLCK", 4, 1, f );
1.103 @@ -184,5 +198,7 @@
1.104 modules[i]->save(f);
1.108 + INFO( "Save state written to %s", filename );