The VT320 has a number of built-in character sets, covering ASCII, the DEC Multinational Character Set (MCS), Latin 1, Special Graphics and national character sets. All shapes for these characters come from two built-in glyph tables. I'm using the word “glyph” here to simply refer to a character shape, without any consideration of what a particular shape is supposed to represent.
These pictures show the glyphs that the terminal uses in 80-column mode. Each character is 15 (horizontal) × 12 (vertical) pixels, but the pixel aspect ratio of about 4:11 stretches them vertically.
These pictures were produced by expanding the compressed representations that appear in the ROM of a VT320 with firmware revision 1.1.
This table covers:
One oddity from this table is that the glyph for SPACE, ASCII 0x20, is a reversed question mark instead of a blank rectangle. This is because SPACE gets treated as a control character by the terminal and really gets mapped to glyph zero for output.
This table covers:
The two glyphs at 0x83 and 0x84 don’t appear as part of any character set. They are only used when the terminal goes into screen saver mode, at which time they appear alternately at the bottom right of the terminal screen, to give the impression of a rectangle with a flashing block in the centre.
I’m not quite sure why the VT320 is restricted to only one downloadable font, given that there is apparently nearly half a glyph table of free space. There may be restrictions on available RAM, because these glyph definitions are uncompressed out of ROM into RAM when the terminal starts up.
Some glyph definitions changed between version 1.1 and version 1.2 of the firmware. They are all in glyph table 1, shown here:
Two similar but subtly different compression schemes are used to store the glyph data in the ROM. The glyphs are uncompressed into RAM fully in both cases.
Glyph Table 1 is stored as a single byte that contains the start and end row of the glyph data, followed by a set of 20 bits that contains the 80-character representation (12 bits) followed by the 132-character screen representation (8 bits). There are always an even number of rows stored for each character, so the row count for the next glyph starts on a byte boundary.
Because only 12 of the 15 possible bits are stored for the 80-column representation, the two left-most bits and the right-most bit are always off.
This table is stored in the ROM from 0x86bc to 0x9ba1 (for both ROM versions).
Glyph Table 2 contains line-drawing characters which must extend the whole width of a character, so this table is less compressed. Each glyph still starts with a row count byte, but then the next three bytes are used to store 15 bits for 80-column mode, followed by 9 bits for 132-column mode.
This table is stored in the ROM from 0x1c27 to 0x1f95.