8×19 Text Mode Font Origins

I was recently made aware of something that I had noticed before, but never paid much attention to. Consider this screenshot of a BIOS POST screen:

Intel AN430TX board POST screen

VGA text modes usually use 720×400 resolution and 8×16 fonts (expanded to 9×16). The above screenshot uses 640×480 resolution (VGA graphics), but it is with a high degree a certainty a text mode, using a custom 8×19 font. The BIOS is a Phoenix BIOS 4.0 Release 6.0, running on an Intel Anchorage (AN430TX) board.

For the sake of clarity: The screenshot was taken by digitizing the analog VGA output of a physical AN430TX board with an integrated ATI Rage 3D graphics chip. The VGA connector was plugged into a Lantronix Spider KVM, which was used to save the screenshot. It is not a screenshot of an emulated system.

Some of the earliest examples of boards with an 8×19 font were reportedly Intel Anchorage AN430TX (see above) and Intel Atlanta AL430LX (one of the first AGP-capable boards), both released in 1997. These were probably the first boards using Phoenix BIOS after Intel had been using AMI BIOS for several years, a fact which may or may not be relevant.

The OS/2 Museum happens to own both the AL440LX and AN430TX boards. And as the screenshot above indicates, the AN430TX certainly used an 8×19 font, at least in the final (P10) BIOS update. For reference, here’s what the first BIOS setup screen looks like:

Intel AN430TX BIOS setup

The obvious question is, when did this font show up? The P10 BIOS is from September 10, 1998. I have older BIOS versions, the oldest being update P06 from August 26, 1997. Is the 8×19 font there?

Decoding Phoenix BIOS

That seemingly simple question led to a bit of an adventure. There are tools for decoding Phoenix BIOS images (such as phnxdeco). But phnxdeco has no idea what to do with the Intel flash update files, which are split into several chunks. For the AN430TX, which uses a 2Mbit (256KB) flash, there’s a roughly 64K file called .BIO, another called .BI1, .BI2, and a smaller .BI3 file.

Gluing the files together after removing the obvious headers did not produce satisfactory results. Dumping the soldered flash chip is not that easy either.

There is another Phoenix BIOS decoder called phoedeco. This decoder actually understands the Intel flash update files… but I still had no luck.

Reading the Technical Product Specification of the AN430TX board led to a realization that the entire flash is mapped in physical memory just below 4GB. So I wrote a simple utility to dump the last 256KB of physical memory to a file. That turned out to be very useful.

For one thing, the phoedeco utility was actually able to take my own ROM dump apart:

M:\AN430TX\bios>phoedecw AN430TX2.ROM foo
PHOEDECO * V.K. * 1998.04.02..2006.01.13
AN430TX2.ROM
Position packed C unpacked type target filename
-------- -------- -- -------- ------------ -------- -- ------------
000FEF15 0000107A 02 00001860 Display - -> DISPLAY0.dec
000FC44C 00002AAE 02 00005D80 Template - -> TEMPLAT0.dec
000F9227 0000320A 02 00004820 Suspend - -> MISER__0.dec
000F851F 00000CED 02 00007AE2 BIOSCode 000F851E +
000F0000 000013EC 02 +
000D920D 00002DE2 02 -> BIOSCOD0.dec
000F13F5 0000710E 00 0000710E ROMExec 000F1410 => ROMEXEC0.dec
000E453E 00003A61 02 0000893E Setup - -> SETUP__0.edi
000DBFF8 0000852B 02 0000E000 OpROM - -> OPROM__0.rom
000D292A 000068C8 02 00009580 BIOSCode.1 000E7E90 -> BIOSCOD1.dec
000D0046 000028C9 02 0000D700 BIOSCode.2 00070000 +
000C8889 00007728 02 -> BIOSCOD2.dec
-------- -------- -- -------- ------------ -------- -- ------------
000E9000 00001000 -- 00001000 55 AA ROM block 000E9000.rom
000EA000 00002000 -- 00002000 55 AA ROM block 000EA000.rom
000C0000 00007669 02 0000FF46 Strings - -> STRINGS0.str
000FDFF0 00002010 -- 00002010 noncompressed noncomp.rom
000C7684 0002897C -- 0002897C remaining unprocessed remain.rom

More importantly, the dump showed me how the .BIO files actually end up in flash memory. And this allowed me to use phoedeco to decode older flash updates. Notice the values entered for the addresses:

M:\AN430TX\BIOS06>phoedecw P06-0062.BIO foo
PHOEDECO * V.K. * 1998.04.02..2006.01.13
P06-0062.BIO [$C6000] ? $D0000
P06-0062.BI1 [$D6000] ? $C0000
P06-0062.BI2 [$E6000] ? $F0000
P06-0062.BI3 [$F6000] ? $E0000
Position packed C unpacked type target filename
-------- -------- -- -------- ------------ -------- -- ------------
000FE974 0000161B 02 00007CD7 Display - -> DISPLAY0.dec
000FBDBA 00002B9F 02 00006010 Template - -> TEMPLAT0.dec
...

The Intel update files have headers that show the “logical area size” of the combined set. The phoedeco utility tries to align the contents such that the last byte ends up at address 0xFFFFF. But with the AN430TX that does not work, for two reasons.

One reason is that the flash update on this board does not rewrite everything. It leaves in place a boot block, which presumably increases the chances of recovering from a flash update gone bad. It also leaves in place some areas of flash, such as the one which holds the board’s serial number.

The other reason is that adjacent 64K blocks end up being swapped. I have no idea what that’s good for, but they do. This may have something to do with BIOS recovery (which is documented as not working on the AN430TX); a jumper on the board supposedly swaps around flash contents, presumably to map the recovery BIOS to where the standard BIOS would normally be.

Be as it may, mapping the .BIO/.BI1/.BI2/.BI3 files to addresses 0xD0000, 0xC0000, 0xF0000, and 0xE0000 (in that order) allows phoedeco to decode AN430TX BIOS updates.

After decoding the P06 BIOS from August 26, 1997, I was able to locate the 8×19 font in the STRINGS module. But it didn’t look quite the way I expected.

Reduced BIOS Character Set

Presumably in an effort to save a few bytes, the font is encoded in a rather interesting format. The first 128 characters look as one would expect and correspond to code page 437 or 850. The second 128 characters… well, for one thing, there aren’t other 128 characters. There are only about 30-40 or so. And they do not follow any known encoding, although their order appears to follow CP850. How can this possibly work?

That’s easy. Remember, the font is part of the STRINGS module, which contains all user-visible strings in the BIOS, in several languages (English, German, French in case of AN430TX BIOS P06). It appears that whoever produced the strings module (Intel?) collected all the strings, quite possibly coded using CP850, determined which characters in the 128-255 range are actually used, threw out all the unused ones character from the font, and then re-coded the strings to correspond to the new ad-hoc encoding.

For example the German word “ausführen” would normally have the character ü coded as 0x81 (CP850 or CP437). But in this particular instance of an Intel board BIOS, it is coded as 0x80 because the preceding letter (Ç) that normally occupies code point 0x80 was left out.

Since the text strings and the font are stored in the same module and clearly must be used together, this mechanism works reliably.

As a corollary, any strings that contain code points outside the 0-127 range must be displayed using the included 8×19 font in order to be properly legible. But that’s not a problem because the strings are generally used either on the BIOS POST screen or in the BIOS setup, and both of those are under the control of the BIOS.

Intel Boards and 8×19 fonts

For the sake of completeness, I decided to check my AL440LX board as well. The default boot screen revealed nothing:

Intel AL440LX graphical boot logo screen

The BIOS setup, on the other hand, conformed to the expectations. The font used by the setup screen looks exactly like the one on the AN430TX board:

Intel AL440LX BIOS setup

When one skips the graphical logo, it’s not difficult to see why the font looks the same:

Intel AL440LX BIOS POST

The Intel AN430TX and AL440LX boards (both released in 1997) use the same PhoenixBIOS 4.0 Release 6.0, and also use the same font. Not too surprising.

The question is, where did the font come from? Phoenix? Intel? Somewhere else? I started looking at other 1990s Intel boards.

Older Intel Pentium boards from 1994-1996 all appear to have AMI BIOS and do not seem to use the 8×19 font at all. They just use whatever VGA text mode font the display adapter provides. See for example the Atlantis/EV board description here.

The next board I tried was the infamous Cape Cod CC820 from 1999. As on the AL440LX, the default boot screen says very little:

Intel CC820 boot logo

The BIOS setup, on the other hand, is much more revealing. And again, it shows a 640×480 text mode using the 8×19 font. By all appearances it is the exact same font used on the AN430TX and AL440LX:

Intel CC820 BIOS setup

The POST screen is somewhat interesting. No mention of Phoenix, or AMI for that matter. But strings inside the BIOS as well as Intel’s documentation reveal that the CC820 board used AMI BIOS again.

Intel CC820 POST

Which means that Intel used Phoenix and AMI BIOSes with the same font.

Now I needed to focus on older Intel boards, released in the second half of 1996 or late 1997. There was a good chance that the AN430TX was not the oldest board with an 8×19 font.

Unfortunately Intel was extremely prolific at that time, and released a dozen or more boards every year.

Examining available information about the VS440FX board (which came out around May 1996) suggested that it still used regular VGA text modes.

TC430HX and PR440FX

The TC430HX (Tucson) and PR440FX (Providence) boards seemed to be worth checking out.

The TC430HX came out around July 1996, PR440FX in August. And screenshots of the PR440FX looked rather interesting. The boards appear to be using an 8×19 font, but a different font. For one thing, the zero was slashed instead of dotted:

Intel TC430HX (1996) POST

It is undoubtedly an 8×19 font, but a markedly different one. For comparison, this is what the BIOS setup screen looks like on the TC430HX:

Intel TC430HX BIOS setup

Digging through TC430HX BIOS update from September 1996 I was able to establish that yes, an 8×19 font was certainly there, and yes, it was very different from the one used in the 1997 boards. These boards of course used AMI BIOS, so perhaps AMI had an 8×19 font different from Phoenix?

PD440FX

Then I came across the PD440FX (Portland) board. The PD440FX still used the old Pentium Pro 440FX chipset, but it was actually a Slot 1 Pentium II board from April 1997 (same as the AN430TX).

An eBay listing for a PD440FX board showed this rather interesting screenshot:

Intel PD440FX BIOS setup

Compare that with the above screenshot of TC430HX. That certainly looks like the newer 8×19 font, but the screen layout is otherwise extremely similar.. But wait, there’s more:

Intel PD440FX POST

So the PD440FX board uses AMI BIOS, not Phoenix. But it sports the same 8×19 font that the PhoenixBIOS-equipped Intel boards used. Which suggests (though doesn’t prove) that the font came from Intel, and not Phoenix or AMI.

Back to the Future

On the other end of the spectrum, Intel clearly liked that 8×19 font and kept using it for a long time. This is the BIOS setup of a 2012 Intel DX79SR Stormville board:

Intel DX79SR BIOS setup

This is an 800×600 graphics mode–at some point Intel switched from text modes to graphics. But it is undeniably the same font. The DX79SR was one of the last Intel boards that used text-based setup. Notice that this is a BIOS update from 2014, and that the BIOS identifier starts with SIX79 (which should be read as SI-X79, not SIX-79) because it was originally used with the DX79SI (Siler) board, a slightly older but nearly identical predecessor of the Stormville board.

The final Intel board generation before the desktop board group was shut down used GUI-style “Visual BIOS” and the text was quite different. However…

Intel DQ87PG EFI Shell

The above screenshot shows the EFI shell on a 2013 Intel DQ87PG Spring Cave board. That certainly looks like the same font… now part of EFI.

Timeline

With all the above data points in hand, let’s try putting together a rough timeline:

  • Intel boards up to about the first half of 1996 used regular VGA text mode with 8×16 (9×16) fonts (AMI BIOS)
  • Intel boards from circa the second half of 1996 used an 8×19 font with a slashed zero and 640×480 text modes (AMI BIOS)
  • In the first half of 1997, Intel started using a different 8×19 font with a dotted zero (AMI BIOS and Phoenix BIOS)
  • By 1999, Intel was back to AMI BIOS, but still used the same 8×19 font with a dotted zero
  • Intel kept using the same font in their boards until about 2012 or 2013 when Visual BIOS replaced text-based setup
  • The same 8×19 was used in at least some EFI implementations

The 8×19 font (not the actual bitmaps but the 8×19 resolution) eventually made it to the UEFI specification. UEFI 2.1 (2007) added a Human Interface Infrastructure (HII) section and defined 8×19 as the standard “narrow” fixed font size (UEFI 2.1 section 27.2.7, Fonts), with double-wide 16×19 resolution used for CJK glyphs.

The rationale was probably the same that led Intel to using these fonts a decade earlier. 8×19 fonts enable standard 80×25 text using a basic VGA 640×480 resolution. This works well on flat panels which cannot dynamically change resolution like analog monitors.

8×19 fonts were also used on Asian DBCS systems (e.g. DOS/V) a long time ago. The reason was more or less the same in that the systems were forced to run in VGA graphics mode (640×480) in order to render CJK glyphs, and 8×19 fonts were effectively the only option to support standard 80×25 text on these systems.

Open Questions

There were OEM systems that used 8×19 fonts for regular text modes, such as the Cirrus Logic Stingray. I believe this was effectively a failed attempt; although the 8×19 fonts were a great fit for flat panels, there was too much software which assumed standard 8×16 fonts and relied on that to render, say, a “graphical” mouse cursor in text modes.

For that reason, the Intel boards with 8×19 fonts make absolutely no attempt to use these beyond POST. In fact as soon as the system starts POSTing add-on adapters, the BIOS switches to a regular VGA text mode, and also does that before attempting to boot from disk. For systems that use a graphical logo, the system switches to a standard text mode whenever going out of logo mode. When it’s safe to use the graphical logo it’s safe to use 8×19 text, and vice versa.

The obvious remaining question is, who came up with 8×19 fonts for BIOS use? Was it really Intel? Or was it someone else? Note that the Intel boards were used by many OEMs (including but not limited to AST, Dell, Gateway, HP, Micron, Packard Bell) so just because an OEM system uses an 8×19 font doesn’t mean there isn’t Intel behind it.

This entry was posted in BIOS, Computing History, Intel. Bookmark the permalink.

2 Responses to 8×19 Text Mode Font Origins

  1. Vlad Gnatov says:

    It was really a pain to support these non-standard(8×11, 8×19) fonts in a cyrillic display driver.
    Well, it was pretty simple for video mode change – just check BDA.fontheight and load the corresponding font, if it exists, or the closest available. But for character generator functions (int10/11xx), it was PITA. Obviously, there were no standard subfuncs for non-standard fonts. So you have to cycle through int10/111x funcs at startup(*), download font from the chargen memory, cycle through int10/1130/xx subfuncs, and compare returned fonts with downloaded ones.

    *) This takes a long time and with unpleasant side effects of screen flickerings, so it was usually done only once, and the results were used until the video bios checksum changed.

  2. Michal Necasek says:

    Do you remember what systems used such fonts? I don’t think I’ve ever seen it “in the wild” (outside of the BIOS), and I’m pretty sure it was precisely because of the compatibility issues.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.