summaryrefslogtreecommitdiff
path: root/sys/arch/atari/dev/clock.c
diff options
context:
space:
mode:
authorleo <leo@NetBSD.org>2000-05-31 12:27:30 +0000
committerleo <leo@NetBSD.org>2000-05-31 12:27:30 +0000
commit4b3b8618df4237dace3e7fdee6558a8f49eb8455 (patch)
tree5a9f202522a0163e81799cbba4931b79c886d37a /sys/arch/atari/dev/clock.c
parent08d1e4928af8b2885213f72adb5b6ebc1514e195 (diff)
Fix some bugs in clkread(). These bugs caused strange time leaps.
Diffstat (limited to 'sys/arch/atari/dev/clock.c')
-rw-r--r--sys/arch/atari/dev/clock.c16
1 files changed, 13 insertions, 3 deletions
diff --git a/sys/arch/atari/dev/clock.c b/sys/arch/atari/dev/clock.c
index d4366a23dba..9bccd13e063 100644
--- a/sys/arch/atari/dev/clock.c
+++ b/sys/arch/atari/dev/clock.c
@@ -1,4 +1,4 @@
-/* $NetBSD: clock.c,v 1.21 2000/01/06 12:03:31 leo Exp $ */
+/* $NetBSD: clock.c,v 1.22 2000/05/31 12:27:30 leo Exp $ */
/*
* Copyright (c) 1988 University of Utah.
@@ -262,12 +262,22 @@ long
clkread()
{
u_int delta;
+ u_char ipra, tadr;
- delta = ((divisor - MFP->mf_tadr) * tick) / divisor;
+ /*
+ * Note: Order is important!
+ * By reading 'ipra' before 'tadr' and caching the data, I try to avoid
+ * the situation that very low value in 'tadr' is read (== a big delta)
+ * while also acccounting for a full 'tick' because the counter went
+ * through zero during the calculations.
+ */
+ ipra = MFP->mf_ipra; tadr = MFP->mf_tadr;
+
+ delta = ((divisor - tadr) * tick) / divisor;
/*
* Account for pending clock interrupts
*/
- if(MFP->mf_iera & IA_TIMA)
+ if(ipra & IA_TIMA)
return(delta + tick);
return(delta);
}