Xtended Mode - Unchained 640x400x256 

-----------------------------------------------------------------------------
  Introduction
-----------------------------------------------------------------------------

  In a previous article, Mark Feldman christened this mode as "Xtended", so 
that's the name I'll stick with throughout this article. The mode works on 
most SVGA cards (though apparently not all); if anyone can add to the 
information presented here, I would be glad to hear from them.

  Xtended mode is a variation on 640x400x256 and will only work on SVGA's 
which support such a mode. Its main advantage is that once it is set up, it 
requires no SVGA bank switching to access the display memory, and, like 
ModeX, area fills and screen-to-screen copies can be much faster.

-----------------------------------------------------------------------------
  Setting Xtended Mode
-----------------------------------------------------------------------------

  Unfortunately, SVGA cards being what they are, there is some variation in 
the method used to set Xtended mode on different cards. The cards seem to 
fall into two distinct categories. Once the normal 640x400x256 is set, the 
first category requires only that the Chain4 feature is turned off. Cards in 
the second category require the 640x400x256 mode set, Chain4 off, and further
adjustment of two "clocking" registers. 

The assembly code required for each is shown below.

category 1:

    mov dx, SEQ_INDEX                   ; sequencer register (3C4h)
    mov ax, 00604h                      ; output value 06h to index 04h
    out dx, ax                          ; set Chain4 off


category 2:

    mov dx, SEQ_INDEX                   ; sequencer register (3C4h)
    mov ax, 00604h                      ; output value 06h to index 04h
    out dx, ax                          ; set Chain4 off (bit 3)
    mov dx, CRTC_INDEX                  ; CRT controller register (3D4h)
    mov ax, 0E317h                      ; output value 0E3h to index 17h
    out dx, ax                          ; disable word clocking
    mov ax, 00014h                      ; output value 00h to index 14h
    out dx, ax                          ; disable doubleword clocking

The categories for each of the cards I have tested are listed below, with 
the mode number required to set the normal 640x400x256 shown in brackets:

AHEAD-B   - couldn't get it to work at all    (   )

ATI       - category 1                        (61h)

ET3000    - couldn't get it to work at all    (   )

ET4000    - category 1                        (2Fh)

OAK       - couldn't get it to work at all    (   )

PARADISE  - category 2                        (5Eh)

TRIDENT   - category 2                        (5Ch)

VIDEO7    - category 1                        (66h)

Alternatively the mode can be set with the VESA Set SuperVGA Mode BIOS
call, the VESA SVGA mode number is 100h. Refer to the file "VESASP12.TXT"
for more information on VESA BIOS calls. If this method is used, however,
the actual SVGA chip must still be detected in order to be able to determine 
which method of changing to Xtended mode should be used.

Mode set code is listed below, using Trident as an example. Remove the 
appropriate lines as indicated to change to the category 1 code.

void InitXtended(void)
{
                                      
/* Trident 640x400x256 modeset, using  video BIOS services */
_AX = 0x005C;          
geninterrupt(0x10);    

/* disable Chain4 mode (bit 3, index 04h, port 3C4h) */
outport(0x3C4, 0x0604);

/* *** omit below this point for category 1 cards *** */

/* disable word mode clocking, by setting the Mode Control register */
/*  of the CRT Controller (index 17h, port 3D4h) */
outport(0x3D4, 0xE317);

/* disable doubleword clocking mode, by setting the Underline Location */
/*  register of the CTR controller (index 14h, port 3D4h) */
outport(0x3D4, 0x0014);
}

-----------------------------------------------------------------------------
  Drawing a Pixel
-----------------------------------------------------------------------------

Once the mode has been properly set up, drawing a pixel in Xtended mode is 
almost identical to drawing one in unchained mode 13h or ModeX. The only real 
difference is the screen resolution, which is now twice the size in both 
directions. As a result, Xtended mode has 4 times as many pixels than 320x200, 
using almost all of the 256k that can be addressed this way, so there is only 
one page in Xtended mode.

The following example code shows how to write a single pixel in Xtended mode.
All the Modex tricks, such as dividing the page into its four planes before 
writing to the screen, will work exactly the same in Xtended mode

void XtendedPutPixel (int xcoord, int ycoord, int colour)
{
char far *screen;

/* set map mask register (index 02h, port 3C4h) to required plane */
/*  calculate plane by mod-ing x coordinate by 4 */
outport(0x3C4, (0x0100 << (xcoord % 4)) + 0x0002);

/* calculate address (y * 160 + x div 4) and write pixel */
screen = MK_FP(0xA000, ycoord * 160 + xcoord / 4);
*screen = colour;
}

-----------------------------------------------------------------------------
  Conclusion
-----------------------------------------------------------------------------

  Because of the complications involved in setting up the mode, and the fact
that several brands of SVGA do not appear to support the mode at all,
Xtended mode has limited appeal. I made use of it in a product where graphics
"text" was scrolled up the screen, since it made the scrolling process almost 
twice as fast. However, I also included normal VESA support, which was 
slower but covered more cards. This is how I would recommend use of Xtended 
mode; as a performance enhancer in situations where ModeX-type operations
are useful.