]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
More accurate clock sync.
authorToni Wilen <twilen@winuae.net>
Sun, 18 Jan 2015 12:55:38 +0000 (14:55 +0200)
committerToni Wilen <twilen@winuae.net>
Sun, 18 Jan 2015 12:55:38 +0000 (14:55 +0200)
cia.cpp

diff --git a/cia.cpp b/cia.cpp
index 052d75ccefba392acaae71cc3802b72acfaa2722..b73f75a03e66387d90e9f25c52d9b0eb5696d608 100644 (file)
--- a/cia.cpp
+++ b/cia.cpp
@@ -542,6 +542,9 @@ STATIC_INLINE void ciaa_checkalarm (bool inc)
 #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)
 {
@@ -550,6 +553,7 @@ 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
 
@@ -601,18 +605,29 @@ static void do_tod_hack (int dotod)
        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) {