Name the Non-Standard PC Code Page

Out of all the 8-bit character encodings commonly seen on PCs and clones, there's one which IBM has never properly standardized or bestowed with a code page designation - although it seems to have come from IBM itself, and was quite popular for a while, at least in certain quarters.  A common term for it seems to be "Denmark/Norway" or "Nordic", but there's a little more to it than just that.

At IBM

On most CGA and MDA boards as shipped by IBM, the character ROM is numbered either 5788005 or 6359300, and holds the familiar fonts for code page 437 - the PC's original character set.  But some were sold with the more unusual 4733197 ROM, which modifies the CP437 reper­toire with a dozen new chara­cters (shown below in red):

IBM 4733197 CGA/MDA character ROM
IBM 4733197 CGA/MDA character ROM
4733197 MDA font, chars 128-256
MDA font, chars 80-FF
4733197 CGA font (default), chars 128-256
CGA font (default), chars 80-FF
IBM 4733197 CGA font (thin), chars 128-256
CGA font (thin), chars 80-FF

This particular chip came from an MDA card (see the first image here for a full photo); but like the more common ROM variants, it also contains the two CGA fonts, so it could have been used with either type of adapter.  Judging by the date on the chip, IBM boards with this UK-made ROM were produced at least as early as 1985, and probably quite a bit earlier.  IBM sold these adapters in some European countries - Norway and Denmark for sure, although the range of those replace­ment glyphs hints at other countries as well.

See, only ø Ø have anything much to do with Danish and Norwegian.  Ŀ ŀ are Catalan, õ Õ ã Ã are Portuguese (õ/Õ exists in Estonian too), ʼn is Afrikaans, and ℓ ³ ¤ aren't specific to any particular locale.

And still, this character set is commonly described as "Danish", "Norwegian", or "Nordic".  Some sources (hi MAME!) go so far as to identify it with code page 865, IBM's official Nordic encoding for DOS - but looking at these two side by side, they're decidedly not the same:

IBM 4733197 ROM character set
_0_1_2_3_4_5_6_7_8_9_A_B_C_D_E_F
0_ ☺☻♥♦♣♠•◘○◙♂♀♪♫☼
1_►◄↕‼§▬↨↑↓→←∟↔▲▼
2_ !"#$%&'()*+,-./
3_0123456789:;<=>?
4_@ABCDEFGHIJKLMNO
5_PQRSTUVWXYZ[\]^_
6_`abcdefghijklmno
7_pqrstuvwxyz{|}~⌂
8_ÇüéâäàåçêëèïîìÄÅ
9_ÉæÆôöòûùÿÖÜø£ØĿŀ
A_áíóúñÑõÕ¿ãÃℓʼn¡³¤
B_░▒▓│┤╡╢╖╕╣║╗╝╜╛┐
C_└┴┬├─┼╞╟╚╔╩╦╠═╬╧
D_╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀
E_αßΓπΣσμτΦΘΩδ∞φε∩
F_≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ 
IBM code page 865 (Denmark/Norway)
_0_1_2_3_4_5_6_7_8_9_A_B_C_D_E_F
0_ ☺☻♥♦♣♠•◘○◙♂♀♪♫☼
1_►◄↕‼§▬↨↑↓→←∟↔▲▼
2_ !"#$%&'()*+,-./
3_0123456789:;<=>?
4_@ABCDEFGHIJKLMNO
5_PQRSTUVWXYZ[\]^_
6_`abcdefghijklmno
7_pqrstuvwxyz{|}~⌂
8_ÇüéâäàåçêëèïîìÄÅ
9_ÉæÆôöòûùÿÖÜø£Ø₧ƒ
A_áíóúñѪº¿⌐¬½¼¡«¤
B_░▒▓│┤╡╢╖╕╣║╗╝╜╛┐
C_└┴┬├─┼╞╟╚╔╩╦╠═╬╧
D_╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀
E_αßΓπΣσμτΦΘΩδ∞φε∩
F_≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ 
The two encodings compared: red indicates differences from code page 437.

It's worth keeping the timeline in mind here: code page 865 came along with PC-DOS 3.3, in April 1987.  Our mystery "DK/NO" layout is definitely earlier, having been around for at least a couple of years by then.  And the connection is evident: CP865 only retained a measly three characters to set it apart from CP437, but those three maintain the exact same code points they had in the previous scheme.

As for those other characters, they turned up more or less where you'd expect them to be in the DOS code page system, except for ℓ and ʼn - they somehow wound up in the none-too-common CP853 (Latin-3 Southern European, or Turkish, depending on who you ask).  As a sensible home for these two, it's not much of an improvement over Danish/Norwegian; they're clearly the odd ones out, since the rest of that code page was chosen to match ISO 8859-3.  But there was probably a reason for shoehorning them in there together, even if they didn't get to keep their code points.

Back to our anonymous character set, the real puzzle in all this is the lack of any definite sources from IBM itself about it: no official name, designation, or IBM code page number; no information as to its actual purpose; no mention in any documentation that I'm aware of;1 and no apparent support in any known version of PC-DOS - even though they clearly shipped MDA and CGA boards with this character set, so (in text mode) it was all you had.  It's all very weird.

Third-Party Adoption

IBM may not give us much to go on, but quite a few makers of com­patible machines (especially ones sold in Europe) felt that this character set was important enough to imple­ment.  They're far less stingy with their infor­mation, and they all stick to the 'Denmark/Norway' version of the story - despite all of those patently un-Nordic characters:

Vendor, Machine Supported in Designation, Notes, Links
Acer MS-DOS 3.20 (Acer OEM) Part of GRAFTABL.COM 2
DEC VAXmate VAXmate MS-DOS 3.10 "IBM Norway/Denmark Extended" 3
Ericsson PC/Portable PC Character ROMs; Ericsson DOS 3.10 Command: GRAFTABL GRAFCHAR.DAN 4
NCR PC4, PC4i, PC6, PC8 Hi-res color adapter ROM; NCR-DOS "Denmark/Norway", "Nordic" 5
Nixdorf 8810-M15 286 Character ROM; DOS 3.20 system disk Command: GRAFTBNO.COM 6
Olivetti GO467 EGA+ On-board video BIOS For M240 etc. (CP437 variants likely exist) 7
Olivetti M24 Olivetti M24/M24SP DOS 3.20 Command: NORDIC.COM 8
Olivetti Prodest PC-1 Character ROM; DOS 3.10 system disk Command: NORDIC.COM 9
Sharp PC4602/4641 Character ROM; system setup "Denmark/Norway" 10

Sharp's manuals for those two portables lay out the full character table in print.  Elsewhere on the list, command and file name abbre­viations like "DAN" and "NO" are pretty unambi­guous about which languages they refer to.

The common thread here is that these compatibles all predate PC-DOS 3.3 with its standardized code pages, including 865.  Later machines - to the degree that they still used hard-wired ROM fonts - offered CP865 for 'Nordic', for instance Amstrad's PC line.  But with these early examples, the only IBM PC character sets they had to follow were CP437 and this so-called "Denmark/Norway" one; some of the above were already selling by 1984, which tells us that IBM was likely using that scheme since 1983 (when PCs began shipping in Europe).

NCR PC-series color adapters, chars 80-FF
NCR PC-series color adapters, chars 80-FF
Acer DOS 3.20 GRAFTABL, chars 80-FF
Acer DOS 3.20 GRAFTABL, chars 80-FF
DEC VAXmate, chars 80-FF
DEC VAXmate, chars 80-FF
Olivetti GO467 video BIOS, chars 80-FF
Olivetti GO467 video BIOS, chars 80-FF
Examples of the alleged "DK/NO" character set on some non-IBM machines

Perhaps this character set's relatively popular acceptance can explain why it kept popping up at other places, where we can continue catching glimpses of it:

  • In SCO's Xenix-derived UNIX System V/386, it's available as "PC Nordic", with console fonts in three sizes.11 (Incidentally, the fonts themselves appear to be exact duplicates of the above-mentioned Olivetti GO467 fonts, at least in some versions.)

  • HP defined it in its PCL (Printer Command Language) as "PC-8 Danish/Norwegian"; other adopters of this standard refer to it as "PC-8 D/N" or even "Code Page 437N"(!).

Which goes to show that even outside the world of DOS-based PCs, various vendors recognized it as a PC-derived de-facto standard of sorts and continued to support it, despite IBM's attempts to kill it off.  (Shout out to Lys for helping out with extra sources here and below.)

Back at IBM: Code Page 1058?

I wrote that IBM never officially documented this character set anywhere, but there's one place where IBM nearly seems to acknowledge its existence, and on first glance it looks like a slam dunk: code page 1058.  Could this be the admission of paternity we were hoping for?

Alas, not so fast: the original IBM PC version of this code page had the 'house' character ⌂ at 0x7F, but IBM's CP1058 has ▒ (a checkered/dotted box), which is more typical of HP character sets.  As it happens, the following lists do place this IBM code page in a sequence derived from HP - 1050 through 1058:

The (only) difference is at 0x7F: HP has the IBM-derived 'house' character ⌂ (also 'home plate' in HP parlance), while IBM code page 1058 - supposedly emulating HP - replaces it with an HP-style checkered box... which HP never had there in the first place.

HP 'PC-8 D/N' ('437N') charset
_0_1_2_3_4_5_6_7_8_9_A_B_C_D_E_F
0_ ☺☻♥♦♣♠•◘○◙♂♀♪♫☼
1_►◄↕‼§▬↨↑↓→←∟↔▲▼
2_ !"#$%&'()*+,-./
3_0123456789:;<=>?
4_@ABCDEFGHIJKLMNO
5_PQRSTUVWXYZ[\]^_
6_`abcdefghijklmno
7_pqrstuvwxyz{|}~⌂
8_ÇüéâäàåçêëèïîìÄÅ
9_ÉæÆôöòûùÿÖÜø£ØĿŀ
A_áíóúñÑõÕ¿ãÃℓʼn¡³¤
B_░▒▓│┤╡╢╖╕╣║╗╝╜╛┐
C_└┴┬├─┼╞╟╚╔╩╦╠═╬╧
D_╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀
E_αßΓπΣσμτΦΘΩδ∞φε∩
F_≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ 
IBM code page 1058
_0_1_2_3_4_5_6_7_8_9_A_B_C_D_E_F
0_ ☺☻♥♦♣♠•◘○◙♂♀♪♫☼
1_►◄↕‼§▬↨↑↓→←∟↔▲▼
2_ !"#$%&'()*+,-./
3_0123456789:;<=>?
4_@ABCDEFGHIJKLMNO
5_PQRSTUVWXYZ[\]^_
6_`abcdefghijklmno
7_pqrstuvwxyz{|}~▒
8_ÇüéâäàåçêëèïîìÄÅ
9_ÉæÆôöòûùÿÖÜø£ØĿŀ
A_áíóúñÑõÕ¿ãÃℓʼn¡³¤
B_░▒▓│┤╡╢╖╕╣║╗╝╜╛┐
C_└┴┬├─┼╞╟╚╔╩╦╠═╬╧
D_╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀
E_αßΓπΣσμτΦΘΩδ∞φε∩
F_≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ 
HP's code page is identical to IBM's 'DK/NO' (4733197 ROM) encoding; IBM's own code page 1058 isn't.

Things went roughly like this: first, IBM comes up with its odd 'DK/NO' encoding for the PC, in its 4733197 CGA/MDA ROM; then, HP adopts it as-is, officially recognizing it as a character set derived from the IBM PC; finally, IBM decides to port it right back from HP, implying that it was never theirs in the first place - and adding a single pointless change, just for good measure.

Way to pass the buck back and forth, guys!  It's as if IBM simply couldn't bring itself to assume responsibility for the ill-begotten alphabet soup they had cooked up.

The Billion-U+0024 Question(s)

At this point, we're still mostly in the dark about this cryptic little (non-) standard character set.  I'd be nice to be able to clarify a few points about IBM's original version of it:

  • What was IBM (UK) going for with that modified CGA/MDA ROM?  Given all those non-CP437 glyphs which don't belong in Danish or Norwegian, which markets was it intended for, and which ones did it actually end up in?

  • With all those non-DK/NO characters, why do practically all non-IBM sources refer to this charset as "Denmark"/"Norway"/"Nordic"?  Did Catalonia, South Africa, and the Lusosphere join up with Denmark and Norway, in some sort of Kalmar Union on steroids?  Or does this simply tell us where IBM's modified ROM was really used in practice?

  • Did IBM ever have an official designation for this character set?  Is it described in any of IBM's PC-series documentation?

  • Once this character set had achieved a few years of use on the IBM PC (and had become enough of a de-facto standard to be cloned profusely), why did PC-DOS 3.3's new code page system drop it like it's hot?  And if it wasn't worth keeping around, why introduce a new Denmark/Norway variant (code page 865) which covers only three of its characters - ø, Ø, ¤?  Especially when they already had those three covered in code page 850 (DOS Latin-1)?

If anyone happens to know more, I'd love to try and make some sense of it, so any official information from the IBM side of things would be appreciated.


UPDATE (2024-10-06): Some answers to the above questions have turned up; see the next post - Missing IBM PC Localization Disks & ROMs.

* * *

This post brought to you by ʼn (U+0149 a.k.a. LATIN SMALL LETTER N PRECEDED BY APOSTROPHE) and by the spirit of the late Michael Scott Kaplan.

Notes

  1. Admittedly, that excludes any localized Norwegian/Danish documents and manuals for the IBM PC, which would probably be the best bet (are these available anywhere?) [↑]
  2. Microsoft MS-DOS 3.20 [Acer OEM] [↑]
  3. VAXmate User's Guide Volume 2, p. 117 (32-53), p. 179 (32-111) [↑]
  4. Ericsson MS-DOS 3.10c [↑]
  5. See NCR PC4i Technical Reference, p. 492; NCR PC6 Extensions (PDF link), p.5, p.93.
    Speaking of which: NCR's hi-res color standard (which provided enhanced CGA text and graphics, at a resolution of 640x400) is not called "NGA", despite the usual sort of historical revisionism online.  NCR referred to these adapters as simply the "Graphics Controller Board"/"Graphic CRT Adapter", or by their part numbers (K201, K511 etc.); they never became common enough to receive an informal 'folk acronym'. [↑]
  6. Nixdorf 8810 M15 SYSSETUP Floppy image [↑]
  7. Olivetti GO467 BIOS version 5.28 [↑]
  8. Olivetti MS-DOS Version 3.20 r3.27 for M24 and M24SP (Keyboard Drivers and Utilities disk); [↑]
  9. Olivetti Prodest PC1 system disk image [↑]
  10. See Sharp PC-4602/PC-4611 Operation Manual, p. 112 and Service Manual, p. 5 [↑]
  11. SCO System V/386 Release 3.2 v4.x International Supplement (PDF link), p. 49; p. 91 [↑]

12 comments:

GloriousCow says:

Great info as usual. Motivating me to switch to reading my CGA fonts from a proper ROM file instead of hard-coding them as I do currently. Are these two ROM versions the only two we know about?

VileR says:

Thanks! AFAIK these are the only two ROMs for which we have the actual contents (for CP437, I'm counting 5788005 and 6359300 as a single variant, since the data is identical). Apparently at least Portuguese and Hebrew existed, and possibly Arabic as well(?), but I'm not aware of any dumps...

Scali says:

That reminds me, the 'official' codepage for Dutch is the 850 one, and there's also an official Dutch keyboard layout.
However, in practice most people in the Netherlands would use codepage 437, as most software was in the English language, mostly from the US (which would often display incorrectly in other codepages when some more fancy ASCII or ANSI was used to draw a user interface).
Likewise you'd rarely see an actual Dutch keyboard layout. Most people used a US (later usually the 'US International') layout.
I wonder for how many other countries this holds true.

VileR says:

Hm, as far as I can tell Dutch has the same character repertoire as English, so I suppose the code page never really mattered - standard DOS code pages only modify the 'extended' upper half of the character set, but the lower (ASCII) range is enough for both Dutch and English. And of course the US keyboard layout would work just as well.

On the other hand, 7-bit international character sets differed from US ASCII even in non-alphabetic characters (e.g. punctuation, currency, other symbols); see all those ISO 646/DEC/etc. variants for example. The 7-bit Dutch charset there has a macron "¯" at 7E, so maybe cp850 was chosen for 8-bit in order to cover that one too.

Scali says:

Dutch uses accents and umlauts, it borrows from French and German. So we do need the upper range, but we can mostly get away with CP437, it just seems to lack the capital version of various of these characters.
But in practice, often people don't even bother with all that special stuff, and just write things with standard ASCII characters, no accents, umlauts and whatnot.
I have no idea what the macron would be used for. Seems like an inverted underscore.

Scali says:

Another thing I was thinking: cheap clones.
Back in the day, us consumers would just walk into a shop and buy a computer, off the shelf, as it were. We had no idea about any kind of localization, so you just got whatever the shop bought in. Perhaps this was different when an organization ordered machines in bulk, perhaps then they'd get the chance to decide what kind of ROMs, keyboards etc they wanted.
Now I was wondering... would those cheap Taiwanese clone makers ever even have bothered to implement language/country/region-specific models? Or had they just cloned the US IBMs and that was that?
Also, would standard US machines be cheaper, as there was a larger market for them, and the others were more or less 'bespoke' models, built in smaller batches?
Could be other factors that influenced how widespread the non-US systems were.

VileR says:

I just recalled that in Dutch you do encounter names and localities like 'Fryslân'. Strictly speaking that would be Frisian, but I guess those cases are encountered often enough in writing. Even so, I expect that CP437 covers those diacritics well enough.

Re: cheapo clones, I assume that most small-scale importers would buy those Taiwanese video boards with their stock character ROMs (or even with the socket unpopulated), and then just slip in some modified version with the local charset. At least that's what happened here, as far as I can tell... our family XT clone had a mono+CGA combo card with Hebrew fonts for both modes (the encoding was the same as code page 862), and I have a similar CGA card like that now, which doesn't even have any brand name or model markings.

But it'd make sense if some of those clone manufacturers had ROM customization deals for customers who bought in bulk and wanted to supply their own data to be put there. Same was likely done for keyboard layouts (although you could get keycaps etched locally too).

Scali says:

Yea, I suppose the codepages for IBM PCs were a luxury anyway. I don't think Commodore supported that at all. Afaik all machines in all countries just had the PETSCII characterset. On the other hand, it was redefinable, so you didn't have to physically swap ROMs. But I don't recall Dutch software actually doing that.
So it could be that early computer uses were already used to writing Dutch without diacritics anyway, and would just continue to do so on IBM PCs, or use diacritics within the limitations of CP437 mostly.

Physically installing/swapping ROMs, that would be rather costly I would think. I mean, imagine the machines arrived from Taiwan or wherever, you'd have to unpack them, disassemble the case and boards to the point where you can access the ROM socket, and then install the localized ROM, put everything back together again, and put it back in the original packaging.
It would be much more cost-effective if the correct ROM were installed at the factory, before shipping. But the manufactures would probably only consider that option for large enough batches.
I can imagine it would be somewhat more pressing with Hebrew, as the entire characterset is different from Latin (not to mention it is written from right-to-left instead of left-to-right... which by the way is something that affects my work even today. When we use on-screen tickers, they have to be able to scroll in either direction, depending on the language used). Not a case of just a few diacritics missing, but people will understand the words anyway.

I suppose the Dutch mainly made do with standard MDA/CGA/Hercules machines, and the problem solved itself with EGA, when you could load the codepage you wanted at boot-time, because it now was stored in RAM, not in ROM.
That's when I encountered machines that would load CP850 by default, which led to issues in some software, so I'd change it back to CP437.

As for keyboards... yea, replacing keycaps could work, except the official layouts tend to not just change the symbols on the keys, but they also change the size and shape of certain keys. For example, the Dutch layout has a smaller left shift, and an extra key between the shift and the Z key.
The size and shape of the enter key can also change between various layouts, and there's probably other 'extra' keys in certain layouts, such as the one between shift and Z.
I recall back when I got OS/2 Warp, the manual included an extensive listing off all the different keyboard layouts that were supported. I was intrigued by the sheer amount of variations.

Kilian Hekhuis says:

Also note that CP437 does have at least one Netherlands-specific character: 159, the guilder sign (ƒ). Also, 152, y with diaeresis (ÿ) looks exactly like a ij ligature (ij) which was traditionally used in (Netherlands) Dutch.

damageinc86 says:

Those two smiley face characters for the thumbnail image of this post; I used to play a really old DOS game at my friends house,...maybe like a 286, and it was that style of smiley face with falling down a tunnel, and you had to guide it trying to avoid the walls and stuff. I can't find any info about it anywhere. Figured maybe through some wild stroke of luck. Either you, or someone reading this, has a clue what frickin' game that could have been? maybe on some complication of early early 286 games. I'm sure it wasn't like a proper boxed release or anything. Very obscure probably. Anyways, think on it? Thanks!

VileR says:

damageinc86: Sounds like Tommy's Egg, or maybe other variations on that idea like Deep II: Center of the Earth or Pitfall? (that last one has the smiley faces as enemies)...

If it's none of those, then the Mobygames forums or discord are a good place to ask.

hwertz says:

I was only about 12 so this recollection is rather vague... but I do remember visiting a neighbor of ours, they were from Norway and had a PC (not an IBM, I do remember it being extraordinarily chunky compared to the already rather chunk early 1990s desktops. I think it was like a 286 or possibly a 386). This had a Norwegian keyboard. It had an extra key on it (I think it was AltGr?), and a few of the letters had extra symbols on them (so maybe you'd hit AltGr-o to get  or possibly  ). I imagine this had a localized version of DOS so it was probably using that Norway/Denmark code page.

Write a response:

* Required.
Your email address will not be published.