VGA-compatible text mode

From Wikipedia, the free encyclopedia
Jump to: navigation, search

The implementation of computer monitor text mode on VGA-compatible hardware is quite complex. Its use on PC-compatible computers was widespread in 1980s–1990s (particularly under DOS systems), but persists today for some applications even on modern desktop computers. The main features of VGA text mode are colored (arbitrary 16 color palette) characters and their background, blinking, various shapes of the cursor (block/underline/hidden static/blinking), and loadable fonts (with various glyph sizes). The Linux console traditionally uses hardware VGA-compatible text modes, and the Win32 console environment has an ability to switch the screen to text mode for some text window sizes.

  Distinctive features of VGA text as it commonly used:

  Light gray background (normally not white).

Box drawing.


VGA text sample animation.gif CGA–EGA-style 16 color palette for foreground.
Blinking text.

Data arrangement[edit]

Text buffer[edit]

Each screen character is actually represented by two bytes aligned as a 16-bit word accessible by the CPU in a single operation. The lower, or character, byte is the actual code point for the current character set, and the higher, or attribute, byte is a bit field used to select various video attributes such as color, blinking, character set, and so forth.[1] This byte-pair scheme is among the features that the VGA inherited from the EGA, CGA, and ultimately from the MDA.

Attribute Character
Blink[n 1] Background color Foreground color[n. 2][n. 3] Code point
  1. ^ Depending on the mode setup, attribute bit 7 may be either the blink bit or the fourth background color bit (which allows all 16 colors to be used as background colours).
  2. ^ Attribute bit 3 (foreground intensity) also selects between fonts A and B (see below). Therefore if these fonts are not the same, this bit is simultaneously an additional code point bit.
  3. ^ Attribute bit 0 also enables underline, if certain other attribute bits are set to zero (see below).

Colors are assigned in the same way as in 4-bit indexed color graphic modes (see VGA color palette). VGA modes have no need for the MDA's reverse and bright attributes because foreground and background colors can be set explicitly


The VGA hardware has the ability to enable an underline on any character that has attribute bit 0 set. However since this is an MDA-compatible feature,[2] the attribute bits not used by the MDA must be set to zero or the underline will not be shown.[1] This means that only bits 3 (intensity) and 7 (blink) can be set concurrently with bit 0 (underline). With the default VGA palette, setting bit 0 to enable underline will also change the text colour to blue. This means text in only two colors can be underlined (light blue and dark blue with the default palette).

Despite all this, the underline is not normally visible in color modes, as the location of the underline defaults to a scanline below the character glyph, rendering it invisible.[1] If the underline location is set to a visible scanline (as it is by default when switching to an MDA-compatible monochrome text mode) then the underline will appear.


Norton Utilities 6.01, an example of advanced TUI which redefines the character set to show tiny graphical widgets, icons and an arrow pointer in text mode.
VGA shows us the code page 737 with Greek letters

Screen fonts used in EGA and VGA are monospace raster fonts containing 256 glyphs. All glyphs in a font are the same size, but this size can be changed. Typically glyphs are 8 dots wide and 8-16 dots high, however the height can be any value up to a maximum of 32. Each row of a glyph is coded in an 8 bit byte, with high bits to the left of the glyph and low bits to the right. Along with several hardware-dependent fonts stored in the adapter’s ROM, the text mode offers 8[1] loadable fonts. Two active font pointers (font A and font B) select two of the available fonts, although they usually point to the same font. When they each point to different fonts, attribute bit 3 (see above) acts both as a foreground color bit and as the ninth (28) code point bit, selecting font A when the bit is set.[1] To make a 512 character set mode (instead of the common 256), the available colors should be halved from 16 to 8 by changing the palette, otherwise all the characters in one font will always be displayed as bright colours (intensity on), while none of the characters in the other font will ever be displayed as bright (intensity off).

There are modes with a character box width of 9-dots (e.g. the default 80×25 mode), however the 9th column is used for spacing between characters, so the content cannot be changed. It is always blank, and drawn with the current background colour.[1] An exception to this is in Line Graphics Enable mode, which causes code points 0xC0 to 0xDF inclusive[1] to have the 8th column repeated as the 9th. These code points cover those box drawing characters which must extend all the way to the right side of the glyph box. For this reason, placing letter-like characters in code points 0xC0–0xDF should be avoided. The box drawing characters from 0xB0 to 0xBF are not extended as they do not point to the right and so do not require extending.


Mouse cursor in Impulse Tracker.

The shape of the cursor is restricted to a rectangle the full width of the character box, and filled with the foreground color of the character at the cursor's current location. Its height and position may be arbitrary within a character box;.[3] The EGA allowed a split-box cursor (appearing as two rectangles, one at the top of the character box and one at the bottom), by setting the end of the cursor before the start, however if this is done on the VGA the cursor is completely hidden instead.[3] The VGA standard does not provide a way to alter the blink rate,[3] although common workarounds involve hiding the cursor and using a normal character glyph to provide a so-called software cursor.

A mouse cursor in TUI (when implemented) is not usually the same thing as a hardware cursor, but a moving rectangle with altered background or a special glyph.

Some text-based interfaces, such as that of Impulse Tracker, went to even greater lengths to provide a smoother and more graphic-looking mouse cursor. This was done by constantly re-generating character glyphs in real-time according to the cursor's on-screen position and the underlying characters.[citation needed]

Access methods[edit]

There are generally two ways to access VGA text-mode for an application: through the video BIOS interface or by directly accessing video RAM and I/O ports. The latter method is considerably faster, and allows quick reading of the text buffer, for which reason it is preferred for advanced TUI programs.

The VGA text buffer is located at physical memory address 0xB8000. Since this is usually used by 16-bit x86 processes operating in real-mode, it is the first half of memory segment 0xB800. The text buffer data can be read and written, and bitwise operations can be applied. A part of text buffer memory above the scope of the current mode is accessible, but is not shown.

The same physical addresses are used in protected mode. Applications may either have this part of memory mapped to their address space or access it via the operating system. When an application (on a modern multitasking OS) does not have control over the console, it accesses a part of system RAM instead of the actual text buffer.

For computers in the 1980s, very fast access to the text buffer was extremely useful for a fast UI. Even on relatively modern hardware the overhead of text mode emulation via hardware APA (graphics) modes may be noticeable.

Modes and timings[edit]

Video signal[edit]

From the monitor’s side, there is no difference in input signal in a text mode and an APA mode of the same size. A text mode signal may have the same timings as VESA standard modes. Same registers are used on adapter’s side to set up these parameters in a text mode as in APA modes. Text mode output signal is essentially the same as in graphic modes, but its source is text buffer and character generator, not framebuffer as in APA.

PC common text modes[edit]

Depending on the graphics adapter used, a variety of text modes are available on IBM PC compatible computers. They are listed on the table below:

Text res. Char. size Graphics res. Colors Adapters
80×25 9×14 720×350 B&W Text MDA, Hercules
40×25 8×8 320×200 16 colors CGA, EGA
80×25 8×8 640×200 16 colors CGA, EGA
80×25 8×14 640×350 16 colors EGA
80×43 8×8 640×350 16 colors EGA
80×25 9×16 720×400 16 colors VGA
80×50 9×8 720×400 16 colors VGA
80×60 16 colors VESA-compatible Super VGA
132×25 16 colors VESA-compatible Super VGA
132×43 16 colors VESA-compatible Super VGA
132×50 16 colors VESA-compatible Super VGA
132×60 16 colors VESA-compatible Super VGA

VGA and compatible cards support MDA, CGA and EGA modes. All colored modes have the same design of text attributes. MDA modes have some specific features (see above) – a text could be emphasized with bright, underline, reverse and blinking attributes.

By far the most common text mode used in DOS environments, and initial Windows consoles, is the default 80 columns by 25 rows, or 80×25, with 16 colors. This mode was available on practically all IBM and compatible personal computers.

Two other VGA text modes, 80×43 and 80×50, exist but were very rarely used. The 40 column text modes were never very popular, and were used only for demonstration purposes or with very old hardware.

Character sizes and graphical resolutions for the extended VESA-compatible Super VGA text modes are manufacturer's dependent. Some cards (e.g. S3) supported custom very large text modes, like 100×37 or even 160×120. Like as in graphic modes, graphic adapters of 2000s commonly are capable to set up an arbitrarily-sized text mode (in reasonable limits) instead of choosing its parameters from some list. But poor software support deters widespread use of such custom modes.


On Linux and DOS systems with so named SVGA cards, a program called SVGATextMode[4] is used to set up better looking text modes than EGA and VGA standard ones. This is particularly useful for large (≥ 17") monitors, where normal VGA 400 lines text mode appear as extremely low resolution. SVGATextMode allows setting of the pixel clock and higher refresh rate, larger font size, cursor size, etc., and allows a better use of the potential of a video card and monitor. In non-Windows systems, the use of SVGATextMode (or alternative options such as the Linux framebuffer) to obtain a sharp text is critical for LCD monitors of 1280×1024 (or higher resolution) because none of so named standard text modes fits to this matrix size. SVGATextMode also allows a fine tuning of video signal timings.

Despite the name of this program, only a few of its supported modes conform to SVGA (i.e. VESA) standards.

General restrictions[edit]

Such VGA text modes have some hardware-imposed limitations. Because some of them appear now too restrictive, the hardware text mode on VGA compatible video adapters has only a limited use.

Parameter Original VGA Modern video adapters Remarks
Character cell
(glyph) width
8 or 9 dots[1] ≤ 9 dots Not all hardware support glyphs narrower than 8 dots;

Even width=9 looks ugly on high resolutions, particularly for people with hyperopia, and is insufficient for East Asian scripts. Height=32 is more than sufficient.

Character cell
(glyph) height
≤ 32 dots
Number of character cells At least
(reached at 80×50)
≤ 16,384 = 214
(memory addressing limitations)
A modern adapter, if supports non-standard modes, may produce a reasonably dense text screen even on a large monitor.
Width in character cells
(characters per line)
At least
≤ 256(?)
Height in character cells
(number of lines)
At least
(reached at 80×50)
Code page size
(number of different glyphs displayed simultaneously)
≤ 512 = 29
(if font A ≠ font B)
Even 512 is insufficient for comprehensive Unicode support.
≤ 256 = 28
(if font A = font B)
Number of colors foreground: 16*

background: 8 or 16**

16 of arbitrarily chosen colors, not fixed.

* 8 colors may be used by font A and other 8 colors by font B; so, if font A ≠ font B (512 characters mode), then the palette should be halved and a text may effectively use only 8 colors.
** Normally, first 8 colors of the same palette. If blink is disabled, then all 16 colors are available for background.


  1. ^ a b c d e f g h FreeVGA Project: VGA Text Mode Operation
  2. ^
  3. ^ a b c FreeVGA Project: Manipulating the Text-mode Cursor
  4. ^ SVGATextMode

External links[edit]