From 493ad03e5227ff7630e81a32a0de200e23bf5370 Mon Sep 17 00:00:00 2001 From: Aleksandar Andrejevic Date: Sun, 28 Aug 2016 16:17:14 +0000 Subject: [PATCH] [NTVDM:SVGA] Fix the refresh rate calculation, again. svn path=/trunk/; revision=72489 --- .../mvdm/ntvdm/hardware/video/svga.c | 35 ++++++++++++++----- 1 file changed, 27 insertions(+), 8 deletions(-) diff --git a/reactos/subsystems/mvdm/ntvdm/hardware/video/svga.c b/reactos/subsystems/mvdm/ntvdm/hardware/video/svga.c index 74e80bd5f63..b0ac3a8506e 100644 --- a/reactos/subsystems/mvdm/ntvdm/hardware/video/svga.c +++ b/reactos/subsystems/mvdm/ntvdm/hardware/video/svga.c @@ -1118,6 +1118,22 @@ static BYTE WINAPI VgaReadPort(USHORT Port) VerticalRetraceEnd = VerticalRetraceStart + (VgaCrtcRegisters[VGA_CRTC_END_VERT_RETRACE_REG] & 0x0F); + if (VgaGcRegisters[VGA_GC_MISC_REG] & VGA_GC_MISC_NOALPHA) + { + BYTE MaximumScanLine = 1 + (VgaCrtcRegisters[VGA_CRTC_MAX_SCAN_LINE_REG] & 0x1F); + + if (VgaCrtcRegisters[VGA_CRTC_MAX_SCAN_LINE_REG] & VGA_CRTC_MAXSCANLINE_DOUBLE) + { + VerticalRetraceStart <<= 1; + VerticalRetraceEnd <<= 1; + } + else + { + VerticalRetraceStart *= MaximumScanLine; + VerticalRetraceEnd *= MaximumScanLine; + } + } + /* Calculate the horizontal blanking duration in cycles */ HblankStart = VgaCrtcRegisters[VGA_CRTC_START_HORZ_BLANKING_REG] & 0x1F; HblankEnd = VgaCrtcRegisters[VGA_CRTC_END_HORZ_BLANKING_REG] & 0x1F; @@ -1644,15 +1660,18 @@ static VOID FASTCALL VgaHorizontalRetrace(ULONGLONG ElapsedTime) VerticalRetraceStart |= (VgaCrtcRegisters[VGA_CRTC_OVERFLOW_REG] & VGA_CRTC_OVERFLOW_VRS8) << 6; VerticalRetraceStart |= (VgaCrtcRegisters[VGA_CRTC_OVERFLOW_REG] & VGA_CRTC_OVERFLOW_VRS9) << 2; - if (VgaCrtcRegisters[VGA_CRTC_MAX_SCAN_LINE_REG] & VGA_CRTC_MAXSCANLINE_DOUBLE) + if (VgaGcRegisters[VGA_GC_MISC_REG] & VGA_GC_MISC_NOALPHA) { - VerticalRetraceStart <<= 1; - VerticalTotal <<= 1; - } - else - { - VerticalRetraceStart *= MaximumScanLine; - VerticalTotal *= MaximumScanLine; + if (VgaCrtcRegisters[VGA_CRTC_MAX_SCAN_LINE_REG] & VGA_CRTC_MAXSCANLINE_DOUBLE) + { + VerticalRetraceStart <<= 1; + VerticalTotal <<= 1; + } + else + { + VerticalRetraceStart *= MaximumScanLine; + VerticalTotal *= MaximumScanLine; + } } /* Set the cycle */