#ifdef TOD_HACK
static uae_u64 tod_hack_tv, tod_hack_tod, tod_hack_tod_last;
static int tod_hack_enabled;
+static int tod_hack_delay;
+static int tod_diff_cnt;
+#define TOD_HACK_DELAY 50
#define TOD_HACK_TIME 312 * 50 * 10
static void tod_hack_reset (void)
{
tod_hack_tv = (uae_u64)tv.tv_sec * 1000000 + tv.tv_usec;
tod_hack_tod = ciaatod;
tod_hack_tod_last = tod_hack_tod;
+ tod_diff_cnt = 0;
}
#endif
if (rate <= 0)
return;
if (rate != oldrate || ciaatod != tod_hack_tod_last) {
- //if (ciaatod != 0)
- // write_log (_T("TOD HACK reset %d,%d %d,%d\n"), rate, oldrate, ciaatod, tod_hack_tod_last);
+ write_log (_T("TOD HACK reset %d,%d %d,%d\n"), rate, oldrate, ciaatod, tod_hack_tod_last);
tod_hack_reset ();
oldrate = rate;
docount = 1;
}
+
if (!dotod && currprefs.cs_ciaatod == 0)
return;
+
+ if (tod_hack_delay > 0) {
+ tod_hack_delay--;
+ if (tod_hack_delay > 0)
+ return;
+ tod_hack_delay = TOD_HACK_DELAY;
+ }
+
gettimeofday (&tv, NULL);
t = (uae_u64)tv.tv_sec * 1000000 + tv.tv_usec;
if (t - tod_hack_tv >= 1000000 / rate) {
tod_hack_tv += 1000000 / rate;
+ tod_diff_cnt += 1000000 - (1000000 / rate) * rate;
+ tod_hack_tv += tod_diff_cnt / rate;
+ tod_diff_cnt %= rate;
docount = 1;
}
if (docount) {