diff -u clean/xc/programs/Xserver/hw/xfree86/vga256/drivers/s3v/s3v_driver.h xc/programs/Xserver/hw/xfree86/vga256/drivers/s3v/s3v_driver.h
--- clean/xc/programs/Xserver/hw/xfree86/vga256/drivers/s3v/s3v_driver.h	Tue Jan 11 20:01:01 2000
+++ xc/programs/Xserver/hw/xfree86/vga256/drivers/s3v/s3v_driver.h	Mon Mar 13 16:56:47 2000
@@ -19,7 +19,7 @@
    unsigned char CR40, CR41, CR42, CR43, CR45;
    unsigned char CR51, CR53, CR54, CR55, CR58, CR5D, CR5E;
    unsigned char CR63, CR65, CR66, CR67, CR68, CR69, CR6D; /* Video attrib. */
-   unsigned char CR86;
+   unsigned char CR85, CR86;
    unsigned char CR90, CR91;
    unsigned char ColorStack[8]; /* S3 hw cursor color stack CR4A/CR4B */
    unsigned int  STREAMS[22];   /* Streams regs */
diff -u clean/xc/programs/Xserver/hw/xfree86/vga256/drivers/s3v/s3v_driver.c xc/programs/Xserver/hw/xfree86/vga256/drivers/s3v/s3v_driver.c
--- clean/xc/programs/Xserver/hw/xfree86/vga256/drivers/s3v/s3v_driver.c	Tue Jan 11 20:01:01 2000
+++ xc/programs/Xserver/hw/xfree86/vga256/drivers/s3v/s3v_driver.c	Tue Mar 14 01:05:09 2000
@@ -471,6 +471,10 @@
 
    outb(vgaCRIndex, 0x33);
    outb(vgaCRReg, restore->CR33);
+   if (S3_TRIO_3D_2X_SERIES(s3vPriv.chip)) {
+      outb(vgaCRIndex, 0x85);
+      outb(vgaCRReg, restore->CR85);
+   }
    if (s3vPriv.chip == S3_ViRGE_DXGX) {
       outb(vgaCRIndex, 0x86);
       outb(vgaCRReg, restore->CR86);
@@ -702,6 +706,10 @@
 
    outb(vgaCRIndex, 0x33);             
    save->CR33 = inb(vgaCRReg);
+   if (S3_TRIO_3D_2X_SERIES(s3vPriv.chip)) {
+      outb(vgaCRIndex, 0x85);
+      save->CR85 = inb(vgaCRReg);
+   }
    if (s3vPriv.chip == S3_ViRGE_DXGX) {
       outb(vgaCRIndex, 0x86);
       save->CR86 = inb(vgaCRReg);
@@ -970,10 +978,12 @@
       }
       else if (S3_TRIO_3D_2X_SERIES(s3vPriv.chip)) {
          switch((config1 & 0xE0) >> 5) {
-         case 0:
-            vga256InfoRec.videoRam = 8 * 1024;
+         case 0:  /* 8MB -- only 4MB usable for display/cursor */
+            vga256InfoRec.videoRam = 4 * 1024;
+            s3vPriv.MemOffScreen   = 4 * 1024;
             break;
          case 1:    /* 32 bit interface -- yuck */
+	    ErrorF("%s %s: found 32 bit interface for video memory -- yuck:(\n");
          case 2:
             vga256InfoRec.videoRam = 4 * 1024;
             break;
@@ -1071,6 +1081,12 @@
       if (vga256InfoRec.dacSpeeds[2] <= 0) vga256InfoRec.dacSpeeds[2] = 135000;
       if (vga256InfoRec.dacSpeeds[3] <= 0) vga256InfoRec.dacSpeeds[3] = 135000;
    }
+   else if (S3_TRIO_3D_2X_SERIES(s3vPriv.chip)) {
+      if (vga256InfoRec.dacSpeeds[0] <= 0) vga256InfoRec.dacSpeeds[0] = 230000;
+      if (vga256InfoRec.dacSpeeds[1] <= 0) vga256InfoRec.dacSpeeds[1] = 230000;
+      if (vga256InfoRec.dacSpeeds[2] <= 0) vga256InfoRec.dacSpeeds[2] = 135000;
+      if (vga256InfoRec.dacSpeeds[3] <= 0) vga256InfoRec.dacSpeeds[3] = 135000;
+   }
    else if (s3vPriv.chip == S3_ViRGE_DXGX || S3_ViRGE_GX2_SERIES(s3vPriv.chip)) {
       if (vga256InfoRec.dacSpeeds[0] <= 0) vga256InfoRec.dacSpeeds[0] = 170000;
       if (vga256InfoRec.dacSpeeds[1] <= 0) vga256InfoRec.dacSpeeds[1] = 170000;
@@ -1874,6 +1890,9 @@
    new->CR33 = 0x20;
    if ((s3vPriv.chip == S3_ViRGE_DXGX) || (S3_TRIO_3D_SERIES(s3vPriv.chip))) {
       new->CR86 = 0x80;  /* disable DAC power saving to avoid bright left edge */
+   }
+   if (S3_TRIO_3D_2X_SERIES(s3vPriv.chip)) {
+      new->CR85 = 0x1f;  /* avoid sreen flickering */
    }
    if (s3vPriv.chip == S3_ViRGE_DXGX || S3_ViRGE_GX2_SERIES(s3vPriv.chip) || 
        S3_ViRGE_MX_SERIES(s3vPriv.chip) || S3_TRIO_3D_SERIES(s3vPriv.chip)) {
