retro games 100 wrote:
"Are you saying that, if a DOS PC game is a 320x200x8 (mode 13h) VGA game, its vertical refresh rate is "hard-coded" @ 70Hz?"
Correct. The 'game' is not hard-coded to a 70Hz vertical refresh rate, the IBM VGA mode 13h (320x200x8bpp) video mode has an inherent 70Hz vertical refresh rate due to the 25.175Mhz 'dot-clock'. If you change the 'dot-clock' and the CRTC parameters you can then change the implied vertical refresh rate. However, most video adapter vBIOS will not allow changes to the IBM standard VGA modes, there is leeway with some VESA 3.0 vBIOS code implementations which allow the various VESA utilities which change VESA video mode parameters (including refresh rate) to function. Some of the VESA utilities will work with VESA 1.2 and 2.0 implementations when the utility detects certain SVGA chipsets...
I should clarify that there is a difference in the way an LCD monitor detects the VGA video mode by way of just how the LCD monitor is connected to the video adapter. You could be connected with either an analog VGA cable (HD-15) or a digital DVI cable. The 'dot-clock' is part of the DVI specification and allows for possible 'pixel perfect' display at the native LCD monitor resolution and lets the monitor know the 'dot-clock' directly when using a digital DVI cable. With an analog VGA cable connecting the video adapter and the LCD monitor, there is only an implied 'dot-clock', which is detected (just as with CRT monitors) from the horizontal and vertical sync pulses that are used by a particular video-mode and refresh rate by the LCD (or CRT) monitor's electronics.
From what I read about the 'Hexen' video game technical requirements, it appears that it only uses IBM VGA resolutions, so that it might display an opening title/credits panel with VGA mode 12h (640x480x4bpp) @60Hz, then shift to the actual game-play VGA video mode 13h (320x200x8bpp) @70Hz. To a monitor this game-playing VGA video mode 13h 'looks' like a pixel resolution of 640x400 @70Hz (dot-clock of 25.175 MHz) to the LCD monitor, since any 200 line resolution is actually 400 lines due to line doubling necessary to satisfy the 'dot-clock' rate.
If I had to guess, I would say that the LCD monitor is connected via a VGA HD-15 cable and is displaying (740x400 @70Hz) for your 'Hexen' in-game screen, since the VGA text mode 03h horizontal sync pulse of ~3.81(µs) and the vertical sync pulse of ~63.0(µs) are the same values as those for VGA graphics mode 13h (320x200 @70Hz) [which is the same as VGA 640x400 @70Hz], and the total number of lines for both VGA video modes is 449 lines. The only difference is the number of total pixels per line (visible and blank) which is 800 pixels for VGA mode 13h and 900 pixels for VGA text mode 03h. If the LCD monitor display on the game (320x200x8bpp) screen has black borders only on the left and right, then this might be what is happening. The 'dot-clocks' are different, 25.175MHz for VGA text mode 03h and 28.322MHz for VGA graphics mode 13h. The LCD monitor should not be 'confused', especially if connected via a DVI cable.
Miki Maus wrote:
"Can vBIOS be dumped, patched and flashed back on the video card? Is this even remotely possible?"
Sure, it's just code. There are both DOS and Win32 applications which can be used to dump and Flash the vBIOS for Matrox, NVidia and ATI video adapters. Here are some links for information about the vBIOS of the two video cards lines that I have owned, Matrox and NVidia:
1.) Matrox Mystique G200 PINS data
2.) MURC thread on hacking Matrox BIOS PINS values for DOS refresh rate
1.) The NiBiTor v4.2 BIOS editor from MVKTECH.NET
2.) The NVidia VGABios Test utility used to test NVidia vBIOS before Flashing
Once you dump the vBIOS, then you do have to either follow the Matrox PINS pixel-clock modifications and re-Flash the vBIOS or for NVidia video adapters one must dis-assemble the vBIOS code to determine the location of the various tables which determine the VGA and VESA modes and 'dot-clock' values to change refresh rates. The data and vBIOS locations vary by NVidia video adapter model. After patching and re-checksumming the vBIOS, you may test under DOS with the NVidia VGABios.exe v1.10 test utility before you Flash the vBIOS on the NVidia video adapter.
Have fun! 😈
"Would it be possible to reprogram the CRTC to switch to another refresh rate after the mode has been set via the usual interrupt?"
Once you program the CRTC registers directly, you can do almost anything in DOS... However, if you are going to use the standard VGA or VESA modes defined in the vBIOS via the Int 10h interface, the VESA video mode refresh rate might as well be changed with the standard VESA 3.0 vBIOS API, which is supported via the Int 10h/AX=4F02h ES:DI->CRTC information block with bit 11 of the BX=requested video mode bit set. However, many vendors have eliminated this functionality in their VESA 3.0 vBIOS code. I am not aware of any specific CRTC register which can change the vertical refresh rate since the CRTC defines the display in terms of timings in character clocks (horizontal) and scan-lines (vertical) against a known 'dot-clock' value.
It appears that the Matrox vBIOS might have an undocumented vBIOS Int 10h/AX=4F14h, subfunction BL=04h API that might program one of the pixel clocks? The NVidia vBIOS must have the various table values changed to support VESA vertical refresh rates > 60Hz and any desired custom VESA video modes. The NVidia IBM standard VGA modes are locked at the 60/70Hz vertical refresh rates listed in the table in my previous post.
The advantage of modifying the vBIOS and re-Flashing is that those vBIOS modifications are then available in DOS, the Windows NTVDM and Linux frame-buffer... Currently this is the only way to get 85Hz VESA vertical refresh rates for CRT monitors, like my Lacie Electron Blue IV 22" monitor. 😁
Hope this helps,
edit: fix text error
edit: fix text error