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.