diff options
| author | leo <leo@NetBSD.org> | 2000-05-31 12:27:30 +0000 |
|---|---|---|
| committer | leo <leo@NetBSD.org> | 2000-05-31 12:27:30 +0000 |
| commit | 4b3b8618df4237dace3e7fdee6558a8f49eb8455 (patch) | |
| tree | 5a9f202522a0163e81799cbba4931b79c886d37a /sys/arch/atari/dev/clock.c | |
| parent | 08d1e4928af8b2885213f72adb5b6ebc1514e195 (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.c | 16 |
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); } |
