About the PS/2 30-286's Hidden VGA Fonts

Certain machines in IBM's illustrious PS/2 family have a curious oddity, which had me perplexed for a while: a mysterious set of extra VGA fonts in the system ROM.  Standard issue is one font for each BIOS-supported size (8, 14, and 16 pixels tall); but here, the Men in Blue saw fit to secrete four additional 16-pixel fonts in leftover firmware space... plus one more copy of the standard font, for some reason.  You can find these in the Oldschool PC Font Pack, or as raw bitmap versions in my text-mode pile.

The systems in question are the 16-bit ISA-based models: the 30-286, 25-286, 25 SX, 35 and 40.  The original 30 and 25 (using the XT bus and MCGA video) don't have the extra fonts, and neither do any of the Micro Channel machines.  Others had pointed them out, but available IBM documentation and software didn't acknowledge their existence, and my exploration of the BIOS code turned up zero data references to the fonts' locations.  So what in the world were they doing there, and did they have any use whatsoever?

Now we know, thanks to Tomáš "Major Tom" Slavotínek of Ardent Tool of Capitalism, who poked around some more and came up with the answer.  As it turns out, I was missing a vital piece of the puzzle: a couple of utilities on the Model 30-286 Starter Disk, which let you select and use the alternate fonts - but only with the original ("rev. 0") BIOS

The PS/2 Model 30-286's font selection program

The PS/2 Model 30-286's font selection program, with 'Sanserif' active

This will also work on the 25-286, since its rev. 0 BIOS is identical to the 30-286's.  But for both machines, the later rev. 2 BIOS moves the fonts around a bit, and they end up at a different ROM address.  The font manager relies on hardcoded memory locations, so using it with the later BIOS will completely garble your text.

The available copy of the 25-286 Starter Disk doesn't include the font management software: it was released after the rev. 2 BIOS, and instead of patching the utilities, IBM just left them off.  Maybe an earlier version does have them.  The later ISA-16 models (25 SX, 35, 40) relocated the fonts yet again, and apparently never had their own versions of these programs at any point.

There's now a very comprehensive video on the IBM Museum channel showing it all in action - you get to see how it works on the proper hardware and firmware... and how it goes all screwy with the later BIOS. 

For the lowdown on using the font manager, see README.TXT on the 30-286 Starter Disk; but for completeness' sake here are Tom's findings in detail:

All 5 fonts are 8x16 points, 4 KB in size, and are located at the following offsets: E000:8F00h, 9F00h, AF00h, BF00h, CF00h. But this is true only for the original BIOS release - rev. 0 (dated 25 Aug 1988). The offsets are different in the other known build - rev. 2 (dated 28 Jun 1989), but more on that later. Now, VileR is right that the BIOS doesn't reference these additional font sets anywhere (at least not in rev. 0). But the comment about software availability isn't quite correct. If you check the 30-286 starter diskette, you will find two curious files - FONTSEL.COM and FONTMGR.SYS. There is also a README file (attached) that explains how to use them. But as expected, it doesn't talk about the inner workings. So, here we go... FONTMGR.SYS is a simple "driver" that when loaded, builds a modified Video Parameter Table and points the VPD address in BDA to this structure. But on its own, the driver doesn't give you an option to actually switch to the other alternative fonts. It contains just one hardcoded font address - E000:9F00h by default - pointing to the 2nd alt. font. The switching is done from the FONTSEL.COM utility that lets you select one of the five fonts using a simple dialog box. The binary contains all 5 font offsets, selects the appropriate one, and then writes the new value to the FONTMGR.SYS driver binary. A rather unusual approach to say at least... @VileR: The utility also reveals the names of the four fonts. Here is how the names map to the individual fonts/offsets for the rev. 0 image: 8F00h - "Standard" 9F00h - "Elite" (marked as "IBM Model3x Alt1" on the website) AF00h - "Oak8" ("Alt2") BF00h - "Oak9" ("Alt3") CF00h - "Sanserif" ("Alt4") Both the utility and the driver require DOS 3.30, and both check for machine model FCh and submodel 09 - values shared by the Model 30-286 and 25-286. Both components were programmed by Alan E. Beelitz and built on 08 Jul 1988 (according to the strings in the binaries). The files are missing from the 25-286 starter disk. Or at least from the available version (v1.0 dated 28 Mar 1990). It's possible that they removed them because of the issue I describe below. As I mentioned before, the font offsets are different for the rev. 2 ROM (dated 28 Jun 1989). I think this is a bug. There was probably a filler/padding of a fixed length between the previous BIOS block and the font block. Why? To put the fonts at some nice round address (8F00h) and to reserve some space between the two blocks for future updates. That way the BIOS code can grow (like it did in rev. 2), and the fonts can stay in the same place. But this only works if you recalculate the filler length before assembling the image! Something that probably didn't happen here and caused the font data to move by +133h = 307 bytes. This could be easily fixed, but eh, it's probably not worth it. Though I have to admit that I don't have the rev. 2 image fully reversed, so it's possible that there's a table of offsets somewhere in the ROM... but I think it's rather unlikely. It would also require an updated font switcher, which is something I don't see on the 25-286, 25 SX, or 35/40 starter disks - but again, I didn't analyze every single binary. The fonts are shifted even further in the Model 35/40 and 25 SX firmware builds. It was likely used very rarely and probably forgotten about by then - even by the devs.

Fonts, Finesse and Future-Proofing

It's anyone's guess why they bothered to duplicate the default VGA font, which already exists elsewhere in the segment (offset 60B4h in the "rev. 0" ROM).  Using the redundant copy has a side effect: with the original font, VGA provides certain characters ('0', 'M', 'T' etc.) in alternate "wide" forms, for better spacing in 9x16-dot text modes.  When you load FONTMGR and select 'Standard', you get the same font, except that this little nicety is gone; so in a way it's like doing nothing - only worse.

You may also wonder how come IBM expended 20 KB of ROM space in segment E000 on fonts, but couldn't spare a few more bytes for a pointer table to tell you where they are... and maybe a wee bit more for a simple INT 10 interface to save you the trouble.  It makes even less sense when you look at all the unused space in that segment, which pretty much includes just ROM BASIC otherwise.

IBM was always fond of reminding PC developers that "well-behaved" software should never directly address absolute locations in ROM, for reasons of future-proofing and compatibility.  Ironically, this case is a pretty convincing demonstration... which does little to counter the old saying about cobbler's children and shoes.  Hear that, all you coders back in time there in the 1980s?

But let's be fair: this whole thing was most likely an afterthought.  IBM was known to lavish much time and effort on its on-screen typography on occasion, but this clearly wasn't the case here - these fonts aren't exactly paragons of bitmap type design.  Okay, "Sanserif" is actually decent enough, which may be why it's the first option in FONTSEL (in the ROM itself, it comes last).  Overall though, the impression is that they just wanted something to throw into that leftover space on the chip.

A Few Examples

Can the driver and the fonts do anything particularly interesting, then?  For the most part, no: there aren't any special features that couldn't be provided by a software-only solution, which would run on every VGA-equipped system at the cost of ~4KB RAM (admittedly, in DOS that's not always a paltry amount).  But if you look hard enough, they did make an effort to include a perk or two that many font-switching tools don't bother with.

For one, the selected fonts still apply to 40-column text modes, even though FONTSEL.COM insists on being run in 80 columns.  The default font isn't a good match for 40-col modes, where the horizontal stretching makes it hard on the eyes; the alternative fonts have thin 1-dot strokes - a better idea when the width is doubled.  With something like "Sanserif", 40-column text is quite a bit more legible:

40-column text (default VGA font) 40-column text ('Sanserif' font)

40-column text using [1] the default VGA font, vs. [2] the "Sanserif" font (from Deep II: The Center of the Earth)

Then again, if you're intent on making 40-column text less of an eyesore, you have these small utilities which aren't machine-specific.  TSR programs created with Fontraption can also affect 40-column modes if you want them to.

Something else I didn't quite expect: the fonts you set with FONTMGR/FONTSEL persist in graphics modes too, as long as the BIOS is used to draw 8x16 text.  On this machine that's pretty much just the 640x480 modes, at least in practice.  Some games and programs do use the system font at this resolution, so these utilities can induce them to change their appearance.  A very marginal use-case, to be sure, but I guess it's a somewhat unique feature.

VGAWHEEL (using the

VGAWHEEL (using the "Sanserif" font)

VGA Trek (using the

VGA Trek (using the "Elite" font)

VGA Tanks (using the

VGA Tanks (using the "Oak8" font)

VGA Roulette 2.0 (using the

VGA Roulette 2.0 (using the "Oak9" font)

[Aside: yes, all these games have "VGA" in their titles.  This was a common tactic for shareware/freeware authors to make their games look appealing on BBS lists, back when "VGA" signified superior graphics; what you usually got was very bare-bones visuals, but in 640x480! (add exclamation marks to your liking).  This minimalism often meant that they didn't bring their own fonts either, and simply relied on the defaults.  That's why I looked for "VGA*" titles to exhibit this behavior, and I wasn't disappointed.]

To wrap it up, here are the complete charsets for the four alternate fonts, showing all supported resolutions.  Feel free to make your own aesthetic judgments about them.  There are a few things you can notice here - for instance, the names led me to assume that "Oak8" and "Oak9" were meant as two versions of the same typeface: one for 8x16-dot character cells (e.g. in graphics modes), and one for 9x16 (VGA text modes).  To go by how they look in both sizes, I'd say that's really the case... but as Tomáš pointed out, there are other inconsis­tencies between them, like the dotted vs. slashed zero.  If you look closely, some characters even seem to have trouble sticking to the baseline ('É/æ' in Oak9).

The alternate fonts on the PS/2 Model 30-286 in all resolutions

The alternate fonts on the PS/2 Model 30-286 in all resolutions

That's about it.  Granted, this was probably way more analysis than the whole business really warrants, but I can't leave a good historical curiosity well enough alone... even if it's still going to be ugly in the morning (apologies to Churchill).

No comments

Write a response:

* Required.
Your email address will not be published.