/* Main loop */
while (VdmRunning)
{
+ /* Get the resolution of the system timer */
+ DWORD TimerResolution = PitGetResolution();
+
/* Get the current number of ticks */
CurrentTickCount = GetTickCount();
- /* Get the current performance counter value */
- QueryPerformanceCounter(&Counter);
+ if (TimerResolution > 1000)
+ {
+ /* 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;
+ /* 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) / 1000;
+ }
/* Update the PIT */
- for (i = 0; i < TimerTicks; i++) PitDecrementCount();
- LastTimerTick = Counter;
+ if (TimerTicks > 0)
+ {
+ for (i = 0; i < TimerTicks; i++) PitDecrementCount();
+ LastTimerTick = Counter;
+ }
/* Check for vertical retrace */
if ((CurrentTickCount - LastVerticalRefresh) >= 16)
}
}
+DWORD PitGetResolution(VOID)
+{
+ INT i;
+ DWORD MinReloadValue = 65536;
+
+ for (i = 0; i < PIT_CHANNELS; i++)
+ {
+ DWORD ReloadValue = PitChannels[i].ReloadValue;
+
+ /* 0 means 65536 */
+ if (ReloadValue == 0) ReloadValue = 65536;
+
+ if (ReloadValue < MinReloadValue) MinReloadValue = ReloadValue;
+ }
+
+ /* Return the frequency resolution */
+ return PIT_BASE_FREQUENCY / MinReloadValue;
+}
+
/* EOF */