Classic Computer Magazine Archive COMPUTE! ISSUE 71 / APRIL 1986 / PAGE 97

Atari FontMaker

Charles Brannon, Program Editor

"FontMaker" simplifies the design of character sets for all text modes on Atari 400/800, XL, and XE computers. Although programmers will find FontMaker a valuable addition to their utility library, nonprogrammers can also benefit. Next month, we show how to use FontMaker to customize Atari SpeedScript's special character set. Whether you want Old English or a computer age font, FontMaker has the tools you need to express your creativity. It requires at least 16K RAM; disk drive recommended.


"FontMaker" is a sophisticated character editor written completely in machine language to work with all Atari text modes. Even though a character set (or font) editor is a handy utility for programmers, you don't need to know anything about machine language or programming to have fun with it. We include a simple subroutine that lets you load and merge character sets with your own BASIC programs. And next month, we'll show how to use the special ANTIC 3 character sets with the Atari version of our SpeedScript word processor (COMPUTE!, March 1986).
    Since FontMaker is written in machine language for speed and compactness, you need to type it in with MLX, our machine language editor. See the MLX article elsewhere in this issue for instructions on typing in and using MLX to enter machine language programs. When you run MLX, answer the first three screen prompts like this:

Starting Address: 12288
Ending Address: 14887
Run/Init Address: 12288

    Next you'll be asked "Tape or Disk?". Although FontMaker can load as a boot tape, it's much easier to use with a disk drive. If you press D for Disk, you'll be asked "Boot Disk or Binary File?". Press F to select binary file. FontMaker will run from a boot disk, but without DOS, there's no way to save or load character sets. So make sure you select F, since MLX can't convert from a boot disk to a binary file.
    At the first screen prompt, 12288:, start typing the data from Program 1. See the MLX article for a list of commands that let you type in a program in several sessions. When you've typed the last line, MLX prompts you for a disk filename. This will be the name under which FontMaker is saved to disk. If you're using Atari DOS 2.0S, 2.5, or 3.0, you may use the filename AUTORUN.SYS. This allows FontMaker to automatically load and run when you turn on the computer with the disk in the drive. Be sure this disk also contains the DOS files.
    If you want to prevent loading FontMaker automatically (especially if you haven't finished typing it but want to save your preliminary typing), you can rename AUTORUN.SYS to some other name. You can also load FontMaker from DOS 2.0S or 2.5 with menu selection L. If you're using another DOS, such as OS/A+ or DOS XL, you may be able to save FontMaker with a different name, such as FONT.COM and type the command FONT to run FontMaker.

Editing Characters
Assuming you've typed in and saved FontMaker, run it and follow along with this article. You'll see a screen with a colorful 8 X 8 grid, a list of brief instructions, and four rows of characters at the bottom of the screen (see screen photo).
    When FontMaker starts, it asks you to pick a character. You can edit one character at a time. When you're asked to select a character, you can use the joystick to move a cursor around in the four rows of characters, then press the fire button to select the character highlighted by the cursor. Or you can simply press the keyboard key corresponding to the character. Action then shifts to the 8 X 8 character editing grid.
    Within the grid, you can move the editing cursor (a hollow white box) with either the joystick or the cursor keys. You don't need to use CTRL with the cursor keys to move the cursor-CTRL-cursor up/ down/ left/right and SHIFT-cursor up/down/left/right are reserved for other features. When drawing in the character grid, press the fire button or the space bar to reverse (toggle) the dot at the cursor position. Previously set dots are turned off, and blank spaces are turned on. You can hold down the fire button while you move the joystick to draw lines and figures.

Atari FontMaker screen
"Atari FontMaker" lets you design your own
custom character fonts for any Atari text mode.


    As you change the grid, you can see the character in actual size in the character set window. The cursor highlights (reverses) the selected character, but a row of the character you're editing is also displayed. In addition, there's a sample of text ("The quick brown fox jumped over the lazy dogs") so you can judge relative character height and spacing.
    To create an entirely new character, you may want to start by pressing SHIFT-CLEAR to erase the existing character pattern. This gives you a clean canvas for your design.

Undo Your Mistakes
If you don't like a change you've made, press U to undo all the changes made since you've selected the character. Press U again to undo the undo, restoring the change you've made. You can press F to fix a character, recopying its image from the standard character set stored in the computer's Read Only Memory (ROM). It's important to distinguish between these options: U reverts to the previous character image, F always gives you the ROM image. If you change the letter A to a spaceship, change B to a rocket, then go back to A and change the spaceship to an alien, U switches between the alien and the spaceship; F gives you the pattern for the letter A. Beware that you can't undo the Fix command.
    If you hold down the OPTION button while pressing F, the entire character set is fixed, recopied from ROM. This wipes out any changes you have made to the character set, so be careful.
    To select another character to edit, press P and use the joystick or keyboard to pick the new character. In some text modes (see the G command below), the joystick cursor may seem to move strangely. It consistently moves up or down between rows of 32 characters. Since there are only 20 characters per line in modes 1 and 2, these rows wrap around the right margin. You move left and right within a row of characters, and up and down between rows of 32 characters.
    FontMaker can display the character set in all Atari text modes. These are GRAPHICS 0 (the de fault text mode), "GRAPHICS 0½" (technically known as ANTIC 3, a nine-line true-descender mode), multicolor ANTIC mode 4, multicolor ANTIC mode 5, GRAPHICS 1, and GRAPHICS 2. Press G to cycle through these modes.

The SpeedScript Character Mode
If you've never heard of the ANTIC text modes, don't fret; they're not normally accessible from BASIC. The Atari SpeedScript word processor (and, incidentally, the PaperClip word processor from Batteries Included) uses the ANTIC 3 mode for large, readable characters. ANTIC 3, nicknamed GRAPHICS 0½, is a special 40-column mode that lets you define characters within an 8 X 10 character space. Other Atari text modes have only an 8 X 8 character grid. This means that ANTIC 3 characters can have true descenders. (A descender is the part of a character that drops below the line of type, such as the tail on a lowercase y or j.)
    You still use just eight rows to define a character in ANTIC 3, but the character is positioned within ten screen scan lines. For uppercase characters, the eight rows of the character grid are displayed in rows 1-8 of the character matrix, with two blank lines at the bottom of each character, reserving space for lowercase descenders. For lowercase characters, the first two lines of the character grid are forced blank. The first two rows of the character definition are actually displayed at lines 9 and 10 of the character space, making it easy to reserve space for the descenders. The third through eighth rows of the character are displayed starting at the third line of the character space.
    This may sound confusing, but fortunately FontMaker lets you design ANTIC 3 characters without having to mentally translate what you see on the grid to what the character should look like. (However, the Rotate option seems to work strangely in this mode due to the unusual memory configuration used by ANTIC 3 characters.) Just be aware that lowercase characters are actually written two lines lower on the screen than uppercase characters. If you start with the normal character set, you'll need to use the roll and shift options to align the characters. Using the roll or shift commands (see below), roll the lowercase characters down two lines and all the uppercase characters down by one line. While you work, refer to the "quick brown fox" sentence to see that all the characters line up properly.
    Since there are forced blank lines for uppercase characters, you can use the lower seven lines to define a large character. Leave the top line blank if you want two-line descenders. The normal Atari character set only uses six columns for a character, giving two pixel spaces between each character on the screen. A larger character can use up to seven columns, leaving the last column blank to keep characters from running into each other. When designing some character sets, though, such as a cursive script, you may want characters to connect together, so you can use the full horizontal space.
    You can press the CTRL-cursor keys to roll the character within the grid. Pixels that are pushed off the edge of the grid wrap around to the opposite side. This is especially useful for those ANTIC 3 characters. If you press SHIFT with the cursor keys, the pixels that are shifted off the edge of the grid are lost. This can be used to crop a character, or quickly erase a certain column or row. Just roll the character until the column or row you want to erase is at the edge of the grid, then shift the character to push away the pixels.
    Other special commands: Press I to invert the character, reversing all the pixels within the grid. R rotates the characters 90 degrees (turns the pattern on its side). Press R twice to turn a character upside-down. M gives you a left-to-right mirror image of the character, as if you picked up the character, flipped it on its back, and put it back down.
    Press C to copy the character you're editing to a new position in the character set. The current character replaces the character you select with the joystick or keyboard. Be careful with this, since you can unintentionally erase a cherished character. After the copy, the character you copied to is selected for editing.

Saving And Loading
When you're ready to save your character set, just press S, then type in a legal Atari filename at the prompt:

Save (Device:Filename>

Include the D: for disk or C: for cassette. You can't save to the E: (screen editor) or S: (screen) devices, so if you forget the drive specification and your filename begins with E or S, FontMaker cancels the save. If you selected the save command by mistake and want to cancel it, just press RETURN when asked for the filename.
    To load a character set into FontMaker, press L and enter the filename you used to save the character set. This will replace the character set in memory, so be sure to save the one you're working on if you want to keep it. Again, if you select this command by mistake, press RETURN at the prompt to cancel the load.
    FontMaker is compatible with character sets created with "SuperFont" (originally published in COMPUTE!, January 1982, and also found in the First Book of Atari Graphics). FontMaker sets are also compatible with many other Atari character editors. We found that a FontMaker set can be loaded into the popular Instedit editor if you use a filename extension of SET. Character sets created with the Iridis Fontedit also work with FontMaker.
    If FontMaker can't save or load a character set due to a bad filename or problem with the disk, it displays the message I/O ERROR: PRESS RETURN. Press RETURN and try the save again, after you've figured out what went wrong.
    When you're done editing characters, press the ESC (escape) key to exit FontMaker to DOS. Be sure you've saved the character set you're working on if you want to keep it.

Using Fonts With BASIC
The Bytes option in FontMaker is primarily for programmers who want a list of the eight numbers that define a character, handy for changing just a single character in a program. But if you want to include an entire character set in your program, copying down these numbers can be tedious. Instead, you can use the two BASIC programs below, Programs 1 and 2, to add redefined character sets to BASIC.
    Program 2, "Fontloader," is a subroutine you can merge with your BASIC program to load the character set into memory from disk. Just change the filename in line 1010 to the filename of your character set. The program loads the character set at the memory location CHSET, which is defined as eight pages back from the top of memory (location 106). Change this if you want to put your character set somewhere else. If a GRAPHICS command resets the character set, you can use POKE 756,CHSET/256 to re-point the character set vector to your RAM character set. Use POKE 756,224 to display the ROM character set, located at memory location 57344 ($E000).
    If you're using a Translator type of program on XL and XE computers, you can change CHSET (line 1030) to 57344 to load the character set directly into the RAM space corresponding to the position of the ROM character set. This keeps the character set in memory until you turn off the machine.
    Use Program 3, "Character Set Datamaker," if you'd rather store your character set as part of your program in DATA statements. The Datamaker actually creates another program that you can merge with your own program. It creates DATA statements for only those characters that have been changed from the ROM image. Datamaker asks for the filename of your character set and a filename you'd like to use for the program it creates.
    After using Datamaker, type NEW and use ENTER to load the program created by Datamaker. As with Program 2, you can change CHSET in the program created by Datamaker if you want to determine yourself where the character set should go in memory. The program created by Datamaker copies the ROM set down to RAM (at CHSET), POKES in the new characters, and switches the character pointer at 756 to the new set. Again, you can use POKE 756, CHSET/256 to reenable the set if your program somehow resets this pointer.
    Next month we'll provide a program that lets you install an ANTIC 3 character set into your copy of SpeedScript, along with tips for creating readable characters and for using special characters for printer effects.


Program 1: FontMaker
Please refer to the "MLX" article in this issue before entering the following listing.

12288:169,125,032,096,054,032,252
12294:187,053,032,009,054,032,117
12300:062,050,032,108,050,032,090
12306:045,048,169,001,141,194,104
12312:048,032,242,048,032,113,027
12318:048,032,017,049,076,083,079
12324:051,169,064,160,048,032,048
12330:130,054,096,032,037,048,183
12336:169,012,133,082,169,137,238
12342:160,052,032,145,054,169,154
12348:002,133,082,096,070,111,042
12354:110,116,077,097,107,101,162
12360:114,032,098,121,032,067,024
12366:104,097,114,108,101,115,205
12372:032,066,114,097,110,110,101
12378:111,110,000,173,202,048,222
12384:201,003,208,010,173,194,117
12390:048,201,096,144,003,169,251
12396:000,096,169,001,096,032,246
12402:093,048,208,006,032,202,191
12408:054,032,202,054,169,128,247
12414:009,024,133,203,173,198,098
12420:048,009,002,133,204,162,178
12426:000,160,000,189,169,048,192
12432:145,203,200,152,041,003,120
12438:208,245,232,224,008,208,251
12444:240,032,093,048,208,006,015
12450:032,252,054,032,252,054,070
12456:096,000,000,000,000,000,008
12462:000,000,000,000,000,000,174
12468:000,000,000,000,000,000,180
12474:000,000,000,000,000,000,186
12480:000,000,000,000,000,000,192
12486:000,000,000,000,002,000,200
12492:000,000,000,000,169,000,117
12498:133,204,173,194,048,010,204
12504:038,204,010,038,204,010,208
12510:038,204,024,133,207,109,169
12516:195,048,133,203,165,204,152
12522:133,208,109,196,048,133,037
12528:204,096,032,208,048,160,220
12534:007,177,203,153,169,048,235
12540:153,177,048,136,016,245,003
12546:096,032,208,048,160,007,041
12552:185,169,048,145,203,136,126
12558:016,248,096,165,088,024,139
12564:105,228,133,203,165,089,175
12570:105,001,133,204,169,000,126
12576:141,193,048,162,004,173,241
12582:202,048,201,006,144,002,129
12588:162,002,160,000,173,193,222
12594:048,205,194,048,208,002,243
12600:009.128,145.203.238.193.204
12606:048,200,192,032,208,236,210
12612:024,165,203,105,040,133,226
12618:203,165,204,105,000,133,116
12624:204,202,208,218,173,202,007
12630:048,201,005,176,014,160,178
12636:000,185,119,049,201,010,144
12642:240,007,145,203,200,208,077
12648:244,160,000,200,173,194,051
12654:048,145,203,200,192,070,200
12660:144,245,096,052,104,101,090
12666:000,113,117,105,099,107,151
12672:000,098,114,111,119,110,168
12678:000,102,111,120,000,106,061
12684:117,109,112,101,100,000,167
12690:111,118,101,114,000,000,078
12696:000,000,000,000,000,000,152
12702:000,116,104,101,000,108,075
12708:097,122,121,000,100,111,203
12714:103,115,014,010,000,000,156
12720:000,000,000,033,225,001,179
12726:000,031,223,255,000,032,211
12732:224,000,080,105,099,107,035
12738:032,097,032,099,104,097,143
12744:114,097,099,116,101,114,073
12750:046,046,046,000,169,190,191
12756:160,049,032,130,054,032,157
12762:017,049,032,242,048,032,126
12768:113,048,173,132,002,240,164
12774:042,173,252,002,201,255,131
12780:208,043,174,120,002,189,204
12786:174,049,240,236,032,112,061
12792:053,142,031,208,024,109,047
12798:194,048,041,127,174,202,016
12804:048,224,006,144,002,041,213
12810:063,141,194,048,076,217,237
12816:049,173,132,002,240,251,095
12822:076,059,050,032,029,058,070
12828:041,127,201,096,176,013,170
12834:201,032,176,006,024,105,066
12840:064,076,047,050,056,233,054
12846:032,141,194,048,032,017,254
12852:049,032,242,048,032,113,056
12858:048,076,037,048,165,106,026
12864:056,233,016,133,204,141,079
12870:196,048,169,000,133,203,051
12876:141,195,048,141,194,048,075
12882:133,205,169,224,133,206,128
12888:160,000,177,205,145,203,210
12894:200,208,249,230,204,230,135
12900:206,165,206,201,229,208,035
12906:239,096,169,046,141,047,076
12912:002,169,003,141,029,208,152
12918:169,001,141,111,002,173,203
12924:196,048,056,233,004,141,034
12930:198,048,141,007,212,169,137
12936:000,141,197,048,162,011,183
12942:157,255,207,202,208,250,141
12948:173,198,048,133,204,173,053
12954:197,048,133,203,162,004,133
12960:160,000,152,145,203,200,252
12966:208,251,230,204,202,208,189
12972:246,024,169,128,133,209,057
12978:169,000,133,203,173,198.030
12984:048,009,003,133,204,133,202
12990:210,169,170,133,207,160,215
12996:024,165,207,145,203,073,245
13002:255,145,209,200,152,041,180
13008:003,208,006,165,207,073,102
13014:255,133,207,192,056,208,241
13020:232,169,056,141,001,208,003
13026:141,002,208,141,003,208,161
13032:169,003,141,009,208,141,135
13038:010,208,141,011,208,169,217
13044:014,141,192,002,169,090,084
13050:141,193,002,169,200,141,072
13056:194,002,169,038,141,195,227
13062:002,096,173,200,048,141,154
13068:000,208,173,198,048,009,136
13074:002,133,204,160,000,152,157
13080:170,133,203,145,203,200,054
13086:016,251,172,199,048,189,137
13092:047,051,145,203,200,232,146
13098:224,004,208,245,096,240,035
13104:144,144,240,000,000,000,064
13110:000,000,001,001,001,000,057
13116:255,255,255,000,000,000,057
13122:000,000,000,000,000,000,066
13128:001,255,000,000,001,255,072
13134:000,000,001,255,000,169,247
13140:056,141,200,048,169,024,210
13146:141,199,048,032,008,051,057
13152:174,120,002,142,201,048,015
13158:224,015,240,064,169,004,050
13164:133,207,141,031,208,165,225
13170:020,197,020,240,252,174,249
13176:201,048,189,051,051,024,172
13182:109,200,048,201,056,144,116
13188:007,201,085,176,003,141,233
13194:200,048,189,067,051,024,205
13200:109,199,048,201,024,144,101
13206:007,201,053,176,003,141,219
13212:199,048,032,008,051,198,180
13218:207,165,207,208,202,032,159
13224:112,053,173,252,002,201,193
13230:255,208,085,173,132,002,005
13236t208,170,056,173,199,048,010
13242:233,024,074,074,168,032,023
13248:093,048,208,014,192,006,241
13254:176,005,200,200,076,210,041
13260:051,152,056,233,006,168,102
13266:173,200,048,056,233,056,208
13272:074,074,170,232,056,169,223
13278:000,106,202,208,252,089,055
13284:169,048,153,169,048,032,079
13290:167,054,032,016,055,173,219
13296:201,048,201,015,208,005,150
13302:162,200,032,114,053,076,115
13308:093,051,169,000,141,000,194
13314:208,076,037,048,032,029,176
13320:058,201,097,144,007,201,204
13326:123,176,003,056,233,032,125
13332:174,058,052,221,058,052,123
13338:240,006,202,208,248,076,238
13344:096,051,202,138,010,170,187
13350:169,051,072,169,092,072,151
13356:189,086,052,072,189,085,205
13362:052,072,169,000,141,000,228
13368:208,096,026,045,061,043,023
13374:042,028,029,030,031,032,254
13380:027,080,125,095,124,092,099
13386:094,071,073,085,070,077,032
13392:082,083,076,067,066,092,034
13398:055,099,055,106,055,113,057
13404:055,194,054,244,054,060,241
13410:055,076,055,181,051,121,125
13416:055,209,049,142,055,173,019
13422:054,223,054,036,055,048,068
13428:055,155,053,156,055,173,251
13434:055,196,055,005,056,028,005
13440:056,183,056,246,056,185,142
13446:057,218,057,155,155,027,035
13452:028,027,029,027,030,027,052
13458:031,032,195,212,210,204,006
13464:045,027,028,027,029,027,079
13470:030,027,031,032,211,200,177
13476:201,198,212,045,027,028,107
13482:027,029,027,030,027,031,085
13488:155,211,208,193,195,197,055
13494:032,084,111,103,103,108,211
13500:101,032,032,032,032,195,100
13506:204,197,193,210,032,066,072
13512:106,097,110,107.155,199,208
13518:032,071,114,097,112,104,224
13524:105,099,115,032,077,111,239
13530:100,101,032,208,032,060,003
13536:105,099,107,155,201,032,155
13542:073,110,118,101,114,115,093
13548:101,032,032,032,032,032,241
13554:032,032,213,032,085,110,234
13560:100,111,155,198,032,070,146
13566:105,120,032,032,032,032,095
13572:032,032,207,208,212,201,128
13578:207,206,045,070,032,070,128
13584:105,120,032,097,108,108,074
13590:155,210,032,082,111,116,216
13596:097,116,101,032,032,032,182
13602:032,032,032,032,032,205,143
13608:032,077,105,114,114,111,081
13614:114,155,195,032,067,111,208
13620:112,121,032,032,032,032,157
13626:032,032,032,032,032,032,250
13632:194,032,066,121,116,101,182
13638:115,155,211,032,083,097,251
13644:118,101,032,102,111,110,138
13650:116,032,032,032,032,032,102
13656:204,032,076,111,097,100,196
13662:155,197,211,195,032,069,185
13668:120,105,116,032,116,111,188
13674:032,068,079,083,000,000,112
13680:162,090,160,000,136,208,100
13686:253,202,208,250,096,024,127
13692:165,088,105,228,133,203,022
13698:133,209,165,089,105,001,064
13704:133,204,133,210,162,002,212
13710:169,000,168,145,203,200,003
13716:208,251,230,204,202,208,171
13722:246,096,032,123,053,238,174
13728:202,048,173,202,048,201,010
13734:008,144,005,169,002,141,123
13740:202,048,032,187,053,032,214
13746:242,048,032,113,048,032,181
13752:017,049,096,173,048,002,057
13758:133,203,173,049,002,133,115
13764:204,160,003,169,194,145,047
13770:203,160,016,169,134,145,005
13776:203,200,169,006,145,203,110
13782:200,173,202,048,145,203,161
13788:200,192,022,208,249,201,012
13794:006,240,004,201,005,176,090
13800:017,169,016,145,203,173,187
13806:202,048,200,145,203,200,212
13812:145,203,200,145,203,200,060
13BIB:169,065,145,203,165,203,176
13824:200,145,203,165,204,200,093
13830:145,203,096,169,064,141,056
13836:014,212,169,030,141,000,066
13842:002,169,054,141,001,002,131
13848:169,192,141,014,212,096,080
13854:072,138,072,173,011,212,196
13860:201,032,176,011,169,000,113
13866:141,010,212,141,024,208,010
13B72t076.087.054.141.010,212,116
13878:173,202,048,201,004,144,058
13884:009,173,198,002,141,024,095
13890:208,076,081,054,162,005,140
13896:189,090,054,157,021,208,023
13902:202,208,247,173,196,048,128
13908:141,009,212,104,170,104,056
13914:064,076,002,010,254,008,248
13920:140,203,048,162,000,142,023
13926:072,003,142,073,003,160,043
13932:011,140,066,003,032,086,190
13938:228,172,203,048,096,160,253
13944:000,152,145,088,200,192,129
13950:040,208,249,096,072,152,175
13956:072,169,002,133,085,032,113
13962:119,054,133,084,104,168,032
13968:104,133,203,132,204,169,065
13974:001,141,240,002,160,000,182
13980:177,203,240,006,032,096,142
13986:054,200,208,246,096,032,230
13992:003,049,032,113,048,096,253
13998:032,202,054,162,007,032,151
14004:093,048,208,002,162,001,182
14010:169,000,157,169,048,032,249
14016:167,054,096,032,202,054,029
14022:032,167,054,096,173,169,121
14028:048,072,162,000,189,170,077
14034:048,157,169,048,232,224,064
14040:007,208,245,104,141,176,073
14046:048,096,032,252,054,162,098
14052:000,032,093,048,208,002,099
14058:162,002,169,000,157,169,125
14064:048,032,167,054,096,032,157
14070:252,054,032,167,054,096,133
14076:173,176,048,072,162,007,122
14082:189,168,048,157,169,048,013
14088:202,208,247,104,141,169,055
14094:048,096,169,020,141,000,232
14100:210,162,175,142,001,210,152
14106:160,128,136,208,253,202,089
14112:224,159,208,243,096,162,100
14118:007,030,169,048,202,208,190
14124:250,032,167,054,096,162,037
14130:007,094,169,048,202,208,010
14136:250,032,167,054,096,162,049
14142:007,189,169,048,010,062,035
14148:169,048,202,016,246,032,013
14154:167,054,096,162,007,189,237
14160:169,048,074,126,169,048,202
14166:202,016,246,032,167,054,035
14172:096,104,104,162,014,076,136
14178:099,051,104,104,162,013,119
14184:076,099,051,104,104,162,188
14190:011,076,099,051,104,104,043
14196:162,007,076,099,051,096,095
14202:169,064,141,014,212,169,123
14208:000,141,029,208,162,003,159
14214:157,000,208,202,016,250,199
14220:108,010,000,169,000,162,077
14226:007,157,169,048,202,016,233
14232:250,032,167,054,096,162,145
14238:007,189,169,048,073,255,131
14244:157,169,048,202,016,245,233
14250:032,167,054,096,162,007,176
14256:189,169,048,072,189,177,252
14262:048,157,169,048,104,157,097
14268:177,048,202,016,239,032,134
14274:167,054,096,169,008,141,061
14280:031,208,173,031,208,041,124
14286:007,201,003,208,018,032,163
14292:062,050,169,001,141,194,061
14298:048,032,242,048,032,017,125
14304:049,032,113,048,096,032,082
14310:208,048,165,207,133,203,170
14316:165,208,024,105,224,133,071
14322:204,162,000,160,000,177,177
14328:203,157,169,048,200,232,233
14334:224,008,208,245,032,167,114
14340:054,096,162,007,160,008,235
14346:169,000,094,169,048,042,020
14352:136,208,249,157,169,048,215
14358:202,016,239,032,167,054,220
14364:096,160,000,162,007,169,110
14370:000,030,169,048,042,202,013
14376:016,249,153,185,048,200,123
14382:192,008,208,237,162,007,092
14388:189,185,048,157,169,048,080
14394:202,016,247,032,167,054,008
14400:096,160,000,140,240,002,190
14406:169,032,032,096,054,169,110
14412:126,032,096,054,140,204,216
14418:048,032,029,058,172,204,113
14424:048,201,155,240,047,201,212
14430:126,240,032,041,127,201,093
14436:032,144,233,201,097,144,183
14442:007,201,123,176,003,056,160
14448:233,032,166,085,224,039,123
14454:240,216,153,128,005,032,124
14460:096,054,200,208,207,192,057
14466:000,240,203,032,096,054,243
14472:136,076,080,056,162,001,135
14478:142,240,002,032,096,054,196
14484:169,000,153,128,005,140,231
14490:204,048,173,128,005,096,040
14496:083,097,118,101,032,040,119
14502:068,101,118,105,099,101,246
14508:058,070,105,108,101,110,212
14514:097,109,101,041,062,000,076
14520:169,160,160,056,032,130,123
14526:054,032,065,056,240,024,149
14532:201,069,240,020,201,083,242
14538:240,016,032,111,057,169,059
14544:008,141,205,048,169,011,022
14550:141,206,048,032,030,057,216
14556:076,037,048,076,111,097,153
14562:100,032,040,068,101,118,173
14568:105,099,101,058,070,105,002
14574:108,101,110,097,109,101,096
14580:041,062,000,169,223,160,131
14586:056,032,130,054,032,065,107
14592:056,240,024,201,069,240,062
14598:020,201,083,240,016,032,086
14604:111,057,169,004,141,205,187
14610:048,169,007,141,206,048,125
14616:032,030,057,076,037,048,048
14622:169,128,157,068,003,169,212
14628:005,157,069,003,173,204,135
14634:048,157,072,003,169,000,235
14640:157,073,003,169,003,157,098
14646:066,003,173,205,048,157,194
14652:074,003,169,000,157,075,026
14658:003,032,086,228,048,050,001
14664:173,195,048,157,068,003,204
14670:173,196,048,157,069,003,212
14676:169,000,157,072,003,169,142
14682:004,157,073,003,173,206,194
14688:048,157,066,003,032,086,232
14694:228,048,017,032,111,057,083
14700:048,012,096,162,016,169,099
14706:012,157,066,003,032,086,214
14712:228,096,032,111,057,169,045
14718:136,160,057,032,130,054,183
14724:032,029,058,096,073,047,211
14730:079,032,069,082,082,079,049
14736:082,058,253,032,080,082,219
14742:069,083,083,032,210,197,056
14748:212,213,210,206,000,067,040
14754:111,112,121,032,116,111,253
14760:032,119,104,105,099,104,219
14766:032,099,104,097,114,097,205
14772:099,116,101,114,063,000,161
14778:162,007,189,169,048,157,150
14784:185,048,202,016,247,169,035
14790:161,160,057,032,214,049,103
14796:162,007,189,185,048,157,184
14802:169,048,202,016,247,032,156
14808:167,054,096,032,119,054,226
14814:162,000,134,085,142,207,184
14820:048,189,169,048,032,250,196
14826:057,174,207,048,232,224,152
14832:008,208,239,032,029,058,046
14838:032,037,048,096,133,212,036
14844:169,000,133,213,032,170,201
14850:217,032,230,216,160,000,089
14856:177,243,048,006,032,096,098
14862:054,200,208,246,041,127,122
14868:032,096,054,169,032,032,179
14874:096,054,096,173,037,228,198
14880:072,173,036,228,072,162,007
14886:000,096,224,002,225,002,075


Program 2: Fontloader
For instructions on entering this listing, please refer to "COMPUTE!'s Guide to Typing in Programs" in this issue of COMPUTE!.

JD 1000 REM FONTLOADER
FH 1010 OPEN #1,4,0,"D:SERIF
        .SET":REM YOUR FILEN
        AME HERE
HO 1020 X=16:REM FILENUM*16
NO 1025 DIM CID$(7):CIC$="hh
        h":CIO$(4)=CHR$(170)
        :CIO$(5)="LV":CIO$(7
        )=CHR$(228)
OD 1030 CHSET=(PEEK(106)-8)*
        256:POKE 756,CHSET/2
        56:REM ADDRESS OF CH
        ARACTER SET. TRY 57
        344 ON XL'S WITH TRA
        NSLATOR
IJ 1040 ICCOM=834:ICBADR=836
        :ICBLEN=840
MF 1050 POKE ICBADR+X+1,CHSE
        T/256:POKE ICBADR+X,
        0
NH 1060 POKE ICBLEN+X+1,4:PO
        KE ICBLEN+X,0
PG 1070 POKE ICCOM+X,7:A=USR
        (ADR(CIO$),X)
JD 1080 CLOSE #1
MB 1090 RETURN :REM REMOVE T
        HIS LINE TO USE THIS
         AS A STAND-ALONE PR
        OGRAM


Program 3: Character Set Datamaker
For instructions on entering this listing, please refer to "COMPUTE!'s Guide to Typing In Programs" In this issue Of COMPUTE!.
blue indicates inverse video

PB 100 OPEN #1,12,0,"E:"
KH 102 GRAPHICS 1+16
HI 105 DIM F$(14),OF$(14),T$
       (12),A(7)
OA 110 POSITION 3,0:? #6;"ch
       aracter set"
MI 120 POSITION 5,2:? #6;"DA
       TAMAKER":? #6
FJ 130 ? #6;"THIS UTILITY CR
       EATES";
HB 140 ? #6;"A SET OF DATA S
       TATE-";
BM 150 ? #6;"MENTS FROM A SA
       VED"
PC 160 ? #6;"CHARACTER SET.
       IT"
FA 170 ? #6; "OPTIMIZES BY ON
       LY"
KK 180 ? #6; "LISTING CHARACT
       ERS"
DL 190 ? #6;"NOT PRESENT IN
       THE"
IH 200 ? #6;"STANDARD CHARAC
       TER"
ME 210 ? #6; "SET. "
KD 220 ? #6:? #6;"PRESS opti
       on"
BF 230 IF PEEK(53279)<>3 THE
       N 230
KK 240 GRAPHICS 1+16
LB 250 ? #6;"THE DATA STATEM
       ENTS"
D0 260 ? #6;"WILL BE WRITTEN
        TO"
IM 270 ? #6;"DISK AS A list
       FILE"
MP 280 ? #6;"USE enter TO ME
       RGE"
DI 290 ? #6;"THE DATA WITH Y
       OUR"
JB 300 ? #6;"PROGRAM.":? #6:
       ? #6;"ENTER FILENAME"
       :? #6;"OF CHARACTER S
       ET"
MB 305 POKE 82,0:POKE 87,0
GG 310 ? CHR$(26);CHR$(156);
       "d:";:INPUT #1;T$:IF
       T$="" THEN 310
NP 315 F$= D:F$(3)=T$
PP 320 ? CHR$(125);"ENTER OU
       TPUT{8 SPACES}FILEMAM
       E":? :?
SK 330 ? CHR$(28);CHR$(156);
       "d:";:INPUT #1;T$:IF
       T$="" THEN 330
HM 332 OF$="D:":OF$(3)=T$
AH 335 ? CHR$(125);"ENTER LI
       NE # FOR{5 SPACES}DAT
       A STATEMENTS":? :?
KC 340 INPUT SLINE    .
GG 345 CLOSE #1
AH 350 GRAPHICS 2+16:POSITIO
       N 5,6:? #6;"working
       {3 N}":SETCOLOR 4,3,4
HC 370 OPEN #1,4,0,F$
DD 380 TRAP 600:OPEN #2,8,0,
       OF$:TRAP 40000
BG 381 ? #2;SLINE;"CHSET=(PE
       EK(106)-8)*256:FOR I=
       0 TO 1023:POKE CHSET+
       I,PEEK(57344+I):NEXT
       I"
PM 382 ? #2;SLINE+1;"RESTORE
        ";SLINE+5
NF 383 ? #2;SLINE+2;"READ A:
       IF A=-1 THEN RETURN"
CK 384 ? #2;SLINE+3;"FOR J=0
         TO 7:READ B:POKE CHS
        ET+A*8+J,B:NEXT J"
BE 385 ? #2;SLINE+4;"GOTO ";
       SLINE+2
OB 387 LINE=SLINE+4
GD 390 FOR I=0 TO 127:F=0
AM 400 FOR J=0 TO 7
MK 410 GET #1,A:A(J)=A
IL 420 IF A<>PEEK(57344+I*8+
       J) THEN F=1
CA 430 NEXT J
CH 440 IF  NOT F THEN 460
IG 445 LINE=LINE+1
PP 450 ? #2;LINE;" DATA ";:?
        #2;1;:FOR J=0 TO 7:?
        #2;",";A(J);:NEXT J:
       ? #2
KG 460 NEXT I:? #2;LINE+1;"D
       ATA -1"
CN 470 POKE 82,2:GRAPHICS 0:
       ? "All finished! Use
       ENTER ";OF$
CB 480 ? "to merge the file.
HE 490 END
FL 600 POKE 82,2:GRAPHICS 0:
       ? :? "ERROR TRYING TO
        OPEN ";OF$;"."
GO 610 END