filename | src/dreamcast.c |
changeset | 18:9a1b5d75703f |
prev | 17:944f75eea496 |
next | 23:1ec3acd0594d |
author | nkeynes |
date | Thu Dec 22 07:38:12 2005 +0000 (18 years ago) |
permissions | -rw-r--r-- |
last change | Implement 95% of the SCIF serial interface Implement basic load_bin_file function to try to load demos directly Update TMU to run all 3 timers, start on general timing |
file | annotate | diff | log | raw |
1.1 --- a/src/dreamcast.c Tue Dec 13 14:47:59 2005 +00001.2 +++ b/src/dreamcast.c Thu Dec 22 07:38:12 2005 +00001.3 @@ -1,3 +1,4 @@1.4 +#include <errno.h>1.5 #include "dream.h"1.6 #include "mem.h"1.7 #include "aica/aica.h"1.8 @@ -98,13 +99,17 @@1.9 };1.12 -int dreamcast_load_state( FILE *f )1.13 +int dreamcast_load_state( const gchar *filename )1.14 {1.15 int i,j;1.16 uint32_t count, len;1.17 int have_read[MAX_MODULES];1.18 char tmp[64];1.19 struct save_state_header header;1.20 + FILE *f;1.21 +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.29 return 1;1.30 }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.36 return 1;1.37 }1.38 for( i=0; i<MAX_MODULES; i++ ) {1.39 have_read[i] = 0;1.40 }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.49 return 2;1.50 }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.55 return 2;1.56 }1.58 @@ -141,10 +145,10 @@1.59 if( strcmp(modules[j]->name,tmp) == 0 ) {1.60 have_read[j] = 1;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.64 return 2;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.68 return 2;1.69 }1.70 break;1.71 @@ -165,18 +169,28 @@1.72 modules[j]->reset();1.73 }1.74 }1.75 + fclose(f);1.76 + INFO( "Save state read from %s", filename );1.77 }1.79 -void dreamcast_save_state( FILE *f )1.80 +int dreamcast_save_state( const gchar *filename )1.81 {1.82 int i;1.83 + FILE *f;1.84 struct save_state_header header;1.86 + f = fopen( filename, "w" );1.87 + if( f == NULL )1.88 + return errno;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.93 +1.94 + for( i=0; i<num_modules; i++ ) {1.95 + if( modules[i]->save != NULL )1.96 + header.module_count++;1.97 + }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.105 }1.106 }1.107 + fclose( f );1.108 + INFO( "Save state written to %s", filename );1.109 }
.