Пример #1
0
        public static void run()
        {
            reset();

            while (true)
            {
                CPU.nextInstr();
                DMA.work();
                GPU_Timing.work();
                Sound.work();
                Timer.work();
                Joypad.set_reg();

                Serial.work();

                cycles = cycles + CPU.newticks;

                Memory.GameRAMSnapshot();

                if (do_savestate)
                {
                    create_savestate();
                    do_savestate = false;
                }

                if (do_loadstate)
                {
                    load_savestate();
                    do_loadstate = false;
                }
            }
        }
Пример #2
0
        public static void timer_overflow(uint timerindex)
        {
            CPU.newticks = 0;
            bool request = false;

            for (uint i = 0; i < 2; i++)
            {
                if (soundDMAs[i].any_on && soundDMAs[i].timerindex == timerindex)
                {
                    if (soundDMAs[i].fifo.Count <= 3)
                    {
                        request |= DMA.request_audio(i);
                    }

                    if (soundDMAs[i].playfifo.Count > 0)
                    {
                        soundDMAs[i].playfifo.RemoveAt(0);
                    }
                    if (soundDMAs[i].playfifo.Count == 0)
                    {
                        UInt32 value = 0;
                        if (soundDMAs[i].fifo.Count > 0)
                        {
                            value = soundDMAs[i].fifo[0];
                            soundDMAs[i].fifo.RemoveAt(0);
                            soundDMAs[i].playfifo.Add((byte)value);
                            soundDMAs[i].playfifo.Add((byte)(value >> 8));
                            soundDMAs[i].playfifo.Add((byte)(value >> 16));
                            soundDMAs[i].playfifo.Add((byte)(value >> 24));
                        }
                    }
                }
            }
            if (request)
            {
                DMA.work();
                DMA.delayed = true;
            }
        }