TRS-80 Fonts and Unicode

Rebecca Bettencourt has done a wonderful job creating True Type fonts of the Model I, Model III and Model 4 characters. Go grab them from her site and use them as you like, but do give credit wherever possible.

The Fonts

The fonts have all the characters from the original machines plus some extra to make them more conventionally useful. The uppercase Model I font does include lowercase characters but without descenders so you can get the unique look of a Model I partially upgraded to lowercase. And there are some characters that were in the machine but otherwise not accessible.

The Model III fonts have characters from two different revisions. The only difference is in the halfwidth Katakana characters which correct some apparent mistakes in shape.

For the Model 4 the original version is mostly the same as the Model III and the "International" version replaces the halfwidth Katakana and some other characters with a broader set of European language characters. It also includes inverse versions of those characters that could be displayed inverted. While the Model 4 was largely compatible with the Model III, the 64 and 32 wide fonts are a bit squished to reflect how they appeared in Model III mode on the Model 4. The 80 and 40 wide fonts have the bottom of their graphics characters chopped off mimicing the original display.

ModelVersionAspect RatioFont File
I Original Uppercase Normal (64 columns)AnotherMansTreasureMIA64C2X3Y.ttf
Double-Wide (32 columns)AnotherMansTreasureMIA32C4X3Y.ttf
1:2AnotherMansTreasureMIA2Y.ttf
1:1AnotherMansTreasureMIARaw.ttf
Lowercase Mod Normal (64 columns)AnotherMansTreasureMIB64C2X3Y.ttf
Double-Wide (32 columns)AnotherMansTreasureMIB32C4X3Y.ttf
1:2AnotherMansTreasureMIB2Y.ttf
1:1AnotherMansTreasureMIBRaw.ttf
III Original + Revised Normal (64 columns)AnotherMansTreasureMIII64C.ttf
Double-wide (32 columns)AnotherMansTreasureMIII32C.ttf
4 Original Normal (64 columns)AnotherMansTreasureM4A64C.ttf
Double-wide (32 columns)AnotherMansTreasureM4A32C.ttf
Normal (80 columns)AnotherMansTreasureM4A80C.ttf
Double-wide (40 columns)AnotherMansTreasureM4A40C.ttf
1:2AnotherMansTreasureM4A2Y.ttf
1:1AnotherMansTreasureM4ARaw.ttf
International Normal (64 columns)AnotherMansTreasureM4B64C.ttf
Double-wide (32 columns)AnotherMansTreasureM4B32C.ttf
Normal (80 columns)AnotherMansTreasureM4B80C.ttf
Double-wide (40 columns)AnotherMansTreasureM4B40C.ttf
1:2AnotherMansTreasureM4B2Y.ttf
1:1AnotherMansTreasureM4BRaw.ttf

Basic Usage

Modern browsers can import True Type fonts. Thus I can use them if I want my words to have that old, familiar look or to show a screen shot of "Bee Wary!":
 Bee Wary!  
                                                            
                                                            
                                                            
                                                          
                                                    
                                                  
                                                         
                                                            
                                                   
                                                
                                             
                                             
                                              
 
 
All you need to do is put this in a <STYLE> ... </STYLE> block or a CSS (Cascading Style Sheet).
@font-face {
	font-family: 'TreasureMIII64C';
	src: url('AnotherMansTreasureMIII64C.ttf');
}
And then you can change to the TRS-80 font in the usual HTML fashion by adding STYLE="font-family: 'TreasureMIII64C'; font-size: 24;" to any tag.

Translating

Letters and other standard ASCII characters are the same between the TRS-80 and the fonts. Graphics characters (128 - 192) and special characters (0 - 31 and 192 - 255) are another matter. Where possible the fonts use the proper Unicode number for these characters but some special characters and all the graphics characters have no correpsonding Unicode character.

For your own use or within a program there's an easy solution. The fonts have all the original TRS-80 characters in-order in the private use area as characters 0xe000 to 0xe0ff. Suppose you have a screen dump from the TRS-80. Simply put 0xe0 after every byte and you'll have a UTF-16 file that will display exactly as it did on the TRS-80. In HTML you can avoid UTF-16 and get at the characters with numeric entities. Suppose we have graphic character 153 (). The private use area starts at 57344 which means character 153 is at 57344 + 153 = 57497. To get that character I can write &#57497;. Or if you're more comfortable with hexadecimal, note that 153 = 0x99 and use &#xE099; instead.

However, there are more than 256 characters. The Model III had 320 different characters it could display and the Model 4 had 448 when you account for the inverted versions. And there are even more characters when the various machine versions are considered. Here is the full story on the private use area of the fonts:

Proper Translation

Translating TRS-80 characters to the private use area is effective but wrong if you're trying to share with others. Instead, the characters should be translated to the proper Unicode code points. That way text will still have the same meaning even if a non-TRS-80 font is used. There are some characters that have no Unicode equivalent, but at least most of the meaning will be preserved.

Best to look at the translation C table I created: m3unicode.c. It discusses some alternate translations that may be appropriate. I have yet to create a translation table for Model I or Model 4 characters but will add them here if I do so.

I'll close out here with a full table showing how the Model III characters map to Unicode. A handy reference and I think it gives a good feel for how the mapping works.

0 &#x20;
1£&#xa3;£
2|&#x7c;|
3é&#xe9;é
4Ü&#xdc;Ü
5Å&#xc5;Å
6¬&#xac;¬
7ö&#xf6;ö
8Ø&#xd8;Ø
9ù&#xf9;ù
10ñ&#xf1;ñ
11`&#x60;`
12ā&#x101;ā
13&#xe00d;n/a
14Ä&#xc4;Ä
15Ã&#xc3;Ã
16Ñ&#xd1;Ñ
17Ö&#xd6;Ö
18Ø&#xd8;Ø
19Õ&#xd5;Õ
20ß&#xdf;ß
21ü&#xfc;ü
22õ&#xf5;õ
23æ&#xe6;æ
24ä&#xe4;ä
25à&#xe0;à
26ȧ&#x227;ȧ
27&#xe01b;n/a
28É&#xc9;É
29Æ&#xc6;Æ
30Ç&#xc7;Ç
31˜&#x2dc;˜
32 &#x20;
33!&#x21;!
34"&#x22;"
35#&#x23;#
36$&#x24;$
37%&#x25;%
38&&#x26;&
39'&#x27;'
40(&#x28;(
41)&#x29;)
42*&#x2a;*
43+&#x2b;+
44,&#x2c;,
45-&#x2d;-
46.&#x2e;.
47/&#x2f;/
480&#x30;0
491&#x31;1
502&#x32;2
513&#x33;3
524&#x34;4
535&#x35;5
546&#x36;6
557&#x37;7
568&#x38;8
579&#x39;9
58:&#x3a;:
59;&#x3b;;
60<&#x3c;<
61=&#x3d;=
62>&#x3e;>
63?&#x3f;?
64@&#x40;@
65A&#x41;A
66B&#x42;B
67C&#x43;C
68D&#x44;D
69E&#x45;E
70F&#x46;F
71G&#x47;G
72H&#x48;H
73I&#x49;I
74J&#x4a;J
75K&#x4b;K
76L&#x4c;L
77M&#x4d;M
78N&#x4e;N
79O&#x4f;O
80P&#x50;P
81Q&#x51;Q
82R&#x52;R
83S&#x53;S
84T&#x54;T
85U&#x55;U
86V&#x56;V
87W&#x57;W
88X&#x58;X
89Y&#x59;Y
90Z&#x5a;Z
91[&#x5b;[
92\&#x5c;\
93]&#x5d;]
94^&#x5e;^
95_&#x5f;_
96`&#x60;`
97a&#x61;a
98b&#x62;b
99c&#x63;c
100d&#x64;d
101e&#x65;e
102f&#x66;f
103g&#x67;g
104h&#x68;h
105i&#x69;i
106j&#x6a;j
107k&#x6b;k
108l&#x6c;l
109m&#x6d;m
110n&#x6e;n
111o&#x6f;o
112p&#x70;p
113q&#x71;q
114r&#x72;r
115s&#x73;s
116t&#x74;t
117u&#x75;u
118v&#x76;v
119w&#x77;w
120x&#x78;x
121y&#x79;y
122z&#x7a;z
123{&#x7b;{
124|&#x7c;|
125}&#x7d;}
126~&#x7e;~
127±&#xb1;±
128&#xe080;n/a
129&#xe081;n/a
130&#xe082;n/a
131&#xe083;n/a
132&#xe084;n/a
133&#xe085;n/a
134&#xe086;n/a
135&#xe087;n/a
136&#xe088;n/a
137&#xe089;n/a
138&#xe08a;n/a
139&#xe08b;n/a
140&#xe08c;n/a
141&#xe08d;n/a
142&#xe08e;n/a
143&#xe08f;n/a
144&#xe090;n/a
145&#xe091;n/a
146&#xe092;n/a
147&#xe093;n/a
148&#xe094;n/a
149&#xe095;n/a
150&#xe096;n/a
151&#xe097;n/a
152&#xe098;n/a
153&#xe099;n/a
154&#xe09a;n/a
155&#xe09b;n/a
156&#xe09c;n/a
157&#xe09d;n/a
158&#xe09e;n/a
159&#xe09f;n/a
160&#xe0a0;n/a
161&#xe0a1;n/a
162&#xe0a2;n/a
163&#xe0a3;n/a
164&#xe0a4;n/a
165&#xe0a5;n/a
166&#xe0a6;n/a
167&#xe0a7;n/a
168&#xe0a8;n/a
169&#xe0a9;n/a
170&#xe0aa;n/a
171&#xe0ab;n/a
172&#xe0ac;n/a
173&#xe0ad;n/a
174&#xe0ae;n/a
175&#xe0af;n/a
176&#xe0b0;n/a
177&#xe0b1;n/a
178&#xe0b2;n/a
179&#xe0b3;n/a
180&#xe0b4;n/a
181&#xe0b5;n/a
182&#xe0b6;n/a
183&#xe0b7;n/a
184&#xe0b8;n/a
185&#xe0b9;n/a
186&#xe0ba;n/a
187&#xe0bb;n/a
188&#xe0bc;n/a
189&#xe0bd;n/a
190&#xe0be;n/a
191&#xe0bf;n/a
192&#x2660;
193&#x2665;
194&#x2666;
195&#x2663;
196&#x263a;
197&#x2639;
198&#x2264;
199&#x2265;
200α&#x3b1;α
201β&#x3b2;β
202γ&#x3b3;γ
203δ&#x3b4;δ
204ε&#x3b5;ε
205ζ&#x3b6;ζ
206η&#x3b7;η
207θ&#x3b8;θ
208ι&#x3b9;ι
209κ&#x3ba;κ
210λ&#x3bb;λ
211μ&#x3bc;μ
212ν&#x3bd;ν
213ξ&#x3be;ξ
214ο&#x3bf;ο
215π&#x3c0;π
216ρ&#x3c1;ρ
217σ&#x3c3;σ
218τ&#x3c4;τ
219υ&#x3c5;υ
220φ&#x3c6;φ
221χ&#x3c7;χ
222ψ&#x3c8;ψ
223ω&#x3c9;ω
224&#x2126;
225&#x221a;
226÷&#xf7;÷
227&#x2211;
228&#x2248;
229&#x2206;
230&#x2307;
231&#x2260;
232&#x2301;
233&#xe0e9;n/a
234&#x237e;
235&#x221e;
236&#x2713;
237§&#xa7;§
238&#x2318;
239©&#xa9;©
240¤&#xa4;¤
241&#xb6;
242¢&#xa2;¢
243®&#xae;®
244&#xe0f4;n/a
245&#xe0f5;n/a
246&#xe0f6;n/a
247&#x211e;
248&#x2105;
249&#x2642;
250&#x2640;
251&#xe0fb;n/a
252&#xe0fc;n/a
253&#xe0fd;n/a
254&#xe0fe;n/a
255&#x2302;
192¥&#xa5;¥
193&#xff61;
194&#xff62;
195&#xff63;
196&#xff64;
197&#xff65;
198&#xff66;
199&#xff67;
200&#xff68;
201&#xff69;
202&#xff6a;
203&#xff6b;
204&#xff6c;
205&#xff6d;
206&#xff6e;
207&#xff6f;
208&#xff70;
209&#xff71;
210&#xff72;
211&#xff73;
212&#xff74;
213&#xff75;
214&#xff76;
215&#xff77;
216&#xff78;
217&#xff79;
218&#xff7a;
219&#xff7b;
220&#xff7c;
221&#xff7d;
222&#xff7e;
223ソ&#xff7f;ソ
224&#xff80;
225&#xff81;
226&#xff82;
227&#xff83;
228&#xff84;
229&#xff85;
230&#xff86;
231&#xff87;
232&#xff88;
233&#xff89;
234&#xff8a;
235&#xff8b;
236&#xff8c;
237&#xff8d;
238&#xff8e;
239&#xff8f;
240&#xff90;
241&#xff91;
242&#xff92;
243&#xff93;
244&#xff94;
245&#xff95;
246&#xff96;
247&#xff97;
248&#xff98;
249&#xff99;
250&#xff9a;
251&#xff9b;
252&#xff9c;
253&#xff9d;
254&#xff9e;
255&#xff9f;


George Phillips, December 24, 2021. george -at- 48k.ca