UINT16 via6522_device::get_counter1_value() { UINT16 val; if(m_t1_active) { val = time_to_cycles(timer_timeleft(m_t1)) - IFR_DELAY; } else { val = 0xffff - time_to_cycles(attotime_sub(timer_get_time(&m_machine), m_time1)); } return val; }
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; }
attotime timer_timeleft(emu_timer *which) { return attotime_sub(which->expire, get_current_time()); }
attotime timer_timeelapsed(emu_timer *which) { return attotime_sub(get_current_time(), which->start); }
static double make_fraction(attotime a, attotime b, double timediv) { /* fraction = (a - b) / timediv */ return attotime_to_double(attotime_sub(a, b)) / timediv; }