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; }
void running_machine::handle_saveload() { UINT32 openflags = (m_saveload_schedule == SLS_LOAD) ? OPEN_FLAG_READ : (OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_CREATE_PATHS); const char *opnamed = (m_saveload_schedule == SLS_LOAD) ? "loaded" : "saved"; const char *opname = (m_saveload_schedule == SLS_LOAD) ? "load" : "save"; file_error filerr = FILERR_NONE; /* if no name, bail */ if (m_saveload_pending_file.len() == 0) goto cancel; /* if there are anonymous timers, we can't save just yet, and we can't load yet either because the timers might overwrite data we have loaded */ if (timer_count_anonymous(this) > 0) { /* if more than a second has passed, we're probably screwed */ if (attotime_sub(timer_get_time(this), m_saveload_schedule_time).seconds > 0) { popmessage("Unable to %s due to pending anonymous timers. See error.log for details.", opname); goto cancel; } return; } /* open the file */ mame_file *file; filerr = mame_fopen(m_saveload_searchpath, m_saveload_pending_file, openflags, &file); if (filerr == FILERR_NONE) { astring fullname(mame_file_full_name(file)); /* read/write the save state */ state_save_error staterr = (m_saveload_schedule == SLS_LOAD) ? state_save_read_file(this, file) : state_save_write_file(this, file); /* handle the result */ switch (staterr) { case STATERR_ILLEGAL_REGISTRATIONS: popmessage("Error: Unable to %s state due to illegal registrations. See error.log for details.", opname); break; case STATERR_INVALID_HEADER: popmessage("Error: Unable to %s state due to an invalid header. Make sure the save state is correct for this game.", opname); break; case STATERR_READ_ERROR: popmessage("Error: Unable to %s state due to a read error (file is likely corrupt).", opname); break; case STATERR_WRITE_ERROR: popmessage("Error: Unable to %s state due to a write error. Verify there is enough disk space.", opname); break; case STATERR_NONE: if (!(m_game.flags & GAME_SUPPORTS_SAVE)) popmessage("State successfully %s.\nWarning: Save states are not officially supported for this game.", opnamed); else popmessage("State successfully %s.", opnamed); break; default: popmessage("Error: Unknown error during state %s.", opnamed); break; } /* close and perhaps delete the file */ mame_fclose(file); if (staterr != STATERR_NONE && m_saveload_schedule == SLS_SAVE) osd_rmfile(fullname); } else popmessage("Error: Failed to open file for %s operation.", opname); /* unschedule the operation */ cancel: m_saveload_pending_file.reset(); m_saveload_searchpath = NULL; m_saveload_schedule = SLS_NONE; }
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; }