bool retro_serialize(void *data, size_t size) { int cpunum; if(retro_serialize_size() && data && size) { /* write the save state */ state_save_save_begin(data); /* write tag 0 */ state_save_set_current_tag(0); if(state_save_save_continue()) { return false; } /* loop over CPUs */ for (cpunum = 0; cpunum < cpu_gettotalcpu(); cpunum++) { cpuintrf_push_context(cpunum); /* make sure banking is set */ activecpu_reset_banking(); /* save the CPU data */ state_save_set_current_tag(cpunum + 1); if(state_save_save_continue()) return false; cpuintrf_pop_context(); } /* finish and close */ state_save_save_finish(); return true; } return false; }
bool retro_unserialize(const void * data, size_t size) { int cpunum; /* if successful, load it */ if (retro_serialize_size() && data && size && !state_save_load_begin((void*)data, size)) { /* read tag 0 */ state_save_set_current_tag(0); if(state_save_load_continue()) return false; /* loop over CPUs */ for (cpunum = 0; cpunum < cpu_gettotalcpu(); cpunum++) { cpuintrf_push_context(cpunum); /* make sure banking is set */ activecpu_reset_banking(); /* load the CPU data */ state_save_set_current_tag(cpunum + 1); if(state_save_load_continue()) return false; cpuintrf_pop_context(); } /* finish and close */ state_save_load_finish(); return true; } return false; }
static void handle_load(running_machine *machine) { mame_private *mame = machine->mame_data; mame_file_error filerr; mame_file *file; /* if no name, bail */ if (mame->saveload_pending_file == NULL) { mame->saveload_schedule_callback = NULL; return; } /* if there are anonymous timers, we can't load just yet because the timers might */ /* overwrite data we have loaded */ if (timer_count_anonymous() > 0) { /* if more than a second has passed, we're probably screwed */ if (sub_mame_times(mame_timer_get_time(), mame->saveload_schedule_time).seconds > 0) { popmessage("Unable to load due to pending anonymous timers. See error.log for details."); goto cancel; } return; } /* open the file */ filerr = mame_fopen(SEARCHPATH_STATE, mame->saveload_pending_file, OPEN_FLAG_READ, &file); if (filerr == FILERR_NONE) { /* start loading */ if (state_save_load_begin(file) == 0) { int cpunum; /* read tag 0 */ state_save_push_tag(0); state_save_load_continue(); state_save_pop_tag(); /* loop over CPUs */ for (cpunum = 0; cpunum < cpu_gettotalcpu(); cpunum++) { cpuintrf_push_context(cpunum); /* make sure banking is set */ activecpu_reset_banking(); /* load the CPU data */ state_save_push_tag(cpunum + 1); state_save_load_continue(); state_save_pop_tag(); /* make sure banking is set */ activecpu_reset_banking(); cpuintrf_pop_context(); } /* finish and close */ state_save_load_finish(); popmessage("State successfully loaded."); } else popmessage("Error: Failed to load state"); mame_fclose(file); } else popmessage("Error: Failed to load state"); cancel: /* unschedule the load */ free(mame->saveload_pending_file); mame->saveload_pending_file = NULL; mame->saveload_schedule_callback = NULL; }
static void handle_save(running_machine *machine) { mame_private *mame = machine->mame_data; mame_file_error filerr; mame_file *file; /* if no name, bail */ if (mame->saveload_pending_file == NULL) { mame->saveload_schedule_callback = NULL; return; } /* if there are anonymous timers, we can't save just yet */ if (timer_count_anonymous() > 0) { /* if more than a second has passed, we're probably screwed */ if (sub_mame_times(mame_timer_get_time(), mame->saveload_schedule_time).seconds > 0) { popmessage("Unable to save due to pending anonymous timers. See error.log for details."); goto cancel; } return; } /* open the file */ filerr = mame_fopen(SEARCHPATH_STATE, mame->saveload_pending_file, OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_CREATE_PATHS, &file); if (filerr == FILERR_NONE) { int cpunum; /* write the save state */ if (state_save_save_begin(file) != 0) { popmessage("Error: Unable to save state due to illegal registrations. See error.log for details."); mame_fclose(file); goto cancel; } /* write the default tag */ state_save_push_tag(0); state_save_save_continue(); state_save_pop_tag(); /* loop over CPUs */ for (cpunum = 0; cpunum < cpu_gettotalcpu(); cpunum++) { cpuintrf_push_context(cpunum); /* make sure banking is set */ activecpu_reset_banking(); /* save the CPU data */ state_save_push_tag(cpunum + 1); state_save_save_continue(); state_save_pop_tag(); cpuintrf_pop_context(); } /* finish and close */ state_save_save_finish(); mame_fclose(file); /* pop a warning if the game doesn't support saves */ if (!(machine->gamedrv->flags & GAME_SUPPORTS_SAVE)) popmessage("State successfully saved.\nWarning: Save states are not officially supported for this game."); else popmessage("State successfully saved."); } else popmessage("Error: Failed to save state"); cancel: /* unschedule the save */ free(mame->saveload_pending_file); mame->saveload_pending_file = NULL; mame->saveload_schedule_callback = NULL; }