S3.TXT

The entire S3 family are basically 8514/As with a VGA front-end.
Hardwired Bit-Blt, fill and line drawfunctions. 


  S3  86c911  -  1Mbyte, 1280x1024x16c, 1024x768x256c, 640x480x32kc
  S3  86c911A -  Same as 924??. Corrects a bug in 1280 modes.
  S3  86c924  -  Support for 24-bit modes.
  S3  86c928  -  24bit color, 4MB D/VRAM 
  S3  86c801  -  similar to '928, but limited to 2MB
  S3  86c805  -  same as '801 but for Local Bus
 
  S3  86c964     New VRAM 64bit chip. Max 8MB (1600x1200 32bit)
  S3  86c864     Same as 964 with DRAM.


  The S3 chip only works in AT and better units as it uses full
  16 bit I/O addresses.

  The S3 uses the following I/O addresses:
     42E8h, 4AE8h, 82E8h, 86E8h, 8AE8h, 8EE8h, 92E8h, 96E8h, 9AE8h, 9EE8h

  Please note that this may conflict with Com4 ports at 2E8h-2EFh !!!
  The accelerator part of the S3 is similar to the 8514/A.


3d4h index 0Eh (R/W):
This appears to be the Hardware cursor ForeGround color ??

3d4h index 0Fh (R/W):
This appears to be the Hardware cursor background color ??

3d4h index 30h (R/W): ID register
bit 0-7  Chip ID:
            81h  86c911
            82h  86c911A/924
            90h  86c928 C
            91h  86c928 D
        94h,95h  86c928 E
            A0h  86c801/805 A or B
        A2h-A4h  86c801/805 C
            A5h  86c801/805 D
            B0h  86c928PCI

3d4h index 31h (R/W): Display Start
bit   0  Set before writing bank register???
      3  Set to enable access to video memory above 256k.
    4-5  Bit 16-17 of the Display Start Address.

3d4h index 32h (R/W):

3d4h index 33h (R/W):

3d4h index 34h (R/W): 
bit   0  Set if address is multiplied with 4 (16color modes ?)
      4  Set if 1024 bytes (pixels ?) wide screen

3d4h index 35h (R/W): Bank number
bit 0-3  64k bank number.

3d4h index 36h (R/W):  Configuration Register 1
bit 0-1  (801,805 & 928)  Bus width. 0=32bit EISA ,1=32bit Local Bus,
              2=~bits (8??), 3=16bits ISA.
      5  (911,924) Video memory. 0: 1Mb, 1: 512Kb
    5-6  (801,805 & 928)  Video memory. 0=2Mb, 2=1Mb, 3=512Kb.

Another source gives:
      5  Set if only 512Kb, clear if more (1MB for 911,924)
    6-7  (801,805,928) Video Memory:  0: 4MB, 1: 3MB, 2: 2MB, 3: 1MB

3d4h index 38h (R/W): Extensions Enable
bit 0-7  Writing 48h to this register enables the extended registers,
         writing 0 disables them.

3d4h index 39h (R/W): Extensions Enable 2
bit 0-7  Write A5h to this register to unlock extensions.
         Write 5Ah to disable

3d4h index 3Ah (R/W):
bit   3  Clear to reset dual display ??
      7  (801,805,928) If set MEMCS16 is 16bits, else 8 bits.

3d4h index 3Bh (R/W):

3d4h index 3Ch (R/W):
bit 0-7  Interlace mode frame offset (Typically half the horizontal total).

3d4h index 40h (R/W):
bit   0  If set enables 8514/a mode ??
      3  (801,805 & 928)  If set Fast Write Buffer is ON.
      6  (801,805 & 928)  If set Zero Waitstate is OFF (only valid if EISA
                          bus).

3d4h index 41h (R/W): Memory
bit   4  Set if we have 1MByte, clear if we have 512KBytes.
      6  Dual Display VGA test size. Set for 32K, clear for 64K
         Note: this might be reversed for 80x/928 ????
      7  Set to enable dual display

3d4h index 42h (R/W):
bit  0-1  I/O bits. on #9 cards connected to the ICD2061A clock chip
     0-?  Clock Select bit 0-? (Really same as above, but different clock
          hardware and pins).
       5  If set mode is interlaced.

3d4h index 43h (R/W):
bit   1  This bit is output to the palette chip RS2 pin, which on advanced
         DACs works as a 3rd address bit to the DAC registers at 3C6h-3C9h.
      2  Bit 8 of the Display Offset Register (3d4h index 13h).
      4  If set the '8514' registers use alternate addresses (x148h, x548h,
         x948h and xD48h), if clear standard addresses (x2E8h, x6E8h, xAE8h
         and xEE8h).
      7  If set character clocks are 16 pixels wide rather than 8.

3d4h index 45h (R/W):
bit   0  Set to enable the HardWare Cursor.
      1

3d4h index 46h (R/W):  Cursor X-position high
bit 0-7  Upper 8 bits of the HardWare Cursor X position.
         Lower 8 bits are in index 47h. For 64k modes this value should be
         twice the actual X co-ordinate.

3d4h index 47h (R/W):  Cursor X-position low
bit 0-7  Lower 8 bits of the HardWare Cursor X position.
         Upper bits are in index 46h

3d4h index 48h (R/W):  Cursor Y-position high
bit 0-7  Upper 8 bits of the HardWare Cursor Y position.
         Lower 8 bits are in index 49h

3d4h index 49h (R/W):  Cursor Y-position low
bit 0-7  Lower 8 bits of the HardWare Cursor Y position.
         Upper bits are in index 48h

3d4h index 4Ah (R/W):

3d4h index 4Bh (R/W):

3d4h index 4Ch (R/W):  Cursor Address high
bit 0-7  Upper 8 bits of the address of the HardWare Cursor Map in units of
         1024 bytes (256 bytes for planar modes). Lower bits are in index 4Dh
         The cursor map is a 64x64 bitmap with 2 bits (A and B) per pixel.
         The map is stored as one word (16 bits) of bit A, followed by one
         word with the corresponding 16 B bits.
         The bits are interpreted as:
            A    B    Result
            0    x    These results in a solid color (typically black or
                      white), but the origin of the color is as yet
                      undetermined. Probably connected to index 4Ah and 4Bh.
            1    0    The screen data (transparent cursor)
            1    1    The inverted screen data (XOR cursor)
         For 64k color modes the cursor is stored as one byte (8 bits) of A
         bits, followed by the 8 B-bits, and each bit in the cursor should be
         doubled to provide a consistent cursor image.
         3d4h index Eh and Fh appears to be the cursor fore & background color

3d4h index 4Dh (R/W):  Cursor Address low
bit 0-7  Lower 8 bits of the address of the HardWare Cursor Map.
         Upper bits are in index 4Ch

3d4h index 4Eh (R/W):  Cursor Hot-spot X

3d4h index 4Fh (R/W):  Cursor Hot-spot Y

3d4h index 50h (R/W):                                       (801/5 & 928 only)
bit 6-7  Display width. 0: 1024, 1: 640, 2: 800, 3: 1280

3d4h index 51h (R/W):                                       (801/5 & 928 only)
bit   0  Display start address bit 18. bit 16-17 are in index 31h.
    2-3  Bank register bits 4-5. Bits 0-3 are in 3d4h index 35h.
Note: both index 38h and 39h must be enabled to access this register.

3d4h index 53h (R/W):                                       (801/5 & 928 only)
bit   4  Set to enable memory mapped registers

3d4h index 55h (R/W):
bit 0-1  Passed to the RS2 and RS3 pins on the RAMDAC, allowing access to all
         8/16 registers on advanced RAMDACs.

3d4h index 58h (R/W):  Linear Aperture Options
bit   2

3d4h index 59h (R/W):                                       (801/5 & 928 only)
bit 0-1  Linear Memory Address bit 8-9. Bits 0-7 are in index 5Ah

3d4h index 5Ah (R/W):                                       (801/5 & 928 only)
bit 0-7  Linear Memory Address bit 0-7. Bits 8-9 are in index 59h.
         This is the address the Video Memory is mapped at in 4MB units.

3d4h index 5Eh (R/W):                                       (801/5 & 928 only)
bit   0  Vertical Total bit 10h (3d4h index 6).
      1  Vertical Display End bit 10h (3d4h index 12h).
      2  Vertical Sync Start bit 10h (3d4h index 10h).


  3d4h index 30h-3Ch and 40h-4Fh are used.
  3d4h index 50h-63h are used in the 801/805/928.

  82E8h (16) (R/W): CUR_Y
  86E8h (16) (R/W): CUR_X
  8AE8h (16) (R/W): DIAGY_STEP
  8EE8h (16) (R/W): DIAGX_STEP
  92E8h (16) (R/W): ERR_TERM
  96E8h (16) (R/W): MAJ_AXIS/CURWIDTH
  9AE8h (16) (W): CMD_REG
  9AE8h (16) (R): GP_STAT
  bit    8  Set when data is ready from the co-processor.

  A2E8h (16) (R/W): BKGD_COLOR
  A6E8h (16) (R/W): FRGD_COLOR
  AAE8h (16) (R/W): WRT_MASK
  B2E8h (16) (R/W): COLOR_CMP
  B6E8h (16) (R/W): BKGD_MIX
  BAE8h (16) (R/W): FRGD_MIX
  BEE8h (16) (R/W): MULTIFUNC_CNTL
  E2E8h (16) (R/W): PIX_TRANS


  ID S3 chip:

  wrinx(base,$38,0);    {disable extensions}
  if not testinx2(base,$35,$F) then
  begin
    wrinx(base,$38,$48);
    if testinx2(base,$35,$F) then
    begin
      __S3__
      case rdinx(base,$30) of
       $81:86c911
       $82:86c911A or 86c924
       $90:86c928 C
       $91:86c928 D
   $94,$95:86c928 E
       $A0:86c801/5 A or B
  $A2..$A4:86c801/5 C
       $A5:86c801/5 D
       $B0:86c928 PCI
      end;
    end;
  end;
 

  Video Modes (Diamond Stealth):
       VESA:
  54h        T  132   43   16
  55h        T  132   25   16  
       101h  G  640  480  256  P8
  6Ah  102h  G  800  600   16  PL4
       103h  G  800  600  256  P8
       104h  G 1024  768   16  PL4
       205h  G 1024  768  256  P8
       206h  G 1280  960   16  PL4
       208h  G 1280 1024   16  PL4
       211h  G  640  480  64K  P16     Stealth 24 only
       212h  G  640  480  16M  P24     Stealth 24 only
       301h  G  640  480  32k  P15

----------101DAA-------------------------------
INT 10 - VIDEO - Diamond Stealth - Check for Stealth
        AX = 1DAAh
        BX = FDECh
Return: AL = 01h  For Stealth VRAM
             02h  For Stealth 24
        AH = DACtype:
               00h  Standard VGA DAC
               11h  Highcolor DAC where bit 3 of the command register is
                    not writable.
               23h  SS2410 DAC
               33h  Highcolor DAC without RS2 decoding
               43h  Highcolor DAC with RS2 decoding
        SI:DI -> BIOS version & Copyright string
----------104FFF-----------------------------------
INT 10 - VIDEO - S3                 - SET/RESET DUAL DISPLAY MODE
        AX = 4FFFh
        BX = Dual display mode
              00h  Reset
              01h  Set dual display, 32KB VGA test
              02h  Set dual display, 64KB VGA test
----------107F-------------------------------------
INT 10 - VIDEO - Diamond Stealth/Stealth 24 - SET TEXT MODE
        AH = 7Fh
        BH = 00h  Set Color text mode
             01h  Set Color text mode
             02h  Set Monochrome text mode
Note: Actually only bit 0-1 of BH are tested.
----------107F00-4000------------------------------
INT 10 - VIDEO - S3 80x/928 - GET S3 INFORMATION BLOCK
        AX = 7F00h
        BX = 4000h
Return: AX = 007Fh if supported
        DX:BX -> DAC set mode rutine
Note: Might be implemented in Diamond Stealth 24 with BIOS version > 3.33
----------107F00-4001------------------------------
INT 10 - VIDEO - S3 80x/928 - GET LINEAR ADDRESS
        AX = 7F00h
        BX = 4001h
Return: AX = 007Fh if supported
        CX = current linear address base (high word)
Note: Might be implemented in Diamond Stealth 24 with BIOS version > 3.33
----------107F00-4002------------------------------
INT 10 - VIDEO - S3 80x/928 - SET LINEAR ADDRESS
        AX = 7F00h
        BX = 4002h
        CX = new linear address base (high word)
Return: AX = 007Fh if supported
Note: Might be implemented in Diamond Stealth 24 with BIOS version > 3.33