fixed: broken fs0, sram saves
[fceu.git] / drivers / gp2x / throttle.c
CommitLineData
35868d35 1#include <sys/time.h>
2#include "main.h"
b2b95d2e 3#include "gp2x.h"
35868d35 4#include "throttle.h"
5
35868d35 6
7extern uint8 PAL;
b2b95d2e 8extern int FSkip;
35868d35 9static int usec_aim = 0, usec_done = 0;
10static int skip_count = 0;
11
2a6855a3 12void RefreshThrottleFPS(void)
13{
14 usec_aim = usec_done = skip_count = 0;
15}
16
17void SpeedThrottle(void)
35868d35 18{
19 static struct timeval tv_prev;
20 struct timeval tv_now;
21 int delta_nom = PAL ? 19997 : 16639; // ~50.007, 19.997 ms/frame : ~60.1, 16.639 ms/frame
22
23
24 if (usec_done == 0) { // first time
25 usec_done = 1;
26 gettimeofday(&tv_prev, 0);
27 return;
28 }
29
30 gettimeofday(&tv_now, 0);
31
32 usec_aim += delta_nom;
33 if (tv_now.tv_sec != tv_prev.tv_sec)
34 usec_done += 1000000;
35 usec_done += tv_now.tv_usec - tv_prev.tv_usec;
36
37#ifdef FRAMESKIP
b2b95d2e 38 if (Settings.frameskip >= 0)
35868d35 39 {
b2b95d2e 40 if (skip_count >= Settings.frameskip)
35868d35 41 skip_count = 0;
42 else {
43 skip_count++;
44 FSkip = 1;
45 }
46 }
937bf65b 47 else if (usec_done > usec_aim + 1024*4)
35868d35 48 {
49 /* auto frameskip */
b2b95d2e 50 if (usec_done - usec_aim > 1024*32)
937bf65b 51 usec_done = usec_aim = 1; // too much behind, try to recover..
b2b95d2e 52 else
53 FSkip = 1;
35868d35 54 tv_prev = tv_now;
55 return;
56 }
57#endif
58
59 tv_prev = tv_now;
60 while (usec_done < usec_aim)
61 {
62 gettimeofday(&tv_now, 0);
63
64 if (tv_now.tv_sec != tv_prev.tv_sec)
65 usec_done += 1000000;
66 usec_done += tv_now.tv_usec - tv_prev.tv_usec;
67 tv_prev = tv_now;
68 }
69 usec_done = usec_done - usec_aim + 1; // reset to prevent overflows
70 usec_aim = 0;
71}
35868d35 72