How Windows 3.11 Rendered 16-Color VGA Graphics
Microsoft Windows 3.11 handled graphics rendering on standard
16-color VGA displays by combining the high-level Windows Graphics
Device Interface (GDI) with a specialized low-level display driver named
VGA.DRV. Because standard 640x480 VGA mode relied on a
segmented, planar memory architecture, the operating system could not
write pixels linearly. Instead, Windows translated application drawing
requests into hardware-accelerated register operations, bit-plane
manipulations, and pattern dithering to output graphics efficiently
within the constraints of sixteen fixed system colors.
The Display Architecture: VGA Mode 12h
Standard 16-color rendering operated in standard VGA Mode 12h,
providing a resolution of 640x480 pixels. This mode mapped display
memory to segment 0xA0000 in the system’s memory map,
utilizing 256 KB of video RAM arranged into four distinct 64 KB memory
planes: Plane 0 (Blue), Plane 1 (Green), Plane 2 (Red), and Plane 3
(Intensity).
A single pixel's color was not represented by contiguous bytes in a linear frame buffer. Instead, each byte in video memory represented eight horizontal pixels, with each bit corresponding to one pixel. The final 4-bit color index (0 to 15) for a given pixel was derived by stacking the corresponding bits from all four planes simultaneously, which mapped to the standard VGA digital-to-analog converter (DAC) color palette.
The GDI and Driver Pipeline
When a 16-bit Windows application needed to draw to the screen, it
issued device-independent calls to GDI.EXE—such as
LineTo(), Rectangle(), or
BitBlt(). The GDI checked the device context and routed the
requests to VGA.DRV.
Because direct pixel-by-pixel translation through the CPU was
extremely slow on contemporary 386 and 486 systems, VGA.DRV
bypassed individual plane writes by programming the VGA Graphics
Controller registers directly.
Utilizing VGA Hardware Latches and Write Modes
To manipulate all four planes simultaneously during drawing
operations, VGA.DRV relied heavily on the VGA card's
internal hardware latches and specialized write modes:
- Write Mode 0: Used for standard operations where CPU data was rotated, logical operations (AND, OR, XOR) were applied by the VGA's internal Arithmetic Logic Unit (ALU), and the result was written across enabled bit planes using the Bit Mask register.
- Write Mode 1: Allowed high-speed memory-to-memory
block transfers. When the CPU read an address, the VGA loaded 8 pixels
across all four planes into internal 32-bit hardware latches. A
subsequent write copied all four planes simultaneously without
processing the data through the CPU registers, enabling fast window
dragging and scrolling via
BitBlt. - Write Mode 2: Optimized for solid color rendering. The CPU wrote an 8-bit value where the lower 4 bits represented the desired 16-color index. The hardware replicated this color across all four planes, while the Bit Mask register dictated which of the eight horizontal pixels were updated. This mode accelerated font rendering and line drawing.
Color Handling and Dithering
Standard Mode 12h lacked a flexible custom palette within Windows; it was restricted to the 16 predefined system colors (black, white, light/dark gray, and two brightness levels of red, green, blue, cyan, magenta, and yellow).
When applications requested colors outside these sixteen values, Windows 3.11 could not display them natively. For pens and text, the GDI nearest-color matching algorithm selected the closest available solid match. For brush fills and surface backgrounds, the GDI generated an 8x8 pixel dither pattern, alternating pixels of the 16 native colors to visually simulate intermediate hues.
Text and Font Rendering
Fonts in Windows 3.11—both raster (.FON) and TrueType (.TTF)—were rendered into monochrome 1-bit-per-pixel bitmaps before hitting the display memory. The VGA driver then used the VGA hardware's Bit Mask register alongside Write Mode 2 to write text characters in a single CPU cycle per byte row, directly mapping the glyph's foreground and background colors without needing to redraw the entire character cell plane by plane.