Closed hackerb9 closed 2 years ago
Hi, thanks for reaching out! It's quite likely that there are still TRS-80 fonts missing, it does seem that there were a lot of different models and clones, each with slightly different fonts. All TRS-80 fonts in the repo are under https://github.com/robhagemans/hoard-of-bitfonts/tree/master/trs-80 , this includes some clones but clearly not all.
Contributions are very welcome and the image you attached can quite easily be converted - ROM images would be even better in case there are multiple versions, or any graphical characters stored in positions for control characters below chr$(32)
. So if you know where to find any I can have a look as well.
(In the source of the emulator you linked, there appears to be one font strike in https://bitchin100.com/CloudT/Emulation/mainRom.js - from a quick look it doesn't have more than the font in the image above, but it's hard to see exactly without doing a bit more work to extract it)
Would you have links to images or information about the other Model 100 fonts you mention?
Some further notes:
kyocera
https://github.com/mamedev/mame/blob/mame0247/src/mame/kyocera/kyocera.cpp so it may be possible to find something in MAME packs.The Virtual T emulator includes ROM images for the TRS-80 Model 100, Tandy 102, and Tandy 200. It also includes ROMs for the Kyocera Kyotronic 85, Olivetti M10, and NEC PC-8201A and PC-8300. roms.zip
[I see you have found them even as I type... ]
I wrote a little program to extract some of the fonts out of the ROMs and will post it next.
Ah, KC85 is Kyotronic 85, not Robotron Kleincomputer KC-85. That makes more sense :)
The Virtual T includes .fcr files in the ROMs directory which are font files. I wrote an extraction program for them, but they do not look quite right. I believe they may have been "improved" to a higher resolution, but in so doing introduced an error or two.
The Tandy 200 font, I extracted from the ROM using this:
The character definitions start at byte number 36963 of T200rom.bin, for ASCII character 32. The output looks like this (after I trimmed off the garbage output for undefined characters 0 to 31):
The Kyocera Kyotronic 85 ROM has a different layout which saves bytes by not encoding the white space around the letters. I will include that one next.
The K-85 (not KC85) has a different font format. I could swear I saw pictures of Japanese text on the Kyocera Kyotronic 85, but I didn't see them in the ROM included with Virtual T. However, I don't know Japanese and perhaps I wouldn't recognize katakana if I saw it.
Here is the slightly modified rom2txt program I used to extract the font:
The character definitions for the K-85 ROM begin at byte 29631 with character number 32. The character width increases from 5 to 6 at character number 128. Again, the data before ASCII 32 appears to be garbage, but I have left them in this time as they may be something I simply don't recognize.
I have not yet figured out the format for the NEC-PC8201A ROM. It starts out similar to the K-85 format with a width of 5 but things go higgledy-piggledy when the width increases around character number 128. Perhaps the width is changing multiple times? The character data starts at byte 30903, with ASCII 32.
Here is the output from running the same k85rom2txt.c program as above. As you can see, the last half of the data is corrupted.
The TRS-80 Model 100 uses exactly the same format as the K-85. Character data starts at byte 30481, beginning with ASCII 32. Here is the output (after removing characters 0–31 which are garbage):
It is very late where I am right now, so I am stopping. Here are some other possible font variations which might be extractable from "Model T" ROMs:
𝚒
or π
– Or, it could be something completely unique.)I also have a vague memory that the Model 100 had a slightly different font depending upon which version of the ROM was received. However, now I question that memory. I suspect that the Tandy 102 (which was so similar to the Model 100 that people usually refer to them in a single breath) may have used the Tandy 200 font which had made a few minor aesthetic fixes and changed the meaning of a couple characters (numbers 136 and 213).
Thanks! There's a lot of information in there, so I'll need to have a look, but clearly we have a few fonts here than can be converted and included.
Also I need to see what's up with the NEC ROM. It might be a bitmap strike with variable character widths and a width table somewhere, rather than a one-byte-per-row bitmap. By the way, I have some tools to explore and extract bitmaps and strikes at https://github.com/robhagemans/monobit , but admittedly it's still in alpha and poorly documented.
monobit is pretty nifty! I haven't figured out how to extract a font from the ROM yet, but I was able to see right away that the Tandy 102 has the same font format as the Model 100, but it has the newer characters like the Tandy 200.
The US Tandy 102 font begins at byte number 30481, with ASCII 32, and is in the same format as the K-85. (5 bytes wide at first, 6 bytes wide starting with character 128).
Here is what it looks like when extracted with my tool:
As mentioned earlier it clearly has some of the changes that were made to the Tandy 200 font, such as the pi character. They may be identical. [Update: I have checked and the Tandy 200 and Tandy 102 have the same font.]
I have checked the UK version of the Tandy 102 ROM and the font is exactly identical to the US version. It even starts at the same location (30481).
The Olivetti M10 (European variant) has a very different font, although it is encoded (almost) in the same format as the Kyocera Kyotronic 85. The one difference is that there is a gap in the characters from 128 to 157. The character that would have been at position 128 is instead encoded at 158. (Or at least, that's what I gather from this bitmap).
I modified my extraction code so it works like this:
Font data starts at byte 29739. Here is the output from that program:
Note that Character 255 is defined as a blank, just like 32.
The North American variant of the Olivetti M10 has a similar, yet different, font. This time there is gap of 32 characters (instead of 30), so the character that would normally have been encoded as position 128 is instead referred to as 160.
Here is the modified extraction code:
And here is the output reading the font data starting at address 30548:
This font differs from the European variant in only three characters: number 35 (pound symbol) has been changed from a British Pound £
to the American hash mark #
. Characters 158 Ç
(C with cedilla) and 159 ¨ (diaeresis) are missing from the North American ROM.
To summarize:
The TRS-80 Model 100 and the Kyocera Kyotronic 85 share the same font (presuming the K-85 ROM I have is genuine).
The Tandy 102 US, Tandy 102 UK, and Tandy 200 all share the same font.
The Olivetti M10 Europe has a slightly different font from the Olivetti M10 North America.
I have no idea about the so-called "VT-100" expander for the Model 100.
I am still stumped by the NEC PC ROMs. Perhaps, like the M10, the font is not defined across the whole range?
[UPDATE: If the reverse-engineered source code at z88dk/techdocs is correct. Then the NEC PC-8201 had only three "high ASCII" characters defined: 128 ⏴ (left pointing triangle), 129 ⏎ (down then left arrow), and 130 🮕 (stippled grey box).]
FONT:
BINARY "FONT_L.BIN"
;$7A96
;00000000
;00001000
;00011100
;00111110
;01111111
DEFB $00,$08,$1C,$3E,$7F,$00
;00100000
;01110000
;11111000
;00100000
;00111110
DEFB $20,$70,$F8,$20,$3E,$00
;01010101
;10101010
;01010101
;10101010
;01010101
;10101010
DEFB $55,$AA,$55,$AA,$55,$AA
Thanks for all the research! I've needed to fix some annoying bugs in monobit along the way (it is still very much alpha) but with the parameters above I can extract the K-85, T200 and Olivetti M10 from the Virtual-T set. I'm assuming the localised Olivetti OMS come from http://tandy.wiki/Model_T_System_ROMs as the names match, will have a look at those too.
Notes
PC8201rom.bin
has a 5x8 strike with 109 glyphs from 78b7
to 7ad7
inclusive. This is probably complete, see character table here: https://www.web8201.net/Files/LIBRARY_web8201/NEC8201A-SvcManual.pdf page 3-32You are correct about the ROM source. I had meant to link to tandy.wiki but somehow that got lost in the shuffle.
Would you mind sharing the commands you used with monobit to extract the font files? I couldn't quite figure that part out.
Edit: PC8201A and 8300 have the same font at the same location in ROM.
The expansion device for the Model 100 which lets it plug into a TV for a 40 column x 25 row screen or into a monitor for 80 columns x 25 rows is actually called the "Model 100 Disk Video Interface". (I am not sure where I got the bizarre idea it was called the "VT-100" see below).
The DVI's character generator ROM is available on tandy.wiki. It is almost in the same format as the Tandy 200's font data, but the letters are mirrored left to right. It contains two fonts. (Is the right word "strikes"?)
The first strike data starts at byte 0, with ASCII 0, although the first 32 characters are just blank. It is an 8x8 strike.
The second strike data starts at byte 2048. Again it starts at ASCII 0 and the first 32 characters are blank. It is a 7x8 strike.
Although more detailed, the characters chosen are the same as the Model 100 (and K-85) character set. For example, character number 136 is i, not π.
Disk_Video_Interface_roms.zip dvirom2txt.c.gz
Update: The reason I thought it was called "VT100" is because that's the name of the Wiki page where I learned of the 80-column font for the Model 100: https://bitchin100.com/wiki/index.php?title=VT100 Apparently, somebody had taken a VT100-compatible doohicky and merged it with the Disk Video Interface for the Model 100. Fortunately the new revision is called "MVT100", so there will be less confusion.
There is one more font I ran across while finding these. I do not know if it is relevant to you as it appears to be from the FX-80 dot matrix printer. It was included in the Virtual T source code under the name "fx80.fcr". Again, I wrote a simple program to extract it. All 256 characters are defined and it has a very different character mapping than any of the Model T computers. Additionally, while the font appears to be 9 bits wide, it never draws two dots horizontally next to each other.
The data starts at byte 0, which ASCII 0. Here is what the font looks like:
Characters 128 to 255 appear to be italic versions of 0 to 127.
Hi, thanks again. Font terminology is a bit fluid, I'm trying to be consistent but don't always manage - and also I'm not a typographer so best to follow more authoritative sources :) In any case, by 'strike' I here, loosely, mean a bitmap that contains a set of glyphs for one size and one font. The more restricted use in monobit is for a bitmap that has the glyphs side-by-side, the way it is often done for proportional fonts. But the distinction is not sharp and I'm not sure if that is standard terminology.
These are my current monobitt commands - using latest master branch -
convert.py ROMs/M10rom.bin --from raw --load-offset 30219 --load-numchars 98 --load-first-codepoint 158 --load-cell 8,6 | modify.py rotate --turns 3 > olivetti-m10-2.yaff
convert.py ROMs/M10rom.bin --from raw --load-offset 29739 --load-numchars 96 --load-first-codepoint 32 --load-cell 8,5| modify.py rotate --turns 3 > olivetti-m10-1.yaff
convert.py ROMs/KC85rom.bin --from raw --load-offset 29631 --load-numchars 96 --load-first-codepoint 32 --load-cell 8,5 | modify.py rotate --turns 3 > K85-1.yaff
convert.py ROMs/KC85rom.bin --from raw --load-offset 30111 --load-numchars 128 --load-first-codepoint 128 --load-cell 8,6 | modify.py rotate --turns 3 > K85-2.yaff
convert.py ROMs.zip/T200rom.bin --from raw --load-offset 36963 --load-numchars 224 --load-first-codepoint 32 | modify.py mirror | modify.py crop --right 2 | modify.py set --name Tandy-200 > T200.yaff
I still need to expand the 5x8 fonts with an empty column to the right, as the display showed them in 6x8 cells (per the emulator screenshot you shared in the top post). And ideally map the glyphs to unicode.
For the FX-80 printer, that's a beautiful font, though I need to think about if/how I want to include it. The printer could make half-pixel offsets which in the file you found seems to be encoded by taking two bits for a single pixel width. This site has a very nice vectorised version of the FX-80 font: http://const-iterator.de/fxmatrix/ alongside sourceforge sfd
font files. (It may be that Virtual T's developers took it from there, not sure). I think sfd
can encode bitmap strikes, as can ttf and the likes, but monobit doesn't - yet - support these.
The model 100 character map looks like a variant of that of the TRS-80 Model 4a: https://www.kreativekorp.com/charset/encoding/TRS80Model4aAlternate
I don't have a Model 100 to Unicode mapping handy, but I do have such a thing for the Tandy 200 (same as Tandy 102). It was originally created by @dawidi for a "European Model 100" (which apparently has the same font as a Tandy 200). I transformed it into the charmap(5) format for use with automatic transliteration (LOCALE, iconv, gconv).
Am I correct that the TRS-80 Model 100 font is missing? Or is it filed under the name of one of the similar, but less popular, systems? ("Kyocera Kyotronic 85", "NEC 8201", "Olivetti M10", and possibly others.)
If it is missing, are you accepting submissions? And would you want the different variants that existed?
There were at least three variants for the US Model 100:
Possibly other related machines would be filed together:
Here is an image of the font from a Model 100 emulated in a web browser at http://bitchin100.com/CloudT/
I do not know if that image is pixel accurate, but it should be. The machines did not have a character generator, so the pixels had to be drawn by the ROM.