void emu_run(){ while(emu_running){ wait_for_frame(); int scanlines = 262; while(scanlines-- > 0){ ppu_run(1); cpu_exec(&cpu,1364/12); } parse_events(); } }
// 内部函数实现 static DWORD WINAPI nes_thread_proc(LPVOID lpParam) { NES *nes = (NES*)lpParam; DWORD dwTickLast = 0; DWORD dwTickCur = 0; DWORD dwTickDiff = 0; DWORD dwTickSleep = 0; int scanline = 0; while (1) { WaitForSingleObject(nes->hNesEvent, -1); if (nes->bExitThread) break; // run cpu & ppu for (scanline=0; scanline<NES_VTOTAL; scanline++) { cpu_run_pclk(&(nes->cpu), NES_HTOTAL); ppu_run(&(nes->ppu), scanline ); cpu_nmi(&(nes->cpu), nes->ppu.pin_vbl); } // apu render frame apu_run_pclk(&(nes->apu), NES_HTOTAL * NES_VTOTAL); //++ framerate control ++// dwTickCur = GetTickCount(); dwTickDiff = dwTickCur - dwTickLast; dwTickLast = dwTickCur; if (dwTickDiff > 16) { if (dwTickSleep > 0) dwTickSleep--; } else if (dwTickDiff < 16) { dwTickSleep++; } if (dwTickSleep) Sleep(dwTickSleep); //-- framerate control --// log_printf("%d, %d\n", dwTickDiff, dwTickSleep); } return 0; }