public static void timer_list_insert(emu_timer timer1) { int i; int i1 = -1; if (timer1.func == "latch_callback") { int i2 = 1; } if (timer1.func == "cpunum_empty_event_queue") { foreach (emu_timer et in lt) { if (et.func == timer1.func && Attotime.attotime_compare(et.expire, global_basetime) <= 0) { i1 = lt.IndexOf(et); break; } } } if (i1 == -1) { Atime expire = timer1.enabled ? timer1.expire : Attotime.ATTOTIME_NEVER; for (i = 0; i < lt.Count; i++) { if (Attotime.attotime_compare(lt[i].expire, expire) > 0) { break; } } lt.Insert(i, timer1); } }
public static void timer_list_remove(emu_timer timer1) { if (timer1.func == "cpunum_empty_event_queue") { List <emu_timer> lt1 = new List <emu_timer>(); foreach (emu_timer et in lt) { if (et.func == timer1.func && Attotime.attotime_compare(et.expire, timer1.expire) == 0) { lt1.Add(et); } } foreach (emu_timer et1 in lt1) { lt.Remove(et1); } } else { foreach (emu_timer et in lt) { if (et.func == timer1.func) { lt.Remove(et); break; } } } }
public static void replay_portC2() { if (Inptport.bReplayRead) { try { Video.screenstate.frame_number = Mame.brRecord.ReadInt64(); short0_old = Mame.brRecord.ReadInt16(); short1_old = Mame.brRecord.ReadInt16(); short2_old = Mame.brRecord.ReadInt16(); } catch { Mame.playState = Mame.PlayState.PLAY_REPLAYEND; //Mame.mame_pause(true); } Inptport.bReplayRead = false; } if (Attotime.attotime_compare(Timer.global_basetime, Timer.global_basetime_obj) == 0) { short0 = short0_old; short1 = short1_old; short2 = short2_old; Inptport.bReplayRead = true; } else { Inptport.bReplayRead = false; } }
private static void TimerHandler_3812(int c, Atime period) { if (Attotime.attotime_compare(period, Attotime.ATTOTIME_ZERO) == 0) { Timer.timer_enable(timer[c], false); } else { Timer.timer_adjust_periodic(timer[c], period, Attotime.ATTOTIME_NEVER); } }
public static void cpu_boost_interleave(Atime timeslice_time, Atime boost_duration) { if (Attotime.attotime_compare(timeslice_time, perfect_interleave) < 0) { timeslice_time = perfect_interleave; } Timer.timer_adjust_periodic(interleave_boost_timer, timeslice_time, timeslice_time); if (!Timer.timer_enabled(interleave_boost_timer_end) || Attotime.attotime_compare(Timer.timer_timeleft(interleave_boost_timer_end), boost_duration) < 0) { Timer.timer_adjust_periodic(interleave_boost_timer_end, boost_duration, Attotime.ATTOTIME_NEVER); } }
public static void watchdog_reset() { if (!watchdog_enabled) { Timer.timer_adjust_periodic(watchdog_timer, Attotime.ATTOTIME_NEVER, Attotime.ATTOTIME_NEVER); } else if (Attotime.attotime_compare(watchdog_time, Attotime.ATTOTIME_ZERO) != 0) { Timer.timer_adjust_periodic(watchdog_timer, watchdog_time, Attotime.ATTOTIME_NEVER); } else { Timer.timer_adjust_periodic(watchdog_timer, new Atime(3, 0), Attotime.ATTOTIME_NEVER); } }
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(); * }*/ }
public static void cpunum_empty_event_queue() { List <irq> lsirq = new List <irq>(); foreach (irq irq1 in lirq) { if (Attotime.attotime_compare(irq1.time, Timer.global_basetime) <= 0) { if (irq1.line == (int)LineState.INPUT_LINE_RESET) { if (irq1.state == LineState.ASSERT_LINE) { Cpuexec.cpunum_suspend(irq1.cpunum, Cpuexec.SUSPEND_REASON_RESET, 1); } else { if ((irq1.state == LineState.CLEAR_LINE && Cpuexec.cpunum_is_suspended(irq1.cpunum, Cpuexec.SUSPEND_REASON_RESET)) || irq1.state == LineState.PULSE_LINE) { Cpuexec.cpu[irq1.cpunum].Reset(); } Cpuexec.cpunum_resume(irq1.cpunum, Cpuexec.SUSPEND_REASON_RESET); } } else if (irq1.line == (int)LineState.INPUT_LINE_HALT) { if (irq1.state == LineState.ASSERT_LINE) { Cpuexec.cpunum_suspend(irq1.cpunum, Cpuexec.SUSPEND_REASON_HALT, 1); } else if (irq1.state == LineState.CLEAR_LINE) { Cpuexec.cpunum_resume(irq1.cpunum, Cpuexec.SUSPEND_REASON_HALT); } } else { switch (irq1.state) { case LineState.PULSE_LINE: Cpuexec.cpu[irq1.cpunum].set_irq_line(irq1.line, LineState.ASSERT_LINE); Cpuexec.cpu[irq1.cpunum].set_irq_line(irq1.line, LineState.CLEAR_LINE); break; case LineState.HOLD_LINE: case LineState.ASSERT_LINE: Cpuexec.cpu[irq1.cpunum].set_irq_line(irq1.line, LineState.ASSERT_LINE); break; case LineState.CLEAR_LINE: Cpuexec.cpu[irq1.cpunum].set_irq_line(irq1.line, LineState.CLEAR_LINE); break; } } lsirq.Add(irq1); } } foreach (irq irq1 in lsirq) { lirq.Remove(irq1); } }