IBM CGA graphics card
|Architecture||Motorola 6845, ATI CW16800|
|Entry-level||IBM Color Graphics Adapter, ATi Graphics Solution Rev 3, ATi Color Emulation Card, Tseng Labs ColorPAK,|
|Mid-range||ATi Graphics Solution plus, ATi Graphics Solution Plus SP, ATi Graphics Solution SR, Number Nine Graphics System|
|High-end||ATi Small Wonder Graphics Solution, Tseng Labs EVA/480|
|Enthusiast||ATi Small Wonder Graphics Solution with game port|
Professional Graphics Controller
The Color Graphics Adapter (CGA), originally also called the Color/Graphics Adapter or IBM Color/Graphics Monitor Adapter, introduced in 1981, was IBM's first color graphics card for the IBM PC and established a de-facto computer display standard.
The original IBM CGA graphics card was built around the Motorola 6845 display controller, came with 16 kilobytes of video memory built in, and featured several graphics and text modes. The highest display resolution of any mode was 640×200, and the highest color depth supported was 4-bit (16 colors).
The CGA card could be connected either to a direct-drive CRT monitor using a 4-bit digital (TTL) RGBI interface, such as the IBM 5153 color display, or to an NTSC-compatible television or composite video monitor via an RCA connector. The RCA connector provided only baseband video, so to connect the CGA card to a television set without a composite video input required a separate RF modulator.
Although IBM's own color display was not available, customers could either use the composite output (with an RF modulator if needed,) or the direct-drive output with available third-party monitors that supported the RGBI format and scan rate. Some third-party displays lacked the intensity input, reducing the number of available colors to eight, and many also lacked IBM's unique circuitry which rendered the dark-yellow color as brown, so any software which used brown would be displayed incorrectly.
Some software achieved greater color depth by utilizing artifact color when connected to a composite monitor.
IBM intended that CGA be compatible with a home television set. The 40×25 text and 320×200 graphics modes are usable with a television, and the 80×25 text and 640×200 graphics modes are intended for a monitor.
A partial Mandelbrot set rendered in CGA palette 1
Screenshot of Arachne displaying its embedded frames and tables test pages in CGA 640×200 mode
PakuPaku in 160×100 16 color mode
PCPaint in 320×200 3rd palette low intensity, showing a typical low resolution interface. Note the use of dithering to overcome the CGA palette limitations.
SimCity in 640×200 monochrome. Note the use of dithering to simulate gray tones and non-square pixel ratio that deforms the fonts.
CGA uses a 16-color gamut, but not all colors are available at all times, depending on which graphics mode is being used. In the medium- and high-resolution modes, colors are stored at a lower bit depth and selected by fixed palette indexes, not direct selection from the full 16-color palette.
When four bits are used (for low-resolution mode, or for programming color registers) they are arranged according to the RGBI color model:
|Full CGA 16-color palette|
When using a direct-drive monitor, the four color bits are output directly to the DE-9 connector at the back of the card.
Within the monitor, the four signals are interpreted to drive the red, green and blue color guns. With respect to the RGBI color model described above, the monitor would use approximately the following formula to process the digital four-bit color number to analog voltages ranging from 0.0 to 1.0:
red := 2/3×(colorNumber & 4)/4 + 1/3×(colorNumber & 8)/8 green := 2/3×(colorNumber & 2)/2 + 1/3×(colorNumber & 8)/8 blue := 2/3×(colorNumber & 1)/1 + 1/3×(colorNumber & 8)/8
Color 6 is treated differently; when using the formula above, color 6 would become dark yellow, as seen to the left, but in order to achieve a more pleasing brown tone, special circuitry in most RGBI monitors, starting with the IBM 5153 color display, makes an exception for color 6 and changes its hue from dark yellow to brown by halving the analogue green signal's amplitude.
This "RGBI with tweaked brown" palette was retained as the default palette of later PC graphics standards such as EGA and VGA, which can select colors from much larger gamuts, but default to these until reprogrammed.
For the composite output, these four-bit color numbers are encoded by the CGA's onboard hardware into an NTSC-compatible signal fed to the card's RCA output jack. For cost reasons, this is not done using an RGB-to-YIQ converter as called for by the NTSC standard, but by a series of flip-flops and delay lines.
Consequently, the hues seen are lacking in purity; notably, both cyan and yellow have a greenish tint, and color 6 again looks dark yellow instead of brown.
The relative luminances of the colors produced by the composite color-generating circuit differ between CGA revisions: they are identical for colors 1-6 and 9-14 with early CGAs produced until 1983, and are different for later CGAs due to the addition of additional resistors.
As noted however, this method only works on NTSC television sets. PAL TVs do not display the colors as expected when connected to the composite output as PAL's color separation prevents artifacting from occurring.
CGA offers four BIOS text modes (called alphanumeric or A/N modes in IBM's documentation). In these modes, individual pixels on the screen cannot be addressed directly. Instead, the screen is divided into a grid of character cells, each displaying a character defined in one of two bitmap fonts, "normal" and "thin," included in the card's ROM. The fonts are fixed and cannot be modified or selected from software, only by a jumper on the board itself.
Fonts are stored as bitmaps at a color depth of 1-bit, with a "1" representing the character and a "0" representing the background. These colors can be chosen independently, for each character on the screen, from the full 16-color CGA palette. The character set is defined by hardware code page 437.
The font bitmap data is only available to the card itself, it cannot be read by the CPU. In graphics modes, text output by the BIOS operates by copying text from the font ROM bit-by-bit to video memory.
40 columns by 25 rows, with each character a pattern of 8×8 dots. The effective screen resolution in this mode is 320×200 pixels (a pixel aspect ratio of 1:1.2.) The card has sufficient video RAM for eight different text pages in this mode.
BIOS Modes 0 & 1 are both 40 column text modes. The difference between these two modes can only be seen on a composite monitor, where mode 0 disables the color burst, making all text appear in grayscale. Mode 1 enables the color burst, allowing for color. Mode 0 and Mode 1 are functionally identical on RGB monitors and on later adapters that emulate CGA without supporting composite color output.
80 columns by 25 rows, with each character still an 8×8 dot pattern, but displayed at a higher scan rate. The effective screen resolution of this mode is 640×200 pixels. In this mode, the card has enough video RAM for four different text pages.
BIOS Modes 2 & 3 select 80 column text modes. As with the 40-column text modes, Mode 2 disables the color burst in the composite signal and Mode 3 enables it.
Each character cell stored four bits for foreground and background color. However, in the cards default configuration, the fourth bit of the background color does not set intensity, but sets the blink attribute for the cell. All characters on the screen with this bit set will periodically blink, meaning their foreground color will be changed to their background color so the character becomes invisible. All characters blink in unison.
By setting a hardware register, the blink feature can be disabled, restoring access to high-intensity background colors.
All blinking characters on the screen blink in sync. The blinking attribute effect is enabled by default and the high-intensity background effect is disabled; disabling blinking is the only way to freely choose the latter eight-color indexes (8-15) for the background color.
Notably, the GW-BASIC and Microsoft QBASIC programming languages included with MS-DOS supported all the text modes of the CGA with full color control, but did not provide a normal means through the BASIC language to switch the CGA from blink mode to 16-background-color mode. This was still possible however by directly programming the hardware registers using the OUT statement of the BASIC language.
CGA offers graphics modes at three resolutions, 160x100, 320x200 and 640x200. In all modes every pixel on the screen can be set directly, but the color depth for the higher modes does not permit selecting freely from the full 16-color palette.
The low-resolution 160x100 mode is in fact 80x25 character mode. Because the built-in character ROM contains "graphics" elements, such as a character that has a foreground-colored upper half and a background-colored lower half, and because foreground and background colors can be chosen freely in textmode, a low-resolution but full-color graphical display can be achieved.
In the medium-resolution 320x200 mode, each pixel is two bits, which select colors from a four-color palette. In mode 4, there are two palettes, and in mode 5 there is a single palette.
|#||Mode 4||Mode 5|
|Palette 0||Palette 1||low intensity||high intensity|
|low intensity||high intensity||low intensity||high intensity|
|0||0 - background||0 - background||0 - background||0 - background||0 - background||0 - background|
|1||2 -- green||10 -- light green||3 -- cyan||11 -- light cyan||3 -- cyan||11 -- light cyan|
|2||4 -- red||12 -- light red||5 -- magenta||13 -- light magenta||4 -- red||12 -- light red|
|3||6 -- brown||14 -- yellow||7 -- light gray||15 -- white||7 -- light gray||15 -- white|
Several choices can be made by programming hardware registers. First, the selected palette. Second, the intensity - which is defined for the entire screen, not on a per-pixel basis. Third, color 0 (the "background" color) can be set to any of the 16 colors.
The specific BIOS graphics mode influences which palettes are available. BIOS Mode 4 offers two palettes: green/red/brown and cyan/magenta/white.
As with the text modes 0 and 2, Mode 5 disables the color burst to allow colors to appear in grayscale on composite monitor. However, unlike the text modes, this also affects the colors displayed on an RGBI monitor, altering them to the cyan/red/white palette seen above. This palette is not documented by IBM, but was used in some software.
In the high-resolution 640x200 mode, each pixel is one bit, providing two colors which can be chosen from the 16-color palette by programming hardware registers.
In this mode, the video picture is stored as a simple bitmap, with one bit per pixel setting the color to "foreground" or "background." By default the colors are black and bright white, but the foreground color can be changed to any entry in the 16-color CGA palette. The background color cannot be changed from black on an original IBM CGA card. BIOS Mode 6 sets up the 640×200 graphics mode. This mode disables the composite color burst signal by default. The BIOS does not provide an option to turn the color burst on in 640×200 mode, and the user must write directly to the mode control register to enable it.
A number of official and unofficial features exist that can be exploited to achieve special effects.
Some of these above tweaks can be combined. Examples can be found in several games.
Technically, this mode is not a graphics mode, but a tweak of the 80×25 text mode. The character cell height register is changed to display only two lines per character cell instead of the normal eight lines. This quadruples the number of text rows displayed from 25 to 100. These "tightly squeezed" text characters are not full characters. The system only displays their top two lines of pixels (eight each) before moving on to the next row.
|221 with blue text and red background color.|
|221 with red text and blue background color.|
Character 221 of the CGA character set consists of a box occupying the entire left half of the character matrix. (Character 222 consists of a box occupying the entire right half.)
Because each character can be assigned different foreground and background colors, it can be colored (for example) blue on the left (foreground color) and bright red on the right (background color). This can be reversed by swapping the foreground and background colors.
Using either character 221 or 222, each half of each truncated character cell can thus be treated as an individual pixel--making 160 horizontal pixels available per line. Thus, 160×100 pixels at 16 colors, with an aspect ratio of 1:1.2, are possible.
More detail can be achieved in this mode by using other characters, combining ASCII art with the aforesaid technique.
Because the CGA has 16 KiB (16,384 bytes) of graphics memory, not 16,000, it is just as easy to set the number of lines in this mode to 102 instead of 100 for a resolution of 160×102 (16320 pixels). This uses extra video memory that is normally unused. However, most games did not do this, perhaps out of fear it would only work on some monitors but not others- a fear that is not unfounded as it was later found that certain compatibles have cards that either glitch or ignore any attempt to put the device into this mode.
The same text cell height reduction technique can also be used with the 40×25 text mode. This only made sense when using ASCII art, because without it the resulting resolution would only have been 80×100.
Using the composite output instead of an RGBI monitor produced lower-quality video, due to NTSC's inferior separation between luminance and chrominance. This is especially a problem with 80-column text:
For this reason, each of the text and graphics modes has a duplicate mode which disables the composite colorburst, resulting in a black-and-white picture, but also eliminating color bleeding to produce a sharper picture. On RGBI monitors, the two versions of each mode are usually identical, with the exception of the 320×200 graphics mode, where the "monochrome" version produces a third palette.
Programmers discovered that this flaw could be turned into an asset, as distinct patterns of high-resolution dots would turn into consistent areas of solid colors, thus allowing the display of completely new artifact colors. Both the standard 320×200 four-color and the 640×200 color-on-black graphics modes could be used with this technique.
Direct colors are the normal 16 colors as described above under "The CGA color palette".
Artifact colors are seen because the composite monitor's NTSC chroma decoder misinterprets some of the luminance information as color. By carefully placing pixels in appropriate patterns, a programmer can produce specific cross-color artifacts yielding a desired new color; either from purely black-and-white pixels in 640×200 mode, or resulting from a combination of direct and artifact colors in 320×200 mode, as seen in these pictures.
Thus, with the choice between 320×200 vs. 640×200 mode, the choice between the two palettes, and one freely-selectable color (the background in 320×200 modes and the foreground in 640×200 mode), it is possible to use many different sets of artifact colors, making for a total gamut of over 100 colors.
Later demonstrations by enthusiasts have increased the maximum number of colors the CGA can display at the same time to 1024. This technique involves a text mode tweak which quadruples the number of text rows. Certain ASCII characters such as U and !! are then used to produce the necessary patterns, which result in non-dithered images with an effective resolution of 80×100 on a composite monitor.
The 320×200 variant of this technique (see above) is how the standard BIOS-supported graphics mode looks on a composite color monitor. The 640×200 variant, however, requires modifying a bit (color burst disable) directly in the CGA's hardware registers. As a result, it is usually referred to as a separate "mode."
Being completely dependent on the NTSC encoding/decoding process, composite color artifacting is not available on an RGBI monitor, nor is it emulated by EGA, VGA or contemporary graphics adapters.
The modern, games-centric PC emulator DOSBox supports a CGA mode, which can emulate a composite monitor's color artifacting. Both 640×200 composite mode and the more complex 320×200 variant are supported.
Composite artifacting, whether used intentionally or as an unwanted artifact, reduces the effective horizontal resolution to a maximum of 160 pixels, more for black-on-white or white-on-black text, without changing the vertical resolution. The resulting composite video display with "artifacted" colors is sometimes described as a 160×200/16-color "mode", though technically it was a technique using a standard mode.
The low resolution of this composite color artifacting method led to it being used almost exclusively in games. Many high-profile titles offered graphics optimized for composite color monitors. Ultima II, the first game in the game series to be ported to IBM PC, used CGA composite graphics. King's Quest I also offered 16-color graphics on the PC, PCjr and Tandy 1000, but provided a 'RGB mode' at the title screen which would utilize only the ordinary CGA graphics mode, limited to 4 colors. In this mode, dithering was employed to simulate extra colors.
By taking advantage of the artifact colors, the NTSC color clock, and a method similar to that used in the 16-color 160×100 pseudo-graphics mode, it's possible to display over 16 colors in composite monitors.
160 cycles of the NTSC color clock occur during each line's output, so in 40 column mode each pixel occupies half a cycle and in 80 column mode each pixel uses a quarter of a cycle. Limiting the character display to the upper one or two scanlines, and taking advantage of the pixel arrangement in certain characters of the codepage 437, it is possible to display up to 1024 colors. This technique was used in the demo 8088 MPH.
Video timing on the CGA is provided by the Motorola 6845 video controller. This integrated circuit was originally designed only for character-based alphanumeric (text) displays and can address a maximum of 128 character rows.
To realize graphics modes with 200 scanlines on the CGA, the MC6845 is programmed with 100 character rows per picture and two scanlines per character row. Because the video memory address output by the MC6845 is identical for each scanline within a character row, the CGA must use the MC6845's "row address" output (i.e. the scanline within the character row) as an additional address bit to fetch raster data from video memory.
This implies that unless the size of a single scanline's raster data is a power of two, raster data cannot be laid out continuously in video memory. Instead, graphics modes on the CGA store the even-numbered scanlines contiguously in memory, followed by a second block of odd-numbered scanlines starting at video memory position 8,192. This arrangement results in additional overhead in graphics modes for software that manipulates video memory.
Even though the MC6845 video controller can provide the timing for interlaced video, the CGA's circuitry aligns the synchronization signals in such a way that scanning is always progressive. Consequently, it is impossible to double the vertical resolution to 400 scanlines using a standard 15 kHz monitor.
The higher bandwidth used by 80-column text mode results in random short horizontal lines appearing onscreen (known as "snow") if a program writes directly to video memory during screen drawing. The BIOS avoids the problem by only accessing the memory during horizontal retrace, or by temporarily turning off the output during scrolling. While this causes the display to flicker, IBM decided that doing so was better than snow. The "snow" problem does not occur on any other video adapter, or on most CGA clones.
In the 80-column text mode, the pixel clock frequency is doubled, and all synchronization signals are output for twice the number of clock cycles in order to last for their proper duration. The composite output's color burst signal circuit is an exception: because it still outputs the same number of cycles, now at the doubled clock rate, the color burst signal produced is too short for most monitors, yielding no or unstable color. Hence, IBM documentation lists the 80-column text mode as a "feature" only for RGBI and black-and-white composite monitors. Stable color can still be achieved by setting the border color to brown, which happens to produce a phase identical to the correct color burst signal and serves as a substitute for it.
The CGA was released alongside the IBM MDA, and in fact could be installed alongside the MDA in the same computer. A command included with PC-DOS permitted switching the display output between the CGA and MDA cards.. Some programs like the early MS-DOS versions of AutoCAD supported using both display concurrently.
CGA was widely supported in PC software up until the 1990s. Some of the software that supported the board was:
BYTE in January 1982 described the output from CGA as "very good--slightly better than color graphics on existing microcomputers".PC Magazine disagreed, reporting in June 1983 that "the IBM monochrome display is absolutely beautiful for text and wonderfully easy on the eyes, but is limited to simple character graphics. Text quality on displays connected to the color/graphics adapter ... is at best of medium quality and is conducive to eyestrain over the long haul".
In a retrospective commentary, Next Generation also took a negative view on the CGA, stating, "Even for the time (early 1980s), these graphics were terrible, paling in comparison to other color machines available on the market."
CGA had several competitors:
The CGA card was succeeded in the consumer space by IBM's Enhanced Graphics Adapter (EGA) card, which supports most of CGA's modes and adds an additional resolution (640×350) as well as a software-selectable palette of 16 colors out of 64 in both text and graphics modes.
The Color Graphics Adapter uses a standard DE-9 connector for direct-drive video (to an RGBI monitor). The connector on the card is female and the one on the monitor cable is male.
|Resolution||640h × 200v, 320h × 200v|
|H-freq||15699.8 Hz (14.318181 MHz/8/114)|
|V-freq||59.923 Hz (H-freq/262)|
... CGA palette, as rendered by an early ('old-style') card's composite output
A basic problem arises when the luma signal ... contains frequency components that fall within the chroma band.
The sharp transitions from black to white ... contain frequency components ..., and those in the chroma band create cross chrominance.