*** ibm8514init.c.V	Mon Jan 18 20:50:56 1993
--- ibm8514init.c	Sat Feb 27 01:25:40 1993
***************
*** 28,33 ****
--- 28,34 ----
  
  #include "x386Procs.h"
  #include "x386OSD.h"
+ #include "x386.h"
  
  #include "reg8514.h"
  #include <sys/types.h>
***************
*** 34,39 ****
--- 35,44 ----
  #include <sys/mman.h>
  #include "vga.h"
  
+ /* for the Number 9 GXE programmable clock generator code */
+ #include "number9.h"
+ extern ScrnInfoRec vga256InfoRec;
+ 
  typedef struct {
    vgaHWRec std;               /* good old IBM VGA */
    unsigned char s3reg[10];  /* Video Atribute */  
***************
*** 77,83 ****
  
  /*  (ClockSelect)(restore->std.NoClock); */
        /* restore s3 special bits */
!     if (chip_id == S3_801) {
        /* restore 801 specific registers */
  
        for (i = 32; i < 35 ; i++)
--- 82,88 ----
  
  /*  (ClockSelect)(restore->std.NoClock); */
        /* restore s3 special bits */
!     if (S3_801_928_SERIES(chip_id)) {
        /* restore 801 specific registers */
  
        for (i = 32; i < 35 ; i++)
***************
*** 173,191 ****
       }
     chip_id = oldS3.s3reg[0];
  
!    if (chip_id == S3_801) {
!      ErrorF("S3 chipset is a 801 \n");
!    } else if (chip_id == S3_911) {
!      ErrorF("S3 chipset is a 911 \n");
!    } else if (chip_id == S3_924) {
!      ErrorF("S3 chipset is a 924\n");
!      ErrorF("Some poeple are having problems with the 924 chip\n");
!      ErrorF("If your machine locks up, try with turbo disabled on the card\n");
!    } else ErrorF("Unknown S3 chipset: %x\n", chip_id);
  
     
!    outp(0x3d4, 0x11); /* allow writting? */
!    outp(0x3d5, 0x00);
       for (i = 0; i < 16 ; i++)
       {
  	outp(0x3d4, 0x40 + i);
--- 178,206 ----
       }
     chip_id = oldS3.s3reg[0];
  
!    if (S3_801_928_SERIES(chip_id)) {
!      ErrorF("S3 chipset is in the 801 or 928 series.\n"); 
!      if (S3_801_SERIES(chip_id)) {
!        ErrorF("S3 chipset is a 801 \n");
!      } else if (S3_928_SERIES(chip_id)) {
!        ErrorF("S3 chipset is a 928 \n");
!      };
!    } else if (S3_911_SERIES(chip_id)) {
!      ErrorF("S3 chipset is in the 911 series.\n");
!      if (S3_911_ONLY(chip_id)) {
!        ErrorF("S3 chipset is a 911 \n");
!      } else if (S3_924_ONLY(chip_id)) {
!        ErrorF("S3 chipset is a 924\n");
!        ErrorF("Some people are having problems with the 924 chip\n");
!        ErrorF("If your machine locks up, try with turbo disabled on the card\n");
!      } else {
!        ErrorF("exact S3 chipset is unknown, chip_id = %x\n", chip_id);
!      };
!    } else ErrorF("Unknown S3 series or chipset : chip_id is %x\n", chip_id);
  
     
!    outp(0x3d4, 0x11); /* allow writing? */
!    outp(0x3d5, 0x00); /* unlock horizontal timing registers */
       for (i = 0; i < 16 ; i++)
       {
  	outp(0x3d4, 0x40 + i);
***************
*** 238,247 ****
  
       mode->Clock |= 0x20;
  
!      mode->VDisplay =  mode->VDisplay /2;
!      mode->VSyncStart=  mode->VSyncStart/2;
!      mode->VSyncEnd=  mode->VSyncEnd /2;
!      mode->VTotal=  mode->VTotal / 2;
     }
      /*
     * Time Sequencer
--- 253,266 ----
  
       mode->Clock |= 0x20;
  
!      /* ensure that the divison of mode parameters is only done once -JPN */
!      if ((mode->Flags & V_INTERLACE_INTERNAL) == 0 ) {
!        mode->Flags = mode->Flags | V_INTERLACE_INTERNAL;
!        mode->VDisplay =  mode->VDisplay /2;  
!        mode->VSyncStart=  mode->VSyncStart/2;
!        mode->VSyncEnd=  mode->VSyncEnd /2; 
!        mode->VTotal=  mode->VTotal / 2; 
!      }
     }
      /*
     * Time Sequencer
***************
*** 407,413 ****
  outp(0x3d5, 0x44); /* 0xff 640 */
  
    outp(0x3d4,0x40);
!   if (chip_id == S3_801) {
      outp(0x3d5,0x83); /* 801 */
    } else {
      outp(0x3d5, 0x09);
--- 426,432 ----
  outp(0x3d5, 0x44); /* 0xff 640 */
  
    outp(0x3d4,0x40);
!   if (S3_801_928_SERIES(chip_id)) {
      outp(0x3d5,0x83); /* 801 */
    } else {
      outp(0x3d5, 0x09);
***************
*** 416,421 ****
--- 435,482 ----
  outp(0x3d4,0x41);
  outp(0x3d5, 0x14); /* 1024  */
  
+ ErrorF("Setting clock using clock %d, (clock position %d, %s mode)\n",
+        mode->Clock,mode->Clock&0x0f,
+        ((mode->Clock & 0x20)==0) ? "normal" : "interlaced"
+       );
+ if (vga256InfoRec.vendor) {
+   ErrorF("vendor is %s\n",vga256InfoRec.vendor);
+ };
+ if ( ((mode->Clock & 0x0f) == 2) && (vga256InfoRec.vendor) && 
+       (strcmp(vga256InfoRec.vendor,"number9gxe")==0)   
+    ) { /* if this is a number 9 gxe graphics card, we have a programmable
+           clock generator and have to set it if using clock 2.  Clock 0
+           defaults to 25 MHz and clock 1 defaults to 28 MHz so those
+           don't need set.  Do not set clock 3, it is used for memory timing. */
+   long clock_numbers;
+     int setfreq = 0;
+     ErrorF("Number 9 GXE: programming clock generator for clock %d\n",mode->Clock & 0x0f);
+     setfreq = mode->ProgramClockFreq;
+     if (setfreq==0) {
+       ErrorF("Number 9 GXE: Mode %s doesn't have a 'freq' entry.  Using 25 MHz.\n");
+       setfreq = 25000000; /* any monitor should be able to handle 25 MHz. */
+     };
+     if (setfreq<200) { /* correct for laziness */
+       setfreq *= 1000000;
+     } else if (setfreq<200000) {
+       setfreq *= 1000;
+     };
+     if (setfreq <20000000) {
+       ErrorF("Why do you want a %ld Hz clock?  Assuming you want 25 MHz.\n",setfreq);
+       setfreq = 25000000; /* any monitor should be able to handle 25 MHz. */
+     } else if (setfreq>200000000) { /* if greater than 200 MHz */
+       ErrorF("Why do you want a %ld Hz clock?  Assuming you want 25 MHz.\n",setfreq);
+       ErrorF("Extremely high frequencies might blow your monitor.\n");
+       setfreq = 25000000; /* any monitor should be able to handle 25 MHz. */
+     };
+     ErrorF("Number 9 GXE: for desired frequency of %ld Hz\n",setfreq);
+     clock_numbers = n9calc_clock(setfreq,(mode->Clock & 0x0f) );
+     
+     ErrorF("Number 9 GXE: clock_numbers contains the value %ld\n",clock_numbers);
+     ErrorF("Number 9 GXE: actual frequency calculated is %ld Hz\n",n9get_clock(clock_numbers));
+     ErrorF("Number 9 GXE: value returned by n9set_clock is %ld\n",n9set_clock(clock_numbers));
+ };
+     ErrorF("Debugging: After Clock Program code.\n");
  
  outp(0x3d4, 0x42);
  outp(0x3d5, mode->Clock);
***************
*** 430,436 ****
  outp(0x3d4, 0x45);
  outp(0x3d5, 0x00);
  
! if (chip_id == S3_801) {
  
  /* S3 801 specific initialization */
  
--- 491,497 ----
  outp(0x3d4, 0x45);
  outp(0x3d5, 0x00);
  
! if (S3_801_928_SERIES(chip_id)) {
  
  /* S3 801 specific initialization */
  
