Date: Tue, 29 Mar 1994 22:02:46 +0200 From: Stefan Eckart To: djgpp AT sun DOT soe DOT clarkson DOT edu Subject: vesadrv.vdr (GRX1.03) problem The VESA graphics driver built into go32 v1.11(.maint4) does not work with my SVGA: the VESA modes reported by VESAget(Mode)Info are not added to the list of supported graphics modes. Tracing go32 with DOS DEBUG.EXE revealed the following reason: The VESA BIOS of this (Cirrus Logic True Color) VGA returns the list of video modes (to which VgaInfoBlock.VideoModePtr points) in the same 256 byte area as the VgaInfoBlock itself (in the reserved or unused part starting at offset 0x12). This list is then used by do_driver_init() to call VESAgetModeInfo for each mode. However, VESAgetModeInfo uses the same 256 byte area as VESAgetInfo and thus overwrites the list, still being in use. The driver should use different areas for both data blocks or make a local copy of the video mode list (similar to ndrivers/vesainfo.com, which works correctly with my VGA). As a temporary solution I have patched vesadrv.vdr to use different data areas. For those who have the same problem: you have to change the bytes at offset 0e3h, 0f8h and 0103h from 0dh to 0eh and increase the file size by 0100h. This can be done with debug for example: debug vesadrv.vdr < patch.inp ---------- patch.inp ---------- n vesadrv2.vdr e1e3 e e1f8 e e203 e ffe6l100 0 rcx fe6 w q ------------------------------- Of course you have to set the driver option of the GO32 environment variable to point to the patched driver. BTW, there is also a bug in the (obsolete?) vesainfo.c version in the libgrx/drivers directory: the ModeInfoBlock structure is not padded to 256 byte. If the VESA BIOS writes all 256 bytes (not only the currently defined lower part), the program crashes, which is exactly what happens with my SVGA. Bye, Stefan. -- stefan AT lis DOT e-technik DOT tu-muenchen DOT de