Raster CRT Typography (According to DEC)

A closer look at the glyphs drawn by the DEC terminals VT100 and VT220.

Recently, I engaged in a bit of analog media emulation, namely for the purpose of the reenactment of raster CRT graphics as seen on “glass terminals” like the iconic VT-series by the Digital Equipment Corporation (DEC). An endeavor, which raises a few questions, like, is there anything special to the media, what did the fonts really look like, and can we reconstruct them from specifications?

VT100 Series CRT Typography
(Not a DEC manual.)

Thanks to a tiny wealth of technical information available on the web, at sites like vt100.net and bitsavers.org, determining the look of these fonts should be easy. E.g., we may reconstruct the glyphs from the terminals’ ROMs. This way, we should be able to determine their exact forms. There are even TrueType-fonts available, meant to recreate the typography of the VT220, “Glass TTY VT220,” including scanlines, and “DEC Terminal Modern” with modernized, smooth outlines:

VT220 TrueType fonts
Modern TrueType fonts recreating the glyphs of the VT220.
Mind that the VT-terminals supported two resolution modes, one at 132 characters per line and one at 80 characters (char-matrix 9×10 and 10×10, respectively), the latter introducing an extra spacing of one pixel.

Having a closer look at the two fonts, there are some notable differences (the differences in spacing may be explained by the two characters per line modes of the VT-terminals), however, neither looks right. Comparing them to photos of the similar VT100, there are discernible differences, not only in the font weight, but also in the size and form of the conters and the overal “feel” of the font. However, the apparent confusion about the weight of the font isn’t especially helped by photos of the real thing either, as the impression conveyed by them differs widely by lens, exposure and camera settings used:

VT100 displaying Adventure / Colossal Cave.
VT100 displaying Adventure / Colossal CavePhoto: Wikipedia, Dave Fischer, 2008, Wikimedia Commons (edited, N.L.).
VT100 displaying a directory listing.
VT100 displaying a directory listingPhoto: Jason Scott, 2013, Creative Commons (edited, N.L.).

Since photos aren’t much of a help here either, it may be time for a look at the…

ROMs

Since ROMs are available, we may start there, since they are the closest, we may get, to the real thing, aren’t they? What could possibly go wrong?

VT100 and VT220 separated characters as in ROM

Separated ROM readings of the VT100 (left) and the VT220 (right).
VT220 separation by Paul Flo Williams, vt100.net (2008). VT100 complemented by me, N.L.

Character definitions differ for “a”, “c”, “g”, “2”, “6”, “7”, “9”, “@”, “%”, “{”, “}”, “|”, “°” and in the forms of the control characters (␉ ␍ ␊ ␤ ␋). Moreover, there are additional characters on the VT220.

Now, this doesn’t look right either. Obviously, the glyphs will be rendered stretched vertically to about double height, but there’s more going on here. The characters just don’t look right. P.e., have a closer look at “p” and “q” or the offset in the dots of the downward right stroke of “k”, not to speak of the funny digits “6” and “9” of the VT100 or the distorted “2”! Moreover, at a closer look, the character matrix is just 8×10, while we expected at least 9×10 (and 10×10 for 80-cols mode) — as described in the specifications. Clearly, this is not what is displayed on the screen.

Phosphor

Let’s have another look at the manuals, specifically at the “VT100 Series Technical Manual(2nd edition, EK-VT100-TM-002; DEC, Maynard, Massachsetts, Aug. 1979). As we learn there, it’s all about phosphor latency:

VT100 and VT220 phosphor latency

Pulse widths and phosphor activation flanks for the VT100 and VT200.
(VT100 Series Technical Manual, EK-VT100-TM-002, p. 4-78)

Mind that the flanks of the signal pulses are highly idealized and will be also sloped in analog real life.

The time it takes for the phosphor to become fully activated is actually longer than the pulse representing the timing to draw a single pixel (40 nanoseconds). Meaning, if we were to attempt to display just a single pixel, the phosphor on this particular spot will never reach its full activation level resulting in a fuzzy image of varying brightnesses between dimmer, thin strokes and heavier, thick strokes. So the typography has to adjust for this, by streching the pulses to double width (80 ns), at least, in order to provide an even image and legible text and to work around the shallow flanks of the screen intensification.

VT100 and VT220 monitor response
Single and double pixel-widths, pulse timing and phosphor activation.
(As above, re-edited N.L.)

Dot Stretching Circuitry

To provide for this, the VT-terminals employ a special technique, called dot stretching: The individual rows of a character matrix as in ROM are modified on-the-fly by prolonging any pulses for an active pixel for yet another pixel. Where there’s a single pixel in ROM, there will be two on the screen, where there are two in a row, there will be three displayed. (This is equivalent to OR-ing a word with itself by an offset of one pixel or bit to the right.)

By this, our 8×10 matrix extends to the expected 9×10 (or 10×10 for the 80-columns mode, where the last pixel, which is set only for the line-drawing characters, will be stretched for yet another pulse.)

VT100 and VT220 dot streching
Dot streching on the VT100 and VT200.
(VT100 Series Technical Manual, EK-VT100-TM-002, p. 4-78)

However, this will provide different results for normal character size and double-width characters! Thanks to the wonders of dot stretching, there are two distinct fonts in one, each of them specially suited for the display size by the amount of detail exhibited!

VT100 and VT220 dot streching

1) as in ROM
2) single width with dot stretching
3) double width with dot stretching
4) single width with dot stretching and latency (flanks)
5) double width with dot stretching and latency (flanks)

(1, 2 & 3 by Paul Flo Williams, vt100.net, 4 & 5 added by me, N.L.)

It’s crucially the image given in (2), representing dot streching, which provides the blocky, rather bold strokes found in modern representation of the font. However, if we add the sine- and cosine-like ramps of the flanks of the rising and dropping phosphor activation (compare 4 & 5 and the timing diagram above), we arrive at a closer rendition of the screen image (mind that the VT100 and VT220 are said to expose quite discernible scanlines).

VT100 and VT220 screen rendering

VT220 character samples (80-columns mode).
1) as in ROM
2) normal size with dot stretching
3) rising and dropping phosphor flanks applied
4) phosphor bleed added

Mind, how the conters “open up” in 4 and 5.

(1 & 2 by Paul Flo Williams, vt100.net, 3 & 4 and negative image added by me, N.L.)

As we may say, a rather extreme example of the media instructing typographical forms, or, vice versa, the glyph design working by the media and its specific technological constraints to arrive at the desired typography. Having a look at the effects of phosphor activation, latency and bleed, we may also understand, why individual photos of VT-terminal screens show varying font widths, according to the eposure in respect to the brightness of the monitor, while an overall smoothness of the font is still preserved.

And here is another representation of the ROM-separations (compare the image above) with effects applied, providing a closer impression of the screen rendition:

VT100 and VT220 glyphs
Apparent glyphs: VT100 (left) and VT220 (right).

The double-width screen characters of the VT100 as compared to their normal, single-width appearance (black on white and as perceived on a screen):

VT100 double width and single width glyphs
VT100 double width and single width characters.

Workbench Images

And here are, finally, two images ”from the workbench”, showing my own attempts to recreate the screen experience in a web browser (HTML5, canvas API). Yea, there may be a bit too much retro-blur, however, you get the idea:

VT100 screen emulation
VT100 emulation (screenshot).
VT220 screen emulation
VT220 emulation (screenshot).

And that’s all for this episode…