static void timer_register_save(emu_timer *timer) { char buf[256]; int count = 0; emu_timer *t; /* find other timers that match our func name */ for (t = timer_head; t; t = t->next) if (!strcmp(t->func, timer->func)) count++; /* make up a name */ sprintf(buf, "timer.%s", timer->func); /* use different instances to differentiate the bits */ state_save_push_tag(0); state_save_register_item(buf, count, timer->param); state_save_register_item(buf, count, timer->enabled); state_save_register_item(buf, count, timer->period.seconds); state_save_register_item(buf, count, timer->period.attoseconds); state_save_register_item(buf, count, timer->start.seconds); state_save_register_item(buf, count, timer->start.attoseconds); state_save_register_item(buf, count, timer->expire.seconds); state_save_register_item(buf, count, timer->expire.attoseconds); state_save_pop_tag(); }
void timer_init(running_machine *machine) { int i; /* we need to wait until the first call to timer_cyclestorun before using real CPU times */ global_basetime = attotime_zero; callback_timer = NULL; callback_timer_modified = FALSE; /* register with the save state system */ state_save_push_tag(0); state_save_register_item("timer", 0, global_basetime.seconds); state_save_register_item("timer", 0, global_basetime.attoseconds); state_save_register_postload(machine, timer_postload, NULL); state_save_pop_tag(); /* reset the timers */ memset(timers, 0, sizeof(timers)); /* initialize the lists */ timer_head = NULL; timer_free_head = &timers[0]; for (i = 0; i < MAX_TIMERS-1; i++) timers[i].next = &timers[i+1]; timers[MAX_TIMERS-1].next = NULL; timer_free_tail = &timers[MAX_TIMERS-1]; }
void cpuint_init(running_machine *machine) { int cpunum; int line; /* loop over all CPUs and input lines */ for (cpunum = 0; cpunum < cpu_gettotalcpu(); cpunum++) { /* reset any driver hooks into the IRQ acknowledge callbacks */ drv_irq_callbacks[cpunum] = NULL; /* clear out all the CPU states */ for (line = 0; line < MAX_INPUT_LINES; line++) { input_line_state[cpunum][line] = CLEAR_LINE; interrupt_vector[cpunum][line] = input_line_vector[cpunum][line] = cputype_default_irq_vector(Machine->drv->cpu[cpunum].type); input_event_index[cpunum][line] = 0; } } /* set up some stuff to save */ state_save_push_tag(0); state_save_register_item_2d_array("cpu", 0, interrupt_vector); state_save_register_item_2d_array("cpu", 0, input_line_state); state_save_register_item_2d_array("cpu", 0, input_line_vector); state_save_pop_tag(); }
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; }