How Windows 3.11 Printed Graphics on Dot-Matrix
In Microsoft Windows 3.11, printing graphics to a dot-matrix printer required transforming abstract, vector-based screen drawings into precise mechanical pin strikes. Because PCs of that era had severe memory limitations, Windows could not render an entire high-resolution page in memory at once. Instead, the operating system relied on the Graphics Device Interface (GDI), horizontal memory "banding," vertical bit transposition, and standardized printer control codes to feed graphic data to 9-pin and 24-pin print heads line by line.
When a Windows application printed a graphic, it did not communicate
directly with the printer. Instead, it sent standard drawing calls—such
as lines, polygons, and text primitives—to the GDI device context. The
GDI interacted with a printer driver, either a dedicated monolithic
driver or the Windows Universal Printer Driver (UNIDRV.DLL)
paired with a printer-specific minidriver.
Because a 360 dpi, full-page graphic exceeded the available conventional and extended memory on most Windows 3.11 systems, the GDI utilized a process called banding. The printer driver divided the printable page into several horizontal rectangular sections called bands. The GDI instructed the application to replay its drawing commands for each specific band, rasterizing only that narrow horizontal slice into an in-memory monochrome bitmap.
Once a band was rasterized, the driver faced a mechanical mismatch:
computer memory stores bitmap images in horizontal scan lines (rows),
but dot-matrix print heads fire their pins along a vertical column. To
resolve this, the driver ran an algorithmic transformation known as bit
transposition. It read vertical columns of pixels across the horizontal
scan lines, converting every 8 or 24 vertical pixels into 1 or 3 bytes
of binary data. In this format, each bit represented a physical pin: a
binary 1 instructed a pin to fire, while a binary
0 left it retracted.
The driver packaged this transposed binary data into printer-specific
command sequences, most commonly Epson ESC/P or IBM Proprinter control
codes. A typical command consisted of an escape byte (ESC),
an identifier for the graphics density mode (such as double-density or
quadruple-density graphics), a 2-byte integer specifying the horizontal
column count, and the raw transposed pin-firing bytes.
Finally, the generated command stream was handed to the Windows Print Manager spooler. The Print Manager bypassed the screen display hardware entirely and streamed the raw escape sequences and binary pin masks through the computer's parallel port (LPT1) directly to the printer's onboard buffer. As the dot-matrix carriage swept back and forth across the paper, the printer's internal controller read the incoming bytes and fired the corresponding electromagnetic solenoids, physically pressing the ribbon against the paper to reproduce the Windows graphic.