From fc5fc795be51b4947970d832f7764e66150e846d Mon Sep 17 00:00:00 2001 From: Toni Wilen Date: Sun, 18 Jan 2015 14:55:38 +0200 Subject: [PATCH] More accurate clock sync. --- cia.cpp | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/cia.cpp b/cia.cpp index 052d75cc..b73f75a0 100644 --- 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) { -- 2.47.3