mirror of
https://github.com/86Box/86Box.git
synced 2026-02-24 02:18:20 -07:00
Fix PTIMER speed, which fixes 1 minute of being frozen on the win2k bootscreen
This commit is contained in:
@@ -59,22 +59,21 @@ void nv3_ptimer_interrupt(uint32_t num)
|
||||
// Ticks the timer.
|
||||
void nv3_ptimer_tick(double real_time)
|
||||
{
|
||||
// do not divide by zero
|
||||
// prevent a divide by zero
|
||||
if (nv3->ptimer.clock_numerator == 0
|
||||
|| nv3->ptimer.clock_denominator == 0)
|
||||
return;
|
||||
|
||||
// get the current time
|
||||
// Due to timer system limitations, the timer system is not capable of running at 100 megahertz. Therefore, we have to scale it down and then scale up the level of changes
|
||||
// to the state.
|
||||
|
||||
// See Envytools. We need to use the frequency as a source.
|
||||
// But we need to figure out how many cycles actually occurred because this counts up every cycle...
|
||||
// We need to figure out how many cycles actually occurred because this counts up every cycle...
|
||||
// However it seems that their formula is wrong. I can't be bothered to figure out what's going on and, based on documentation from NVIDIA,
|
||||
// timer_0 is meant to roll over every 4 seconds. Multiplying by 10 basically does the job.
|
||||
|
||||
// Convert to microseconds
|
||||
double freq_base = (real_time / 1000000.0f) / ((double)1.0 / nv3->nvbase.memory_clock_frequency);
|
||||
|
||||
double current_time = freq_base * ((double)nv3->ptimer.clock_numerator * NV3_86BOX_TIMER_SYSTEM_FIX_QUOTIENT) / (double)nv3->ptimer.clock_denominator; // *10.0?
|
||||
double freq_base = (real_time / 1000000.0f) / ((double)1.0 / nv3->nvbase.memory_clock_frequency) * 10.0f;
|
||||
double current_time = freq_base * ((double)nv3->ptimer.clock_numerator) / (double)nv3->ptimer.clock_denominator; // *10.0?
|
||||
|
||||
// truncate it
|
||||
nv3->ptimer.time += (uint64_t)current_time;
|
||||
|
||||
Reference in New Issue
Block a user