Author: aandrejevic Date: Fri Nov 1 01:57:40 2013 New Revision: 60816
URL: http://svn.reactos.org/svn/reactos?rev=60816&view=rev Log: [NTVDM] Revert a previous incorrect fix for the PIT. Modify the PitDecrementCount function to take a parameter instead of it being called multiple times (which is slower).
Modified: branches/ntvdm/subsystems/ntvdm/ntvdm.c branches/ntvdm/subsystems/ntvdm/timer.c branches/ntvdm/subsystems/ntvdm/timer.h
Modified: branches/ntvdm/subsystems/ntvdm/ntvdm.c URL: http://svn.reactos.org/svn/reactos/branches/ntvdm/subsystems/ntvdm/ntvdm.c?r... ============================================================================== --- branches/ntvdm/subsystems/ntvdm/ntvdm.c [iso-8859-1] (original) +++ branches/ntvdm/subsystems/ntvdm/ntvdm.c [iso-8859-1] Fri Nov 1 01:57:40 2013 @@ -140,35 +140,20 @@ /* Main loop */ while (VdmRunning) { - /* Get the resolution of the system timer */ - DWORD TimerResolution = PitGetResolution(); - /* Get the current number of ticks */ CurrentTickCount = GetTickCount();
- if (TimerResolution > 1000) - { - /* Get the current performance counter value */ - QueryPerformanceCounter(&Counter); + /* Get the current performance counter value */ + QueryPerformanceCounter(&Counter);
- /* Get the number of PIT ticks that have passed */ - TimerTicks = ((Counter.QuadPart - LastTimerTick.QuadPart) - * PIT_BASE_FREQUENCY) / Frequency.QuadPart; - } - else - { - /* Use the standard tick count */ - Counter.QuadPart = CurrentTickCount; + /* Get the number of PIT ticks that have passed */ + TimerTicks = ((Counter.QuadPart - LastTimerTick.QuadPart) + * PIT_BASE_FREQUENCY) / Frequency.QuadPart;
- /* Get the number of PIT ticks that have passed */ - TimerTicks = ((Counter.QuadPart - LastTimerTick.QuadPart) - * PIT_BASE_FREQUENCY) / 1000; - } - /* Update the PIT */ if (TimerTicks > 0) { - for (i = 0; i < TimerTicks; i++) PitDecrementCount(); + PitDecrementCount(TimerTicks); LastTimerTick = Counter; }
Modified: branches/ntvdm/subsystems/ntvdm/timer.c URL: http://svn.reactos.org/svn/reactos/branches/ntvdm/subsystems/ntvdm/timer.c?r... ============================================================================== --- branches/ntvdm/subsystems/ntvdm/timer.c [iso-8859-1] (original) +++ branches/ntvdm/subsystems/ntvdm/timer.c [iso-8859-1] Fri Nov 1 01:57:40 2013 @@ -146,7 +146,7 @@ } }
-VOID PitDecrementCount() +VOID PitDecrementCount(DWORD Count) { INT i;
@@ -157,7 +157,12 @@ case PIT_MODE_INT_ON_TERMINAL_COUNT: { /* Decrement the value */ - PitChannels[i].CurrentValue--; + if (Count > PitChannels[i].CurrentValue) + { + /* The value does not reload in this case */ + PitChannels[i].CurrentValue = 0; + } + else PitChannels[i].CurrentValue -= Count;
/* Did it fall to the terminal count? */ if (PitChannels[i].CurrentValue == 0 && !PitChannels[i].Pulsed) @@ -171,47 +176,100 @@
case PIT_MODE_RATE_GENERATOR: { - /* Decrement the value */ - PitChannels[i].CurrentValue--; - - /* Did it fall to zero? */ - if (PitChannels[i].CurrentValue != 0) break; - - /* Yes, raise the output line and reload */ - if (i == 0) PicInterruptRequest(0); - PitChannels[i].CurrentValue = PitChannels[i].ReloadValue; + BOOLEAN Reloaded = FALSE; + + while (Count) + { + if ((Count > PitChannels[i].CurrentValue) + && (PitChannels[i].CurrentValue != 0)) + { + /* Decrease the count */ + Count -= PitChannels[i].CurrentValue; + + /* Reload the value */ + PitChannels[i].CurrentValue = PitChannels[i].ReloadValue; + + /* Set the flag */ + Reloaded = TRUE; + } + else + { + /* Decrease the value */ + PitChannels[i].CurrentValue -= Count; + + /* Clear the count */ + Count = 0; + + /* Did it fall to zero? */ + if (PitChannels[i].CurrentValue == 0) + { + PitChannels[i].CurrentValue = PitChannels[i].ReloadValue; + Reloaded = TRUE; + } + } + } + + /* If there was a reload on channel 0, raise IRQ 0 */ + if ((i == 0) && Reloaded) PicInterruptRequest(0);
break; }
case PIT_MODE_SQUARE_WAVE: { - /* Decrement the value by 2 */ - PitChannels[i].CurrentValue -= 2; - - /* Did it fall to zero? */ - if (PitChannels[i].CurrentValue != 0) break; - - /* Yes, toggle the flip-flop */ - PitChannels[i].OutputFlipFlop = !PitChannels[i].OutputFlipFlop; - - /* Did this create a rising edge in the signal? */ - if (PitChannels[i].OutputFlipFlop) - { - /* Yes, IRQ 0 if this is channel 0 */ - if (i == 0) PicInterruptRequest(0); - } - - /* Reload the value, but make sure it's even */ - if (PitChannels[i].ReloadValue % 2) - { - /* It's odd, reduce it by 1 */ - PitChannels[i].CurrentValue = PitChannels[i].ReloadValue - 1; - } - else - { - /* It was even */ - PitChannels[i].CurrentValue = PitChannels[i].ReloadValue; + INT ReloadCount = 0; + WORD ReloadValue = PitChannels[i].ReloadValue; + + /* The reload value must be even */ + ReloadValue &= ~1; + + while (Count) + { + if (((Count * 2) > PitChannels[i].CurrentValue) + && (PitChannels[i].CurrentValue != 0)) + { + /* Decrease the count */ + Count -= PitChannels[i].CurrentValue / 2; + + /* Reload the value */ + PitChannels[i].CurrentValue = ReloadValue; + + /* Increment the reload count */ + ReloadCount++; + } + else + { + /* Clear the count */ + Count = 0; + + /* Decrease the value */ + PitChannels[i].CurrentValue -= Count * 2; + + /* Did it fall to zero? */ + if (PitChannels[i].CurrentValue == 0) + { + /* Reload the value */ + PitChannels[i].CurrentValue = ReloadValue; + + /* Increment the reload count */ + ReloadCount++; + } + } + } + + if (ReloadCount == 0) break; + + /* Toggle the flip-flop if the number of reloads was odd */ + if (ReloadCount & 1) + { + PitChannels[i].OutputFlipFlop = !PitChannels[i].OutputFlipFlop; + } + + /* Was there any rising edge on channel 0 ? */ + if ((PitChannels[i].OutputFlipFlop || ReloadCount) && (i == 0)) + { + /* Yes, IRQ 0 */ + PicInterruptRequest(0); }
break;
Modified: branches/ntvdm/subsystems/ntvdm/timer.h URL: http://svn.reactos.org/svn/reactos/branches/ntvdm/subsystems/ntvdm/timer.h?r... ============================================================================== --- branches/ntvdm/subsystems/ntvdm/timer.h [iso-8859-1] (original) +++ branches/ntvdm/subsystems/ntvdm/timer.h [iso-8859-1] Fri Nov 1 01:57:40 2013 @@ -48,7 +48,7 @@ VOID PitWriteCommand(BYTE Value); BYTE PitReadData(BYTE Channel); VOID PitWriteData(BYTE Channel, BYTE Value); -VOID PitDecrementCount(); +VOID PitDecrementCount(DWORD Count); DWORD PitGetResolution(VOID);
#endif // _TIMER_H_