Expanding the MC6847: Deciphering Fonts, Part 2

Another Player Enters the Game

While searching for TANDY Color Computer external font solutions, I found information on a similar solution that was created for the Dragon 200e. As a TANO Dragon owner (basically, an imported Dragon Data Dragon 64), I was aware of the Dragon line, but the 200 (and 200e) were new to me.

Having owned a Color Computer first, I want to be careful not to malign the Dragon systems. Both share a base architecture, being 6809/6847 based, with cartridge ports that are physically and electrically compatible. The Dragon, though, sports extra features like composite video output, a Centronics parallel printer port, and an actual hardware (6551) based RS232 port. Concerning base functionality, BASIC variants and keyboard layouts do differ. The Dragon 200 (and 200e) mirror the Dragon 64, but offer an updated exterior, and the 200e includes localized character fonts for the Spanish market.

Since the 200e lowercase board was an OEM item, I wasn’t lucky enough to find much information on the unit, but I did find that John Whitworth of DragonPlus Electronics offers a reproduction kit of the original design, available here: Lower Case Text Upgrade for Dragon 32/64/200 – Kit Version (2023) – DragonPlus Electronics. He also shared a copy of the 32 fonts you can burn into a 27C256 (16 fonts) or 27C512 (all 32 fonts) here: Dragon Lower Case Daughterboard Downloads – DragonPlus Electronics.

Initial Results

Since I already created some utilities for font extraction and visualization, I applied them to the font pack on DragonPlus’ web site, and the results were… gibberish. Since the file was an actual ROM binary image, there was no pesky file format to parse, but the output of my text view of the font data showed nothing of value. On a hunch, I wondered if, unlike the lowerkit solution, where each font glyph bitmap is stored in consecutive location, this solution spread them across the binary image. This is why software engineers sometimes need to understand the hardware. If the designers put the row counter on the upper address lines of the EPROM, consecutive bytes of a font glyph would appear every 128 or 256 bytes. A quick rework of my textual display program showed little at 128 byte offsets, but 256 byte offsets yielded recognizable font data:

Byte: 0000 FF '********'
Byte: 0100 FF '********'
Byte: 0200 FF '********'
Byte: 0300 E3 '***   **'
Byte: 0400 DD '** *** *'
Byte: 0500 D9 '** **  *'
Byte: 0600 D5 '** * * *'
Byte: 0700 DB '** ** **'
Byte: 0800 DF '** *****'
Byte: 0900 E3 '***   **'
Byte: 0A00 FF '********'
Byte: 0B00 FF '********'
Byte: 0C00 FF '********'
Byte: 0D00 FF '********'
Byte: 0E00 FF '********'
Byte: 0F00 FF '********'
Byte: 0001 00 '        '
Byte: 0101 00 '        '
Byte: 0201 00 '        '
Byte: 0301 00 '        '
Byte: 0401 00 '        '
Byte: 0501 0C '    **  '
Byte: 0601 02 '      * '
Byte: 0701 1E '   **** '
Byte: 0801 22 '  *   * '
Byte: 0901 1D '   *** *'
Byte: 0A01 00 '        '
Byte: 0B01 00 '        '
Byte: 0C01 FF '********'
Byte: 0D01 FF '********'
Byte: 0E01 FF '********'
Byte: 0F01 FF '********'
Byte: 0002 00 '        '
Byte: 0102 00 '        '
Byte: 0202 00 '        '
Byte: 0302 20 '  *     '
Byte: 0402 20 '  *     '
Byte: 0502 3C '  ****  '
Byte: 0602 22 '  *   * '
Byte: 0702 22 '  *   * '
Byte: 0802 22 '  *   * '
Byte: 0902 5C ' * ***  '
Byte: 0A02 00 '        '
Byte: 0B02 00 '        '
Byte: 0C02 FF '********'
Byte: 0D02 44 ' *   *  '
Byte: 0E02 FF '********'
Byte: 0F02 FF '********'

I wasn’t sure why the data was organized this way, as it makes it more difficult to create a font glyph, but I set that question aside for a bit. The main question was “why 256 byte spans”? Specifically, while the MC6847 supports a full 256 glyph font, the Dragon and the CoCo map semigraphics characters into the upper half of the space, which implies a font set need only be 128 characters in size. And, when I textualized the font data, it became clear font sets in the binary image only represented 128 characters. I also wondered a bit about non $FF values in the trailing 4 bytes of every font glyph, the 4 bytes that would never be visible on screen.

Since the original OEM design used a 4kB EPROM, I surmised font sets were 4kB in size, and I split the DragonPlus binary into 4kB chunks. I then extracted each 128 character font from the resulting files, resulting in 32 2kB font binaries. Finally, I used my font visualization solution from the lowerkit project (https://github.com/go4retro/lowerkit) to create some nice graphical views of the font data.

Secret Data

Of the remaining unanswered questions, I didn’t have enough information on why the font data was offset by 256 bytes when the fonts were 128 characters in length. But, the non $ff data starting at $0d00 in the various files does have an answer, and it somewhat explains why the binary is laid out in this manner.

If you’ll recall from a previous article, the easiest way to organize a font glyph bitmap for the MC6847 is to consider each one 16 bytes in size, even though only 12 bytes will be used. Doing so makes the electronics and the math easier. But, that leaves 4 bytes per character unused. On the lowerkit ROM image, those 4 bytes appear after every 12 bytes of font bitmap data. But, by laying out the Dragon font binary as shown above, all of the “spare” bytes are grouped in the last 1kB of each 4kB font set. Thus, starting at $0d00 in each file, there’s blank space.

Well, it should be blank space, but it turns out Eurohard SA (the group that engineered the Dragon 200e font localization daughterboard and brought the Dragon 200 and 200e to the Spanish market, put some non bitmap data there. While converting the ROMs, I asked in the World of Dragon forum if there was a copy of the original 200e font ROM binary to ensure my efforts were on the right path, and robcfg quickly linked to it. I checked in the supposed blank area of the original ROM image, and I found the following (visible via a hex editor):

(C)  1985  EUROHARD S.A.  -  DRAGON 200   AUTOR:  JORDI  PALET  MARTINEZ

Personally, I think the same thing could have been done by putting the data in the first byte of the 4 byte blank space of the first few characters, but the method Eurohard SA used made it easier to see in the file, perhaps as a deterrent to copy. In any event, it was interesting to find. John of DragonPlus Electronics continued the practice, identifying each font set in the same manner.

The DragonPlus Lowercase Mod Fonts

Below are the 16 font sets in DragonPlus’ font bitmap binary for the reproduction daughercard, arranged in 2 font groupings. As well, I extracted the non bitmap data from each font set.

Set 0

MC6847 Font
MC6847
MC6847
ORIGINAL MC6847 CHARACTER SET FOR COMPATIBILITY

ORIGINAL MC6847 CHARACTER SET FOR COMPATIBILITY

Set 1

D32/64 compatible w. lower case – based on 200E character set
Original 200E character set 1.
DRAGON 32/64/200 COMPATIBLE CHARACTER SET WITH LOWER CASE - BASED ON 200E CHARACTER SET - MODIFIED BY DUBLE
DRAGON 32/64/200 COMPATIBLE CHARACTER SET WITH INVERSE CHARS - BASED ON 200E CHARACTER SET - MODIFIED BY DUBLE

Set 2

Original 200E character set 1.
Original 200E character set 1.
DRAGON 32/64/200 COMPATIBLE CHARACTER SET WITH INVERSE CHARACTERS - BASED ON 200E CHARACTER SET - MODIFIED BY DUBLE
DRAGON 32/64/200 COMPATIBLE CHARACTER SET WITH INVERSE CHARS - BASED ON 200E CHARACTER SET - MODIFIED BY DUBLE

Set 3

Original 200E character set 0.
Original 200E character set 1.
(C)  1985  EUROHARD S.A.  -  DRAGON 200   AUTOR:  JORDI  PALET  MARTINEZ - ORIGINAL DRAGON 200E CHARACTER SET
DRAGON 32/64/200 COMPATIBLE CHARACTER SET WITH INVERSE CHARS - BASED ON 200E CHARACTER SET - MODIFIED BY DUBLE

Set 4

Spectrum w. lower case
Spectrum w. inverse characters.
ZX SPECTRUM CHARACTER SET WITH LOWER CASE - TAKEN FROM MAME ROM SET          ZX SPECTRUM CHARACTER SET WITH INVERSE CHARACTERS - TAKEN FROM MAME ROM SET AND MODIFIED BY DUBLE

Set 5

Spectrum w. inverse characters
Original 200E character set 1.
ZX SPECTRUM CHARACTER SET WITH INVERSE CHARACTERS - TAKEN FROM MAME ROM SET AND MODIFIED BY DUBLE
DRAGON 32/64/200 COMPATIBLE CHARACTER SET WITH INVERSE CHARACTERS - BASED ON 200E CHARACTER SET - MODIFIED BY DUBLE

Set 6

TI99/4A w. lower case
TI99/4A w. inverse characters.
TI99/4A CHARACTER SET WITH SMALL CAPS FOR LOWER CASE. TAKEN FROM MAME ROM SET
TI99/4A CHARACTER SET WITH INVERSE CHARACTERS - TAKEN FROM MAME ROM SET AND MODIFIED BY DUBLE

Set 7

TI99/4A w. inverse characters
Original 200E character set 1.
TI99/4A CHARACTER SET WITH INVERSE CHARACTERS - TAKEN FROM MAME ROM SET AND MODIFIED BY DUBLE
D32/64/200 COMPATIBLE WITH INVERSE CHARS - BASED ON 200E CHARSET - MODIFIED BY DUBLE

Set 8

CGA Light for 200E – with accented chars etc.
Original 200E character set 0.
CGA LIGHT CHARACTER SET WITH ACCENTS AND LOWER CASE - 200E COMPATIBLE. TAKEN FROM MAME ROM SET AND MODIFIED BY DUBLE
(C)  1985  EUROHARD S.A.  -  DRAGON 200   AUTOR:  JORDI  PALET  MARTINEZ

Set 9

CGA Light for 200E – with accented chars etc.
CGA Light for D32/64 w. inverse chars.
CGA LIGHT CHARACTER SET WITH ACCENTS AND LOWER CASE - 200E COMPATIBLE. TAKEN FROM MAME ROM SET AND MODIFIED BY DUBLE
CGA LIGHT WITH INVERSE CHARS - TAKEN FROM MAME ROM SET AND MODIFIED BY DUBLE

Set 10

CGA Light for D32/64 w. lower case
CGA Light for D32/64 w. inverse chars.
CGA LIGHT WITH LOWER CASE - 32/64/200 COMPATIBLE. TAKEN FROM MAME ROM SET AND MODIFIED BY DUBLE
CGA LIGHT WITH INVERSE CHARS - TAKEN FROM MAME ROM SET AND MODIFIED BY DUBLE

Set 11

CGA Light for D32/64 w. inverse chars
D32/64 compatible w. inv. Chars – based on 200E character set.
CGA LIGHT WITH INVERSE CHARS - 32/64/200 COMPATIBLE. TAKEN FROM MAME ROM SET AND MODIFIED BY DUBLE
D32/64/200 COMPATIBLE WITH INVERSE CHARS - BASED ON 200E CHARSET - MODIFIED BY DUBLE

Set 12

CGA Bold for 200E – with accented chars etc.
Original 200E character set 0.
CGA BOLD CHARACTER SET WITH ACCENTS AND LOWER CASE - 200E COMPATIBLE. TAKEN FROM MAME ROM SET AND MODIFIED BY DUBLE
(C)  1985  EUROHARD S.A.  -  DRAGON 200   AUTOR:  JORDI  PALET  MARTINEZ

Set 13

CGA Bold for 200E – with accented chars etc.
Original 200E character set 1.
CGA BOLD CHARACTER SET WITH ACCENTS AND LOWER CASE - 200E COMPATIBLE. TAKEN FROM MAME ROM SET AND MODIFIED BY DUBLE
CGA BOLD WITH INVERSE CHARS - TAKEN FROM MAME ROM SET AND MODIFIED BY DUBLE

Set 14

CGA Bold for D32/64 w. lower case
CGA Bold for D32/64 w. inverse chars.
CGA BOLD WITH LOWER CASE - 32/64/200 COMPATIBLE. TAKEN FROM MAME ROM SET AND MODIFIED BY DUBLE
CGA BOLD WITH INVERSE CHARS - TAKEN FROM MAME ROM SET AND MODIFIED BY DUBLE

Set 15

CGA Bold for D32/64 w. inverse chars
D32/64 compatible w. inv. Chars – based on 200E character set.
CGA BOLD WITH INVERSE CHARS - 32/64/200 COMPATIBLE. TAKEN FROM MAME ROM SET AND MODIFIED BY DUBLE
D32/64/200 COMPATIBLE WITH INVERSE CHARS - BASED ON 200E CHARSET - MODIFIED BY DUBLE

Some of the fonts are repeated in the binary image, probably to allow flexibility in choosing the combination most desired.

The SVG images of the fonts are at: https://github.com/go4retro/dragon200e-lowercase/tree/main/charsets/drawsvg and font binaries are at: https://github.com/go4retro/dragon200e-lowercase/tree/main/charsets/fixrom.

Pedantic Inconsistencies

Not that it matters, but John’s font binary contains what appear to be some font description inconsistencies.

  • The second font in Set 1 claims it is a modified Dragon 200e set, but, except for the hidden text data, the font information is the same as the original Dragon 200e second font
  • Likewise, though the second fonts in sets 2,3,5,and 7 claim to be modified, they appear to be the original second font from the Dragon 200e mod.
  • The second font in set 13 claims to be a CGA bold font, but is actually another copy of the original Dragon 200e second font.

It’s possible the second font was modified, but then reverted, prior to the ROM merge. On the CGA font, that’s more confusing, and I’d appreciate validation of my efforts, which I’ve placed on GitHub at https://github.com/go4retro/dragon200e-lowercase.