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; } } }
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; } }