public static void timer_adjust_periodic(emu_timer which, Atime start_delay, Atime period) { Atime time = get_current_time(); if (which == callback_timer) { callback_timer_modified = true; } which.enabled = true; if (start_delay.seconds < 0) { start_delay = Attotime.ATTOTIME_ZERO; } which.start = time; which.expire = Attotime.attotime_add(time, start_delay); if (which.expire.attoseconds == 0x003be7e176706f58) { int i1 = 1; } which.period = period; timer_list_remove(which); timer_list_insert(which); if (lt.IndexOf(which) == 0) { if (Cpuexec.activecpu >= 0 && Cpuexec.activecpu < Cpuexec.ncpu) { Cpuexec.activecpu_abort_timeslice(Cpuexec.activecpu); } } }
public static Atime cpunum_get_localtime(int cpunum) { Atime result; result = cpu[cpunum].localtime; int cycles; cycles = cpu[cpunum].cycles_running - cpu[cpunum].PendingCycles; result = Attotime.attotime_add(result, new Atime(cycles / cpu[cpunum].cycles_per_second, cycles * cpu[cpunum].attoseconds_per_cycle)); return(result); }
public static void timer_set_global_time(Atime newbase) { emu_timer timer; global_basetime = newbase; while (Attotime.attotime_compare(lt[0].expire, global_basetime) <= 0) { bool was_enabled = lt[0].enabled; timer = lt[0]; if (Attotime.attotime_compare(timer.period, Attotime.ATTOTIME_ZERO) == 0 || Attotime.attotime_compare(timer.period, Attotime.ATTOTIME_NEVER) == 0) { timer.enabled = false; } callback_timer_modified = false; callback_timer = timer; callback_timer_expire_time = timer.expire; if (was_enabled && (timer.action != null && timer.action != Cpuexec.null_callback)) { timer.action(); } callback_timer = null; if (callback_timer_modified == false) { if (timer.temporary) { timer_list_remove(timer); } else { timer.start = timer.expire; timer.expire = Attotime.attotime_add(timer.expire, timer.period); timer_list_remove(timer); timer_list_insert(timer); } } } }
public static void cpuexec_timeslice() { StreamWriter sw2 = null; Atime target = Timer.lt[0].expire; Atime tbase = Timer.global_basetime; int ran; Atime at; for (icpu = 0; icpu < ncpu; icpu++) { cpu[icpu].suspend = cpu[icpu].nextsuspend; cpu[icpu].eatcycles = cpu[icpu].nexteatcycles; } for (icpu = 0; icpu < ncpu; icpu++) { if (cpu[icpu].suspend == 0) { at = Attotime.attotime_sub(target, cpu[icpu].localtime); cpu[icpu].cycles_running = (int)(at.seconds * cpu[icpu].cycles_per_second + at.attoseconds / cpu[icpu].attoseconds_per_cycle); if (cpu[icpu].cycles_running > 0) { cpu[icpu].cycles_stolen = 0; activecpu = icpu; ran = cpu[icpu].ExecuteCycles(cpu[icpu].cycles_running); activecpu = -1; ran -= cpu[icpu].cycles_stolen; cpu[icpu].totalcycles += (ulong)ran; cpu[icpu].localtime = Attotime.attotime_add(cpu[icpu].localtime, new Atime(ran / cpu[icpu].cycles_per_second, ran * cpu[icpu].attoseconds_per_cycle)); if (Attotime.attotime_compare(cpu[icpu].localtime, target) < 0) { if (Attotime.attotime_compare(cpu[icpu].localtime, tbase) > 0) { target = cpu[icpu].localtime; } else { target = tbase; } } } } } for (icpu = 0; icpu < ncpu; icpu++) { if (cpu[icpu].suspend != 0 && cpu[icpu].eatcycles != 0 && Attotime.attotime_compare(cpu[icpu].localtime, target) < 0) { at = Attotime.attotime_sub(target, cpu[icpu].localtime); cpu[icpu].cycles_running = (int)(at.seconds * cpu[icpu].cycles_per_second + at.attoseconds / cpu[icpu].attoseconds_per_cycle); cpu[icpu].totalcycles += (ulong)cpu[icpu].cycles_running; cpu[icpu].localtime = Attotime.attotime_add(cpu[icpu].localtime, new Atime(cpu[icpu].cycles_running / cpu[icpu].cycles_per_second, cpu[icpu].cycles_running * cpu[icpu].attoseconds_per_cycle)); } cpu[icpu].suspend = cpu[icpu].nextsuspend; cpu[icpu].eatcycles = cpu[icpu].nexteatcycles; } Timer.timer_set_global_time(target); /* if (Timer.global_basetime.attoseconds == 0 && Machine.FORM.cheatform.lockState == cheatForm.LockState.LOCK_SECOND) * { * Machine.FORM.cheatform.ApplyCheat(); * }*/ }