- 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
-#if 0\r
- sprintf(fpsbuff, "%05i", Pico.m.frame_count);\r
-#endif\r
- lim_time = (frames_done+1) * target_frametime;\r
- if(currentConfig.Frameskip >= 0) { // frameskip enabled\r
- for(i = 0; i < currentConfig.Frameskip; i++) {\r
- updateKeys();\r
- SkipFrame(1); frames_done++;\r
- if (PsndOut) { // do framelimitting if sound is enabled\r
- gettimeofday(&tval, 0);\r
- if(thissec != tval.tv_sec) tval.tv_usec+=1000000;\r
- if(tval.tv_usec < lim_time) { // we are too fast\r
- simpleWait(thissec, lim_time);\r
- }\r
- }\r
- lim_time += target_frametime;\r
- }\r
- } else if(tval.tv_usec > lim_time) { // auto frameskip\r
- // no time left for this frame - skip\r
- if (tval.tv_usec - lim_time >= 0x300000) {\r
- /* something caused a slowdown for us (disk access? cache flush?)\r
- * try to recover by resetting timing... */\r
- reset_timing = 1;\r
- continue;\r
- }\r
- updateKeys();\r
- SkipFrame(tval.tv_usec < lim_time+target_frametime*2); frames_done++;\r
- continue;\r
- }\r
-\r
- updateKeys();\r
- PicoFrame();\r
-\r
-#if 0\r
-if (Pico.m.frame_count == 31563) {\r
- FILE *f;\r
- f = fopen("ram_p.bin", "wb");\r
- if (!f) { printf("!f\n"); exit(1); }\r
- fwrite(Pico.ram, 1, 0x10000, f);\r
- fclose(f);\r
- exit(0);\r