-\r
- // prepare CD buffer\r
- if (PicoMCD & 1) PicoCDBufferInit();\r
-\r
- // calc vsync offset to sync timing code with vsync\r
- if (currentConfig.EmuOpt&0x2000) {\r
- gettimeofday(&tval, 0);\r
- gp2x_video_wait_vsync();\r
- gettimeofday(&tval, 0);\r
- vsync_offset = tval.tv_usec;\r
- while (vsync_offset >= target_frametime)\r
- vsync_offset -= target_frametime;\r
- if (!vsync_offset) vsync_offset++;\r
- printf("vsync_offset: %i\n", vsync_offset);\r
- } else\r
- vsync_offset = 0;\r
-\r
- // loop?\r
- while (engineState == PGS_Running)\r
- {\r
- int modes;\r
-\r
- gettimeofday(&tval, 0);\r
- if(reset_timing) {\r
- reset_timing = 0;\r
- thissec = tval.tv_sec;\r
- frames_shown = frames_done = tval.tv_usec/target_frametime;\r
- }\r
-\r
- // show notice message?\r
- if(noticeMsgTime.tv_sec) {\r
- static int noticeMsgSum;\r
- if((tval.tv_sec*1000000+tval.tv_usec) - (noticeMsgTime.tv_sec*1000000+noticeMsgTime.tv_usec) > 2000000) { // > 2.0 sec\r
- noticeMsgTime.tv_sec = noticeMsgTime.tv_usec = 0;\r
- clearArea(0);\r
- notice = 0;\r
- } else {\r
- int sum = noticeMsg[0]+noticeMsg[1]+noticeMsg[2];\r
- if (sum != noticeMsgSum) { clearArea(0); noticeMsgSum = sum; }\r
- notice = noticeMsg;\r
- }\r
- }\r
-\r
- // check for mode changes\r
- modes = ((Pico.video.reg[12]&1)<<2)|(Pico.video.reg[1]&8);\r
- if (modes != oldmodes) {\r
- int scalex = 320;\r
- osd_fps_x = OSD_FPS_X;\r
- if (modes & 4) {\r
- vidCpyM2 = vidCpyM2_40col;\r
- } else {\r
- if (PicoOpt & 0x100) {\r
- vidCpyM2 = vidCpyM2_32col_nobord;\r
- scalex = 256;\r
- osd_fps_x = OSD_FPS_X - 64;\r
- } else {\r
- vidCpyM2 = vidCpyM2_32col;\r
- }\r
- }\r
- if (currentConfig.scaling == 2 && !(modes&8)) // want vertical scaling and game is not in 240 line mode\r
- gp2x_video_RGB_setscaling(8, scalex, 224);\r
- else gp2x_video_RGB_setscaling(0, scalex, 240);\r
- oldmodes = modes;\r
- clearArea(1);\r
- }\r
-\r
- // second changed?\r
- if(thissec != tval.tv_sec) {\r
-#ifdef BENCHMARK\r
- static int bench = 0, bench_fps = 0, bench_fps_s = 0, bfp = 0, bf[4];\r
- if(++bench == 10) {\r
- bench = 0;\r
- bench_fps_s = bench_fps;\r
- bf[bfp++ & 3] = bench_fps;\r
- bench_fps = 0;\r
- }\r
- bench_fps += frames_shown;\r
- sprintf(fpsbuff, "%02i/%02i/%02i", frames_shown, bench_fps_s, (bf[0]+bf[1]+bf[2]+bf[3])>>2);\r
-#else\r
- if(currentConfig.EmuOpt & 2)\r
- sprintf(fpsbuff, "%02i/%02i", frames_shown, frames_done);\r
-#endif\r
- thissec = tval.tv_sec;\r
-\r
- if(PsndOut == 0 && currentConfig.Frameskip >= 0) {\r
- frames_done = frames_shown = 0;\r
- } else {\r
- // it is quite common for this implementation to leave 1 fame unfinished\r
- // when second changes, but we don't want buffer to starve.\r
- if(PsndOut && frames_done < target_fps && frames_done > target_fps-5) {\r
- updateKeys();\r
- SkipFrame(1); frames_done++;\r
- }\r
-\r
- frames_done -= target_fps; if (frames_done < 0) frames_done = 0;\r
- frames_shown -= target_fps; if (frames_shown < 0) frames_shown = 0;\r
- if (frames_shown > frames_done) frames_shown = frames_done;\r
- }\r
- }\r
-#ifdef PFRAMES\r
- sprintf(fpsbuff, "%i", Pico.m.frame_count);\r