Cleaned up the realtime PIT code for win32.

This seeems to work on my laptop, but the processor
isn't fast enough to run anything substantial, so I'm
not certain how well it works.
This commit is contained in:
Gregory Alexander 2002-12-07 20:01:10 +00:00
parent a9cf965597
commit 66e7558498
2 changed files with 14 additions and 20 deletions

@ -1,5 +1,5 @@
////////////////////////////////////////////////////////////////////////
// $Id: pit_wrap.cc,v 1.41 2002-12-07 19:51:42 yakovlev Exp $
// $Id: pit_wrap.cc,v 1.42 2002-12-07 20:01:09 yakovlev Exp $
/////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2002 MandrakeSoft S.A.
@ -72,11 +72,6 @@
//1.193181MHz Clock
#define TICKS_PER_SECOND (1193181)
//FIXME
Bit64u em_last_realtime;
Bit64u last_realtime_delta;
Bit64u last_realtime_ticks;
Bit64u timer_accuracy;
// define a macro to convert floating point numbers into 64-bit integers.
// In MSVC++ you can convert a 64-bit float into a 64-bit signed integer,
@ -231,11 +226,9 @@ bx_pit_c::init( void )
BX_PIT_THIS s.stored_delta=0;
#if BX_HAVE_REALTIME_USEC
BX_PIT_THIS s.last_time=GET_PIT_REALTIME64_USEC()+(Bit64u)TIME_HEADSTART*(Bit64u)USEC_PER_SECOND;
//FIXME
em_last_realtime=0;
last_realtime_delta=0;
last_realtime_ticks=0;
timer_accuracy = USEC_PER_SECOND;
BX_PIT_THIS s.em_last_realtime=0;
BX_PIT_THIS s.last_realtime_delta=0;
BX_PIT_THIS s.last_realtime_ticks=0;
#else
BX_PIT_THIS s.last_time=((time(NULL)*TIME_MULTIPLIER/TIME_DIVIDER)+TIME_HEADSTART)*USEC_PER_SECOND;
BX_PIT_THIS s.max_ticks = AHEAD_CEILING;
@ -513,10 +506,8 @@ bx_pit_c::periodic( Bit32u usec_delta )
Bit64u real_time_total = real_time_delta + BX_PIT_THIS s.total_sec;
Bit64u em_time_delta = (Bit64u)usec_delta + (Bit64u)BX_PIT_THIS s.stored_delta;
if(real_time_delta) {
last_realtime_delta = real_time_delta;
last_realtime_ticks = BX_PIT_THIS s.total_ticks;
if(real_time_delta < timer_accuracy)
timer_accuracy = real_time_delta;
BX_PIT_THIS s.last_realtime_delta = real_time_delta;
BX_PIT_THIS s.last_realtime_ticks = BX_PIT_THIS s.total_ticks;
}
BX_PIT_THIS s.ticks_per_second = TICKS_PER_SECOND;
@ -528,9 +519,9 @@ bx_pit_c::periodic( Bit32u usec_delta )
// probably only an issue on startup, but it solves some problems.
ticks_delta = 0;
}
if(ticks_delta + BX_PIT_THIS s.total_ticks - last_realtime_ticks > REAL_USEC_TO_TICKS(F2I(MAX_MULT * I2F(last_realtime_delta)))) {
if(ticks_delta + BX_PIT_THIS s.total_ticks - BX_PIT_THIS s.last_realtime_ticks > REAL_USEC_TO_TICKS(F2I(MAX_MULT * I2F(BX_PIT_THIS s.last_realtime_delta)))) {
//This keeps us from going too fast in relation to real time.
ticks_delta = REAL_USEC_TO_TICKS(F2I(MAX_MULT * I2F(last_realtime_delta))) + last_realtime_ticks - BX_PIT_THIS s.total_ticks;
ticks_delta = REAL_USEC_TO_TICKS(F2I(MAX_MULT * I2F(BX_PIT_THIS s.last_realtime_delta))) + BX_PIT_THIS s.last_realtime_ticks - BX_PIT_THIS s.total_ticks;
BX_PIT_THIS s.ticks_per_second = F2I(MAX_MULT * I2F(TICKS_PER_SECOND));
}
if(ticks_delta > em_time_delta * TICKS_PER_SECOND / MIN_USEC_PER_SECOND) {
@ -571,9 +562,9 @@ bx_pit_c::periodic( Bit32u usec_delta )
a=(BX_PIT_THIS s.usec_per_second);
if(real_time_delta) {
//FIXME
Bit64u em_realtime_delta = BX_PIT_THIS s.last_sec_usec + BX_PIT_THIS s.stored_delta - em_last_realtime;
Bit64u em_realtime_delta = BX_PIT_THIS s.last_sec_usec + BX_PIT_THIS s.stored_delta - BX_PIT_THIS s.em_last_realtime;
b=((Bit64u)USEC_PER_SECOND * em_realtime_delta / real_time_delta);
em_last_realtime = BX_PIT_THIS s.last_sec_usec + BX_PIT_THIS s.stored_delta;
BX_PIT_THIS s.em_last_realtime = BX_PIT_THIS s.last_sec_usec + BX_PIT_THIS s.stored_delta;
} else {
b=a;
}

@ -1,5 +1,5 @@
/////////////////////////////////////////////////////////////////////////
// $Id: pit_wrap.h,v 1.15 2002-10-28 05:55:47 yakovlev Exp $
// $Id: pit_wrap.h,v 1.16 2002-12-07 20:01:10 yakovlev Exp $
/////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2001 MandrakeSoft S.A.
@ -82,6 +82,9 @@ private:
Bit64u stored_delta;
Bit64u total_usec;
Bit64u use_realtime;
Bit64u em_last_realtime;
Bit64u last_realtime_delta;
Bit64u last_realtime_ticks;
} s;
static void timer_handler(void *this_ptr);