Ejemplo n.º 1
0
        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);
            }
        }
Ejemplo n.º 2
0
 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;
             }
         }
     }
 }
Ejemplo n.º 3
0
 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;
     }
 }
Ejemplo n.º 4
0
 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);
     }
 }
Ejemplo n.º 5
0
 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);
     }
 }
Ejemplo n.º 6
0
 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);
     }
 }
Ejemplo n.º 7
0
        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);
                    }
                }
            }
        }
Ejemplo n.º 8
0
        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();
             * }*/
        }
Ejemplo n.º 9
0
        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);
            }
        }