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?
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 (GitHub),” including scanlines, and “DEC Terminal Modern” with modernized, smooth outlines:
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:
Since photos aren’t much of a help here either, it may be time for a look at the…
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?
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.
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:
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.
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.)
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!
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).
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 weights, according to the exposure 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:
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):
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:
And that’s all for this episode…
Discuss/comment on Hacker News (oops, front page).