Example #1
0
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();
		
	}	
}
Example #2
0
// 内部函数实现
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;
}